Удалить определение атрибута

Автор Тема: Удалить определение атрибута  (Прочитано 30441 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #30 : 07-12-2014, 21:55:05 »
Я делал так: есть блок с несколькими атрибутами, захожу в определение, удаляю первый атрибут, выхожу из определения, дальше АТРОБНОВИТЬ

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #31 : 07-12-2014, 21:57:57 »
Если захожу в определение блока, удаляю все атрибуты потом АТРОБНОВИТЬ получается вот так (блок один и тот же)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #32 : 07-12-2014, 22:11:23 »
Это нормально. Фактически если не осталось ни одного атрибута в блоке, то DXF группа 66 устанавливается AutoCAD'ом в 0 и ARXDBG вообще не пытается искать и показывать атрибуты блока. Если же есть хоть один атрибут, то ARXDBG выводит все атрибуты, в том числе и удаленные. Никакого противоречия не вижу. При желании можно "пошаманить" с исходниками ARXDBG и сделать так, чтобы этот атрибут в список не попадал (файл из ObjectARX SDK \samples\database\ARXDBG\Snoop\ArxDbgUiTdcEntities.cpp):
Код - C++ [Выбрать]
  1. void
  2. ArxDbgUiTdcEntities::addSubentitiesToTree(const AcDbEntity* mainEnt, HTREEITEM parent)
  3. {
  4.         AcDbObjectIdArray subEnts;
  5.  
  6.     AcDbBlockReference* blkRef;
  7.        
  8.         if ((blkRef = AcDbBlockReference::cast(mainEnt)) != NULL) {
  9.                 collectAttributes(blkRef, subEnts);
  10.         }
  11.         else if ((mainEnt->isKindOf(AcDbPolyFaceMesh::desc())) ||
  12.                          (mainEnt->isKindOf(AcDbPolygonMesh::desc())) ||
  13.                          (mainEnt->isKindOf(AcDb2dPolyline::desc())) ||
  14.                          (mainEnt->isKindOf(AcDb3dPolyline::desc()))) {
  15.                 collectVertices(mainEnt, subEnts);
  16.         }
  17.  
  18.         AcDbObject* tmpObj;
  19.         HTREEITEM treeItem;
  20.         Acad::ErrorStatus es;
  21.         CString str;
  22.  
  23.         int len = subEnts.length();
  24.         for (int i=0; i<len; i++) {
  25.                // Если в следующей строке заменить true на false, то атрибут в ARXDBG виден не будет
  26.                 es = acdbOpenAcDbObject(tmpObj, subEnts[i], AcDb::kForRead, true);              // might have passed in erased ones
  27.                 if (es == Acad::eOk) {
  28.                         treeItem = addOneTreeItem(ArxDbgUtils::objToClassAndHandleStr(tmpObj, str), tmpObj, parent);
  29.                         tmpObj->close();
  30.                 }
  31.                 else
  32.                         ArxDbgUtils::rxErrorMsg(es);
  33.         }
  34. }
  35.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #33 : 07-12-2014, 22:40:57 »
Да меня больше беспокоило в этой ситуации то что после удаления всех атрибутов (и определений и атрибутов у вставок блока), его не получилось открыть на редактирование двойным щелчком. При двойном щелчке на вставке, вызывалась команда _.eattedit, как будто в нем есть атрибуты, хотя в палитре свойств при этом никаких атрибутов нет. Теперь думаю можно поступить так: зайти в определение блока, удалить все определения атрибутов, потом старые вставки блока удалить, а на их места добавить уже новые (без определений атрибутов). Только  вот не слишком ли долго все это будет выполняться, если в чертеже будет много блоков?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #34 : 07-12-2014, 23:52:13 »
Только  вот не слишком ли долго все это будет выполняться, если в чертеже будет много блоков?
Думаю что это не принципиальное увеличение времени, т.к. это не то, что должно выполнятся в реальном времени. Если вместо 10 секунд этот код будет работать 20 секунд, то ничего страшного в этом не вижу.
Нашел еще один интересный баг. Если есть определение блока с определениями атрибутов и его вставка, а затем из определения блока определения атрибутов удалили (и это единственное определение блока в чертеже), то команда _ATTSYNC отказывается работать - говорит что нет блоков с атрибутами:
https://screencast.autodesk.com/main/details/023e40b3-9491-4345-b56a-1fa418cdfa63
Если же есть еще хотябы одно определение блока с определениями атрибута, то всё нормально:
https://screencast.autodesk.com/main/details/7b6f7c0e-8ab7-43c5-bc6a-5844abe31153
Так что займись исследованием кода Андрея. Где-то или у него неточность или в баг в .NET API, которым команда _ATTSYNC не пользуется.
Если же это блок не единственный
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #35 : 08-12-2014, 00:04:27 »
(и это единственное определение блока в чертеже)
Точно, тоже наблюдал эту ситуацию!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #36 : 08-12-2014, 00:07:46 »
Но, кстати, без кода Андрея Бушмана, та же ситуация. Я просто думал что этот атрибут сидит потому что нужно запустить атробновить, но как оказалость дело не в этом
Так. А теперь начнем с начала. Без кода Андрея получить такой результат (как видишь из роликов) не получается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #37 : 08-12-2014, 00:26:45 »
еще один момент: удаляю определения атрибутов из определения блока программно, вставки блока вообще не трогаю. потом запускаю _attsync и при запросе выбираю опцию "Имя",  а не опцию "Выбрать" - тогда сообщение о том что не найден блок с атрибутами. если выбрать опцию "Выбрать" то блок успешно обновляется.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #38 : 08-12-2014, 00:30:51 »
еще один момент: удаляю определения атрибутов из определения блока, вставки блока вообще не трогаю. потом запускаю _attsync и при запросе выбираю опцию "Имя",  а не выбрать - тогда сообщение о том что не найден блок с атрибутами. если выбрать опцию "Выбрать" то блок успешно обновляется.
Ну это тоже всё растёт из того что в случае "Имя" проверяется определение блока по имени, а в нём определения атрибутов нет. А в случае указания сначала проверяется вставка блока и, при наличии в ней атрибутов, наличие определения атрибутов в определении блока не учитывается. Как-то так.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение