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

Вернуться   Форум 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.
Просмотров: 1973674
 
Непрочитано 02.04.2015, 09:11
#2561
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


да я не о том спрашиваю. (strcat "H8=" <Текстовая строка>) есть у меня, тут ситуация хитрая:
напрямую найти отметку на разрезе я не смогу априори, ибо она может иметь любые координаты и любое значение.
Но эта отметка дублируется в таблице. Из таблицы я нахожу значение этой отметки и, уже зная это значение, ищу два одинаковых текста.
Зная координату того текста, что в таблице, его отбрасываю из рассмотрения и редактирую второй - тот что на разрезе.
А ломается всё, только в частном случае, когда на разрезе у отметки обрезаны хвостовые ноли.
з.ы. добавил картинку :
1 - отметка в таблице (по шапке её можно найти)
2 - та же отметка на разрезе. её то и надо править
3 - что должно получится в результате
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 24
Размер:	29.6 Кб
ID:	146898  
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 02.04.2015 в 09:19. Причина: добавил рисунок
Vladimir_Sergeevich вне форума  
 
Непрочитано 02.04.2015, 09:23
#2562
Кулик Алексей aka kpblc
Moderator

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


Преобразовывай в float, а потом в строку через rtos. Не то?

----- добавлено через ~14 мин. -----
Во, пока вспомнил: в "Готовых программах" были решения по преобразованию числа в строку с заданной точностью. Поищи.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 02.04.2015 в 09:38.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.04.2015, 09:49
#2563
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


не то. (ssget "_X" (list (cons 0 "TEXT") (cons 1 val_h8))) ищет по строке из "1". Когда они одинаковы - находит оба и можно обработать.
если бы (rtos 125.50 2 2) выдавал "125,5" то прокатило бы, но он выдает "125,50"
Код:
[Выделить все]
Команда: (rtos (atof "152.20") 2 2)
"152.20"
изначально уже про это говорил - проверено в первую очередь было
А ставить (rtos 125.50 2 1) приведет к тому, что перестанет работать случай равенства изначального. ("1" - 125,34, "2" - 125,34 проходя через rtos получится условие 125,3 /= 125,34)
з.ы. вся загвоздка в нахождении отметки на разрезе, когда на разрезе и в таблице нет полного соответствия.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
в "Готовых программах" были решения по преобразованию числа в строку с заданной точностью. Поищи.
чем плох тот же rtos atof?
порядок поиска не позволяет так сделать. неизвестно заранее какая точность округления должна быть
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 02.04.2015 в 10:10.
Vladimir_Sergeevich вне форума  
 
Непрочитано 02.04.2015, 10:10
#2564
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 433


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
изначально уже про это говорил - проверено в первую очередь было
А ставить (rtos 125.50 2 1) приведет к тому, что перестанет работать случай равенства изначального. ("1" - 125,34, "2" - 125,34 проходя через rtos получится условие 125,3 /= 125,34)
з.ы. вся загвоздка в нахождении отметки на разрезе, когда на разрезе и в таблице нет полного соответствия.
Не особо силен в лиспе, поэтому словами, а не функциями. Думаю, как промежуточное решение подойдет
если (rtos 125.50 2 1) = (rtos (125.50+0.0499999) 2 1) = (rtos (125.50-0.0499999) 2 1), то (rtos 125.50 2 1)
иначе (rtos 125.50 2 2)
RNB вне форума  
 
Непрочитано 02.04.2015, 10:16
#2565
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


RNB, да как же объяснить что бы все уже поняли?
в #2556 есть рисунок.
"1" - это то что я могу найти это может быть как 125,30 так 125,32
"2" - это то что надо найти и изменить. он, соответственно, принимает значения 125,3 или 125,32

Аллилуйа!
Код:
[Выделить все]
Команда: (vl-princ-to-string 125.50)
"125.5"
В общем, рабочий вариант получился таким:
Код:
[Выделить все]
 (setq ent_sad (ssname (ssget "_X" (list (cons 0 "TEXT") (cons 1 "8,"))) 0)
	pt_ent (cdr (assoc 10 (entget ent_sad)));; ename и точка подписи
	ent_sad (ssname  (ssget "_F" (list 
		(mapcar '- pt_ent '(8 10 0))  
		(mapcar '- pt_ent '(-8 10 0))
		)) 0)
	val_h8 (cdr (assoc 1 (entget ent_sad))) ;;значение высоты
	pt_ent (cdr (assoc 10 (entget ent_sad)));;точка высоты в таблице
	ent_sad (ssget "_X" (list (cons 0 "TEXT") (cons 1 (vl-princ-to-string (atof val_h8)))));;здесь набор, вероятно из двух элементов
	);;setq
(cond
	( (= (sslength ent_sad) 1)
		(setq ent_sad (ssname ent_sad 0))
	);;c1 only one obj
	((= (sslength ent_sad) 2)
		(if 	(= (cdr (assoc 10 (entget (ssname ent_sad 0)))) pt_ent)
			(setq ent_sad (ssname ent_sad 0))
			(setq ent_sad (ssname ent_sad 1))
		)
	)	
	(t (princ "\nОтметка Н8 не найдена"))
)
(sad_rename ent_sad (strcat "H8=" val_h8))
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 02.04.2015 в 10:39. Причина: добавил результат
Vladimir_Sergeevich вне форума  
 
Непрочитано 02.04.2015, 10:23
#2566
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 433


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
RNB, да как же объяснить что бы все уже поняли?
в #2556 есть рисунок.
"1" - это то что я могу найти это может быть как 125,30 так 125,32
"2" - это то что надо найти и изменить. он, соответственно, принимает значения 125,3 или 125,32
Так "если (rtos 125.50 2 1) = (rtos (125.50+0.0499999) 2 1) = (rtos (125.50-0.0499999) 2 1)" и проверяет на 0 во втором знаке после запятой. Если оно выполняется, то ищем (rtos 125.50 2 1), если нет, то ищем (rtos 125.50 2 2)
RNB вне форума  
 
Непрочитано 02.04.2015, 10:24
#2567
Кулик Алексей aka kpblc
Moderator

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


Ну блин, сказано что искать, сказано - где. И все равно...
http://forum.dwg.ru/showthread.php?t=15429
http://forum.dwg.ru/showthread.php?t=15661
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.04.2015, 10:25
#2568
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 433


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
Аллилуйа!
Ну вот! Я знал, что должно быть простое решение. Но пока так не умею, поэтому приходится всё делать обходными путями
RNB вне форума  
 
Непрочитано 02.04.2015, 10:58
#2569
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
если бы (rtos 125.50 2 2) выдавал "125,5" то прокатило бы, но он выдает "125,50"
Может, я не совсем правильно и, главное, вовремя понял суть задачи, но на всякий случай добавлю: чтобы (rtos 125.50 2 2) выдал "125.5" нужно DIMZIN установить в 8.
skkkk вне форума  
 
Непрочитано 02.04.2015, 11:24
#2570
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
DIMZIN установить в 8.
ну у меня стоит <1> Интересная конечно переменная, раньше с такой не сталкивался
ну и, в конкретном случае, использование vl-princ-to-string выглядит лучше, чем изменение системной переменной (это же её еще надо запомнить и вернуть обратно)
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну блин, сказано что искать, сказано - где. И все равно...
а эту функцию я оттуда и помню, правда давненько я ту ветку изучал, сразу и не припомнил
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 02.04.2015, 15:27
#2571
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
ну у меня стоит <1> Интересная конечно переменная, раньше с такой не сталкивался
А кто ж ее тогда поменял? По умолчанию она равна 8. Видимо, какой-то лисп не вернул ее обратно. Она, кстати, упоминается у Полещука в описании функции rtos.
skkkk вне форума  
 
Непрочитано 03.04.2015, 10:35
#2572
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
По умолчанию она равна 8.
судя по всему она хранится в чертеже. у меня в шаблонах она равна 1. А в dxf, которые экспортируются из других прог она у меня 0 по умолчанию.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 07.04.2015, 12:06
#2573
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


День добрый.
Для подписи закладных на чертеже использую код Lee Mac, который когда-то нашёл на theswamp. Лисп берёт данные из блока и чертит мультивыноску с этими значениями. Сейчас решил "модифицировать" лисп, чтобы текст, прописываемый в мультивыноске зависел от одного из атрибутов (в коде это at5). Но условие почему-то не срабатывает. При любом значении at5 выполняется второе выражение условия.
Подскажите, что делаю не так.
Код:
[Выделить все]
 
    (defun c:tr2ml2 ( / at1 at2 at3 at4 at5 ent enx pnt0 lst mld pnt )
       (while
           (progn
               (setvar 'errno 0)
               (setq ent (car (entsel "\nВыберите блок <Выход>: ")))
               (cond
                   (   (= 7 (getvar 'errno))
                       (princ "\nМимо, попробуйте снова.")
                   )
                   (   (null ent)
                       nil
                   )
                   (   (/= "INSERT" (cdr (assoc 0 (setq enx (entget ent)))))
                       (princ "\nОбъект не является блоком.")
                   )
                   (   (/= 1 (cdr (assoc 66 enx)))
                       (princ "\nБлок не содержит атрибутов.")
                   )
                   (   (not
                           (and
                               (setq lst (vlax-invoke (vlax-ename->vla-object ent) 'getattributes)
                                     lst (mapcar '(lambda ( x ) (cons (strcase (vla-get-tagstring x)) x)) lst)
                               )
                               (setq at1 (cdr (assoc "НОМЕР_ПОЗИЦИИ" lst)))
							   (setq at2 (cdr (assoc "ТОЛЩИНА" lst)))
							   (setq at3 (cdr (assoc "КОД" lst)))
							   (setq at4 (cdr (assoc "ДИАМЕТР" lst)))
							   (setq at5 (cdr (assoc "МАРКА" lst))) 
                           )
                       )
				   (princ "\nБлок не содержит атрибут \"НОМЕР_ПОЗИЦИИ\".")
                   )
                   (   (setq pnt0 (getpoint  "\nВыберите начало мультивыноски >> \n")
                             pnt (getpoint (trans pnt0 ent 1) "\nВыберите конец мультивыноски <Выход>: ")
                       )
                       (setq mld
                           (vlax-invoke
                               (vlax-get-property (LM:acdoc)
                                   (if (= 1 (getvar 'cvport))
                                       'paperspace
                                       'modelspace
                                   )
                               )
                               'addmleader
                               (append (trans pnt0 ent 0) (trans pnt 1 0))
                               0
                           )
                       )
						(if 
							(= at5 0 )
								(vla-put-textstring mld
									(strcat 
											   "%<\\AcObjProp Object(%<\\_ObjId "
											   (LM:ObjectID at1)
											   ">%).TextString>%"
											   "\\P" 
											   "%%c"
											   "%<\\AcObjProp Object(%<\\_ObjId "
											   (LM:ObjectID at4)
											   ">%).TextString>%"
											   "х"
											   "%<\\AcObjProp Object(%<\\_ObjId "
											   (LM:ObjectID at2)
											   ">%).TextString>%"
											   "\\P"
											   "("
											   "%<\\AcObjProp Object(%<\\_ObjId "
											   (LM:ObjectID at3)
											   ">%).TextString>%"
											   ")"
									)
								)	
								(vla-put-textstring mld
									(strcat 
											   "%<\\AcObjProp Object(%<\\_ObjId "
											   (LM:ObjectID at1)
											   ">%).TextString>%"
											   "\\P" 
											   "%<\\AcObjProp Object(%<\\_ObjId "
											   (LM:ObjectID at5)
											   ">%).TextString>%"
											   "\\P"
											   "("
											   "%<\\AcObjProp Object(%<\\_ObjId "
											   (LM:ObjectID at3)
											   ">%).TextString>%"
											   ")"
									)						
								)
						)	
						(vla-put-textrotation mld 0.0)
                       (if (<= (car pnt) (car (trans pnt0 ent 1)))
                           (progn
                               (vla-setdoglegdirection mld 0 (vlax-3D-point (trans '(-1.0 0.0) 1 0 t)))
                               (vlax-invoke mld 'setleaderlinevertices 0 (append (trans pnt0 ent 0) (trans pnt 1 0)))
                           )
                           (vla-setdoglegdirection mld 0 (vlax-3D-point (trans '(1.0 0.0) 1 0 t)))
                       )
                       (vla-regen (LM:acdoc) acactiveviewport)
                       t
                   )
               )
           )
       )
       (princ)
    )
     
    ;; ObjectID  -  Lee Mac
    ;; Returns a string containing the ObjectID of a supplied VLA-Object
    ;; Compatible with 32-bit & 64-bit systems
     
    (defun LM:ObjectID ( obj )
       (eval
           (list 'defun 'LM:ObjectID '( obj )
               (if
                   (and
                       (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
                       (vlax-method-applicable-p (vla-get-utility (LM:acdoc)) 'getobjectidstring)
                   )
                   (list 'vla-getobjectidstring (vla-get-utility (LM:acdoc)) 'obj ':vlax-false)
                  '(itoa (vla-get-objectid obj))
               )
           )
       )
       (LM:ObjectID obj)
    )
     
    ;; Active Document  -  Lee Mac
    ;; Returns the VLA Active Document Object
     
    (defun LM:acdoc nil
       (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
       (LM:acdoc)
    )
     
    (vl-load-com) (princ)
kacugu вне форума  
 
Непрочитано 07.04.2015, 12:15
1 | #2574
Кулик Алексей aka kpblc
Moderator

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


Перед (if (= at5 0) поставь точку останова и проверь,чему у тебя равны соответствующие переменные
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.04.2015, 16:42
#2575
gomer

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Перед (if (= at5 0) поставь точку останова и проверь,чему у тебя равны соответствующие переменные
at5, я так подозреваю это строка, а 0 - число, вот и не срабатывает
gomer вне форума  
 
Непрочитано 07.04.2015, 22:18
#2576
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


gomer, не совсем так. at5 возвращала не значение атрибута, а #VLA-Object что-то там.
kacugu вне форума  
 
Непрочитано 08.04.2015, 00:11
#2577
gomer

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


Цитата:
Сообщение от kacugu Посмотреть сообщение
at5 возвращала не значение атрибута, а #VLA-Object что-то там.
а, ну да, недоскроллил
gomer вне форума  
 
Непрочитано 09.04.2015, 10:07
#2578
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Хочу критики и советов.
Пишу на досуге большую страшную прогу, но есть сомнения в рациональности подхода.
Задача примерно такая: получаю 3 точки и по ним отрисовываю кучу всего. При этом необходимо просчитывать много других точек (пояснения в коде):
Код:
[Выделить все]
 ;;Начальное задание списка вне условий (универсальное)
(setq pt_lst (list ;;ассоциативный список координат точек
	(cons 0 p-vline) ;; нижняя выносная
	(cons 1 p-ntr)   ;; начало трубы
	(cons 2 p-ktr)   ;; конец трубы
	(cons 10 (polar p-vline (/ pi 2) 5))  ;;второй уровень размеров
	(cons 20 (polar p-vline (/ pi 2) 10)) ;;третий
	(cons 30 (polar p-vline (/ pi 2) 15)) ;;четвертый
));;ассоциативный список координат точек

;;потом в теле ветвления я этот список расширяю (тут частный случай, где то точек больше, где то меньше, размеры другие и прочее)
(setq pt_lst (sad-add-or-subst pt_lst 2 (polar (cdr (assoc 2 pt_lst)) a-dim -0.1))) ;;тут a-dim угол наклона трубы в радианах
(setq pt_lst (sad-add-or-subst pt_lst 3 (polar (cdr (assoc 1 pt_lst)) a-dim d-tr)))
(setq pt_lst (sad-add-or-subst pt_lst 4 (polar (cdr (assoc 2 pt_lst)) (+ a-dim pi) d-tr)))
(setq pt_lst (sad-add-or-subst pt_lst 5 (polar (cdr (assoc 1 pt_lst)) a-dim  (/ (distance p-ntr p-ktr) 2))))
(setq pt_lst (sad-add-or-subst pt_lst 7 (polar (cdr (assoc 1 pt_lst)) a-dim (+ d-tr 1.5))))
(setq pt_lst (sad-add-or-subst pt_lst 8 (polar (cdr (assoc 2 pt_lst)) (+ a-dim pi) (+ d-tr 1.5))))
(setq pt_lst (sad-add-or-subst pt_lst 50 (polar (cdr (assoc 3 pt_lst)) (+ a-dim (* pi 0.5)) d-tr))) 	;;верх звена слева
(setq pt_lst (sad-add-or-subst pt_lst 51 (polar (cdr (assoc 4 pt_lst)) (+ a-dim (* pi 0.5)) d-tr))) 	;;верх звена слева
(setq pt_lst (sad-add-or-subst pt_lst 60 (polar (cdr (assoc 50 pt_lst)) (+ a-dim (* pi 0.5)) 3.5))) 	;;верх оголовка справа
(setq pt_lst (sad-add-or-subst pt_lst 61 (polar (cdr (assoc 51 pt_lst)) (+ a-dim (* pi 0.5)) 3.5))) 	;;верх оголовка справа
(setq pt_lst (sad-add-or-subst pt_lst 101 (polar (cdr (assoc 1 pt_lst)) a-dim d-tr)))		;;начальная первой подушки
(setq pt_lst (sad-add-or-subst pt_lst 105 (polar (cdr (assoc 2 pt_lst)) (+ a-dim pi) d-tr)))	;;начальная второй подушки
(setq pt_lst (sad-add-or-subst pt_lst 102 (polar (cdr (assoc 101 pt_lst)) (+ a-dim (* pi 1.5)) (* h_freez 10))))
(setq pt_lst (sad-add-or-subst pt_lst 106 (polar (cdr (assoc 105 pt_lst)) (+ a-dim (* pi 1.5)) (* h_freez 10))))
(setq pt_lst (sad-add-or-subst pt_lst 103 (polar (cdr (assoc 102 pt_lst)) a-dim 5)))
(setq pt_lst (sad-add-or-subst pt_lst 107 (polar (cdr (assoc 106 pt_lst)) a-dim -5)))
(setq pt_lst (sad-add-or-subst pt_lst 104 (polar (cdr (assoc 103 pt_lst)) (+ 0.927295 a-dim) 22.2145)))
(setq pt_lst (sad-add-or-subst pt_lst 108 (polar (cdr (assoc 107 pt_lst)) (+ 2.2143 a-dim) 22.2145)))
(setq pt_lst (sad-add-or-subst pt_lst 109 (polar (cdr (assoc 101 pt_lst)) (+ a-dim (* pi 1.5)) 12.2)))
(setq pt_lst (sad-add-or-subst pt_lst 110 (polar (cdr (assoc 101 pt_lst)) (+ a-dim (* pi 1.5)) 13.2)))
(setq pt_lst (sad-add-or-subst pt_lst 111 (polar (cdr (assoc 110 pt_lst)) a-dim 3.0)))
(setq pt_lst (sad-add-or-subst pt_lst 112 (polar (cdr (assoc 109 pt_lst)) a-dim 3.0)))
(setq pt_lst (sad-add-or-subst pt_lst 113 (polar (cdr (assoc 105 pt_lst)) (+ a-dim (* pi 1.5)) 12.2)))
(setq pt_lst (sad-add-or-subst pt_lst 114 (polar (cdr (assoc 105 pt_lst)) (+ a-dim (* pi 1.5)) 13.2)))
(setq pt_lst (sad-add-or-subst pt_lst 115 (polar (cdr (assoc 114 pt_lst)) a-dim -3.0)))
(setq pt_lst (sad-add-or-subst pt_lst 116 (polar (cdr (assoc 113 pt_lst)) a-dim -3.0)))

;;используемая функция добавления точечных пар
(defun sad-add-or-subst (lst key value)
  (if (assoc key lst)
    (subst (cons key value)
           (assoc key lst)
           lst
           ) ;_ end of subst
    (append lst (list (cons key value)) )
    ) ;_ end of if
  ) ;_ end of defun
С одной стороны, смотрится жутко громоздко, с другой - это лучшее до чего я пока додумался.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 09.04.2015, 10:17
#2579
Кулик Алексей aka kpblc
Moderator

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


Я бы загнал все в цикл и внутри него уже делал. ИМХО получится проще, быстрее и короче.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.04.2015, 11:16
#2580
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


не совсем понимаю как это сделать. с одной точки максимум цепочка до 4 значений идет. разве что каким то боком прописать:
(foreach 'item (<список из rez sourse angle dist>) (setq pt_lst (sad-add-or-subst pt_lst rez (polar (cdr (assoc sourse pt_lst)) angle dist))) ;;тут rez sourse - номера кодов списка причем не явно , а cdr cadr и тд из item
Ты об этом?
Код:
[Выделить все]
 (foreach item (list ;;<список из rez sourse angle dist>
	(list 3 1 a-dim 14.7)
	(list 4 2 (+ a-dim pi) 14.7)
	(list 5 1 a-dim  (/ (distance p-ntr p-ktr) 2))
	(list 6 3 a-dim 27)
	(list 7 3 a-dim 3.6)
	(list 8 4 (+ a-dim pi) 3.6)
	(list 50 3 (+ a-dim (* pi 0.5)) d-tr)
	(list 51 4 (+ a-dim (* pi 0.5)) d-tr)
	(list 60 50 (+ a-dim (* pi 0.5)) 5.0)
	(list 61 51 (+ a-dim (* pi 0.5)) 5.0)
	
	) ;;<список из rez sourse angle dist>
	(setq pt_lst (sad-add-or-subst pt_lst (car item) (polar (cdr (assoc (cadr item) pt_lst)) (caddr item) (cadddr item))))
);;foreach
В этом варианте коды 100-116 не нужны, в принципе смотрится компактней и все так же работает на ура... на 4 варианта третий способ реализации
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 09.04.2015 в 13:59. Причина: начал описывать очередной вариант
Vladimir_Sergeevich вне форума  
Ответ
Вернуться   Форум 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