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

Вернуться   Форум 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.
Просмотров: 2048267
 
Непрочитано 11.11.2024, 12:15
1 | #4781
Кулик Алексей aka kpblc
Moderator

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


Пока все то же самое, что и под виндой. С некоторыми ограничениями на dcl, насколько я помню.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 10:27
#4782
Ingpro


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Можно этот лисп использовать в связке с replace.lsp
Я пытаюсь вызвать лисп "Sel-mtxt-rpl" из лиспа "repl", добавив эти строки
Код:
[Выделить все]
 (load "Sel-mtxt-rpl")
(c:Sel-mtxt-rpl)
(c:repl)
Но это срабатывает только при первой загрузке, если повторить команду "repl", то она
запускается первой, а (load "Sel-mtxt-rpl") вообще не срабатывает.
Мне нужно, чтобы сначала сработал код "Sel-mtxt-rpl", затем "repl".
Посоветуйте,плз, как это можно исправить.
Код:
[Выделить все]
 (defun c:repl (/ actdoc copobj errcount extlst extset fromcen laycol maxpt curlay minpt objlay okcount olayst sclay tocen toobj vlaobj *error*)
  (vl-load-com)
  (defun *ERROR*(msg)
    (if olaySt
      (vla-put-Lock objLay olaySt)
      ); end if
    (vla-EndUndoMark actDoc)
    (princ)
    ); end of *ERROR*
  (defun GetBoundingCenter(vlaObj / blPt trPt cnPt)
  (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
      (setq blPt(vlax-safearray->list minPt)
       trPt(vlax-safearray->list maxPt)
       cnPt(vlax-3D-point
        (list
             (+(car blPt)(/(-(car trPt)(car blPt))2))
             (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
          0.0
            ); end list
      ); end vlax-3D-point
     ); end setq
  ); end of GetBoundingCenter
  (if(not(setq extSet(ssget "_I")))
    (progn
      (princ "\nSelect the objects to replace ")
      (setq extSet(ssget))
      ); end progn
    ); end if
  (if(not extSet)
    (princ "\nDistination objects isn't selected!")
    ); end if
  (if
    (and
    extSet
    (setq toObj(entsel "\nSpecify the sample object "))
    ); and and
    (progn
      (setq actDoc
        (vla-get-ActiveDocument
          (vlax-get-Acad-object))
       layCol
        (vla-get-Layers actDoc)
       extLst
        (mapcar 'vlax-ename->vla-object
                    (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex extSet))))
       vlaObj(vlax-ename->vla-object(car toObj))
       objLay(vla-Item layCol
             (vla-get-Layer vlaObj))
       olaySt(vla-get-Lock objLay)
       fromCen(GetBoundingCenter vlaObj)
       errCount 0
       okCount 0
       ); end setq
      (vla-StartUndoMark actDoc)
      (foreach obj extLst
   (setq toCen(GetBoundingCenter obj)
         scLay(vla-Item layCol
              (vla-get-Layer obj))
              );end setq
   (if(/= :vlax-true(vla-get-Lock scLay))
     (progn
     (setq curLay(vla-get-Layer obj))
     (vla-put-Lock objLay :vlax-false)
     (setq copObj(vla-copy vlaObj))
     (vla-Move copObj fromCen toCen)
     (vla-put-Layer copObj curLay)
     (vla-put-Lock objLay olaySt)
     (vla-Delete obj)
     (setq okCount(1+ okCount))
     ); end progn
     (setq errCount(1+ errCount))
     ); end if
   ); end foreach
      (princ
   (strcat "\n" (itoa okCount) " were changed. "
      (if(/= 0 errCount)
        (strcat (itoa errCount) " were on locked layer! ")
        ""
        ); end if
      ); end strcat
   ); end princ
      (vla-EndUndoMark actDoc)
      ); end progn
    (princ "\nSource object isn't selected! ")
    ); end if
  (princ)
  ); end of c:repl

(load "Sel-mtxt-rpl")
(c:Sel-mtxt-rpl)
(c:repl)
(princ)
Если снова выполнить загрузку "repl", то это сработает, как надо...
Вложения
Тип файла: lsp Sel-mtxt-rpl.lsp (498 байт, 3 просмотров)
Тип файла: lsp repl.lsp (2.7 Кб, 2 просмотров)
Ingpro вне форума  
 
Непрочитано 12.11.2024, 10:34
#4783
Кулик Алексей aka kpblc
Moderator

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


Вопрос больше подходит под https://forum.dwg.ru/showthread.php?t=22894
А так - загрузку кода и вызов sel-mtxt-rpl стоит засунуть внутрь тела основной команды.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 10:36
#4784
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А так - загрузку кода и вызов sel-mtxt-rpl стоит засунуть внутрь тела основной команды.
Вопрос перенесён туда https://forum.dwg.ru/showthread.php?t=22894?

Последний раз редактировалось Ingpro, 12.11.2024 в 10:45.
Ingpro вне форума  
 
Непрочитано 12.11.2024, 10:42
#4785
Кулик Алексей aka kpblc
Moderator

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


Перенес
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 10:47
#4786
Кулик Алексей aka kpblc
Moderator

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


Offtop: Но дайте мне развидеть этот код...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 11:41
#4787
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
загрузку кода и вызов sel-mtxt-rpl стоит засунуть внутрь тела основной команды
Так тоже не получилось... Если в "sel-mtxt-rpl" добавить загрузку repl.lsp, то он (repl.lsp) загружается первым...
Ingpro вне форума  
 
Непрочитано 12.11.2024, 13:17
#4788
name02


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


Держи:
repl.lsp
Но на будущее - старайся писать понятнее - очень трудно понять что ты загружал...
name02 вне форума  
 
Непрочитано 12.11.2024, 13:47
#4789
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Держи:
repl.lsp
Но на будущее - старайся писать понятнее - очень трудно понять что ты загружал...
Ок, name02, спасибо, работает в нужном порядке!
Ingpro вне форума  
 
Непрочитано 12.11.2024, 13:53
#4790
Кулик Алексей aka kpblc
Moderator

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


Если честно, я как-то не очень понимаю логику, по которой вся эта связка должна работать. Но вот, как вариант - не включая мозг и не приходя в сознание
Код:
[Выделить все]
 (defun c:repl (/ sel-mtxt-rpl actdoc copobj errcount extlst extset fromcen laycol maxpt curlay minpt objlay okcount olayst sclay tocen toobj vlaobj *error*
              )
  (vl-load-com)

  (defun *error* (msg)
    (if olayst
      (vla-put-lock objlay olayst)
    )     ; end if
    (vla-endundomark actdoc)
    (princ)
  )

  (defun getboundingcenter (vlaobj / blpt trpt cnpt)
    (vla-getboundingbox vlaobj 'minpt 'maxpt)
    (setq blpt (vlax-safearray->list minpt)
          trpt (vlax-safearray->list maxpt)
          cnpt (vlax-3d-point
                 (list
                   (+ (car blpt) (/ (- (car trpt) (car blpt)) 2))
                   (+ (cadr blpt) (/ (- (cadr trpt) (cadr blpt)) 2))
                   0.0
                 )
               )
    )
  )

  (defun sel-mtxt-rpl (/ mtext_filtered_sset mtext_sset pattern)
    (setq pattern             (getpropertyvalue (car (entsel "\nОбразец МТекста для фильтрации: ")) "text")
          mtext_filtered_sset (ssadd)
    )
    (if (setq mtext_sset (ssget '((0 . "mtext"))))
      (sssetfirst
        nil
        (foreach mtext
                       (vl-remove-if-not
                         '(lambda (mtext) (vl-string-search pattern (getpropertyvalue mtext "text")))
                         (vl-remove-if 'listp (mapcar 'cadr (ssnamex mtext_sset)))
                       )
          (ssadd mtext mtext_filtered_sset)
        )
      )
    )
    (princ)
  )

  (sel-mtxt-rpl)
  (if (not (setq extset (ssget "_I")))
    (progn
      (princ "\nSelect the objects to replace ")
      (setq extset (ssget))
    )     ; end progn
  )       ; end if
  (if (not extset)
    (princ "\nDistination objects isn't selected!")
  )       ; end if
  (if
    (and
      extset
      (setq toobj (entsel "\nSpecify the sample object "))
    )     ; and and
     (progn
       (setq actdoc   (vla-get-activedocument (vlax-get-acad-object))
             laycol   (vla-get-layers actdoc)
             extlst   (mapcar 'vlax-ename->vla-object
                              (vl-remove-if
                                'listp
                                (mapcar 'cadr (ssnamex extset))
                              )
                      )
             vlaobj   (vlax-ename->vla-object (car toobj))
             objlay   (vla-item laycol
                                (vla-get-layer vlaobj)
                      )
             olayst   (vla-get-lock objlay)
             fromcen  (getboundingcenter vlaobj)
             errcount 0
             okcount  0
       )  ; end setq
       (vla-startundomark actdoc)
       (foreach obj extlst
         (setq tocen (getboundingcenter obj)
               sclay (vla-item laycol
                               (vla-get-layer obj)
                     )
         ) ;end setq
         (if (/= :vlax-true (vla-get-lock sclay))
           (progn
             (setq curlay (vla-get-layer obj))
             (vla-put-lock objlay :vlax-false)
             (setq copobj (vla-copy vlaobj))
             (vla-move copobj fromcen tocen)
             (vla-put-layer copobj curlay)
             (vla-put-lock objlay olayst)
             (vla-delete obj)
             (setq okcount (1+ okcount))
           ) ; end progn
           (setq errcount (1+ errcount))
         ) ; end if
       )  ; end foreach
       (princ
         (strcat "\n"
                 (itoa okcount)
                 " were changed. "
                 (if (/= 0 errcount)
                   (strcat (itoa errcount) " were on locked layer! ")
                   ""
                 ) ; end if
         ) ; end strcat
       )  ; end princ
       (vla-endundomark actdoc)
     )    ; end progn
     (princ "\nSource object isn't selected! ")
  )       ; end if
  (princ)
)
----- добавлено через 52 сек. -----
Пока бегал по делам, опередили )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 12.11.2024 в 14:17.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 14:09
#4791
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если честно, я как-то не очень понимаю логику, по которой вся эта связка должна работать. Но вот, как вариант
Алексей, спасибо! И этот код работает! Только просит выбрать объекты вот таким текстом:
Ia?acao IOaenoa aey oeeuo?aoee:
Он и в коде такой почему-то... строка 028 (заменить на: Образец МТекста для фильтрации
Если можно я выложу эти коды в готовые программы, думаю многим будет полезен...
Ingpro вне форума  
 
Непрочитано 12.11.2024, 14:17
#4792
name02


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Если можно я выложу эти коды в готовые программы, думаю многим будет полезен...
Быть может и полезен, только все-таки твою программу надо доработать:
1 Сделать по-русски поясняющие надписи во время работы команды
2 Многие переменные у тебя не объявлены локально - замусоривают память компьютера. Плюс теоретически имена переменных могут совпадать с переменными других программ - что может вызвать ошибки работы

Поправь, не поленись, доведи до ума!
name02 вне форума  
 
Непрочитано 12.11.2024, 14:17
#4793
Кулик Алексей aka kpblc
Moderator

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


Исправил. Постоянно забываю про особенности копирования кода из VLIDE...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 14:35
#4794
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Быть может и полезен, только все-таки твою программу надо доработать:
1 Сделать по-русски поясняющие надписи во время работы команды
2 Многие переменные у тебя не объявлены локально - замусоривают память компьютера. Плюс теоретически имена переменных могут совпадать с переменными других программ - что может вызвать ошибки работы
...поясняющие надписи по-русски я сделаю, с переменными могу запутаться...

Последний раз редактировалось Ingpro, 13.11.2024 в 16:16.
Ingpro вне форума  
 
Непрочитано 12.11.2024, 14:45
#4795
name02


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


Про переменные посмотри тут https://storage.piter.com/upload/new...00467/ch33.pdf pdf-страница номер 10 (описание функции defun).
Если кратко - то все что пишется в скобках после defun - локальные переменные, до знака "/" - аргументы функции (входные переменные), а после знака "/" - переменные используемые во время работы функции. И те и другие "живут" только во время выполнения кода функции
name02 вне форума  
 
Непрочитано 12.11.2024, 14:50
#4796
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Про переменные посмотри тут https://storage.piter.com/upload/new...00467/ch33.pdf pdf-страница номер 10 (описание функции defun).
Спасибо, попробую разобраться...
Ingpro вне форума  
 
Непрочитано 12.11.2024, 15:03
#4797
Кулик Алексей aka kpblc
Moderator

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


Я бы всерьез задумался о следующем:
1. Обработка ошибок, особенно для варианта запроса чего бы то ни было у пользователя
2. Практически полная переделка логики: какой смысл запрашивать по 100500 наборы, когда можно в лучшем случае обойтись одним?
3. Про области видимости и доступность переменных / локальных функций уже сказали.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 15:08
#4798
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
после знака "/" - переменные используемые во время работы функции
Значит, здесь перечислены только переменные используемые во время работы функции?
Код:
[Выделить все]
 (defun c:repl1 (/ sel-mtxt-rpl actdoc copobj errcount extlst extset fromcen laycol maxpt curlay minpt objlay okcount olayst sclay tocen toobj vlaobj *error*)

(defun sel-mtxt-rpl (/ mtext_filtered_sset mtext_sset pattern)
А локальные создаются с помощью setq?
Ingpro вне форума  
 
Непрочитано 12.11.2024, 15:09
#4799
Кулик Алексей aka kpblc
Moderator

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


https://autolisp.ru/2011/06/08/funct...bility-region/ :?:
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 15:17
#4800
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Если кратко - то все что пишется в скобках после defun - локальные переменные, до знака "/" - аргументы функции (входные переменные), а после знака "/" - переменные используемые во время работы функции.
Во многих лисп переменные (все?) записываются после ( / ...), варианты до знака "/" мне не встречались...
Например:
Код:
[Выделить все]
 (defun c:ctan ( / *error* grcircle grarc grgetpoint an1 an2 cn1 cn2 di1 di2 ocs rd1 rd2 tmp )
Ingpro вне форума  
Ответ
Вернуться   Форум 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