本实例展示使用 EntityJig 技术,动态交互模式创建直线并同时显示动态尺寸。
如下图所示:
翻译自: AutoCAD .NET: EntityJig – Dynamic Dimension and Line Jig
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
[CommandMethod("JigLineWithDynDim")]
public static void JigLineWithDynDim()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
if (DynDimLineJigger.Jig())
{
doc.Editor.WriteMessage("\nSuccess\n");
}
else
{
doc.Editor.WriteMessage("\nFailure\n");
}
}
public class DynDimLineJigger : EntityJig
{
public int step = 1;
public Point3d _startPnt;
public Point3d _endPnt;
private DynamicDimensionDataCollection dddCollection
= new DynamicDimensionDataCollection();
public DynDimLineJigger(Line line)
: base(line)
{
Entity.SetDatabaseDefaults();
Dimension dim1 = new AlignedDimension();
dim1.SetDatabaseDefaults();
dddCollection.Add(new DynamicDimensionData(dim1, true, true));
dddCollection[0].Focal = false;
dddCollection[0].Editable = false;
}
private Editor Editor
{
get
{
return Application.DocumentManager.MdiActiveDocument.Editor;
}
}
public Line line
{
get
{
return base.Entity as Line;
}
}
protected override bool Update()
{
switch (step)
{
case 1:
line.StartPoint = line.EndPoint = _startPnt;
break;
case 2:
line.EndPoint = _endPnt;
AlignedDimension dim1 = (AlignedDimension)dddCollection[0].Dimension;
dim1.XLine1Point = _startPnt;
dim1.XLine2Point = _endPnt;
dim1.DimLinePoint = _endPnt.RotateBy(Math.PI / 10, Vector3d.ZAxis, _startPnt);
break;
default:
return false;
}
return true;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
switch (step)
{
case 1:
JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\nStart point:");
prOptions1.UseBasePoint = false;
PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);
if (prResult1.Status != PromptStatus.OK)
return SamplerStatus.Cancel;
if (prResult1.Value.Equals(_startPnt))
{
return SamplerStatus.NoChange;
}
else
{
_startPnt = prResult1.Value;
return SamplerStatus.OK;
}
case 2:
JigPromptPointOptions prOptions2 = new JigPromptPointOptions("\nEnd point:");
prOptions2.BasePoint = line.StartPoint;
prOptions2.UseBasePoint = true;
PromptPointResult prResult2 = prompts.AcquirePoint(prOptions2);
if (prResult2.Status != PromptStatus.OK)
return SamplerStatus.Cancel;
if (prResult2.Value.Equals(_endPnt))
{
return SamplerStatus.NoChange;
}
else
{
_endPnt = prResult2.Value;
return SamplerStatus.OK;
}
default:
break;
}
return SamplerStatus.OK;
}
protected override DynamicDimensionDataCollection GetDynamicDimensionData(double dimScale)
{
base.GetDynamicDimensionData(dimScale);
return dddCollection;
}
public static bool Jig()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
DynDimLineJigger jigger = null;
try
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
jigger = new DynDimLineJigger(new Line());
PromptResult pr;
do
{
pr = ed.Drag(jigger);
if (pr.Status == PromptStatus.Keyword)
{
// Add keyword handling code below
}
else
{
jigger.step++;
}
}
while (pr.Status == PromptStatus.OK
&& jigger.step <= 2);
if (pr.Status == PromptStatus.OK)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId,
OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(
bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
btr.AppendEntity(jigger.Entity);
tr.AddNewlyCreatedDBObject(jigger.Entity, true);
tr.Commit();
}
}
else
{
return false;
}
return true;
}
catch
{
if (jigger != null && jigger.Entity != null)
jigger.Entity.Dispose();
return false;
}
}
}