|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
07.07.2019, 23:39 | #1 | |
Как ввести точки циклом?
Регистрация: 07.07.2019
Сообщений: 8
|
||
Просмотров: 5273
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Понять, что lisp ориентирован на обработку списков, и этим воспользоваться.
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
|
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
koMon, ??
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 07.07.2019
Сообщений: 8
|
Цитата:
Код:
И тут просто список подряд их, мне это не нужно было . Код:
|
|||
|
||||
Регистрация: 07.07.2019
Сообщений: 8
|
Цитата:
Я её и объявляю, мой код работает. Теперь я хочу его сократить, оптимизировать процесс, но пока я получил список с именем pt, где я каждый элемент могу вынести в отдельный список. Определена переменная у меня в начале программы, все переменные определены. Так что я не понимаю, к чему ты клонишь? Можно мне в ЛИСП как в Делфи присвоение от i 1 до n выполнить считывание pn и сохранить его координаты через ввод мышкой? И разбить на p1 (x1, y1); p2 (x2,y2) .... pn(xn, yn)? |
|||
|
||||
Регистрация: 07.07.2019
Сообщений: 8
|
Цитата:
----- добавлено через ~10 мин. ----- Цитата:
Запустил код выше, он запросил у меня n точек и создал список длинной n. У меня есть код, он рабочий мне нужно было его оптимизировать. 12 строчек кода, 4 запроса точки, и выделение координат x,y у каждой точки. Вы мне предложили 12 строчек кода, по созданию списка. И я могу оттуда взять все точки и могу оттуда взять все x и y. Но это удлинит код. Мне нужно оптимизировать и минимизировать код. Можно мне в ЛИСП как в Делфи От i =1 до n ввести g1,g2,...,gn сохранить это всё в переменные (x1,y1) ... (xn,yn) для этих точек? |
|||
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588
|
я в лиспе понимю даже меньше вашего, но вот Вам гуру и написал функцию для получения списка точек, при этом список может быть любой длинны и Вам достаточно просто запихнуть эту функцию к себе в код и вызывать по необходимости. ПРи желании можете весь этот код в одну строчку свернуть... если для Вас количество строк так важно:
Код:
Если у Вас есть опыт написания на Дельфи, и появилась потребность писать под автокад, то зачем Вы выбрали для этого функциональный лисп, почему не воспользоваться привычными процедурными или ООП языками, коих под автокад масса, начиная от VBA и питона, всего зоопарка .NET платформы и заканчивая C++? За что Вы так себя не любите то? |
|||
|
||||
Регистрация: 18.12.2010
Сообщений: 5,057
|
Цитата:
Цитата:
Цитата:
|
|||
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,835
|
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
Offtop: уточнение: если хотят - помогают) Это не платная техподдержка, да и профессиональных программистов практически тут нет - есть несколько сотен продвинутых пользователей, которые помимо основной деятельности освоили и прикладное программирование в достаточных для реализации их потребностях объемах.
Можно и на привычном дельфи через COM-интерфейс работать с акадом) Не все доступно через COM, но подобное описанного в данной ветке - запросто. если ты готов тратить время на решение типовых задач на лиспе вместо взятия готовых решений из фреймворка/библиотек - вэлком) |
|||
|
||||
Регистрация: 07.07.2019
Сообщений: 8
|
Цитата:
Программа уже порядка 50 строчек, и она будет действительно увеличиваться действительно строк до 1200, посему и хочу сократить код сразу. Это просто ввод начальный, пока экспериментирую с 4мя точками и т.д. ----- добавлено через ~3 мин. ----- Так, выглядит похоже. А он сделаем мне g1,g2,g3,g4??? или он мне оставит все x,y,z но без самой точки? А как ввести количество точек мне просто в консоль? Ну чтобы он запросил у меня до какого числа мы это делаем? например n. Есть оператор подскажите ещё раз для этого случая. Чтобы я мог действительно это же задать для 100 точек) или 10 ))) По предварительному запросу количества точек? ----- добавлено через ~5 мин. ----- Цитата:
----- добавлено через ~9 мин. ----- Цитата:
Можно конечно занятся вопросами оптимизации и минимализации кода в конце, но такое себе решение. Лучше сейчас сразу его облегчить. Ну вот, чего только не сделаешь для любимой девушки, даже начнёшь разбираться в ЛИСПе. ))) И зачем мне какой-то левый язык, если есть ЛИСП!? Ну в плане, задачи в Autocad, значит нужно брать язык программирования именно для него. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Мой опыт говорит, что надо не столько облегчать код, сколько делать его масштабируемым и наращиваемым. Уж лучше сразу делать универсальный вариант (который будет учитывать любое количество точек - от 0 до овердофига), и потом его использовать. Особенно если заранее не известны граничные условия применения.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
ну хотя бы по той простой причине:
1. Развития лиспа фактически не происходит, т.е. придется многое писать самому или искать готовые примеры кода. 2. Если критична скорость исполнения, то в .Net/ObjectARX достигните заметного "подтормаживания" гораздо позже, имхо. 3. Если будут нужны диалоги - в том же .Net накидали контролы мышкой на форму и дописали код обработчиков (если тот же WinForms использовать). В лиспе процесс гораздо интереснее, а если диалог еще и с динамикой..) 4. Аутодеск достаточно активно продвигает тот же .Net, поэтому левым назвать этот язык (точнее, технологию программирования).. Вот раньше альтернативы не было, поэтому столько упоминаний лиспа. У кого уже написаны значительные библиотеки/программы на лиспе - тоже "поют ему дифирамбы". Но начинать с нуля вникать в этот язык, если нет однозначного требования именно на лиспе писать - я тоже на дельфи писал в свое время (не под акад), потом пробовал и на лиспе писать, но оказалось проще перейти на .Net и "забыть" лисп - привычнее и понятнее)) |
|||
|
||||
Регистрация: 07.07.2019
Сообщений: 8
|
Цитата:
1-ое Много точек, хорошо, но там будут просто координаты в едином списке, чтобы вывести из него n элементов и задать их в g1....gn не написано. Посему будет 4 точки, он сохранит список. будет 10 точек, и выводить так же придётся 10. Но как вывести именно то число, сколько точек??? А не просто, запрашивать пока я не нажму "отмету". ----- добавлено через ~2 мин. ----- Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Еще раз: а на фига их закидывать в g1..gN? nth / foreach / mapcar / while никуда не деваются и прекрасно работают. В Delphi при работе в цикле на каждый проход тоже своя переменная назначается?
Да, все это и еще раз 50 столько же.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 07.07.2019
Сообщений: 8
|
Цитата:
Foreach - вернёт только значение последнего выражения - как это обойти?) while - LISP умеет обратится в цикле к переменной? g"n" или g'n' или g(тут что-то n), чтобы n менялось и получалось g1, g2, g3, ..., gn Как мне обратится подобным образом? |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Цитата:
Пишу насухую, без редактора, только чтобы показать общий принцип: (setq c 0) (mapcar '(lambda(pt) (entmakex (list (cons 0 "point")(cons 10 x) (cons 62 (if (> c 255) (setq c 1) (setq c (1+ c))))))) pt-list) (setq c 0) (foreach item pt-list (entmakex (list (cons 0 "point")(cons 10 x) (cons 62 (if (> c 255) (setq c 1) (setq c (1+ c)))))) ) И т.д, и т.п. pt-list = список координат, который получен ранее. ----- добавлено через 45 сек. ----- Кто-то запрещает внутри цикла что-то выполнять? Или все же "делай че хоцца (ну, почти все)?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
Без проверки .Net код для примера (в виде функции):
Код:
если указать количество, то функция вернет либо список с указанными точками, либо null - если прервет выбор. Если без аргументов вызывать - будет до бесконечности запрашивать точки, пока не отменить ввод. Если не было выбрано ни одной точки - вернет тоже null. p.s. Ну и тысяча строк в .Net - это так, разминка) ----- добавлено через ~3 мин. ----- А доступ к координатам: Результат вызова функции[%Индекс%].X Результат вызова функции[%Индекс%].Y Результат вызова функции[%Индекс%].Z без всяких затей) |
|||
|
||||
Регистрация: 07.07.2019
Сообщений: 8
|
Цитата:
Ну тут вот понятный мне цикл for - мой любимый: // Запрашиваем точки в цикле for (int i = 0; i < aCountPoints; i++) { и вот это в моей голове вполне логичная запись: lListPoints.Count + 1)); а т, что происходит пока в ЛИСПе, для меня периодически магия) |
|||
|
||||
Регистрация: 18.12.2010
Сообщений: 5,057
|
и не забываем про Джигу!
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
так и писал выше
умом понимаешь списочную сущность лиспа, а чтобы вместо круглых скобочек и знакомых ключевых слов видеть логическую структуру программы - это надо достаточно долго и активно на нем писать. За это время, если начинать с нуля - можно разобраться в основах .Net и писать код в привычном виде, имхо) |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
Можно не только интерполяцию строк, но сам код сократить в два раза - если не задано количество точек для ввода, то назначать int.MaxValue - для ручного ввода это будет эквивалентно бесконечному циклу. Но тогда не удастся задать точную емкость списка в случае указания количества точек, а List ведет себя "агрессивно", захватывая при увеличении списка в два раза больше емкости, чем было - т.е. некоторый перерасход ресурсов. Просто показал в примере, насколько привычнее будет запись в .Net по сравнению с лиспом, особенно если раньше на других языках программировали.
|
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Вот так точно не нужно делать. Стоит только пользователю не указать правильно точку и программа рухнет.
Не зря Алексей в #2 показал ввод точек с использованием vl-catch-xxx. Это аналог try ... except ... end в Delphi. И вообще надо отделять "мух от котлет" с помощью библиотечных функций. Одна - надежно позволяющая ввести любое количество точек и возвращающая их список. А другая - вытащить из этого списка требуемые данные точек. Ну а что касается систем программирования - так это из серии "зачем они требуют хлеба, почему не едят пирожные". AutoCAD хорош тем, что можно использовать разные среды в зависимости от характера задач. |
|||
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588
|
Цитата:
Цитата:
Умеешь писать на дельфи, ну так и пиши на нем, зачем ломать себе мозг? |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
Offtop: Ради интереса посмотрел у Kean Walmsley в блоге - первые статьи по .Net в акаде датированы серединой 2006 года. На русскоязычных форумах тоже примерно в эти года начинают мелькать посты данной тематики. Т.е. уже 10+ лет прошло с начала популязации данной технологии) Сам фреймворк в 2002 году появился.
Но по странной прихоти "нормальные" языки типа сишных давали на первых курсах вузов/универов в основном только связанным с ИТ специальностям, а других "технарей" пичкали тем же Дельфи. Типа учебный язык, со строгой типизацией и т.д. Правда и от Дельфи большинство бегало, ища готовые программы на предыдущих курсах. Отучились - теперь ищут готовые программы для упрощения своей работы, рассказывая душещипательные истории о том, что они ничего в этом не понимают. Некоторые ведутся на это до сих пор - ну это их право) |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Писать на Delphi для AutoCAD - это все равно, что управлять марсоходом по радио. Многое там будет очень сложно, а то и невозможно вообще.
Попробуйте, например по теме ветки получить в Delphi-программе циклом точки введенные пользователем. С "резиновой нитью" от предыдущей точки, с возможностями объектной привязки, отмены. То, что элементарно делается на Лисп. В Delphi (если уж работаешь с этой средой) надо делать то, что в ней лучше делать. Например диалоги, визуальная работа с БД. Причем запускаться это должно опять же из ЛИС-программы, работающей внутри Автокада. Как даже ARX-приложения запускаются. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
Цитата:
Код:
Правда, это написано на VBA из экселя, но какая собственно разница?) Можно разделить реакцию на Esc и на нажатие правой кнопки мыши, использовав апишную функцию GetAsyncKeyState. Ну и для упрощения не показывал проверки подключения к акаду, получения текущего документа, проверки состояния готовности акада перед очередным обращением к нему. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,041
|
Цитата:
Не всегда это нужно. А если работать в домене акада изнутри - то зачем в настоящее время городить: когда можно все писать сразу в том же .Net в одном "флаконе"? Новичкам, у которых нет своих наработанных библиотек на лиспе под большинство типовых задач - стоит ли им тратить время на освоение данного языка? Или все-таки изучить языки общего применения в это время? |
|||
|
||||
7 дней для такого решения как-то маловато будет имхо
----- добавлено через ~17 ч. ----- не понятна цель учебно-практической задачи. 1. написать код циклического ввода точек? вариант с резинкой от первой/последней до следующей точки ввода с отслеживанием esc, пустого ввода. всё лучше чем вслепую тыкать. Код:
3. если нужно получить кликнутые точки в виде экзотического списка, так это можно сделать на этапе формирования списка. 4. выбрать нужную точку/координаты нужной точки можно по индексу этой точки в сформированном списке. можно сделать и массив с координатами. но поскольку в лиспе нет динамического массива, то и заморачиваться не стоит. и поскольку он писал для работы без ошибок, то и их обработка в лиспе та ещё заморочка. и вот теперь мне стало совершенно понятно на чём писал дьявол Последний раз редактировалось koMon, 16.07.2019 в 16:49. |
||||
|
||||
Цитата:
можно пример написать по образцу: Код:
----- добавлено через ~1 мин. ----- просто словами опишите чего вы хотите добиться
__________________
Вечность это: (while T) |
||||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Круги в точки | Димас | AutoCAD | 11 | 26.06.2014 09:37 |
Как найти предельно допустимое расстояние от наиболее удаленной точки помещения до ближайшего эвакуационного выхода. | RuMan | Архитектура | 1 | 21.12.2013 21:59 |
AutoCAD Civil 3D 2011 (Rus) - неактивна функция изменения стиля метки точки в палитре свойств | rollstream | Вертикальные решения на базе AutoCAD | 5 | 13.11.2013 14:37 |
Как вычислить расстояние от точки до точки методами ActiveX? | Supermax | Программирование | 31 | 20.11.2009 12:23 |
Нахождение точки пересечения на 3D сети | Electa | AutoCAD | 15 | 16.12.2008 18:36 |