Sau quá nhiều bình luận mình vẫn cho rằng đã viết lisp thì không thể phiên phiến được kéo điểm, nối thêm nét... . phải chính xác
Dựa trên lý thuyết của bác @duy782006 là tạo ra 3 đường thẳng có các góc tạo ra bằng nhau thì mình viết 1 lisp chọn 2 đường line sau đó nhập độ dài 1 cạnh:
(defun c:test (/ ent1 ent2 ent pp1 pp2 ptx obj1 obj2 a1 a2 bankinh dis dis1 dis2)
(setq
ent1 (entsel "\nChon DT1")
ent2 (entsel "\nChon DT2")
dis (getdist "\nDo dai cac doan thang")
pp1 (trans (cadr ent1) 1 0 )
pp2 (trans (cadr ent2) 1 0 )
ent1 (vlax-ename->vla-object (car ent1))
ent2 (vlax-ename->vla-object (car ent2))
pp1 (vlax-curve-getclosestpointto ent1 pp1 )
pp2 (vlax-curve-getclosestpointto ent2 pp2 )
ptx (vlax-invoke ent1 'intersectwith ent2 acExtendBoth)
a1 (angle ptx pp1)
a2 (angle ptx pp2)
)
(if (> a1 a2)
(if (< (- a1 a2) pi)
(setq a1 (- a1 a2))
(setq a1 (+ pi pi a2 (- a1)))
)
(if (< (- a2 a1) pi)
(setq a1 (- a2 a1))
(setq a1 (+ pi pi a1 (- a2)))
)
)
(setq
a2 (+ (* 0.375 pi) (/ a1 8))
bankinh (abs (/ dis 2 (cos a2)))
dis1 (abs (* bankinh (sin a2)))
dis2 (abs (- (* dis1 (cos (/ a1 2)) (/ 1 (sin (/ a1 2))) ) (/ dis 2)))
)
(vl-cmdf "offset" dis1 (vlax-vla-object->ename ent1) (trans pp2 0 1) "")
(setq obj1 (vlax-ename->vla-object (entlast)))
(vl-cmdf "offset" dis1 (vlax-vla-object->ename ent2) (trans pp1 0 1) "")
(setq obj2 (vlax-ename->vla-object (entlast)))
(setq ptx (vlax-invoke obj1 'intersectwith obj2 acExtendBoth))
(vla-delete obj1)
(vla-delete obj2)
(setvar "CHAMFERA" dis2)
(setvar "CHAMFERB" dis2)
(vl-cmdf "CHAMFER" (trans pp1 0 1) (trans pp2 0 1))
(setq
ent (entget (entlast))
pp1 (cdr (assoc 10 ent))
pp2 (cdr (assoc 11 ent))
)
(entdel (cdar ent))
(setq
a1 (angle ptx pp1)
a2 (angle ptx pp2)
obj1 (vlax-ename->vla-object (entmakex (list '(0 . "ARC") (cons 10 ptx) (cons 40 bankinh) (cons 50 a1) (cons 51 a2))))
obj2 (vlax-ename->vla-object (entmakex (list '(0 . "ARC") (cons 10 ptx) (cons 40 bankinh) (cons 50 a2) (cons 51 a1))))
)
(if (> (vlax-curve-getdistatparam obj1 (vlax-curve-getendparam obj1)) (vlax-curve-getdistatparam obj2 (vlax-curve-getendparam obj2)))
(mapcar 'set '(obj1 obj2 pp1 pp2) (list obj2 obj1 pp2 pp1))
)
(vla-delete obj2)
(setq
obj2 (vlax-curve-getdistatparam obj1 (vlax-curve-getendparam obj1))
a1 (vlax-curve-getpointatdist obj1 (/ obj2 3))
a2 (vlax-curve-getpointatdist obj1 (* 2 (/ obj2 3)))
)
(vla-delete obj1)
(entmakex (list '(0 . "LINE") (cons 10 pp1) (cons 11 a1)))
(entmakex (list '(0 . "LINE") (cons 10 a1) (cons 11 a2)))
(entmakex (list '(0 . "LINE") (cons 10 a2) (cons 11 pp2)))
(princ)
)