| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программная замена атрибута блока в таблице. Возможно ?

Программная замена атрибута блока в таблице. Возможно ?

Ответ
Поиск в этой теме
Непрочитано 14.04.2017, 07:07 #1
Программная замена атрибута блока в таблице. Возможно ?
baksconstructor
 
Регистрация: 05.11.2014
Сообщений: 978

Собственно вопрос прост - есть таблица, в ячейки таблицы вставлены блоки, но у блоков есть видимые атрибуты. Соответственно эти атрибуты отображаются.
Необходимо изменить значение атрибута на другое, но каким методом это возможно не понят но т.к. он внутри таблицы.
Может есть или лисп или vba для замены ?
Пример в приложении ( в первой строке нужно сделать значение атрибута вместо "DD25" на "УУ38").

Вложения
Тип файла: dwg
DWG 2010
Table.dwg (66.5 Кб, 15 просмотров)

Просмотров: 10617
 
Непрочитано 14.04.2017, 07:58
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


А в чем сложность то или я не совсем понял задачу...

(Autocad 2017)
Boxa вне форума  
 
Автор темы   Непрочитано 14.04.2017, 08:00
#3
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


Цитата:
Сообщение от Boxa Посмотреть сообщение
или я не совсем понял задачу...
не руками надо
baksconstructor вне форума  
 
Непрочитано 14.04.2017, 09:15
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Может есть или лисп или vba для замены ?
Bfind решает вопрос. Только пользоваться надо осторожно, т.к. в нем есть средства "массового поражения" - замены текста во многих чертежах сразу, в т.ч. не открытых в Акаде, а просто находящихся в указанной папке. И какого-то лысого эта опция включена по умолчанию Чуть не запорол множество чертежей
Следите за галочками настроек!
kp+ вне форума  
 
Непрочитано 14.04.2017, 14:49
#5
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


baksconstructor, получить ENAME вхождения блока внутри ячейки таблицы можно так:
Код:
[Выделить все]
(car (last (nentsel)))
А заменить значение атрибута может вот этот код.
skkkk вне форума  
 
Автор темы   Непрочитано 14.04.2017, 15:02
#6
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


Цитата:
Сообщение от kp+ Посмотреть сообщение
Bfind решает вопрос.
Не... мне надо в разных файлах много раз менять.
Цитата:
Сообщение от skkkk Посмотреть сообщение
А заменить значение атрибута может вот этот код.
Спасибо, поковыряю, но скорее всего для моих познаний в программировании это означает что нельзя
baksconstructor вне форума  
 
Непрочитано 14.04.2017, 15:12
#7
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


baksconstructor, я могу "собрать" в команду, нужно только бы уточнить ТЗ.
Предполагаемый алгоритм:
1. Запускаем команду.
2. Запрос "Выберите блок в таблице".
3. Появляется список его атрибутов (вопрос только в виде имен тегов или их значений?). Либо нужно менять всегда один и тот же атрибут? Тогда этот лишний запрос можно убрать, жестко прописав этот атрибут в коде.
4. Вводится новое значение с клавиатуры.
5. Значение атрибута заменяется.
6. baksconstructor доволен.
Прошу внести коррективы
skkkk вне форума  
 
Автор темы   Непрочитано 14.04.2017, 15:27
#8
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


skkkk сейчас согласовал и упростил цель.
ТЗ:
1. Запускаем команду
2. Запрос выбора таблицы, выбрали
3. В таблице у всех блоков в всех или видимых атрибутах меняет содержимое на = "" , (во всей таблице у всех или видимых атрибутов не будет содержимого)
4. Всё.
Избавляемся от всех подсказок вокруг блока в ячейке таблицы.
Суть в том что приходят таблицы с блоками, но некоторые атрибуты не верны, чтобы не искать не тратить время на замену решено вообще избавится от этих атрибутов (нам оно особо не нужно).
5. baksconstructor доволен.
baksconstructor вне форума  
 
Автор темы   Непрочитано 14.04.2017, 15:32
#9
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


Для проверки - файл с таблицей (сами видите - атрибуты не нужны)
Просто разработчик основной проги которое это генерирует не знает как на vba это сделать.
Вложения
Тип файла: dwg
DWG 2010
Проверка.dwg (223.5 Кб, 18 просмотров)
baksconstructor вне форума  
 
Непрочитано 14.04.2017, 16:31
#10
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Не... мне надо в разных файлах много раз менять.
Так в том же Bfind просто добавь воды выставьте галочку массовой замены по многим файлам
kp+ вне форума  
 
Непрочитано 14.04.2017, 16:36
#11
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
файл с таблицей (сами видите - атрибуты не нужны)
Ну это как посмотреть... Точно ли не нужны атрибуты, которые внутри окружностей, например, у манометра показывающего или расходомера ультазвукового (там, правда, есть еще два мтекста)? Если так, то термометр и манометр будут в таблице одинаковыми. Полагаю, что будут исключения. Или ключевой момент тут в этом
Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Избавляемся от всех подсказок вокруг блока в ячейке таблицы.
?
Проверка на то, находится ли атрибут внутри геометрии блока или снаружи - та еще заморочка. Может, введем список исключений? Как то: TG1, PG1... Его можно будет дополнять в коде по мене надобности.
Цитата:
Сообщение от baksconstructor Посмотреть сообщение
упростил цель
Это тоже - как посмотреть . Для юзера, может и стало казаться проще, но для программиста... Просто я пока не знаю, как получить список всех блоков таблицы, но раз уж назвался груздем, то в кузовок слажу. Только уже тогда не факт, что успею сегодня скодить.

----- добавлено через ~19 мин. -----
kp+, думаю, что во всем чертеже (иди даже всей модели) не нужно менять все блоки. Убрать атрибуты надо только в условных обозначениях, а в самом-то чертеже они нужны. А Lee Mac почему-то не предусмотрел вариант выбора области чертежа или объектов, в которых производить замену -только весь чертеж, модель и листы. И как оказалось, внутри таблицы он почему-то атрибуты не заменил. Только у блоков, вставленных в модель.
skkkk вне форума  
 
Непрочитано 14.04.2017, 17:39
#12
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от skkkk Посмотреть сообщение
Убрать атрибуты
Зачем убрать? Я, может, невнимательно читал, но поначалу у ТС задача была "заменить в атрибутах блоков таблицы УГО одни надписи на другие". Причем основным критерием поиска должно было быть содержание надписи, а не принадлежность к блоку внутри таблицы (иначе базовая команда _find справилась бы).
Цитата:
Сообщение от skkkk Посмотреть сообщение
И как оказалось, внутри таблицы он почему-то атрибуты не заменил.
Не знаю, у меня все получилось. Если что, у меня базовый Акад 2010х86.
Цитата:
Сообщение от skkkk Посмотреть сообщение
не нужно менять все блоки. Убрать атрибуты надо только в условных обозначениях, а в самом-то чертеже они нужны. А Lee Mac почему-то не предусмотрел вариант выбора области чертежа или объектов, в которых производить замену -только весь чертеж, модель и листы.
Можно выкрутиться. В опциях есть настройка "не трогать заблокированные слои". Если поместить таблицу УГО в отдельный слой (а часто так и делают) и "изолировать" его (т.е. заблокировать остальные) - все получится.
kp+ вне форума  
 
Непрочитано 14.04.2017, 18:14
#13
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от kp+ Посмотреть сообщение
Зачем убрать?
Не так выразился. Имел в виду стереть содержимое.
Цитата:
Сообщение от kp+ Посмотреть сообщение
Не знаю, у меня все получилось. Если что, у меня базовый Акад 2010х86.
У меня почему-то нет. AutoCAD 2011х64. Хотя я вроде понял, почему. Если поставить галочку "Block Definitions" в настойках, то да - срабатывает, но стирается содержимое атрибутов в описании блока, соответственно, на чертеже все блоки тоже идут под замес. Если снимаю эту галочку, а оставляю только атрибуты блоков, то меняется лишь в модели, в таблице - нет. Или я что-то не то делаю? Вроде других вариантов в настройках не нашлось.
Цитата:
Сообщение от kp+ Посмотреть сообщение
Можно выкрутиться
Можно еще скопипастить таблицу в новый (лучше пустой) файл, и препарировать ее там, затем вернуть. Но вот получится ли изменить только атрибуты в блоках таблицы? Потому что иначе в возвращенной таблице изменений не будет.
skkkk вне форума  
 
Непрочитано 14.04.2017, 19:21
#14
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Просто разработчик основной проги которое это генерирует не знает как на vba это сделать.
Уточняю в VB6
Цитата:
Сообщение от skkkk Посмотреть сообщение
Точно ли не нужны атрибуты, которые внутри окружностей, например, у манометра показывающего или расходомера ультазвукового (там, правда, есть еще два мтекста)? Если так, то термометр и манометр будут в таблице одинаковыми.
Согласен полностью , но у кранов "КШ1" считаем лишним.
Цитата:
Сообщение от kp+ Посмотреть сообщение
Я, может, невнимательно читал, но поначалу у ТС задача была "заменить в атрибутах блоков таблицы УГО одни надписи на другие"
Зная заочно автора темы - походу он и хотел туда пробел вписать.

Короче блоки вставляются при помощи
Код:
[Выделить все]
objTable.SetBlockTableRecordId i, 0, IDBlokVtablice, False
но при вставке нет возможности изменить атрибуты, да и прицепиться к этому блоку тоже невозможно для дальнейшей обработки.
Что только не делал, получал таблицу, получал блок в ячейке таблицы через
Код:
[Выделить все]
RetVal = object.GetBlockTableRecordId(row, col)
но он выдаёт ID из таблицы блоков и если изменить атрибут , то он изменится во всех блоках.
И тут я сломал голову и оставил как есть.
skkkk глянь темку, может натолкнёт на мысль тема
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Автор темы   Непрочитано 19.04.2017, 09:13
#15
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


skkkk есть подвижки ?
baksconstructor вне форума  
 
Непрочитано 19.04.2017, 11:25
#16
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


baksconstructor, пока нет. Совершил пару набегов, излазил ссылки которые дал maratovich - пока безрезультатно, даже на англоязычных ресурсах глухо. Может, кто из знающих подскажет, куда еще копнуть? Entget выдает только описания блоков, которые содержатся в таблице, а вот их вхождения получить не удается. Было пару бредовых идей. Первая - взрывать таблицу и собирать блоки, но в получающемся наборе объектов после взрыва блоки уже не те, что были в таблице, то есть, собрать их, вернуть таблицу а потом менять атрибуты - не выходит. Вторая - программно "прощупывать кадждую ячейку таблицы с помощью nentselp, но это весьма ненадежный вариант, поскольку велика вероятность того, что в "прощупываемой" точке не окажется ничего из состава блока - при попадании на пустое место в ячейке блок не найдется. Пока лишь могу предложить полумеру - прощелкивать каждый блок в таблице вручную, а программно из него уберутся все атрибуты (кроме, я так понимаю, исключений). Остается надеяться, что наши гении подкинут идейку получше. В общем, я пока не сдался, правда есть сейчас определенный напряг со временем.
skkkk вне форума  
 
Автор темы   Непрочитано 19.04.2017, 11:47
#17
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


Цитата:
Сообщение от skkkk Посмотреть сообщение
Пока лишь могу предложить полумеру - прощелкивать каждый блок в таблице вручную, а программно из него уберутся все атрибуты (кроме, я так понимаю, исключений).
Практически так и делаем, прощелкиваем и тупо стираем атрибут руками.
Ладно, значит нельзя, пускай это на совести Автодеска остаётся будем его вспоминать почаще
baksconstructor вне форума  
 
Непрочитано 19.04.2017, 11:58
#18
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
прощелкиваем и тупо стираем атрибут руками
Так мой вариант вроде получше - надо только щелкнуть блок, а атрибуты затрутся сами. Это сделать легко. Надо?

Цитата:
Сообщение от baksconstructor Посмотреть сообщение
пускай это на совести Автодеска остаётся
Так и вижу, как они там все враз заикали
skkkk вне форума  
 
Автор темы   Непрочитано 19.04.2017, 12:01
#19
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


Цитата:
Сообщение от skkkk Посмотреть сообщение
Это сделать легко. Надо?
Не, спасибо, полной обработки нет, а весь отдел обучать чёго и куда... народ уже привык.
baksconstructor вне форума  
 
Непрочитано 19.04.2017, 13:59
#20
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Код:
[Выделить все]
 (vl-load-com)

(defun table-block-off (table tag-list / adoc row col blk) ;|
*    table     указатель на таблицу
*    tag-list  перечень тэгов атрибутов через запятую. ДОпускается применение масок
|;
  (if (and (setq table (cond ((= (type table) 'vla-object) table)
                             ((= (type table) 'ename) (vlax-ename->vla-object table))
                             ) ;_ end of cond
                 ) ;_ end of setq
           (wcmatch (strcase (vla-get-objectname table)) "*TABLE*")
           ) ;_ end of and
    (progn (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
           (vla-put-regeneratetablesuppressed table :vlax-true)
           (setq tag-list (if tag-list
                            (strcase tag-list)
                            "*"
                            ) ;_ end of if
                 ) ;_ end of setq
           (while (not (minusp (setq row (1- (cond (row)
                                                   (t (vla-get-rows table))
                                                   ) ;_ end of cond
                                             ) ;_ end of 1-
                                     ) ;_ end of setq
                               ) ;_ end of minusp
                       ) ;_ end of not
             (setq col (vla-get-columns table))
             (while (not (minusp (setq col (1- col))))
               (if (= (vla-getcelltype table row col) acblockcell)
                 (progn (setq blk (vla-getblocktablerecordid table row col)
                              blk (if (vlax-method-applicable-p adoc 'objectidtoobject32)
                                    (vla-objectidtoobject32 adoc blk)
                                    (vla-objectidtoobject adoc blk)
                                    ) ;_ end of if
                              ) ;_ end of setq
                        (vlax-for ent blk
                          (if (and (wcmatch (strcase (vla-get-objectname ent)) "*ATTR*")
                                   (wcmatch (strcase (vla-get-tagstring ent)) tag-list)
                                   ) ;_ end of and
                            (vla-put-textstring ent "")
                            ) ;_ end of if
                          ) ;_ end of vlax-for
                        ) ;_ end of progn
                 ) ;_ end of if
               ) ;_ end of while
             ) ;_ end of while
           (vla-put-regeneratetablesuppressed table :vlax-false)
           (vla-update table)
           (vla-endundomark adoc)
           ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Особо не гонял.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программная замена атрибута блока в таблице. Возможно ?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мои динамические блоки [2] Кулик Алексей aka kpblc Динамические блоки 4334 22.04.2019 09:16
Угол поворота атрибута в составе блока rzinnurov AutoCAD 15 18.10.2017 08:08
Дописать префикс/суффикс перед/после значения атрибута блока Liam AutoCAD 7 05.10.2013 23:05
Размер блока по таблице Positron Программирование 5 16.05.2013 01:04
Программная вставка блока с атрибутами в таблицу. Как сохранить установленные значения атрибутов? Кулик Алексей aka kpblc Программирование 8 22.07.2010 15:01