在C++代码中有个函数mdlSystem_compressDgnFile()可以压缩当前打开的文件。
我的需求是在后台代码中拿到一个dgnFile类型的对象,如何不在前台打开就调用压缩命令对其进行压缩呢?
霄男 宿 said:如何不在前台打开就调用压缩命令对其进行压缩呢?
您可以参照下文在后台处理一批DGN文件而不让用户看到操作界面。这种工作模式下每个打开的文件还是被作为当前文件看待的。
[MSCE C#]通过COM技术实现MSCE的自动化
在这种COM编程对象模型中,可以通过发送键入命令Compress Design Confirm来实现。
同样的问题还得请教您一下,采用mdlSystem_compressDgnFile()方法压缩文件并没有传递设置参数,但实际上通过软件操时,是可以设置具体压缩某些内容,然后再执行压缩的,可以通过代码来实现吗?我想设置压缩单元头和空文本
霄男 宿 said:或者我可否知道软件压缩空单元头和空文本元素是依据什么样的特征,我可否通过代码遍历元素自行删除呢?
这个可以的,Session.Instance.GetActiveDgnModel().GetElements可以获取到所有元素,然后迭代这些元素,找出来单元和文本元素,判断其内容是否为空进而删除即可。
是否是单元的ChildElement属性为空说明是空单元,文本拿到的内容是""就是空文本呢?我想知道软件压缩这些空元素所遵照的具体规则。
应该是这样的,您可以弄两个这样的元素测试一下。
嗯……那好吧~姑且先这样吧
都用发送命令的方式测试一下。比如,连续发送如下三个键入命令:
Compress Options On EMPTY_CELL
Compress Options On EMPTY_TEXT
Compress Options Run
请注意,这里我改用了Compress Options Run取代原来的Compress Design Confirm
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
Answer Verified By: 霄男 宿
实践证明,这个方式可以实现,只是目前无法获取用户本身的压缩设置,以便在通过Keyin改变压缩设置进行压缩后,再恢复到原来的用户压缩设置。
可以用如下代码获取当前Compress Options的值。
/*-------------------------------------------------------- | getCompressOptions +-------------------------------------------------------*/ #define RTYPE_CompOptPrefs RTYPE( 'C','m','p','O' ) typedef struct coPrefs { UInt32 reserved1; UInt32 reserved2; WChar cmdString[512]; } COPrefs; void getCompressOptions() { COPrefs* pPrefsRsc = nullptr; RscFileHandle userPrefsH; mdlDialog_userPrefFileOpen(&userPrefsH, false); if (NULL != (pPrefsRsc = (COPrefs*)mdlResource_load(userPrefsH, RTYPE_CompOptPrefs, 1))) { mdlDialog_dmsgsPrint(pPrefsRsc->cmdString); } mdlResource_closeFile(userPrefsH); }