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

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

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

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #15 : 03-12-2014, 17:23:32 »
Но, кстати, без кода Андрея Бушмана, та же ситуация. Я просто думал что этот атрибут сидит потому что нужно запустить атробновить, но как оказалость дело не в этом

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #16 : 03-12-2014, 17:25:41 »
Но, кстати, без кода Андрея Бушмана, та же ситуация.
Так она и с твоим кодом не связана. Атрибутов у вставки блока нет, а значение группы DXF 66 равно 1, чего быть не должно.
« Последнее редактирование: 03-12-2014, 18:10:47 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #17 : 03-12-2014, 18:18:24 »
заменой значения группы DXF 66 на 0
Это только на LISP или С++?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #18 : 04-12-2014, 03:20:11 »
Это только на LISP или С++?
Нет. Это еще и P/Invoke в .NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #19 : 04-12-2014, 11:50:30 »
Это только на LISP или С++?
Нет. Это еще и P/Invoke в .NET

Может небольшой примерчик завалялся, или ссылка?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #20 : 04-12-2014, 14:47:01 »
Может небольшой примерчик завалялся, или ссылка?
Примерчик не завалялся - нужно сделать. Можешь сам попробовать из этого скомбинировать: http://habrahabr.ru/post/154591/
Но там многое менять придется. К сожалению P/Invoke существенно зависит от версии и разрядности AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #21 : 04-12-2014, 20:14:32 »
Заметил одну особенность - если выполнять код, без выполнения кода Андрея Бушмана, т. е. только удалять определения атрибутов из определения блока, а потом запускать АТРОБНОВИТЬ и при запросе выбирать блок (именно выбирать, а не вводить имя блока в командную строку, иначе не получается) то все атрибуты удаляются, и флага удаления не появляется. Получается дело за тем чтобы корректно обновить атрибуты после удаления определения атрибутов из определения блока.

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #22 : 06-12-2014, 00:57:43 »
Пробую изменить (или вообще удалить) DXF группу 66, таким вот образом:
Код - C# [Выбрать]
  1. [System.Security.SuppressUnmanagedCodeSecurity]
  2. [DllImport("acdb19.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AAY01JVAcDbObjectId@@@Z")]
  3. private static extern int acdbGetAdsName(long[] name, ObjectId objId);
  4.  
  5. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbEntGet")]
  6. private static extern System.IntPtr acdbEntGet(long[] name);
  7.  
  8. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbEntMod")]
  9. private static extern System.Int32 acdbEntMod(System.IntPtr resbuf);
  10.  
  11. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbEntMake")]
  12. private static extern System.Int32 acdbEntMake(System.IntPtr resbuf);
  13.  
  14. [CommandMethod("DXFMod")]
  15. static public void DXFMod()
  16. {
  17.     Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  18.     Database acDb = acDoc.Database;
  19.     Editor ed = acDoc.Editor;
  20.  
  21.     PromptEntityOptions entityOpt = new PromptEntityOptions("\nSelect entity: ");
  22.     PromptEntityResult entityRes = ed.GetEntity(entityOpt);
  23.     if (entityRes.Status == PromptStatus.OK)
  24.     {
  25.         Transaction tr = acDb.TransactionManager.StartTransaction();
  26.         using (tr)
  27.         {
  28.             DBObject obj = tr.GetObject(entityRes.ObjectId, OpenMode.ForWrite);
  29.             long[] ent = new long[] { 0, 0 };
  30.             acdbGetAdsName(ent, entityRes.ObjectId);
  31.             System.IntPtr rb = acdbEntGet(ent);
  32.  
  33.             ResultBuffer dxflist = DisposableWrapper.Create(typeof(ResultBuffer), rb, true) as ResultBuffer;
  34.             ResultBuffer dxflistNew = new ResultBuffer();
  35.             if (dxflist != null)
  36.             {
  37.                 foreach (TypedValue val in dxflist)
  38.                 {
  39.                     if (val.TypeCode != 66)
  40.                     {
  41.                         dxflistNew.Add(val);
  42.                     }
  43.                     //Попытка изменить значение DXF группы
  44.                     //else
  45.                     //{
  46.                     //    TypedValue tp = new TypedValue(66, 0);
  47.                     //    dxflistNew.Add(tp);
  48.                     //}
  49.                 }
  50.                 acdbEntMod(dxflistNew.UnmanagedObject);
  51.             }
  52.             tr.Commit();
  53.         }
  54.     }
  55. }
но что-то результата никакого  :( . Этот атрибут с флагом "This entity is currently erased" все равно остается

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #23 : 06-12-2014, 02:29:13 »
Значит и этот вариант не поможет. Увы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #24 : 06-12-2014, 10:16:55 »
Может что-то с приведенным выше кодом? :o

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #25 : 06-12-2014, 11:09:51 »
Может что-то с приведенным выше кодом?
С кодом всё нормально. Я проверил в AutoCAD 2014 - группу 66 таким образом установить не удается (в ObjectARX/Lisp аналогично).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Re: Удалить определение атрибута
« Ответ #26 : 07-12-2014, 21:15:03 »
даже если штатными средствами AutoCAD удалить определение атрибута, который стоит первым в списке атрибутов, и при этом если в блоке останется хотя бы одно определение атрибута, то у всех вставок этого блока атрибут, который был первым в списке будет помечен как "This entity is currently erased", а при удалении вообще всех определений атрибутов из блока атрибуты удаляются полностью, никаких флагов не остается. Неужели никак нельзя программно удалить все атрибуты?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #27 : 07-12-2014, 21:17:59 »
Получается дело за тем чтобы корректно обновить атрибуты после удаления определения атрибутов из определения блока.
Очень может быть. И мне кажется что проблема в том, что BlockReference br в момент когда мы удаляем атрибуты открыт на запись. Возможно нужно предварительно закрыть BlockReference, а возможно нужно поиграться и заменить транзакцию на эмуляцию транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #28 : 07-12-2014, 21:21:32 »
даже если штатными средствами AutoCAD удалить определение атрибута, который стоит первым в списке атрибутов, и при этом если в блоке останется хотя бы одно определение атрибута, то у всех вставок этого блока атрибут, который был первым в списке будет помечен как "This entity is currently erased
Если это так, то это просто баг.

а при удалении вообще всех определений атрибутов из блока атрибуты удаляются полностью, никаких флагов не остается. Неужели никак нельзя программно удалить все атрибуты?
А вот тут я уже не понял. Если есть баг, то его врядли можно так просто обойти.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удалить определение атрибута
« Ответ #29 : 07-12-2014, 21:41:24 »
даже если штатными средствами AutoCAD удалить определение атрибута, который стоит первым в списке атрибутов, и при этом если в блоке останется хотя бы одно определение атрибута, то у всех вставок этого блока атрибут, который был первым в списке будет помечен как "This entity is currently erased"
Что-то ты меня снова запутал. Я проверил гипотезу с багом в "штатных средствах" и она у меня не подтвердилась:
https://screencast.autodesk.com/main/details/b822b3e6-dca5-4e03-86ad-1b4a39d5fdbb

P.S.: Ага. Кажется до меня стало доходить о чем ты - ты забыл сообщить, что после удаления определения атрибута запустил команду _ATTSYNC. Да действительно у первого атрибута в блоке установлен признак IsErased:
https://screencast.autodesk.com/main/details/78ed5795-41ad-41a4-bb1f-aced403e4e3d
Я пометил что это баг, но потом сообразил, что в принципе это нормально. Если сохранить чертеж, закрыть и открыть его, то этого атрибута не будет видно и в ARXDBG. Можешь это проверить сам.
 
« Последнее редактирование: 07-12-2014, 22:01:25 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение