Visio® 図面からデータを抽出して別のアプリケーションで使用できるように、他のソースからのデータを使用して図を作成することができます。たとえば、ネットワーク コンポーネントの発注書情報を使用して設置図を作成したり、従業員のデータベースからデータを抽出して組織図を作成できます。
どのような図面を作成するかにかかわらず、コードの記述を開始する際には、設計上重要な点をあらかじめ決定しておく必要があります。
このコード例では、データベースの内容から簡単な図を作成する方法を紹介します。
このセクションの内容...
発注書から抽出したデータを使用して、ネットワークの設置図を作成するアプリケーションを作成するものとします。セールスが完了して発注書がデータベースに入力されると、以下の例のようなオートメーション プログラムによってデータベースからレコードが抽出され、これを使用して設置を担当する作業員用の図面を作成します。この例では、まずコードによってデータベース レコードのフィールドと特定のステンシルのシェイプを関連付けます。次に図面ページにこれらのシェイプのインスタンスをドロップし、他のフィールドからの情報を図形のカスタム プロパティとして追加します。
データベース内のレコード
営業員が入力したデータに基づいて、顧客のネットワーク内の新しい機器を構成する図面が作成されます。
データベース レコードから作成した設置図
Microsoft Visual Basic for Applications (VBA) を使用して、以下の例のようなコードを作成できます。このコードでは、使用するステンシルを含むテンプレートから新しい図面を作成し、データベースから読み込まれたデータに基づいた図形をその図面に配置しています。この例では、ハブの図形がページの中央に配置され、ハブには円状にノードが接続されています。この例の各図形には、顧客の希望しているコンポーネントの構成についての営業員のメモのテキストが表示されます。
このコードの詳細については、「データから図面を作成するためのコードの検証」を参照してください。
Public Sub CreateDrawing()
Dim shpObjHUB As Visio.Shape
Dim shpObjNodes As Visio.Shape
Dim shpObjConnector As Visio.Shape
Dim mstObjConnector As Visio.Master
Dim mstObj As Visio.Master
Dim stnObj As Visio.Document
Dim dX, dY As Double
Dim dDegreeInc As Double
Dim dRad As Double
Dim dPageWidth, dPageHeight As Double
Dim i As Integer
Const PI = 3.1415
Const CircleRadius = 2
Dim arrNetData() As String
'Read data
InitData arrNetData
'To place shapes in even increments around the circle, we divide 360 by the
'total number of items in the array
dDegreeInc = 360 / UBound(arrNetData)
'Read the Page Width and Height properties
dPageWidth = ActivePage.PageSheet.Cells("PageWidth").ResultIU
dPageHeight = ActivePage.PageSheet.Cells("PageHeight").ResultIU
'Open the Basic Network Shapes 3D Stencil
Set stnObj = Application.Documents.OpenEx("基本ネットワーク 3-D.vss", visOpenDocked)
'Process the Hub Shape
Set mstObj = stnObj.Masters(arrNetData(0, 0))
Set shpObjHUB = ActivePage.Drop(mstObj, dPageWidth / 2, dPageHeight / 2)
'Set the text of the hub shape
shpObjHUB.Text = arrNetData(0, 1)
'Get the Connector master
Set mstObjConnector = stnObj.Masters("下→上コネクタ- 角度付き")
'Process the nodes
For i = 1 To UBound(arrNetData)
Set mstObj = stnObj.Masters(arrNetData(i, 0))
'Determine X, Y location for placement (in circle around hub)
dRad = (dDegreeInc * i) * PI / 180
dX = CircleRadius * Cos(dRad) + (dPageWidth / 2)
dY = CircleRadius * Sin(dRad) + (dPageHeight / 2)
'Add shape to drawing in proper location
Set shpObj = ActivePage.Drop(mstObj, dX, dY)
'Set shape text
shpObj.Text = arrNetData(i, 1)
'Connect the current node to the hub
Set shpObjConnector = ActivePage.Drop(mstObjConnector, 0, 0)
shpObjConnector.SendToBack
'Glue Begin point to the hub shape
shpObjConnector.Cells("BeginX").GlueTo shpObjHUB.Cells("Connections.X1")
'Glue the end point to the node that was just added
shpObjConnector.Cells("EndX").GlueTo shpObj.Cells("Connections.X1")
Next
End Sub
上記のコード例は、プログラムの設定、ハブ シェイプのページへの追加、ノード シェイプのページへの追加とハブへの接続という 3 つの部分で構成されています。
コードの最初のセクションでは、プログラムが使用する定数と変数が定義されています。次に、作成される図面の元となるデータを含む配列が定義され、初期化されています。最後に、ページのサイズが指定され、この図面に使用されるステンシルが開かれます。指定されたページのサイズは、後でハブ シェイプを中央に配置する場合に使用されます。より高度なソリューションでは、ユーザーが開くステンシルを選択できるようにコードを設計することもできます。また、この例のようにステンシル情報をコードに記述するのではなく、データの一部としてインポートされるようにコードを作成することもできます。
このプログラムでは、ノードは図面ページの中央にあるハブに接続されています。コードの次のセクションでは、インポートした配列を読み取ってハブ シェイプに使用するマスタシェイプを判断し、ページの中央にそのマスタシェイプのインスタンスをドロップしてシェイプ テキストを設定します。次に、コネクタのシェイプが指定されますが、ノードのシェイプが図面に追加されるまでこのインスタンスはページ上にドロップされません。
このプログラムの最後の部分には、インポートした図形の各レコードのフィールドと開いているステンシルのマスタシェイプを対応させるループが含まれています。使用するマスタシェイプが確定すると、シェイプのインスタンスの位置が決定され、図形がハブの周囲を円状に囲むようにページに追加されます。シェイプが正しい位置にドロップされると、先に確定されていたコネクタのシェイプがページに追加されます。コネクタのシェイプの始点はハブのシェイプに接続され、終点は新しいノードのシェイプに接続されます。この処理が配列内の各レコードに対して繰り返され、完了すると図面が完成します。