一种基于AutoLISP的地形图斜坡类要素处理程序的设计与实现

2023-06-21 04:46郑伟安孟大鹏王秀元崔秀明凌晓春
山东国土资源 2023年4期
关键词:图元线宽坡顶

郑伟安 孟大鹏 王秀元 崔秀明 凌晓春

摘要: 在大比例尺地形图编辑中存在大量的依比例斜坡类符号要素,包括依比例斜坡、干堤、加固岸、路堤、路堑等,该类符号是一种复合性符号,由坡顶线和坡面两部分组成,坡顶线由坡顶母线和长短齿符号组成,其中长齿长度和坡面宽度一致且垂直于坡顶母线,该符号表示复杂,编辑工作较为费时费力。利用AutoLISP语言开发斜坡类符号要素处理程序,实现符号长齿自动延伸,可大大提高该类符号编辑工作效率,提升制图表达效果。

关键词: 斜坡类要素;AutoLISP语言;地形图

中图分类号:  P208      文献标识码:  A    doi:10.12128/j.issn.1672  6979.2023.04.009

引文格式: 郑伟安,孟大鹏,王秀元,等.一种基于AutoLISP的地形图斜坡类要素处理程序的设计与实现[J].山东国土资源,2023,39(4):58 63. ZHENG Wei'an, MENG Dapeng, WANG Xiuyuan, et al. Design and Implementation of a Topographic Slope  like Element Processing Program Based on AutoLISP[J].Shandong Land and Resources,2023,39(4):58  63.

0 引言

LISP语言是一种广泛应用的程序设计语言,该语言处理的对象为符号表达式,因此也称为符号式语言,LISP语言具有语法简单,编写程序便捷、灵活,数据类型丰富等特点[1]。AutoLISP是由Autodesk公司开发的一种专门为AutoCAD二次开发设计的LISP编程语言,它即有LISP语言人工智能的特性,又有AutoCAD强大的图形编辑功能等特点,可以把AutoLISP程序和AutoCAD绘图功能结合起来[2],实现部分制图功能的自动化,可大大提升地形图编辑工作效率,提升制图效果。

Geoway3.6软件是一款优秀的地形图编辑软件,具有强大的地形图编辑和优秀的符号设计功能[3]。在Geoway3.6软件下可对符号进行自主设计,形成符合要求的符号系统。在Geoway3.6软件中斜坡类符号的实现有一定优势,但难以实现斜坡长齿长度与斜坡宽度一致,需要将数据导出dxf格式,在AutoCAD软件中进一步进行处理。本文主要讨论了使用AutoLISP语言,在AutoCAD软件下开发一套地形图斜坡类要素处理程序,实现斜坡类要素长齿符号的自动延伸功能。

1 斜坡类符号结构及实现思路

1.1 符号结构

在大比例尺地形图编辑工作中,依比例斜坡类要素是一种常见的符号要素,主要包括依比例尺干堤、加固岸、斜坡、斜坡式路堑等。以1  ∶  2000比例尺未加固斜坡为例,未加固斜坡指各种天然形成或人工修筑但未加固的坡度在70°以下的坡面地段。未加固斜坡在图上投影宽度小于2mm时,以陡坎符号表示,斜坡在图上投影宽度大于2mm时,根据实际坡面宽度表示[4]。依比例未加固斜坡符号是一种复合符号,由坡顶线和坡面两部分组成,坡顶线由坡顶母线和长短齿符号组成,其中坡顶线是一条有向线,长短齿符号在前进方向右侧,长齿长度和坡面宽度一致且垂直于坡顶母线。

未加固斜坡的几何表示和制图表达如图1[5]。

1.2 符号实现思路

依比例斜坡类符号的表示十分复杂,编辑实现费时费力,不同的专业软件也给出不同的解决方案,但优缺点各异。在EPS软件中,该类要素是一种程序符号,首先采集坡顶边线,起笔点为坡顶线起点,然后逆时针采集整个斜坡符号,形成闭合面,然后在坡顶线终点处打“J”,程序自动生成坡顶线和坡面符号[6],该实现方法符号的长短齿方向不规范难以满足制图要求,需要后期进行人工调整,较为费时费力。

在Geoway3.6中依比例斜坡类符号的表示较为简单,即只表示坡顶线和斜坡面即可,且斜坡长短齿符号的方向符合图式要求,省去后期人工调整工作,但该软件表示的斜坡长齿长度是固定的,不能满足图式要求,需要将数据导出dxf格式,在AutoCAD软件使用AutoLISP语言开发程序实现斜坡长齿的自动延伸处理。未处理的加固斜坡在AutoCAD下的表现形式见图2。

实现的具体思路:首先在Geoway3.6下利用其符号库编辑功能对斜坡类符号进行改造,将符号长齿全局宽度设置为与其他线符号宽度不同的全局线宽[7]。以1  ∶  2000比例尺地形图为例,符号基本线宽为图上0.15mm,在AutoCAD下全局線宽为图上基本线宽乘以比例尺分母,再换算成单位“m”,即全局宽度为0.3m,本例设置成0.24m即可。然后使用AutoLISP程序,创建某一斜坡类符号范围线选择集,选取全部该斜坡类符号范围线,再逐一遍历每一范围线,根据范围线创建选择集,选取全局线宽为0.24m的斜坡长齿,再执行LISP语言的扩展命令“extend”,将斜坡长齿延伸至坡面底部。

2 AutoCAD图形信息

AutoCAD的图形有dwg、dxf等格式,是由多个图形对象组成的,最基本的图形对象称作图元[8]。图元间以链表的形式存储,图元的命名是唯一的,用十六进制表示[2]。

AutoCAD图形的信息分类标准为dxf组码[8],例如“8”代表图层,图层名则为组码“8”对应的字符串,如TERA(地貌与土质(面))、TFCL(地貌附属(线));“0”代表线型,线型名则为组码“0”对应的字符串,如LWPOLYLINE(轻量多段线)。

AutoCAD的图形信息的查询可使用(entget(car(entsel(提示信息))))语句。(entsel[提示信息])提示用户以单点方式选择单个对象,提示信息用于提示用户的字符串,若省略提示信息,则提示信息为“选择对象”。该函数返回值为表,由2个元素组成,第一个元素为选择对象的图元名,第二个元素为选择对象时拾取点在当前UCS下的坐标[9],car(entsel(提示信息))语句返回第一个元素即图元名。

entget用于取出(car(entsel(提示信息)))的列表信息,返回的是选中图元的图元表信息;图元表的每个元素还是表,子表的第一个元素为有一定含义的整数,与图元在图形交换文件(DXF)中的图元代码含义相同,多数子表采用了点对结构。图元表记录图元的名称、类型、几何数据、图层、颜色、全局线宽等信息[10],通过查询获得相关要素的图元信息,这些信息可作为选择集构建的过滤信息使用。

3 选择集的构建方法

选择集是有名字的一些图元名称的集合,对图形对象进行编辑和修改时,首先需要构建选择集[11]。

选择集构建方法:(ssget[选择方法][点1][点2][點表][过滤表]),

选择方法有以下几种:

C(Crossing):选中与点1、点2所确定的窗口相交的对象。

CP(Cpolygon):选中与点表所确定的多边形相交的对象。

W(Window):选中整体在点1、点2确定的窗口之内的对象。

WP(Wpolygon):选中整体在点表所确定的多边形之内的对象。

X:选中整个数据库,包括关闭、冻结图层上的对象和屏幕之外的对象[12]。

点1、点2、点表、过滤表和选择方法配合使用。而过滤表的作用是通过过滤表描述的条件对所选的图元对象进行过滤筛选,最后只保留满足过滤条件的图元对象。过滤表描绘的是entget函数返回的图元表点对信息。

如' (0. "LWPOLYLINE")、(8. "TERA")、(40. 0)或(list(cons 0 "LWPOLYLINE")(cons 8 "TERA")(cons 40 0)),分别代表线型为轻多义线、图层名为TERA、全局线宽为0m的过滤信息。

(cons元素1、元素2)是一项基础函数,当第2个元素是一个表时,该函数将第1个元素插入到第2个元素表示的表内并作为该表的第1个元素,该函数返回的是添加了第1个元素后的表,但当两个元素都是原子时,则该函数返回的并不是一个表,而是一个点对[12]。例如:(cons 8 "TERA")返回的是(8." TERA")。通过(list[表达式…])可将任意数目的表达式合成为一个表并作为返回值返回,如(list(cons 0 "LWPOLYLINE")(cons 8 "TERA")(cons 40 0)(cons 70 1))返回的就是由线型、图层名、线宽、是否闭合4种条件构成的过滤表。

4 斜坡类符号选择集的构建

4.1 符号范围线选择集构建

以依比例尺斜坡为例,斜坡范围线图层名为“TERA”,全局线宽为0,是一条闭合的轻量多段线。

该类符号选择集构建程序为:(setq saa (ssget "X" (list(cons 0 "LWPOLYLINE")(cons 8 "TERA")(cons 40 0)(cons 70 1)))) ,该选择集的成员是当前成果中的所有图层名为TERA的全局线宽为0的且未封闭的轻多义线,如成功构建则将选择结果赋给变量saa。

上述构建了一个地貌面符号范围线的选择集,将TERA层(地貌面)中的所有线宽为0且闭合的范围线进行了选择集构建,TERA层涉及的地类包括依比例未加固斜坡、加固斜坡,梯田等斜坡类符号[13]。

4.2 斜坡长齿符号选择集构建

在对斜坡长符号进行选择集构建前,需要首先获取斜坡类符号范围线矢量上的坐标点对信息,即范围线矢量上的点坐标。在图元表的点对信息中10代表的是坐标信息,如(10   45.0 150.0),10后面的  45.0 150即是该点在图上的坐标信息。获取图元的图元表点对信息后,通过car获取图元表的第一个元素,如果该元素是10,则判定该图元表点对信息为表示坐标的点对信息。判定正确后,通过cdr函数获取去掉了第一个元素的表,该表即坐标信息表,然后使用前面介绍的cons函数,将所选范围矢量上的所有点的坐标逐个添加给PT  LST图元表[14]。实现语句如下:

(if (/= saa nil)

(progn

(setq tem 0)

(setq len (sslength saa))

(while (< tem len)

(setq entname (ssname saa tem))

(progn

(setq ENT (entget entname)

N 0

PT  LST '()

(while (/= (setq EI (nth N ENT)) NIL)

(if(= (car EI) 10)

(setq PT  LST (cons (cdr EI)  PT  LST))

setq N (+ N 1 ))

上述语句中car、cdr都是基础函数。car和cdr用于分割表list,car是一个无害的函数, 它只返回第一个元素,并不从表list移除第一个元素, car执行完后表list并没有发生改变。cdr函数返回表list中首元素后面的其他元素[15]。语句中(sslength saa)返回选择集saa内的图形对象数目;(ssname saa 序号)返回选择集saa中由序号指定的那个图形对象的图元名,选择集中第一个元素的序号为0,如果成功则返回图元名,如<图元名: 7ee68b98>,否则返回nil;(nth N ENT)返回表的第N个元素,元素的序号从0开始,如果N超出表的最后一个元素的序号,则返回nil[16]。setq EI (nth N ENT)语句功能则是将所选范围矢量的第N个元素的信息赋值给EI,通过循环调用该语句,可把范围矢量所有或指定信息赋值给EI。

将范围线上信息赋值给EI后通过if(= (car EI) 10)语名判定该信息是否是坐标信息,如果是,则使用(setq PT  LST (cons (cdr EI) PT  LST))语句将斜坡范围线上的点坐标信息逐一添加给PT  LST表,当将斜坡范围线上的所有点的坐标对信息添加给PT  LST表后,PT  LST内则存储了斜坡范围线上所有点的平面坐标。此时,可以PT  LST表中的平面坐标点对信息构建选择集。斜坡坡顶母线、长短齿符号所在层为TFCL层,由于我们使用长齿的全局线宽作为选择集构建的过滤信息,因此该选择集的构建与图层名无关。选择集构建语句如下:

(setq scc (ssget "WP" PT  LST '((0 . "LWPOLYLINE")(40 . 0.24))))

该语句功能为构建完全在斜坡符号范围线(PT  LST,范围线坐标点对信息)内的全局线宽为0.24m的长齿多段线选择集,由于只将斜坡长齿的全局线宽修改为0.24m,选择集构建时,无论斜坡范围线内有何种符号,也只会选择斜坡长齿这一类符号。其中WP选项为选中整体在坐标点对信息表所确定的范围矢量内的对象。

5 斜坡类符号自动延伸功能实现

构建完成斜坡长齿的选择集后,需将所有长齿的图元名称和长齿的终点坐标逐一添加到PT  LST1图元表中。添加完成后需使用REVERSE语句对PT  LST1图元表中信息进行反转处理,形成符合延伸命令要求的图元表信息[17]。实现语句如下:

(if (/= scc nil)

(progn

(setq tem1 0)

(setq len1 (sslength scc))

(while (< tem1 len1)

(setq entname1 (ssname scc tem1))

(progn

(setq ENT1 (entget entname1)

N1  0

T1  1

PT  LST1 '()

(while (/= (setq EI1 (nth N1 ENT1)) NIL)

(if (= (car EI1)   1)

(setq PT  LST1 (cons (cdr EI1) PT  LST1))

;添加图元名称到PT  LST1

(if (= (car EI1) 10)

(progn

(if (/= T1 1);用于判定長齿终点坐标

(setq PT  LST1 (cons (cdr EI1) PT  LST1));添加长齿终点坐标到PT  LST1

(setq T1 (+ T1 1))

(setq N1 (+ N1 1))

(setq PT  LST1 (reverse PT  LST1));反转处理

实现斜坡长齿的自动延伸功能,需循环调用LISP程序中的extend功能实现,实现语句如下:

(command "extend" entname ""PT  LST1 "")

其中entname 中包含斜坡类符号范围线的图元名信息,PT  LST1包含为该斜坡范围面内的长齿符号中的图元名和长齿终点坐标信息表,""为该使命令的默认选项。在实际工作中,部分斜坡长齿符号起止点方向错误,会造成符号无法正常延伸,因此需要在Geoway符号设计器中对长齿符号进行返转处理,使起点在上、止点在下即可。

在循环调用以上命令完成所有斜坡类符号长齿自动延伸后,由于长齿符号全局线宽为0.24m,不符合图式要求,还需对所有斜坡长齿进行编辑,按图式要求修改长齿的全局线宽为0.3m。主要程序代码如下:

(command "pedit" entname1 "w" 0.3 "")

其中entname1为线宽为0.24m的斜坡长齿图元名的变量,w代表宽度,0.3m斜坡长齿的新宽度,通过循环调用该语句可实现所有线宽为0.24m的斜坡类符号长齿的全局线宽的修改。最后由于斜坡类符号范围线符号仅作为一种过渡性矢量,长齿符号延伸完成后,应调用"erase" 命令作删除处理。经延伸处理后的加固斜坡如图3所示。

6 结语

斜坡类符号是大比例尺地形图编辑中最常见的一种符号之一,斜坡自动延伸程序的开发,大大提高了该类符号的作业生产效率,作业过程中只需表达出斜坡的坡顶母线和斜坡范围面即可,无需过多操作,同时由于坡顶线表达出的长短坡齿符号方向正确,自动延伸完成后,即可符合图式要求,省去了大量人工调整坡齿方向时间。经过实验验证,该程序在地形图编辑中可节约10min/km2,且大大提高了制图效果,在实际生产作业中具有很强的推广使用价值。

参考文献:

[1]  李学志,方戈亮,孙力红.Visual LISP程序设计(第2版)[M].北京:清华大学出版社,2010:104  106.

[2]  高何利,何秀国,刘金婷.AutoLISP程序在地形图图廓整饰中的应用[J].人民长江,2007(10):26  27.

[3]  王玉.基于GEOWAY软件的基础地理信息数据更新方法:以山西省1  ∶  10000 DLG数据更新为例[J].测绘与空间地理信息,2022,45(1):141  144.

[4]  GB/T 20257.1 2017.国家基本比例尺地图图式 第1部分:1  ∶  500 1  ∶  1 000 1  ∶  2 000地形图图式[S].

[5]  GB/T 20258.1 2019.基础地理信息要素数据字典 第1部分:1  ∶  500 1  ∶  1 000 1  ∶  2 000比例尺[S].

[6]  梁燕芬,梁子震.基于EPS的测绘技能竞赛制图解决方案定制[J].测绘通报,2015(S1):235  237.

[7]  赵宇娟.基于Geoway的图库一体化的技术实现[J].甘肃科技,2008(19):40  43.

[8]  孙淑贤,李光明,张贵丽.Auto CAD制作勘查线剖面图中的数据共享及图形格式交换[J].山东国土资源,2007,23(9):18  20.

[9]  张志遥.基于AutoLISP的岩土工程勘察方案辅助设计系统研究[J].电子技术与软件工程,2022(1):126  129.

[10]  吴泊汛.自动化驼峰设计检算系统研究[D].成都:西南交通大学,2012:1  20.

[11]  郭秀娟,范晓鸥.基于AutoLISP的AutoCAD二次开发研究[J].吉林建筑工程学院学报,2008,25(4):82  84.

[12]  陈伯雄,冯伟.Visual LISP for AutoCAD 2000程序设计[M].北京:机械工业出版社,2000:110  117.

[13]  曲莉莉.山东省1  ∶  1万基础地理信息数据库地形要素更新方法探讨[J].山东国土资源,2018,34(7):82  85.

[14]  邓伟龙.基于VLisp开发车站信号计算机联锁辅助设计程序[J].铁道标准设计,2014,58(3):127  130.

[15]  商振伟.基于Auto LISP的ADS100航线结合表的制作程序的设计[J].地矿测绘,2018,34(3):41  43.

[16]  蒲生亮.基于Visual LISP的水利工程测量软件工具包的开发与应用[D].呼和浩特:内蒙古大学,2013:48  52.

[17]  赵兴柱,陈贵海,姜坤序.關于AtuoLISP在CAD绘制采矿设计图中的应用[J].有色矿冶,2011,27(4):16  18.

Design and Implementation of a Topographic Slope  like    Element Processing Program Based on AutoLISP

ZHENG Wei'an1, MENG Dapeng2, WANG Xiuyuan3, CUI Xiuming4, LING Xiaochun1

(1.Shandong Institute of Land Surveying and Mapping, Shandong Ji'nan 250013, China; 2. No.1 Exploration Institute of Geology and Mineral Resources, Shandong Ji'nan 250013, China; 3.Shandong Institute of Geological Sciences, Shandong Ji'nan  250013, China; 4. Shandong Geology and Mining Mapping Limited Corporation,  Shandong Ji'nan 250013, China)

Abstract:  In the large scale topographic map editing has a lot of scale slope symbol elements, including the proportion of slope, embankment, reinforced shore, embankment and cutting. The symbol is a kind of composite symbol, two parts of slope line and slope. Slope line is composed of slope top bus and length symbol, long tooth length and slope width and perpendicular to slope bus. The symbol is complex, editing work is time  consuming and laborious. By using AutoLISP language, the slope class symbol element processing program can be developed, and the automatic extension of symbol long teeth can be realized. It can greatly improve the efficiency of such symbol editing and improve the effect of drawing expression.

Key words:  Slope class elements; Auto LISP language; topographic map

猜你喜欢
图元线宽坡顶
减成法工艺下非电镀线路的精准加工方法
印制板制造中量化蚀刻研究
生产过程中的PCB线宽分析研究
一种组态控件技术在电力监控系统中的运用
学术出版物插图的编排要求(一):图注
联锁表自动生成软件的设计与实现
矿车路线迷宫
矿车路线迷宫
Excel图形转入CorelDRAW技巧
基于Qt绘图系统的图形应用优化研究与实现