|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
LISP. Отрисовка произвольной трассы из отрезков и дуг.
Москва
Регистрация: 25.12.2005
Сообщений: 13,626
|
||
Просмотров: 17526
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Критику примешь?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
Критику приму. Только отмечу, что программа написана по просьбе специалистов-слаботочников и в таком виде вполне их устраивает. Привязки специально не отключены, пользователи могут отключать и включать их вручную в процессе отрисовки. Модуль обработки ошибок сознательно не делал, возможные ошибки здесь мало чем отличаются от возможных ошибок при выполнении команды "_Line". Возможно, в программах появятся некоторые усовершенствования, связанные с с печатью на экране длин сегментов. Интересно, что неправильное задание радиуса сопряжения не приводит к аварийному завершению программы.
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Привязки должны работать в момент ввода данных, но обязательно должны отключаться каждый раз в момент рисования. А потом восстанавливаться. Типа
Код:
|
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
|
|||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
Именно эти замечания я и ожидал увидеть. Можно оставить CMDECHO равной 1. Если количество командных строк не более 3, то фактически все промежуточные сообщения проскакивают незаметно. С OSMODE вообще связываться не хочу. Не думаем же мы об этой переменной, когда рисуем отрезки, просто устанавливаем заранее нужные нам объектные привязки. Да и F3 работает ведь. Честно скажу - совсем неохота расчитывать на дремучих пользователей.
|
|||
![]() |
|
||||
Инженер-строитель Регистрация: 15.08.2007
Киров
Сообщений: 2,204
|
Так быстрее и без эха в ком. строке.
А насчет добавленного позже кода, я (и не только) считаю, что после окончания работы программы сама система Автокада должна оставаться в таком же виде, что и непосредственно перед запуском лиспа. Вот запустит потом юзер просто _FILLET, а там уже какой-то непонятный радиус появился. А может у юзера вообще привычка делать _FILLET с радиусом 0? Короче, вспомни увлекательные приключения некоторых пользователей на тему FILEDIA. ![]() |
|||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
Да какой, блин, геморрой с привязками? Пользователь рисовал подобную трассу отрезками с нужными ему привязками или с отключенными привязками и никакого геморроя у него не образовалось. Точно так же, и с теми же привязками или без оных он будет тащить свою трассу с помощью программы. Суть-то программы в том, что теперь пользователю не надо прощелкивать трассу, отрисованную последовательными отрезками, командой "_FILLET" ("СОПРЯЖЕНИЕ"). Вот это главное.
Makswell, FILEDIA скрыта от пользователя, а при выполнении команды "_FILLET" на экран выводится текущее значение радиуса сопряжения, причем, независимо от значения переменной CMDECHO. И вообще, знаете, чем слаботочник обосновал необходимость такой программы? Думаете, он кабель или короб гнет по радиусу, скажем, 150 мм? Да нет, это не трубопровод. Просто ему нужно, чтобы его трассы на чертеже имели закругления в углах. В отличие от стен, которые закруглений в углах не имеют. Вот такая подоплёка. Еще добавлю. На форуме caduser.ru один пользователь предложил дополнить программу возможностью по ходу построения отменять сегменты. Что-то я сомневаюсь в необходимости этого для случая простых отрезков с дугами. Тем не менее, был бы рад подсказке, как это сделать. Во второй программе идет накопление объектов в наборе, из которого потом формируется полилиния. Если я отменю сегмент, этот объект из набора тоже исчезнет? Последний раз редактировалось Profan, 17.02.2009 в 18:43. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Profan, Отменять сегменты последовательно?
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
Код:
Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
Дима_, да я в принципе не спорю с тем фактом, что неправильно установленные привязки могут сыграть плохую роль при отрисовке объектов. Но в данном случае отрисовка производится вообще при выключенных привязках, а эту операцию мои заказчики выполняют нажатием клавиши F3. Вообще, отрисовку сетей они производят фактически на глазок, вдоль стен помещений и изредка могут временно включить привязку при подводке к какому-нибудь распределителю. В большинстве случаев отрисовка производится в режиме ОРТО, но иногда и при выключенным режиме ОРТО, что выполняется нажатием клавиши Shift. И вот тут есть своя проблема: клавиша Shift является клавишей временной замены (переключателем режима ОРТО). Но в то же время при нажатой клавише Shift радиус сопряжения временно сбрасывается в 0 - вот проблема, с которой я еще не разобрался. Или вот отмена последнего отрисованного сегмена в случае циклического выполнения команд с переназначением координат точек. А то - какие-то привязки. Задача специализированная. Конечно, если к ней подходить, как к некой абстрактной задаче отрисовки с неопределенными условиями - тогда можно и поизгаляться с предвосхищениям всех мыслимых условий. Но, может, к этому я еще вернусь, пока надо решить несколько принципиальных вопросов, возможно у заказчиков (пользователей) появятся дополнительные пожелания.
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Profan, Вот вариант с отменой. Добавил коментарии, должно быть понятно.
Остановлюсь на основном моменте. При отмене с помощью UNDO восстанавливается и состояние системных переменных, в том числе и USER* Поэтому 1. С помощью UNDOMARKS контролируем счетчик отмен, чтобы не отменить лишнего ![]() 2. Запоминаем X последней точки в USERR1, Y в USERR2. В случае отмены последнюю точку восстанавливает из этих переменных 3. Для сопряжения запоминаем метку (5 код dxf) последнего отрезка в переменной USERS2, в переменную USERS1 запоминаем предыдущее значение USERS2. Это позволит начать сопрягать начиная с 2 отрезков. 4. Для вызова сопряжения используем vl-cmdf. В случае невозможности сопрячь отрезки заданным радиусом не произойдет аварийного завершения команды. Вот как-то так Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
VVA, прими мою благодарность и благодарность моих друзей, все довольны и счастливы. В некоторый момент показалось, что твоя программа конфликтует с СПДС, но потом вяснилось, что все дело в настройках СПДС (там текущий масштаб типа линий все время сбрасывался в 1, в результате чего наши отрезки и дуги отрисовывались не так, как предполагалось).
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Версия с восстановлением переменных USER*, отменой результатов команды за 1 раз
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, Некоторые пожелания.
1. При запросе радиуса сопряжения можно добавить возможность указания радиуса курсором, сейчас можно только в ком строку вводить. 2. Если выйти из сети_пл нажатием escape, то полилиния не создастся. 3. Предположим полилиния или цепь из линий уже существуют. Было бы полезным иметь возможность обработать и уже существующие примитивы. 4. Что если нужно закрыть рисуемую полилинию (close), но так чтобы начало с концом опять таки замкнулись образуя округление? Такая функция была бы также весьма кстати. Что-то фонтазия моя разгулялась.
__________________
Блог Последний раз редактировалось Red Nova, 21.02.2009 в 19:54. |
||||
![]() |
|
||||
Profan,
Close и ввод радиуса - самое то, но, конечно же, вариант округления real time от VVA куда эффектнее.
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
Цитата:
Если ты про сопряжение, то посмотри, с чего тема начиналась. И вообще, первую программу я сочинил в таком виде (сопряженные отрезки) именно из-за эффектности отрисовки. Если бы конечной целью было бы просто получение трассы из отрезков и дуг, то ничего проще не было бы расчленить полилинию, полученную в программе, приведенную в сообщении 23 и все. Ведь даже возможность отмены отрисованных сегментов уже присутствует в команде "_PLINE". Странно, что никто не предложил такой простой способ - фактически решение обратной задачи. Последний раз редактировалось Profan, 22.02.2009 в 21:28. |
|||
![]() |
|
||||
Цитата:
Цитата:
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
Red Nova, я раньше написал, что программа была написана по просьбе слаботочников. Я предлагал им сразу оперировать полилинией при отрисовке трасс сетей. Но... не работают они с полилинией. Поэтому дополнительная возможность превращения массива отрезков и дуг в полилинию является факультативной. Однако, чувствую я, что им придется перейти на полилинию, когда я вплотную приступлю к составлению программ для проектирования телевизионного кабельного вещания с учетом затухания сигнала в кабеле в зависимости от длины кабеля. Задача, как видишь, специализированная. Если же тебе хочется приспособить данные программы для своих нужд, то, может, стоит создать соответствующую тему со своими пожеланиями. Хотя, можно ведь замкнуть и выполнить сопряжение первого и последнего сегментов получившейся полилинии вручную после выхода из программы. Можно, конечно, и здесь переделать программу, но у меня была цель сделать программу с минимальным количеством запросов и в последнем варианте дополнительные запросы вообще отсутствуют, если радиус сопряжения устраивает проектировщика. Именно из-за этого я убрал возвращение переменной FILLETRAD к начальному состоянию. Есть еще пока не проявившаяся проблема. У слаботочников может быть много линий связи, а слой для простановки длины сегментов образуется добавлением суффикса "_длина" к соответствующему имени слоя. Получается, например, такое имя слоя: "СС_пожар_длина". Так вот, боюсь, что слаботочникам может не понравится нагромождение новых слоев и придется программу как-то корректировать. Но в направлении удобства именно слаботочников, а не универсализации программы для любых нужд. Но это мои предпочтения, если VVA или другие товарищи пойдут тебе навстречу - ничего плохого не случится.
|
|||
![]() |
|
||||
Цитата:
................ Offtop: И все таки она вертится ![]()
__________________
Блог |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Начнем не по порядку
![]() Цитата:
2. прозрачно менять ПСК. Нужно. Пользователь прозрачно менять не сможет. Прозрачно менять сможешь ты, если захочешь. Цитата:
2. Решено. Выделено красным. 3. Pedit с опцией "Join" и Fillet с опцией "Polyline" 4. Добавлена. Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA,
У меня пока нормально не работает, возможно это из за русских терминов [Радиус/Замкни/Отмени], такое у меня частенько бывает. Радиус не вводится теперь ни с клавы ни с экрана, замыкание тоже не реагирует. На сколько я понял радиус должен вводится выбором в подменю. По моему субъективному мнению вариант когда радиус запрашивался в начале удобнее. Offtop: Profan, что-то не получается покинуть твою тему ![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
peditaccept не проверяешь...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
А зачем ее проверять, если отрисовка изначально выполняется исключительно отрезками?
Хотя, ты прав. У продвинутых пользователей, таких, как Vova, например, peditaccept вполне может оказаться равной 1 (для упрощения макросов). Это в моей конторе пользователи могут даже не подозревать о такой переменной. Подправлю. Последний раз редактировалось Profan, 08.02.2010 в 05:39. |
|||
![]() |
|
||||
конструктор машиностроитель Регистрация: 14.05.2007
Новосибирск
Сообщений: 893
|
Уважаемые аксакалы. Программа заинтересовала возможностью отрисовки траектории для последующего выдавливания при 3Д моделировании. В машиностроении нет длинных трасс (во всяком случае в моей практике), но приходиться моделировать линии гидропривода, пневмопривода и электрооборудования. Для этого лучше подходит отриовка с созданием полилинии но есть проблема, при отрисовке по всем осям x,y и z, в конце операции исчезает часть трассы.
Нельзя ли как то это исправить? И еще нельзя ли в процессе отрисовки менять радиус сопряжения? |
|||
![]() |
|
||||
Регистрация: 29.07.2011
Сообщений: 2
|
Уважаемые разработчики мегакласных штук а нельзя ли к этому лиспу добавить несколько функций.
Хотелось бы чтобы в конце итоговая полилиния оффсетилась (_offset) на определенное расстояние и разбивалась на отрезки (_explode). А исходная полилиния удалялась. Ради этого даже начал изучать LISP. И уже получилось сделать подобие и удалить исходную полилинию, но разбить подобную полилинию на отрезки никак не могу. Помогите пожалуйста. Заранее спасибо! |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Нужен LISP для суммы длин отрезков линни | ilka_t | LISP | 219 | 10.09.2019 10:22 |
Lisp (отрисовка колонны) не работает | dextron3 | LISP | 5 | 26.07.2008 20:14 |