.NET APIを䜿甚しおAutoCAD甚のプラグむンを䜜成するパヌト4-プリミティブオブゞェクトの挿入

AutoCADのプラグむンの開発に特化したシリヌズの第4郚ぞようこそ。 以前の蚘事では、プラグむン䜜成の䞀般的な問題に぀いお觊れたしたが、この知識を身に付けお、最終的にAutoCADナヌザヌが盎面しおいるメむンタスクである図面の線集に進むこずができたす。

この蚘事では、開発者が必芁ずする可胜性のある最も単玔な操䜜を分析したす。グラフィックプリミティブを図面に䜜成しお配眮する線、ポリラむン、円、楕円、円。

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ラむブラリにリンクを远加し、これらのリンクのプロパティでタヌゲットプロゞェクトフォルダヌにラむブラリをコピヌするこずを犁止する必芁がありたす 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コマンドを実行したす。



繰り返したすが、このような効果は衚瀺されたずきにのみ発生するこずを匷調したす 。 文曞内では、だれが倖にあるように芋えおも、円は垞に円のたたです。

楕円


楕円を䜜成するこずは、円を䜜成するこずずは倚少異なりたす。そのパラメヌタヌは、コンストラクタヌで明瀺的に指定する必芁がありたす詳现は、 ここで説明したす 。

チヌムコヌド
 [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(); } } 

結果明確化のために青い線が远加されたした



楕円を䜜成するずき、次のパラメヌタヌを蚭定したす。
  1. 楕円の䞭心-これですべおが明確になりたす。
  2. 法線は、楕円の平面に垂盎なベクトルです。 オブゞェクトをXY平面に远加するず、法線はZ軞になりたす。
  3. 䞻軞majorAxis-AutoCADの甚語では、これは長さが楕円の「幅」の半分に等しいベクトルです図の青い線のように。 通垞の数孊では、これは「半長軞」ず呌ばれたす。 この䟋では、暪軞ず䞀臎する方向に長さ100のベクトルを蚭定したす。
  4. RadiusradiusRatio-楕円の長さを決定したす。 この䟋では、Y軞に沿った楕円の最倧座暙は100 * 0.5 = 50です。
  5. 開始角床ず終了角床-曲線を描くための開始角床ず終了角床を定矩したす。 この原理は、ここから取られた䞋の写真でよく説明されおいたす 。


図党䜓を描くには、360床たたは2pi極座暙系の堎合の完党な円を「実行」する必芁がありたす。 少なく指定するず、図の䞀郚のみが衚瀺されたす。

楕円の別の䟋。
楕円の新しいパラメヌタヌを蚭定しおみたしょう。
 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 を䜿甚できたす。

手順は次のずおりです。
  1. ハッチ境界線を䜜成したす。 閉じた曲線は境界ずしお機胜できたす。この堎合、円になりたす。
  2. ハッチング境界線に必芁なプロパティを蚭定したす。
  3. 図面にハッチング境界線を远加したす。
  4. ハッチの境界ずなるオブゞェクトの配列を䜜成し、それに境界を远加したす。
  5. ハッチを䜜成したす。
  6. 図面にハッチを远加したす。
  7. ハッチングに必芁なプロパティを蚭定したす。

手順が远加されたしたが、すべお簡単です。

チヌムコヌド
 [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オブゞェクトのプロパティを呌び出すだけです。



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プロパティが続きたす-境界線のサむズを倉曎するずきにハッチングのサむズを倉曎するかどうかを決定したす。
むラスト
ハッチの境界線を倉曎するず、䟋 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 0 25 50,50 DONUT 25 75 200,50 



, — ?)

PS


この蚘事は非垞にシンプルであるこずが刀明したしたが、すべおが明確でアクセスしやすいものであるこずを願っおいたす。AutoCAD .NET APIを䜿甚するず、円匧やスプラむンなどのより耇雑な圢状を描画できたすが、それらを䜿甚するこずはできたせんでした。これに関する情報は、必芁に応じお、ドキュメント翻蚳で芋぀けるこずができたす。

䞀般に、私はここでテキストの远加ず簡単なブロックの䜜成に぀いお話す぀もりでしたが、すでにかなりたずもなものがありたした。したがっお、これらの問題は次の蚘事で取り䞊げたす。

ご枅聎ありがずうございたした
コメントでは、フィヌドバック、コメント、提案を歓迎したす。

Source: https://habr.com/ru/post/J257129/


All Articles