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