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

Вернуться   Форум 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.
Просмотров: 2049720
 
Непрочитано 10.07.2015, 15:06
#2681
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 29


gomer, видимо, с определённой кривизной рук даже в ctrl+C > ctrl+V можно запутаться
Попробовал ещё раз, и впрямь всё работает. Спасибо.
T.Bagdat вне форума  
 
Непрочитано 21.07.2015, 11:58
#2682
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 97


Добрый день! Возможно ли на лиспе сделать сортировку списка vla-объектов по координате х левого нижнего угла? Пробую функцией vl-sort, но как туда записать метод vla-GetBoundingBox, которая не возвращает значение, ума не приложу. Кто-нибудь может подсказать как можно сделать?
Wolkodaw вне форума  
 
Непрочитано 21.07.2015, 12:16
#2683
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Wolkodaw, всё это есть в Help:
(vla-GetBoundingBox vla-obj 'MinPt 'MaxPt), и имеешь 2 переменные MinPt и MaxPt с присвоенными им значениями. Только апострофы поставить не забудь.
P_S вне форума  
 
Непрочитано 21.07.2015, 12:19
#2684
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 97


я в курсе может я не ясно выразился, но спрашивал не как пользоваться методом vla-GetBoundingBox, а как сортировать по 'MinPt список? а точнее по координате х левого нижнего угла список vla-объектов?
Wolkodaw вне форума  
 
Непрочитано 21.07.2015, 16:20
#2685
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Хотя бы так: если lst - это список vla-объектов,
Код:
[Выделить все]
 (mapcar(function cadr)
 (vl-sort      
(mapcar '(lambda (x)(vla-GetBoundingBox x 'MinPt 'MaxPt)
	   (list (vlax-safearray->list MinPt) x))lst);mapcar
(function(lambda (e1 e2)(< (caar e1) (caar e2))))
);vl-sort
       );mapcar
P_S вне форума  
 
Непрочитано 21.07.2015, 16:28
#2686
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 97


Спасибо большое, а то вообще голову сломал, попробуем...
Wolkodaw вне форума  
 
Непрочитано 21.07.2015, 21:19
#2687
Кулик Алексей aka kpblc
Moderator

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


Или так:
Код:
[Выделить все]
 (defun test (/ selset)
  (setq selset (ssget)
        selset ((lambda (/ tab item)
                  (repeat (setq tab  nil
                                item (sslength selset)
                                ) ;_ end setq
                    (setq tab (cons (ssname selset (setq item (1- item))) tab))
                    ) ;_ end of repeat
                  ) ;_ end of lambda
                )
        ) ;_ end of setq
  (vl-sort
    (mapcar (function vlax-ename->vla-object) selset)
    (function (lambda (a b / minpa minpb maxp)
                (vla-getboundingbox a 'minpa 'maxp)
                (vla-getboundingbox b 'minpb 'maxp)
                (setq minpa (vlax-safearray->list minpa)
                      minpb (vlax-safearray->list minpb)
                      ) ;_ end of setq
                (< (car minpa) (car minpb))
                ) ;_ end of lambda
              ) ;_ end of function
    ) ;_ end of vl-sort
  ) ;_ end of defun
Но при условии одинаковых координат по Х результат может быть странноватым ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2015, 01:22
#2688
mihamster

Геодезист
 
Регистрация: 09.11.2014
Сообщений: 7


почитал форум, как понял "переменные во вне документном пространстве" такая, больная темка на данный момент)
у меня не совсем про это вопрос, но новую тему создать не решился)

возникло непонимание..
необходимо вынести во вне документное пространство переменную со списком характеристик примитива('ов).
но при попытках сделать это через vl-bb-set или vl-propagate выходит ошибка "неверный импорт\экспорт между док-ми <имя объекта......>"
возникает она из за наличия в списке пар с dxf-кодами -1 и 330.. т.е. в которых после кода стоит "<имя объекта.....>", если их убрать никаких проблем не возникает, и переменная со списком спокойно передается и считывается в другом документе.
подскажите, что это и с чем едят или направьте куда)
mihamster вне форума  
 
Непрочитано 30.07.2015, 09:00
#2689
Кулик Алексей aka kpblc
Moderator

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


dxf reference - там написано, что в какой группе лежит.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2015, 09:43
#2690
mihamster

Геодезист
 
Регистрация: 09.11.2014
Сообщений: 7


Я понимаю, что -1 это имя объекта.. 330 это id..
Этим данным запрещено передаваться в другие док-ты?
mihamster вне форума  
 
Непрочитано 30.07.2015, 10:21
#2691
Кулик Алексей aka kpblc
Moderator

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


330 (по умолчанию) - указатель на "владельца" примитива.
Вообще говоря, я не очень понимаю, зачем надо хранить полное представление примитива во внедокументном пространстве. Может, проще выполнить нечто типа _.wblock в указанный файл, а в переменную просто загонять полное имя созданного файла? Ну и при необходимости его и обрабатывать.
P.S. Хотя для работы с неактивным документом можно и без этого обойтись.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2015, 10:42
#2692
frostmourn


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


mihamster, vl-princ-to-string не подойдёт? В таком виде передаётся.
frostmourn вне форума  
 
Непрочитано 30.07.2015, 10:57
#2693
mihamster

Геодезист
 
Регистрация: 09.11.2014
Сообщений: 7


Действительно, сами имена объекта и id владельца мне в списке не нужны.
Но они неотъмлемая часть списка извлекаемого entget.
И получается проще их просто удалить.
Просто думал, может есть какая то хитрость или что то простое в решении.
Спасибо.
mihamster вне форума  
 
Непрочитано 30.07.2015, 22:07
#2694
skkkk


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


Столкнулся в 2011-м Автокаде с такой незадачей: если в имени слоя присутствует знак диаметра, то при обращении к этому имени лисп видит вместо знака диаметра вопросительный.
В связи с этим, обращение к этому слою через имя провоцирует ошибку. Например:
Код:
[Выделить все]
 (vla-get-Lock 
	(vla-Item 
		(vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object)))
		(vla-get-Layer (vlax-ename->vla-object (car (entsel))))))
Цитата:
; ошибка: Ошибка Automation. Ключ не найден
Я понимаю, что не стоит использовать подобного рода знаки для именования слоев, особенно, если я хочу работать программно с этим файлом, однако имеем то, что имеем, и всё же: как можно в таком случае проверить на блокировку слой выбранного объекта?
skkkk вне форума  
 
Непрочитано 30.07.2015, 22:56
#2695
Кулик Алексей aka kpblc
Moderator

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


Нну... Полагаю, тут дело в "нехватке" стандартной кодировки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2015, 23:15
#2696
skkkk


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


Алексей, ты меня загнал в ступор еще больше. Что мне теперь делать с этим знанием?
skkkk вне форума  
 
Непрочитано 30.07.2015, 23:16
#2697
Кулик Алексей aka kpblc
Moderator

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


Не использовать символы типа диаметра )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2015, 23:19
#2698
skkkk


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


А мыслей, как обратиться к слою некоего объекта, НЕ через его (слоя) имя у тебя нет?
skkkk вне форума  
 
Непрочитано 30.07.2015, 23:20
#2699
Кулик Алексей aka kpblc
Moderator

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


Без файла и конкретной задачи - пока нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.07.2015, 23:38
#2700
skkkk


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


Это можно. Оставил в файле только то, что лаконично необходимо и достаточно для понимания смысла, который вложил во все это автор. Теперь мне приходится программно работать с объектами на таких слоях, вот в частности мой код несколькими постами выше не срабатывает.
Вложения
Тип файла: dwg
DWG 2010
Знак диаметра в имени слоя.dwg (73.9 Кб, 2335 просмотров)
skkkk вне форума  
Ответ
Вернуться   Форум 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