明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7152|回复: 18

[分享]宽PL线转线框,PL线剪影

  [复制链接]
发表于 2010-8-9 14:53:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2010-8-31 21:36:52 编辑

                                宽LWPOLYLINE转线框,相当于剪影功能
       采用纯VLISP方式实现将宽度>0的LWPOLYLINE转线框,对圆弧段采用3段圆弧模拟。
      
file:///D://PPL.bmp

      源码如下:
主框架源码    
  1. ;;;------------------------------------------------------------------------;;;
  2. ;;;宽POLYLINE转线框程序
  3. (defun c:PPL (/ ssen)
  4. (setq ssen (wjm_ss2lst (ssget (list (cons 0 "LWPOLYLINE")))))
  5. (foreach a ssen
  6. (ss-WPL->PL a T)
  7. (entdel a)
  8. )
  9. (princ "\n高山流水宽PL线转线框程序,命令PPL")
  10. (princ)
  11. )
  12. ;;;------------------------------------------------------------------------;;;
  13. (defun c:PPL1 (/ ssen)
  14. (setq ssen (wjm_ss2lst (ssget (list (cons 0 "LWPOLYLINE")))))
  15. (foreach a ssen
  16. (ss-WPL->PL a NIL)
  17. (entdel a)
  18. )
  19. (princ "\n高山流水宽PL线转单段线框程序,命令PPL1")
  20. (princ)
  21. )
  22. ;;; ---------------------------------------------------------------------------;;;
  23. ;;; SS-WPL->PL ;;;
  24. ;;; ---------------------------------------------------------------------------;;;
  25. ;;; function : Translate Wide LwPolyLine into Frame Border ;;;
  26. ;;; Arg : ;;;
  27. ;;; pl - PL Ename ;;;
  28. ;;; bool - boolean, T or NIL ;;;
  29. ;;; If you provide T , Then it'll translate PL to a Closed PL-Frame, ;;;
  30. ;;; If it's NIL , Single-stage PL-Frame. ;;;
  31. ;;; GE Alg : ;;;
  32. ;;; Trisect ARC length and width, Combine sidelines with Convexity ;;;
  33. ;;; ---------------------------------------------------------------------------;;;
  34. ;;; Example: ;;;
  35. ;;; (SS-WPL->PL PL_Ename T) ;_Return a Closed PL-Frame ;;;
  36. ;;; ---------------------------------------------------------------------------;;;
  37. ;;; Writen By GSLS(SS) 2010-08-08 ;;;
  38. ;;; (C) EasyCity OptDesign Studio of Building Structures ;;;
  39. ;;; Email: chlh_jd@126.com Tel:0592-5391029 Fax:0592-5391020 ;;;
  40. ;;; ---------------------------------------------------------------------------;;;
  41. (defun SS-WPL->PL (pl bool)
  42. (if bool
  43. ;;;整条返回封闭POLYLINE
  44. (mapcar 'entmake (ss-PL->Bound pl))
  45. ;;;逐段返回封闭POLYLINE
  46. (ss-pl->sbound pl)
  47. )
  48. )
主函数源码1:
  1. (defun SS-PL->Bound (pl     /    ent   is_close pl_vetex
  2.        b     i    lst1   lst2  w02 c0     p1
  3.        p2     w11    w12   c1  b mid    mid1
  4.        mid2   mid3   mid4   mid5  mid6 from1  from2
  5.        mpt1   mpt2   m1   m2  mpt1 mpt2   ang
  6.        dis1   dis2   mptl1  mptr1  mptl2 mptr2  n1
  7.        n2     m3    m4   end
  8.       )
  9.   (setq ent (entget pl '("*")))
  10.   (setq is_close (rem (cdr (assoc 70 ent)) 2))
  11.   (setq pl_vetex nil
  12. b nil
  13.   )
  14.   (foreach n ent ;_(setq e (assoc 10 ent))
  15.     (if (or (= 10 (car n))
  16.      (= 40 (car n))
  17.      (= 41 (car n))
  18.      (= 42 (car n))
  19. ) ;_ 结束or
  20.       (progn
  21. (setq b (cons (cdr n) b))
  22. (if (= 4 (length b))
  23.    (setq pl_vetex (append pl_vetex (list (reverse b)))
  24.   b  nil
  25.    )
  26. )
  27.       )
  28.     )
  29.   )
  30.   (setq i    0
  31. lst1 nil
  32. lst2 nil
  33. w02  nil
  34. c0   nil
  35.   )
  36.   (foreach a pl_vetex   
  37.     (setq p1 (car a)
  38.    w11 (cadr a)
  39.    w12 (caddr a)
  40.    c1 (cadddr a)
  41.    b (nth (1+ i) pl_vetex)
  42.    mid nil
  43.    mid1 nil
  44.    mid2 nil
  45.    from1 nil
  46.    form2 nil
  47.     )
  48.     (if (and (null b) (= is_close 1))
  49.       (setq b (car pl_vetex))
  50.     )
  51.     (if (setq p2 (car b))
  52.       (progn
  53. (setq mid (ss-plwk-pts p1 w11 w12 c1 p2))
  54. (if
  55.    (or (null c0) (null w02)) ;_第一段
  56.     (repeat (/ (length mid) 2)
  57.       (setq lst1 (cons (car mid) lst1)
  58.      lst2 (cons (cadr mid) lst2)
  59.      mid (cddr mid)
  60.       )
  61.     )
  62.     (progn
  63.       (setq from1 (car lst1)
  64.      lst1  (cdr lst1)
  65.      from2 (car lst2)
  66.      lst2  (cdr lst2)
  67.       )
  68.       (cond
  69. ;;;
  70. ;;;_1同为直段                                                                           
  71.         ((= c0 c1 0.0)
  72.   (setq mid1 (car mid)
  73.         mid2 (cadr mid)
  74.   )
  75.   (cond
  76.     ((= w02 w11)
  77.      (if (setq mpt1 (inters (car from1)
  78.        (cadr from1)
  79.        (car mid1)
  80.        (cadr mid1)
  81.        nil
  82.       )
  83.          )
  84.        (progn
  85.          (setq mpt2 (inters (car from2)
  86.        (cadr from2)
  87.        (car mid2)
  88.        (cadr mid2)
  89.        nil
  90.       )
  91.          )
  92.          ;;_无需再次判别连接
  93.          (setq lst1 (cons (ch-lst mpt1 1 from1) lst1)
  94.         lst2 (cons (ch-lst mpt2 1 from2) lst2)
  95.         lst1 (cons (ch-lst mpt1 0 mid1) lst1)
  96.         lst2 (cons (ch-lst mpt2 0 mid2) lst2)
  97.          )
  98.        )
  99.        (setq lst1 (cons mid1 (cons from1 lst1))
  100.       lst2 (cons mid2 (cons from2 lst2))
  101.        )
  102.      )
  103.     ) ;_end cond 2.1
  104.     ((> w02 w11) ;_前宽后窄
  105.      (setq mpt1 (inters (car mid1)
  106.           (cadr mid1)
  107.           (car from1)
  108.           (cadr from1)
  109.           nil
  110.          )
  111.     mpt2 (inters (car mid2)
  112.           (cadr mid2)
  113.           (car from2)
  114.           (cadr from2)
  115.           nil
  116.          )
  117.      ) ;_(check-pt (list mpt1 mpt2))     
  118.      (if (and mpt1 mpt2) ;_不存在交点,则平行
  119.        (progn ;_存在交点        
  120. ;_有个问题,是取宽端点连线交点,还是取与宽边交点???????????????????????????????????????????
  121. ;_暂时按方向角改变在[- pi/6 pi/6]
  122.          (if
  123.     (or
  124.       (<=
  125.         (/ pi -6.0)
  126.         (- (gsls-ang-trans
  127.       (angle
  128.         (midpt (car from1) (car from2))
  129.         (midpt (cadr from1) (cadr from2))
  130.       )
  131.     )
  132.     (gsls-ang-trans
  133.       (angle (midpt (car mid1) (car mid2))
  134.       (midpt (cadr mid1) (cadr mid2))
  135.       )
  136.     )
  137.         )
  138.         (/ pi 6.0)
  139.       )
  140.       (/= w01 0.0)
  141.     )
  142.      (setq mpt1 (inters (cadr from1)
  143.           (cadr from2)
  144.           (car mid1)
  145.           (cadr mid1)
  146.           nil
  147.          )
  148.     mpt2 (inters (cadr from1)
  149.           (cadr from2)
  150.           (car mid2)
  151.           (cadr mid2)
  152.           nil
  153.          )
  154.     lst1 (cons (ch-lst mpt1 0 mid1)
  155.         (cons from1 lst1)
  156.          )
  157.     lst2 (cons (ch-lst mpt2 0 mid2)
  158.         (cons from2 lst2)
  159.          )
  160.      )
  161.      (setq
  162.        mid1  (ch-lst mpt1 0 mid1)
  163.        mid2  (ch-lst mpt2 0 mid2)
  164.        from1 (ch-lst mpt1 1 from1)
  165.        from2 (ch-lst mpt2 1 from2)
  166.        lst1  (cons mid1 (cons from1 lst1))
  167.        lst2  (cons mid2 (cons from2 lst2))
  168.      )
  169.          )
  170.        )
  171.        ;;_平行
  172.        (setq lst1 (cons mid1 (cons from1 lst1))
  173.       lst2 (cons mid2 (cons from2 lst2))
  174.        )
  175.      )
  176.     )
  177.     ((< w02 w11)
  178.      (setq mpt1 (inters (car mid1)
  179.           (cadr mid1)
  180.           (car from1)
  181.           (cadr from1)
  182.           nil
  183.          )
  184.     mpt2 (inters (car mid2)
  185.           (cadr mid2)
  186.           (car from2)
  187.           (cadr from2)
  188.           nil
  189.          )
  190.      )
  191.      (if (and mpt1 mpt2) ;_不存在交点,则平行
  192.        (progn ;_存在交点         
  193. ;_有个问题,是取宽端点连线交点,还是取与宽边交点???????????????????????????????????????????
  194. ;_暂时按方向角改变在[- pi/6 pi/6]
  195.          (if (<= (/ pi -6.0)
  196.           (- (gsls-ang-trans
  197.         (angle (car from1) (cadr from1))
  198.       )
  199.       (gsls-ang-trans
  200.         (angle (car mid1) (cadr mid1))
  201.       )
  202.           )
  203.           (/ pi 6.0)
  204.       )
  205.     (setq mpt1 (inters (car from1)
  206.          (cadr from2)
  207.          (car mid1)
  208.          (car mid2)
  209.          nil
  210.         )
  211.           mpt2 (inters (car from1)
  212.          (cadr from2)
  213.          (car mid1)
  214.          (car mid2)
  215.          nil
  216.         )
  217.           lst1 (cons mid1
  218.        (cons (ch-lst mpt1 1 from1) lst1)
  219.         )
  220.           lst2 (cons mid2
  221.        (cons (ch-lst mpt2 1 from2) lst2)
  222.         )
  223.     )
  224.     (setq mpt1  (inters (car mid1)
  225.           (cadr mid1)
  226.           (car from1)
  227.           (cadr from1)
  228.           nil
  229.          )
  230.           mpt2  (inters (car mid2)
  231.           (cadr mid2)
  232.           (car from2)
  233.           (cadr from2)
  234.           nil
  235.          )
  236.           mid1  (ch-lst mpt1 0 mid1)
  237.           mid2  (ch-lst mpt2 0 mid2)
  238.           from1 (ch-lst mpt1 1 from1)
  239.           from2 (ch-lst mpt2 1 from2)
  240.           lst1  (cons mid1 (cons from1 lst1))
  241.           lst2  (cons mid2 (cons from2 lst2))
  242.     )
  243.          )
  244.        )
  245. ;_平行         
  246.        (setq lst1 (cons mid1 (cons from1 lst1))
  247.       lst2 (cons mid2 (cons from2 lst2))
  248.        )
  249.      ) ;_end if
  250.     ) ;_前窄后宽
  251.   )
  252.         )
  253. ;;;
  254. ;;;_2前段直段,后段弧                                                                  
  255.         ((and (= c0 0.0) (/= c1 0.0))
  256.      ;(check-pt (cdr (reverse from1)))
  257.   (setq mid1 (car mid)
  258.         mid2 (cadr mid)
  259.         mid  (cddr mid)
  260.         mid3 (car mid)
  261.         mid4 (cadr mid)
  262.         mid  (cddr mid)
  263.         mid5 (car mid)
  264.         mid6 (cadr mid)
  265.         m1   (SS-PTC-ptcR
  266.         (car mid1)
  267.         (cadr mid1)
  268.         (caddr mid1)
  269.       )
  270.         m2   (SS-PTC-ptcR
  271.         (car mid2)
  272.         (cadr mid2)
  273.         (caddr mid2)
  274.       )
  275.         m3   (SS-PTC-ptcR
  276.         p1
  277.         p2
  278.         c1
  279.       )
  280.         mpt1 (get-mindis-pt (ss-pl-inters from1 mid1) p1)
  281.         mpt2 (get-mindis-pt (ss-pl-inters from2 mid2) p1) ;_(check-pt (list (car from2) (cadr from2)))
  282.   )
  283.   (cond
  284.     ((= w02 w11) ;_2.1等宽  
  285.      (if (or mpt1 mpt2)
  286.        (progn
  287.          (if mpt1
  288.     nil
  289.     (setq mpt1
  290.     (get-mindis-pt
  291.       (ss-pl-inters from1 (list p1 mpt2 0.0))
  292.       p1
  293.     )
  294.     )
  295.          )
  296.          (if mpt2
  297.     nil
  298.     (setq mpt2
  299.     (get-mindis-pt
  300.       (ss-pl-inters from2 (list p1 mpt1 0.0))
  301.       p1
  302.     )
  303.     )
  304.          )
  305.        )
  306.        (progn
  307.          (setq
  308.     mpt1 (pedal_to_line
  309.     (car m1)
  310.     (car from1)
  311.     (cadr from1)
  312.          )
  313.     mpt2 (pedal_to_line
  314.     (car m2)
  315.     (car from2)
  316.     (cadr from2)
  317.          )
  318.     ang  (angle (car from1) (cadr from1))
  319.          )
  320.          (if
  321.     (equal (cadr m1)
  322.     (distance (car m1) mpt1)
  323.     2e-6
  324.     )
  325.      (setq dis1 0.0)
  326.      (setq
  327.        dis1
  328.         (sqrt (- (expt (cadr m1) 2.0)
  329.           (expt (distance (car m1) mpt1) 2.0)
  330.        )
  331.         )
  332.      )
  333.          )
  334.          (if
  335.     (equal (cadr m2)
  336.     (distance (car m2) mpt2)
  337.     2e-6
  338.     )
  339.      (setq dis2 0.0)
  340.      (setq
  341.        dis2
  342.         (sqrt (- (expt (cadr m2) 2.0)
  343.           (expt (distance (car m2) mpt2) 2.0)
  344.        )
  345.         )
  346.      )
  347.          )
  348.          (setq
  349.     mptl1 (polar mpt1 (+ ang pi) dis1)
  350.     mptr1 (polar mpt1 ang dis1)
  351.     mptl2 (polar mpt2 (+ ang pi) dis2)
  352.     mptr2 (polar mpt2 ang dis2)
  353.          )
  354.          (cond ((> (distance mptl1 (car mid1))
  355.      (distance mptr1 (car mid1))
  356.          )
  357.          (setq mpt1 mptr1)
  358.         )
  359.         ((< (distance mptl1 (car mid1))
  360.      (distance mptr1 (car mid1))
  361.          )
  362.          (setq mpt1 mptl1)
  363.         )
  364.         (t
  365.          (setq mpt1 (midpt mptl1 mptr1)) ;_这里需要推敲下,求中点消除误差
  366.         )
  367.          )
  368.          (cond ((> (distance mptl2 (car mid2))
  369.      (distance mptr2 (car mid2))
  370.          )
  371.          (setq mpt2 mptr2)
  372.         )
  373.         ((< (distance mptl2 (car mid2))
  374.      (distance mptr2 (car mid2))
  375.          )
  376.          (setq mpt2 mptl2)
  377.         )
  378.         (t
  379.          (setq mpt2 (midpt mptl2 mptr2))
  380.         )
  381.          )
  382.        )
  383.      )
  384.      (setq n1 (ss-ptc-c mpt1
  385.           (cadr mid1)
  386.           (car m1)
  387.           (> (caddr mid1) 0.0)
  388.        )
  389.     n2 (ss-ptc-c mpt2
  390.           (cadr mid2)
  391.           (car m2)
  392.           (> (caddr mid2) 0.0)
  393.        )
  394.      )
  395.      (setq lst1 (cons (ch-lst
  396.           mpt1
  397.           1
  398.           from1
  399.         )
  400.         lst1
  401.          ) ;_
  402.     lst2 (cons (ch-lst
  403.           mpt2
  404.           1
  405.           from2
  406.         )
  407.         lst2
  408.          ) ;_
  409.     mid1 (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  410.     mid2 (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  411.     lst1 (cons mid1 lst1)
  412.     lst2 (cons mid2 lst2)
  413.      )
  414.     )
  415.     ((> w02 w11) ;_2.2前宽后窄                                                         
  416. ;_(command "line" (list 0 0 0) mpt2 "")
  417.      (setq mpt1 (get-mindis-pt
  418.     (ss-pl-inters
  419.       (list (cadr from1) (cadr from2) 0.0)
  420.       mid1
  421.     )
  422.     (car mid1)
  423.          )
  424.     mpt2 (get-mindis-pt
  425.     (ss-pl-inters
  426.       (list (cadr from1) (cadr from2) 0.0)
  427.       mid2
  428.     )
  429.     (car mid2)
  430.          )
  431.      )
  432.      (if (and mpt1 mpt2) ;_这里需要调整下,可能存在一个交点,也是符合第一项处理
  433.        (progn
  434.          (setq n1 (ss-ptc-c mpt1
  435.        (cadr mid1)
  436.        (car m1)
  437.        (> (caddr mid1) 0.0)
  438.     )
  439.         n2 (ss-ptc-c mpt2
  440.        (cadr mid2)
  441.        (car m2)
  442.        (> (caddr mid2) 0.0)
  443.     )
  444.          )
  445.          (setq lst1 (cons from1 lst1)
  446.         lst2 (cons from2 lst2)
  447.         mid1 (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  448.         mid2 (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  449.         lst1 (cons mid1 lst1)
  450.         lst2 (cons mid2 lst2)
  451.          )
  452.        )
  453.        (progn
  454.          (setq mpt1 (get-mindis-pt
  455.         (ss-pl-inters
  456.           from1
  457.           mid1
  458.         )
  459.         (car mid1)
  460.       )
  461.         mpt2 (get-mindis-pt
  462.         (ss-pl-inters
  463.           from2
  464.           mid2
  465.         )
  466.         (car mid2)
  467.       )
  468.          )
  469.          (setq n1 (ss-ptc-c mpt1
  470.        (cadr mid1)
  471.        (car m1)
  472.        (> (caddr mid1) 0.0)
  473.     )
  474.         n2 (ss-ptc-c mpt2
  475.        (cadr mid2)
  476.        (car m2)
  477.        (> (caddr mid2) 0.0)
  478.     )
  479.          )
  480.          (setq from1 (ch-lst mpt1 1 from1)
  481.         from2 (ch-lst mpt2 1 from2)
  482.         mid1  (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  483.         mid2  (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  484.         lst1  (cons from1 lst1)
  485.         lst2  (cons from2 lst2)
  486.         lst1  (cons mid1 lst1)
  487.         lst2  (cons mid2 lst2)
  488.          )
  489.        )
  490.      )
  491.     )
  492.     ((< w02 w11) ;_2.3前窄后款
  493.      (setq mpt1 (car (ss-pl-inters
  494.          from1
  495.          (list (car mid1) (car mid2) 0.0)
  496.        )
  497.          )
  498.     mpt2 (car (ss-pl-inters
  499.          from2
  500.          (list (car mid1) (car mid2) 0.0)
  501.        )
  502.          )
  503.      )
  504.      (if (and mpt1 mpt2)
  505.        (setq lst1 (cons (ch-lst
  506.      mpt1
  507.      1
  508.      from1
  509.           )
  510.           lst1
  511.     )
  512.       lst2 (cons (ch-lst
  513.      mpt2
  514.      1
  515.      from2
  516.           )
  517.           lst2
  518.     )
  519.       lst1 (cons mid1 lst1)
  520.       lst2 (cons mid2 lst2)
  521.        )
  522.        (setq mpt1  (get-mindis-pt
  523.        (ss-pl-inters
  524.          from1
  525.          mid1
  526.        )
  527.        (car mid1)
  528.      )
  529.       mpt2  (get-mindis-pt
  530.        (ss-pl-inters
  531.          from2
  532.          mid2
  533.        )
  534.        (car mid2)
  535.      )
  536.       n1  (ss-ptc-c mpt1
  537.         (cadr mid1)
  538.         (car m1)
  539.         (> (caddr mid1) 0.0)
  540.      )
  541.       n2  (ss-ptc-c mpt2
  542.         (cadr mid2)
  543.         (car m2)
  544.         (> (caddr mid2) 0.0)
  545.      )
  546.       from1 (ch-lst mpt1 1 from1)
  547.       from2 (ch-lst mpt2 1 from2)
  548.       mid1  (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  549.       mid2  (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  550.       lst1  (cons mid1 (cons from1 lst1))
  551.       lst  (cons mid2 (cons from2 lst1))
  552.        )
  553.      )
  554.     )
  555.   )
  556.   (setq
  557.     lst1
  558.          (cons mid5 (cons mid3 lst1))
  559.     lst2
  560.          (cons mid6 (cons mid4 lst2))
  561.   )
  562.         ) ;_end 2.前直后弧
  563. ;;;
  564. ;;;_3前段弧段,后段直                                                                                 
  565.         ((and (/= c0 0.0) (= c1 0.0))
  566.   (setq mid1 (car mid)
  567.         mid2 (cadr mid)
  568.         m1   (SS-PTC-ptcR
  569.         (car from1)
  570.         (cadr from1)
  571.         (caddr from1)
  572.       )
  573.         m2   (SS-PTC-ptcR
  574.         (car from2)
  575.         (cadr from2)
  576.         (caddr from2)
  577.       )
  578.         m3   (SS-PTC-ptcR
  579.         (midpt (car from1) (car from2))
  580.         (midpt (cadr from1) (cadr from2))
  581.         (/ (+ (caddr from1) (caddr from2)) 2.0)
  582.       )
  583.         mpt1 (get-mindis-pt (ss-pl-inters from1 mid1) p1)
  584.         mpt2 (get-mindis-pt (ss-pl-inters from2 mid2) p1)
  585.   )
  586.   (cond
  587.     ((= w02 w11) ;_3.1等宽 这段代码需要改进,思路不清晰,用了开方,容差性差
  588.      (setq
  589.        mpt1 (pedal_to_line
  590.        (car m1)
  591.        (car mid1)
  592.        (cadr mid1)
  593.      )
  594.        mpt2 (pedal_to_line
  595.        (car m2)
  596.        (car mid2)
  597.        (cadr mid2)
  598.      )
  599.        ang  (angle (car mid1) (cadr mid1))
  600.      )
  601.      (if (equal (cadr m1) (distance (car m1) mpt1) 2e-6)
  602.        (setq dis1 0.0)
  603.        (setq
  604.          dis1
  605.    (sqrt (- (expt (cadr m1) 2.0)
  606.      (expt (distance (car m1) mpt1) 2.0)
  607.          )
  608.    )
  609.        )
  610.      )
  611.      (if (equal (cadr m2) (distance (car m2) mpt2) 2e-6)
  612.        (setq dis2 0.0)
  613.        (setq
  614.          dis2
  615.    (sqrt (- (expt (cadr m2) 2.0)
  616.      (expt (distance (car m2) mpt2) 2.0)
  617.          )
  618.    )
  619.        )
  620.      )
  621.      (setq
  622.        mptl1 (polar mpt1 (+ ang pi) dis1)
  623.        mptr1 (polar mpt1 ang dis1)
  624.        mptl2 (polar mpt2 (+ ang pi) dis2)
  625.        mptr2 (polar mpt2 ang dis2)
  626.      )
  627.      (cond ((> (distance mptl1 (cadr from1))
  628.         (distance mptr1 (cadr from1))
  629.      )
  630.      (setq mpt1 mptr1)
  631.     )
  632.     ((< (distance mptl1 (cadr from1))
  633.         (distance mptr1 (cadr from1))
  634.      )
  635.      (setq mpt1 mptl1)
  636.     )
  637.     (t
  638.      (setq mpt1 (midpt mptl1 mptr1))
  639.     )
  640.      )
  641.      (cond ((> (distance mptl2 (cadr from2))
  642.         (distance mptr2 (cadr from2))
  643.      )
  644.      (setq mpt2 mptr2)
  645.     )
  646.     ((< (distance mptl2 (cadr from2))
  647.         (distance mptr2 (cadr from2))
  648.      )
  649.      (setq mpt2 mptl2)
  650.     )
  651.     (t
  652.      (setq mpt2 (midpt mptl2 mptr2))
  653.     )
  654.      )
  655.     )
  656.     ((> w02 w11) ;_3.2前宽后窄
  657.      (setq mpt1 (inters (cadr from1)
  658.           (cadr from2)
  659.           (car mid1)
  660.           (cadr mid1)
  661.           nil
  662.          )
  663.     mpt2 (inters (cadr from1)
  664.           (cadr from2)
  665.           (car mid2)
  666.           (cadr mid2)
  667.           nil
  668.          )
  669.      )
  670.      (if (and mpt1 mpt2)
  671.        nil
  672.        (setq mpt1 (get-mindis-pt
  673.       (ss-pl-inters
  674.         from1
  675.         mid1
  676.       )
  677.       (cadr from1)
  678.     )
  679.       mpt2 (get-mindis-pt
  680.       (ss-pl-inters
  681.         from2
  682.         mid2
  683.       )
  684.       (cadr from2)
  685.     )
  686.        )
  687.      )
  688.     )
  689.     ((< w02 w11) ;_3.3前窄后宽  
  690.      (setq mpt1 (get-mindis-pt
  691.     (ss-pl-inters
  692.       (list (car mid1) (car mid2) 0.0)
  693.       from1
  694.     )
  695.     (cadr from1)
  696.          )
  697.     mpt2 (get-mindis-pt
  698.     (ss-pl-inters
  699.       (list (car mid1) (car mid2) 0.0)
  700.       from2
  701.     )
  702.     (cadr from2)
  703.          )
  704.      ) ;_(command "line" (list 0 0) mpt2 "")
  705.      (if (and mpt1 mpt2)
  706.        nil
  707.        (setq mpt1 (get-mindis-pt
  708.       (ss-pl-inters
  709.         from1
  710.         mid1
  711.       )
  712.       (cadr from1)
  713.     )
  714.       mpt2 (get-mindis-pt
  715.       (ss-pl-inters
  716.         from2
  717.         mid2
  718.       )
  719.       (cadr from2)
  720.     )
  721.        )
  722.      )
  723.     ) ;_3.3
  724.   ) ;_end cond
  725.   (setq
  726.     n1   (ss-ptc-c (car from1)
  727.      mpt1
  728.      (car m1)
  729.      (> (caddr from1) 0.0)
  730.          )
  731.     n2   (ss-ptc-c
  732.     (car from2)
  733.     mpt2
  734.     (car m2)
  735.     (> (caddr from2) 0.0)
  736.          )
  737.     lst1 (cons (ch-lst n1 2 (ch-lst mpt1 1 from1))
  738.         lst1
  739.          )
  740.     lst2 (cons (ch-lst n2 2 (ch-lst mpt2 1 from2))
  741.         lst2
  742.          )
  743.     mid1 (ch-lst mpt1 0 mid1)
  744.     mid2 (ch-lst mpt2 0 mid2)
  745.     lst1 (cons mid1 lst1) ;_(check-pt (list mpt1 mpt2))
  746.     lst2 (cons mid2 lst2)
  747.   )
  748.         ) ;_end 3.前弧后直
  749. ;;;
  750. ;;;_4.前段弧,后段弧                                                                           
  751.         ((and (/= c0 0.0) (/= c1 0.0))
  752.   (setq mid1 (car mid)
  753.         mid2 (cadr mid)
  754.         mid  (cddr mid)
  755.         mid3 (car mid)
  756.         mid4 (cadr mid)
  757.         mid  (cddr mid)
  758.         mid5 (car mid)
  759.         mid6 (cadr mid)
  760.         m1   (SS-PTC-ptcR
  761.         (car from1)
  762.         (cadr from1)
  763.         (caddr from1)
  764.       )
  765.         m2   (SS-PTC-ptcR
  766.         (car from2)
  767.         (cadr from2)
  768.         (caddr from2)
  769.       )
  770.         m3   (SS-PTC-ptcR
  771.         (car mid1)
  772.         (cadr mid1)
  773.         (caddr mid1)
  774.       )
  775.         m4   (SS-PTC-ptcR
  776.         (car mid2)
  777.         (cadr mid2)
  778.         (caddr mid2)
  779.       )
  780.   )
  781.   (cond ((= w02 w11) ;_4.1等宽      
  782.          (setq mpt1 (get-mindis-pt
  783.         (ss-pl-inters from1 mid1)
  784.         (cadr from1)
  785.       )
  786.         mpt2
  787.       (get-mindis-pt
  788.         (ss-pl-inters from2 mid2)
  789.         (cadr from2)
  790.       )
  791.          ) ;_有一种可能,因为计算误差,引起交点不存在的情况需要处理
  792.          (setq n1    (ss-ptc-c (car from1)
  793.           mpt1
  794.           (car m1)
  795.           (> (caddr from1) 0.0)
  796.        )
  797.         from1 (ch-lst n1 2 (ch-lst mpt1 1 from1))
  798.         n2    (ss-ptc-c
  799.          (car from2)
  800.          mpt2
  801.          (car m2)
  802.          (> (caddr from2) 0.0)
  803.        )
  804.         from2 (ch-lst n2 2 (ch-lst mpt2 1 from2))
  805.         n1    (ss-ptc-c mpt1
  806.           (cadr mid1)
  807.           (car m3)
  808.           (> (caddr mid1) 0.0)
  809.        )
  810.         mid1  (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  811.         n2    (ss-ptc-c mpt2
  812.           (cadr mid2)
  813.           (car m4)
  814.           (> (caddr mid2) 0.0)
  815.        )
  816.         mid2  (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  817.         lst1  (cons mid1 (cons from1 lst1))
  818.         lst2  (cons mid2 (cons from2 lst2))
  819.          )
  820.         )
  821.         ((> w02 w11) ;_4.2前宽后窄      
  822.          (setq mpt1 (get-mindis-pt
  823.         (ss-pl-inters
  824.           (list (cadr from1) (cadr from2) 0.0)
  825.           mid1
  826.         )
  827.         (car mid1)
  828.       )
  829.         mpt2 (get-mindis-pt
  830.         (ss-pl-inters
  831.           (list (cadr from1) (cadr from2) 0.0)
  832.           mid2
  833.         )
  834.         (car mid2)
  835.       )
  836.          )
  837.          (if (and mpt1 mpt2)
  838.     (progn
  839.       (setq n1 (ss-ptc-c mpt1
  840.            (cadr mid1)
  841.            (car m3)
  842.            (> (caddr mid1) 0.0)
  843.         )
  844.      n2 (ss-ptc-c mpt2
  845.            (cadr mid2)
  846.            (car m4)
  847.            (> (caddr mid2) 0.0)
  848.         )
  849.       )
  850.       (setq lst1 (cons from1 lst1)
  851.      lst2 (cons from2 lst2)
  852.      mid1 (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  853.      mid2 (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  854.      lst1 (cons mid1 lst1)
  855.      lst2 (cons mid2 lst2)
  856.       )
  857.     )
  858. ;_凸度同号,可能不存在交在宽者法边     
  859.     (setq mpt1  (get-mindis-pt
  860.            (ss-pl-inters
  861.       from1
  862.       mid1
  863.            )
  864.            (car mid1)
  865.          )
  866.           mpt2  (get-mindis-pt
  867.            (ss-pl-inters
  868.       from2
  869.       mid2
  870.            )
  871.            (car mid2)
  872.          ) ;_(check-pt (list mpt1 mpt2))      
  873.           n1    (ss-ptc-c (car from1)
  874.             mpt1
  875.             (car m1)
  876.             (> (caddr from1) 0.0)
  877.          )
  878.           n2    (ss-ptc-c (car from2)
  879.             mpt2
  880.             (car m2)
  881.             (> (caddr from2) 0.0)
  882.          )
  883.           from1 (ch-lst n1 2 (ch-lst mpt1 1 from1))
  884.           from2 (ch-lst n2 2 (ch-lst mpt2 1 from2))
  885.           n1    (ss-ptc-c mpt1
  886.             (cadr mid1)
  887.             (car m3)
  888.             (> (caddr mid1) 0.0)
  889.          )
  890.           n2    (ss-ptc-c mpt2
  891.             (cadr mid2)
  892.             (car m4)
  893.             (> (caddr mid2) 0.0)
  894.          )
  895.           mid1  (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  896.           mid2  (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  897.           lst1  (cons from1 lst1)
  898.           lst2  (cons from2 lst2)
  899.           lst1  (cons mid1 lst1)
  900.           lst2  (cons mid2 lst2)
  901.     )
  902.          ) ;_end if
  903.         )
  904.         ((< w02 w11) ;_4.3前窄后宽
  905.          (setq mpt1 (get-mindis-pt
  906.         (ss-pl-inters
  907.           from1
  908.           (list (car mid1) (car mid2) 0.0)
  909.         )
  910.         (cadr from1)
  911.       )
  912.         mpt2 (get-mindis-pt
  913.         (ss-pl-inters
  914.           from2
  915.           (list (car mid1) (car mid2) 0.0)
  916.         )
  917.         (cadr from2)
  918.       )
  919.          )
  920.          (if (and mpt1 mpt2)
  921.     (setq n1    (ss-ptc-c (car from1)
  922.             mpt1
  923.             (car m1)
  924.             (> (caddr from1) 0.0)
  925.          )
  926.           n2    (ss-ptc-c (car from2)
  927.             mpt2
  928.             (car m2)
  929.             (> (caddr from2) 0.0)
  930.          )
  931.           from1 (ch-lst n1 2 (ch-lst mpt1 1 from1))
  932.           from2 (ch-lst n2 2 (ch-lst mpt2 1 from2))
  933.           lst1  (cons from1 lst1)
  934.           lst2  (cons from2 lst2)
  935.           lst1  (cons mid1 lst1)
  936.           lst2  (cons mid2 lst2)
  937.     )
  938. ;_凸度同号,可能不存在都交于宽者法边交点      
  939.     (setq mpt1  (get-mindis-pt
  940.            (ss-pl-inters
  941.       from1
  942.       mid1
  943.            )
  944.            p1
  945.          )
  946.           mpt2  (get-mindis-pt
  947.            (ss-pl-inters
  948.       from2
  949.       mid2
  950.            )
  951.            p1
  952.          )
  953.           n1    (ss-ptc-c (car from1)
  954.             mpt1
  955.             (car m1)
  956.             (> (caddr from1) 0.0)
  957.          )
  958.           n2    (ss-ptc-c (car from2)
  959.             mpt2
  960.             (car m2)
  961.             (> (caddr from2) 0.0)
  962.          )
  963.           from1 (ch-lst n1 2 (ch-lst mpt1 1 from1))
  964.           from2 (ch-lst n2 2 (ch-lst mpt2 1 from2))
  965.           n1    (ss-ptc-c mpt1
  966.             (cadr mid1)
  967.             (car m3)
  968.             (> (caddr mid1) 0.0)
  969.          )
  970.           n2    (ss-ptc-c mpt2
  971.             (cadr mid2)
  972.             (car m4)
  973.             (> (caddr mid2) 0.0)
  974.          )
  975.           mid1  (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  976.           mid2  (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  977.           lst1  (cons from1 lst1)
  978.           lst2  (cons from2 lst2)
  979.           lst1  (cons mid1 lst1)
  980.           lst2  (cons mid2 lst2)
  981.     )
  982.          ) ;_end if
  983.         )
  984.   )
  985.   (setq
  986.     lst1
  987.          (cons mid5 (cons mid3 lst1))
  988.     lst2
  989.          (cons mid6 (cons mid4 lst2))
  990.   )
  991.         ) ;_end cond 4   
  992.       ) ;_end cond   
  993.     ) ;_end pro
  994. ) ;_end if
  995.       ) ;_end if pro
  996.     ) ;_end if
  997.     (setq w02 w12
  998.    w01 w11
  999.    c0  c1
  1000.    b   nil
  1001.    i   (1+ i)
  1002.     )
  1003.   ) ;_end foreach
  1004. ;;;双环列表创建完毕
  1005. ;;;
  1006. ;;;首尾连接处理
  1007.   (if (= is_close 1)
  1008.     (progn
  1009.       (setq from1 (car lst1)
  1010.      mid1  (last lst1)
  1011.      from2 (car lst2)
  1012.      mid2  (last lst2)
  1013.       )
  1014.       (setq mpt1 (get-mindis-pt (ss-pl-inters from1 mid1) (car mid1)) ;_(command "LINE" (list 0 0 0) mpt2 "")
  1015.      mpt2 (get-mindis-pt (ss-pl-inters from2 mid2) (car mid2))
  1016.       )
  1017.       (setq
  1018. n1    (if (= (caddr from1) 0.0)
  1019.   0.0
  1020.   (ss-ptc-c
  1021.     (car from1)
  1022.     mpt1
  1023.     (car (SS-PTC-ptcR
  1024.     (car from1)
  1025.     (cadr from1)
  1026.     (caddr from1)
  1027.          )
  1028.     )
  1029.     (> (caddr from1) 0.0)
  1030.   )
  1031.        )
  1032. n2    (if (= (caddr from2) 0.0)
  1033.   0.0
  1034.   (ss-ptc-c (car from2)
  1035.      mpt2
  1036.      (car (SS-PTC-ptcR
  1037.      (car from2)
  1038.      (cadr from2)
  1039.      (caddr from2)
  1040.           )
  1041.      )
  1042.      (> (caddr from2) 0.0)
  1043.   )
  1044.        )
  1045. from1 (ch-lst n1 2 (ch-lst mpt1 1 from1))
  1046. from2 (ch-lst n2 2 (ch-lst mpt2 1 from2))
  1047. n1    (if (= (caddr mid1) 0.0)
  1048.   0.0
  1049.   (ss-ptc-c mpt1
  1050.      (cadr mid1)
  1051.      (car (SS-PTC-ptcR
  1052.      (car mid1)
  1053.      (cadr mid1)
  1054.      (caddr mid1)
  1055.           )
  1056.      )
  1057.      (> (caddr mid1) 0.0)
  1058.   )
  1059.        )
  1060. n2    (if (= (caddr mid2) 0.0)
  1061.   0.0
  1062.   (ss-ptc-c mpt2
  1063.      (cadr mid2)
  1064.      (car (SS-PTC-ptcR
  1065.      (car mid2)
  1066.      (cadr mid2)
  1067.      (caddr mid2)
  1068.           )
  1069.      )
  1070.      (> (caddr mid2) 0.0)
  1071.   )
  1072.        )
  1073. mid1  (ch-lst n1 2 (ch-lst mpt1 0 mid1))
  1074. mid2  (ch-lst n2 2 (ch-lst mpt2 0 mid2))
  1075. lst1  (ch-lst from1 0 lst1)
  1076. lst1  (reverse (ch-lst mid1 0 (reverse lst1)))
  1077. lst2  (ch-lst from2 0 lst2)
  1078. lst2  (reverse (ch-lst mid2 0 (reverse lst2)))
  1079.       )
  1080.     )
  1081.   )
  1082.   ;;首尾连接处理完毕
  1083.      ;(setvar "osmode" 0) ;_测试用
  1084.   (setq lst1 (reverse lst1)) ;_(command "line" (list 0 0 0) (nth 0 (nth 2 lst2)) "")
  1085.   (if (= is_close 0)
  1086.     (progn
  1087.       (setq len (length lst1)
  1088.      i 1
  1089.      lst nil
  1090.       )
  1091.       (foreach a lst1
  1092. (if (< i len)
  1093.    (progn
  1094.      (setq
  1095.        lst
  1096.         (append lst
  1097.          (list (cons 10 (car a)) (cons 42 (caddr a)))
  1098.         )
  1099.      )
  1100.      (if (eq (cadr a) (car (nth i lst1)))
  1101.        nil
  1102.        (setq lst
  1103.        (append lst (list (cons 10 (cadr a)) (cons 42 0.0)))
  1104.        )
  1105.      )
  1106.    )
  1107.    (progn
  1108.      (setq
  1109.        lst
  1110.         (append lst
  1111.          (list (cons 10 (car a)) (cons 42 (caddr a)))
  1112.         )
  1113.      )
  1114.      (setq
  1115.        lst
  1116.         (append lst (list (cons 10 (cadr a)) (cons 42 0.0)))
  1117.      )
  1118.    )
  1119. )
  1120. (setq i (1+ i))
  1121.       )
  1122.       (setq i 1)
  1123.       (foreach a lst2
  1124. (if (< i len)
  1125.    (progn
  1126.      (setq lst
  1127.      (append
  1128.        lst
  1129.        (list (cons 10 (cadr a)) (cons 42 (* -1.0 (caddr a))))
  1130.      )
  1131.      )
  1132.      (if (eq (car a) (cadr (nth i lst2)))
  1133.        nil
  1134.        (setq lst
  1135.        (append lst (list (cons 10 (car a)) (cons 42 0.0)))
  1136.        )
  1137.      )
  1138.    )
  1139.    (progn
  1140.      (setq lst (append lst
  1141.          (list (cons 10 (cadr a))
  1142.         (cons 42 (* -1.0 (caddr a)))
  1143.          )
  1144.         )
  1145.      )
  1146.      (setq
  1147.        lst
  1148.         (append lst (list (cons 10 (car a)) (cons 42 0.0)))
  1149.      )
  1150.    )
  1151. )
  1152. (setq i (1+ i))
  1153.       )
  1154.       (setq lst (append (list (cons 0 "LWPOLYLINE")
  1155.          (cons 100 "AcDbEntity")
  1156.          (cons 100 "AcDbPolyline")
  1157.          (cons 90 (/ (length lst) 2))
  1158.          (cons 70 1)
  1159.          (cons 43 0.0)
  1160.    )
  1161.    lst
  1162.   )
  1163.       ) ;_(check-pt (ss-assoc 10 lst))
  1164.      ;(entmakex lst)
  1165.       (setq end (list lst))
  1166.     )
  1167.     (progn
  1168.       (setq len (length lst1)
  1169.      i 1
  1170.      lst nil
  1171.       )
  1172.       (foreach a lst1
  1173. (if (< i len)
  1174.    (progn
  1175.      (setq
  1176.        lst
  1177.         (append lst
  1178.          (list (cons 10 (car a)) (cons 42 (caddr a)))
  1179.         )
  1180.      )
  1181.      (if (eq (cadr a) (cadr (nth i lst1)))
  1182.        nil
  1183.        (setq lst
  1184.        (append lst (list (cons 10 (cadr a)) (cons 42 0.0)))
  1185.        )
  1186.      )
  1187.    )
  1188.    (progn
  1189.      (setq
  1190.        lst
  1191.         (append lst
  1192.          (list (cons 10 (car a)) (cons 42 (caddr a)))
  1193.         )
  1194.      )
  1195.      (if (eq (cadr a) (caar lst1))
  1196.        nil
  1197.        (setq
  1198.   lst
  1199.    (append lst (list (cons 10 (cadr a)) (cons 42 0.0)))
  1200.        )
  1201.      )
  1202.    )
  1203. )
  1204. (setq i (1+ i))
  1205.       )
  1206.       (setq lst (append (list (cons 0 "LWPOLYLINE")
  1207.          (cons 100 "AcDbEntity")
  1208.          (cons 100 "AcDbPolyline")
  1209.          (cons 90 (/ (length lst) 2))
  1210.          (cons 70 1)
  1211.          (cons 43 0.0)
  1212.    )
  1213.    lst
  1214.   )
  1215.       )
  1216.      ;(entmakex lst)
  1217.       (setq i  1
  1218.      lst2 (reverse lst2)
  1219.      end  (cons lst end)
  1220.      lst  nil
  1221.       )
  1222.       (foreach a lst2
  1223. (if (< i len)
  1224.    (progn
  1225.      (setq
  1226.        lst
  1227.         (append
  1228.    lst
  1229.    (list (cons 10 (car a)) (cons 42 (caddr a)))
  1230.         )
  1231.      )
  1232.      (if (eq (cadr a) (cadr (nth i lst2)))
  1233.        nil
  1234.        (setq lst
  1235.        (append lst (list (cons 10 (cadr a)) (cons 42 0.0)))
  1236.        )
  1237.      )
  1238.    )
  1239.    (progn
  1240.      (setq
  1241.        lst
  1242.         (append lst
  1243.          (list (cons 10 (car a)) (cons 42 (caddr a)))
  1244.         )
  1245.      )
  1246.      (if (eq (cadr a) (caar lst2))
  1247.        nil
  1248.        (setq
  1249.   lst
  1250.    (append lst (list (cons 10 (cadr a)) (cons 42 0.0)))
  1251.        )
  1252.      )
  1253.    )
  1254. )
  1255. (setq i (1+ i))
  1256.       )
  1257.       (setq lst (append (list (cons 0 "LWPOLYLINE")
  1258.          (cons 100 "AcDbEntity")
  1259.          (cons 100 "AcDbPolyline")
  1260.          (cons 90 (/ (length lst) 2))
  1261.          (cons 70 1)
  1262.          (cons 43 0.0)
  1263.    )
  1264.    lst
  1265.   )
  1266.       )
  1267.       (setq end (reverse (cons lst end)))
  1268.      ;(entmakex lst)
  1269.     )
  1270.   ) ;_end if
  1271.   end
  1272. )
主函数源码2:
  1. (defun SS-PL->SBound (pl     /     ent    is_close  pl_vetex
  2.         b      i     lst1   lst2   w02  c0 p1
  3.         p2     w11    w12    c1   b  mid mid1
  4.         mid2
  5.        )   ;(setq pl (car (entsel)))  
  6.   (setq ent (entget pl '("*")))
  7.   (setq is_close (rem (cdr (assoc 70 ent)) 2))
  8.   (setq pl_vetex nil
  9. b nil
  10.   )
  11.   (foreach n ent ;_(setq e (assoc 10 ent))
  12.     (if (or (= 10 (car n))
  13.      (= 40 (car n))
  14.      (= 41 (car n))
  15.      (= 42 (car n))
  16. ) ;_ 结束or
  17.       (progn
  18. (setq b (cons (cdr n) b))
  19. (if (= 4 (length b))
  20.    (setq pl_vetex (append pl_vetex (list (reverse b)))
  21.   b  nil
  22.    )
  23. )
  24.       )
  25.     )
  26.   )
  27.   (setq i 0
  28. b nil
  29.   )
  30.   (foreach a pl_vetex   ;(setq a (nth 1 pl_vetex))
  31.     (setq p1  (car a)
  32.    w11 (cadr a)
  33.    w12 (caddr a)
  34.    c1  (cadddr a)
  35.    b   (nth (1+ i) pl_vetex)
  36.     )
  37.    ;_(if (= i 1) (princ "pause"))
  38.     (if (and (null b) (= is_close 1))
  39.       (setq b (car pl_vetex))
  40.     )
  41.     (if (setq p2 (car b))
  42.       (progn
  43. (setq mid  (ss-plwk-pts p1 w11 w12 c1 p2)
  44.        lst1 nil
  45.        lst2 nil
  46.        lst3 nil
  47.        lst4 nil
  48. )
  49. (repeat (/ (length mid) 2)
  50.    (setq
  51.      mid1 (car mid)
  52.      mid2 (cadr mid)
  53.      mid  (cddr mid)
  54.      lst1 (if (equal (car mid1) (car lst1))
  55.      (cons (cadr mid1) lst1)
  56.      (cons (cadr mid1) (cons (car mid1) lst1))
  57.    )
  58.      lst2 (if (equal (car mid2) (car lst2))
  59.      (cons (cadr mid2) lst2)
  60.      (cons (cadr mid2) (cons (car mid2) lst2))
  61.    )
  62.      lst3 (cons (caddr mid1) lst3)
  63.      lst4 (cons (* -1.0 (caddr mid2)) lst4)
  64.    )
  65. )
  66. (draw-pline
  67.    (append (reverse lst1) lst2)
  68.    0.0
  69.    (append (reverse lst3) (append (cons 0.0 lst4) (list 0.0)))
  70.    nil
  71.    -1
  72.    1
  73. )
  74.       ) ;_end if pro   
  75.     )
  76.     (setq i (1+ i))
  77.   ) ;_end foreach  
  78. ;_end if
  79.   (princ)
  80. )
配套函数源码3:
  1. ;;;配套函数-------------------------------------------------------------;;;
  2. (setq _pi2 1.5707963267948966192313216916395
  3.       _2pi 6.283185307179586476925286766559
  4.       _1d 0.0174532925199433
  5. )
  6. ;;;---------------------------------------------------------------------;;;
  7. ;;;获取单段PL线的4个角点和两边凸度
  8. ;;;直线段返回4个点((pt11 pt21 n11) (pt12 pt22 n12))
  9. ;;;高山流水2010-06-25
  10. ;;;(ss-plwk-pts p1 w11 w12 c1 p2)
  11. ;;;(setq pt1 p1 w1 w11 w2 12 n c1 pt2 p2)
  12. (defun ss-plwk-pts (pt1    w1   w2  n pt2    /      ptcR0
  13.       ptc0   R0   mpt0  ang1 ang2 ang2a  ang2a/6 dw pt11
  14.       pt12   pt21   pt22  ptm1 ptm2   ptcr1  ptcr2
  15.       ptlst   lst i  n1 n2
  16.      )
  17.   (if (/= n 0.0)
  18.     (progn
  19.       (setq ptcR0 (SS-PTC-ptcR pt1 pt2 n)
  20.      ptc0  (car ptcr0)
  21.      R0   (cadr ptcr0)   
  22.      ang1  (angle ptc0 pt1)
  23.      ang2  (angle ptc0 pt2)
  24.      ang2a (angle (list 0.0 0.0 0.0) (gsls-XY->AB pt2 ptc0 ang1))
  25.      ang2a (if (> n 0)
  26.       ang2a
  27.       (- ang2a _2pi)
  28.     )
  29.      ang2a/6 (/ ang2a 6.0)
  30.      dw (/ (- w2 w1) 6.0)
  31.      )
  32.       (setq i 0
  33.      ptlst nil)
  34.       (repeat 7
  35. (setq pt11 (polar (polar ptc0 (+ ang1 (* i ang2a/6)) R0) (+ ang1 (* i ang2a/6) pi) (/ (+ w1 (* i dw)) 2.0))
  36.        pt12 (polar (polar ptc0 (+ ang1 (* i ang2a/6)) R0) (+ ang1 (* i ang2a/6)) (/ (+ w1 (* i dw)) 2.0))
  37.        ptlst (cons pt12 (cons pt11 ptlst))
  38.        i (1+ i)
  39.        )
  40. )
  41.       ;(check-pt ptlst)
  42.       (setq i 0
  43.      ptlst (reverse ptlst)
  44.      lst nil
  45.      )
  46.       (repeat 3
  47. (setq pt11 (nth (* i 4) ptlst)
  48.        pt12 (nth (1+ (* i 4)) ptlst)
  49.        ptm1 (nth (+ (* i 4) 2) ptlst)
  50.        ptm2 (nth (+ (* i 4) 3) ptlst)
  51.        pt21 (nth (+ (* i 4) 4) ptlst)
  52.        pt22 (nth (+ (* i 4) 5) ptlst)
  53.        ptcr1 (SS-PT-ptcR pt11 ptm1 pt21)
  54.        ptcr2 (ss-pt-ptcr pt12 ptm2 pt22)
  55.        n1 (ss-ptc-c pt11 pt21 (car ptcr1) (> n 0))
  56.        n2 (ss-ptc-c pt12 pt22 (car ptcr2) (> n 0))
  57.        )
  58. (if (> n 0.0)
  59. (setq lst (cons (list pt12 pt22 n2) (cons (list pt11 pt21 n1) lst)))
  60.   (setq lst (cons (list pt11 pt21 n1) (cons (list pt12 pt22 n2) lst)))
  61.       )
  62. (setq i (1+ i))
  63. )
  64.       (setq lst (reverse lst))
  65.     )
  66.     (progn
  67.       (setq ang  (angle pt1 pt2)
  68.      pt11 (polar pt1 (+ ang _pi2) (/ w1 2.0))
  69.      pt12 (polar pt1 (- ang _pi2) (/ w1 2.0))
  70.      pt21 (polar pt2 (+ ang _pi2) (/ w2 2.0))
  71.      pt22 (polar pt2 (- ang _pi2) (/ w2 2.0))
  72.       )
  73.       (list (list pt11 pt21 0.0) (list pt12 pt22 0.0))
  74.     )
  75.   )
  76. )
  77. ;;;---------------------------------------------------------------------;;;
  78. ;;;已知圆弧起点、终点和凸度,求圆心和半径
  79. ;;;高山流水2010-06-25
  80. ;;;(SS-PTC-ptcR '(764814.0 -1.11779e+006 0.0) '(734523.0 -1.11239e+006) -0.722053)
  81. (defun SS-PTC-ptcR (pt1 pt2 convexity / ang mpt a b ptc R)
  82.   (setq ang (angle pt1 pt2)
  83. mpt (midpt pt1 pt2)
  84. b   (distance pt1 mpt)
  85. a   (* b
  86.         (/ (sin (- _pi2 (* 2.0 (atan convexity))))
  87.     (cos (- _pi2 (* 2.0 (atan convexity))))
  88.         )
  89.      )
  90. ptc (polar mpt (+ ang _pi2) a)
  91. R   (sqrt (+ (* a a) (* b b)))
  92.   )
  93.   (list ptc R)
  94. )
  95. ;;;---------------------------------------------------------------------;;;
  96. ;;;已知圆弧上的3点,求圆心和半径
  97. ;;;高山流水2010-06-25
  98. (defun SS-PT-ptcR (pt1 mpt pt2 / mpt1 mpt2 mpt11 mpt22 ptc R)
  99.   (setq mpt1  (midpt pt1 mpt)
  100. mpt2  (midpt mpt pt2)
  101. mpt11 (polar mpt1 (+ (angle pt1 mpt) _pi2) 1000.0)
  102. mpt22 (polar mpt2 (+ (angle mpt pt2) _pi2) 1000.0)
  103. ptc   (inters mpt1 mpt11 mpt2 mpt22 nil)
  104. R     (distance ptc pt1)
  105.   );_(check-pt (list pt1 mpt pt2))
  106.   (list ptc R)
  107. )
  108. ;;;---------------------------------------------------------------------;;;
  109. ;;;已知圆弧的端点pt1->pt2,圆心ptc,求凸度
  110. ;;;高山流水2010-06-26
  111. ;;;
  112. (defun ss-ptc-c (pt1 pt2 ptc is_nsz / ang1 pt2a ang2)
  113.   (setq ang1 (angle ptc pt1)
  114. pt2a (gsls-XY->AB pt2 ptc ang1)
  115. ang2 (angle (list 0.0 0.0 0.0) pt2a)
  116.   )
  117.   (if is_nsz
  118.     nil
  119.     (setq ang2 (- ang2 _2pi))
  120.   )
  121.   (/ (sin (/ ang2 4.0)) (cos (/ ang2 4.0)))
  122. )
  123. ;;;---------------------------------------------------------------------;;;
  124. ;;;将点XY坐标换算为AB坐标,AB坐标的原点为PT0,转角为R0
  125. ;;;A=(X-X0)cosR0+(Y-Y0)sinR0
  126. ;;;B=(Y-Y0)cosR0-(X-X0)sinR0
  127. (defun gsls-XY->AB (pt pt0 ANG / A B)
  128.   (setq A (+ (* (- (car pt) (car pt0)) (cos ANG))
  129.       (* (- (cadr pt) (cadr pt0)) (sin ANG))
  130.    )
  131. B (- (* (- (cadr pt) (cadr pt0)) (cos ANG))
  132.       (* (- (car pt) (car pt0)) (sin ANG))
  133.    )
  134.   )
  135.   (list A B 0.0)
  136. )
  137. ;;;---------------------------------------------------------------------;;;
  138. ;;;求两点中点
  139. (defun midpt (pta ptb)
  140.   (mapcar (function (lambda (x y)
  141.         (/ (+ x y) 2.0)
  142.       )
  143.    )
  144.    pta
  145.    ptb
  146.   )
  147. )
  148. ;;;---------------------------------------------------------------------;;;
  149. ;;;求直线、圆弧交点集,点凸版
  150. ;;;(ss-pl-inters '((713708.0 -563492.0) (717691.0 -570078.0) 0.0) '((715257.0 -566053.0) (720145.0 -553354.0) 0.280634))
  151. (defun ss-pl-inters (mid1 mid2 / intersections)
  152.   (setq pt11 (car mid1)
  153. pt12 (cadr mid1)
  154. n1 (caddr mid1)
  155. pt21 (car mid2)
  156. pt22 (cadr mid2)
  157. n2 (caddr mid2)
  158. intersections nil
  159.   )
  160.   (cond ((= n1 n2 0.0) ;_直线交直线
  161.   (list (inters pt11 pt12 pt21 pt22 nil))
  162. )
  163. ((and (= n1 0.0) (/= n2 0.0)) ;_直线交圆弧
  164.   (setq ptcr2 (SS-PTC-ptcR pt21 pt22 n2))
  165.   (L_INT_C pt11 pt12 (car ptcr2) (cadr ptcr2))
  166. )
  167. ((and (/= n1 0.0) (= n2 0.0)) ;_圆弧交直线
  168.   (setq ptcr1 (SS-PTC-ptcR pt11 pt12 n1))
  169.   (L_INT_C pt21 pt22 (car ptcr1) (cadr ptcr1))
  170. )
  171. ((and (/= n1 0.0) (/= n2 0.0)) ;_圆弧交圆弧
  172.   (setq ptcr1 (SS-PTC-ptcR pt11 pt12 n1)
  173.         ptcr2 (SS-PTC-ptcR pt21 pt22 n2)
  174.   )
  175.   (c_int_c (car ptcr1) (cadr ptcr1) (car ptcr2) (cadr ptcr2))
  176. )
  177.   )
  178. )
  179. ;;;---------------------------------------------------------------------;;;
  180. ;;;此函数2010.07.06改版,注意其他程序
  181. (defun gsls-ang-trans (ang)
  182.   (while (> ang pi)
  183.     (setq ang (- ang pi))
  184.   )
  185.   (while (< ang 0.0)
  186.     (setq ang (+ ang pi))
  187.   )
  188.   ang
  189. )
  190. ;;;---------------------------------------------------------------------;;;
  191. ;;;用到WK函数
  192. ;___________________直线与圆交点函数,输入值直线端点1,端点2,圆心,半径.返回值交点表
  193.   (defun L_INT_C (l_end1 l_end2 c_cen c_rad / pedal dist_cen_l int1 int2
  194.     ints)
  195.     (setq pedal (pedal_to_line c_cen l_end1 l_end2)
  196.    dist_cen_l (distance pedal c_cen))
  197.     (cond
  198.       ((equal c_rad dist_cen_l min_num) (setq ints (list pedal)))
  199.       ((> c_rad dist_cen_l)
  200.        (progn
  201.   (setq int1
  202.   (polar pedal
  203.          (angle l_end1 l_end2)
  204.          (sqrt (- (* c_rad c_rad) (* dist_cen_l dist_cen_l)))
  205.   )
  206.   )
  207.   (setq int2
  208.   (polar pedal
  209.          (+ pi (angle l_end1 l_end2))
  210.          (sqrt (- (* c_rad c_rad) (* dist_cen_l dist_cen_l)))
  211.   )
  212.   )
  213.   (setq ints (list int1 int2))
  214.        )
  215.       )
  216.     )
  217.     ints
  218.   )
  219. ;;;点到直线的垂足坐标
  220. (defun pedal_to_line (pt pt1 pt2)
  221.   (inters
  222.     pt
  223.     (polar pt (+ (/ pi 2) (angle pt1 pt2)) 1000)
  224.     pt1
  225.     pt2
  226.     nil
  227.   )
  228. )
  229. ;_精度设置_________________________________________________
  230.   (setq min_num 1e-7)
  231. ;___________________圆与圆交点函数,输入值圆心1,半径1,圆心2,半径2.返回值交点表
  232.   (defun c_int_c (c1_cen c1_rad c2_cen c2_rad / ints c1c2_dis dd ee)
  233.     (setq c1c2_dis (distance c1_cen c2_cen))
  234.     (cond
  235.       ((equal c1c2_dis (+ c1_rad c2_rad) min_num)
  236.        (setq ints (list (polar c1_cen (angle c1_cen c2_cen) c1_rad)))
  237.       )
  238.       ((equal c1c2_dis (abs (- c1_rad c2_rad)) min_num)
  239.        (if (minusp (- c1_rad c2_rad))
  240.   (setq ints (list (polar c2_cen (angle c2_cen c1_cen) c2_rad)))
  241.   (setq ints (list (polar c1_cen (angle c1_cen c2_cen) c1_rad)))
  242.        )
  243.       )
  244.       ((and (> c1c2_dis (abs (- c1_rad c2_rad)))
  245.      (< c1c2_dis (+ c1_rad c2_rad))
  246.        )
  247.        (progn
  248.   (setq dd (/ (- (+ (* c1c2_dis c1c2_dis) (* c1_rad c1_rad))
  249.    (* c2_rad c2_rad)
  250.        )
  251.        (* 2 c1c2_dis)
  252.     )
  253.   )
  254.   (setq ee (sqrt (- (* c1_rad c1_rad) (* dd dd))))
  255.   (setq
  256.     ints (list (polar (polar c1_cen (angle c1_cen c2_cen) dd)
  257.         (+ (angle c1_cen c2_cen) (/ pi 2))
  258.         ee
  259.         )
  260.   )
  261.   )
  262.   (setq ints
  263.   (append
  264.     ints
  265.     (list (polar (polar c1_cen (angle c1_cen c2_cen) dd)
  266.           (- (angle c1_cen c2_cen) (/ pi 2))
  267.           ee
  268.    )
  269.     )
  270.   )
  271.   )
  272.        )
  273.       )
  274.     )
  275.     ints
  276.   )
  277. ;;;________________________________________________;;;
  278. ;;;---------------------------------------------------------------------;;;
  279. ;;;其他函数
  280. ;;;获取点集ptlst中与点pt距离最近的点
  281. (defun get-mindis-pt (ptlst pt)
  282.   (car
  283.     (vl-sort ptlst
  284.       (function (lambda (e1 e2)
  285.     (< (distance e1 pt) (distance e2 pt))
  286.          )
  287.       )
  288.     )
  289.   )
  290. )
  291. ;;;---------------------------------------------------------------------;;;
  292. ;;;参考qj_chen表项替代函数改进
  293. ;;;表项替换,支持2重表,当指定i为list如(3 1)时,替换第3个子表中的第1个元素
  294. (defun ch-lst (new i lst / j len fst mid)
  295.   (if (/= (type i) 'list)
  296.     (cond
  297.       ((minusp i)
  298.        lst
  299.       )
  300.       ((> i (setq len (length lst)))
  301.        lst
  302.       )
  303.       ((> i (/ len 2))
  304.        (reverse (ch-lst new (1- (- len i)) (reverse lst)))
  305.       )
  306.       (t
  307.        (append
  308.   (progn
  309.     (setq fst nil)
  310.     (repeat (rem i 4)
  311.       (setq fst (cons (car lst) fst)
  312.      lst (cdr lst)
  313.       )
  314.     )
  315.     (repeat (/ i 4)
  316.       (setq fst (cons (cadddr lst)
  317.         (cons (caddr lst)
  318.        (cons
  319.          (cadr lst)
  320.          (cons
  321.            (car lst)
  322.            fst
  323.          )
  324.        )
  325.         )
  326.          )
  327.      lst (cddddr lst)
  328.       )
  329.     )
  330.     (reverse fst)
  331.   )
  332.   (list new)
  333.   (cdr lst)
  334.        )
  335.       )
  336.     )
  337.     (progn
  338.       (setq j (cadr i)
  339.      i (car i)
  340.       )
  341.       (if j
  342. (progn
  343.    (setq mid (nth i lst))
  344.    (setq mid (ch-lst new j mid))
  345.    (ch-lst mid i lst)
  346. )
  347. (ch-lst new i lst)
  348.       )
  349.     )
  350.   )
  351. )
  352. ;;;---------------------------------------------------------------------;;;
  353. ;;;用到 吴所不及 函数
  354. ;;;转换选择集为表
  355. (defun wjm_ss2lst (ss / i e lst)
  356.   (if (= (type ss) 'PICKSET)
  357.     (progn
  358.       (setq i -1)
  359.       (while (setq e (ssname ss (setq i (1+ i))))
  360. (if (= (type e) 'ENAME) (setq lst (cons e lst)) nil)
  361.       )
  362.       lst
  363.     )
  364.     nil
  365.   )
  366. )
如有问题请采用下列代码将问题图元表贴出  
  1. ;;;实体与字符串互换
  2. (defun obj->str (ent / relst mid ent)
  3.   (setq relst (list -1 330 330 5 100 100 102 102 410))
  4.   (setq mid (print ent))
  5.   (foreach num relst
  6.     (progn
  7.       (setq mid (vl-remove (assoc num mid) mid))
  8.     )
  9.   )
  10.   (vl-prin1-to-string mid)
  11. )
  12. (defun c:tt ()
  13.   (obj->str (entget (car (entsel)) '("*")))
  14.   (princ)
  15. )

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

 楼主| 发表于 2010-8-9 16:13:00 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2010-8-10 10:39:00 | 显示全部楼层
习惯性的收藏一下,,,,,,,
发表于 2010-10-15 17:10:00 | 显示全部楼层
收藏
发表于 2010-10-15 17:40:00 | 显示全部楼层
支持一下!
发表于 2010-10-15 19:01:00 | 显示全部楼层

很不错!支持楼主的无私!ppl1命令缺少DRAW-PLINE函数,请楼主补一下!

发表于 2010-10-16 16:43:00 | 显示全部楼层
“高山”应该继续研究下去……
 楼主| 发表于 2010-10-24 00:07:00 | 显示全部楼层
应6楼要求,把缺漏函数补上
  1. ;;--------------------------------------------------------------------------------------;;;
  2. ;;;draw-pline                                                                                                         ;;;
  3. ;;;--------------------------------------------------------------------------------------;;;
  4. ;;;
  5. ;;;function: to make a polyline by code and return ename
  6. ;;;
  7. ;;;Variants:
  8. ;;;pl_list: the points list offered by order
  9. ;;;width : 0.0 or num, or a list like ((0.0 0.0) (0.0 20) (20 0.0)...),if nil it will getvar "plinewid" ,
  10. ;;;        if it's length noteq d90 then wid41 and wid42 equal to 0.0 .   
  11. ;;;d42_lst: 0.0 or num, or nil, if nil or it's length noteq d90 then d42 equal to 0.0 .
  12. ;;;
  13. ;;;lay_pl: layername, if nil it will getvar "CLAYER"
  14. ;;;
  15. ;;;color : color number, if it's -1 then getvar "COLOR" ellse set it by the given color number
  16. ;;;
  17. ;;;Prompt:
  18. ;;;If width list or d42_lst list is Exist , it's order must be same to the pl_list,
  19. ;;;   otherwise it will take out a wrong polyline .
  20. ;;;
  21. ;;;Written By WJM and GSLS(SS),2010.06.30
  22. ;;;
  23. (defun draw-pline
  24.     (pl_list width   d42_lst lay_pl  color   d70
  25.      /    d90    i    wid    d42    wid40
  26.      wid41   en000   pb
  27.     ) ;_加入宽度列表和凸度列表
  28.   (setq d90 (length pl_list)
  29. pb  '()
  30. i   0
  31.   )
  32.   (cond ((and (listp width)
  33.        (listp d42_lst)
  34.        (= (length width) (length d42_lst) d90)
  35.   )
  36.   (foreach pt pl_list
  37.     (setq wid   (nth i width)
  38.    d42   (nth i d42_lst)
  39.    wid40 (car wid)
  40.    wid41 (cadr wid)
  41.    pb    (append pb
  42.           (list (cons 10 pt)
  43.          (cons 40 wid40)
  44.          (cons 41 wid41)
  45.          (cons 42 d42)
  46.           )
  47.          )
  48.    i     (1+ i)
  49.     )
  50.   )
  51. )
  52. ((and (or (numberp width) (null width))
  53.        (listp d42_lst)
  54.        (= (length d42_lst) d90)
  55.   )
  56.   (if (null width)
  57.     (setq wid40 (getvar "plinewid")
  58.    wid41 (getvar "plinewid")
  59.     )
  60.     (setq wid40 width
  61.    wid41 width
  62.     )
  63.   )
  64.   (foreach pt pl_list
  65.     (setq d42 (nth i d42_lst)
  66.    pb  (append pb
  67.         (list (cons 10 pt)
  68.        (cons 40 wid40)
  69.        (cons 41 wid41)
  70.        (cons 42 d42)
  71.         )
  72.        )
  73.    i   (1+ i)
  74.     )
  75.   )
  76. )
  77. ((and (listp width)
  78.        (= (length width) d90)
  79.        (or (null d42_lst) (numberp d42_lst))
  80.   )
  81.   (if (null d42_lst)
  82.     (setq d42 0.0)
  83.     (setq d42 d42_lst)
  84.   )
  85.   (foreach pt pl_list
  86.     (setq wid   (nth i width)
  87.    wid40 (car wid)
  88.    wid41 (cadr wid)
  89.    pb    (append pb
  90.           (list (cons 10 pt)
  91.          (cons 40 wid40)
  92.          (cons 41 wid41)
  93.          (cons 42 d42)
  94.           )
  95.          )
  96.    i     (1+ i)
  97.     )
  98.   )
  99. )
  100. (t
  101.   (if (numberp width)
  102.     (setq wid40 width
  103.    wid41 width
  104.     )
  105.     (setq wid40 0.0
  106.    wid41 0.0
  107.     )
  108.   )
  109.   (foreach pt pl_list
  110.     (setq pb (append pb
  111.        (list (cons 10 pt)
  112.       (cons 40 wid40)
  113.       (cons 41 wid41)
  114.       (cons 42 0.0)
  115.        )
  116.       )
  117.     )
  118.   )
  119. )
  120.   )
  121.   (setq en000 (append (list
  122.    (cons 0 "LWPOLYLINE")
  123.    (cons 100 "AcDbEntity")
  124.    (cons 8
  125.          (if (and lay_pl (/= lay_pl ""))
  126.     lay_pl
  127.     (getvar "CLAYER")
  128.          )
  129.    ) ;_这里稍微改动了下
  130.    (cons 100 "AcDbPolyline")
  131.    (cons 90 d90)
  132.    (cons 70 d70)
  133.         )
  134.         pb
  135.        )
  136.   )
  137.   (if (and color (/= -1 color))
  138.     (setq en000 (append en000 (list (cons 62 color))))
  139.   )
  140.   (if (= nil (entmake en000))
  141.     (princ "\n制造 LWPL 制造失败.")
  142.   )
  143.   (entlast)
  144. )
 楼主| 发表于 2010-10-24 00:09:00 | 显示全部楼层
谢谢院长的鼓励,最近比较忙,得空了,结合ACAD2011看看,有没有办法简化些
发表于 2010-10-24 09:00:00 | 显示全部楼层

有意思,可能也很有意义。

支持

 

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

本版积分规则

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

GMT+8, 2024-12-26 23:59 , Processed in 0.259469 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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