Тема: Как узнать имя ARX-приложения?

Подскажите кто-нибудь:
Есть файл. В нём объекты, созданные ARX-приложением. Нужно их выбрать - создать набор выбора (selection set). Использую команду acedSSGet(); Как узнать имя этого ARX-приложения? Пробовал команду list - имя приложения, которое выдаётся, не подходит.

Re: Как узнать имя ARX-приложения?

Порсмотри в samples\database\ARXDBG файл ArxDbgUiTdcDbObjectBase.cpp, функцию void ArxDbgUiTdcDbObjectBase::display(AcDbProxyObject* proxy)
Тогда станет ясно какую информацию можно получить из proxy-объекта.

Re: Как узнать имя ARX-приложения?

Я так понимаю, что в этом файле создаётся класс "ArxDbgUiTdcDbObjectBase".
Никогда ещё не использовал такие файлы в arx - не получается что-либо использовать из этого файла :(

Re: Как узнать имя ARX-приложения?

> aazko
Кажется я совершенно не понял твой начальный вопрос. Уточни:
1) В нём объекты, созданные ARX-приложением. - это custom объекты или обычные примитивы? Если это обычные примитивы, то содержат ли они какие-нибудь расширенные данные?
2) Использую команду acedSSGet(); Как узнать имя этого ARX-приложения? - зачем тебе нужно имя arx-приложения для для выбора с помощью acedSSGet()? Чтобы выбирать при помощи фильтра? Тогда набери в командной строке:

(entget (car (entsel)) '("*"))

и укажи один из этих примитивов. В напечатанном списке ты увидишь все, что тебе может понадобится для фильтрования с помощью acedSSGet()
Особенно внимательно смотри на группы 0 и -3
Что касается класса ArxDbgUiTdcDbObjectBase - то это "класс-обертка", которая к существу дела никакого отношения не имеет. Я хотел показать какую информацию можно получить о arx-приложении из собственного примитива если arx-приложение не загружено.

Re: Как узнать имя ARX-приложения?

1. Это не обычные примитивы. Видимо, custom (боюсь ошибиться), т.к. это специфические объекты, созданные arx-приложением, у котороых есть расширенные данные (угол поворота, ширина и т.д.). Это приложение - PlanTracer (может, знаете).
2. Да, хочу выбрать с помощью фильтра.
Среди результатов
entget (car (entsel)) '("*"))
нет группы -3, а группа 0 - ACAD_PROXY_ENTITY
Но дело в том, что в файле несколько ACAD_PROXY_ENTITY разного типа и мне их нужно зарличать как-то между собой.

Re: Как узнать имя ARX-приложения?

> aazko
1) Отобрать только эти примитивы только при помощи фильтра нельзя. Сначала нужно отобрать все proxy по фильтру '((0 . ACAD_PROXY_ENTITY)), а потом проанализировать каждый из примитивов в наборе на то, тот ли это примитив ACAD_PROXY_ENTITY или нет. Здесь как раз может помочь пример, к которому я отослал в самом начале: ArxDbgUiTdcDbObjectBase::display(AcDbProxyObject* proxy)
Тебе нужно написать функцию
Тебе нужно проанализировать
proxy->originalClassName()
proxy->originalDxfName() - Скорее всего это именно то, что тебе нужно!!!
proxy->applicationDescription());
Вот пример функции, которая из набора выкинет все не прокси и все прокси, которые имеют не то originalDxfName имя (я ее не тестировал - только для объяснения идеи):

long FilterByOriginalDxfName(char *DxfName, ads_name ss)
{
  long n = 0;
  if  (acedSSLength(ss,&n) == RTNORM) {
    while (n > 0) {
      ads_name en;
      if (acedSSName(ss,n-1,en) == RTNORM) {
        AcDbObjectId objId;
        if (acdbGetObjectId(objId,en) == Acad::eOk) {
          AcDbObjectPointer<AcDbProxyEntity> ent(objId,AcDb::kForRead);
          if (ent.openStatus() != Acad::eOk || stricmp(ent->originalDxfName(),DxfName)) {
            // Это или не прокси-примитив, или не наш DxfName - удаляем из набора
            acedSSDel(en,ss);
          }
        }
      }
      --n;
    }
    if  (acedSSLength(ss,&n) == RTNORM) return n;
  } else {
    return -1;
  }
  return -1;
}

Re: Как узнать имя ARX-приложения?

Огромное спасибо!
Где-то неделю бился - ничего не получалось.
А теперь уже что-то есть!
Ещё раз спасибо!

Re: Как узнать имя ARX-приложения?

> aazko
Да ладно... smile Идея надеюсь понятна? Если не совсем - спрашивай...

Re: Как узнать имя ARX-приложения?

Продолжу старую тему.
Указанные Вами функции хорошо работают, если ARX-приложение, которое отвечает за эти объекты, не загружено.
Если оно загружено, то в окне AutoCAD "Свойства" показываются необходимые мне свойства объектов всесте с их названием. Мне сказали, что к этим свойствам можно попасть только с исходниками от разработчиков. Это действительно так, и я могу забыть об обращении к свойствам таких объектов, даже если есть само приложение, к которому они относятся?

Re: Как узнать имя ARX-приложения?

> aazko
Если нет описания этого приложения и его открытого API, то ничего хорошего не получится.

Re: Как узнать имя ARX-приложения?

Есть описание библиотеки классов (COM-интерфейса).
Вот пример. Только я что-то не понимаю, что это за цифры. C COM-интерфейсом никогда ещё не работал. Есть ещё текстовое описание класса - для чего он нужен.

PTObjectType enumerator
C++ формат :
enum {
    ptWall    = 1,
    ptColumn     = 7,
    ptWindow     = 2,
    ptStair     = 5,
    ptRoom     = 6,
    ptFlat     = 22
};
Visual Basic формат :
Const ptWall As Integer     = 1
Const ptColumn As Integer      = 7
Const ptWindow As Integer      = 2
Const ptStair As Integer     = 5
Const ptRoom As Integer     = 6
Const ptFlat As Integer     = 22

Ещё есть пример файла Excel, через который можно получить некоторые свойства объектов.

Re: Как узнать имя ARX-приложения?

> aazko
Посмотри здесь: https://www.caduser.ru/forum/topic16598.html
и здесь: https://www.caduser.ru/forum/search.htm … pplication

Re: Как узнать имя ARX-приложения?

Спасибо, Александр! Буду разбиратся :)