複数の線分をフィレット処理する際、交点に基準点を打ちたい場面があります。
このLISPは、フィレットを実行しながら交点にPOINTを自動作成できるコマンドです。
(defun c:FP ( / ss n e1 e2 ed1 ed2 p1 p2 p3 p4 intPt rad )
(vl-load-com)
(setvar 'cmdecho 0)
(prompt "\n=== FILLET(線分選択モード専用) ===")
;; 半径指定
(prompt "\n半径を指定してください。")
(command "._FILLET" "_R")
(while (= (getvar "CMDNAMES") "FILLET")
(command pause)
)
(setq rad (getvar "FILLETRAD"))
(prompt (strcat "\n→ 半径を " (rtos rad 2 2) " に設定しました。"))
;; 線分のみ処理
(while T
(prompt "\nフィレットを適用する線分を囲んで選択してください(Enter / ESCで終了)。")
(setq ss (ssget '((0 . "LINE"))))
(if (not ss)
(progn
(prompt "\n処理を終了しました。")
(setvar 'cmdecho 1)
(princ)
(exit)
)
)
(setq n 0)
(repeat (1- (sslength ss))
(setq e1 (ssname ss n)
e2 (ssname ss (1+ n))
ed1 (entget e1)
ed2 (entget e2))
(setq p1 (cdr (assoc 10 ed1))
p2 (cdr (assoc 11 ed1))
p3 (cdr (assoc 10 ed2))
p4 (cdr (assoc 11 ed2)))
;; 交点があればPOINT作成
(setq intPt (inters p1 p2 p3 p4 nil))
(if intPt
(entmakex
(list
(cons 0 "POINT")
(cons 10 intPt)
)
)
)
;; フィレット実行
(command "._FILLET" e1 e2)
(setq n (1+ n))
)
(prompt "\n次の範囲を選択できます。")
)
)- コマンド「FP」を入力
- フィレット半径を数値入力または2点をクリックで指定
- フィレットしたい線分を囲んで2つ選択
- エンターでフィレット完了
仁(じん)画像付きのSTEPは、下で確認できますよ!
操作手順


- コマンド「FP」を入力します
- フィレット半径を数値入力または2点をクリックで指定します


- フィレットしたい線分を囲んで2つ選択します
※3つ以上の線分を選んだ場合は最初の2つが適用されます


- 指定した半径で線分がフィレットされます
- 線分の延長した交点に「点」が作成されます
※「点」が作られるので寸法が取りやすいです


- 連続して線分をフィレットできます


- エンターを押すとLISPが終了します



フィレットしながら基準点も取れるので、後の作業がかなり楽になります!
LISP解説
このLISPは、フィレット処理と同時に交点へPOINTを作成する処理になっています。
初期設定
(vl-load-com)
(setvar 'cmdecho 0)
(prompt "\n=== FILLET(線分選択モード専用) ===")・vl-load-com
→ Visual LISPの機能を有効化(おまじない的なもの)
・cmdecho 0
→ コマンド履歴を非表示にして、画面をスッキリさせる
・prompt
→ コマンドラインにメッセージを表示
半径設定(ここ重要)
(vl-load-com)
(setvar 'cmdecho 0)
(prompt "\n=== FILLET(線分選択モード専用) ===")→ フィレットコマンドを呼び出して
→ ユーザーに半径を入力させる
※pause を使って手入力を待つのがポイント
→ 最後に FILLETRAD を取得して保存
メイン処理(ループ)
(while T無限ループ→ ESCかEnterで終了するまで繰り返し実行します。
オブジェクト選択
(setq ss (ssget '((0 . "LINE"))))→ 線分のみ選択
※今回は交点計算のため「LINE限定」にしている
エンティティ情報取得
(setq ed1 (entget e1)
ed2 (entget e2))→ 線の情報(始点・終点など)を取得
始点・終点の取得
(setq p1 (cdr (assoc 10 ed1))
p2 (cdr (assoc 11 ed1))
p3 (cdr (assoc 10 ed2))
p4 (cdr (assoc 11 ed2)))・10 → 始点
・11 → 終点
※ 2本の線の座標を取り出している
交点取得(核心)
(setq intPt (inters p1 p2 p3 p4 nil))→ 2本の線の交点を計算
※intersは2本の線の交点を計算する関数です
- p1 → 線1の始点
- p2 → 線1の終点
- p3 → 線2の始点
- p4 → 線2の終点
最後の「nil」は「線を延長しない」
つまり
- 実際に交差してるときだけ交点を返す
- 離れてたら何も返さない(nil)
(inters p1 p2 p3 p4 T)最後を「T」にすると線を延長してでも交点を出します
つまり
- 離れてても交点を計算する
- 見えない延長線の交点も取れる



intersは“交点を計算する関数”です!
POINT作成
(if intPt
(entmakex
(list
(cons 0 "POINT")
(cons 10 intPt)
)
)
)→ 交点が存在する場合のみPOINTを作成
entmakex で直接オブジェクト生成している
フィレット実行
(command "._FILLET" e1 e2)→ 通常のフィレットを実行
※POINT作成 → フィレット の順番が重要
繰り返し処理
(setq n (1+ n))→ 次のペアへ
1本目と2本目
2本目と3本目
3本目と4本目…
順番にペアでフィレットしていきます。



フィレット前に交点を取っているので、後工程の基準にも使えます!
まとめ
- フィレットと同時に交点へPOINTを作成できる
- inters関数で正確な交点を取得
- 連続処理で複数箇所を一気に対応可能
交点を基準に作業する場面では、フィレットと同時に処理することで作業効率が大きく向上します。


コメント