mandala 发表于 2011-1-7 15:34:29

能否让线型反向?

比如这么一条陡坎的pline或spline,线型名是DK,符号在前进方向左侧。画完后发现陡坎方向画反了,希望用一个命令将其反向。
当然用lisp来换一个反向的线型是最简单的,比如换成DK1。只是为每个线型都做一个反向线型,会导致cad的线型列表很长很长,也比较麻烦。能否不用添加新线型,直接将其反向呢?


Gu_xl 发表于 2011-1-7 16:33:32

回复 mandala 的帖子


;;;多段线顶点逆序
(defun reverseLwp (e / a en how li1 li2 li3)
(setq en(entget e '("*")) how nil)
(foreach an en
(if(setq a(member(car an)'(10 40 41 42)))(setq how t))
(cond((not how)(setq li1(cons an li1)))
       ((and how a)
         (cond((=(car an)40)(setq an(cons 41(cdr an))))
            ((=(car an)41)(setq an(cons 40(cdr an))))
            ((=(car an)42)(setq an(cons 42(- 0(cdr an)))))
            (t an)
          )
         (setq li2(cons an li2)))
       ((and how(not a))(setq li3(cons an li3)))
   )
)
(entmod(append
         (reverse li1)
         (append(cdddr li2)(list(car li2)(cadr li2)(caddr li2)))
         (reverse li3)
      )
)
)

mandala 发表于 2011-1-7 18:53:22

谢谢版主!我研究一下先。

mandala 发表于 2011-1-7 22:18:57

回复 Gu_xl 的帖子

研究了一下,很佩服。按照这个思路我又添了一个 if 语句,可以把单独的一条直线也反向了。但是能不能把单独的一段圆弧也反向呢?我写不出来了……

Gu_xl 发表于 2011-1-7 22:27:47

回复 mandala 的帖子

不可以!圆弧始终是逆时钟方向的!

mandala 发表于 2011-1-7 23:01:32

唉!不过还是谢谢版主,呵呵。

ZZXXQQ 发表于 2011-1-8 09:25:45

mandala 发表于 2011-1-7 22:18 static/image/common/back.gif
回复 Gu_xl 的帖子

研究了一下,很佩服。按照这个思路我又添了一个 if 语句,可以把单独的一条直线也反向了 ...

试一下将圆弧转成复线,然后用2楼的程序反向。

mandala 发表于 2011-1-8 12:28:41

ZZXXQQ 发表于 2011-1-8 09:25 static/image/common/back.gif
试一下将圆弧转成复线,然后用2楼的程序反向。

嗯,俺昨天晚上睡床上时想到了。现在的结果如下……连用了4个if是不是有点傻,辛苦各位老大看看能否优化一下:
;;统统反向:

(defun C:fx(/ ENT ENT1 )
(setq ENT (entget (setq ENT1 (car (entsel)))))
(if (= (cdr (assoc 0 ENT)) "LWPOLYLINE") (reverseLwp ent1))
(if (= (cdr (assoc 0 ENT)) "LINE")
    (progn
   (command "_.LINE" "_NON" (vlax-curve-getendPoint ent1) "_NON"(vlax-curve-getStartPoint ent1) "")
   (entdel ENT1)
    )
)
(if (= (cdr (assoc 0 ENT)) "SPLINE")(command "SPLINEDIT" ENT1 "E" ""))
(if (= (cdr (assoc 0 ENT)) "ARC")
    (progn
      (command "pedit" ent1 "y" "")
      (setq ent1(entlast))
      (reverseLwp ent1)
    )
)
(princ)
)
;;;多段线顶点逆序
(defun reverseLwp (ent1 / a en how li1 li2 li3)
(setq en(entget ent1 '("*")) how nil)
(foreach an en
(if(setq a(member(car an)'(10 40 41 42)))(setq how t))
(cond((not how)(setq li1(cons an li1)))
       ((and how a)
         (cond((=(car an)40)(setq an(cons 41(cdr an))))
            ((=(car an)41)(setq an(cons 40(cdr an))))
            ((=(car an)42)(setq an(cons 42(- 0(cdr an)))))
            (t an)
          )
         (setq li2(cons an li2)))
       ((and how(not a))(setq li3(cons an li3)))
   )
)
(entmod(append
         (reverse li1)
         (append(cdddr li2)(list(car li2)(cadr li2)(caddr li2)))
         (reverse li3)
      )
)
)



mandala 发表于 2011-1-8 12:41:30

至于直线的反转……我本来是打算通过(entmake (append ……))来改动10和11段这两个点的坐标来实现的,如下:
(setq Q (reverse (member (assoc 100 (reverse ENT)) (reverse ENT))))
(setq Q2 (member (assoc 10 ENT) ENT))
(entmake (append Q
   (list(cons 10 (cdr(assoc 11 q2))))
   (list(cons 11 (cdr(assoc 10 q2))))
   (list (last Q2))
    ))
(entdel ENT1)
后来想到直接倒过来连么好了,就用了(command "_.LINE" "_NON" (vlax-curve-getendPoint ent1) "_NON"(vlax-curve-getStartPoint ent1) ""),请问这样会不会有问题?我运行了一下似乎是一样的。

ZZXXQQ 发表于 2011-1-8 12:54:45

那就用cond吧。
页: [1] 2
查看完整版本: 能否让线型反向?