(defun c:tt()
(setvar "CMDECHO" 0)
(setq p1 (getpoint "\n第一点:")
p2 (getpoint p1 "\n第二点:")
ANG (angle p1 p2)
po (MAPCAR '(lambda (X Y ) (* (+ X Y) 0.5)) P1 P2)
)
(command "arc" "c" po p2 p1 "")
)
我沒辦法知道您圖面會遇到的狀況,比較萬用的方式就是抓點或選擇線條如何得到最近两点的选择集论坛有大神是有判定方法的,至于角度,用ucs判定就好,最好就是用polar这种极坐标的
但是弧的角度不同所畫出的圖形會不一樣,可能需要進一步了解您會遇到的圖面狀況去做修正
若有更好的辦法歡迎分享交流,謝謝
我沒辦法知道您圖面會遇到的狀況,比較萬用的方式就是抓點或選擇線條如何得到最近两点的选择集论坛有大神是有判定方法的,至于角度,用ucs判定就好,最好就是用polar这种极坐标的
但是弧的角度不同所畫出的圖形會不一樣,可能需要進一步了解您會遇到的圖面狀況去做修正
若有更好的辦法歡迎分享交流,謝謝
; Break p/lines at intersection
; By AlanH April 2023
(defun c:wow ( / ss1 ss2 rad obj2 intpt obj intpts pt1 pt2 )
(setq oldsnap (getvar 'osmode))
(prompt "Select cut line ")
(setq ss1 (ssget "_+.:E:S" '((0 . "LWPOLYLINE,LINE"))))
(princ "\n")
(prompt "Select break line ")
(setq ss2 (ssget "_+.:E:S" '((0 . "LWPOLYLINE,LINE"))))
(setvar 'osmode 0)
(setq rad 4)
(repeat (setq x (sslength ss1))
(setq obj1 (vlax-ename->vla-object (ssname ss1 (setq x (- x 1)))))
(repeat (setq y (sslength ss2))
(setq obj2 (vlax-ename->vla-object (ssname ss2 (setq y (- y 1)))))
(setq intpt (vlax-invoke obj2 'intersectWith obj1 acExtendThisEntity))
(if intpt
(progn
(command "circle" intpt rad)
(setq obj (vlax-ename->vla-object (entlast)))
(setq intpts (vlax-invoke obj2 'intersectWith obj acExtendThisEntity))
(entdel (entlast))
(setq pt1 (list (car intpts)(cadr intpts)))
(setq pt2 (list (nth 3 intpts)(nth 4 intpts)))
(command "break" pt1 pt2)
(command "arc" "S" pt1 "E" pt2 "R" rad)
)
)
)
)
(setvar 'osmode oldsnap)
(princ)
)
(c:wow)
可以比较列表两点的X值进行判断弧的上下的角度可能沒這麼好判定,如果您的弧都要往上的話,用窗選後要先將點所有點聚集後,判斷哪些點是用在同一條線上,然後角度抓出來後,還要確定點選的方向,用arc點選順序不同弧的方向就不一樣,當然也要一照您會遇到的圖面而定,如果只是單純的左右那就很容易,若還要加上上下方向就更複雜了,如果有方法可以分享看看我沒辦法知道您圖面會遇到的狀況,比較萬用的方式就是抓點或選擇線條如何得到最近两点的选择集论坛有大神是有判定方法的,至于角度,用ucs判定就好,最好就是用polar这种极坐标的
但是弧的角度不同所畫出的圖形會不一樣,可能需要進一步了解您會遇到的圖面狀況去做修正
若有更好的辦法歡迎分享交流,謝謝
Untested and debugging is up to you... At first glance it looks well to my eyes...wow, you did it!!! 8-) It is i wanted.Code - Auto/Visual Lisp: [Select]
Regards, M.R.
Try thism breaks the line so no gap required. Can set radius if required set to 4 at moment.It is very useful code,thank for your help :lol:Code: [Select]; Break p/lines at intersection
; By AlanH April 2023
(defun c:wow ( / ss1 ss2 rad obj2 intpt obj intpts pt1 pt2 )
(setq oldsnap (getvar 'osmode))
(prompt "Select cut line ")
(setq ss1 (ssget "_+.:E:S" '((0 . "LWPOLYLINE,LINE"))))
(princ "\n")
(prompt "Select break line ")
(setq ss2 (ssget "_+.:E:S" '((0 . "LWPOLYLINE,LINE"))))
(setvar 'osmode 0)
(setq rad 4)
(repeat (setq x (sslength ss1))
(setq obj1 (vlax-ename->vla-object (ssname ss1 (setq x (- x 1)))))
(repeat (setq y (sslength ss2))
(setq obj2 (vlax-ename->vla-object (ssname ss2 (setq y (- y 1)))))
(setq intpt (vlax-invoke obj2 'intersectWith obj1 acExtendThisEntity))
(if intpt
(progn
(command "circle" intpt rad)
(setq obj (vlax-ename->vla-object (entlast)))
(setq intpts (vlax-invoke obj2 'intersectWith obj acExtendThisEntity))
(entdel (entlast))
(setq pt1 (list (car intpts)(cadr intpts)))
(setq pt2 (list (nth 3 intpts)(nth 4 intpts)))
(command "break" pt1 pt2)
(command "arc" "S" pt1 "E" pt2 "R" rad)
)
)
)
)
(setvar 'osmode oldsnap)
(princ)
)
(c:wow)