VB。net:创建圆
我需要在用户单击的地方创建一个圆,但我需要在用户单击之前,在鼠标指针周围出现一个圆。就像你使用CP命令一样,他可以在点击之前看到这个圆,所以他可以决定把它移动到哪里。它必须是VB。net代码,因为它是更大程序的一部分。任何帮助都将不胜感激。 这个这种活动的净术语是“跳汰”。Kean Walmsley在这里有一些很好的例子。
http://through-the-interface.typepad.com/through_the_interface/jigs/ Thanx SEANT,我认为这就是我需要的,但就我的经验水平而言,这似乎有点复杂。我也在做2d,所以我想我需要一个简化版本。等我有时间的时候再看一眼。 你好
这里有一个小样本供您执行任务。
它是C#,但可能将其转换为VB将是您理解它的一个好方法。
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace CircleJigSample
{
public class CircleJigClass
{
class CircleJig : EntityJig
{
Circle m_circle;
double m_rad;
Point3d m_center;
public CircleJig(Circle myCircle)
: base(myCircle)
{
m_circle = myCircle;
m_rad = m_circle.Radius;
m_center = m_circle.Center;
}
protected override bool Update()
{
m_circle.Radius = m_rad;
return true;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
JigPromptDistanceOptions jpdo = new JigPromptDistanceOptions("\nSpecify the radius: ");
jpdo.BasePoint = m_center;
jpdo.UseBasePoint = true;
jpdo.UserInputControls =
UserInputControls.NoNegativeResponseAccepted |
UserInputControls.NoZeroResponseAccepted;
PromptDoubleResult pdr = prompts.AcquireDistance(jpdo);
if (pdr.Status == PromptStatus.OK)
{
if (pdr.Value == m_rad)
return SamplerStatus.NoChange;
else
{
m_rad = pdr.Value;
return SamplerStatus.OK;
}
}
return SamplerStatus.Cancel;
}
}
public void Test()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptPointResult ppr = ed.GetPoint("\nSpecify the center: ");
if (ppr.Status == PromptStatus.OK)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Matrix3d ucs = ed.CurrentUserCoordinateSystem;
Vector3d ucsNormal = new Vector3d(0.0, 0.0, 1.0).TransformBy(ucs);
Point3d center = ppr.Value.TransformBy(ucs);
Circle myCircle = new Circle(center, ucsNormal, 1.0);
CircleJig jig = new CircleJig(myCircle);
PromptResult res = ed.Drag(jig);
if (res.Status == PromptStatus.OK)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
btr.AppendEntity(myCircle);
tr.AddNewlyCreatedDBObject(myCircle, true);
}
tr.Commit();
}
}
}
}
}
以下是我对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;
namespace CircleJigSample
{
public class Commands
{
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;
}
}
return SamplerStatus.Cancel;
}
public Entity GetEntity()
{
return Entity;
}
}
class CircPlaceJig : EntityJig
{
Point3d m_cenPt;
Point3d m_prev;
Matrix3d m_ucs;
public CircPlaceJig(Entity ent, Point3d cenPoint, Matrix3d ucs)
: base(ent.Clone() as Entity)
{
m_prev = cenPoint;
m_ucs = ucs;
}
protected override SamplerStatus Sampler(JigPrompts jp)
{
JigPromptPointOptions jppo = new JigPromptPointOptions("\nLocation of Circle: ");
PromptPointResult ppr = jp.AcquirePoint(jppo);
if (ppr.Status == PromptStatus.OK)
{
if (m_prev == ppr.Value)
{
return SamplerStatus.NoChange;
}
else
{
m_cenPt = ppr.Value;
return SamplerStatus.OK;
}
}
return SamplerStatus.Cancel;
}
protected override bool Update()
{
Matrix3d trans = Matrix3d.Displacement(m_cenPt - m_prev);
Entity.TransformBy(trans);
m_prev = m_cenPt;
return true;
}
public Entity GetEntity()
{
return Entity;
}
}
}
} 我对原始请求参数不是很确定。老实说,我很怀疑我的例程是否符合这些参数。尽管如此,这是一个有趣的想法。 嗨,肖特,
你的日常生活很有趣。我玩了一会儿。
我需要的是更简单的,我认为:半径是固定的,用户不改变它。所以我只需要固定的圆来用鼠标指针移动。最好是从起点到圆心的一条线。
我将尝试修改您发布的内容。
页:
[1]