以下是我对Jozi68最初请求的解释(尽管有C#)。
事实上,我不确定这个例程是否符合要求,但这个过程似乎很有趣,所以我选择了它。
编辑:
我包括了一个容差设置,以避免Gile在下面的帖子中提到的错误。
如果此代码示例用于小单位比例的图形,则可以将公差从当前的0.001等向量/等点修改为更合适的值。
一如既往,请谨慎使用测试代码。
- using System;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.Geometry;
- [assembly: CommandClass(typeof(CircleJigSample.Commands))]
- namespace CircleJigSample
- {
- public class Commands
- {
- [CommandMethod("Test2")]
- public void Test()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- Tolerance Tol = new Tolerance(.001, .001);
- Matrix3d ucs = ed.CurrentUserCoordinateSystem;
- Vector3d ucsNormal = ucs.CoordinateSystem3d.Zaxis;
- PromptPointOptions ppo = new PromptPointOptions("Select initial Point: ");
- PromptPointResult ppr = ed.GetPoint(ppo);
- CircleJig jig = new CircleJig(ppr.Value, ucsNormal, .01, Tol);
- PromptResult res = ed.Drag(jig);
- try
- {
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
- if (res.Status == PromptStatus.OK)
- {
- Circle circ = jig.GetEntity() as Circle;
- if (circ.Radius <= Tol.EqualVector)
- {
- circ.Dispose();
- return;
- }
- circ.SetDatabaseDefaults();
- btr.AppendEntity(circ);
- tr.AddNewlyCreatedDBObject(circ, true);
- CircPlaceJig pjig = new CircPlaceJig(circ, circ.Center, ucs);
- res = ed.Drag(pjig);
- if (res.Status == PromptStatus.OK)
- {
- Circle newcirc = pjig.GetEntity() as Circle;
- newcirc.SetDatabaseDefaults();
- btr.AppendEntity(newcirc);
- tr.AddNewlyCreatedDBObject(newcirc, true);
- }
- circ.Erase();
- }
- tr.Commit();
- }
- }
- catch
- {
- ed.WriteMessage("\nError processing circle!");
- }
- }
- class CircleJig : EntityJig
- {
- double m_rad;
- Point3d m_initial;
- Point3d m_center;
- Point3d m_temp;
- Vector3d m_norm;
- Tolerance m_tol;
- public CircleJig(Point3d Initial, Vector3d ucsNormal, Double Rad, Tolerance Tol)
- : base(new Circle(Initial, ucsNormal, Rad))
- {
- m_rad = Rad;
- m_center = Initial;
- m_initial = Initial;
- m_temp = m_center;
- m_norm = ucsNormal;
- m_tol = Tol;
- }
- protected override bool Update()
- {
- ((Circle)base.Entity).Center = m_center;
- ((Circle)base.Entity).Radius = m_rad;
- return true;
- }
- protected override SamplerStatus Sampler(JigPrompts prompts)
- {
- JigPromptPointOptions jpdo = new JigPromptPointOptions("\nSpecify the radius: ");
- jpdo.BasePoint = m_initial;
- jpdo.UseBasePoint = true;
- jpdo.UserInputControls =
- UserInputControls.NoNegativeResponseAccepted |
- UserInputControls.NoZeroResponseAccepted;
- PromptPointResult pdr = prompts.AcquirePoint(jpdo);
- if (pdr.Status == PromptStatus.OK)
- {
- if (pdr.Value == m_temp)
- return SamplerStatus.NoChange;
- else
- {
- m_temp = pdr.Value;
- m_center = m_temp;
- m_rad = (m_initial.GetVectorTo(m_center)).Length;
- if (m_rad < m_tol.EqualVector) m_rad = m_tol.EqualVector;
- return SamplerStatus.OK;
- }
- }
|