能否让线型反向?
比如这么一条陡坎的pline或spline,线型名是DK,符号在前进方向左侧。画完后发现陡坎方向画反了,希望用一个命令将其反向。当然用lisp来换一个反向的线型是最简单的,比如换成DK1。只是为每个线型都做一个反向线型,会导致cad的线型列表很长很长,也比较麻烦。能否不用添加新线型,直接将其反向呢?
回复 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)
)
)
)
谢谢版主!我研究一下先。 回复 Gu_xl 的帖子
研究了一下,很佩服。按照这个思路我又添了一个 if 语句,可以把单独的一条直线也反向了。但是能不能把单独的一段圆弧也反向呢?我写不出来了…… 回复 mandala 的帖子
不可以!圆弧始终是逆时钟方向的! 唉!不过还是谢谢版主,呵呵。 mandala 发表于 2011-1-7 22:18 static/image/common/back.gif
回复 Gu_xl 的帖子
研究了一下,很佩服。按照这个思路我又添了一个 if 语句,可以把单独的一条直线也反向了 ...
试一下将圆弧转成复线,然后用2楼的程序反向。 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)
)
)
)
至于直线的反转……我本来是打算通过(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) ""),请问这样会不会有问题?我运行了一下似乎是一样的。
那就用cond吧。
页:
[1]
2