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

Вернуться   Форум 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.
Просмотров: 2047280
 
Непрочитано 10.04.2025, 22:48
#5001
koMon


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Хотелось бы без regen
без регена штатной командой построения мвыноски ятд не получится.
но можно:
1. если рисовать выноску
2. рисовать мвыноску без использования штатной команды.
3. убрать реген и делать его принудительно по надобности.
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 11.04.2025, 22:53
#5002
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


koMon Можно, но не хочу так . Если не найду решение просто буду использовать динамический блок с атрибутом вместо выноски. Ранее так и делал, такой истории как с выноской не было. Любая комбинация полей работает адекватно в атрибуте.
__________________
Блог

Последний раз редактировалось Red Nova, 11.04.2025 в 23:03.
Red Nova вне форума  
 
Непрочитано 12.04.2025, 14:19
#5003
Ingpro


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


not relevant

Последний раз редактировалось Ingpro, 14.04.2025 в 09:43.
Ingpro вне форума  
 
Непрочитано 14.04.2025, 10:50
#5004
===AAA===


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


Попробуй двойной (entdel) для (entlast).
Объект - возможно - восстановится уже правильно отрегенерированным.
И это довольно быстро.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 28.05.2025, 08:08
#5005
Moi Imena


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


я задал переменную LL содержащую выборку объектов
(setq LL (ssget "X"))
далее выбираю эти объекты
(sslength LL)
и применяю пользовательскую команду BURST
(C:BURST)
команда выдает ошибку что в качестве выбранных объектов ожидает
*Invalid selection*
Expects a point or Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/Previous/Undo/AUto/SIngle

со стандартными командами отлично получается выбрав заранее или выбрав как аргумент команды
подскажите как быть с пользовательскими командами ?
Moi Imena вне форума  
 
Непрочитано 28.05.2025, 08:39
1 | #5006
koMon


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


Цитата:
Сообщение от Moi Imena Посмотреть сообщение
далее выбираю эти объекты
(sslength LL)
(sssetfirst nil ll)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 28.05.2025, 09:15
#5007
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Moi Imena Посмотреть сообщение
я задал переменную LL содержащую выборку объектов
(setq LL (ssget "X"))
далее выбираю эти объекты
(sslength LL)
и применяю пользовательскую команду BURST
(C:BURST)
команда выдает ошибку что в качестве выбранных объектов ожидает
*Invalid selection*
Expects a point or Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/Previous/Undo/AUto/SIngle

со стандартными командами отлично получается выбрав заранее или выбрав как аргумент команды
подскажите как быть с пользовательскими командами ?
Насколько я помню, надо применять функцию (burst). На форуме где-то в глубинах был разбор подобных задач, ЕМНИП.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.06.2025, 04:50
#5008
Moi Imena


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


Здраствуйте, подскажите пожалуйста почему используя autolisp при попытке применить команду EXPLODE к объетам типа REGION команда не срабатывает с ответом "The object is not able to be exploded". Сам код:
(ssget "X" '((0 . "REGION")))
(command "_.EXPLODE" ss "")
При этом если вызвать (command "EXPLODE" (ssget "X" '((0 . "REGION"))) "") команда тоже не сработает
При этом если вызвать команду EXPLODE из autocad то все работает, даже если выбрать объекты через autolisp используя (ssget "X" '((0 . "REGION")))
Срабатывает такая постановка команды (command "EXPLODE" "_All" ""), правда фильтрация все же необходима
Moi Imena вне форума  
 
Непрочитано 05.06.2025, 07:28
#5009
name02


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


В русском автокаде 22 все работает. Попробуй так:
Код:
[Выделить все]
 (setq ss (ssget "_X" '((0 . "REGION"))))
(command-s "_EXPLODE" ss)
name02 вне форума  
 
Непрочитано 05.06.2025, 12:38
#5010
===AAA===


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


Цитата:
(ssget "X" '((0 . "REGION")))
(command "_.EXPLODE" ss "")
Я надеюсь, в реальности всё же SETQ имеется?
т.е. сперва

(setq ss (ssget "X" '((0 . "REGION"))))

а потом уже разбивка набора.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 06.06.2025, 02:20
#5011
Moi Imena


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


Спасибо за ответы

Цитата:
Сообщение от name02 Посмотреть сообщение
В русском автокаде 22 все работает. Попробуй так:
Код:
[Выделить все]
 (setq ss (ssget "_X" '((0 . "REGION"))))
(command-s "_EXPLODE" ss)
У меня не вышло применить ваш варинат, я в eng autocad работаю поэтому попробовал как с _ там и без _, хотя на сколько понял должно работать итак и так, оба варианта дали ответ nil
Command: (setq ss (ssget "_X" '((0 . "REGION"))))
<Selection set: 81e9>
Command: (command-s "_EXPLODE" ss)
_EXPLODE
Select object: nil
Command: (command-s "EXPLODE" ss "")
EXPLODE
Select object: nil

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Я надеюсь, в реальности всё же SETQ имеется?
т.е. сперва

(setq ss (ssget "X" '((0 . "REGION"))))

а потом уже разбивка набора.
Я не смог применить ваш код autocad дал ответ nil (справочно работаю в eng версии autocad)

Подскажите пожалуйста в чем приимущество предворительно определять переменную содержащую набор для простых однострочных участков кода (сейчас определяю переменную содержашую набор при переборе содержимого набора) ?

Вот файлик на котором я тестирую код http://5t.ru/-g6staw
Попробовал вместо эксплоде команду ERASE, из строки ответ:
Command: (command
(_> "ERASE"
(_> LL
(_> ""
(_> )
ERASE
Select objects: 33075 found
Select objects:
Command: nil

Если набрать explode то такой ответ.
Command: (command
(_> "EXPLODE"
(_> LL
(_> ""
(_> )
EXPLODE
Select object:
Command: U
(Lisp Expression) GROUP
Command: nil

В обоих случаях используется одна и та же переменная LL (ss занята) и как видно при explode select objet пустой, потом применяется команда u - undo отмена (как подказал copilot), а потом (Lisp Expression) GROUP (тут copilot потерялся). Мне не понятно две предпоследних записи от куда они взялись, ведь я их не вызывал

Последний раз редактировалось Moi Imena, 06.06.2025 в 02:47.
Moi Imena вне форума  
 
Непрочитано 06.06.2025, 07:29
#5012
===AAA===


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


Я не уверен (проверять лень), что "EXPLODE" умеет расчленять
элементы передаваемого ей набора.

Попробуй "скормить" ей отдельный элемент набора.

Если всё получится, просто организуй цикл для последовательного
расчленения всех элементов набора.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 06.06.2025, 07:38
#5013
name02


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


Цитата:
Сообщение от Moi Imena Посмотреть сообщение
Подскажите пожалуйста в чем приимущество предворительно определять переменную содержащую набор для простых однострочных участков кода
Никакого. Такое разделение упрощает отслеживание работы кода.

Цитата:
Сообщение от Moi Imena Посмотреть сообщение
как с _ там и без _, хотя на сколько понял должно работать
"Родной" язык для автокада - английский. Поэтому для локализованных версий для запуска команд на "родном" языке надо писать "_". Если у тебя английская версия, то наличие и отсутствие знака "_" перед именем команды ни на что не влияет.

Цитата:
Сообщение от Moi Imena Посмотреть сообщение
Вот файлик на котором я тестирую код
1. Хороший "файлик" - 28 МБ! Выложи что-то полегче - минутами операции выполняются.
2. Я-таки выделил все в чертеже, но не обнаружил объектов типа REGION - только вхождение блока и 3D-грань. Какие объекты ты пытаешься обработать?

Выложи файл с тем объектом, который ты хочешь обработать

Как правильно заметил ===ААА===, EXPLODE к набору надо применять через перебор:

Код:
[Выделить все]
 (repeat (setq i (sslength (setq ss (ssget "_X" '((0 . "REGION"))))))
   (command-s "_EXPLODE" (ssname ss (setq i (1- i))))
)

Последний раз редактировалось name02, 06.06.2025 в 07:49.
name02 вне форума  
 
Непрочитано 06.06.2025, 08:02
#5014
Moi Imena


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


quote="name02;2097684"]1. Хороший "файлик" - 28 МБ! Выложи что-то полегче - минутами операции выполняются.
2. Я-таки выделил все в чертеже, но не обнаружил объектов типа REGION - только вхождение блока и 3D-грань. Какие объекты ты пытаешься обработать?[/quote]
Ой это я напутал, случайно скинул сырой файл, перезалил его на на этапе расчленния объектов типа region http://5t.ru/-0fkfrh
Хорошо если ничего не выйдет то попробую перебором, у вас получилось на ru версии autocad ?
Moi Imena вне форума  
 
Непрочитано 06.06.2025, 08:13
#5015
Кулик Алексей aka kpblc
Moderator

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


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

----- добавлено через ~2 мин. -----
И да, файл в 13 метров, это, конечно, нечто
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.06.2025, 08:23
#5016
name02


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


Цитата:
Сообщение от Moi Imena Посмотреть сообщение
перезалил его на на этапе расчленния
На русском автокаде 22 работает.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
зачем вообще использовать командные методы для такой несложной операции
Согласен, но автору так хотелось.
Код:
[Выделить все]
   (repeat (setq i (sslength (setq ss (ssget "_X" '((0 . "REGION"))))))
    (vla-explode
      (vlax-ename->vla-object (ssname ss (setq i (1- i))))
    )
  )
name02 вне форума  
 
Непрочитано 06.06.2025, 08:27
#5017
Кулик Алексей aka kpblc
Moderator

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


name02, практиццки то же самое. Только добавил обработку ошибок на всякий случай:
Код:
[Выделить все]
 (vl-load-com)

(defun c:explode-all-regions (/ adoc selset)
  (if (setq selset (ssget "_X" '((0 . "REGION"))))
    (progn
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (foreach ent (mapcar (function vlax-ename->vla-object)
                           ((lambda (/ tab item)
                              (repeat (setq tab  nil
                                            item (sslength selset)
                                      ) ;_ end setq
                                (setq tab (cons (ssname selset (setq item (1- item))) tab))
                              ) ;_ end repeat
                            ) ;_ end of lambda
                           )
                   ) ;_ end of mapcar
        (if (= (type (vl-catch-all-apply
                       (function
                         (lambda ()
                           (vla-explode ent)
                         ) ;_ end of lambda
                       ) ;_ end of function
                     ) ;_ end of vl-catch-all-apply
               ) ;_ end of type
               'variant
            ) ;_ end of =
          (vla-erase ent)
        ) ;_ end of if
      ) ;_ end of FOREACH
      (vla-endundomark adoc)
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.06.2025, 08:27
#5018
===AAA===


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


Цитата:
Если честно, не очень понимаю, зачем вообще использовать командные методы для такой несложной операции.
Если память не изменяет - могу ошибаться - (vla-Explode ...) не все элементы расчленять умеет.
Ну и исходный объект - это если верить справке - не удаляется.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 06.06.2025, 08:28
#5019
Кулик Алексей aka kpblc
Moderator

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


Не сочтите за рекламу Разницу между explode и vla-explode я расписывал достаточно давно (https://autolisp.ru/2014/07/29/explode-vs-vla-explode/). Вроде бы поведение не менялось.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.06.2025, 23:43
#5020
koMon


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


Цитата:
Сообщение от Moi Imena Посмотреть сообщение
применить команду EXPLODE к объетам типа REGION
можно попробовать так
Код:
[Выделить все]
 (initcommandversion)
(vl-cmdf "_explode" (ssget "_x" '((0 . "region"))) "")
__________________
K Lisp
koMon вне форума  
Ответ
Вернуться   Форум 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