Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 16-06-2018, 20:02:51

Название: Время создания блока
Отправлено: Atomohod от 16-06-2018, 20:02:51
Здравствуйте!
Есть ли свойство позволяющее получить момент вставки блока в чертеж? Нужно для определения последовательности появления блоков.
Смысл задачи такой - происходит создание и вставка блока в чертеж командой из dll. Вставка происходит последовательно через произвольное количество времени(от нескольких минут до момента когда опять понадобится ( до следующей ревизии чертежа)) . Нужно отловить самый последний вставленный блок и в его атрибут записать значение.
Название: Re: Время создания блока
Отправлено: Александр Ривилис от 16-06-2018, 20:08:13
Есть ли свойство позволяющее получить момент вставки блока в чертеж?
Нет.
Нужно отловить самый последний вставленный блок и в его атрибут записать значение.
Задача решается намного проще. Находишь все вставки этого блока. У того блока, у которого больше Handle, тот и вставлен последним.
Название: Re: Время создания блока
Отправлено: Atomohod от 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()

Название: Re: Время создания блока
Отправлено: Александр Ривилис от 16-06-2018, 22:49:44
Если Handle числовое значение, то почему не идет сравнение? Я словил exception.
Handle - это не числовое значение. Числовое значение Handle.Value
Название: Re: Время создания блока
Отправлено: Atomohod от 16-06-2018, 23:04:02
Числовое значение Handle.Value
Я полный олень, Вы правы. Добраться до самого значения я недогадался. Но команду это не спасло- значение получается, но некорректно и вставляется во все блоки сразу одно и тоже значение. Например блока 3, получается значение 2 и записывается в атрибут во все блоки 2, хотя handle у них вроде как уникален.
Название: Re: Время создания блока
Отправлено: Александр Ривилис от 16-06-2018, 23:06:11
Но команду это не спасло- значение получается, но некорректно и вставляется во все блоки сразу одно и тоже значение.
У тебя точно такая же ошибка как и в прошлый раз. Сначала отбери все вставки блоков, найди их Handle, а только затем найди максимальный Handle из них...
Название: Re: Время создания блока
Отправлено: Atomohod от 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.                }
Название: Re: Время создания блока
Отправлено: Александр Ривилис от 16-06-2018, 23:15:47
Прошу пояснить, то есть после 25 строки кода я должен через foreach пройти по всем br и только внутри цикла начать сбор handle в List?
Всё что нужно было я сказал уже выше. Мне нечего добавить.