Имя вхождения блока

Автор Тема: Имя вхождения блока  (Прочитано 8811 раз)

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

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Имя вхождения блока
« : 28-02-2014, 17:47:26 »
Есть функция поиска вхождения блока с известным именем в файле.
В конкретном случае не сработало, при отладке обнаружил, что пользователь вставил этот блок руцями (ctrl+V), в итоге в диспетчере свойств имя блока верное (напр., А), но BlockReference.Name выдает что-то вроде "*U568". Как заставить программу увидеть имя "А"?
Заставить всех никогда не пользоваться ctrl+v нереально, сильно уж привычно всем  ::)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Имя вхождения блока
« Ответ #2 : 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.                                 }

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Re: Имя вхождения блока
« Ответ #3 : 28-02-2014, 18:13:11 »
Да, Александр! Оно и есть. Большое спасибо, это мне пригодится и во многих других программах!!!

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Re: Имя вхождения блока
« Ответ #4 : 28-02-2014, 18:15:28 »
Андрей, верно. То динамический блок штампа, вставленный на разных листах. Собственно, его нужно было найти и заполнить значение атрибута "номер листа"  :)
Справился, с общей помощью. Спасибо!

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Имя вхождения блока
« Ответ #5 : 28-02-2014, 18:17:25 »
Я удалил выше свой ответ, т.к. когда его размещал, не заметил, что А.Н. Ривилис уже опубликовал :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Имя вхождения блока
« Ответ #6 : 28-02-2014, 22:01:40 »
Я удалил выше свой ответ, т.к. когда его размещал, не заметил, что А.Н. Ривилис уже опубликовал :)
Зря. Как раз твой код очень помог бы Николаю найти все вхождения блока штампа.
P.S.: Возможность удаления своих сообщений и тем я убрал. Сообщение восстановил.
« Последнее редактирование: 28-02-2014, 22:38:49 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Матвей

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Re: Имя вхождения блока
« Ответ #7 : 27-03-2018, 16:29:18 »
Здравствуйте, подскажите есть ли аналог
http://adn-cis.org/opredelenie-imeni-bloka-po-vstavke-bloka.html
на LISP?


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Имя вхождения блока
« Ответ #8 : 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
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Матвей

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Re: Имя вхождения блока
« Ответ #9 : 27-03-2018, 16:46:52 »
Спасибо