明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2239|回复: 6

<求助>关于把同一Lisp文件下的几个命令整合成一个可选择状态<已解决>

[复制链接]
发表于 2011-10-23 23:57:24 | 显示全部楼层 |阅读模式
本帖最后由 ㄘ丶转裑ㄧ灬 于 2011-10-24 14:16 编辑



              在网上载了一段打断相交直线的LSP,就是很多人都知道的breakall,下面是代码.
    本人刚接触LSP的编程,额、、不到一个月,呵呵,所以现在只会修改里面的命令(别笑哈)!
    下面的代码我去掉了几个命令,只留了我需要的3个,不知道算不算侵权,呵呵!

    现在我想叫大家帮忙的是:
             怎么把那3个命令(BreakAll、BreakWith、BreakSelected)合并成一个命令,效果是这样的:
                                                  命令: dd
                                                 输入选项 [全部(A)/相对(W)/已选(S)]<全部>:
             额,不知道我表达的大家能看懂不,有什么不详细的地方大家可以提出来,谢谢!

  1. (defun break_with (ss2brk        ss2brkwith   self          /
  2.                    cmd                intpts             lst          masterlist
  3.                    ss                ssobjs             onlockedlayer
  4.                    ssget->vla-list             list->3pair  get_interpts
  5.                    break_obj
  6.                   )
  7.   (vl-load-com)
  8.   (defun onlockedlayer (ename / entlst)
  9.     (setq entlst (tblsearch "LAYER" (cdr (assoc 8 (entget ename)))))
  10.     (= 4 (logand 4 (cdr (assoc 70 entlst))))
  11.   )

  12.   (defun ssget->vla-list (ss / i ename lst)
  13.     (setq i -1)
  14.     (while (setq ename (ssname ss (setq i (1+ i))))
  15.       (setq lst (cons (vlax-ename->vla-object ename) lst))
  16.     )
  17.     lst
  18.   )

  19.   (defun list->3pair (old / new)
  20.     (while (setq new (cons (list (car old) (cadr old) (caddr old)) new)
  21.                  old (cdddr old)
  22.            )
  23.     )
  24.     (reverse new)
  25.   )
  26.   (defun get_interpts (obj1 obj2 / iplist)
  27.     (if        (not
  28.           (vl-catch-all-error-p
  29.             (setq
  30.               iplist (vl-catch-all-apply
  31.                        'vlax-safearray->list
  32.                        (list
  33.                          (vlax-variant-value
  34.                            (vla-intersectwith obj1 obj2 acextendnone)
  35.                          )
  36.                        )
  37.                      )
  38.             )
  39.           )
  40.         )
  41.       iplist
  42.     )
  43.   )
  44.   (defun break_obj (ent               brkptlst          /             brkobjlst
  45.                     en               enttype          maxparam   closedobj
  46.                     minparam   obj          obj2break  p1param
  47.                     p2               p2param
  48.                    )

  49.     (setq obj2break ent
  50.           brkobjlst (list ent)
  51.           enttype   (cdr (assoc 0 (entget ent)))
  52.     )

  53.     (foreach brkpt brkptlst
  54.       (if brkobjlst
  55.         (progn
  56.           (if (not (numberp (vl-catch-all-apply
  57.                               'vlax-curve-getdistatpoint
  58.                               (list obj2break brkpt)
  59.                             )
  60.                    )
  61.               )
  62.             (foreach obj brkobjlst
  63.               (if (numberp (vl-catch-all-apply
  64.                              'vlax-curve-getdistatpoint
  65.                              (list obj brkpt)
  66.                            )
  67.                   )
  68.                 (setq obj2break obj)
  69.               )
  70.             )
  71.           )
  72.         )
  73.       )
  74.       (cond
  75.         ((and (= "SPLINE" enttype)
  76.               (vlax-curve-isclosed obj2break)
  77.          )
  78.          (setq p1param (vlax-curve-getparamatpoint obj2break brkpt)
  79.                p2      (vlax-curve-getpointatparam
  80.                          obj2break
  81.                          (+ p1param 0.000001)
  82.                        )
  83.          )
  84.          (command "._break"
  85.                   obj2break
  86.                   "_non"
  87.                   (trans brkpt 0 1)
  88.                   "_non"
  89.                   (trans p2 0 1)
  90.          )
  91.         )
  92.         ((= "CIRCLE" enttype)
  93.          (setq p1param (vlax-curve-getparamatpoint obj2break brkpt)
  94.                p2      (vlax-curve-getpointatparam
  95.                          obj2break
  96.                          (+ p1param 0.000001)
  97.                        )
  98.          )
  99.          (command "._break"
  100.                   obj2break
  101.                   "_non"
  102.                   (trans brkpt 0 1)
  103.                   "_non"
  104.                   (trans p2 0 1)
  105.          )
  106.          (setq enttype "ARC")
  107.         )
  108.         ((and (= "ELLIPSE" enttype)
  109.               (vlax-curve-isclosed obj2break)
  110.          )
  111.          (setq p1param        (vlax-curve-getparamatpoint obj2break brkpt)
  112.                p2param        (+ p1param 0.000001)
  113.                minparam        (min p1param p2param)
  114.                maxparam        (max p1param p2param)
  115.                obj        (vlax-ename->vla-object obj2break)
  116.          )
  117.          (vlax-put obj 'startparameter maxparam)
  118.          (vlax-put obj 'endparameter (+ minparam (* pi 2)))
  119.         )
  120.         (t
  121.          (setq closedobj (vlax-curve-isclosed obj2break))
  122.          (command "._break"
  123.                   obj2break
  124.                   "_non"
  125.                   (trans brkpt 0 1)
  126.                   "_non"
  127.                   (trans brkpt 0 1)
  128.          )
  129.          (if (not closedobj)
  130.            (setq brkobjlst (cons (entlast) brkobjlst))
  131.          )
  132.         )
  133.       )
  134.     )
  135.   )
  136.   (if (and ss2brk ss2brkwith)
  137.     (progn
  138.       (foreach obj (ssget->vla-list ss2brk)
  139.         (if (not (onlockedlayer (vlax-vla-object->ename obj)))
  140.           (progn
  141.             (setq lst nil)
  142.             (foreach intobj (ssget->vla-list ss2brkwith)
  143.               (if (and (or self (not (equal obj intobj)))
  144.                        (setq intpts (get_interpts obj intobj))
  145.                   )
  146.                 (setq lst (append (list->3pair intpts) lst))
  147.               )
  148.             )
  149.             (if        lst
  150.               (setq masterlist
  151.                      (cons (cons (vlax-vla-object->ename obj) lst)
  152.                            masterlist
  153.                      )
  154.               )
  155.             )
  156.           )
  157.         )
  158.       )
  159.       (if masterlist
  160.         (foreach obj2brk masterlist
  161.           (break_obj (car obj2brk) (cdr obj2brk))
  162.         )
  163.       )
  164.     )
  165.   )

  166. )
  167. (princ)
  168. ;-------------------------------------------打断所有直线
  169. (defun c:breakall (/ cmd ss)

  170.   (command "._undo" "_begin")
  171.   (setq cmd (getvar "CMDECHO"))
  172.   (setvar "CMDECHO" 0)
  173.   (prompt "\nSelect All objects to break & press enter: ")
  174.   (if (setq ss
  175.              (ssget
  176.                '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))
  177.              )
  178.       )
  179.     (Break_with ss ss nil)
  180.   )

  181.   (setvar "CMDECHO" cmd)
  182.   (command "._undo" "_end")
  183.   (princ)
  184. )
  185. (defun c:BreakObject (/ cmd ss1 ss2)

  186.   (command "._undo" "_begin")
  187.   (setq cmd (getvar "CMDECHO"))
  188.   (setvar "CMDECHO" 0)
  189.   (prompt "\nSelect single object to break: ")
  190.   (if
  191.     (and (setq
  192.            ss1 (ssget
  193.                  "+.:E:S"
  194.                  '((0
  195.                     .
  196.                     "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
  197.                    )
  198.                   )
  199.                )
  200.          )
  201.          (not (redraw (ssname ss1 0) 3))
  202.          (not
  203.            (prompt
  204.              "\n***  Select object(s) to break with & press enter:  ***"
  205.            )
  206.          )
  207.          (setq
  208.            ss2 (ssget
  209.                  '((0
  210.                     .
  211.                     "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
  212.                    )
  213.                   )
  214.                )
  215.          )
  216.          (not (redraw (ssname ss1 0) 4))
  217.     )
  218.      (Break_with ss1 ss2 nil)
  219.   )

  220.   (setvar "CMDECHO" cmd)
  221.   (command "._undo" "_end")
  222.   (princ)
  223. )

  224. ;-----------------------------------用所选直线打断其他线(所选直线不打断)
  225. (defun c:BreakWith (/ cmd ss1 ss2)
  226.   (defun ssredraw (ss mode / i num)
  227.     (setq i -1)
  228.     (while (setq ename (ssname ss (setq i (1+ i))))
  229.       (redraw (ssname ss i) mode)
  230.     )
  231.   )
  232.   (command "._undo" "_begin")
  233.   (setq cmd (getvar "CMDECHO"))
  234.   (setvar "CMDECHO" 0)
  235.   (prompt "\nSelect object(s) to break & press enter: ")
  236.   (if
  237.     (and (setq
  238.            ss1 (ssget
  239.                  '((0
  240.                     .
  241.                     "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
  242.                    )
  243.                   )
  244.                )
  245.          )
  246.          (not (ssredraw ss1 3))
  247.          (not
  248.            (prompt
  249.              "\n***  Select object(s) to break with & press enter:  ***"
  250.            )
  251.          )
  252.          (setq
  253.            ss2 (ssget
  254.                  '((0
  255.                     .
  256.                     "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
  257.                    )
  258.                   )
  259.                )
  260.          )
  261.          (not (ssredraw ss1 4))
  262.     )
  263.      (break_with ss1 ss2 nil)
  264.   )

  265.   (setvar "CMDECHO" cmd)
  266.   (command "._undo" "_end")
  267.   (princ)
  268. )

  269. ;------------------------有交点处全打断(只限所选直线)

  270. (defun c:BreakSelected (/ cmd ss1 ss2)
  271.   (defun gettouching (sscros / ss lst lstb lstc objl)
  272.     (and
  273.       (setq lstb (vl-remove-if 'listp (mapcar 'cadr (ssnamex sscros)))
  274.             objl (mapcar 'vlax-ename->vla-object lstb)
  275.       )
  276.       (setq
  277.         ss
  278.          (ssget
  279.            "_A"
  280.            (list
  281.              (cons 0
  282.                    "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
  283.              )
  284.              (cons 410 (getvar "ctab"))
  285.            )
  286.          )
  287.       )
  288.       (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  289.       (setq lst (mapcar 'vlax-ename->vla-object lst))
  290.       (mapcar
  291.         '(lambda (x)
  292.            (mapcar
  293.              '(lambda (y)
  294.                 (if (not
  295.                       (vl-catch-all-error-p
  296.                         (vl-catch-all-apply
  297.                           '(lambda ()
  298.                              (vlax-safearray->list
  299.                                (vlax-variant-value
  300.                                  (vla-intersectwith y x acextendnone)
  301.                                )
  302.                              )
  303.                            )
  304.                         )
  305.                       )
  306.                     )
  307.                   (setq lstc (cons (vlax-vla-object->ename x) lstc))
  308.                 )
  309.               )
  310.              objl
  311.            )
  312.          )
  313.         lst
  314.       )
  315.     )
  316.     lstc
  317.   )

  318.   (command "._undo" "_begin")
  319.   (setq cmd (getvar "CMDECHO"))
  320.   (setvar "CMDECHO" 0)
  321.   (setq ss1 (ssadd))
  322.   (if
  323.     (and (not
  324.            (prompt "\nSelect object(s) to break with & press enter: ")
  325.          )
  326.          (setq
  327.            ss2 (ssget
  328.                  '((0
  329.                     .
  330.                     "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
  331.                    )
  332.                   )
  333.                )
  334.          )
  335.          (mapcar '(lambda (x) (ssadd x ss1)) (gettouching ss2))
  336.     )
  337.      (break_with ss2 ss1 nil)
  338.   )

  339.   (setvar "CMDECHO" cmd)
  340.   (command "._undo" "_end")
  341.   (princ)
  342. )


点评

诋毁名誉和未经同意获取商业利益谓之侵权  发表于 2011-10-24 00:32
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2011-10-24 09:41:27 | 显示全部楼层

嗯,两条都没有,所以不算侵权,呵呵!

有谁能解决不,可能对高手来说这比较简单,但我真的不会、、、
发表于 2011-10-24 13:12:49 | 显示全部楼层
  1. (defun c:dd(/ kd)
  2. (initget 7 "W A S  ")
  3. (setq kd (getkword "\n输入选项[全部<A>/相对<W>/已选<S>]<全部>:"))
  4. (cond ((= "W" kd) (c:BreakWith))
  5.         ((= "S" kd) (c:BreakSelected))
  6.          (t (c:breakall ))
  7. )
  8. (princ)
  9. )

点评

G 版是不论简单容易,都热心助人,致敬!  发表于 2011-10-24 14:00

评分

参与人数 1明经币 +1 收起 理由
669423907 + 1 很给力!

查看全部评分

 楼主| 发表于 2011-10-24 13:44:53 | 显示全部楼层
Gu_xl 发表于 2011-10-24 13:12

果然是版主厉害!
这样就省事多了,不用多去记几个命令,非常感谢!
嗯,继续学习、、、、
发表于 2011-10-24 17:31:53 | 显示全部楼层
G版是我最佩服的达人,俺啥时才能到达这个境界
发表于 2020-8-25 18:23:44 | 显示全部楼层
谢谢G老大的代码,修改了一下用了。
发表于 2020-8-25 18:39:46 | 显示全部楼层

谢谢G老大的代码,原来还可以这么玩,我都是一个一个用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-6 09:26 , Processed in 0.204757 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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