Разные длины выноски в разных экземплярах блока

Автор Тема: Разные длины выноски в разных экземплярах блока  (Прочитано 11846 раз)

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

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Мне необходимо отобразить на плане множество практически одинаковых объектов.
При этом потом пользователь должен иметь возможность выбрать произвольный объект и, например, изменить его свойства.
Я решил упростить себе жизнь и добавлять все эти объекты в виде блоков (я создаю один блок, а потом просто размещаю в нужных местах его экземпляры).
Однако здесь у меня вылезла проблема: каждый такой объект сопровождается подписью на выноске, и длина этой подписи каждый раз разная. Хотелось бы длину выноски "обрезать" по длине подписи.
Чтобы сделать такую вещь, мне придется создавать динамические блоки? Или можно как-то в каждом экземпляре блока установить разную длину выноски?

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Чтобы сделать такую вещь, мне придется создавать динамические блоки?
Да.
Или можно как-то в каждом экземпляре блока установить разную длину выноски?
Только если этот блок динамический. Если блок статический все его экземпляры одинаковы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Насколько я понял из ответов на официальном форуме (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), создать динамический блок с помощью .NET API я не могу, да?

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
создать динамический блок с помощью .NET API я не могу, да?
Да. Создать динамический блок можно только "вручную", средствами AutoCAD. Нет ни одного публичного API (а не только .NET API) для создания динамических блоков. Так что единственный способ - создать блоки вручную и вставлять/модифицировать их используя .NET API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Ясно, спасибо.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Достаточно давно на theswamp.org была тема, где люди пытались создавать динамические блоки (использовался lisp). К сожалению, точной ссылки подсказать не могу (да и корректность решения оценить я тоже не в силах), этим вопросом в свое время озадачивался Евгений Елпанов.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Леша. Ты наверное про это: http://autolisp.ru/2011/11/28/create-dynblock/ и это: http://www.private.peterlink.ru/poleshchuk/cad/2009/tainypod08.htm - тупиковые ветки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Именно. :) Дожил, я свой сайт уже не помню - что там было, а чего там не было :))
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
И еще один вопрос сюда же.
Я сначала думал уйти от блоков к группам, а потом решил - может быть, стоит оставить статические блоки, просто на каждый объект создавать свой статический блок?
Насколько это плохо, если в документе будет, скажем, 1000 статических блоков? Намного ли лучше сделать вместо этого 1000 групп?

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Насколько это плохо, если в документе будет, скажем, 1000 статических блоков?
Ничего страшного - это не критическое значение.
Намного ли лучше сделать вместо этого 1000 групп?
Лучше только в том, что легче редактировать, но хуже в том, что возникнут проблемы при ручном копировании в другой чертеж (в другом чертеже "это" уже не будет группой).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Ну, тогда создам мильон статических блоков.
За Индию! Да здравствует быдлокод!  ;D
---
Этот вопрос вроде исчерпан, спасибо Вам за ответы.

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну, тогда создам мильон статических блоков.
А вот это уже будет перебором.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Да нет, я уточнил у заказчика - на одном чертеже их должно быть около тысячи. Надеюсь, это не вызовет принципиальных проблем.

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Если не планируется редактировать эти блоки средствами AutoCAD, то я бы рекомендовал делать их "неименованными" - тогда их не будет видно в списке блоков и они не будут путаться с "нормальными" блоками.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
А о таком варианте я как-то и не подумал. Надо попробовать, спасибо.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2468
  • Карма: 698
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
А вариант использования стандартного автокадовского объекта "мультивыноска" рассматривали? Не подходит?
Из своей практики: приходилось разгребать такие чертежи с кучей блоков. Получается, что смысла в них никакого - чертеж "весит" больше, чем тот же самый, но со взорванными такими блоками. Взрывал, пуржил. В результате, чертеж мог "полегчать" на 5-10 Мб.

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Скажу честно: понятия не имею, как этим пользоваться.
В принципе, сам блок как таковой мне нужен по двум причинам:
- возможность добавлять атрибуты;
- возможность группировать несколько примитивов в единое целое, чтобы при необходимости, скажем, удалить целиком весь объект или перетащить его в другое место.
Мне нужно сделать выноску с двумя линиями текста: над линией выноски и под ней. При этом сам текст я оформляю в виде атрибутов (мне потом нужно работать с блоками, используя эти данные).
Можно ли, используя мультивыноску, для разных экземпляров статического блока задать разные длины этой мультивыноски?
После поисков я наткнулся на динамические блоки, которые позволяют это сделать - но динамические блоки я не могу создавать с помощью .NET API...

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Из своей практики: приходилось разгребать такие чертежи с кучей блоков. Получается, что смысла в них никакого - чертеж "весит" больше, чем тот же самый, но со взорванными такими блоками.
Это если есть описание блока, но нет самой вставки блока (особенно актуально с динамическими блоками). Тогда же, когда "одно описание блока - одна вставка блока" конечно тоже будет лишний объём, но он не настолько значителен.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно ли, используя мультивыноску, для разных экземпляров статического блока задать разные длины этой мультивыноски?
Нет.
После поисков я наткнулся на динамические блоки, которые позволяют это сделать - но динамические блоки я не могу создавать с помощью .NET API...
Я так и не понял зачем их тебе создавать средствами .NET API. Может быть достаточно их вставлять и модифицировать?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
А откуда загружать само определение динамического блока? Вместе с dll'кой еще и файл с этим блоком поставлять? Не очень удобно, ИМХО... Запихнуть как ресурс в саму dll'ку? Что-то сложно звучит.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Может быть, скажу глупость, но: кто мешает создать блок, состоящий из MTEXT (возможно, с атрибутами) и использовать этот блок в качестве аннотации к MLEADER / QLEADER ?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Вместе с dll'кой еще и файл с этим блоком поставлять? Не очень удобно, ИМХО...
Это самый стандартный способ. Вообще-то поставлять один dll-файл - это моветон. Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
Запихнуть как ресурс в саму dll'ку? Что-то сложно звучит.
Всё это намного проще, чем плодить тысячи блоков. Главное убедиться, что можно обойтись одним динамическим блоком...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
2 Алексей Кулик: К сожалению, я с ходу не смог осознать Ваше предложение.
Я в блоках-то пока путаюсь, а как можно блок использовать в качестве аннотации - сие для меня вообще есть темный лес...(
...
2 Александр Ривилис:
Цитировать
Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
УУУУУУУУУУУУУУУ :(
Пойду тогда курить динамические блоки. Где-то, помнится, находил я примеры вставки этих блоков из файла.
Вообще говоря, жаль. Как раз более-менее с анонимными блоками начало получаться...
А обойтись таки можно, да. Объекты достаточно примитивные.

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Пойду тогда курить динамические блоки. Где-то, помнится, находил я примеры вставки этих блоков из файла.
Наверное здесь: Динамически блоки с операцией Растянуть (Stretch)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Спасибо, буду переделывать.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Alex, если использовать COM-модель, то получается примерно такая последовательность:
1. Создается блок (возможно, анонимный)
2. Внутри блока создается многострочный текст (возможно, с принудительным форматированием)
3. Добавляются атрибуты и их значения
4. Создается выноска (мульти- или обычная - дело шестнадцатое). При создании выноски в качестве аннотации указывается использовать блок.

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

P.S. У меня подобные задачи ни разу не вставали, поэтому половина рецептов, которые я выдаю, надо проверять и перепроверять :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн AlexАвтор темы

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Я, наверное, все же попробую уйти в динамические блоки. Как верно мне заметили, установщик-то все равно потребуется.)
Вариант с выноской надо, конечно, попробовать - но я не уверен, что в данном случае блок и выноска будут единым объектом. А мне хотелось бы как раз поиметь возможность разом/махом все удалять/перемещать.
Но в любом случае, спасибо за совет!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Ну, тут можно просто попробовать работу выноски и аннотации (достаточно даже созданной руками).
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2468
  • Карма: 698
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
конечно тоже будет лишний объём, но он не настолько значителен
Это была топографическая съемка протяженного участка дороги в одном файле. Каждый топознак - анонимный блок. Скорее всего это был продукт экспорта из "вертикалки" автокада или какого-то другого специализированного ПО.  Количество таких блоков там было несколько сотен тысяч.
Если блоков немного, то, наверное, ничего страшного. Но я бы так делать не стал - не нравится мне это очень, потому что работать потом с этими блоками обычному пользователю будет очень неудобно. Хотя, если не планируется ручная доводка чертежа после программы, то может это и не страшно... В общем, предупрежден - вооружен, а какой путь выбрать - думайте сами по обстоятельствам.
Вот вариант с внешней библиотекой блоков мне нравится, я такой подход уже использовал. Хороший метод вставки описания блока из библиотеки я находил на сайте Андрея Бушмана: https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/blockdefinitionsimport

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вообще-то поставлять один dll-файл - это моветон. Нужен нормальный инсталлятор, который распихивает всё по каталогам и регистрирует эту "dll'ку" для автозагрузки...
Инсталлятор - это конечно хорошо, однако для того, чтобы  "распихать всё по каталогам" инсталлятор не обязателен - это автоматом может сделать и сама dll-ка, при условии, что прав юзера хватит на работу с подлежащими модификации каталогами.

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

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

Более того, плагины некоторых программистов каждый раз принудительно, вопреки желанию юзера, прописывают себя в автозагрузку при очередной своей загрузке в AutoCAD, тем самым ставя себя выше юзера. Вот это воистину МОВЕТОН... Аминь.

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

  • Administrator
  • *****
  • Сообщений: 13190
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот это воистину МОВЕТОН... Аминь
С Рождеством, Андрюша!  :D
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78