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

Вернуться   Форум 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.
Просмотров: 2055086
 
Непрочитано 06.08.2024, 16:24
#4721
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
Ну вот добавили мы 5 объектов в чертеж, у них имена - 1, 2, 3, 4, 5. Затем выделяем объекты 2 и 5 - и копируем, получаем два новых объекта - 6 и 7. И запускаем команду entnext в цикле. Получили в список объекты 6 и 7, но почему (entnext 6) дает nil? Ведь есть предыдущий объект - 5 и так далее до 1.
имхо, (entnext 6) должно дать объект с хэндлом (ака UID) = 7. А вот (entnext 7) уже вернуть nil - нет объектов с БОЛЬШИМ значением хэндла. С меньшим значением хэндла (1..5) есть, то функция то называется EntNext - с какого перепуга она вдруг должна пойти назад по БД?
Сергей812 вне форума  
 
Непрочитано 06.08.2024, 16:30
#4722
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Как пример
В таком виде хороший повод избавиться от объектного реактора с отслеживанием копирования.

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
имхо, (entnext 6) должно дать объект с хэндлом (ака UID) = 7. А вот (entnext 7) уже вернуть nil - нет объектов с БОЛЬШИМ значением хэндла. С меньшим значением хэндла (1..5) есть, то функция то называется EntNext - с какого перепуга она вдруг должна пойти назад по БД?
Аааа, то есть entnext идет вперед, начиная с первого добавленного? В моем мини-примере - начиная с 6? Тогда понятно, почему она прерывается. Но пока непонятно, почему она начинает работать с объекта номер 6? Согласно описанию entnext возвращает первый неудаленный примитив, это же должен быть номер 1?

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Как пример:
Кстати, а автокад не захлебнется при копировании, если ему придется таким образом фильтровать 10 000 объектов, чтобы включить в целевой список только нужные блоки?
Сет вне форума  
 
Непрочитано 06.08.2024, 16:41
#4723
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
Согласно описанию entnext возвращает первый неудаленный примитив, это же должен быть номер 1?
ну я не знаю, где вы смотрите описания функций) Там ясно написано - либо следующий неудаленный после указанного в аргументах примитива, либо если функция вызывается без параметров - то первый неудаленный примитив в БД. Где тут можно запутаться?

----- добавлено через ~16 мин. -----
а единственный порядок следования примитивов в БД чертежа - это их хэндлы (UID в виде 64-битных целых чисел) в порядке добавления в БД чертежа. Других явных признаков нет.
Сергей812 вне форума  
 
Непрочитано 06.08.2024, 17:01
#4724
Сет


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну я не знаю, где вы смотрите описания функций) Там ясно написано - либо следующий неудаленный после указанного в аргументах примитива, либо если функция вызывается без параметров - то первый неудаленный примитив в БД. Где тут можно запутаться?
Да где я только не смотрю описание этой функции - и у Полещука, и в справке Автокада, и на каких-то сайтах, где есть справка по лиспу. Описание не очень понятное. Ну может я такой непонятливый. Возвращаясь к моему мини-пример и циклу из кода Алексея по формированию списка добавленных примитивов. Тот цикл находится в обработчике события по завершению выполнения команды. Завершается команда COPY - срабатывает этот обработчик. Когда команда COPY завершается - в базе уже есть все 7 объектов - 5 изначальных и 2 скопированных. В цикле идет первым делом вызов (entnext nil). Должны получить первый неудаленный примитив. В данном случае это же объект номер 7. Ну а на втором шаге цикла выполняется код (entnext 7) и если функция идет вперед по БД, то должен вернуться nil, а значит итоговый список должен состоять только из объекта номер 7, хотя мы же копированием получили и номер 6.

----- добавлено через ~3 мин. -----
Все, дошло наконец. Первый вызов не (entnext nil). Там в качестве аргумента примитив (entlast), полученный перед копированием.

----- добавлено через ~7 мин. -----
Цитата:
Сообщение от Сет Посмотреть сообщение
Кстати, а автокад не захлебнется при копировании, если ему придется таким образом фильтровать 10 000 объектов, чтобы включить в целевой список только нужные блоки?
Попробовал на 50 000 примитивов. Чувствуется лаг на несколько секунд на моем компьютере. Но он чувствуется и без фильтрации, и даже с отключенными реакторами. Так что особого влияния нет.
Сет вне форума  
 
Непрочитано 06.08.2024, 17:17
#4725
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сет Посмотреть сообщение
Кстати, а автокад не захлебнется при копировании, если ему придется таким образом фильтровать 10 000 объектов, чтобы включить в целевой список только нужные блоки?
Он скорее захлебнется с объектными реакторами. И что-то мне сложно поверить, что у тебя будет несколько тысяч объектов. В конце концов, никто не мешает проверку вколотить в цикл сбора объектов.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.08.2024, 18:13
#4726
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Он скорее захлебнется с объектными реакторами. И что-то мне сложно поверить, что у тебя будет несколько тысяч объектов. В конце концов, никто не мешает проверку вколотить в цикл сбора объектов.
С объектными как раз должно быть проще, потому что они срабатывают при модификации конкретного объекта. А командные - при любой команде. Но в данном случае их некорректно противопоставлять, потому что хоть я думаю отказаться от объектного реактора ан копирование, но пока не вижу причин отказаться от объектного реактора на изменение. Не очень представляю как его можно убрать, оставив только командный. Я в объектном реакторе получаю глобальную ссылку на изменяемый объект, а в командном - провожу над ним различные действия.

Копирование больших массивов - вполне обычная задача в моей практике. Там и под 100 тысяч примитивов может быть. Ну например сформировал 100 листов чертежей и надо потом что-то в них поменять, но оставить для удобного просмотра рядом оригинальный вариант. Замечу, что я работаю только в пространстве модели, листами не пользуюсь.
Сет вне форума  
 
Непрочитано 06.08.2024, 18:47
#4727
Кулик Алексей aka kpblc
Moderator

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


Касаемо "глубоких" реакторов и их поведения : https://autolisp.ru/2020/02/18/acdb-reactors/ Именно из-за этих и подобных приколок я предпочитаю "топорные" методы.
Какая связь между сотнями листов, их копиями "рядом" и списками примитивов - как-то не догоняю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.08.2024, 19:05
#4728
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Какая связь между сотнями листов, их копиями "рядом" и списками примитивов - как-то не догоняю.
Лист в данном случае - не автокадовская вкладка лист - а электронный эквивалент бумажного листа. Вот тут, например, 20 000 примитивов. Мне может понадобиться необходимость их скопировать в другое место пространства модели.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 19
Размер:	301.1 Кб
ID:	264140  
Сет вне форума  
 
Непрочитано 06.08.2024, 19:09
#4729
Кулик Алексей aka kpblc
Moderator

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


Ну хочешь - попробуй мой код, посмотри, "захлебнется" кад или нет. Подозреваю, что все сработает корректно - основная проблема будет при прорисовке, но вряд ли при обработке списка.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.08.2024, 19:27
#4730
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну хочешь - попробуй мой код, посмотри, "захлебнется" кад или нет. Подозреваю, что все сработает корректно - основная проблема будет при прорисовке, но вряд ли при обработке списка.
Так я уже попробовал на 50 000 примитивов. Правда в их составе было половина отрезков и половина простых блоков из трех примитивов. Подтормаживает на пару секунд, терпимо. При этом разницы большой нет - что с твоим фильтром, что без него, что даже вообще без реакторов - время копирования на глаз примерно одинаковое.


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Именно из-за этих и подобных приколок я предпочитаю "топорные" методы.
А как ты определяешь получаешь ссылку на объект, который изменяется, чтобы обработать его изменение в командном реакторе?
Сет вне форума  
 
Непрочитано 06.08.2024, 19:50
#4731
Кулик Алексей aka kpblc
Moderator

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


Стоп. Командные реакторы у меня в реальных боевых условиях вообще слабо привязаны к объектам. Ну скопировал пользователь объект - и бог с ними, и с объектом, и с пользователем. Изменений объектов лично я предпочитаю непредсказуемо (для пользователя) не выполнять: лекарство может оказаться хуже болезни.
А необходимость "привязки" объектного реактора я бы делал примерно так:
1. В описании блока в словарь засунуть некую последовательность типа '("objreactor" . t). Решения в ынтырнетах есть
2. При открытии документа пройтись по всем описаниям блоков, найти те, у которых "надо привязывать" реактор
3. Пройтись по всем вхождениям таких блоков и прописать им объектный реактор
4. При выполнении команд копирования / вставки из буфера / внедрения стороннего файла как блока / внедрении внешней ссылки повторно выполнить п.3
---
Offtop: Хотя мне до сих пор кажется, что задачка своей сложностью выходит за рамки возможностей лиспа.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.08.2024, 10:39
#4732
Сет


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


Можно ли ограничить выбор точки pt3 прямой, проходящей через точки pt1 и pt2?
Код:
[Выделить все]
 
(setq pt1 (getpoint "\nУкажите точку 1:"))
(setq pt2 (getpoint pt1 "\nУкажите точку 2:"))
(setq pt3 (getpoint pt2 "\nУкажите точку 3:"))
Сет вне форума  
 
Непрочитано 09.08.2024, 10:55
#4733
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


имхо, лучше получить проекцию от третьей точки на отрезок - чем требовать от пользователя точного попадания в определенную точку)
Сергей812 вне форума  
 
Непрочитано 09.08.2024, 10:59
#4734
Сет


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
имхо, лучше получить проекцию от третьей точки на отрезок - чем требовать от пользователя точного попадания в определенную точку)
Не в точку, а в точку на линии. И не попасть, а ограничить ввод. Нужно чтобы при выборе третьей точки резиновая линия была зафиксирована на прямой проходящей через первые две точки.
Сет вне форума  
 
Непрочитано 09.08.2024, 11:14
#4735
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
Не в точку, а в точку на линии. И не попасть, а ограничить ввод. Нужно чтобы при выборе третьей точки резиновая линия была зафиксирована на прямой проходящей через первые две точки.
реально, может хватит издеваться над лиспом, пытаясь реализовать на нем функционал ObjectARX/NetAPI? Хотя в последних вроде такого встроенного функционала тоже нет.

А так, например, построить отрезок временный по первым двум точкам, и пускай пользователь привязкой пользуется при выборе 3-ей точки.
Сергей812 вне форума  
 
Непрочитано 09.08.2024, 11:18
#4736
Сет


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
реально, может хватит издеваться над лиспом, пытаясь реализовать на нем функционал ObjectARX/NetAPI? Хотя в последних вроде такого встроенного функционала тоже нет.
Ну почему издеваться? Я просто не большой спец в лиспе, вдруг есть такая возможность, о которой я пишу.

Если нет, то я эту третью точку пока думаю получать программно. Она будет на том же расстоянии от точки 2, что и указанная пользователем, но смещенная на линию 1-2. Этот вариант меня тоже устраивает, просто он чуть менее красив, чем если бы при выборе точки 3 резиновая линия изначально тянулась только по прямой 1-2.
Сет вне форума  
 
Непрочитано 09.08.2024, 11:45
#4737
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
Ну почему издеваться?
Цитата:
Сообщение от Сет Посмотреть сообщение
просто он чуть менее красив
лисп - это ЯП для реализация чистого функционала. А если начинать думать о красивом GUI - лисп слишком далеко в прошлом остановился в развитии.
Сергей812 вне форума  
 
Непрочитано 09.08.2024, 11:48
#4738
Сет


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


Я тут подумал, может как вариант - повернуть систему координат по двум первым точкам и включить режим ОРТО перед выбором третьей точки.
Сет вне форума  
 
Непрочитано 09.08.2024, 12:13
#4739
Кулик Алексей aka kpblc
Moderator

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


1. Режим может быть отключен пользователем
2. Никто не помешает вести перпендикулярно
3. Замучаешься обратно восстанавливать UCS
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.08.2024, 12:32
#4740
Сет


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Никто не помешает вести перпендикулярно
Перпендикулярно чему?

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Замучаешься обратно восстанавливать UCS
Почему замучаюсь? Вроде простого включения МСК будет достаточно.
Сет вне форума  
Ответ
Вернуться   Форум 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