批量导点绘图程序
本帖最后由 GTJ116600 于 2013-7-15 14:51 编辑程序功能:能将指定目录下的txt文本内的坐标文件,整理后批量导入绘制图形。
程序可根据各行业要求进一步整理成依据附有属性的坐标文件,自动绘制特定实体。
如:测量行业中的自动绘制陡坎,墙、井、道路等。
希望各位大神多提宝贵意见,以便进一步改进
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;批量导点绘图程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;|需要完善的内容
1.删除临时文件
2.提出宗地号,用地面积和项目名称
3.在图上标注宗地号、用地面积和项目名称
4.需要建立图层、设立字体和字体大小、字体颜色 |;
by gtj116600@163.com QQ 1085566757
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;批量整理TXT文本程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun zyj-silenceexit( / *error*)
(t (setq *error* strcat))
)
(defun c:pldraw( / ffn ph fn i n n1 fn1 fn2 fn3 str int len lst)
(setq Vcmdecho (getvar "cmdecho") Vosmode (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar"osmode" 0)
(setq ffn (getfiled " 打开文件 """ "txt" 2))
(or ffn (zyj-silenceexit))
(setq ph (vl-filename-directory ffn)) ;获取文件目录名
(setq fn (vl-directory-files ph "*.txt" 1)) ;返还指定目录下不含目录名的所有文件名称
(setq i -1 n (length fn))
(repeat n
(setq n1 (nth (setq i (1+ i)) fn) fn1 (strcat (vl-string-subst "/" "\\" ph) "/" n1))
(setq fn2 (open fn1 "r")
fn3 (open (setq fn4 (strcat "d:/" (itoa (1+ i)) ".txt")) "w")
lst (cons fn4 lst)
)
(while (setq str (read-line fn2)) ;整理TXT文件
(if (wcmatch str "J*,J*")
(progn
(setq int (vl-string-search ",1," str)
len (strlen str)
str (substr str (+ int 4))
)
(princ str fn3)
(princ "\n" fn3)
)
)
)
(close fn2)
(close fn3)
)
(setq i -1 n (length lst))
(repeat n
(setq fn4 (nth (setq i (1+ i)) lst))
(setq fn5 (open fn4 "r"))
; (setq pt (read-line fn5))
(command "pline")
(while (setq pt (read-line fn5))
(setq pos (vl-string-search "," pt)
strlef (substr pt 1 pos)
strrig (substr pt (setq pos (+ pos 2)))
pt(vl-string-subst strrig strlef pt)
pos (vl-string-search "," pt)
pt (vl-string-subst strlef strrig pt (setq pos (1+ pos)))
)
(command pt)
)
(command "c")
(close fn5)
(vl-file-delete fn4)
)
(command "zoom" "e")
(setvar "cmdecho" Vcmdecho)
(setvar"osmode" Vosmode)
(princ)
)
(princ "\n批量导点绘图程序(先整理TXT文件后绘图)已加载成功,请在命令行输入pldraw命令唤醒她!!!
\n编程者 张亚军 电子邮箱gtj116600@163.com")
根据eachy前辈的指点,调整了一下绘图方式,由边读点边绘图,调整为读取点后再绘图。
另一个问题,向前辈请教一下, lisp的表最大长度是多少?采用读取点后再绘图的方式读
点数量超过lisp表长时有没有什么好的处理办法
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;批量导点绘图程序版本号v1.01;;;;;;;;;;;;;;;;;;;;;;;;;
;|需要完善的内容
1.提出宗地号,用地面积和项目名称
2.在图上标注宗地号、用地面积和项目名称
3.需要建立图层、设立字体和字体大小、字体颜色
作者张亚军邮箱gtj116600@163.com QQ 1085566757编制日期 2013年7月15日|;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;批量整理TXT文本程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun zyj-silenceexit( / *error*)
(t (setq *error* strcat))
)
(defun c:pldraw( / Vcmdecho Vosmode ffn ph fn i n n1 fn1 fn2 fn3 lst
str int len pt fn4 fn5 strlef strrig pos j datalist)
(setq Vcmdecho (getvar "cmdecho") Vosmode (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq ffn (getfiled " 打开文件 """ "txt" 2))
(or ffn (zyj-silenceexit))
(setq ph (vl-filename-directory ffn)) ;获取文件目录名
(setq fn (vl-directory-files ph "*.txt" 1)) ;返还指定目录下不含目录名的所有文件名称
(setq i -1 n (length fn) lst '())
(repeat n
(setq n1 (nth (setq i (1+ i)) fn) fn1 (strcat (vl-string-subst "/" "\\" ph) "/" n1))
(setq fn2 (open fn1 "r")
fn3 (open (setq fn4 (strcat "d:/" (itoa (1+ i)) ".txt")) "w")
lst (cons fn4 lst)
)
(while (setq str (read-line fn2)) ;整理TXT文件
(if (wcmatch str "J*,J*")
(progn
(setq int (vl-string-search ",1," str)
len (strlen str)
str (substr str (+ int 4))
)
(princ str fn3)
(princ "\n" fn3)
)
)
)
(close fn2)
(close fn3)
)
(defun txtinlist(ffname / datalist pt) ;;;将TXT文本文件导出整理成表
(setq pt (read-line ffname) datalist '())
(or pt (zyj-silenceexit))
(while pt
(setq datalist (cons pt datalist))
(setq pt (read-line ffname))
)
(setq datalist (reverse datalist))
)
(setq i -1)
(repeat n
(setq fn4 (nth (setq i (1+ i)) lst))
(setq fn5 (open fn4 "r"))
(setq datalist(txtinlist fn5) j -1)
; (setq pt (read-line fn5) j -1)
(command "pline")
(while (setq pt (nth (setq j (1+ j)) datalist))
(setq pos (vl-string-search "," pt)
strlef (substr pt 1 pos)
strrig (substr pt (setq pos (+ pos 2)))
pt(vl-string-subst strrig strlef pt)
pos (vl-string-search "," pt)
pt (vl-string-subst strlef strrig pt (setq pos (1+ pos)))
)
(command pt)
)
(command "c")
(close fn5)
(vl-file-delete fn4)
)
(command "zoom" "e")
(setvar "cmdecho" Vcmdecho)
(setvar"osmode" Vosmode)
(princ)
)
(princ "\n批量导点绘图程序已加载成功,请在命令行输入pldraw命令唤醒她!!!")
下来试试看! 本帖最后由 GTJ116600 于 2013-7-15 12:23 编辑
水沙漠 发表于 2013-7-15 10:53
下来试试看!
呵呵,谢谢支持。本程序需要配合附件(txt文件夹)使用,使用时点选文件夹内的任意一个TXT文本即可。
注:TXT文本内容不同,程序需要微小调整
一般一次把文件读完构造表,关闭,然后再用表绘图,获取目录可以使用acet提供的一个函数,不用选文件 eachy 发表于 2013-7-15 13:13
一般一次把文件读完构造表,关闭,然后再用表绘图,获取目录可以使用acet提供的一个函数,不用选文件
呵呵,谢谢eachy前辈指点,我调一下程序,重新传上来
{:soso_e141:}是不是麻烦了点,GU版的那个框选输出图形的LISP 不错 学习了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~· 获取指定目录下文件
http://www.xdcad.net/forum/forum.php?mod=viewthread&tid=259070
本帖最后由 GTJ116600 于 2013-7-15 14:41 编辑
炫翔 发表于 2013-7-15 13:35
是不是麻烦了点,GU版的那个框选输出图形的LISP 不错
翔版主,刚学编程不久。还未掌握编程要领,目前还停留在研究函数阶段。
我这个程序可将多个TXT文件内的数据整理后批量绘图,不局限一个文件。
另G版的框选输出图形LISP能给个链接么。向G版学习学习
以下是我批量处理的txt文本的一个数据,编程时需要先处理然后才能绘图。
[属性描述]
坐标系=80西安坐标系
几度分带=3
投影类型=高斯克吕格
计量单位=米
带号=41
精度=0.0100
转换参数=,,,,,,
[地块坐标]
4,1.6003,05111004,华弘精密,面,J51G022031,******,,@
J1,1,4329855.8500,41406083.8200
J2,1,4329904.3300,41405965.4000
J3,1,4329787.1600,41405916.4800
J4,1,4329740.3600,41406031.9000
上述坐标是笛卡尔坐标系下的坐标,绘图时需转成高斯坐标系下的坐标
其中的05111004是宗地号,华弘精密是项目名称,J51G022031是该图在
8080西安坐标系下的图幅号。上述信息目前还未处理。
st788796 发表于 2013-7-15 14:10
获取指定目录下文件
http://www.xdcad.net/forum/forum.php?mod=viewthread&tid=259070
谢谢支持。看了下。那个程序如下
批量处理打开指定目录下的所有dwg文件
(defun c:test ()
;(vl-load-com)
(setq dir (getstring "Input Directory: "))
(setq ff (vl-directory-files dir "*.dwg" 1))
(foreach i ff
(vla-open
(vla-get-documents
(vlax-get-acad-object))(strcat dir i))
)
)
上述程序读取文件的方式跟我的一样。但我的可以通过对话框随意指定目录。
上述目前需要输入目录,且只能是根目录
谢谢~~~~~~~~~~~~~~~~~~~~~~~~~~~·
- 本文出自晓东CAD家园-论坛,原文地址:http://bbs.xdcad.net/thread-670093-1-1.html 看起来不错适合规划? 支持了 强烈支持 感谢分享,支持了 很有用 谢谢楼主分享
页:
[1]
2