https://www.cnblogs.com/swtool/p/SWTOOL_00012.html
using System;
using System.Linq.Expressions;
using System.Reflection;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
namespace RevisionCloud
{
public class UsingRunCommand
{
[CommandMethod("CLOUD1")]
public void Cloud()
{
Document doc = AcAp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptPointResult ppr = ed.GetPoint("\nSpecify the first corner: ");
if (ppr.Status != PromptStatus.OK) return;
Point3d pt1 = ppr.Value;
ppr = ed.GetCorner("\nSpecify the opposite corner: ", pt1);
if (ppr.Status != PromptStatus.OK) return;
Point3d pt2 = ppr.Value;
ObjectId id = DrawRectangle(db, pt1, pt2);
ed.Command("_revcloud", "_arc", 2.0, 6.0, "_object", id, "_no");
}
private static ObjectId DrawRectangle(Database db, Point3d pt1, Point3d pt2)
{
ObjectId id;
using (Transaction tr = db.TransactionManager.StartTransaction())
using (Polyline pline = new Polyline(4))
{
pline.AddVertexAt(0, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(1, new Point2d(pt2.X, pt1.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(2, new Point2d(pt2.X, pt2.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(3, new Point2d(pt1.X, pt2.Y), 0.0, 0.0, 0.0);
pline.Closed = true;
BlockTableRecord space =
(BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
id = space.AppendEntity(pline);
tr.AddNewlyCreatedDBObject(pline, true);
tr.Commit();
}
return id;
}
}
public static class Extension
{
public static PromptStatus Command(this Editor ed, params object[] args)
{
if (ed == null)
throw new ArgumentNullException("ed");
return runCommand(ed, args);
}
static Func runCommand = GenerateRunCommand();
static Func GenerateRunCommand()
{
MethodInfo method = typeof(Editor).GetMethod(
"RunCommand", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
ParameterExpression instance = Expression.Parameter(typeof(Editor), "ed");
ParameterExpression args = Expression.Parameter(typeof(object[]), "args");
return Expression.Lambda>(
Expression.Call(instance, method, args), instance, args)
.Compile();
}
}
}
using System;
using System.Runtime.InteropServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
namespace RevisionCloud
{
public class UsingAcedCommand
{
[CommandMethod("CLOUD2")]
public static void Cloud2()
{
Document doc = AcAp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptPointResult ppr = ed.GetPoint("\nSpecify the first corner: ");
if (ppr.Status != PromptStatus.OK) return;
Point3d pt1 = ppr.Value;
ppr = ed.GetCorner("\nSpecify the opposite corner: ", pt1);
if (ppr.Status != PromptStatus.OK) return;
Point3d pt2 = ppr.Value;
ObjectId id = DrawRectangle(db, pt1, pt2);
DrawRevCloud(id, 1.0);
}
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("accore.dll", EntryPoint = "acedCmd", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
extern static private int acedCmd(IntPtr resbuf);
private static ObjectId DrawRectangle(Database db, Point3d pt1, Point3d pt2)
{
ObjectId id;
using (Transaction tr = db.TransactionManager.StartTransaction())
using (Polyline pline = new Polyline(4))
{
pline.AddVertexAt(0, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(1, new Point2d(pt2.X, pt1.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(2, new Point2d(pt2.X, pt2.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(3, new Point2d(pt1.X, pt2.Y), 0.0, 0.0, 0.0);
pline.Closed = true;
BlockTableRecord space =
(BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
id = space.AppendEntity(pline);
tr.AddNewlyCreatedDBObject(pline, true);
tr.Commit();
}
return id;
}
private static void DrawRevCloud(ObjectId id, double scale)
{
ResultBuffer args = new ResultBuffer(
new TypedValue((int)LispDataType.Text, "_revcloud"),
new TypedValue((int)LispDataType.Text, "_arc"),
new TypedValue((int)LispDataType.Double, 2.0 / scale),
new TypedValue((int)LispDataType.Double, 6.0 / scale),
new TypedValue((int)LispDataType.Text, "_object"),
new TypedValue((int)LispDataType.ObjectId, id),
new TypedValue((int)LispDataType.Text, "_no"));
acedCmd(args.UnmanagedObject);
}
}
}