シートセット要素(SSO)の動的生成|AutoCAD VBAマクロの作成方法
AutoCADのシートセットマネージャ(SSM)で利用するシートセットやその中のサブセットやシートをVBAで作成するには、[AcSmComponents25 1.0 Type Library]を参照設定することで利用可能になる、AcSmSheetSetMgrオブジェクト、AcSmSheetSetオブジェクト、AcSmSubsetオブジェクトなどを利用する必要があります。本ページではこれらオブジェクトを使ってプログラムで0から任意の構成のシートセットを動的に作成する方法を解説していきます。
本ページで学べる内容は以下のとおりです。
[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オブジェクトを取得(作成)することができます。
1 2 3 4 5 6 7 8 |
Dim sheetSetMgr As AcSmSheetSetMgr Set sheetSetMgr = New AcSmSheetSetMgr 'シートセット操作の処理 Set sheetSetMgr = Nothing |
ACSMCOMPONENTS25Lib オブジェクト
シートマネージャの主要なオブジェクトとしてACSMCOMPONENTS25Libには下表のものが用意されています。これらオブジェクトが持つメソッドを実行することで、指定のサブセットやシートに対して名称や番号などの取得や編集の操作を行うことができるようになります。AcSmSheetSetMgrオブジェクトを使うことで下表の上から順にオブジェクトを取得していくことができます。
オブジェクト名 | 操作対象 |
AcSmDatabase | シートセット データベース |
AcSmSheetSet | シートセット |
AcSmSubset | サブセット |
AcSmSheet | シート |
これらオブジェクトは通常のオブジェクトとは違い、VBEのデバッグ環境(ローカル/ウォッチウィンドウ)で中身を確認することができません。中身を確認したい場合はDebug.Printなどでオブジェクトが持つ情報を明示的に描画しながらデバッグする必要があります。
シートセットの動的生成
AcSmSheetSetMgrオブジェクトから新規シートセット(AcSmSheetSet)を作成し、その配下にサブセット(AcSmSubset)やシート(AcSmSheet)を作成するには下記のようなコードを記載します。シートセット内のシートは指定のテンプレートファイル(.dwt)をもとに作成されます。そのため、シート作成時に利用するテンプレートファイルはあらかじめ用意しておく必要があります。
※下記コード実行時には任意のパスを設定して実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
Option Explicit Sub main() Dim sheetSetMgr As AcSmSheetSetMgr Dim db As AcSmDatabase Dim sheetSet As AcSmSheetSet Dim newSubSet As AcSmSubset Dim newSheet As AcSmSheet Dim fileRef As AcSmFileReference Dim layoutRef As AcSmAcDbLayoutReference Dim i As Long Dim pathDst As String '新規作成するシートセットパス Dim pathDwt As String 'シート作成時に利用するテンプレートファイルパス Dim pathDwtSaveFolder As String '新規作成するシート保存フォルダパス 'パス設定 ※任意のパスを入力 pathDst = "C:\...\ShhetSet.dst" pathDwt = "C:\...\Manufacturing Metric.dwt" pathDwtSaveFolder = "C:\...\SheetSets" '.dstファイル作成 Set sheetSetMgr = New AcSmSheetSetMgr Set db = sheetSetMgr.CreateDatabase(pathDst, "", True) 'ルートのシートセット取得 Set sheetSet = db.GetSheetSet Call db.LockDb(db) 'シート保存先を設定 Set fileRef = New AcSmFileReference Call fileRef.InitNew(db) Call fileRef.SetFileName(pathDwtSaveFolder) Call sheetSet.SetNewSheetLocation(fileRef) 'テンプレートの設定 Set layoutRef = New AcSmAcDbLayoutReference Call layoutRef.InitNew(db) Call layoutRef.SetFileName(pathDwt) Call layoutRef.SetName("ISO A3 タイトル ブロック") Call sheetSet.SetDefDwtLayout(layoutRef) '動的にシートセットの構成を生成 For i = 1 To 10 If i <= 5 Then 'シート作成 Set newSheet = sheetSet.AddNewSheet("DWG_NAME" & Format(i, "000"), "Description") Call newSheet.SetTitle("Sheet" & i) Call newSheet.SetNumber("A-" & Format(i, "000")) 'シートセットに追加 Call sheetSet.InsertComponentAfter(newSheet, Nothing) Else 'サブセット作成 Set newSubSet = sheetSet.CreateSubset("SUBSET_NAME" & Format(i, "000"), "Description") 'シート作成 Set newSheet = newSubSet.AddNewSheet("DWG_NAME" & Format(i, "000"), "Description") Call newSheet.SetTitle("Sheet" & i) Call newSheet.SetNumber("A-" & Format(i, "000")) 'サブセットに追加 Call newSubSet.InsertComponentAfter(newSheet, Nothing) End If Next Call db.UnlockDb(db, True) End Sub |
.dstファイルの作成
シートセットファイル(.dst)はAcSmSheetSetMgrオブジェクトのCreateDatabaseメソッドで新規作成することが可能です。引数としては第一引数に作成するdstファイルのフルパスを指定するだけで、基本的に残りの引数はサンプルコードの通りで問題ありません。(その他引数の詳細はヘルプ参照)
本メソッド実行後、戻り値としてシートセット データベースオブジェクト(AcSmDatabase)を取得することができます。このAcSmDatabaseに対してGetSheetSetメソッドを実行することでシートセットオブジェクト(AcSmSheetSet)の取得ができます。これはシートセットマネージャウィンドウでいうところの、ツリー最上位となる要素のオブジェクトです。(下画像でいう「シートセット」)
シート保存先 / テンプレートの設定
シートを作成するには「フォルダ パス」と「シート テンプレート」の情報が必要になります。手作業で作成した既存のシートセットを利用している場合は既に設定されているので問題ないですが、前項のようにプログラムで生成した場合はこの情報が欠落しておりシートの作成に失敗してしまいます。
いずれも専用のオブジェクト(AcSmFileReference/AcSmAcDbLayoutReference)を生成し、それぞれのオブジェクトのSetFileNameメソッドを使うことで上記の情報の設定ができます。設定後はシートセットオブジェクト(AcSmSheetSet)のSetNewSheetLocationメソッドとSetDefDwtLayoutメソッドでそれぞれ設定することができます。テンプレートファイルはパスだけでなく使用するレイアウト名もSetNameメソッドで設定する必要があります。(上画像でいう”ISO A3 タイトル ブロック”を指定)
シートの作成
シートは親となるセット(AcSmSheetSet/AcSmSubset)に対してAddNewSheetメソッドを実行することで作成することができます。ただこの時点ではまだシートセットと紐づいていないため、同じく親となるセットに対してInsertComponentメソッドを実行して指定のセット内に作成したシートを格納する必要があります。(InsertComponentAfterメソッドでも可)
シート作成時に使用するAddNewSheetメソッドの引数は「保存時のファイル名」と「説明」です。番号やシートタイトルを設定したい場合は作成したシートオブジェクト(AcSmSheetSet)の対象のメソッドを実行することで変更が可能です。
サブセットの作成
サブセットは親となるセット(AcSmSheetSet/AcSmSubset)に対してCreateSubsetメソッドを実行することで作成することができます。サブセットはシートとは違いファイルが作成されることはないため、メソッドの実行のみで作成処理は完了です。ここで作成したサブセットに対して前項のAddNewSheetメソッドとInsertComponentメソッドを実行すれば、作成したサブセット内に新たなシートを作成することができます。サブセット内にサブセットを作成する場合も同様です。
編集時のロック/アンロック
各オブジェクトを編集するには、そのオブジェクトにロックをかける必要があります。これは、同じファイルが別の端末から同時に呼び出された場合に、編集の衝突を防ぐための機能です。処理としては対象のオブジェクトを持つAcSmDatabaseに対してLockDbメソッドを実行します。このメソッドの引数にロックしたいオブジェクトを指定すると、そのオブジェクトにロックがかかり、編集できるようになります。 編集が終わったらオブジェクトのアンロックをして元に戻す必要もあります。アンロックはLockDbメソッドと同じ考え方でUnlockDbメソッドを実行するだけです。
まとめ
今回の内容をまとめると以下のとおりです。
SSMの操作は[AcSmComponents○○ 1.0 Type Library]の参照設定が必要
シートセットの各オブジェクトはAcSmSheetSetMgrオブジェクトから順に取得可能
シートセットの作成はCreateDatabaseメソッド
サブセットの作成はCreateSubsetメソッド
シートの作成はAddNewSheetメソッド後にInsertComponentメソッド
シート作成時には保存場所とテンプレートファイル(.dwt)の指定が必要
保存場所はAcSmFileReferenceを生成してSetNewSheetLocationで設定可能
.dwtファイルはAcSmAcDbLayoutReferenceを生成してSetDefDwtLayoutで設定可能
編集するにはオブジェクトのロック/アンロックが必要
本ページではシートセットマネージャオブジェクト(SSO)をVBAで生成する方法についての内容でした。シートを新規作成する場合は保存場所とテンプレートファイルの設定ができていないと、AddNewSheetメソッド実行時にエラーが発生するので注意が必要です。ただ、シートの作成さえできてしまえばそのシートオブジェクトが持つメソッドで情報の取得や編集が可能です。