Время создания блока

Автор Тема: Время создания блока  (Прочитано 3157 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Время создания блока
« : 16-06-2018, 20:02:51 »
Здравствуйте!
Есть ли свойство позволяющее получить момент вставки блока в чертеж? Нужно для определения последовательности появления блоков.
Смысл задачи такой - происходит создание и вставка блока в чертеж командой из dll. Вставка происходит последовательно через произвольное количество времени(от нескольких минут до момента когда опять понадобится ( до следующей ревизии чертежа)) . Нужно отловить самый последний вставленный блок и в его атрибут записать значение.

Отмечено как Решение Atomohod 17-06-2018, 02:59:11

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Время создания блока
« Ответ #1 : 16-06-2018, 20:08:13 »
Есть ли свойство позволяющее получить момент вставки блока в чертеж?
Нет.
Нужно отловить самый последний вставленный блок и в его атрибут записать значение.
Задача решается намного проще. Находишь все вставки этого блока. У того блока, у которого больше Handle, тот и вставлен последним.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Время создания блока
« Ответ #2 : 16-06-2018, 22:46:32 »
У того блока, у которого больше Handle, тот и вставлен последним.
Если Handle числовое значение, то почему не идет сравнение? Я словил exception.
Код - C# [Выбрать]
  1. [CommandMethod("ListBlockReferences")]
  2.                public static void SetCurrentPageNumber( )
  3.                {
  4.                     //--------------------------------------------------------------------Mandatory variables
  5.                     Document acDoc = Application.DocumentManager.MdiActiveDocument;
  6.                     Database acCurDb = acDoc.Database;
  7.                     Editor ed = acDoc.Editor;
  8.                     Transaction acTrans = acCurDb.TransactionManager.StartTransaction( );
  9.                     //--------------------------------------------------------------------Mandatory variables
  10.                     int curPageNumber = 0;
  11.                     List<Handle> listOfHandles = new List<Handle>( );
  12.                     ObjectIdCollection attIdWithPage = new ObjectIdCollection( );
  13.                     using (acTrans)
  14.                     {
  15.                          BlockTable bt = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead, false, true) as BlockTable;
  16.                          foreach (ObjectId btrId in bt)
  17.                          {
  18.                               BlockTableRecord btr = acTrans.GetObject(btrId, OpenMode.ForRead, false, true) as BlockTableRecord;
  19.                               if (btr.Name.StartsWith("Regular"))
  20.                               {
  21.                                    ObjectIdCollection brIdCollection = btr.GetBlockReferenceIds(false, true);
  22.                                    curPageNumber = curPageNumber + brIdCollection.Count;
  23.                                    foreach (ObjectId brId in brIdCollection)
  24.                                    {
  25.                                         BlockReference br = acTrans.GetObject(brId, OpenMode.ForRead) as BlockReference;
  26.                                         listOfHandles.Add(br.Handle);
  27.                                         var brHandle = listOfHandles.Max( );
  28.                                         if (br.Handle == brHandle)
  29.                                         {
  30.                                              AttributeCollection brAttCollection = br.AttributeCollection;
  31.                                              foreach (ObjectId attId in brAttCollection)
  32.                                              {
  33.                                                   AttributeReference attribute = acTrans.GetObject(attId, OpenMode.ForRead) as AttributeReference;
  34.                                                   if (attribute.Tag == "Page")
  35.                                                   {
  36.                                                        attIdWithPage.Add(attId);
  37.                                                   }
  38.                                              }
  39.                                         }
  40.  
  41.  
  42.                                    }
  43.                               }
  44.                          }
  45.                          
  46.                          foreach (ObjectId idAtt in attIdWithPage)
  47.                          {
  48.                               AttributeReference att = acTrans.GetObject(idAtt, OpenMode.ForWrite) as AttributeReference;
  49.                               att.TextString = curPageNumber.ToString( );
  50.                          }
  51.  
  52.                          acTrans.Commit( );
  53.                     }
  54.  
  55.                     Application.DocumentManager.MdiActiveDocument.Editor.Regen( );
  56.                }


line 80 в моем коде это27 здесь. По тексту ошибки выходит, что handle не  реализует интерфейс ??? Но ошибки кода нет, компиляция без проблем.
************** Exception Text **************
System.ArgumentException: At least one object must implement IComparable.
   at System.Collections.Comparer.Compare(Object a, Object b)
   at System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
   at System.Linq.Enumerable.Max[TSource](IEnumerable`1 source)
   at GOST_Titles.PageEnumerator.AttributeHandler.SetCurrentPageNumber() in E:\Visual Studio\Projects\Recirculation\ITAT_Autocad\GOST Titles\PageEnumerator.cs:line 80
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Время создания блока
« Ответ #3 : 16-06-2018, 22:49:44 »
Если Handle числовое значение, то почему не идет сравнение? Я словил exception.
Handle - это не числовое значение. Числовое значение Handle.Value
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Время создания блока
« Ответ #4 : 16-06-2018, 23:04:02 »
Числовое значение Handle.Value
Я полный олень, Вы правы. Добраться до самого значения я недогадался. Но команду это не спасло- значение получается, но некорректно и вставляется во все блоки сразу одно и тоже значение. Например блока 3, получается значение 2 и записывается в атрибут во все блоки 2, хотя handle у них вроде как уникален.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Время создания блока
« Ответ #5 : 16-06-2018, 23:06:11 »
Но команду это не спасло- значение получается, но некорректно и вставляется во все блоки сразу одно и тоже значение.
У тебя точно такая же ошибка как и в прошлый раз. Сначала отбери все вставки блоков, найди их Handle, а только затем найди максимальный Handle из них...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Время создания блока
« Ответ #6 : 16-06-2018, 23:13:22 »
Прошу пояснить, то есть после 25 строки кода я должен через foreach пройти по всем br и только внутри цикла начать сбор handle в List?

Код - C# [Выбрать]
  1.         [CommandMethod("ListBlockReferences")]
  2.                public static void SetCurrentPageNumber( )
  3.                {
  4.                     //--------------------------------------------------------------------Mandatory variables
  5.                     Document acDoc = Application.DocumentManager.MdiActiveDocument;
  6.                     Database acCurDb = acDoc.Database;
  7.                     Editor ed = acDoc.Editor;
  8.                     Transaction acTrans = acCurDb.TransactionManager.StartTransaction( );
  9.                     //--------------------------------------------------------------------Mandatory variables
  10.                     int curPageNumber = 0;
  11.                     List<long> listOfHandles = new List<long>( );
  12.                     ObjectIdCollection attIdWithPage = new ObjectIdCollection( );
  13.                     using (acTrans)
  14.                     {
  15.                          BlockTable bt = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead, false, true) as BlockTable;
  16.                          foreach (ObjectId btrId in bt)
  17.                          {
  18.                               BlockTableRecord btr = acTrans.GetObject(btrId, OpenMode.ForRead, false, true) as BlockTableRecord;
  19.                               if (btr.Name.StartsWith("Regular"))
  20.                               {
  21.                                    ObjectIdCollection brIdCollection = btr.GetBlockReferenceIds(false, true);
  22.                                    curPageNumber = curPageNumber + brIdCollection.Count;
  23.                                    foreach (ObjectId brId in brIdCollection)
  24.                                    {
  25.                                         BlockReference br = acTrans.GetObject(brId, OpenMode.ForRead) as BlockReference;
  26.                                         listOfHandles.Add(br.Handle.Value);
  27.                                         var brHandle = listOfHandles.Max( );
  28.                                         if (br.Handle.Value == brHandle)
  29.                                         {
  30.                                              AttributeCollection brAttCollection = br.AttributeCollection;
  31.                                              foreach (ObjectId attId in brAttCollection)
  32.                                              {
  33.                                                   AttributeReference attribute = acTrans.GetObject(attId, OpenMode.ForRead) as AttributeReference;
  34.                                                   if (attribute.Tag == "Page")
  35.                                                   {
  36.                                                        attIdWithPage.Add(attId);
  37.                                                   }
  38.                                              }
  39.                                         }
  40.  
  41.  
  42.                                    }
  43.                               }
  44.                          }
  45.                          
  46.                          foreach (ObjectId idAtt in attIdWithPage)
  47.                          {
  48.                               AttributeReference att = acTrans.GetObject(idAtt, OpenMode.ForWrite) as AttributeReference;
  49.                               att.TextString = curPageNumber.ToString( );
  50.                          }
  51.  
  52.                          acTrans.Commit( );
  53.                     }
  54.  
  55.                     Application.DocumentManager.MdiActiveDocument.Editor.Regen( );
  56.                }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Время создания блока
« Ответ #7 : 16-06-2018, 23:15:47 »
Прошу пояснить, то есть после 25 строки кода я должен через foreach пройти по всем br и только внутри цикла начать сбор handle в List?
Всё что нужно было я сказал уже выше. Мне нечего добавить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение