5.2.1. Определение родительского объекта (Parent object)

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

    Графические объекты добавляются в объект BlockTableRecord, такой как пространство Модели (Model space) или Листа (Paper space). Вы ссылаетесь на блоки которые представляют пространство Модели или Листа через объект BlockTable. Если вы хотите работать в текущем пространстве вместо его определения, вы получаете ObjectId текущего пространства из текущей базы данных по свойству CurrentSpaceId.

    ObjectId для записи таблицы блоков пространства Модели и Листа может быть получен из объекта BlockTable используя свойство соответственно GetBlockModelSpaceId и GetBlockPaperSpaceId класса SymbolUtilityServices из пространства имён DatabaseServices.

Доступ к пространству Модели (Model space), пространству Листа (Paper space) или текущему пространству

    Следующий пример показывает, как получить доступ к записи таблицы блоков связанной с пространством Модели, Листом или текущим пространством. После получения ссылки на запись таблицы блоков, в неё добавляется новая линия.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.Geometry
   5:  Imports Autodesk.AutoCAD.EditorInput 
   6:   
   7:  <CommandMethod("AccessSpace")> _
   8:  Public Sub AccessSpace()
   9:    '' Получение текущего документа и базы данных
  10:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  11:    Dim acCurDb As Database = acDoc.Database 
  12:   
  13:    '' Старт транзакции
  14:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() 
  15:   
  16:        '' Открытие таблицы Блоков для чтения
  17:        Dim acBlkTbl As BlockTable
  18:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) 
  19:   
  20:        '' Открытие записи таблицы блоков для записи
  21:        Dim acBlkTblRec As BlockTableRecord 
  22:   
  23:        '' Запрос, какую табличную запись открывать
  24:        Dim pKeyOpts As PromptKeywordOptions = New PromptKeywordOptions("")
  25:        pKeyOpts.Message = vbLf & "Выберете в каком пространстве создать линию  "
  26:        pKeyOpts.Keywords.Add("Модель")
  27:        pKeyOpts.Keywords.Add("Лист")
  28:        pKeyOpts.Keywords.Add("Текущее")
  29:        pKeyOpts.AllowNone = False
  30:        pKeyOpts.AppendKeywordsToMessage = True
  31:        Dim pKeyRes As PromptResult = acDoc.Editor.GetKeywords(pKeyOpts) 
  32:   
  33:        If pKeyRes.StringResult = "Модель" Then
  34:            '' Получение ObjectId для Модели из таблицы Блоков
  35:            acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  36:                                            OpenMode.ForWrite)
  37:        ElseIf pKeyRes.StringResult = "Лист" Then
  38:            '' Получение ObjectId для Листа из таблицы Блоков
  39:            acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.PaperSpace), _
  40:                                            OpenMode.ForWrite)
  41:        Else
  42:            '' Получение ObjectId для текущего пространства из базы данных
  43:            acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, _
  44:                                            OpenMode.ForWrite)
  45:        End If 
  46:   
  47:        '' Создание линии начинающеся в точке 2,5 и заканчивающейся в точке 10,7
  48:        Dim acLine As Line = New Line(New Point3d(2, 5, 0), _
  49:                                      New Point3d(10, 7, 0))
  50:        acLine.SetDatabaseDefaults() 
  51:   
  52:        '' Добавление нового объекта в запись таблицы блоков и в транзакцию
  53:        acBlkTblRec.AppendEntity(acLine)
  54:        acTrans.AddNewlyCreatedDBObject(acLine, True) 
  55:   
  56:        '' Сохранение новой линии в базе данных
  57:        acTrans.Commit()
  58:    End Using
  59:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.Geometry;
   5:  using Autodesk.AutoCAD.EditorInput; 
   6:   
   7:  [CommandMethod("AccessSpace")]
   8:  public static void AccessSpace()
   9:  {
  10:    // Получение текущего докуметна и базы данных
  11:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  12:    Database acCurDb = acDoc.Database; 
  13:   
  14:    // Старт транзакции
  15:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  16:    {
  17:        // Открытие таблицы Блоков для чтения
  18:        BlockTable acBlkTbl;
  19:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  20:                                     OpenMode.ForRead) as BlockTable; 
  21:   
  22:        // Открытие записи таблицы блоков для записи
  23:        BlockTableRecord acBlkTblRec; 
  24:   
  25:        // Запрос, какую табличную запись открывать
  26:        PromptKeywordOptions pKeyOpts = new PromptKeywordOptions("");
  27:        pKeyOpts.Message = "\nВыберете в каком пространстве создать линию  ";
  28:        pKeyOpts.Keywords.Add("Модель");
  29:        pKeyOpts.Keywords.Add("Лист");
  30:        pKeyOpts.Keywords.Add("Текущее");
  31:        pKeyOpts.AllowNone = false;
  32:        pKeyOpts.AppendKeywordsToMessage = true;
  33:        PromptResult pKeyRes = acDoc.Editor.GetKeywords(pKeyOpts); 
  34:   
  35:        if (pKeyRes.StringResult == "Модель")
  36:        {
  37:            // Получение ObjectId для Модели из таблицы Блоков
  38:            acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  39:                                            OpenMode.ForWrite) as BlockTableRecord;
  40:        }
  41:        else if (pKeyRes.StringResult == "Лист")
  42:        {
  43:            // Получение ObjectId для Листа из таблицы Блоков
  44:            acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.PaperSpace],
  45:                                            OpenMode.ForWrite) as BlockTableRecord;
  46:        }
  47:        else
  48:        {
  49:            // Получение ObjectId для текущего пространства из базы данных
  50:            acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId,
  51:                                            OpenMode.ForWrite) as BlockTableRecord;
  52:        } 
  53:   
  54:        // Создание линии начинающеся в точке 2,5 и заканчивающейся в точке 10,7
  55:        Line acLine = new Line(new Point3d(2, 5, 0),
  56:                               new Point3d(10, 7, 0));
  57:        acLine.SetDatabaseDefaults(); 
  58:   
  59:        // Добавление нового объекта в запись таблицы блоков и в транзакцию
  60:        acBlkTblRec.AppendEntity(acLine);
  61:        acTrans.AddNewlyCreatedDBObject(acLine, true); 
  62:   
  63:        // Сохранение новой линии в базе данных
  64:        acTrans.Commit();
  65:    }
  66:  }

Код VBA/ActiveX

   1:  Public Sub AccessSpace()
   2:      ' Определение допустимых ключевых слов
   3:      Dim keywordList As String
   4:      keywordList = "Модель Лист Текущее" 
   5:   
   6:      ' Вызов InitializeUserInput для установки ключевых слов
   7:      ThisDrawing.Utility.InitializeUserInput 1, keywordList 
   8:   
   9:      ' Получение пользовательского ввода
  10:      Dim retVal As Variant
  11:      retVal = ThisDrawing.Utility.GetKeyword(vbLf & _
  12:                                     "Укажите пространство, в котором следует создать линию " & _
  13:                                     "[Модель/Лист/Текущее]: ") 
  14:   
  15:      ' Получение указанного ключевого слова
  16:      Dim strVal As String
  17:      strVal = ThisDrawing.Utility.GetInput
  18:      Dim acSpaceObj As Object
  19:   
  20:      If strVal = "Модель" Or _
  21:        (strVal = "Текущее" And ThisDrawing.ActiveSpace = acModelSpace) Then
  22:          '' Получить объект пространства модели
  23:          Set acSpaceObj = ThisDrawing.ModelSpace
  24:      Else
  25:          '' Получить объект пространства листа
  26:          Set acSpaceObj = ThisDrawing.PaperSpace
  27:      End If
  28:   
  29:      '' Получение линии, начинающейся в точке 2,5 и заканчивающейся в точке 10,7
  30:      Dim acLine As AcadLine
  31:      Dim dPtStr(0 To 2) As Double
  32:      dPtStr(0) = 2: dPtStr(1) = 5: dPtStr(2) = 0#
  33:      Dim dPtEnd(0 To 2) As Double
  34:      dPtEnd(0) = 10: dPtEnd(1) = 7: dPtEnd(2) = 0#
  35:      Set acLine = acSpaceObj.AddLine(dPtStr, dPtEnd)
  36:  End Sub



Comments