ZZXXQQ 发表于 2011-1-8 12:54 http://bbs.mjtd.com/static/image/common/back.gif
那就用cond吧。
好的,改动一下;;统统反向:
(defun C:fx(/ ENT ENT1 )
(setq ENT (entget (setq ENT1 (car (entsel)))))
(cond
((= (cdr (assoc 0 ENT)) "LWPOLYLINE") (reverseLwp ent1))
((= (cdr (assoc 0 ENT)) "LINE")
(progn
(command "_.LINE" "_NON" (vlax-curve-getendPoint ent1) "_NON"(vlax-curve-getStartPoint ent1) "")
(entdel ENT1)
))
((= (cdr (assoc 0 ENT)) "SPLINE")(command "SPLINEDIT" ENT1 "E" ""))
((= (cdr (assoc 0 ENT)) "ARC")
(progn
(command "pedit" ent1 "y" "")
(setq ent1(entlast))
(reverseLwp ent1)
))
(t (prompt "这个玩意不能反转!"))
)
(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 14:11 编辑
一个月前刚开始接触lisp,以前一点点相关经验都没有,每个函数都是从说明文档开始学起,真的很费力。24小时之前我还不知道2楼版主给的这段lisp该怎么去用;一个小时之前还不知道cond函数是个什么东西。很幸运,在明经遇到那么多热心的前辈,给了我极大的帮助,在这里再次谢谢大家! 本帖最后由 mandala 于 2011-1-8 20:13 编辑
发现严重错误……直线的反向不能简单用倒着画条线来解决,因为没有指定线型。
听版主14楼的话,最终修改如下:
;;pline、line、spline、arc统统反向:
(defun C:fx(/ ENT ENT1 Q Q2 )
(setq ENT (entget (setq ENT1 (car (entsel)))))
(cond
((= (cdr (assoc 0 ENT)) "LWPOLYLINE") (reverseLwp ent1))
((= (cdr (assoc 0 ENT)) "LINE")
(setq Q (cons 10 (cdr (assoc 11 ent)))
Q2 (cons 11 (cdr (assoc 10 ent))))
(setq ent (subst Q (assoc 10 ent) ent)
ent (subst Q2 (assoc 11 ent) ent))
(entmod ent)
)
((= (cdr (assoc 0 ENT)) "SPLINE")(command "SPLINEDIT" ENT1 "E" ""))
((= (cdr (assoc 0 ENT)) "ARC")
(command "pedit" ent1 "y" "")
(setq ent1(entlast))
(reverseLwp ent1)
)
(t (prompt "这东西不能反转。"))
)
(princ))
;;;以下为引用的子程序:pline顶点逆序
(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)
)))
本帖最后由 Gu_xl 于 2011-1-8 19:20 编辑
回复 mandala 的帖子 直线这么改比较好!
((= (cdr (assoc 0 ENT)) "LINE")
(setq Q (cons 10 (cdr (assoc 11 ent)))
Q2 (cons 11 (cdr (assoc 10 ent)))
)
(setq ent (subst Q (assoc 10 ent) ent)
ent (subst Q2 (assoc 11 ent) ent)
)
(entmod ent)
)
本帖最后由 mandala 于 2011-1-8 20:09 编辑
回复 Gu_xl 的帖子
嗯,对,用entmod更直观,也更方便。
另外我刚刚才知道cond后边是不用加progn的,汗一个。
回复 Gu_xl 的帖子
又有新问题:能让一个圆反向吗?它没有起点终点……
(defun c:tt1()
(setq en (car (entsel "\n选择一个园:")))
(setq cp (cdr (assoc 10 (setq enl (entget en))))
r (cdr (assoc 40 enl))
)
(entmake (setq lst (list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(67 . 0)
'(410 . "Model")
'(100 . "AcDbPolyline")
'(90 . 2)
'(70 . 129)
(cons 10 (polar cp 0 r))
'(40 . 0)
'(41 . 0)
'(42 . -1)
(cons 10 (polar cp pi r))
'(40 . 0)
'(41 . 0)
'(42 . -1)
)
)
)
(command "_matchprop" en (entlast) "")
(entdel en)
(princ)
)
回复 Gu_xl 的帖子
哦!对!还是用多义线来解决!!真是让我茅塞顿开,谢谢版主!!!哈哈。 我想问的是如何应用
页:
1
[2]