[ブログに戻る](/ja/blog) # ラスタデータを含むOLEオブジェクトの挿入

Yuri Moskovsky 4月 01, 2021 [\#.dwg](/ja/blog/tag/dwg) [\#Raster image](/ja/blog/tag/raster-image) [\#getting started](/ja/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

INSERTRASTERクロスプラットフォームコマンド（\_InsertRaster\_func関数を参照）は、さまざまなラスタ画像形式のファイルを.dwg図面に挿入するために使用されます。[ODADrawingsExplorer](https://docs.opendesign.com/td/td_sample_qtOdaQtApp.html)でラスタファイルを擬似的に開くために使用され、その結果は.dwgファイルとして保存できます。

\_InsertRaster\_func関数はExCommands.txモジュールに含まれており、そのソースコードは次のパスにあります: Drawing/Examples/ExCommands/ExInserRaster.cpp。

まず、コマンドはソースラスタ画像ファイルへのパスを要求します。

```
OdDbUserIOPtr pIO = pCmdCtx->userIO();
OdString path = pIO->getFilePath(L"Select file to insert", OdEd::kGfpForOpen,
                                 L"Select file to insert", L"bmp", L"",
                                 L"Bitmap files (*.bmp)|*.bmp|Jpeg files (*.jpg)|*.jpg|"
                                 L"PNG files (*.png)|*.png|All files (*.*)|*.*||");
```

次に、コマンドは指定されたラスタ画像をロードします。

```
OdRxRasterServicesPtr pRasSvcs = ::odrxDynamicLinker()->loadApp(RX_RASTER_SERVICES_APPNAME);
OdGiRasterImagePtr pImage = pRasSvcs->loadRasterImage(path);
```

次に、コマンドは、高さと幅が2,048ピクセルを超えないように、必要に応じてロードされたラスタ画像を変換します。これは、画像を含む結果の.dwg図面がAutodesk® AutoCAD®とODAソフトウェアの両方で正常にレンダリングされるために必要です。

このステップがスキップされた場合、高さまたは幅が2,048ピクセルを超えるラスタ画像は、ODAソフトウェアでのみ、OdOleSsItemHandlerModule.txモジュールを使用してのみ正常にレンダリングされます。

```
::odrxDynamicLinker()->loadModule(OdOleSsItemHandlerModuleName);
```

Ole2Frameオブジェクトを作成する前に、ItemHandlerモジュールをロードする必要があります。通常、コマンドを実行するアプリケーションは最初にモジュールをロードします。この場合、以下はスキップできます。

```
::odrxDynamicLinker()->loadModule(OdOlePlatformItemHandlerModuleName);
```

次に、コマンドはOle2Frameオブジェクトを作成し、ロードされたラスタ画像をその中に挿入します。

```
OdDbDatabase* pDb = OdDbDatabase::cast(pCmdCtx->baseDatabase()).get();
OdDbOle2FramePtr pOleFrame = OdDbOle2Frame::createObject();
pOleFrame->setDatabaseDefaults(pDb);
OdOleItemHandler* pItem = pOleFrame->getItemHandler();
pItem->embedRaster(pImage, pDb);
pOleFrame->setOutputQuality(OdDbOle2Frame::kHighGraphics);
pOleFrame->unhandled_setHimetricSize(OdUInt16(pImage->pixelWidth()),
                                     OdUInt16(pImage->pixelHeight()));
```

フレームの位置を設定するために、特別なトラッカーが使用されます。

```
struct OleSsInsertTracker : OdEdRealTracker
{
  OdSmartPtr<OdDbOle2Frame> _pOleFrame;
  OdGePoint3d _orig;
  OdGeVector2d _size;
  double _dist;

  void setValue(double dist)
  {
    _dist = dist;
    OdRectangle3d r3d;
    OdGeVector2d size = _size.normal() * _dist;
    r3d.lowLeft .set(_orig.x,          _orig.y,          _orig.z);
    r3d.upLeft  .set(_orig.x,          _orig.y + size.y, _orig.z);
    r3d.upRight .set(_orig.x + size.x, _orig.y + size.y, _orig.z);
    r3d.lowRight.set(_orig.x + size.x, _orig.y,          _orig.z);
    _pOleFrame->setPosition(r3d);
  }
  int addDrawables(OdGsView* pView) { pView->add(_pOleFrame, 0); return 1; }
  void removeDrawables(OdGsView* pView) { pView->erase(_pOleFrame); }
};
OdStaticRxObject<OleSsInsertTracker> tracker;
tracker._pOleFrame = pOleFrame;
OdGeVector2d size(pImage->pixelWidth(), pImage->pixelHeight());
OdDbUserIOPtr pIO = pCmdCtx->userIO();
tracker._orig = pIO->getPoint(L"Specify insertion point <0,0>:",
                              OdEd::kGptDefault, &OdGePoint3d::kOrigin);

// Set initial OLE frame position to origin, and size in world units.
// Convert MM_HIMETRIC (0.01 millimeter) to space units.

double s = pDb->getMEASUREMENT()==OdDb::kEnglish ? 0.01 / 25.4 : 0.01;
tracker._size.set(double(size.x) * s, double(size.y) * s);
OdString sPmt;
sPmt.format(OD_T("Specify size <%g>:"), tracker._size.length());
double dist = pIO->getDist(sPmt, OdEd::kGdsFromLastPoint | OdEd::kGptRubberBand, 0.,
                           OdString::kEmpty, &tracker));
tracker.setValue(dist);
```

r3d矩形がすでにわかっている場合は、上記ではなく次の呼び出しを行うだけで十分です。

```
pOleFrame->setPosition(r3d);
```

最後に、コマンドは完成したフレームをデータベースのアクティブなレイアウトに追加します。

```
OdDbBlockTableRecordPtr pSpace = pDb->getActiveLayoutBTRId().safeOpenObject(OdDb::kForWrite);
pSpace->appendOdDbEntity(pOleFrame);
```

## 今すぐ始める

**ODAソフトウェアを60日間無料でお試しください。  
リスクなし、クレジットカード不要。**

[無料で試す](https://www.opendesign.com/ja/free-trial)
