この記事では、開発者が必要とする可能性のある最も単純な操作を分析します。グラフィックプリミティブを図面に作成して配置する(線、ポリライン、円、楕円、円)。
public static string disclaimer = " AutoCAD. – .";
仕事の前に
尊敬されている読者が自分のコンピューターで上記の例を繰り返したい場合は、人生を簡素化するために、プラグインの自動ロードを検討する必要があります。 たとえば、 ナモレムの投稿を読むことができます-これについての言及があります。
問題の本質を簡単に説明します。プラグインを読み込んだ後に「アンロード」することは不可能であるため、コードが変更されたプラグインを起動する唯一の方法は、AutoCADを閉じて再起動し、プラグインを再読み込みすることです。 この些細な作業には数分かかりますが、50〜100回繰り返した後、非常にイライラし始めます。
プラグインの起動により、この手順のいずれかの段階を除外できます。これにより、
行
図面に線を追加するのは難しくありません。 ドキュメント ( translation )に記載されている例を基礎として使用して、これを実行しましょう。
プラグインコード:
using System; using System.IO; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.ApplicationServices; using acad = Autodesk.AutoCAD.ApplicationServices.Application; namespace HabrPlug_Primitives { public class ClassMyAutoCADDLL { public class Commands : IExtensionApplication { // AutoCAD "HabrCommand" [CommandMethod("HabrCommand")] public void HabrCommand() { // Document acDoc = acad.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // (Model Space) - BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Line acLine = new Line(new Point3d(25, 25, 0), new Point3d(33, 33, 0)); // acLine.SetDatabaseDefaults(); // acBlkTblRec.AppendEntity(acLine); // acTrans.AddNewlyCreatedDBObject(acLine, true); // acTrans.Commit(); } } // Initialize() Terminate() , IExtensionApplication public void Initialize() { } public void Terminate() { } } } }
プロジェクトを作成するとき、もちろん、あらゆる種類のささいなことを忘れないでください...)
最初に、必要な.NET Frameworkのバージョンを指定する必要があります(私の場合、.NET Framework 3.5です)。
次に、 AcDbMgd.dllおよびAcMgd.dllライブラリにリンクを追加し、これらのリンクのプロパティでターゲットプロジェクトフォルダーにライブラリをコピーすることを禁止する必要があります(
パラメーターを
設定します)。
次に、 AcDbMgd.dllおよびAcMgd.dllライブラリにリンクを追加し、これらのリンクのプロパティでターゲットプロジェクトフォルダーにライブラリをコピーすることを禁止する必要があります(
CopyLocal
パラメーターを
False
設定します)。
コード自体は非常にシンプルで、ここでは詳細に特別なことはありません。
最初に 、トランザクションを開始します(これが何であり、なぜ必要なのかについては、前の記事で説明しました)。
第二に 、
Model Space
を開きます-これは実際、図面です。 モデルスペースのより明確な定義はあちこちで見つけることができます。 図面に新しいオブジェクトを追加するため、「読み取りおよび書き込み」アクセス(
OpenMode.ForWrite
)を要求する必要があります。
第三に、コンストラクターで必要なパラメーター(この場合は開始点と終了点)を指定して、グラフィックオブジェクト(この場合は行)を作成します。
4番目に 、オブジェクトのすべてのプロパティを設定する必要があります。 この例では、
SetDatabaseDefaults()
関数を呼び出して、すべてのプロパティをデフォルト値に設定します。 この関数の平均的な男性の説明は、 ObjectARX Referenceにあります。
注意:
5番目に 、作成したオブジェクトをモデル空間(つまり、図面)に追加する必要があります。 これは、
AppendEntity()
関数を使用して行われます。
6番目に 、作成したオブジェクトを、作業するトランザクションに追加する必要があります。 これを行うには、
AddNewlyCreatedDBObject()
関数を使用します。これは、前の記事で既に説明しました。
最後に 、必要なすべての操作を実行した後、
Commit()
メソッドを呼び出してトランザクションをコミットする必要があります。
プロジェクトをコンパイルした後、AutoCADを実行し、プラグインをロードしてHabrCommandコマンドを実行します。 結果は簡単です-しかし、私は、理解可能で予測可能であることを望みます。

コマンドを開始した後、画面に行が表示されなかった場合は、急いで動揺しないでください。 代わりに、座標の中心(ポイント(0; 0))が可視の作業領域内にあることを確認してください。 さらに、マウスホイールを回してスケールを変更するのも理にかなっています。
初心者ユーザーにとって、AutoCADは、図面のスケーリングが特定の制限内で発生することに驚きを感じるかもしれません。 簡単に言えば、1000%のスケールから1%のスケールに切り替えることは不可能です。マウスホイールを数回スクロールすると、スケールは目に見えないリミッターに「残り」ます。 図面のスケーリングを続行するには、AutoCADコマンドラインでREGENコマンドを実行する必要があります。
注意:
個人的な経験から: プログラマーが完全に間違っており、作成されたオブジェクトと作成されたオブジェクトが明確でない場合、クリーンな図面を開き、目的のコードを実行し、キーの組み合わせ「Ctrl + A」を押して図面内のすべてのオブジェクトを選択できます その後、原則として、作成されたオブジェクトを見つけることは難しくありません。
例で冷やしましょう。
例で冷やしましょう。
塗装前:
さて、ここの行はどこですか?)

さて、ここの行はどこですか?)
塗装後:
モニター上のほこりのようなふりをした頭のある線は、青い四角と表示されるオブジェクトプロパティウィンドウで示されます。

モニター上のほこりのようなふりをした頭のある線は、青い四角と表示されるオブジェクトプロパティウィンドウで示されます。
ポリライン
繰り返しますが、例はドキュメントにあります ( translation )。
チームコード:
[CommandMethod("HabrCommand")] public void HabrCommand() { // Document acDoc = acad.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // (Model Space) - BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Polyline acPolyline = new Polyline(); // acPolyline.SetDatabaseDefaults(); // acPolyline.AddVertexAt(0, new Point2d(2, 4), 0, 0, 0); acPolyline.AddVertexAt(1, new Point2d(4, 8), 0, 0, 0); acPolyline.AddVertexAt(2, new Point2d(6, 6), 0, 0, 0); acPolyline.AddVertexAt(3, new Point2d(8, 11), 0, 0, 0); // acBlkTblRec.AppendEntity(acPolyline); // acTrans.AddNewlyCreatedDBObject(acPolyline, true); // acTrans.Commit(); } }
結果:

ここで特に説明することはありません。 必要に応じて、新しいポイントを追加することで、ポリラインを
...またはそれはトロリーバスですか?
はい、トロリーには車輪がありません。 しかし、私たちはまだ円を描く方法を知りませんが、四角い車輪...いいえ、そのように乗ることをお勧めします。
[CommandMethod("HabrCommand")] public void HabrCommand() { // Document acDoc = acad.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // (Model Space) - BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Polyline acPolyline = new Polyline(); // acPolyline.SetDatabaseDefaults(); // acPolyline.AddVertexAt(0, new Point2d(100, 100), 0, 0, 0); acPolyline.AddVertexAt(1, new Point2d(100, 650), 0, 0, 0); acPolyline.AddVertexAt(2, new Point2d(1050, 650), 0, 0, 0); acPolyline.AddVertexAt(3, new Point2d(650, 1150), 0, 0, 0); acPolyline.AddVertexAt(4, new Point2d(1050, 650), 0, 0, 0); acPolyline.AddVertexAt(5, new Point2d(2050, 650), 0, 0, 0); acPolyline.AddVertexAt(6, new Point2d(2050, 100), 0, 0, 0); acPolyline.AddVertexAt(7, new Point2d(1950, 100), 0, 0, 0); acPolyline.AddVertexAt(8, new Point2d(1950, 400), 0, 0, 0); acPolyline.AddVertexAt(9, new Point2d(1800, 400), 0, 0, 0); acPolyline.AddVertexAt(10, new Point2d(1800, 100), 0, 0, 0); acPolyline.AddVertexAt(11, new Point2d(1950, 100), 0, 0, 0); acPolyline.AddVertexAt(12, new Point2d(1700, 100), 0, 0, 0); acPolyline.AddVertexAt(13, new Point2d(1660, 170), 0, 0, 0); acPolyline.AddVertexAt(14, new Point2d(1600, 225), 0, 0, 0); acPolyline.AddVertexAt(15, new Point2d(1500, 225), 0, 0, 0); acPolyline.AddVertexAt(16, new Point2d(1440, 170), 0, 0, 0); acPolyline.AddVertexAt(17, new Point2d(1400, 100), 0, 0, 0); acPolyline.AddVertexAt(18, new Point2d(850, 100), 0, 0, 0); acPolyline.AddVertexAt(19, new Point2d(1200, 100), 0, 0, 0); acPolyline.AddVertexAt(20, new Point2d(1200, 400), 0, 0, 0); acPolyline.AddVertexAt(21, new Point2d(1000, 400), 0, 0, 0); acPolyline.AddVertexAt(22, new Point2d(1000, 100), 0, 0, 0); acPolyline.AddVertexAt(23, new Point2d(1100, 100), 0, 0, 0); acPolyline.AddVertexAt(24, new Point2d(1100, 400), 0, 0, 0); acPolyline.AddVertexAt(25, new Point2d(1100, 100), 0, 0, 0); acPolyline.AddVertexAt(26, new Point2d(850, 100), 0, 0, 0); acPolyline.AddVertexAt(27, new Point2d(810, 170), 0, 0, 0); acPolyline.AddVertexAt(28, new Point2d(750, 225), 0, 0, 0); acPolyline.AddVertexAt(29, new Point2d(650, 225), 0, 0, 0); acPolyline.AddVertexAt(30, new Point2d(590, 170), 0, 0, 0); acPolyline.AddVertexAt(31, new Point2d(550, 100), 0, 0, 0); acPolyline.AddVertexAt(32, new Point2d(100, 100), 0, 0, 0); acPolyline.AddVertexAt(33, new Point2d(450, 100), 0, 0, 0); acPolyline.AddVertexAt(34, new Point2d(450, 400), 0, 0, 0); acPolyline.AddVertexAt(35, new Point2d(250, 400), 0, 0, 0); acPolyline.AddVertexAt(36, new Point2d(250, 100), 0, 0, 0); acPolyline.AddVertexAt(37, new Point2d(350, 100), 0, 0, 0); acPolyline.AddVertexAt(38, new Point2d(350, 400), 0, 0, 0); // acBlkTblRec.AppendEntity(acPolyline); // acTrans.AddNewlyCreatedDBObject(acPolyline, true); // acTrans.Commit(); } }
はい、トロリーには車輪がありません。 しかし、私たちはまだ円を描く方法を知りませんが、四角い車輪...いいえ、そのように乗ることをお勧めします。
円周
ドキュメントから熱心に転載された図面に円を追加する例を考えてみましょう(リンクは上にありました)。
チームコード:
[CommandMethod("HabrCommand")] public void HabrCommand() { // Document acDoc = acad.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // (Model Space) - BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Circle acCircle = new Circle(); // acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(2.5, 3.14, 0); acCircle.Radius = 4.25; // acBlkTblRec.AppendEntity(acCircle); // acTrans.AddNewlyCreatedDBObject(acCircle, true); // acTrans.Commit(); } }
図面に円を追加しても問題はありません。中心と半径を設定するだけです。
結果:

注意:
間接回線を使用する場合、画面に正しく表示されない場合があることに注意してください。
特に、この例でHabrCommandコマンドを遠距離で実行してから、大幅にズームイン(描画要素をズームイン)すると、下の図に示す効果が観察されます。 よくAutoCADで作業する人はおそらく慣れているでしょうが、私のサークルが何に変わったかを最初に見たとき、私は非常に長い間コードの間違いを探し、「レンダリング精度を上げる」ために数時間を殺しました。)
円の元の形状を復元するには、AutoCADコマンドラインでREGENコマンドを実行します。
繰り返しますが、このような効果は表示されたときにのみ発生することを強調します 。 文書内では、だれが外にあるように見えても、円は常に円のままです。
特に、この例でHabrCommandコマンドを遠距離で実行してから、大幅にズームイン(描画要素をズームイン)すると、下の図に示す効果が観察されます。 よくAutoCADで作業する人はおそらく慣れているでしょうが、私のサークルが何に変わったかを最初に見たとき、私は非常に長い間コードの間違いを探し、「レンダリング精度を上げる」ために数時間を殺しました。)

円の元の形状を復元するには、AutoCADコマンドラインでREGENコマンドを実行します。

繰り返しますが、このような効果は表示されたときにのみ発生することを強調します 。 文書内では、だれが外にあるように見えても、円は常に円のままです。
楕円
楕円を作成することは、円を作成することとは多少異なります。そのパラメーターは、コンストラクターで明示的に指定する必要があります(詳細は、 ここで説明します )。
チームコード:
[CommandMethod("HabrCommand")] public void HabrCommand() { // Document acDoc = acad.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // (Model Space) - BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Point3d center = Point3d.Origin; Vector3d normal = Vector3d.ZAxis; Vector3d majorAxis = 100 * Vector3d.XAxis; double radiusRatio = 0.5; double startAng = 0.0; double endAng = Math.PI * 2; // , Ellipse acEllipse = new Ellipse(center, normal, majorAxis, radiusRatio, startAng, endAng); // acBlkTblRec.AppendEntity(acEllipse); // acTrans.AddNewlyCreatedDBObject(acEllipse, true); // acTrans.Commit(); } }
結果(明確化のために青い線が追加されました):

楕円を作成するとき、次のパラメーターを設定します。
- 楕円の中心-これですべてが明確になります。
- 法線は、楕円の平面に垂直なベクトルです。 オブジェクトをXY平面に追加すると、法線はZ軸になります。
- 主軸(majorAxis)-AutoCADの用語では、これは長さが楕円の「幅」の半分に等しいベクトルです(図の青い線のように)。 通常の数学では、これは「半長軸」と呼ばれます。 この例では、横軸と一致する方向に長さ100のベクトルを設定します。
- Radius(radiusRatio)-楕円の長さを決定します。 この例では、Y軸に沿った楕円の最大座標は100 * 0.5 = 50です。
- 開始角度と終了角度-曲線を描くための開始角度と終了角度を定義します。 この原理は、ここから取られた下の写真でよく説明されています 。
図全体を描くには、360度または2pi(極座標系の場合)の完全な円を「実行」する必要があります。 少なく指定すると、図の一部のみが表示されます。
楕円の別の例。
楕円の新しいパラメーターを設定してみましょう。
次のようになります(向きを簡単にするために線が引かれています)。
ゼロより大きいため、楕円の上部は軸からは開始されませんが、少し先になります。
は
あまり到達しないため、楕円の下部は
よりもはるかに早く終了します。
傾斜は、軸ベクトル(
)を設定することにより保証されます。 このベクトルのX成分の大きさはY成分と等しいため、45度の勾配が得られます。
半軸の長さはピタゴラスの定理によって計算できます:これは、座標XとYの平方和の平方根です。1002 + 100 2 (合計20,000)の平方根を計算すると、約141になります。楕円の長さはそれぞれ約282になります。
Point3d center = Point3d.Origin; Vector3d normal = Vector3d.ZAxis; Vector3d majorAxis = 100 * Vector3d.XAxis + 100 * Vector3d.YAxis; double radiusRatio = 0.5; double startAng = Math.PI * 0.1; double endAng = Math.PI * 1.3; Ellipse acEllipse = new Ellipse(center, normal, majorAxis, radiusRatio, startAng, endAng);
次のようになります(向きを簡単にするために線が引かれています)。
startAng
ゼロより大きいため、楕円の上部は軸からは開始されませんが、少し先になります。
endAng
は
endAng
あまり到達しないため、楕円の下部は
endAng
よりもはるかに早く終了します。
傾斜は、軸ベクトル(
majorAxis = 100 * Vector3d.XAxis + 100 * Vector3d.YAxis
)を設定することにより保証されます。 このベクトルのX成分の大きさはY成分と等しいため、45度の勾配が得られます。
半軸の長さはピタゴラスの定理によって計算できます:これは、座標XとYの平方和の平方根です。1002 + 100 2 (合計20,000)の平方根を計算すると、約141になります。楕円の長さはそれぞれ約282になります。
サークル
円を作成するには、ハッチング-
Hatch
( documentation 、 translation )を使用できます。
手順は次のとおりです。
- ハッチ境界線を作成します。 閉じた曲線は境界として機能できます。この場合、円になります。
- ハッチング境界線に必要なプロパティを設定します。
- 図面にハッチング境界線を追加します。
- ハッチの境界となるオブジェクトの配列を作成し、それに境界を追加します。
- ハッチを作成します。
- 図面にハッチを追加します。
- ハッチングに必要なプロパティを設定します。
手順が追加されましたが、すべて簡単です。
チームコード:
[CommandMethod("HabrCommand")] public void HabrCommand() { // Document acDoc = acad.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // (Model Space) - BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // 1) - Circle acCircle = new Circle(); // 2) acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(2.5, 3.14, 0); acCircle.Radius = 4.25; // 3) acBlkTblRec.AppendEntity(acCircle); acTrans.AddNewlyCreatedDBObject(acCircle, true); // 4) - ObjectIdCollection acObjIdColl = new ObjectIdCollection(); acObjIdColl.Add(acCircle.ObjectId); // 5) Hatch acHatch = new Hatch(); // 6) acBlkTblRec.AppendEntity(acHatch); acTrans.AddNewlyCreatedDBObject(acHatch, true); // 7) acHatch.SetDatabaseDefaults(); acHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID"); acHatch.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(0, 200, 0); acHatch.Associative = true; acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl); acHatch.EvaluateHatch(true); // acTrans.Commit(); } }
結果:
ハッチの境界線を作成する部分は問題を引き起こさないはずです-それは、私たちが作成して図面に配置した単なる円です。 ハッチングが作成され、図面に追加される部分も説明の必要はありません。 ハッチングパラメーターを設定する部分が残っています。 さらに詳しく見ていきましょう。
最初に、
setDatabaseDefaults()
関数を呼び出します。この関数は、ハッチングオプションをデフォルトオプションに設定します。 この機能の目的については、最初のセクションで説明しました。
次に、
SetHatchPattern()
関数を使用してハッチングのタイプを指定します。 この場合、規則的な円を描きたいので、
SOLID
タイプ-「solid」を選択します。
注意:
ソリッドに加えて、別のタイプのハッチングを指定できます。 AutoCADには、すぐに使用できる多数のハッチが用意されています。それらを見つけるには、Hatchオブジェクトのプロパティを呼び出すだけです。
代わりに
他の何かを指定できます。 たとえば、
を指定すると、次の結果が得られます。
標準の
(
)に加えて、以前にAutoCADに接続されていたサードパーティの
を使用できます。 ここに例へのリンクがあります。

SOLID
代わりに
SOLID
他の何かを指定できます。 たとえば、
HOUND
を指定すると、次の結果が得られます。

標準の
HatchPatternType.PreDefined
(
HatchPatternType.PreDefined
)に加えて、以前にAutoCADに接続されていたサードパーティの
HatchPatternType.PreDefined
を使用できます。 ここに例へのリンクがあります。
ハッチングのタイプを設定した後、
FromRgb(byte ref, byte blue, byte green)
関数
FromRgb(byte ref, byte blue, byte green)
を使用して色(
Color
プロパティ)を指定しました。
次に、
Associative
プロパティが続きます-境界線のサイズを変更するときにハッチングのサイズを変更するかどうかを決定します。
イラスト
ハッチの境界線を変更すると、例(
)で何が起こるかを示します。
円の新しい半径は5で、ハッチングは新しい半径の下に引き伸ばされます。
そして、これは
例です:
Associative = true
)で何が起こるかを示します。

円の新しい半径は5で、ハッチングは新しい半径の下に引き伸ばされます。
そして、これは
Associative = false
例です:

ドキュメント ( 翻訳 )の「Define the Hatch Boundaries(.NET)」セクションでは、ブロックテーブル(つまりモデル空間)にシェーディングを追加した後、
AppendLoop
メソッドを呼び出す前に、
Associative
プロパティを設定する必要があると述べています。
AppendLoop
メソッドを使用
AppendLoop
と、ハッチの外側の境界線を指定でき、入力として2つのパラメーター(境界線の種類とハッチ境界線オブジェクトの配列)を受け入れます。最初のパラメーターとして示したため
HatchLoopTypes.Outermost
、ハッチングの外側の境界線を設定することを示しています。2番目として、以前に作成されたハッチング境界線オブジェクトの配列を示しました。
注意:
必要に応じて、外部に加えていくつかの内部境界線を指定し、それらが交差するときのハッチングの動作を決定できます。詳細はこちら。このような図の簡単な例に限定します。

チームコード:
[CommandMethod("HabrCommand")] public void HabrCommand() { // Document acDoc = acad.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // (Model Space) - BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Polyline acPolyline = new Polyline(); acPolyline.SetDatabaseDefaults(); acPolyline.AddVertexAt(0, new Point2d(50, 50), 0, 0, 0); acPolyline.AddVertexAt(1, new Point2d(150, 285), 0, 0, 0); acPolyline.AddVertexAt(2, new Point2d(250, 50), 0, 0, 0); acPolyline.AddVertexAt(3, new Point2d(25, 200), 0, 0, 0); acPolyline.AddVertexAt(4, new Point2d(275, 200), 0, 0, 0); acPolyline.AddVertexAt(5, new Point2d(50, 50), 0, 0, 0); acBlkTblRec.AppendEntity(acPolyline); acTrans.AddNewlyCreatedDBObject(acPolyline, true); // - ObjectIdCollection acObjIdColl_OUTER = new ObjectIdCollection(); acObjIdColl_OUTER.Add(acPolyline.ObjectId); // Circle acCircleOut = new Circle(); acCircleOut.SetDatabaseDefaults(); acCircleOut.Center = new Point3d(150, 165, 0); acCircleOut.Radius = 25; acBlkTblRec.AppendEntity(acCircleOut); acTrans.AddNewlyCreatedDBObject(acCircleOut, true); // - ObjectIdCollection acObjIdColl_INNER = new ObjectIdCollection(); acObjIdColl_INNER.Add(acCircleOut.ObjectId); // Hatch acHatch = new Hatch(); acBlkTblRec.AppendEntity(acHatch); acTrans.AddNewlyCreatedDBObject(acHatch, true); // acHatch.SetDatabaseDefaults(); acHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID"); acHatch.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(200, 0, 0); acHatch.Associative = false; acHatch.HatchStyle = HatchStyle.Normal; // acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl_OUTER); // acHatch.AppendLoop(HatchLoopTypes.Default, acObjIdColl_INNER); acHatch.EvaluateHatch(true); // acTrans.Commit(); } }
これで、作成されたハッチングのすべてのパラメーターが定義されました。画面にハッチングを表示するには、AutoCADが必要な計算を実行する必要があります。これらの計算を実行するには、関数を呼び出す必要があります
EvaluateHatch()
。
ハッチングの作成に必要なすべてのアクションが完了しました。手順6で既に図面とトランザクションに追加しました。ここで、AutoCADが変更を保存できるようにトランザクションを修正します。
最後に-円に関する別のメモ。
プログラマーでさえも、AutoCADで直接図面を操作する必要がある場合があります(以下の記事の1つで、ダイナミックブロックについてお話ししたかったのですが、これは特に当てはまります)。この場合、円を作成する最も簡単な方法は、AutoCADコンソールでDONUTコマンドを使用することです。構文は次のとおりです。
DONUT :
, — ?)
DONUT < > < > <>
DONUT :
DONUT 0 25 50,50 DONUT 25 75 200,50

, — ?)
PS
この記事は非常にシンプルであることが判明しましたが、すべてが明確でアクセスしやすいものであることを願っています。AutoCAD .NET APIを使用すると、円弧やスプラインなどのより複雑な形状を描画できますが、それらを使用することはできませんでした。これに関する情報は、必要に応じて、ドキュメント(翻訳)で見つけることができます。
一般に、私はここでテキストの追加と簡単なブロックの作成について話すつもりでしたが、すでにかなりまともなものがありました。したがって、これらの問題は次の記事で取り上げます。
ご清聴ありがとうございました!
コメントでは、フィードバック、コメント、提案を歓迎します。