Тема: Идентификация объектов

Если я все правильно понимаю, АКАД присваивает каждому элементу чертежа свой ID, который можно считать и по которому можно обращаться к объекту. Случайно в help'е наткнулся на фразу, что при рендеренге ID объектов могут поменяться.
Вопрос: как можно один раз собрать данные об объектах чертежа и впоследствии обращаться к конкретному объекту? В чертеже могут добавляться или удаляться объекты.
P.S. На чертеже несколько одинаковых блоков. Как обратиться только к одному из них?

Re: Идентификация объектов

IAcadBlock - блок.
IAcadBlockReference - вставка блока.
Про Id не совсем понял. А зачем это нужно? Если нужно хранить список объектов, то это можно делать с помощью коллекции. Уж адреса объектов точно не изменяются.

Re: Идентификация объектов

Dim AllObjects as new Collectioon
Dim OneObj as Object
Set Amodel = acadApp.ActiveDocument.ModelSpace
For each OneObj in Amodel
    AllObjects.add OneObj
next OneObj
...что то типа этого

Re: Идентификация объектов

Если можно, о коллекции поподробнее. Как использовать?

Re: Идентификация объектов

Gorez пишет:

Вопрос: как можно один раз собрать данные об объектах чертежа и впоследствии обращаться к конкретному объекту?

При создании объекта ACAD присваивает ему свой идентификационный номер - ID и метку - Handle. Идентификационный номер действителен только в текущем сеансе ACADa. При новом открытии чертежа ID объектов будут другими. Метка объекта уникальна и не изменяема. Для получения объекта по его метке используется метод HandleToObject.

Dim objAcad As AcadEntity
Dim objHandle As String
Set objAcad = ThisDrawing.HandleToObject(objHandle)
Usul пишет:

Если нужно хранить список объектов, то это можно делать с помощью коллекции. Уж адреса объектов точно не изменяются.

С чего это Вы взяли?

> Usul
Уже как то здесь говорил, но еще раз повторю. Перебирать все объекты дело абсолютно глупое. Надо пользоваться наборами, лучше всего с использованием фильтров.

Re: Идентификация объектов

> Usul
А если уж перебирать все объекты пространства модели, то вот так.
Dim entity As AcadEntity
For Each entity In ThisDrawing.ModelSpace
      'Чего то делаем.
Next

Re: Идентификация объектов

Видимо речь идет о   < Entity name: ...   , он дэствительно меняются, но только используется в лиспе а не в    VBA

Re: Идентификация объектов

Всем кто откликнулся, спасибо за помощь.
> bender
Огромное спасибо за разъяснения  ID и Handle.
Если можно, еще о объясните о наборах в кратце.
Пища для размышлений есть, буду разбираться.

Re: Идентификация объектов

> bender
Я имел в виду, что если мы имеем коллекцию ссылок на все объекты, то... можем с ней делать что захотим.
Вообще чтобы ответить на поставленный в теме вопрос нужно выяснить ЗАЧЕМ это нужно. Вообще-то информацию обо всех объектах на чертеже собирать не нужно. Она и так уже собрана - ThisDrawing.ModelSpace.Item() и обратиться к конкретному объекту можно в любой момент.

> bender
Можно и так. лишь бы глаз радовался...

Re: Идентификация объектов

> cadhelp
Точности ради надо сказать, что в VBA есть такое свойство у объектов EntityName и идентично оно свойству ObjectName. И, конечно же, это не тоже самое, что Entity name в Lisp.

> Gorez
Наборы в ACADе - основное средство для создания именованных "коллекций" примитивов и последующей работы с ними. Про них читайте в справке или здесь http://www.cad.dp.ua/stats/a_vba/acenti … AddEntToSS (здесь вообще много интересного).

Usul пишет:

Я имел в виду, что если мы имеем коллекцию ссылок на все объекты, то... можем с ней делать что захотим.

обратиться к конкретному объекту можно в любой момент.

Совершенно верно. Но здесь есть два момента.
Первый. Как формировать эти "коллекции"? То, как показали Вы - типично VB-шный прием. Повторюсь, в АКАДе так делать не надо, здесь есть свои методы, те же наборы (AcadSelectionSet). И дело здесь даже не в радости глаз, а в быстроте и удобстве доступа к нужному примитиву АКАДа, скорости обработки и т. д. и т. п.
Второй. А как обратиться, т. е. получить нужный объект (примитив)? Например (как в первоначальном вопросе) в чертеже есть несколько экземпляров одного блока. Нужно выбрать один, совершенно конкретный. Один из способов (наверное самый простой) - получить примитив по его метке.

Re: Идентификация объектов

> bender
Сайт cad.dp.ua знаю, но не увидел этот пример.

Второй. А как обратиться, т. е. получить нужный объект (примитив)? Например (как в первоначальном вопросе) в чертеже есть несколько экземпляров одного блока. Нужно выбрать один, совершенно конкретный. Один из способов (наверное самый простой) - получить примитив по его метке.

Именно то, что мне и нужно было.
Спасибо всем, буду пробовать.

(изменено: Сергей, 11 сентября 2011г. 17:35:57)

Re: Идентификация объектов

не туда написал.