004 发表于 2012-12-20 23:23:27

[wkq004]按多边形范围裁切,裁内,裁外,裁搭界...

本帖最后由 004 于 2012-12-20 23:33 编辑

用"裁切"搜索论坛相关的源码仅有3篇,一片是 xgr 写的局部复制的,还有一篇是裁外的,是半成品,而最后一片是半成品的简化版.好惨啊,但事实就是这样.我写的这个仅实现了裁内,裁外两个功能,有时还会出错,请大侠指点,有能力了加强到仿MicroStation---fance的效果,那就完结了.
还有看到高手老说扩展的acet函数,但代码看着真晕,哪位大侠把学习这些源码的经历,分享下,要怎么学.
(defun c:tt (/ AA E EL ELONG EN      EO EPTL      FX I LEN LST OLDBLIP OLDCMD OLDGROUP OLDPDMODE OLDSNAP OLONG
             ONE PT PTL      PTLST PXMAX SS SSTEXT TEXT
            )
;;功能:选择范围和方向点,裁内或裁外
;;局限:1.仅支持轻多段线范围,2.范围线不能打折
;;日期:wkq004@qq.com修改 2012-12-20
;;原程序来自明经通道by xgr 2007-8-30
(command ".undo" "e")
(command ".undo" "begin")
(setvar "LUPREC" 8)
(setq oldgroup (getvar "pickstyle"))      ;保存编组开关
(setvar "pickstyle" 0)                ;关闭编组
(setq oldcmd (getvar "cmdecho"))      ;保存控制 command 函数运行期间,AutoCAD 是否回显提示和输入
(setvar "cmdecho" 0)                        ;关闭command 函数运行期间,AutoCAD 回显提示和输入
(setq oldblip (getvar "blipmode"))      ;保存控制点标记
(setvar "blipmode" 0)                        ;关闭点标记
(setq oldpdmode (getvar "pdmode"))      ;关闭点样式
(setq oldsnap (getvar "osmode"))      ;保存对象捕捉方式
(setvar "osmode" 0)                        ;关闭对象捕捉式
(while (or (if (setq en (nentselp "\n选择作为剪切边界的闭合多段线:"))
               nil
               (setq ss "空选择!")
             )
             (if (= (cdr (assoc 0 (setq el (entget (setq e (car en)))))) "LWPOLYLINE")
               nil
               (setq ss "类型错误!")
             )
             (if (= (logand (cdr (assoc 70 el)) 1) 1)
               nil
               (setq ss "线段不闭合!")
             )
             (if (setq fx (getpoint "\n请选择裁切方向:"))
               nil
               (setq ss "选择裁切方向!")
             )
         )
    (alert (strcat "选择错误-" ss ",重新选择!"))
)
(setq elong 0)
(setq eptl '())
(setq one (cdr (assoc 10 el)))
(foreach pt el
    (if      (= 10 (car pt))
      (setq pt          (cdr pt)
            elong (+ elong (distance one pt))
            one          pt
            eptl(cons pt eptl)
      )
    )
)
(print "\n正在剪切图形,请稍侯......")
(command ".offset" 0.1 e fx "");_原多段线上有重点,偏移后的线上应该没有重点吧?
(setq eo (entlast))
(setq el (entget eo))
(command ".erase" eo "")
(setq olong 0)
(setq ptl '())
(setq one (cdr (assoc 10 el)))
(foreach pt el
    (if      (= 10 (car pt))
      (setq pt          (cdr pt)
            olong (+ olong (distance one pt))
            one          pt
            ptl          (cons pt ptl)
      )
    )
)
(setq pxmax (list (apply 'mapcar (cons 'min ptl)) (apply 'mapcar (cons 'max ptl))))
(command ".zoom" "w" (car pxmax) (cadr pxmax))
(setq ptl (append ptl (list (car ptl))))
;;炸开相交的块,面域,填充图案
(setq i 0)
(while (and (setq ss (ssget "F" ptl '((0 . "INSERT,HATCH,REGION")))) (> 10000 (setq i (1+ i))))
    (repeat (setq len (sslength ss)) (command ".EXPLODE" (ssname ss (setq len (1- len)))))
)
(setvar "pdmode" 0) ;_关闭点样式
(setq lst '())
(if (setq ss (ssget "f" ptl '((0 . "text,mtext"))))
    (repeat (setq len (sslength ss))
      (setq text (ssname ss (setq len (1- len))))
      (setq pt (assoc 10 (entget text)))
      (entmake (list '(0 . "point") pt))
      (setq lst (cons (list (entlast) text) lst))
    )
)
;;偏移线的长度小于原线长度,裁内否则裁外
(if (< olong elong)
    ;;裁内
    (if      (setq ss (ssget "wp" eptl))
      (command ".erase" ss "")
    )
    ;;裁外
    (if      (setq ss (ssget "cp" eptl))
      (command ".erase" "all" "r" ss "")
    )
)
(foreach potx      lst
    (if      (entget (car potx))
      (entdel (car potx))
      (entdel (cadr potx))
    )
)
(repeat 3
    (setq one (car ptl))
    (foreach two (cdr ptl) (command ".trim" e "" "f" one two "" "") (setq one two))
)
;;删除向内裁切矩形的对角线,考虑文本
;;处理有宽度的多段线
(if (setq ss (ssget "cp"
                      ptl
                      '((-4 . "<NOT")
                        (-4 . "<or")
                        (0 . "text,mtext,INSERT,HATCH,REGION")
                        (-4 . "<and")
                        (0 . "lwpolyline,polyline")
                        (-4 . "<or")
                        (-4 . ">")
                        (40 . 0.0)
                        (-4 . ">")
                        (41 . 0.0)
                        (-4 . "or>")
                        (-4 . "and>")
                        (-4 . "or>")
                        (-4 . "NOT>")
                     )
               )
      )
    (if (< olong elong)
             ;;裁内
             (command ".erase" ss "")
             ;;裁外
             (command ".erase" "all" "r" ss "")
         )
)
(command "zoom" "p") ;_恢复视窗大小
(setvar "LUPREC" 8)
(setvar "pickstyle" oldgroup)
(setvar "cmdecho" oldcmd)
(setvar "blipmode" oldblip)
(setvar "pdmode" oldpdmode)
(setvar "osmode" oldsnap)
(command ".undo" "e")
(princ)
)


zzc83 发表于 2012-12-21 07:35:28

本帖最后由 zzc83 于 2012-12-21 07:35 编辑

[资源] 求删除封闭多边形内部所有图元的lsp?送一个删除外部图元的lsp http://bbs.mjtd.com/thread-85904-2-1.html

357785513 发表于 2012-12-21 12:59:49

如果内部的可以多选就好

004 发表于 2012-12-21 13:20:46

谢谢,正是我想要的,看来搜索还得用多个相近关键字,写之前先问问的好。

ddbb2008 发表于 2013-3-28 16:30:11

如果可以局部复制就好了,,,

mycad 发表于 2013-3-30 13:20:58

好像还是有点问题,
*无效*
程序出错!返回到起始状态。

004 发表于 2013-3-30 15:53:21

mycad 发表于 2013-3-30 13:20 static/image/common/back.gif
好像还是有点问题,
*无效*
程序出错!返回到起始状态。

目前为止最好的裁切源码
http://bbs.mjtd.com/thread-85904-2-1.html

msyangyi 发表于 2013-9-26 14:01:00

都是高手,学习了

wxd20130610 发表于 2014-1-18 17:13:11

好像对于宽度不为0的多段线不管用。

cyfdean 发表于 2015-1-10 11:38:09

都是高手,学习了
页: [1] 2
查看完整版本: [wkq004]按多边形范围裁切,裁内,裁外,裁搭界...