4点とも、点オブジェクトが有るものとします。
LISPを起動したら、3つの点オブジェクトを選択し、離れた点オブジェクトを選択。
(defun c:P3C_P1L (/ ss ss2 i entList pt pt1 pt2 pt3 pt4 ent entData cen)
(vl-load-com)
(princ "\n3つの点オブジェクトを選択してください: ")
(setq ss (ssget '((0 . "POINT"))))
(if (and ss (= (sslength ss) 3))
(progn
(setq entList '())
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq entData (entget ent))
(setq pt (cdr (assoc 10 entData)))
(setq entList (append entList (list pt)))
(setq i (1+ i))
)
(setq pt1 (trans (nth 0 entList) 0 1))
(setq pt2 (trans (nth 1 entList) 0 1))
(setq pt3 (trans (nth 2 entList) 0 1))
(command "ucs" "3P" pt1 pt2 pt3)
(setq pt1 (trans (nth 0 entList) 0 1))
(setq pt2 (trans (nth 1 entList) 0 1))
(setq pt3 (trans (nth 2 entList) 0 1))
(command "CIRCLE" "3P" pt1 pt2 pt3 "ucs" "p")
(setq cen (vlax-safearray->list (vlax-variant-value (vl-catch-all-apply 'vla-get-center (list (vlax-ename->vla-object (entlast)))))))
(princ "\n線分の開始点となる点オブジェクトを1つ選択してください: ")
(setq ss2 (ssget ":S" '((0 . "POINT"))))
(if (and ss2 (= (sslength ss2) 1))
(progn
(setq ent (ssname ss2 0))
(setq entData (entget ent))
(setq pt (cdr (assoc 10 entData)))
(command "LINE" (trans pt 0 1) (trans cen 0 1) "")
)
)
)
)
(princ)
)
- Hamu
- 2025/07/03 (Thu) 16:14:12 New