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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,977

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1699036
 
Непрочитано 05.01.2021, 22:13
#3961
Browning Zed


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


Как можно присвоить свойства полилинии, сразу после ее создания (оба действия в одной команде)? Пробовал такой вариант, но он не рабочий:
Код:
[Выделить все]
 (defun c:test ()
	(command "_PLINE" pause)
	(vla-put-linetypescale (vlax-ename->vla-object (entlast)) 0.5)
)
Browning Zed вне форума  
 
Непрочитано 05.01.2021, 22:50
#3962
Сергей812


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


добавьте princ в конце
Код:
[Выделить все]
 (defun c:test () 
     (command "_PLINE" pause) 
     (vla-put-linetypescale (vlax-ename->vla-object (entlast)) 0.5)
     (princ "Упсс")
 ) 
и увидите, что пытаетесь применить свойства к еще не созданной окончательно полилинии - издержки командных методов. Насколько помню, в свое время это решил на реакторах - отлавливаете начало команды рисования полилинии, если команда была успешно завершена - делаете с ней (полилинией) что надо. Либо эмулируйте рисование полилинии)
Сергей812 вне форума  
 
Непрочитано 05.01.2021, 22:56
#3963
Browning Zed


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
добавьте princ в конце
Код:
[Выделить все]
 (defun c:test () 
     (command "_PLINE" pause) 
     (vla-put-linetypescale (vlax-ename->vla-object (entlast)) 0.5)
     (princ "Упсс")
 ) 
и увидите, что пытаетесь применить свойства к еще не созданной окончательно полилинии - издержки командных методов. Насколько помню, в свое время это решил на реакторах - отлавливаете начало команды рисования полилинии, если команда была успешно завершена - делаете с ней (полилинией) что надо. Либо эмулируйте рисование полилинии)
Спасибо, уже разобрался. Все оказалось проще. После ввода команды, требующей пользовательского ввода, нужно добавить цикл:
Код:
[Выделить все]
 (while (> (getvar 'cmdactive) 0) (command pause))
Тогда работает как нужно.
Browning Zed вне форума  
 
Непрочитано 05.01.2021, 23:22
| 1 #3964
Сергей812


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


тоже вариант, только cmdactive битовый флаг
Код:
[Выделить все]
 (while (= (logand (getvar 'cmdactive) 1) 1) (command pause))
Сергей812 вне форума  
 
Непрочитано 08.01.2021, 16:00
#3965
Browning Zed


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


Господа, подскажите как вставить извлеченный элемент одного списка в другой список.
Код:
[Выделить все]
 (defun c:list ( / L1 L2 )
	(setq L1 '(B C))
	(setq L2 '(A (car L1)(cadr L1) D))
	(princ L2)
)
Команда list вернет
(A (CAR L1) (CADR L1) D)
Что сделать чтобы получить вместо этого:
(A B C D)
Browning Zed вне форума  
 
Непрочитано 08.01.2021, 17:02
1 | #3966
Кулик Алексей aka kpblc
Moderator

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


(setq l2 (list a (car l1) (cadr l1) d))

----- добавлено через 28 сек. -----
Между прочим, команда _.list - штатная команда AutoCAD. Советую выбрать другое название
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.01.2021, 17:40
#3967
Browning Zed


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


Спасибо, Алексей! Не подскажете еще как вставить один список в другой в качестве sublist?
Например, имеем два списка:
'(A B)
'(C D)
что нужно сделать, чтобы получить:
'(A B (C D))
или
'((C D) A B)
Browning Zed вне форума  
 
Непрочитано 08.01.2021, 21:10
1 | #3968
Кулик Алексей aka kpblc
Moderator

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


Советую поэкспериментировать с cons / append. Ну и list туда же.
Хотя зачем получать слабоструктурированный или вообще неструктурированный список - для меня тайна.

----- добавлено через ~4 мин. -----
Код:
[Выделить все]
 (setq a    1
      b    2
      c    3
      d    4
      lst1 (list a b)
      lst2 (list c d)
) ;_ end of setq
(cons lst1 lst2) ; '((1 2) 3 4)
(append lst1 (list lst2)) ; '(1 2 (3 4))
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.01.2021, 20:17
#3969
Сет


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


Подскажите, как в LISP обрабатываются ошибки? Например есть такой код:
Код:
[Выделить все]
 (setq file (open "C:\\test.txt" "r"))
; какие-то действия
(close file)
Если в процессе выполнения кода между открытием и закрытием файла происходит какая-то ошибка - программа аварийно завершается и файл при это остается открытым, никакие другие процессы не могут получить к нему доступ. Как обработать подобную ошибку, чтобы при аварийном завершении программы закрыть файл?
Сет вне форума  
 
Непрочитано 28.01.2021, 20:29
1 | #3970
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
  (setq file (open "C:\\test.txt" "r"))
(vl-catch-all-apply (function (lambda()
; какие-то действия
)))
(close file)
----- добавлено через 24 сек. -----
А вообще говоря, проще сначала прочитать файл, закрыть - и только потом выполнять какие-либо действия с полученными данными.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.01.2021, 22:03
#3971
Сет


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


Кулик Алексей aka kpblc, а где в этой конструкции вписывается инструкция по закрытию файла при ошибке?

----- добавлено через ~32 мин. -----
А, похоже понял vl-catch-all-apply ловит ошибку, программа при этом продолжает работу и доходит до функции close?
Сет вне форума  
 
Непрочитано 29.01.2021, 07:51
1 | #3972
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сет Посмотреть сообщение
А, похоже понял vl-catch-all-apply ловит ошибку, программа при этом продолжает работу и доходит до функции close?
Именно.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.02.2021, 14:17
#3973
Сет


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


Мне здесь однажды написали лисп, который позволял подсчитать общую массу по строкам спецификаций, но я кое-что отредактировал и не пойму пока почему он не работает больше.

Вот как работал лисп. В чертеже есть набор блоков с атрибутами, которые (блоки) в своем имени содержат текст "спецстр" (есть два варианта блоков с именами "спецстр" и "спецстризд") и каждый блок содержит атрибуты "КОЛ" и "МАССА". Активируя лисп я выбирал нужные мне экземпляры блоков (по сути это строки спецификации) и программа автоматически перемножала по каждой строке значения в атрибутах "КОЛ" и "МАССА", выдавая в итоге сумму по всем строкам.

Сейчас я изменил структуру блоков, представляющих собой строки спецификации, но в них по прежнему остались атрибуты "КОЛ" и "МАССА", только теперь они занимают другую относительную позицию в списке атрибутов блока. Если раньше у них были позиции 4 и 5, то теперь 7 и 8. Я смотрю сам лисп и не вижу, чтобы их относительная позиция в перечне атрибутов как-то учитывалась. Как я понимаю лисп находил нужные данные по имени атрибута. Или все ж нет? Вот исходный лисп:

Код:
[Выделить все]
 (defun c:calculate_weight (/ ss res)
 (if (= (type (setq ss (vl-catch-all-apply (function (lambda () (ssget '((2 . "спецстр*") (66 . 1))))))))
        'pickset
        ) ;_ end of =
   (progn (setq
            res (apply (function +)
                       (vl-remove nil
                                  (mapcar (function
                                            (lambda (x)
                                              (if (and (setq x (vlax-ename->vla-object x))
                                                       (setq x (vlax-safearray->list (vlax-variant-value (vla-getattributes x))))
                                                       (setq x (mapcar (function (lambda (a) (cons (vla-get-tagstring a) (vla-get-textstring a)))) x))
                                                       (setq x (apply (function *)
                                                                      (mapcar (function (lambda (a)
                                                                                          (cond ((setq a (cdr (assoc a x))) (atof (vl-string-translate "," "." a)))
                                                                                                (t 0)
                                                                                                ) ;_ end of cond
                                                                                          ) ;_ end of lambda
                                                                                        ) ;_ end of function
                                                                              '("КОЛ" "МАССА")
                                                                              ) ;_ end of mapcar
                                                                      ) ;_ end of apply
                                                             ) ;_ end of setq
                                                       ) ;_ end of and
                                                x
                                                ) ;_ end of if
                                              ) ;_ end of lambda
                                            ) ;_ end of function
                                          ((lambda (/ tab item)
                                             (repeat (setq tab  nil
                                                           item (sslength ss)
                                                           ) ;_ end setq
                                               (setq tab (cons (ssname ss (setq item (1- item))) tab))
                                               ) ;_ end of repeat
                                             ) ;_ end of lambda
                                           )
                                          ) ;_ end of mapcar
                                  ) ;_ end of vl-remove
                       ) ;_ end of apply
            ) ;_ end of setq
          (princ (strcat "Общая масса: " (rtos res 2)))
          (alert (strcat "Общая масса: " (rtos res 2)))
          (princ)
          ) ;_ end of progn
   ) ;_ end of if
 ) ;_ end of defun
Сет вне форума  
 
Непрочитано 06.02.2021, 16:20
#3974
Кулик Алексей aka kpblc
Moderator

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


Блоки случайно не стали динамическими?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.02.2021, 16:40
#3975
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Блоки случайно не стали динамическими?
Нет, в блоках раньше было порядка 20 атрибутов, после переделки их чуть больше стало, кое-каким атрибутам дал новые имена, изменил их порядок, но остались два атрибута "КОЛ" и "МАССА". Результат работы лиспа - сообщение "Общая масса: 0,00".
Сет вне форума  
 
Непрочитано 06.02.2021, 16:49
#3976
Сет


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


Во вложении файл с блоками "СпецСтр2" и "СпецСтрИзд2", а также с двумя экземплярами блока "СпецСтр2" - вот по ним общую массу лисп выдает 0,00.
Вложения
Тип файла: dwg
DWG 2013
спецификация.dwg (113.8 Кб, 5 просмотров)
Сет вне форума  
 
Непрочитано 06.02.2021, 17:39
1 | #3977
kacugu

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


Цитата:
Сообщение от Сет Посмотреть сообщение
но в них по прежнему остались атрибуты "КОЛ" и "МАССА"
Не "КОЛ" и "МАССА", а "6-КОЛ" и "7-МАССА". Если в строке 20 заменить
Код:
[Выделить все]
  '("КОЛ" "МАССА") 
на
Код:
[Выделить все]
 '("6-КОЛ" "7-МАССА")
то лисп работает нормально.
kacugu вне форума  
 
Непрочитано 06.02.2021, 19:03
#3978
Сет


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


Цитата:
Сообщение от kacugu Посмотреть сообщение
Не "КОЛ" и "МАССА", а "6-КОЛ" и "7-МАССА".
Точно! Вот я невнимательный
Сет вне форума  
 
Непрочитано 08.02.2021, 16:42
#3979
rusv


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


Принимайте в свои ряды.
Только познаю азы LISPa

А может разбирали похожий пример.
Нужно выбрать объекты (текст) в чертеже, в тексте найти цифры, а далее выполнить конвертацию этих цифр с округлением. Например, имею текст "Высота 1000м", а хочу результат "Высота 1000м/3381' ". Таких объектов может быть несколько в чертеже с разными словами. Думал сделать чтобы сразу с группой можно было работать, т.е в начале эти объекты "натыкать". Заранее спасибо всем откликнувшимся.
rusv вне форума  
 
Непрочитано 10.02.2021, 00:10
#3980
skkkk


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


rusv, я ничего не понял. Почему 3381? Что значит "конвертацию цифр с округлением"? Как понять это "сразу с группой работать" и " в начале "натыкать"?
Нужно бы файл с примером приложить, где будет видно, что есть и как надо.
skkkk на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Реверс. Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 270 19.07.2020 23:34
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46