工程测量点之记自动绘图程序设计

工程测量点之记自动绘图程序设计

上海靖安测绘科技有限公司上海嘉定201901

摘要:为了使一线工程测量技术人员从繁重的人工绘制测量点之记作业过程中减少劳动强度,提高工作效率和技术质量,本文件介绍了在AutoCAD开发环境下根据地形图和控制点数据文件自动裁剪和绘制测量点之记的功能实现方法。

关键词:AutoCAD;AutoLisp;地形图;点之记;工程测量

一、引言

在工程测量中,为了满足施工图测量要求,首先要根据工程规模大小以及设计要求布设相应等级的平面及高程控制点,该控制点一般需要保存至工程施工结束。而工程项目从前期勘测设计阶段到施工阶段有一定的周期,少则几个月,多则几年不等。而控制点的保护和绘制点位略图(简称点之记)显然是必要的,这为以后施工单位进场施工寻找测量控制点大大提供了方便。

长期以来,测量单位绘制点之记的方法是比较费时费力的。传统作业方法一般是从外业开始,测量员实地选埋好控制点后,作业人员开始根据相关地形地物现场绘制点位略图,然后用皮尺量取控制点至相邻地物的距离并记录在工作草图上,回到室内后再用CAD绘图软件一点一线进行手工绘制点之记。而现在也有不少测量单位利用CASS软件直接将控制点展绘在地形图上,套上点之记内图框,然后将每个控制点及其相关地形图裁剪出来,再复制到点之记图框里形成控制点点之记成果图。这样的作业方法做起来既费时又费力,图形裁剪时也很容易漏剪和多剪,使地形底图残缺不全。如果只有几个控制点,还不觉得怎么累,如果有几十个,甚至上百个控制点,那么工作量显然是巨大的。

本文介绍的点之记绘图程序是在AutoCAD环境下用AutoLisp语言开发的。程序文件名为“DZJ.LSP”,它可以最大限度地节省重复裁剪和移动复制的工作量,程序运行时直接根据控制点数据文件和地形底图自动绘制控制点符号并将地形底图裁剪到点之记图框内,无需人工干预便可生成一幅幅工程测量桩位点之记成果图。

二、程序介绍

1、数据准备

(1)首先需要准备好地形图,一般为本工程范围内实测或修测好的最终版地形成果图。为了与控制点有鲜明的对比度,我们可以将地形图所有图形要素设置为同一个图层,命名为“DXT”,并将该图层和对象颜色值设为8(深灰色)。

(2)控制点数据为CSV逗号文件类型,可以用Excel表或记事本打开进行编辑,首行不能有空行或其它非法字符,其数据格式如下(不同数据用逗号分隔):

项目编号,JA18-144

项目名称,远东路(新建东路~南奉公路)道路整治工程

草图绘制者,章健

制图者,李君

检查者,濮先峰

日期,2018-4-4

点名,桩质,X,Y,H,控制点类型代码

G1,六角钉,-34631.826,444.439,4.475,5

G2,十字钉,-34961.064,567.955,4.649,5

G3,六角钉,-35244.742,611.616,4.845,5

BM1,钢钉,-34631.128,464.515,4.476,6

BM2,六角钉,-35264.611,567.125,4.661,6

其中控制点类型代码为:1、天文点2、三角点3、导线点4、图根点5、GPS控制点6、水准点。

(3)准备好空白点之记图框模版,本文所用空白点之记图框模版和由程序自动绘制的点之记成果如下:

空白点之记图框由程序自动绘制的点之记

该点之记图框模版为A4幅面,每页可以裁剪出4个控制点。程序的主要功能:第一是将控制点数据文件里的内容自动填写到项目编号、项目名称、点名、桩别、草图绘制者、制图者及日期的相应位置上,第二是根据控制点的数量计算出总页数后填写正确的页码,第三是根据控制点类型代码将不同的控制点符号展绘到点之记内图框的中心位置上,并根据控制点坐标数据将地形图裁剪至点之记内图框中。完成自动绘制点之记的目的,完全省掉了人工繁锁的裁剪、移动和复制工作。

一般不同的测量单位所使用的点之记图框样式不同,每个单位有自已特色的点之记样式,可以根据本文后面介绍的程序源代码及注释找到点之记图框信息19个定位点坐标进行修改,以满足自已单位的点之记成果样式,注意所有图框信息定位点坐标为相对坐标,均是相对于空白图框模版左下角的。

点之记图框模版定义好后,可以作为符号块保存到AutoCAD安装目录支持搜索路径下,方便以后程序自动调用。

2、程序操作

首先在AutoCAD中打开准备好的地形图,用“APPLOAD”加载“DZJ.LSP”程序,成功加载后在CAD命令行中执行“DZJ”命令。命令行窗口会显示以下内容:

命令1、ZDZJ:展绘控制点;命令2、MDZJ:生成点之记;

命令3、VIDZJ:显示地形图;命令4、REDZJ:重构点之记,更新点之记地形图;命令5、PX:点之记攀线。

第一步执行ZDZJ命令展绘控制点。程序会要求用户打开控制点数据文件(扩展名为.CSV),然后程序会将点之记图框模版中的控制点内图框(矩形框)和控制点符号展绘到地形图上,用户可以浏览控制点附近的地形图,也可以适当地将地形图上的注记信息(如道路、河流、桥位、村庄及单位名称等)移至矩形框内。这样绘制出来的点之记信息将会更完整。也更方便使用者快速寻找和定位到控制点。

第二步执行MDZJ命令生成点之记。执行该命令时会提示用户在屏幕上拾取任一点,此时地形图会消失,程序会在刚才用户拾取点的位置开始按顺序从左向右绘制点之记,绘完一页后连续绘制下一页,直至将全部控制点绘完为止。

第三步执行PX命令。俗称攀线,该命令是标注控制点到相邻地物点的距离,在地物点许可的情况下,一般每个控制点标注3个距离。如控制点附近没有明显地物点,则可不标注距离,但最好说明一下无法攀线。

该程序中还有两个命令VIDZJ和REDZJ,一般情况下用不到。除非在绘好的点之记中发现明显的地形图表示错误。此时可以用VIDZJ将原地形图显示出来进行修正,原地形图修改好后再执行REDZJ重构点之记。此时原地形图会消失,而点之记中裁剪出来的地形会自动更新为修正后的地形图。

3、程序代码及注释

下面提供的是源程序全部AutoLisp代码,仅供学习和研究使用,不作商业用途。

;///DZJ测量点之记绘图程序(说明:此行为注释行)

(defunC:dzj()

(setvar"TILEMODE"1)

(command"layer""on""*""t""*""u""*""")

(command"layer""u""*""")

(command"layer""lo""DXT,KZD,PLOTK,TK,PX""")

(setqtement(ssget"X"))

(iftement(command"erase"tement""));删除所选图层所有实体

(command"layer""m""0""u""*""")

(command"purge""a""*""n")

(command"zoom""e")

(command"zoom""0.7x")

(princ"\n欢迎使用测量点之记绘图程序,请合理运用以下5个命令。!")

(princ"\n命令1、ZDZJ:展绘控制点;命令2、MDZJ:生成点之记;")

(princ"\n命令3、VIDZJ:显示地形图;命令4、REDZJ:重构点之记,更新点之记地形图;命令5、PX:点之记攀线。")

(princ"\n首先请准备好KZD.CSV和地形底图文件!")

(setvar"cmdecho"0)

(setvar"blipmode"0)

(princ)

);enddzj

;///PX点之记攀线(一般每个控制点标注3个距离)

(defunC:px()

(princ"\n点之记攀线:一般要求每个控制点标注3个距离,请选择适当的地物进行标注!")

(if(/=(getvar"DIMSTYLE")"CLDIM")(cldim));设置测量标注样式

(command"layer""m""PX""")

(setvar"OSMODE"111)

(command"dimaligned")

(princ)

);endpx

;///ZDZJ展绘控制点及点之记内图框

(defunC:zdzj();(/f1scalclyosmdhx1y1z1pt0kinsert)

(vl-load-com)

(setqscal(/(getvar"userr1")1000.0))

(setqosm(getvar"osmode"))

(setqcly(getvar"clayer"))

(setvar"osmode"0)

(setqtement(ssget"X"'((8."KZD"))))

(iftement(command"erase"tement""))

(setqtement(ssget"X"'((8."DZJTK"))))

(iftement(command"erase"tement""))

(setup1)

(zkzdtk"tempkzd")

(command"zoom""e")

(setvar"osmode"osm)

(setvar"clayer"cly)

(princ"OK!")

(princ)

);endzdzj

;///MDZJ插入点之记图框,套入地形生成点之记

(defunC:mdzj()

(setqosm(getvar"osmode"));获取当前捕捉模式

(setqcly(getvar"clayer"));获取当前图层

(setvar"osmode"111)

(setqdzjpt(getpoint"\n请拾取点之记位置:"))

(setvar"osmode"0);关闭捕捉模式

(setqx(nth0dzjpt))

(setqy(nth1dzjpt))

(setqtement(ssget"X"'((8."tempkzd"))))

(iftement(command"erase"tement""));删除控制点图层所有实体

(setqtement(ssget"X"'((8."KZD"))))

(iftement(command"erase"tement""));删除控制点图层所有实体

(setqtement(ssget"X"'((8."DZJTK"))))

(iftement(command"erase"tement""));删除点之记图框图层所有实体

(setqtement(ssget"X"'((8."TK"))))

(iftement(command"erase"tement""));删除控制点图层所有实体

(setqtement(ssget"X"'((8."PLOTK"))))

(iftement(command"erase"tement""));删除控制点图层所有实体

(command"purge""a""*""n");清除图形垃圾

(setqinsbasept(list000))

(setvar"insbase"insbasept)

(setqalldxt(ssget"X"'((8."DXT"))))

(command"block""dzjdxt"insbaseptalldxt"")

(readkzd)

(command"zoom"dzjpt(list(+x(*300pagezs))(+y297)))

(command"style""htj_s""romans,htj_s"00.80"n""n")

(command"layer""m""KZD""c""1""""")

(setqcount0)

(setqpagecount0)

(repeatpagezs

(setqpt00(listxy));点之记图框起始定位点

(setqpt01(list(+x66.5)(+y259.2)));项目编号定位点01

(setqpt02(list(+x155.5)(+y259.2)));项目名称定位点02

(setqpt03(list(+x171.5)(+y271)));共几页定位点03

(setqpt04(list(+x191)(+y271)));第几页定位点04

(setqpt05(list(+x53.5)(+y249.75)));点名定位点05

(setqpt06(list(+x97.75)(+y249.75)));桩别定位点06

(setqpt07(list(+x141.25)(+y249.75)));点名定位点07

(setqpt08(list(+x185.75)(+y249.75)));桩别定位点08

(setqpt09(list(+x53.5)(+y137.55)));点名定位点09

(setqpt10(list(+x97.75)(+y137.55)));桩别定位点10

(setqpt11(list(+x141.25)(+y137.55)));点名定位点11

(setqpt12(list(+x185.75)(+y137.55)));桩别定位点12

(setqpt13(list(+x71)(+y23)));草图绘制者定位点13

(setqpt14(list(+x131)(+y23)));制图者定位点14

(setqpt15(list(+x185)(+y23)));日期定位点15

(setqpt16(list(+x66.5)(+y191.65)));控制点定位点16

(setqpt17(list(+x155.5)(+y191.65)));控制点定位点17

(setqpt18(list(+x66.5)(+y79.85)));控制点定位点18

(setqpt19(list(+x155.5)(+y79.85)));控制点定位点19

(command"insert""gcdzj"pt00110)

(command"explode"(entlast))

(command"text""j""mc"pt013.50PROJECTNO)

(command"text""j""mc"pt023.50PROJECTNAME)

(command"text""j""mc"pt033.00(itoapagezs))

(setqpagecount(1+pagecount))

(command"text""j""mc"pt043.00(itoapagecount))

(if(<countcountdzj)

(progn

(readkzdzbcount)

(command"text""j""mc"pt053.50dh)

(command"text""j""mc"pt063.50cz)

(drawkzdpt16z1"KZD")

(insdxtpt16)

(setqcount(1+count))

);endprogn

);endif

(if(<countcountdzj)

(progn

(readkzdzbcount)

(command"text""j""mc"pt073.50dh)

(command"text""j""mc"pt083.50cz)

(drawkzdpt17z1"KZD")

(insdxtpt17)

(setqcount(1+count))

);endprogn

);endif

(if(<countcountdzj)

(progn

(readkzdzbcount)

(command"text""j""mc"pt093.50dh)

(command"text""j""mc"pt103.50cz)

(drawkzdpt18z1"KZD")

(insdxtpt18)

(setqcount(1+count))

);endprogn

);endif

(if(<countcountdzj)

(progn

(readkzdzbcount)

(command"text""j""mc"pt113.50dh)

(command"text""j""mc"pt123.50cz)

(drawkzdpt19z1"KZD")

(insdxtpt19)

(setqcount(1+count))

);endprogn

);endif

(command"text""j""mc"pt133.50HZNAME)

(command"text""j""mc"pt143.50JCNAME)

(command"text""j""mc"pt153.50WORKDATE)

(setqx(+x300))

);endrepeat

;(command"layout""d""")

(command"purge""a""*""n")

(command"zoom""e")

(setvar"osmode"osm)

(setvar"clayer"cly)

(princ"OK!")

(princ)

);endmdzj

;///VIDZJ显示点之记地形图,让用户修改地形及注记

(defunC:vidzj()

(setqosm(getvar"osmode"))

(setqcly(getvar"clayer"))

(setvar"osmode"0)

(command"insert""dzjdxt"(list000)110)

(command"explode"(entlast))

(zkzdtk"tempkzd")

(command"zoom""e")

(setvar"osmode"osm)

(setvar"clayer"cly)

(princ"OK!")

(princ)

);endvidzj

;//REDZJ重构点之记,更新点之记内地形图

(defunC:redzj(/insbaseptpt1pt2ss)

(setqosm(getvar"osmode"))

(setqcly(getvar"clayer"))

(setvar"osmode"0)

(setqinsbasept(list000))

(setvar"insbase"insbasept)

(setqtement(ssget"X"'((8."tempkzd"))))

(iftement(command"erase"tement""));删除控制点图层所有实体

(setqtement(ssget"X"'((8."DZJTK"))))

(iftement(command"erase"tement""));删除点之记图框图层所有实体

(setqalldxt(ssget"X"'((8."DXT"))))

(command"block""dzjdxt""y"insbaseptalldxt"")

(command"layout""d""")

(command"purge""a""*""n")

(command"zoom""e")

(setvar"osmode"osm)

(setvar"clayer"cly)

(princ"OK!")

(princ)

);endredzj

;//insdxt插入地形图到点之记图框内

(defuninsdxt(ptdxt/xyins_xins_ypt0pt1pt2)

(setqx(nth0ptdxt))

(setqy(nth1ptdxt))

(setqins_x(-xx1))

(setqins_y(-yy1))

(setqpt0(listins_xins_y0))

(setqpt1(list(-x38.5)(+y43.85)0))

(setqpt2(list(+x38.5)(-y43.85)0))

(command"insert""dzjdxt"pt0110)

(setqtement(entlast))

(command"xclip"tement"""N""R"pt1pt2)

);endinsdxt

;//zkzdtk展绘控制点及点之记内图框

(defunzkzdtk(kzdlay)

(command"style""htj_s""romans,htj_s"010"n""n")

(if(=f1nil)(exit))

(command"layer""m"kzdlay"c""1""""")

(command"layer""m""DZJTK""c""7""""")

(command"color""bylayer")

(setvar"PDMODE"0)

(if(=kzdlstnil)(readkzd))

(setqcount0)

(repeatcountdzj

(readkzdzbcount)

(setqpt0(listx1y10))

(setqpt1(list(-x138.5)(+y143.85)0))

(setqpt2(list(+x138.5)(-y143.85)0))

(drawkzdpt0z1kzdlay)

(command"layer""s""DZJTK""")

(setvar"osmode"0)

(command"rectangle"pt1pt2)

(setqcount(1+count))

);endrepeat

(setvar"clayer"cly)

);endzkzdtk

;//drawkzd绘控制点符号

(defundrawkzd(kzdptkzdtypekzdlay/x1y1)

(sertkzdtypekzdtype);查找控制点类型(1、天文点2、三角点3、导线点4、图根点5、GPS控制点6、水准点。")

(setqscal(/(getvar"userr1")1000.0))

(setqosm(getvar"osmode"))

(setqcly(getvar"clayer"))

(setvar"osmode"0)

(command"layer""m"kzdlay"")

(command"insert"djkzdptscalscal0)

(setqx1(nth0kzdpt))

(setqy1(nth1kzdpt))

(setqkinsert(list(+x1(*scal1.5))(-y1(*scal1))))

(command"text"kinsert(*2.5scal)0dh)

(setvar"clayer"cly)

(setvar"osmode"osm)

);enddrawkzd

;//sertkzdtype查找控制点类型

(defunsertkzdtype(djh);(1、天文点2、三角点3、导线点4、图根点5、GPS控制点6、水准点。")

(if(=djh1)(setqdj"141"))

(if(=djh2)(setqdj"111"))

(if(=djh3)(setqdj"115"))

(if(=djh4)(setqdj"117"))

(if(=djh5)(setqdj"119"))

(if(=djh6)(setqdj"121"))

);endsertkzdtype

;//readkzd读取控制点数据文件(.CSV)

(defunreadkzd()

(setqf1(fileopen))

(setqkzdtxt(read-linef1))

(setqc1(vl-string-position44kzdtxt))

(setqc2(vl-string-position44kzdtxt(1+c1)))

(setqPROJECTNO(substrkzdtxt(+c12)(-c2c11)));读取项目编号

(setqkzdtxt(read-linef1))

(setqc1(vl-string-position44kzdtxt))

(setqc2(vl-string-position44kzdtxt(1+c1)))

(setqPROJECTNAME(substrkzdtxt(+c12)(-c2c11)));读取项目名称

(setqkzdtxt(read-linef1))

(setqc1(vl-string-position44kzdtxt))

(setqc2(vl-string-position44kzdtxt(1+c1)))

(setqHZNAME(substrkzdtxt(+c12)(-c2c11)));读取绘制者

(setqkzdtxt(read-linef1))

(setqc1(vl-string-position44kzdtxt))

(setqc2(vl-string-position44kzdtxt(1+c1)))

(setqJCNAME(substrkzdtxt(+c12)(-c2c11)));读取检查者

(setqkzdtxt(read-linef1))

(setqc1(vl-string-position44kzdtxt))

(setqc2(vl-string-position44kzdtxt(1+c1)))

(setqFCNAME(substrkzdtxt(+c12)(-c2c11)));读取复查者

(setqkzdtxt(read-linef1))

(setqc1(vl-string-position44kzdtxt))

(setqc2(vl-string-position44kzdtxt(1+c1)))

(setqWORKDATE(substrkzdtxt(+c12)(-c2c11)));读取日期

(setqkzdtxt(read-linef1))

(setqkzdtxt(read-linef1))

(setqkzdlst'())

(setqcountdzj0)

(whilekzdtxt

(setqc1(vl-string-position44kzdtxt))

(setqc2(vl-string-position44kzdtxt(1+c1)))

(setqc3(vl-string-position44kzdtxt(1+c2)))

(setqc4(vl-string-position44kzdtxt(1+c3)))

(setqc5(vl-string-position44kzdtxt(1+c4)))

(setqc6(strlenkzdtxt))

(setqdh(substrkzdtxt1c1))

(setqcz(substrkzdtxt(+c12)(-c2c11)))

(setqy1(atof(substrkzdtxt(+c22)(-c3c21))))

(setqx1(atof(substrkzdtxt(+c32)(-c4c31))))

(setqhi(atof(substrkzdtxt(+c42)(-c5c41))))

(setqz1(atoi(substrkzdtxt(+c52)(-c6c51))))

(setqkzdlst(appendkzdlst(list(listdhczy1x1hiz1))));将控制点坐标及属性添加至控制点表里

(setqcountdzj(1+countdzj))

(setqkzdtxt(read-linef1))

);endwhile

(setqpagezs(fix(/countdzj4)));计算点之记总页数

(if(/=pagezs(/countdzj4.0))(setqpagezs(1+pagezs)));如果控制点数不能被4整除,则取整后点之记总页数加1。

(closef1)

);endreadkzd

;//readkzdzb读取控制点坐标及属性数据

(defunreadkzdzb(countkzd)

(setqkzd(nthcountkzdkzdlst));读取控制点数据表

(setqdh(nth0kzd));读取点号

(setqcz(nth1kzd));读取控制点材质

(setqx1(nth3kzd));读取X坐标

(setqy1(nth2kzd));读取Y坐标

(setqz1(nth5kzd));读取控制点类型

);endreadkzdzb

;//setup设置绘图比例尺及绘图参数

(defunsetup(scal)

(setvar"OSMODE"5)

(setvar"CMDECHO"0)

(setvar"FILEDIA"1)

(setvar"PICKBOX"6)

(setvar"APERTURE"6)

(setvar"GRIPSIZE"6)

(setvar"BLIPMODE"0)

(setqdrawscale(getvar"userr1"))

(princ(strcat"\n原图比例尺为1:"(rtosdrawscale20)))

(setqdrawscale(*scal1000))

(if(/=drawscalenil)(setvar"USERR1"drawscale))

(setvar"LTSCALE"(/(getvar"USERR1")1000.0))

(setqjfhao(substr(getvar"DWGNAME")16))

(setqscal(/(getvar"userr1")1000.0))

(setqdy(*scal400)dx(*scal500))

(setvar"snapunit"(listdxdy))

(command"regen")

(princ(strcat"\n已将图形比例设置为1:"(rtos(*scal1000)20)"。"))

(princ)

);endsetup

;//fileopen打开文件对话框

(defunfileopen(/scalfilf1osm)

(setqcpath(getvar"DWGPREFIX"))

(setqfnam(getfiled"打开控制点数据文件"cpath"csv"2))

(setqfil(findfilefnam))

(iffil(setqfnamfil)

(progn

(princ(strcat"\nCouldnotfindfile"fnam"."))

(exit)

);endprong

);endif

(setqf1(openfnam"r"))

);endfileopen.

三、结束语

目前该程序已在公司的生产实践中得到了广泛应用,实践证明,其使用方便,大大提高了测量员在内业工作中的效率。特别是项目较大,控制点较多的情况下,效果尤为显著。

参考文献:

[1]清源计算机工作室编写组.AutoCAD2000开发工具应用详解.机械工业出版社,2000.

标签:;  ;  ;  

工程测量点之记自动绘图程序设计
下载Doc文档

猜你喜欢