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

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

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


Переменные - да. Параметры вызова - до.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 15:33
1 | #4802
name02


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


Это ты просто не видел

До знака "/" записываются аргументы функции - т.е. какие-то данные (числа, строки, объекты и т.п.) что будет использоваться для вычисления итогового значения функции
Код:
[Выделить все]
 (defun summ (a1 a2 / )
   (+ a1 a2)
)
Загрузи в автокад этот лисп. Теперь, чтобы найти сумму двух чисел в командной строке набери (summ 4 5)
name02 вне форума  
 
Непрочитано 12.11.2024, 15:42
1 | #4803
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


А те, которые нигде не объявляются - "глобальные"

Код:
[Выделить все]
 (defun summ (a1 a2 / )
  (setq a3 (* a1 a2))
  (+ a1 a2)
)
Здесь это будет а3.

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

(princ a3)

Вернее:

а) В любой момент в текущем сеансе
б) Пока её кто-нибудь не затрёт, забыв объявить в своей функции a3,
как локальную переменную.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 12.11.2024, 15:43
#4804
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
В любой момент в текущем сеансе
Только не в ACAD.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2024, 15:51
#4805
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Ну хорошо, пусть будет "в текущем сеансе для текущего открытого чертежа".
:-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 12.11.2024, 16:11
#4806
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
До знака "/" записываются аргументы функции - т.е. какие-то данные (числа, строки, объекты и т.п.) что будет использоваться для вычисления итогового значения функции
В моем примере ничего же не вычисляется, просто происходит выделение и замена...
А ещё:
"Локальные переменные определяются в рамках заданной процедуры. Параметры, указанные в качестве аргументов в определении функции, также являются локальными переменными. Локальные переменные доступны только в рамках соответствующей функции.
Как и глобальные переменные, локальные переменные также могут быть созданы с помощью конструкции setq".
Ingpro вне форума  
 
Непрочитано 12.11.2024, 17:58
1 | 1 #4807
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от Ingpro Посмотреть сообщение
(princ "\nDistination objects isn't selected!")
н/з
(princ "\nDestination objects aren't selected!")
__________________
K Lisp
koMon вне форума  
 
Непрочитано 12.11.2024, 20:02
1 | #4808
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
В моем примере ничего же не вычисляется, просто происходит выделение и замена
А переменные создаются.
На всякий случай пара ссылок (сам пользовался постоянно, да и сейчас юзаю, если приходится в VLIDE возвращаться): https://autolisp.ru/2009/09/10/vlide-misc-01/ ; https://autolisp.ru/2009/09/12/vlide-misc-02/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.11.2024, 08:36
#4809
Gretech89


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


Здравствуйте! Объясните, пожалуйста, логику скрипта.

Так скрипт удаляет полилинии длиной <500:

Код:
[Выделить все]
   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (mapcar
    'vla-delete
    (mapcar
      'vlax-ename->vla-object
      (vl-remove-if
        '(lambda (x)
           (if (> (vla-get-length (vlax-ename->vla-object x)) 500)
             x
           ) ;_ end of if
         ) ;_ end of lambda
        (mapcar 'cadr
                (ssnamex (ssget "_x" '((0 . "LWPOLYLINE"))))
        ) ;_ end of mapcar
      ) ;_ end of vl-remove-if
    ) ;_ end of mapcar
  ) ;_ end of mapcar
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
Почему он не удаляет все полилинии, если убрать условие?

Код:
[Выделить все]
   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (mapcar
    'vla-delete
    (mapcar
      'vlax-ename->vla-object
      (vl-remove-if
        '(lambda (x)
             x
         ) ;_ end of lambda
        (mapcar 'cadr
                (ssnamex (ssget "_x" '((0 . "LWPOLYLINE"))))
        ) ;_ end of mapcar
      ) ;_ end of vl-remove-if
    ) ;_ end of mapcar
  ) ;_ end of mapcar
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
Почему необходимо дописать вместо "x" "(entdel x)" и правильно ли это?
Код:
[Выделить все]
   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (mapcar
    'vla-delete
    (mapcar
      'vlax-ename->vla-object
      (vl-remove-if
        '(lambda (x)
         (entdel x)
         ) ;_ end of lambda
        (mapcar 'cadr
                (ssnamex (ssget "_x" '((0 . "LWPOLYLINE"))))
        ) ;_ end of mapcar
      ) ;_ end of vl-remove-if
    ) ;_ end of mapcar
  ) ;_ end of mapcar
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
Gretech89 вне форума  
 
Непрочитано 13.11.2024, 09:27
1 | #4810
name02


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


потому что функция (vl-remove-if) удаляет из списка все элементы, для которых результат функции '(lambda (x)) будет ложным (равно nil)
В первом варианте в (lambda (x)) возвращается сам элемент если его длина более 500 и nil в противном случае

Во втором варианте у тебя для всех элементов результатом будет элемент списка (не nil), поэтому удаления из исходного списка не происходит

В последнем варианте у тебя при прохождении по каждому элементу списка выполняется действие (entdel x) - т.е. удаляется элемент

Если надо сформировать набор из НЕполилиний, то ssget надо написать так:
(ssget "_X" '((-4 . "<NOT")(0 . "LWPOLYLINE")(-4 . "NOT>")))

Подробнее про фильтры тут
name02 вне форума  
 
Непрочитано 13.11.2024, 09:36
#4811
Gretech89


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


name02, благодарю. Стало кристально понятно
Gretech89 вне форума  
 
Непрочитано 06.12.2024, 11:53
#4812
Ingpro


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


Хочу просто выбрать полилинию и вставить площадь в кв. м (с коэф. 0.000001) в указанную точку на чертеже, и чтобы текст был подчеркнутый (%%u), но не знаю, как это сделать правильно. Знаю, есть много лиспов для площадей с полями и вставкой в таблицу, но мне это не надо... Где и как в коде прописать коэф. 0.000001 и подчеркивание %%u, подскажите, плз, и точка вставки не работает... В ком. строке пишет:
Команда: AR-OBJ
Укажите точку вставки текста:Ошибка приложения: В команду послан неверный тип
Выберите объекты:
Площадь = 23336443.43, Периметр = 19566.58
Код:
[Выделить все]
 (defun c:AR-OBJ ()
(vl-load-com)
(vl-cmdf "_AREA" "_Object")

;TEXT
(setq txt (entmakex
(list
(cons 0 "TEXT")
(cons 100 "AcDbEntity")
(cons 100 "AcDbText")
(cons 72 0) ; выравнивание влево
(cons 10 '(0 0 0))
(cons 11 '(0 0 0))
(cons 40 250) ;Высота текста
) 
) 
)
;copybase/pasteclip
(setvar "cmdecho" 0)
(princ "\n Укажите точку вставки текста:")
(vl-cmdf "_.copybase" (trans '(0 0 0) 0 1) txt "" "_.erase" txt "" "_.pasteclip" "_none" pause)

(setvar "CMDECHO" 1)
(princ)
)
Ingpro вне форума  
 
Непрочитано 06.12.2024, 12:26
#4813
Кулик Алексей aka kpblc
Moderator

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


1. У тебя нет получения площади.
2. txt не создается, поскольку там не задана строка
3. Возможный вариант кода (без проверок):
Код:
[Выделить все]
 (vl-load-com)
(defun c:ar-obj (/ adoc ent point) 
  (if 
    (and 
      (= 
        (type 
          (setq ent (vl-catch-all-apply 
                      (function 
                        (lambda () 
                          (car (entsel "\nSelect polyline <Cancel> : "))
                        )
                      )
                    )
          )
        )
        'ename
      )
      (setq ent (vlax-ename->vla-object ent))
      (vlax-property-available-p ent 'area)
      (= 
        (type 
          (setq point (vl-catch-all-apply 
                        (function 
                          (lambda () 
                            (getpoint "\nInsertion point <Cancel> : ")
                          )
                        )
                      )
          )
        )
        'list
      )
      point
    )
    (progn 
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (entmakex 
        (list 
          '(0 . "TEXT")
          '(100 . "AbDbEntity")
          '(100 . "AcDbText")
          '(72 . 0)
          (cons 10 point)
          (cons 11 point)
          '(40 . 250)
          (cons 1 (strcat "%%u" (rtos (* (vla-get-area (vlax-ename->vla-object ent)) 1e-6)) 2 14))
        )
      )
      (vla-endundomark adoc)
    )
  )
  (princ)
)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.12.2024, 12:34
#4814
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
1. У тебя нет получения площади.
2. txt не создается, поскольку там не задана строка
3. Возможный вариант кода (без проверок):
Алексей спасибо, но текст не вставляется:
Select polyline <Cancel> :
Insertion point <Cancel> : ; ошибка: неверный тип аргумента: lentityp #<VLA-OBJECT IAcadLWPolyline 0000000045fac808>
Ingpro вне форума  
 
Непрочитано 06.12.2024, 12:39
#4815
Кулик Алексей aka kpblc
Moderator

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


В 46 строке убери преобразование в vla-объект, я его по запарке повторно воткнул

----- добавлено через ~1 мин. -----
У меня ощущение, что ты код не проверял и в VLIDE его не смотрел
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.12.2024, 13:52
#4816
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В 46 строке убери преобразование в vla-объект, я его по запарке повторно воткнул
Чё-то не получается... А что именно убрать? I do not understand...
(cons 1 (strcat "%%u" (rtos (* (vla-get-area) 1e-6)) 2 14))
; ошибка: слишком мало аргументов

(cons 1 (strcat "%%u" (rtos (* (vlax-ename->vla-object ent) 1e-6)) 2 14))
; ошибка: неверный тип аргумента: lentityp #<VLA-OBJECT IAcadLWPolyline 000000005856adc8>

(cons 1 (strcat "%%u" (rtos (* (vla-get-area (vlax-ename)) 1e-6)) 2 14))
; ошибка: no function definition: VLAX-ENAME
Ingpro вне форума  
 
Непрочитано 06.12.2024, 14:47
#4817
name02


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


В 46 строку запиши:

(cons 1 (strcat "%%u" (rtos (* (vla-get-area ent) 1e-6)) 2 14))
name02 вне форума  
 
Непрочитано 06.12.2024, 15:01
#4818
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
В 46 строку запиши:

(cons 1 (strcat "%%u" (rtos (* (vla-get-area ent) 1e-6)) 2 14))
; ошибка: неверный тип аргумента: stringp 2
Ingpro вне форума  
 
Непрочитано 06.12.2024, 15:16
#4819
name02


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


Напутаны скобки, надо вот так:

(cons 1 (strcat "%%u" (rtos (* (vla-get-area ent) 1e-6) 2 14)))
name02 вне форума  
 
Непрочитано 06.12.2024, 15:29
#4820
Ingpro


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Напутаны скобки, надо вот так:

(cons 1 (strcat "%%u" (rtos (* (vla-get-area ent) 1e-6) 2 14)))
Спасибо, name02, теперь получилось, уберу 14 зн. после зпт
(cons 1 (strcat "%%u" (rtos (* (vla-get-area ent) 1e-6) 2 2)))
и будет отлично
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