在C++代码中有个函数mdlSystem_compressDgnFile()可以压缩当前打开的文件。
我的需求是在后台代码中拿到一个dgnFile类型的对象,如何不在前台打开就调用压缩命令对其进行压缩呢?
霄男 宿 said:如何不在前台打开就调用压缩命令对其进行压缩呢?
您可以参照下文在后台处理一批DGN文件而不让用户看到操作界面。这种工作模式下每个打开的文件还是被作为当前文件看待的。
[MSCE C#]通过COM技术实现MSCE的自动化
在这种COM编程对象模型中,可以通过发送键入命令Compress Design Confirm来实现。
同样的问题还得请教您一下,采用mdlSystem_compressDgnFile()方法压缩文件并没有传递设置参数,但实际上通过软件操时,是可以设置具体压缩某些内容,然后再执行压缩的,可以通过代码来实现吗?我想设置压缩单元头和空文本
霄男 宿 said:是不是就类似通过Inerop来调用KeyIn执行我的dll一样?
是的。通过Interop发送命令MDL LOAD yourDLL;YourKeyin
霄男 宿 said:我的dll会弹出进度条窗口,这不影响吧?
应该不影响,这种调用方式仅仅是让MS在后台运行,MS还是被正常启动了。
霄男 宿 said:可以通过代码来实现吗?我想设置压缩单元头和空文本
没有找到代码设置compression Options的功能,不过MS提供有一个配置变量MS_COMPRESS_OPTIONS,它可以用来设置默认的压缩选项。其实,将所有选项都勾选反而是我们最常用的方法。似乎没有太大必要详细区分压缩哪个,不压缩哪个。
感谢,使用环境变量似乎是一个很好地方式
Windows级别的这种变量我们称之为“环境变量”,MS软件级别的变量我们称之为“配置变量”。
我实践了一下,通过修改配置变量的方式无法实现。请看截图
5个条目从下往上按时间顺序,下边两次是我使用如下代码
ConfigurationManager.DefineVariable("MS_COMPRESS_OPTIONS", "+EMPTY_CELL;+EMPTY_TEXT");//设置环境变量,压缩元素头和空文本 Session.Instance.Keyin("Compress Design Confirm");
确认空单元头和空文本元素是勾选上的,这时我再点击“取消”按钮关闭该对话框,再次执行上边的代码,就生成了第一个截图中的上边3条记录,空元素头被成功删除。
请问遇到了这种问题是什么原因呢?有什么方式可以处理吗?
或者我可否知道软件压缩空单元头和空文本元素是依据什么样的特征,我可否通过代码遍历元素自行删除呢?
霄男 宿 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: 霄男 宿