马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
http://379910987.blog.163.com/blog/static/3352379720134184342548/
一个JIG的测试程序
今天看了一下EntityJig方面的一篇文档,即那个Labs中的第七个,照着提示一步步地搞定了关于圆的Jig,然后我就想自己搞一个Jig出来,当然不能是直线,否组比原文更简单就没有意思了,于是打算写一个球体的Jig,本以为没任何难度的,但是现在的问题是,Spere并不像圆那样有现成的Circle类可以使用,实际上创建球体是Solid3d的CreateSphere方法,这让我一开始还有点不太习惯,但是自己慢慢摸索之后,还是实现了,需要做的修改工作量并不大,这个是创建的SphereJig类: using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
namespace JIGTest
{
class SphereJig:EntityJig
{
private double radius;
private Point3d pCenter;
private int currentInputValue;
public int CurrentInput
{
get
{
return currentInputValue;
}
set
{
currentInputValue = value;
}
}
public SphereJig(Entity ent):base(ent)
{
//构造函数
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
switch (currentInputValue)
{
case 0:
Point3d oldPnt = pCenter;
PromptPointResult jigPromptResult = prompts.AcquirePoint("Pick center point : ");
if (jigPromptResult.Status == PromptStatus.OK)
{
pCenter = jigPromptResult.Value;
if ((oldPnt.DistanceTo(pCenter) < 0.001))
return SamplerStatus.NoChange;
}
return SamplerStatus.OK;
case 1:
double oldRadius = radius;
JigPromptDistanceOptions jigPromptDistanceOpts = new JigPromptDistanceOptions("Pick radius : ");
jigPromptDistanceOpts.UseBasePoint = true;
jigPromptDistanceOpts.BasePoint = pCenter;
PromptDoubleResult jigPromptDblResult = prompts.AcquireDistance(jigPromptDistanceOpts);
if ((jigPromptDblResult.Status == PromptStatus.OK))
{
radius = jigPromptDblResult.Value;
if (System.Math.Abs(radius) < 0.1)
radius = 1;
if ((System.Math.Abs(oldRadius - radius) < 0.001))
return SamplerStatus.NoChange;
}
return SamplerStatus.OK;
}
return SamplerStatus.NoChange;
}
protected override bool Update()
{
Solid3d s=(Solid3d)this.Entity;
s.CreateSphere(10);
switch (currentInputValue)
{
case 0:
//只确定球心,半径默认为10
s.TransformBy(Matrix3d.Displacement(pCenter.GetAsVector()));
break;
case 1:
s.CreateSphere(radius);
s.TransformBy(Matrix3d.Displacement(pCenter.GetAsVector()));
break;
}
return true;
}
}
}
虽说是搞定了,但是感觉这里面水很深,许多东西都不是太懂,似乎就是AutoCAD一直在捕获鼠标移动和点击的事件,然后广播出去,而我们的EntityJig类应该是具有捕获这类消息的能力,并调用了相应的事件处理函数来完成重绘的工作,当然这只是我的小猜测,不知道对不对。
|