MicroStation PowerDraftマクロの使い方 その12

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での処理と同様に取得した

要素に対して処理を行うことができます。

コメントを残す

メールアドレスが公開されることはありません。