AutoCAD API. Графическое представление работы метода Extents3d.ExpandBy

Автор Тема: AutoCAD API. Графическое представление работы метода Extents3d.ExpandBy  (Прочитано 653 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 1612
  • Карма: 372
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Задача:
Возникла необходимость увеличить объект Extents3d. В документации был найден подходящий метод Extents3d.ExpandBy:
Цитировать
Expand this box by the amount in the vector. This could be used for objects with a constant thickness, for example. You would accumulate the basic box by iterating through the object's points calling AddPoint(), then you would make a single ExpandBy() call to expand that box by the thickness amount.
Из описания не совсем ясно, каким же образом увеличиваются границы. Очень не хватает рисунков в стиле "до-после".

Решение:
Проведено тестирование метода.
Для теста использовался следующий код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.Runtime;
  6.  
  7. namespace AcadTest
  8. {
  9.     public class TestExtents
  10.     {
  11.         [CommandMethod("TestExts")]
  12.         public void TestExtsCmd()
  13.         {
  14.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  15.             Editor ed = adoc.Editor;
  16.             Database db = adoc.Database;
  17.  
  18.             // Тестируем в цикле
  19.             while (true)
  20.             {
  21.                 // Получаем первую точку границы
  22.                 PromptPointResult extFirstPtRes = ed.GetPoint("\nFirst exts point: ");
  23.                 if (extFirstPtRes.Status != PromptStatus.OK) break;
  24.  
  25.                 // Получаем вторую точку границы
  26.                 PromptPointResult extSecondPtRes = ed.GetCorner("\nSecond exts point: ", extFirstPtRes.Value);
  27.                 if (extSecondPtRes.Status != PromptStatus.OK) break;
  28.  
  29.                 // Создаем тестируемый объект
  30.                 Extents3d exts = new Extents3d();
  31.                 exts.AddPoint(extFirstPtRes.Value);
  32.                 exts.AddPoint(extSecondPtRes.Value);
  33.  
  34.                 // Для наглядности, создаем пямоугольник по границе до изменений
  35.                 CreateRectangle(db, exts.MinPoint, exts.MaxPoint);
  36.  
  37.                 // Запрашиваем конечную точку вектора, как начальную
  38.                 // используем максимальную точку границы
  39.                 Point3d vecStartPt = exts.MaxPoint;
  40.                 PromptPointOptions vecEndPtOpt = new PromptPointOptions("\nEnd of vector: ");
  41.                 vecEndPtOpt.UseBasePoint = true;
  42.                 vecEndPtOpt.BasePoint = vecStartPt;
  43.                 PromptPointResult vecEndPtRes = ed.GetPoint(vecEndPtOpt);
  44.                 if (vecEndPtRes.Status != PromptStatus.OK) break;
  45.  
  46.                 // Вычисляем вектор
  47.                 Vector3d vector = vecEndPtRes.Value - vecStartPt;
  48.                 // Для наглядности, создаем отрезок вектора
  49.                 CreateLine(db, vecStartPt, vector);
  50.                                    
  51.                 // Применяем метод ExpandBy            
  52.                 exts.ExpandBy(vector);
  53.                 // Для наглядности, создаем прямоугольник по границе после изменений
  54.                 CreateRectangle(db, exts.MinPoint, exts.MaxPoint);
  55.             }
  56.         }
  57.  
  58.         /// <summary>
  59.         /// Метод создания отрезка
  60.         /// </summary>
  61.         /// <param name="db">База данных чертежа</param>
  62.         /// <param name="pt">Начальная точка отрезка</param>
  63.         /// <param name="vector">Вектор направления от начальной точки к конечной</param>
  64.         static void CreateLine(Database db, Point3d pt, Vector3d vector)
  65.         {
  66.             using (Transaction tr = db.TransactionManager.StartTransaction())
  67.             {
  68.                 Line line = new Line(pt, pt + vector);
  69.                 BlockTableRecord cSpace = tr.GetObject
  70.                     (db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  71.  
  72.                 cSpace.AppendEntity(line);
  73.                 tr.AddNewlyCreatedDBObject(line, true);
  74.  
  75.                 tr.Commit();
  76.             }
  77.         }
  78.  
  79.         /// <summary>
  80.         /// Создание прямоугольника по двум точкам
  81.         /// </summary>
  82.         /// <param name="db">База данных чертежа</param>
  83.         /// <param name="pt1">Первая точка</param>
  84.         /// <param name="pt2">Вторая точка</param>
  85.         static void CreateRectangle(Database db, Point3d pt1, Point3d pt2)
  86.         {
  87.             using (Transaction tr = db.TransactionManager.StartTransaction())
  88.             {
  89.                 Polyline pline = new Polyline(4);
  90.                 pline.AddVertexAt(0, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0);
  91.                 pline.AddVertexAt(1, new Point2d(pt2.X, pt1.Y), 0.0, 0.0, 0.0);
  92.                 pline.AddVertexAt(2, new Point2d(pt2.X, pt2.Y), 0.0, 0.0, 0.0);
  93.                 pline.AddVertexAt(3, new Point2d(pt1.X, pt2.Y), 0.0, 0.0, 0.0);
  94.  
  95.                 pline.Closed = true;              
  96.  
  97.                 BlockTableRecord cSpace = tr.GetObject
  98.                     (db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  99.  
  100.                 cSpace.AppendEntity(pline);
  101.                 tr.AddNewlyCreatedDBObject(pline, true);
  102.  
  103.                 tr.Commit();
  104.             }
  105.         }
  106.     }
  107. }
  108.  
В результате, получена такая картина (дооформление выполнялось вручную):