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

26/05/2014

Создание Polyline3d без использования транзакции

Вы возможно в курсе, а может и не в курсе, что управлять примитивами в базе данных AutoCAD можно без использования транзакций. В примере ниже показано как с помощью методов Open и Close (Close происходит при выполнении закрывающейся фигурной скобки оператора using) создать Polyline3d и связанные с ней вершины PolylineVertex3d.

Мне нравится использовать Open и Close вместо транзакций по ряду причин:

  • Во-первых, мне кажется, что стиль Open и Close более компактен с точки зрения количества необходимого кода.
  • Во-вторых, StartTransaction() имеет огромные накладные расходы на небольших операциях – примерно в 100 раз медленнее чем в стиле Open и Close для операций чтения если суммарное количество операций чтения меньше 80 в одной транзакции. При помощи StartOpenCloseTransaction() можно легко заменить вызовы StartTransaction(), увеличивая производительность при той же структуре кода. При этом я должен сказать, что стиль StartTransaction() на очень больших данных может быть в тысячи раз быстрее чем стиль Open и Close для операций записи.

Сейчас немного поговорим о Polyline3d и Polyline2d... Эти типы примитивы известны как составные в AutoCAD. Они так называются, потому что их вершины являются отдельными примитивами в базе данных AutoCAD, а именно, PolylineVertex3d и PolylineVertex2d примитивы соответственно. Люди действительно все реже и реже используют Polyline2d, потому что они медленнее обрабатываются и очень громоздки по объему - вместо нее используется облегченная полилиния (класс Polyline), потому что её и легче обрабатывать и объем данных меньше.

Мы не создали облегченный вариант полилинии для 3d полилинии, так что Polyline3d являются на данный момент единственным типом ... При создании вершин Polyline3d, вы должны убедиться, что их «хозяин» Polyline3d уже добавлен в базу чертежа, прежде чем начать добавлять Polyline3dVertex'ы, как это показано в коде ниже ...

Код - C#: [Выделить]
  1. // Создаем 3d polyline, используя open и close (без транзакции)
  2. // by Fenton Webb, Autodesk, 15/06/2012
  3. [CommandMethod("My3dPoly")]
  4. public void My3dPoly()
  5. {
  6.   // Получаем стандартные значения
  7.   Database db = HostApplicationServices.WorkingDatabase;
  8.   Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  9.  
  10.   Point3dCollection pnts = new Point3dCollection();
  11.   // Вводим несколько точек
  12.   PromptPointResult res = null;
  13.   do
  14.   {
  15.     // Получаем точки
  16.     res = ed.GetPoint("Укажите 3d-точку");
  17.     // Если точка указана
  18.     if (res.Status == PromptStatus.OK)
  19.     {
  20.       // Добавляем в список точек
  21.       pnts.Add(res.Value);
  22.     }
  23.     else
  24.       break;
  25.  
  26.   } while (res.Status == PromptStatus.OK);
  27.  
  28.   // Если получили достаточно точек
  29.   if (pnts.Count >= 2)
  30.   {
  31.     // Создаем 3D-полилинию с двумя сегментами (3 точки)
  32.     using (Polyline3d poly3d = new Polyline3d())
  33.     {
  34.       poly3d.SetDatabaseDefaults();
  35.       // Добавим новый примитив в текущее пространство чертежа
  36.       using (BlockTableRecord curSpace = db.CurrentSpaceId.
  37.                                  Open(OpenMode.ForWrite) as BlockTableRecord)
  38.       {
  39.         // так как полилиния должна быть в чертеже перед добавлением вершин
  40.         curSpace.AppendEntity(poly3d);
  41.         foreach (Point3d pnt in pnts)
  42.         {
  43.           // теперь создаем вершины
  44.           using (PolylineVertex3d poly3dVertex = new PolylineVertex3d(pnt))
  45.             // и добавляем их к полилинии, а это добавляет их так же и в базу
  46.             poly3d.AppendVertex(poly3dVertex);
  47.         }
  48.       }
  49.     }
  50.   }
  51. }

Источник: http://adndevblog.typepad.com/autocad/2012/06/creating-a-polyline3d-without-using-transactions.html

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

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