其实这个功能也无非是读取属性和修改属性,不过既然vbapi的写了,toolkit也权当练练手了。

1.读取零件材料信息

Toolkit下使用ProMaterialCurrentGet即可获得使用的材料基本信息,返回ProMaterial类型的结构体:

1
2
3
4
5
typedef struct pro_material
{
ProName matl_name;
ProSolid part;
} ProMaterial;

如果需要获得更详细的信息,则可以调用ProMaterialDataGet、ProMaterialPropertyGet以及ProMaterialDescriptionGet等函数获得,返回相关数据对应的结构体、字符串数组等,在此不再赘述。给出获取当前零件使用材料名称的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ProError status;
ProMdl mdl;
ProMaterial material;
status = ProMdlCurrentGet(&mdl);
status = ProMaterialCurrentGet(ProMdlToSolid(mdl), &material);
if (status == PRO_TK_NO_ERROR)
{
CString Name = CString(material.matl_name);
AfxMessageBox("当前使用的材料为:" + Name);
}
else
{
AfxMessageBox("当前未设置材料");
}

使用ProPartMaterialsGet函数可以获取当前零件已包含的材料。与常见Toolkit返回一个指针数组的函数的操作类似,该函数会申请内存返回一个指针,不用时通过ProArrayFree释放内存。获取当前零件包含材料名称的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ProName *p_name;
status = ProArrayAlloc(0, sizeof(ProName), 1, (ProArray *)&p_name);
int count;
status = ProPartMaterialsGet(ProMdlToSolid(mdl), &p_name);
if (status != PRO_TK_NO_ERROR)
{
AfxMessageBox("当前未包含任何材料");
}
else
{
status = ProArraySizeGet((ProArray)p_name, &count);
CString Names = "";
for (int i = 0; i < count; i++)
{
Names += CString(p_name[i]) + ",";
}
AfxMessageBox("当前包含以下材料:" + Names);
}
status = ProArrayFree((ProArray *)&p_name);

2. 设定零件材料

设定零件材料只需调用ProMaterialCurrentSet函数指定对应的material即可:

1
status = ProMaterialCurrentSet(&material);

使用ProMaterialfileRead可以从磁盘中读取材料文件(*.mtl)。调用该函数的注意点与vbapi一样,一是函数参数中材料文件名称需要带文件后缀名,二是调用前需要将当前工作目录工作目录设置为材料文件所在目录。读取材料文件并设定为零件材料的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ProPath currentPath;
ProError status;
ProMdl mdl;
ProMaterial material;

CString filter = "材料文件 (*.mtl)|*.mtl||";
CFileDialog openFileDlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_READONLY, filter, NULL);
if (openFileDlg.DoModal() == IDOK)
{
status = ProDirectoryCurrentGet(currentPath);
status = ProMdlCurrentGet(&mdl);

wchar_t *p = openFileDlg.GetFolderPath().AllocSysString();
status = ProDirectoryChange(p);
SysFreeString(p);

p = openFileDlg.GetFileTitle().AllocSysString();
status = ProMaterialfileRead(ProMdlToSolid(mdl), p);
status = ProWstringCopy(p, material.matl_name, PRO_VALUE_UNUSED);
material.part = ProMdlToSolid(mdl);
SysFreeString(p);

status = ProMaterialCurrentSet(&material);

status = ProDirectoryChange(currentPath);
}

完整代码可在Github.com下载。代码在VS2010,Creo 2.0 M060 X64下编译通过。