質問
AutoCADのVBAで、以下のサンプルコードの様にコレクションの要素を取得し存在しない場合は要素を追加する処理がありますが、同様の処理をAutoLispで行う場合はどのように記述したらよいでしょうか。
Dim sset As AcadSelectionSet
On Error Resume Next
Set sset = ThisDrawing.SelectionSets.Item("Test")
On Error GoTo 0
If sset Is Nothing Then
Set sset = ThisDrawing.SelectionSets.Add("Test")
End If
回答
AutoLispのvl-catch-all-applyを使用することで、コレクションに存在しないアイテムを取得する際に発生するエラーをハンドルすることが可能です。
vl-catch-all-applyには引数のリストを指定された関数に渡し、すべての例外をトラップします。
上述のVBAと同様の処理を実現する場合は以下のサンプルコードのようにlambda式を作成して処理を実行、結果の値を確認する形となります。
(setq acadObject (vlax-get-acad-object))
(setq activeDocument (vla-get-activedocument acadObject))
(setq selectionSets (vla-get-selectionsets activeDocument))
(vl-catch-all-apply
'(lambda()
(setq sset (vla-Item selectionSets "test"))
)
)
(if (= nil sset)
(progn
(setq sset (vla-add selectionSets "test"))
)
)
記事全体を表示