明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1803|回复: 13

[源码] 一个简单的多段线打断,补充凸度

[复制链接]
发表于 2023-6-14 09:23:54 | 显示全部楼层 |阅读模式
本帖最后由 freedom_ice 于 2023-10-30 21:13 编辑

;;2023.10.30修改
  1. ( defun bulge (startpt endpt targetpt initbulge / bulge1 bulge2 delth dis1 dis2 dis3 radius verticalline1 verticalline2 )
  2.         ( setq dis1 ( distance startpt endpt ) )
  3.         ( setq dis2 ( distance startpt targetpt ) )
  4.         ( setq dis3 ( distance targetpt endpt ) )
  5.         ( cond ( ( and ( /= initbulge 0 )
  6.                                                      ( /= dis1 0 )
  7.                                                                  ( /= dis2 0 )
  8.                                                                  ( /= dis3 0 )                                 
  9.                              )
  10.                                          ( progn
  11.                                                         ( setq sign ( / initbulge ( abs initbulge ) ) )                                 
  12.                                                         ( setq deltH (  * ( abs initbulge ) 0.5 dis1 ) )
  13.                                                         ( setq radius ( / ( + ( expt deltH 2 ) ( expt ( * 0.5 dis1 ) 2 ) ) ( * 2 deltH ) ) )                               
  14.                                                         ( setq verticalline1 ( sqrt ( - ( expt radius 2 ) ( expt ( * 0.5 dis2 ) 2 ) ) ) )
  15.                                                         ( setq bulge1 ( / ( * 2 ( - radius verticalline1 ) ) dis2 ) )
  16.                                                         ( setq verticalline2 ( sqrt ( - ( expt radius 2 ) ( expt ( * 0.5 dis3 ) 2 ) ) ) )
  17.                                                         ( setq bulge2 ( / ( * 2 ( - radius verticalline2 ) ) dis3 ) )
  18.                                                         ( list ( * sign bulge1 ) ( * sign bulge2 ) )       
  19.                                          )                                         
  20.                                  )
  21.                                  ( ( and ( /= initbulge 0 )
  22.                                                                 ( /= dis1 0 )
  23.                                                                 ( = dis2 0 )
  24.                                                                 ( /= dis3 0 )                                 
  25.                                         )
  26.                                         ( list 0 initbulge )                                         
  27.                                 )
  28.                                 ( ( and ( /= initbulge 0 )
  29.                                                                 ( /= dis1 0 )
  30.                                                                 ( /= dis2 0 )
  31.                                                                 ( = dis3 0 )                                 
  32.                                         )
  33.                                         ( list initbulge 0 )                                         
  34.                                 )
  35.                                 ( t
  36.                                         ( list 0 0 )                                         
  37.                                 )
  38.         )
  39. )

  40. ( defun c:plb ( )
  41.   ( princ "\n选择多段线:" )       
  42.         ( setq entname ( ssname ( ssget ) 0 ) )
  43.         ( princ "\n选择打断点:" )
  44.         ( setq pt ( getpoint ) )
  45.         ( setq targetpt ( vlax-curve-getClosestPointTo entname pt ) )
  46.         ( if ( and ( equal ( car pt ) ( car targetpt ) 0.000001 )
  47.                                                   ( equal ( cadr pt ) ( cadr targetpt ) 0.00001 )
  48.                          )
  49.                          ( lwplbreak ( vlax-ename->vla-object entname ) pt)       
  50.                          ( princ "指定点不在多段线上!" )
  51.         )
  52. )

  53. ( defun lwplbreak(plineobj pt / bulge_j bulge_k bulge_node bulges emppt i j node_i node_j noden nodes_obj2 obj2 pline1 pline2 plnode1 plnode2 ptlist1 ptlist2 targetn targetparam)
  54.         ( setq targetparam ( vlax-curve-getParamAtPoint plineobj pt ) )
  55.         ( setq targetN ( fix targetparam ) )
  56.   ( setq nodeN ( fix ( vlax-curve-getEndParam plineobj ) ) )          
  57.         ( setq ptlist1 nil )
  58.         ( setq ptlist2 nil )
  59.         ( if ( and ( > targetparam 0 )
  60.                                            ( < targetparam nodeN )                                 
  61.                          )
  62.                    ( progn
  63.                                         ( setq i 0 )
  64.                                         ( while ( <= i targetN )
  65.                                             ( setq emppt ( vlax-curve-getPointAtParam plineobj i ) )
  66.                                                          ( setq ptlist1 ( cons ( reverse ( cdr ( reverse emppt ) ) ) ptlist1 ) )                                                    
  67.                                             ( setq i ( 1+ i ) )
  68.                                         )
  69.                                   ( if ( equal ( distance pt ( vlax-curve-getPointAtParam plineobj targetN ) ) 0.000001 )
  70.                                                    ( setq plnode1 ( + ( * 2 targetN ) 1 ) )
  71.                                                    ( progn
  72.                                                                  ( setq ptlist1 ( cons ( reverse ( cdr ( reverse pt ) ) ) ptlist1 ) )
  73.                                                                  ( setq plnode1 ( + ( * 2 ( + 1 targetN ) ) 1 ) )
  74.                                                          )
  75.                                         )                                       
  76.                                         ( setq ptlist1 ( reverse ptlist1 ) )
  77.                                         ( setq ptlist1 ( apply 'append ptlist1 ) )
  78.                                         ( setq pline1 (vlax-make-safearray vlax-vbDouble ( cons 0 plnode1 ) ) )
  79.                                         ( vlax-safearray-fill pline1 ptlist1 )                       
  80.                                                                                  
  81.                                         ( setq j nodeN )
  82.                                         ( while ( > j targetN )
  83.                                                                  ( setq emppt ( vlax-curve-getPointAtParam plineobj j ) )
  84.                                                                  ( setq ptlist2 ( cons ( reverse ( cdr ( reverse emppt ) ) ) ptlist2 ) )                                         
  85.                                                                  ( setq j ( 1- j ) )
  86.                                         )
  87.                                   ( if ( equal ( distance pt ( vlax-curve-getPointAtParam plineobj ( + 1 targetN ) ) ) 0.000001 )
  88.                                                    ( setq plnode2 ( + ( * 2 ( - nodeN targetN 1 ) ) 1 ) )
  89.                                                    ( progn
  90.                                                                  ( setq ptlist2 ( cons ( reverse ( cdr ( reverse pt ) ) ) ptlist2 ) )
  91.                                                                  ( setq plnode2 ( + ( * 2 ( - nodeN targetN ) ) 1 ) )
  92.                                                          )                                                  
  93.                                         )                                       
  94.                                         ( setq ptlist2 ( apply 'append ptlist2 ) )       
  95.                                         ( setq pline2 (vlax-make-safearray vlax-vbDouble ( cons 0 plnode2 ) ) )
  96.                                         ( vlax-safearray-fill pline2 ptlist2 )       
  97.                                   
  98.                                   ;凸度获取
  99.                                   ( setq bulges nil )
  100.                                   ( setq bulge_k nodeN )
  101.                                   ( while ( >= bulge_k 0 )
  102.                                                             ( setq bulges ( cons ( vla-getbulge plineobj bulge_k ) bulges ) )
  103.                                                                         ( setq bulge_k ( 1- bulge_k ) )
  104.                                         )
  105.                                   ( setq bulge_node ( bulge ( vlax-curve-getPointAtParam plineobj targetN ) ( vlax-curve-getPointAtParam plineobj ( 1+ targetN ) ) pt ( nth targetN bulges ) ) )                          
  106.                                   
  107.                                   ( setq obj2 ( vla-Copy plineobj ) )
  108.                                         ( setq pline1 ( vlax-make-variant pline1 ) )
  109.                                         ( vla-put-Coordinates plineobj pline1 )                                       
  110.                                         ( setq pline2 ( vlax-make-variant pline2 ) )
  111.                                         ( vla-put-Coordinates obj2 pline2 )       
  112.                
  113.                                   ;凸度赋值       
  114.                                         ( setq node_i 0 )
  115.                                         ( repeat ( + ( fix ( vlax-curve-getEndParam plineobj ) ) 1 )
  116.                                                                    ( vla-SetBulge plineobj node_i ( nth node_i bulges ) )
  117.                                                                     ( setq node_i ( 1+ node_i ) )
  118.                                         )
  119.                                          ( vla-SetBulge plineobj ( - ( fix ( vlax-curve-getEndParam plineobj ) ) 1 ) ( car bulge_node ) )
  120.                                   ( vla-SetBulge plineobj ( fix ( vlax-curve-getEndParam plineobj ) ) 0 )                         
  121.                                                                    
  122.                                   ( setq nodes_obj2 ( fix ( vlax-curve-getEndParam obj2 ) ) )
  123.                                         ( setq bulge_j ( - ( length bulges ) 1 ) )                                  
  124.                                         ( repeat ( + ( fix ( vlax-curve-getEndParam obj2 ) ) 1 )
  125.                                                                    ( vla-SetBulge obj2 nodes_obj2 ( nth bulge_j bulges ) )
  126.                                                                     ( setq nodes_obj2 ( 1- nodes_obj2 ) )
  127.                                                        ( setq bulge_j ( 1- bulge_j ) )
  128.                                         )                                 
  129.                       ( vla-SetBulge obj2 0 ( cadr bulge_node ) )                                           
  130.                                                                    
  131.                                   ( vla-Update plineobj )
  132.                                         ( vla-Update obj2 )                                 
  133.                          )
  134.                        
  135.         )
  136.         ( princ )
  137. )
复制代码


评分

参与人数 1明经币 +1 金钱 +5 收起 理由
you_boss + 1 + 5

查看全部评分

发表于 2023-8-22 17:53:30 | 显示全部楼层
试了一下,写了个逻辑比较混乱的,好多bug欢迎扔砖


  1. ;;;打断LWPLINE逻辑混乱版
  2. (defun c:tt  (/         xty-L-cdrn   xty-L-carn
  3.         xty-L-retainget-vtxl   xty-tan  make-pl  bu
  4.         bue      bus  en   en1    en2     enl
  5.         enn      ent  fuzz   ince    incs     mode
  6.         ne       ns  ocs   pme    pms     pt
  7.         pta      ptb  ptl   tmp    vtx1     vtx2
  8.         vtxe     vtxl  vtxs   vtxt    we     wee
  9.         wes      ws  wse   wss    x)
  10.     (defun xty-L-cdrn  (n lst /)
  11.   (if (= 0 n)
  12.       lst
  13.       (repeat n (setq lst (cdr lst)))
  14.       )
  15.   )
  16.     (defun xty-L-carn  (n lst / lsta)
  17.   (if (= 0 n)
  18.       (setq lsta lst)
  19.       (progn (setq lsta nil)
  20.        (repeat n
  21.            (setq lsta (append lsta (list (car lst)))
  22.            lst  (cdr lst)
  23.            )
  24.            )
  25.        )
  26.       )
  27.   lsta
  28.   )
  29.     (defun xty-L-retain   (m n lst /)
  30.   (setq lst (xty-L-carn n lst))
  31.   (setq lst (if (= 1 m)
  32.           lst
  33.           (xty-L-cdrn (1- m) lst)
  34.           )
  35.         )
  36.   )
  37.     (defun xty-tan  (ang)
  38.   ((lambda (x)
  39.        (if (equal 0. x 1e-14)
  40.      nil
  41.      (/ (sin ang) x)
  42.      )
  43.        )
  44.       (cos ang)
  45.       )
  46.   )
  47.     (defun xty-L-delsames  (lst fuzz / start new)
  48.   (while (setq start (car lst))
  49.       (if  (vl-some '(lambda (x) (equal start x fuzz)) new)
  50.     nil
  51.     (setq new (cons start new))
  52.     )
  53.       (setq lst (cdr lst))
  54.       )
  55.   (setq new (reverse new))
  56.   new
  57.   )
  58.     (defun get-vtxl  (ent / vtxl)
  59.   (while (setq ent (member (assoc 10 ent) ent))
  60.       (setq vtxl (cons (list (assoc 10 ent)
  61.            (assoc 40 ent)
  62.            (assoc 41 ent)
  63.            (assoc 42 ent))
  64.            vtxl)
  65.       ent  (cdr ent)))
  66.   (reverse vtxl))
  67.     (defun make-pl  (tmp ent ocs)
  68.   (entmakex
  69.       (append (subst (cons 90 (length tmp)) (assoc 90 ent) ent)
  70.         (apply 'append tmp)
  71.         (list (cons 210 ocs)))))
  72.     (setq fuzz 1e-6
  73.     en   (car (entsel))
  74.     ent  (entget en)
  75.     ocs  (cdr (assoc 210 ent))
  76.     vtxl (get-vtxl ent)
  77.     mode (if (= 1 (cdr (assoc 70 ent)))
  78.        t
  79.        nil)
  80.     vtxl (if (equal (caar vtxl) (car (last vtxl)) fuzz)
  81.        (reverse (cdr (reverse vtxl)))
  82.        vtxl)
  83.     ptl  nil)
  84.     (while (setq pt (getpoint)) (setq ptl (cons pt ptl)))
  85.     (setq ptl (mapcar '(lambda (x) (trans x 1 0)) ptl)
  86.     pta (vlax-curve-getstartpoint en)
  87.     ptb (vlax-curve-getendpoint en)
  88.     ptl (cons pta ptl)
  89.     ptl (cons ptb ptl)
  90.     ptl (xty-l-delsames ptl fuzz)
  91.     ptl (vl-sort
  92.       ptl
  93.       (function (lambda (x y)
  94.         (< (vlax-curve-getparamatpoint en x)
  95.            (vlax-curve-getparamatpoint en y)))))
  96.     ptl (if (equal pta ptb fuzz)
  97.       (append ptl (list ptb))
  98.       ptl)
  99.     )
  100.     (setq ent (reverse (member (assoc 39 ent) (reverse ent))))
  101.     (setq ent
  102.        (vl-remove-if
  103.      '(lambda (x)
  104.           (member (car x) '(-1 5 6 8 39 43 48 62 102 330 370)))
  105.      ent))
  106.     (setq ent (subst (cons 70 0) (assoc 70 ent) ent))
  107.     (setq enl (mapcar
  108.       (function
  109.           (lambda (pts pte)
  110.         (setq  pms  (vlax-curve-getparamatpoint
  111.            en
  112.            pts)
  113.         ns   (fix pms)
  114.         incs (- pms ns)
  115.         vtxs (nth ns vtxl)
  116.         pme  (vlax-curve-getparamatpoint
  117.            en
  118.            pte)
  119.         pme  (if (< pme pms)
  120.            (vlax-curve-getendparam en)
  121.            pme)
  122.         pme  (if (> pme (length vtxl))
  123.            (- pme 1)
  124.            pme)
  125.         pme  (if (= pme (length vtxl))
  126.            (1- pme)
  127.            pme)
  128.         ne   (fix pme)
  129.         ince (- pme ne)
  130.         vtxe (nth ne vtxl)
  131.         wss  (cdr (assoc 40 vtxs))
  132.         wse  (cdr (assoc 41 vtxs))
  133.         bus  (atan (cdr (assoc 42 vtxs)))
  134.         wes  (cdr (assoc 40 vtxe))
  135.         wee  (cdr (assoc 41 vtxe))
  136.         bue  (atan (cdr (assoc 42 vtxe))))
  137.         (if (= ns ne)
  138.             (setq ws   (+ wss (* incs (- wse wss)))
  139.             we   (+ wss (* ince (- wse wss)))
  140.             bu   (xty-tan (* (- pme pms) bus))
  141.             vtxs (list
  142.                (cons 10
  143.                (trans pts 0 ocs))
  144.                (cons 40 ws)
  145.                (cons 41 we)
  146.                (cons 42 bu))
  147.             vtxe (list
  148.                (cons 10
  149.                (trans pte 0 ocs))
  150.                (cons 40 we)
  151.                (cons 41 we)
  152.                (cons 42 bu))
  153.             enn   (make-pl (list vtxs vtxe)
  154.               ent
  155.               ocs))
  156.             (setq ws   (+ wss (* incs (- wse wss)))
  157.             bu   (- (xty-tan (* (1- incs) bus)))
  158.             vtxs (list
  159.                (cons 10
  160.                (trans pts 0 ocs))
  161.                (cons 40 ws)
  162.                (cons 41 wse)
  163.                (cons 42 bu))
  164.             ws   (+ wes (* ince (- wee wes)))
  165.             bu   (xty-tan (* (- pme ne) bue))
  166.             tmp   (xty-L-retain (+ ns 2)
  167.                    (1+ ne)
  168.                    vtxl)
  169.             vtxt (last tmp)
  170.             tmp   (reverse (cdr (reverse tmp)))
  171.             vtxt (subst  (cons 41 ws)
  172.             (assoc 41 vtxt)
  173.             vtxt)
  174.             vtxt (subst  (cons 42 bu)
  175.             (assoc 42 vtxt)
  176.             vtxt)
  177.             vtxe (list
  178.                (cons 10
  179.                (trans pte 0 ocs))
  180.                (cons 40 wee)
  181.                (cons 41 wee)
  182.                (cons 42 bu))
  183.             tmp   (cons vtxs tmp)
  184.             enn   (make-pl
  185.                (append tmp
  186.                  (list vtxt vtxe))
  187.                ent
  188.                ocs)))))
  189.       ptl
  190.       (cdr ptl)))
  191.     (if  mode
  192.   (progn (setq en1  (car enl)
  193.          vtx1 (get-vtxl (entget en1))
  194.          en2  (last enl)
  195.          vtx2 (get-vtxl (entget en2))
  196.          enl  (vl-remove en1 enl)
  197.          enl  (vl-remove en2 enl)
  198.          enl  (cons  (make-pl (append vtx2 (cdr vtx1)) ent ocs)
  199.         enl))
  200.          (entdel en1)
  201.          (entdel en2))))

本帖子中包含更多资源

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

x
 楼主| 发表于 2023-6-15 13:05:56 | 显示全部楼层
多段线打断,补充凸度,暂不考虑打断点处的全局宽度

  1. ( defun c:tt()
  2.   ( setq entname ( ssname ( ssget ) 0 ) )
  3.   ( setq plineobj ( vlax-ename->vla-object entname ) )
  4.   ( setq nodeN ( fix ( vlax-curve-getEndParam plineobj ) ) )
  5.   ( setq i 0 )
  6.   ( while ( <= i nodeN )
  7.     ;( princ ( vla-getBulge plineobj i ) )
  8.     ( vla-GetWidth plineobj i 'startwidth 'endwidth )
  9.     ( princ "\n" )
  10.     ( princ startwidth )
  11.     ( princ "\n" )
  12.     ( princ endwidth )
  13.     ( setq i ( 1+ i ) )
  14.   )
  15.   ( princ )
  16. )

  17. ( defun bulge (startpt endpt targetpt initbulge / bulge1 bulge2 delth dis1 dis2 dis3 radius verticalline1 verticalline2 )
  18.   ( setq dis1 ( distance startpt endpt ) )
  19.   ( setq dis2 ( distance startpt targetpt ) )
  20.   ( setq dis3 ( distance targetpt endpt ) )
  21.   ( cond ( ( and ( /= initbulge 0 )
  22.                  ( /= dis1 0 )
  23.                  ( /= dis2 0 )
  24.                  ( /= dis3 0 )         
  25.            )
  26.            ( progn         
  27.               ( setq deltH (  * initbulge 0.5 dis1 ) )
  28.               ( setq radius ( / ( + ( expt deltH 2 ) ( expt ( * 0.5 dis1 ) 2 ) ) ( * 2 deltH ) ) )        
  29.               ( setq verticalline1 ( sqrt ( - ( expt radius 2 ) ( expt ( * 0.5 dis2 ) 2 ) ) ) )
  30.               ( setq bulge1 ( / ( * 2 ( - radius verticalline1 ) ) dis2 ) )
  31.               ( setq verticalline2 ( sqrt ( - ( expt radius 2 ) ( expt ( * 0.5 dis3 ) 2 ) ) ) )
  32.               ( setq bulge2 ( / ( * 2 ( - radius verticalline2 ) ) dis3 ) )
  33.               ( list bulge1 bulge2 )  
  34.            )           
  35.          )
  36.         ( ( and ( /= initbulge 0 )
  37.                 ( /= dis1 0 )
  38.                 ( = dis2 0 )
  39.                 ( /= dis3 0 )         
  40.           )
  41.           ( list 0 initbulge )           
  42.         )
  43.         ( ( and ( /= initbulge 0 )
  44.                 ( /= dis1 0 )
  45.                 ( /= dis2 0 )
  46.                 ( = dis3 0 )         
  47.           )
  48.           ( list initbulge 0 )           
  49.         )
  50.         ( t
  51.           ( list 0 0 )           
  52.         )
  53.   )
  54. )

  55. ( defun c:plb ( )
  56.   ( princ "\n选择多段线:" )  
  57.   ( setq entname ( ssname ( ssget ) 0 ) )
  58.   ( princ "\n选择打断点:" )
  59.   ( setq pt ( getpoint ) )
  60.   ( setq targetpt ( vlax-curve-getClosestPointTo entname pt ) )
  61.   ( if ( and ( equal ( car pt ) ( car targetpt ) 0.000001 )
  62.               ( equal ( cadr pt ) ( cadr targetpt ) 0.00001 )
  63.        )
  64.        ( lwplbreak ( vlax-ename->vla-object entname ) pt)  
  65.        ( princ "指定点不在多段线上!" )
  66.   )
  67. )

  68. ( defun lwplbreak(plineobj pt / bulge_j bulge_k bulge_node bulges emppt i j node_i node_j noden nodes_obj2 obj2 pline1 pline2 plnode1 plnode2 ptlist1 ptlist2 targetn targetparam)
  69.   ( setq targetparam ( vlax-curve-getParamAtPoint plineobj pt ) )
  70.   ( setq targetN ( fix targetparam ) )
  71.   ( setq nodeN ( fix ( vlax-curve-getEndParam plineobj ) ) )     
  72.   ( setq ptlist1 nil )
  73.   ( setq ptlist2 nil )
  74.   ( if ( and ( > targetparam 0 )
  75.              ( < targetparam nodeN )         
  76.        )
  77.        ( progn
  78.           ( setq i 0 )
  79.           ( while ( <= i targetN )
  80.               ( setq emppt ( vlax-curve-getPointAtParam plineobj i ) )
  81.                ( setq ptlist1 ( cons ( reverse ( cdr ( reverse emppt ) ) ) ptlist1 ) )               
  82.               ( setq i ( 1+ i ) )
  83.           )
  84.           ( if ( equal ( distance pt ( vlax-curve-getPointAtParam plineobj targetN ) ) 0.000001 )
  85.                ( setq plnode1 ( + ( * 2 targetN ) 1 ) )
  86.                ( progn
  87.                  ( setq ptlist1 ( cons ( reverse ( cdr ( reverse pt ) ) ) ptlist1 ) )
  88.                  ( setq plnode1 ( + ( * 2 ( + 1 targetN ) ) 1 ) )
  89.                )
  90.           )         
  91.           ( setq ptlist1 ( reverse ptlist1 ) )
  92.           ( setq ptlist1 ( apply 'append ptlist1 ) )
  93.           ( setq pline1 (vlax-make-safearray vlax-vbDouble ( cons 0 plnode1 ) ) )
  94.           ( vlax-safearray-fill pline1 ptlist1 )      
  95.                      
  96.           ( setq j nodeN )
  97.           ( while ( > j targetN )
  98.                  ( setq emppt ( vlax-curve-getPointAtParam plineobj j ) )
  99.                  ( setq ptlist2 ( cons ( reverse ( cdr ( reverse emppt ) ) ) ptlist2 ) )           
  100.                  ( setq j ( 1- j ) )
  101.           )
  102.           ( if ( equal ( distance pt ( vlax-curve-getPointAtParam plineobj ( + 1 targetN ) ) ) 0.000001 )
  103.                ( setq plnode2 ( + ( * 2 ( - nodeN targetN 1 ) ) 1 ) )
  104.                ( progn
  105.                  ( setq ptlist2 ( cons ( reverse ( cdr ( reverse pt ) ) ) ptlist2 ) )
  106.                  ( setq plnode2 ( + ( * 2 ( - nodeN targetN ) ) 1 ) )
  107.                )               
  108.           )         
  109.           ( setq ptlist2 ( apply 'append ptlist2 ) )  
  110.           ( setq pline2 (vlax-make-safearray vlax-vbDouble ( cons 0 plnode2 ) ) )
  111.           ( vlax-safearray-fill pline2 ptlist2 )  
  112.          
  113.           ;凸度获取
  114.           ( setq bulges nil )
  115.           ( setq bulge_k nodeN )
  116.           ( while ( >= bulge_k 0 )
  117.                   ( setq bulges ( cons ( vla-getbulge plineobj bulge_k ) bulges ) )
  118.                   ( setq bulge_k ( 1- bulge_k ) )
  119.           )
  120.           ( setq bulge_node ( bulge ( vlax-curve-getPointAtParam plineobj targetN ) ( vlax-curve-getPointAtParam plineobj ( 1+ targetN ) ) pt ( nth targetN bulges ) ) )        
  121.          
  122.           ( setq obj2 ( vla-Copy plineobj ) )
  123.           ( setq pline1 ( vlax-make-variant pline1 ) )
  124.           ( vla-put-Coordinates plineobj pline1 )         
  125.           ( setq pline2 ( vlax-make-variant pline2 ) )
  126.           ( vla-put-Coordinates obj2 pline2 )  
  127.    
  128.           ;凸度赋值  
  129.           ( setq node_i 0 )
  130.           ( repeat ( + ( fix ( vlax-curve-getEndParam plineobj ) ) 1 )
  131.                    ( vla-SetBulge plineobj node_i ( nth node_i bulges ) )
  132.                     ( setq node_i ( 1+ node_i ) )
  133.           )
  134.            ( vla-SetBulge plineobj ( - ( fix ( vlax-curve-getEndParam plineobj ) ) 1 ) ( car bulge_node ) )
  135.           ( vla-SetBulge plineobj ( fix ( vlax-curve-getEndParam plineobj ) ) 0 )      
  136.                   
  137.           ( setq nodes_obj2 ( fix ( vlax-curve-getEndParam obj2 ) ) )
  138.           ( setq bulge_j ( - ( length bulges ) 1 ) )         
  139.           ( repeat ( + ( fix ( vlax-curve-getEndParam obj2 ) ) 1 )
  140.                    ( vla-SetBulge obj2 nodes_obj2 ( nth bulge_j bulges ) )
  141.                     ( setq nodes_obj2 ( 1- nodes_obj2 ) )
  142.                    ( setq bulge_j ( 1- bulge_j ) )
  143.           )         
  144.           ( vla-SetBulge obj2 0 ( cadr bulge_node ) )            
  145.                   
  146.           ( vla-Update plineobj )
  147.           ( vla-Update obj2 )         
  148.        )
  149.       
  150.   )
  151.   ( princ )
  152. )



  153. ( princ )
复制代码


发表于 2023-6-14 09:54:23 | 显示全部楼层
  1. (defun c:BreakAtPoint(/ OK ENT PT)
  2.   ;单点打断
  3.   (setq OK T)
  4.   (while OK
  5.     (setq ENT (entsel "\n选择打断对象"))
  6.     (if        ENT
  7.       (progn
  8.         (setq PT (getpoint "\n拾取打断点"))
  9.         (if PT
  10.           (command "break" ENT "F" PT PT)
  11.           (setq OK nil)
  12.         )
  13.       )
  14.       (setq OK nil)
  15.     )
  16.   )
  17. )

用系统的break命令更方便
发表于 2023-6-14 12:08:07 | 显示全部楼层
谢谢分享,收藏
发表于 2023-6-14 12:17:52 | 显示全部楼层
guohq 发表于 2023-6-14 09:54
用系统的break命令更方便

(defun c:tt ()
  "单点打断"
  (while (setq ent (entsel "\n选择打断对象<退出>: "))
    (if        (setq pt (getpoint "\n拾取打断点<退出>: "))
      (command "break" ent "f" pt pt)
    )
  )
  (princ)
)
发表于 2023-6-14 13:15:54 | 显示全部楼层

谢谢分享,收藏
发表于 2023-6-14 14:27:36 | 显示全部楼层
按 X 不是更快捷吗?
发表于 2023-6-14 16:25:04 | 显示全部楼层
思路很清晰,程序值得学习,关于程序不能单从实现的功能来评价值不值得,的确系统自带有打断命令,但是该命令有较多局限性,比如打断之后没办法直接返回打断后的图元,但是楼主这个稍微修改一下就可以,对于二次开发来说很有价值
发表于 2023-6-15 11:03:13 | 显示全部楼层
xyp1964 发表于 2023-6-14 12:17
(defun c:tt ()
  "单点打断"
  (while (setq ent (entsel "\n选择打断对象: "))

发表于 2023-6-15 14:22:34 | 显示全部楼层
走火入魔了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-27 19:24 , Processed in 0.220921 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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