juliana207 发表于 2022-6-30 16:14:17

请问怎么把墙体切开

各位老师能否做个lisp,就是把类似这样闭合多段线丁字形墙, 点取2个点, 自动切开分成2个闭合的图形

xyp1964 发表于 2022-6-30 16:14:18



;; 墙体切开


juliana207 发表于 2022-7-1 17:06:24

xyp1964 发表于 2022-7-1 12:43
;; 墙体切开

院长这个需要您的工具箱支持把, 能否提供源码的? 谢谢

qazxswk 发表于 2022-7-4 18:39:12

针对目前的图形,可以获取8个顶点坐标,然后以4个顶点坐标为一组,重新画出两个矩形,再删除原来的图形。但这个有点局限性,如果原图形上有很多顶点,比如超过8个顶点。用此方式可能就比较麻烦。

juliana207 发表于 2022-7-5 11:39:33

这也是论坛忘记是那个的一个程序, 它是切开去掉一部分,能否帮忙改下? , 我是要切开2部分都保留谢谢!

juliana207 发表于 2022-7-5 11:40:44

qazxswk 发表于 2022-7-4 18:39
针对目前的图形,可以获取8个顶点坐标,然后以4个顶点坐标为一组,重新画出两个矩形,再删除原来的图形。但 ...

请看下面的回复,以为我回复你上传不了附件咯:'(

qazxswk 发表于 2022-7-5 14:27:09

以下代码,只对于一些情况可行,并不通用。供参考。
(defun c:tt (/ ss pt p0 p2 p4 p6 )
(setq ss(entsel "\n选择对象"))
(setq pt(vl-remove-if-not'(lambda(x)(=(car x)10))(entget(car ss))) pt(mapcar'cdr pt))
(setq p0(nth 0 pt))
(setq p2(nth 2 pt))
(setq p4(nth 4 pt))
(setq p6(nth 6 pt))
(command "rectang" p0 p2)
(command "rectang" p4 p6)
(command "_.erase" ss "")
(princ))

qazxswk 发表于 2022-7-5 17:32:06

本帖最后由 qazxswk 于 2022-7-5 20:23 编辑

下面这个代码,可以通用。方法有点笨,代码供参考。:lol


(defun c:tt (/ ss p0 p1 p2 en en1 pt p3 p4)
(setq p1 (getpoint "\n分割线第一点"))
(setq p2 (getpoint p1 "\n分割线第二点"))
(setq ss (ssget "c" p1 p2 ))
(setq p0 (mapcar' *(mapcar' + p1 p2)'(0.5 0.5)))
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")(cons 90 2)
(cons 10 p1) (cons 10 p2)))
(setq en (entlast))
(command "rotate" en "" "non" p0 "c" 90)
(setq en1 (entlast))
(setq pt(vl-remove-if-not'(lambda(x)(=(car x)10))(entget (entlast))) pt(mapcar'cdr pt))
(setq p3(nth 0 pt))
(setq p4(nth 1 pt))
(if en1 (command "_.erase" en1 ""))
(command "-boundary" p3 "")
(command "-boundary" p4 "")
(command "_.erase" ss "")
(if en (command "_.erase" en ""))
(princ))

夏生生 发表于 2022-7-7 11:02:36

仅针对标准图元,不保证函数拷贝全了

(defun c:test (/ a b el1 el2 lst nl ptl ss)
(prompt"\n选择需转换图元:")
(setqss(ssget '((0 . "lwpolyline") (90 . 8) (70 . 1)))
lst (xty-tr-ss2lst ss t)
)
(foreach n lst
    (setq ptl (mapcar
    'cdr
    (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget n))
    )
    nl(xty-G-concave ptl)
    )
    (if(= 2 (length nl))
      (progn (setq a   (car nl)
       b   (cadr nl)
       el1 (xty-L-retain (1+ a) (1+ b) ptl)
       el1 (if (= 6 (length el1))
       (vl-remove (nth b ptl) (vl-remove (nth a ptl) el1))
       el1
       )
       el2 (xty-L-remove el1 ptl)
       )
       (xty-make-lwpl el1 1 0)
       (xty-make-lwpl el2 1 0)
       )
      )
    (entdel n)
    )
(princ)
)
(defun xty-tr-ss2lst (ss form / n en lst)
(repeat (setq n (sslength ss))
    (setq en (ssname ss (setq n (1- n))))
    (setq lst (cons en lst))
)
(setq lst(reverse lst))
(if form lst (mapcar(function *xty-e2o*)lst))
)
(defun xty-G-Clockwise-p (lst)
(minusp
    (apply '+
   (mapcar
       (function
         (lambda (a b)
   (- (* (car b) (cadr a)) (* (car a) (cadr b)))
         )
       )
       lst
       (cons (last lst) lst)
   )
    )
)
)
(defun xty-G-concave (lst / p lst1 n)
(setq p (xty-G-Clockwise-p lst))
(setq lst(xty-L-listo- lst))
(setq lst (xty-L-listn (append lst(list(cadr lst))) 3))
(setqn    -1
lst1 nil
)
(while lst
    (setq n (1+ n))
    (if(/= p (xty-G-Clockwise-p (car lst)))
      (setq lst1 (cons n lst1))
    )
    (setq lst (cdr lst))
)
(reverse lst1)
)
(defun xty-make-lwpl (plist mode w / ocs ed)
(setq ocs (trans '(0 0 1) 1 0 t))
(setqed (list (cons 0 "LWPOLYLINE")
   (cons 100 "AcDbEntity")
   (cons 100 "AcDbPolyline")
   (cons 90 (length plist))
   (cons 70 mode)
   (cons 43 w)
   )
)
(foreach elemplist
    (setq
      ed (append ed
   (list (cons 10 (trans elem 1 ocs))
   )
   )
    )
)
(setq ed (append ed (list (cons 210 ocs))))
(entmakex ed)
)
(defun xty-L-cdrn(n lst /)
(repeat n (setq lst (cdr lst)))
)
(defun xty-L-remove (dellst lst)
(foreach n dellst (setq lst (vl-remove n lst)))
lst
)
(defun xty-L-carn(n lst / lsta)
(setq lsta nil)
(repeat n
    (setq lsta (append lsta (list (car lst)))
    lst(cdr lst)))
lsta)
(defun xty-L-deln(n lst /)
(vl-remove (nth (1- n) lst) lst)
)
(defun xty-L-retain(m n lst /)
(setq lst (xty-L-carn n lst))
(setq lst (if(= 1 m)lst(xty-L-cdrn (1- m) lst)))
)
页: [1]
查看完整版本: 请问怎么把墙体切开