xyzjint_cn 发表于 2012-4-27 10:11:47

如何实现墙线的自动剪切?

    在图纸中,有双线MLINE组成的墙线,门画好以后,在画门的过程中不打断双线墙(以便统计双线MLINE的总长),在统计完线长扣如何实现墙的自动剪切,其中门圆弧及门板线图层为“门”,墙线在另外的图层中,在门圆弧上有扩展数据:"门类型" "门宽度" "门高度""门编号" "门扇宽度"“墙厚”,如何用圆弧选择集进行墙线的自动剪切。
在我的程序中求出圆弧的圆心,起点、终点,通过判断通过起点
(if (= (ssget ps '((0 . "line") (8 . "门"))) nil)
   (progn (setq pt_tmp ps
         ps pe
         pe pt_tmp
   )将圆弧与门板线相交的点作为圆弧的起点,以便判断出门的方向,但这个选择(ssget ps '((0 . "line") (8 . "门"))) 却总是为空,不知是什么原因,请高手指点一下。

实现功能如下图:


;;;单门修剪(不修剪墙线)修改版
;;;-------------------------------------------------------------------------------
(defun c:door_trim ()
(princ "\n请设定修剪门的区域:")
(setq p1 (getpoint "\n左下角:"))
(setq p2 (getcorner p1 "\n右上角:"))
(setq door_list (ssget "c" p1 p2 '((0 . "arc") (8 . "门"))))
(if (/= door_list nil);if11
    (progn    ;progn11
      (setq index 0)
      (repeat (sslength door_list)
(setq door_ent (ssname door_list index))
(setq db (entget door_ent))
(setq door_qh (vlax-ldata-get door_ent "墙厚"))
(setq pc (cdr (assoc 10 db)) ;圆心
       r(cdr (assoc 40 db)) ;半径
       a0 (cdr (assoc 50 db))
       a1 (cdr (assoc 51 db))
       ps (polar pc a0 r) ;起点
       pe (polar pc a1 r) ;止点
       pd (mapcar '* '(0.5 0.5) (mapcar '+ ps pe))
       pm (polar pc (angle pc pd) r) ;中点
       an (- a1 a0);圆心角
)
(if (< an 0)
   (setq an (+ an (* 2.0 pi)))
)
(if (not (equal '(0 0 0) (setq org (getvar "ucsorg"))))
   (setq pc (mapcar '- pc org)
ps (mapcar '- ps org)
pe (mapcar '- pe org)
pm (mapcar '- pm org)
   )
)

(if (= (ssget ps '((0 . "line") (8 . "门"))) nil)
   (progn (setq pt_tmp ps
         ps pe
         pe pt_tmp
   )
   ;(command "line" ps pm "")(setq ss_int (ssget p1 '((0 . "line"))))
   (princ "\n 333333333333333333333333333wwww")
   )
)
(if
   (/= (setq ss_ml (ssget "w"
   pc
   pe
   (polar pc (angle ps pc) door_qh)
   (polar pe (angle ps pc) door_qh)
   '((0 . "mline"))
   )
       )
       nil
   )
    (progn
      (setq lentmp (sslength ss_ml))
      (setq indextmp 0)
      (repeat lentmp;进行循环
      (setq entmp (ssname sstmp indextmp))
      (command "_explode" entmp "")
      (setq indextmp (1+ indextmp))
      )
    )
)
(command "line" pc "" (polar pc (angle ps pc) door_qh) "")
(setq ln1 (entlast))
(command "line" pe "" (polar pe (angle ps pc) door_qh) "")
(setq ln2 (entlast))
(command "trim"
   ln1
   ln2
   ""
   "f"
   (polar p2 angp (/ d 2))
   (polar p1 angp (/ d 2))
   ""
   ""
)
(command "erase" ln1 "")
(command "erase" ln2 "")
(setq index (+ index 1))
      )   ;repeat
    )   ;progn11
)   ;if11

)

xyzjint_cn 发表于 2012-4-28 13:14:41

现已基本解决,程序如下:
;;;*********************\\\\\\\---------------------------------------------------
;;;-------------------------------------------------------------------------------
;;;单门修剪(不修剪墙线)修改版
;;;-------------------------------------------------------------------------------
(defun c:door_trim ()
(princ "\n请设定修剪门的区域:")
(setq p1 (getpoint "\n左下角:"))
(setq p2 (getcorner p1 "\n右上角:"))
(setvar "osmode" 0)
(setq door_list (ssget "c" p1 p2 '((0 . "arc") (8 . "门"))))
(if (/= door_list nil)                ;if11
    (progn                                ;progn11
      (setq index 0)
      (repeat (sslength door_list)
        (setq door_ent (ssname door_list index))
        (setq db (entget door_ent))
        (setq door_qh (vlax-ldata-get door_ent "墙厚"))
        (setq door_w (vlax-ldata-get door_ent "门宽度"))
        (setq pc (cdr (assoc 10 db))        ;圆心
              r       (cdr (assoc 40 db))        ;半径
              a0 (cdr (assoc 50 db))
              a1 (cdr (assoc 51 db))
              ps (polar pc a0 r)        ;起点
              pe (polar pc a1 r)        ;止点
              pd (mapcar '* '(0.5 0.5) (mapcar '+ ps pe))
              pm (polar pc (angle pc pd) r) ;中点
              an (- a1 a0)                ;圆心角

        )
        (if (< an 0)
          (setq an (+ an (* 2.0 pi)))
        )
        (if (not (equal '(0 0 0) (setq org (getvar "ucsorg"))))
          (setq        pc (mapcar '- pc org)
                ps (mapcar '- ps org)
                pe (mapcar '- pe org)
                pm (mapcar '- pm org)
          )
        )
        (setq ss_tmp1 (ssget "w" ps pe '((0 . "line") (8 . "门"))))
        (setq ent_line (ssname ss_tmp1 0))
        (if (= (online ent_line ps) 0)
          (progn (setq pt_tmp ps
                     ps pe
                     pe pt_tmp
               )
          )
        )
        (setq ss_ml nil)
        (if
          (/= (setq ss_ml (ssget "c"
                               ps
                               (polar pe (angle ps pc) door_qh)
                               '((0 . "mline"))
                          )
              )
              nil
          )
           (progn
             (setq lentmp (sslength ss_ml))
             (princ lentmp)
             (setq indextmp 0)
             (repeat lentmp                ;进行循环
             (setq entmp (ssname ss_ml indextmp))
             (command "_explode" entmp "")
             (setq indextmp (1+ indextmp))

             )
           )
        )
        (command "line" pc (polar pc (angle ps pc) door_qh) "")
        (setq ln1 (entlast))
        (command "line" pe (polar pe (angle ps pc) door_qh) "")
        (setq ln2 (entlast))
        (command "trim"
               ln1
               ln2
               ""
               "f"
               (polar pc (angle pc pe) (/ door_w 4))
               (polar        (polar pc (angle ps pc) door_qh)
                        (angle pc pe)
                        (/ door_w 4)
               )
               ""
               ""
        )
        (command "trim"
               ln1
               ln2
               ""
               "f"
               (polar pe (angle pe pc) (/ door_w 4))
               (polar        (polar pc (angle ps pc) door_qh)
                        (angle pe pc)
                        (/ door_w 4)
               )
               ""
               ""
        )
        (command "erase" ln1 "")
        (command "erase" ln2 "")
        (setq index (+ index 1))
      )                                        ;repeat
    )                                        ;progn11
)                                        ;if11
)
(defun online (en pt)
(cond        ((equal pt (vlax-curve-getclosestpointto en pt) 1e-6)
       (setq key1 1)
        )

        ;|((equal        (angle pt (vlax-curve-getstartpoint en))

                (angle pt (vlax-curve-getendpoint en))

                1e-6

       ) ;_ equal

       (princ "在直线延长线上")
        )
|;
        (t (setq key1 0))

) ;_ cond

)

革天明 发表于 2012-4-28 14:34:09

能帮我看看一个关于TRIM的小程序吗,http://bbs.mjtd.com/thread-93285-1-1.html,还有点问题没有解决

hooboxu 发表于 2014-11-26 15:49:41

可以放墙线了

知行ooo李肖坪 发表于 2016-2-5 13:36:43

谢谢,学习中…………
页: [1]
查看完整版本: 如何实现墙线的自动剪切?