找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1741|回复: 0

[分享] 一个JIG的测试程序

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-21 16:47:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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类应该是具有捕获这类消息的能力,并调用了相应的事件处理函数来完成重绘的工作,当然这只是我的小猜测,不知道对不对。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-19 19:29 , Processed in 0.423451 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表