5.2.5.1. Создание областей

Источник здесь.[перевод не проверен]; [переводчик: bandero]

    Области добавляются в объект BlockTableRecord, создаётся экземпляр объекта Region (область) и затем добавляется в BlockTableRecord. Перед добавление её в BlockTableRecord, необходимо вычеслить объекты области, составляющие замкнутый контур. Функция CreateFromCurves создаёт область для каждого замкнутого контура из получаемого массива объектов. Метод CreateFromCurves возвращает и принимает объект DBObjectCollection.

    AutoCAD преобразует замкнутые 2D и плоские 3D полилинии в отдельные области, затем преобразует полилинии, отрезки, и кривые которые составляют замкнутые плоские контуы. Если более чем две кривые совместно используют конечную точку, получающаяся область может быть произвольной. Поэтому, методом CreateFromCurves может быть создано несколько областей. Вам необходимо добавлять каждую созданную область в объект BlockTableRecord.

Создание простой области

    В следующем примере создаётся область, состоящая из одного круга.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.Geometry 
   5:   
   6:  <CommandMethod("AddRegion")> _
   7:  Public Sub AddRegion()
   8:    '' Получение текущего документа и базы данных
   9:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  10:    Dim acCurDb As Database = acDoc.Database 
  11:   
  12:    '' Старт транзакции
  13:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() 
  14:   
  15:        '' Открытие таблицы Блоков для чтения
  16:        Dim acBlkTbl As BlockTable
  17:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) 
  18:   
  19:        '' Открытие записи таблицы Блоков для записи
  20:        Dim acBlkTblRec As BlockTableRecord
  21:        acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  22:                                        OpenMode.ForWrite)
  23:        '' Создание в памяти круга
  24:        Using acCirc As Circle = New Circle()
  25:            acCirc.SetDatabaseDefaults()
  26:            acCirc.Center = New Point3d(2, 2, 0)
  27:            acCirc.Radius = 5 
  28:   
  29:            '' Добавление круга в массив объектов
  30:            Dim acDBObjColl As DBObjectCollection = New DBObjectCollection()
  31:            acDBObjColl.Add(acCirc) 
  32:   
  33:            '' Вычисление областей из каждого замкнутого контура
  34:            Dim myRegionColl As DBObjectCollection = New DBObjectCollection()
  35:            myRegionColl = Region.CreateFromCurves(acDBObjColl)
  36:            Dim acRegion As Region = myRegionColl(0)
  37:   
  38:            '' Добавление нового объекта в запись таблицы блоков и в транзакцию
  39:            acBlkTblRec.AppendEntity(acRegion)
  40:            acTrans.AddNewlyCreatedDBObject(acRegion, True) 
  41:   
  42:            '' Очистка из памяти объекта не добавленного в базу данных
  43:        End Using 
  44:   
  45:        '' Сохранение нового объекта в базе данных
  46:        acTrans.Commit()
  47:    End Using
  48:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.Geometry; 
   5:   
   6:  [CommandMethod("AddRegion")]
   7:  public static void AddRegion()
   8:  {
   9:    // Получение текущего документа и базы данных
  10:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  11:    Database acCurDb = acDoc.Database;
  12:   
  13:    // Старт транзакции
  14:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  15:    {
  16:        // Открытие таблицы Блоков для чтения
  17:        BlockTable acBlkTbl;
  18:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  19:                                     OpenMode.ForRead) as BlockTable;
  20:        // Открытие записи таблицы Блоков для записи
  21:        BlockTableRecord acBlkTblRec;
  22:        acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  23:                                        OpenMode.ForWrite) as BlockTableRecord;
  24:        // Создание в памяти круга
  25:        using (Circle acCirc = new Circle())
  26:        {
  27:            acCirc.SetDatabaseDefaults();
  28:            acCirc.Center = new Point3d(2, 2, 0);
  29:            acCirc.Radius = 5; 
  30:   
  31:            // Добавление круга в массив объектов
  32:            DBObjectCollection acDBObjColl = new DBObjectCollection();
  33:            acDBObjColl.Add(acCirc); 
  34:   
  35:            // Вычисление областей из каждого замкнутого контура
  36:            DBObjectCollection myRegionColl = new DBObjectCollection();
  37:            myRegionColl = Region.CreateFromCurves(acDBObjColl);
  38:            Region acRegion = myRegionColl[0] as Region; 
  39:   
  40:            // Добавление нового объекта в запись таблицы блоков и в транзакцию
  41:            acBlkTblRec.AppendEntity(acRegion);
  42:            acTrans.AddNewlyCreatedDBObject(acRegion, true); 
  43:   
  44:            // Очистка из памяти объекта не добавленного в базу данных
  45:        }
  46:   
  47:        // Сохранение нового объекта в базе данных
  48:        acTrans.Commit();
  49:    }
  50:  }

Код VBA/ActiveX

   1:  Sub AddRegion()
   2:      ' Определения массива для вычесления контура области
   3:      Dim curves(0 To 0) As AcadCircle 
   4:   
   5:      ' Создание круга который будет контуром области.
   6:      Dim center(0 To 2) As Double
   7:      Dim radius As Double
   8:      center(0) = 2
   9:      center(1) = 2
  10:      center(2) = 0
  11:      radius = 5#
  12:      Set curves(0) = ThisDrawing.ModelSpace.AddCircle _
  13:                                       (center, radius)
  14:      ' Создание области
  15:      Dim regionObj As Variant
  16:      regionObj = ThisDrawing.ModelSpace.AddRegion(curves)
  17:      ZoomAll
  18:  End Sub


Comments