Creo中的文本采用富文本格式,可以设置其字体、大小、颜色等。Toolkit中,文本以AnnotationNoteDimension等方式存储,但文本样式统一采用ProTextStyle进行存储,故各文本对象之间的格式可以通用。不过遗憾的是,除了修改Note的文本样式可以直接使用外,修改AnnotationDimension等对象文本样式的函数需要需要TOOLKIT for 3D Drawings许可。

Toolkit使用ProTextStyle句柄描述文本样式,定义如下:

1
2
/* opaque handle for text style */
typedef struct text_style *ProTextStyle;

因此在使用ProTextStyle时,必须先为其申请内存空间,同时用完后释放内存,关键代码如下:

1
2
3
4
ProTextStyle textStyle;
status = ProTextStyleAlloc(&textStyle);
// 在此进行相关操作
status = ProTextStyleFree(&textStyle);

获取Note的文本样式由ProNoteTextStyleGet函数完成,将文本样式指定给Note则由ProNoteTextStyleSet函数设定。具体实操可以通过ProSelect或者ProSelbufferSelectionsGet获取选定包含原格式的Note,再通过ProSelect选择需要格式化的Note进行操作。最终关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ProError status;
ProSelection *itemSels = NULL;
int size;
ProNote srcItem, destItem;
ProTextStyle textStyle;

status = ProMessageDisplay(MSGFILE, "IMI_PrompSelectSource");
status = ProSelect((char *)"any_note,table_cell", 1, NULL, NULL, NULL, NULL, &itemSels, &size);
if (status != PRO_TK_NO_ERROR || size < 1)
{
return;
}
status = ProSelectionModelitemGet(itemSels[0], &srcItem);
status = ProTextStyleAlloc(&textStyle);
status = ProNoteTextStyleGet(&srcItem, &textStyle);

status = ProMessageDisplay(MSGFILE, "IMI_PrompSelectDest");
status = ProSelect((char *)"any_note,table_cell", 1, NULL, NULL, NULL, NULL, &itemSels, &size);
if (status == PRO_TK_NO_ERROR && size > 0)
{
status = ProSelectionModelitemGet(itemSels[0], &destItem);
status = ProNoteTextStyleSet(&destItem, textStyle);
}
status = ProTextStyleFree(&textStyle);

P.S.同理可以通过ProAnnotationTextstyleGetProAnnotationTextstyleGet等函数获取并设定 AnnotationDimension等对象的文本格式,函数调用方法和参数与ProNoteTextStyleGetProNoteTextStyleSet一致,只是需要TOOLKIT for 3D Drawings许可。如果您有这个许可证,则可以在不同对象之间进行文本格式化的操作了。

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