← 返回首页

CATIA V5 CAA 工程图模块二次开发常用接口库介绍

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 / CATIDftViewCATIDrawing / 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;
}

如果后续要使用 CATIDrwFactoryCATIDftStandardManagerCATIDftDrawingFormats 等容器级服务,需要从 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

例如创建标注、标题栏、二维几何时,经常会从 CATIDrawingCATISheet,再从 CATISheetCATIView

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 上的位置、比例、角度和与其它视图的位置关系

ViewViewMakeUp 的职责要分开理解:

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 几何主要通过 SketcherInterfacesCATI2DWFFactory 创建。视图本身通常可以转成 CATI2DWFFactoryCATISketch

常用接口:

接口 作用
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,而 CATIUnknownListItem() / 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. 实战注意事项

  1. 先拿 Drawing root,再拿 containerCATIDftDocumentServices::GetDrawing() 是入口,CATISpecObject::GetFeatContainer() 是 factory 和 standard manager 的入口。
  2. 不要混淆 view 坐标和 sheet 坐标ViewMakeUp 用 sheet 坐标,视图里的二维几何和标注用 view 坐标。
  3. 优先使用新接口:文字优先 CreateDftText(),图幅优先 CATIDftSheetFormat,sheet/view 管理优先 CATIDftDrawing / CATIDftSheet / CATIDftView
  4. 老示例仍然有价值:很多 CAA 示例使用 CATIDrawingCATISheetCATIView,不要误以为它们是脚本接口。
  5. 生成几何不是稳定业务对象:生成式视图更新后,CATIDftGenGeom 可能被重建。不要长期保存生成几何指针,必要时按 3D 来源重新查找。
  6. 装配上下文必须带产品实例:从 3D 几何映射到工程图生成项时,CATIProduct 上下文很关键。
  7. 背景视图在 UI 命令中要小心激活:批处理中可以直接设置 current view;交互命令中可能导致命令被取消。
  8. 接口返回的内存要按说明释放Release()delete[] wchar_tdelete CATMathPoint2D*delete list 这几类在工程图示例中都很常见。
  9. 尺寸要用尺寸接口创建:不要用普通文字模拟尺寸,否则无法参与更新、样式、标准和检查。
  10. 2D Layout 单独处理:看到 2D Layout 文档时,优先查 Drafting2DLInterfaces,不要直接套普通 Drafting API。

总结一下:

工程图二开入口是 CATIDftDocumentServices。
图纸结构看 CATIDftDrawing / CATIDftSheet / CATIDftView。
二维几何看 CATI2DWFFactory。
标注尺寸看 CATIDrwAnnotationFactory。
生成式视图看 CATIGenerSpec / CATIDftGenViewFactory / CATIDftGenGeomAccess。

评论