Skip to content

Commit ee7f19f

Browse files
committed
Add basic AutoCAD command test scripts
Introduce a set of C# scripts for AutoCAD that implement basic drawing and editing commands, including creating lines, circles, arcs, polylines, copying, moving, and scaling selections, as well as simple layer management and block listing. These scripts are intended for testing and demonstration purposes.
1 parent ccb3046 commit ee7f19f

10 files changed

+399
-0
lines changed

Test/ArcByCenterStartEnd.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System;
2+
using Autodesk.AutoCAD.ApplicationServices.Core;
3+
using Autodesk.AutoCAD.DatabaseServices;
4+
using Autodesk.AutoCAD.EditorInput;
5+
using Autodesk.AutoCAD.Geometry;
6+
using Autodesk.AutoCAD.Runtime;
7+
8+
namespace Test;
9+
10+
public class ArcByCenterStartEnd
11+
{
12+
[CommandMethod("ArcCSE")]
13+
public static void CreateArcCSE()
14+
{
15+
var doc = Application.DocumentManager.MdiActiveDocument;
16+
var db = doc.Database;
17+
var ed = doc.Editor;
18+
19+
var cRes = ed.GetPoint("\nCenter point:");
20+
if (cRes.Status != PromptStatus.OK) return;
21+
var sRes = ed.GetPoint("\nStart point:");
22+
if (sRes.Status != PromptStatus.OK) return;
23+
var eRes = ed.GetPoint("\nEnd point:");
24+
if (eRes.Status != PromptStatus.OK) return;
25+
26+
var c = cRes.Value;
27+
var s = sRes.Value;
28+
var e = eRes.Value;
29+
30+
var vS = new Vector2d(s.X - c.X, s.Y - c.Y);
31+
var vE = new Vector2d(e.X - c.X, e.Y - c.Y);
32+
double startAng = Math.Atan2(vS.Y, vS.X);
33+
double endAng = Math.Atan2(vE.Y, vE.X);
34+
double r = c.DistanceTo(s);
35+
36+
using (var tr = db.TransactionManager.StartTransaction())
37+
{
38+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
39+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
40+
41+
var arc = new Arc(c, r, startAng, endAng);
42+
ms.AppendEntity(arc);
43+
tr.AddNewlyCreatedDBObject(arc, true);
44+
tr.Commit();
45+
}
46+
}
47+
}

Test/CircleByCenterRadius.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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 CircleByCenterRadius
10+
{
11+
[CommandMethod("CircleCR")]
12+
public static void CreateCircleCR()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var cRes = ed.GetPoint("\nCenter point:");
19+
if (cRes.Status != PromptStatus.OK) return;
20+
var rRes = ed.GetDistance("\nRadius:");
21+
if (rRes.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 circle = new Circle(cRes.Value, Vector3d.ZAxis, rRes.Value);
29+
ms.AppendEntity(circle);
30+
tr.AddNewlyCreatedDBObject(circle, true);
31+
tr.Commit();
32+
}
33+
}
34+
}

Test/CopySelection.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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 CopySelection
10+
{
11+
[CommandMethod("CopySel")]
12+
public static void CopySelectedEntities()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var sel = ed.GetSelection();
19+
if (sel.Status != PromptStatus.OK) return;
20+
21+
var fromRes = ed.GetPoint("\nBase point:");
22+
if (fromRes.Status != PromptStatus.OK) return;
23+
var toRes = ed.GetPoint("\nSecond point:");
24+
if (toRes.Status != PromptStatus.OK) return;
25+
26+
var disp = toRes.Value - fromRes.Value;
27+
var mat = Matrix3d.Displacement(disp);
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 sel.Value)
35+
{
36+
var ent = tr.GetObject(so.ObjectId, OpenMode.ForRead) as Entity;
37+
if (ent == null) continue;
38+
var clone = ent.Clone() as Entity;
39+
if (clone == null) continue;
40+
clone.TransformBy(mat);
41+
ms.AppendEntity(clone);
42+
tr.AddNewlyCreatedDBObject(clone, true);
43+
}
44+
tr.Commit();
45+
}
46+
}
47+
}

Test/CreateLayerSimple.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.Colors;
3+
using Autodesk.AutoCAD.DatabaseServices;
4+
using Autodesk.AutoCAD.Runtime;
5+
6+
namespace Test;
7+
8+
public class CreateLayerSimple
9+
{
10+
[CommandMethod("MakeLayer")]
11+
public static void MakeLayer()
12+
{
13+
var doc = Application.DocumentManager.MdiActiveDocument;
14+
var db = doc.Database;
15+
var ed = doc.Editor;
16+
17+
var sRes = ed.GetString("\nNew layer name:");
18+
if (sRes.Status != Autodesk.AutoCAD.EditorInput.PromptStatus.OK) return;
19+
var name = sRes.StringResult;
20+
21+
using (var tr = db.TransactionManager.StartTransaction())
22+
{
23+
var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForWrite);
24+
if (lt.Has(name))
25+
{
26+
ed.WriteMessage($"\nLayer '{name}' already exists.");
27+
}
28+
else
29+
{
30+
var ltr = new LayerTableRecord { Name = name, Color = Color.FromColorIndex(ColorMethod.ByAci, 3) };
31+
lt.Add(ltr);
32+
tr.AddNewlyCreatedDBObject(ltr, true);
33+
ed.WriteMessage($"\nLayer '{name}' created.");
34+
}
35+
tr.Commit();
36+
}
37+
}
38+
}

Test/LineBetweenTwoPoints.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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 LineBetweenTwoPoints
10+
{
11+
[CommandMethod("Line2Pts")]
12+
public static void CreateLine2Pts()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var p1 = ed.GetPoint("\nFirst point:");
19+
if (p1.Status != PromptStatus.OK) return;
20+
var p2 = ed.GetPoint("\nSecond point:");
21+
if (p2.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 ln = new Line(p1.Value, p2.Value);
29+
ms.AppendEntity(ln);
30+
tr.AddNewlyCreatedDBObject(ln, true);
31+
tr.Commit();
32+
}
33+
}
34+
}

Test/ListBlocksSimple.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Autodesk.AutoCAD.ApplicationServices.Core;
2+
using Autodesk.AutoCAD.DatabaseServices;
3+
using Autodesk.AutoCAD.Runtime;
4+
5+
namespace Test;
6+
7+
public class ListBlocksSimple
8+
{
9+
[CommandMethod("ListBlocksSimple")]
10+
public static void ListBlocks()
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 bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
19+
foreach (var id in bt)
20+
{
21+
var btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead);
22+
if (btr.IsLayout) continue;
23+
ed.WriteMessage($"\nBlock: {btr.Name}");
24+
}
25+
tr.Commit();
26+
}
27+
}
28+
}

Test/MoveSelection.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 MoveSelection
10+
{
11+
[CommandMethod("MoveSel")]
12+
public static void MoveSelectedEntities()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var sel = ed.GetSelection();
19+
if (sel.Status != PromptStatus.OK) return;
20+
21+
var fromRes = ed.GetPoint("\nBase point:");
22+
if (fromRes.Status != PromptStatus.OK) return;
23+
var toRes = ed.GetPoint("\nSecond point:");
24+
if (toRes.Status != PromptStatus.OK) return;
25+
26+
var disp = toRes.Value - fromRes.Value;
27+
var mat = Matrix3d.Displacement(disp);
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 sel.Value)
35+
{
36+
var ent = tr.GetObject(so.ObjectId, OpenMode.ForWrite) as Entity;
37+
if (ent == null) continue;
38+
ent.TransformBy(mat);
39+
}
40+
tr.Commit();
41+
}
42+
}
43+
}

Test/PolylineFromPoints.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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+
using System.Collections.Generic;
7+
8+
namespace Test;
9+
10+
public class PolylineFromPoints
11+
{
12+
[CommandMethod("PolylinePts")]
13+
public static void CreatePolylinePts()
14+
{
15+
var doc = Application.DocumentManager.MdiActiveDocument;
16+
var db = doc.Database;
17+
var ed = doc.Editor;
18+
19+
var pts = new List<Point3d>();
20+
while (true)
21+
{
22+
var pRes = ed.GetPoint("\nPick point or press Enter to finish:");
23+
if (pRes.Status == PromptStatus.OK)
24+
{
25+
pts.Add(pRes.Value);
26+
}
27+
else
28+
{
29+
break;
30+
}
31+
}
32+
33+
if (pts.Count < 2)
34+
{
35+
ed.WriteMessage("\nNeed at least 2 points.");
36+
return;
37+
}
38+
39+
using (var tr = db.TransactionManager.StartTransaction())
40+
{
41+
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
42+
var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
43+
44+
var pl = new Polyline { Closed = false };
45+
for (int i = 0; i < pts.Count; i++)
46+
{
47+
pl.AddVertexAt(i, new Point2d(pts[i].X, pts[i].Y), 0, 0, 0);
48+
}
49+
ms.AppendEntity(pl);
50+
tr.AddNewlyCreatedDBObject(pl, true);
51+
tr.Commit();
52+
}
53+
}
54+
}

Test/ScaleSelection.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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 ScaleSelection
10+
{
11+
[CommandMethod("ScaleSel")]
12+
public static void ScaleSelectedEntities()
13+
{
14+
var doc = Application.DocumentManager.MdiActiveDocument;
15+
var db = doc.Database;
16+
var ed = doc.Editor;
17+
18+
var sel = ed.GetSelection();
19+
if (sel.Status != PromptStatus.OK) return;
20+
21+
var baseRes = ed.GetPoint("\nBase point:");
22+
if (baseRes.Status != PromptStatus.OK) return;
23+
24+
var scaleOpts = new PromptDoubleOptions("\nScale factor:") { AllowZero = false, AllowNegative = false };
25+
var scRes = ed.GetDouble(scaleOpts);
26+
if (scRes.Status != PromptStatus.OK) return;
27+
28+
var mat = Matrix3d.Scaling(scRes.Value, baseRes.Value);
29+
30+
using (var tr = db.TransactionManager.StartTransaction())
31+
{
32+
foreach (SelectedObject so in sel.Value)
33+
{
34+
var ent = tr.GetObject(so.ObjectId, OpenMode.ForWrite) as Entity;
35+
if (ent == null) continue;
36+
ent.TransformBy(mat);
37+
}
38+
tr.Commit();
39+
}
40+
}
41+
}

0 commit comments

Comments
 (0)