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

Вернуться   Форум 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.
Просмотров: 2048481
 
Старый 06.05.2011, 23:10
#1461
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Владимир Егорьев Посмотреть сообщение
Особо не критикуйте.Пишу код как могу-с книжкой в руках.
Либо читайте внимательно книжку, особенно про локальные переменные или функцию (initget 1) или про то, как не стоит забывать вписывать функции в скобки... например... progn... либо чаще смотреть в командную строку
gomer вне форума  
 
Старый 06.05.2011, 23:20
#1462
Владимир Егорьев


 
Сообщений: n/a


Спасибо за направление.Уже что-то.

Цитата:
Сообщение от gomer Посмотреть сообщение
... либо чаще смотреть в командную строку
Это вы про то что пишет ком.строка.Так ни всегда понятно на что она ругается.
 
 
Старый 06.05.2011, 23:23
#1463
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


у вас результат вычисления setq - список... список не может быть функцией... о чем автогад вам и напоминает... ваша задача найти куда вставить progn... справитесь?
gomer вне форума  
 
Старый 06.05.2011, 23:33
#1464
Владимир Егорьев


 
Сообщений: n/a


Да gomer.Спасибо.Уверен что справлюсь.
Дело в том что практики нет и поэтому функции лиспа ищу долго.Да и описание не всегда понимаю в книге(ах).


Добавлено->gomer

Всё решилось.
У меня ещё вопрос.
Мне нужно в этом коде выбрать созданный обект (грань многогранника) для того чтобы его ARRAYрить.Функция entlast подходит?

Последний раз редактировалось Владимир Егорьев, 06.05.2011 в 23:41.
 
 
Старый 06.05.2011, 23:38
#1465
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


хи-хи... жестко тему прикрыли...
gomer вне форума  
 
Старый 07.05.2011, 00:04
#1466
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Попробовал немного помочь.
Однако, на мой взгляд, не стоит в принципе вводить исходные данные таким последовательным образом, лучше сделать диалог, например dcl, либо еще каким нибудь образом, но сразу все, а не поочереди.

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

Код:
[Выделить все]
 (defun	c:razvertka ()
   (if 
   (and
	 (setq
	   H1 (getreal "\n Введите высоту элемента конструкции H1=")
	 )
	 (setq K1
		(getreal
		  "\n Введите размер между внутренними поверхностями граней нижнего основания (диаметр для конуса) K1="
		)
	 )
	 (setq k2
		(getreal
		  "\n Введите размер между внутренними поверхностями граней верхнего основания (диаметр для конуса) k2="
		)
	 )
	 (setq Udugokr
		(getreal
		  "\n Введите в градусах значение угла дуги подлежащей развёртыванию Udugokr="
		)
	 )
	 (setq ngran
		(getint
		  "\n Введите количество граней элемента конструкции ngran="
		)
	 )
	 (setq
	   rp (getreal "\n Введите радиус инструмента (пуансона) rp=")
	 )
	 (setq tm
		(getreal "\n Введите толщину изгибаемого материала tm= ")
	 )
	 (setq
	   x (getreal "\n Введите значение коэффициента изгиба x= ")
	 )
	 (setq
	   BT (getpoint
		"\n Введите координаты базовой точки: [можно мышкой] "
	      )
	 )
       )
     (if (and (= 0 ngran)
	      (setq alfaradian (/ (* pi Udugokr) 180))
	      (setq KK1 (+ K1 (* 2 (* tm x))))
	      (setq kk2 (+ k2 (* 2 (* tm x))))
	      (setq Ldug (* (* 0.5 kk2) alfaradian))
	      (setq betta1 (atan (/ (- KK1 kk2) (* 2 H1))))
	      (setq r2 (/ (* 0.5 kk2) (sin betta1)))
	      (setq R1 (/ (* 0.5 KK1) (sin betta1)))
	      (setq betta2 (* 0.5 (/ Ldug r2)))
	      (setq BT1 (polar BT (- (* 1.5 pi) betta2) r2))
	      (setq BT2 (polar BT (* 1.5 pi) r2))
	      (setq BT3 (polar BT (+ (* 1.5 pi) betta2) r2))
	      (setq BT4 (polar BT (- (* 1.5 pi) betta2) R1))
	      (setq BT5 (polar BT (* 1.5 pi) R1))
	      (setq BT6 (polar BT (+ (* 1.5 pi) betta2) R1))
	 )
       (and
	 (vl-cmdf "_.ARC" BT1 BT2 BT3 "_.ARC" BT4 BT5 BT6)
	 (vl-cmdf "_.line" BT1 BT4 "")
	 (vl-cmdf "_.line" BT3 BT6 "")
	 (vl-cmdf "_.zoom" "_E")
       )
       (if (and
	     (setq Y1 (/ 360 (* 2 ngran)))
	     (setq Y1rad (/ (* Y1 pi) 180))
	     (setq KK1 (+ K1 (* tm x)))
	     (setq kk2 (+ k2 (* tm x)))
	     (setq Lgran1 (* 2 (* KK1 (sin Y1rad))))
	     (setq lgran2 (* 2 (* kk2 (sin Y1rad))))
	     (setq Rgib (+ rp (* tm x)))
	     (setq Y2rad (* 2 Y1rad))
	     (setq Lduggib (* Rgib Y2rad))
	     (setq L1kraingran (+ Lgran1 (* 0.5 Lduggib)))
	     (setq l2kraingran (+ lgran2 (* 0.5 Lduggib)))
	     (setq L1osngran (+ Lgran1 Lduggib))
	     (setq l2osngran (+ lgran2 Lduggib))
	     (setq betta3 (atan (/ (- KK1 kk2) (* 2 H1))))
	     (setq Visotagrani (/ H1 (cos betta3)))
	     (setq Raznicakraingran
		    (/ (- L1kraingran l2kraingran) 2)
	     )
	     (setq
	       Lrebra (sqrt (+ (* Raznicakraingran Raznicakraingran)
			       (* Visotagrani Visotagrani)
			    )
		      )
	     )
	     (setq mu (atan (/ Raznicakraingran Visotagrani)))
	     (setq P1 (/ (- (* 0.5 KK1) Rgib) (cos Y1rad)))
	     (setq p2 (/ (- (* 0.5 kk2) Rgib) (cos Y1rad)))
	     (setq D1 (* 2 (+ P1 Rgib)))
	     (setq d2 (* 2 (+ p2 Rgib)))
	     (setq betta4 (atan (/ (- D1 d2) (* 2 H1))))
	     (setq Sh (/ (* 0.5 d2) (sin betta4)))
	     (setq BT7 (polar BT (* 1.5 pi) Sh))
	     (setq BT8 (polar BT7 (+ (* 2 pi) mu) l2kraingran))
	     (setq BT9 (polar BT7 (* 1.5 pi) Lrebra))
	     (setq BT10 (polar BT9 (+ (* 2 pi) mu) L1kraingran))
	     (setq BT11 (polar BT8 (+ (* 2 pi) (* 2 mu)) l2osngran))
	     (setq BT12 (polar BT10 (+ (* 2 pi) (* 2 mu)) L1osngran))
	   )
	 (and
	   (vl-cmdf "_.pline" BT7 "_w" 1 1 BT8 BT10 BT9 BT7 "")
	   (vl-cmdf "_.pline" BT8 "_w" 1 1 BT11 BT12 BT10 BT8 "")
	   (vl-cmdf "_.zoom" "_E")
	 )
       )
     )
   )
 )
__________________
apel.fas
Apelsinov вне форума  
 
Старый 07.05.2011, 00:22
#1467
Владимир Егорьев


 
Сообщений: n/a


Apelsinov
Цитата:
Однако, на мой взгляд, не стоит в принципе вводить исходные данные таким последовательным образом, лучше сделать диалог, например dcl, либо еще каким нибудь образом, но сразу все, а не поочереди.
Всё правильно вы говорите.
Но всё постепенно.Я так сказать ещё ходить учусь.
Это с позволения сказать програмка будет использоваться (во всяком случае я надеюсь) в реальности и вот её я и возьму для развития.Пока мне удалось вот это.

Повторю вопрос по поводу entlast:Мне нужно в этом коде выбрать созданный обект (грань многогранника) для того чтобы его ARRAYрить.Функция entlast для этого подходит?

Последний раз редактировалось Владимир Егорьев, 07.05.2011 в 00:28.
 
 
Старый 07.05.2011, 00:37
#1468
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
Попробовал немного помочь.
старая школа... моя твоя не понимайт...

Цитата:
Сообщение от Владимир Егорьев Посмотреть сообщение
Повторю вопрос по поводу entlast:Мне нужно в этом коде выбрать созданный обект (грань многогранника) для того чтобы его ARRAYрить.Функция entlast для этого подходит?
да, подходит... вызывать ее нужно непосредственно после отрисовки примитива... например
Код:
[Выделить все]
 (vl-cmdf "_.ARC" BT1 BT2 BT3 "_.ARC" BT4 BT5 BT6)
(setq arcobj (entlast))
 (vl-cmdf "_.line" BT1 BT4 "")
(setq lineobj (entlast))
gomer вне форума  
 
Старый 10.05.2011, 10:24
#1469
Aminka

проектировщик CТБ
 
Регистрация: 03.03.2009
Сообщений: 28


Всем привет и большое спасибо за то, что тратите свое время на ответы на вопросы.

Ну и сам вопрос.

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

Вижу только один вариант:
1.Выборка "А" обнуляется. Используется реактор мыши - каждый раз, когда происходит клик правой кнопкой мыши и функция ssget автоматически заканчивает работу по выборке "B" происходит следующее:
1.1. удаляется последний элемент из выборки "B".
1.2. к исходной выборке "А" добавляются только выборка "B".
1.3. обнуляется "B".
1.4. запускается ssget - для новой выборки "B".

Так же возможно поставить реактор на выбор объекта - тогда удаляться будет не последний элемент, а группа элементов.

В том ли направлении я размышляю или есть какие-то другие методики?
Aminka вне форума  
 
Старый 10.05.2011, 11:11
#1470
Лиспер


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


Есть же штатный вариант: нажать Shift и, не отпуская его, выделить объект, попавший в набор. Объект будет исключен из набора (точный список системных переменных, отвечающих за такое поведение, сказать не могу, навскидку: pickfirst, pickadd, pickdrag).
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Старый 10.05.2011, 11:21
#1471
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Aminka, а еще есть ключи команды выбора, стандартные
Код:
[Выделить все]
Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/Previous/Undo/AUto/SIngle
там есть и Remove.
Вы же пытаетесь сделать нестандартный вариант выбора, для пользователя это будет как минимум не привычно.
__________________
apel.fas
Apelsinov вне форума  
 
Старый 10.05.2011, 11:25
#1472
Aminka

проектировщик CТБ
 
Регистрация: 03.03.2009
Сообщений: 28


Мдя) что еще раз доказывает, что Аминка еще очень мало знает и чертит весьма криво)
Спасибо.
Aminka вне форума  
 
Старый 12.05.2011, 04:03
#1473
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


подскажите, как с помощью лисп узнать версию загруженного автокада?
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Старый 12.05.2011, 06:27
#1474
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от wetr Посмотреть сообщение
подскажите, как с помощью лисп узнать версию загруженного автокада?
Код:
[Выделить все]
 
(getvar "acadver")
__________________
cadtools
TararykovDG вне форума  
 
Старый 12.05.2011, 08:04
#1475
Лиспер


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


Код:
[Выделить все]
 (atoi (vl-string-trim "VISUALP " (strcase (ver))))
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Старый 12.05.2011, 09:01
#1476
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


TararykovDG, спасибо!
Лиспер - круть!
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Старый 12.05.2011, 12:48
#1477
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Почти как у лиспера
Код:
[Выделить все]
  ;;;Get from Elpanov Evgeniy http://www.theswamp.org/index.php?topic=36606.msg416187
  (atoi (substr (ver) 13))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 12.05.2011, 19:51
#1478
Владимир Егорьев


 
Сообщений: n/a


Код:
[Выделить все]
 (setq massiv1 (vla-arraypolar obj (- ngran 2) (* betta4 (- ngran 2)) (vlax-3d-point BT))) 
	   (vlax-safearray->list (vlax-variant-value massiv1))
	   (vl-cmdf "_.zoom" "_E"))))
В результате выполнения массива не точно выполняется градусная мера угла сектора.Я так подозреваю что дело в точности угла.
В чём может быть причина вышеуказанного?

Последний раз редактировалось Владимир Егорьев, 12.05.2011 в 21:31.
 
 
Старый 12.05.2011, 22:41
#1479
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Владимир Егорьев Посмотреть сообщение
В результате выполнения массива не точно выполняется градусная мера угла сектора.Я так подозреваю что дело в точности угла.
мдя
вот вам для размышлений
Код:
[Выделить все]
 (setq LineObj
  (vla-AddLine
    (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
    (vlax-3d-point '(4 4 0))
    (vlax-3d-point '(7 1 0))
  )
  n 6
)
(vla-ArrayPolar
  LineObj
  n
  (* (1- n) (/ (* pi 2) n))
  (vlax-3d-point '(2 2 0))
)
gomer вне форума  
 
Старый 14.05.2011, 11:30
#1480
Владимир Егорьев


 
Сообщений: n/a


gomer

Моя вина-я не полностью часть кода выложил в посте 1478.
Код:
[Выделить все]
 (vl-cmdf "_.pline" BT7 "_w" 0.1 0.1 BT8 BT10 BT9 BT7 "")
	   (setq ee1 (entlast))
	   (vl-cmdf "_.pline" BT7 "_w" 0.1 0.1 BT11 BT12 BT9 BT7 "")
	   (setq ee2 (entlast))
	   (setq obj (vlax-ename->vla-object ee1))
	   (setq massiv1 (vla-arraypolar
			   obj
			   (- ngran 2)
			   (* betta4 (- ngran 2))
			   (vlax-3d-point BT)
			 ) ;_ конец vla-arraypolar
	   ) ;_ конец setq
	   (vlax-safearray->list (vlax-variant-value massiv1))
	   (vl-cmdf "_.zoom" "_E")
Мне нужно выполнить массив объекта (второй объект на скриншоте)относительно базовой точки.И получается вот так как на скриншоте 1 или ещё могут быть вариаты,в зависимости от того что у меня будет в качестве переменной betta4,но только не то что надо (см. скрин 2)

p.s. Пунктир и BT-не програмно нарисован.Просто для пояснения.
Миниатюры
Нажмите на изображение для увеличения
Название: Чертеж1-Model.jpg
Просмотров: 57
Размер:	14.3 Кб
ID:	59532  Нажмите на изображение для увеличения
Название: Чертеж1-Model2.jpg
Просмотров: 59
Размер:	11.1 Кб
ID:	59533  

Последний раз редактировалось Владимир Егорьев, 14.05.2011 в 11:42.
 
Ответ
Вернуться   Форум 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