Utilityオブジェクトを利用すると、点や文字列の入力など、ユーザ入力の要求などが行えます。
Lesson 6. 指示した位置に、指示した半径の円を作成する
Lesson 2、Lesson 4で作成したマクロは、いずれも中心点と半径の値が決まっているものでした。UtilityオブジェクトのGetPointメソッド、GetDistanceメソッドを使って、指示した位置(円の中心)に、指示した半径の円を作成するマクロを作成します。
@ Utilityオブジェクトのヘルプを参照して、GetPointとGetDistanceメソッドの内容を確認してください。いずれも引数にラバーバンドを表示する際の基準点と、ユーザ入力を要求する際にコマンドラインに表示する文字列が指定でき、返り値はバリアント型です。
A Lesson 4で作成したSub redCircle() 〜 End Subマクロをコピーして、redCircle()をuCircleに修正します。
B centerPoint(0)、centerPoint(1)、centerPoint(2)に値を割り当てている部分を、指示した点を円の中心として利用するため、GetPointメソッドを使って、以下のように修正します。
centerPoint = ThisDrawing.Utility.GetPoint(, "円の中心:")
C 同じように、円の半径を円の中心から指示した点までの長さとするため、GetDistanceメソッドを使って、以下のように修正します。
radius = ThisDrawing.Utility.GetDistance(centerPoint, "円の半径:")
D 最後のZoomAllを実行してしまうと、図面全体ズームがかかってしまうので、この行を消します。
E コードを保存して、uCircleマクロを実行します。
F 以下のエラーがでて、実行できないはずです。
G これは、GetPointが返す座標値が配列である変数centerPointに割り当てられないからです。そこで変数centerPointの変数宣言を以下のように修正します。
Dim centerPoint As Variant
H 再度マクロを実行して、円の中心、半径を指示すると、その通りの円が作図されます。
Lesson 7. 風船記号を作図するマクロ
これまで作成した、Lesson 5とLesson 6のマクロを組み合わせて、指示した点を中心位置とし、指示した半径の円と、入力した文字を半径の0.7倍の高さで、円の中央に作図する風船記号を作図するマクロを作成してください。
ヒント: 文字の入力は、UtilityオブジェクトのGetStringメソッドを使用します。
選択セットを使うと、複数の既存のオブジェクトをまとめて処理することができます。選択セットを扱うには、最初にSelectionSetsコレクションに新しいSelectionSetオブジェクトを追加してから、SelectOnScreenメソッドなどを使って、選択セットにオブジェクトを格納します。
Lesson 8. 文字だけを削除するマクロ
選択セットを使って、選択した図形の中から文字だけを削除するマクロを作成します。
@ [VBA管理]ダイアログの[新規作成]をクリックして、新しいプロジェクトを作成してからVisual Basicエディタを開きます。
A ThisDrawingをダブルクリックして、コードウィンドウを開きます。
B [挿入]メニューの[プロシージャ]を選択し、名前にtxtDelと入力し、[OK]をクリック。
C コードウィンドウに以下のように入力されます。
Public Sub txtDel()
End Sub
D 選択セットとして変数sset、図形オブジェクトとして変数entを宣言します。
Public Sub txtDel()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
End Sub
E SelectionSetオブジェクトのヘルプを参照すると、Addメソッドで選択セットが追加できるのがわかるので、これから使用する選択セットSS1をSelectionSetsコレクションに追加して、ssetに代入します。
Public Sub txtDel()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
' 選択セットを追加
Set sset = ThisDrawing.SelectionSets.Add("SS1")
End Sub
F SelectionSetオブジェクトのヘルプを参照すると、画面上でオブジェクトを選択するように要求するメソッドとして、SelectOnScreenメソッドがあるので、これを使います。
Public Sub txtDel()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
' 選択セットを追加
Set sset = ThisDrawing.SelectionSets.Add("SS1")
' 図形を選択
sset.SelectOnScreen
End Sub
G 画面上で選択した図形オブジェクトが、選択セットssetに格納されるので、For Each … Nextステートメントを使って、選択セットssetに含まれた図形オブジェクトを1つずつ取り出し、entに代入して処理します。
Public Sub txtDel()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
' 選択セットを追加
Set sset = ThisDrawing.SelectionSets.Add("SS1")
' 図形を選択
sset.SelectOnScreen
' 選択セットを処理
For Each ent In sset
Next
End Sub
H 図形オブジェクトが文字の場合だけ処理を行いたいので、If … Then …End If ステートメントを使って、図形オブジェクトのタイプをObjectNameプロパティを使って、調べます。
Public Sub txtDel()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
' 選択セットを追加
Set sset = ThisDrawing.SelectionSets.Add("SS1")
' 図形を選択
sset.SelectOnScreen
' 選択セットを処理
For Each ent In sset
' 図形のタイプが文字だったら
If ent.ObjectName = "AcDbText" Then
End If
Next
End Sub
I 図形のオブジェクトが文字、すなわち、ent.ObjectNameの値がAcDbTextだったら、削除したいので、Deleteメソッドを使います。
Public Sub txtDel()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
' 選択セットを追加
Set sset = ThisDrawing.SelectionSets.Add("SS1")
' 図形を選択
sset.SelectOnScreen
' 選択セットを処理
For Each ent In sset
' 図形のタイプが文字だったら
If ent.ObjectName = "AcDbText" Then
' 削除
ent.Delete
End If
Next
End Sub
J 最後に使い終わった選択セットも削除します。
Public Sub txtDel()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
' 選択セットを追加
Set sset = ThisDrawing.SelectionSets.Add("SS1")
' 図形を選択
sset.SelectOnScreen
' 選択セットを処理
For Each ent In sset
' 図形のタイプが文字だったら
If ent.ObjectName = "AcDbText" Then
' 削除
ent.Delete
End If
Next
' 選択セットを削除
sset.Delete
End Sub
K 作成したコードを保存して、マクロtxtDelを実行します。
L 選択した図形の中で、文字だけが削除されます。
Lesson 9. 図面内の全ての文字の文字高さを、指定した高さにするマクロ
図面内にある全ての文字の文字高さを、指定した高さにするマクロを作成してください。
ヒント: 全てのオブジェクトを選択するには、Selectメソッドで、モードにacSelectionSetAllを指定します。
文字の高さは、heightプロパティです。
文字の高さは、GetRealメソッドで入力を要求します。