找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1301|回复: 7

[测试]:钝刀斩乱麻,请大家测试下!

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-11-6 16:00:57 | 显示全部楼层 |阅读模式

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

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

×
总想搞个和院长的“快刀”差不多的东东,现在终于有点成型。请大家测试,并提出指导!

  1.   [FONT=courier new]
  2. ;;; ==================================================================
  3. ;;; 主程序,偶尔还有点毛病
  4. (defun c:ddzlm (/ curve mark ss ss0 ss1 ss2)
  5.   (p-s '(("CMDECHO" 0) ("OSMODE" 0)) t)
  6.   (setq mark (ukword 1 "1 2 3 4" "\n\t方式 : 1-打断/2-打断内部删除(不含不与钝刀相交者)/3-打断内部删除(含不与钝刀相交者)/4-打断外部删除"
  7.                      mark
  8.              )
  9.   )
  10.   (setq curve (car (entsel "\n请选择钝刀<回车退出>:")))        ;  (repeat 5
  11.                                        ; 添加此循环,可减少毛病,至今令我迷
  12.                                        ; 惑
  13.   (cond
  14.     ((= mark "1")
  15.       (if (setq ss0 (txt-sel-intofobj curve))
  16.         (th-ss-break-by-curve ss0 curve)
  17.       )
  18.     )
  19.     ((= mark "2")
  20.       (if (setq ss0 (txt-sel-intofobj curve))
  21.         (th-ss-break-by-curve ss0 curve)
  22.       )
  23.       (setq ss (th-touch-in-curve curve))
  24.       (command "_.erase" ss "")
  25.     )
  26.     ((= mark "3")
  27.       (if (setq ss0 (txt-sel-intofobj curve))
  28.         (th-ss-break-by-curve ss0 curve)
  29.       )
  30.       (setq ss1 (th-touch-in-curve curve))
  31.       (setq ss2 (txt-sel-inobj curve))
  32.       (setq ss (th-ss-union ss1 ss2))
  33.       (command "_.erase" ss "")
  34.     )
  35.     ((= mark "4")
  36.       (if (setq ss0 (txt-sel-intofobj curve))
  37.         (th-ss-break-by-curve ss0 curve)
  38.       )
  39.       (setq ss (th-touch-out-curve curve))
  40.       (command "_.erase" ss "")
  41.     )
  42.     (t
  43.       nil
  44.     )
  45.   )                                       ;  )
  46.   (p-e)
  47. )
  48. ;;; ==================================================================
  49. ;;; 相关函数,大部分是从网上抄来的。没有注明出处,请原作者原谅!
  50. ;;; ==================================================================
  51. ;;; 用于程序开头,varlst为重设的系统变量及其值的列表,无改变时用nil替代。
  52. ;;; mark为t时,调用undo,nil时不调用。
  53. (defun p-s (varlst mark / sysnamelst valuelst)
  54.   (setq undo$mark mark)
  55.   (if undo$mark
  56.     (vla-startundomark (vla-get-activedocument
  57.                                                (vlax-get-acad-object)
  58.                        )
  59.     )
  60.   )
  61.   (if varlst
  62.     (setq *#$*sysvarnl*#$* (mapcar
  63.                              'car
  64.                              varlst
  65.                            )
  66.           sysnamelst *#$*sysvarnl*#$*
  67.           valuelst (mapcar
  68.                      'cadr
  69.                      varlst
  70.                    )
  71.     )
  72.   )
  73.   (defun myerr (errmsg)
  74.     (if (not (member errmsg '("console break" "Function Cancelled")))
  75.       (princ (strcat "\nError: " errmsg))
  76.     )
  77.     (p-e)
  78.   )
  79.   (setq errtmp *error*)
  80.   (setq *error* myerr)
  81.   (if *#$*sysvarnl*#$*
  82.     (progn
  83.       (setq *#$*svarl*#$* (mapcar
  84.                             'getvar
  85.                             *#$*sysvarnl*#$*
  86.                           )
  87.       )
  88.       (mapcar
  89.         'setvar
  90.         sysnamelst
  91.         valuelst
  92.       )
  93.     )
  94.   )
  95.   (princ)
  96. )
  97. ;;; ==================================================================
  98. ;;; 用于程序开头结尾
  99. (defun p-e ()
  100.   (if undo$mark
  101.     (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  102.   )
  103.   (if *#$*svarl*#$*
  104.     (mapcar
  105.       'setvar
  106.       *#$*sysvarnl*#$*
  107.       *#$*svarl*#$*
  108.     )
  109.   )
  110.   (setq *error* errtmp)
  111.   (setq *#$*sysvarnl*#$* nil
  112.         *#$*svarl*#$* nil
  113.         errtmp nil
  114.         undo$mark nil
  115.   )
  116.   (princ)
  117. )
  118. ;;; ==================================================================
  119. ;;;                   关键字输入格式化(院长的)
  120. ;;; 方式 : (setq tx1 (ukword 1 "1 2" "\n\t1-任意点/2-中心点" tx1))
  121. ;;; ==================================================================
  122. (defun ukword (bit kwd msg def / inp)
  123.   (if (and
  124.         def
  125.         (/= def "")
  126.       )
  127.     (setq msg (strcat "\n" msg "<" def ">:")
  128.           bit (* 2 (fix (/ bit 2)))
  129.     )
  130.     (setq msg (strcat "\n" msg ":"))
  131.   )
  132.   (initget bit kwd)
  133.   (setq inp (getkword msg))
  134.   (if inp
  135.     inp
  136.     def
  137.   )
  138. )
  139. ;;; ==================================================================
  140. ;;; 建立与obj相交的实体选择集
  141. (defun txt-sel-intofobj (s0 / i len pt1 pt9 s1 ss ss1)
  142.   (p-s '(("osmode" 0)) t)
  143.   (setq pt1 (txt-getobj-nof9pt s0 1)
  144.         pt9 (txt-getobj-nof9pt s0 9)
  145.         ss (ssget "c" pt1 pt9)
  146.         ss1 (ssadd)
  147.         len (sslength ss)
  148.         i -1
  149.   )
  150.   (if (> len 1)
  151.     (progn
  152.       (command "select" ss "r" s0 "")
  153.       (setq ss (ssget "P"))
  154.       (while (setq s1 (ssname ss (setq i (1+ i))))
  155.         (if (txt1-get-2eint s0 s1 0)
  156.           (setq ss1 (ssadd s1 ss1))
  157.         )
  158.       )
  159.     )
  160.   )
  161.   (p-e)
  162.   ss1
  163. )
  164. ;;; ==================================================================
  165. ;;; 求两实体交点
  166. (defun txt1-get-2eint (fst nxt k / intlst pntlst)
  167.   (setq intlst (vlax-invoke (e2o fst) 'intersectwith (e2o nxt) k))
  168.   (repeat (/ (length intlst) 3)
  169.     (setq pntlst (cons (list (car intlst) (cadr intlst) (caddr intlst))
  170.                        pntlst
  171.                  )
  172.           intlst (cdddr intlst)
  173.     )
  174.   )
  175.   pntlst                               ; (reverse pntlst)
  176. )
  177. ;;; ==================================================================
  178. (defun e2o (ename)
  179.   (vlax-ename->vla-object ename)
  180. )
  181. (defun o2e (obj)
  182.   (vlax-vla-object->ename obj)
  183. )
  184. ;;; ==================================================================
  185. ;;; 实体最小包盒上的9个点之一。
  186. (defun txt-getobj-nof9pt (ename mode)
  187.   (txt-get-nof9point (txt-getobj-llur ename) mode)
  188. )
  189. ;;; ==================================================================
  190. ;;; 实体最小包围盒的对角点
  191. (defun txt-getobj-llur (ename / ll ur)
  192.   (vla-getboundingbox (e2o ename) 'll 'ur)
  193.   (list (vlax-safearray->list ll) (vlax-safearray->list ur))
  194. )
  195. ;;; ==================================================================
  196. ;;; ptlist为实体最小包围盒的对角点
  197. (defun txt-get-nof9point (ptlist mode / pointmax pointmin dx dy pt1 pt2 pt3
  198.                                  pt4 pt5 pt6 pt7 pt8 pt9 point
  199.                          )
  200.   (setq pointmax (cadr ptlist)
  201.         pointmin (car ptlist)
  202.         dx (/ (- (car pointmax) (car pointmin)) 2.0)
  203.         dy (/ (- (cadr pointmax) (cadr pointmin)) 2.0)
  204.         pt1 pointmin
  205.         pt2 (polar pt1 0 dx)
  206.         pt3 (polar pt2 0 dx)
  207.         pt4 (polar pt1 (* pi 0.5) dy)
  208.         pt5 (polar pt4 0 dx)
  209.         pt6 (polar pt5 0 dx)
  210.         pt7 (polar pt4 (* pi 0.5) dy)
  211.         pt8 (polar pt7 0 dx)
  212.         pt9 pointmax
  213.   )
  214.   (cond
  215.     ((= mode 1)
  216.       (setq point pt1)
  217.     )
  218.     ((= mode 2)
  219.       (setq point pt2)
  220.     )
  221.     ((= mode 3)
  222.       (setq point pt3)
  223.     )
  224.     ((= mode 4)
  225.       (setq point pt4)
  226.     )
  227.     ((= mode 5)
  228.       (setq point pt5)
  229.     )
  230.     ((= mode 6)
  231.       (setq point pt6)
  232.     )
  233.     ((= mode 7)
  234.       (setq point pt7)
  235.     )
  236.     ((= mode 8)
  237.       (setq point pt8)
  238.     )
  239.     ((= mode 9)
  240.       (setq point pt9)
  241.     )
  242.     (t
  243.       (setq point pt1)
  244.     )
  245.   )
  246.   point
  247. )
  248. ;;; ==================================================================
  249. (defun th-ss-break-by-curve (ss curve)
  250.   (foreach n (th-ss2lst ss)
  251.     (if (txt1-get-2eint n curve 0)
  252.       (th-curve-break-by-curve n curve)
  253.     )
  254.   )
  255. )
  256. ;;; 将选择集ss在与curve相交处打断
  257. ;;; ==================================================================
  258. ;;; 选择集转ename表
  259. (defun th-ss2lst (ss)
  260.   (vl-remove-if 'listp (mapcar
  261.                          'cadr
  262.                          (ssnamex ss)
  263.                        )
  264.   )
  265. )
  266. ;;; ==================================================================
  267. (defun th-curve-break-by-curve (ent edgeent / lst)
  268.   (if (setq lst (txt1-get-2eint ent edgeent 0))
  269.     (th-curve-break-by-ptlst ent lst)
  270.   )
  271. )
  272. ;;; 将曲线ent在ent与edgeent的交点处打断
  273. ;;; ==================================================================
  274. (defun th-ss-break-by-curve (ss curve)
  275.   (foreach n (th-ss2lst ss)
  276.     (if (txt1-get-2eint n curve 0)
  277.       (th-curve-break-by-curve n curve)
  278.     )
  279.   )
  280. )
  281. ;;; 将选择集ss在与curve相交处打断
  282. ;;; ==================================================================
  283. (defun th-curve-break-by-ptlst (ent brkptlst / brkpt brkptlst1 brkptlst2
  284.                                     brkptlst3 enttype p1param p2
  285.                                )
  286.   (p-s '(("CMDECHO" 0) ("OSMODE" 0)) t)
  287.   (setq enttype (txt-get-dxf 0 ent)
  288.         brkptlst1 (th-pts-sort-on-curve ent brkptlst)
  289.         brkptlst2 (reverse brkptlst1)
  290.   )
  291.   (cond
  292.     ((= "CIRCLE" enttype)
  293.       (if (> (length brkptlst) 1)
  294.         (progn
  295.           (setq brkptlst3 (reverse (cons (car brkptlst1) (reverse
  296.                                                                   (cdr brkptlst1)
  297.                                                          )
  298.                                    )
  299.                           )
  300.           )
  301.           (mapcar
  302.             (function (lambda (x y)
  303.                         (txt-mkarc-byc ent x y)
  304.                       )
  305.             )
  306.             brkptlst1
  307.             brkptlst3
  308.           )
  309.           (entdel ent)
  310.         )
  311.       )
  312.     )
  313.     ((and
  314.        (= "ELLIPSE" enttype)
  315.        (vlax-curve-isclosed ent)
  316.      )
  317.       (if (> (length brkptlst) 1)
  318.         (progn
  319.           (setq brkptlst3 (reverse (cons (car brkptlst1) (reverse
  320.                                                                   (cdr brkptlst1)
  321.                                                          )
  322.                                    )
  323.                           )
  324.           )
  325.           (mapcar
  326.             (function (lambda (x y)
  327.                         (txt-mkelarc-bye ent x y)
  328.                       )
  329.             )
  330.             brkptlst1
  331.             brkptlst3
  332.           )
  333.           (entdel ent)
  334.         )
  335.       )
  336.     )
  337.     (t
  338.       (foreach brkpt brkptlst2
  339.         (cond
  340.           ((and
  341.              (= "SPLINE" enttype)
  342.              (vlax-curve-isclosed ent)
  343.            )
  344.             (setq p1param (vlax-curve-getparamatpoint ent brkpt)
  345.                   p2 (vlax-curve-getpointatparam ent (+ p1param 0.000001))
  346.             )
  347.             (command "._break" ent "_non" (trans brkpt 0 1) "_non"
  348.                      (trans p2 0 1)
  349.             )
  350.           )
  351.           (t
  352.             (command "._break" ent "_non" (trans brkpt 0 1) "_non"
  353.                      (trans brkpt 0 1)
  354.             )
  355.           )
  356.         )
  357.       )
  358.     )
  359.   )
  360.   (p-e)
  361. )
  362. ;;; 将曲线ent在曲线ent上的点 brkptlst处打断。
  363. ;;; ==================================================================
  364. (defun txt-get-dxf (key ename)
  365.   (cdr (assoc key (entget ename)))
  366. )
  367. ;;; ==================================================================
  368. ;;; 点集按pl起点到终点排序
  369. (defun th-pts-sort-on-curve (pl pts)
  370.   (setq pts (mapcar
  371.               '(lambda (x)
  372.                  (list (vlax-curve-getdistatpoint pl
  373.                                                   (vlax-curve-getclosestpointto pl x)
  374.                        ) x
  375.                  )
  376.                )
  377.               pts
  378.             )
  379.         pts (vl-sort pts '(lambda (e1 e2)
  380.                             (< (car e1) (car e2))
  381.                           )
  382.             )
  383.   )
  384.   (mapcar
  385.     'cadr
  386.     pts
  387.   )
  388. )
  389. ;;; ==================================================================
  390. ;;; 已知圆和其上两点,建弧
  391. (defun txt-mkarc-byc (ename pt1 pt2 / ang1 ang2 cen ent entlst)
  392.   (setq entlst (entget ename)
  393.         entlst (vl-remove (assoc -1 entlst) entlst)
  394.         entlst (vl-remove (assoc 330 entlst) entlst)
  395.         entlst (vl-remove (assoc 5 entlst) entlst)
  396.         entlst (vl-remove (assoc 0 entlst) entlst)
  397.         entlst (vl-remove (assoc 50 entlst) entlst)
  398.         entlst (vl-remove (assoc 51 entlst) entlst)
  399.         cen (txt-get-dxf 10 ename)
  400.         ang1 (angle cen pt1)
  401.         ang2 (angle cen pt2)
  402.         entlst (append
  403.                  (list (cons 0 "arc") (cons 100 "AcDbArc"))
  404.                  entlst
  405.                  (list (cons 50 ang1) (cons 51 ang2))
  406.                )
  407.   )
  408.   (if (setq ent (entmakex entlst))
  409.     ent
  410.   )
  411. )
  412. ;;; ==================================================================
  413. ;;; 已知椭圆和其上两点,建弧
  414. (defun txt-mkelarc-bye (ename pt1 pt2 / ang1 ang2 cen endp ent entlst ratio)
  415.   (setq entlst (entget ename)
  416.         entlst (vl-remove (assoc -1 entlst) entlst)
  417.         entlst (vl-remove (assoc 330 entlst) entlst)
  418.         entlst (vl-remove (assoc 5 entlst) entlst)
  419.         entlst (vl-remove (assoc 0 entlst) entlst)
  420.         entlst (vl-remove (assoc 41 entlst) entlst)
  421.         entlst (vl-remove (assoc 42 entlst) entlst)
  422.         cen (txt-get-dxf 10 ename)
  423.         endp (txt-get-dxf 11 ename)
  424.         ratio (txt-get-dxf 40 ename)
  425.         ang1 (txt-pt2ell-param pt1 cen endp ratio)
  426.         ang2 (txt-pt2ell-param pt2 cen endp ratio)
  427.         entlst (append
  428.                  (list (cons 0 "ELLIPSE"))
  429.                  entlst
  430.                  (list (cons 41 ang1) (cons 42 ang2))
  431.                )
  432.   )
  433.   (if (setq ent (entmakex entlst))
  434.     ent
  435.   )
  436. )
  437. ;;; ==================================================================
  438. ;;; 椭圆弧端点参数
  439. (defun txt-pt2ell-param (pt cen axis ratio / ang param)
  440.   (setq ang (- (angle cen pt) (angle '(0. 0. 0.) axis)))
  441.   (cond
  442.     ((= (cos ang) 0.0)                       ; 防止分母cos为零出错
  443.       (if (> (sin ang) 0.0)
  444.         (setq param (* 0.5 pi))
  445.         (setq param (* 1.5 pi))
  446.       )
  447.     )
  448.     ((= (sin ang) 0.0)
  449.       (if (> (cos ang) 0.0)
  450.         (setq param 0.0)
  451.         (setq param pi)
  452.       )
  453.     )
  454.     (t
  455.       (setq param (atan (/ (sin ang) (* (cos ang) ratio))))
  456.       (if (< (cos ang) 0.0)
  457.         (setq param (+ pi param))
  458.       )
  459.     )
  460.   )
  461.   param
  462. )
  463. ;;; ==================================================================
  464. ;;; ==================================================================
  465. ;;; 在obj(封闭曲线)内的实体集
  466. (defun txt-sel-inobj (obj / endp n pt1 pt9 ss ss1 ss2 ss3 ssnamen)
  467.   (p-s '(("CMDECHO" 0) ("OSMODE" 0)) t)
  468.   (setq ss1 (txt-sel-intofobj obj)
  469.         pt1 (txt-getobj-nof9pt obj 1)
  470.         pt9 (txt-getobj-nof9pt obj 9)
  471.         ss (ssget "c" pt1 pt9)
  472.   )
  473.   (ssdel obj ss)
  474.   (setq ss2 (th-ss-diff ss ss1)
  475.         n -1
  476.         ss3 (ssadd)
  477.   )
  478.   (while (setq ssnamen (ssname ss2 (setq n (1+ n))))
  479.     (setq endp (vlax-curve-getendpoint ssnamen))
  480.     (if (= "in" (th-if-pt-in-curve endp obj))
  481.       (ssadd ssnamen ss3)
  482.     )
  483.   )
  484.   (p-e)
  485.   ss3
  486. )
  487. ;;; ==================================================================
  488. ;;; 选择集差集
  489. (defun th-ss-diff (ss1 ss2 / n ss ssnamen)
  490.   (setq n -1
  491.         m -1
  492.         ss (ssadd)
  493.   )
  494.   (if (= (type ss1) 'ename)
  495.     (setq ss1 (ssadd ss1))
  496.   )
  497.   (if (= (type ss2) 'ename)
  498.     (setq ss2 (ssadd ss2))
  499.   )
  500.   (while (setq ssnamem (ssname ss1 (setq m (1+ m))))
  501.     (ssadd ssnamem ss)
  502.   )
  503.   (while (setq ssnamen (ssname ss2 (setq n (1+ n))))
  504.     (if (ssmemb ssnamen ss)
  505.       (ssdel ssnamen ss)
  506.     )
  507.   )
  508.   ss
  509. )
  510. ;;; ==================================================================
  511. ;;; 选择集并集
  512. (defun th-ss-union (ss1 ss2 / m n ss ssnamem ssnamen)
  513.   (setq n -1
  514.         m -1
  515.         ss (ssadd)
  516.   )
  517.   (if (= (type ss1) 'ename)
  518.     (setq ss1 (ssadd ss1))
  519.   )
  520.   (if (= (type ss2) 'ename)
  521.     (setq ss2 (ssadd ss2))
  522.   )
  523.   (while (setq ssnamen (ssname ss2 (setq n (1+ n))))
  524.     (ssadd ssnamen ss)
  525.   )
  526.   (while (setq ssnamem (ssname ss1 (setq m (1+ m))))
  527.     (ssadd ssnamem ss)
  528.   )
  529.   ss
  530. )
  531. ;;; ==================================================================
  532. ;;; [url]http://www.xdcad.net/forum/showthread.php?s=&threadid=624082[/url]
  533. (defun th-if-pt-in-curve (pt ent / count mark tmpray)
  534.   (if (equal pt (vlax-curve-getclosestpointto ent pt) 1e-6)
  535.     (setq mark "on")
  536.     (progn
  537.       (setq ent (vlax-ename->vla-object ent)
  538.             tmpray (vlax-ename->vla-object (entmakex (list '(0 . "RAY") '
  539.                                                            (100 . "AcDbEntity")
  540.                                                            '(100 . "AcDbRay")
  541.                                                            (cons 10 pt)
  542.                                                            (cons 11
  543.                                                                  (mapcar
  544.                                                                    '+
  545.                                                                    pt
  546.                                                                    '
  547.                                                                    (1 0)
  548.                                                                  )
  549.                                                            ) ; 相当于(polar
  550.                                        ; pt 0 1)
  551.                                                      )
  552.                                            )
  553.                    )
  554.             pt (vlax-3d-point pt)
  555.             count 0
  556.       )
  557.       (repeat 60
  558.         (vla-rotate tmpray pt (/ pi 30))
  559.         (if (zerop (rem (length (vlax-invoke ent 'intersectwith tmpray 0)) 6))
  560.           (setq count (1- count))
  561.           (setq count (1+ count))
  562.         )
  563.       )
  564.       (vla-delete tmpray)
  565.       (if (minusp count)
  566.         (setq mark "out")
  567.         (setq mark "in")
  568.       )
  569.     )
  570.   )
  571.   mark
  572. )
  573. ;;; 点与封闭曲线位置关系
  574. ;;; ==================================================================
  575. (defun th-touch-in-curve (curve / disx disy endp intlst intlstlen mark midpt
  576.                                 midxy pt snamelength snamelst ss ssn startp
  577.                          )
  578.   (p-s '(("CMDECHO" 0) ("OSMODE" 0)) t)
  579.   (setq ss (txt-sel-intofobj curve)
  580.         snamelst (th-ss2lst ss)
  581.         ssn (ssadd)
  582.   )
  583.   (foreach sname snamelst
  584.     (setq intlst (th-pts-sort-on-curve sname (txt1-get-2eint sname curve 0))
  585.           intlstlen (length intlst)
  586.     )
  587.     (cond
  588.       ((= intlstlen 1)
  589.         (setq endp (vlax-curve-getendpoint sname))
  590.         (setq startp (vlax-curve-getstartpoint sname))
  591.         (if (vlax-curve-isclosed sname)
  592.           (if (equal endp (car intlst) 1e-6)
  593.             (progn
  594.               (setq snamelength (vlax-curve-getdistatpoint sname endp))
  595.               (setq midpt (vlax-curve-getpointatdist sname (/ snamelength 2)))
  596.               (if (= "in" (th-if-pt-in-curve midpt curve))
  597.                 (ssadd sname ssn)
  598.               )
  599.             )
  600.             (if (= "in" (th-if-pt-in-curve endp curve))
  601.               (ssadd sname ssn)
  602.             )
  603.           )
  604.           (if (and
  605.                 (/= "out" (th-if-pt-in-curve startp curve))
  606.                 (/= "out" (th-if-pt-in-curve endp curve))
  607.               )
  608.             (ssadd sname ssn)
  609.           )
  610.         )
  611.       )
  612.       ((= nil (txt-remove "in" (mapcar
  613.                                  (function (lambda (x y)
  614.                                              (setq disx
  615.                                                    (vlax-curve-getdistatpoint sname
  616.                                                                               (vlax-curve-getclosestpointto sname x)
  617.                                                    )
  618.                                                    disy
  619.                                                    (vlax-curve-getdistatpoint sname
  620.                                                                               (vlax-curve-getclosestpointto sname y)
  621.                                                    )
  622.                                                    midxy (/ (+ disx disy) 2)
  623.                                                    pt
  624.                                                    (vlax-curve-getpointatdist sname midxy)
  625.                                                    mark
  626.                                                    (th-if-pt-in-curve pt
  627.                                                                       curve
  628.                                                    )
  629.                                              )
  630.                                            )
  631.                                  )
  632.                                  intlst
  633.                                  (reverse (cons (car intlst)
  634.                                                 (reverse (cdr intlst))
  635.                                           )
  636.                                  )
  637.                                )
  638.               )
  639.        )
  640.         (ssadd sname ssn)
  641.       )
  642.     )
  643.   )
  644.   (p-e)
  645.   ssn
  646. )
  647. ;;; 筛选与curve相交并除交点外,其余部分全部在curve内。curve为封闭实体.
  648. ;;; ==================================================================
  649. (defun th-touch-out-curve (curve / disx disy endp intlst intlstlen mark
  650.                                  midpt midxy pt snamelength snamelst ss ssn
  651.                                  startp
  652.                           )
  653.   (p-s '(("CMDECHO" 0) ("OSMODE" 0)) t)
  654.   (setq ss (txt-sel-intofobj curve)
  655.         snamelst (th-ss2lst ss)
  656.         ssn (ssadd)
  657.   )
  658.   (foreach sname snamelst
  659.     (setq intlst (th-pts-sort-on-curve sname (txt1-get-2eint sname curve 0))
  660.           intlstlen (length intlst)
  661.     )
  662.     (cond
  663.       ((= intlstlen 1)
  664.         (setq endp (vlax-curve-getendpoint sname))
  665.         (setq startp (vlax-curve-getstartpoint sname))
  666.         (if (vlax-curve-isclosed sname)
  667.           (if (equal endp (car intlst) 1e-6)
  668.             (progn
  669.               (setq snamelength (vlax-curve-getdistatpoint sname endp))
  670.               (setq midpt (vlax-curve-getpointatdist sname (/ snamelength 2)))
  671.               (if (= "out" (th-if-pt-in-curve midpt curve))
  672.                 (ssadd sname ssn)
  673.               )
  674.             )
  675.             (if (= "out" (th-if-pt-in-curve endp curve))
  676.               (ssadd sname ssn)
  677.             )
  678.           )
  679.           (if (and
  680.                 (/= "in" (th-if-pt-in-curve startp curve))
  681.                 (/= "in" (th-if-pt-in-curve endp curve))
  682.               )
  683.             (ssadd sname ssn)
  684.           )
  685.         )
  686.       )
  687.       ((= nil (txt-remove "out" (mapcar
  688.                                   (function (lambda (x y)
  689.                                               (setq disx
  690.                                                     (vlax-curve-getdistatpoint sname
  691.                                                                                (vlax-curve-getclosestpointto sname x)
  692.                                                     )
  693.                                                     disy
  694.                                                     (vlax-curve-getdistatpoint sname
  695.                                                                                (vlax-curve-getclosestpointto sname y)
  696.                                                     )
  697.                                                     midxy (/ (+ disx disy) 2)
  698.                                                     pt
  699.                                                     (vlax-curve-getpointatdist sname midxy)
  700.                                                     mark
  701.                                                     (th-if-pt-in-curve pt curve)
  702.                                               )
  703.                                             )
  704.                                   )
  705.                                   intlst
  706.                                   (reverse (cons (car intlst)
  707.                                                  (reverse (cdr intlst))
  708.                                            )
  709.                                   )
  710.                                 )
  711.               )
  712.        )
  713.         (ssadd sname ssn)
  714.       )
  715.     )
  716.   )
  717.   (p-e)
  718.   ssn
  719. )
  720. ;;; 筛选与curve相交并除交点外,其余部分全部在curve外。curve为封闭实体.
  721. ;;; ==================================================================
  722. ;;; 从表中移除某元素
  723. (defun txt-remove (x lst)
  724.   (setq lst (txt-list-subtract lst (list x)))
  725. )
  726. ;;; ==================================================================

  727. ;;; 语法: (txt-list-subtract 表1 表2). 表差集
  728. ;;; ==================================================================
  729. (defun txt-list-subtract (lst1 lst2 / lst)
  730.   (setq lst '())
  731.   (if lst1
  732.     (foreach tmp lst1
  733.       (if (not (member tmp lst2))
  734.         (setq lst (cons tmp lst))
  735.       )
  736.     )
  737.   )
  738.   (setq lst (reverse lst))
  739.   lst
  740. )
  741. ;;; ==================================================================

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

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

发表于 2007-11-7 11:46:28 | 显示全部楼层
测试完成,还是对带高程的平面图没用!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2007-11-8 09:11:58 | 显示全部楼层
1,刀的提示含义不确切。对2、3、4选项刀似乎应是封闭的,否则内外区分不了。
2,俺在cad2006下小测试简单图形,封闭的刀可以完成楼主的功能。
3,俺在cad2004下小测试带尺寸和图框的稍复杂图形,程序莫名退出,不能完成楼主的功能。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2007-12-2 09:50:44 | 显示全部楼层
粗看一下,似乎不支持UCS
我也做过类似的功能,想了解楼主说的偶尔有点毛病的情况,或者把有毛病的图发一个给我测试一下:ge-betz@tom.com,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 00:07 , Processed in 0.229141 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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