5.1.1. Работа с идентификаторами объектов (ObjectId)

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

    Каждому объекту, содержащемуся в объекте базы данных чертежа (Database), присвоено несколько уникальных идентификаторов (ID). Однозначно определить объект вы можете следующим образом: 

  • по метке объекта (Entity handle)
  • по идентификатору объекта (ObjectId) 
  • по указателю объекта (Instance pointer) 
    Чаще, используется способ получения объекта по его идентификатору (ObjectId). Идентификаторы хорошо работают, если ваш проект использует и COM доступ, и управляемый код .NET API. Если вы создаете пользовательскую функцию AutoLISP, вы должны работать с описателями объектов (Entity handles).

    Метки (handles) остаются постоянными между сеансами работы AutoCAD, поэтому, их использование для доступа к объектам это лучший способ если вам нужно экспортировать информацию из чертежа во внешний файл и использовать её позже для обновления чертежа1. Идентификаторы (ObjectId) объектов в базе данных существуют, только, когда база данных загружена в памяти. Как только база данных закрывается, идентификаторы объектов перестают существовать, и возможно будут отличаться при следующей загрузке этой базы данных.

Получение идентификатора объекта (ObjectId)

    Поскольку вы работаете с объектами базы данных, вы должны получить идентификатор объекта прежде, чем просматривать или редактировать его. Идентификаторы присваиваются существующим объектам в базе данных чертежа при его открытии, а новым объектам идентификаторы присваиваются при их создании. Обычно, идентификатор объекта получают так:
  • Используя свойство объекта базы данных Database, такое как Clayer, которое возвращает идентификатор слоя этого объекта
  • Итерацией символьной таблицы, например таблицы Слоев Layer symbol table

Открытие объекта

    Получив идентификатор объекта, используйте метод GetObject для открытия объекта установленного для этого идентификатора. Объект может быть отрыт в одном из следующих режимов:
  • Read - объект открыт для чтения.
  • Write - объект открыт для чтения, если этот режим уже не используется для этого объекта.
  • Notify - объект открыт для уведомления о том, что объект открыт для чтения, или для записи, но, только, не когда объект уже открыт для уведомления. Дополнительную информацию читайте в статье 9. Использование событий
    Желательно открывать объект в режиме более соответствующему ситуации в которой он будет использоваться. Открытие объекта для записи, влечет за собой дополнительные расходы на создание операции отмены, которая вам возможно не потребуется. Если вы неуверенны, что объект который вы открываете, это тот с которым вам нужно работать, вы можете открыть его для чтения и использовать метод UpgradeOpen для изменения режима с чтения на запись. Дополнительную информацию по методу UpgradeOpen читайте в статье 5.1.4. Обновление открытых объектов и отказ от произведённых обновлений.

   Оба метода GetObject и Open2 возвращают объект. Работая с различными языками программирования, вам нужно приводить возвращаемое значение к переменным (типам) использующимися в этом языке программирования. Если вы используете VB.NET, вам не нужно переживать за приведение типа возвращаемой переменной, это уже сделано за вас. В следующем примере показано получение объекта LayerTableRecord для нулевого слоя текущей базы данных чертежа.

    В следующем примере показана ручная очистка транзакции, после ее использования.

Код VB.NET

   1:  Dim acCurDb As Document = Application.DocumentManager.MdiActiveDocument.Database
   2:  Dim acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
   3:   
   4:  Dim acLyrTblRec As LayerTableRecord
   5:  acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero, OpenMode.ForRead)
   6:   
   7:  acTrans.Dispose()
    В следующем примере используется оператор Using для очистки транзакции после её использования. Использование оператора Using является предпочтительным стилем кодирования.

Код VB.NET

   1:  Dim acCurDb As Document = Application.DocumentManager.MdiActiveDocument.Database 
   2:  Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() 
   3:  Dim acLyrTblRec As LayerTableRecord 
   4:  acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero, OpenMode.ForRead) 
   5:  End Using

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

Код C#

   1:  Document acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
   2:  Transaction acTrans = acCurDb.TransactionManager.StartTransaction(); 
   3:  LayerTableRecord acLyrTblRec;
   4:  acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero, OpenMode.ForRead) as LayerTableRecord; 
   5:  acTrans.Dispose();

    В следующем примере используется оператор Using для очистки транзакции после её использования. Использование оператора Using является предпочтительным стилем кодирования.

Код C#

   1:    Document acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
   2:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
   3:    {
   4:         LayerTableRecord acLyrTblRec;
   5:        acLyrTblRec = acTrans.GetObject(acCurDb.LayerZero,
   6:                                        OpenMode.ForRead) as LayerTableRecord;
   7:    }

Примечания:
1 - прим. Н.Н. Полещука: это общепринятый термин (метка - просто номер записи в БД чертежа (один объект может занимать несколько записей)).
2 - прим.переводчика: метод у структуры ObjectID.

Comments