找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 753|回复: 12

[求助] [求助]:请问怎样取得多义线的段数?如何判断是否封闭?

[复制链接]
发表于 2005-10-22 14:57:54 | 显示全部楼层 |阅读模式

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

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

×
请问怎样取得多义线的段数?如何判断是否封闭?

如图所示,正确的段数应均为4段
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-10-22 15:55:41 | 显示全部楼层
检查多义线是否封闭,可以利用dxf组码70判断,90是顶点数:
[php](defun c:test ()
  (while (setq s1 (car (entsel "\n选择多义线<退出> : ")))
    (if        (or (= (cdr (assoc 0 (entget s1))) "POLYLINE")
            (= (cdr (assoc 0 (entget s1))) "LWPOLYLINE")
        )
      (progn
        (setq mode (cdr (assoc 70 (entget s1))))
        (if (= mode 1)
          (princ "\n多义线封闭!")
          (princ "\n多义线不封闭!")
        )
      )
      (princ "\n所选不是多义线!")
    )
  )
  (princ)
)[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-10-22 16:25:57 | 显示全部楼层
老兄:
很久不见了,还好吗?
这段时间一直没来深圳吗?怎么不见你打电话给我?下次来了记得给我电话哦。
还有问题要请教你:怎样取得多义线的段数?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8157个

财富等级: 富甲天下

发表于 2005-10-22 17:34:35 | 显示全部楼层
是指这个吗 ?
;;; Creates a segment list for the polyline pname
  ;;;   as a list of '(bulge p1 p2). A straight line has bulge 0.0
  ;;; Compute pts in ECS of pname. Accepts LWPOLYLINE's
  (defun PLINE-SEGS (pname / pts segs)
    (setq segs
      (mapcar 'list
        (if (istypep pname "LWPOLYLINE")
          (group-only 42 (entget pname))
          (cplx-list 42 pname))
        (setq pts (getpts pname))       ; ->[23.1]
        (rot1 pts)))                    ; ->[20.1]
    (if (flagsetp 1 pname)
      segs                ;closed
      (butlast segs)))         ;open: without the last segment, ->[20.1]

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

使用道具 举报

发表于 2005-10-22 19:23:26 | 显示全部楼层
  1. [FONT=courier new]
  2. ;;;多义线的段数(不含0长的段)
  3. (defun c:test ()
  4.   (cmdla0)
  5.   (while (setq s1 (car (entsel "\n选择多义线<退出> : ")))
  6.     (if        (or (= (cdr (assoc 0 (entget s1))) "POLYLINE")
  7.             (= (cdr (assoc 0 (entget s1))) "LWPOLYLINE")
  8.         )
  9.       (progn
  10.         (setq mode (cdr (assoc 70 (entget s1)))
  11.               l           (cdr (assoc 90 (entget s1)))
  12.         )
  13.         (if (= mode 1)
  14.           (comp-pt)
  15.           (setq l (- l 1))
  16.         )
  17.         (princ "\n共 ")
  18.         (princ l)
  19.         (princ " 段!")
  20.       )
  21.       (princ "\n所选不是多义线!")
  22.     )
  23.   )
  24.   (cmdla1)
  25. )
  26. (defun comp-pt ()
  27.   (setq        i   -1
  28.         pts (vlax-curve-getstartPoint s1)
  29.         l   0
  30.   )
  31.   (while
  32.     (setq pt0 (vlax-curve-getPointAtParam (vla-obj s1) (setq i (1+ i))))
  33.      (if (equal pt0 pts)
  34.        (setq pts pt0)
  35.        (progn
  36.          (setq pts pt0)
  37.          (setq l (1+ l))
  38.        )
  39.      )
  40.   )
  41. )
  42. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-22 21:09:45 | 显示全部楼层
检测是否闭合写得太长了.我来写一个:

  1. ;| (x@iscl e) = 检测实体是否闭合---ok---by 狂刀.2005.10
  2. 参数 : e = 被检测的实体,不限制类型.自动出错处理.
  3. 返回 : T 闭合; nil 不闭合.
  4. 测试 :
  5. (x@iscl (CAR (ENTSEL)))
  6. |;
  7. [color=blue]
  8. (DEFUN x@iscl (e)
  9.   (EQ :VLAX-TRUE
  10.       (VL-CATCH-ALL-APPLY '(LAMBDA () (VLA-GET-CLOSED (VLAX-ENAME->VLA-OBJECT e))))
  11.   )
  12. )
  13. [/color]


计算多义线段数.我也写一个:,不过也短不了多少了.:)

  1.   [FONT=courier new]
  2. ;| 计算多义线段数(不含0长线段)---by 狂刀 2004.10
  3. 测试命令 c:test
  4. |;
  5. [color=blue]
  6. (defun c:test ()
  7.   (while (and (setq e (car(entsel)))
  8.               (wcmatch (cdr(assoc 0 (entget e))) "*POLYLINE")
  9.          )
  10.     (princ "\n多义线段数(不含0长线段): ")
  11.     (princ (1- (length(@polyvxs e))))
  12.   )
  13. )
  14. (defun @polyvxs (e / i pt pts)
  15.   (setq i -1)
  16.   (while (setq pt(vlax-curve-getpointatparam e (setq i(1+ i))))
  17.     (if (not (equal pt (car pts) 1e-2))
  18.       (setq pts (cons pt pts))
  19.     )
  20.   )
  21.   (reverse pts)
  22. ) [/color]
  23.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-22 21:16:35 | 显示全部楼层
最初由 狂刀 发布
[B]检测是否闭合写得太长了.我来写一个:
[code]
;| (x@iscl e) = 检测实体是否闭合---ok---by 狂刀.2005.10
参数 : e = 被检测的实体,不限制类型.自动出错处理.
返回 : T 闭合; nil 不闭合.
测试 :
(x@iscl (CAR ... [/B]

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

使用道具 举报

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-24 12:06:33 | 显示全部楼层
1 闭合 (vl-catch-all-apply 'vlax-curve-isclosed (list ent))
2 段数 (1- (fix (vlax-curve-getendparam lwent)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 12:59:53 | 显示全部楼层
10楼的简洁明了. 其实搜索论坛可以找到以前曾发过的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 15:59:35 | 显示全部楼层
最初由 eachy 发布
[B]1 闭合 (vl-catch-all-apply 'vlax-curve-isclosed (list ent))
2 段数 (1- (fix (vlax-curve-getendparam lwent))) [/B]

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

使用道具 举报

发表于 2006-1-2 16:42:40 | 显示全部楼层
(vl-catch-all-apply 'vlax-curve-isclosed (list ent))

似乎对起点和终点不重合的闭合多段线判断不正确,如pline线最后一段和初始段重合的情况。而且如果是自己通过捕捉点来绘制封闭的pline线,而不是通过输入“C”来生成最后一点,绘制的pline线也被认为是不闭合的,为什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 01:49 , Processed in 0.639291 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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