找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5000|回复: 18

[求助] [求助]:用lisp获取polyline坐标(高手请进)

[复制链接]
发表于 2007-3-23 14:56:39 | 显示全部楼层 |阅读模式

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

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

×
我要写一个读出二维多段线的顶点的程序,发现二维多段线的图元组码没有顶点坐标,请各位大哥帮忙,我在线等,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-3-23 15:06:54 | 显示全部楼层
(SETQ Ename(car(entsel))
      PTlist NIL
      lst1   (ENTGET Ename)
)
(while (setq lst1 (member (assoc 10 lst1) lst1))
  (SETQ        CT1    (CDR (car lst1))
        lst1   (cdr lst1)
        PTlist (CONS CT1 PTlist)
  )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-23 15:15:13 | 显示全部楼层

Re: [求助]:用lisp获取polyline坐标(高手请进)

最初由 measure1980 发布
[B]我要写一个读出二维多段线的顶点的程序,发现二维多段线的图元组码没有顶点坐标,请各位大哥帮忙,我在线等, [/B]



谢谢大哥,不过你这个不行啊,只是得到了组码为10的数值,polyline的图元表里是没有顶点坐标的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-23 17:50:34 | 显示全部楼层
楼上。。。
组码10就是多段线的顶点坐标了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-23 18:46:16 | 显示全部楼层
你也这发了
(DEFUN getpl_pt ( / P EN P1 ET PT PL EN0 P2 PTC RR AN DF);返回三维坐标点
  (setq e (car (entsel)))
  (SETQ PL NIL)
  (SETQ EN0 (ENTGET E)
ET (CDR (ASSOC 0 EN0))
  )
  (COND
    ((= ET "LWPOLYLINE")
     (setq EN0  (entget E)
P  (ASSOC 10 EN0)
h  (list (cdr (ASSOC 38 EN0)))
PL nil
     )
    (WHILE P
     (SETQ EN0    (MEMBER P EN0)
   P    (CDR (ASSOC 10 EN0))
   EN0    (CDR EN0)
   PL (CONS (append P h) PL)
   P    (ASSOC 10 EN0)
     )
    )
     (setq PL (reverse PL))
    )
    ((= ET "POLYLINE")
      (SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
      (WHILE (/= (CDR (ASSOC 0 EN)) "SEQEND")
(SETQ P (CDR (ASSOC 10 EN)))
(SETQ P (TRANS P E 1))
(SETQ PL (CONS P PL))
(SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
      )
    )
  )
  (REVERSE PL)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-23 23:22:38 | 显示全部楼层
用lisp获取polyline坐标!!
楼主在用多少版本的CAD哦
不过我现在到是觉得老POLYLINE还是很好的,描述比LWPOLYLINE好。
像我前不久提出的问题:平面LWPOLYINE通过对齐空间坐标点后得到得空间线,就读不出Z值,而是多了一个210得拉伸值,我又实在找不到关于如何用210值计算Z值的定义,只好将LWPOLYLINE转换为POLYLINE之后才解决问题。
正如陈伯雄老师在他的书中提到的“没有这个半截子的LWPOLYLINE,数据分析处理程序反而会容易写一些”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-24 08:49:34 | 显示全部楼层
谢谢五楼的朋友阿,有空来山东请你喝酒阿,不知你是哪里的阿
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-3-24 09:14:28 | 显示全部楼层
最初由 panzhongw 发布
[B]用lisp获取polyline坐标!!
楼主在用多少版本的CAD哦
不过我现在到是觉得老POLYLINE还是很好的,描述比LWPOLYLINE好。
像我前不久提出的问题:平面LWPOLYINE通过对齐空间坐标点后得到得空间线,就读不出Z值,而是多了一个210得拉伸值,我又实在找不到关于如何用210值计算Z值的定义,只好将LWPOLYLINE转换为POLYLINE之后才解决问题。
正如陈伯雄老师在他的书中提到的“没有这个半截子的LWPOLYLINE,数据分析处理程序反而会容易写一些”。 [/B]

1.群组码210值表示的是当前对象所在的坐标系在世界坐标系中的向量位置。使用trans 函数可以进行转换。
2.陈老师的在书中的见解是深有体会的,轻量多段线的确有鸡肋之感。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-24 11:04:29 | 显示全部楼层
楼上的仁兄,烦您对210值的转换说得详细点好吗,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-3-24 12:10:44 | 显示全部楼层
1、DXF群组码210表示某平面对象所在平面的法向矢量,这个法向矢量是相对于WCS坐标的。
例如某对象在XY平面上,其Z坐标值全相等,则该平面的法向矢量为(0  0  1)。即垂直于Z坐标轴。
<br>
2、关于坐标转换,请参照:
http://www.mjtd.com/object/autolisp/ALR.default.241.htm
重要条目摘录如下:
[PHP]
如果 from 或 to 参数是图元名,它必须是由 entnext、entlast、entsel、nentsel 和 ssname 等函数返回的图元名。这样就可以将某个特定对象的对象坐标系 (OCS) 中的点来回进行转换(对于某些对象,OCS 等价于 WCS,对这些对象,OCS 和 WCS 之间的转换是空操作)。使用三维拉伸矢量(三个实数组成的一个表)是来回转换对象 OCS 的另一种方法。但是,对于 OCS 等价于 WCS 的那些对象,这种转换也不做任何操作。
[/PHP]
可以看出,trans函数是非常有用的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-24 17:29:15 | 显示全部楼层
用VLA函数可以免去这些麻烦,直接获得坐标,LWpl和重PL都可以.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-3-24 18:18:27 | 显示全部楼层
最初由 oyxx_1023 发布
[B]用VLA函数可以免去这些麻烦,直接获得坐标,LWpl和重PL都可以. [/B]

<br>
这里没有好坏之分,VLA系列函数也是由ALISP扩充的。
喜欢用哪种风格完全在于自己。这就好比有人喜欢自己烹饪,有人喜欢下馆子一样。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-24 18:49:24 | 显示全部楼层
vlax-curve-getpointatparam
lwpolyline, polyline 通吃
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-24 22:54:06 | 显示全部楼层
如果你用r14版本,或者是老L爱好者,可以这样:
(源自abd软件)


  1. (defun get_lwpl-pb(e / en pl openmod enp p enp n i lst);;;取得lwPOLYLINE线顶点表;
  2.   (setq en (entget e) pl nil openmod (dxf 70 en)
  3.         n (dxf 90 en))
  4.   (if (= (dxf 0 en) "LWPOLYLINE") (progn
  5.     (setq lst (assoc 10 en) lst (member lst en) i 0)
  6.     (while (= (car (nth i lst)) 10)
  7.       (setq p (cdr (nth i lst)) pl (cons p pl))
  8.       (setq i (+ i 4))
  9.     );while
  10.   ) )
  11.   (if (= openmod 1)
  12.     (setq pl (cons (nth (- (length pl) 1) pl) pl)))
  13.   (reverse pl)
  14. )
  15. (defun get_lwpl-pb1( e / en pl openmod enp p p0 enp a i lst)
  16. ;;;取得带圆弧的 LWPOLYLINE 线上顶点表,((p a)(p a)...)
  17.   (setq en (entget e) pl nil openmod (dxf 70 en))
  18.   (if (= (dxf 0 en) "LWPOLYLINE") (progn
  19.     (setq lst (assoc 10 en) lst (member lst en) p0 nil i 0)
  20.     (while (= (car (nth i lst)) 10)
  21.       (setq p (cdr (nth i lst))
  22.             a (cdr (nth (+ i 3) lst)))
  23.       (setq i (+ i 4))
  24.       (if (or (and p0 (> (distance p p0) 0.01))
  25.               (not p0))
  26.         (setq pl (cons (list p a) pl))
  27.       )
  28.     );while
  29.   ) )
  30.   (if (= openmod 1)
  31.     (setq pl (cons (nth (- (length pl) 1) pl) pl)))
  32.   (reverse pl)
  33. )

  34. (defun get_pl-pb(e / en pl openmod enp p enp);;;取得POLYLINE线顶点表
  35.   (setq en(entget e) pl nil openmod (dxf 70 en) ep e)
  36.   (if (= (dxf 0 en) "POLYLINE") (progn
  37.     (setq ep (ENTNEXT ep))
  38.     (while (= (dxf 0 (setq en (entGET ep))) "VERTEX")
  39.       (setq p (dxf 10 en) pl (cons p pl))
  40.       (setq ep (ENTNEXT ep))
  41.     );while
  42.   ) )
  43.   (if (= openmod 1)
  44.     (setq pl (cons (nth (- (length pl) 1) pl) pl)))
  45.   (reverse pl)
  46. )

  47. (defun get_pl-pb0(e / en pl openmod enp p enp);;;取得lwpl和pl线顶点表(p p ...)
  48.   (setq en(entget e) pl nil openmod (dxf 70 en)
  49.         ty(dxf 0 en) ep e)
  50.   (cond
  51.     ((= ty "POLYLINE")
  52.       (setq ep (ENTNEXT ep))
  53.       (while (= (dxf 0 (setq en (entGET ep))) "VERTEX")
  54.         (setq p (dxf 10 en) pl (cons p pl))
  55.         (setq ep (ENTNEXT ep))
  56.       );while
  57.       (if (= openmod 1)
  58.         (setq pl (cons (nth (- (length pl) 1) pl) pl)))
  59.       (setq plist(reverse pl)))
  60.     ((= ty "LWPOLYLINE")
  61.       (setq lst (assoc 10 en) lst (member lst en) p0 nil i 0)
  62.       (while (= (car (nth i lst)) 10)
  63.         (setq p (cdr (nth i lst)) i (+ i 4))
  64.         (if (or (and p0 (> (distance p p0) 0.01))
  65.                 (not p0))
  66.           (setq pl (cons p pl))
  67.         )
  68.       );while
  69.       (if (= openmod 1)
  70.         (setq pl (cons (nth (- (length pl) 1) pl) pl)))
  71.       (setq plist(reverse pl)))
  72.     (t (setq plist nil))
  73.   )
  74.   plist
  75. )


  76. (defun get_pl-pba0(e / en pl openmod enp p enp);;;取得lwpl和pl线顶点表((p a)(p a)...)
  77.   (setq en(entget e) pl nil openmod (dxf 70 en)
  78.         ty(dxf 0 en) ep e)
  79.   (cond
  80.     ((= ty "POLYLINE")
  81.       (setq ep (ENTNEXT ep))
  82.       (while (= (dxf 0 (setq en (entGET ep))) "VERTEX")
  83.         (setq p (dxf 10 en) a(dxf 42 en)
  84.               pl (append pl (list (list p a)))
  85.               ep (ENTNEXT ep))
  86.       );while
  87.       (if (= openmod 1)
  88.         (setq pl(append pl (list (list (car (car pl)) 0)))))
  89.       (setq plist pl)
  90.     )
  91.     ((= ty "LWPOLYLINE")
  92.       (setq lst (assoc 10 en) lst (member lst en) p0 nil i 0)
  93.       (while (= (car (nth i lst)) 10)
  94.         (setq p (cdr (nth i lst))
  95.               a (cdr (nth (+ i 3) lst)))
  96.         (setq i (+ i 4))
  97.         (if (or (and p0 (> (distance p p0) 0.01))
  98.                 (not p0))
  99.           (setq pl (cons (list p a) pl))
  100.         )
  101.       );while
  102.       (if (= openmod 1)
  103.         (setq pl (cons (nth (- (length pl) 1) pl) pl)))
  104.       (setq plist(reverse pl)))
  105.     (t (setq plist nil))
  106.   )
  107.   plist
  108. )

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

使用道具 举报

 楼主| 发表于 2007-3-25 09:30:52 | 显示全部楼层
感谢各位热心人,问题得以解决。小弟再次向各位仁兄道谢了,用空找我来玩啊,前面有我的联系方式。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 04:28 , Processed in 0.284609 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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