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

Вернуться   Форум 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.
Просмотров: 2048534
 
Непрочитано 05.09.2016, 21:31
#2981
Сергей812


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


Цитата:
Сообщение от George_D Посмотреть сообщение
Добрый день, подскажите , пожалуйста, есть ли возможность с помощью Lisp преобразовать объект в блок и программно добавить к полученному блоку атрибут? Пытаюсь выполнить следующие преобразования: пользователь выбирает полилинию-полилиния преобразуется в блок-атрибут блока пользователь выбирает с помощью выпадающего DCl списка-итог, блок состоящий из полилинии с невидимым атрибутом в нем.
а для чего это в дальнейшем? Можно же к полилинии добавить расширенные данные, куда записать инфо из диалога - и даже блока не делать
Сергей812 вне форума  
 
Непрочитано 05.09.2016, 22:12
#2982
skkkk


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


Кулик Алексей aka kpblc, я тоже подумал об этом в первую очередь, но почему-то решил, что человек, создающий атрибуты программно, должен бы уже знать, что их нужно синхронизировать. Ведь без этого даже ручное создание не обойдется. Думаю, что тут дело в чем-то другом, хотя без кода и файла-примера сказать что-то не возьмусь.
skkkk вне форума  
 
Непрочитано 08.09.2016, 23:14
#2983
Inferi


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


Доброго времени суток. Помогите решить задачу:
есть динамический блок ent_vla "Отвод круглый %%C315-90%%D (подъем)" с параметром поворота "Угол1";
если блок зеркалим или поворачиваем стандартными командами автокада, то реактор выполняет присвоение значения "Угол1" = (- (* 2 pi) (vla-get-rotation ent_vla))).
Пока код выглядит следующим образом:
Код:
[Выделить все]
 
(defun c:reac_dyn_blk_rotate (/ Reac)
  (vl-load-COM)

  (if (setq Reac
        (vl-some
          (function
            (lambda (reactor)
              (if (eq "dyn_blk_rotate"
                    (vlr-data reactor)) reactor)))

          (cdar (vlr-reactors :vlr-command-reactor))))

    (if (vlr-added-p Reac)
      
      (vlr-remove Reac)
      (vlr-add Reac))

    (setq Reac
      (vlr-command-reactor "dyn_blk_rotate"
        (list
          (cons :vlr-commandEnded 'dyn_blk_rotate)))))

  (if (vlr-added-p Reac)
    (princ "\n** dyn_blk_rotate Reactor Activated **")
    (princ "\n** dyn_blk_rotate Reactor Deactivated **"))

  (princ))

(defun dyn_blk_rotate (Reactor Args / )
 (setq ent_vla (vlax-ename->vla-object (entlast)))
  (if
    (eq (LM:effectivename ent_vla) "Отвод круглый %%C315-90%%D (подъем)")
      (LM:setdynpropvalue ent_vla "Угол1" (- (* 2 pi) (vla-get-rotation ent_vla)))
  );end if
(princ))

; -------------------------------------------------------------------------------------------------
(defun LM:setdynpropvalue ( blk prp val )
    (setq prp (strcase prp))
    (vl-some
       '(lambda ( x )
            (if (= prp (strcase (vla-get-propertyname x)))
                (progn
                    (vla-put-value x (vlax-make-variant val (vlax-variant-type (vla-get-value x))))
                    (cond (val) (t))
                )
            )
        )
        (vlax-invoke blk 'getdynamicblockproperties)
    )
)
; ------------------------------------------------------------------------------------------------
(defun LM:effectivename ( obj )
    (vlax-get-property obj
        (if (vlax-property-available-p obj 'effectivename)
            'effectivename
            'name
        )
    )
)
; ------------------------------------------------------------------------------------------------
Как грамотно реализовать для группы последних зеркаленых/повернутых блоков? Все вхождения блока с указанным именем перебирать не хочу.
Inferi вне форума  
 
Непрочитано 08.09.2016, 23:27
#2984
Кулик Алексей aka kpblc
Moderator

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


Как вариант - попробовать получить (ssget "_I"), но я не уверен, что это сработает. Если не повезет с ssget, можно попытаться через ActiveX получить набор выделенных объектов и проходить уже по ним.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.09.2016, 03:12
#2985
Red Nova

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


Аффтора темы еще примите тут на консультацию?
Подскажите плиз если кто знает как получить аннотативный масштаб объекта?
Пока ничего внятного не нашел.
При помощи vla-get-XScaleFactor можно получить масштаб блока, но все остальное (размер, текст, заливка и т.п.) не поддаются.
Код:
[Выделить все]
 (vla-get-XScaleFactor (vlax-ename->vla-object(car(entsel))))
Кроме того, все что я нашел в сети выдает не сам масштаб а коэффициент уменьшения (опять таки только для блоков). Так что если масштаб задан в империальном формате, то, даже получив коэффициент, не понять был этот масштаб метрический или империальный (к примеру для 1/2" = 1'-0" получим на выходе 24).

Последний раз редактировалось Red Nova, 09.09.2016 в 05:13.
Red Nova вне форума  
 
Непрочитано 09.09.2016, 08:21
#2986
Кулик Алексей aka kpblc
Moderator

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


cannoscale? cannoscalevalue?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.09.2016, 20:18
#2987
Red Nova

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


cannoscale контролирует аннотативный масштаб для текущего пространства.
cannoscalevalue отображает кеэффициент уменьшения заданный cannoscale.
А мне нужно получить аннотативный масштаб примитива.
Red Nova вне форума  
 
Непрочитано 09.09.2016, 23:37
#2988
Кулик Алексей aka kpblc
Moderator

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


Когда-то я разбирался с аннотативностью: http://autolisp.ru/2011/03/17/howto-...tyle-or-block/
Может быть, подскажет решение? Честно - сейчас слишком сильно устамши, работать не могу от слова совсем
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.09.2016, 13:22
#2989
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Когда то тоже копал в эту сторону. Докопал до сих:
Код:
[Выделить все]
 (vla-GetXData (vlax-ename->vla-object (car (entsel))) "AcadAnnotative" 'type 'val)
(foreach it (vlax-safearray->list val) (princ (vlax-variant-value it)))
;;;AcadAnnotativeAnnotativeData{11}
Собственно, в материалах Алексея, это соответствует этому
Код:
[Выделить все]
 ("AcadAnnotative"
   (1000 . "AnnotativeData")
   (1002 . "{")
   (1070 . 1)
   (1070 . 1)
   (1002 . "}")
   )
Но это все касается только собственно свойства аннотативности. До списка масштабов я так и не докопался.

з.ы.
Можно покопать в эту сторону:
Код:
[Выделить все]
 (vlax-dump-object (vla-item (vla-item (vla-GetExtensionDictionary (vlax-ename->vla-object (car (entsel)))  ) 0) 0) t)
; IAcadDictionary: Объект-контейнер для хранения и получения других объектов.
; Значения свойств:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 013091b4>
;   Count (RO) = 6
;   Document (RO) = #<VLA-OBJECT IAcadDocument 1339bf60>
;   Handle (RO) = "9AB"
;   HasExtensionDictionary (RO) = 0
;   Name = "ACDB_ANNOTATIONSCALES"
;   ObjectID (RO) = 2129707480
;   ObjectName (RO) = "AcDbDictionary"
;   OwnerID (RO) = 2129707472
; Поддерживаемые методы:
;   AddObject (2)
;   AddXRecord (1)
;   Delete ()
;   GetExtensionDictionary ()
;   GetName (1)
;   GetObject (1)
;   GetXData (3)
;   Item (1)
;   Remove (1)
;   Rename (2)
;   Replace (2)
;   SetXData (2)
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 13.09.2016 в 13:58.
Vladimir_Sergeevich вне форума  
 
Непрочитано 13.09.2016, 13:49
#2990
Кулик Алексей aka kpblc
Moderator

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


Давай немного вернемся назад. Ты хочешь получить масштаб аннотативного объекта - а для каких условий? Для текущего масштаба аннотативности? Для указанного видового экрана? Выяснить, вообще какие масштабы объекту назначены?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.09.2016, 21:25
#2991
Inferi


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


Доброго времени суток, как грамотно применить mapcar "два раза", если скажем нужно выполнить действие на каждым элементом списка вида:
((a1 b1 c1) (a2 b2 c2) ... (a... b... c...))
Inferi вне форума  
 
Непрочитано 15.09.2016, 21:41
1 | #2992
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
А мне нужно получить аннотативный масштаб примитива.
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
До списка масштабов я так и не докопался.
Вот что нашел у себя в заначках. Не проверял
Код:
[Выделить все]
  (defun GetAnnoScales (e / dict lst rewind res)
;;; Argument: the ename of an annotative object.
;;; Returns the annotative scales associated with the 
;;; ename as a list of strings.
;;; Example: ("1:1" "1:16" "1:20" "1:30")
;;; Returns nil if the ename is not annotative. 
;;; Can be used to test whether ename is annotative or not.
;;; Works with annotative objects: text, mtext, leader, mleader, 
;;; dimension, block reference, tolerance and attribute.
;;; Based on code by Ian Bryant.


;;;Joe Burk
;;;http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/how-do-i-make-hatch-annotative-via-vlisp-almost-there/m-p/2080831    
;; Argument: an ename or vla-object.
;; Return T if object is annotative, otherwise nil.
;;;(defun IsAnnotative (e)
;;;(if (not (eq (type e) 'ENAME))
;;;(setq e (vlax-vla-object->ename e))
;;;)
;;;(if (assoc -3 (entget e '("AcadAnnotative"))) T)
;;;)

;;;(defun IsAnnotative (e)
;;;(and e
;;;(setq e (cdr (assoc 360 (entget e))))
;;;(setq e (dictsearch e "AcDbContextDataManager"))
;;;(setq e (dictsearch (cdr (assoc -1 e)) "ACDB_ANNOTATIONSCALES"))
;;;(assoc 350 e)
;;;)
;;;)
    

    (if
      (and
        e
        (setq dict (cdr (assoc 360 (entget e))))
        (setq lst (dictsearch dict "AcDbContextDataManager"))
        (setq lst
               (dictsearch (cdr (assoc -1 lst)) "ACDB_ANNOTATIONSCALES")
        ) ;_ end of setq
        (setq dict (cdr (assoc -1 lst)))
      ) ;_ end of and
       (progn
         (setq rewind t)
         (while (setq lst (dictnext dict rewind))
           (setq e      (cdr (assoc 340 lst))
                 res    (cons (cdr (assoc 300 (entget e))) res)
                 rewind nil
           ) ;_ end of setq
         ) ;_ end of while
       ) ;_ end of progn
    ) ;_ end of if
    (reverse res)
  )                                               ;end


  (defun CheckHandles (e / dict lst rewind nlst d42 d43 n p ptlst)
;;; Argument: the ename of annotative mtext object.
;;; Returns T if the object has only one scale or
;;; the handles for all scales are proportionally the
;;; same and all scales use the same insertion point.
    (if
      (and
        e
        (setq dict (cdr (assoc 360 (entget e))))
        (setq lst (dictsearch dict "AcDbContextDataManager"))
        (setq lst
               (dictsearch (cdr (assoc -1 lst)) "ACDB_ANNOTATIONSCALES")
        ) ;_ end of setq
        (setq dict (cdr (assoc -1 lst)))
      ) ;_ end of and
       (progn
         (setq rewind t)
         (while (setq lst (dictnext dict rewind))
           (setq nlst   (cons lst nlst)
                 rewind nil
           ) ;_ end of setq
         ) ;_ end of while
         (cond
           ((= 1 (length nlst)))
           (t
            ;; lst is nil so reuse it.
            (foreach x nlst
                                                  ;Horizontal width. Can be zero, a null text string.
              (setq d42   (cdr (assoc 42 x))
                                                  ;Vertical height cannot be zero so a divide 
                                                  ;by zero error can't happen.
                    d43   (cdr (assoc 43 x))
                    n     (/ d42 d43)
                    lst   (cons n lst)
                                                  ;Insertion point
                    p     (cdr (assoc 11 x))
                    ptlst (cons p ptlst)
              ) ;_ end of setq
            ) ;_ end of foreach
            (and
              (vl-every '(lambda (x) (equal n x 1e-4)) lst)
              (vl-every '(lambda (x) (equal p x 1e-4)) ptlst)
            ) ;_ end of and
           )
         ) ;_ end of cond
       ) ;_ end of progn
    ) ;_ end of if
  )                                               ;end
----- добавлено через ~11 ч. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
Не проверял
Проверил. Работает
Цитата:
Команда: (GetAnnoScales (car(entsel)))

Выберите объект: ("1:1" "1:50" "2:1")
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 16.09.2016 в 08:18.
VVA вне форума  
 
Автор темы   Непрочитано 17.09.2016, 05:42
#2993
Red Nova

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


VVA, Спасибо. Как отпуск прошел?
Обнаружил что для империальных масштабов добавляется лишний символ обратной скобки. К чему бы это?
Цитата:
Command: (GetAnnoScales (car(entsel)))
Select object: ("1/4\" = 1'-0\"")
Вместо 1/4\" = 1'-0\" должно быть 1/4" = 1'-0"

Хотя пока не пробовал влияет ли это на дальнейшие действия если попытаться записать этот масштаб в другой примитив (для чего собственно и искал эту функцию).
Red Nova вне форума  
 
Непрочитано 17.09.2016, 08:27
| 1 #2994
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Вместо 1/4\" = 1'-0\" должно быть 1/4" = 1'-0"
Это не лишний символ. Двойная кавычка ("), как и обратный слеш (backslash) — символ (\) служебные символы. Если ты хочешь использовать в строке как символы, то их нужно экранировать обратным слэшем
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 18.09.2016 в 17:37.
VVA вне форума  
 
Автор темы   Непрочитано 17.09.2016, 19:40
#2995
Red Nova

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


VVA
Спасибо. На основе этого кода я собрал вот эти команды
Red Nova вне форума  
 
Непрочитано 18.09.2016, 12:37
#2996
Дима_

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


Цитата:
Сообщение от Inferi Посмотреть сообщение
Доброго времени суток, как грамотно применить mapcar "два раза", если скажем нужно выполнить действие на каждым элементом списка вида:
((a1 b1 c1) (a2 b2 c2) ... (a... b... c...))
можно двумя вложенными mapcar'ами:
Код:
[Выделить все]
 (mapcar '(lambda (lst2) (mapcar '1+ lst2)) '((1 2 3) (4 5 6) (7 8 9)))
Если-же копнуть поглубже, то можно и на любую глубину вложенности:
Код:
[Выделить все]
 (defun fun (fn lst)
  (if (listp lst)
      (mapcar '(lambda (x) (fun fn x)) lst)
      (fn lst)))

;; пример вызова (fun 1+ '(1 2 (3 4 (5 6) 7) 8 9))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.09.2016, 09:36
#2997
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Подскажите.
Такой алгоритм: Сохранить как -> Формат файла.
Можно макрос. Если не трудно.
Jerald вне форума  
 
Непрочитано 19.09.2016, 09:49
1 | #2998
Кулик Алексей aka kpblc
Moderator

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


Тебе команду надо? Тогда смотри опции _.-save
Лиспом? См. варианты vla-save, vla-saveas
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.09.2016, 11:21
#2999
Jerald

Конструктор
 
Регистрация: 04.04.2007
Киев
Сообщений: 536


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тогда смотри опции _.-save
Не вызывается в прозрачном режиме.
Команда: _.-save
Неизвестная команда "-SAVE". Для вызова справки нажмите F1.

Вот макрос кнопки ^C^C_saveas
Сделал так:
^C^C_saveas_AutoCAD 2007/LT2010(*.dxf)

Не работает.

AutoCAD 2015 рус
Jerald вне форума  
 
Непрочитано 19.09.2016, 11:27
1 | #3000
Кулик Алексей aka kpblc
Moderator

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


Тьфу, косяк... Сначала выставляй тогда filedia в 0, потом сохраняй, и восстанавливай filedia:
Код:
[Выделить все]
Command: filedia
Enter new value for FILEDIA <1>: 0
Command: saveas
Current file format: AutoCAD 2007 Drawing
Enter file format [R14(LT98&LT97)/2000(LT2000)/2004(LT2004)/2007(LT2007)/Standards/DXF/Template] <2007>: dxf
Current DXF settings: Precision= 16 Format= ASCII Preview= No Version= 2007
Enter decimal places of accuracy (0 to 16) or [Binary/select Objects/Preview/Version] <16>: 16
Save drawing as <C:\Users\a.kulik\Documents\Drawing1.dxf>:
Command: filedia
Enter new value for FILEDIA <0>: 1
Но я как-то не очень понимаю: сохраняешь-то ты активный документ. Оно точно надо именно так?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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