5.2.6.2. Создание составных областей

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

    Вы можете создавать составные области путем вычитания, объединения и пересечения имеющихся областей или 3D-фигур. Вы также можете выдавливать или вращать составные области для создания сложных фигур. Для создания составных областей, используйте метод BooleanOperation.

Вычитание областей

    Когда вы вычитаете один ркгион из другого, вызывайте метод BooleanOperation для первой области. Эта область из которой вы хотите вычесть. Например, для вычесления необходимого количества покрытия на этаже, вызывайте метод BooleanOperation для внешнего контура пола этажа и используйте непокрываемые области, такие как колонны и стойки, как объекты в списке параметра Boolean.

Объединение областей

    Для объединения областей, вызовите метод BooleanOperation и используйте константу BooleanOperationType. BoolUnite для этой операции вместо BooleanOperationType.BollUnite. Вы можете объединять области пересекающиеся в любом порядке.

Нахождение пересечения двух областей

    Для нахождения пересечения двех областей, используйте константу BooleanOperationType.BoolIntersect. Вы можете объединять области пересекающиеся в любом порядке.

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

    В следующем примере создаётся две области из двух кругов и затем из большей вычитается меньшая область для создания руля.

Код 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("CreateCompositeRegions")> _
   7:  Public Sub CreateCompositeRegions()
   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:        Dim acCirc1 As Circle = New Circle()
  25:        acCirc1.SetDatabaseDefaults()
  26:        acCirc1.Center = New Point3d(4, 4, 0)
  27:        acCirc1.Radius = 2
  28:        Dim acCirc2 As Circle = New Circle()
  29:        acCirc2.SetDatabaseDefaults()
  30:        acCirc2.Center = New Point3d(4, 4, 0)
  31:        acCirc2.Radius = 1 
  32:   
  33:        '' Добавление кругов в массив объектов
  34:        Dim acDBObjColl As DBObjectCollection = New DBObjectCollection()
  35:        acDBObjColl.Add(acCirc1)
  36:        acDBObjColl.Add(acCirc2) 
  37:   
  38:        '' Вычисление областей из каждого замкнутого контуров
  39:        Dim myRegionColl As DBObjectCollection = New DBObjectCollection()
  40:        myRegionColl = Region.CreateFromCurves(acDBObjColl)
  41:        Dim acRegion1 As Region = myRegionColl(0)
  42:        Dim acRegion2 As Region = myRegionColl(1) 
  43:   
  44:        '' Вычитание области 1 из области 2
  45:        If acRegion1.Area > acRegion2.Area Then
  46:            '' Вычитание меньшей области из большей
  47:            acRegion1.BooleanOperation(BooleanOperationType.BoolSubtract, acRegion2)
  48:            acRegion2.Dispose() 
  49:   
  50:            '' Добавление полученой области в базу данных
  51:            acBlkTblRec.AppendEntity(acRegion1)
  52:            acTrans.AddNewlyCreatedDBObject(acRegion1, True)
  53:        Else
  54:            '' Вычитание меньшей области из большей
  55:            acRegion2.BooleanOperation(BooleanOperationType.BoolSubtract, acRegion1)
  56:            acRegion1.Dispose() 
  57:   
  58:            '' Добавление полученой области в базу данных
  59:            acBlkTblRec.AppendEntity(acRegion2)
  60:            acTrans.AddNewlyCreatedDBObject(acRegion2, True)
  61:        End If 
  62:   
  63:        '' Очистка объектов в памяти не добавленных в базу данных
  64:        acCirc1.Dispose()
  65:        acCirc2.Dispose()
  66:   
  67:        '' Сохранение нового объекта в базе данных
  68:        acTrans.Commit()
  69:    End Using
  70:  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("CreateCompositeRegions")]
   7:  public static void CreateCompositeRegions()
   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:        // Открытие записи таблицы Блоков пространства Модели для записи
  22:        BlockTableRecord acBlkTblRec;
  23:        acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  24:                                        OpenMode.ForWrite) as BlockTableRecord;
  25:        // Создание двух кругов в памяти
  26:        Circle acCirc1 = new Circle();
  27:        acCirc1.SetDatabaseDefaults();
  28:        acCirc1.Center = new Point3d(4, 4, 0);
  29:        acCirc1.Radius = 2;
  30:        Circle acCirc2 = new Circle();
  31:        acCirc2.SetDatabaseDefaults();
  32:        acCirc2.Center = new Point3d(4, 4, 0);
  33:        acCirc2.Radius = 1; 
  34:   
  35:        // Добавление кругов в массив объектов
  36:        DBObjectCollection acDBObjColl = new DBObjectCollection();
  37:        acDBObjColl.Add(acCirc1);
  38:        acDBObjColl.Add(acCirc2); 
  39:   
  40:        // Вычисление областей из каждого замкнутого контуров
  41:        DBObjectCollection myRegionColl = new DBObjectCollection();
  42:        myRegionColl = Region.CreateFromCurves(acDBObjColl);
  43:        Region acRegion1 = myRegionColl[0] as Region;
  44:        Region acRegion2 = myRegionColl[1] as Region; 
  45:   
  46:        // Вычитание области 1 из области 2
  47:        if (acRegion1.Area > acRegion2.Area)
  48:        {
  49:            // Вычитание меньшей области из большей
  50:            acRegion1.BooleanOperation(BooleanOperationType.BoolSubtract, acRegion2);
  51:            acRegion2.Dispose(); 
  52:   
  53:            // Добавление полученой области в базу данных
  54:            acBlkTblRec.AppendEntity(acRegion1);
  55:            acTrans.AddNewlyCreatedDBObject(acRegion1, true);
  56:        }
  57:        else
  58:        {
  59:            // Вычитание меньшей области из большей
  60:            acRegion2.BooleanOperation(BooleanOperationType.BoolSubtract, acRegion1);
  61:            acRegion1.Dispose(); 
  62:   
  63:            // Добавление полученой области в базу данных
  64:            acBlkTblRec.AppendEntity(acRegion2);
  65:            acTrans.AddNewlyCreatedDBObject(acRegion2, true);
  66:        }
  67:   
  68:        // Очистка объектов в памяти не добавленных в базу данных
  69:        acCirc1.Dispose();
  70:        acCirc2.Dispose(); 
  71:   
  72:        // Сохранение нового объекта в базе данных
  73:        acTrans.Commit();
  74:    }
  75:  }

Код VBA/ActiveX

   1:  Sub CreateCompositeRegions()
   2:      ' Создание двух кругов, один представляет внешнюю сторону руля,
   3:      ' другой будет центром руля
   4:      Dim DonutParts(0 To 1) As AcadCircle
   5:      Dim center(0 To 2) As Double
   6:      Dim radius As Double
   7:      center(0) = 4
   8:      center(1) = 4
   9:      center(2) = 0
  10:      radius = 2#
  11:      Set WheelParts(0) = ThisDrawing.ModelSpace. _
  12:                              AddCircle(center, radius)
  13:      radius = 1#
  14:      Set WheelParts(1) = ThisDrawing.ModelSpace. _
  15:                              AddCircle(center, radius)
  16:      ' Создание области из двух кругов
  17:      Dim regions As Variant
  18:      regions = ThisDrawing.ModelSpace.AddRegion(WheelParts)
  19:   
  20:      ' Копирование областей в переменную для облегчения использования
  21:      Dim WheelOuter As AcadRegion
  22:      Dim WheelInner As AcadRegion
  23:   
  24:      If regions(0).Area > regions(1).Area Then
  25:          ' Первая область это внешняя сторона руля
  26:          Set WheelOuter = regions(0)
  27:          Set WheelInner = regions(1)
  28:      Else
  29:          ' Первая область это внутренняя сторона руля
  30:          Set WheelInner = regions(0)
  31:          Set WheelOuter = regions(1)
  32:      End If 
  33:   
  34:      ' Вычитание меньшей области из большей
  35:      WheelOuter.Boolean acSubtraction, WheelInner
  36:  End Sub


Comments