Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 252
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2064494
 
Непрочитано 16.06.2025, 09:52
#5021
Moi Imena


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Я не уверен (проверять лень), что "EXPLODE" умеет расчленять
элементы передаваемого ей набора.

Попробуй "скормить" ей отдельный элемент набора.

Если всё получится, просто организуй цикл для последовательного
расчленения всех элементов набора.
спасибо за совет, побробовал на элементе из набора и сработало, но вот когда начинается перебор элементов из набора то цикл выполняется непозволительно долго, буду искать другие варианты

----- добавлено через ~14 мин. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
можно попробовать так
Код:
[Выделить все]
 (initcommandversion)
(vl-cmdf "_explode" (ssget "_x" '((0 . "region"))) "")
к сожалению на eng autocad не сработало, вот полученный ответ

Command: (vl-cmdf "EXPLODE" ss "")
EXPLODE
Select object:
Command: U
(Lisp Expression) GROUP
Command: T

для сравнение erase вместо explode

Command: (vl-cmdf "ERASE" SS "")
ERASE
Select objects: 70756 found
Select objects:
Command: T
Command: _u (Lisp Expression) GROUP
Moi Imena вне форума  
 
Непрочитано 16.06.2025, 17:50
1 | #5022
koMon


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


Цитата:
Сообщение от Moi Imena Посмотреть сообщение
к сожалению на eng autocad не сработало, вот полученный ответ
можно так попробовать
Код:
[Выделить все]
 
(setq count 0)
(vlax-map-collection
	(vla-get-modelspace (vla-get-database (vla-get-activedocument (vlax-get-acad-object))))
   '(lambda (object)
		(and
			(= (vla-get-objectname object) "AcDbRegion")
			(vla-explode object)
			(princ (strcat "\r"(itoa (setq count (1+ count))) " regions exploded"))
			(vla-erase object)
		)
	)
)
(princ)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 02.07.2025, 07:20
#5023
Moi Imena


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


Цитата:
Сообщение от koMon Посмотреть сообщение
можно так попробовать
Код:
[Выделить все]
 
(setq count 0)
(vlax-map-collection
	(vla-get-modelspace (vla-get-database (vla-get-activedocument (vlax-get-acad-object))))
   '(lambda (object)
		(and
			(= (vla-get-objectname object) "AcDbRegion")
			(vla-explode object)
			(princ (strcat "\r"(itoa (setq count (1+ count))) " regions exploded"))
			(vla-erase object)
		)
	)
)
(princ)
вначале не понял почему оставляет регионы, думал что что то делаю не так, так как в обычном expldoe исходные данные подтираются, увидел у вас vla-erase и понял что все верно делаю, спасибо !
Moi Imena вне форума  
 
Непрочитано 20.08.2025, 12:57
#5024
stin9


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


Набросал Lisp который рисует лестницу по вводимым данным. Сначала вычисляет координаты точек, затем проводит полилинии по этим точкам.
Внимание вопрос: как переделать чтобы сократить количество строк (символов)?. Через какие другие команды это построить?

Код:
[Выделить все]
 (DEFUN c:SCARA_v2 (/ p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23) ; начало функции ;;; (перечисление переменных в скобках "очищает память" после вполнения программы)
(setq yH (getreal "\n Введите Высоту ступени= "))  ; запрос 
(setq xL (getreal "\n Введите Глубину ступени (проступь)= "))  ; запрос
(setq zH (getreal "\n Введите Толщину плитной части= "))  ; запрос
(setq sH (getreal "\n Введите Толщина ОТДЕЛОЧНОГО (плитка+клей) слоя = "))  ; запрос
(setq p1 (getpoint "\nУкажите базовую точку : ")) ; запрос координат базовой точки

  
(setq p2 (polar p1 (/ pi 2) yH)) ; определение координат точки р2
(setq p3 (polar p2 0 xL)) ; определение координат точки р3
(setq p4 (polar p3 (/ pi 2) yH)) ; определение координат точки р4

(setq p5 (polar p4 0 xL)) ; определение координат точки
(setq p6 (polar p5 (/ pi 2) yH)) ; определение координат точки
(setq p7 (polar p6 0 xL)) ; определение координат точки
(setq p8 (polar p7 (/ pi 2) yH)) ; определение координат точки
(setq p9 (polar p8 0 xL)) ; определение координат точки
(setq p10 (polar p9 (/ pi 2) yH)) ; определение координат точки
(setq p11 (polar p10 0 xL)) ; определение координат точки
(setq p12 (polar p11 (/ pi 2) yH)) ; определение координат точки
(setq p13 (polar p12 0 xL)) ; определение координат точки
(setq p14 (polar p13 (/ pi 2) yH)) ; определение координат точки
(setq p15 (polar p14 0 xL)) ; определение координат точки
(setq p16 (polar p15 (/ pi 2) yH)) ; определение координат точки
(setq p17 (polar p16 0 xL)) ; определение координат точки
(setq p18 (polar p17 (/ pi 2) yH)) ; определение координат точки
(setq p19 (polar p18 0 xL)) ; определение координат точки

(setq p20 (polar p19 (/ pi 2) yH)) ; определение координат точки
(setq p21 (polar p20 0 xL)) ; определение координат точки
(setq p22 (polar p21 (/ pi 2) yH)) ; определение координат точки
(setq p23 (polar p22 0 xL)) ; определение координат точки

  
(setq p1d (polar p1 (+ pi (/ pi 2)) sH)) ; определение координат точки p1d которая ниже на величину ФИНИШ слоя
(setq p23d (polar p23 (+ pi (/ pi 2)) sH)) ; определение координат точки p23d которая ниже на величину ФИНИШ слоя
  
 
(setq osm (getvar "osmode")) ; запоминаем привязки пользователя
(setvar "osmode" 0) ; отключаем привязки

;;;(command "CLAYER" "Ste_Lestn---0") ; меняет текущий слой 
  
(command "_.Pline" p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 "") ; рисуем ломаной полилинией Лестницу
(setq gLoman (entlast)); запоминаем имя последней линии в переменную [gLoman]


(command "_.COPY" gLoman "" p1 p1d) ; копируем полилинию "вниз" на величину финишного слоя (command "_.COPY" ss "" pt1 pt2)
  (setq gLomanREZ (entlast)); запоминаем имя последней линии в переменную

;;;(command "_.CHANGE" gLomanREZ "" "P" "LA" "Ste_Lestn_0.5" "") ;  Меняет слой
;;;  (command "_.CHANGE" (entlast) "" "P" "LA" "Ste_Lestn_0.5" "") ; запасная  строка  Меняет слой вариант 2
;;;(command "CLAYER" "Ste_Lestn_0.5") ; делает текущий слой 
  
(command "_.Pline" p1d p23d "") ; рисуем "временную" наклонную

  (setq gLine (entlast)); запоминаем имя последней линии ("временную" наклонную) в переменную [gLine]

  (command "_.OFFSET" zH gLine p1d "") ; Выполняем OFFSET последней линии на расстояние [zH] в направлении точки [p1d]
  (command "erase" gLine ""); Удаляем "временную" наклонную
  

  (setvar "osmode" osm) ; возвращает привязки пользователя
;;;  (setvar "osmode" 1215) ; возвращает привязки пользователя
    
) ; окончание функции
stin9 вне форума  
 
Непрочитано 20.08.2025, 21:35
1 | #5025
Кулик Алексей aka kpblc
Moderator

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


Ну, несколько setq чисто теоретически можно объединять в один, но длины программы капитально это не изменит. А так - чисто по приколу - кто мешает создавать полилинию, вычисляя точки "на лету" (и, может быть, еще и от командных методов уйти)? Заодно и количество переменных уменьшится.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.08.2025, 22:52
1 | #5026
koMon


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


Цитата:
Сообщение от stin9 Посмотреть сообщение
сократить количество строк
Код:
[Выделить все]
 
(setq yH (getreal "\n Введите Высоту ступени= "))  ; запрос 
(setq xL (getreal "\n Введите Глубину ступени (проступь)= "))  ; запрос
(setq zH (getreal "\n Введите Толщину плитной части= "))  ; запрос
(setq sH (getreal "\n Введите Толщина ОТДЕЛОЧНОГО (плитка+клей) слоя = "))  ; запрос
(setq p1 (getpoint "\nУкажите базовую точку : ")) ; запрос координат базовой точки
(setq p_list (list (mapcar '+ '(0 0) p1)))
(repeat 11 (setq p_list (append p_list (list (mapcar '+ (last p_list) (list 0 yH)) (mapcar '+ (last p_list) (list xL yH))))))
(vla-copy
  (vla-addlightweightpolyline (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
  			      (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 1 (* 2 (length p_list))))
			      			   (apply 'append p_list)
			      )
  )
)
(setq p1d (polar p1 (* 1.5 pi) sH)) ; определение координат точки p1d которая ниже на величину ФИНИШ слоя
(setq p23d (polar (last p_list) (* 1.5 pi) sH)) ; определение координат точки p23d которая ниже на величину ФИНИШ слоя
(vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point p1) (vlax-3d-point p1d))
(vla-addline (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
  	     (vlax-3d-point (polar p1d (- (angle p1d p23d) (* 0.5 pi)) zH))
  	     (vlax-3d-point (polar p23d (- (angle p1d p23d) (* 0.5 pi)) zH))
)
__________________
K Lisp
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