找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 531|回复: 4

[求助] [求助]:如何得到pl线的各个顶点的坐标数据,并将其分别写入变量中

[复制链接]
发表于 2003-4-7 03:48:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
有一个由多条线段(圆弧)组成的多段线,怎样才能获得各个顶点的坐标值?且将其分别写入变量如:pt1、pt2、pt3……ptn中。
我已经找到一个解决的方法:
选择一个多段线将返回一个类似于
((-1 . <图元名: 7ef5deb8>) (0 . "LWPOLYLINE") (330 . <图元名:
7ef5dcf8>) (5 . "8F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(100 . "AcDbPolyline") (90 . 8) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10
985.481 837.732) (40 . 0.0) (41 . 0.0) (42 . -0.414214) (10 1059.9 763.312) (40
. 0.0) (41 . 0.0) (42 . 0.0) (10 1059.9 361.039) (40 . 0.0) (41 . 0.0) (42 .
-0.414214) (10 985.481 286.619) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 635.071
286.619) (40 . 0.0) (41 . 0.0) (42 . -0.414214) (10 560.65 361.039) (40 . 0.0)
(41 . 0.0) (42 . 0.0) (10 560.65 763.312) (40 . 0.0) (41 . 0.0) (42 .
-0.414214) (10 635.071 837.732) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0
1.0))
的表,多段线的顶点信息从第15表项开始以后每隔4个表项为一顶点,还可以根据表的长度算出多段线的线段数。
代码:

  1. (defun aaa ()
  2.   (setq z_a (entsel))
  3.   (setq z_b (entget (car z_a)))
  4.   (setq n (length z_b))
  5.   (setq na (- (/ (- n 15) 4) 1))
  6.   (setq m 0)
  7.   (setq nb 14)
  8.   (while (<= m na)
  9.     (setq pt (cdr (nth nb z_b)))
  10.     (set (read (strcat "pt" (itoa (1+ m)))) pt)
  11.     (setq nb (+ nb 4))
  12.     (setq m (1+ m))
  13.   )
  14. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-4-7 18:50:38 | 显示全部楼层
这个问题好像不应该是雷锋同志应该问的。
你看看这样如何:

  1.   (setq e0  (entget (car (entsel "\n拾取 LWP多义线:")))
  2.         l1  nil
  3.   )
  4.   (mapcar
  5.     '(lambda(x)
  6.        (if (or (= (car x) 10)          ;顶点
  7.                 (= (car x) 42)          ;凸度
  8.            )
  9.           (setq l1 (cons x l1))
  10.        )
  11.      )
  12.     e0
  13.   )
  14.   (reverse l1)


这样构成的表比使用很多的变量灵活的多。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-4-7 18:55:03 | 显示全部楼层
看看CAD中的Vlisp例程。
用vla-get-Coordinates 得到顶点坐标,用下面的函数处理。

  1. ;;;--------------------------------------------------------------------;
  2. ;;;     Function: list->variantArray                                   ;
  3. ;;;--------------------------------------------------------------------;
  4. ;;;  Description: This function takes one parameter representing a     ;
  5. ;;;               list of double values, e.g. a list of 2D points:     ;
  6. ;;;               '(p1.X p1.Y p2.X p2.Y p3.X p3.Y p4.X p4.Y).          ;
  7. ;;;                  The list is converted into an ActiveX                ;
  8. ;;;                  variant based on a safearray.                        ;
  9. ;;;               No error checking is performed on the parameter --   ;
  10. ;;;               it is assumed to consist of a list of doubles.       ;
  11. ;;;------------------------------------------------------------------- ;
  12. (defun gp:list->variantArray (ptsList / arraySpace sArray)
  13.                                         ; allocate space for an array of 2d points stored as doubles
  14.   (setq        arraySpace
  15.          (vlax-make-safearray
  16.            vlax-vbdouble                ; element type
  17.            (cons 0
  18.                  (- (length ptsList) 1)
  19.            )                                ; array dimension
  20.          )

  21.   )
  22.   (setq sArray (vlax-safearray-fill arraySpace ptsList))
  23.                                         ; return array variant
  24.   (vlax-make-variant sArray)
  25. )


  26. ;;;--------------------------------------------------------------------;
  27. ;;;     Function: xyzList->ListOfPoints                                ;
  28. ;;;--------------------------------------------------------------------;
  29. ;;;  Description: This function extracts and formats 3D point lists    ;
  30. ;;;               from one big list of reals, in the form:             ;
  31. ;;;                   (x y z x y z x y z ...)                          ;
  32. ;;;               This is the format of the data returned by the       ;
  33. ;;;               vla-get-coordinates function when applied to a       ;
  34. ;;;               standard polyline object.                            ;
  35. ;;;--------------------------------------------------------------------;
  36. ;;;               The return value will be a list in the format:       ;
  37. ;;;                    ((x y z) (x y z) (x y z) ... )                  ;
  38. ;;;--------------------------------------------------------------------;
  39. (defun xyzList->ListOfPoints (coordList / ptlist)
  40.   (while coordList
  41.     (setq ptlist (append ptlist
  42.                          (list (list (car coordList) (cadr coordList) (caddr coordList)))
  43.                  ) ;_ end of append
  44.           coordList         (cdddr coordList)
  45.     ) ;_ end of setq
  46.   ) ;_ end of while
  47.   ptlist
  48.   ;;; (setq ptlist ptlist)
  49. ) ;_ end of defun


  50. ;;;--------------------------------------------------------------------;
  51. ;;;     Function: xyList->ListOfPoints                                 ;
  52. ;;;--------------------------------------------------------------------;
  53. ;;;  Description: This function extracts and formats 2D point lists    ;
  54. ;;;               from one big list of reals, in the form:             ;
  55. ;;;                   (x y x y x y ...)                                ;
  56. ;;;               This is the format of the data returned by the       ;
  57. ;;;               vla-get-coordinates function when applied to a       ;
  58. ;;;               lightweight polyline object.                         ;
  59. ;;;--------------------------------------------------------------------;
  60. ;;;               The return value will be a list in the format:       ;
  61. ;;;                    ((x y) (x y) (x y) ... )                        ;
  62. ;;;--------------------------------------------------------------------;
  63. (defun xyList->ListOfPoints (coordList / ptlist)
  64.   (while coordList
  65.     (setq ptlist (append ptlist
  66.                          (list (list (car coordList) (cadr coordList)))
  67.                  ) ;_ end of append
  68.           coordList         (cddr coordList)
  69.     ) ;_ end of setq
  70.   ) ;_ end of while
  71.     ptlist
  72.   ;;; (setq ptlist ptlist)
  73. ) ;_ end of defun

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-4-8 08:26:46 | 显示全部楼层
最初由 ll_j 发布
[B]这个问题好像不应该是雷锋同志应该问的。
你看看这样如何:
[code]
  (setq e0  (entget (car (entsel "\n拾取 LWP多义线:")))
        l1  nil
  )
  (mapcar
    '(lambda(x)
       (if (or (= (car x) 10)    ... [/B]

怎么这么说呢,其实我有很多东西还不是太懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-4-14 19:30:10 | 显示全部楼层
仿ll-j,共同学习
⒈(setq e0  (entget (car (entsel "\n拾取 LWP多义线:")))  l1  nil  )
  (foreach x e0
       (if (or (= (car x) 10)        (= (car x) 42)  )
          (setq l1 (cons x l1))
       )
   )
  (reverse l1)
⒉(setq e0  (entget (car (entsel "\n拾取 LWP多义线:")))  l1  nil i 0 )
  (while (setq x (nth i eo))
       (if (or (= (car x) 10)        (= (car x) 42)  )
          (setq l1 (cons x l1))
       )
   (setq i (1+  i))
   )
  (reverse l1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-3 12:20 , Processed in 0.350200 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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