5.2.7.4. Определение границ штриховки

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

    После создания объекта Hatch, нужно добавить контур штриховки. Контуром может быть любая комбинация из отрезков, дуг, кругов, 2D полилиний, эллипсов, сплайнов, и областей.

    Первым добавляемым контуром должен быть внешний контур, который определяет границы заполняемые штриховкой. Для добавления внешнего контура, используйте метод AppendLoop с константой HatchLoopTypes.Outermost для типа добавляемого контура.

    После определения внешнего контура, вы можете продолжить добавлять дополнительные контуры. Для добавления внутренних контуров используется метод AppendLoop с константой HatchLoopTypes.Default.

    Внутренние контуры определяют островки внутри штрихвки. То как эти островки будут обрабатываться в объекте штриховки, зависит от установленного свойства HatchStyle. Свойство HatchStyle может быть установлено в одно из следующих состояний:


    Когда вы хотите закончить определение штриховки она должна быть вычислена перед её отображением. Используйте для этого метод EvaluateHatch.

Создание объекта штриховки (Hatch)

    В следующем примере создаётся ассоциативная штриховка в пространстве Модели. После создания штриховки, меняется размер круга с которым ассоциативна штриховка. Штриховка будет изменена по размеру круга.

Код 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("AddHatch")> _
   7:  Public Sub AddHatch()
   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:        '' Создание круга для замкнутого контура штриховки
  25:        Dim acCirc As Circle = New Circle()
  26:        acCirc.SetDatabaseDefaults()
  27:        acCirc.Center = New Point3d(3, 3, 0)
  28:        acCirc.Radius = 1 
  29:   
  30:        '' Добавление нового объекта круга в запись таблицы блоков и в транзакцию
  31:        acBlkTblRec.AppendEntity(acCirc)
  32:        acTrans.AddNewlyCreatedDBObject(acCirc, True) 
  33:   
  34:        '' Добавление круга в массив объектов
  35:        Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
  36:        acObjIdColl.Add(acCirc.ObjectId) 
  37:   
  38:        '' Создание штриховки и добавление её в запись таблицы блоков и в транзакцию
  39:        Dim acHatch As Hatch = New Hatch()
  40:        acBlkTblRec.AppendEntity(acHatch)
  41:        acTrans.AddNewlyCreatedDBObject(acHatch, True) 
  42:   
  43:        '' Установка свойтсв штриховки
  44:        '' Ассоциативность должна быть установлена после добавления штриховки в запись таблицы блоков и до метода AppendLoop
  45:        acHatch.SetDatabaseDefaults()
  46:        acHatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31")
  47:        acHatch.Associative = True
  48:        acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl)
  49:        acHatch.EvaluateHatch(True) 
  50:   
  51:        '' Сохранение нового объекта в базу данных
  52:        acTrans.Commit()
  53:    End Using
  54:  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("AddHatch")]
   7:  public static void AddHatch()
   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:        // Создание круга для замкнутого контура штриховки
  27:        Circle acCirc = new Circle();
  28:        acCirc.SetDatabaseDefaults();
  29:        acCirc.Center = new Point3d(3, 3, 0);
  30:        acCirc.Radius = 1; 
  31:   
  32:        // Добавление нового объекта круга в запись таблицы блоков и в транзакцию
  33:        acBlkTblRec.AppendEntity(acCirc);
  34:        acTrans.AddNewlyCreatedDBObject(acCirc, true); 
  35:   
  36:        // Добавление круга в массив объектов
  37:        ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  38:        acObjIdColl.Add(acCirc.ObjectId); 
  39:   
  40:        // Создание штриховки и добавление её в запись таблицы блоков и в транзакцию
  41:        Hatch acHatch = new Hatch();
  42:        acBlkTblRec.AppendEntity(acHatch);
  43:        acTrans.AddNewlyCreatedDBObject(acHatch, true); 
  44:   
  45:        // Установка свойтсв штриховки
  46:        // Ассоциативность должна быть установлена после добавления штриховки в запись таблицы блоков и до метода AppendLoop
  47:        acHatch.SetDatabaseDefaults();
  48:        acHatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31");
  49:        acHatch.Associative = true;
  50:        acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl);
  51:        acHatch.EvaluateHatch(true); 
  52:   
  53:        // Сохранение нового объекта в базу данных
  54:        acTrans.Commit();
  55:    }
  56:  }

Код VBA/ActiveX

   1:  Sub AddHatch()
   2:      Dim hatchObj As AcadHatch
   3:      Dim patternName As String
   4:      Dim PatternType As Long
   5:      Dim bAssociativity As Boolean 
   6:   
   7:      ' Определение штриховки
   8:      patternName = "ANSI31"
   9:      PatternType = 0
  10:      bAssociativity = True 
  11:   
  12:      ' Создание объекта ассоциативной штриховки
  13:      Set hatchObj = ThisDrawing.ModelSpace.AddHatch _
  14:                         (PatternType, patternName, bAssociativity) 
  15:   
  16:      ' Создание внешней границы для штриховки (объект Circle)
  17:      Dim outerLoop(0 To 0) As AcadEntity
  18:      Dim center(0 To 2) As Double
  19:      Dim radius As Double
  20:      center(0) = 3: center(1) = 3: center(2) = 0
  21:      radius = 1
  22:      Set outerLoop(0) = ThisDrawing.ModelSpace. _
  23:                             AddCircle(center, radius) 
  24:   
  25:      ' Добавление внешней границы к штриховке
  26:      ' с последующим её (штриховки) отображением
  27:      hatchObj.AppendOuterLoop (outerLoop)
  28:      hatchObj.Evaluate
  29:      ThisDrawing.Regen True
  30:  End Sub


Comments