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

Вернуться   Форум 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.
Просмотров: 1972097
 
Непрочитано 04.04.2022, 22:15
#4201
Alxndr1697


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Причина номер раз - это использование диалога (которого, естественно, у меня нет). Я понимаю, что можно покопаться по форуму и найти тот самый dcl. Но как-то подобное не комильфо - не проще ли создавать диалог "на лету"?
Зачем по форуму) На этой странице, 4190.
"На лету", - отличный вариант! Но,- VLA...

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Причина номер два - именования функций и переменных. Функция re_name (к примеру), судя по названию, должна там что-то переименовывать. А делает она совсем другое.
Она, в моем случае, в расширенных данных добавляет имя созданному объекту. Согласен, add_name было бы лучше.


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Причина номер три - это видимость функций и переменных. Все внутренние функции объявлены как глобальные.
Про глобальность функций не знал. Поищу инфу.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Далее. Мое искреннее убеждение состоит в том, что любая (подчеркиваю - любая!), даже локальная, функция должна работать только с теми данными, которые в нее прилетели и не лезть во внешние переменные. Та же raz_fasad (кстати, по имени можно решить заранее - что оно делает?) у меня была бы переписана примерно так:
Что значит, лезть во внешние переменные?
Raz_fasad считывает содержимое из диалогового окна, вроде как размеры фасада. Такие уж у меня ассоциации. Хотя, в окне, назвал это параметрами))

А вот дальше, то самое Но, о котором писал выше. Мне жутко неудобно, что вы потратили на меня столько времени, но, в VLA я не понимаю, от слова совсем(((
По поводу запроса точек, идею понял, попробую применить.

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

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

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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Зачем по форуму) На этой странице, 4190.
Ага, только одно "но" - это callback. Которого особо не видать
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
"На лету", - отличный вариант! Но,- VLA...
Какое vla-? Тупо получение каталога временных файлов, создание файла, запись в него и далее по тексту.
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Про глобальность функций не знал. Поищу инфу.
Вроде бы в ссылках было.
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Что значит, лезть во внешние переменные?
Raz_fasad считывает содержимое из диалогового окна, вроде как размеры фасада. Такие уж у меня ассоциации. Хотя, в окне, назвал это параметрами))
Я, как мне казалось, привел вариант "как стоило бы переделать". Но, вспоминая о том, что все это всего лишь личное мнение...
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
вся программа в комментариях
Советую поискать на youtube видосики от Сергея Немчинского. Он, хотя и джавист, но вещи озвучивает очень серьезные и важные. В том числе и про правило 20/80, про чтение кода, про аналитику кода и все вот это вот.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2022, 00:10
#4203
Сергей812


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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Что значит, лезть во внешние переменные?
defun Имя_функции ( аргументы или параметры / локальные переменные)

1. Аргументы могут дублироваться (по имени) произвольное количество раз в разных функциях, но при этом конфликта не будет - так как область видимости аргумента: только внутри функции.
2. Локальные переменные - аналогично.

Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
но, в VLA я не понимаю, от слова совсем(((
это просто расширение лиспа, позволяющее делать многие вещи не через комстроку, а вызовом напрямую функций с передачей им необходимых аргументов. Ведь каждый раз, когда обращаетесь к командному процессору акада внутри функции - по сути прерываете выполнение функции с передачей управления самому акаду. И вернет ли акад управление в вашу функции сразу, или захочет чем-то своим заняться.. Никак не управляемо и не предсказуемо
Сергей812 вне форума  
 
Непрочитано 05.04.2022, 07:28
#4204
Alxndr1697


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кстати, у тебя там не возвращаются обратно системные переменные. И метка окончания отмены не ставится, что может привести к неприятным последствиям.
Вроде, все возвращал, что менял и метка окончания отмены есть.
Или, опять, что-то путаю?
Код:
[Выделить все]
  (setvar "osmode" oldosm)
  (setvar "clayer" oldlay)
  (command-s "._UNDO" "_end")
----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
defun Имя_функции ( аргументы или параметры / локальные переменные)

1. Аргументы могут дублироваться (по имени) произвольное количество раз в разных функциях, но при этом конфликта не будет - так как область видимости аргумента: только внутри функции.
2. Локальные переменные - аналогично.
Да, это Browning Zed мне доходчиво объяснил.
Внешние переменные, - это которые в DCL?

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

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


"Внешние переменные" - это то, что по отношению к какой-то функции не прилетевшее в нее. Пример callback-функции я привел.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2022, 07:48
#4206
Alxndr1697


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Советую поискать на youtube видосики от Сергея Немчинского. Он, хотя и джавист, но вещи озвучивает очень серьезные и важные. В том числе и про правило 20/80, про чтение кода, про аналитику кода и все вот это вот.
При наличии времени, - час утром и час вечером на занятия, просмотреть более двух сотен видео...
Я не собираюсь становиться Программистом. Мне хотелось бы написать (самому) несколько программ, которые облегчат мне работу сегодня и, возможно, обеспечат мне ее в будущем.
Alxndr1697 вне форума  
 
Непрочитано 05.04.2022, 08:09
#4207
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
При наличии времени, - час утром и час вечером на занятия, просмотреть более двух сотен видео...
Я не собираюсь становиться Программистом. Мне хотелось бы написать (самому) несколько программ, которые облегчат мне работу сегодня и, возможно, обеспечат мне ее в будущем.
Я когда-то тоже так думал У тебя есть два варианта: либо сделать по-нормальному, либо сделать "на отцепись", чтобы хоть как-то работало. Второй вариант плох тем, что через пару-тройку месяцев, когда тебе придется возвращаться в код и пытаться его доработать/улучшить/изменить, тебе будет проще все переписать заново. Ну да дело твое.
Касаемо ошибки: проверяй, какие значения тебе прилетают. Точки останова в помощь ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2022, 09:33
| 2 #4208
Сергей812


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


Offtop:
Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Я не собираюсь становиться Программистом.
когда физически ощущаешь - как рутинная работа начинает обходить тебя стороной, процесс мелкой и не очень автоматизации затягивает) А на дорожку программиста вы уже встали, сойдя с пути вопрошающих "а нет ли случайно у кого то программы под описанные мною хотелки")
Сергей812 вне форума  
 
Непрочитано 08.04.2022, 23:17
#4209
Alxndr1697


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


Код:
[Выделить все]
(defun insert_fasad (H_box L_box Col_vo B_mat_fas B_mat_corp Z_r otst_up_front otst_top otst_bottom otst_left otst_right /
	             oldosm oldlay P_0 P_L P_H H_box L_box B_mat_corp B_mat_fas Z_r otst_top otst_bottom otst_left otst_right
	             H_fas_one L_fas H_fas_N Col_vo P_0_fas Fas_one Vibor)

  (command-s "._UNDO" "_be");начало группы для отмены (Begin).
  (defun *error*(msg) 
  (princ msg) 
 )
(command-s "_.UCS" "_w");пск в мск

  (setq P_0 (getpoint "\nУкажите левую внутреннюю нижнюю точку бокса <Отмена> :"))
  (setq P_L (getpoint "\nУкажите правую внутреннюю нижнюю точку бокса <Отмена> :"));ось x
    (if (/= (cadr P_L) (cadr P_0))
      (progn (alert (strcat "Неверная точка. Точка должна лежать в плоскости XZ"))
       (exit))
     )
  (setq P_H (getpoint "\nУкажите левую внутренюю верхнюю точку бокса <Отмена> :")) ;ось z
    (if (/= (cadr P_H) (cadr P_0))
      (progn (alert (strcat "Неверная точка. Точка должна лежать в плоскости XZ"))
       (exit))
     )
   (setq H_box (distance P_0 P_H));высота бокса
   (setq L_box (distance P_0 P_L));длина (ширина) бокса

  (setq oldosm (getvar "osmode")) ;запоминание привязок
  (setvar "osmode" 0)
  (setq oldlay (getvar "clayer"))           ;запоминание текущего слоя
    (if (null (tblsearch "layer" "ФАСАД"))  ;проверка наличия слоя "Фасад"
      (command-s "_.-layer" "_n" "ФАСАД" "");создание нового слоя
     )
      (command-s "_.-layer" "_make" "ФАСАД" "_color" "3" "" "")

  (fasad_naklad)
  (fasad_vklad)

  (if (= Vibor "o_nkl") (fasad_naklad))
  (if (= Vibor "o_vkl") (fasad_vklad))

  (command-s "_.ucs" "x" 90)
  (command-s "_.arrayrect" Fas_N "" "_col" 1 1 "_r" Col_vo (+ H_fas_N Z_r) "" "")

  (command-s "_.UCS" "_w");пск в мск
  

  (setvar "osmode" oldosm)   ;возврат привязок
  (setvar "clayer" oldlay)   ;возврат текущего слоя
  (command-s "._UNDO" "_end");окончание группы для отмены.
  (princ)
   );end defun insert_fasad
Здравствуйте.
С синими строками работают оба варианта (строятся вкладные и накладные фасады).
Как правильно написать условие, чтобы выполнялся один вариант, в зависимости от (= Vibor "o_nkl"), или (= Vibor "o_vkl")?
Мой, красный, конечно же, не работает.
Alxndr1697 вне форума  
 
Непрочитано 08.04.2022, 23:28
#4210
Кулик Алексей aka kpblc
Moderator

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


См.в сторону cond
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.04.2022, 07:45
#4211
Alxndr1697


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
См.в сторону cond
Вот так, тоже не работает.

Код:
[Выделить все]
  (cond (= Vibor "o_nakl") (fasad_naklad)
	(= Vibor "o_vkl") (fasad_vklad)
    );end cond
----- добавлено через ~6 мин. -----
При прописывании условия, стоки (синие (пост 4209)), убирать, или они должны оставаться?

Последний раз редактировалось Alxndr1697, 09.04.2022 в 07:58.
Alxndr1697 вне форума  
 
Непрочитано 09.04.2022, 09:51
#4212
Кулик Алексей aka kpblc
Moderator

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


Неправильно.
Код:
[Выделить все]
   (cond ((= Vibor "o_nakl") (fasad_naklad))
	((= Vibor "o_vkl") (fasad_vklad))
    );end cond
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.04.2022, 23:33
#4213
Alxndr1697


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Неправильно.
Точно. Спасибо.
Но, все равно, не работает.
Отдельно (fasad_naklad), - работает. Отдельно (fasad_vklad), - работает.
Вместе и с (cond), - строит оба варианта, только у накладного, почему-то не срабатывает команда "массив"
Миниатюры
Нажмите на изображение для увеличения
Название: 2022-04-09_230703.jpg
Просмотров: 16
Размер:	28.7 Кб
ID:	246623  Нажмите на изображение для увеличения
Название: 2022-04-09_230826.jpg
Просмотров: 17
Размер:	30.5 Кб
ID:	246624  Нажмите на изображение для увеличения
Название: 2022-04-09_231342.jpg
Просмотров: 14
Размер:	42.6 Кб
ID:	246625  
Alxndr1697 вне форума  
 
Непрочитано 10.04.2022, 12:18
#4214
Кулик Алексей aka kpblc
Moderator

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


Не хочу вникать в логику, но я бы подумал на предмет заменить
Код:
[Выделить все]
(fasad_naklad)
  (fasad_vklad)

  (if (= Vibor "o_nkl") (fasad_naklad))
  (if (= Vibor "o_vkl") (fasad_vklad))
на
Код:
[Выделить все]
 (cond ((= Vibor "o_nkl") (fasad_naklad))
  ((= Vibor "o_vkl") (fasad_vklad)))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.04.2022, 22:13
#4215
Alxndr1697


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


Так, тоже пробовал:
Миниатюры
Нажмите на изображение для увеличения
Название: 2022-04-10_220117.jpg
Просмотров: 22
Размер:	74.1 Кб
ID:	246640  
Alxndr1697 вне форума  
 
Непрочитано 10.04.2022, 23:29
#4216
koMon


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


Очевидно, что надо посмотреть, что находится в переменных H_fas_N, Z_r на момент выполнения команды array в проблемной сумме, яд.
koMon вне форума  
 
Непрочитано 11.04.2022, 07:09
#4217
Alxndr1697


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Очевидно, что надо посмотреть, что находится в переменных H_fas_N, Z_r на момент выполнения команды array в проблемной сумме, яд.
Удивительно, но и в рабочем варианте и в нерабочем, одно и то же.

----- добавлено через ~5 мин. -----
А вот Vibor, почему-то, - nil. Может тут собака зарыта?

----- добавлено через ~8 мин. -----
При включении обеих функций Vibor работает корректно. Мой мозг отказывается что-то понимать
Миниатюры
Нажмите на изображение для увеличения
Название: 2022-04-11_070022.jpg
Просмотров: 14
Размер:	104.1 Кб
ID:	246645  Нажмите на изображение для увеличения
Название: 2022-04-11_070519.jpg
Просмотров: 14
Размер:	103.2 Кб
ID:	246646  Нажмите на изображение для увеличения
Название: 2022-04-11_071336.jpg
Просмотров: 15
Размер:	62.0 Кб
ID:	246647  Нажмите на изображение для увеличения
Название: 2022-04-11_071926.jpg
Просмотров: 12
Размер:	55.4 Кб
ID:	246648  

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

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


Цитата:
Сообщение от Alxndr1697 Посмотреть сообщение
Так, тоже пробовал:
Я уже писал, что, по-хорошему, любая функция должна работать только с тем, что к ней пришло и не лезьть во внешние по отношению к ней переменные. Если у тебя ситуация такая, что каждый лезет куда вздумается и абсолютно бесконтрольно, то могу только посочувствовать. Ну или посоветовать переписать код.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.04.2022, 21:36
#4219
Alxndr1697


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


Буду весьма признателен, если кто-нибудь найдет время и желание найти и исправить ошибки.
Программа должна строить накладные, или вкладные фасады, в зависимости от выбора, в заданном количестве и параметрами. (в диалоговом окне, думаю, все понятно)
Модель "шкафчика" для экспериментов прилагаю.

Диалоговое окно:
Код:
[Выделить все]
dialog_fasad_sup: dialog {label = "Фасад ящика (горизонтальный)";
:spacer{height=1;}
:column {label = "Точки ввода :";
:spacer{height=1;}
:image {key = "sld"; width  = 15; aspect_ratio = 1.8; color= 4;}
        }//end column точки ввода
:spacer{height=1;}
:boxed_column {label = "Параметры фасада :";
:spacer{height=1;}
:radio_row {key = "Tip_f"; label = "Тип фасада :";
                           
            :radio_button {key = "o_nkl"; label = "Накладной"; value = "1";}
            :radio_button {key = "o_vkl"; label = "Вкладной"; value = "0";}
            }//end radio_row
                                                :spacer{height=1;}
:row {:boxed_column {:boxed_column {label = "Количество фасадов :";
:spacer{height=1;}
             :edit_box {key = "o_Col_vo";         label = "Количество :";               value = "1";   edit_width = 4;}
               }//end column количество
:spacer{height=2;}
:boxed_column {label = "Толщина материала :";
             :edit_box {key = "o_B_mat_fas";      label = "Фасада :";                   value = "16";   edit_width = 4;}
             :edit_box {key = "o_B_mat_corp";     label = "Корпуса :";                  value = "16";   edit_width = 4;}
               }//end column толщина материала
               }
:spacer{height=1;}             
:boxed_column {label = "Зазоры фасада :";
//:spacer{height=1;}
             :edit_box {key = "o_Z_r";            label = "Зазор между фасадами :";     value = "3";   edit_width = 4;}
             :edit_box {key = "o_otst_up_front";  label = "Отступ от корпуса вперед :"; value = "0";   edit_width = 4;}
             :edit_box {key = "o_otst_top";       label = "Отступ сверху :";            value = "1.5"; edit_width = 4;}
             :edit_box {key = "o_otst_bottom";    label = "Отступ снизу :";             value = "1.5"; edit_width = 4;}
             :edit_box {key = "o_otst_left";      label = "Отступ слева :";             value = "1.5"; edit_width = 4;}
             :edit_box {key = "o_otst_right";     label = "Отступ справа :";            value = "1.5"; edit_width = 4;}
               }//end column зазоры
               }//end row
}//end параметры фасада

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

       
                         }//end dialog
Программа:
Код:
[Выделить все]
;***************************Функция add_name*********************************

(defun add_name (Part_name / le edata le2 )
(regapp "AVCNames")                                                  ;регистрация приложения ""AVCNames""
(setq le (entget (entlast)))                                         ;получение списка данных последнего примитива
(setq edata (list (list -3 (list "AVCNames" (cons 1000 Part_name)))));формирование подсписка расширенных данных и включение в список
(setq le2 (append le edata))                                         ;присоединение расширенных данных к примитиву
(entmod le2)                                                         ;обновление примитива
(entget (entlast) '("AVCNames"))                                     ;проверка данных примитива
 );end add_name

;**************************функция param_fasad*******************************

 (defun param_fasad (/ )

   (setq Vibor (get_tile "Tip_f"))
   
   (setq Col_vo (atof (get_tile "o_Col_vo")));считывание и преобразование из строкового в число и сохранение
   (setq B_mat_fas (atof (get_tile "o_B_mat_fas")))
   (setq B_mat_corp (atof (get_tile "o_B_mat_corp")))
   (setq Z_r (atof (get_tile "o_Z_r")))
   (setq otst_up_front (atof (get_tile "o_otst_up_front")))
   (setq otst_top (atof (get_tile "o_otst_top")))
   (setq otst_bottom (atof (get_tile "o_otst_bottom")))
   (setq otst_left (atof (get_tile "o_otst_left")))
   (setq otst_right (atof (get_tile "o_otst_right")))
   );end param_fasad

;**************************функция insert_fasad*****************************

(defun insert_fasad (H_box L_box Col_vo B_mat_fas B_mat_corp Z_r otst_up_front otst_top otst_bottom otst_left otst_right /
	             oldosm oldlay P_0 P_L P_H H_fas_N H_fas_one L_fas P_0_fas Fas_one Vibor)
	             

  (command-s "._UNDO" "_be");начало группы для отмены (Begin).
  (defun *error*(msg) 
  (princ msg) 
 )
(command-s "_.UCS" "_w");пск в мск

  (setq P_0 (getpoint "\nУкажите левую внутреннюю нижнюю точку бокса <Отмена> :"))
  (setq P_L (getpoint "\nУкажите правую внутреннюю нижнюю точку бокса <Отмена> :"));ось x
    (if (/= (cadr P_L) (cadr P_0))
      (progn (alert (strcat "Неверная точка. Точка должна лежать в плоскости XZ"))
       (exit))
     )
  (setq P_H (getpoint "\nУкажите левую внутренюю верхнюю точку бокса <Отмена> :")) ;ось z
    (if (/= (cadr P_H) (cadr P_0))
      (progn (alert (strcat "Неверная точка. Точка должна лежать в плоскости XZ"))
       (exit))
     )
   (setq H_box (distance P_0 P_H));высота бокса
   (setq L_box (distance P_0 P_L));длина (ширина) бокса

  (setq oldosm (getvar "osmode")) ;запоминание привязок
  (setvar "osmode" 0)
  (setq oldlay (getvar "clayer"))           ;запоминание текущего слоя
    (if (null (tblsearch "layer" "ФАСАД"))  ;проверка наличия слоя "Фасад"
      (command-s "_.-layer" "_n" "ФАСАД" "");создание нового слоя
     )
      (command-s "_.-layer" "_make" "ФАСАД" "_color" "3" "" "")

  (fasad_naklad)
  (fasad_vklad)

;;;  (if (= Vibor "o_nkl") (fasad_naklad))
;;;  (if (= Vibor "o_vkl") (fasad_vklad))
(cond ((= Vibor "o_nakl") (fasad_naklad))
      ((= Vibor "o_vkl") (fasad_vklad))
 );end cond


  (command-s "_.ucs" "x" 90)
  (command-s "_.arrayrect" Fas_N "" "_col" 1 1 "_r" Col_vo (+ H_fas_N Z_r) "" "")

  (command-s "_.UCS" "_w");пск в мск
  

  (setvar "osmode" oldosm)   ;возврат привязок
  (setvar "clayer" oldlay)   ;возврат текущего слоя
  (command-s "._UNDO" "_end");окончание группы для отмены.
  (princ)
   );end defun insert_fasad

;**************************функция fasad_naklad*****************************************
   
 (defun fasad_naklad ( /)
      (setq H_fas_one (- (- (+ H_box (* 2 B_mat_corp)) otst_top) otst_bottom))  
      (setq L_fas (- (- (+ L_box (* 2 B_mat_corp)) otst_left) otst_right))
      (setq H_fas_N (/ (- H_fas_one (* Z_r (1- Col_vo))) Col_vo))
      (setq P_0_fas (list (+ (- (car P_0) B_mat_corp) otst_left) (- (cadr P_0) otst_up_front) (+ (- (caddr P_0) B_mat_corp) otst_bottom)))

	(command-s "_.box" P_0_fas (list (+ (car P_0_fas) L_fas) (- (- (cadr P_0_fas) B_mat_fas) otst_up_front) (+ (caddr P_0_fas) H_fas_N)))
	(setq Fas_N (entlast))
        (if (not (equal Fas_N (entlast))) (alert "Построение не удалось"))
        (add_name "Фасад")
        (princ)
   )
;***************************функция fasad_vklad****************************************

(defun fasad_vklad ( /)
     (setq H_fas_one (- (- H_box otst_top) otst_bottom))  
     (setq L_fas (- (- L_box otst_left) otst_right))
     (setq H_fas_N (/ (- H_fas_one (* Z_r (1- Col_vo))) Col_vo))
     (setq P_0_fas (list (+ (car P_0) otst_left) (- (+ (cadr P_0) B_mat_fas) otst_up_front) (+ (caddr P_0) otst_bottom)))

       (command-s "_.box" P_0_fas (list (+ (car P_0_fas) L_fas) (- (cadr P_0_fas) B_mat_fas) (+ (caddr P_0_fas) H_fas_N)))
       (setq Fas_N (entlast))
       (if (not (equal Fas_N (entlast))) (alert "Построение не удалось"))
       (add_name "Фасад")
       (princ)
  )

;*****************************Функция Slide**********************************

  (defun slide (/ dx dy)
    (setq dx (dimx_tile "sld")
	  dy (dimy_tile "sld"))
    (start_image "sld")
    (slide_image -1  -1  (1+ dx) (1+ dy) "2" )
    (end_image)
   );end slide

;***************************Основная программа**********************************

(DEFUN c:fasad_sup (/ dcl_id ddi)
  (setq dcl_id (load_dialog "D:/MyLISP/002_FASAD/dialog_fasad_sup.DCL"));загрузка диалога и запоминание под номером
  (if (not (new_dialog "dialog_fasad_sup" dcl_id)) (exit))            ;проверка, если не загружен, - выход
  (action_tile "accept" "(param_fasad) (slide) (done_dialog 1)");ок закрыть диалог под номером 1
  (action_tile "cancel" "(done dialog 0)")                      ;отмена закрыть диалог под номером 0
  (setq ddi (start_dialog))                                     ;ф считывает значение, с которым было закрыто диалоговое окно и сохраняет в переменной ddi
  (unload_dialog dcl_id)                                        ;выгрузка файла диалога после закрытия окна

(if (= ddi 1) (insert_fasad H_box L_box Col_vo B_mat_fas B_mat_corp Z_r otst_up_front otst_top otst_bottom otst_left otst_right)
 )
(princ)

   );end defun fasad_sup
Вложения
Тип файла: dwg
DWG 2013
ФАСАД.dwg (56.9 Кб, 10 просмотров)

Последний раз редактировалось Alxndr1697, 11.04.2022 в 21:47.
Alxndr1697 вне форума  
 
Непрочитано 12.04.2022, 23:58
#4220
Кулик Алексей aka kpblc
Moderator

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


Сравни свой кусок кода (для начала):
Код:
[Выделить все]
   (fasad_naklad)
  (fasad_vklad)

;;;  (if (= Vibor "o_nkl") (fasad_naklad))
;;;  (if (= Vibor "o_vkl") (fasad_vklad))
  (cond ((= vibor "o_nakl") (fasad_naklad))
        ((= vibor "o_vkl") (fasad_vklad))
  )       ;end cond
и то, что я тебе говорил.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не хочу вникать в логику, но я бы подумал на предмет заменить
Код:
[Выделить все]
(fasad_naklad)
  (fasad_vklad)

  (if (= Vibor "o_nkl") (fasad_naklad))
  (if (= Vibor "o_vkl") (fasad_vklad))
на
Код:
[Выделить все]
 (cond ((= Vibor "o_nkl") (fasad_naklad))
  ((= Vibor "o_vkl") (fasad_vklad)))
И что в диалоге делает image, когда он там нафиг не нужен? Судя по коду единственное место, где он хоть какое-то получает значение - это нажатие на кнопку ОК. Учитывая, что диалог достаточно быстро закрывается, углядеть, что там поменялось (и поменялось ли) невозможно.
Код переписывать лениво.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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