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

ADN Club => AutoCAD .NET API => Тема начата: Николай Коломоец от 28-02-2014, 17:47:26

Название: Имя вхождения блока
Отправлено: Николай Коломоец от 28-02-2014, 17:47:26
Есть функция поиска вхождения блока с известным именем в файле.
В конкретном случае не сработало, при отладке обнаружил, что пользователь вставил этот блок руцями (ctrl+V), в итоге в диспетчере свойств имя блока верное (напр., А), но BlockReference.Name выдает что-то вроде "*U568". Как заставить программу увидеть имя "А"?
Заставить всех никогда не пользоваться ctrl+v нереально, сильно уж привычно всем  ::)
Название: Re: Имя вхождения блока
Отправлено: Александр Ривилис от 28-02-2014, 17:49:35
Определение имени блока по вставке блока (http://adn-cis.org/opredelenie-imeni-bloka-po-vstavke-bloka.html) Оно?
Название: Re: Имя вхождения блока
Отправлено: Андрей Бушман от 28-02-2014, 18:00:13
Скорее всего в основе данного анонимного блока лежит некий динамический
Код - C# [Выбрать]
  1.                         using (doc.LockDocument()) {
  2.                                 using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
  3.                                         Db.BlockTable bt = tr.GetObject(db.BlockTableId, Db.OpenMode.ForRead)
  4.                                                 as Db.BlockTable;
  5.                                         if (!bt.Has(blockName)) return null;
  6.                                         Db.ObjectId defId = bt[blockName];
  7.                                         Db.BlockTableRecord btr = tr.GetObject(defId, Db.OpenMode.ForRead)
  8.                                                 as Db.BlockTableRecord;
  9.  
  10.                                         foreach (Db.ObjectId id in btr.GetBlockReferenceIds(false, false)) {
  11.                                                 result.Add(id);
  12.                                                 Db.BlockReference br = tr.GetObject(id, Db.OpenMode.ForWrite) as Db.BlockReference;
  13.  
  14.                                         }
  15.  
  16. #if DEBUG
  17.                                         ed.WriteMessage("Количество вхождений блока {0}: {1}\n", blockName, result.Count);
  18. #endif
  19.                                         if (btr.IsDynamicBlock) {
  20. #if DEBUG
  21.                                                 ed.WriteMessage("Анонимные блоки:\n");
  22. #endif
  23.                                                 foreach (Db.ObjectId id in btr.GetAnonymousBlockIds()) {
  24.                                                         Db.BlockTableRecord btr2 = tr.GetObject(id, Db.OpenMode.ForRead)
  25.                                                                 as Db.BlockTableRecord;
  26.                                                         foreach (Db.ObjectId id2 in btr2.GetBlockReferenceIds(false, false)) {
  27.                                                                 result.Add(id2);
  28.                                                         }
  29. #if DEBUG
  30.                                                         ed.WriteMessage("Количество вхождений блока {0}: {1}\n", btr2.Name,
  31.                                                                 btr2.GetBlockReferenceIds(false, false).Count);
  32. #endif
  33.                                                 }
  34. #if DEBUG
  35.                                                 ed.WriteMessage("Общее количество вхождений: {0}\n", result.Count);
  36. #endif
  37.                                         }
  38.  
  39.                                         tr.Commit();
  40.                                 }
Название: Re: Имя вхождения блока
Отправлено: Николай Коломоец от 28-02-2014, 18:13:11
Да, Александр! Оно и есть. Большое спасибо, это мне пригодится и во многих других программах!!!
Название: Re: Имя вхождения блока
Отправлено: Николай Коломоец от 28-02-2014, 18:15:28
Андрей, верно. То динамический блок штампа, вставленный на разных листах. Собственно, его нужно было найти и заполнить значение атрибута "номер листа"  :)
Справился, с общей помощью. Спасибо!
Название: Re: Имя вхождения блока
Отправлено: Андрей Бушман от 28-02-2014, 18:17:25
Я удалил выше свой ответ, т.к. когда его размещал, не заметил, что А.Н. Ривилис уже опубликовал :)
Название: Re: Имя вхождения блока
Отправлено: Александр Ривилис от 28-02-2014, 22:01:40
Я удалил выше свой ответ, т.к. когда его размещал, не заметил, что А.Н. Ривилис уже опубликовал :)
Зря. Как раз твой код очень помог бы Николаю найти все вхождения блока штампа.
P.S.: Возможность удаления своих сообщений и тем я убрал. Сообщение восстановил.
Название: Re: Имя вхождения блока
Отправлено: Матвей от 27-03-2018, 16:29:18
Здравствуйте, подскажите есть ли аналог
http://adn-cis.org/opredelenie-imeni-bloka-po-vstavke-bloka.html
на LISP?

Название: Re: Имя вхождения блока
Отправлено: Александр Ривилис от 27-03-2018, 16:36:17
Здравствуйте, подскажите есть ли аналог
http://adn-cis.org/opredelenie-imeni-bloka-po-vstavke-bloka.html
на LISP?


Посмотри здесь: http://www.lee-mac.com/effectivename.html
Название: Re: Имя вхождения блока
Отправлено: Матвей от 27-03-2018, 16:46:52
Спасибо