| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,980

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1972146
 
Непрочитано 18.05.2023, 19:37
#4401
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Да в принципе точно так же - только разделителем для str-str-lst будет не "\t", а ";"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.05.2023, 20:07
#4402
1958


 
Регистрация: 16.04.2016
Сообщений: 72


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
только разделителем для str-str-lst будет не "\t", а ";"
Это применил. Вопрос в другом - как можно составить список, в котором будут данные такого типа: ("1" 4255443.36 12245413.22 623.56 "ладно") ? Т.е. читается строка из файла (четыре элемента) и записывается в список (символ число число символ). Сейчас у меня получается ("1" "4255443.36" "12245413.22" "623.56" "ладно") - все символьные значения. В принципе, потом после извлечения, можно применить atof для второго и третьего элементов.
1958 вне форума  
 
Непрочитано 18.05.2023, 20:10
1 | #4403
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


(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-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.05.2023, 04:13
#4404
1958


 
Регистрация: 16.04.2016
Сообщений: 72


Спасибо, Алексей!
У меня получилось вот так:
Код:
[Выделить все]
 (defun str-str-lst (str pat / i) ;Evgeny Elpanov
 (cond ((= str "") nil)
       ((setq i (vl-string-search pat str))
        (cons (substr str 1 i) (str-str-lst (substr str (+ (strlen pat) 1 i)) pat)) ;_  cons
       )
       (t (list str))
 )
)
(defun c:22 (/)
 (setq res nil)
 (setq file   (getfiled "Âûáîð ôàéëà :" (getvar 'dwgprefix) "csv" 16)
       handle (open file "r")
 )
 (while (setq str (read-line handle))
  (setq str (str-str-lst str ";"))
  (setq res (cons (list (car str)
                        (atof (cadr str))
                        (atof (caddr str))
                        (atof (cadddr str))
                        (last str)
                  )
                  res
            )
  )
 )
 (close handle)
 (setq res (reverse res))
)
1958 вне форума  
 
Непрочитано 19.05.2023, 09:05
#4405
Andrey55


 
Регистрация: 18.05.2023
Сообщений: 6


Цитата:
Сообщение от koMon Посмотреть сообщение
именно понимает. если сохранить этот список в переменную или составить список из таких точек, то можно обращаться к индивидуальным точкам такого списка.

----- добавлено через ~15 мин. -----
Код:
[Выделить все]
 
(defun c:FF (/ f1 point point_list)
	(setq f1 (open "d:\\lisp\\coor.txt" "r"))
	(while (setq point (read-line f1))
		(setq point_list (append point_list (list (read (strcat "(" point ")")))))
	)
	(print point_list)
  	(close f1)
)
1-я точка из списка -> (nth 0 point_list)
координата X 1-й точки (car (nth 0 point_list))
координата Y 1-й точки (cadr (nth 0 point_list))
координата Z 1-й точки (caddr (nth 0 point_list))
и т.д.
setq f1 - мы присваиваем имя переменной f1 - нашему файлу
steq point (read-line f1) - создаем переменную point, в которую cчитывает все что есть в переменной f1 (то есть в файле). Почему он считывает все строки, а не только первую?
Код:
[Выделить все]
 (setq point_list (append point_list (list (read (strcat "(" point ")")))))
Зачем использована команда append? Как я понимаю работает, как объединение списков (append <список1> [<список2> … <списокN>])
list - создаем список из данных переменной point
strcat (сцепляет данные в 1 строку? так бы они были в виде списка), а read - считывает данные из этой строки? Если просто использовать (list point) - cписок не создаст?

Код:
[Выделить все]
   (defun c:FF (/ f1 point point_list x1 y1 z1)
	(setq f1 (open "d:\\lisp\\coor.txt" "r"))
	(while (setq point (read-line f1))
		(setq point_list (append point_list (list (read (strcat "(" point ")")))))
	)
	(print point_list)
        (setq x1 (car (nth 0 point_list)) y1 (cadr (nth 0 point_list)) z1 (caddr (nth 0 point_list)))
        (setq x2 (car (nth 1 point_list)) y2 (cadr (nth 1 point_list)) z2 (caddr (nth 1 point_list)))
        (print y1) (print y2)
        (entmakex (cons 0 "POINT") (cons 10 '(x1 y1 z1)))
        (close f1)
)
Добавил переменные x1 y1 z1 (понимаю, что как-то делается проще, но пока процесс понимаю только так) и модифицировал строчку предложенную Browning Zed - не работает.
entmakex - создание примитива, понятно.
list - не понимаю зачем тут? У нас уже есть один список, созданный ранее. Они как между собой? Конфликтуют, объединяются?
cons 0 "POINT" - выбор типа примитива, мы указываем point-точка.
cons 10 '(x1 y1 z1) - указываем координаты начальной точки. Почему-то не работает? Зачем перед скобками ' - апостроф?

На команды (print y1) (print y2) не обращайте внимания, это я для себя визуализировал правильно ли я понял логику списка, гду nth0, где nth1, где car, cadr
Andrey55 вне форума  
 
Непрочитано 21.05.2023, 12:48
2 | #4406
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


Andrey55,
Продолжим обучение
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
steq point (read-line f1) - создаем переменную point, в которую cчитывает все что есть в переменной f1 (то есть в файле). Почему он считывает все строки, а не только первую?
(read-line f1) считывает только одну строку в файле (open "d:\\lisp\\coor.txt" "r") и помещает значение этой строки в переменную point. И если файл не закрыт (а он у нас пока не закрыт, т.е. статус файла "open"), в данном случае каждый новый вызов (read-line f1) будет считывать следующую строку.
Обрати внимание, что полностью данное выражение в коде указано так:
(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. Добавление точек в чертеж по мере того как будут читаться строки в нашем файле. В этом случае список списков можно не формировать, а сразу же добавлять значение получаемых координат к формируемым на чертеже точкам.
Код:
[Выделить все]
 (defun c:FF (/ f1 point point_list)
	(setq f1 (open "d:\\lisp\\coor.txt" "r"))
	(while (setq point (read-line f1))
		(entmakex (cons 0 "POINT") (cons 10 (read (strcat "(" point ")"))))
	)
  	(close f1)
)
Но второй вариант будет работать ТОЛЬКО если в строках файла приведены значения координат формата "координата_X координата_Y координата_Z". А если в строках содержится какая-либо другая информация, либо порядок координат иной, например формата: "имя_точки, координата_Y, координата_X, координата_Z, какое-то значение", тогда в код необходимо будет вносить изменения.

На счет апострофа - это тема более сложная, и пока, как новичку можно этот вопрос оставить. Вместо такого представления списка '(11.8 22.8 33.8), ты можешь использовать (list 11.8 22.8 33.8). Результат выражения будет аналогичным. Апостроф, если вкратце, позволяет прочитать выражение буквально, без применения функции, что в теории может улучшить производительность, так как мы не затрачиваем ресурсы на вычисление функции (что, впрочем, не относится к лямбде, а только к списку), но апостроф не может быть применим к переменным внутри списка, а только к непосредственным значениям. В общем, пока оставь эту тему и используй функцию list.

Последний раз редактировалось Browning Zed, 21.05.2023 в 16:16.
Browning Zed вне форума  
 
Непрочитано 21.05.2023, 14:18
#4407
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Browning Zed, 👍
__________________
K Lisp
koMon вне форума  
 
Непрочитано 22.05.2023, 12:47
#4408
Andrey55


 
Регистрация: 18.05.2023
Сообщений: 6


Цитата:
Фактически, (read-line f1) может вернуть либо значение строки
Вам бы учебники писать. Я из этой цитаты наконец-то понял, что значит возвращает Мы ему команду/запрос, а он нам возвращает действие/ответ? Сколько литературы и справочников посмотрел, никак не мог понять.
Логику работы while и read понял, c nil тоже все ясно.
Цитата:
3. (setq point_list (append point_list (list (read (strcat "(" point ")")))))
Долго вчитывался в данный пункт, но все таки понял, как этот трюк с append работает. Мы каждую строку заключаем в скобки, считываем и формируем list. Это все проделывается для формирования надсписка понятного программе, где каждый подсписок (новая строка в исходном файле) будет для нее отдельной точкой (XYZ)? Это прям очень круто.
Если рассмотреть этот кусок (опять добавил свои корявки):
Код:
[Выделить все]
 (while (setq point (read-line f1))
		(setq point_list (append point_list (list (read (strcat "(" point ")")))))
	)
	(print point_list)
         (print point)
Переменную point он не выводит на печать, пишет nil. Т.е. ее обязательно надо загнать в список командой list и сформировать список point_list, иначе он нас не понимает.

Все таки при команде read формируется список вида (11.8 22.8 33.8 55.8 66.8 77.8 13.8 14.8 15.8)? Или командой read он просто считывает, а дальше мы со считанной информацией работаем - либо присваиваем переменную считанной информации, либо формируем список командой list?
Код:
[Выделить все]
 (cons 10 (read (strcat "(" point ")"))
Как я понимаю, если не задавать доп.условия, то по команде cons 10 функция автоматически понимает что в скобках за ней идут X Y Z (через пробел) по порядку? Т.е. даже не надо присваивать переменные, как я делал x1 y1 z1, x2 y2 z2 итд.

Код не работает, пишет "слишком много аргументов". Думал дело в том, что в txt стоит табуляция вместо пробела, но замена ничего не решила.
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок экрана 2023-05-22 154704.jpg
Просмотров: 30
Размер:	20.9 Кб
ID:	256029  
Andrey55 вне форума  
 
Непрочитано 22.05.2023, 16:42
1 | #4409
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от Andrey55 Посмотреть сообщение
"слишком много аргументов"
это относится к синтаксису языка, и никак не к разделению данных пробелом или табуляцией, которая формально является также пробелом, который в свою очередь является натуральным разделителем синтаксических лексем в лиспе.
если нужно нарисовать точки по координатам из примерного файла, то это можно сделать так, без излишней печати промежуточных данных в консоль.

Код:
[Выделить все]
 
(defun c:FF (/ f1 point)
	(setq f1 (open "d:\\lisp\\coor.txt" "r"))
	(while (setq point (read-line f1))
		(entmake (list '(0 . "point") (cons 10 (read (strcat "(" point ")")))))
	)
  	(close f1)
)
функция read возвращает первый список или первый атом из прочитанной строки.

но всё же правильнее сначала прочитать данные, закрыть файл, а потом выводить данные, например в точки.

Код:
[Выделить все]
 
(defun c:FF (/ f1 point point_list)
	(setq f1 (open "d:\\lisp\\coor.txt" "r"))
	(while (setq point (read-line f1))
		(setq point_list (append point_list (list (read (strcat "(" point ")")))))
	)
  	(close f1)
	(foreach point point_list
		(entmake (list '(0 . "point") (cons 10 point)))
	)
	(princ)
)
__________________
K Lisp

Последний раз редактировалось koMon, 22.05.2023 в 17:25.
koMon вне форума  
 
Непрочитано 23.05.2023, 06:43
#4410
Andrey55


 
Регистрация: 18.05.2023
Сообщений: 6


Код:
[Выделить все]
  
	(foreach point point_list
		(entmake (list '(0 . "point") (cons 10 point)))
Вот это читаем справа на лево. Задаем команду cons 10 point - программа берет данные из списка point - понятно, далее указываем тип примитива 0 . "point" - почему между 0 и "point" точка, и почему перед 0 не прописали опять cons?
И поправьте если не прав, командой 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 попробовал разобраться еще
Код:
[Выделить все]
         (foreach n '(point point_list) (print n))
        (print point_list)
Почему 1-я строка возвращает просто надписи
POINT
POINT_LIST
А вторая строка возвращает, как и положено список координат ((1254.65 654.26 6589.21) (206646.0 5486.15 164.25)....
Ведь они тождествены по сути?
Andrey55 вне форума  
 
Непрочитано 23.05.2023, 09:44
1 | #4411
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от Andrey55 Посмотреть сообщение
Задаем команду cons 10 point
функция cons добавляет элемент в начало списка point.
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
почему между 0 и "point" точка
потому что это точечная пара, из которых строится ассоциативный список групповых списков (точечных пар) для создания, в данном случае, примитива точка.
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
почему перед 0 не прописали опять cons
потому что точечная пара (0 . "point") это константа, которую проще процитировать арострОфом, нежели создавать из переменных/констант
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
Я думал list создает только списки чисел
LISP акроним для LIST Processing и в нём всё списки, см. на скобочки) списки могут объёдинять всё что угодно.


Цитата:
Сообщение от Andrey55 Посмотреть сообщение
как я понимаю foreach. Мы создаем точки entmake для каждой записи, которая встретится в списках point и point_list
foreach применяет выражения для каждого члена списка по динамически созданной переменной, в данном случае point. то есть берётся каждая координата из прочитанных в список point_list из текстового файла координат, и для создания примитива точка создается ассоциативный список (см. выше) для выполнения функции entmake, которая создаёт и добавляет в базу данных черетежа примитив точка для каждой координаты списка point_list.

Цитата:
Сообщение от Andrey55 Посмотреть сообщение
Но при этом ранее мы координаты точек cons 10 point брали из списка point?
ну, ранее было так, теперь так)
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
Список 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))
в переменную point мы по очереди помещаем координаты каждой прочитанной точки из текстового файла, список point_list содержит все прочитанные точки по порядку их нахождения в текстовом файле, то есть это список, который состоит из списков.
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
Почему 1-я строка возвращает просто надписи
функция quote или сокращённый её вариант (') цитирует ровно то, к чему она применяется '(point point_list) вернёт список символов POINT и POINT_LIST, это видно по их верхнему регистру. можно проверить функцией type.
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
А вторая строка возвращает, как и положено список координат
функция print выводит в консоль содержимое списка point_list.
Цитата:
Сообщение от Andrey55 Посмотреть сообщение
Ведь они тождествены по сути?
ни разу. переменной n foreach присваивается каждый из двух символов списка сивмолов '(point point_list). (setq n_list '(point point_list))->(POINT POINT_LIST) см. выше.
__________________
K Lisp

Последний раз редактировалось koMon, 23.05.2023 в 16:29.
koMon вне форума  
 
Непрочитано 25.05.2023, 06:27
#4412
Andrey55


 
Регистрация: 18.05.2023
Сообщений: 6


Продолжаем движение. Решил маленько улучшить:
Код:
[Выделить все]
  
(defun c:GG (/ f1 point point_list)
  (setq f1 (open (getfiled "Select file with coordinates" "d:/lisp/" "lsp;txt;doc;dwg" 8) "r"))
		(while (setq point (read-line f1))
		(setq point_list (append point_list (list (read (strcat "(" point ")")))))
	)
  	(close f1)
	(foreach point point_list
		(entmake (list '(0 . "point") (cons 10 point)))
	)
        (alert "Points imported successfully.")
	(princ)
)
Осваиваем команду getfiled. Как прописано в коде выше, позволяет выбрать файл и импортирует точки (для меня чудо какое-то что оно работает). Но если в списке расширений "lsp;txt;doc;dwg" я переношу lsp в конец списка, т.к. мне надо чтобы приоритетное для выбора было все же txt, то оно перестает работать "неверный тип аргумента: FILE nil". Почему так?
Команду alert добавил, тоже работает.
Сейчас буду пробовать прикрутить построение 3Dполилинии по этим точкам.
Andrey55 вне форума  
 
Непрочитано 26.05.2023, 10:17
1 | #4413
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


Цитата:
Сообщение от Andrey55 Посмотреть сообщение
Почему так?
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
koMon вне форума  
 
Непрочитано 31.05.2023, 10:13
#4414
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107


Есть блок, в котором присутствуют один или несколько атрибуты, но только один атрибут - видимый.
Как получить имя тега видимого атрибута указанного блока?

Последний раз редактировалось Sege, 31.05.2023 в 10:18.
Sege вне форума  
 
Непрочитано 31.05.2023, 10:19
#4415
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Проверяй vla-get-visible, к примеру.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.05.2023, 10:28
#4416
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Проверяй vla-get-visible, к примеру.
Код:
[Выделить все]
 
(setq obj (vlax-ename->vla-object (car (entsel))))
(setq temp (vla-GetAttributes obj))
(setq att_list (vlax-safearray->list (vlax-variant-value temp)))
а дальше как?
Sege вне форума  
 
Непрочитано 31.05.2023, 10:35
1 | #4417
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


(setq att (vl-remove-if (function (lambda(x) (equal (vla-get-visible x) :vlax-false))) att_list)

Примерно так
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.05.2023, 10:47
#4418
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq att (vl-remove-if (function (lambda(x) (equal (vla-get-visible x) :vlax-false))) att_list)

Примерно так
!att_list
(#<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>)
Sege вне форума  
 
Непрочитано 31.05.2023, 11:22
#4419
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Блочок бы глянуть.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.05.2023, 11:38
#4420
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Блочок бы глянуть.
блок.dwg
вот
Sege вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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