基于Lisp的自动图框绘制和输出管理技术研究
2019-02-27唐争气庾荣树
唐争气,庾荣树
(1.湖南城市学院市政与测绘工程学院,湖南 益阳 413000; 2.上海远通路桥工程有限公司,上海 200000)
1 引 言
CAD图形是工程勘察设计中最常用的图形,为提高工作效率和加强输出文件的管理,其自动分析图幅与图框绘制和打印输出管理十分重要。Lisp是ListProcessor(表处理程序)的缩写,主要用于人工智能(AI)领域。AutoLISP是人工智能语言CommonLISP的简化版本,AutoLISP严格遵循其语法和惯例,但又添加了许多针对AutoCAD的功能。借助AutoLISP,用户可以用适合编写图形应用程序的高级语言来编写宏程序和函数,并开发各种软件包。AutoLISP易于使用,并且非常灵活,多年来一直是自定义AutoCAD的标准,作为开发工具。另外,VisualLISP提供了用AutoLISP编写的独立应用程序的工具。对一般的AutoCAD用户来说,Lisp/Vlisp是进行AutoCAD二次开发的首选语言。但Lisp/Vlisp使用的对话框编程语言DCL和PDB没有一个可视化的编程环境,主要依靠开发者手工写入代码,且与Lisp/Vlisp的数据交换和相互控制实现起来比较麻烦,难于掌握。而OpenDCL是一款可视化的对话框制作工具,并且是一款完全免费的开源软件,起源于3rdDay软件公司著名的商业软件ObjectDCL,两者都是同一个作者开发出来的,功能基本一样,他们的目标正是要取代原有的DCL语言。
本文以勘察设计图的比例尺进行自动分析标准图纸大小或自定义大小、图框整饰为目标,设计了分幅图框绘制和打印输出管理技术流程,并使用LISP语言编程实现。通过实际工程检验,结果表明该技术大大提高了图框绘制和出图的效率。
2 自动图框绘制和输出管理技术流程
自动图框绘制和输出管理技术流程如图1所示:首先用OpenDCL进行界面设计,包括常用的参数信息设置;自动提取图幅信息,根据需要出图比例,自动分析推算出标准图纸大小或自定义大小以及纵横向布局的图框角点坐标的算法,从而确定分幅图框以及角图章绘制和打印预览和输出。使用LISP语言编程实现自动绘制出合适图框和自动填写工程名称、图名和人员等图幅属性信息、计算出相应的数据输出。可根据预览图框生成,看是否生成,达到要求后,可添加出图说明,并打印生成pdf图纸并分类管理。
图1 主要技术流程
3 关键技术与解决方法
3.1 参数信息设置
图框自动绘制需要填写工程名称、坐标系、图名和人员等图幅属性信息以及单位名称、资质、等级等数据信息。考虑到程序的通用性,程序记录这些信息作为配置文件加以保存,在程序退出后自动保存到配置文件中。
3.2 分析图框包含内容的图形界限
分析图形界限是程序设计的第一步,分析出准确的信息后才能顺利地完成接下来的步骤。分析图框包含内容的图形界限可能是整个图形界限或者需要套图框的部分图形元素的范围。通过前面两种情况构造选择集,通过遍历所有图形对象的最小包围矩形,并获得选择集中所有对象的最小包围矩形,从而获取图框内的西南角和东北角坐标,即图框的图形界限。Lisp提供了CAD图形元素的最小包围矩形的函数vla-getboundingbox,部分代码如下:
(defun getboundboxXY(obj/x y)
(vla-getboundingbox obj 'x 'y)
(mapcar 'vlax-safearray->list(list x y))
)
3.3 根据比例尺自动选取图幅大小
选取比例尺从而确定图幅是至关重要的,本文的比例尺是要实现根据合适的比例尺所选图框自动分析。除了一般的比例尺,此设计加入了自定义比例尺,增加了很大的调节性。一个合适的图纸大小与方向对于图幅绘制图框的美观性具有很高的要求。除了图纸一般为A1,A2,A3,A4等以外,也考虑了测绘用的50cm*50cm或50cm*40cm矩形图框,同时也加入了自定义图纸大小,根据图幅的要求,选出最适合的图纸所需大小。在这里需考虑角图章和图外框的图纸宽度,由图框包含内容的图形界限的纵向和横向长度和比例尺,从而确定图幅大小。本程序实现了强制图框选择和自动分析图框。实现的主要算法如下:
(cond
((or
(>maxdisxy(/a0x(/1000.0 blc)))
(>mindisxy(/a0y(/1000.0 blc)))
)
(progn
(dcl-Control-SetText tukuanhz/Form1/ComboBox1"自定义")
(setq tuhao_inx 5)
(setq curtuhao "自定义")
(dcl_Control_SetEnabled tukuanhz/Form1/TextBox5 T)
(dcl_Control_SetEnabled tukuanhz/Form1/TextBox6 T)
(dcl-Control-SetText
tukuanhz/Form1/TextBox5
(rtos(+(/maxdisxy(/blc 1000.0)) 20.0) 2 0)
)
;图纸毫米
(setq hxiangz(+(/mindisxy(/blc 1000.0)) 20.0))
(if(>hxiangz 120.0)
hxiangz
(+hxiangz 120.0)
)
(dcl-Control-SetText
tukuanhz/Form1/TextBox6
(rtos hxiangz 2 0)
)
)
)
)
3.4 图纸方向的选择和定位
本文所设计的程序把图幅自动放置于图框正中间,根据上下左右方向的长度自动选出图框是横向还是纵向,也可以选择把所绘制图纸放置于哪个位置。实现的主要算法算法如下:
(if(=curPaper_value "纵向")
(setq x0
(list
(-
(/(+xx1 xx2)2.00)
(*(/(atof(dcl_Control_GetText tukuanhz/Form1/TextBox6)) 2)
blkkuan
)
)
(-
(/(+yy1 yy2) 2.00)
(*(/(atof(dcl_Control_GetText tukuanhz/Form1/TextBox5)) 2)
blkkuan
)
(*25.0 blkkuan)
)
)
)
(setq x0
(list
(-
(/(+xx1 xx2) 2.00)
(*(/(atof(dcl_Control_GetText tukuanhz/Form1/TextBox5)) 2)
blkkuan
)
)
(-
(/(+yy1 yy2) 2.00)
(*(/(atof(dcl_Control_GetText tukuanhz/Form1/TextBox6)) 2)
blkkuan
)
(*25.0 blkkuan)
)
)
)
)
3.5 添加出图说明与打印输出管理
出图说明是出图必不可少的,本文所说的出图说明,会自动放置于合适的位置,与图幅大小的选择完美搭配。打印输出的格式是pdf文件,同时自动生成到指定文件夹。pdf文件是很稳定的一个格式文件,不能随意改动且不会导致原来正确的数据、图框发生损失或改变。这对于成果出图的管理很有帮助。
(if(member "pdfFactory Pro" (fsxm-printers))
(setq print-name "pdfFactory Pro")
(dcl-MessageBox "请安装pdfFactory Pro打印机" "提示")
)
(command "plot" "y";详细配置
"";默认模型空间
print-name;打印机名称
paper-z;纸张大小类型
"m";毫米单位
pp-ll;打印方向p竖向l横向
"";上下颠倒打印
"w";窗口模式
paper-min ;打印范围角点
paper-max ;打印范围角点
"f" ;打印比例布满
"c" ;打印偏移 居中
"";默认是否按样式 打印
"." ;默认打印样式表.表示无
"";默认是否打印线宽
"";默认着色打印设置
"y";默认是否打印到文件
"y";默认是否保存对页面设置的修改
"y";是否继续打印
""
)
4 程序实现与实例分析
程序编写完成后,用VLISP进行编译后生成vlx文件。在打开的一个利用南方CASS的土方网格计算图的CAD中的命令行输入“appload”加载程序:“tukuanhz.vlx”,输入tukuanhz命令,界面如图2所示。
图2 程序界面
填写相应信息后,点击图框绘制。成果如图3所示。
图3 根据图幅自动绘制图框
5 结 语
本文提出的自动分析图幅与图框的自动生成与打印输出管理技术,用Lisp语言编写实现了这些功能的算法。简单有效地提高了图幅图框生成的效率性和美观性,并实现打印生成pdf文件。通过实现检验,此程序大大地提高了工作效率、图框绘制的效率性和科学性。