ADN Open CIS
Сообщество программистов Autodesk в СНГ

14/04/2014

Создание выноски-сплайна при помощи Jig

Ниже код, который позволяет создать выноску-сплайн при помощи EntityJig. Это модифицированная версия из этой статьи в блоге Киана.

Код - C#: [Выделить]
  1. public class SplinedLeaderJig : EntityJig
  2. {
  3.     Point3dCollection _mPts;
  4.     Point3d _mTempPoint;
  5.     public static bool _mIsJigStarted;
  6.  
  7.     public SplinedLeaderJig()
  8.         : base(new Leader())
  9.     {
  10.         _mPts = new Point3dCollection();
  11.  
  12.         Leader leader = Entity as Leader;
  13.         leader.SetDatabaseDefaults();
  14.  
  15.         _mIsJigStarted = false;
  16.  
  17.         leader.IsSplined = true;
  18.     }
  19.  
  20.     protected override SamplerStatus Sampler(JigPrompts prompts)
  21.     {
  22.         Editor ed
  23.        = Application.DocumentManager.MdiActiveDocument.Editor;
  24.  
  25.         JigPromptPointOptions opts = new JigPromptPointOptions();
  26.  
  27.         opts.UserInputControls = (
  28.             UserInputControls.Accept3dCoordinates |
  29.             UserInputControls.NoNegativeResponseAccepted |
  30.             UserInputControls.NullResponseAccepted);
  31.  
  32.         if (_mPts.Count >= 1)
  33.         {
  34.             opts.BasePoint = _mPts[_mPts.Count - 1];
  35.             opts.UseBasePoint = true;
  36.         }
  37.  
  38.         opts.Message = "\nУкажите вершину выноски: ";
  39.  
  40.         PromptPointResult res = prompts.AcquirePoint(opts);
  41.         if (_mTempPoint == res.Value)
  42.         {
  43.             return SamplerStatus.NoChange;
  44.         }
  45.         else if (res.Status == PromptStatus.OK)
  46.         {
  47.             _mTempPoint = res.Value;
  48.             return SamplerStatus.OK;
  49.         }
  50.         return SamplerStatus.Cancel;
  51.     }
  52.  
  53.     protected override bool Update()
  54.     {
  55.         try
  56.         {
  57.             Leader leader = Entity as Leader;
  58.  
  59.             Editor ed
  60.                 = Application.DocumentManager.MdiActiveDocument.Editor;
  61.             if (_mIsJigStarted)
  62.             {
  63.                 // Удаляем последнюю вершину, которая нужна только для JIG
  64.                 leader.RemoveLastVertex();
  65.             }
  66.  
  67.             Point3d lastVertex
  68.                     = leader.VertexAt(leader.NumVertices - 1);
  69.             if (!_mTempPoint.Equals(lastVertex))
  70.             {
  71.                 // Временно добавляем указанную точку как вершину
  72.                 leader.AppendVertex(_mTempPoint);
  73.                 _mIsJigStarted = true;
  74.             }
  75.         }
  76.         catch (System.Exception ex)
  77.         {
  78.             Document doc
  79.                = Application.DocumentManager.MdiActiveDocument;
  80.             doc.Editor.WriteMessage("\nИсключение: " + ex.Message);
  81.             return false;
  82.         }
  83.         return true;
  84.     }
  85.  
  86.     public void addVertex()
  87.     {
  88.         Leader leader = Entity as Leader;
  89.  
  90.         leader.AppendVertex(_mTempPoint);
  91.  
  92.         _mPts.Add(_mTempPoint);
  93.     }
  94.  
  95.     public void removeLastVertex()
  96.     {
  97.         Leader leader = Entity as Leader;
  98.         if (_mPts.Count >= 1)
  99.         {
  100.             leader.RemoveLastVertex();
  101.         }
  102.     }
  103.  
  104.     public Entity getEntity()
  105.     {
  106.         return Entity;
  107.     }
  108.  
  109.     [CommandMethod("MYSL")]
  110.     public static void MySplinedLeader()
  111.     {
  112.         Document doc
  113.               = Application.DocumentManager.MdiActiveDocument;
  114.         Editor ed = doc.Editor;
  115.         Database db = doc.Database;
  116.  
  117.         SplinedLeaderJig jig = new SplinedLeaderJig();
  118.  
  119.         bool bSuccess = true;
  120.         bool bComplete = false;
  121.  
  122.         while (bSuccess && !bComplete)
  123.         {
  124.             SplinedLeaderJig._mIsJigStarted = false;
  125.  
  126.             PromptResult dragres = ed.Drag(jig);
  127.  
  128.             bSuccess = (dragres.Status == PromptStatus.OK);
  129.             if (bSuccess)
  130.                 jig.addVertex();
  131.  
  132.             bComplete = (dragres.Status == PromptStatus.None);
  133.             if (bComplete)
  134.             {
  135.                 jig.removeLastVertex();
  136.             }
  137.         }
  138.  
  139.         if (bComplete)
  140.         {
  141.             // Добавляем примитив к базе данных
  142.             Transaction tr
  143.                     = db.TransactionManager.StartTransaction();
  144.             using (tr)
  145.             {
  146.                 BlockTable bt = tr.GetObject(
  147.                         db.BlockTableId, OpenMode.ForRead
  148.                                               ) as BlockTable;
  149.                 BlockTableRecord ms =
  150.                     bt[BlockTableRecord.ModelSpace].GetObject
  151.                     (OpenMode.ForWrite) as BlockTableRecord;
  152.  
  153.                 ms.AppendEntity(jig.getEntity());
  154.                 tr.AddNewlyCreatedDBObject(jig.getEntity(),
  155.                                             true);
  156.                 tr.Commit();
  157.             }
  158.         }
  159.     }

 

Источник: http://adndevblog.typepad.com/autocad/2014/04/creating-a-splined-leader-using-a-jig.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=679

Опубликовано 14.04.2014