Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Alex от 03-01-2014, 20:32:41
-
Мне необходимо отобразить на плане множество практически одинаковых объектов.
При этом потом пользователь должен иметь возможность выбрать произвольный объект и, например, изменить его свойства.
Я решил упростить себе жизнь и добавлять все эти объекты в виде блоков (я создаю один блок, а потом просто размещаю в нужных местах его экземпляры).
Однако здесь у меня вылезла проблема: каждый такой объект сопровождается подписью на выноске, и длина этой подписи каждый раз разная. Хотелось бы длину выноски "обрезать" по длине подписи.
Чтобы сделать такую вещь, мне придется создавать динамические блоки? Или можно как-то в каждом экземпляре блока установить разную длину выноски?
-
Чтобы сделать такую вещь, мне придется создавать динамические блоки?
Да.
Или можно как-то в каждом экземпляре блока установить разную длину выноски?
Только если этот блок динамический. Если блок статический все его экземпляры одинаковы.
-
Насколько я понял из ответов на официальном форуме (http://forums.autodesk.com/t5/NET/Dynamic-Block-Creation/m-p/3376653/highlight/true#M27768 (http://forums.autodesk.com/t5/NET/Dynamic-Block-Creation/m-p/3376653/highlight/true#M27768)) и в блоге Kean'а (http://through-the-interface.typepad.com/through_the_interface/2009/03/accessing-the-properties-of-a-dynamic-autocad-block-using-net.html (http://through-the-interface.typepad.com/through_the_interface/2009/03/accessing-the-properties-of-a-dynamic-autocad-block-using-net.html)), создать динамический блок с помощью .NET API я не могу, да?
-
создать динамический блок с помощью .NET API я не могу, да?
Да. Создать динамический блок можно только "вручную", средствами AutoCAD. Нет ни одного публичного API (а не только .NET API) для создания динамических блоков. Так что единственный способ - создать блоки вручную и вставлять/модифицировать их используя .NET API.
-
Ясно, спасибо.
-
Достаточно давно на theswamp.org была тема, где люди пытались создавать динамические блоки (использовался lisp). К сожалению, точной ссылки подсказать не могу (да и корректность решения оценить я тоже не в силах), этим вопросом в свое время озадачивался Евгений Елпанов.
-
Леша. Ты наверное про это: http://autolisp.ru/2011/11/28/create-dynblock/ и это: http://www.private.peterlink.ru/poleshchuk/cad/2009/tainypod08.htm - тупиковые ветки.
-
Именно. :) Дожил, я свой сайт уже не помню - что там было, а чего там не было :))
-
И еще один вопрос сюда же.
Я сначала думал уйти от блоков к группам, а потом решил - может быть, стоит оставить статические блоки, просто на каждый объект создавать свой статический блок?
Насколько это плохо, если в документе будет, скажем, 1000 статических блоков? Намного ли лучше сделать вместо этого 1000 групп?
-
Насколько это плохо, если в документе будет, скажем, 1000 статических блоков?
Ничего страшного - это не критическое значение.
Намного ли лучше сделать вместо этого 1000 групп?
Лучше только в том, что легче редактировать, но хуже в том, что возникнут проблемы при ручном копировании в другой чертеж (в другом чертеже "это" уже не будет группой).
-
Ну, тогда создам мильон статических блоков.
За Индию! Да здравствует быдлокод! ;D
---
Этот вопрос вроде исчерпан, спасибо Вам за ответы.
-
Ну, тогда создам мильон статических блоков.
А вот это уже будет перебором.
-
Да нет, я уточнил у заказчика - на одном чертеже их должно быть около тысячи. Надеюсь, это не вызовет принципиальных проблем.
-
Если не планируется редактировать эти блоки средствами AutoCAD, то я бы рекомендовал делать их "неименованными" - тогда их не будет видно в списке блоков и они не будут путаться с "нормальными" блоками.
-
А о таком варианте я как-то и не подумал. Надо попробовать, спасибо.
-
А вариант использования стандартного автокадовского объекта "мультивыноска" рассматривали? Не подходит?
Из своей практики: приходилось разгребать такие чертежи с кучей блоков. Получается, что смысла в них никакого - чертеж "весит" больше, чем тот же самый, но со взорванными такими блоками. Взрывал, пуржил. В результате, чертеж мог "полегчать" на 5-10 Мб.
-
Скажу честно: понятия не имею, как этим пользоваться.
В принципе, сам блок как таковой мне нужен по двум причинам:
- возможность добавлять атрибуты;
- возможность группировать несколько примитивов в единое целое, чтобы при необходимости, скажем, удалить целиком весь объект или перетащить его в другое место.
Мне нужно сделать выноску с двумя линиями текста: над линией выноски и под ней. При этом сам текст я оформляю в виде атрибутов (мне потом нужно работать с блоками, используя эти данные).
Можно ли, используя мультивыноску, для разных экземпляров статического блока задать разные длины этой мультивыноски?
После поисков я наткнулся на динамические блоки, которые позволяют это сделать - но динамические блоки я не могу создавать с помощью .NET API...
-
Из своей практики: приходилось разгребать такие чертежи с кучей блоков. Получается, что смысла в них никакого - чертеж "весит" больше, чем тот же самый, но со взорванными такими блоками.
Это если есть описание блока, но нет самой вставки блока (особенно актуально с динамическими блоками). Тогда же, когда "одно описание блока - одна вставка блока" конечно тоже будет лишний объём, но он не настолько значителен.
-
Можно ли, используя мультивыноску, для разных экземпляров статического блока задать разные длины этой мультивыноски?
Нет. После поисков я наткнулся на динамические блоки, которые позволяют это сделать - но динамические блоки я не могу создавать с помощью .NET API...
Я так и не понял зачем их тебе создавать средствами .NET API. Может быть достаточно их вставлять и модифицировать?
-
А откуда загружать само определение динамического блока? Вместе с dll'кой еще и файл с этим блоком поставлять? Не очень удобно, ИМХО... Запихнуть как ресурс в саму dll'ку? Что-то сложно звучит.
-
Может быть, скажу глупость, но: кто мешает создать блок, состоящий из MTEXT (возможно, с атрибутами) и использовать этот блок в качестве аннотации к MLEADER / QLEADER ?
-
Вместе с dll'кой еще и файл с этим блоком поставлять? Не очень удобно, ИМХО...
Это самый стандартный способ. Вообще-то поставлять один dll-файл - это моветон. Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
Запихнуть как ресурс в саму dll'ку? Что-то сложно звучит.
Всё это намного проще, чем плодить тысячи блоков. Главное убедиться, что можно обойтись одним динамическим блоком...
-
2 Алексей Кулик: К сожалению, я с ходу не смог осознать Ваше предложение.
Я в блоках-то пока путаюсь, а как можно блок использовать в качестве аннотации - сие для меня вообще есть темный лес...(
...
2 Александр Ривилис:
Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
УУУУУУУУУУУУУУУ :(
Пойду тогда курить динамические блоки. Где-то, помнится, находил я примеры вставки этих блоков из файла.
Вообще говоря, жаль. Как раз более-менее с анонимными блоками начало получаться...
А обойтись таки можно, да. Объекты достаточно примитивные.
-
Пойду тогда курить динамические блоки. Где-то, помнится, находил я примеры вставки этих блоков из файла.
Наверное здесь: Динамически блоки с операцией Растянуть (Stretch) (http://adn-cis.org/dinamicheski-bloki-s-operacziej-rastyanut-%28stretch%29.html)
-
Спасибо, буду переделывать.
-
Alex, если использовать COM-модель, то получается примерно такая последовательность:
1. Создается блок (возможно, анонимный)
2. Внутри блока создается многострочный текст (возможно, с принудительным форматированием)
3. Добавляются атрибуты и их значения
4. Создается выноска (мульти- или обычная - дело шестнадцатое). При создании выноски в качестве аннотации указывается использовать блок.
Конечно, тут не все так радужно, как хотелось бы:
- требуется учитывать базовую точку вставки блока;
- требуется учитывать вариант немировой системы координат;
- требуется учитывать, что для различных вариантов выравнивания выноски придется использовать различные варианты выравнивания блока и его состава (т.е. по идее - использовать тот самый динамический блок).
P.S. У меня подобные задачи ни разу не вставали, поэтому половина рецептов, которые я выдаю, надо проверять и перепроверять :(
-
Я, наверное, все же попробую уйти в динамические блоки. Как верно мне заметили, установщик-то все равно потребуется.)
Вариант с выноской надо, конечно, попробовать - но я не уверен, что в данном случае блок и выноска будут единым объектом. А мне хотелось бы как раз поиметь возможность разом/махом все удалять/перемещать.
Но в любом случае, спасибо за совет!
-
Ну, тут можно просто попробовать работу выноски и аннотации (достаточно даже созданной руками).
-
конечно тоже будет лишний объём, но он не настолько значителен
Это была топографическая съемка протяженного участка дороги в одном файле. Каждый топознак - анонимный блок. Скорее всего это был продукт экспорта из "вертикалки" автокада или какого-то другого специализированного ПО. Количество таких блоков там было несколько сотен тысяч.
Если блоков немного, то, наверное, ничего страшного. Но я бы так делать не стал - не нравится мне это очень, потому что работать потом с этими блоками обычному пользователю будет очень неудобно. Хотя, если не планируется ручная доводка чертежа после программы, то может это и не страшно... В общем, предупрежден - вооружен, а какой путь выбрать - думайте сами по обстоятельствам.
Вот вариант с внешней библиотекой блоков мне нравится, я такой подход уже использовал. Хороший метод вставки описания блока из библиотеки я находил на сайте Андрея Бушмана: https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/blockdefinitionsimport
-
Вообще-то поставлять один dll-файл - это моветон. Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
Инсталлятор - это конечно хорошо, однако для того, чтобы "распихать всё по каталогам" инсталлятор не обязателен - это автоматом может сделать и сама dll-ка, при условии, что прав юзера хватит на работу с подлежащими модификации каталогами.
Решение о том, стоит ли добавлять плагин в автозагрузку, должен принимать пользователь, но никак не программист (второй вариант - это как раз тот самый "моветон" и есть). Крайне желательно, чтобы пользователь имел возможность включать\отключать автозагрузку плагина по своему усмотрению. При этом не следует забывать, что порой администраторы блокируют запуск regedit.exe для рядовых юзеров, а пользоваться reg.exe умеют далеко не все, точнее - почти никто не умеет (как показывает практика).
В свете оного, реализация плагина (если программист пишет код действительно для пользователя, а не "для себя") должна предоставлять этому пользователю удобную возможность включать\отключать свою автозагрузку без необходимости лезть в реестр и править его вручную. Сие легко реализуется при желании, но практика показывает, что это почти никогда не реализовывается программистами.
Более того, плагины некоторых программистов каждый раз принудительно, вопреки желанию юзера, прописывают себя в автозагрузку при очередной своей загрузке в AutoCAD, тем самым ставя себя выше юзера. Вот это воистину МОВЕТОН... Аминь.
-
Вот это воистину МОВЕТОН... Аминь
С Рождеством, Андрюша! :D
-
С Рождеством, Андрюша! :D
Взаимно.