|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
C# .net переопределение динамического блока из внешнего файла
Санкт-Петербург
Регистрация: 16.08.2006
Сообщений: 508
|
||
Просмотров: 16630
|
|
||||
1. Не обязательно открывать "эталонный чертеж" как документ. Достаточно открыть только базу:
Код:
Последний раз редактировалось Александр Ривилис, 05.10.2011 в 13:18. |
||||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
Александр Ривилис, спасибо, напрямую к базе обращаться гораздо лучше. А вот про SendStringToExecute - я бы хотел сделать это вообще без отправки команд в ком. строку, собственно, мой вопрос в основном в этом и заключается (BlockReference.ResetBlock, судя по описанию тут не подойдёт, если помнить, что это динамический блок?).
Олег (jr.), твой код решает другую задачу. Мне надо обновить существующий блок (с этим справился), а самый главный вопрос - как обновить отображение уже вставленных вхождений блока. Напомню, блок динамический. По жизни, это можно сделать через Design Center, выбрав нужный блок в другом файле и указав ему "Redefine only", но после этого опять же надо сделать attsync, что бы динамические элементы и атрибуты обновились в соответствии с новым описанием блока. |
|||
![]() |
|
||||
AutoCAD Регистрация: 26.07.2007
Москва
Сообщений: 1,064
|
Цитата:
Пока остановился на варианте из 3 поста, тут: http://www.caduser.ru/forum/index.ph...D=49&TID=49224 Короче, вставляю новые блоки на место существующих. |
|||
![]() |
|
||||
Регистрация: 21.02.2009
Сообщений: 825
|
А чем не устроила подшивка? Взяв её за основу, можно с помощью программерства "приделать" те функции, которые нужны. Сам так и сделал. В том числе изменение рамок, автоподпись, проставление "ИЗМов", и т.п.
P.S. Тоже остановился на Код:
__________________
Я-проектировщик бывший проектировщик! Последний раз редактировалось Сергей Богатов, 05.10.2011 в 14:50. |
|||
![]() |
|
||||
Плохое решение.
Другой вариант решения: Написать метод расширения static void AttSync(this BlockTableRecord btr, bool setAttDefValues, bool removeSuperfluous). Второй параметр указывает на то, следует ли во вхождениях блока перезаписать текущие значения AttributeReference на значения по умолчанию. Третий - следует ли удалять те AttributeReference, которых нет в определении блока. Алгоритм работы следующий: 1. На основе определения блока получаем все его вхождения блоков. 2. Для каждого AttributeDefinition в определении блока проверяю наличие соответствующего ему AttributeReference (в каждом его вхождении блока). 2.1. Если параметр setAttDefValues равен true - перезаписываем значения всех AttributeReference 2.2. Если параметр removeSuperfluous равен true - удаляем все те AttributeReference, для которых отсутствует AttributeDefinition в определении блока. имхо. п.с. Если у кого есть предложения по расширению обозначенного мною выше функционала - я с интересом выслушаю их. Более того - я сам напишу этот метод и выложу его код.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 05.10.2011 в 17:12. |
||||
![]() |
|
||||
Регистрация: 21.02.2009
Сообщений: 825
|
Цитата:
![]() ![]()
__________________
Я-проектировщик бывший проектировщик! |
|||
![]() |
|
||||
Использовать SendCommand нужно с большой осторожностью, иначе это может вылезти боком. По возможности его вообще нужно избегать и прибегать к его помощи только тогда, когда не найдёшь альтернативы.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
AutoCAD Регистрация: 26.07.2007
Москва
Сообщений: 1,064
|
У нас листами никто не пользуется. И не собирается. Есть готовые проекты (файлы dwg с чертежами в модели), которые берутся за основу для новых проектов.
Я одно время делал подшивки для новых проектов. А сейчас мне надоело. Сделаю "свое колесо" а-ля "подшивка". Может получится и приживется. Наверно можно было делать поверх подшивки, но мне показалось, что легче сделать "по-простому". |
|||
![]() |
|
||||
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,843
|
А сколько у тебя их готовых, просто если есть не "узкоспециализировавнные", может завернешь в LispFunction и выложешь под основные версии (типа HwdPowerPack.dll)
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 571
|
Цитата:
__________________
cadtools |
|||
![]() |
|
||||
Цитата:
Писать lisp-функции на .net я пока не планирую, т.к. во первых - мне это не интересно (я на лиспе не пишу, а значит мне это не понадобится), а во вторых - работы полно. Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
AutoCAD Регистрация: 26.07.2007
Москва
Сообщений: 1,064
|
Цитата:
Цитата:
А автоматизация мне интересна, я лучше ей позанимаюсь. Цитата:
Но если получится обновить геометрию и атрибуты без создания нового вхождения блока (замены вхожд.блока), тогда думаю дин.параметры можно не проверять. И учесть, что при выполнении BlockReference.ResetBlock(), который может помочь при обновлении геометрии блока, сбрасывает дин.параметры в начальное положение. Геометрию нужно обновлять, т.к. при копировании определения блока из другого чертежа с помощью WblockCloneObjects, геометрия вхождений этого бока не обновляется (тоже самое с атрибутами, и с дин.параметрами(не уверен)). Последний раз редактировалось Vildar, 05.10.2011 в 19:47. |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 571
|
Был блок A c атрибутами A1 (знач. по умолчанию "xxx"), A2 (знач. по умолчанию "yyy") и дин. параметром D1 (знач. по умолчанию 50, пусть это лин. параметр расстояние). На чертеже имелось 2 вхождения блока A. В первом вхождении A1 имел значение "Вася", A2 - "Петя", дин.параметр D1 был равен 100, во втором вхождении A1 - "Оля", A2 - "Катя", D1 = 200. Обновляем блок. Теперь у нас в описании блока A один атрибут A1 и один дин. параметр D1, A2 нет. После применения некого метода static void AttSync(this BlockTableRecord btr, bool setAttDefValues, bool removeSuperfluous, bool setDynParamValue) обновляем вхождения и кроме значений атрибута A1 в первом вхождении D1 остается равен 100, а во втором 200
__________________
cadtools |
|||
![]() |
|
||||
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 571
|
Наверное Вы правы, но раз уж есть bool setAttDefValues и можно сбрасывать атрибуты в умолчательные значения, то почему бы не быть и bool setDynParamValue, а там как надо с такими значениями и вызывать static void AttSync
__________________
cadtools |
|||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Нужна функция импорта блока из файла | Krieger | Программирование | 20 | 18.01.2017 07:19 |
Странное поведение динамического блока высотной отметки | hwd | Динамические блоки | 12 | 08.09.2011 11:15 |
Повторное создание вхождения блока из внешнего файла | hwd | AutoCAD | 6 | 02.04.2010 16:16 |
Как перенести в чертеж блок из файла библиотеки блоков | Main Urod | Программирование | 8 | 03.02.2010 14:15 |
Обновление/замена блока с таким же именем из другого файла. | Pesec | AutoCAD | 2 | 11.11.2009 19:33 |