Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoLispでコレクションの要素を取得し存在しない場合は要素を作成する

質問

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"))
	  )
  )