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

Вернуться   Форум 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.
Просмотров: 2048457
 
Непрочитано 23.11.2011, 20:00
#1721
Michael!

инженер
 
Регистрация: 29.01.2009
Тамбов
Сообщений: 63


Спасибо!
Вариант Димы со вставкой и последующим стиранием мне больше всего понравился изза его простоты. да и мне нужно только тексты вставлять так.
Еще раз спасибо всем откликнувшимся.
Michael! вне форума  
 
Непрочитано 28.11.2011, 20:29
#1722
Eghor123


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Дальше Tools (Сервис) -> Load text in editor (Загрузить текст в редактор) (или Ctrl+Alt+E)
вот хоть убейте - нет такого. Акад 2012. консоль vlide - хз. как ей пользоваться?
Eghor123 вне форума  
 
Непрочитано 29.11.2011, 09:46
1 | #1723
VVA

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


Цитата:
Сообщение от Eghor123 Посмотреть сообщение
консоль vlide - хз. как ей пользоваться
В интернете достаточно много про это уже написано
Полезности в редакторе VLIDE
Среда Visual LISP
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.11.2011, 17:35
#1724
Eghor123


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


VVA, спасибо. будем посмотреть)
Eghor123 вне форума  
 
Непрочитано 07.12.2011, 17:17
#1725
Eghor123


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


Основываясь на коде от Кулик Алексей aka kpblc, написал такую вещь. вроде работает. у меня есть вопрос - если я делаю obj локальной переменной, и строку, выделенную синим, пишу без условного оператора if, то команда работает только один раз (как я понял - (vla-get-ActiveSelectionSet actdoc) не может быть выполнено второй раз, после первого выполнения команды). а в чем проблема - я не понимаю...

а вообще - это одно из моих первых творений, и явно далеко не совершенное. так что критика могла бы мне помочь в дальнейшем)))

еще - можно ли в фильтр выбора поставить effectivename, и как это сделать?

Код:
[Выделить все]
(defun c:test ( / actdoc  i n x1 x2 ent1 ent prop value value1)


(vl-load-com)

(setq actdoc (vla-get-activedocument (vlax-get-acad-object)))
(if (not obj) 
    (setq obj (vla-get-ActiveSelectionSet actdoc))
) ;_ end of if
(vla-clear obj)

(vla-selectOnScreen obj
  (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 0)) '(0))
  (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant '(0 . 0)) '("INSERT")))

(setq i -1
      n 1)
(setq n (vla-get-count obj))

(vla-startundomark actdoc) ;_ end of vla-StartUndoMark



(repeat n
        (setq ent (vla-item obj (setq i (1+ i))))

(if (= (vla-get-effectivename ent) "сварка")
    (progn
        (setq x1 (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint ent))))
        (setq x2 (polar x1 (/ pi 2) 10))


        (setq ent1
                   (vla-mirror ent (vlax-3d-point x1) (vlax-3d-point x2))
        );_ end of setq

       (vla-delete ent)

       (setq prop 
                  (car (vl-remove-if-not
                         '(lambda (x)
                            (= (strcase (vla-get-propertyname x))
                               (strcase "Отраженное состояние2")
                            ) ;_ end of =
                          ) ;_ end of lambda
                          (vlax-safearray->list
                            (vlax-variant-value
                              (vla-getdynamicblockproperties ent1)
                            ) ;_ end of vlax-variant-value
                          ) ;_ end of vlax-safearray->list
                        ) ;_ end of vl-remove-if-not
                  ) ;_ end of car
       ) ;_ end of setq

       (setq value
                   (vlax-variant-value (vla-get-value prop))
       ) ;_ end of setq 

       (if (= value 0)
           (setq value1 1)
           (setq value1 0)
       ) ;_ end of if 

       (vla-put-value prop                                        
                      (vlax-make-variant value1                                     
                                         (vlax-variant-type (vla-get-value prop))  
                      ) ;_ end of vlax-make-variant
       ) ;_ end of vla-put-value

       (vla-update ent1)   
) ;_ end of progn                          
) ;_ end of if
) ;_ end of repeat

(vla-endundomark actdoc)

(princ "\nВсе блоки обработаны")
(princ)
) ;_ end of defun
Eghor123 вне форума  
 
Непрочитано 07.12.2011, 18:02
1 | #1726
VVA

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


Цитата:
Сообщение от Eghor123 Посмотреть сообщение
только один раз (как я понял - (vla-get-ActiveSelectionSet actdoc) не может быть выполнено второй раз, после первого выполнения команды)
почитай тему ssget и vla-get-ActiveSelectionSet особенно пост #7. Может поможет
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.12.2011, 21:34
#1727
Eghor123


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


VVA, не помогла. да и шут с ним. через ssget сдалал.

Вот можно ли фильтр по effectivename сделать? чтоб в набор попадали только нужные блоки, а не все??. работает впринципе и так. просто интересно, может еще и понадобится где)
Eghor123 вне форума  
 
Непрочитано 11.12.2011, 21:52
#1728
Кулик Алексей aka kpblc
Moderator

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


Вроде на болоте было решение, которое потом здесь публиковалось... VVA, кажется, показывал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.12.2011, 21:51
#1729
Eghor123


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


что такое болото?
Eghor123 вне форума  
 
Непрочитано 12.12.2011, 22:28
#1730
Кулик Алексей aka kpblc
Moderator

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


theswamp.org. Для просмотра кодов на этом ресурсе требуется регистрация,
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.12.2011, 22:03
#1731
Eghor123


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


так работает
Код:
[Выделить все]
(setq temp (vlax-make-safearray vlax-vbObject '(0 . 2)))
(vlax-safearray-put-element temp 0 arc1)
(vlax-safearray-put-element temp 1 arc2)
(vlax-safearray-put-element temp 2 arc3)
а как сделать так:
Код:
[Выделить все]
(setq temp (vlax-safearray-fill (vlax-make-safearray vlax-vbObject '(0 . 2))
?
Eghor123 вне форума  
 
Непрочитано 18.12.2011, 22:59
#1732
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Ну было б не плохо, чтоб ты объянил что нужно-то получить - если vla массив то в твоем случае
Код:
[Выделить все]
 (vlax-safearray-fill (vlax-make-safearray vlax-vbObject '(0 . 2)) (list arc1 arc2 arc3))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.12.2011, 10:14
#1733
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Eghor123 Посмотреть сообщение
VVA, не помогла. да и шут с ним. через ssget сдалал.

Вот можно ли фильтр по effectivename сделать? чтоб в набор попадали только нужные блоки, а не все??. работает впринципе и так. просто интересно, может еще и понадобится где)
Нет, нельзя
Но можно укоротить путь выбора используя такую маску фильтра:
(ssget (list (cons 0 "insert")(cons 2 "`U*,MyDynamicBlockName"))
обрати внимание в начале стоит наклонная кавычка, а не прямая, U* означает
анонимный блок
Теперь в наборе только твои блоки "MyDynamicBlockName" плюс анонимные,
и остается только по ходу проверить соответствует ли свойство effectivename
имени твоего блока
Олег (jr.) вне форума  
 
Непрочитано 19.12.2011, 10:30
#1734
Кулик Алексей aka kpblc
Moderator

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


Только, наверное, все же
(ssget (list (cons 0 "insert")(cons 2 "`*U*,MyDynamicBlockName"))
??
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.12.2011, 12:53
#1735
VVA

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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Нет, нельзя
Но можно укоротить путь выбора используя такую маску фильтра:
(ssget (list (cons 0 "insert")(cons 2 "`U*,MyDynamicBlockName"))
обрати внимание в начале стоит наклонная кавычка, а не прямая, U* означает
анонимный блок
Теперь в наборе только твои блоки "MyDynamicBlockName" плюс анонимные,
и остается только по ходу проверить соответствует ли свойство effectivename
имени твоего блока
Чистым ssget см. #1730, а с небольшой добавочкой можно
Пример вызова
Код:
[Выделить все]
 (SSSETFIRST nil (GetBlockSelection "EFFECTIVE_BLOCK_NAME"))
;;;Где EFFECTIVE_BLOCK_NAME - имя блока
Код:
[Выделить все]
(defun GetBlockSelection ( name )
    (ssget "_X"
        (list
           '(0 . "INSERT")
            (cons 2
                (apply 'strcat
                    (cons name
                        (mapcar
                            (function (lambda ( x ) (strcat ",`" x)))
                            (LM:GetAnonymousReferences name)
                        )
                    )
                )
            )
        )
    )
)

;;--------------=={ Get Anonymous References }==--------------;;
;;                                                            ;;
;;  Returns the names of all anonymous references of a block. ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  name - block name for which to return anon. references    ;;
;;------------------------------------------------------------;;
;;  Returns:  List of Anonymous Block names, else nil if none ;;
;;------------------------------------------------------------;;

(defun LM:GetAnonymousReferences ( name / ano def lst rec ref )
    (setq name (strcase name))
    (while (setq def (tblnext "BLOCK" (null def)))
        (if
            (and
                (= 1 (logand 1 (cdr (assoc 70 def))))
                (setq rec
                    (entget
                        (cdr
                            (assoc 330
                                (entget
                                    (tblobjname "BLOCK"
                                        (setq ano (cdr (assoc 2 def)))
                                    )
                                )
                            )
                        )
                    )
                )
            )
            (while
                (and
                    (not (member ano lst))
                    (setq ref (assoc 331 rec))
                )
                (if
                    (and
                        (entget (cdr ref))
                        (eq name (strcase (LM:EffectiveName (cdr ref))))
                    )
                    (setq lst (cons ano lst))
                )
                (setq rec (cdr (member (assoc 331 rec) rec)))
            )
        )
    )
    (reverse lst)
)
                        
;;----------------=={ Effective Block Name }==----------------;;
;;                                                            ;;
;;  Returns the effective name of a block.                    ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  blockentity - Block Reference Entity name                 ;;
;;------------------------------------------------------------;;
;;  Returns:  True block name as per the block definition     ;;
;;------------------------------------------------------------;;

(defun LM:EffectiveName ( blockentity / name repbtag )
    (if (wcmatch (setq name (cdr (assoc 2 (entget blockentity)))) "`**")
        (if
            (and
                (setq repbtag
                    (cdadr
                        (assoc -3
                            (entget
                                (cdr
                                    (assoc 330
                                        (entget (tblobjname "BLOCK" name))
                                    )
                                )
                               '("AcDbBlockRepBTag")
                            )
                        )
                    )
                )
                (setq repbtag (handent (cdr (assoc 1005 repbtag))))
            )
            (setq name (cdr (assoc 2 (entget repbtag))))
        )
    )
    name
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.12.2011, 19:20
#1736
Eghor123


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


Дима_, ну да. создать vla массив и заполнить его. не хватает мне знаний пока. я первый код написал с месяц назад всего.
спасибо работает.

VVA, что значит преффикс LM: ?
Eghor123 вне форума  
 
Непрочитано 20.12.2011, 09:46
#1737
VVA

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


Цитата:
Сообщение от Eghor123 Посмотреть сообщение
VVA, что значит преффикс LM: ?
Lee Mac
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.12.2011, 13:14
#1738
La Persona

Чайник
 
Регистрация: 01.12.2011
Сообщений: 27


Доброго времени суток! Дабы не захламлять форум лишней темой, спрошу тут.
Необходимо создать несколько списков:
Код:
[Выделить все]
 
(setq list_1 (list coord_ku_1 measure_num_1)
      list_2 (list coord_ku_2 measure_num_2)
      .......
      list_n (list coord_ku_n measure_num_n)
)
Проблема в том, что заранее число n неизвестно, оно задается непосредственно в начале программы через диалоговое окно DCL. Как создать n-ное количество списков с однотипными именами "list_n"?

Последний раз редактировалось La Persona, 23.12.2011 в 13:21.
La Persona вне форума  
 
Непрочитано 23.12.2011, 13:25
1 | #1739
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от La Persona Посмотреть сообщение
Как создать n-ное количество массивов с однотипными именами "list_n"
Поверьте на слово подход Вы пытаетесь "неверный" прикрутить - не надо плодить однотипные переменные - складывайте все "одинаковое" в список - причем если обрабатывать все равно все - то в простой, если выборочно - то в ассоциативный, лучше по уникальному ключу.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.12.2011, 13:55
#1740
La Persona

Чайник
 
Регистрация: 01.12.2011
Сообщений: 27


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Поверьте на слово подход Вы пытаетесь "неверный" прикрутить - не надо плодить однотипные переменные - складывайте все "одинаковое" в список - причем если обрабатывать все равно все - то в простой, если выборочно - то в ассоциативный, лучше по уникальному ключу.
Спасибо за хорошую идею ) Как-то не сообразил сам
La Persona вне форума  
Ответ
Вернуться   Форум 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