ラスタデータを含むOLEオブジェクトの挿入

INSERTRASTERクロスプラットフォームコマンド(_InsertRaster_func関数を参照)は、さまざまなラスタ画像形式のファイルを.dwg図面に挿入するために使用されます。ODADrawingsExplorerでラスタファイルを擬似的に開くために使用され、その結果は.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日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す