概要 - コレクション オブジェクトを操作する(AutoLISP/ActiveX)

コレクションは、同じタイプまたは類似するタイプのオブジェクトをグループ化するために使用します。

コレクションの概念は「概要 - AutoCAD オブジェクト モデルを理解する(AutoLISP)」で説明しました。AutoCAD オブジェクト モデル内のすべての ActiveX オブジェクトは、コレクションにグループ化されることを覚えておいてください。たとえば、Blocks コレクションは AutoCAD ドキュメント内のすべてのブロックから構成されています。AutoLISP は、AutoCAD オブジェクトのコレクションを処理するのに役立つ関数を提供しています。これらの関数は、vlax-map-collectionvlax-for です。

vlax-map-collection 関数は、ある関数をコレクション内の各オブジェクトに適用します。構文は次のとおりです。

(vlax-map-collection collection-object function)

たとえば、次のコマンドは、図面のモデル空間内の各オブジェクトのすべてのプロパティを表示します。

(vlax-map-collection (vla-get-ModelSpace acadDocument) 'vlax-dump-Object)

; IAcadLWPolyline: AutoCAD Lightweight Polyline Interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00b3b91c>
;   Area (RO) = 3.67152
;   Closed = -1
;   Color = 256
;   Coordinates = (9.59247 4.44872 9.25814 5.34715 4.1991 5.679 ...)
;   EntityName (RO) = "AcDbPolyline"
;   EntityType (RO) = 24
;   Handle (RO) = "4C"
;   Layer = "0"
;  .
;  .
;  .
;   Thickness = 0.0
;   Visible = -1
注: 上記の例では、vlax-dump-Object 関数が返す各プロパティは示されていません。

コレクション内の各オブジェクトに対する一連の関数を評価するには、 vlax-for 関数を使用します。

(vlax-for symbol collection [expressions] ...)

foreach 関数と同様、vlax-for 関数は for ループ内で評価された最後の式の結果を返します。コレクションの中を反復しているときにコレクションを変更すると(つまり、メンバーを追加したり除去すると)、エラーが起こることがあります。

次の例は、vlax-for 関数を使用してアクティブな図面内の各オブジェクトの色情報を表示する関数を定義しています。

(defun show-Color-Statistics (/ objectColor colorSublist colorList)
   (setq modelSpace (vla-get-ModelSpace
       (vla-get-ActiveDocument (vlax-get-Acad-Object))
    )
   )
   (vlax-for obj modelSpace
      (setq objectColor (vla-get-Color obj))
      (if (setq colorSublist (assoc objectColor colorList))
        (setq colorList
           (subst (cons objectColor (1+(cdr colorSublist)))
                          colorSublist
                          colorList
           )
        )
        (setq colorList (cons (cons objectColor 1) colorList))
     )
  )
  (if colorList
     (progn (setq
        colorList (vl-sort colorList
                    '(lambda (lst1 lst2) (< (car lst1) (car lst2)))
                  )
            )
            (princ "\nColorList = ")
            (princ colorList)
            (foreach subList colorList
               (princ "\nColor ")
               (princ (car subList))
               (princ " is found in ")
               (princ (setq count (cdr subList)))
               (princ " object")
               (princ (if (= count 1)
                         "."
                         "s."
                       )
 )    )    )   )   
 (princ)
)

この関数は、図面内の各色と、その色が適用されているオブジェクトの数をリストします。

コレクション内のメンバー オブジェクトを取得する

Item メソッドは、コレクションからメンバー オブジェクトを取得します。Count プロパティは、コレクション内の項目数を示します。Item メソッドと Count プロパティを使用すると、コレクション内の各オブジェクトを個別に処理できます。たとえば、モデル空間内の各オブジェクトを調べて、オブジェクトのタイプを決め、希望のオブジェクトのタイプのみを処理できます。次のコードは、モデル空間内の各円弧オブジェクトの開始角度を出力します。

(setq index 0)
(repeat (vla-get-count mspace)
  (if (= "AcDbArc" (vla-get-objectname (vla-item mspace index)))
    (progn
      (princ "\nThe start angle of the arc is ")
      (princ (vla-get-startangle (vla-item mspace index)))
    )
  )
  (setq index (+ index 1))
)

ItemCount はグループや選択セットにも適用されることに注意してください。