工程测量点之记自动绘图程序设计论文_俞先平

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

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

关键词: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 测量点之记绘图程序(说明:此行为注释行)

(defun C:dzj()

(setvar "TILEMODE" 1)

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

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

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

(setq tement(ssget "X"))

(if tement (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)

);end dzj

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

(defun C:px()

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

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

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

(setvar "OSMODE" 111)

(command"dimaligned")

(princ)

);end px

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

(defun C:zdzj();(/ f1 scal cly osm dh x1 y1 z1 pt0 kinsert )

(vl-load-com)

(setq scal(/(getvar "userr1")1000.0))

(setq osm(getvar "osmode"))

(setq cly(getvar "clayer"))

(setvar "osmode" 0)

(setq tement(ssget "X" '((8."KZD"))))

(if tement (command "erase" tement ""))

(setq tement(ssget "X" '((8."DZJTK"))))

(if tement (command "erase" tement ""))

(setup 1)

(zkzdtk "tempkzd")

(command "zoom" "e")

(setvar "osmode" osm)

(setvar "clayer" cly)

(princ "OK!")

(princ)

);end zdzj

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

(defun C:mdzj()

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

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

(setvar "osmode" 111)

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

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

(setq x (nth 0 dzjpt))

(setq y (nth 1 dzjpt))

(setq tement(ssget "X" '((8."tempkzd"))))

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

(setq tement(ssget "X" '((8."KZD"))))

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

(setq tement(ssget "X" '((8."DZJTK"))))

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

(setq tement(ssget "X" '((8."TK"))))

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

(setq tement(ssget "X" '((8."PLOTK"))))

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

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

(setq insbasept(list 0 0 0))

(setvar "insbase" insbasept)

(setq alldxt(ssget "X" '((8."DXT"))))

(command"block" "dzjdxt" insbasept alldxt "")

(readkzd)

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

(command "style" "htj_s" "romans,htj_s" 0 0.8 0 "n" "n")

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

(setq count 0)

(setq pagecount 0)

(repeat pagezs

(setq pt00(list x y)) ;点之记图框起始定位点

(setq pt01(list(+ x 66.5)(+ y 259.2))) ;项目编号定位点01

(setq pt02(list(+ x 155.5)(+ y 259.2))) ;项目名称定位点02

(setq pt03(list(+ x 171.5)(+ y 271))) ;共几页定位点03

(setq pt04(list(+ x 191)(+ y 271))) ;第几页定位点04

(setq pt05(list(+ x 53.5)(+ y 249.75))) ;点名定位点05

(setq pt06(list(+ x 97.75)(+ y 249.75))) ;桩别定位点06

(setq pt07(list(+ x 141.25)(+ y 249.75)));点名定位点07

(setq pt08(list(+ x 185.75)(+ y 249.75)));桩别定位点08

(setq pt09(list(+ x 53.5)(+ y 137.55))) ;点名定位点09

(setq pt10(list(+ x 97.75)(+ y 137.55))) ;桩别定位点10

(setq pt11(list(+ x 141.25)(+ y 137.55)));点名定位点11

(setq pt12(list(+ x 185.75)(+ y 137.55)));桩别定位点12

(setq pt13(list(+ x 71)(+ y 23))) ;草图绘制者定位点13

(setq pt14(list(+ x 131)(+ y 23))) ;制图者定位点14

(setq pt15(list(+ x 185)(+ y 23))) ;日期定位点15

(setq pt16(list(+ x 66.5)(+ y 191.65))) ;控制点定位点16

(setq pt17(list(+ x 155.5)(+ y 191.65))) ;控制点定位点17

(setq pt18(list(+ x 66.5)(+ y 79.85))) ;控制点定位点18

(setq pt19(list(+ x 155.5)(+ y 79.85))) ;控制点定位点19

(command "insert" "gcdzj" pt00 1 1 0)

(command "explode"(entlast))

(command"text" "j" "mc" pt01 3.5 0 PROJECTNO)

(command"text" "j" "mc" pt02 3.5 0 PROJECTNAME)

(command"text" "j" "mc" pt03 3.0 0(itoa pagezs))

(setq pagecount(1+ pagecount))

(command"text" "j" "mc" pt04 3.0 0(itoa pagecount))

(if(< count countdzj)

(progn

(readkzdzb count)

(command"text" "j" "mc" pt05 3.5 0 dh)

(command"text" "j" "mc" pt06 3.5 0 cz)

(drawkzd pt16 z1 "KZD")

(insdxt pt16)

(setq count(1+ count))

);end progn

);end if

(if(< count countdzj)

(progn

(readkzdzb count)

(command"text" "j" "mc" pt07 3.5 0 dh)

(command"text" "j" "mc" pt08 3.5 0 cz)

(drawkzd pt17 z1 "KZD")

(insdxt pt17)

(setq count(1+ count))

);end progn

);end if

(if(< count countdzj)

(progn

(readkzdzb count)

(command"text" "j" "mc" pt09 3.5 0 dh)

(command"text" "j" "mc" pt10 3.5 0 cz)

(drawkzd pt18 z1 "KZD")

(insdxt pt18)

(setq count(1+ count))

);end progn

);end if

(if(< count countdzj)

(progn

(readkzdzb count)

(command"text" "j" "mc" pt11 3.5 0 dh)

(command"text" "j" "mc" pt12 3.5 0 cz)

(drawkzd pt19 z1 "KZD")

(insdxt pt19)

(setq count(1+ count))

);end progn

);end if

(command"text" "j" "mc" pt13 3.5 0 HZNAME)

(command"text" "j" "mc" pt14 3.5 0 JCNAME)

(command"text" "j" "mc" pt15 3.5 0 WORKDATE)

(setq x(+ x 300))

);end repeat

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

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

(command "zoom" "e")

(setvar "osmode" osm)

(setvar "clayer" cly)

(princ "OK!")

(princ)

);end mdzj

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

(defun C:vidzj()

(setq osm(getvar "osmode"))

(setq cly(getvar "clayer"))

(setvar "osmode" 0)

(command"insert" "dzjdxt"(list 0 0 0)1 1 0)

(command "explode"(entlast))

(zkzdtk "tempkzd")

(command "zoom" "e")

(setvar "osmode" osm)

(setvar "clayer" cly)

(princ "OK!")

(princ)

);end vidzj

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

(defun C:redzj(/ insbasept pt1 pt2 ss)

(setq osm(getvar "osmode"))

(setq cly(getvar "clayer"))

(setvar "osmode" 0)

(setq insbasept(list 0 0 0))

(setvar "insbase" insbasept)

(setq tement(ssget "X" '((8."tempkzd"))))

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

(setq tement(ssget "X" '((8."DZJTK"))))

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

(setq alldxt(ssget "X" '((8."DXT"))))

(command "block" "dzjdxt" "y" insbasept alldxt "")

(command "layout" "d" "")

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

(command "zoom" "e")

(setvar "osmode" osm)

(setvar "clayer" cly)

(princ "OK!")

(princ)

);end redzj

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

(defun insdxt(ptdxt / x y ins_x ins_y pt0 pt1 pt2)

(setq x(nth 0 ptdxt))

(setq y(nth 1 ptdxt))

(setq ins_x(- x x1))

(setq ins_y(- y y1))

(setq pt0(list ins_x ins_y 0))

(setq pt1(list(- x 38.5)(+ y 43.85)0))

(setq pt2(list(+ x 38.5)(- y 43.85)0))

(command"insert" "dzjdxt" pt0 1 1 0)

(setq tement(entlast))

(command"xclip" tement "" "N" "R" pt1 pt2)

);end insdxt

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

(defun zkzdtk(kzdlay)

(command "style" "htj_s" "romans,htj_s" 0 1 0 "n" "n")

(if(= f1 nil)(exit))

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

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

(command"color" "bylayer")

(setvar "PDMODE" 0)

(if(= kzdlst nil)(readkzd))

(setq count 0)

(repeat countdzj

(readkzdzb count)

(setq pt0(list x1 y1 0))

(setq pt1(list(- x1 38.5)(+ y1 43.85)0))

(setq pt2(list(+ x1 38.5)(- y1 43.85)0))

(drawkzd pt0 z1 kzdlay)

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

(setvar "osmode" 0)

(command"rectangle" pt1 pt2)

(setq count(1+ count))

);end repeat

(setvar "clayer" cly)

);end zkzdtk

;// drawkzd 绘控制点符号

(defun drawkzd(kzdpt kzdtype kzdlay / x1 y1)

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

(setq scal(/(getvar "userr1")1000.0))

(setq osm(getvar "osmode"))

(setq cly(getvar "clayer"))

(setvar "osmode" 0)

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

(command"insert" dj kzdpt scal scal 0)

(setq x1(nth 0 kzdpt))

(setq y1(nth 1 kzdpt))

(setq kinsert(list(+ x1(* scal 1.5))(- y1(* scal 1))))

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

(setvar "clayer" cly)

(setvar "osmode" osm)

);end drawkzd

;// sertkzdtype 查找控制点类型

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

(if(= djh 1)(setq dj "141"))

(if(= djh 2)(setq dj "111"))

(if(= djh 3)(setq dj "115"))

(if(= djh 4)(setq dj "117"))

(if(= djh 5)(setq dj "119"))

(if(= djh 6)(setq dj "121"))

);end sertkzdtype

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

(defun readkzd()

(setq f1(fileopen))

(setq kzdtxt(read-line f1))

(setq c1(vl-string-position 44 kzdtxt))

(setq c2(vl-string-position 44 kzdtxt(1+ c1)))

(setq PROJECTNO(substr kzdtxt(+ c1 2)(- c2 c1 1)));读取项目编号

(setq kzdtxt(read-line f1))

(setq c1(vl-string-position 44 kzdtxt))

(setq c2(vl-string-position 44 kzdtxt(1+ c1)))

(setq PROJECTNAME(substr kzdtxt(+ c1 2)(- c2 c1 1)));读取项目名称

(setq kzdtxt(read-line f1))

(setq c1(vl-string-position 44 kzdtxt))

(setq c2(vl-string-position 44 kzdtxt(1+ c1)))

(setq HZNAME(substr kzdtxt(+ c1 2)(- c2 c1 1)));读取绘制者

(setq kzdtxt(read-line f1))

(setq c1(vl-string-position 44 kzdtxt))

(setq c2(vl-string-position 44 kzdtxt(1+ c1)))

(setq JCNAME(substr kzdtxt(+ c1 2)(- c2 c1 1)));读取检查者

(setq kzdtxt(read-line f1))

(setq c1(vl-string-position 44 kzdtxt))

(setq c2(vl-string-position 44 kzdtxt(1+ c1)))

(setq FCNAME(substr kzdtxt(+ c1 2)(- c2 c1 1)));读取复查者

(setq kzdtxt(read-line f1))

(setq c1(vl-string-position 44 kzdtxt))

(setq c2(vl-string-position 44 kzdtxt(1+ c1)))

(setq WORKDATE(substr kzdtxt(+ c1 2)(- c2 c1 1)));读取日期

(setq kzdtxt(read-line f1))

(setq kzdtxt(read-line f1))

(setq kzdlst '())

(setq countdzj 0)

(while kzdtxt

(setq c1(vl-string-position 44 kzdtxt))

(setq c2(vl-string-position 44 kzdtxt(1+ c1)))

(setq c3(vl-string-position 44 kzdtxt(1+ c2)))

(setq c4(vl-string-position 44 kzdtxt(1+ c3)))

(setq c5(vl-string-position 44 kzdtxt(1+ c4)))

(setq c6(strlen kzdtxt))

(setq dh(substr kzdtxt 1 c1))

(setq cz(substr kzdtxt(+ c1 2)(- c2 c1 1)))

(setq y1(atof(substr kzdtxt(+ c2 2)(- c3 c2 1))))

(setq x1(atof(substr kzdtxt(+ c3 2)(- c4 c3 1))))

(setq hi(atof(substr kzdtxt(+ c4 2)(- c5 c4 1))))

(setq z1(atoi(substr kzdtxt(+ c5 2)(- c6 c5 1))))

(setq kzdlst(append kzdlst(list(list dh cz y1 x1 hi z1))));将控制点坐标及属性添加至控制点表里

(setq countdzj(1+ countdzj))

(setq kzdtxt(read-line f1))

);endwhile

(setq pagezs(fix(/ countdzj 4)));计算点之记总页数

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

(close f1)

);end readkzd

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

(defun readkzdzb(countkzd)

(setq kzd(nth countkzd kzdlst));读取控制点数据表

(setq dh(nth 0 kzd)) ;读取点号

(setq cz(nth 1 kzd)) ;读取控制点材质

(setq x1(nth 3 kzd)) ;读取X坐标

(setq y1(nth 2 kzd)) ;读取Y坐标

(setq z1(nth 5 kzd)) ;读取控制点类型

);end readkzdzb

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

(defun setup(scal)

(setvar "OSMODE" 5)

(setvar "CMDECHO" 0)

(setvar "FILEDIA" 1)

(setvar "PICKBOX" 6)

(setvar "APERTURE" 6)

(setvar "GRIPSIZE" 6)

(setvar "BLIPMODE" 0)

(setq drawscale(getvar "userr1"))

(princ(strcat "\n原图比例尺为 1:"(rtos drawscale 2 0)))

(setq drawscale(* scal 1000))

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

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

(setq jfhao(substr(getvar "DWGNAME")1 6))

(setq scal(/(getvar "userr1")1000.0))

(setq dy(* scal 400)dx(* scal 500))

(setvar "snapunit"(list dx dy))

(command "regen")

(princ(strcat "\n已将图形比例设置为 1:"(rtos(* scal 1000)2 0)"。"))

(princ)

);end setup

;// fileopen 打开文件对话框

(defun fileopen(/ scal fil f1 osm)

(setq cpath(getvar "DWGPREFIX"))

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

(setq fil(findfile fnam))

(if fil(setq fnam fil)

(progn

(princ(strcat "\n Could not find file " fnam "."))

(exit)

);end prong

);end if

(setq f1(open fnam "r"))

);end fileopen.

三、结束语

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

参考文献:

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

论文作者:俞先平

论文发表刊物:《基层建设》2019年第11期

论文发表时间:2019/7/19

标签:;  ;  ;  ;  ;  ;  ;  ;  

工程测量点之记自动绘图程序设计论文_俞先平
下载Doc文档

猜你喜欢