Глюки BlockTableRecord.HasAttributeDefinitions AC2014

Автор Тема: Глюки BlockTableRecord.HasAttributeDefinitions AC2014  (Прочитано 13384 раз)

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

Оффлайн xSAKABSxАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Товарищи!
Буду премного благодарен, если вы попробуете повторить и напишите результат.

1. создаем блок руками c 1 объектом  (например полилиния).
2. добавляем в него атрибут(можно руками, можно .net)
3. смотрим BlockTableRecord.HasAttributeDefinitions = true;
3. проходим по обьектам в BlockTableRecord:
их будет 2: полилиния и определение атрибута
4.удаляем атрибут руками(программно я пока не пробовал)
5.проходим по обьектам в BlockTableRecord:
находит 1 обьект: полилинию.

И тут ТАДАДАДАМ(играет Выходной марш из к.ф. "Цирк" ) :
6. смотрим BlockTableRecord.HasAttributeDefinitions = true;

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #1 : 19-03-2014, 17:25:30 »
Небось, HasAttributeDefinitions не проверяет на IsErased
Попробуйте теперь перед п. 6 сделать audit (ручками)
Алексей

Оффлайн xSAKABSxАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #2 : 19-03-2014, 17:34:47 »
Небось, HasAttributeDefinitions не проверяет на IsErased
Попробуйте теперь перед п. 6 сделать audit (ручками)

все тоже самое
BlockTableRecord.HasAttributeDefinitions = true

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #3 : 19-03-2014, 17:46:40 »
А если выполнить ATTSYNC?

Оффлайн xSAKABSxАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #4 : 19-03-2014, 17:50:14 »
А если выполнить ATTSYNC?
ATTSYNC считает что у этого блока нету атрибутов

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #5 : 19-03-2014, 18:31:07 »
Баг подтверждаю. Код для проверки:
Код - C# [Выбрать]
  1. [CommandMethod("TestBlock")]
  2. public void TestBlock()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Editor ed = doc.Editor;
  6.     PromptResult res = ed.GetString("\nType name of block: ");
  7.     if (res.Status != PromptStatus.OK) return;
  8.     using (Transaction tr = doc.TransactionManager.StartTransaction())
  9.     {
  10.         BlockTable bt = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;
  11.         if (bt != null)
  12.         {
  13.             if (bt.Has(res.StringResult))
  14.             {
  15.                 BlockTableRecord btr = tr.GetObject(bt[res.StringResult], OpenMode.ForRead) as BlockTableRecord;
  16.                 if (btr != null)
  17.                 {
  18.                     ed.WriteMessage("\nBlock {0} has{1} attribute definitions",
  19.                         res.StringResult, btr.HasAttributeDefinitions ? "" : " not");
  20.                 }
  21.             } else {
  22.                 ed.WriteMessage("\nBlock {0} not found", res.StringResult);
  23.             }
  24.         }
  25.         tr.Commit();
  26.     }
  27. }
Аналогично и в ObjectARX. Отправлю в ADN DevHelp.
P.S.: Диалог специально делал на английском.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #6 : 19-03-2014, 19:20:21 »
@xSAKABSx
После обозначенных тобой действий, сохрани чертёж и закрой его. Затем снова открой и проверь значение свойства HasAttributeDefinitions. Чем-то напоминает мне вот это.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #7 : 19-03-2014, 19:21:10 »
После обозначенных тобой действий, сохрани чертёж и закрой его. Затем снова открой и проверь значение свойства HasAttributeDefinitions.
Не помогает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #8 : 19-03-2014, 19:23:02 »
Не помогает.
Хреново. Значит, как вариант - писать свой метод расширения, который будет выполнять проверку корректно, ибо ждать исправлений можно до пенсии (внуков).

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #9 : 19-03-2014, 22:15:05 »
Отправил в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #10 : 20-03-2014, 11:28:39 »
Код - C# [Выбрать]
  1. // BlockTableRecordExtentions.cs
  2. // © Andrey Bushman, 2014
  3. // Extention methods for the BlockTableRecord class
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8.  
  9. /// В целях переносимости кода и отсутствия в псевдонимах наименований
  10. /// конкретного САПР, целесообразней формировать псевдонимы в
  11. /// нейтральной форме, например: cad, вместо acad, Ap вместо AcAp, Db
  12. /// вместо AcDb и т.д. Построенная таким способом система наименований
  13. /// будет более удобной программисту, портирующему ваш код под другую
  14. /// САПР. Ниже приведён вариант определений таких нейтральных псевдонимов
  15. /// под некоторый набор различных САПР.
  16. #if AUTOCAD
  17. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  18. using Ap = Autodesk.AutoCAD.ApplicationServices;
  19. using Db = Autodesk.AutoCAD.DatabaseServices;
  20. using Ed = Autodesk.AutoCAD.EditorInput;
  21. using Gm = Autodesk.AutoCAD.Geometry;
  22. using Rt = Autodesk.AutoCAD.Runtime;
  23. #elif BRICSCAD
  24. using cad = Bricscad.ApplicationServices.Application;
  25. using Ap = Bricscad.ApplicationServices;
  26. using Db = Teigha.DatabaseServices;
  27. using Ed = Bricscad.EditorInput;
  28. using Gm = Teigha.Geometry;
  29. using Rt = Bricscad.Runtime;
  30. #elif NANOCAD
  31. using cad = HostMgd.ApplicationServices.Application;
  32. using Ap = HostMgd.ApplicationServices;
  33. using Db = Teigha.DatabaseServices;
  34. using Ed = HostMgd.EditorInput;
  35. using Gm = Teigha.Geometry;
  36. using Rt = Teigha.Runtime;
  37. #endif
  38.  
  39. namespace Bushman.CAD.Extentions {
  40.         /// <summary>
  41.         /// Методы расширения для экземпляров класса BlockTableRecord
  42.         /// </summary>
  43.         public static class BlockTableRecordExtentions {
  44.                 /// <summary>
  45.                 /// Данный метод проверяет наличие экземпляров <c>Db.AttributeDefinition</c> в
  46.                 /// составе объекта <c>BlockTableRecord</c> и представляет собой замену методу
  47.                 /// <c>BlockTableRecord.HasAttributeDefinitions</c>, который реализован
  48.                 /// неверно - в виду этого и возникла необходимость написать корректный вариант
  49.                 /// реализации. Информация о некорректной работе
  50.                 /// <c>BlockTableRecord.HasAttributeDefinitions</c> была подтверждена и
  51.                 /// отправлена в ADN. Подробности на странице
  52.                 /// http://adn-cis.org/forum/index.php?topic=625.0
  53.                 /// </summary>
  54.                 /// <param name="btr">экземпляр <c>BlockTableRecord</c>, подлежащий проверке.</param>
  55.                 /// <returns>true - в составе указанного объекта <c>BlockTableRecord</c>
  56.                 /// содержатся элементы <c>Db.AttributeDefinition</c>, иначе - false.</returns>
  57.                 public static Boolean HasAttDefs(this Db.BlockTableRecord btr) {
  58.                         String name = Rt.RXClass.GetClass(typeof(Db.AttributeDefinition)).Name;
  59.                         return btr.Cast<Db.ObjectId>().Any(n => !n.IsNull && n.IsValid
  60.                                 && !n.IsErased && !n.IsEffectivelyErased && String.Equals(
  61.                                 n.ObjectClass.Name, name, StringComparison.InvariantCulture));
  62.                 }
  63.  
  64. #if DEBUG
  65.                 /// <summary>
  66.                 /// Команда, демонструрующая некорректную работу
  67.                 /// <c>BlockTableRecord.HasAttributeDefinitions</c>
  68.                 /// и корректность работы метода <c>HasAttDefs</c>.
  69.                 /// За основу взят код
  70.                 /// http://adn-cis.org/forum/index.php?topic=625.msg2168#msg2168
  71.                 /// </summary>
  72.                 [Rt.CommandMethod("TestBlock")]
  73.                 public static void TestBlock() {
  74.                         Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  75.                         Ed.Editor ed = doc.Editor;
  76.                         Ed.PromptResult res = ed.GetString("\nType name of block: ");
  77.                         if (res.Status != Ed.PromptStatus.OK) return;
  78.                         using (Db.Transaction tr = doc.TransactionManager.StartTransaction()) {
  79.                                 Db.BlockTable bt = tr.GetObject(doc.Database.BlockTableId,
  80.                                         Db.OpenMode.ForRead) as Db.BlockTable;
  81.                                 if (bt != null) {
  82.                                         if (bt.Has(res.StringResult)) {
  83.                                                 Db.BlockTableRecord btr = tr.GetObject(bt[res.StringResult],
  84.                                                         Db.OpenMode.ForRead) as Db.BlockTableRecord;
  85.                                                 if (btr != null) {
  86.                                                         ed.WriteMessage("\nAutodesk: Block {0} has{1} attribute definitions.\n",
  87.                                                                 res.StringResult, btr.HasAttributeDefinitions ? "" : " not");
  88.                                                         // Мною добавлена эта строка кода:
  89.                                                         ed.WriteMessage("\nBushman: Block {0} has{1} attribute definitions.\n",
  90.                                                                 res.StringResult, btr.HasAttDefs() ? "" : " not");
  91.                                                 }
  92.                                         }
  93.                                         else {
  94.                                                 ed.WriteMessage("\nBlock {0} not found", res.StringResult);
  95.                                         }
  96.                                 }
  97.                                 tr.Commit();
  98.                         }
  99.                 }
  100. #endif
  101.         }
  102. }
« Последнее редактирование: 21-03-2014, 11:49:37 от Андрей Бушман »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #11 : 20-03-2014, 12:09:49 »
Исправил CurrentCulture на InvariantCulture.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #12 : 20-03-2014, 15:41:01 »
.Count() > 0;
Андрей - мне нравится Ваш подход к реализации алгоритмов, но иногда, среди действительно хорошо продуманного и проработанного кода встречаются вот такие с моей точки зрения "детские" ляпы. Вам же надо узнать есть или нет аттрибут - зачем их все считать? (это примерно когда спрашивают у чего больше вес 1 карандаша или 10 тысяч стульев - не надо взвешивать все - после 1-го уже все понятно - и когда перед программистом стоит задача подобного сравнения, он просто обязан это учитывать). Нашли атрибут - все - ответ понятен. Весь код я бы определил так (F#):
Код - C# [Выбрать]
  1. type BlockTableRecord with
  2.   member this.HasAttribute=seq{for id in this->id.ObjectClass.DxfName}
  3.                             |>Seq.exists ((=)"ATTDEF")
p.s. Быть может в данном примере это и не суть как важно, но ИХМО на подобные вещи должна быть выработана аллергия - чтоб глаза резала.
p.p.s. по поводу необходимости еще проверок IsEffectivelyErased и пр. это вопрос к Маэстро - по практике вроде как не понадобились...
p.p.p.s такие вещи, кстати, можно с чистой совестью писать в "хороших" лиспах - т.к. компилятор поймет чего от него надо и сам соптимизирует алгоритм.
 

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #13 : 20-03-2014, 15:50:01 »
не надо взвешивать все - после 1-го уже все понятно
согласен, исправлю.
p.p.s. по поводу необходимости еще проверок IsEffectivelyErased и пр. это вопрос к Маэстро - по практике вроде как не понадобились...
я сталкивался с необходимостью этой проверки не так давно. Некоторая, очень куцая информация насчёт IsEffectivelyErased недавно была размещена здесь.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Глюки BlockTableRecord.HasAttributeDefinitions AC2014
« Ответ #14 : 20-03-2014, 16:11:40 »
внёс изменения в код.