Teighaの購読者から、「図面全体ではなく、図面の一部だけを.pdfファイルにエクスポートするにはどうすればよいですか?」という質問が寄せられることがあります。PDFエクスポート設定にはデフォルトでZoomToExtentsオプションがあり、OdaMfcAppサンプルアプリケーションのPDFExportDialogでも同じオプションがデフォルトで設定されているため、これは明らかではないかもしれません。

そのオプションとは何ですか?また、それを解除するにはどうすればよいですか?
このオプションはPdfExportSettingsのフラグであり、PDFエクスポート機能を簡単に使い始めることができます。このフラグが設定されていない場合、プロット領域に関連するすべての設定は、図面ファイルに保存されているPlotSettingから取得されます。これらの設定の詳細については、ドキュメントを参照してください。ここでは、ZoomToExtentsオプションが、以下のオプションが設定されているかのようにPdfExportモジュールに図面をエクスポートさせることだけを述べます。
- プロット領域 – 範囲
- 用紙にフィット
- プロットを中央に配置
では、次の図面を見てみましょう。
ZoomToExtentsオプションを使用してPDFにエクスポートすると、この.pdfファイルが得られます。
しかし、図面の一部、例えば中央にあるエンティティだけをエクスポートしたい場合はどうでしょうか?ここではOdaMfcAppサンプルアプリケーションを使った方法ではなく、プログラムコードで説明します。
図面を読み込む:
OdDbDatabasePtr pDb = m_pHostApp.readFile(inputFile);
IDを使用してエンティティへのポインタを取得する:
OdDbEntityPtr pRect = OdDbEntity::cast(pDb->getOdDbObjectId( OdDbHandle(0x2AB)).safeOpenObject(OdDb::kForRead));
if (pRect.isNull())
throw OdError(eNullEntityPointer);
この例では、OdDbHandle(0x2AB)はハードコードされたハンドルであり、特定の図面からコピーされたものであることに注意してください。0x2ABは、作業している図面から取得した独自のハンドルに置き換える必要があります。
エンティティの範囲を取得する:
OdGeExtents3d ext;
pRect->getGeomExtents(ext);
ペーパー空間の場合、エンティティの座標がペーパー座標に対応しているため、これで十分です。
モデル空間の場合、範囲はアクティブなビューポートの視点平面に投影される必要があります。
OdGePoint3d pt1, pt2;
OdRxObjectPtr pObj;
OdDbViewportTablePtr pVPT = pDb->getViewportTableId().safeOpenObject();
OdDbViewportTableRecordPtr pActiveVP = pVPT->getActiveViewportId().safeOpenObject();
OdAbstractViewPEPtr pVp = OdAbstractViewPEPtr(pObj = pActiveVP);
OdGeVector3d vecY = pVp->upVector(pObj);
OdGeVector3d vecZ = pVp->direction(pObj);
OdGeVector3d vecX = vecY.crossProduct(vecZ).normal();
OdGeVector2d offset = pVp->viewOffset(pObj);
OdGePoint3d prTarg = pVp->target(pObj) - vecX * offset.x - vecY * offset.y;
pt1.x = vecX.dotProduct(ext.minPoint() - prTarg);
pt1.y = vecY.dotProduct(ext.minPoint() - prTarg);
pt1.z = 0.;
pt2.x = vecX.dotProduct(ext.maxPoint() - prTarg);
pt2.y = vecY.dotProduct(ext.maxPoint() - prTarg);
pt2.z = 0.;
ext.set(pt1, pt2);
プロット設定にアクセスする:
OdDbObjectId idLayout =
OdDbBlockTableRecordPtr(pDb->getActiveLayoutBTRId().safeOpenObject())->getLayoutId();
OdDbLayoutPtr pLayout = idLayout.safeOpenObject(OdDb::kForWrite);
OdDbPlotSettings *pPlotSettings = pLayout.get();
必要なプロット領域を設定します。
OdDbPlotSettingsValidatorPtr pValidator = pDb->appServices()->plotSettingsValidator();
pValidator->setPlotWindowArea(pPlotSettings, ext.minPoint().x, ext.minPoint().y, ext.maxPoint().x, ext.maxPoint().y);
pValidator->setPlotType(pPlotSettings, OdDbPlotSettings::kWindow);
pValidator->setPlotCentered(pPlotSettings, true);
pValidator->setStdScaleType(pPlotSettings, OdDbPlotSettings::kScaleToFit);
次に、図面をエクスポートします。
OdPdfExportModulePtr pPdfModule = ::odrxDynamicLinker()->loadApp(OdPdfExportModuleName);
OdPdfExportPtr exporter = pPdfModule->create();
PDFExportParams params;
params.setDatabase(pDb);
params.setExportFlags((PDFExportParams::PDFExportFlags)(params.exportFlags() & (~PDFExportParams::kZoomToExtentsMode)));
OdUInt32 errCode = exporter->exportPdf(params);
次の.pdfファイルが結果です。
これは、図面の一部を選択して.pdfファイルにエクスポートするためのシンプルで簡単な方法です。