辛金超
(上海建筑设计研究院有限公司,上海 200041)
图纸是工程师的语言,其中包含了大量的信息。将正则表达式技术结合到Visual LISP中,并用其处理结构施工图,是一个简单便捷而又智能准确的方法。使用该方法处理设计制图时遇到的问题,可以高效、准确地完成设定任务,突破一些图纸处理时遇到的瓶颈,提高工作效率和绘图质量。
Visual LISP(VLISP)是新一代的AutoCAD LISP语言,它增强并扩展了AutoLISP[1],提供了曲线测量、反应器及ActiveX功能,并且程序可以编译,加快了运行速度。对于时间紧张的工程设计人员来说,开发效率和使用效率同等重要,选择开发效率较高的AutoLISP语言,能够高效地完成一般开发任务,非常适合开发专业性很强并且结合工程师切身需要的应用程序。所谓正则表达式(Regular Expression),就是一种描述字符串结构模式的形象化表达方法。它优美而又功能强大,是计算机软件领域内的一项伟大发明[2]。正则表达式由“元字符”和“文字”组成,二者构成了描述字符串结构模式的描述语法。它能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据[2],具有很广泛的应用。
正则表达式的使用需要宿主语言,虽然VLISP暂时不支持其使用,但凭借其对ActiveX功能的支持,可以编程驱动一些外部对象,将此功能融合到程序中。在VLISP中使用ActiveX Automation功能操作外部对象可以使用vlax-invoke-method函数调用特定对象的方法,用vlax-get-property和vlax-put-property函数获取和设置特定对象的属性,相对于导入类型库方式来说,该方式较为节省内存开销[3]。VBScript在Windows系统中较为常用,如果只是使用VBScript的正则表达式能力,那么可以直接创建“VBScript.RegExp”对 象:“(setq regex(vlax-create-object"VBScript.RegExp"))”,在设置完“regex”对象的“Pattern”等属性之后,分别执行其“Test”“Replace”“Execute”方法可以对目标字符串进行“测试”“替换”“获取子匹配”的操作。
perl的正则表达式能力很强,基于内建而非外部扩展,不是通过函数方式或者面向对象的方法调用,而是采用“=~”“!~”运算符结合正则表达式本身所提供的各种修饰符来决定进行何种运算。可以在程序中使用ScriptControl对象来调用perl的语言解释器,解析脚本语言,下面给出了主要实现代码:
(setq theScriptControl(vlax-create-object"ScriptControl"))
(vlax-put-property theScriptControl"Language""PerlScript")
(vlax-invoke-method theScriptControl"ExecuteStatement"(strcat"$TagetString=""TagetString"";""$s=$TagetString=~"thePattern";"))
(vlax-invoke-method theScriptControl"eval""$s");此即结果
此方式能够支持固定长度的反向预查,但是需要提供完整的perl风格的匹配表达式,便于分隔符的灵活使用,例如上段代码中,可令thePattern变量为"m/abc/"。
使用 Jscript语言时将上述代码中的“PerlScript”替换为“JScript”,并采用如下语句:
(vlax-invoke-method theScriptControl"ExecuteStatement"(strcat"var TagetString=""TagetString"";""var thePattern=/"thePattern"/"))
(vlax-invoke-method theScriptControl"eval""thePattern.test(TagetString)");此即结果
在平法施工图广泛应用的今天,工程师经常要与各种标注打交道,将正则表达式用作信息提取,事半而功倍。腰筋处理是一项需要获取较多信息的工作,《混凝土结构设计规范》[4]和《高层建筑混凝土结构技术规程》[5]对钢筋混凝土梁(包括连梁、转换梁)的腰筋在钢筋直径、面积配筋率、钢筋竖向间距方面都有明确规定,如果梁承受扭矩的作用,还需要满足抗扭承载力的要求。图1给出了使用VLISP处理腰筋程序的信息获取部分。
图1 腰筋计算信息识别部分流程图
图层名是图纸中必然存在的字符信息,这也是将正则表达式应用于图纸处理的一个现实基础。在AutoCAD中图层与图层名之间具有一一对应关系,正确识别出需要操作的图层名称,就正确找到了需要处理的图层以及该图层中的具体对象。对于图层的选择,常用的方法是对所选对象的图层属性进行提取,但是当我们知道图层的命名特点时,就可以采用正则表达式定位法对这些图层进行迅速准确的定位。例如可以使用正则表达式“^(.*?)(下)?(模型|变形).* ”及替换为字符串“0825-$1$3”,将一些工况下的变形图以及初始模型图层的名称改变。
在处理施工图时往往会遇到布局很多的情况,使用AutoCAD自带的滚动条来切换效率不是很高,若中间出现错误点击,则更增加了使用者的等待时间,若能首先准确方便地定位到某布局之后一次性切换,这无疑会给图纸查看带来便利。基于此目的,制作了功能函数,用户可以输入相对模糊的正则匹配条件,程序会将匹配的结果按照标签的排列顺序列出,供用户二次选择,最后切换至指定布局。
AutoLISP非常适合开发专业性很强并且符合工程师切身需要的应用程序,它能够结合工程师对CAD系统的使用经验,具有很高的开发效率。正则表达式是一种面向实践的思想和方法,实实在在地提高了使用者的实战能力。通过VLISP中提供的ActiveX方法,将正则表达式功能结合到程序当中,一方面提高了程序设计的效率,间接地节省了工程师的时间;另一方面,提供给工程师在CAD中直接使用正则表达式的接口,促进了制图效率效果的改善。
[1] Autodesk Inc.Introduction[EB/OL].http://exchange.autodesk.com/autocad/enu/online-help/search # WSfacf1429558a55de1-a7524c1004e616f8b-5bb9.htm.
[2] Jeffrey E.F.Friedl.精通正则表达式[M].第 3版.余 晟,译.北京:电子工业出版社,2012:2.
[3] Autodesk Inc.Using ActiveX without Importing a Type Library[EB/OL].http://exchange.autodesk.com/autocad/enu/online-help/search#WS73099cc142f4875516d84be10ebc87a53f-7bcb.htm.
[4] GB 50010-2010,混凝土结构设计规范[S].
[5] JGJ 3-2010,高层建筑混凝土结构技术规程[S].