Тема: Как сохранить привязку к объекту?

Как я выяснил методом проб и ошибок :), в пределах одного чертежа без перезапуска автокада постоянными для объекта являются AcDbObjectId.mId, ads_name (дальше я не экспериментировал). Я пытался поставить точку, и рядом с ней текст. К тексту я привязывался через эти два параметра (поочереди). Но если мне было необходимо редактировать текст (ВЫБИРАЯ ТОЧКУ (в точке хранились вышеперечисленные данные)), то это получалось только в одном сеансе акада. Если документ сохранялся, закрывался автокад, а потом нужно было открыть и редактировать, то такой номер уже не проходил :(.
МОЖЕТ КТО ЗНАЕТ ДРУГОЙ, БОЛЕЕ НАДЕЖНЫЙ СПОСОБ :) ?

Re: Как сохранить привязку к объекту?

Между сеансами AutoCAD в пределах одного чертежа сохраняются метки примитивов (AcDbHandle или группа 5 в списке примитива).

Re: Как сохранить привязку к объекту?

А он является единственным и уникальным для чертежа? Дело в том, что на одном чертеже два символа (объектов пять не больше), а открываю другой чертеж - шесть символов (больше тысячи объектов), причем двухсимвольных нет.
Я знаю, что он состоит из двух unsigned long. Разброс там большой. Handle случайно не переопределяется? И если нет, то как объяснить такой разброс?

Re: Как сохранить привязку к объекту?

И еще забыл спросить.
Даже если я запомню Handle, как потом можно через него привязаться к объекту?

Re: Как сохранить привязку к объекту?

Где ты запоминаеш данные?
Советую использовать AcDbSoftPointer (он является тем же AcDbObjectId).
Сам ACAD гарантирует коректность такого сохранения и актуальность ObjId в разных сеансах

Re: Как сохранить привязку к объекту?

А почему бы не использовать AcDbHardPointerId или AcDbSoftPointerId?
Если все же надо просто сослаться на объект и незаморачиваться что ссыльный объект могут убить или откопировать ссылающегося и т.п.
то
в одну сторону... см хелп
AcDbHandle handle = objId.handle();
в другую сторону... см хелп
AcDbDatabase::getAcDbObjectId

> Александр Ривилис
И еще для продолжения "ссылок". Хочу чтоб один объект из одной базы - ссылался на другой объект из другой базы - как такое можно сделать?
Вроде видел возможность вставлять extern блоки из одного документа в другой. Как работает этот механизм?

Re: Как сохранить привязку к объекту?

Николай пишет:

А он является единственным и уникальным для чертежа?

Да. Более того, если примитив с такой меткой присутствовал в чертеже и его удалилили, то эта метка никогда в этом чертеже больше не встретится.
Есть два момента, когда метка примитива может измениться:
1) Есть функция в ObjectARX, позволяющая обменять метки у двух примитивов.
2) Если в чертеже выполнить _WBLOCK с тем же именем,что имя самого чертежа. С точки зрения AutoCAD такая операция - это создание другого чертежа и поэтому метки могут меняться.

> Николай
Если известна метка примитива (AcDbHandle), то для получения его AcDbObjectId можно использовать следующий код:

AcDbHandle handle;
AcDbObjectId objId;
AcDbDatabase *db = acdbHostApplicationServices()->workingDatabase();
if ((es = db->getAcDbObjectId(objId,false,handle)) == Acad::eOk) {
// Обрабатываем найденный по метке примитив
...
}

Пример использования можешь посмотреть здесь: https://www.caduser.ru/forum/topic19322.html

Или воспользуйся советом Romanа.

Re: Как сохранить привязку к объекту?

> KonstantinM
Увы, но я таким не пользуюсь и поэтому врядли чем конкретным помогу. Кроме того у меня есть очень большие сомнения по поводу надежности ссылок между различными чертежами. Конечено ты можешь сохранять путь к другой базе (dwg-файлу) и метку примитива в ней и это вроде бы будет однозначное соотвествие. А если второй чертеж переименуют, перенесут или вообще удалят? Понадобится еще и механизм для изменения пути доступа ко второму файлу, т.е. реализация чего-то похожего на XREF...

Re: Как сохранить привязку к объекту?

Всем спасибо, все прекрасно работает.
Romanу:
пишу я в расширенные данные. Если не вдаваться в поднобности, то это поля, которые не вошли в просмотр dbview, но присутствуют в БД.
Где-то так :)

Re: Как сохранить привязку к объекту?

> Николай
Если пишешь в расширенные данные, то все можно делать еще проще.
1) метку примитива можно рассматривать, как строку (найти группу 5 в списке, который возвращает функция acdbEntGet);
2) для получения имени примитива по метке (строке) можно воспользоваться функцией acdbHandEnt:

int acdbHandEnt(const char * handle, ads_name entres);

Это работает только в текущем чертеже, открытом в редакторе AutoCAD. И вообще это полный аналог тех функций, которые имеются в AutoLisp.

Re: Как сохранить привязку к объекту?

> Александр Ривилис
<Увы, но я таким не пользуюсь и поэтому врядли чем конкретным помогу. Кроме того у меня есть очень большие сомнения по поводу надежности ссылок между различными чертежами. Конечено ты можешь сохранять путь к другой базе (dwg-файлу) и метку примитива в ней и это вроде бы будет однозначное соотвествие. А если второй чертеж переименуют, перенесут или вообще удалят? Понадобится еще и механизм для изменения пути доступа ко второму файлу, т.е. реализация чего-то похожего на XREF...>
Ну я смастерил один самопальный механизм, чтоб объекты могли ссылаться между документами друг на друга. Если удаляют документ, то ссылки рвутся (для моих задач не критично). К имени файла и пути напрямую не привязываюсь - делаю уникальное число для документа. Есть механизм а-ля workspace/project в VS. Т.е. может открывать/создавать проекты в Акаде, добавлять в проект dwg файлы (запоминается относительный путь от папки проекта), после этого объекты могут цепляться между документами. Вроде как появились "подшивки" в акаде - вроде как делают тоже самое, но я с этим пока тоже не разбирался...
А вот extern блоки точно вставляются... как работает внутрях тоже не знаю и нигде не нашел описание или функционал для этого дела.

Re: Как сохранить привязку к объекту?

> KonstantinM
А вот extern блоки точно вставляются...
Речь идет о XREF, или о чем-то другом?