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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1848544
 
Непрочитано 25.04.2022, 22:01
#4241
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 9,801


ну так сами же написали
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
(setq entity
Сергей812 вне форума  
 
Непрочитано 26.04.2022, 06:51
#4242
Alxndr1697


 
Регистрация: 24.01.2008
Подольск
Сообщений: 160


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну так сами же написали
Источник вопроса был парой постов выше (4238)
Alxndr1697 вне форума  
 
Непрочитано 26.04.2022, 07:35
#4243
koMon


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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Тут, видимо произошло некоторое недопонимание.
Да нет, я именно предлагал заменить рисование 3d боксов, команда box, вставкой блоков. Правда для операций вычитание... потребуется их членить.
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Почему он запоминается под тем же именем?
Потому что никто не запрещает её использовать так) последовательно назначать ей следующий примитив после отрисовки второго ящика после последнего до операции отрисовки второго ящика до окончания примитивов базы. Как-то так, но сам вопрос не очень понятен.
koMon вне форума  
 
Непрочитано 26.04.2022, 07:52
#4244
Alxndr1697


 
Регистрация: 24.01.2008
Подольск
Сообщений: 160


Цитата:
Сообщение от koMon Посмотреть сообщение
Потому что никто не запрещает её использовать так) последовательно назначать ей следующий примитив после отрисовки второго ящика после последнего до операции отрисовки второго ящика до окончания примитивов базы. Как-то так, но сам вопрос не очень понятен.
Я попробовал изменить имя (мне так показалось логичней),- ан нет, работать перестало.
Вот и получается, что имя именно должно быть неизменным, а почему, мне не понятно. Хочу понять логику, когда переменная может переопределяться в процессе работы программы, а когда нет.
Alxndr1697 вне форума  
 
Непрочитано 26.04.2022, 08:24
#4245
Кулик Алексей aka kpblc
Moderator

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


"Имя" = "наименование переменной"?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.04.2022, 09:00
#4246
koMon


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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Я попробовал изменить имя (мне так показалось логичней),- ан нет, работать перестало.
Вот и получается, что имя именно должно быть неизменным, а почему, мне не понятно. Хочу понять логику, когда переменная может переопределяться в процессе работы программы, а когда нет.
заменить Entity на другое? При замене не работает? Быть такого не могёт! надо во всём красном заменить Entity на что-то другое, лучше автозаменой)
koMon вне форума  
 
Непрочитано 26.04.2022, 21:02
#4247
Alxndr1697


 
Регистрация: 24.01.2008
Подольск
Сообщений: 160


Прошу прощения за задержку, - умчался на работу.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
"Имя" = "наименование переменной"?
Да.

Цитата:
Сообщение от koMon Посмотреть сообщение
заменить Entity на другое? При замене не работает? Быть такого не могёт! надо во всём красном заменить Entity на что-то другое, лучше автозаменой)
Не, не все заменял, только обведенное синим.
Собственно в этом и был вопрос, почему наименование переменной должно оставаться тем же?
Миниатюры
Нажмите на изображение для увеличения
Название: 2022-04-26_204348.jpg
Просмотров: 24
Размер:	33.0 Кб
ID:	246976  
Alxndr1697 вне форума  
 
Непрочитано 26.04.2022, 22:34
#4248
Кулик Алексей aka kpblc
Moderator

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


Ну хотя бы потому, что внутрь одной переменной можно засовывать разные данные.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.04.2022, 22:46
#4249
Alxndr1697


 
Регистрация: 24.01.2008
Подольск
Сообщений: 160


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
можно
Почему наименование переменной должно оставаться тем же?
Alxndr1697 вне форума  
 
Непрочитано 27.04.2022, 00:19
#4250
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 9,801


если переменная больше не нужна - ее можно использовать повторно. Поскольку в лиспе динамическая типизация - то переменной можно присвоить любое другое значение.

И строка
Код:
[Выделить все]
 (setq box_lower_sset (ssadd entity box_lower_sset))
разве нужно пересохранять набор после добавления значения? Или просто по аналогии с созданием пустого набора
Код:
[Выделить все]
 (setq box_lower_sset (ssadd))
написано?
Сергей812 вне форума  
 
Непрочитано 27.04.2022, 06:50
#4251
Alxndr1697


 
Регистрация: 24.01.2008
Подольск
Сообщений: 160


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
разве нужно пересохранять набор после добавления значения?
Можно не пересохранять.
Alxndr1697 вне форума  
 
Непрочитано 27.04.2022, 07:01
#4252
Alxndr1697


 
Регистрация: 24.01.2008
Подольск
Сообщений: 160


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
если переменная больше не нужна - ее можно использовать повторно. Поскольку в лиспе динамическая типизация - то переменной можно присвоить любое другое значение.
Понял.

Для меня непонятным остается, почему, в данном примере, нельзя переименовать (создать новую) "синюю" переменную? Это я думаю, что она новая, а получается, что они все связаны. Как?
Миниатюры
Нажмите на изображение для увеличения
Название: 2022-04-26_204348.jpg
Просмотров: 19
Размер:	33.0 Кб
ID:	246983  
Alxndr1697 вне форума  
 
Непрочитано 27.04.2022, 10:10
1 | #4253
koMon


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


(setq entity(1) (entlast)) ; записываем в переменную entity последний примитив базы
; к базе добавляются примитивы...

(while (setq entity(2) (entnext entity(1))...) ; записываем в переменную entity примитив следующий за примитивом, который записан в переменную entity

(setq box_lower_sset (ssadd entity(2) box_lower_sset)) ; добавляем в набор примитив, записанный в переменную entity

entity(1) и entity(2) связаны непосредственно.
в первой итерации цикла while в entity(2) записывается примитив, который следует за примитивом, который записан в переменную entity(1) и который затем добавляется в набор box_lower_sset. итерации продолжаются до окончания примитивов в базе. то есть мы используем переменную entity для записи в неё каждого следующего примитива после маркировки последнего примитива и до добавления объектов второго ящика.
всё логично и лаконично.
но, если ну прямо, ну вот хочется поменять имя переменной в цикле while (не могу понять зачем), то придётся вводить новую переменную. хотя я опять сильно сомневаюсь в этом ли суть вопроса?) или какая суть вопроса?)

Код:
[Выделить все]
(if (> Col_vo 1)
  (progn
  	(setq entity (entlast))
  	(command-s "_.copy" Bok_l Bok_r N_p Front_sh Back_sh "" P_0 (list (car P_0) (cadr P_0) (+ (caddr P_0) (- (+ H_fasad Z_r) 19.5))) "") ;второй ящик
   	(command-s "_.ucs" "x" 90)
 	(setq box_lower_sset (ssadd))
	(setq another_var entity) 
	(while (setq another_var (entnext another_var))
		(setq entity another_var)
		(setq box_lower_sset (ssadd entity box_lower_sset))
	)
   (command-s "_.arrayrect" box_lower_sset "" "_col" 1 1 "_r" (1- Col_vo) (+ H_fasad Z_r) "" "")
   (command-s "_.UCS" "_w")
  );end progn
);end if
koMon вне форума  
 
Непрочитано 27.04.2022, 16:13
1 | #4254
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 9,801


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Это я думаю, что она новая, а получается, что они все связаны. Как?
имя переменной - это псевдоним области (ячейки) оперативной памяти чисто для программиста. Когда на начальном этапе писали на машинном языке (из-за ограниченных ресурсов первых ЭВМ), то там псевдонимов не было - работали напрямую с ячейками памяти. Потом по мере увеличения объемов памяти и производительности ЭВМ стали появляется промежуточные языки высокого уровня, где программист писал уже на более понятном языке языковые конструкции - а в процессе компиляции/интерпретации эти языковые конструкции превращались в машинный исполняемый код.

Насчет связанности - как уже ранее говорили, у каждой переменной есть своя область видимости: где ее могут читать и модифицировать. Есть свои нюансы: аргументы - по умолчанию обычно копируются значения и внутри функции работают уже с копиями входных значений. Локальные переменные функции - на входе в функцию либо при первом использовании под них выделяется память, при выходе из функции - память освобождается (как и из под скопированных аргументов). И есть глобальные переменные - под них выделена память, и они висят в отдельной области памяти, пока их в явном виде не удалят.

И чтобы не было сюрпризов, надо писать код как говорил выше Алексей - функция принимает аргументы (копирует их во внутренние временные переменные), обрабатывает с использованием локальных переменных и возвращает результат. А глобальные переменные использовать только если уж совсем без них не обойтись, при этом желательно им давать смысловые длинные имена - чтобы случайно не было конфликтов из-за совпадения с локальными переменными.
Сергей812 вне форума  
 
Непрочитано 27.04.2022, 22:22
#4255
Alxndr1697


 
Регистрация: 24.01.2008
Подольск
Сообщений: 160


koMon, Сергей812 Спасибо, разобрался.


Цитата:
Сообщение от koMon Посмотреть сообщение
но, если ну прямо, ну вот хочется поменять имя переменной в цикле while (не могу понять зачем), то придётся вводить новую переменную. хотя я опять сильно сомневаюсь в этом ли суть вопроса?) или какая суть вопроса?)
Не-не. Переименовывал лишь для того, чтобы подтвердить, что:
Цитата:
Сообщение от koMon Посмотреть сообщение
entity(1) и entity(2) связаны непосредственно.
Вот в таком виде у меня в голове все устаканилось koMon, спасибо за наглядный пример.
Код:
[Выделить все]
(if (> Col_vo 1)
  (progn
  	(setq entity (entlast))
  	(command-s "_.copy" Bok_l Bok_r N_p Front_sh Back_sh "" P_0 (list (car P_0) (cadr P_0) (+ (caddr P_0) (- (+ H_fasad Z_r) 19.5))) "") ;второй ящик
   	(command-s "_.ucs" "x" 90)
 	(setq box_lower_sset (ssadd))
	(setq another_var entity) 
	(while (setq another_var (entnext another_var))

		(setq box_lower_sset (ssadd another_var box_lower_sset))
	)
   (command-s "_.arrayrect" box_lower_sset "" "_col" 1 1 "_r" (1- Col_vo) (+ H_fasad Z_r) "" "")
   (command-s "_.UCS" "_w")
  );end progn
);end if
Alxndr1697 вне форума  
 
Непрочитано 28.04.2022, 11:19
#4256
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,413


Подскажите, как заблокировать все видовые экраны на всех листах? Кажется это должна быть несложный лисп для тех, кто разбирается. Листов много, вручную все протыкивать неудобно.
Сет вне форума  
 
Непрочитано 28.04.2022, 11:39
#4257
Кулик Алексей aka kpblc
Moderator

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


(vla-put-displaylocked <vla-указатель> :vlax-true)
P.S. Здесь обучение лиспу, если что.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.04.2022, 12:40
#4258
koMon


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


Цитата:
Сообщение от Сет Посмотреть сообщение
заблокировать все видовые экраны на всех листах
Код:
[Выделить все]
 (vlax-for p_space (setq layout_collection (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))))
	(princ "\n==================")
	(if (/= "Model" (vla-get-name p_space))
		(progn
			(princ "\n")
			(princ (vla-get-name p_space)) 
			(princ "\n")
			(repeat (sslength (setq index 0 l_viewports (ssget "_x" (list (cons 0 "viewport")(cons 410 (vla-get-name p_space))))))
				(if (not (equal (ssname l_viewports index)
						   		(cdr (assoc 331 (entget (vlax-vla-object->ename (vla-item layout_collection (vla-get-name p_space))))))
						 )
					)
					(if (zerop (vlax-get (vlax-ename->vla-object (ssname l_viewports index)) 'displaylocked))
						(vla-put-displaylocked (vlax-ename->vla-object (ssname l_viewports index)) :vlax-true)
					)
				)
				(princ "\rViewport count: ")
				(setq index (1+ index))
				(princ (1- index))
			)
		)
	)
)
(princ)
koMon вне форума  
Ответ
Вернуться   Форум 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