|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Лисп простой пользовательской выноски
Регистрация: 19.11.2014
Сообщений: 2,606
|
||
Просмотров: 19120
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
И в чем собственно трудность?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Трудность в том, что базовые познания LISP у меня минимальные и посему ищу помощи.
Файлы с этими выносками могут использоваться другими пользователями, у которых СПДС нет. ----- добавлено через ~1 мин. ----- Отступ от полки неконтролируемый. ----- добавлено через ~2 ч. ----- Мой текущий прогресс: Код:
1. Отрисовка выносной линии полилинией (с визуализацией промежуточных сегментов), а не двумя отрезками. 2. Размещение всех примитивов на определенном слое, а не текущем. 3. Отрисовка текста определенным шрифтом и определенной высоты, а не текущими значениями. 4. Запоминание предыдущего значения текстовой метки и предложение ее значением по умолчанию при повторном вызове функции. 5. Пока не понимаю как сюда вписать нижнюю текстовую метку, чтобы она была опциональной и не требовала лишнего запроса. 6. С точкой та же история, что и с нижним тектом - точка должна быть опциональной. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Благодаря VVA вполне себе контролируемый.
Весело будет когда кто-то захочет это дело подредактировать. Вот он спасибо-то скажет. Допустим, стало необходимо добавить еще выносок, а эти передвинуть. И понеслась. Согласен с теми, кто отсылает к мультивыноскам. При правильной настройке и с использованием MTLE из кода по ссылке. Например, в стиле мультивыноски можно поставить на конце выноски любой блок, скорее, тут даже стандартный подойдет. И это будет один объект, создаваемый уже имеющимися средствами и удобно редактируемый. На форуме была и программа по отрисовке мультивыноски. Советую разобраться с ними и увидите, что это намного удобнее. На худой конец можно поискать динамический блок выноски. В Download и в темах "Мои динамические блоки" (части первая и вторая) предложено немало решений. |
|||
![]() |
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,834
![]() |
Цитата:
Садись и пиши! Как-то даже и думать за ТС не хочется.
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Добро пожаловать в "Поиск исполнителей"
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Сет, а кто и когда будет решать, и на основании чего, в какую сторону должна эта выноска смотреть?
Я повторю и разверну свою мысль. Плохо это - изобретать велосипед, причем такой, который уступает по своим возможностям штатному функционалу. Но, "не поумничать ради, а помочь для", готов еще раз повторить и попробовать-таки склонить настроение в сторону мультивыноски. Или динамического блока. На этот раз с более вразумительными и осязаемыми доводами. В приложенном файле примеры: сверху - мультивыноска, снизу динамический блок (найден на этом форуме или в дауне). Для отрисовки таких мультивыносок можно использовать чуть подправленную программу VVA отсюда (код запускать в приложенном файле при активном стиле мультивыносок "ISOCPEUR", который уже присутствует в файле и примерно настроен в соответствии с рисунком в первом посте): Код:
Цитата:
1,2,3 - С этим проблем нет - ни в случае с блоком, ни с выноской - реализуется легко, даже самостоятельно находятся на форуме решения при даже примитивном знании лиспа на уровне чуть больше просто юзера. Думаю, и ссылками поможем, в случае, если выноски пойдут в дело. 4. Ничего не понял из этого пункта - с учетом написанного и нарисованного в первом посте. 5. Тоже по рисунку и описанию не совсем понял, выноска может быть многоступенчатой или "многострелочной"? Для понимания нужен соответствующий рисунок, желательно в dwg. 6. Тут вроде тоже проблем нет. 7. В коде (команда TEST) это реализовано в первом приближении. Если на запрос второго текста нажать правой кнопкой мыши или Enter - второй строки не будет. 8. Это тоже нетрудно добавить. В общем, если есть желание завязаться с любым из этих вариантов, я готов помочь в поиске и заточке кода или блока. Думаю, что и не я один. С текстами связываться не стану - даже за деньги, и даже, если будет время. Последний раз редактировалось skkkk, 22.03.2016 в 01:39. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Если это что то стандартное, то использовал бы стандартные лидеры или мультилидеры, вот самый простой:
Код:
Если что-то не стандартное, то я бы сделал динамический блок со всеми необходимыми вкусняшками, нафиг их программно пытаться полилинией обрисовать, да и не отредактировать потом толком. А дальше пишем прогу по вставке этого блока, например такую: Код:
__________________
Делай хорошо, плохо само получится. |
|||
![]() |
|
|||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
1. У меня часто в одном чертеже используются выноски с точкой и без точки. Это, если хотите, мой собственный стандарт оформления, согласно которого выноска от тонкого элемента идет без точки, а от широкого - с точкой. Если работать с мультивыноской, то нужно будет создать два стиля и часто их переключать, либо менять стиль мультивыносок в свойствах. Пусть это и не выглядит критическим, но, думается, будет не слишком удобным. 2. Полка выноски всегда имеет правое положение, хотя левое положение используется у меня также часто. 3. Длина полки выноски неконтролируемая "на лету". 4. Раньше, при тестировании мультивыносок, я сталкивался с тем, что текст на ней размещается некорректно. Какой-то с отступом от полки, какой-то чуть ли не вплотную. У вашей мультивыноски при беглом тестировании я этой проблемы не обнаружил, но я не помню какие именно символы нарушали стройную геометрию. Надо потестировать еще. При минусах есть и один несомненный плюс - выноска является единым целым. Цитата:
1. Первое и очевидное - слишком много действий по добавлению такого блока в чертеж. Сначала блок нужно вставить, затем потягать за ручки, чтобы он принял нужную форму. Выносок в чертеже много, если каждой уделять столько времени - это будет слишком расточительно. 2. Текст нужно выравнивать не по центру полки, а по краю выноски. Соответственно динамически "отзеркаливать" полку не получится. Нужно будет либо делать 4 области видимости с разными положениями выноски, либо 4 разных динамических блока, которые потом "тягать" с палитры. 3. Есть мнение, что большое количество динамических блоков "тормозит" чертеж. Выносок очень много. Динамические блоки я использую и кроме них. Цитата:
Цитата:
Собственно мой прогресс: Код:
1. Запоминание предыдущего значения текстовой метки и предложение ее значением по умолчанию при повторном вызове функции. 2. Опциональный нижний текст. Вариант с индивидуальным запросом (как в мультивыноске VVA) понятен, но выглядит неудобным. Хотелось бы, чтобы пустой нижний текст не требовал лишних действий, которые нужно выполнять только если нижний текст имеет содержимое. 3. Все что касается нижнего текста - касается и точки. Добавилось еще одно желаемое свойство: 1. После указания первой точки должен включаться режим ОРТО (если он выключен) и по завершению работы функции - возвращаться в исходное состояние. Последний раз редактировалось Сет, 22.03.2016 в 10:42. |
||||
![]() |
|
|||||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
Цитата:
Цитата:
Цитата:
Код:
Цитата:
Цитата:
Удачи в велосипедостроении.
__________________
Делай хорошо, плохо само получится. |
||||||
![]() |
|
|||||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
Согласен с автором, что нужно свою делать. Когда-то была своя на основе дин.блока.
Теперь новый виток. Но без отличного знания lisp, сделать что-то путнее не получится. Посмотрите как сделано:
Скоро я покажу как автоматически расставлять выноски к блокам, так, чтобы в них писались данные, и выноски не накладывались на другие объекты. Здесь выноски расставляются, но не красиво, все в одну сторону, что требует ручной подчистки.
Последний раз редактировалось Sleekka, 22.03.2016 в 10:51. |
||||||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
1. Клик - активация функции. 2. Ввод текста - текст выноски. 3. Клик - первая точка. 4. Клик - вторая точка. 5. Клик - третья точка. Всего четыре клика и ввод текста - и выноска занимает нужное положение и вид. |
|||
![]() |
|
||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
Посмотри второе видео в моем сообщении, когда ничего не выделено, выноска работает так как ты говоришь, только третья точка вычисляется автоматически. И полка потом может быть пересчитана, двойным кликом.
|
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
1. Нажатие кнопки 2. Указали первую точку 3. Указали вторую точку 4. Написали текст первой строки 5. Написали текст второй строки (если нужно, если не нужно просто жмем ПКМ) Всего три клика и ввод текста. На один клик меньше ) ----- добавлено через ~1 мин. ----- Как ты вычисляешь длину текста?
__________________
Делай хорошо, плохо само получится. |
|||
![]() |
|
||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
Как обычно, через BoundingBox, это далеко не самое сложно в этой задачке.
Для меня было самое сложно сохранить удобство одного общего объекта не потеряв удобства раздельных объектов, найти этот тонкий баланс и есть самое сложное. При этом я не пишу никаких расширенных данных в примитивы, только анализ геометрии для сохранения связности. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
__________________
Делай хорошо, плохо само получится. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
kr_leader? Смотрел. Просто вставляет динамический блок. Или речь о чем-то другом?
Цитата:
![]() |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Ты жаловался на сложность вставки динблока и начал клики считать, хотя в моей проге на один клик меньше.
__________________
Делай хорошо, плохо само получится. |
|||
![]() |
|
||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
Цитата:
Я программирую давно, для меня это не очень долго, написать такой код, зато я имею инструмент под создание сложных систем класса "полная автоматизация". |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Я, видимо, что-то не так делаю, потому что kr_DrawLeader у меня не запускается, а kr_leader - это просто вставка динамического блока. В три клика же решить задачу установки выноски невозможно в принципе. Четыре клика - это минимум. Ну разве что функцию вызвать не кликом, а вводом с клавиатуры. У выноски три характерных точки, которые не могут быть получены автоматически, потому как всегда уникальны.
|
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
А как ты её запускаешь? Можно. Mleader ведь за два клика в экран ставится и здесь также. Длина полки зависит от длины текста.
__________________
Делай хорошо, плохо само получится. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
1. Сохранил твой лисп.
2. Открыл твой чертеж. 3. Загрузил в него лисп. 4. Ввожу с командной строки "kr" - появляется доступная команда "kr_leader" - ее и запускаю. Это вставка дин блока. Длина полки зависит не от длины текста, а от желания пользователя. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
![]() Разве так запускают проги, нужно вот это ввести: Код:
__________________
Делай хорошо, плохо само получится. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Ну как сказать. В процессе указания третьей точки должен быть уже нарисован отрезок между первой и второй... По поводу твоей функции - собственно все недостатки, которые я описывал ранее - справедливы и сейчас. Добавлю лишь еще один нюанс - у меня в настройках повторное выполнение команды выполняется по нажатию ПКМ. С твоей функцией этот номер не проходит.
По поводу отзеркаливания атрибутов с выравниванием... разве выравнивание отзеркаливается? Было левое, станет правым? Кажется это так не работает. В свое время делал динамический блок высотной отметки и именно по этой причине сделал четыре блока вместо одного универсального. |
|||
![]() |
|
||||
инженер (КМ) Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837
|
Цитата:
Цитата:
Цитата:
Короче, не хочешь - не надо. Флаг в руки.
__________________
Делай хорошо, плохо само получится. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Собственно в этом и вопрос был изначальный. Я и исходил из того, что это не сложно, а значит можно даже быстро набросать работающий прототип. Если же сложно, то мне бы хватило подсказки какими функциями можно достичь той или иной поставленной цели.
Вот взять ту же промежуточную линию между первой и второй точкой. Я ее рисую простым отрезком, который удаляю после указания третьей точки и рисую полилинию по трем точкам. Криво, наверное, но работает. Никто другого варианта не подсказал. Я вообще не спец в ЛИСПе и не ставлю себе целью его изучения, так как все что мне от ЛИСПа нужно - это простая выноска. По крайней мере сейчас. Согласись, что ради такой цели изучать тонны документации по языку - глупо. Мне бы было даже проще использовать ObjectArx, так как я немного программирую на С++, но там не совсем понимаю как писать Arx-приложения под автокад. Глобально же можно считать цель достигнутой, надо только последние свои "хотелки" реализовать. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
ну тот же JIG MLeader, это уже не лисп, правда.
Цитата:
5 - JIG реализовывается 6 - не помню навскидку, влияет в джиг или нет. 7,8 - делаете ключевые слова при вводе координат, и получаете нужный опционал. Опять же, лучше два стиля мультивыноски разных - на случай ручной корректировки. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
2. Почему же? Она может иметь любое положение. Другой вопрос, как ставить по умолчанию. Но такой же вопрос возникнет и при отрисовке текста с линиями. Предполагаю, что третья точка в ТЗ - и есть указание стороны? Тогда не сложно сделать такой запрос и для выноски и ставить ее с той стороны, куда укажет пользователь. 3. Ну да, она контролируется автоматически в зависимости от ширины текста. А надо по-другому? Чтоб полка была короче или длиннее? Короче - не сделать, а длиннее можно - регулируется отступом от полки. 4. Это известная проблема с известным решением, не требующим дополнительных кликов. Ссылку я приводил выше. Другими словами, проблем, кажется, не осталось. ![]() Я прекрасно понимаю это желание сделать СВОЙ инструмент и задор, подстегиваемый интересом к лиспу, - и разделяю их. И, возможно, ничего плохого нет в таком решении создать "свою выноску", кроме одного, что мне очень не нравится: редактировать впоследствии такие "расчлененные" выноски. Раз уж пошла пьянка считать клики, то и я свой расчет приведу. Для перемещения выноски, состоящей из линий и текста, нужно 8 кликов (один из них - вызов команды переноса - тянемся из области чертежа к кнопке на панели), а для перемещения мультивыноски - три клика. А при создании в обоих вариантов кликов одинаково. При этом - разница в количестве обработок, неожиданностей и затраченного времени может быть колоссальной. Или есть полная уверенность в том, что будучи раз созданной, выноска ни при каких обстоятельствах больше никуда не будет смещаться? Если так - тогда смело доделывайте свою команду, раз в кайф, но я уверен, можно найти немало более интересных и полезных задач для прикладного программирования. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Именно так. Но не только. Третья точка указывает где заканчивается полка.
Цитата:
Ну это на словах. Я не знаю как подправить твой лисп до того функционала, который мне нужен. Смотрю тот код и вижу много непонятного. Единственный плюс, по сравнению с тем, что получается у меня - это выноска как единый объект. Плюс значимый, вопросов нет. Но и сложность реализации, кажется, увеличивается. Есть ли резон в это глубоко вникать ради моей задачи? Как я ранее говорил - ЛИСП как таковой я изучать не хочу, поскольку практически применять его не планирую. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
|||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Ну тогда да, может, применение подобного подхода и оправданно. Любопытно, а почему и из каких соображений исходя, пользователь решает, какой длины должна быть полка? И я так понял из первого поста, что текст в выноске всегда выравнивается в сторону "от полки", на таком расстоянии, которое укажет пользователь, симметрично, а не всегда влево или всегда вправо? Я просто все еще цепляюсь за возможность найти подходящие настройки мультивыноски. Если так, то можно и спросить у пользователя точку (третью) и рассчитав величину отступа от полки, построить выноску. Почти уверен, что можно добиться нужных настроек выноски или стиля.
Почему-то даже после создания слоя "000-Серый" и стиля "Шрифт 10" текст у меня так и не появился. Только две линии. И запроса на вторую строку не увидел. Поэтому и не могу понять, как должно быть. А погружаться глубоко время не позволяет. Думаю, это лишнее, Сет хочет видеть только выносные линии: Цитата:
Цитата:
![]() Цитата:
----- добавлено через ~4 мин. ----- Цитата:
![]() ----- добавлено через ~24 мин. ----- Сергей 812, сейчас вот я еще подумал, что с JIG'ом тут как раз можно было бы попробовать избежать третьего клика, но вспомнил, что все равно нужно ширину полки указывать на усмотрение пользователя. Если выносная линия строго ортогональна (даже по замыслу принудительно), то, думаю, выноску можно было бы вставлять с той стороны, в которую отклонится мышка от вертикали при указании второй точки. Кстати, можно и без JIG'а, по-моему, так сделать, но с ним - лучше. Однако, третьего клика судя по задумке автора, не избежать никак. |
||||
![]() |
|
|||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Цитата:
Цитата:
Цитата:
Что касается выноски с простыми примитивами, то я думаю, что близок к ее завершению. Текущий вопрос, на который пока не нахожу ответа, это как реализуются встроенные параметры в запрос функции, как это сделано, например, в штатной команде ПРЯМОУГОЛЬНИК. Параметры Фаска Уровень и т.д. кликабельны и позволяют задать дополнительные параметры. Я бы хотел используя эту же механику добавлять нижний текст и точку. |
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
----- добавлено через ~1 мин. ----- Цитата:
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Но она как-то не так работает. В команде Прямоугольник клик на ключевое слово активирует что-то вроде подфункции - идет новый запрос. Здесь же клик на ключевое слово - это вариант ответа на текущий запрос.
----- добавлено через ~11 мин. ----- Или как раз определенный ответ на текущий запрос и запускает подпрограмму через что типа (if (= 1Var "P") ... ) ? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
логично
![]() |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
skkkk, я доделал выноску с практически всеми реализованными "хотелками". Осталось несколько нюансов некритичных для понимания того результата, которого я хочу добиться. Во вложении тестовый чертеж и лисп - посмотри, можно ли такой функционал реализовать через мультивыноски по-простому
![]() Из нереализованных "хотелок": 1. Автовключение режима ОРТО после указания первой точки выноски и возврат к исходному состоянию после отрисовки выноски (вроде понятно как делать, просто надо уделить время). 2. В качестве точки я рисую круг, а надо бы кольцо с внутренним диаметром 0 (не нашел в методах ActiveX функции типа AddDonut - нужна помощь). 3. При отрисовке выноски с текстом снизу и сверху хотелось бы, чтобы строка большего размера выравнивалась по краю полки, а строка меньшего размера - по центру строки большего размера (это не знаю как сделать, полагаю что сложно, потому готов смириться с тем, что есть сейчас - выравнивание верхнего и нижнего текста по краю полки). |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Цитата:
Цитата:
P.S. Код не смотрел и не анализировал.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
Цитата:
![]() Цитата:
Чтобы код работал в любом файле, алгоритм я вижу примерно таким: 1. Создать слой (если нет в чертеже). Решения на форуме есть. 2. Создать стиль текста, стиль мультивыноски (если нет в чертеже). Коды уже также на форуме имеются, надо найти, разобраться с нужными настройками стиля и прописать их в коде - заточить под себя. 3. Ввод текста, указание первой, второй, третьей точки - все как ты уже реализовал. Между вводом первой и второй точки включить режим ОРТО. В принципе, твой код почти целиком можно взять за основу, только не создавать тексты, а создать полилинии, как временные примитивы для визуализации отрисовки выносной линии и полки, затем сразу удалить их. Потом на основе введенных данных рассчитать все необходимые параметры мультивыноски, и создать ее программно, при помощи кода VVA из приведенной мною ранее ссылки. Хотя, может, тексты придется и создать в том же стиле для определения их габаритов (см. ниже). 4. Назначить созданной мультивыноске "правильный" межстрочный интервал для устранения проблемы прилипания к полке при помощи другого кода VVA (ссылку я тоже приводил). Там в коде также предусмотрена возможность автоматического преобразования создаваемых мультивыносок с использованием реактора. 5. Назначить мультивыноске другие необходимые свойства, вычисленные перед отрисовкой: отступ от полки и/или величина полки, положение текста относительно выносной линии (справа-слева), слой, блок-круг на конце или нет (кстати, отпадает необходимость возиться с "хотелкой" №2) и прочее - явно не все вспомнил. Самое трудное и муторное тут на мой взгляд - это вычисление отступа от полки (и/или величины полки) в зависимости от указанной третьей точки - похоже, нужно будет вычислять ширину текста через его boundingbox и сравнивать ее с длиной отрезка между второй и третьей точками, а разницу назначать параметру "величина полки" или "отступ от полки" - в зависимости от того, понравятся ли треугольные ручки (лень искать имена свойств ActiveX - их можно узнать, сняв с мультивыноски дамп и, если надо, заглянув в англо-русский словарь). 6. Добавить обработчик ошибок (см. *error*, например в теме "Научите лиспу..."), чтобы при выходе из программы по Esc восстанавливать значения переменных и удалять временные примитивы. Таким образом, пожалуй, всю эту работу ты проделал не зря. Во-первых уже с пользой для производства, - но останавливаться рано. А во-вторых, как оказалось, с заделом на развитие и с минимумом лишних движений. Осталось теперь создать мультивыноску, являющуюся точной копией этих временных примитивов. Коды для всех этих задач точно видел в Сети, надо найти, "подпилить", рассчитать смещение текста и все это объединить. Удачи в этом увлекательном деле ![]() Offtop: Посмотрим, как оно будет: только ли эту задачку захочешь решить? ![]() Последний раз редактировалось skkkk, 23.03.2016 в 02:17. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
![]() Цитата:
А можно пример использования этой функции? Вообще говоря было бы неплохо расширить функционал моей выноски следующим образом. Если я указываю третью точку кликом на экране - это точка становится концом полки. Если же я в ответ на запрос третьей точки жму Enter - полка рисуется автоматически по длине текста. При этом положение полки (слева или справа) определяется текущим положением курсора относительно второй точки. Это возможно? |
|||
![]() |
|
|||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
А почему тогда теперь LISP? Это не шаг назад?
Цитата:
Можно. Там после выполнения кода в переменные 'minp 'maxp заносятся координаты левого нижнего и правого верхнего углов прямоугольника, ограничивающего объект. Координаты записываются в виде массива, затем функцией vlax-safearray->list преобразовываются в привычный вид. Цитата:
Цитата:
Третья точка для этой выноски пока не нужна, она нужна только для определения стороны, в которую будет повернута выноска. Цитата:
Код:
|
||||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Врядли. Во-первых я не совсем понимаю как писать arx-приложения для автокад, нужно изучать вопрос. Во-вторых, насколько я понимаю ObjectArx сложнее чем ЛИСП. Погружаться в ObjectArx ради простой выноски... разумно ли это?
![]() ![]() Я наблюдаю только одну треугольную ручку - она изменяет отступ от выносной линии до полки, фактически меняет длину полки. Без этой ручки длину полки же никак не изменить?Если так, то я считаю эта ручка однозначно нужна. Собственно это и подразумевал. Далеко не всегда есть необходимость делать длинную полку выноски. Порой достаточно автоширины. Тогда выноска строится в два клика и курсором указываем направление полки. Если есть функции, отслеживающие положение курсора, - тогда все замечательно. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Странно. У меня две. См. вложение. Длину полки без ручки можно менять еще отступом от полки, но только через панель свойств или программно. По месту, в отдельно взятой выноске, длину полки можно регулировать только этой ручкой. Думаю, ручных корректировок положения полки не избежать, поэтому треугольные ручки я бы оставил в данном случае. Я просто пользуюсь выноскам таким образом, что выносная линия у них всегда под углом к вертикали, и ширина полки у меня зависит исключительно от размеров текста, поэтому их убрал - мешались.
|
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Видимо, Автокад поновее. У меня 2011. Левая ручка, к сожалению, выноску не зеркалит - вообще не понимаю ее назначения. А поскольку не зеркалит - без нее гораздо удобнее. Квадратная ручка должна быть на изломе - это логично. Разработчики это поняли. А отзеркаливание выноски можно настроить на двойной клик по выносной линии (см. Операции при двукратном нажатии в Адаптации). При этом двойной клик на тексте мультивыноски также будет вызывать редактор.
|
|||
![]() |
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,834
![]() |
Цитата:
У меня ЛИСП "простой выноски" работает еще с ДОС-версии Попутно в "Похожие темы" увидел дискуссию 2009 года http://forum.dwg.ru/showthread.php?t=40090 >Сет В ней кстати разбираются ошибки ЛИСП"а, которые есть в твоём тексте
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... |
|||
![]() |
|
||||
- Регистрация: 24.07.2005
Москва
Сообщений: 1,335
|
http://konspekta.net/studopediaorg/b...s/image256.jpg
Нет, это не шаг назад, это переход в другое измерение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Просто разные области применения у LISP и NET/ObjectARX - если нужен голый функционал, то на лиспе (если им владеешь в достаточной степени) зачастую будет написать проще. Если нужны развитые средства интерфейса, поддержка работы с БД, с XML и т.д. -то проще уже перейти на ООП, где это все реализовано. И сосредоточить усилия именно на практическую реализацию своих хотелок) Благо информации по тому же NET API за последние несколько лет стало гораздо больше, в том числе и на русском языке.
Цитата:
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Сделай ее "псевдовертикальной". Сделай отступ по Х в нужную (в данном случае влево) для тебя сторону на несущественное для тебя значение (например на 0.001). Этим ты "покажешь" мультивыноске желаемую сторону отрисовки полки
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
То есть ты имеешь ввиду фактически линию сделать наклонной? Хотелось бы, чтобы геометрия вертикальной линии была идеальной, т.е. без сдвигов даже на 0.001.
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Я бы написал, если бы понимал как заставить полку рисоваться слева от последней точки выноски.
Попутно возник еще один вопрос. Я реализую указание параметров выноски через диалоговое окно. Сначала использовал в качестве кнопок выхода из диалога стандартную пару ok_cancel. Но эти кнопки разной ширины, захотел немного подравнять это дело. Пишу такой код вместо ok_cancel: Код:
|
|||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611
|
не знаю как это делается на лисп, но в C# направление выноски устанавливается как то так:
Код:
mLandingLocation - положение текста mArrowLocation - положение указателя Возможно вам это поможет. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Я уже пытался с этими Dogleg'ами что-то сделать - ничего путного не получается, да и смысл этого свойства не очень понятен. Я задаю это свойство в двух вариантах:
Код:
Во втором случае выносная линия отклоняется от вертикали вправо, полка находится слева. ----- добавлено через ~13 мин. ----- По второму варианту верх выносной линии уходит вправо визуально на ширину мультитекста. С помощью ручки выносную линию можно вернуть в вертикальное положение, при этом полка остается слева, как мне и нужно. Вопрос - каким образом получить доступ к этой точке мультивыноски, чтобы переместить ее программно? |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Для лучшего понимания добавлю картинку. Первая выноска - это при вставке. Вторая - вручную отредактированная с помощью ручки (та, которая в красном кружке). Вот ее-то и нужно программно сдвинуть.
----- добавлено через ~3 ч. ----- Я попробовал этот способ - он не работает. Смещал точку даже на 1000 влево - все равно полка рисуется справа. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Была такая мысль, но отзеркаливание годится только для простых выносок, как на картинке. Если же выноска многосегментная (я усложнил себе задачу), то отзеркаливание не годится, так как отзеркалится вся геометрия сложной выноски.
Сейчас размышляю над двумя возможностями. 1. Использовать как-то SetLeaderLineVertices, но пока ничего дельного не выходит. 2. Выяснить координаты последней точки выноски (которая автоматически смещается, она в красном кружке на картинке) через GetLeaderLineVertices и с помощью команды РАСТЯНУТЬ сдвинуть ее на необходимую величину влево. Во всяком случае вручную этот способ работает, но как это сделать программно - пока не понимаю. ----- добавлено через ~24 мин. ----- Кажется разобрался с первым способом. работает вот такая конструкция: Код:
0 - индекс выносной линии (у меня предусмотрена всего одна выносная линия, значит 0) mleader_points - массив safearray из вариантов с типа vbDouble с координатами вершин мультивыноски |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Ну что ж, вот что у меня получилось.
Код:
Код:
Выноска корректно работает в прилагаемом чертеже, только в файле cs_leader.lsp нужно поправить путь к файлу cs_leader.dcl, в соответствии с тем местом, где вы его разместите. Для использования функции в своем чертеже нужно учесть следующее: 1. Выноска строится с текущим стилем мультивыносок, поэтому нужно создать у себя такой же стиль мультивыносок, как в прилагаемом чертеже, ну или подкорректировать cs_leader.lsp. 2. В моем чертеже установлен масштаб 100 и если вы хотите использовать функцию в чертеже с другим масштабом - нужно будет подкорректировать cs_leader.lsp в месте, где задается DoglegLength (это размер полки от выносной линии до текста). Как работать с функцией: 1. Активируем функцию командой cs_leader. 2. В появившемся диалоге устанавливаем необходимые параметры и жмем ОК. 3. Указываем точки выносной линии, которых должно быть не менее двух. Ввод точек завершаем нажатием Enter или ПКМ. 4. Идет запрос указания крайней точки полки. Возможны варианты: 4а. Указываем эту точку ЛКМ. 4б. Перемещаем курсор в ту сторону (относительно последней точки), куда хотим, чтобы откладывалась полка, жмем Enter или ПКМ. Осталось нереализованным, но вроде как не сложным: 1. Автовключение режима ОРТО (я еще думаю, надо ли это). 2. Сохранение значений по умолчанию в файле, а не глобальных переменных. Осталось нереализованным, но пока не особо понятным: 1. Обработка всевозможных нештатных ситуаций. 1а. Выход из программы по Esc - у меня остается временная линия, надо бы ее программно удалять. Разметка диалога какая-то странная. Некоторые элементы при одинаковой длине почему-то занимают разную по размерам область на экране. Ну с этим-то я справился методом тыка, а вот с чем пока не справился, но хотелось бы: 1. Свободное пространство слева от элементов управления и справа почему-то разное. Хотелось бы, чтобы справа расстояние до края формы было такое же, как и слева (красные прямоугольники). 2. Две кнопки OK и Cancel заданы кодом ok_cancel и имеют разную ширину (синий прямоугольник). Хотелось бы их сделать одинаковыми. Но при замене ok_cancel на два button'а с именами "accept" и "cancel" почему-то приводит к сообщению Автокада об ошибке - ему нужно, чтобы в диалоге обязательно присутствовала кнопка выхода OK или Cancel. |
|||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611
|
Цитата:
А на тему смещения.... если я правильно помню, это зависит от выравнивания текста.Т.е. для правильного отображения не достаточно назначить правильный вектор, нужно еще и выравнивание текста поменять и будет как то так:Видяшка |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Для тестирования эффекта.
В итоге вопрос решен. ----- добавлено через ~38 мин. ----- Появились новые "хотелки" ![]() 1. Как все-таки можно решить вопрос визуализации будущего текста мультивыноски? Устроил бы вариант хотя бы прямоугольником описывающим каким или другим примитивом, дающим представление о длине и высоте текста. 2. Можно ли при активации редактирования текста выноски двойным кликом автоматически выделять содержимое? |
|||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611
|
Цитата:
Не знаю, меня не напрягает нажать ctrl+A, хотя я стараюсь формировать содержание ДО того как делать выноску... |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Комрады, не работает простой лисп по копированию отрезка. | MegaMost | LISP | 10 | 07.09.2015 00:23 |
Как визуализировать создаваемый объект? | Glorius | Программирование | 27 | 08.08.2015 22:59 |
мой первый лисп, выноска, пинайте! | baaba | LISP | 17 | 20.10.2009 15:42 |
Помогите продумать поворот части выноски! | Tonic | Программирование | 40 | 02.07.2007 20:21 |
Сброс связи линии выноски и MTEXTа выноски | kabzzz | AutoCAD | 3 | 19.04.2006 12:57 |