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

Вернуться   Форум 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.
Просмотров: 2050148
 
Непрочитано 10.09.2014, 13:43
#2261
kurstep


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


Код:
[Выделить все]
 (defun C:pp ( / ss e p1 p2 p3 p4 i n)                 
    ((setq ss (ssget '((0 . "3DFACE"))))
        (setq i 0 n (sslength ss))
        (while (< i n)
          (setq e (entget (ssname ss i)))
          (setq p1 (cdr (assoc 10 e)) p2 (cdr (assoc 11 e)) p3 (cdr (assoc 12 e)) p4 (cdr (assoc 13 e))    )
         
(entmakex (list '(0 . "POINT") p1))
	  (entmakex (list '(0 . "POINT") p2))
	  (entmakex (list '(0 . "POINT") p3))
	  (entmakex (list '(0 . "POINT") p4))        
           
          (setq i (1+ i))
        ) 
      )
  )
П

----- добавлено через ~3 мин. -----

подскажите пожалуйста в чем ошибка почему комп выдает lselsetp nil даже не дав выбрать объекты (Программа должна строить вершины в точках грани)
kurstep вне форума  
 
Непрочитано 10.09.2014, 13:48
#2262
Кулик Алексей aka kpblc
Moderator

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


Лишняя открывающая скобка перед первым setq

----- добавлено через ~4 мин. -----
Код:
[Выделить все]
 (vl-load-com)

(defun test (/ selset i adoc)
  (if (and (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
           (= (type (setq selset (vl-catch-all-apply
                                   (function
                                     (lambda () (ssget '((0 . "3DFACE"))))
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           ) ;_ end of and
    (foreach ent ((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
                  )
      (vla-startundomark adoc)
      (mapcar
        (function
          (lambda (x)
            (entmakex (list (cons 0 "POINT") (cons 10 x)))
            ) ;_ end of lambda
          ) ;_ end of function
        (mapcar (function (lambda (x) (cdr (assoc x (entget ent))))) '(10 11 12 13))
        ) ;_ end of mapcar
      (vla-endundomark adoc)
      ) ;_ end of foreach
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2014, 03:27
#2263
tehkonst


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


Подскажите как из одного набора (selection set) получить другой набор, отфильтровав его

Например есть набор objSet
Код:
[Выделить все]
 ( setq objSet ( ssget '((0 . "*LINE,CIRCLE,ARC")) ) )
Из него можно получить новый набор, состоящий только из линий
Код:
[Выделить все]
 ( setq linesSet (ssget "_P" '((0 . "LINE"))) )
А дальше нужно получить еще один набор из objSet , состоящий только из полилиний. Как это можно сделать, если он уже не последний?
tehkonst вне форума  
 
Непрочитано 10.10.2014, 08:50
#2264
skkkk


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


При помощи ssget уже никак. Только удалять из набора не полилинии либо создавать новый набор из полилиний, перебирая все объекты набора objSet.
skkkk вне форума  
 
Непрочитано 10.10.2014, 09:54
#2265
WhiteShark


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


А сразу ( setq objSet ( ssget '((0 . "LWPOLYLINE")) ) ) не катит?
WhiteShark вне форума  
 
Непрочитано 10.10.2014, 09:59
#2266
Кулик Алексей aka kpblc
Moderator

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


Основной вопрос - а потом что планируется делать с этими "поднаборами"? Может, будет проще сразу получать списки указателей на объекты и делать все чего хочется уже со списками?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2014, 16:22
#2267
tehkonst


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Основной вопрос - а потом что планируется делать с этими "поднаборами"? Может, будет проще сразу получать списки указателей на объекты и делать все чего хочется уже со списками?
Я разбираюсь пока. Задача, например, такая: выделить все вместе, а потом создать 3 переменные:
1. Список отрезков на слое "lay1"
2. Список отрезков на слое "lay2"
3. Список полилиний (тоже с каким-нибудь свойством)

Потом с этими списками работать: анализ, дополнительные построения.
Объекты желательны сразу в виде Active-x (vla-object), потому что, я смотрю, там методов хватит на все задачи и читать их проще.

Фильтры от ssget мне показались самыми доступными для того, чтобы выбрать по свойствам.
Но без них пока я вижу только один способ: получить один общий набор, пройтись по нему, преобразовав каждый примитив во vla-object, потом условия задавать на наличие нужных свойств.
tehkonst вне форума  
 
Непрочитано 10.10.2014, 16:35
#2268
Кулик Алексей aka kpblc
Moderator

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


Получаешь набор, преобразовываешь его в список и потом список уже фильтруешь. Хотя, не видя задачи, что-либо советовать сложно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2014, 21:44
#2269
tehkonst


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
При помощи ssget уже никак.
Все-таки это можно сделать. Я не совсем понимаю, для чего служит команда sssetfirst, но она выделяет набор по имени и с ним можно потом работать.
Код:
[Выделить все]
  ( setq objSet ( ssget '((0 . "*LINE,CIRCLE,ARC")) ) )
 ( sssetfirst nil objSet)
 ( setq linesSet (ssget "_I" '((0 . "LINE"))) )
 ( setq polylinesSet (ssget "_I" '((0 . "*POLYLINE"))) )
tehkonst вне форума  
 
Непрочитано 11.10.2014, 09:17
#2270
Кулик Алексей aka kpblc
Moderator

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


Нарисуй по окружности, отрезку и дуге в каждом листе и в модели. Перейди в лист, войди внутрь ВЭ и выполни такой код:
Код:
[Выделить все]
  ( setq objSet ( ssget "_X" '((0 . "*LINE,CIRCLE,ARC")) ) )
( sssetfirst nil objSet)
( setq linesSet (ssget "_I" '((0 . "LINE")))
 polylinesSet (ssget "_I" '((0 . "*POLYLINE"))) ) 
А потом через sslength проверь количество объектов в каждом наборе.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.10.2014, 15:11
#2271
tehkonst


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


Проверил. Считает все объекты на всех листах и в модели. Независимо от того: внутри ВЭ, в модели или в листе. Это плохо?
tehkonst вне форума  
 
Непрочитано 11.10.2014, 20:39
#2272
Кулик Алексей aka kpblc
Moderator

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


Offtop: Как бы нет, но... В общем, можешь считать это моей придурью: я предпочитаю не работать такими методами.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.10.2014, 20:48
#2273
tehkonst


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
я предпочитаю не работать такими методами
Раскрыть подробнее можешь? Мне интересно.
tehkonst вне форума  
 
Непрочитано 11.10.2014, 21:25
#2274
Кулик Алексей aka kpblc
Moderator

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


В порядке оффтопа
Offtop: Обычно с подобными "наборами" потом что-то надо делать: удалять, перемещать, менять свойства и т.п. ИМХО намного проще пройтись по такому "набору" чисто программными методами и сделать все "втихаря". Была бы видна конечная задача - можно было бы голову поломать. А так - это гадание на кофейной гуще.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.10.2014, 09:45
#2275
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от tehkonst Посмотреть сообщение
А дальше нужно получить еще один набор из objSet , состоящий только из полилиний. Как это можно сделать, если он уже не последний?
Цитата:
Сообщение от tehkonst Посмотреть сообщение
Но без них пока я вижу только один способ: получить один общий набор, пройтись по нему, преобразовав каждый примитив во vla-object, потом условия задавать на наличие нужных свойств.
Как-то так
Код:
[Выделить все]
(setq objSet ( ssget '((0 . "*LINE,CIRCLE,ARC")))
      lineset (ssadd)
      circleset (ssadd)
      arcset (ssadd)
      plineset (ssadd)
      i -1
      )
(while (and objSet (setq e (ssname objSet (setq i (1+ i)))))
  (cond ((eq(cdr(assoc 0 (entget e))) "LINE")(ssadd e lineset))
        ((eq(cdr(assoc 0 (entget e))) "CIRCLE")(ssadd e circleset))
        ((eq(cdr(assoc 0 (entget e))) "ARC")(ssadd e arcset))
        (t nil)
        )
  )
Про полилинии - тебе домашнее задание. Только учти, что полилинии бывают нескольких видов - LWPOLYLINE и POLYLINE

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от tehkonst Посмотреть сообщение
Потом с этими списками работать: анализ, дополнительные построения.
Если нужны списки, то немного по другому
Код:
[Выделить все]
(setq objSet ( ssget '((0 . "*LINE,CIRCLE,ARC")))
      linelist nil
      circlist nil
      arclist nil
      i -1
      )
(while (and objSet (setq e (ssname objSet (setq i (1+ i)))))
  (cond ((eq(cdr(assoc 0 (entget e))) "LINE")(cons (vlax-ename->vla-object e) linelist))
        ((eq(cdr(assoc 0 (entget e))) "CIRCLE")(cons (vlax-ename->vla-object e) circlelist))
        ((eq(cdr(assoc 0 (entget e))) "ARC")(cons (vlax-ename->vla-object e) arclist))
        (t nil)
        )
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 13.10.2014 в 09:51.
VVA вне форума  
 
Непрочитано 14.10.2014, 22:47
#2276
tehkonst


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


Спасибо
Цитата:
Сообщение от VVA Посмотреть сообщение
Только учти, что полилинии бывают нескольких видов - LWPOLYLINE и POLYLINE
Это я уже опытным путем выяснил

У меня еще вопрос:

На этой странице в конце пример. Но он выдает ошибку "Automation Error. Problem in loading VBA" С чем это связано?
tehkonst вне форума  
 
Непрочитано 14.10.2014, 23:02
#2277
Кулик Алексей aka kpblc
Moderator

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


Например, с тем, что у тебя "не тот" VBA. Обрати внимание: справка для AutoCAD 2015, и VBA-коды гарантированно будут работать только в 2015. С остальными версиями - как повезет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.10.2014, 23:08
#2278
tehkonst


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Если нужны списки, то немного по другому
А если нужно, чтобы 1 список состоял из линий на слое "LAY1" и цветом красным, а другой - из линий на слое "LAY2"?
Просто мне кажется, что через ssget и фильтры запись намного короче (и читать проще). Я уже выше отписал как это можно сделать, и после этого перевести каждый selectionset в список объектов.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Например, с тем, что у тебя "не тот" VBA. Обрати внимание: справка для AutoCAD 2015, и VBA-коды гарантированно будут работать только в 2015. С остальными версиями - как повезет.
Я у Полещюка сначала про эту функцию (vla-Eval) вычитал. Т.е. под 2005 автокад работает, под 2015 работает. А под 2011 нет нужного VBA ?

Последний раз редактировалось tehkonst, 14.10.2014 в 23:25.
tehkonst вне форума  
 
Непрочитано 14.10.2014, 23:35
#2279
Кулик Алексей aka kpblc
Moderator

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


Вот чего не знаю, того не знаю: VBA не использую примерно с 2007 года.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.10.2014, 23:50
#2280
tehkonst


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


Это как бы не вба. Это лисп, который вызывает вба.

Код:
[Выделить все]
 (vl-load-com)
(defun c:Example_Eval()
    ;; This example shows how to can use Eval to run a VBA code fragment
    ;; without having to create a Module or procedure.
    (setq acadObj (vlax-get-acad-object))
    
    ;; Create VBA code fragment
    (setq VBACode "MsgBox \"Simple code fragment\"")
    
    ;; Use Eval method to evaluate the small VBA script
    (vla-Eval acadObj VBACode)
)
Мне эта функция тоже не очень то и нужна. Интересно просто стало, что это за "зверь".
tehkonst вне форума  
Ответ
Вернуться   Форум 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