ODAメンバーの要望に応え、.pdfファイルへのエクスポート中に.dgn図面をクリップする機能が利用可能になりました。
.dgnファイルを.pdfファイルにエクスポートする前に、クリッピング領域を設定します。その結果の.pdfファイルには、クリッピング領域内にある要素(トリミング境界が通過する場合は要素の一部)のみが含まれます。クリッピング領域は自由な形状を持つことができますが、クリッピング領域の境界を指定するには、形状、円、楕円、または複合形状などの閉じた平面要素を使用する必要があります。
では、OdaDgnAppサンプルアプリケーションを使用して、.pdfファイルへのエクスポートのために「フェンス」クリッピングを実行する方法を段階的に見ていきましょう。
サンプルアプリケーションを実行し、.pdfファイルにエクスポートしたい.dgnファイルを開き、Teighaで提供されているレンダリングデバイスのいずれかでレンダリングします。
ツールバーにある2つのアイコンのいずれかを選択して、「フェンス」クリッピングのクリッピング形状を設定します。
最初のケースでは、長方形のクリッピング領域(実際には形状要素になります)を設定します。「Fence Type to Rectangle」をクリックします。
次に、フェンスの長方形の角を指定します。
次に、ファイル -> PDFにエクスポートを選択します。そして、PDFエクスポート設定で「フェンス」オプションをオンにします。
エクスポートを実行し、結果を取得します。
円のクリッピング領域を設定する場合の2番目のケースでも同じ操作が可能です。「Fence Type to Circle」をクリックします。
.pdfファイルにエクスポートした結果は次のとおりです。
完了!
さて、OdaDgnAppでの実装について詳しく見ていきましょう。
この機能を実装するために、引数付きの「Fence」コマンドが宣言されています。これはOdEdCommandクラスから継承された特定のクラスです。OdaDgnAppDoc.hを参照してください。
class Cmd_Fence : public OdEdCommand
{
public:
const OdString groupName() const;
const OdString globalName() const;
void execute(OdEdCommandContext* pCmdCtx);
};
コマンドはOdEdCommandStackリストに追加されます。
コマンド実行とのUIバインディングについては、OdaDgnAppVectorizer.cppを参照してください。
ON_COMMAND(ID_CREATEFENCE_BTN, OnCreateFence)
ON_COMMAND(ID_CREATEFENCE_CIRCLE, OnCreateFenceCircle)
. . . . .
void COdaDgnAppVectorizer::OnCreateFence()
{
GetDocument()->ExecuteCommand( OD_T("Fence r") );
}
void COdaDgnAppVectorizer::OnCreateFenceCircle()
{
GetDocument()->ExecuteCommand( OD_T("Fence c") );
}
次に、コマンドが処理されるOdaDgnAppDoc.cppに移動します。
void COdaDgnAppDoc::ExecuteCommand(const OdString& sCmd, bool bEcho)
{
. . . . .
pCommands->executeCommand(s, pCmdCtx);
if( s == OD_T("FENCE") )
{
OdValuePtr pHandle = pCmdCtx->arbitraryData(OD_T("Fence"));
if( !m_idFence.isNull() && !pHandle.isNull() )
{
OdDgElementPtr pFence = m_idFence.openObject(OdDg::kForWrite);
if( !pFence.isNull() )
{
pFence->erase(true);
}
}
if( !pHandle.isNull() )
{
OdInt64 uHandle = 0;
pHandle->get(uHandle);
m_idFence = m_pDb->getElementId( OdDbHandle((OdUInt64)uHandle));
}
}
. . . . .
}
コマンドが正常に実行されると、クリッピング用の特定の要素が割り当てられます。そのm_idFenceが設定され、その後.pdfエクスポートでクリッピングに使用されます。executeCommand()自体は、フェンスコマンドの適切な実行を呼び出す必要があります。その結果、Cmd_Fence::execute()が実行されるべきです。この呼び出し内でクリッピング領域の指定が行われるべきです。
void Cmd_Fence::execute(OdEdCommandContext* pCmdCtx)
{
. . . . .
try
{
pt1 = pIO->getPoint(L"Specify corner of window, enter a scale factor (nX or nXP), or\n"
L"[Rectangle/Circle] <real time>:",
OdEd::kInpThrowEmpty|OdEd::kInpThrowOther|OdEd::kGptNoOSnap, 0, szKeywords);
pt1 = pIO->getPoint(OD_T("Specify corner of Fence:"),OdEd::kInpThrowEmpty | OdEd::kGptNoOSnap);
pt2 = pIO->getPoint(OD_T("Specify opposite corner of Fence:"), OdEd::kGptNoUCS | OdEd::kGptRectFrame | OdEd::kGptNoOSnap);
create_Fence(pt1, pt2, pView, pDgView->getModelId(), pCmdCtx, false );
}
. . . . .
catch(const OdEdKeyword& kw)
{
switch(kw.keywordIndex())
{
case 0: // Rectangle clipping area
pt1 = pIO->getPoint(OD_T("Specify corner of Fence:"),OdEd::kInpThrowEmpty | OdEd::kGptNoOSnap);
pt2 = pIO->getPoint(OD_T("Specify opposite corner of Fence:"), OdEd::kGptNoUCS | OdEd::kGptRectFrame | OdEd::kGptNoOSnap);
create_Fence(pt1, pt2, pView, pDgView->getModelId(), pCmdCtx, false );
break;
case 1: // Circle clipping area
pt1 = pIO->getPoint(OD_T("Specify center of Fence:"),OdEd::kInpThrowEmpty | OdEd::kGptNoOSnap);
pt2 = pIO->getPoint(OD_T("Specify radius Fence:"), OdEd::kGptNoUCS | OdEd::kGptRectFrame | OdEd::kGptNoOSnap);
create_Fence(pt1, pt2, pView, pDgView->getModelId(), pCmdCtx, true );
break;
}
}
. . . . .
}
create_Fence()メソッドは、選択されたフェンスコマンドモードに従って、クリッピングに適した要素を作成します。円のクリッピング境界の場合はOdDgEllipse3d、長方形の場合はOdDgLineString3dPtrになります。
そして最後に、この要素を.pdfへのエクスポート用のボリュームクリッピング要素として割り当てるには、ExportToPDFDialog.cppを参照してください。
OdUInt32 CExport2PDFDialog::ExportToPdf(OdString pdfFileName)
{
OdPdfExportModulePtr pModule = ::odrxDynamicLinker()->loadApp(OdPdfExportModuleName);
{
OdPdfExportPtr exporter = pModule->create();
{
PDFExportParams params;
. . . . .
// Use fence for pdf exporting to clip the drawing
if( m_Views == 2 && !m_idFence.isNull() )
{
idView = getActiveViewId(m_pDb); // Get active view.
. . . . .
if( !idView.isNull() )
{
. . . . .
pView->setVolumeClipElementId( m_idFence ); // Set fence as volume clip element
. . . . .
}
}
}
}
}
これにより、DGN図面を.pdfファイルにエクスポートするために、独自のクリッピング境界を設定および実装できます。