明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7179|回复: 12

[已解答] 【多段线坐标问题】

[复制链接]
发表于 2014-5-6 14:21:02 | 显示全部楼层 |阅读模式
本人初涉LSP,时间紧任务重,各位老师们请抬手相助,感谢不尽。我想求多段线的三维坐标X,Y,Z并输出到TXT中。
能不能大神们给个完整的程序,包括CAD启动指令,全选所有多段线。一定要有Z坐标哦,我找的好多资料都输出不了Z坐标!
下面是我找到的2个资料,第一个不会写下去,第二个只能输出X,Y坐标,没有Z坐标。
---------------------------------------------------------------------
,;;46.2 [功能] pline,lwpline点坐标表  By 无痕;;示例(vxs (car (entsel))),返回三维点坐标
(defun vxs (e / i v lst)
  (setq i -1)
  (while
    (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
     (setq lst (cons v lst))
  )
  (reverse lst)
)
------------------------------------------------------------------------
(defun c:tqzb (/)
    (setq cm (getvar "cmdecho"))
    (setvar "cmdecho" 0)
    (if (setq wjm (getfiled "请指定要保存的坐标文件" "e:\\" "txt" 1))
        (if (setq ssa (ssget '((0 . "LWPOLYLINE"))))
            (progn
                (setq fff (open wjm "w")
                      n   (sslength ssa)
                      i   0
                      no  0
                  )
                  (repeat n
                       (setq dxf (entget (ssname ssa i))
                             i   (1+ i)
                             ptb (mapcar 'cdr (vl-remove-if-not '(lambda(x)(= (car x) 10)) dxf))
                             ptb (mapcar '(lambda(x)(trans x 0 1)) ptb)
                        )
                        (foreach pt ptb
                            (setq no (1+ no))
                            (write-line
                                 (strcat ;(itoa no) ","
                                         (rtos (car  pt) 2 2) ","
                                         (rtos (cadr pt) 2 2) ","
                                  )
                                  fff
                            )
                       )
                  )
                  (close fff)
                  (princ (strcat "\n坐标已存入\"" wjm "\"中"))
            )
        )
    )
    (setvar "cmdecho" cm)
    (princ)
)



 楼主| 发表于 2014-5-6 14:59:42 | 显示全部楼层
自己顶一个,,,大大们帮改下第二个程序就行。。。真的急死人了。。。
发表于 2014-5-6 15:15:50 | 显示全部楼层
本帖最后由 kwok 于 2014-5-6 19:50 编辑

看看这个是不是,输出xyz坐标到文本.
CAD启动指令:   tqzb
  1. ;;46.2 [功能] pline,lwpline点坐标表  By 无痕;;示例(vxs (car (entsel))),返回三维点坐标
  2. (defun vxs (e / i v lst)
  3.   (setq i -1)
  4.   (while
  5.     (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
  6.      (setq lst (cons v lst))
  7.   )
  8.   (reverse lst)
  9. )
  10. ---------------------------------------------------------
  11. ;;;;;;;;;三维顶点输出到文本
  12. (defun c:tqzb (/ cm ss en ii ptb no )
  13. (vl-load-com)
  14.     (setq cm (getvar "cmdecho"))
  15.     (setvar "cmdecho" 0)
  16.     (setq wjm (getfiled "请指定要保存的坐标文件" "e:\" "txt" 1))
  17.        (setq fff (open wjm "w"))
  18.        (setq ss (ssget '((0 . "lwPOLYLINE"))))
  19.                 (setq ii   0
  20.                       no  0
  21.                   )
  22.                   (repeat (sslength ss)
  23.                        (setq en (ssname ss ii)
  24.                              ii  (1+ ii)
  25.                             ptb (vxs en))
  26.                         (foreach pt ptb
  27.                             (setq no (1+ no))
  28.                             (write-line
  29.                                  (strcat (itoa no) ": "
  30.                                          (rtos (car  pt) 2 2) ", "
  31.                                          (rtos (cadr pt) 2 2) ", "
  32.                                          (rtos (caddr pt) 2 2) ", "
  33.                                   )
  34.                                   fff
  35.                             )
  36.                        )
  37.                   )
  38.                   (close fff)
  39.                   (princ (strcat "\n坐标已存入"" wjm ""中"))
  40.    
  41.     (setvar "cmdecho" cm)
  42.     (princ)
  43. )
 楼主| 发表于 2014-5-6 15:28:37 | 显示全部楼层
kwok 发表于 2014-5-6 15:15
看看这个是不是,只加了可以输入xyz.
CAD启动指令:   tqzb

不行啊大大,是只加了第24行caddr pt 吗,我试过了,输出的都是0。。。是多段线的Z坐标输不出来的原因吗???

点评

3楼已改  发表于 2014-5-6 17:18
发表于 2014-5-6 16:07:54 | 显示全部楼层
楼上输出的是数学坐标,如需输出地理坐标,需将 (rtos (car  pt) 2 2) ","与   (rtos (cadr pt) 2 2) ","位置互换。另外,最好在程序前面加上一句:(setvar"dimzin"0);;保留小数位数时如果位数不足可以补零,不然,小数为0时显示不出来。
                                 
发表于 2014-5-6 16:09:45 | 显示全部楼层
轻多段线(LWPolyline)是平面线形,是无z坐标的,z坐标是多段线所在平面的z坐标,用组码38表示,对于多段线平面和世界坐标平面不平行的情况,还要考虑拉伸方向(210组码)的影响,即实际坐标是通过10、38、210组码计算出来的,不是简单的c...r。
3D多段线(Polyline)具有z坐标,但每个顶点是通过实体跟随来反映的,要用函数entnext来查找。
 楼主| 发表于 2014-5-6 16:17:21 | 显示全部楼层
ll_j 发表于 2014-5-6 16:09
轻多段线(LWPolyline)是平面线形,是无z坐标的,z坐标是多段线所在平面的z坐标,用组码38表示,对于多段线 ...

顿悟!怪不得Z坐标总是0.大大能不能简单的举个例子?让我能修改一下用到程序里
 楼主| 发表于 2014-5-6 16:21:46 | 显示全部楼层
ll_j 发表于 2014-5-6 16:09
轻多段线(LWPolyline)是平面线形,是无z坐标的,z坐标是多段线所在平面的z坐标,用组码38表示,对于多段线 ...

我求的是CAD中等高线的坐标值,我想了下,确实是全都是轻多段线,因为等高线平面都是和世界坐标平行的。那我只要求出标高就行了。大大你刚才说组码38,这个38怎么提取?
发表于 2014-5-6 16:47:33 | 显示全部楼层
玉麒麟卢比奥 发表于 2014-5-6 16:21
我求的是CAD中等高线的坐标值,我想了下,确实是全都是轻多段线,因为等高线平面都是和世界坐标平行的。那 ...

(cdr (assoc 38 (entget (car (entsel)))))
 楼主| 发表于 2014-5-6 16:59:58 | 显示全部楼层
ll_j 发表于 2014-5-6 16:47
(cdr (assoc 38 (entget (car (entsel)))))

谢谢!我刚试了半天,不知道应该把这句话加在循环的哪一行。。。大大能不能帮到底,今天晚上交接,实在没时间细学了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-9-29 04:49 , Processed in 0.174268 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表