ハッチングとグラデーションの作成と編集|AutoCAD VBAマクロの作成方法
図面には図形の中身を網掛けするように斜線や特定の模様を書き込む「ハッチング」という表現方法があります。AutoCADではこのハッチング機能と合わせて中身を塗りつぶしたり、グラデーションを描いたりと色で図形の中身を塗りつぶすこともできます。
ハッチングとグラデーションは、AutoCAD VBAにおいて共通のHatchオブジェクトとして扱われ、両方の表現を同じオブジェクトで操作することができます。本ページではこのHatchオブジェクトを使用して、ハッチングとグラデーションの作成方法、取得方法、および編集方法について解説します。
本ページで学べる内容は以下のとおりです。
Hatchオブジェクトについて
ハッチング (グラデーション)の作成方法
既に存在しているハッチング (グラデーション)の取得方法
ハッチング (グラデーション)の情報を取得する方法
ハッチング (グラデーション)の設定を変更する方法
ハッチング (グラデーション)を削除する方法
Hatchオブジェクト
AutoCAD VBAでハッチングを操作するにはHatchオブジェクトを使用します。
Hatchオブジェクトを取得する基本的な方法として「指定のインデックスからハッチングを取得」「指定のオブジェクトID / ハンドルからハッチングを取得」「ハッチングを新規作成して取得」「ユーザー選択から取得」の4つがあり、それぞれモデル空間オブジェクト(ThisDrawing.ModelSpace)から下記のコードで取得することができます。既存のハッチングを編集したいのか新規でハッチングを作成したいのかによって取得方法が異なるため、状況に応じて使い分ける必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Dim oHatch As AcadHatch '指定のインデックスからハッチングを取得 (※インデックスは0始まり) Set oHatch = ThisDrawing.ModelSpace.Item(0) 'オブジェクトID / ハンドルからハッチングを取得 Set oHatch = ThisDrawing.ObjectIdToObject(xxx) 'xxxにオブジェクトID入力 Set oHatch = ThisDrawing.HandleToObject(xxx) 'xxxにハンドル入力 'ハッチングを新規作成 Dim vOuterLoop(0) As AcadEntity Dim arr_dCenter(0 To 2) As Double Set oHatch = ThisDrawing.ModelSpace.AddHatch(0, "ANSI31", True) Set vOuterLoop(0) = ThisDrawing.ModelSpace.AddCircle(arr_dCenter, 5) Call oHatch.AppendOuterLoop(vOuterLoop) Call oHatch.Evaluate Call ThisDrawing.Regen(acActiveViewport) '描画更新 'ユーザー選択でハッチング取得 On Error Resume Next Call ThisDrawing.Utility.GetEntity(oHatch, Empty, "ハッチング選択") On Error GoTo 0 |
上記コードはモデル空間内のテキストを対象としていますが、ペーパー空間内のテキストも同様の方法で取得可能です。両空間の違いについては「ModelSpaceとPaperSpace」を参照ください。
ハッチングとグラデーションの作成
ハッチング作成
ハッチングを新規作成するためにはModelSpace,PaperSpace,BlockオブジェクトのAddHatchメソッドを使って下記のように記載します。(※下記コードはModelSpaceを例とした場合)
Dim oHatch As AcadHatch
Set oHatch = ThisDrawing.ModelSpace.AddHatch_
(PatternType, PatternName, Associativity, [HatchObjectType])
引数は作成するハッチングのパターンタイプ(PatternType)とパターン名称(PatternName)、自動調整フラグ(Associativity)です。これにより、指定のハッチングを作成することができ、戻り値(oHatch)としてAcadHatchオブジェクトが取得できます。グラデーションではなくハッチングを作成する場合は第4引数(HatchObjectType)は省略、もしくは作成するオブジェクトのタイプがハッチングであると明示的に指示するための定数「acHatchObject(=0)」を入力します。
ハッチングにおけるパターンタイプはAcPatternType列挙型で定義されている下表の3つの定数です。適用させるパターンに応じて下記のいずれかの値を入力します。AutoCADのデフォルトで読み込まれているものは「acHatchPatternTypePreDefined」を設定すれば作成することが可能となります。
パターンタイプ | 内容 |
acHatchPatternTypePreDefined | acad.patファイル内からパターン名を選択 |
acHatchPatternTypeUserDefined | 現在の線種を使用して、線分のパターンを定義する |
acHatchPatternTypeCustomDefined | acad.pat以外のPATファイル内からパターン名を選択 |
パターン名称はハッチング作成時などにも表示される下画像の「SOLID」や「ANGLE」のような文字列です。名称はリボン以外にも[ハッチング パターン パレット]などからも確認可能です。
下記はアクティブドキュメントのモデル空間に同心の二重円を作成し、2つの円の隙間にハッチングを作成するサンプルコードです。(※色変更については「オブジェクトの色の取得と編集」を参照下さい)
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 |
Sub AddPatternHatch() Dim oHatch As AcadHatch Dim lHatchType As AcHatchObjectType Dim sPatternName As String Dim lPatternType As AcPatternType Dim oColor As AcadAcCmColor Dim vOuterLoop(0) As AcadEntity Dim vInnerLoop(0) As AcadEntity Dim arr_dCenter(0 To 2) As Double 'ハッチングタイプに設定 lHatchType = acHatchObject 'パターンタイプ lPatternType = acHatchPatternTypePreDefined 'パターン名 sPatternName = "ANSI31" 'ハッチング作成 Set oHatch = ThisDrawing.ModelSpace.AddHatch(lPatternType, sPatternName, True, lHatchType) '第4引数は省略でも可 'ハッチング色変更 Set oColor = oHatch.TrueColor Call oColor.SetRGB(0, 255, 0) oHatch.TrueColor = oColor 'ハッチング外側境界を設定 arr_dCenter(0) = 5 arr_dCenter(1) = 5 arr_dCenter(2) = 0 Set vOuterLoop(0) = ThisDrawing.ModelSpace.AddCircle(arr_dCenter, 5) Call oHatch.AppendOuterLoop(vOuterLoop) 'ハッチング内側境界を設定 Set vInnerLoop(0) = ThisDrawing.ModelSpace.AddCircle(arr_dCenter, 2) Call oHatch.AppendInnerLoop(vInnerLoop) Call oHatch.Evaluate '描画更新 Call ThisDrawing.Regen(acActiveViewport) End Sub |
上記コードの通り、ハッチングは作成後にAppendOuterLoopメソッド、AppendInnerLoopメソッドを使ってハッチングの範囲となる境界線を定義する必要があります。境界線は配列で定義することができますが、配列の中身はすべての始終点をつなぐと閉曲線となるような曲線グループとする必要があります。上記コードは閉曲線である円を境界としているため、配列の要素数は1つとして円のみを格納しています。複数の曲線で閉曲線を構成させる場合は、それらすべての曲線を配列に格納します。
ハッチングの外側の境界線はAppendOuterLoopメソッド、内側の境界線はAppendInnerLoopメソッドを使って定義します。内側の境界線がない場合はAppendInnerLoopメソッドを使う必要はありませんが、AppendOuterLoopメソッドによる外側の境界線の定義は必須の処理となります。
グラデーション作成
グラデーションを新規作成するためにはModelSpace,PaperSpace,BlockオブジェクトのAddHatchメソッドを使って下記のように記載します。(※下記コードはModelSpaceを例とした場合)
Dim oHatch As AcadHatch
Set oHatch = ThisDrawing.ModelSpace.AddHatch_
(PatternType, PatternName, Associativity, [HatchObjectType])
引数は作成するハッチングのパターンタイプ(PatternType)とパターン名称(PatternName)、自動調整フラグ(Associativity)です。これにより、指定のグラデーションを作成することができ、戻り値(oHatch)としてAcadHatchオブジェクトが取得できます。ハッチングではなくグラデーションを作成する場合は第4引数(HatchObjectType)には作成するオブジェクトのタイプがグラデーションであると明示的に指示するための定数「acGradientObject(=1)」を入力します。
グラデーションにおけるパターンタイプはAcGradientPatternType列挙型で定義されている下表の2つの定数です。適用させるパターンに応じて下記のいずれかの値を入力します。AutoCADのデフォルトで読み込まれているものは「acPreDefinedGradient」を設定すれば作成することが可能となります。
パターンタイプ | 内容 |
acPreDefinedGradient | 標準値のいずれかから塗り潰し名を選択 |
acUserDefinedGradient | プロパティ値に基づいてパターンを定義 |
パターン名称はハッチング作成時とは違い、リボン上などで確認できる「GR_LINEAR」や「GR_CYLIN」等ではありません。定義済みの各グラデーションのパターン名は下表のとおりです。
グラデーションタイプ | パターン名称 |
直線状 | LINEAR |
円柱状 | CYLINDER |
逆円柱状 | INVCYLINDER |
球状 | SPHERICAL |
半球状 | HEMISPHERICAL |
曲線状 | CURVED |
逆球状 | INVSPHERICAL |
逆半球状 | INVHEMISPHERICAL |
逆曲線状 | INVCURVED |
下記はアクティブドキュメントのモデル空間に同心の二重円を作成し、2つの円の隙間に球状グラデーションを作成するサンプルコードです。基本的には上記内容以外はハッチング作成と同じ考えです。
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 |
Sub AddGradientHatch() Dim oHatch As AcadHatch Dim lHatchType As AcHatchObjectType Dim sPatternName As String Dim lPatternType As AcGradientPatternType Dim oColor1 As AcadAcCmColor Dim oColor2 As AcadAcCmColor Dim vOuterLoop(0) As AcadEntity Dim vInnerLoop(0) As AcadEntity Dim arr_dCenter(0 To 2) As Double 'グラデーションタイプに設定 lHatchType = acGradientObject 'パターンタイプ lPatternType = acPreDefinedGradient 'グラデーション名 sPatternName = "SPHERICAL" 'ハッチング作成 Set oHatch = ThisDrawing.ModelSpace.AddHatch(lPatternType, sPatternName, True, lHatchType) 'グラデーション色変更 Set oColor1 = oHatch.TrueColor Set oColor2 = oHatch.TrueColor Call oColor1.SetRGB(255, 0, 0) Call oColor2.SetRGB(0, 0, 255) oHatch.GradientColor1 = oColor1 oHatch.GradientColor2 = oColor2 'ハッチング外側境界を設定 arr_dCenter(0) = 5 arr_dCenter(1) = 5 arr_dCenter(2) = 0 Set vOuterLoop(0) = ThisDrawing.ModelSpace.AddCircle(arr_dCenter, 5) Call oHatch.AppendOuterLoop(vOuterLoop) 'ハッチング内側境界を設定 Set vInnerLoop(0) = ThisDrawing.ModelSpace.AddCircle(arr_dCenter, 2) Call oHatch.AppendInnerLoop(vInnerLoop) Call oHatch.Evaluate '描画更新 Call ThisDrawing.Regen(acActiveViewport) End Sub |
グラデーションを作成した場合、GradientColor1プロパティとGradientColor2プロパティを利用することが可能になります。これらはグラデーションの始まりと終わりの色です。通常の色と同じように取得や変更も可能です。(※色の取得/変更については「オブジェクトの色の取得と編集」を参照下さい)
ハッチングとグラデーションの編集
ハッチング透過性の取得と変更
ハッチングの角度はHatchオブジェクトのEntityTransparencyプロパティによって定義されています。
1 2 3 4 5 6 7 8 |
'ハッチング透過性取得 Dim lTransparency As Long lTransparency = oHatch.EntityTransparency 'ハッチング透過性変更 oHatch.EntityTransparency = 10 |
EntityTransparencyプロパティではハッチング透過性のパーセント値が「1~90」の範囲で表されており、完全な不透明の場合は「0」となります。データとしてはString型扱いです。
角度の取得と変更
ハッチングの角度はHatchオブジェクトのPatternAngleプロパティによって定義されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Dim dDegree As Double Dim dRadian As Double Const PI As Double = 3.14159265358979 'ハッチング角度取得 dRadian = oHatch.PatternAngle dDegree = (180 / PI) * dRadian 'ハッチング角度変更 dDegree = 90 dRadian = (PI / 180) * dDegree oHatch.PatternAngle = dRadian |
PatternAngleプロパティの角度はラジアン単位のため、度単位で角度の取得や設定をしたい場合は、ラジアン⇔度の単位変換の計算を行わなければならないので注意が必要です。
色の取得と変更
ハッチングの場合はTrueColorプロパティ、グラデーションの場合はGradientColor1プロパティとGradientColor2プロパティより、色の操作を行うためのAcCmColorオブジェクトの取得ができます。詳細は「オブジェクトの色の取得と編集」ページを参照ください。
ハッチングの削除
HatchオブジェクトはAcadObjectから継承されたオブジェクトのため、AcadObjectがもつDeleteメソッドを使用することができます。Deleteメソッドは実行したオブジェクト自信を削除するためのメソッドで、下記のように記載します。(※[Hatch] = 削除するHatchオブジェクト)
Call [Hatch].Delete
まとめ
今回の内容をまとめると以下のとおりです。
ハッチング(グラデーション)の操作はHatchオブジェクトを使う
ハッチングの作成には適用するパターン名やタイプなどの情報を入力する必要がある
ハッチングの作成後はAppendOuterLoopメソッドで外側境界線を定義する必要がある
ハッチングの内側境界線が存在する場合はAppendInnerLoopメソッドで定義が可能
ハッチングの透過性や角度などはプロパティを使うことで取得や変更が可能
ハッチングの削除はDeleteメソッドを呼び出すだけ
テキスト作成の場合はダイナミックテキストのTextオブジェクトとマルチテキストのMTextオブジェクトというようにオブジェクトが分かれますが、ハッチングとグラデーションはどちらも同じHatchオブジェクトとなります。いずれかの場合の時だけ利用可能なプロパティなども存在しますが(例えばGradientColor1,2等)、オブジェクトとしては共通なのでHatchオブジェクトをまとめて操作するような処理の場合は、ハッチングだけでなくグラデーションも含まれてきます。HatchObjectTypeプロパティを確認すればハッチングとグラデーションの判別も可能です。