【AutoCAD LISP】LISP で図形をオフセットする方法

2022年2月23日

お盆の上にのっている枡酒。枡

LISP でオブジェクトをオフセットしたいんだけど…

どうすればいいの?

こんにちは、メモだよ!!管理人です。

今回は、AutoCAD で LISP を使用して、オブジェクトをオフセットする方法を紹介します。

 

vla-offset 関数を使用してオブジェクトをオフセット

vla-offset 関数を使用して、オブジェクトをオフセットできます。

ここで、気をつけなかればいけないのは、オブジェクトによってオフセットできるものと、できないものがあるということです。

オフセットできるオブジェクトは以下になります。

  • 円弧(AcDbArc)
  • 円(AcDbCircle)
  • 楕円(AcDbEllipse)
  • 線分(AcDbLine)
  • ライト ウエイト ポリライン(AcDbPolyline)
  • ヘビー ウエイト ポリライン(AcDb2dPolyline)
  • スプライン(AcDbSpline)
  • 構築線(AcDbXline)

なので、これ以外のオブジェクトは除外するようにしておかないとエラーになってしまいます。

では、サンプル コードを見てみましょう。

(defun c:OffsetObject ()
  ; AutoCAD のオブジェクトを取得
  (setq acadObject (vlax-get-acad-object))

  ; アクティブなドキュメントを取得
  (setq activeDocument (vla-get-activedocument acadObject))
  
  ; ドキュメントの Utilyty オブジェクトを取得
  (setq utility (vla-get-utility activeDocument))
  
  ; 選択した図形の VLA オブジェクトを取得
  (vla-getentity utility 'vlaObject 'pickedPoint "\nオブジェクトをを選択:")
  
  ; 選択されたオブジェクトがオフセットをサポートしていないときは、メッセージを表示して終了
  (setq objectName (vla-get-objectname vlaObject))
  (if (and (/= objectName "AcDbArc")
           (/= objectName "AcDbCircle")
           (/= objectName "AcDbEllipse")
           (/= objectName "AcDbLine")
           (/= objectName "AcDbPolyline")
           (/= objectName "AcDb2dPolyline")
           (/= objectName "AcDbSpline")
           (/= objectName "AcDbXline")
      )
    (progn
      (alert (strcat "選択した " objectName " はオフセットできないオブジェクトです。"))
      (exit)
    )
  )
  
  ; オフセットする距離
  (setq offsetDistance 10.0)
  
  ; オフセットを実行
  (setq offsetObject (vla-offset vlaObject offsetDistance))
  
  (princ)
)

この LISP をロードして、OffsetObject コマンドを実行してみてください。

「オブジェクトを選択」と聞かれるので、オフセットしたいオブジェクトを選択します。

やったー!!

選択した図形を 10 オフセットできた。

オフセットできた

オフセットする距離は、以下の部分で指定しています。

  ; オフセットする距離
  (setq offsetDistance 10.0)

値を −10 に変更すると、もとの図形の内側にオフセットされます。

もとの図形の内側にオフセットされる

選択したオブジェクトが、オフセットできるものかどうかは、以下の部分で判断しています。

  ; 選択されたオブジェクトがオフセットをサポートしていないときは、メッセージを表示して終了
  (setq objectName (vla-get-objectname vlaObject))
  (if (and (/= objectName "AcDbArc")
           (/= objectName "AcDbCircle")
           (/= objectName "AcDbEllipse")
           (/= objectName "AcDbLine")
           (/= objectName "AcDbPolyline")
           (/= objectName "AcDb2dPolyline")
           (/= objectName "AcDbSpline")
           (/= objectName "AcDbXline")
      )
    (progn
      (alert (strcat "選択した " objectName " はオフセットできないオブジェクトです。"))
      (exit)
    )
  )

例えば、マルチテキストを選択したときは、以下のようにメッセージが表示されて、コマンドが中断されます。

オフセットできないことを知らせるメッセージ

-API
-