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

Вернуться   Форум 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.
Просмотров: 2049631
 
Непрочитано 08.01.2015, 02:58
#2381
jackUAROBEY

Проектировщик ВК
 
Регистрация: 18.09.2014
Анапа
Сообщений: 58


Добрый день.
Помогите. Как сделать так чтоб при досрочном выходе из программки системные переменные возвращали свое первоначальное значение.
Код:
[Выделить все]
 (progn
  (princ " \nНаберите в командной строке:")
  (princ "\nтру - начинает строить отрезок")
  (princ "\nмир - мировая система координат")
  );progn
(defun C:тру ( /  dim ugol)
  (setq snn (getvar "CELWEIGHT"))  
  (setq snp (getvar "CELTYPE"))
  (setq snpl (getvar "plinewid"))
  (setvar "CELTYPE" "CONTINUOUS")
  (setvar "CELWEIGHT" 30)
  (setvar "plinewid" 0)
  (initget 128)
  (Setq qwew (getreal "Перепад"))
  (initget 128)
  ;(Setq dim (getreal "Диаметр"))
  (Setq ugol (* (atan (/ qwew 200.0)) 57.29747))
  (Command "_.UCS" "z" ugol "")
  (command "ORTHOMODE" 1)
  (COMMAND "_.Line" pause pause "")
  (Command "_.UCS" "" )   
  (command "_.TRIM" "" pause "" )
  (command "_.Copy" "Последний" "" "@" )
  (setvar "CELWEIGHT" snn)
  (setvar "CELTYPE" snp)
  (setvar "plinewid" snpl)
  )
(defun C:мир ( / )
  (Command "_.UCS" "" )
  )
jackUAROBEY вне форума  
 
Непрочитано 08.01.2015, 04:14
#2382
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Вариант 1: назначить функции функции от 1-го аргумента (это будет описание ошибки в виде строки) имя *error* - где произвести необходимые манипуляции по восстановлению.
Код:
[Выделить все]
 ((lambda (*error*) (/ 5 0)) (lambda (err) (alert err)))
Вариант 2: см. (vl-catch-all-apply ...)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 08.01.2015, 10:17
#2383
skkkk


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


voron83, написать хочется непременно, даже если есть уже готовые решения? Просто писать-то лучше то, чего еще нет. А так - поиск по форуму по словам "сумма текстов" и там в коде можно поменять плюс на минус. Таких решений уже полно.
skkkk вне форума  
 
Непрочитано 08.01.2015, 11:02
#2384
voron83

Геодезист
 
Регистрация: 09.02.2012
Сергиев Посад
Сообщений: 6


Цитата:
Сообщение от skkkk Посмотреть сообщение
voron83, написать хочется непременно, даже если есть уже готовые решения? Просто писать-то лучше то, чего еще нет. А так - поиск по форуму по словам "сумма текстов" и там в коде можно поменять плюс на минус. Таких решений уже полно.
Написать хочется ради изучения лиспа. Мне не важно что есть готовое решение, хотя в них я иногда подсматриваю . Хочется творить самому. Создавать то что нужно мне. Ну и разбираться в уже готовых изменяя их для себя.
Про решение моей задачи есть тема http://forum.dwg.ru/showthread.php?t...EA%F1%F2%EE%E2. Взяв за основу буду разбираться и доводить ее для своих целей.
voron83 вне форума  
 
Непрочитано 08.01.2015, 23:41
#2385
Кулик Алексей aka kpblc
Moderator

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


http://autolisp.ru/2009/09/13/error-catch/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2015, 13:28 новая функция COMMAND-S.
#2386
trushev


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


В 2015 версии появилась новая функция COMMAND-S.
Ее надо использовать вместо VL-CMDF и COMMAND,
если функция вызывается с заранее заданными аргументами
и не подразумевается никаких действий пользователя во время ее вызова.
Синтаксис функции command-s:
(command-s [cmdname [arguments ...]]).
Синтаксис функции command:
(command [cmdname [arguments ...]] ... [cmdname [arguments ...]]).
При адаптации древних Lisp'ов при тупой замене command на command-s выполняется только первая
команда остальные команды игнорируются с продолжением работы без прерывания и сообщения об ошибке.
Более детально лезть в код лень. Что посоветуете?

P.S. В 2015 с command в работе лиспа нареканий не обнаружил.
trushev вне форума  
 
Непрочитано 12.01.2015, 13:43
#2387
skkkk


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


Цитата:
Сообщение от trushev Посмотреть сообщение
Что посоветуете?
Боюсь, что кроме как бороться с ленью тут ничего не посоветуешь... На мой взгляд, самый изящный вариант выхода описан здесь, но все коды придется доработать.
Цитата:
Сообщение от trushev Посмотреть сообщение
P.S. В 2015 с command в работе лиспа нареканий не обнаружил.
В смысле? Вроде как command в 2015-м не работает. Сам проверить не могу - нет 15-го, это я по сообщениям форума сужу.
Были также предложения просто заменить во всех лиспах command на vl-cmdf, но поведение их порой отличается, и на результатах работы программы сказаться может в худшую сторону. Довольно редко, но я с этим сталкивался.

Последний раз редактировалось skkkk, 12.01.2015 в 13:49.
skkkk вне форума  
 
Непрочитано 12.01.2015, 14:03 2382
#2388
trushev


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


Спасибо skkkk
trushev вне форума  
 
Непрочитано 13.01.2015, 15:06
#2389
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 97


Помогите, пожалуйста, с сортировкой списка:
Есть набор динамических блоков в автокад. Блоки преобразованы во VLA-объекты. Необходимо отсортировать список из VLA - объектов (названий блоков), но по их длине.
Никак не могу понять как привязать коэффициент перебора номера блока k:

(vl-sort-i ars_list_blocks '< (vlax-variant-value (vla-get-value (car (vl-remove-if-not '(lambda (x) (= "ars_distance" (vla-get-propertyname x))) (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties (nth k ars_list_blocks))))))))))

где ars_list_blocks-список, созданный функцией list, возвращает значение, типа (#<VLA-OBJECT IAcadBlockReference 19733bf4> #<VLA-OBJECT IAcadBlockReference 19744bf5> #<VLA-OBJECT IAcadBlockReference 19538gh4>)
Wolkodaw вне форума  
 
Непрочитано 13.01.2015, 15:46
#2390
Кулик Алексей aka kpblc
Moderator

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


на выбор:
Код:
[Выделить все]
 (vl-sort
  ars_list_blocks
  (function
    (lambda (a b)
      (apply (function <)
             (mapcar
               (function vla-get-effectivename)
               (list a b)
               ) ;_ end of mapcar
             ) ;_ end of apply
      ) ;_ end of lambda
    ) ;_ end of function
  ) ;_ end of vl-sort

(vl-sort
  ars_list_blocks
  (function
    (lambda (a b)
      (< (strlen (vla-get-effectivename a)) (strlen (vla-get-effectivename b)))
      ) ;_ end of lambda
    ) ;_ end of function
  ) ;_ end of vl-sort
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2015, 18:51
#2391
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 97


Спасибо, но оно я как понимаю сортирует по эффективному имени блока, а не по длине ("ars_distance")...
Wolkodaw вне форума  
 
Непрочитано 14.01.2015, 00:41
#2392
Кулик Алексей aka kpblc
Moderator

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


Минуту. Ты просил:
Цитата:
Сообщение от Wolkodaw Посмотреть сообщение
Необходимо отсортировать список из VLA - объектов (названий блоков), но по их длине
Я так понял, что нужно было именно имя блока. А если нет - то получай соответствующее значение определенного свойства дин.блока и сортируй по нему. Принцип не меняется ни на йоту.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.01.2015, 08:22
#2393
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 97


Хорошо, попробую, спасибо

Пол-дня бьюсь, никак не выходит((( голову скоро сломаю...
Как заменить vla-get-effectivename на код по извлечению длины?
Задача состоит в том, чтобы отсортировать список ИМЕН (VLA-адресов) блоков, но по их длине (свойство "ars_distance"). Получается что-то вроде двойной сортировки.

Последний раз редактировалось Wolkodaw, 14.01.2015 в 12:55.
Wolkodaw вне форума  
 
Непрочитано 15.01.2015, 10:05 Завис, помогите принять правильное решение
#2394
trushev


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


Я не программист, английского не знаю. В середине 90-х пересел от
кульмана к компьютеру. Каюсь, первое время расстояние на мониторе
мерял линейкой. Познакомился с lisp'ом, dcl в объеме книги Ю. А. Кречко
В. В. Полищук "Автокад 13: новые возможности" Москва "Диалог-МИФИ" 1996.
Связки DCL-LSP по параметрическому вычерчиванию прослужили без проблем
от R12 по AutoCAD 2014. Беглая проверка на ACADVER = "20.0s (LMS Tech)"
показала их работоспособность.
По совету skkkk изучил тему "Mapcar, foreach и AutoCAD 2015". Очень
понравилось решение VVA (#8) и идея пакетной обработки roaa (#13).
В результате родилось следующее:

Замена command на функцию adapt

С учетом синтаксиса функции command:
(command [cmdname [arguments ...]] ... [cmdname [arguments ...]])

На вход adapt подается список:
Код:
[Выделить все]
         (list (list [arguments ...])
                ...
              (list [arguments ...])
        )
Координаты в аргументах должны быть преобразованы к виду "XXX.xxx,YYY.yyy"

Код:
[Выделить все]
 (defun adapt (sp)
       (if command-s     ;Предложено VVA
           (foreach k sp
                    (eval (cons 'command-s (car sp)))
                    (setq sp (cdr sp))
           );foreach k sp
              ;ИНАЧЕ
           (eval (cons 'command (append sp)))
       );if command-s
);defun adapt (sp)
При наличии в аргументах координат в виде (list x y) требуются дополнительные
затраты на преобразование кода (strcat (rtos x 2 n) "," (rtos y 2 n)).
Можно ли обойтись без этих затрат?


Но продолжает грызть вопрос: нужна ли адаптация если нет вложений command
в mapcar или foreach?

----- добавлено через ~15 мин. -----
Прошу прощения.
На вход adapt подается список:
Код:
[Выделить все]
         (list (list [cmdname [arguments ...]])
                ...
              (list [cmdname [arguments ...]])
        )

Последний раз редактировалось Кулик Алексей aka kpblc, 15.01.2015 в 10:23.
trushev вне форума  
 
Непрочитано 26.01.2015, 14:25 Сохранение набора в файл
#2395
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Подскажите, пожалуйста, как набор, сформированный функцией (ssget) сохранить в отдельный файл.
Что-то туплю...
mkung вне форума  
 
Непрочитано 26.01.2015, 14:29
#2396
Кулик Алексей aka kpblc
Moderator

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


В какой "отдельный файл"? В текстовый?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.01.2015, 14:39
#2397
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В какой "отдельный файл"? В текстовый?
DWG, конечно
mkung вне форума  
 
Непрочитано 26.01.2015, 14:49
#2398
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mkung Посмотреть сообщение
DWG, конечно
Это было неочевидно.
Есть команда _.wblock, есть вариант выполнять через ObjectDBX копирование объектов (vla-CopyObjects). Что больше нравится?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.01.2015, 14:56
#2399
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это было неочевидно.
Есть команда _.wblock, есть вариант выполнять через ObjectDBX копирование объектов (vla-CopyObjects). Что больше нравится?
Я бы сделал через vla-wblock, но не пойму как мне набор из SSGET превратить в "vla-SelectionSet"...
mkung вне форума  
 
Непрочитано 27.01.2015, 06:42
#2400
Dima_90


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


Прошу помощи в формировании размеров видового экрана.
Не получается присвоить к (Vports) значение ((2 (0.42 0.0) (1.0 1.0)) (3 (0.0 0.0) (0.42 1.0)))
Подскажите как надо написать программный код.
Dima_90 вне форума  
Ответ
Вернуться   Форум 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