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

Вернуться   Форум 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.
Просмотров: 2049564
 
Непрочитано 17.01.2009, 17:04
#561
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Попробуй так:
Код:
[Выделить все]
(while 
  (if
    (not
      (and	
        ( > (angle p1 p3) (+ pi (angle p1 p2)))
        ( < (angle p1 p3) (+ pi pi (angle p1 p2)))
      )
    )
    (progn
      (princ "\n Неверная точка. Повторите ввод")
      (setq p3 (getpoint "\nТретья (Опции/Помощь):"))
    )
  )
)
P.S.
Не забывай про initget перед getpoint.
Donhuan вне форума  
 
Непрочитано 19.01.2009, 13:29
#562
wetr

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


Donhuan, все так! Спасибо.
Но вот условие я задал изначально не совсем верно. Пытаясь скорректировать условие, нагородил забор. Вроде должно работать, а не работает.
В эту конструкцию
Код:
[Выделить все]
(while 
  (if
    (not
      (and	
        ( > (angle p1 p3) ( angle p1 p2))
        ( < (angle p1 p3) (+ pi (angle p1 p2)))
      )
    )
    (progn
      (princ "\n Неверная точка. Повторите ввод")
      (setq p3 (getpoint "\nТретья (Опции/Помощь):"))
    )
  )
)
Я добавил вместо
Код:
[Выделить все]
( > (angle p1 p3) ( angle p1 p2))
такой кусок
Код:
[Выделить все]
( >
	  (if
	    (and
	      (>  (angle p1 p2) (+ pi pi))
	      (< (angle p1 p3) (- (angle p1 p2) pi pi))
	    )
	    (+ (angle p1 p3) (* 4.0 pi))
	    (angle p1 p3)
	  )
	  (angle p1 p2))
Т.е. если угол 1_2 например 315, то угол 1_3 может меняться в пределах от 315 до 45 (против часовой). Но если угол 1_3 30 градусов, например, то предыдущий вариант лиспа его не пропустит. Для этого я и нагородил... Но... он меня не понимает
Получилось вот что
Код:
[Выделить все]
(while ; цикл, пока не введешь правильную координату
  (if
    (not
      (and	
        ( >
	  (if
	    (and
	      (>  (angle p1 p2) (+ pi pi))
	      (< (angle p1 p3) (- (angle p1 p2) pi pi))
	    )
	    (+ (angle p1 p3) (* 4.0 pi))
	    (angle p1 p3)
	  )
	  (angle p1 p2))
        ( < (angle p1 p3) (+ pi (angle p1 p2)))
      )
    )
    (progn
      (princ "\n Неверная точка. Повторите ввод")
      (setq p3 (getpoint "\nТретья <Выход>:"))
    )
  )
);_while
З.Ы. До initget надеюсь тоже дойдет
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)

Последний раз редактировалось wetr, 19.01.2009 в 13:34.
wetr вне форума  
 
Непрочитано 19.01.2009, 16:37
#563
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 428


(> (angle p1 p2) (+ pi pi)) - всегда nil
ытя вне форума  
 
Непрочитано 19.01.2009, 17:34
#564
VVA

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


wetr, Для нормализации угла ( угол в диапазоне 0 - 360 градусов) можешь использовать эту ф-цию
Код:
[Выделить все]
(defun NormalAngle (a)
;-------------------------------------------
;; Argument: angle in radians, any number including negative.
;; Returns: normalized angle in radians between zero and (* pi 2)
  (if (numberp a)
    (angtof (angtos a 0 14) 0))
)
Пример
Код:
[Выделить все]
(normalangle (* 4 pi)) ;_ Вернет 0,0
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.01.2009, 18:05
#565
kazax1


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


Red Nova, это или дано, или не дано. Плохового ни в том, ни в другом нет. Могу посоветовать просмотреть : Н. Полещук. VisualLISP и секреты адаптации AutoCAD. - СПб. Очень доходчиво выложены основные принципы проектирования в автолиспе.
kazax1 вне форума  
 
Непрочитано 20.01.2009, 12:44
#566
wetr

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


Спасибо всем за помощь!
Проблема решилась так
Код:
[Выделить все]
(setq 	p1 (getpoint "\nПервая точка <Выход>: ")
	        p2 (getpoint p1 " \nВторая <Выход>: ")
		p3 (getpoint "\nТретья <Выход>: ")
                flag T)
(while flag
   (setq ang13 (angle p1 p3)  ang12 (angle p1 p2))
   (setq beta (- ang13 ang12))
   (if (and (< beta 0) (< ang13 pi) (> ang12 pi)) (setq beta (+ beta pi pi)))
   (if 
    (not (and (> beta 0) (< beta pi)))
     (progn
      (princ "\nНеверная точка. Повторите ввод. \nТочки 1 2 3 должны задаваться против часовой стрелки!")
      (setq p3 (getpoint "\nТретья <Выход>:"))
     );progn
     (setq flag nil)
   );if
);while
благодаря VetalBY
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 27.01.2009, 15:37
#567
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Надо получить дробную часть от числа и преобразовать её в целое число. Причём у дробной части надо взять только 1-е 4 цифры (т.е. просто усечь, а не округлить).
Вроде как надо так.
Код:
[Выделить все]
(defun test (arg)
  (fix (* (- arg (fix arg)) 10000))
)
Но в результате получается не совсем то:
Цитата:
_$ (test 567.1234)
1233
_$ (test 567.12340)
1233
_$ (test 567.12341)
1234
_$ (test 567.12349)
1234
В данном примере нужен однозначный ответ 1234.
Makswell вне форума  
 
Непрочитано 27.01.2009, 16:30
#568
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Код:
[Выделить все]
(defun test (arg)
  (fix (distof (rtos (* (- arg (fix arg)) 10000))))
)

Последний раз редактировалось Donhuan, 27.01.2009 в 16:37.
Donhuan вне форума  
 
Непрочитано 27.01.2009, 17:13
#569
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Donhuan, так то оно так, но меня мучает вопрос, почему мой предыдущий код работает не корректно? Вроде там всё правильно. Глюк?
Makswell вне форума  
 
Непрочитано 27.01.2009, 18:55
#570
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Могу ответить только дежурной фразой: такова особеность представлеия real в lisp.
Пример:
Код:
[Выделить все]
(defun f (x y /)
  (if (/= x y)
    (progn
      (princ (strcat "\n" (rtos (- 5.34 5) 2 x)))
      (f (1+ x) y)
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun

;(f 0 30)
выдает
Код:
[Выделить все]
0
0.3
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.34
0.3399999999999999
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
0.3399999999999998
Из моей практики: использовал не мной написанную функцию вычисления арксинуса:
Код:
[Выделить все]
((defun arcsin (x)
  (* 2.0
     (atan
       (/ x
	  (+ 1
	     (sqrt
	       (- 1
		  (* x x)
	       ) ;_ end of -
	     ) ;_ end of sqrt
	  ) ;_ end of +
       ) ;_ end of /
     ) ;_ end of atan
  ) ;_ end of *
)
, которая прекрасно выполняла свою задачу, но в одной из программ где происходило многократное ее использование, стала возникать ошибка. Оказалось, что выражение
Код:
, где x-синус, который не может быть больше единицы, иногда возвращало ничтожно малое, но отрицательное значение и функция (sqrt) его не восприимала. Пришлось написать в виде:
Код:
[Выделить все]
(abs (-1 (* x x)))
P.S. Может кто из проффесиональных программистов пояснит в чем дело.

В догонку: http://www.caduser.ru/cgi-bin/f1/board.cgi?t=21661WW

Последний раз редактировалось Donhuan, 27.01.2009 в 19:19.
Donhuan вне форума  
 
Непрочитано 28.01.2009, 08:13
#571
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Donhuan, спасибо за разъяснения. Значит всё таки глюк.
Makswell вне форума  
 
Непрочитано 31.01.2009, 17:19
#572
Eximius

аспирант
 
Регистрация: 17.12.2008
Волгоградская область
Сообщений: 49
Отправить сообщение для Eximius с помощью Skype™


Раз уж тут помогают, то я тоже хочу задать несколько вопросов, т.к. тоже считаю себя чайником.
Вопросы:
1)Что значит "тихий выход". Какая разница между тем написать функцию (princ) в конце или нет?
2)Как в лиспе нарисовать, например, параболу таким образом, чтоб она состояла не из отрезков линий а из целой линии.
Код:
[Выделить все]
(defun parab (/ x y shag j)
  (setq shag 0.1)
  (setq x -20)
  (setq massiv '())
  (while (<= x 20)
    (setq y (* x x))
    (setq massiv (cons (list x y) massiv))
    (setq x (+ x shag))
  );while
  (setq j 1)  
  (while (< j (1- (length massiv)))
    (command "._line" (nth (1- j) massiv) (nth j massiv) "")
    (setq j (1+ j))
  );while
);defun
Здесь massiv - список с координатами параболы, но как начертить параболу сплошной? Из одной полилинии.
Надеюсь вопрос ясен.

Последний раз редактировалось Eximius, 31.01.2009 в 17:26.
Eximius вне форума  
 
Непрочитано 31.01.2009, 17:58
#573
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


1. Все функции лиспа возвращают какое-либо значение, при выходе из функции в ком. строку возвращается последнее вычисленое значение ("мусор"). Функция (princ) не возвращает ничего, поэтому если ее вставить последней в тело функции, то в ком. строке ничего не появится.
2.
Код:
[Выделить все]
(defun parab (/ x y shag massiv old)
  (setq	shag 1
	x    -20
	old  (getvar "OSMODE")
  ) ;_ end of setq
  (setvar "OSMODE" 0)
  (while (<= x 20)
    (setq y	 (* x x)
	  massiv (cons (list x y) massiv)
	  x	 (+ x shag)
    ) ;_ end of setq
  ) ;_ end of while
  (command "._pline")
  (mapcar 'command massiv)
  (command "")
  (setvar "OSMODE" old)
) ;_ end of defun

Последний раз редактировалось Donhuan, 31.01.2009 в 21:20.
Donhuan вне форума  
 
Непрочитано 31.01.2009, 20:33
#574
Eximius

аспирант
 
Регистрация: 17.12.2008
Волгоградская область
Сообщений: 49
Отправить сообщение для Eximius с помощью Skype™


Спасибо, Donhuan, разобрался.
Eximius вне форума  
 
Непрочитано 02.02.2009, 18:01
#575
acyxou


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


Подскажите, пожалуйста, как мне провернуть следующее.
Составляю небольшую прогу для экспорта/импорта профилей .arg. Вот кусок кода:
Код:
[Выделить все]
(defun C:ExportProfile (/ username currentprofile server path fullpath)
(setq username (getvar "loginname")) ;извлечение имени пользователя чтоб назвать экспортируемый файл его именем 
(setq currentprofile (getvar "cprofile")) ;извлечение названия текущего профиля
(setq server (strcat "\\\\Server\\Proekts\\Autocad_Resources"))
(setq path (strcat "\\Profiles\\cadman.arg"))
(setq fullpath (strcat server path))
  ((lambda (currentprofile fullpath)(vla-exportprofile (vla-get-profiles (vla-get-preferences (vlax-get-acad-object))
       ) currentprofile fullpath)) currentprofile fullPath)
       )
Все классно работает, НО! Мне нужно чтоб профайл экспортировался с названием логина пользователя. А в моем коде имя жестко регламентировано. Я понимаю что нужно ввести еще одну переменную которая складывала бы текстовые строки переменной loginname и расширения ".arg". Как это сделать у вас и спрашиваю....

Всем спасибо! Сам родил
Код:
[Выделить все]
(defun C:ExportProfile (/ username currentprofile server path profilename fullpath)
;;;(setq username (getvar "loginname")) ;извлечение имени пользователя чтоб назвать экспортируемый файл его именем
(setq currentprofile (getvar "cprofile")) ;извлечение названия текущего профиля
(setq server (strcat "\\\\Server\\Proekts\\Autocad_Resources"))
(setq path (strcat "\\Profiles\\"))
(setq profilename (strcat (getvar "loginname") ".arg"))
(setq fullpath (strcat server path profile))
  ((lambda (currentprofile fullpath)(vla-exportprofile (vla-get-profiles (vla-get-preferences (vlax-get-acad-object))
       ) currentprofile fullpath)) currentprofile fullPath)
       )
По-крестьянски, но зато работает
__________________
Users are not stupid, they are busy.

Последний раз редактировалось acyxou, 02.02.2009 в 18:48.
acyxou вне форума  
 
Автор темы   Непрочитано 24.02.2009, 23:23
#576
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Хочу кое что записать при помощи лиспа в таблицы но понятия не имею о том как с ними работать. Посоветуйте пожалуйста самые основные функции.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 24.02.2009, 23:31
#577
Кулик Алексей aka kpblc
Moderator

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


Red Nova, http://arcada.com.ua/forum/viewtopic.php?t=1095
http://arcada.com.ua/forum/viewtopic.php?t=945
http://arcada.com.ua/forum/viewtopic.php?t=698
http://arcada.com.ua/forum/viewtopic.php?t=440
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.02.2009, 00:15
#578
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Спасибо.
А как создать таблицу c определенным количеством колонок и строк и записать в определенные ячейки что либо?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.02.2009, 00:22
#579
Кулик Алексей aka kpblc
Moderator

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


Да так же, в общем-то Сначала добавляешь таблицу, задавая ей количество строк и столбцов, потом через vla-settext назначаешь указанной ячейке текст. Вроде ничего особо сложного...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2009, 06:45
#580
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Вроде ничего особо сложного...
Вроде. Объектная модель достаточно простая.

Но масса нюансов, связанных с оформлением - точные размеры, вес линий, объединение ячеек шапки. Например, vla-settext может испортить оформление ячейки. И многое надо самостоятельно изобретать - где и как хранить описание таблицы, откуда брать тексты и прочее.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум 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