玉麒麟卢比奥 发表于 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
                      no0
                  )
                (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 (carpt) 2 2) ","
                                         (rtos (cadr pt) 2 2) ","
                                )
                                fff
                          )
                       )
                )
                (close fff)
                (princ (strcat "\n坐标已存入\"" wjm "\"中"))
          )
        )
    )
    (setvar "cmdecho" cm)
    (princ)
)



玉麒麟卢比奥 发表于 2014-5-6 14:59:42

自己顶一个,,,大大们帮改下第二个程序就行。。。真的急死人了。。。

kwok 发表于 2014-5-6 15:15:50

本帖最后由 kwok 于 2014-5-6 19:50 编辑

看看这个是不是,输出xyz坐标到文本.
CAD启动指令:   tqzb;;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 (/ cm ss en ii ptb no )
(vl-load-com)
    (setq cm (getvar "cmdecho"))
    (setvar "cmdecho" 0)
    (setq wjm (getfiled "请指定要保存的坐标文件" "e:\\" "txt" 1))
       (setq fff (open wjm "w"))
       (setq ss (ssget '((0 . "lwPOLYLINE"))))
                (setq ii   0
                      no0
                  )
                  (repeat (sslength ss)
                     (setq en (ssname ss ii)
                           ii(1+ ii)
                            ptb (vxs en))
                        (foreach pt ptb
                            (setq no (1+ no))
                            (write-line
                                 (strcat (itoa no) ": "
                                       (rtos (carpt) 2 2) ", "
                                       (rtos (cadr pt) 2 2) ", "
                                       (rtos (caddr pt) 2 2) ", "
                                  )
                                  fff
                            )
                     )
                  )
                  (close fff)
                  (princ (strcat "\n坐标已存入\"" wjm "\"中"))
   
    (setvar "cmdecho" cm)
    (princ)
)

玉麒麟卢比奥 发表于 2014-5-6 15:28:37

kwok 发表于 2014-5-6 15:15 static/image/common/back.gif
看看这个是不是,只加了可以输入xyz.
CAD启动指令:   tqzb

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

香田里浪人 发表于 2014-5-6 16:07:54

楼上输出的是数学坐标,如需输出地理坐标,需将 (rtos (carpt) 2 2) ","与   (rtos (cadr pt) 2 2) ","位置互换。另外,最好在程序前面加上一句:(setvar"dimzin"0);;保留小数位数时如果位数不足可以补零,不然,小数为0时显示不出来。
                                 

ll_j 发表于 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 static/image/common/back.gif
轻多段线(LWPolyline)是平面线形,是无z坐标的,z坐标是多段线所在平面的z坐标,用组码38表示,对于多段线 ...

顿悟!怪不得Z坐标总是0.大大能不能简单的举个例子?让我能修改一下用到程序里

玉麒麟卢比奥 发表于 2014-5-6 16:21:46

ll_j 发表于 2014-5-6 16:09 static/image/common/back.gif
轻多段线(LWPolyline)是平面线形,是无z坐标的,z坐标是多段线所在平面的z坐标,用组码38表示,对于多段线 ...

我求的是CAD中等高线的坐标值,我想了下,确实是全都是轻多段线,因为等高线平面都是和世界坐标平行的。那我只要求出标高就行了。大大你刚才说组码38,这个38怎么提取?

ll_j 发表于 2014-5-6 16:47:33

玉麒麟卢比奥 发表于 2014-5-6 16:21 static/image/common/back.gif
我求的是CAD中等高线的坐标值,我想了下,确实是全都是轻多段线,因为等高线平面都是和世界坐标平行的。那 ...

(cdr (assoc 38 (entget (car (entsel)))))

玉麒麟卢比奥 发表于 2014-5-6 16:59:58

ll_j 发表于 2014-5-6 16:47 static/image/common/back.gif
(cdr (assoc 38 (entget (car (entsel)))))

谢谢!我刚试了半天,不知道应该把这句话加在循环的哪一行。。。大大能不能帮到底,今天晚上交接,实在没时间细学了
页: [1] 2
查看完整版本: 【多段线坐标问题】