CATIA V5 CAA 工程图模块二次开发常用接口库介绍
作者:CATIA开发者指南
发布时间:2026年6月20日 17:02
原文链接:https://mp.weixin.qq.com/s?__biz=MzkxNTQ0MTY0NQ==&mid=2247486538&idx=1&sn=f28c1e698153a483156dd39b73d9ebc3&chksm=c15e5ec8f629d7ded77ab0512de44b6220176d4cfbdcb2d70c269069dbd146f264bc422d19f4&cur_album_id=2800898825187262468&scene=189#wechat_redirect
前面几篇文章已经分别讨论了自定义特征、命令/工作台接入、交互代理机、零件设计接口和装配接口。本文换到工程图模块:在 CATDrawing 中做二次开发时,经常需要打交道的是哪些接口?它们分别负责图纸、图页、视图、二维几何、标注、尺寸、标题栏和生成式视图的哪一层能力?
工程图开发和 Part/Product 开发最大的区别在于:工程图不是直接编辑 3D 几何本体,而是在 Drawing 文档中维护一套 2D 表达。一个视图可以是纯交互二维视图,也可以是由 3D Part/Product 投影生成的 generative view;同一条 2D 线可能只是手工画线,也可能是某条 3D 边的投影结果。因此工程图二开不能只问“这个元素是什么线”,还要问“它在哪个 sheet、哪个 view 坐标系中、是否来自 3D、是否会在更新后被重新生成”。
可以先建立一条主线:
CATDrawing 文档
-> Drawing root
-> Sheet
-> ViewMakeUp / View
-> 2D Sketch Geometry
-> Annotation / Dimension / Dress-up
-> Generative Specification
-> Generated Geometry / Generated Shape
一句话:
DraftingInterfaces 管工程图对象和标注,SketcherInterfaces 管视图里的二维几何,ObjectModelerBase 管文档和 Session。
1. 接口分布总览
工程图模块常用接口主要分布在下面几个 framework 中:
| Framework | 典型内容 | 作用 |
|---|---|---|
| DraftingInterfaces | CATIDftDocumentServices、CATIDftDrawing、CATIDftSheet、CATIDftView、CATIDrawing、CATISheet、CATIView | Drawing 根对象、图页、视图和工程图基础对象 |
| DraftingInterfaces | CATIDrwFactory、CATIDrwAnnotationFactory、CATIDftViewMakeUp、CATIDftSheetFormat、CATIDftDrawingFormats、CATIDftStandardManager | 工程图对象工厂、标注工厂、视图布局、图幅格式和制图标准 |
| DraftingInterfaces | CATIGenerSpec、CATIDftGenViewFactory、CATIDftGenView、CATIDftGenGeomAccess、CATIDftGenGeom、CATIDrwGenDrawShape | 生成式视图、剖视/局部视图、投影结果和 3D 来源追踪 |
| SketcherInterfaces | CATI2DWFFactory、CATISketch、CATI2DWFGeometry、CATI2DCurve | 在视图中创建和访问二维点、线、圆、曲线等几何 |
| ObjectModelerBase | CATDocumentServices、CATSessionServices、CATIContainer、CATInit | 创建/打开/保存 CATDrawing,管理 Session 和容器 |
| ObjectSpecsModeler | CATISpecObject、CATIAlias、CATIDescendants | 规格对象、名称、容器和树结构访问 |
| Mathematics | CATMathPoint2D、CATMathPlane、CATMathDirection、CATMathTransformation | 视图坐标、投影平面、剖切方向和坐标变换 |
| ProductStructure | CATIProduct | 生成式工程图中定位 3D 装配实例上下文 |
| Visualization | CATIVisProperties、CATVisPropertiesValues | 修改生成几何或工程图元素的颜色、线型等显示属性 |
| Drafting2DLInterfaces | CATI2DLayoutLayout、CATI2DLayoutSheet、CATI2DLayoutView、CAT2DLayoutServices | 2D Layout for 3D Design,不等同于普通 CATDrawing Drafting |
工程图接口里还有一个容易混淆的点:CATIDftDrawing / CATIDftSheet / CATIDftView 和 CATIDrawing / CATISheet / CATIView 都是 C++ 原生接口。前者更偏新的 Drafting API,后者在很多 CAA 示例里仍然大量出现。实际项目中经常需要两套接口配合使用。
2. Drawing 文档与工程图根对象
2.1 创建或打开 CATDrawing 文档
工程图文档仍然通过 CATDocumentServices 创建、打开和保存:
| 方法 | 作用 |
|---|---|
| CATDocumentServices::New(“CATDrawing”, doc) | 创建新的 CATDrawing 文档 |
| CATDocumentServices::OpenDocument(path, doc) | 打开已有 CATDrawing 文档 |
| CATDocumentServices::SaveAs(doc, path) | 另存 CATDrawing 文档 |
| CATDocumentServices::Remove(doc) | 从 Session 中移除文档 |
批处理程序通常还需要显式创建 Session:
CATSession *pSession = NULL;
HRESULT hr = ::Create_Session("DrwSession", pSession);
CATDocument *pDoc = NULL;
hr = CATDocumentServices::New("CATDrawing", pDoc);
// ... modify drawing ...
CATDocumentServices::Remove(*pDoc);
::Delete_Session("DrwSession");
在 CATIA 交互命令中,一般不需要自己创建 Session,而是从当前编辑器、当前文档或选择路径中拿到 CATDrawing 上下文。
2.2 获取 Drawing root
CATIDftDocumentServices 是从 CATDrawing 文档取得 Drawing root 的标准入口:
CATIDftDocumentServices *piDftDocServices = NULL;
CATIDftDrawing *piDftDrawing = NULL;
if (SUCCEEDED(pDoc->QueryInterface(IID_CATIDftDocumentServices,
(void **)&piDftDocServices)))
{
piDftDocServices->GetDrawing(IID_CATIDftDrawing,
(void **)&piDftDrawing);
piDftDocServices->Release();
piDftDocServices = NULL;
}
如果后续要使用 CATIDrwFactory、CATIDftStandardManager、CATIDftDrawingFormats 等容器级服务,需要从 Drawing root 转成 CATISpecObject,再取得 feature container:
CATIContainer_var spDrwCont;
CATISpecObject_var spDrawingSpec = piDftDrawing;
if (NULL_var != spDrawingSpec)
{
spDrwCont = spDrawingSpec->GetFeatContainer();
}
很多示例会写成:
CATIDrawing *piDrawing = NULL;
piDftDocServices->GetDrawing(IID_CATIDrawing, (void **)&piDrawing);
这不是 Automation 接口,而是另一套 C++ 原生 drawing 接口。经验规则:
要管理 sheet/view 列表,新代码优先看 CATIDftDrawing。
要和老示例里的 CATISheet/CATIView/CATIDrwFactory 配合,可以使用 CATIDrawing。
3. CATIDftDrawing 与 CATIDrawing
3.1 CATIDftDrawing:图纸根对象
CATIDftDrawing 是 CATDrawing 文档的 root feature 接口,负责管理图页和当前活动视图:
| 方法 | 作用 |
|---|---|
| AddSheet() | 创建并添加新 sheet |
| RemoveSheet() | 删除 sheet |
| ValidateSheetOrder() / ReorderSheets() | 校验并重排 sheet 顺序 |
| GetActiveSheet() | 获取当前工作 sheet |
| GetActiveView() | 获取当前编辑 view |
| GetSheets() | 获取 drawing 下所有 sheet |
| GetViews() | 获取 drawing 下所有 view |
创建新 sheet 的典型写法:
CATIDftSheet *piNewSheet = NULL;
constwchar_t *sheetName = L"MyNewSheet";
if (SUCCEEDED(piDftDrawing->AddSheet(&piNewSheet, sheetName)))
{
piNewSheet->SetScale(1.0);
piNewSheet->Release();
piNewSheet = NULL;
}
3.2 CATIDrawing:老接口仍然常用
CATIDrawing 提供了更早期的 drawing 访问方式,CAA 示例中很常见:
| 方法 | 作用 |
|---|---|
| GetCurrentSheet() | 获取当前 sheet,返回 CATISheet_var |
| SetCurrentSheet(sheet) | 设置当前 sheet |
| GetSheetList() | 获取 sheet 列表 |
| AppendSheet() | 追加 sheet |
| ReorderSheets() | 重排 sheet |
例如创建标注、标题栏、二维几何时,经常会从 CATIDrawing 拿 CATISheet,再从 CATISheet 拿 CATIView:
CATIDrawing *piDrawing = NULL;
piDftDocServices->GetDrawing(IID_CATIDrawing, (void **)&piDrawing);
CATISheet_var spSheet = piDrawing->GetCurrentSheet();
CATIView_var spMainView = spSheet->GetMainView();
两套接口并不是互斥的。常见组合是:
CATIDftDrawing / CATIDftSheet / CATIDftView:新式 drawing/sheet/view 管理。
CATIDrawing / CATISheet / CATIView:二维几何、标注和老示例常用入口。
4. 制图标准与图幅格式
工程图创建后,通常要先导入制图标准,再设置 sheet 格式。否则尺寸、文字、箭头、图框等默认样式可能和企业规范不一致。
4.1 CATIDftStandardManager
CATIDftStandardManager 通常由 drawing container 实现:
| 方法 | 作用 |
|---|---|
| GetAvailableStandards() | 获取当前环境可用标准列表,例如 ISO、ANSI |
| ImportStandard(name) | 将某个标准导入当前 drawing,并设为当前标准 |
| GetUsedStandards() | 获取 drawing 中已经使用的标准 |
| GetDefaultStandard() | 获取当前默认标准名 |
| UpgradeStandard() | 升级当前 drawing 标准 |
典型流程:
CATIDftStandardManager *piStdMgr = NULL;
if (SUCCEEDED(spDrwCont->QueryInterface(IID_CATIDftStandardManager,
(void **)&piStdMgr)))
{
wchar_t standardName[] = L"ISO";
piStdMgr->ImportStandard(standardName);
piStdMgr->Release();
piStdMgr = NULL;
}
4.2 CATIDftDrawingFormats 与 CATIDftSheetFormat
图幅格式由 drawing 级格式集合和 sheet 级格式引用共同管理:
| 接口 | 作用 |
|---|---|
| CATIDftDrawingFormats | 获取可用格式、标准格式、自定义格式,创建/删除 custom format |
| CATIDftSheetFormat | 读取/设置某个 sheet 使用的图幅、方向、显示模式和尺寸 |
| CATIDftFormat / CATIDftCustomFormat | 具体格式对象,如 A0/A1/A2 或企业自定义图幅 |
常用方法:
| 方法 | 作用 |
|---|---|
| GetAvailableFormats(list) | 获取当前 drawing 可用图幅 |
| AddCustomFormat(name, format) | 创建自定义图幅 |
| SetSheetFormat(formatName) | 设置 sheet 图幅 |
| SetSheetOrientation(orientation) | 设置横向/纵向 |
| GetSheetSize(width, height) | 获取 sheet 实际尺寸,单位通常按 mm 理解 |
示例:
CATIDftSheet *piSheet = NULL;
if (SUCCEEDED(piDftDrawing->GetActiveSheet(&piSheet)))
{
CATIDftSheetFormat *piSheetFormat = NULL;
if (SUCCEEDED(piSheet->QueryInterface(IID_CATIDftSheetFormat,
(void **)&piSheetFormat)))
{
piSheetFormat->SetSheetFormat(CATUnicodeString("A2 ISO"));
piSheetFormat->Release();
piSheetFormat = NULL;
}
piSheet->Release();
piSheet = NULL;
}
实际环境里的格式名来自当前标准和企业资源文件,不建议在代码里盲写固定字符串。更稳妥的方式是先用 CATIDftDrawingFormats::GetAvailableFormats() 查可用格式,再按名称或尺寸匹配。
5. Sheet、View 与 ViewMakeUp
5.1 CATIDftSheet / CATISheet:图页对象
一个普通 sheet 默认有两个基础视图:
| 视图 | 作用 |
|---|---|
| Main View | 当前 sheet 的主要绘图区,通常放二维几何、投影视图和标注 |
| Background View | 背景视图,通常放图框、标题栏、固定文字和企业模板内容 |
CATIDftSheet 常用能力:
| 方法 | 作用 |
|---|---|
| GetDrawing() | 获取所属 drawing |
| GetScale() / SetScale() | 读取/设置 sheet 全局比例 |
| GetMainView() | 获取 main view |
| GetBackgroundView() | 获取 background view |
| GetDefaultActiveView() / SetDefaultActiveView() | 读取/设置默认活动 view |
| AddView() | 向 sheet 添加 view |
| GetProjectionMethod() / SetProjectionMethod() | 读取/设置第一角法/第三角法 |
| SetPrintArea() / SetPrintAreaActivationState() | 设置打印区域 |
| ReorderViews() | 重排 view 顺序 |
CATISheet 提供类似能力,但返回 CATIView_var,很多老示例使用它:
CATISheet_var spSheet = piDrawing->GetCurrentSheet();
CATIView_var spMainView = spSheet->GetMainView();
CATIView_var spBgView = spSheet->GetBackgroundView();
背景视图注意事项:在交互 UI 命令中,不建议直接用 SetCurrentView() 或 SetDefaultActiveView() 激活 background view,因为这可能触发背景工作台切换并取消当前命令。批处理程序中通常可以直接设置当前视图;交互命令中更稳妥的做法是通过视图实现的 sketch edition 能力进入/退出编辑。
5.2 CATIDftView / CATIView:视图对象
视图是工程图中真正承载几何和标注的工作空间。常用能力:
| 接口 | 典型方法 | 作用 |
|---|---|---|
| CATIDftView | GetViewType()、GetViewName()、SetViewName()、GetComponents()、Activate()、GetGenerSpec() | 新式 view 访问、组件枚举和生成式信息 |
| CATIView | GetSketch()、GetDressUp()、GetDoc()、SetDoc()、GetGenerSpec()、Update()、GetTextList()、ListDimensions() | 老式 view 访问、二维草图、外部 3D 文档和更新 |
| CATIDftViewMakeUp | SetAxisData()、GetAxisData()、SetScale()、SetAngle()、LinkWith() | 视图在 sheet 上的位置、比例、角度和与其它视图的位置关系 |
View 和 ViewMakeUp 的职责要分开理解:
CATIView / CATIDftView:视图内容,包含二维几何、标注和生成式结果。
CATIDftViewMakeUp:视图在 sheet 上怎么摆,包含位置、比例、角度和视图关联。
5.3 创建交互二维视图
创建普通二维视图通常通过 drawing container 上的 CATIDrwFactory:
CATIDrwFactory_var spDrwFactory = spDrwCont;
CATIDftViewMakeUp *piViewMU = NULL;
if (NULL_var != spDrwFactory &&
SUCCEEDED(spDrwFactory->CreateViewWithMakeUp(IID_CATIDftViewMakeUp,
(void **)&piViewMU)))
{
CATIView *piView = NULL;
if (SUCCEEDED(piViewMU->GetView(&piView)))
{
piView->SetViewType(FrontView);
piViewMU->SetAxisData(100.0, 50.0);
CATIDftSheet *piSheet = NULL;
if (SUCCEEDED(piDftDrawing->GetActiveSheet(&piSheet)))
{
piSheet->AddView(piViewMU);
piSheet->Release();
piSheet = NULL;
}
piView->Release();
piView = NULL;
}
piViewMU->Release();
piViewMU = NULL;
}
视图位置和工程图二维坐标通常使用 mm。ViewMakeUp::SetAxisData() 的坐标是 sheet 坐标;在 view 内创建几何和标注时,坐标是 view 坐标。
6. 视图中的二维几何
工程图视图中的线、圆、点等 2D 几何主要通过 SketcherInterfaces 的 CATI2DWFFactory 创建。视图本身通常可以转成 CATI2DWFFactory 或 CATISketch。
常用接口:
| 接口 | 作用 |
|---|---|
| CATI2DWFFactory | 创建 2D 点、线、圆、样条等 wireframe 几何 |
| CATISketch | 访问 view sketch,枚举组件,配合 sketch edition 使用 |
| CATI2DWFGeometry | 2D 几何元素通用接口 |
| CATI2DCurve | 2D 曲线接口,可读取参数范围等 |
| CATI2DLine | 2D 直线接口 |
在 main view 中画一条线和一个圆:
CATISheet_var spSheet = piDrawing->GetCurrentSheet();
CATIView_var spMainView = spSheet->GetMainView();
spSheet->SetCurrentView(spMainView);
CATI2DWFFactory_var sp2DFactory = spMainView;
if (NULL_var != sp2DFactory)
{
double startPoint[2] = { 20.0, 20.0 };
double endPoint[2] = { 80.0, 20.0 };
CATISpecObject_var spLine = sp2DFactory->CreateLine(startPoint, endPoint);
double center[2] = { 50.0, 50.0 };
CATISpecObject_var spCircle = sp2DFactory->CreateCircle(center, 10.0);
}
经验规则:
要在图纸上画线,先明确当前 sheet 和当前 view;不要直接在 drawing root 上创建二维几何。
如果要枚举视图里的二维几何,可以从 view 转 CATISketch:
CATISketch_var spSketch = spMainView;
CATListValCATI2DWFGeometry_var listGeom;
if (NULL_var != spSketch)
{
spSketch->GetComponents(CATI2DCurve::ClassName(), listGeom);
}
CAA 中 CATLISTV 通常是 1-based index,而 CATIUnknownList 的 Item() / Add() 常按 0-based 用法出现。写工程图批处理时不要混用索引习惯。
7. 标注、文字、尺寸和符号
7.1 CATIDrwAnnotationFactory
工程图标注对象主要由 view 上的 CATIDrwAnnotationFactory 创建:
CATIDrwAnnotationFactory_var spAnnFactory = spMainView;
常用创建方法:
| 方法 | 创建对象 |
|---|---|
| CreateDftText() | 普通工程图文字,返回 CATIDftText |
| CreateDimension() | 尺寸,返回 CATIDrwDimDimension |
| CreateDftBalloon() | 气泡标注,返回 CATIDftBalloon |
| CreateDftGDT() | 形位公差框,返回 CATIDftGDT 和 leader |
| CreateDftDatumTarget() | Datum Target |
| CreateDatumFeature() | Datum Feature |
| CreateDftRoughness() | 表面粗糙度符号 |
| CreateDftArrow() | 工程图箭头 |
| CreateDrwAxisLine() | 轴线 |
| CreateDrwCenterLine() | 中心线 |
| CreateDrwThread() | 螺纹表示 |
| CreatePicture() | 插入图片 |
| CreateDrwAreaFill() | 区域填充/剖面线 |
| CreateDimSystem() | 尺寸系统,例如串联/并联尺寸排布 |
7.2 创建文字
推荐使用 CreateDftText(),旧接口 CreateDrwText() 在头文件中已经标注为 deprecated:
CATIDrwAnnotationFactory_var spAnnFactory = spMainView;
constdouble textPos[2] = { 100.0, 40.0 };
CATIDftText *piText = NULL;
if (NULL_var != spAnnFactory &&
SUCCEEDED(spAnnFactory->CreateDftText(textPos, &piText)))
{
CATUnicodeString text("TITLE BLOCK CREATED BY CAA");
wchar_t *wText = newwchar_t[text.GetLengthInChar() + 1];
text.ConvertToWChar(wText);
piText->SetString(wText);
delete [] wText;
wText = NULL;
CATIDftTextProperties *piTextProps = NULL;
if (SUCCEEDED(piText->GetTextProperties(&piTextProps)))
{
piTextProps->SetBold(TRUE);
piTextProps->SetItalic(TRUE);
piTextProps->Release();
piTextProps = NULL;
}
piText->Release();
piText = NULL;
}
常用文字相关接口:
| 接口 | 作用 |
|---|---|
| CATIDftText | 新式文字对象,设置字符串和属性 |
| CATIDftTextProperties | 字体、粗体、斜体、字号等文字属性 |
| CATIDftTextRange | 文字局部范围属性 |
| CATIDrwSubString / CATIDrwSubText | 老式文字子串/子文本访问 |
7.3 创建尺寸
尺寸创建的核心输入是:被标注元素列表、选择点、尺寸类型和尺寸参数。
CATIDrwAnnotationFactory_var spAnnFactory = spMainView;
CATIUnknownListImpl *pListImpl = newCATIUnknownListImpl();
CATIUnknownList *piDimElements = NULL;
pListImpl->QueryInterface(IID_CATIUnknownList, (void **)&piDimElements);
pListImpl->Release();
pListImpl = NULL;
IUnknown *piLine1 = NULL;
IUnknown *piLine2 = NULL;
spLine1->QueryInterface(IID_IUnknown, (void **)&piLine1);
spLine2->QueryInterface(IID_IUnknown, (void **)&piLine2);
piDimElements->Add(0, piLine1);
piDimElements->Add(1, piLine2);
CATDimDefinition dimDef;
dimDef.Orientation = DrwDimAuto;
CATDrwDimType dimType = DrwDimDistance;
CATIDrwDimDimension *piDim = NULL;
double pt1[2] = { 10.0, 15.0 };
double pt2[2] = { 0.0, 10.0 };
double *points[2] = { pt1, pt2 };
if (NULL_var != spAnnFactory)
{
spAnnFactory->CreateDimension(piDimElements, points, dimType, &dimDef, &piDim);
}
if (piDim) piDim->Release();
if (piLine1) piLine1->Release();
if (piLine2) piLine2->Release();
if (piDimElements) piDimElements->Release();
尺寸创建后,常用接口包括:
| 接口 | 作用 |
|---|---|
| CATIDrwDimDimension | 尺寸对象本体 |
| CATIDrwDimValue | 尺寸值显示、假尺寸等 |
| CATIDrwDimText | 尺寸文字 |
| CATIDrwDimTolerance / CATIDrwDimToleranceNum / CATIDrwDimToleranceAlphaNum | 尺寸公差 |
| CATIDrwDimFormat | 尺寸格式 |
| CATIDrwDimDimensionLine / CATIDrwDimExtensionLine | 尺寸线和延伸线 |
| CATIDrwDimSystem / CATIDrwCumulatedDimSystem / CATIDrwStackedDimSystem | 尺寸系统和累积尺寸 |
经验规则:
尺寸不是简单文字。要创建可维护的工程图尺寸,应优先用 CreateDimension,而不是手动画线再写数值。
8. 区域填充、剖面线和 Pattern
剖面线和区域填充通常分三步:
创建 Pattern -> 准备封闭边界或 BreakElem -> 用 AnnotationFactory 创建 AreaFill
常用接口:
| 接口 | 作用 |
|---|---|
| CATIDftPattern | Pattern 基接口 |
| CATIDftHatchingPattern | 剖面线 pattern,设置间距、角度、颜色等 |
| CATIDftDottingPattern | 点填充 pattern |
| CATIDftColoringPattern | 颜色填充 pattern |
| CATIDftMotifPattern | motif pattern |
| CATIDrwBreakElemFactory | 将曲线片段转成 area fill 可用的边界元素 |
| CATIDrwAreaFill | 区域填充对象 |
示例骨架:
CATIDrwFactory_var spDrwFactory = spDrwCont;
CATIDftHatchingPattern *piHatching = NULL;
if (NULL_var != spDrwFactory &&
SUCCEEDED(spDrwFactory->CreateHatchingPattern(IID_CATIDftHatchingPattern,
(void **)&piHatching)))
{
piHatching->SetAngle(45.0);
piHatching->SetPitch(8.0);
piHatching->SetOffset(0.0);
piHatching->SetColor(4);
}
CATIDrwAnnotationFactory_var spAnnFactory = spMainView;
CATLISTV(CATISpecObject_var) boundaryElements;
CATISpecObject *piPatternSpec = NULL;
if (piHatching && SUCCEEDED(piHatching->QueryInterface(IID_CATISpecObject,
(void **)&piPatternSpec)))
{
CATIDrwAreaFill_var spAreaFill =
spAnnFactory->CreateDrwAreaFill(boundaryElements, piPatternSpec, "");
piPatternSpec->Release();
piPatternSpec = NULL;
}
if (piHatching) piHatching->Release();
CreateDrwAreaFill() 对边界顺序和封闭性很敏感。实际项目中最好先把用于填充的轮廓整理成有序边界,再创建 area fill。
9. 生成式视图和 3D 关联
生成式视图是工程图二开的重点。它不只是普通二维视图,而是带有 3D 文档链接、投影平面、剖切/局部/断裂等生成规格,并且更新后会重新生成 2D 结果。
9.1 CATIGenerSpec:生成式视图规格
CATIGenerSpec 可从 CATIView::GetGenerSpec() 或 CATIDftView::GetGenerSpec() 获得。它管理视图的生成参数:
| 能力 | 常用方法 |
|---|---|
| 投影平面 | SetProjPlane()、GetProjPlane() |
| 隐藏线 | GetHiddenLinesMode()、SetHiddenLinesMode() |
| 圆角表示 | GetFilletRep()、SetFilletRep() |
| 3D 标注生成 | GetDressUpGeneration()、SetDressUpGeneration() |
| 局部视图 | AddClipping()、GetClipping()、GetDetailProfile()、GetDetailFeature() |
| 剖视图 | AddSection()、GetSectionProfile()、GetSectionFeature()、GetSectionType() |
| 断裂视图 | AddBreakView()、GetBreakViewInfo()、GetBreakViewFeature() |
| 生成几何包围盒 | GetBBoxOf2DGeneratedGeom() |
| callout 来源 | GetOriginCallout() |
典型理解:
CATIGenerSpec 描述“这个视图应该如何从 3D 生成”。
CATIDftGenGeom / CATIDrwGenDrawShape 描述“已经生成出来的 2D 结果”。
9.2 CATIDftGenViewFactory:创建特殊生成式视图
CATIDftGenViewFactory 由 sheet 实现,用于创建几类特殊生成式视图:
| 方法 | 作用 |
|---|---|
| CreateViewFrom3D() | 从 3D TPS view 创建 View From 3D |
| CreateSectionView() | 基于母视图和 2D 剖切线创建剖视/剖切视图 |
| CreateStandAloneSectionView() | 基于 3D 草图、平面或平面面创建独立剖视图 |
示例骨架:
CATIDftSheet *piSheet = NULL;
piDftDrawing->GetActiveSheet(&piSheet);
CATIDftGenViewFactory *piGenViewFactory = NULL;
if (piSheet && SUCCEEDED(piSheet->QueryInterface(IID_CATIDftGenViewFactory,
(void **)&piGenViewFactory)))
{
double origin[2] = { 150.0, 150.0 };
CATIDftView *piSectionView = NULL;
// 实际使用时需要提供剖切方向、3D plane/face/sketch、limit points 和产品上下文。
piGenViewFactory->CreateStandAloneSectionView(
origin,
DftSectionView,
vecPro,
0,
pi3DSketch,
piCell,
piBody,
limitPoints,
piProduct,
&piSectionView);
if (piSectionView) piSectionView->Release();
piGenViewFactory->Release();
piGenViewFactory = NULL;
}
if (piSheet) piSheet->Release();
如果剖切来源在 CATProduct 中,CATIProduct *piProduct 需要表示包含 3D 元素的产品实例上下文。这个点和装配开发一样重要:同一个 Part 在不同实例位置下,投影结果不同。
9.3 CATIDftGenView:生成式视图扩展
CATIDftGenView 通常通过 CATIDftView::GetApplicativeExtension() 取得:
IUnknown *piGenViewUnknown = NULL;
CATIDftGenView *piGenView = NULL;
if (SUCCEEDED(piDftView->GetApplicativeExtension(IID_CATIDftGenView,
&piGenViewUnknown)))
{
piGenViewUnknown->QueryInterface(IID_CATIDftGenView,
(void **)&piGenView);
}
常用能力:
| 方法 | 作用 |
|---|---|
| IsGenerative() | 判断 view 是否为生成式视图 |
| IsShowHidden() / SetShowHidden() | 读取/设置隐藏线显示 |
| IsShowSmooth() / SetShowSmooth() | 读取/设置平滑边显示 |
| GetRepresentationMode() / SetRepresentationMode() | EXACT / POLYHEDRIC 表示模式 |
| GetProjectionPlane() / SetProjectionPlane() | 读取/设置投影平面 |
| SetBox3D() / RemoveBox3D() | 设置或移除 3D 裁剪盒 |
| GetViewLinks() | 获取生成式视图链接管理器 |
如果只是修改投影规格,优先看 CATIGenerSpec;如果要访问 generative view 的扩展属性,再看 CATIDftGenView。
10. 生成几何访问与 3D 来源追踪
10.1 CATIDftGenGeomAccess
生成式视图更新后,会产生一批 2D generated items。CATIDftGenGeomAccess 用于从 view 中查询这些结果:
| 方法 | 作用 |
|---|---|
| GetAllGeneratedItems(iid, list) | 获取所有生成几何 |
| GetGeneratedItemForm3DGeom(iid, geom, product, list) | 根据某个 3D 几何查对应生成项 |
| GetGeneratedItemForm3DGeomList(iid, geomList, productList, list) | 根据多个 3D 几何查对应生成项 |
| GetEncumbrancyOfGeneratedItems() | 获取生成几何包围盒 |
| GetAllGeneratedShapes(iid, list) | 获取所有生成 shape |
典型访问流程:
CATIDftGenGeomAccess *piGenGeomAccess = NULL;
IUnknown *piGenViewUnknown = NULL;
if (SUCCEEDED(piDftView->GetApplicativeExtension(IID_CATIDftGenView,
&piGenViewUnknown)))
{
if (SUCCEEDED(piGenViewUnknown->QueryInterface(IID_CATIDftGenGeomAccess,
(void **)&piGenGeomAccess)))
{
CATIUnknownList *piList = NULL;
if (SUCCEEDED(piGenGeomAccess->GetAllGeneratedItems(IID_CATIDftGenGeom,
&piList)))
{
// loop generated geometry
piList->Release();
piList = NULL;
}
piGenGeomAccess->Release();
piGenGeomAccess = NULL;
}
piGenViewUnknown->Release();
piGenViewUnknown = NULL;
}
10.2 CATIDftGenGeom
CATIDftGenGeom 表示某条由 3D 投影生成的 2D 几何。常用方法:
| 方法 | 作用 |
|---|---|
| GetUnderlyingGeometry() | 获取底层 2D CATCurve |
| GetGeometryOfOrigin() | 获取来源 3D CATCell 列表 |
| GetBody() | 获取来源 3D body |
| GetProduct() | 获取来源产品实例 |
| GetFeature() | 获取来源 feature |
| GetShowMode() / SetShowMode() | 读取/设置显示模式,如 visible/hidden |
| GetTransformation() | 获取从 3D 到工程图结果的变换 |
| IsCut() | 判断是否由剖切产生 |
例如修改生成边颜色时,可以从 CATIDftGenGeom 再转 CATIVisProperties:
CATIDftGenGeom *piGenGeom = NULL;
item->QueryInterface(IID_CATIDftGenGeom, (void **)&piGenGeom);
if (piGenGeom)
{
CATBoolean isCut = FALSE;
piGenGeom->IsCut(&isCut);
CATIVisProperties *piVis = NULL;
if (SUCCEEDED(piGenGeom->QueryInterface(IID_CATIVisProperties,
(void **)&piVis)))
{
CATVisPropertiesValues values;
if (isCut)
values.SetColor(255, 0, 0);
else
values.SetColor(0, 255, 0);
piVis->SetPropertiesAtt(values, CATVPColor, CATVPLine);
piVis->Release();
piVis = NULL;
}
piGenGeom->Release();
piGenGeom = NULL;
}
10.3 CATIDrwGenDrawShape
CATIDrwGenDrawShape 用于访问生成式剖视图中的 generated shape,例如剖切填充区域:
| 方法 | 作用 |
|---|---|
| GetDescription() | 获取轮廓数量、每个轮廓点数和 2D 点坐标 |
| GetBody() | 获取来源 body |
| GetProduct() | 获取来源产品实例 |
| GetPattern() | 获取剖面填充 pattern |
它适合做剖面填充检查、剖切区域统计、按来源零件修改剖面线样式等业务。
11. Callout、剖切线和局部视图标识
工程图中的剖视、局部视图、断裂视图通常伴随 callout。常用接口是 CATIDrwCalloutAccess。
| 方法 | 作用 |
|---|---|
| GetCalloutType() | 获取 callout 类型,如 Section、Detail、Break |
| GetAssociatedView() | 获取 callout 对应的目标视图 |
| callout 参数接口 | 修改箭头、文字、线型等显示参数 |
常见处理流程:
遍历所有 view
-> view.GetComponents(IID_CATIDrwCalloutAccess)
-> 判断 callout type
-> GetAssociatedView()
-> associatedView.GetGenerSpec()
-> GetSectionProfile() / GetDetailProfile() / GetBreakViewInfo()
在工程图自动检查中,这类接口很有用,例如:
- 检查剖视图是否有剖切线;
- 检查局部视图比例是否满足规范;
- 根据剖切线方向自动调整视图位置;
- 读取断裂视图两组断裂线和位移量。
12. 标题栏和背景视图
标题栏开发通常不是一个独立的工程图对象,而是在 background view 中创建二维几何和文字。典型流程:
获取当前 sheet
-> 获取 Background View
-> 将其设为当前 view(批处理)或进入 sketch edition(交互命令)
-> 用 CATI2DWFFactory 画线框
-> 用 CATIDrwAnnotationFactory 创建文字
-> 用文字属性接口设置字体、大小、粗体等
批处理里常见写法:
CATISheet_var spSheet = piDrawing->GetCurrentSheet();
CATIView_var spBgView = spSheet->GetBackgroundView();
spSheet->SetCurrentView(spBgView);
CATI2DWFFactory_var sp2DFactory = spBgView;
CATIDrwAnnotationFactory_var spAnnFactory = spBgView;
// 画标题栏线框
// 创建标题栏文字
标题栏里的企业属性通常来自:
| 来源 | 典型接口 |
|---|---|
| Drawing 自身属性 | CATIDrawing、CATISpecObject、CATIAlias |
| 当前 sheet 信息 | CATIDftSheet、CATIDftSheetFormat |
| 3D Part/Product 属性 | CATIProduct、CATIPrdProperties、CATIPrtPart |
| 参数/知识工程属性 | CATICkeParm 及相关 Knowledge 接口 |
经验规则:
标题栏几何属于 background view;标题栏字段值来自业务对象。不要把属性读取逻辑和画框逻辑混在一起。
13. 2D Layout for 3D Design 不是普通 Drafting
Drafting2DLInterfaces 面向 2D Layout for 3D Design。它和普通 CATDrawing Drafting 接口有交集,但不是同一个对象模型。
常见接口:
| 接口 | 作用 |
|---|---|
| CATI2DLayoutLayout | 2D Layout 根布局对象 |
| CATI2DLayoutSheet | 2D Layout sheet |
| CATI2DLayoutView | 2D Layout view |
| CATI2DLayoutClipping | 2D Layout clipping |
| CAT2DLayoutServices | 2D Layout 服务 |
| CAT2DLDrawingServices | 2D Layout 与 Drafting 转换/打印相关服务 |
很多 DraftingInterfaces 方法注释里都写着:
This method is not available with 2D Layout for 3D Design.
因此做工程图二开时要先确认目标文档类型:
普通 CATDrawing:优先 DraftingInterfaces。
2D Layout for 3D Design:看 Drafting2DLInterfaces,不要直接套用普通 Drafting 示例。
14. 常见开发场景选型
| 场景 | 推荐接口 |
|---|---|
| 新建工程图并保存 | CATDocumentServices、CATIDftDocumentServices、CATIDftDrawing |
| 导入 ISO/ANSI/企业标准 | CATIDftStandardManager |
| 设置 A0/A1/A2 图幅和方向 | CATIDftDrawingFormats、CATIDftSheetFormat |
| 新增 sheet | CATIDftDrawing::AddSheet() |
| 获取当前 sheet/main view/background view | CATIDftDrawing + CATIDftSheet,或 CATIDrawing + CATISheet |
| 新建普通二维视图 | CATIDrwFactory::CreateViewWithMakeUp()、CATIDftViewMakeUp |
| 调整视图位置、比例、角度 | CATIDftViewMakeUp |
| 在视图中画线/圆/点 | CATI2DWFFactory |
| 枚举视图中二维几何 | CATISketch、CATI2DWFGeometry、CATI2DCurve |
| 创建文字、气泡、GDT、粗糙度 | CATIDrwAnnotationFactory、CATIDftText、CATIDftBalloon、CATIDftGDT |
| 创建尺寸 | CATIDrwAnnotationFactory::CreateDimension()、CATIDrwDimDimension |
| 创建剖面线/填充 | CATIDrwFactory、CATIDftHatchingPattern、CATIDrwAnnotationFactory::CreateDrwAreaFill() |
| 创建剖视图/局部视图 | CATIGenerSpec、CATIDftGenViewFactory |
| 判断视图是否 generative | CATIDftGenView::IsGenerative() |
| 访问 3D 投影生成边 | CATIDftGenGeomAccess、CATIDftGenGeom |
| 访问剖切生成区域 | CATIDrwGenDrawShape |
| 查 callout 和剖切线信息 | CATIDrwCalloutAccess、CATIGenerSpec |
| 修改生成边颜色/线型 | CATIVisProperties |
| 标题栏自动化 | CATISheet::GetBackgroundView()、CATI2DWFFactory、CATIDrwAnnotationFactory |
15. 编译依赖提示
工程图模块的 CAA module 通常至少需要链接这些 framework,具体按实际头文件增减:
LINK_WITH = DraftingInterfaces \
SketcherInterfaces \
ObjectModelerBase \
ObjectSpecsModeler \
Mathematics
如果访问生成式视图来源、装配上下文或显示属性,可能还要加入:
LINK_WITH += ProductStructure \
MecModInterfaces \
GeometricObjects \
Visualization
如果做 View From 3D、FTA/TPS 相关功能,还需要检查 Tolerancing 相关 framework。
不要只根据类名猜链接库。更稳妥的做法是:
头文件在哪个 framework/PublicInterfaces 下,优先把这个 framework 加到 LINK_WITH。
16. 实战注意事项
- 先拿 Drawing root,再拿 container:
CATIDftDocumentServices::GetDrawing()是入口,CATISpecObject::GetFeatContainer()是 factory 和 standard manager 的入口。 - 不要混淆 view 坐标和 sheet 坐标:
ViewMakeUp用 sheet 坐标,视图里的二维几何和标注用 view 坐标。 - 优先使用新接口:文字优先
CreateDftText(),图幅优先CATIDftSheetFormat,sheet/view 管理优先CATIDftDrawing/CATIDftSheet/CATIDftView。 - 老示例仍然有价值:很多 CAA 示例使用
CATIDrawing、CATISheet、CATIView,不要误以为它们是脚本接口。 - 生成几何不是稳定业务对象:生成式视图更新后,
CATIDftGenGeom可能被重建。不要长期保存生成几何指针,必要时按 3D 来源重新查找。 - 装配上下文必须带产品实例:从 3D 几何映射到工程图生成项时,
CATIProduct上下文很关键。 - 背景视图在 UI 命令中要小心激活:批处理中可以直接设置 current view;交互命令中可能导致命令被取消。
- 接口返回的内存要按说明释放:
Release()、delete[] wchar_t、delete CATMathPoint2D*、delete list这几类在工程图示例中都很常见。 - 尺寸要用尺寸接口创建:不要用普通文字模拟尺寸,否则无法参与更新、样式、标准和检查。
- 2D Layout 单独处理:看到 2D Layout 文档时,优先查
Drafting2DLInterfaces,不要直接套普通 Drafting API。
总结一下:
工程图二开入口是 CATIDftDocumentServices。
图纸结构看 CATIDftDrawing / CATIDftSheet / CATIDftView。
二维几何看 CATI2DWFFactory。
标注尺寸看 CATIDrwAnnotationFactory。
生成式视图看 CATIGenerSpec / CATIDftGenViewFactory / CATIDftGenGeomAccess。
评论