明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2137|回复: 7

[讨论]帮忙修改一下程序(修剪命令工具)

[复制链接]
发表于 2010-8-5 21:15:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2010-8-6 21:09:18 编辑

  1. ;;可点可框的修剪
  2. (defun c:tt (/ PO SS I J S1 P1 P2 )
  3. (vl-load-com)
  4. (SETVAR "CMDECHO" 0)
  5. (setvar "osmode" 0)
  6. (setq    plist NIL ss nil pt0 nil len NIL)
  7. (if(setq s1 (ssget))(setq len (sslength s1)))
  8. (command "undo" "be")
  9. (cond    ((= len 1);;;;;;;;;;;;;;;;;;;;如果是单选
  10.      (setq po(getpoint "\n请点选要被剪的一侧:") e1(ssname s1 0))
  11.      (command ".offset" 0.2 e1 po "") ;偏移值太小修剪会不准确
  12.      (setq en(entlast) dx0(dxf 0 e1))
  13.      (if po
  14.      (setq plist(dd en))
  15.      )
  16.      (command "trim" S1 "")
  17.      (repeat 5
  18.      (command "f")
  19.      (apply 'command plist)
  20.      (COMMAND "")
  21.      )
  22.      
  23.      (COMMAND "")
  24.     )
  25.     ((> len 1);;;;;;;;;;如果是多选
  26.      (prompt"\n请选择修剪方式<左击移动/右击框选>:")
  27.      (setq code_12 (grread (setq code (grread))));将类型代码 12 的数据从缓冲区中清除
  28.      (initget 128)
  29.      (if (= (car (setq g (grread nil 4 0))) 3)
  30.      (setq fs 3)
  31.      (setq fs nil)
  32.      )
  33.      (cond ((= fs 3);;;;;如果是左击
  34.         (setq z t)
  35.         (command "trim" s1 "")
  36.         (while z
  37.          (prompt"\n点击鼠标后开始修剪")
  38.          (if g (setq pt(cadr g) g nil)(setq pt (getpoint)))
  39.          (if pt
  40.          (progn (command "f")
  41.          (mapcar'(lambda(x)(command "NON" x)) (getpts))
  42.              (command "")
  43.      )
  44.          (setq z nil)
  45.          )
  46.          )
  47.         (command "")
  48.         )
  49.         ((not fs);;;如果是右击
  50.          (setq    p1 (getpoint "\n请框选被修剪对象:")
  51.             p3 (getcorner p1)
  52.             ss (ssget "c" p1 p3)
  53.          )
  54.          (setq z t)
  55.          (while z;
  56.          (SETq LEN2 (SSLENGTH SS))
  57.          (setq p2 (list (car p1) (cadr p3))
  58.              p4 (list (car p3) (cadr p1))
  59.          )
  60.          (command "trim" s1 "")
  61.          (REPEAT LEN2
  62.          (COMMAND "NON" "f" p1 p2 p3 p4 p1 "")
  63.          )
  64.          (COMMAND "")
  65.          (setq ss nil)
  66.          (initget 128)
  67.          (if    (setq p1 (getpoint "\n请框选被修剪对象:"))
  68.          (setq p3 (getcorner p1)
  69.              ss (ssget "c" p1 p3)
  70.          )
  71.          )
  72.          (if    (not ss)
  73.          (setq z nil)
  74.          )
  75.          );
  76.         );;;
  77.      );;;;;
  78.      );;;;;;;;;;
  79.     ((not len);;如果没有选择
  80.      (command ".trim" "")
  81.      )
  82.     );;;;;;;;;;;;;;;;;;;;
  83.      (command "undo" "e")
  84.      (setvar 'cmdecho 1)
  85.      (setvar 'osmode 1)
  86.      (PRINC)
  87. )
  88. ;;;
  89. (defun dxf(n ename)
  90. (cdr(assoc n (entget ename)))
  91. )
  92. ;;;
  93. (defun getpts(/ gr pt0 pt dis)
  94. (setq pts nil)
  95. (setq dis (* 0.001 (getvar "viewsize")))
  96. (while (= 5 (car (setq gr (grread t 4 0))))
  97. (setq pt (cadr gr))
  98. (if    (not pt0)
  99. (setq pt0    pt
  100.      pts    (cons pt0 pts)
  101. )
  102. )
  103. (if    (> (distance pt pt0) dis)
  104. (progn
  105.     (grdraw pt pt0 1 1)
  106.     (setq pts (cons pt pts)
  107.      pt0 pt
  108.     )
  109. )
  110. )
  111. )
  112. (redraw)
  113. (reverse pts)
  114. )
  115. ;;;;
  116. (defun dd (x)
  117. (setq obj x obj(vlax-ename->vla-object obj))
  118. (setq zc (vlax-curve-getdistatparam
  119.             obj
  120.             (vlax-curve-getendparam obj)
  121.          )
  122.      )
  123. (setq et(vlax-curve-getEndPoint obj)
  124.     st(vlax-curve-getStartPoint obj)
  125.     )
  126. (cond ((= dx0 "LINE")
  127.     (setq plist(append(list st et))))
  128.     ((= dx0 "LWPOLYLINE")
  129. (mapcar '(lambda (x)
  130.             (if (= (car x) 10)
  131.              (setq plist (cons (cdr x) plist))
  132.             )
  133.          )
  134.          (entget en)
  135.      )
  136.      (if(= 1 (dxf 70 x))(setq p0(car plist) plist(append plist (list p0))))
  137. )
  138.      ((OR(= dx0 "SPLINE")(= dx0 "CIRCLE")(= dx0 "ELLIPSE"))
  139. (setq zc(fix zc) k 0)
  140. (command "_.divide" x zc)
  141. (setq snew(ssget "p"))
  142. (repeat (sslength snew)
  143. (setq s(ssname snew k))
  144. (setq dx(dxf 10 s))
  145. (setq plist(cons dx plist))
  146. (setq k(1+ k))
  147. )
  148. (command "erase" snew "")
  149.      (setq plist(reverse plist))
  150.      (IF(/= dx0 "SPLINE")
  151.      (setq plist(append plist (list et)))
  152.      (setq plist(append (list st) plist (list et)))
  153.      )
  154.      )
  155. )
  156. (entdel x)
  157. plist
  158. )




这个程序有两个缺点,麻烦高手帮忙修改一下。
第一个,程序循环不稳定有时候可以有时不可以用
第二个,每次用完,对象捕捉全部没有。
谢谢,修改完重新上传一下。

本帖子中包含更多资源

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

x
发表于 2010-8-6 00:08:00 | 显示全部楼层

 

设置对象捕捉如下红色部分代码

 

;;可点可框的修剪

(defun c:tt (/ PO SS I J S1 P1 P2 )

(vl-load-com)

(setq osvalue (getvar "osmode"))

(SETVAR "CMDECHO" 0)

(setvar "osmode" 0)

。。。。。。。。。。。。

。。。。。。。

。。。。。。。

 

  (setvar "osmode" osvalue )
  (setvar "ORTHOMODE" 1)

 


 

 楼主| 发表于 2010-8-6 21:33:00 | 显示全部楼层
后面这一段LSP具体加在哪个位置的?
发表于 2010-8-9 00:27:00 | 显示全部楼层

这个程序有两个缺点,麻烦高手帮忙修改一下。

第一个,程序循环不稳定有时候可以有时不可以用

第二个,每次用完,对象捕捉全部没有。

谢谢,修改完重新上传一下。

 

 

 

回楼主,我试过程序没有发现第一个缺点的现象呀,捕捉设置已经添加完成,请试用一下吧

本帖子中包含更多资源

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

x
 楼主| 发表于 2010-8-9 20:11:00 | 显示全部楼层

呵呵,AMTONNY 真是麻烦你,谢谢。

发表于 2012-2-8 12:01:41 | 显示全部楼层
发表于 2012-12-21 22:41:21 | 显示全部楼层
本帖最后由 004 于 2012-12-21 22:42 编辑

http://zml84.blog.sohu.com
  1. ;;;==========================================

  2. ;;;功能:可以框选的修剪
  3. ;;;日期:ZML84 于 2007-08-20
  4. ;;;==========================================
  5. (defun C:TT (/ S1 S2 PT1 PT2 CMDECHO_OLD OSMODE_OLD I XX)
  6.     (princ "\n★★可以框选的修剪★★")
  7.     (setq CMDECHO_OLD (getvar "CMDECHO")
  8.           OSMODE_OLD  (getvar "OSMODE")
  9.     )
  10.     (setvar "CMDECHO" 0)
  11.     (setvar "OSMODE" 0)
  12.     (princ
  13.         (strcat
  14.             "\n当前设置:投影="
  15.             (nth (getvar "PROJMODE") '("不投影" "当前UCS" "当前视图"))
  16.             ",边="
  17.             (nth (getvar "EDGEMODE") '("不延伸" "延伸"))
  18.         )
  19.     )
  20.     (princ "\n选择剪切边...")
  21.     ;;若没有选取边界,就将全部对象作为边界
  22.     (if        (setq S1 (ssget))
  23.         ()
  24.         (setq S1 (ssget "all"))
  25.     )
  26.     (while (progn (initget 4 "P E U")
  27.                   (setq        PT1
  28.                            (getpoint
  29.                                "\n选择要修剪的对象,或 [投影(P)/边(E)/放弃(U)]:"
  30.                            )
  31.                   )
  32.            )
  33.         (cond
  34.             ;;分支一:投影选项设置
  35.             ((= PT1 "P")
  36.              (progn
  37.                  (initget 4)
  38.                  (setq
  39.                      XX        (getint
  40.                             (strcat
  41.                                 "\n输入投影选项 [无(0)/UCS(1)/视图(2)] <"
  42.                                 (itoa (getvar "PROJMODE"))
  43.                                 ">:"
  44.                             )
  45.                         )
  46.                  )
  47.                  (if (or (= XX 0) (= XX 1) (= XX 2))
  48.                      (setvar "PROJMODE" XX)
  49.                  )
  50.              )
  51.             )
  52.             ;;分支二:边延伸选项设置
  53.             ((= PT1 "E")
  54.              (progn
  55.                  (initget 4)
  56.                  (setq XX (getint
  57.                               (strcat
  58.                                   "\n输入隐含边延伸模式 [不延伸(0)/延伸(1)] <"
  59.                                   (itoa (getvar "EDGEMODE"))
  60.                                   ">:"
  61.                               )
  62.                           )
  63.                  )
  64.                  (if (or (= XX 0) (= XX 1))
  65.                      (setvar "EDGEMODE" XX)
  66.                  )
  67.              )
  68.             )
  69.             ;;分支四:撤销上一步操作
  70.             ((= PT1 "U")
  71.              (command "_.undo" 1)
  72.             )
  73.             ;;分支五:对选中的对象进行修剪操作
  74.             ((listp PT1)
  75.              (progn
  76.                  (if (setq S2 (ssget PT1))
  77.                      (progn
  78.                          (command "_.undo" "be")
  79.                          (command "_.trim" S1 "" S2 "")
  80.                          (command "_.undo" "e")
  81.                      )
  82.                      (if (and (setq PT2
  83.                                        (getcorner PT1
  84.                                                   " >>>第二角点: "
  85.                                        )
  86.                               )
  87.                               (setq S2 (ssget "c" PT1 PT2))
  88.                          )
  89.                          (progn
  90.                              (command "_.undo" "be")
  91.                              (command "_.trim" S1 "")
  92.                              (setq I 0)
  93.                              (repeat (sslength S2)
  94.                                  (command
  95.                                      (list (ssname S2 I) PT1)
  96.                                  )
  97.                                  (setq I (1+ I))
  98.                              )
  99.                              (command "")
  100.                              (command "_.undo" "e")
  101.                          )
  102.                          (princ "\n★未选择到对象。")
  103.                      )
  104.                  )
  105.              )
  106.             ) ;_结束 分支五
  107.         ) ;_结束 cond 结束分支
  108.     ) ;_结束 while
  109.     (setvar "OSMODE" OSMODE_OLD)
  110.     (setvar "CMDECHO" CMDECHO_OLD)
  111.     (princ "\n★正常结束。谢谢使用。")
  112.     (princ)
  113. ) ;_结束 defun
  114. ;;;===========================================================
  115. (alert (princ "\n★可以框选的修剪。\n键入命令\"TT\"执行。"))
  116. (princ)

发表于 2012-12-23 21:49:20 | 显示全部楼层
高板的cad不是自带吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-3 09:47 , Processed in 0.158982 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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