找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 10086|回复: 44

[每日一码] 【牢固】多段线剪裁多段线,并重构封闭多段线

[复制链接]

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-17 15:35:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 牢固 于 2013-7-11 21:52 编辑

此贴为回应 批量线(多义线)编程深入探讨(一)GTJ116600的问题,重新开贴是为便于收藏!
未标题-1.jpg.thumb.jpg
程序效果!


[sell=20]
  1. ;;多段线剪裁多段线,并重构封闭多段线 By Gu_xl 2013.05.08
  2. (defun c:trin (/ *error* cmdecho)
  3.   (defun *error* (s)
  4.     (princ s)
  5.     (setvar 'cmdecho cmdecho)
  6.     )
  7.   (setq cmdecho (getvar 'cmdecho))
  8.   (setvar 'cmdecho 0)
  9.   (setq en (car(entsel "\n选择多段线")))
  10.   ;(command "_zoom" "o" en  "_zoom" "0.75x")
  11.   ;;方法1
  12.   (trimEdgeIn1 en)
  13.   ;;方法2
  14.   (trimEdgeIn en)
  15.   (setvar 'cmdecho cmdecho)
  16.   (princ)
  17.   )

  18. ;;;根据边界剪切多段线,并闭合剪切后的多段线
  19. ;;方法1:采用BPoly函数重新构建边界
  20. ;;(trimEdgeIn (car(entsel)))
  21. (defun trimEdgeIn1 (ENEDGE    /          DOC  DIS  OBJ1 OBJ  OBJ2 TMP        PL
  22.                    P1        PPL  PPL0 N    P01  P02         S1   SS   EN        P0
  23.                    PAR0        PAR1 MP          A0   A1   I         E    P2   A
  24.                   )
  25.   (vla-StartUndoMark
  26.     (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  27.   )
  28.   (setq dis (* 0.005 (getvar "viewsize"))) ;_ 拟合间距
  29.   (setq        obj1 (vlax-invoke
  30.                (setq obj (vlax-ename->vla-object ENEDGE))
  31.                'offset
  32.                dis
  33.              )
  34.         obj2 (vlax-invoke
  35.                (setq obj (vlax-ename->vla-object ENEDGE))
  36.                'offset
  37.                (- dis)
  38.              )
  39.   ) ;_ 两侧偏移多段线
  40.   (setq        obj1
  41.          (vl-sort obj1
  42.                   '(lambda (a b) (> (vla-get-area a) (vla-get-area b)))
  43.          )
  44.   ) ;_ 偏移后的多段线按面积从大到小排序,因偏移后可能会有多个多段线
  45.   (mapcar 'vla-delete (cdr obj1)) ;_ 保留面积最大的多段线
  46.   (setq obj1 (car obj1))
  47.   (setq        obj2
  48.          (vl-sort obj2
  49.                   '(lambda (a b) (> (vla-get-area a) (vla-get-area b)))
  50.          )
  51.   )
  52.   (mapcar 'vla-delete (cdr obj2))
  53.   (setq obj2 (car obj2))
  54.   (if (> (vla-get-area obj1)
  55.          (vla-get-area obj2)
  56.       )
  57.     (setq tmp  obj1
  58.           obj1 obj2
  59.           obj2 tmp
  60.     )
  61.   ) ;_ 确保 obj1 为内侧曲线 obj2 为外侧曲线
  62.   (setq        pl (mapcar '(lambda (x) (trans x 0 1))
  63.                    (gxl-getpolyptList enEdge dis)
  64.            )
  65.   ) ;_ 计算多段线拟合顶点坐标
  66.   (setq        ppl (mapcar '(lambda (x) (trans x 0 1))
  67.                     (gxl-getpolyptList obj1 dis)
  68.             )
  69.   ) ;_ 计算多边形向内偏移dis的顶点坐标
  70.   (setq        ppl0 (mapcar '(lambda (x) (trans x 0 1))
  71.                      (gxl-getpolyptList obj2 dis)
  72.              )
  73.   ) ;_ 计算多边形向外偏移dis的顶点坐标
  74.   (vla-delete obj1)
  75.   (vla-delete obj2)
  76.   (setq        pl  (append pl (list (car pl)))
  77.         ppl (append ppl (list (car ppl)))
  78.   )
  79.   ;;开始剪裁
  80.   (command "trim" enEdge "")
  81.   (setq n 0)
  82.   (repeat (1- (length ppl))
  83.     (setq p01 (nth n ppl)
  84.           p02 (nth (setq n (1+ n)) ppl)
  85.     )
  86.     (command "f" p01 p02 "")
  87.     (command "f" p01 p02 "")
  88.     (command "f" p01 p02 "") ;_ 连剪三次,以防剪切不净
  89.   )
  90.   (command "")
  91.   (setq s1 (ssget "wp" pl))
  92.   (if s1
  93.     (progn
  94.       (command "erase" s1 "")
  95.     )
  96.   ) ;_ 删除内部物体
  97.   (entdel enEdge) ;_ 隐藏剪裁边界
  98.   (setq ss (ssget "f" ppl0 '((0 . "lwpolyline")))) ;_ 选择剪裁后的多段线
  99.   (entdel enEdge) ;_ 恢复边界
  100.   (if ss
  101.     (repeat (setq n (sslength ss)) ;_ 逐个处理剪裁后的多段线
  102.       (setq en (ssname ss (setq n (1- n))))
  103.       (if (and
  104.             (equal (setq p0 (vlax-curve-getStartPoint en))
  105.                    (vlax-curve-getclosestpointto enEdge p0)
  106.                    1e-6
  107.             )
  108.             (equal (setq p1 (vlax-curve-getendPoint en))
  109.                    (vlax-curve-getclosestpointto enEdge p1)
  110.                    1e-6
  111.             )
  112.           ) ;_ 剪裁后的多段线起点和终点都落在边界上
  113.         (progn
  114.           ;;以下是采用BPoly函数重新构建边界
  115.           (setq        par0 (vlax-curve-getParamAtPoint
  116.                        enEdge
  117.                        (vlax-curve-getclosestpointto enEdge p0)
  118.                      ) ;_ 起点参数
  119.                 par1 (vlax-curve-getParamAtPoint
  120.                        enEdge
  121.                        (vlax-curve-getclosestpointto enEdge p1)
  122.                      ) ;_ 终点参数
  123.           )
  124.           (cond
  125.             ((= 1 (fix (vlax-curve-getEndParam en))) ;_ 剪裁后的多段线只有两个顶点
  126.              (setq mp (mapcar '* '(0.5 0.5 0.5) (mapcar '+ p0 p1))
  127.                    a0 (+ (* 0.5 pi) (angle p0 p1))
  128.                    a1 (+ (* 0.5 pi) (angle p1 p0))
  129.              )
  130.              (cond  
  131.                ((progn
  132.                   (setq i 1)
  133.                   (while (and (< i 10)
  134.                               (not (setq e
  135.                                           (bpoly (trans (polar mp a0 (* i dis)) 0 1))
  136.                                    )
  137.                               )
  138.                          )
  139.                     (setq i (1+ i))
  140.                   )
  141.                   e
  142.                 ) ;_ 向直线一侧构建边界
  143.                 (entdel en) ;_ 构建边界成功后删除原多段线
  144.                )
  145.                ((progn
  146.                   (setq i 1)
  147.                   (while (and (< i 10)
  148.                               (not (setq e
  149.                                           (bpoly (trans (polar mp a1 (* i dis)) 0 1))
  150.                                    )
  151.                               )
  152.                          )
  153.                     (setq i (1+ i))
  154.                   )
  155.                   e
  156.                 ) ;_ 向直线另一侧构建边界
  157.                 (entdel en) ;_ 构建边界成功后删除原多段线
  158.                )
  159.              )
  160.             )
  161.             (t ;_ 剪裁后的多段线有两个以上顶点
  162.              (setq p1 (vlax-curve-getPointAtParam en 1)
  163.                    p2 (vlax-curve-getPointAtParam en 2)
  164.                    a0 (angle p1 p0)
  165.                    a1 (angle p1 p2)
  166.              )
  167.              (cond
  168.                ((gxl-CCLOCK
  169.                   (mapcar 'cdr
  170.                           (vl-remove-if-not
  171.                             '(lambda (x) (= 10 (car x)))
  172.                             (entget en)
  173.                           )
  174.                   )
  175.                 ) ;_ 判断曲线为逆时针
  176.                 (if (< a0 a1)
  177.                   (setq a0 (+ a0 pi pi))
  178.                 )
  179.                )
  180.                (t ;_ 顺时针
  181.                 (if (< a1 a0)
  182.                   (setq a1 (+ a1 pi pi))
  183.                 )
  184.                )
  185.              )
  186.              (setq a (* 0.5 (+ a0 a1))) ;_ 角平分线
  187.              (setq i 1)
  188.              (while
  189.                (and
  190.                  (< i 10)
  191.                  (not (setq e (bpoly (trans (polar p1 a (* i dis)) 0 1)))
  192.                  )
  193.                )
  194.                 (setq i (1+ i))
  195.              )
  196.              (if e
  197.                (entdel en)
  198.              )
  199.             )
  200.           )
  201.         )
  202.       )
  203.     )
  204.   )
  205.   (vla-EndUndoMark doc)

  206. )
  207. ;;;***************** 函数 gxl-Cclock*****************
  208. ;;判断顺时针 = nil 逆时针 = t
  209. (defun gxl-CClock (plist)
  210.   (if (= 'ename (type plist))
  211.     (setq plist
  212.            (mapcar
  213.              'cdr
  214.              (vl-remove-if-not
  215.                '(lambda (x)
  216.                   (= 10 (car x))
  217.                   )
  218.                (entget plist)
  219.                )
  220.              )
  221.           )
  222.     )
  223.   (not
  224.             (minusp
  225.               (apply '+
  226.                      (mapcar
  227.                        (function
  228.                          (lambda (a b)
  229.                            (- (* (car b) (cadr a)) (* (car a) (cadr b)))
  230.                          )
  231.                        )
  232.                        plist
  233.                        (cons (last plist) plist)
  234.                      )
  235.               )
  236.             )
  237.           )
  238.   )
  239. ;;用一定长度的线拟合多段线圆弧,计算多段线的顶点坐标
  240. (defun gxl-getpolyptList (ENT    FGX           /          VERTEXSNUM        N
  241.                              SECDEV PLIST  D1          D2         D        K
  242.                              D0            PARAM
  243.                             )
  244.   (setq        vertexsNum
  245.          (fix (vlax-curve-getEndParam ent))
  246.         n 0
  247.   ) ;_ 结束setq
  248.   (repeat vertexsNum
  249.     (if        (setq secdev (vlax-curve-getSecondDeriv ent n))
  250.       (if (equal '(0.0 0.0 0.0) secdev 1e-8)
  251.         (setq plist (cons (vlax-curve-getPointAtParam ent n) plist))
  252.         (progn
  253.           (setq        d1    (vlax-curve-getdistAtParam ent n)
  254.                 d2    (vlax-curve-getdistAtParam ent (1+ n))
  255.                 d     (- d2 d1)
  256.                 k     (fix (/ d fgx))
  257.                 d0    (/ 1.0 (1+ k))
  258.                 param n
  259.           ) ;_ 结束setq
  260.           (setq plist (cons (vlax-curve-getPointAtParam ent n) plist))
  261.           (if (equal d0 1.0 0.001)
  262.             (setq plist
  263.                    (cons (vlax-curve-getPointAtParam ent (+ 0.5 param))
  264.                          plist
  265.                    )
  266.             )
  267.             (repeat k
  268.               (setq plist (cons        (vlax-curve-getPointAtParam
  269.                                   ent
  270.                                   (setq param (+ param d0))
  271.                                 )
  272.                                 plist
  273.                           )
  274.               )
  275.             )
  276.           )
  277.         ) ;_ 结束progn
  278.       ) ;_ 结束if
  279.     )
  280.     (setq n (1+ n))
  281.   ) ;_ 结束repeat
  282.   (if (not (vlax-curve-isClosed ent))
  283.     (setq plist (cons (vlax-curve-getEndPoint ent) plist))
  284.   ) ;_ 结束if
  285.   (reverse plist)
  286. )
  287. ;;;根据边界剪切多段线,并闭合剪切后的多段线
  288. ;;方法2:采用曲线取点法重新构建边界
  289. ;;(trimEdgeIn (car(entsel)))
  290. (defun trimEdgeIn (ENEDGE /        DOC   DIS   CC          OBJ1        OBJ   OBJ2
  291.                           PL        PPL   PPL0  N          P01        P02   S1
  292.                           SS        EN    P0    P1          POLYDATA    I
  293.                           BULGES
  294.                          )
  295.   (vla-StartUndoMark
  296.     (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  297.   )
  298.   (setq dis (* 0.005 (getvar "viewsize"))) ;_ 拟合间距
  299.   (setq cc (gxl-CClock ENEDGE)) ;_ 是否逆时针
  300.   ;_ 确保 obj1 为内侧曲线 obj2 为外侧曲线
  301.   (setq        obj1 (vlax-invoke
  302.                (setq obj (vlax-ename->vla-object ENEDGE))
  303.                'offset
  304.                (if cc (- dis) dis)
  305.              )
  306.         obj2 (vlax-invoke
  307.                (setq obj (vlax-ename->vla-object ENEDGE))
  308.                'offset
  309.                (if cc  dis (- dis))
  310.              )
  311.   ) ;_ 两侧偏移多段线
  312.   (setq        obj1
  313.          (vl-sort obj1
  314.                   '(lambda (a b) (> (vla-get-area a) (vla-get-area b)))
  315.          )
  316.   ) ;_ 偏移后的多段线按面积从大到小排序,因偏移后可能会有多个多段线
  317.   (mapcar 'vla-delete (cdr obj1)) ;_ 保留面积最大的多段线
  318.   (setq obj1 (car obj1))
  319.   (setq        obj2
  320.          (vl-sort obj2
  321.                   '(lambda (a b) (> (vla-get-area a) (vla-get-area b)))
  322.          )
  323.   )
  324.   (mapcar 'vla-delete (cdr obj2))
  325.   (setq obj2 (car obj2))

  326.   (setq        pl (mapcar '(lambda (x) (trans x 0 1))
  327.                    (gxl-getpolyptList enEdge dis)
  328.            )
  329.   ) ;_ 计算多段线拟合顶点坐标
  330.   (setq        ppl (mapcar '(lambda (x) (trans x 0 1))
  331.                     (gxl-getpolyptList obj1 dis)
  332.             )
  333.   ) ;_ 计算多边形向内偏移dis的顶点坐标
  334.   (setq        ppl0 (mapcar '(lambda (x) (trans x 0 1))
  335.                      (gxl-getpolyptList obj2 dis)
  336.              )
  337.   ) ;_ 计算多边形向外偏移dis的顶点坐标
  338.   (vla-delete obj1)
  339.   (vla-delete obj2)
  340.   (setq        pl  (append pl (list (car pl)))
  341.         ppl (append ppl (list (car ppl)))
  342.   )
  343.   ;;开始剪裁
  344.   (command "trim" enEdge "")
  345.   (setq n 0)
  346.   (repeat (1- (length ppl))
  347.     (setq p01 (nth n ppl)
  348.           p02 (nth (setq n (1+ n)) ppl)
  349.     )
  350.     (command "f" p01 p02 "")
  351.     (command "f" p01 p02 "")
  352.     (command "f" p01 p02 "") ;_ 连剪三次,以防剪切不净
  353.   )
  354.   (command "")
  355.   (setq s1 (ssget "wp" pl))
  356.   (if s1
  357.     (progn
  358.       (command "erase" s1 "")
  359.     )
  360.   ) ;_ 删除内部物体
  361.   (entdel enEdge) ;_ 隐藏剪裁边界
  362.   (setq ss (ssget "f" ppl0 '((0 . "lwpolyline")))) ;_ 选择剪裁后的多段线
  363.   (entdel enEdge) ;_ 恢复边界
  364.   (if ss
  365.     (repeat (setq n (sslength ss)) ;_ 逐个处理剪裁后的多段线
  366.       (setq en (ssname ss (setq n (1- n))) )
  367.       (if (and
  368.             (equal (setq p0 (vlax-curve-getStartPoint en))
  369.                    (vlax-curve-getclosestpointto enEdge p0)
  370.                    1e-6
  371.             )
  372.             (equal (setq p1 (vlax-curve-getendPoint en))
  373.                    (vlax-curve-getclosestpointto enEdge p1)
  374.                    1e-6
  375.             )
  376.           ) ;_ 剪裁后的多段线起点和终点都落在边界上
  377.         (progn
  378.           (setq        polydata
  379.                  (GXL-COPYPOLYDATA
  380.                    ENEDGE
  381.                    p1
  382.                    p0
  383.                    (cond
  384.                      ((gxl-CClock en)
  385.                       (if cc
  386.                         nil
  387.                         t
  388.                       )
  389.                      )
  390.                      (t
  391.                       (if cc
  392.                         t
  393.                         nil
  394.                       )
  395.                      )
  396.                    )
  397.                  )
  398.           )
  399.           (setq i (fix (vlax-curve-getEndParam en))
  400.                 pl (cdar polydata)
  401.                 bulges (cadr polydata)
  402.                 obj (vlax-ename->vla-object en)
  403.                 )
  404.           (repeat (1- (length pl))
  405.             (vla-setbulge obj i (car bulges))
  406.             (setq bulges (cdr bulges)
  407.                   i (1+ i)
  408.                   )
  409.             (vla-AddVertex obj i (GXL-AX:2DPOINT (car pl)))
  410.             (setq pl (cdr pl))
  411.             )
  412.           (if (car bulges)
  413.           (vla-setbulge  obj i (car bulges))
  414.             )
  415.           (vla-put-Closed obj :vlax-true)
  416.           (vla-update obj)
  417.           )
  418.       )
  419.     )
  420.   )
  421.   (vla-EndUndoMark doc)
  422. (princ)
  423. )
  424. ;;(gxl-CopyPolyData poly stp enp cw)复制多段线中的一段的数据
  425. ;;参数 poly = 多段线 stp = 起点 enp = 终点 cw(当曲线闭合时有效) = t 顺曲线方向 nil = 反之
  426. ;;(setq data (gxl-CopyPolyData (car(entsel "\n多段线:")) (getpoint "\n起点:")(getpoint "\n终点:") nil))
  427. ;;(gxl-AddLwPolyLineBulge *MODEL-SPACE* (car data) (cadr data) '((62 . 1)))
  428. (defun gxl-CopyPolyData        (POLY STP   ENP          CW        /     STPAR ENPAR C
  429.                               P0    I          LOOP        BULGE PL    BULGES
  430.                               MP    B          P1        II
  431.                              )
  432.   (if (not (equal STP   ENP 1e-6))
  433.     (progn
  434.   (if (= 'ename (type poly))
  435.     (setq poly (vlax-ename->vla-object poly))
  436.   )
  437.   (setq        stp   (vlax-curve-getclosestpointto poly stp)
  438.         stpar (vlax-curve-getParamAtPoint poly stp)
  439.         enp   (vlax-curve-getclosestpointto poly enp)
  440.         enpar (vlax-curve-getParamAtPoint poly enp)
  441.         c     (vlax-curve-isClosed poly)
  442.   )

  443.   (cond
  444.     ((or (and c cw) ;_ 闭合、顺曲线方向
  445.          (and (not c) (< stpar enpar)) ;_ 不闭合顺曲线方向
  446.      )
  447.      (setq p0 stp
  448.            i stpar
  449.            loop        t
  450.      )
  451.      (if (<= i enpar (1+ (fix i)))
  452.        (setq loop nil)
  453.      )
  454.      (setq bulge (vla-getbulge poly (fix i)))
  455.      (cond
  456.        ((equal 0 bulge 1e-6) ;_ 直线段
  457.         (setq pl     (cons p0 pl)
  458.               bulges (cons 0 bulges)
  459.         )
  460.        )
  461.        (t ;_ 弧
  462.         (setq mp (vlax-curve-getPointAtParam
  463.                    poly
  464.                    (* 0.5
  465.                       (+ i
  466.                          (if loop
  467.                            (1+ (fix i))
  468.                            enpar
  469.                          )
  470.                       )
  471.                    )
  472.                  ) ;_ 弧段中点
  473.               b         (/ (distance
  474.                       mp
  475.                       (GXL-MIDPOINT
  476.                         stp
  477.                         (setq p1
  478.                                (if loop
  479.                                  (vlax-curve-getPointAtParam poly (1+ (fix i)))
  480.                                  enp
  481.                                )
  482.                         )
  483.                       )
  484.                     )
  485.                     (distance p0 p1)
  486.                     0.5
  487.                  )
  488.         )
  489.         (if (minusp bulge)
  490.           (setq b (- b))
  491.         )
  492.         (setq pl     (cons p0 pl)
  493.               bulges (cons b bulges)
  494.         )
  495.        )
  496.      )
  497.      (setq i  (1+ (fix i))
  498.            p0 (vlax-curve-getPointAtParam poly i)
  499.      )
  500.      (while loop
  501.        (if (and c (= i (fix (vlax-curve-getEndParam poly))))
  502.          (setq i 0)
  503.        )
  504.        (cond
  505.          ((<= i enpar (1+ (fix i)))
  506.           (setq        loop  nil
  507.                 bulge (vla-getbulge poly (fix i))
  508.                 p1    enp
  509.                 ii    enpar ;_ 下点参数
  510.           )
  511.          )
  512.          (t
  513.           (setq        p1    (vlax-curve-getPointAtParam poly (1+ (fix i)))
  514.                 bulge (vla-getbulge poly i)
  515.                 ii    (1+ i) ;_ 下点参数
  516.           )
  517.          )
  518.        )
  519.        (if (not (equal i ii 1e-6))
  520.        (cond
  521.          ((equal 0 bulge 1e-6) ;_ 直线段
  522.           (setq        pl     (cons p0 pl)
  523.                 bulges (cons 0 bulges)
  524.           )
  525.          )
  526.          (t ;_ 弧线段
  527.           (setq        mp (vlax-curve-getPointAtParam poly (* 0.5 (+ i ii))) ;_ 弧段中点
  528.                 b  (/ (distance mp (GXL-MIDPOINT p0 p1))
  529.                       (distance p0 p1)
  530.                       0.5
  531.                    )
  532.           )
  533.           (if (minusp bulge)
  534.             (setq b (- b))
  535.           )
  536.           (setq        pl     (cons p0 pl)
  537.                 bulges (cons b bulges)
  538.           )
  539.          )
  540.        )
  541.          )
  542.        (setq p0        p1
  543.              i        (1+ i)
  544.        )
  545.      )
  546.     )
  547.     (t ;_ 逆曲线方向
  548.      (setq p0 stp
  549.            i stpar
  550.            loop        t
  551.      )
  552.      (if (zerop i) (setq i (fix (vlax-curve-getEndParam poly))))
  553.      (if (>= i
  554.              enpar
  555.              (if (equal i (fix i) 1e-6)
  556.                (1- (fix i))
  557.                (fix i)
  558.              )
  559.          )
  560.        (setq loop nil)
  561.      )
  562.      (if (equal i (fix i) 1e-6)
  563.        (setq bulge (vla-getbulge poly (1- (fix i))))
  564.        (setq bulge (vla-getbulge poly (fix i)))
  565.      )
  566.      (cond
  567.        ((equal 0 bulge 1e-6) ;_ 直线段
  568.         (setq pl     (cons p0 pl)
  569.               bulges (cons 0 bulges)
  570.         )
  571.        )
  572.        (t ;_ 弧
  573.         (setq mp (vlax-curve-getPointAtParam
  574.                    poly
  575.                    (* 0.5
  576.                       (+ i
  577.                          (if loop
  578.                            (if (equal i (fix i) 1e-6)
  579.                              (1- (fix i))
  580.                              (fix i)
  581.                            )
  582.                            enpar
  583.                          )
  584.                       )
  585.                    )
  586.                  ) ;_ 弧段中点
  587.               b         (/ (distance
  588.                       mp
  589.                       (GXL-MIDPOINT
  590.                         stp
  591.                         (setq p1 (if loop
  592.                                    (vlax-curve-getPointAtParam
  593.                                      poly
  594.                                      (if (equal i (fix i) 1e-6)
  595.                                        (1- (fix i))
  596.                                        (fix i)
  597.                                      )
  598.                                    )
  599.                                    enp
  600.                                  )
  601.                         )
  602.                       )
  603.                     )
  604.                     (distance p0 p1)
  605.                     0.5
  606.                  )
  607.         )
  608.         (if (> bulge 0)
  609.           (setq b (- b))
  610.         )
  611.         (setq pl     (cons p0 pl)
  612.               bulges (cons b bulges)
  613.         )
  614.        )
  615.      )
  616.      (setq i  (if (equal i (fix i) 1e-6)
  617.                 (1- (fix i))
  618.                 (fix i)
  619.               )
  620.            p0 (vlax-curve-getPointAtParam poly i)
  621.      )
  622.      (while loop
  623.        (if (and c (= i 0))
  624.          (setq i (fix (vlax-curve-getendParam poly)))
  625.        )
  626.        (cond
  627.          ((>= i enpar (1- (fix i)))
  628.           (setq        loop  nil
  629.                 bulge (vla-getbulge poly (1- (fix i)))
  630.                 p1    enp
  631.                 ii    enpar ;_ 下点参数
  632.           )
  633.          )
  634.          (t
  635.           (setq        p1    (vlax-curve-getPointAtParam poly (1- (fix i)))
  636.                 bulge (vla-getbulge poly (1- (fix i)))
  637.                 ii    (1- (fix i)) ;_ 下点参数
  638.           )
  639.          )
  640.        )
  641.        (cond
  642.          ((equal 0 bulge 1e-6) ;_ 直线段
  643.           (setq        pl     (cons p0 pl)
  644.                 bulges (cons 0 bulges)
  645.           )
  646.          )
  647.          (t ;_ 弧线段
  648.           (setq        mp (vlax-curve-getPointAtParam poly (* 0.5 (+ i ii))) ;_ 弧段中点
  649.                 b  (/ (distance mp (GXL-MIDPOINT p0 p1))
  650.                       (distance p0 p1)
  651.                       0.5
  652.                    )
  653.           )
  654.           (if (> bulge 0)
  655.             (setq b (- b))
  656.           )
  657.           (setq        pl     (cons p0 pl)
  658.                 bulges (cons b bulges)
  659.           )
  660.          )
  661.        )
  662.        (setq p0        p1
  663.              i        (1- i)
  664.        )
  665.      )


  666.     )
  667.   )
  668.   (list (reverse (cons enp pl)) (reverse bulges))
  669.   )
  670.     )
  671. )
  672. ;;;==================================================================
  673. ;;;gxl-MidPoint 表操作函数,计算两点的中点
  674. ;;;计算两点的中点
  675. ;;;==================================================================
  676. (defun gxl-MidPoint (p1 p2)
  677.   (mapcar '(lambda (x) (* x 0.5)) (mapcar '+ p1 p2))
  678.   );;;gxl-2D-Point 转换一个AutoLISP点到一个二维ActiveX点
  679. (defun gxl-2D-Point (pt)
  680.   (vlax-make-variant
  681.     (vlax-safearray-fill
  682.       (vlax-make-safearray vlax-vbdouble '(0 . 1))
  683.       (list (car pt) (cadr pt))
  684.     )
  685.   )
  686. )

[/sell]
用晓东API来写该功能,寥寥几句代码就可以搞定:(2013.07.11)
  1. (defun c:tt ()
  2.   (xdrx_begin (list "cmdecho" 0 "osmode" 0))
  3.   (xdrx_document_ucson)
  4.   (setq poly (car (xdrx_entsel "\n选择多段线:" '((0 . "lwpolyline")))))
  5.   (if poly
  6.     (progn
  7.       (vla-copy (vlax-ename->vla-object poly))
  8.       ;;返回多段线的模拟点
  9.       (setq pts (xdrx_getsamplept poly))
  10.       ;;返回向内偏移的的顶点坐标
  11.       (setq pts1 (xdrx_curve_offset poly (* -0.005 (getvar 'viewsize))))
  12.       ;;隐藏原边界
  13.       (redraw poly 0)
  14.       (setq ss (ssget "_F" pts '((0 . "*polyline"))))
  15.       ;;曲线交点打断
  16.       (setq ss (XDRX_CURVE_INTERSECTBREAK ss 0))
  17.       ;;如果不加延迟,后面选择不到多段线
  18.       (command "delay" 100)
  19.       ;;删除边界内多段线
  20.       (setq s1 (ssget "wp" pts '((0 . "*polyline"))))
  21.       (if s1 (command "erase" s1 ""))
  22.       (setq s1 (ssget "_F" pts1 '((0 . "*polyline"))))
  23.       (if s1 (command "erase" s1 ""))
  24.       (setq ss (XDRX_CURVE->REGION ss))
  25.        (xdrx_document_ucsoff)
  26.       ;;恢复原边界
  27.       (redraw poly 1)
  28.       
  29.       )
  30.     )
  31.   (xdrx_end)
  32.   )


评分

参与人数 7威望 +1 D豆 +32 贡献 +4 收起 理由
仲文玉 + 5 + 1 很给力!技术、资料分享奖!g版厉害
xshrimp + 5 + 1 技术引导讨论和指点奖!
Lispboy + 5 很给力!经验;技术要点;资料分享奖!
Highflybird + 1 + 5 + 1 很给力!经验;技术要点;资料分享奖!
ScmTools + 2 很给力!经验;技术要点;资料分享奖!
kwok + 5 很给力!经验;技术要点!
炫翔 + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-5-17 17:07:27 | 显示全部楼层
相当于ET工具的图形切割
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 68个

财富等级: 招财进宝

发表于 2013-5-17 18:35:33 | 显示全部楼层
老大这个利害!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 343个

财富等级: 日进斗金

发表于 2013-5-17 19:08:50 | 显示全部楼层
好贵,就是没什么钱,还实用吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 394个

财富等级: 日进斗金

发表于 2013-5-17 19:12:23 | 显示全部楼层
好,下来学习一下.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-17 23:52:33 | 显示全部楼层
老大去哪我去哪,老大,程序是用BPOLY生成的边界不?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-5-18 01:04:34 | 显示全部楼层
G版的程式,一定要看,能学到很多东西。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 343个

财富等级: 日进斗金

发表于 2013-5-22 22:03:40 | 显示全部楼层
好像可以看得见剪切刀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2013-5-23 13:38:02 | 显示全部楼层
支持{:soso_e100:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-5-23 22:42:12 | 显示全部楼层
可以剪切,但提示缺少GXL-COPYPOLYDATA函数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

 楼主| 发表于 2013-5-23 22:56:50 | 显示全部楼层
sicky111 发表于 2013-5-23 22:42
可以剪切,但提示缺少GXL-COPYPOLYDATA函数。

函数补上了!请重新下载!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-5-23 23:22:36 | 显示全部楼层
谢谢,我再试下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5601个

财富等级: 富甲天下

发表于 2013-5-24 10:13:20 | 显示全部楼层
本帖最后由 USER2128 于 2013-5-24 14:15 编辑

程序试用手记:
方法1(采用BPoly函数重新构建边界)不能达到预期效果,现只用方法2;
方法1和方法2中针对剪裁含虚线、中心线等线型时,会漏剪(还没想到最佳方法);
用多段线剪裁全直线时,会有少部分外围线也剪掉了(或删除了);
用未封闭多段线剪裁时,与多段线缺口相交线部分全删除了(也许就是要这种要求),
程序中缺少子函数“GXL-AX:2DPOINT”(但运行时并未报错)。

点评

呵呵,研究得很细,确实有些个小毛病呀  详情 回复 发表于 2013-7-9 12:43

评分

参与人数 1D豆 +6 收起 理由
XDSoft + 6 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3256个

财富等级: 富可敌国

发表于 2013-5-25 14:25:05 | 显示全部楼层
这个应该属于技巧性程序,目前还未社稷到
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5601个

财富等级: 富甲天下

发表于 2013-5-25 14:46:17 | 显示全部楼层
本帖最后由 USER2128 于 2013-5-25 15:14 编辑

“no function definition: GXL-AX:2DPOINT”
缺少函数:GXL-AX:2DPOINT,望楼主补上
被切断后的多段线能够分成两段,如果是在多段线闭合区段时的那一边,被切多段线不能闭合
另:首尾端点闭合(而不是“PEDIT” “CL”闭合),则程序运行报错





点评

非闭合图元个数大于1万个了?这种问题的解决是非常困难的;原因:1)图形的个数不定2)图形的位置不知 。目前国内能做此问题解决只有深圳志和诚科技有限公司(zhcdesign.com) 开发的软件ZHCTOPL,是目前性价比最高的  详情 回复 发表于 2014-10-14 12:37
GXL-AX:2DPOINT函数已补上  发表于 2013-5-25 15:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 19:52 , Processed in 0.336756 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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