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

ADN Club => AutoCAD .NET API => Тема начата: Alex от 03-01-2014, 20:32:41

Название: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 03-01-2014, 20:32:41
Мне необходимо отобразить на плане множество практически одинаковых объектов.
При этом потом пользователь должен иметь возможность выбрать произвольный объект и, например, изменить его свойства.
Я решил упростить себе жизнь и добавлять все эти объекты в виде блоков (я создаю один блок, а потом просто размещаю в нужных местах его экземпляры).
Однако здесь у меня вылезла проблема: каждый такой объект сопровождается подписью на выноске, и длина этой подписи каждый раз разная. Хотелось бы длину выноски "обрезать" по длине подписи.
Чтобы сделать такую вещь, мне придется создавать динамические блоки? Или можно как-то в каждом экземпляре блока установить разную длину выноски?
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 03-01-2014, 20:58:32
Чтобы сделать такую вещь, мне придется создавать динамические блоки?
Да.
Или можно как-то в каждом экземпляре блока установить разную длину выноски?
Только если этот блок динамический. Если блок статический все его экземпляры одинаковы.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 04-01-2014, 20:03:51
Насколько я понял из ответов на официальном форуме (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 я не могу, да?
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 04-01-2014, 20:07:01
создать динамический блок с помощью .NET API я не могу, да?
Да. Создать динамический блок можно только "вручную", средствами AutoCAD. Нет ни одного публичного API (а не только .NET API) для создания динамических блоков. Так что единственный способ - создать блоки вручную и вставлять/модифицировать их используя .NET API.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 04-01-2014, 20:26:48
Ясно, спасибо.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Алексей Кулик от 05-01-2014, 00:10:17
Достаточно давно на theswamp.org была тема, где люди пытались создавать динамические блоки (использовался lisp). К сожалению, точной ссылки подсказать не могу (да и корректность решения оценить я тоже не в силах), этим вопросом в свое время озадачивался Евгений Елпанов.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 05-01-2014, 00:44:23
Леша. Ты наверное про это: http://autolisp.ru/2011/11/28/create-dynblock/ и это: http://www.private.peterlink.ru/poleshchuk/cad/2009/tainypod08.htm - тупиковые ветки.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Алексей Кулик от 05-01-2014, 00:48:07
Именно. :) Дожил, я свой сайт уже не помню - что там было, а чего там не было :))
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 12:03:51
И еще один вопрос сюда же.
Я сначала думал уйти от блоков к группам, а потом решил - может быть, стоит оставить статические блоки, просто на каждый объект создавать свой статический блок?
Насколько это плохо, если в документе будет, скажем, 1000 статических блоков? Намного ли лучше сделать вместо этого 1000 групп?
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 06-01-2014, 17:33:26
Насколько это плохо, если в документе будет, скажем, 1000 статических блоков?
Ничего страшного - это не критическое значение.
Намного ли лучше сделать вместо этого 1000 групп?
Лучше только в том, что легче редактировать, но хуже в том, что возникнут проблемы при ручном копировании в другой чертеж (в другом чертеже "это" уже не будет группой).
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 17:38:58
Ну, тогда создам мильон статических блоков.
За Индию! Да здравствует быдлокод!  ;D
---
Этот вопрос вроде исчерпан, спасибо Вам за ответы.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 06-01-2014, 17:41:58
Ну, тогда создам мильон статических блоков.
А вот это уже будет перебором.

Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 17:52:48
Да нет, я уточнил у заказчика - на одном чертеже их должно быть около тысячи. Надеюсь, это не вызовет принципиальных проблем.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 06-01-2014, 17:56:03
Если не планируется редактировать эти блоки средствами AutoCAD, то я бы рекомендовал делать их "неименованными" - тогда их не будет видно в списке блоков и они не будут путаться с "нормальными" блоками.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 18:25:34
А о таком варианте я как-то и не подумал. Надо попробовать, спасибо.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Дмитрий Загорулькин от 06-01-2014, 22:10:09
А вариант использования стандартного автокадовского объекта "мультивыноска" рассматривали? Не подходит?
Из своей практики: приходилось разгребать такие чертежи с кучей блоков. Получается, что смысла в них никакого - чертеж "весит" больше, чем тот же самый, но со взорванными такими блоками. Взрывал, пуржил. В результате, чертеж мог "полегчать" на 5-10 Мб.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 22:25:14
Скажу честно: понятия не имею, как этим пользоваться.
В принципе, сам блок как таковой мне нужен по двум причинам:
- возможность добавлять атрибуты;
- возможность группировать несколько примитивов в единое целое, чтобы при необходимости, скажем, удалить целиком весь объект или перетащить его в другое место.
Мне нужно сделать выноску с двумя линиями текста: над линией выноски и под ней. При этом сам текст я оформляю в виде атрибутов (мне потом нужно работать с блоками, используя эти данные).
Можно ли, используя мультивыноску, для разных экземпляров статического блока задать разные длины этой мультивыноски?
После поисков я наткнулся на динамические блоки, которые позволяют это сделать - но динамические блоки я не могу создавать с помощью .NET API...
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 06-01-2014, 22:26:22
Из своей практики: приходилось разгребать такие чертежи с кучей блоков. Получается, что смысла в них никакого - чертеж "весит" больше, чем тот же самый, но со взорванными такими блоками.
Это если есть описание блока, но нет самой вставки блока (особенно актуально с динамическими блоками). Тогда же, когда "одно описание блока - одна вставка блока" конечно тоже будет лишний объём, но он не настолько значителен.

Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 06-01-2014, 22:28:01
Можно ли, используя мультивыноску, для разных экземпляров статического блока задать разные длины этой мультивыноски?
Нет.
После поисков я наткнулся на динамические блоки, которые позволяют это сделать - но динамические блоки я не могу создавать с помощью .NET API...
Я так и не понял зачем их тебе создавать средствами .NET API. Может быть достаточно их вставлять и модифицировать?
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 22:41:12
А откуда загружать само определение динамического блока? Вместе с dll'кой еще и файл с этим блоком поставлять? Не очень удобно, ИМХО... Запихнуть как ресурс в саму dll'ку? Что-то сложно звучит.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Алексей Кулик от 06-01-2014, 22:43:44
Может быть, скажу глупость, но: кто мешает создать блок, состоящий из MTEXT (возможно, с атрибутами) и использовать этот блок в качестве аннотации к MLEADER / QLEADER ?
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 06-01-2014, 22:46:01
Вместе с dll'кой еще и файл с этим блоком поставлять? Не очень удобно, ИМХО...
Это самый стандартный способ. Вообще-то поставлять один dll-файл - это моветон. Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
Запихнуть как ресурс в саму dll'ку? Что-то сложно звучит.
Всё это намного проще, чем плодить тысячи блоков. Главное убедиться, что можно обойтись одним динамическим блоком...
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 23:04:12
2 Алексей Кулик: К сожалению, я с ходу не смог осознать Ваше предложение.
Я в блоках-то пока путаюсь, а как можно блок использовать в качестве аннотации - сие для меня вообще есть темный лес...(
...
2 Александр Ривилис:
Цитировать
Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
УУУУУУУУУУУУУУУ :(
Пойду тогда курить динамические блоки. Где-то, помнится, находил я примеры вставки этих блоков из файла.
Вообще говоря, жаль. Как раз более-менее с анонимными блоками начало получаться...
А обойтись таки можно, да. Объекты достаточно примитивные.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 06-01-2014, 23:07:46
Пойду тогда курить динамические блоки. Где-то, помнится, находил я примеры вставки этих блоков из файла.
Наверное здесь: Динамически блоки с операцией Растянуть (Stretch) (http://adn-cis.org/dinamicheski-bloki-s-operacziej-rastyanut-%28stretch%29.html)
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 06-01-2014, 23:12:43
Спасибо, буду переделывать.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Алексей Кулик от 06-01-2014, 23:54:58
Alex, если использовать COM-модель, то получается примерно такая последовательность:
1. Создается блок (возможно, анонимный)
2. Внутри блока создается многострочный текст (возможно, с принудительным форматированием)
3. Добавляются атрибуты и их значения
4. Создается выноска (мульти- или обычная - дело шестнадцатое). При создании выноски в качестве аннотации указывается использовать блок.

Конечно, тут не все так радужно, как хотелось бы:
- требуется учитывать базовую точку вставки блока;
- требуется учитывать вариант немировой системы координат;
- требуется учитывать, что для различных вариантов выравнивания выноски придется использовать различные варианты выравнивания блока и его состава (т.е. по идее - использовать тот самый динамический блок).

P.S. У меня подобные задачи ни разу не вставали, поэтому половина рецептов, которые я выдаю, надо проверять и перепроверять :(
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Alex от 07-01-2014, 00:13:08
Я, наверное, все же попробую уйти в динамические блоки. Как верно мне заметили, установщик-то все равно потребуется.)
Вариант с выноской надо, конечно, попробовать - но я не уверен, что в данном случае блок и выноска будут единым объектом. А мне хотелось бы как раз поиметь возможность разом/махом все удалять/перемещать.
Но в любом случае, спасибо за совет!
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Алексей Кулик от 07-01-2014, 00:43:04
Ну, тут можно просто попробовать работу выноски и аннотации (достаточно даже созданной руками).
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Дмитрий Загорулькин от 07-01-2014, 01:41:37
конечно тоже будет лишний объём, но он не настолько значителен
Это была топографическая съемка протяженного участка дороги в одном файле. Каждый топознак - анонимный блок. Скорее всего это был продукт экспорта из "вертикалки" автокада или какого-то другого специализированного ПО.  Количество таких блоков там было несколько сотен тысяч.
Если блоков немного, то, наверное, ничего страшного. Но я бы так делать не стал - не нравится мне это очень, потому что работать потом с этими блоками обычному пользователю будет очень неудобно. Хотя, если не планируется ручная доводка чертежа после программы, то может это и не страшно... В общем, предупрежден - вооружен, а какой путь выбрать - думайте сами по обстоятельствам.
Вот вариант с внешней библиотекой блоков мне нравится, я такой подход уже использовал. Хороший метод вставки описания блока из библиотеки я находил на сайте Андрея Бушмана: https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/blockdefinitionsimport
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Андрей Бушман от 07-01-2014, 21:15:41
Вообще-то поставлять один dll-файл - это моветон. Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
Инсталлятор - это конечно хорошо, однако для того, чтобы  "распихать всё по каталогам" инсталлятор не обязателен - это автоматом может сделать и сама dll-ка, при условии, что прав юзера хватит на работу с подлежащими модификации каталогами.

Решение о том, стоит ли добавлять плагин в автозагрузку, должен принимать пользователь, но никак не программист (второй вариант - это как раз тот самый "моветон" и есть). Крайне желательно, чтобы пользователь имел возможность включать\отключать автозагрузку плагина по своему усмотрению. При этом не следует забывать, что порой администраторы блокируют запуск regedit.exe для рядовых юзеров, а пользоваться reg.exe умеют далеко не все, точнее - почти никто не умеет (как показывает практика).

В свете оного, реализация плагина (если программист пишет код действительно для пользователя, а не "для себя") должна предоставлять этому пользователю удобную возможность включать\отключать свою автозагрузку без необходимости лезть в реестр и править его вручную. Сие легко реализуется при желании, но практика показывает, что это почти никогда не реализовывается программистами.

Более того, плагины некоторых программистов каждый раз принудительно, вопреки желанию юзера, прописывают себя в автозагрузку при очередной своей загрузке в AutoCAD, тем самым ставя себя выше юзера. Вот это воистину МОВЕТОН... Аминь.
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Александр Ривилис от 07-01-2014, 21:20:06
Вот это воистину МОВЕТОН... Аминь
С Рождеством, Андрюша!  :D
Название: Re: Разные длины выноски в разных экземплярах блока
Отправлено: Андрей Бушман от 07-01-2014, 21:26:34
С Рождеством, Андрюша!  :D
Взаимно.