Hi,
You cannot create custom object with the .NET API but you can use the Overrule API.
Here's a little example.
using Autodesk.AutoCAD.GraphicsInterface;
using AcDb = Autodesk.AutoCAD.DatabaseServices;
namespace CircleOverrruleSample
{
class CircleOverrule : DrawableOverrule
{
public static string RegAppName => "Gile_ConcentricCircles";
public CircleOverrule()
{
AddOverrule(GetClass(typeof(AcDb.Circle)), this, true);
SetXDataFilter(RegAppName);
Overruling = true;
}
public override bool WorldDraw(Drawable drawable, WorldDraw wd)
{
var circle = (AcDb.Circle)drawable;
wd.Geometry.Circle(circle.Center, circle.Radius, circle.Normal);
wd.Geometry.Circle(circle.Center, circle.Radius / 2.0, circle.Normal);
return true;
}
}
}
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
namespace CircleOverrruleSample
{
class CircleJig : EntityJig
{
Circle circle;
double radius;
public CircleJig(Circle circle) : base(circle)
{
this.circle = circle;
radius = circle.Radius;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
var options = new JigPromptDistanceOptions("\nSpecify the radius; ");
options.BasePoint = circle.Center;
options.UseBasePoint = true;
options.UserInputControls =
UserInputControls.Accept3dCoordinates |
UserInputControls.NoNegativeResponseAccepted |
UserInputControls.NoZeroResponseAccepted;
var result = prompts.AcquireDistance(options);
if (result.Value == radius)
return SamplerStatus.NoChange;
radius = result.Value;
return SamplerStatus.OK;
}
protected override bool Update()
{
circle.Radius = radius;
return true;
}
}
}
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
namespace CircleOverrruleSample
{
public class Initialization : IExtensionApplication
{
DocumentCollection docs = AcAp.DocumentManager;
static CircleOverrule overrule;
public void Initialize()
{
overrule = new CircleOverrule();
AcAp.Idle += OnIdle;
}
private void OnIdle(object sender, EventArgs e)
{
var doc = AcAp.DocumentManager.MdiActiveDocument;
if (doc != null)
{
AcAp.Idle -= OnIdle;
doc.Editor.WriteMessage("\nCircleOverrruleSample loaded.\n");
}
}
public void Terminate()
{ }
}
}
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
[assembly: CommandClass(typeof(CircleOverrruleSample.Commands))]
namespace CircleOverrruleSample
{
public class Commands
{
[CommandMethod("2CIRCLE")]
public static void TwoCircleCommand()
{
var doc = AcAp.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
var ppr = ed.GetPoint("\nSpecify the center; ");
if (ppr.Status == PromptStatus.OK)
{
using (var tr = db.TransactionManager.StartTransaction())
{
var cSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
var circle = new Circle(ppr.Value, Vector3d.ZAxis, 1.0);
cSpace.AppendEntity(circle);
tr.AddNewlyCreatedDBObject(circle, true);
using (var data = new ResultBuffer(
new TypedValue(1001, CircleOverrule.RegAppName),
new TypedValue(1000, "Dummy text")))
{
AddXdata(circle, data);
}
var jig = new CircleJig(circle);
var pr = ed.Drag(jig);
if (pr.Status != PromptStatus.OK)
{
circle.Erase();
}
tr.Commit();
}
}
}
private static void AddXdata(DBObject dbObj, ResultBuffer data)
{
var db = dbObj.Database;
var tr = db.TransactionManager.TopTransaction;
var regAppName = (string)data.AsArray()[0].Value;
var regAppTable = (RegAppTable)tr.GetObject(db.RegAppTableId, OpenMode.ForRead);
if (!regAppTable.Has(regAppName))
{
var regApp = new RegAppTableRecord() { Name = regAppName };
regAppTable.UpgradeOpen();
regAppTable.Add(regApp);
tr.AddNewlyCreatedDBObject(regApp, true);
}
dbObj.XData = data;
}
}
}