Jozi68 发表于 2022-7-6 12:16:47

VB。net:创建圆

我需要在用户单击的地方创建一个圆,但我需要在用户单击之前,在鼠标指针周围出现一个圆。就像你使用CP命令一样,他可以在点击之前看到这个圆,所以他可以决定把它移动到哪里。
 
它必须是VB。net代码,因为它是更大程序的一部分。任何帮助都将不胜感激。

SEANT 发表于 2022-7-6 12:26:06

这个这种活动的净术语是“跳汰”。Kean Walmsley在这里有一些很好的例子。
 
http://through-the-interface.typepad.com/through_the_interface/jigs/

Jozi68 发表于 2022-7-6 12:39:31

Thanx SEANT,我认为这就是我需要的,但就我的经验水平而言,这似乎有点复杂。我也在做2d,所以我想我需要一个简化版本。等我有时间的时候再看一眼。

gile 发表于 2022-7-6 12:45:22

你好
 
这里有一个小样本供您执行任务。
它是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();
               }
         }
       }
   }
}

SEANT 发表于 2022-7-6 12:53:46

以下是我对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;
         }
       }
   }
}

gile 发表于 2022-7-6 13:05:29

我对原始请求参数不是很确定。老实说,我很怀疑我的例程是否符合这些参数。尽管如此,这是一个有趣的想法。

SEANT 发表于 2022-7-6 13:16:07

嗨,肖特,
你的日常生活很有趣。我玩了一会儿。
我需要的是更简单的,我认为:半径是固定的,用户不改变它。所以我只需要固定的圆来用鼠标指针移动。最好是从起点到圆心的一条线。
我将尝试修改您发布的内容。

Jozi68 发表于 2022-7-6 13:20:45

页: [1]
查看完整版本: VB。net:创建圆