找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 606|回复: 4

[求助] [求助]:如何让多义线各个顶点顺序反过来?

[复制链接]
发表于 2004-10-6 22:52:49 | 显示全部楼层 |阅读模式

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

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

×
就是转换后,让第一点顶点变成最后一个,第二个顶点变成倒数第二个,依次类推。(相当于换一个方向).
因为该多义线特别复杂,有上千个节点。
我想得到一个相对较快的运行速度,请大家帮忙。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-10-6 23:13:03 | 显示全部楼层
;;虽然老了点,但是精品。不适用LWPOLYLINE

;  Subject:      Re: invert the direction of a polyline
;  From:         vnestr@netvision.net.il (Vladimir Nesterovsky)
;  Date:         1997/03/01
;  Newsgroups:   comp.cad.autocad
;
;  Try this:

   ;; This is (C.) by Vladimir Nesterovsky, 1997
   ;; e-mail: vnestr@netvision.net.il
   ;; YOU MAY USE THIS CODE ONLY FOR *NON-COMMERCIAL*
   ;; PURPOSES AND ONLY IF YOU RETAIN
   ;; THIS HEADER COMPLETE AND UNALTERED
   ;; you must contact me if you want to use it commercially
   (defun c:invpl( )
    (r-ss-foreach
      (ssget '((0 . "POLYLINE")))
      'inv-pl)
    (princ"\nInverted!")
    (princ))

   ;; repeat (foo e-name) for each e-name in SelSet
   ;; in reversed order
   (defun r-ss-foreach ( ss qfoo / n )
    (if (= 'PICKSET (type ss))
     (repeat (setq n (fix (sslength ss))) ;; a little fix
      (apply qfoo (list (ssname ss (setq n (1- n))))))))

   (defun dxf(a b)(cdr(assoc a b)))

   ;;Invert polyline
   (defun inv-pl( e / d0 di d bl pl swl ewl )
     (setq d0 (entget e '("*"))) ;; keep xdata
     (while (/= "SEQEND" (dxf 0 (setq di
              (entget (setq e (entnext e))))))
       (setq  d di
             pl (cons (dxf 10 d) pl)
            swl (cons (dxf 40 d) swl)
            ewl (cons (dxf 41 d) ewl)
             bl (cons (-(dxf 42 d)) bl) ))
     (setq  ;; cycle the lists
           bl  (append (cdr  bl) (list (car  bl)))
           swl (append (cdr swl) (list (car swl)))
           ewl (append (cdr ewl) (list (car ewl))) )

     (entmake d0)
     (mapcar
      '(lambda(p b sw ew)(entmake
        (subst (cons 10 p)(assoc 10 d)
         (subst (cons 42 b)(assoc 42 d)
          (subst (cons 40 sw)(assoc 40 d)
           (subst (cons 41 ew)(assoc 41 d)
             d))))))
       pl bl ewl swl)
     (entmake(list '(0 . "SEQEND")(cons 8 (dxf 8 d0))))
     (entdel (dxf -1 d0))
     (redraw (entlast))
     (princ)
   )

;  You can alter this code to carry vertex widths also,
;  if you care.
;
;  ------- Original message: -------
;  On 21 Feb 1997 11:15:00 GMT,  - "Decurtins Reto"  wrote
;  in comp.cad.autocad:
;
;  Is this possible and how ?


;;; Changes:
;;; 1997/11/06: slight improvements:
;;;                inv-pl to carry width info and keep EED


[B]这个解可能适用范围大些[/B]

[php]

;;Reply From: Oquendo, Frank
;;Date: Mar/01/00 - 16:53 (GMT)

;;Re: Reverse a Pline
;;I'm sure there's a prettier way but this will reverse the direction of a
;;polyline. All you have to do is pass it the entity name of a polyline. I
;;don't know if it will work in R14 but in A2K, it should work on any type of
;;polyline (LWPOLY,POLY, 3DPOLY)

(defun reverse-pline (poly / obj coords index pt tmp)
  (setq        obj    (vlax-ename->vla-object poly)
        coords (vlax-safearray->list
                 (vlax-variant-value (vla-get-coordinates obj))
                 )
        )
  (if (= (cdr (assoc 0 (entget poly))) "LWPOLYLINE")
    (setq index 2)
    (setq index 3)
    )
  (repeat (/ (length coords) index)
    (setq pt (list (nth 0 coords) (nth 1 coords)))
    (if        (= index 3)
      (setq pt (append pt (list (nth 2 coords))))
      )
    (setq tmp         (cons pt tmp)
          pt         nil
          coords (cdr (member (nth (1- index) coords) coords))
          )
    )
  (setq tmp (apply 'append tmp))
  (vla-put-coordinates
    obj
    (vlax-make-variant
      (vlax-safearray-fill
        (vlax-make-safearray
          vlax-vbdouble
          (cons 0 (1- (length tmp)))
          )
        tmp
        )
      )
    )
  (vla-update obj)
  (princ)
  )

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

使用道具 举报

发表于 2004-10-9 15:46:12 | 显示全部楼层
我的:),反向的程序写过多次,这个是最精简的,我自己也还比较满意:).不过这个还没加入凸度反向,但是已经支持polyline,lwpolyline.

  1. (defun re-vertexs (e / obj pts z lst)
  2.   (setq  obj (vlax-ename->vla-object e)
  3.          pts (vlax-get obj 'Coordinates )
  4.          z   (if(= "LWPOLYLINE" (cdr(assoc 0 (entget e)))) nil T))
  5.   (while  pts
  6.      (setq lst (cons (vl-list* (car pts) (cadr pts) (if z (list(caddr pts)))) lst)
  7.            pts (if z (cdddr pts)(cddr pts)))
  8.    )
  9.   (vlax-put obj 'Coordinates (apply 'append lst))
  10.   (princ)
  11. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-10-9 19:53:21 | 显示全部楼层
反向加入凸度的方法:
取得各顶点的凸度值列表,求反(- 值)
列表倒置,将第一个放到最末.
将凸度值按0~n顶点再付给多义线.ok!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 11:56 , Processed in 0.188688 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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