MicroStation PowerDraftマクロの12回目です。
今回は枠(多角形)を使って要素を取得する方法を取り上げます。
枠は多角形だけでなくClosedElementであれば同様に処理が可能です。
要素ID1の多角形要素を取得してその内側に存在する要素を
取得するコードは以下のようになります。
Dim eleFence As Element Dim lngView As Long Dim oEE As ElementEnumerator Dim eleBuffer As Element ActiveSettings.FenceVoid = False ActiveSettings.FenceOverlap = False ActiveSettings.FenceClip = False Set eleFence = ActiveModelReference.GetElementByID(DLongFromLong(1)) If Not eleFence Is Nothing Then If eleFence.IsGraphical Then If eleFence.IsShapeElement Then lngView = ActiveDesignFile.ViewGroups.Count Call ActiveDesignFile.Fence.DefineFromElement(ActiveDesignFile.Views.Item(lngView), eleFence) Set oEE = ActiveDesignFile.Fence.GetContents(False, False) Do While oEE.MoveNext '取得した要素に対する処理を記述 Loop Call ActiveDesignFile.Fence.Undefine End If End If End If
要素取得前にFenceに関して設定している項目の内容は
以下の通りです。
ActiveSettings.FenceVoid
枠の内側(False)の要素を取得するか外側(True)の要素を
取得するかを設定します。
ActiveSettings.FenceOverlap
枠に重なる要素(True)を取得するか完全に枠の内側に存在する要素
(False)を取得するかを設定します。
ActiveSettings.FenceClip
枠と重なる要素をクリップするかどうか(True or False)を設定します。
今回の設定では完全に枠の内側に存在する要素のみを
取得するようになります。
コードにあるActiveDesignFile.Fence.DefineFromElementでは
枠要素とビューを設定してデザインファイルに対して枠を定義します。
Set oEE = ActiveDesignFile.Fence.GetContents(False, False)では
枠の内側に存在する要素をEnumeratorにSetしています。
GetContentsの第一引数は、ActiveSettings.FenceClip=True
としたときに要素のクローンを作成するかどうか(True or False)を
設定します。
第二引数では、枠を使って取得する要素にロック要素や
参照ファイルの要素を含むかどうか(True or False)を設定します。
コードの最後に記述した
Call ActiveDesignFile.Fence.Undefine
で枠の定義を解除します。
Do While文の中での処理はこれまで取り上げた
ElementEnumeratorでの処理と同様に取得した
要素に対して処理を行うことができます。