sailorcwx 发表于 2009-5-23 12:53:00

Jig小试牛刀----动态修改圆大小

本帖最后由 作者 于 2009-5-26 22:23:25 编辑

'Jig小试牛刀----动态修改圆大小 by Weltion Chen @2009.05.23
'利用Jig动态拖拽实现动态修改圆大小
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Public Class Class1
    <CommandMethod("Jigtest")> Public Sub JigTest()
      '选择提示
      Dim SelectPrompt As New PromptEntityOptions(vbNewLine + "选择一个圆: ")
      '错误操作提示
      SelectPrompt.SetRejectMessage(vbNewLine + "拜托,只能选择圆,请选择一个圆好吧!")
      '限制只能选择circle类型,即只能选择圆
      SelectPrompt.AddAllowedClass(GetType(Circle), False)
      '命令行编辑器
      Dim Ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
      '选择结果
      Dim SelectResult As PromptEntityResult = Ed.GetEntity(SelectPrompt)
      '正确的选择
      If SelectResult.Status = PromptStatus.OK Then
            '当前工作CAD数据库
            Dim Db As Database = HostApplicationServices.WorkingDatabase
            '事务处理,在VB.Net中使用using能够在using结束后自动销毁using引用的对象,进行垃圾回收。否则需要另外进行Dispose处理
            Using Tr As Transaction = Db.TransactionManager.StartTransaction
                '提取选择的圆对象
                Dim CircleObj As Circle = Tr.GetObject(SelectResult.ObjectId, OpenMode.ForWrite)
                '实例化CircleJig类,即创建Jig对象
                Dim Jig As New CircleJig(CircleObj)
                '高亮显示圆对象
                CircleObj.Highlight()
                '拖拽Jig
                Dim DragResult As PromptResult = Ed.Drag(Jig)
                '提交事务处理
                Tr.Commit()
            End Using
      End If
    End Sub
End Class


Public Class CircleJig
    '继承EntityJig类
    Inherits EntityJig
    '半径
    Private dblRadius As Double
    '圆心
    Private ptCenter As Point3d
    Public Sub New(ByVal CircleObj As Circle)
      '利用circleobj派生EntityJig基类
      MyBase.New(CircleObj)
      '获取初始半径
      dblRadius = CircleObj.Radius
      '获取初始圆心坐标
      ptCenter = CircleObj.Center
    End Sub

    Protected Overrides Function Sampler(ByVal prompts As Autodesk.AutoCAD.EditorInput.JigPrompts) As Autodesk.AutoCAD.EditorInput.SamplerStatus
      '距离提示
      Dim RadiusPrompt As New JigPromptDistanceOptions()
      '以圆心为基点
      RadiusPrompt.BasePoint = ptCenter
      '使用基点模式
      RadiusPrompt.UseBasePoint = True
      '橡皮筋效果
      RadiusPrompt.Cursor = CursorType.RubberBand
      '获取用户输入的距离
      Dim RadiusResult As PromptDoubleResult = prompts.AcquireDistance(RadiusPrompt)
      '用户正确的输入
      If RadiusResult.Status = PromptStatus.OK Then
            '如果输入距离与原半径一致
            If dblRadius = RadiusResult.Value Then
                '返回NoChange(没有修改)提示
                Return SamplerStatus.NoChange
                '其他情况
            Else
                '如果输入值不为0
                If RadiusResult.Value <> 0 Then
                  ' 将输入值赋与半径变量
                  dblRadius = RadiusResult.Value
                  '返回OK提示
                  Return SamplerStatus.OK
                End If
            End If
      Else
            '用户取消操作,返回Cancel提示
            Return SamplerStatus.Cancel
      End If
    End Function
    Protected Overrides Function Update() As Boolean
      '获取圆对象
      Dim CircleObj As Circle = Entity
      '根据新的变量修改半径值
      CircleObj.Radius = dblRadius
      '返回True
      Return True
    End Function
End Class

写这个程序的原因是看到kean写的那个拖拽程序太复杂了,不适合初学者。这是一个极其简单的Jig程序,拖拽的实现主要是在CircleJig自定义类中,CircleJig自定义类继承EntityJig类,通过重写EntityJig基类的两个过程来实现拖拽功能,其中Sampler用于与用户交互,输出提示信息并检测用户的输入,通过返回状态SamplerStatus来调用Update过程。返回SamplerStatus很重要,否则你看不到一个完美的拖动效果。而Update过程是实现图形的更新以达到动态拖拽的效果。拖拽的调用是通过编辑器的Drag函数来实现的。

carrot1983 发表于 2009-6-22 15:49:00

<p>哪位能把这么好的贴子改成C#吗???</p><p>非常感谢</p>

游天居士 发表于 2009-7-30 00:13:00

<p>收到。要的就是这么简单。</p>

lizhiqiang9801 发表于 2011-12-7 08:25:09

谢谢楼主

ps122hb 发表于 2011-12-7 12:22:04

学习了,谢谢楼主分享

mkhsj928 发表于 2011-12-8 23:47:18

本帖最后由 mkhsj928 于 2011-12-8 23:50 编辑

好帖!
最烦的就是每个Jig都要自己实现个类,感觉好麻烦!还不如监视鼠标移动,实时生成和删除来得简单明了!通过实时生成与删除这种方法,对任何类型、任意多数量实体都是适用,个人感觉更灵活,唯一缺点可能就是显示慢点吧?对现在的主流机子配置来说,基本不是问题。

david.xw 发表于 2012-3-3 02:10:47

本帖最后由 david.xw 于 2012-3-3 02:12 编辑

受用了,为了学习,我改成C#,我贴出来方便大家.


using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;


namespace CCad
{
   
    public class Class1
    {
      
      public void JigTest()
      {
            //选择提示
            PromptEntityOptions SelectPrompt = new PromptEntityOptions("\n选择一个圆: ");
            SelectPrompt.SetRejectMessage("\n拜托,只能选择圆,请选择一个圆好吧!");
            //限制只能选择circle类型,即只能选择圆            
            SelectPrompt.AddAllowedClass(typeof(Circle), false);
            //命令行编辑器
            Editor Ed = Application.DocumentManager.MdiActiveDocument.Editor;
            //选择结果
            PromptEntityResult SelectResult = Ed.GetEntity(SelectPrompt);
            //正确的选择
            if (SelectResult.Status == PromptStatus.OK)
            {
                //当前工作CAD数据库
                Database Db = HostApplicationServices.WorkingDatabase;
                //事务处理,在C#使用using能够在using结束后自动销毁using引用的对象,进行垃圾回收。否则需要另外进行Dispose处理
                using (Transaction Tr = Db.TransactionManager.StartTransaction())
                {
                  //提取选择的圆对象
                  Circle CircleObj = (Circle)Tr.GetObject(SelectResult.ObjectId, OpenMode.ForWrite);
                  //实例化CircleJig类,即创建Jig对象
                  CircleJig Jig = new CircleJig(CircleObj);
                  //高亮显示圆对象
                  CircleObj.Highlight();
                  //拖拽Jig
                  PromptResult DragResult = Ed.Drag(Jig);
                  //提交事务处理
                  Tr.Commit();
                }
            }
      }
    }
    public class CircleJig : EntityJig//继承EntityJig类
    {
      //半径
      private double dblRadius;
      //圆心
      private Point3d ptCenter;
      public CircleJig(Circle CircleObj)
            : base(CircleObj)//利用circleobj派生EntityJig基类
      {
            //获取初始半径
            dblRadius = CircleObj.Radius;
            //获取初始圆心坐标
            ptCenter = CircleObj.Center;
      }
      protected override SamplerStatus Sampler(JigPrompts prompts)
      {
            //距离提示
            JigPromptDistanceOptions RadiusPrompt = new JigPromptDistanceOptions();
            //以圆心为基点
            RadiusPrompt.BasePoint = ptCenter;
            //使用基点模式
            RadiusPrompt.UseBasePoint = true;
            //橡皮筋效果
            RadiusPrompt.Cursor = CursorType.RubberBand;
            //获取用户输入的距离
            PromptDoubleResult RadiusResult = prompts.AcquireDistance(RadiusPrompt);
            //用户正确的输入
            if (RadiusResult.Status == PromptStatus.OK)
            {
                //如果输入距离与原半径一致
                if (dblRadius == RadiusResult.Value)
                {
                  //返回NoChange(没有修改)提示
                  return SamplerStatus.NoChange;
                }
                //其他情况
                else
                {
                  //如果输入值不为0
                  if (RadiusResult.Value != 0)
                  {
                        //将输入值赋与半径变量
                        dblRadius = RadiusResult.Value;
                  }
                  //返回OK提示      
                  return SamplerStatus.OK;
                }
            }
            else
            {
                //用户取消操作,返回Cancel提示
                return SamplerStatus.Cancel;
            }
      }
      protected override bool Update()
      {//获取圆对象
            Circle CircleObj = (Circle)Entity;
            //根据新的变量修改半径值
            CircleObj.Radius = dblRadius;
            //返回True
            return true;
      }
    }
}


Cameron 发表于 2012-4-13 19:29:36

很好用啊
顶一下!!!
页: [1]
查看完整版本: Jig小试牛刀----动态修改圆大小