|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377
|
Да в принципе точно так же - только разделителем для str-str-lst будет не "\t", а ";"
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Это применил. Вопрос в другом - как можно составить список, в котором будут данные такого типа: ("1" 4255443.36 12245413.22 623.56 "ладно") ? Т.е. читается строка из файла (четыре элемента) и записывается в список (символ число число символ). Сейчас у меня получается ("1" "4255443.36" "12245413.22" "623.56" "ладно") - все символьные значения. В принципе, потом после извлечения, можно применить atof для второго и третьего элементов.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377
|
(setq str ' ("1" "4255443.36" "12245413.22" "623.56" "ладно"))
(setq res (list (car str) (atof (cadr str)) (atof (caddr str)) (atof (cadddr str)) (last str))) Примерно так, пишу на коленке
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Цитата:
steq point (read-line f1) - создаем переменную point, в которую cчитывает все что есть в переменной f1 (то есть в файле). Почему он считывает все строки, а не только первую? Код:
list - создаем список из данных переменной point strcat (сцепляет данные в 1 строку? так бы они были в виде списка), а read - считывает данные из этой строки? Если просто использовать (list point) - cписок не создаст? Код:
entmakex - создание примитива, понятно. list - не понимаю зачем тут? У нас уже есть один список, созданный ранее. Они как между собой? Конфликтуют, объединяются? cons 0 "POINT" - выбор типа примитива, мы указываем point-точка. cons 10 '(x1 y1 z1) - указываем координаты начальной точки. Почему-то не работает? Зачем перед скобками ' - апостроф? На команды (print y1) (print y2) не обращайте внимания, это я для себя визуализировал правильно ли я понял логику списка, гду nth0, где nth1, где car, cadr |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Andrey55,
Продолжим обучение ![]() Цитата:
Обрати внимание, что полностью данное выражение в коде указано так: (while (setq point (read-line f1)) while - это цикл, (setq point (read-line f1)) это условие при прохождении которого цикл будет выполняться. Фактически, (read-line f1) может вернуть либо значение строки, либо значение nil (логический ноль, false), в том случае, если будет попытка прочесть значение в файле идущее после последней строки. И в тот момент когда переменной point будет присвоено значение nil произойдет выход из цикла, потому что цикл while работает ровно до того момента, пока условие выполения цикла будет true. Соответственно, по-простому, выражение (while (setq point (read-line f1)) можно сформулировать так: "до тех пор, пока в файле читается строка цикл продолжится, но если строку прочитать не удалось цикл прекратится. То есть, первый вызов (read-line f1) в цикле считает первую строку, второй вторую строку и т.д. И в тот момент когда очередной вызов (read-line f1) дойдет до конца файла и попытается прочитать строку еще раз, а читать будет нечего так так последняя строка уже прочитана, то переменной point будет присвоено значение nil и будет осуществлен выход из цикла. Теперь рассмотрим что еще происходит в цикле. Каждый раз когда будет прочитана очередная строка, будет также выполнено следующее действие: (setq point_list (append point_list (list (read (strcat "(" point ")"))))) Так как выражения в LISP выполняются справа на лево, рассмотрим их в этом порядке: 1. (read (strcat "(" point ")")) Объединение полученной строки с символами открывающей и закрывающей скобки, после чего следует буквальное прочтение строки функцией read, в результате чего строка трансформируется в список. Для новичка звучит, наверное, немного запутано, но это один из своеобразных трюков LISP. Пользуясь терминологией языков со статической типизацией, условно можно сказать, что данная операция - это неявное приведение типа. Отмечу также, что выражение (read (strcat "(" point ")")) можно использовать ТОЛЬКО если в качестве разделителя между значением координат в текстовом файле используются пробелы, но если разделитель будет любым другим, например запятой, такой код не будет работать. В этом случае нужно будет преобразовать строку в список в соответствии с указанным разделителем. Для этого, ты можешь воспользоваться соответствующей функцией из кода Кулик Алексей aka kpblc, либо аналогичной функцией от Lee Mac'a. 2. (list (read (strcat "(" point ")"))) Полученный в первом выражении список мы помещаем внутрь еще одного списка. Предположим, в результате первого выражения мы получили список '(15.7 35.9 12.2), в таком случае выражение (list '(11.8 22.8 33.8)) вернет нам '((11.8 22.8 33.8)). Обрати внимание, количество скобочек удвоилось, сформировался, так называемый, список списков, то есть ранее полученный список был помещен внутрь нового списка. 3. (setq point_list (append point_list (list (read (strcat "(" point ")"))))) Так как значение переменной до ее инициализации всегда nil (логический ноль, false), то в данном случае при чтении первой строки мы, фактически, получим выражение (append nil '((11.8 22.8 33.8))), в результате чего переменной point_list будет присвоен все тот же список '((11.8 22.8 33.8)) (значения координат могут быть любые, я привожу эти цифры лишь в качестве примера). Самое интересное будет происходить при чтении второй и последующей строк: так как значение переменной point_list теперь не nil, а список '((11.8 22.8 33.8)), а в результате чтения второй строки был получен еще один список, предположим, такой '((55.8 66.8 77.8)), тогда после выполнения выражения (append '((11.8 22.8 33.8)) '((55.8 66.8 77.8))) переменной point_list будет присвоен список '((11.8 22.8 33.8) (55.8 66.8 77.8)). Соответственно, при каждой новой прочтенной в файле строке, внутрь некого общего списка будет добавляться список координат полученный из прочтенной строки. Таким образом, если строк в файле всего три, в итоге будет получено примерно следующее '((11.8 22.8 33.8) (55.8 66.8 77.8) (13.8 14.8 15.8)). То есть количество вложенных списков будет равно количеству строк. А теперь о том, как нам добавить в чертеж точки, в соответствии с полученными ранее координатами из файла. И тут могут быть два варианта действий. Вариант 1. Предположим, ты пишешь сложную программу с дополнительным интерфейсом, где ты можешь выбрать опцию изменения порядка координат, или изменения количества знаков после запятой, или любую другую опцию, посредством которой, ранее полученный список должен быть подвержен некой трансформации. Тогда рациональным вариантом будет последующая работа с ранее полученным списком списков. Этот вариант, для новичка, имхо, будет немного сложнее второго варианта, поэтому, пока я его не рассматриваю. Вариант 2. Добавление точек в чертеж по мере того как будут читаться строки в нашем файле. В этом случае список списков можно не формировать, а сразу же добавлять значение получаемых координат к формируемым на чертеже точкам. Код:
На счет апострофа - это тема более сложная, и пока, как новичку можно этот вопрос оставить. Вместо такого представления списка '(11.8 22.8 33.8), ты можешь использовать (list 11.8 22.8 33.8). Результат выражения будет аналогичным. Апостроф, если вкратце, позволяет прочитать выражение буквально, без применения функции, что в теории может улучшить производительность, так как мы не затрачиваем ресурсы на вычисление функции (что, впрочем, не относится к лямбде, а только к списку), но апостроф не может быть применим к переменным внутри списка, а только к непосредственным значениям. В общем, пока оставь эту тему и используй функцию list. Последний раз редактировалось Browning Zed, 21.05.2023 в 16:16. |
|||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Цитата:
![]() Логику работы while и read понял, c nil тоже все ясно. Цитата:
Если рассмотреть этот кусок (опять добавил свои корявки): Код:
Все таки при команде read формируется список вида (11.8 22.8 33.8 55.8 66.8 77.8 13.8 14.8 15.8)? Или командой read он просто считывает, а дальше мы со считанной информацией работаем - либо присваиваем переменную считанной информации, либо формируем список командой list? Код:
Код не работает, пишет "слишком много аргументов". Думал дело в том, что в txt стоит табуляция вместо пробела, но замена ничего не решила. |
|||
![]() |
|
||||
это относится к синтаксису языка, и никак не к разделению данных пробелом или табуляцией, которая формально является также пробелом, который в свою очередь является натуральным разделителем синтаксических лексем в лиспе.
если нужно нарисовать точки по координатам из примерного файла, то это можно сделать так, без излишней печати промежуточных данных в консоль. Код:
но всё же правильнее сначала прочитать данные, закрыть файл, а потом выводить данные, например в точки. Код:
__________________
K Lisp Последний раз редактировалось koMon, 22.05.2023 в 17:25. |
||||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Код:
И поправьте если не прав, командой list мы далее создаем список графических примитивов - точек? Я думал list создает только списки чисел, которые висят в памяти. Далее, как я понимаю foreach. Мы создаем точки entmake для каждой записи, которая встретится в списках point и point_list? Но при этом ранее мы координаты точек cons 10 point брали из списка point? И вот тут вопрос, почему мы берем оба списка point и point_list? Ведь у нас должно случиться задвоение/наложение точек при выводе графики? Список point у нас вида (11.23 45.78 2388.34 3737.122 22.34 11.33), а список point_list ((11.23 45.78 2388.34) (3737.122 22.34 11.33)) С функцией foreach попробовал разобраться еще Код:
POINT POINT_LIST А вторая строка возвращает, как и положено список координат ((1254.65 654.26 6589.21) (206646.0 5486.15 164.25).... Ведь они тождествены по сути? |
|||
![]() |
|
||||
функция cons добавляет элемент в начало списка point.
потому что это точечная пара, из которых строится ассоциативный список групповых списков (точечных пар) для создания, в данном случае, примитива точка. потому что точечная пара (0 . "point") это константа, которую проще процитировать арострОфом, нежели создавать из переменных/констант LISP акроним для LIST Processing и в нём всё списки, см. на скобочки) списки могут объёдинять всё что угодно. Цитата:
Цитата:
Цитата:
функция quote или сокращённый её вариант (') цитирует ровно то, к чему она применяется '(point point_list) вернёт список символов POINT и POINT_LIST, это видно по их верхнему регистру. можно проверить функцией type. функция print выводит в консоль содержимое списка point_list. ни разу. переменной n foreach присваивается каждый из двух символов списка сивмолов '(point point_list). (setq n_list '(point point_list))->(POINT POINT_LIST) см. выше.
__________________
K Lisp Последний раз редактировалось koMon, 23.05.2023 в 16:29. |
||||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Продолжаем движение. Решил маленько улучшить:
Код:
![]() Команду alert добавил, тоже работает. Сейчас буду пробовать прикрутить построение 3Dполилинии по этим точкам. |
|||
![]() |
|
||||
Flag 8 (bit 3) If this bit is set and bit 0 is not set, getfiled performs a library search for the file name entered. If it finds the file and its directory in the library search path, it strips the path and returns only the file name. (It does not strip the path name if it finds that a file of the same name is in a different directory.) If this bit is not set, getfiled returns the entire file name, including the path name. Set this bit if you use the dialog box to open an existing file whose name you want to save in the drawing (or other database).
открыть файл только по его имени конечно можно... (getfiled "Select file with coordinates" "d:/lisp/" "txt;doc;dwg;lsp" 2)
__________________
K Lisp |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377
|
Проверяй vla-get-visible, к примеру.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377
|
(setq att (vl-remove-if (function (lambda(x) (equal (vla-get-visible x) :vlax-false))) att_list)
Примерно так
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Цитата:
(#<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a188> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a2a8> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a3c8>) !att выводит такое же значение (#<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a188> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a2a8> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a3c8>) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,377
|
Блочок бы глянуть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |