本文介绍如何使用Toolkit将绘图中的尺寸、表格、注释、符号、公差以及表面粗糙度添加到各自对应的层进行归类。

1.添加、删除层

Toolkit中添加删除层的内容与VBAPI等类似,只是按照Toolkit的风格调用函数即可,ProAddLayerProLayerDelete,参数中明确对应层名称即可,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ProError AddLayer(ProMdl Mdl, ProName LayerName, ProLayer *Layer)
{
ProError status;
status = ProLayerCreate(Mdl, LayerName, Layer);
return status;
}
ProError DeleteLayerByName(ProLayer Layer, ProName Name)
{
ProError status;
int result;
ProName layname;
status = ProModelitemNameGet(&Layer, layname);
status = ProWstringCompare(Name, layname, PRO_VALUE_UNUSED, &result);
if (result == 0)
{
status = ProLayerDelete(&Layer);
return status;
}
else
{
return PRO_TK_E_NOT_FOUND;
}
}

2.向层中添加元素

向层中添加元素可使用ProLayerItemAdd函数完成,在添加之前,需要通过给定的ProModelitem对象创建一个ProLayerItem对象,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
ProError ProAddItemstoLayer(ProMdl mdl, ProLayer Layer, ProModelitem Item)
{
ProError status;
ProMdlType mdltype;
ProLayerItem layeritem;
status = ProLayerItemInit(Item.type, Item.id, mdl, &layeritem);
if (status == PRO_TK_NO_ERROR)
{
status = ProLayerItemAdd(&Layer, &layeritem);
}
return status;
}

3.遍历尺寸、符号等元素

与Weblink、VBAPI不同,Toolkit更接近与Creo的底层设计,尺寸、符号等元素会根据配置选项分别保存在模型或者工程图下,因此在将元素添加到层中时,需要同时遍历模型和工程图两个文件统计后再添加。以将尺寸添加到层说明Toolkit中如何遍历所有尺寸。

首先是遍历绘图中保存的所有尺寸,采取典型的Toolkit中遍历函数,需要遍历PRO_DIMENSIONPRO_REF_DIMENSION两种类型:

1
2
status = ProDrawingDimensionVisit((ProDrawing)mdl, PRO_DIMENSION, (ProDimensionVisitAction)DimensionVisitAction, NULL, (ProAppData)&dimensions);
status = ProDrawingDimensionVisit((ProDrawing)mdl, PRO_REF_DIMENSION, (ProDimensionVisitAction)DimensionVisitAction, NULL, (ProAppData)&dimensions);

Filter函数如下,这里的操作是把所有访问到的记录均记录到数组中:

1
2
3
4
5
6
ProError DimensionVisitAction(ProDimension *dimension, ProError status, ProAppData data)
{
ProDimension **p_dims = (ProDimension **)data;
status = ProArrayObjectAdd((ProArray *)p_dims, PRO_VALUE_UNUSED, 1, dimension);
return status;
}

之后就是遍历所有保存在实体中的尺寸。由于绘图可能是装配体,需要首先收集绘图对应模型中包含的ProSolid对象:

1
2
status = ProDrawingSolidsCollect((ProDrawing)mdl, &solids);
status = ProArraySizeGet(solids, &n_size);

最后循环调用ProSolidDimensionVisit函数获取保存在所有实体中的尺寸:

1
2
3
4
5
6
7
8
for (i = 0; i < n_size; i++)
{
status = ProArrayAlloc(0, sizeof(ProDimension), 1, (ProArray *)&dimensions);
status = ProSolidDimensionVisit(solids[i], PRO_B_FALSE, (ProDimensionVisitAction)DimensionVisitAction, NULL, (ProAppData)&dimensions);
status = ProSolidDimensionVisit(solids[i], PRO_B_TRUE, (ProDimensionVisitAction)DimensionVisitAction, NULL, (ProAppData)&dimensions);
//这里执行将尺寸对象加入到层的操作
//……
}

同理可完成对表格、注释、符号、公差以及表面粗糙度的遍历和归类。

代码公开,需要的人可以随便根据自己的环境修改编译。完整代码可在Github.com下载。代码在VS2010,Creo 2.0 M060 X64下编译通过。