基于CASS平台的快捷命令定制方法研究
2024-01-29于婷婷
张 泳,于婷婷
(江苏省地质测绘院,江苏 南京 211102)
0 引 言
CASS地形地籍成图软件(简称CASS)是由广东南方数码科技股份有限公司基于AutoCAD开发的一款商用数字化绘图平台,广泛应用于测绘、国土、规划、市政、环保、地质、交通、水利、电力、矿山等行业。AutoCAD是一种通过命令驱动的计算机辅助设计平台,CASS继承了这个特点,绘制所有要素或进行相关数据处理都可通过命令来实现。CASS系统内部有一个要素代码表,保存于INDEX.INI文件,为每一类要素都分配了一个代码(习惯上称为CASS码),可以通过CASS码的不同来区分各类要素[1]。为便于使用,CASS定制了专用的绘图菜单,用户通过点击菜单中相应的按钮来完成图形绘制。但这一操作本质是调用了CASS的根绘图命令「DD」,然后再自动输入的CASS码来完成这一操作。用户如果能记住CASS码的话,就可以在命令行中直接键入「DD」(注:在实际操作时,不需要输入「」,此符号只用于标识命令,下同),然后再输入CASS码。通过点击工具面板上的绘图菜单绘图时,简单方便,但绘图效率较低。通过输入根绘图命令「DD」来绘图时,CASS码的记忆量较大,且输入6位CASS码也比较耗时。为提高绘图效率,方便用户使用,需要基于现有的绘图机制,研究一个新的命令输入方法。
1 AutoCAD命令别名机制介绍
AutoCAD平台自身也提供了一个定制快捷命令的方法,即命令别名机制。快捷命令对照表保存于ACAD.PGP中。如图1所示,每个定义为一行,具体格式为:别名,*原命令。这种命令别名机制本质上没有新增命令,而只是为命令定制了一个新的别名,以达到快速输入的效果。新的别名定制好了后,需要在命令行中输入「REINIT」命令或重新启动AutoCAD来启用此别名。如绘制圆要素时,正常情况下需要输入「CIRCLE」,如果为此命令定制了别名「C」,*CIRCLE,那么只需要在命令行中输入「C」即可完成。显然输入1个字符的效率要比输入6个字符的效率要高。基于此命令别名定义机制,用户可以根据自己绘图习惯,定制一套属于自己的快捷命令[2]。
图1 AutoCAD快捷命令对照表(部分)
2 CASS平台快捷命令原理分析
虽然AutoCAD提供了一个实现快捷命令的机制,通过这种机制仅能对CASS平台中的根绘图命令「DD」进行重新定制,但不能满足于CASS平台中通过快捷命令实现DD+CASS码进行绘图的要求。
AutoLISP是由Autodesk公司开发的一种LISP程序语言,嵌入在AutoCAD内部,可以通过此语言对AutoCAD的功能进行扩展[3-4]。通过以下代码就可以实现一个新的命令「C」,此命令用于对原命令「CIRCLE」进行重新封装,如图2所示。
图2 AutoCAD命令封装示例
基于此思路,就可以对CASS平台中绘图根命令进行重新封装,如通过DD+CASS码的绘图模式绘一个“一般房屋”时,需要输入「DD+141101」(注:实际操作时需要输入DD后回车再输入141101,下同),通过以下定制后,直接输入「F」就可以实现此功能,定制的代码如图3所示。
图3 CASS绘图代码封装示例
定制快捷命令的目的就是为了实现:快捷命令=DD+CASS码。如果快捷码定义的字符越少,那么在绘图时输入的字符就越少,这样就容易提升绘图的效率。但在实际绘图过程中,由于地物的CASS码较多,单字符快捷命令就不能满足定制需求,容易产生重复。虽然可以通过增加快捷命令的字符个数来解决此问题,但如果快捷命令的字符过多,也就失去了定制快捷命令的意义,因此在定制快捷命令时,还必须要解决快捷命令重复的问题。
AutoLISP提供了initget与getkword两个组合函数,initget用于控制关键字输入,而getkword用于获取关键字。对于快捷命令出现重复时,就可以通过如图4所示方法解决此问题。
图4 重复快捷命令封装示例
3 设计思路
通过CASS平台快捷命令的原理分析可知,快捷命令的本质是通过AutoLISP语言用较短的命令对原命令进行重新封装。因此,实现此功能需要做到以下两点:① 配置文件应方便用户编辑,能够自由交互;② 所有重新封装的代码应通过配置文件自动生成,无须人工干预。
3.1 定制配置文件
配置文件基于XML(EXtensible Markup Language)格式保存,配置中包含一个或多个快捷命令定制信息,每个快捷命令定制信息主要由名称、代码或命令、是否为代码等属性项构成,各属性项的详细说明如表1所示。
定义配置文件的代码如图5所示。
图5 配置文件定义代码
3.2 配置文件的读取与保存
读取配置文件时,配置文件中的配置信息写入到配置对象中,是一种XML反序列化行为。保存配置文件时,配置对象中的配置信息写入到配置文件中,是一种XML序列化行为。在.Net Framework编程框架下,可以通过System.Xml.Serialization命名空间下的XmlSerializer类实现XML文件的序列化与反序列化。XmlSerializer对象中的Serialize方法用于将配置对象通过文件流写入文件,即保存配置文件。XmlSerializer对象中的Deserialize 方法用于将配置文件读取到配置对象中,即读取配置文件[5]。
3.3 配置文件转AutoLISP代码
快捷命令的实现,本质上是通过AutoLISP语言编写新的命令从而实现对AutoCAD功能的扩展。配置文件设置完毕后,需要通过程序化的方法将配置信息自动转为AutoLISP程序代码。主要步骤如下:
(1)读取配置文件:通过XmlSerializer.Deserialize方法将配置文件读取到内存,即生成一个QuickCMDConfig类型的对象(以下简称QuickCMDConfig对象)。
(2)检查配置文件:QuickCMDConfig对象中的CanDuplicate属性用于标识快捷命令是否允许重复,如果CanDuplicate属性为False时,应对QuickCMDConfig对象中QuickCMDList属性中的各个快捷命令的名称进行重复值检查。
(3)QuickCMDItem对象转AutoLISP代码:假设QuickCMDItem对象的变量名为CMD,主要转换代码如图6所示。
图6 转换代码
(4)保存AutoLISP代码:使用System.IO命名空间下的File对象WriteAllText方法将所有的AutoLISP代码写入一个以.lsp为扩展名的文件(如:QuickCommand.lsp)。
3.4 LISP程序加载
为立即使用转出的AutoLISP代码,应对代码文件QuickCommand.lsp进行加载操作。在AutoCAD中加载AutoLISP文件可以使用vl-load-all函数来实现,此函数只有一个参数,参数的内容为AutoLISP文件的路径,加载方法如下[6-7]:
AcadApplication.ActiveDocument.SendCommand("(vl-load-all"c:/QuickCommand.lsp"")")
上面的方法用于将配置生成AutoLISP代码文件后立即加载,如果配置没有发生变化,就不需要进行转换操作,此时可以AutoCAD提供的appload命令将QuickCommand.lsp添加到启动组中(图7),AutoCAD启动时会自动加载此文件。
图7 添加到启动组
4 应用示例
在AutoCAD(CASS)平台上,通过VB.Net编程语言编写了一个新的命令Cass_QuickCMD。此命令主要有两个功能:① 设置参数(S):用户通过窗口化或导入XLS文件的方式定制快捷命令;② 加载(D):将设置好的参数转为AutoLISP文件并加载。
4.1 设置参数
通过窗口方式设置参数时,需要通过Cass_QuickCMD命令的S选项打开参数设置主窗口,然后对“快捷命令对照”展开设置(图8)。
图8 快捷命令配置主窗口
用户根据作业需要和个人的使用习惯定义对工作中需要用到的每个CASS代码或现有的命令进行重新定义(图9)。
图9 快捷命令详细定义窗口
为便于用户快速定义快捷命令,在参数配置窗口中同时提供了通过XLS文件的方法定义各个快捷命令(图10)。
图10 在XLS文件中定义快捷命令
4.2 加载
快捷命令定义完成后,使用Cass_QuickCMD命令的D选项将参数转为AutoLISP文件并加载到当前AutoCAD(CASS)中。
5 结 语
本文基于CASS平台的绘图特性并结合AutoCAD平台提供的二次开发接口,开发了一个新的工具,用于对CASS绘图代码进行重新包装,能够简化用户的绘图流程,减轻用户记忆CASS绘图代码的负担,从而提升生产效率。CASS作为测绘专业通用的绘图平台,提供了丰富的绘图及数据功能,本工具只是对其绘图功能的进一步优化,对在CASS平台或AutoCAD平台进行其他功能的二次开发有一定的借鉴意义。