wowan1314 发表于 2013-6-4 17:07:33

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

本帖最后由 wowan1314 于 2013-6-12 20:12 编辑

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

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

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

;;------------框选一次,如果有块,块炸到底,最后得到范围内除块和标注外的其他物体选择集
(DEFUN YY:EXBLKH_SS (P1 SS3 / P2 SS E0 SS0 SS1 S2 KC YANSE)
(if (setq S2 (ssget P1 '((0 . "~DIMENSION"))))
(PROGN
    (IF (AND (ssget P1 '((0 . "INSERT"))) (SETQ SS (gxl-Sel-SSsub S2 SS3)))
       (PROGN
    (ss:map '(lambda (x)   
      (command "_.copy" X "" "0,0" "@")
       (setq e0 (entlast) KC (DXF_READ 8 E0) YANSE (DXF_READ 62 (tblobjname "layer" KC)))
      (YY:EXBLKALL E0);;块炸到底
       (setq ss0 (last_ent e0));;块砸开后的物体集
       (ss:map '(lambda (x) (AND (NOT(DXF_READ 62 X)) (YY_SubUpd X 62 YANSE)) ) SS0)
      (SETQ SSK (gxl-Sel-SSJoin SS0 SSK) NJIAN SSK)
      )
   ss
    )(SETQ P1 (osnap P1 "_near"))
   (SETQ SS1 (ssget P1 '((-4 . "<AND")
    (0 . "~DIMENSION")
    (0 . "~INSERT")
    (-4 . "AND>"))))
   )
(SETQ SS1 S2)
))
(IF (CAR(SETQ P2 (YY:GETcorner P1 NIL 1314 NIL)))
   (PROGN
   (IF (SETQ SS (SSGET (if (minusp (CADR P2)) "_c" "_w") P1 (CAR P2) '((0 . "INSERT"))))
    (PROGN
    (SETQ SS (gxl-Sel-SSsub SS SS3))
    (ss:map '(lambda (x)   
      (command "_.copy" X "" "0,0" "@")
       (setq e0 (entlast) KC (DXF_READ 8 E0) YANSE (DXF_READ 62 (tblobjname "layer" KC)))
      (YY:EXBLKALL E0);;块炸到底
       (setq ss0 (last_ent e0));;块砸开后的物体集
       (ss:map '(lambda (x) (AND (NOT(DXF_READ 62 X)) (YY_SubUpd X 62 YANSE)) ) SS0)
      (SETQ SSK (gxl-Sel-SSJoin SS0 SSK) NJIAN SSK)
      )
   ss
    ))
   )
   (SETQ SS1 (SSGET (if (minusp (CADR P2)) "_c" "_w") P1 (CAR P2)
    '((-4 . "<AND")
    (0 . "~DIMENSION")
    (0 . "~INSERT")
    (-4 . "AND>"))))))
)
(LIST SS1 SSK SS)
)
;;-------------------------------出错函数
   (defun error (x) (error_end))
   (defun error_end ( / D2)
      (setq *error* olderr)
      (setvar "osmode" snap);打开捕捉
   (IF S1 (liangxian s1 4 )) (IF SS1 (liangxian sS1 4 ))
   (IF (AND NJIAN (>(SSLENGTH NJIAN)0))
         (IF NJIANC (PROGN
            (AND (tblobjname "layer" "NJIAN")(command ".Layer" "U" "NJIAN" ""))
            (COMMAND "ERASE" NJIAN "") (SETQ D2 (VL-CATCH-ALL-APPLY 'VLA-deLETE (LIST NJIANC)))
            (if(VL-CATCH-ALL-ERROR-P d2) (command "_.undo" "e"))
                      )
            (COMMAND "ERASE" NJIAN "")
         )
   )
   (command "_.undo" "e")
      (if cm (setvar "cmdecho" cm))
   )
;;;剪切主程序开始
   (setq olderr *error* *error* error)
   (setq CMDECHO_OLD (getvar "CMDECHO"))
   (setvar "CMDECHO" 0)
   (redraw)
   (setq liangx 1)

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

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

(IF (CADR (SSGETFIRST))(PROGN
(SETQ S1 (ssget ":S" '((-4 . "<AND")
    (0 . "~DIMENSION")
    (0 . "~INSERT")
    (-4 . "AND>")))
) (command "_.undo" "be")(setvar "osmode" 0))
(PROGN
;   (setvar "nomutt" 1)
(command "_.undo" "be")
(setvar "osmode" 0)
   (if (AND (CAR(setq S1 (YY:ssget))) (>(SSLENGTH (CAR S1))0))
      (SETQ NJIAN (CADR S1) S1 (CAR S1))
      (progn
         (setq S1 (ssget "all"))
         (setq liangx NIL)
      )
   )
;   (setvar "nomutt" 0)
(IF (AND NJIAN (>(SSLENGTH NJIAN)0)) (PROGN
(SETQ NJIANC (VLA-ADD (VLA-GET-LAYERS(vla-get-ActiveDocument (vlax-get-acad-object))) "NJIAN"))
(command ".chprop" NJIAN "" "layer" "NJIAN" "")
(command ".Layer" "Lo" "NJIAN" "" )))
);END PROGN
);END IF

(IF (NULL S1)
(PROGN (princ zhuj1)
;   (setvar "nomutt" 1)
(command "_.undo" "be")
(setvar "osmode" 0)
   (if (AND (CAR(setq S1 (YY:ssget))) (>(SSLENGTH (CAR S1))0))
      (SETQ NJIAN (CADR S1) S1 (CAR S1))
      (progn
         (setq S1 (ssget "all"))
         (setq liangx NIL)
      )
   )
;   (setvar "nomutt" 0)
(IF (AND NJIAN (>(SSLENGTH NJIAN)0)) (PROGN
(SETQ NJIANC (VLA-ADD (VLA-GET-LAYERS(vla-get-ActiveDocument (vlax-get-acad-object))) "NJIAN"))
(command ".chprop" NJIAN "" "layer" "NJIAN" "")
(command ".Layer" "Lo" "NJIAN" "" )))
);END PROGN
)

(liangxian S1 3 )
(SETQ PT1 1)
   (while PT1
      (SETQ PT1 (YY:GETPOINT '(T 12 2)))
      (princ zhuj2)
(cond
      ;;分支零下一:栏选
      ((= PT1 "F")
         (PROGN
         (SETQ PT1 (VECTORS))
         (command cmd S1 "")
         (apply 'command (append (LIST "F") PT1 (LIST "")))
         (COMMAND "")))
      ;;分支一:投影选项设置
      ((= PT1 "P")
       (progn
       (initget 4)
       (setq
         XX (getint (strcat "\n输入投影选项 [无(0)/UCS(1)/视图(2)] <" (itoa (getvar "PROJMODE"))">:") )
       )
       (if (or (= XX 0) (= XX 1) (= XX 2))
             (setvar "PROJMODE" XX)
       )
       )
      )
      ;;分支二:边延伸选项设置
      ((= PT1 "E")
       (progn
       (initget 4)
       (setq XX (getint
                (strcat
                  "\n输入隐含边延伸模式 [不延伸(0)/延伸(1)] <"
                  (itoa (getvar "EDGEMODE"))
                  ">:"
                )
            )
       )
       (if (or (= XX 0) (= XX 1))
             (setvar "EDGEMODE" XX)
       )
       )
      )
      ;;分支四:撤销上一步操作
      ((= PT1 "U")
         (command "_.undo" 1)
      )
      ;;分支五:对选中的对象进行修剪操作
      ((listp PT1)
      (progn
      (if (setq S2 (ssget PT1 (getunlocklayer 0)))
      (IF LIANGX
          (progn
             (command cmd S1 "" S2 "")
             (liangxian s1 3 )
          )
          (progn
             (command cmd "" S2 "")
             (liangxian s1 3 )
          )
      )
          (if (and (NULL (INITGET 32))
                   (setq PT2 (getcorner PT1 " >>>第二角点: "))
                   (setq S2 (ssget "c" PT1 PT2))
            )
         (IF LIANGX
             (progn         
                (command cmd S1 "")
                  (progn
                  (setq pt3 (list (car pt1) (cadr pt2) 0.0)
                        pt4 (list (car pt2) (cadr pt1) 0.0)
                  )
                  (command "F" pt1 pt3 pt2 pt4 PT1 "")
                  )
                  (command "")
                (liangxian s1 3 )
               
             )
             (progn         
                (command cmd "")
                  (progn
                  (setq pt3 (list (car pt1) (cadr pt2) 0.0)
                        pt4 (list (car pt2) (cadr pt1) 0.0)
                  )
                  (command "F" pt1 pt3 pt2 pt4 PT1 "")
                  )
                  (command "")
                (liangxian s1 3 )
               
             ))
             (princ "\n★未选择到对象。")
         )
   )
   )
      ) ;_结束 分支五
) ;_结束 cond 结束分支
   ) ;_结束 while
   (error_end)
   (princ)
) ;_结束 defun

maiko 发表于 2013-6-4 17:09:23

顶顶更健康

kwok 发表于 2013-6-4 18:43:36

下来学习,虽然早不低版本了。支持源码

xiaoyuzj-503 发表于 2013-6-4 21:20:10

支持原碼.學習學習.

crtrccrt 发表于 2013-6-5 14:14:20

注意
2002
不能使用

shalei021647 发表于 2013-6-6 17:58:08

现在似乎没有多少人在用08以下的版本了吧

清风明月名字 发表于 2013-6-6 19:40:50

谢谢楼主的分享!收藏备用。试了,很好用!

wowan1314 发表于 2013-6-6 20:17:13

本帖最后由 wowan1314 于 2013-6-6 23:03 编辑

清风明月名字 发表于 2013-6-6 19:40 static/image/common/back.gif
谢谢楼主的分享!收藏备用。试了,很好用!
程序还在调试阶段。 还有不少BUG存在。不适合使用!

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

      2、块内图层被锁定的话,程序就不能运行了。

crazylsp 发表于 2013-6-6 21:25:10

希望楼主大大再增加Z坐标归零和炸开多段线,扩展字典线的功能,这个修剪就更强大了。

wowan1314 发表于 2013-6-6 23:26:59

我的本意只要做个与高版本剪切以为的程序!限于本人水平,这个基本功能都没实现呢!其他附加的功能更无从谈起了!
页: [1] 2
查看完整版本: 【方案讨论】CAD2006以下版本使用的框选剪切与延伸-------方案1