除了 3D 对象,您还可以使用 ODA Publish SDK 创建包含从 .dwg、.dgn 和 BIM 文件发布的 2D CAD 对象的交互式文档。本文总结了用于发布包含 2D CAD 对象的图纸的 Publish SDK 类。
OdCADDefinition 类
OdCADDefinition 类是导出到 .pdf 的 CAD 对象的存储库。该对象由 setDatabase 函数指定。该对象根据 setMediaSize 函数指定的输出画布大小进行发布(使用其范围)和缩放。此类的其余功能与 PdfExport 设置类似。
void setDatabase(OdDbBaseDatabase *database);
void setLayoutName(const OdString& name);
//The whole drawing will be published (using its extents) and scaled to fit the specified output media size
void setMediaSize(const Page::PaperUnits units, const double width, const double height);
void setEmbededTrueTypeFonts(bool state);
void setTrueTypeFontAsGeometry(bool state);
void setSHXTextAsGeometry(bool state);
void setTextSearchable(bool state);
void setExportHyperlinks(bool state);
void setGeomDPI(OdUInt32 dpi);
void setBWImagesDPI(OdUInt32 dpi);
void setColorImagesDPI(OdUInt32 dpi);
OdCADReference 类
OdCADReference 类是 CAD 文档的 PDF 页面显示,它是存储在 OdCADDefinition 中的对象。对于 CAD 对象的每个表示(OdCADDefinition),可以有几个不同的映射。
void setCADDefinition(OdCADDefinitionPtr cad_definition);
void setBorder(bool state);
void setBorderColor(ODCOLORREF color);
void setBorderWidth(const OdUInt16 width);
void setRotation(double rotation); /*in radians*/
void setClipBoundary(const Page::PaperUnits units, const OdGePoint2dArray& clipBoundary);
void setTransform(const OdGeMatrix2d& xfm);
void setScale(double scale);
void setTranslation(const OdGeVector2d& vec);
示例
要将 2D CAD 对象添加到文档的 PDF 页面,OdPage 类中有两个函数。
void addCADReference(const OdCADReferencePtr& CADreference, const OdRect& location);
此函数将 2D CAD 对象添加到页面。对象的大小和位置由 location 参数指定的矩形区域确定。在这种情况下,只能指定一种类型的变换:旋转 (setRotation)。当您旋转对象时,它会自动缩放,使其尺寸不超过指定区域的限制。使用此方法将对象添加到页面的其他变换函数(setTransform、setScale、setTranslation)无效。
void addCADReference(const OdCADReferencePtr& CADreference);
此函数还将 2D CAD 对象添加到页面。对象的大小和位置由 OdCADReference 对象本身中指定的变换矩阵确定。变换矩阵可以通过 setTransform 函数或 setScale、setRotation 和 setTranslation 函数的组合来指定。
下面是各种 2D CAD 对象(.prc; .dwg; BIM)的示例:
下面是将 2D CAD 对象添加到 PDF 文档页面的示例代码。在此示例中,CAD 对象被添加到页面并旋转 45 度。
OdCADDefinitionPtr pCADDef = OdCADDefinition::createObject();
pCADDef->setDatabase(pDatabase);
pCADDef->setMediaSize(Page::kMillimeters, 840., 594.);
OdCADReferencePtr pCADRef2 = OdCADReference::createObject();
pCADRef2->setCADDefinition(pCADDef);
pCADRef2->setRotation(OdaPI4);
pCADRef2->setBorder(true);
pPage1->addCADReference(pCADRef2, OdRect(5, 1180, 10, 800));
此代码的结果如下所示。
要在页面上仅显示部分图纸,请使用 OdCADReference 对象的 setClipBoundary 函数。此函数在 CAD 对象的画布 (MediaSize) 上设置一个多边形区域。下面是一个示例。
OdCADReferencePtr pCADRef3 = OdCADReference::createObject();
pCADRef3->setCADDefinition(pCADDef);
OdGePoint2dArray clip_box;
clip_box.append(OdGePoint2d(360, 100));
clip_box.append(OdGePoint2d(360, 350));
clip_box.append(OdGePoint2d(550, 350));
clip_box.append(OdGePoint2d(550, 100));
pCADRef3->setClipBoundary(Page::kMillimeters, clip_box);
pPage3->addCADReference(pCADRef3, OdRect(600, 1180, 50, 800));
此代码的结果如下所示。左侧显示了使用 OdTable 对象的示例。
以下代码演示了如何使用变换矩阵添加 CAD 对象。
OdCADReferencePtr pCADRef4 = OdCADReference::createObject();
pCADRef4->setCADDefinition(pCADDef);
OdGeMatrix2d transform;
transform.setCoordSystem(OdGePoint2d(350, 50), OdGeVector2d::kXAxis, OdGeVector2d::kYAxis);
transform *= OdGeMatrix2d::scaling(0.035);
transform *= OdGeMatrix2d::rotation(OdaPI/6.0);
pCADRef4->setTransform(transform);
pPage4->addCADReference(pCADRef4);
此代码的结果如下所示。
矩阵变换示例