シートセットマネージャ(SSM)の取得と編集|AutoCAD VBAマクロの作成方法
AutoCAD VBAでシートセットマネージャ(SSM)のシートタイトルや番号などの取得と編集を行うには、[AcSmComponents25 1.0 Type Library]を参照設定することで利用可能になる、AcSmSheetSetMgrオブジェクト、AcSmSheetSetオブジェクト、AcSmSubsetオブジェクトなどを利用する必要があります。本ページではこれらオブジェクトを使って指定のシートセットマネージャ内のサブセット、およびシートの情報を取得したり名前の変更をする方法を解説していきます。
本ページで学べる内容は以下のとおりです。
[AcSmComponents25 1.0 Type Library]について
シートセットを取得する方法
セット内のサブセットとシートを取得する方法
セット内のサブセットとシートの情報を編集する方法
指定のシートセット内にサブセットやシートを作成する方法は下記ページを参照ください。
AcSmComponents25 1.0 Type Library
VBAでシートセットマネージャを操作するには[AcSmComponents25 1.0 Type Library]の参照設定を行っておく必要があります。VBEの[メニューバー]>[ツール]>[参照設定]より参照設定ウィンドウを起動して[AcSmComponents○○ 1.0 Type Library](※○○はバージョンによる)の設定を行います。
このライブラリ(ACSMCOMPONENTS25Lib)には様々なオブジェクトが含まれており、それぞれのオブジェクトが持つメソッドを実行することでシートセットマネージャを操作することができます。その中でもAcSmSheetSetMgrオブジェクトは各オブジェクトにアクセスするためのオブジェクトで、下記のように記載することでAcSmSheetSetMgrオブジェクトを取得(作成)することができます。
Dim sheetSetMgr As AcSmSheetSetMgr
Set sheetSetMgr = New AcSmSheetSetMgr
'シートセット操作の処理
Set sheetSetMgr = Nothing
ACSMCOMPONENTS25Lib オブジェクト
シートマネージャの主要なオブジェクトとしてACSMCOMPONENTS25Libには下表のものが用意されています。これらオブジェクトが持つメソッドを実行することで、指定のサブセットやシートに対して名称や番号などの取得や編集の操作を行うことができるようになります。AcSmSheetSetMgrオブジェクトを使うことで下表の上から順にオブジェクトを取得していくことができます。
| オブジェクト名 | 操作対象 |
| AcSmDatabase | シートセット データベース |
| AcSmSheetSet | シートセット |
| AcSmSubset | サブセット |
| AcSmSheet | シート |
これらオブジェクトは通常のオブジェクトとは違い、VBEのデバッグ環境(ローカル/ウォッチウィンドウ)で中身を確認することができません。中身を確認したい場合はDebug.Printなどでオブジェクトが持つ情報を明示的に描画しながらデバッグする必要があります。
シートセットの情報取得
AcSmSheetSetMgrオブジェクトからサブセット(AcSmSubset)やシート(AcSmSheet)にアクセスして、各要素が保持している情報を取得するには下記のようなコードを記載します。通常のVBAオブジェクトの構造とは違い、「Enumerator」という"コレクション内の要素を一つずつ順番に処理するための仕組み“を使ってオブジェクトの取得を行う必要があります。(※GetAllComponents関数参照)
下記コードの処理を実行することで、指定のシートセットファイル内のサブセットとシート情報を取得して、イミディエイトウィンドウに各要素の名称を出力することができます。
Option Explicit
Sub main()
Dim sheetSetMgr As AcSmSheetSetMgr
Dim db As AcSmDatabase
Dim sheetSet As AcSmSheetSet
Dim comps As Collection
Dim comp As IAcSmComponent
Dim i As Long
Set sheetSetMgr = New AcSmSheetSetMgr
'シートセットデータベースを開いて取得
Set db = sheetSetMgr.OpenDatabase("C:\...\dataset.dst", False)
'既に開かれている場合は下記でも可
'Set db = sheetSetMgr.FindOpenDatabase("C:\...\dataset.dst")
'シートセット取得
Set sheetSet = db.GetSheetSet
Debug.Print sheetSet.GetName
'シートセット内の全要素(サブセット,シート)取得
Call GetAllComponents(sheetSet, comps)
For i = 1 To comps.Count
Set comp = comps.Item(i)
Debug.Print "Type: "; comp.GetTypeName
Debug.Print "Name: "; comp.GetName
Next
'シートセットを閉じる
'Call sheetSetMgr.Close(db)
Set sheetSetMgr = Nothing
End Sub
'再帰処理でシートセット内の全要素(サブセット,シート)取得
Public Function GetAllComponents(parent As IAcSmComponent, _
components As Collection)
Dim children As Collection
Dim sheetSet As AcSmSheetSet
Dim subset As AcSmSubset
Dim enumPersist As IAcSmEnumComponent
Dim obj As IAcSmPersist
If components Is Nothing Then Set components = New Collection
If parent.GetTypeName = "AcSmSheetSet" Then
Set sheetSet = parent
Set enumPersist = sheetSet.GetSheetEnumerator
ElseIf parent.GetTypeName = "AcSmSubset" Then
Set subset = parent
Set enumPersist = subset.GetSheetEnumerator
Else
Debug.Print parent.GetTypeName
Exit Function
End If
Set obj = enumPersist.Next
Do While Not obj Is Nothing
Call components.Add(obj)
If obj.GetTypeName = "AcSmSubset" Then
Call GetAllComponents(obj, components)
End If
Set obj = enumPersist.Next
Loop
End Function
.dstファイルの取得
シートセットファイル(.dst)はAcSmSheetSetMgrオブジェクトのOpenDatabaseメソッドもしくはFindOpenDatabaseメソッドで取得が可能です。いずれも引数に取得したいdstファイルのフルパスを指定することで、そのシートセットァイルのシートセット データベースオブジェクト(AcSmDatabase)にアクセスすることができます。このAcSmDatabaseに対してGetSheetSetメソッドを実行することでシートセットオブジェクト(AcSmSheetSet)の取得ができます。
FindOpenDatabaseメソッドは指定のdstファイルが既に開かれている必要があります。OpenDatabaseメソッドは指定のdstファイルを開いて取得するメソッドですが、第2引数をFalseとすることで既に開かれていてもシートセット データベースの取得が可能になり、Trueの場合は既に指定のdstファイルが開かれている場合にはエラーが発生します。状況に応じてこれらメソッドを使い分けることで任意のパターンでdstファイルを取得するという処理を実装することができます。
シートセットの情報編集
前項の内容で取得したシートセット内の各要素(サブセット、シート)の情報を編集するには下記のようなコードを記載します。(オブジェクトの取得部分は前項のものと同じ) 情報取得時はGetNameメソッドやGetTypeNameメソッドのようなGet~系のメソッドを利用していましたが、編集する場合はSetNameメソッドSetNumberメソッドのようなSet~系のメソッドを利用します。
下記コードの処理を実行することで、指定のシートセットファイル内のサブセットとシートの名称の接尾に一括で"-1″を付与することができます。SSMでは編集したあと[Ctrl+Z]などで元に戻すことはできないので注意が必要です。(コード内に修正用の処理もコメントで入れています)
Option Explicit
Sub main()
Dim sheetSetMgr As AcSmSheetSetMgr
Dim db As AcSmDatabase
Dim sheetSet As AcSmSheetSet
Dim comps As Collection
Dim comp As IAcSmComponent
Dim i As Long
Set sheetSetMgr = New AcSmSheetSetMgr
'シートセットデータベースを開いて取得
Set db = sheetSetMgr.OpenDatabase("C:\...\dataset.dst", False)
'既に開かれている場合は下記でも可
'Set db = sheetSetMgr.FindOpenDatabase("C:\...\dataset.dst")
'シートセット取得
Set sheetSet = db.GetSheetSet
Debug.Print sheetSet.GetName
'シートセット内の全要素(サブセット,シート)取得
Call GetAllComponents(sheetSet, comps)
For i = 1 To comps.Count
Set comp = comps.Item(i)
'ロックしないと編集不可
Call db.LockDb(comp)
'現在の名称の接尾に"-1"を付与
Call comp.SetName(comp.GetName & "-1")
'上記で付与した名称を元に戻す(修正用)
'Call comp.SetName(Replace(comp.GetName, "-1", ""))
'ロックを解除
Call db.UnlockDb(comp)
Next
'シートセットを閉じる
'Call sheetSetMgr.Close(db)
Set sheetSetMgr = Nothing
End Sub
'再帰処理でシートセット内の全要素(サブセット,シート)取得
Public Function GetAllComponents(parent As IAcSmComponent, _
components As Collection)
Dim children As Collection
Dim sheetSet As AcSmSheetSet
Dim subset As AcSmSubset
Dim enumPersist As IAcSmEnumComponent
Dim obj As IAcSmPersist
If components Is Nothing Then Set components = New Collection
If parent.GetTypeName = "AcSmSheetSet" Then
Set sheetSet = parent
Set enumPersist = sheetSet.GetSheetEnumerator
ElseIf parent.GetTypeName = "AcSmSubset" Then
Set subset = parent
Set enumPersist = subset.GetSheetEnumerator
Else
Debug.Print parent.GetTypeName
Exit Function
End If
Set obj = enumPersist.Next
Do While Not obj Is Nothing
Call components.Add(obj)
If obj.GetTypeName = "AcSmSubset" Then
Call GetAllComponents(obj, components)
End If
Set obj = enumPersist.Next
Loop
End Function
編集時のロック/アンロック
各オブジェクトを編集するには、そのオブジェクトにロックをかける必要があります。これは、同じファイルが別の端末から同時に呼び出された場合に、編集の衝突を防ぐための機能です。処理としては対象のオブジェクトを持つAcSmDatabaseに対してLockDbメソッドを実行します。このメソッドの引数にロックしたいオブジェクトを指定すると、そのオブジェクトにロックがかかり、編集できるようになります。 編集が終わったらオブジェクトのアンロックをして元に戻す必要もあります。アンロックはLockDbメソッドと同じ考え方でUnlockDbメソッドを実行するだけです。
まとめ
今回の内容をまとめると以下のとおりです。
SSMの操作は[AcSmComponents○○ 1.0 Type Library]の参照設定が必要
シートセットの各オブジェクトはAcSmSheetSetMgrオブジェクトから順に取得可能
シートセットの各オブジェクトは「Enumerator」の仕組みを使って取得する必要がある
オブジェクトの取得ができたらGet~/Set~系のメソッドで操作が可能
編集するにはオブジェクトのロック/アンロックが必要
本ページではシートセットマネージャ(SSM)の取得と編集する方法についての内容でした。
SSMのオブジェクトは少し特殊な作りとなっており、一般的なVBAオブジェクトのように扱うことができません。そのため内容としては少し難しい内容となっていますが、オブジェクトの取得さえできればあとは各オブジェクトが持つメソッドを使って操作するだけです。メソッドはオブジェクトブラウザーやAutoDesk公式ヘルプなどを確認することで調べることができます。














