Skip to content

Commit ccb3046

Browse files
committed
Add sample AutoCAD command implementations
Introduce several C# command classes for AutoCAD, including listing layers, mirroring and rotating selections, offsetting polylines, creating regular polygons, rectangles (by width/height and by two points), triangles from three points, and simple text notes. These samples provide basic geometric and entity manipulation utilities for testing and demonstration purposes.
1 parent b761f44 commit ccb3046

9 files changed

+394
-0
lines changed

Test/ListLayersSimple.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.Runtime;
4+
5+
namespace Test;
6+
7+
public class ListLayersSimple
8+
{
9+
[CommandMethod("ListLayersSimple")]
10+
public static void ListLayers()
11+
{
12+
var doc = Application.DocumentManager.MdiActiveDocument;
13+
var db = doc.Database;
14+
var ed = doc.Editor;
15+
16+
using (var tr = db.TransactionManager.StartTransaction())
17+
{
18+
var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
19+
foreach (var id in lt)
20+
{
21+
var ltr = (LayerTableRecord)tr.GetObject(id, OpenMode.ForRead);
22+
ed.WriteMessage($"\nLayer: {ltr.Name}");
23+
}
24+
tr.Commit();
25+
}
26+
}
27+
}

Test/MirrorSelection.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.EditorInput;
4+
using Autodesk.AutoCAD.Geometry;
5+
using Autodesk.AutoCAD.Runtime;
6+
7+
namespace Test;
8+
9+
public class MirrorSelection
10+
{
11+
[CommandMethod("MirrorSel")]
12+
public static void MirrorSelectedEntities()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var selRes = ed.GetSelection();
19+
if (selRes.Status != PromptStatus.OK) return;
20+
21+
var p1Res = ed.GetPoint("\nMirror line start:");
22+
if (p1Res.Status != PromptStatus.OK) return;
23+
var p2Res = ed.GetPoint("\nMirror line end:");
24+
if (p2Res.Status != PromptStatus.OK) return;
25+
26+
var line = new Line3d(p1Res.Value, p2Res.Value);
27+
var mirror = Matrix3d.Mirroring(line);
28+
29+
using (var tr = db.TransactionManager.StartTransaction())
30+
{
31+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
32+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
33+
34+
foreach (SelectedObject so in selRes.Value)
35+
{
36+
if (so.ObjectId.IsNull) continue;
37+
var ent = tr.GetObject(so.ObjectId, OpenMode.ForRead) as Entity;
38+
if (ent == null) continue;
39+
var clone = ent.Clone() as Entity;
40+
if (clone == null) continue;
41+
clone.TransformBy(mirror);
42+
ms.AppendEntity(clone);
43+
tr.AddNewlyCreatedDBObject(clone, true);
44+
}
45+
tr.Commit();
46+
}
47+
}
48+
}

Test/OffsetPolylineSample.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.EditorInput;
4+
using Autodesk.AutoCAD.Runtime;
5+
6+
namespace Test;
7+
8+
public class OffsetPolylineSample
9+
{
10+
[CommandMethod("OffsetPL")]
11+
public static void OffsetSelectedPolyline()
12+
{
13+
var doc = Application.DocumentManager.MdiActiveDocument;
14+
var db = doc.Database;
15+
var ed = doc.Editor;
16+
17+
var peo = new PromptEntityOptions("\nSelect Polyline to offset:");
18+
peo.SetRejectMessage("\nEntity is not a Polyline.");
19+
peo.AddAllowedClass(typeof(Polyline), exactMatch: true);
20+
var per = ed.GetEntity(peo);
21+
if (per.Status != PromptStatus.OK) return;
22+
23+
var distRes = ed.GetDistance("\nOffset distance:");
24+
if (distRes.Status != PromptStatus.OK) return;
25+
double d = distRes.Value;
26+
27+
using (var tr = db.TransactionManager.StartTransaction())
28+
{
29+
var pl = (Polyline)tr.GetObject(per.ObjectId, OpenMode.ForRead);
30+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
31+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
32+
33+
var offs = pl.GetOffsetCurves(d);
34+
foreach (DBObject dbo in offs)
35+
{
36+
if (dbo is Entity ent)
37+
{
38+
ms.AppendEntity(ent);
39+
tr.AddNewlyCreatedDBObject(ent, true);
40+
}
41+
}
42+
tr.Commit();
43+
}
44+
}
45+
}

Test/PolygonRegular.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.EditorInput;
4+
using Autodesk.AutoCAD.Geometry;
5+
using Autodesk.AutoCAD.Runtime;
6+
7+
namespace Test;
8+
9+
public class PolygonRegular
10+
{
11+
[CommandMethod("PolygonN")]
12+
public static void CreateRegularPolygon()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var centerRes = ed.GetPoint("\nCenter point:");
19+
if (centerRes.Status != PromptStatus.OK) return;
20+
21+
var radiusRes = ed.GetDistance("\nRadius:");
22+
if (radiusRes.Status != PromptStatus.OK) return;
23+
24+
var sidesOpts = new PromptIntegerOptions("\nNumber of sides:")
25+
{
26+
AllowNone = false,
27+
LowerLimit = 3,
28+
UpperLimit = 128
29+
};
30+
var sidesRes = ed.GetInteger(sidesOpts);
31+
if (sidesRes.Status != PromptStatus.OK) return;
32+
33+
int n = sidesRes.Value;
34+
double r = radiusRes.Value;
35+
var c = centerRes.Value;
36+
37+
using (var tr = db.TransactionManager.StartTransaction())
38+
{
39+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
40+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
41+
42+
var pl = new Polyline { Closed = true };
43+
for (int i = 0; i < n; i++)
44+
{
45+
double ang = (2.0 * System.Math.PI / n) * i;
46+
double x = c.X + r * System.Math.Cos(ang);
47+
double y = c.Y + r * System.Math.Sin(ang);
48+
pl.AddVertexAt(i, new Point2d(x, y), 0, 0, 0);
49+
}
50+
ms.AppendEntity(pl);
51+
tr.AddNewlyCreatedDBObject(pl, true);
52+
tr.Commit();
53+
}
54+
}
55+
}

Test/RectangleByWidthHeight.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.EditorInput;
4+
using Autodesk.AutoCAD.Geometry;
5+
using Autodesk.AutoCAD.Runtime;
6+
7+
namespace Test;
8+
9+
public class RectangleByWidthHeight
10+
{
11+
[CommandMethod("RectWH")]
12+
public static void CreateRectangleByWidthHeight()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var baseRes = ed.GetPoint("\nBase (lower-left) point:");
19+
if (baseRes.Status != PromptStatus.OK) return;
20+
21+
var wRes = ed.GetDistance("\nWidth:");
22+
if (wRes.Status != PromptStatus.OK) return;
23+
var hRes = ed.GetDistance("\nHeight:");
24+
if (hRes.Status != PromptStatus.OK) return;
25+
26+
double w = wRes.Value;
27+
double h = hRes.Value;
28+
var p = baseRes.Value;
29+
30+
using (var tr = db.TransactionManager.StartTransaction())
31+
{
32+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
33+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
34+
35+
var pl = new Polyline { Closed = true };
36+
pl.AddVertexAt(0, new Point2d(p.X, p.Y), 0, 0, 0);
37+
pl.AddVertexAt(1, new Point2d(p.X + w, p.Y), 0, 0, 0);
38+
pl.AddVertexAt(2, new Point2d(p.X + w, p.Y + h), 0, 0, 0);
39+
pl.AddVertexAt(3, new Point2d(p.X, p.Y + h), 0, 0, 0);
40+
41+
ms.AppendEntity(pl);
42+
tr.AddNewlyCreatedDBObject(pl, true);
43+
tr.Commit();
44+
}
45+
}
46+
}

Test/RectangleFromTwoPoints.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.EditorInput;
4+
using Autodesk.AutoCAD.Geometry;
5+
using Autodesk.AutoCAD.Runtime;
6+
7+
namespace Test;
8+
9+
public class RectangleFromTwoPoints
10+
{
11+
[CommandMethod("Rect2Pts")]
12+
public static void CreateRectangleFromTwoCorners()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var p1Res = ed.GetPoint("\nPick first corner:");
19+
if (p1Res.Status != PromptStatus.OK) return;
20+
var p2Res = ed.GetCorner(new PromptCornerOptions("\nPick opposite corner:", p1Res.Value));
21+
if (p2Res.Status != PromptStatus.OK) return;
22+
23+
var p1 = p1Res.Value;
24+
var p2 = p2Res.Value;
25+
26+
// Compute other corners (axis-aligned)
27+
var p3 = new Point3d(p1.X, p2.Y, p1.Z);
28+
var p4 = new Point3d(p2.X, p1.Y, p1.Z);
29+
30+
using (var tr = db.TransactionManager.StartTransaction())
31+
{
32+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
33+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
34+
35+
var pl = new Polyline { Closed = true };
36+
pl.AddVertexAt(0, new Point2d(p1.X, p1.Y), 0, 0, 0);
37+
pl.AddVertexAt(1, new Point2d(p3.X, p3.Y), 0, 0, 0);
38+
pl.AddVertexAt(2, new Point2d(p2.X, p2.Y), 0, 0, 0);
39+
pl.AddVertexAt(3, new Point2d(p4.X, p4.Y), 0, 0, 0);
40+
41+
ms.AppendEntity(pl);
42+
tr.AddNewlyCreatedDBObject(pl, true);
43+
tr.Commit();
44+
}
45+
}
46+
}

Test/RotateSelection.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.EditorInput;
4+
using Autodesk.AutoCAD.Geometry;
5+
using Autodesk.AutoCAD.Runtime;
6+
7+
namespace Test;
8+
9+
public class RotateSelection
10+
{
11+
[CommandMethod("RotateSel")]
12+
public static void RotateSelectedEntities()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var selRes = ed.GetSelection();
19+
if (selRes.Status != PromptStatus.OK) return;
20+
21+
var baseRes = ed.GetPoint("\nBase point:");
22+
if (baseRes.Status != PromptStatus.OK) return;
23+
24+
var angRes = ed.GetAngle(baseRes.Value.ToString());
25+
if (angRes.Status != PromptStatus.OK) return;
26+
double angleRad = angRes.Value; // already radians
27+
28+
var rot = Matrix3d.Rotation(angleRad, Vector3d.ZAxis, baseRes.Value);
29+
30+
using (var tr = db.TransactionManager.StartTransaction())
31+
{
32+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
33+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
34+
35+
foreach (SelectedObject so in selRes.Value)
36+
{
37+
var ent = tr.GetObject(so.ObjectId, OpenMode.ForRead) as Entity;
38+
if (ent == null) continue;
39+
var clone = ent.Clone() as Entity;
40+
if (clone == null) continue;
41+
clone.TransformBy(rot);
42+
ms.AppendEntity(clone);
43+
tr.AddNewlyCreatedDBObject(clone, true);
44+
}
45+
tr.Commit();
46+
}
47+
}
48+
}

Test/TextNoteSimple.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.EditorInput;
4+
using Autodesk.AutoCAD.Geometry;
5+
using Autodesk.AutoCAD.Runtime;
6+
7+
namespace Test;
8+
9+
public class TextNoteSimple
10+
{
11+
[CommandMethod("TextNote")]
12+
public static void CreateTextNote()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var pRes = ed.GetPoint("\nInsertion point:");
19+
if (pRes.Status != PromptStatus.OK) return;
20+
var sRes = ed.GetString("\nText content:");
21+
if (sRes.Status != PromptStatus.OK) return;
22+
23+
using (var tr = db.TransactionManager.StartTransaction())
24+
{
25+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
26+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
27+
28+
var txt = new DBText
29+
{
30+
Position = pRes.Value,
31+
Height = 2.5,
32+
TextString = sRes.StringResult
33+
};
34+
ms.AppendEntity(txt);
35+
tr.AddNewlyCreatedDBObject(txt, true);
36+
tr.Commit();
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)