Here's a sample to start with 'dynamic dimensions'.
You can google for 'DynamicDimensionDataCollection' to get more advanced examples.
[CommandMethod("TEST")]
public static void Test()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
var options = new PromptPointOptions("\nSpecify start point: ");
var result = ed.GetPoint(options);
if (result.Status != PromptStatus.OK) return;
var startPoint = result.Value;
using (var tr = db.TransactionManager.StartTransaction())
using (var line = new Line(startPoint, startPoint))
{
line.TransformBy(ed.CurrentUserCoordinateSystem);
var jig = new LineJig(line);
var pr = ed.Drag(jig);
if (pr.Status == PromptStatus.OK)
{
var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
curSpace.AppendEntity(line);
tr.AddNewlyCreatedDBObject(line, true);
}
tr.Commit();
}
}
class LineJig : EntityJig
{
Line line;
Point3d startPt, dragPt;
DynamicDimensionDataCollection dynDimDataCol;
public LineJig(Line line) : base(line)
{
this.line = line;
startPt = line.StartPoint;
dynDimDataCol = new DynamicDimensionDataCollection();
var angleDim = new LineAngularDimension2 { DynamicDimension = true };
var angleDynDim = new DynamicDimensionData(angleDim, false);
dynDimDataCol.Add(angleDynDim);
var lengthDim = new AlignedDimension { DynamicDimension = true };
var lengthDynDim = new DynamicDimensionData(lengthDim, false);
dynDimDataCol.Add(lengthDynDim);
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
var options = new JigPromptPointOptions("\nSpecify end point: ");
options.UserInputControls = UserInputControls.Accept3dCoordinates;
var result = prompts.AcquirePoint(options);
if (result.Value.IsEqualTo(dragPt))
return SamplerStatus.NoChange;
dragPt = result.Value;
return SamplerStatus.OK;
}
protected override bool Update()
{
var ed = Application.DocumentManager.MdiActiveDocument.Editor;
double height;
using (var view = ed.GetCurrentView())
{
height = view.Height / 20.0;
}
line.EndPoint = dragPt;
var direction = startPt.GetVectorTo(dragPt).GetNormal() * height;
var angleDim = (LineAngularDimension2)dynDimDataCol[0].Dimension;
var lengthDim = (AlignedDimension)dynDimDataCol[1].Dimension;
lengthDim.XLine1Point = startPt;
lengthDim.XLine2Point = dragPt;
if (Math.PI < line.Angle)
{
angleDim.XLine1Start = startPt;
angleDim.XLine1End = dragPt;
angleDim.XLine2Start = startPt;
angleDim.XLine2End = startPt + Vector3d.XAxis * line.Length * 0.01;
angleDim.ArcPoint = startPt + line.Length * Vector3d.XAxis.RotateBy((line.Angle + 2 * Math.PI) / 2, Vector3d.ZAxis);
lengthDim.DimLinePoint = startPt + direction.RotateBy(Math.PI * 1.5, Vector3d.ZAxis);
}
else
{
angleDim.XLine1Start = startPt;
angleDim.XLine1End = startPt + Vector3d.XAxis * line.Length * 0.01;
angleDim.XLine2Start = startPt;
angleDim.XLine2End = dragPt;
angleDim.ArcPoint = startPt + line.Length * Vector3d.XAxis.RotateBy(line.Angle / 2, Vector3d.ZAxis);
lengthDim.DimLinePoint = startPt + direction.RotateBy(Math.PI * 0.5, Vector3d.ZAxis);
}
return true;
}
protected override DynamicDimensionDataCollection GetDynamicDimensionData(double dimScale)
{
base.GetDynamicDimensionData(dimScale);
return dynDimDataCol;
}
}