注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

一个JIG的测试程序  

2013-05-01 20:46:44|  分类: ObjectARX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
今天看了一下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类应该是具有捕获这类消息的能力,并调用了相应的事件处理函数来完成重绘的工作,当然这只是我的小猜测,不知道对不对。
  评论这张
 
阅读(942)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016