明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: mandala

[基础] 能否让线型反向?

  [复制链接]
 楼主| 发表于 2011-1-8 13:58:07 | 显示全部楼层
本帖最后由 mandala 于 2011-1-8 14:02 编辑
ZZXXQQ 发表于 2011-1-8 12:54
那就用cond吧。


好的,改动一下
  1. ;;统统反向:

  2. (defun C:fx(/ ENT ENT1 )
  3.   (setq ENT (entget (setq ENT1 (car (entsel)))))
  4.   (cond
  5.     ((= (cdr (assoc 0 ENT)) "LWPOLYLINE") (reverseLwp ent1))
  6.     ((= (cdr (assoc 0 ENT)) "LINE")
  7.       (progn
  8.        (command "_.LINE" "_NON" (vlax-curve-getendPoint ent1) "_NON"  (vlax-curve-getStartPoint ent1) "")
  9.        (entdel ENT1)
  10.     ))
  11.     ((= (cdr (assoc 0 ENT)) "SPLINE")(command "SPLINEDIT" ENT1 "E" ""))
  12.     ((= (cdr (assoc 0 ENT)) "ARC")
  13.       (progn
  14.         (command "pedit" ent1 "y" "")
  15.         (setq ent1(entlast))
  16.         (reverseLwp ent1)
  17.     ))
  18.     (t (prompt "这个玩意不能反转!"))
  19.     )
  20. (princ))
  21. ;;;多段线顶点逆序
  22. (defun reverseLwp (ent1 / a en how li1 li2 li3)
  23.   (setq en(entget ent1 '("*")) how nil)
  24.   (foreach an en
  25.     (if(setq a(member(car an)'(10 40 41 42)))(setq how t))
  26.       (cond((not how)(setq li1(cons an li1)))
  27.        ((and how a)
  28.          (cond((=(car an)40)(setq an(cons 41(cdr an))))
  29.               ((=(car an)41)(setq an(cons 40(cdr an))))
  30.               ((=(car an)42)(setq an(cons 42(- 0(cdr an)))))
  31.               (t an)
  32.           )
  33.          (setq li2(cons an li2)))
  34.        ((and how(not a))(setq li3(cons an li3)))
  35.      ))
  36.   (entmod(append
  37.          (reverse li1)
  38.          (append(cdddr li2)(list(car li2)(cadr li2)(caddr li2)))
  39.          (reverse li3)
  40. )))


 楼主| 发表于 2011-1-8 14:09:08 | 显示全部楼层
本帖最后由 mandala 于 2011-1-8 14:11 编辑

一个月前刚开始接触lisp,以前一点点相关经验都没有,每个函数都是从说明文档开始学起,真的很费力。24小时之前我还不知道2楼版主给的这段lisp该怎么去用;一个小时之前还不知道cond函数是个什么东西。很幸运,在明经遇到那么多热心的前辈,给了我极大的帮助,在这里再次谢谢大家!
 楼主| 发表于 2011-1-8 17:45:54 | 显示全部楼层
本帖最后由 mandala 于 2011-1-8 20:13 编辑

发现严重错误……直线的反向不能简单用倒着画条线来解决,因为没有指定线型。

听版主14楼的话,最终修改如下:

  1. ;;pline、line、spline、arc统统反向:
  2. (defun C:fx(/ ENT ENT1 Q Q2 )
  3.   (setq ENT (entget (setq ENT1 (car (entsel)))))
  4.   (cond
  5.     ((= (cdr (assoc 0 ENT)) "LWPOLYLINE") (reverseLwp ent1))
  6.     ((= (cdr (assoc 0 ENT)) "LINE")
  7.       (setq Q (cons 10 (cdr (assoc 11 ent)))
  8.             Q2 (cons 11 (cdr (assoc 10 ent))))
  9.       (setq ent (subst Q (assoc 10 ent) ent)
  10.             ent (subst Q2 (assoc 11 ent) ent))
  11.       (entmod ent)
  12.      )
  13.     ((= (cdr (assoc 0 ENT)) "SPLINE")(command "SPLINEDIT" ENT1 "E" ""))
  14.     ((= (cdr (assoc 0 ENT)) "ARC")
  15.         (command "pedit" ent1 "y" "")
  16.         (setq ent1(entlast))
  17.         (reverseLwp ent1)
  18.     )
  19.     (t (prompt "这东西不能反转。"))
  20.     )
  21. (princ))
  22. ;;;以下为引用的子程序:pline顶点逆序
  23. (defun reverseLwp (ent1 / a en how li1 li2 li3)
  24.   (setq en(entget ent1 '("*")) how nil)
  25.   (foreach an en
  26.     (if(setq a(member(car an)'(10 40 41 42)))(setq how t))
  27.       (cond((not how)(setq li1(cons an li1)))
  28.        ((and how a)
  29.          (cond((=(car an)40)(setq an(cons 41(cdr an))))
  30.               ((=(car an)41)(setq an(cons 40(cdr an))))
  31.               ((=(car an)42)(setq an(cons 42(- 0(cdr an)))))
  32.               (t an)
  33.           )
  34.          (setq li2(cons an li2)))
  35.        ((and how(not a))(setq li3(cons an li3)))
  36.      ))
  37.   (entmod(append
  38.          (reverse li1)
  39.          (append(cdddr li2)(list(car li2)(cadr li2)(caddr li2)))
  40.          (reverse li3)
  41. )))



发表于 2011-1-8 19:19:28 | 显示全部楼层
本帖最后由 Gu_xl 于 2011-1-8 19:20 编辑

回复 mandala 的帖子 直线这么改比较好!

  1. ((= (cdr (assoc 0 ENT)) "LINE")
  2.   (setq Q (cons 10 (cdr (assoc 11 ent)))
  3. Q2 (cons 11 (cdr (assoc 10 ent)))
  4. )
  5.   (setq ent (subst Q (assoc 10 ent) ent)
  6. ent (subst Q2 (assoc 11 ent) ent)
  7. )
  8.   (entmod ent)
  9.   
  10.       )

 楼主| 发表于 2011-1-8 19:57:53 | 显示全部楼层
本帖最后由 mandala 于 2011-1-8 20:09 编辑

回复 Gu_xl 的帖子

嗯,对,用entmod更直观,也更方便。

另外我刚刚才知道cond后边是不用加progn的,汗一个。

点评

有钻研才能有进步!  发表于 2011-1-8 20:14
 楼主| 发表于 2011-1-13 15:28:48 | 显示全部楼层
回复 Gu_xl 的帖子

又有新问题:能让一个圆反向吗?它没有起点终点……
发表于 2011-1-13 18:25:07 | 显示全部楼层
  1. (defun c:tt1()
  2.   (setq en (car (entsel "\n选择一个园:")))
  3.   (setq cp (cdr (assoc 10 (setq enl (entget en))))
  4. r (cdr (assoc 40 enl))
  5. )
  6.   (entmake (setq lst (list
  7.       '(0 . "LWPOLYLINE")
  8.       '(100 . "AcDbEntity")
  9.       '(67 . 0)
  10.       '(410 . "Model")
  11.       '(100 . "AcDbPolyline")
  12.       '(90 . 2)
  13.       '(70 . 129)
  14.       (cons 10 (polar cp 0 r))
  15.       '(40 . 0)
  16.       '(41 . 0)
  17.       '(42 . -1)
  18.       (cons 10 (polar cp pi r))
  19.       '(40 . 0)
  20.       '(41 . 0)
  21.       '(42 . -1)
  22.       )
  23.     )
  24.     )
  25.   (command "_matchprop" en (entlast) "")
  26.   (entdel en)
  27. (princ)      
  28.   )

 楼主| 发表于 2011-1-13 18:58:59 | 显示全部楼层
回复 Gu_xl 的帖子

哦!对!还是用多义线来解决!!真是让我茅塞顿开,谢谢版主!!!哈哈。
发表于 2014-7-31 17:25:26 | 显示全部楼层
我想问的是如何应用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-25 14:23 , Processed in 0.171194 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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