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

Вернуться   Форум 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.
Просмотров: 1973356
 
Непрочитано 19.08.2010, 14:15
#981
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Кулик Алексей aka kpblc, наверное, AtroksAlold про меня так написал
alex8888 вне форума  
 
Непрочитано 02.09.2010, 11:37
#982
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Добрый день

Изучаю понемногу ЛИСП, в том числе и на примерах книги создателей РУ-КАДа.
Периодически возникают вопросы, на которые не всегда удается найти ответ на форумах и в учебниках.

Пока простой вопрос, может он даже слишком простой:

записываю функцию только с локальными переменными, заданными явно

Код:
[Выделить все]
(defun function ( / a b c )
...
)
и БЕЗ переменных, заданных явно (локальные переменные задаются в теле самой функции через "setq"), например:

Код:
[Выделить все]
(defun C:obj_prop ()
(setq ent 647)
(princ)
)
Есть ли разница, как задавать локальные аргументы в функции? Может тут какие подводные камни, о которых я не знаю?
Frigate вне форума  
 
Непрочитано 02.09.2010, 11:42
#983
gomer

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


Второй случай менее предпочтителен, так как ent - глобальная переменная и может в других функциях использоваться, как следствие возможность возникновения ошибки
gomer вне форума  
 
Непрочитано 02.09.2010, 12:27
#984
Дима_

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
Есть ли разница, как задавать локальные аргументы в функции?
когда ты обращаешся к ent - ты создаешь не локальную а ГЛОБАЛЬНУЮ переменную (т.к. в локальных ее нет), она доступна для всех лисп приложений - но на деле вероятность "конфликта" возрастает, если ими и пользоваться - то только с сильно уникальным именем (например например "название-функции_номер-подвресии_имя-автора_ent").
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 02.09.2010, 23:33
#985
superkot007


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


Доброго времени суток! Пробовал искать, но не нашел - lisp для преобразования полилиний в отрезки
Помогите, пожалуйста...
superkot007 вне форума  
 
Непрочитано 02.09.2010, 23:39
#986
Кулик Алексей aka kpblc
Moderator

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


_.explode, что ли?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.09.2010, 06:29
#987
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Спасибо за ответ. Теперь ясно )

Появились еще пара вопросов.

Вот в этом коде, взятом из справки

Код:
[Выделить все]
(setq mycircle (vla-addCircle mSpace 
(vlax-3d-point '(3.0 3.0 0.0)) 2.0))
мне выкидывает ошибку
Цитата:
неверный тип аргумента: VLA-OBJECT nil
Я не совсем понимаю пока объектную модель, как в ЛИСПе задать mySpace. В VBA понятно - текущий документ.modelspace (примерно так), а вот в ЛИСПе - не знаю...

Если брать функцию для работы с другим объектом, напр. таблицей, то здесь мне почти все уже понятно:

Код:
[Выделить все]
 
(defun C:test ( / ent )
(setq ent   (vlax-ename->vla-object (car (entsel "\nВыбрать таблицу : "))) 
            ) ;_ end of setq 
(vla-setcelltextheight
ent
2
2
5.0
)
)
Хотя в следующем примере, указанном КРЫСом, вылетает ошибка
Цитата:
ActiveX Server возвратил ошибку: Параметр является обязательным
Код:
[Выделить все]
 
(vl-load-com)
(setq ent   (vlax-ename->vla-object (car (entsel "\nВыбрать таблицу : "))) 
      ) ;_ end of setq 
(vla-setcellgridlineweight
        ent
        row_counter
        col_counter
        (+ acleftmask acrightmask)
        aclnwt050
        ) ;_ end of vla-SetCellGridLineWeight
И может мне кто объяснить что значат
Код:
и
Цитата:
acrightmask
здесь? ПО справке - это некий EDGE, но я не понимаю точный смысл EDGE, если это граница, то что тогда GRID? Видимо нужно ставить англ. версию АвтоКАДа, чтобы видеть оригинальные названия...

Надеюсь на ваши ответы )

Последний раз редактировалось Frigate, 03.09.2010 в 13:10.
Frigate вне форума  
 
Непрочитано 04.09.2010, 13:34
#988
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
_.explode, что ли?
Блин, интересно, как же я пробовал и не получалось?!
Спасибо!

Не могу найти тему с переводом таблицы из AutoCAD (построена из отрезков) в Excel (помню же, была такая...)
Нашел еще это - http://sites.google.com/site/bushman...tablic-v-excel, но что с ним делать?

Последний раз редактировалось superkot007, 04.09.2010 в 17:43.
superkot007 вне форума  
 
Непрочитано 04.09.2010, 22:34
#989
Кулик Алексей aka kpblc
Moderator

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


Frigate, mspace сначала надо определить. Например, так:
Код:
[Выделить все]
(vl-load-com)

(setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
Насчет ошибки... row_counter (счетчик строк) и col_counter (счетчик столбцов) должны быть заданы предварительно и не быть nil. Номера строк/столбцов начинаются с 0.
Я на autolisp.ru рассказывал о клавиатурных сокращениях. А в справке можно посмотреть, что означает acleftmask Я сейчас уже сам не помню.
superkot007, я на ру-борде ответил.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.09.2010, 11:23
#990
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Кулик Алексей aka kpblc

Спасибо большое
Frigate вне форума  
 
Непрочитано 15.09.2010, 23:56
#991
puma


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


Начинаю разбираться в lisp. Возник такой вопрос: можно ли как-то обрабатывать прерывание (например, escape) выполнения команд в (command...), не прибегая к vla-? поиском не нашел
Пример кода:

Код:
[Выделить все]
(defun c:dimension_M ()
(Setq *oldlayer* (getvar "CLAYER"))
(setvar "CLAYER" "dimension")
(command "_DIMLINEAR" pause pause pause )
(setvar "CLAYER" *oldlayer*)
(setq *oldlayer* "nill")
)
 (princ)
 )
Offtop: за код просьба не ругать, только начинаю ковыряться
puma вне форума  
 
Непрочитано 16.09.2010, 00:18
1 | #992
gomer

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


Причем тут vla-? юзай *error* Пиши туда все... вплоть до полного игнора...
gomer вне форума  
 
Непрочитано 16.09.2010, 00:31
#993
puma


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


Цитата:
Сообщение от gomer Посмотреть сообщение
Причем тут vla-? юзай *error* Пиши туда все... вплоть до полного игнора...
посмотрел справку - смысл понятен, но каким образом узнать, что команда была отменена? так как command возвращает nill, хотя могу здесь ошибаться .
puma вне форума  
 
Непрочитано 16.09.2010, 01:15
#994
gomer

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


При нажатии эскейп *error* выполняется автоматически
gomer вне форума  
 
Непрочитано 16.09.2010, 06:47
#995
ShaggyDoc

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


Цитата:
Возник такой вопрос: можно ли как-то обрабатывать прерывание (например, escape) выполнения команд в (command...), не прибегая к vla-?
Полноценной обработки прерывания без VLA-функций не сделать. Нажатие ESC прерывает программу и передает управление функции *error*.

Цитата:
каким образом узнать, что команда была отменена? так как command возвращает nill
Надо использовать не command, а vl-cmdf. Она уже не только nil возвращает.

Но, чтобы например, в программе рисования чего-то можно было бы прервать, например, простановку размера, но продолжить выполнение кода дальше, надо использовать vl-catch-all-apply, vl-catch-all-error-p, vl-catch-all-error-message

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

Код:
[Выделить все]
(defun ru-error-catch
       (protected_expression on_error_expression / catch_error_result)
;|
Пример вызова
(ru-error-catch
    (function (lambda ()
                ;;; защищаемое выражение  
                (
                
                )
                ;;; То что вернет - будет результатом
              ) ;_ end of lambda
    ) ;_ end of function
    (function
      (lambda (err_msg)
        ;; если надо - выводим сообщение. err_msg подставит Автокад
        (princ (strcat "\nОШИБКА такой-то функции: " err_msg))
        ;; возвращаем NIL при ошибке
        nil
      ) ;_ end of lambda
    ) ;_ end of function
  )

|;
  
  (setq catch_error_result
         (vl-catch-all-apply protected_expression)
  ) ;_ end of setq
  (if (and (vl-catch-all-error-p catch_error_result)
           on_error_expression
      ) ;_ end of and
    (apply on_error_expression
           (list (vl-catch-all-error-message catch_error_result))
    ) ;_ end of apply
    catch_error_result
  ) ;_ end of if
)
Вот теперь программу можно "насмерть" защитить. Вплоть до полного игнора нажатия ESC. Или, наоборот, разрешив по ESC прерывать только кусок кода.
Пример:

Код:
[Выделить все]
(defun _draw_dim_rotated (pnt1 pnt2 ang)
  (while
   (not
    (ru-error-catch
     (function (lambda ()
                (princ "\nПоложение размерной линии: ")
                (vl-cmdf "_.DIMLINEAR"
                         pnt1
                         pnt2
                         "_Rotated"
                         (ru-conv-rad-to-deg ang)
                         pause
                ) ;_ end of vl-cmdf
               ) ;_ end of lambda
     ) ;_ end of function
     nil
    ) ;_ end of ru-error-catch
   ) ;_ end of not
  ) ;_ end of while
 )
Это локальная функция простановки размера между заданными точками.

И еще есть возможность обработки ERRNO. Вот пример:

Код:
[Выделить все]
(defun _ru-get-entsel-no-error (message / ent)
  ;; (_ru-get-entsel-no-error "Выбери объект, но не промахнись!")
  (setvar "errno" 0)
  (while
    (and
      (not (setq ent (entsel (strcat "\n" message))) ;)
      ) ;_ end of not
      (equal 7 (getvar "errno"))
      ;;Ошибка указания при выборе
      ;; блокированный слой?
    ) ;_ end of and
     (setvar "errno" 0)
  ) ;_ end of while
 ;; (PRINT (getvar "errno"))
  (cond
    ((equal (getvar "errno") 52)
     ;; пустой ответ
     nil
    )
    (t
     (list (car ent) (trans (cadr ent) 1 0))
    )
  ) ;_ end of cond
) ;_ end of defun
Эта функция заменяет entsel. При работе со штатной entsel неизвестно, то ли пользователь просто промазал при указании объекта, то ли нажал ESC (а это может быть знак отказа от выбора, но продолжения программы).

Используя такие простые приемы мы добиваемся, чтобы до *error* вообще никогда не доходило дело.
ShaggyDoc вне форума  
 
Непрочитано 16.09.2010, 07:27
#996
Кулик Алексей aka kpblc
Moderator

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


Может быть, ситуацию прояснит http://autolisp.ru/2009/09/20/howto_undo/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.09.2010, 08:27
#997
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Полноценной обработки прерывания без VLA-функций не сделать
Озадачили... Может быть VL- имелось в виду?
Do$ вне форума  
 
Непрочитано 16.09.2010, 09:42
#998
ShaggyDoc

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Озадачили... Может быть VL- имелось в виду?
Ну да. Может быть. Вообще всякие "страшные", сверх базовых функций LISP. "Ну ты, мужик, понял" (С)
Здесь иногда спрашивают, а потом выясняется, что под какой-то "аналог" Автокада пишут.
ShaggyDoc вне форума  
 
Непрочитано 16.09.2010, 14:46
#999
puma


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Вообще всякие "страшные", сверх базовых функций LISP. "Ну ты, мужик, понял" (С)
Имелось ввиду именно это . Всем спасибо за точные подсказки.
puma вне форума  
 
Непрочитано 19.09.2010, 15:55
#1000
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Еще раз здравствуйте, коллеги :-)

Продолжаю по возможности разбираться в LISPе.
Назрели вопросы, которые необходимо уяснить для полноценного понимания программирования в LISP.

1. Почему для поиска всех блоков на рисунке используются следующие аргументы у функции ssget:

(ssget '((0 . "INSERT")))

По DXF-кодам INSERT, как я понимаю, описывает ссылки на блок, блоки. А что же тогда значат DXF коды самого объекта “BLOCK” и как воспользоваться кодами объекта “BLOCK”? Причем там есть интересный такой код, под кодом 3 - тоже "Block name", как и код 2. Что это?

2. Когда набор (set selection) остался пустым – все его члены были удалены – как удалить сам набор, чтобы переменная, которой он присвоен, была nil? Я пока переменную, которой присвоет набор, приравниваю сначала к "0", а затем к nil (сразу nil не присваивается).
Frigate вне форума  
Ответ
Вернуться   Форум 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