フィレットしながら交点に点を描くLISP

  • URLをコピーしました!

複数の線分をフィレット処理する際、交点に基準点を打ちたい場面があります。

この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は、下で確認できますよ!

Contents

操作手順

STEP
  • コマンド「FP」を入力します
  • フィレット半径を数値入力または2点をクリックで指定します
STEP
  • フィレットしたい線分を囲んで2つ選択します

※3つ以上の線分を選んだ場合は最初の2つが適用されます

STEP
  • 指定した半径で線分がフィレットされます
  • 線分の延長した交点に「点」が作成されます

※「点」が作られるので寸法が取りやすいです

STEP
  • 連続して線分をフィレットできます
STEP
  • エンターを押すと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関数で正確な交点を取得
  • 連続処理で複数箇所を一気に対応可能

交点を基準に作業する場面では、フィレットと同時に処理することで作業効率が大きく向上します。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

Contents