明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6094|回复: 17

[源码] 【方案讨论】CAD2006以下版本使用的框选剪切与延伸-------方案1

[复制链接]
发表于 2013-6-4 17:07:33 | 显示全部楼层 |阅读模式
本帖最后由 wowan1314 于 2013-6-12 20:12 编辑

                                                  支持块内线的----CAD2006以下用的框选剪切与延伸
          最近发的两个函数,yy:getpoint与yy:getcorner.    大家认为不太实用。
其实那两函数主要是为了这个程序写的,其他方面的应用得看具体的程序要求了。

CAD2004唯一的不爽就是剪切与延伸不能框选。。。以前也发过可以框选的但不支持块内线。。

所以一直想着修正这个缺点。 这个程序还不是很完善,大家有好的建议请不吝赐教。共同完善此程序。
  1. ;;;===============================================================================;;;
  2. ;;;功能:可以点选和框选的修剪和延伸命令------BY wowan1314  ---支持块内线          ;;;
  3. ;;;===============================================================================;;;
  4. (defun c:W ( / NJIAN NJIANC) (trim&extend1 T)  )
  5. (defun c:Z ( / NJIAN NJIANC) (trim&extend1 nil) )
  6. (defun trim&extend1 (cmd / S1 S2 PT1 PT2 CMDECHO_OLD I XX  YY:EXBLKH_SS YY:SSGET ENT EN YPT X Y PT liangx
  7.                            error_end error zhuj2 zhuj1 PT3 PT4 OLDERR D2 SS1)  
  8. ;;===============================增加循环框选,右键结束.
  9. (DEFUN YY:SSGET (/ SS2 SS SS3 PT1 SSK)
  10. ;YY:SSGET主程序
  11. (SETQ SS1 (SSADD) SS2 (SSADD) SS3 (SSADD) PT1 1 SSK (SSADD))
  12. (while PT1
  13.   (SETQ PT1 (YY:GETPOINT '(T 12 2))) (IF PT1 (PROGN
  14.   (SETQ SS (YY:EXBLKH_SS PT1 SS3))
  15.   (AND (CAR SS) (SETQ SS1 (gxl-Sel-SSJoin SS1 (CAR SS))))
  16.   (AND (CADR SS) (SETQ SS2 (gxl-Sel-SSJoin SS2 (CADR SS))) (SETQ NJIAN SS2))
  17.   (AND (CADDR SS) (SETQ SS3 (gxl-Sel-SSJoin SS3 (CADDR SS))))
  18.   (AND (>(sslength ss1)0)(liangxian ss1 3))
  19.               ))
  20. )
  21. (LIST SS1 SS2 SS3)
  22. )

  23. ;;------------框选一次,如果有块,块炸到底,最后得到范围内除块和标注外的其他物体选择集
  24. (DEFUN YY:EXBLKH_SS (P1 SS3 / P2 SS E0 SS0 SS1 S2 KC YANSE)
  25. (if (setq S2 (ssget P1 '((0 . "~DIMENSION"))))
  26.   (PROGN
  27.     (IF (AND (ssget P1 '((0 . "INSERT"))) (SETQ SS (gxl-Sel-SSsub S2 SS3)))
  28.        (PROGN
  29.     (ss:map '(lambda (x)   
  30.         (command "_.copy" X "" "0,0" "@")
  31.        (setq e0 (entlast) KC (DXF_READ 8 E0) YANSE (DXF_READ 62 (tblobjname "layer" KC)))
  32.       (YY:EXBLKALL E0);;块炸到底
  33.        (setq ss0 (last_ent e0));;块砸开后的物体集
  34.        (ss:map '(lambda (x) (AND (NOT(DXF_READ 62 X)) (YY_SubUpd X 62 YANSE)) ) SS0)
  35.         (SETQ SSK (gxl-Sel-SSJoin SS0 SSK) NJIAN SSK)
  36.       )
  37.      ss
  38.     )(SETQ P1 (osnap P1 "_near"))
  39.      (SETQ SS1 (ssget P1 '((-4 . "<AND")
  40.     (0 . "~DIMENSION")
  41.     (0 . "~INSERT")
  42.     (-4 . "AND>"))))
  43.    )
  44.   (SETQ SS1 S2)
  45.   ))
  46.   (IF (CAR(SETQ P2 (YY:GETcorner P1 NIL 1314 NIL)))
  47.    (PROGN
  48.    (IF (SETQ SS (SSGET (if (minusp (CADR P2)) "_c" "_w") P1 (CAR P2) '((0 . "INSERT"))))
  49.     (PROGN
  50.     (SETQ SS (gxl-Sel-SSsub SS SS3))
  51.     (ss:map '(lambda (x)   
  52.         (command "_.copy" X "" "0,0" "@")
  53.        (setq e0 (entlast) KC (DXF_READ 8 E0) YANSE (DXF_READ 62 (tblobjname "layer" KC)))
  54.       (YY:EXBLKALL E0);;块炸到底
  55.        (setq ss0 (last_ent e0));;块砸开后的物体集
  56.        (ss:map '(lambda (x) (AND (NOT(DXF_READ 62 X)) (YY_SubUpd X 62 YANSE)) ) SS0)
  57.         (SETQ SSK (gxl-Sel-SSJoin SS0 SSK) NJIAN SSK)
  58.       )
  59.      ss
  60.     ))
  61.    )
  62.    (SETQ SS1 (SSGET (if (minusp (CADR P2)) "_c" "_w") P1 (CAR P2)
  63.     '((-4 . "<AND")
  64.     (0 . "~DIMENSION")
  65.     (0 . "~INSERT")
  66.     (-4 . "AND>"))))))
  67. )
  68. (LIST SS1 SSK SS)
  69. )
  70. ;;-------------------------------出错函数
  71.    (defun error (x) (error_end))
  72.    (defun error_end ( / D2)
  73.       (setq *error* olderr)
  74.       (setvar "osmode" snap);打开捕捉
  75.      (IF S1 (liangxian s1 4 )) (IF SS1 (liangxian sS1 4 ))
  76.      (IF (AND NJIAN (>(SSLENGTH NJIAN)0))
  77.            (IF NJIANC (PROGN
  78.               (AND (tblobjname "layer" "NJIAN")(command ".Layer" "U" "NJIAN" ""))
  79.               (COMMAND "ERASE" NJIAN "") (SETQ D2 (VL-CATCH-ALL-APPLY 'VLA-deLETE (LIST NJIANC)))
  80.               (if(VL-CATCH-ALL-ERROR-P d2) (command "_.undo" "e"))
  81.                       )
  82.               (COMMAND "ERASE" NJIAN "")
  83.            )
  84.      )
  85.      (command "_.undo" "e")
  86.       (if cm (setvar "cmdecho" cm))
  87.    )
  88. ;;;剪切主程序开始
  89.    (setq olderr *error* *error* error)
  90.    (setq CMDECHO_OLD (getvar "CMDECHO"))
  91.    (setvar "CMDECHO" 0)
  92.    (redraw)
  93.    (setq liangx 1)

  94.    (if cmd
  95.       (setq cmd "_.trim"  zhuj1  "\n选择剪切边,或:<选择全部>:"  zhuj2    "\n选择要修剪的对象,或 [栏选(F)/投影(P)/边(E)/放弃(U)]:" )
  96.       (setq cmd "_.extend"  zhuj1  "\n选择边界的边,或:<选择全部>:"  zhuj2   "\n选择要延伸的对象,或 [栏选(F)/投影(P)/边(E)/放弃(U)]:" )
  97.    )

  98.    (princ zhuj1)
  99.    ;;若没有选取边界,就将全部对象作为边界
  100.    (setq snap (getvar "osmode"))

  101. (IF (CADR (SSGETFIRST))(PROGN
  102.   (SETQ S1 (ssget ":S" '((-4 . "<AND")
  103.     (0 . "~DIMENSION")
  104.     (0 . "~INSERT")
  105.     (-4 . "AND>")))
  106.   ) (command "_.undo" "be")(setvar "osmode" 0))
  107. (PROGN
  108. ;   (setvar "nomutt" 1)
  109.   (command "_.undo" "be")
  110. (setvar "osmode" 0)
  111.    (if (AND (CAR(setq S1 (YY:ssget))) (>(SSLENGTH (CAR S1))0))
  112.       (SETQ NJIAN (CADR S1) S1 (CAR S1))
  113.       (progn
  114.          (setq S1 (ssget "all"))
  115.          (setq liangx NIL)
  116.       )
  117.    )
  118. ;   (setvar "nomutt" 0)
  119. (IF (AND NJIAN (>(SSLENGTH NJIAN)0)) (PROGN
  120. (SETQ NJIANC (VLA-ADD (VLA-GET-LAYERS(vla-get-ActiveDocument (vlax-get-acad-object))) "NJIAN"))
  121. (command ".chprop" NJIAN "" "layer" "NJIAN" "")
  122. (command ".Layer" "Lo" "NJIAN" "" )))
  123. );END PROGN
  124. );END IF

  125. (IF (NULL S1)
  126. (PROGN (princ zhuj1)
  127. ;   (setvar "nomutt" 1)
  128.   (command "_.undo" "be")
  129. (setvar "osmode" 0)
  130.    (if (AND (CAR(setq S1 (YY:ssget))) (>(SSLENGTH (CAR S1))0))
  131.       (SETQ NJIAN (CADR S1) S1 (CAR S1))
  132.       (progn
  133.          (setq S1 (ssget "all"))
  134.          (setq liangx NIL)
  135.       )
  136.    )
  137. ;   (setvar "nomutt" 0)
  138. (IF (AND NJIAN (>(SSLENGTH NJIAN)0)) (PROGN
  139. (SETQ NJIANC (VLA-ADD (VLA-GET-LAYERS(vla-get-ActiveDocument (vlax-get-acad-object))) "NJIAN"))
  140. (command ".chprop" NJIAN "" "layer" "NJIAN" "")
  141. (command ".Layer" "Lo" "NJIAN" "" )))
  142. );END PROGN
  143. )

  144. (liangxian S1 3 )
  145. (SETQ PT1 1)
  146.    (while PT1
  147.       (SETQ PT1 (YY:GETPOINT '(T 12 2)))
  148.       (princ zhuj2)
  149.   (cond
  150.       ;;分支零下一:栏选
  151.         ((= PT1 "F")
  152.          (PROGN
  153.            (SETQ PT1 (VECTORS))
  154.            (command cmd S1 "")
  155.            (apply 'command (append (LIST "F") PT1 (LIST "")))
  156.            (COMMAND "")))
  157.       ;;分支一:投影选项设置
  158.         ((= PT1 "P")
  159.        (progn
  160.        (initget 4)
  161.        (setq
  162.            XX (getint (strcat "\n输入投影选项 [无(0)/UCS(1)/视图(2)] <" (itoa (getvar "PROJMODE"))  ">:"  ) )
  163.        )
  164.        (if (or (= XX 0) (= XX 1) (= XX 2))
  165.              (setvar "PROJMODE" XX)
  166.        )
  167.        )
  168.       )
  169.       ;;分支二:边延伸选项设置
  170.         ((= PT1 "E")
  171.        (progn
  172.        (initget 4)
  173.        (setq XX (getint
  174.                 (strcat
  175.                   "\n输入隐含边延伸模式 [不延伸(0)/延伸(1)] <"
  176.                   (itoa (getvar "EDGEMODE"))
  177.                   ">:"
  178.                 )
  179.             )
  180.        )
  181.        (if (or (= XX 0) (= XX 1))
  182.              (setvar "EDGEMODE" XX)
  183.        )
  184.        )
  185.       )
  186.       ;;分支四:撤销上一步操作
  187.         ((= PT1 "U")
  188.          (command "_.undo" 1)
  189.       )
  190.       ;;分支五:对选中的对象进行修剪操作
  191.       ((listp PT1)
  192.       (progn
  193.       (if (setq S2 (ssget PT1 (getunlocklayer 0)))
  194.         (IF LIANGX
  195.           (progn
  196.              (command cmd S1 "" S2 "")
  197.              (liangxian s1 3 )
  198.           )
  199.           (progn
  200.              (command cmd "" S2 "")
  201.              (liangxian s1 3 )
  202.           )
  203.         )
  204.           (if (and (NULL (INITGET 32))
  205.                    (setq PT2 (getcorner PT1 " >>>第二角点: "))
  206.                    (setq S2 (ssget "c" PT1 PT2))
  207.               )
  208.            (IF LIANGX
  209.              (progn           
  210.                 (command cmd S1 "")
  211.                   (progn
  212.                   (setq pt3 (list (car pt1) (cadr pt2) 0.0)
  213.                         pt4 (list (car pt2) (cadr pt1) 0.0)
  214.                   )
  215.                   (command "F" pt1 pt3 pt2 pt4 PT1 "")
  216.                   )
  217.                   (command "")
  218.                 (liangxian s1 3 )
  219.                  
  220.              )
  221.              (progn           
  222.                 (command cmd "")
  223.                   (progn
  224.                   (setq pt3 (list (car pt1) (cadr pt2) 0.0)
  225.                         pt4 (list (car pt2) (cadr pt1) 0.0)
  226.                   )
  227.                   (command "F" pt1 pt3 pt2 pt4 PT1 "")
  228.                   )
  229.                   (command "")
  230.                 (liangxian s1 3 )
  231.                  
  232.              ))
  233.              (princ "\n★未选择到对象。")
  234.          )
  235.      )
  236.      )
  237.       ) ;_结束 分支五
  238.   ) ;_结束 cond 结束分支
  239.    ) ;_结束 while
  240.    (error_end)
  241.    (princ)
  242. ) ;_结束 defun

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-6-4 17:09:23 | 显示全部楼层
顶顶更健康
发表于 2013-6-4 18:43:36 来自手机 | 显示全部楼层
下来学习,虽然早不低版本了。支持源码
发表于 2013-6-4 21:20:10 | 显示全部楼层
支持原碼.學習學習.
发表于 2013-6-5 14:14:20 | 显示全部楼层
注意
2002
不能使用
发表于 2013-6-6 17:58:08 | 显示全部楼层
现在似乎没有多少人在用08以下的版本了吧
发表于 2013-6-6 19:40:50 | 显示全部楼层
谢谢楼主的分享!收藏备用。试了,很好用!
 楼主| 发表于 2013-6-6 20:17:13 | 显示全部楼层
本帖最后由 wowan1314 于 2013-6-6 23:03 编辑
清风明月名字 发表于 2013-6-6 19:40
谢谢楼主的分享!收藏备用。试了,很好用!

程序还在调试阶段。 还有不少BUG存在。  不适合使用!

如:1、大量的块会卡顿。而此时按ESC会有块内物体遗留。

      2、块内图层被锁定的话,程序就不能运行了。
发表于 2013-6-6 21:25:10 | 显示全部楼层
希望楼主大大再增加Z坐标归零和炸开多段线,扩展字典线的功能,这个修剪就更强大了。
 楼主| 发表于 2013-6-6 23:26:59 | 显示全部楼层
我的本意只要做个与高版本剪切以为的程序!限于本人水平,这个基本功能都没实现呢!其他附加的功能更无从谈起了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 00:53 , Processed in 0.216141 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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