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

Вернуться   Форум 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.
Просмотров: 2049900
 
Непрочитано 19.02.2022, 18:04
#4121
Кулик Алексей aka kpblc
Moderator

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


Ну так передавай в dcl не ключи, а списки через те же start_list, add_list, end_list
Если будет интересно что и как еще можно в dcl сделать: https://autolisp.ru/2015/02/05/dcl-develop/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.02.2022, 22:47
#4122
koMon


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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
(setq s_k (nth (atoi (get_tile "S_ko")) <список> )) Что надо поставить на место списка?
Получить строку списка для атрибута list, созданного в диалоге списка (get_attr "S_ko" ''list") и перелопатить её в список.
koMon вне форума  
 
Непрочитано 21.02.2022, 21:55
#4123
Alxndr1697


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


Алексей, koMon, спасибо, но, еще раз, - я совсем начинающий и "чего проще..." и "перелопатить в список", для меня не так просто и не совсем понятно.
В итоге, на сегодняшний день, у меня так ничего и не получается. Руки опускаются... Перепробовал уже все (на свой взгляд, конечно).
Прошу помощи в виде работающей функции. Только, пожалуйста, - попроще, чтобы можно было понять и разобраться новичку.

Проблемы с функцией -функция raz_panel-

----- добавлено через ~2 мин. -----
Код:
[Выделить все]
panel_uch : dialog {label = "Панель";
          :spacer{height=1;}

          : boxed_column {label = "Размеры панели"; alignment = centered;
          :spacer{height=1;}

          :text {label = "Выберите :"; alignment = centered;}
          :spacer{height=1;}
          : popup_list {key = "L_o"; label = "Высота (длина) панели :"; width = "8"; list = "";}
          : popup_list {key = "B_o"; label = "Ширина панели :"; width = "8"; list = "";}
          : popup_list {key = "S_o"; label = "Толщина панели :"; width = "8"; list = "";}
                          }//end boxed_column

          :spacer{height=1;}
          :boxed_row {label = ""; ok_cancel;}

                   }//end dialog

----- добавлено через 29 сек. -----
Код:
[Выделить все]
(DEFUN c:panel_uch (/ L B S)
  
;-------------------------функция panel--------------------------------------------
(defun panel (/ S L B P_0 x_01 y_01 z_01 x_11 y_11 z_11)

   (setq
;;;         L 200
;;;         B 100
;;;         S 10
         P_0 (getpoint "\n Укажите базовую точку для построения бокса <по умолчанию (0,0,0)>")
   )
   (setq x_01 0
         y_01 0
         z_01 0
         x_11 (+ x_01 S)
         y_11 (+ y_01 B)
         z_11 (+ z_01 L)
   )

    (setq osm (getvar "osmode"))
    (setvar "osmode" 0)
    (command "_UCS" "_o" P_0)
    (command "_box" (list x_01 y_01 z_01) (list x_11 y_11 z_11))
    (command "_UCS" "_w")
    (setvar "osmode" osm)

 );end defun panel

  ;------------------------------------------функция raz_panel----------------------------

  (defun raz_panel ()
      (setq L (nth (atoi (get_tile "L_o")) o_l))
      (setq B (nth (atoi (get_tile "B_o")) o_b))
      (setq S (nth (atoi (get_tile "S_o")) o_s))
   );end raz_panel

  ;-------------------------функция замены выпадающего списка окна диалога------------------------------------

  (defun iz_raz_dial (/ );временные переменные не добавлять они используются за пределами этой функции
     (setq o_l (list "100" "200" "300" "400" "500"))
        (start_list "L_o")
          (mapcar 'add_list o_l)
              (end_list)
     (setq o_b (list "50" "150" "250" "350" "450"))
        (start_list "B_o")
          (mapcar 'add_list o_b)
             (end_list)
     (setq o_s (list "8" "10" "12" "16"))
        (start_list "S_o")
           (mapcar 'add_list o_s)
              (end_list)
    ) 
;-------------------------------------------Диалоговое окно----------------------------------------

(setq dcl_id (load_dialog "D:/MyLISP/001_SHKAF/Forum/panel_uch.DCL"))
  (if (not (new_dialog "panel_uch" dcl_id)) (exit))
(iz_raz_dial) ;функция замены выпадающего списка окна диалога
     (action_tile "accept" "(raz_panel) (done_dialog 1)")
        (action_tile "cancel" "(done dialog 0)")
           (setq ddi (start_dialog))
              (unload_dialog dcl_id)
(if (= ddi 1) (panel))
(princ)
;-------------------------------------------------------------------------------------------------

  );end defun panel_uch


Буду рад любой критике и поправкам!

Последний раз редактировалось Alxndr1697, 22.02.2022 в 06:35.
Alxndr1697 вне форума  
 
Непрочитано 22.02.2022, 08:32
#4124
Кулик Алексей aka kpblc
Moderator

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



1. Принцип 20/80 никуда не девается. 20% времени код пишется, 80% - читается. К вопросу о форматировании, именовании переменных и функций
2. Любая функция / модуль должна работать только с теми данными, которые ей "прилетают" и не затрагивать глобальные переменные. Не надо делать т.н. "GodObject" (божественные объекты) с массой ответственности. Если такое появляется - это отличный шанс выстрелить себе в ногу в самый непредсказуемый момент.
3. Следствие: любую локальную функцию можно "вытащить" наружу и проверить ее работу. И она должна работать!
4. Крайне желательно разобраться с видимостью переменных и функций. Если код оставить как есть - в какой-то момент он может запросто перестать работать. Или не он, а соседний, но который использует таким же манером именованные переменные / функции.
5. Для решения предыдущего вопроса - скопировать любую функцию, вставить в новый файл, и нажать Ctrl+Shift+C (если не ошибаюсь) - в отчете будут видны все незалокаленные переменные и функции.

На переработку кода времени нет ((
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.02.2022, 10:53
#4125
koMon


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


без изяществ)

Код:
[Выделить все]
 (DEFUN c:panel_uch (/ L B S)

;-------------------------функция panel--------------------------------------------
(defun panel (S L B / P_0 x_01 y_01 z_01 x_11 y_11 z_11)

   (if (null (setq P_0 (getpoint "\n Укажите базовую точку для построения бокса <по умолчанию (0,0,0)>")))
   			(setq P_0 (list 0 0 0))
   )
;         x_11 (+ x_01 S)
;         y_11 (+ y_01 B)
;         z_11 (+ z_01 L)
;   )

;    (setq osm (getvar "osmode"))
;    (setvar "osmode" 0)
;    (command "_UCS" "_o" P_0)
;    (command "_box" (list x_01 y_01 z_01) (list x_11 y_11 z_11))
    (command "_box" "_none" P_0 "_l" s b l)
;    (command "_UCS" "_w")
;    (setvar "osmode" osm)

 );end defun panel

  ;------------------------------------------функция raz_panel----------------------------

;  (defun raz_panel (_list selection)
;      (setq L (nth (atoi (get_tile "L_o")) o_l))
;      (setq B (nth (atoi (get_tile "B_o")) o_b))
;      (setq S (nth (atoi (get_tile "S_o")) o_s))
;   );end raz_panel

  ;-------------------------функция замены выпадающего списка окна диалога------------------------------------

;  (defun iz_raz_dial (/ );временные переменные не добавлять они используются за пределами этой функции
;     (setq o_l (list "100" "200" "300" "400" "500"))
;        (start_list "L_o")
;          (mapcar 'add_list o_l)
;              (end_list)
;     (setq o_b (list "50" "150" "250" "350" "450"))
;        (start_list "B_o")
;          (mapcar 'add_list o_b)
;             (end_list)
;     (setq o_s (list "8" "10" "12" "16"))
;        (start_list "S_o")
;           (mapcar 'add_list o_s)
;              (end_list)
;    )

	(defun populate_list ( list_key list_to_process )
		(start_list list_key 3)
			(mapcar 'add_list
				  	(mapcar '(lambda (list_element)
				  			 	(strcat "\n" list_element)
				  			 )
				  			 list_to_process
				  	)
			)
		(end_list)
	)

;-------------------------------------------Диалоговое окно----------------------------------------

(setq L_o_list (list "100" "200" "300" "400" "500")
	  B_o_list (list "50" "150" "250" "350" "450")
	  S_o_list (list "8" "10" "12" "16")
)

(if (null L_o_selection) (setq L_o_selection "0"))
(if (null B_o_selection) (setq B_o_selection "0"))
(if (null S_o_selection) (setq S_o_selection "0"))


;(setq dcl_id (load_dialog "D:\\MyLISP\\001_SHKAF\\Forum\\panel_uch.DCL"))
(setq dcl_id (load_dialog "z:\\work\\АТ БН-600\\panel_uch.DCL"))

;  (if (not (new_dialog "panel_uch" dcl_id)) (exit))
;(iz_raz_dial) ;функция замены выпадающего списка окна диалога
;     (action_tile "accept" "(raz_panel) (done_dialog 1)")
;        (action_tile "cancel" "(done dialog 0)")
;           (setq ddi (start_dialog))
;              (unload_dialog dcl_id)
;(if (= ddi 1) (panel))
;(princ)

(if (not (minusp dcl_id))
	(if (new_dialog "panel_uch" dcl_id)
		(progn

			(populate_list "L_o" L_o_list)
			(populate_list "B_o" B_o_list)
			(populate_list "S_o" S_o_list)

			(set_tile "L_o" L_o_selection)
			(set_tile "B_o" B_o_selection)
			(set_tile "S_o" S_o_selection)

			(action_tile "L_o" "(setq L_o_selection $value))")
			(action_tile "B_o" "(setq B_o_selection $value))")
			(action_tile "S_o" "(setq S_o_selection $value))")

			(setq dialog_result (start_dialog))
			(unload_dialog dcl_id)
			(cond
					(
						(= dialog_result 1)
							(princ "\nL: ")
							(princ (setq l (atof (nth (atoi L_o_selection) L_o_list ))))
							(princ "\nB: ")
							(princ (setq b (atof (nth (atoi B_o_selection) B_o_list ))))
							(princ "\nS: ")
							(princ (setq s (atof (nth (atoi S_o_selection) S_o_list ))))

							(panel s l b)
					)
					(
						t
							(princ "\nВыход")
					)
			)
		)
	)
	(princ "\nПроблема с диалогом")
)
(princ)

;-------------------------------------------------------------------------------------------------

  );end defun panel_uch

Последний раз редактировалось koMon, 22.02.2022 в 22:14.
koMon вне форума  
 
Непрочитано 22.02.2022, 21:31
#4126
Alxndr1697


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


Цитата:
Сообщение от koMon Посмотреть сообщение
без изяществ)
Да уж... Ничего знакомого))) Есть в чем поразбираться.
Спасибо!

----- добавлено через ~22 мин. -----
Функцию t (строка 114), вообще, не могу в справочнике найти
Alxndr1697 вне форума  
 
Непрочитано 22.02.2022, 22:03
#4127
koMon


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


Это не функция, это булевая константа истины) true
koMon вне форума  
 
Непрочитано 22.02.2022, 23:00
#4128
Alxndr1697


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


Еще вопрос. Зачем здесь (princ (setq l (atof (nth (atoi L_o_selection) L_o_list )))) функция princ ? Ведь, и без нее выводится число, которого, вроде, достаточно.

Последний раз редактировалось Alxndr1697, 22.02.2022 в 23:06.
Alxndr1697 вне форума  
 
Непрочитано 23.02.2022, 09:18
#4129
koMon


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


Эммм, здесь 6 принков, которые выводят в консоль последовательно значения l, b, s. По-другому их в консоль не вывести. Но это так, посмотреть. Можно все эти принки убрать.
koMon вне форума  
 
Непрочитано 23.02.2022, 20:38
#4130
Alxndr1697


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


koMon, благодарствую! Благодаря вашей функции, нашел ошибки в своей и она работает, даже в моем варианте)))

----- добавлено через ~10 ч. -----

Вопрос: Как сделать, чтобы после неверного ввода осуществлялся не выход, а возврат в диалоговое окно, для последующего верного ввода?
Код:
[Выделить все]
(if (<= H_z 0)
  (progn (alert (strcat " Высота цоколя не может быть меньше, или равной 0"))
  (exit)))
После замены exit на c:shkaf_otd_sup - программа работает некорректно. (об остальных вариантах молчу)))

Подозреваю, что программу надо сначала вывести из состояния ошибки, или сброс, а потом запускать заново, но не знаю как.
Код:
[Выделить все]
(if (<= H_z 0)
  (progn (alert (strcat " Высота цоколя не может быть меньше, или равной 0"))
  (exit) (c:shkaf_otd_sup)))

Последний раз редактировалось Alxndr1697, 24.02.2022 в 06:35.
Alxndr1697 вне форума  
 
Непрочитано 24.02.2022, 10:21
#4131
koMon


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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Как сделать, чтобы после неверного ввода осуществлялся не выход, а возврат в диалоговое окно, для последующего верного ввода?
если речь идёт о компоненте диалога :edit_box, то проверять правильность введённых данных нужно на выходе из компонента/подтверждении введённых данных в компоненте, то есть должна быть функция проверки введённых данных по результату которой осуществится выход или не выход из компонента, причём это не должно влиять на выход их диалога.
koMon вне форума  
 
Непрочитано 24.02.2022, 21:28
#4132
Alxndr1697


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


Цитата:
Сообщение от koMon Посмотреть сообщение
если речь идёт о компоненте диалога :edit_box,
Прошу прощения, эту програмку я написал для примера, чтобы разобраться с диалоговым окном...А так-то, я "строю" шкаф



Цитата:
Сообщение от koMon Посмотреть сообщение
то есть должна быть функция проверки введённых данных по результату которой осуществится выход или не выход из компонента, причём это не должно влиять на выход их диалога
А это не оно?
Код:
[Выделить все]
(if (< H 200)
  (progn (alert (strcat " Высота шкафа не может быть меньше чем 200 мм"))
  (exit)))
----- добавлено через ~3 мин. -----
Код:
[Выделить все]
dialog_shkaf: dialog {label = "Шкафон отдельный с двумя фасадами";
                                               :spacer{height=1;}
:column {:row {:boxed_column {label = "Параметры шкафа :";
                                               

//:radio_row {label = "Тип шкафа :";
//                           key = "Tip_s";
//            :radio_button {label = "Отдельно стоящий";
//                           key = "Otd";
//                           value = "1";}
//            :radio_button {label = "Встроенный";
//                           key = "Vst";
//                           value = "0";}
//                           }//end radio_row
                                                :spacer{height=1;}
:row {:boxed_column {label = "Размеры шкафа :";
                                                :spacer{height=1;}
             :edit_box {label = "Высота :";
                          key = "eb_H";
                            value = "2000";
                              edit_width = 8;}
             :edit_box {label = "Длина (ширина) :";
                          key = "eb_L";
                            value = "1000";
                              edit_width = 8;}
             :edit_box {label = "Глубина (без учета фасада):";
                          key = "eb_B";
                            value = "600";
                              edit_width = 8;}
             :edit_box {label = "Высота цоколя :";
                          key = "eb_Hz";
                            value = "50";
                              edit_width = 8;}
                     }//end column размеры шкафа

      :boxed_column {label = "Толщина материала для :";
                                                 :spacer{height=1;}
             :popup_list {label = "Корпуса :";
                            key = "S_ko";
                              width = "8";
                                list = "16";}
             :popup_list {label = "Фасада :";
                            key = "S_fo";
                              width = "8";
                                list = "16";}
             :popup_list {label = "Заднего полика :";
                            key = "S_po";
                              width = "8";
                                list = "6";}

                      }//end column материал

       :boxed_column {label = "Зазоры фасада :";
                                                :spacer{height=1;}
             :edit_box {label = "Зазор между фасадами :";
                          key = "o_Z";
                            value = "3";
                              edit_width = 8;}
             :edit_box {label = "Отступ от корпуса вперед :";
                          key = "o_Vp";
                            value = "2";
                              edit_width = 8;}
             :edit_box {label = "Отступ сверху :";
                          key = "o_V";
                            value = "1.5";
                              edit_width = 8;}
             :edit_box {label = "Отступ снизу :";
                          key = "o_N";
                            value = "1.5";
                              edit_width = 8;}
             :edit_box {label = "Отступ слева :";
                          key = "o_L";
                            value = "1.5";
                              edit_width = 8;}
             :edit_box {label = "Отступ справа :";
                          key = "o_R";
                            value = "1.5";
                              edit_width = 8;}
             :edit_box {label = "Четверть заднего полика :";
                          key = "o_Cht";
                            value = "13";
                              edit_width = 8;}                                                             
                     }//end column зазоры

                  }//end row boxed_column габариты шкафа 
                           
                 }//end boxed_column параметры шкафа
           }//end row

                                                  :spacer{height=1;}
:boxed_row {label = "";
             ok_cancel;}

}//end column
}//end dialog
----- добавлено через ~5 мин. -----
Код:
[Выделить все]
(DEFUN c:shkaf_otd_sup (/ dcl_id nub H L B H_z Z Cht o_vp o_v o_n o_l o_r S_k S_f S_p o_k 0_f o_p)

;------------------------Функция shkaf------------------------------------------
(defun shkaf (H L B H_z Z Cht o_vp o_v o_n o_l o_r S_k S_f S_p  / P_0 S_k S_f S_p o_Z osm o_Cht o_Vp o_V o_N o_L o_R
	          L_b P_b V_h F_d Z_l Z-p Z-p1 Z-p2 Z-p3 Z-p4 
		  x_01 x_11 x_02 x_12 x_03 x_13 x_04 x_14 x05 x_15 x_16 x_07 x_17 x_08 x_18 x_09 x_19
		  y_01 y_11 y_02 y_12 y_03 y_13 y_04 y_14 y05 y_15 y_16 y_07 y_17 y_08 y_18 y_09 y_19
		  z_01 z_11 z_02 z_12 z_03 z_13 z_04 z_14 z05 z_15 z_16 z_07 z_17 z_08 z_18 z_09 z_19
		  P_01 P_11 P_02 P_12 P_03 P_13 P_04 P_14 P_05 P_15 P_06 P_16 P_07 P_17 P_08 P_18 P_09 P_19)
  
;;;(setq
;;;      H (getint "\ Высота шкафа :")
;;;      L (getint "\ Длина (ширина) шкафа :")
;;;      B (getint "\ Глубина шкафа (БЕЗ учета фасада):")
;;;      H_z 50   ;Высота цоколя
;;;   S_k 16   ;толщина материала для корпуса
;;;   S_f 18   ;толщина материала для фасада
;;;   S_p 7    ;толщина материала для заднего полика
;;;      Cht 13   ;Четверть полика
;;;      Z  3.0   ;зазор между фасадами
;;;   P_0 (getpoint "\n Укажите базовую точку для построения шкафа <по умолчанию (0,0,0)>")
;;;	 (if (null P_0) (setq P_0 (quote (0 0 0))))
;;;)
 (if (null (setq P_0 (getpoint "\n Укажите базовую точку для построения шкафа <по умолчанию (0,0,0)>")))
     (setq P_0 (list 0 0 0))
 )

(if (< H 200)
  (progn (alert (strcat " Высота шкафа не может быть меньше чем 200 мм"))
  (exit)))
(if (< L 200)
  (progn (alert (strcat " Длина шкафа не может быть меньше чем 200 мм"))
  (exit)))
(if (< B 100)
  (progn (alert (strcat " Глубина шкафа не может быть меньше чем 100 мм"))
  (exit)))
(if (>= Cht S_k)
  (progn (alert (strcat " Четверть не может быть больше, или равна толщине материала корпуса"))
  ((exit))))
(if (<= H_z 0)
  (progn (alert (strcat " Высота цоколя не может быть меньше, или равной 0"))
  (exit)))
  
  (setq osm (getvar "osmode"));запоминание привязок
  (setvar "osmode" 0)
;;;(command "_ortho" "_off")
;;;(command "_osnap" "_off")
  (command "_UCS" "_o" P_0)   ;установка пск в точку вставки шкафа
  
(setq x_01 0	       ;левая боковина
      y_01 0
      z_01 0)
(setq x_11 (+ x_01 S_k)
      y_11 (+ y_01 B)
      z_11 (+ z_01 H)
      x_02 (+ x_01 L)  ;правая боковина
      y_02 y_01
      z_02 z_01
      x_12 (- x_02 S_k)
      y_12 y_11
      z_12 z_11
      x_03 x_11        ;низ
      y_03 y_01
      z_03 (+ z_01 H_z) 
      x_13 (- x_02 S_k)
      Y_13 y_12
      z_13 (+ z_03 S_k)
      x_04 x_12        ;верх
      y_04 y_01
      z_04 z_11
      x_14 x_11
      y_14 y_11
      z_14 (- z_04 S_k)

      x_05 (+ x_01 o_l)    ;фасад и отступы от корпуса по периметру(слева)
      y_05 (- y_01 o_vp)   ;отступ фасада от корпуса вперед
      z_05 (+ z_01 o_n H_z);(снизу)
      x_15 (- x_02 o_r)    ;(справа)
      y_15 (- y_05 S_f)
      z_15 (- z_12 o_v)    ;(сверху)

;;;      x_06 x_03        ;цоколь
;;;      y_06 y_03
;;;      z_06 z_03
      x_16 (- x_02 S_k)
      y_16 (+ y_02 S_k)
      z_16 z_02

      x_07 (+ x_13 Cht)    ;задний полик
      y_07 (- y_13 S_p)
      z_07 (- z_13 Cht)
      x_17 (- x_14 Cht)
      y_17 y_14
      z_17 (+ z_14 Cht)

      x_08 x_04           ;вертикальная стойка
      y_08 y_04
      z_08 (- z_04 S_k)
      x_18 (- x_13 S_k)
      y_18 (- y_13 S_p)
      z_18 z_13

      x_09 x_03           ;полка
      y_09 y_03
      z_09 (+ z_03 S_k)
      x_19 x_13
      y_19 (- y_13 S_p)
      z_19 (+ z_13 S_k)
      )
(setq P_01 (list x_01 y_01 z_01)
      P_11 (list x_11 y_11 z_11)
      P_02 (list x_02 y_02 z_02)
      P_12 (list x_12 y_12 z_12)
      P_03 (list x_03 y_03 z_03)
      P_13 (list x_13 y_13 z_13)
      P_04 (list x_04 y_04 z_04)
      P_14 (list x_14 y_14 z_14)
      P_05 (list x_05 y_05 z_05)
      P_15 (list x_15 y_15 z_15)
;;;      P_06 (list x_06 y_06 z_06)
      P_16 (list x_16 y_16 z_16)
      P_07 (list x_07 y_07 z_07)
      P_17 (list x_17 y_17 z_17)
      P_08 (list x_08 y_08 z_08)
      P_18 (list x_18 y_18 z_18)
      P_09 (list x_09 y_09 z_09)
      P_19 (list x_19 y_19 z_19)
      )

(command "_box" P_01 P_11);левая боковина
  (setq L_b (entlast))
(command "_box" P_02 P_12);правая боковина
  (setq P_b (entlast))
(command "_box" P_03 P_13);низ
  (setq N_z (entlast))
(command "_box" P_04 P_14);верх
  (setq V_h (entlast))

(command "_box" P_05 P_15);фасад
  (setq F_d (entlast))
    (command "_box" (list  (- x_05 (/ Z 2)) y_05 z_05) (list (+ x_05 (/ Z 2)) (- y_05 S_f) z_15))
       (setq Z_r (entlast))                                                                           ;черчение и запоминание тела-зазора
          (command "_move" Z_r "" (list x_05 y_05 z_05) (list (+ x_05 (/ (- x_15 x_05) 2)) y_05 z_05));перемещение в центр фасада
             (command "_subtract" F_d "" Z_r "")                                                      ; вычитание зазора из фасада
                (command "_solidedit" "_body" "_separate" (entlast) "" "")                            ;разъединение получившегося тела

(command "_box" P_03 P_16);цоколь
  (setq Z_l (entlast))
     (command "_copy" Z_l "" P_03 (list x_03 (+ y_03 (- B S_k)) z_03)"");копирование заднего цоколя

(command "_box" P_08 P_18);вертикальная стойка
(command "_box" P_09 P_19);полка

(command "_box" P_07 P_17);задний полик
  (setq Z_p (entlast)) 
(command "_copy" Z_p "" P_01 "_a" 5 "" P_01 "");создание 5 копий заднего полика и запоминание
    (setq Z_p1 (entnext Z_p))
       (setq Z_p2 (entnext Z_p1))
          (setq Z_p3 (entnext Z_p2))
             (setq Z_p4 (entnext Z_p3))

     (command "_subtract" L_b "" Z_p1 "") ;вычитание полика из деталей шкафа (изготовление четверти)
        (command "_subtract" P_b "" Z_p2 "")
           (command "_subtract" V_h "" Z_p3 "")
              (command "_subtract" N_Z "" Z_p4 "")

   (command "_UCS" "_w");возврат в мск
;;;(command "_UCS" "_p");возврат пск
;;;(command "_vscurrent" "_X-ray" "")

   (setvar "osmode" osm);возврат привязок
   (command "_zoom" "_all")

(princ)
  );end defun

;-----------------------------------функция raz_shkaf--------------------------------------------

(defun raz_shkaf (/ )
    (setq H (atof (get_tile "eb_H")));считывание и преобразование из строкового в число и сохранение
      (setq L (atof (get_tile "eb_L")))
        (setq B (atof (get_tile "eb_B")))
          (setq H_z (atof (get_tile "eb_Hz")))
             (setq Z (atof (get_tile "o_Z")))
    (setq Cht (atof (get_tile "o_Cht")))
      (setq o_vp (atof (get_tile "o_Vp")))
        (setq o_v (atof (get_tile "o_V")))
          (setq o_n (atof (get_tile "o_N")))
            (setq o_l (atof (get_tile "o_L")))
              (setq o_r (atof (get_tile "o_R")))

  (setq numStr_k (get_tile "S_ko"))
    (if (= numStr_k "") (setq S_k nil)
       (setq S_k (atof (nth (atoi numStr_k) o_k)))
    )
  (setq numStr_f (get_tile "S_fo"))
    (if (= numStr_f "") (setq S_f nil)
       (setq S_f (atof (nth (atoi numStr_f) o_f)))
    )
  (setq numStr_p (get_tile "S_po"))
    (if (= numStr_p "") (setq S_p nil)
       (setq S_p (atof (nth (atoi numStr_p) o_p)))
    )  
(princ)
  );end defun


    ;----------------функция замены выпадающего списка окна диалога iz_mat----------------

  (defun iz_mat (/ );временные переменные не добавляем они используются за пределами этой функции
     (setq o_k (list "16" "8" "9" "10" "11" "12" "13" "17" "18" "19" "22" "23" "25" "26"))
        (start_list "S_ko")
          (mapcar 'add_list o_k)
              (end_list)
     (setq o_f (list "16" "8" "9" "10" "11" "12" "13" "17" "18" "19" "22" "23" "25" "26"))
        (start_list "S_fo")
          (mapcar 'add_list o_f)
             (end_list)
     (setq o_p (list "6" "3" "4" "8" "10" "12" "16" "18"))
        (start_list "S_po")
           (mapcar 'add_list o_p)
              (end_list)
(princ)
    ) 

  ;-------------------------------------------Диалоговое окно----------------------------------------

(setq dcl_id (load_dialog "D:/MyLISP/001_SHKAF/dialog_shkaf.DCL"));загрузка диалога и запоминание под номером
  (if (not (new_dialog "dialog_shkaf" dcl_id)) (exit));проверка, если не загружен, - выход

  (iz_mat);функция изменения списка в диалоговом окне

  (action_tile "accept" "(raz_shkaf) (done_dialog 1)"); ок закрыть диалог под номером 1
        (action_tile "cancel" "(done dialog 0)"); отмена закрыть диалог под номером 0
           (setq ddi (start_dialog));ф считывает значение, с которым было закрыто диалоговое окно и сохраняет в переменной ddi
              (unload_dialog dcl_id);выгрузка файла диалога после закрытия окна

(if (= ddi 1) (shkaf H L B H_z Z Cht o_vp o_v o_n o_l o_r S_k S_f S_p ))
(princ)
         );end defun shkaf_otd

И, пользуясь случаем, просьба, если есть время и желание, посмотреть на наличие грубых ошибок, т.е. то, что надо исправить однозначно.

Последний раз редактировалось Alxndr1697, 24.02.2022 в 21:43.
Alxndr1697 вне форума  
 
Непрочитано 24.02.2022, 22:30
#4133
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
А это не оно?
Насколько я помню, это выход не из диалога, а вообще из программы. Стараюсь подобного у себя не допускать.
Из исправлений, которые я бы сделал:
  1. Нет меток начала / окончания отмены.
  2. Все команды вываливаются в ком.строку со всеми вытекающими.
  3. Не учитывается вариант возможного переопределения команд (подробнее, если охота - https://autolisp.ru/2010/03/04/localization/ )
  4. Нет контроля - удалось построить примитив или нет.
  5. В сегодняшних реалиях, как мне кажется, лучше вместо command использовать command-s. Ну или по крайней мере проверять возможность использования command-s
Лично я не сторонних командных методов, ну да ладно. Разбирать код - увольте. Мне как-то неинтересно в середине кода вспоминать, что и почему валяется в переменной x_05.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.02.2022, 23:09
#4134
Alxndr1697


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


1. Это удобство, или ошибка? И это делается при помощи вла? До него я еще не дошел.
2. Других вариантов пока не знаю.
3. Читаю все, что вы предлагаете, правда, не все понятно пока.
4. Какая это функция, дайте направление.
5. Спасибо, буду изучать.


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Мне как-то неинтересно в середине кода вспоминать, что и почему валяется в переменной x_05
Представляете, - мне уже тоже))) но, как могу, так могу.
Alxndr1697 вне форума  
 
Непрочитано 24.02.2022, 23:18
#4135
Сергей812


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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
но, как могу, так могу.
может разбивать на подфункции?
и в более современных языках программирования с удобной средой разработки функция с
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
H L B H_z Z Cht o_vp o_v o_n o_l o_r S_k S_f S_p
~15 аргументами вызовет определенное офигевание удивление)
Сергей812 вне форума  
 
Непрочитано 24.02.2022, 23:28
#4136
Кулик Алексей aka kpblc
Moderator

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


Offtop:
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
1. Это удобство, или ошибка?
https://autolisp.ru/2009/09/20/howto_undo/
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Других вариантов пока не знаю.
Системная переменная nomutt (как минимум), если без команд ну вообще никуда и никак.
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Какая это функция, дайте направление.
Это не функция (по крайней мере штатная). А так-то можно нарисовать нечто типа:
Код:
[Выделить все]
 (setq lastent (entlast))
(command-s "_.box" param1 param2)
(if (not (equal lastent (entlast)))
  (alert "Построение не удалось")
  )
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Представляете, - мне уже тоже))) но, как могу, так могу.
В ООП для этого используются классы (уж простите меня корифеи ООП, пишу как умею), а в лиспе кто мешает использовать списки точечных пар? Быстро, дешево, сердито
Сголашусь с Сергеем:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
может разбивать на подфункции?
Та же самая функция построения бокса - легко может быть сделана как локальная функция, которая возвращает либо указатель на созданный элемент, либо nil. А "снаружи" уже проверять результаты и предпринимать какие-то действия.

Но это все так, размышления на тему. Мои слова не стоит воспринимать уж сильно всерьез
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2022, 06:59
#4137
Alxndr1697


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
может разбивать на подфункции?
Может. Дайте, пожалуйста, пример.
Почитав начало темы, я, видимо, сделал неправильный вывод.

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

Последний раз редактировалось Alxndr1697, 25.02.2022 в 07:36.
Alxndr1697 вне форума  
 
Непрочитано 25.02.2022, 07:56
#4138
Кулик Алексей aka kpblc
Moderator

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


Alxndr1697, сугубо ИМХО.
Если какой-то код длиннее 3..5 строк с оооочень незначительными изменениями (ну, например, имена используемых переменных) копипастится хотя бы раз - его надо в отдельную функцию выносить. Т.н. принцип DRY: Don't Repeat Yourself (никогда не повторяй за собой).
Числа в именах переменных есть зло, если только у тебя не стоит задача максимально запутать код.
Если в переменной, к примеру, хранятся координаты точки, то и называть ее надо максимально информативно. К примеру, base_point / top_left_point и т.д. ВО VLIDE Ctrl+Shift+Пробел помогут в наборе таких длинных имен.
Ну и так далее.

Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Посоветуйте учебник, видеокурс, или что-нибудь, где можно этому научиться.
C#, к примеру. Видео на youtube - ищи Дмитрия Загорулькина (напрямую по ACAD), Сергея Камянецкого (C#), Сергей Немчинский (он, конечно, больше по Java, но методику написания кода очень хорошо разобрал в свое время, мне это сильно помогло).

Ну и так далее.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2022, 08:04
#4139
Alxndr1697


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


Спасибо!Вечером все посмотрю, убег на работу.
Alxndr1697 вне форума  
 
Непрочитано 25.02.2022, 14:59
#4140
Сергей812


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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Посоветуйте учебник, видеокурс, или что-нибудь, где можно этому научиться.
ну и официальный ресурс разработчиков.
и если на английском хотя бы читаете более менее - справка. Там тоже примеры кода есть.
Сергей812 вне форума  
Ответ
Вернуться   Форум 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