这是之前做项目遇到的一个需求,将当前工作目录下所有的绘图文件放到一个新建绘图文件中的新sheet并保存,便于去排图打印。该需求是一个典型宏和代码配合编程才能实现的功能,在此做一个说明。

将磁盘上其它的绘图文件插入到当前绘图文件中的功能Toolkit未提供函数实现,所以只能用宏去实现。枚举文件的功能只能通过代码实现。梳理个功能的实现方式和业务流程后,初步总结自动排图的流程如下图所示(图中备注了各流程的实现方式):

图 自动排图流程

对上述流程的每一步进行说明。

1. 枚举绘图文件

功能很简单,只需要调用ProFilesList函数即可:

1
2
3
4
5
ProError status;
ProPath *file_list, *dir_list;
ProPath currentpath;
status = ProDirectoryCurrentGet(currentpath);
status = ProFilesList(currentpath, L"*.drw", PRO_FILE_LIST_LATEST, &file_list, &dir_list);

2. 新建绘图文件并打开

新建绘图文件用于插入绘图文件通过代码执行。ProFileSave打开保存对话框确定获得文件名,ProMdlfileCopy将第一个文件复制至ProFileSave返回结果。

1
2
3
ProPath savepath;
status = ProFileSave(NULL, filter, NULL, NULL, NULL, NULL, savepath);
status = ProMdlfileCopy(PRO_MDL_DRAWING, file_list[0], savepath);

打开新建的文件通过宏或代码的方式都可以实现,这里用宏实现,注意在宏里面目录使用两个反斜杠”\\“表示,需要处理下:

1
2
3
filename = CString(savepath);
filename.Replace(_T("\\"), _T("\\\\"));
macro = _T("~ Command `ProCmdModelOpen` ;~ Trail `UI Desktop` `UI Desktop` `DLG_PREVIEW_POST` `file_open`;~ Update `file_open` `Inputname` `" + filename + "`;~ Trail `UI Desktop` `UI Desktop` `PREVIEW_POPUP_TIMER` `file_open:Ph_list.Filelist:<NULL>`;~ Command `ProFileSelPushOpen@context_dlg_open_cmd`;");

3. 新建绘图文件并打开

插入绘图文件到新sheet需要用宏表示。前面已经枚举了所有绘图文件,所以只需要循环插入对应的宏即可:

1
2
3
4
5
6
for (int i = 1; i < n_files; i++)
{
CString tmp = CString(file_list[i]);
tmp.Replace(_T("\\"), _T("\\\\"));
macro += _T("~ Command `ProCmdDwgImpAppend` ;~ Trail `UI Desktop` `UI Desktop` `DLG_PREVIEW_POST` `file_open`;~ Update `file_open` `Inputname` `") + tmp + _T("`;~ Command `ProFileSelPushOpen@context_dlg_open_cmd`;");
}

4.收尾工作

宏字符串拼接完毕后,可以直接运行。增加一个最后弹出对话框的提示,还是按照以前的方式:

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
27
28
29
30
macro += _T("~ Command `About_Act`;");
hint = Fun;
wchar_t *p = macro.AllocSysString();
ProMacroLoad(p);
SysFreeString(p);

ProError ShowDialog(wchar_t *Message)
{
ProUIMessageButton *buttons;
ProUIMessageButton user_choice;
ProArrayAlloc(1, sizeof(ProUIMessageButton), 1, (ProArray *)&buttons);
buttons[0] = PRO_UI_MESSAGE_OK;
ProUIMessageDialogDisplay(PROUIMESSAGE_INFO, L"提示", Message, buttons, PRO_UI_MESSAGE_OK, &user_choice);
ProArrayFree((ProArray *)&buttons);
return PRO_TK_NO_ERROR;
}

void about()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (hint == Fun)
{
ShowDialog(L"自动排图结束。");
}
else
{
ShowDialog(L"用于自动排图。\n访问我的博客获取更多信息:\nhttp://www.hudi.site");
}
hint = About;
}

最终效果如下所示:

图 自动排图

完整代码可在Github.com下载。