如何利用lisp程序一次性提取CAD中点的坐标(不要点击每个点,太多了麻烦)

这个程序要点击每个点才能得到每个点坐标,如何批量处理输出“数值格式”的点坐标。。直接显示x,y坐标值,不需要例如X="",Y=""这样。小弟不懂lisp语音还望大神赐教。... 这个程序要点击每个点才能得到每个点坐标,如何批量处理输出 “数值格式” 的点坐标。。直接显示x,y 坐标值,不需要例如X=" ",Y=" " 这样。小弟不懂lisp语音还望大神赐教。。悬赏20金币,快快来哦。。
(defun c:md()
(setvar "cmdecho" 0)
(COMMAND ".UNDO" "BE")
(command "-units" "2" "3" "2" "3" "" "")
(setq fp (open "d:/桩号坐标值.xls" "a") s (getvar "cmdecho") n (getint "\n请输入总桩数! "))
(princ "桩号" fp)(princ "\t" fp)
(princ "X坐标值" fp)(princ "\t" fp)
(princ "Y坐标值" fp)(princ "\n" fp)
(repeat n
(setq k (getstring "\n输入桩号(如:K1)!")
p (getpoint "\n选取节点!")
x (strcat "X=" (rtos (nth 0 p)))
y (strcat "Y=" (rtos (nth 1 p))))
(princ k fp)(princ "\t" fp)
(princ x fp)(princ "\t" fp)
(princ y fp)(princ "\n" fp))
(close fp)
(setvar "cmdecho" s))
(princ "\n提示:输入 MD 命令来运行本程序!")
(princ)
(DEFUN C:TT (/ SS FN F N EN PT X Y)
(setq ss (ssget "x" '((0 . "point"))))
(if ss
(progn
(setq fn "f:\\坐标.txt")
(setq f (open fn "w"))
(repeat (setq n (sslength ss))
(setq en (ssname ss (setq n (1- n))))
(setq pt (cdr (assoc 10 (entget en)))
x (car pt)
y (cadr pt)
)
(write-line (strcat (rtos x 2 3) "," (rtos y 2 3)) f)
)
(close f)
(startapp "notepad.exe" fn)
)
)
(princ)
)
这个是刚从网上看到的,说是图元集的方法,不过输入命令TT没反应啊。。求各位大神指教,急急急急急急!!
展开
 我来答
朱06CAD
推荐于2017-09-21 · 知道合伙人软件行家
朱06CAD
知道合伙人软件行家
采纳数:4172 获赞数:18070
高中,熟悉AutoCAD。会autolisp及VBA程序。

向TA提问 私信TA
展开全部
(DEFUN C:TT ( / ss ff ss1 en pt x y)
 (setvar "cmdecho" 0)
 (setvar "blipmode" 0)
 (setvar "dimzin" 0)
 (vl-load-com);;加载vlax扩展函数
 (setq ss (ssget '((0 . "point"))) n 0);;请选择点
 (if (/= ss nil)
  (progn
   (setq ff (open "d://文字到TXT.txt" "w") ss1 '());;在D盘建立记事本《文字到TXT》这里可以查看内容
   (repeat (sslength ss);;循环选择
    (setq en (ssname ss n) n (+ n 1);;提取图元
          pt (cdr (assoc 10 (entget en)));;取得点坐标
          ss1 (cons pt ss1);;加入表
    )
   )
   (setq ss1 (vl-sort ss1 (function (lambda (x y)(< (car x) (car y))))));;X排序从左到右
   (setq ss1 (vl-sort ss1 (function (lambda (x y)(> (cadr x) (cadr y))))));;Y排序从上到下
   (foreach en ss1;;函数遍历表,将其中每一个元素依次赋给变量,并对每一个表达式求值
    (setq x (rtos (car en) 2 5))
    (setq y (rtos (cadr en)2 5));;取得Y坐标精确到小数点后5位
    (princ x ff)
    (princ "," ff)
    (princ y ff)
    (princ "\n" ff)
   )
   (close ff)
  )
 )
 (princ)
)

这个TT命令修改了一下,可以对点坐标排序,保存到D盘《文字到TXT》记事本里面;实际上坐标需要X=;Y=这个标记的,这个标记表示大地坐标;大地坐标X=cad里面的y坐标,同样的Y=cad里面的x坐标,所以不能够随便修改文字格式。

更多追问追答
追问

    利用原来那个TT命令流,不用选择对象输入“tt"后自动出来点坐标,不过那些坐标值与实际CAD中坐标值不一样,不太懂。还有就是输出坐标点数与实际不一样,而且输出的很乱。您的命令应该就是图元集吧,从网上看过。。下面的CAD图就是小弟要提取点坐标的dwg图,就是提取网格点坐标,横向从左向右编号,竖向从下往上编号,就是加载您的命令选择对象为0个。不知道怎么回事,还望大神指教。。

追答
  1. 提取的对象必须是(点),交点或块里面的点都不能够提取。

  2. 要得到交点的话,需要别的方法,如这条多段线里面有多少个点提取出来,就可以了。

(setq ss (ssget '((0 . "point"))) n 0);以下修改为:


 (setq ss (ssget '((0 . "point,LWPOLYLINE"))) n 0)

 (if (/= ss nil)

  (progn

   (setq ff (open "d://文字到TXT.txt" "w") ss1 '())

   (repeat (sslength ss)

    (setq en (ssname ss n) n (+ n 1)

          pt (mapcar 'cdr (vl-remove-if '(lambda (X) (/= 10 (car x))) (entget en)))

          i (length pt)

          L 0

    )

    (repeat i

     (setq pt1 (nth L pt)

           L (+ L 1)

          ss1 (cons pt1 ss1);;加入表

     )

    )

   )

   (setq ss1 (reverse ss1) ss (cdr (assoc 0 (entget (ssname ss 0)))));;取得第一个图元

   (if (/= ss "LWPOLYLINE");不是多段线的话排序

    (setq ss1 (vl-sort ss1 (function (lambda (x y)(< (car x) (car y)))))

          ss1 (vl-sort ss1 (function (lambda (x y)(> (cadr x) (cadr y)))))

    )

   )

   (foreach en ss1

    (setq x (rtos (car en) 2 5))

    (setq y (rtos (cadr en)2 5))

    (princ x ff)

    (princ "," ff)

    (princ y ff)

    (princ "\n" ff)

   )

   (close ff)

  )

 )

 (princ)

)

LISP2DCL
2014-03-10 · TA获得超过241个赞
知道答主
回答量:330
采纳率:0%
帮助的人:120万
展开全部
提供个思路:框选,获取点表,遍历输出
追问

这个是自己划分网格的DWG图,就是想竖直方向从左向右编号0,1,2这样提取出每个点坐标,这样编号便于到excel中处理数据时方便。。可以详细说下不,你说的框选到见过,加载过一个程序是选择对象就是框选好像,不过这个好像提取出来的点没有编号,而且顺序比较混乱。。能给写个程序没,谢谢。。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
greatlmy4
2014-03-17 · TA获得超过1330个赞
知道小有建树答主
回答量:1446
采纳率:76%
帮助的人:314万
展开全部
试过了,tt好用的。用tt即可,其余的可以到excel去处理。当然如果对lisp比较熟悉,也可以用lisp全部处理掉。
更多追问追答
追问
输出的坐标与CAD中实际坐标值不一样啊,而且比如说下图中自己划分网格数的坐标点数有200多个,txt中生成的有500多个怎么回事啊。。
追答
autocad的坐标分为系统坐标和用户坐标,两者可以不一样。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式