There ya go mate:
// (C) Copyright 2002-2007 by TCGSoftware.
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;
[assembly: CommandClass(typeof(Bryco.tcgsBrycoJiggy))]
namespace Bryco {
/// <summary>
/// Summary description for tcgsClass.
/// </summary>
public class tcgsBrycoJiggy {
/// <summary>
/// Default ctor.
/// </summary>
public tcgsBrycoJiggy( ) {
// Does nothing in this implementation.
}
#region Circle jigging class
/// <summary>
/// Circle jig class to allow jigging of circle
/// </summary>
public class CircleJig : EntityJig {
private Point3d _centerPt, _radiusPt;
private Vector3d _normal;
private ObjectId _dashLtId = ObjectId.Null;
private double _radius;
private DynamicDimensionDataCollection _dims;
public CircleJig(Point3d centre, Vector3d vec, ObjectId dashLtId) : base(new Circle()) {
_centerPt = centre;
_normal = vec;
_dashLtId = dashLtId;
_dims = new DynamicDimensionDataCollection();
Dimension dim1 = new AlignedDimension();
dim1.SetDatabaseDefaults();
_dims.Add(new DynamicDimensionData(dim1, true, true));
}
public double Radius {
get { return _centerPt.DistanceTo(_radiusPt); }
}
protected override SamplerStatus Sampler(JigPrompts prompts) {
JigPromptOptions jigOpts = new JigPromptOptions();
jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates |
UserInputControls.NoZeroResponseAccepted |
UserInputControls.NoNegativeResponseAccepted);
//*******************************************************************
// Required by 2007 - changed name from line above
//JigPromptPointOptions jigOpts = new JigPromptPointOptions();
//jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates |
// UserInputControls.NoZeroResponseAccepted |
// UserInputControls.NoNegativeResponseAccepted);
//*******************************************************************
jigOpts.Message = "\nSpecify radius of circle:";
jigOpts.BasePoint = _centerPt;
jigOpts.UseBasePoint = true;
jigOpts.Cursor = CursorType.RubberBand;
PromptPointResult dres = prompts.AcquirePoint(jigOpts);
Point3d radiusPointTemp = dres.Value;
if(radiusPointTemp != _radiusPt) {
_radiusPt = radiusPointTemp;
} else
return SamplerStatus.NoChange;
if(dres.Status == PromptStatus.Cancel)
return SamplerStatus.Cancel;
else
return SamplerStatus.OK;
}
protected override bool Update( ) {
_radius = _radiusPt.DistanceTo(_centerPt);
try {
((Circle)Entity).Center = _centerPt;
((Circle)Entity).Radius = _radius;
((Circle)Entity).LinetypeId = _dashLtId;
UpdateDimensions();
} catch(System.Exception) {
return false;
}
return true;
}
protected override DynamicDimensionDataCollection GetDynamicDimensionData(double dimScale) {
return _dims;
}
protected override void OnDimensionValueChanged(Autodesk.AutoCAD.DatabaseServices.DynamicDimensionChangedEventArgs e) {
// base.OnDimensionValueChanged(e);
}
void UpdateDimensions( ) {
Circle myCircle = (Circle)Entity;
AlignedDimension dim = (AlignedDimension)_dims[0].Dimension;
dim.XLine1Point = myCircle.Center;
dim.XLine2Point = _radiusPt;
Vector3d xvec = dim.XLine2Point - dim.XLine1Point;
xvec = xvec.GetNormal();
Vector3d zvec = myCircle.Normal;
zvec = zvec.GetNormal();
Vector3d yvec = zvec.CrossProduct(xvec);
yvec = yvec.GetNormal();
yvec *= myCircle.Radius / 2;
dim.DimLinePoint = myCircle.Center + yvec;
}
public Entity GetEntity( ) {
return Entity;
}
}// class CircleJig
#endregion
#region Command Declarations
// Define Command "BrycesRidgyDidgeCircle"
[CommandMethod("BrycesRidgyDidgeCircle")]
public void BrycesRidgyDidgeCircleCommand( ) {
Document doc = acadApp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
Transaction tr = null;
try {
tr = db.TransactionManager.StartTransaction();
// Set up the prompting...
PromptPointOptions opts = new PromptPointOptions("\nSpecify centre point for circle:");
PromptPointResult res = ed.GetPoint(opts);
// Calulate our normal vector...
Vector3d NormalVec;
if(IsPaperSpace(db)) {
Vector3d x = db.Pucsxdir;
Vector3d y = db.Pucsydir;
NormalVec = x.CrossProduct(y);
} else {
Vector3d x = db.Ucsxdir;
Vector3d y = db.Ucsydir;
NormalVec = x.CrossProduct(y);
}
Point3d pickPt = res.Value.TransformBy(GetUcsMatrix(db));
//Create Circle jig...
CircleJig jig = new CircleJig(pickPt, NormalVec.GetNormal(), db.ContinuousLinetype);
//first call drag to get the radius
if(ed.Drag(jig).Status != PromptStatus.OK)
return;
BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false) as BlockTableRecord;
btr.AppendEntity(jig.GetEntity());
jig.GetEntity().Draw();
tr.AddNewlyCreatedDBObject(jig.GetEntity(), true);
tr.Commit();
} catch(System.Exception ex) {
tr.Abort();
ed.WriteMessage("\nError: " + ex.Message);
} finally {
if(tr != null) {
tr.Dispose();
}
}
}
#endregion
#region Function to return the current UCS matrix
private Matrix3d GetUcsMatrix(Database db) {
Point3d origin;
Vector3d xAxis, yAxis, zAxis;
if(IsPaperSpace(db)) {
origin = db.Pucsorg;
xAxis = db.Pucsxdir;
yAxis = db.Pucsydir;
} else {
origin = db.Ucsorg;
xAxis = db.Ucsxdir;
yAxis = db.Ucsydir;
}
zAxis = xAxis.CrossProduct(yAxis);
return Matrix3d.AlignCoordinateSystem(Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis,
origin, xAxis, yAxis, zAxis);
}//GetUcsMatrix
#endregion
#region Function to check if we're in Paperspace
private bool IsPaperSpace(Database db) {
if(db.TileMode)
return false;
Document doc = acadApp.DocumentManager.GetDocument(db);
Editor ed = doc.Editor;
if(db.PaperSpaceVportId == ed.CurrentViewportObjectId)
return true;
return false;
}//IsPaperSpace
#endregion
}
}
I'm still not happy with the dynamic dimension that shows up - it doesn't seem to be editable like the AutoCAD circle one is.
Somebody else might be able to fill that bit in.
Cheers,
Glenn.