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

Вернуться   Форум 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.
Просмотров: 2049612
 
Непрочитано 08.09.2011, 22:13
#1601
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Ubivec81, спасибо за интересную (для меня) задачку.
Код:
[Выделить все]
 (mapcar
  '(lambda (x)
     (if (= 300 (car x))
       '(300 . "XXX")
       x
       )
     )
  sps_dxf
  )
Или
Код:
[Выделить все]
 ;(test sps_dxf)
(defun test (sps_dxf)
  (cond
    (
     (= 300 (setq a (caar sps_dxf)))
     (cons '(300 . "XXX")
	   (test (cdr sps_dxf))
	   )
     )
    (
     sps_dxf
     (cons (car sps_dxf) (test (cdr sps_dxf)))
     )
    )
  )
Oliver_88 вне форума  
 
Непрочитано 09.09.2011, 21:09
#1602
dirge


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


Всем привет! Появилась необходимость реализовать такой сетап. В чертеже есть несколько лэйаутов, в каждом лэйауте есть два блока, один обычный и динамический. Нужно процедурно в каждом листе изменить динамический параметр блока в зависимости от размеров блока или имени. Не знаю как даже лучше будет, обращаться либо к имени блока или вычислять его размеры? Подскажите пожалуйста как подступиться к этому вопросу.
dirge вне форума  
 
Непрочитано 09.09.2011, 21:22
#1603
VVA

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


динамический параметр и имя блока
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 13.09.2011, 16:51
#1604
dirge


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


Ребят, подскажите пожалуйста! Сделал вставку во все листы динамического блока поверх старых блоков и нужно теперь изменить динамическое свойство блока в зависимости от имени старого блока.

(setq ss1 (ssget "_x" '((0 . "INSERT") (100 . "AcDbBlockReference"))))

(setq i 0)

(while (< i (SSLENGTH ss1))

(setq name (ssname ss1 i))

(setq conv (vlax-ename->vla-object name))


(if (= (vla-get-name conv) "Mp.Stamp")

(vla-put-value
(car (vlax-safearray->list
(vlax-variant-value
(vla-getdynamicblockproperties conv)
)
)
)
"Mp.StampSmall"
)
)

(setq i (1+ i))
)

Никак не могу додуматься как сделать так чтобы штамп менялся не во всех листах, а только в тех где есть нужный элемент. Дико, буду признателен.
dirge вне форума  
 
Непрочитано 13.09.2011, 16:55
#1605
Кулик Алексей aka kpblc
Moderator

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


Так у тебя и так проверяется имя блока. Правда, куда выполняется вставка, не очень понятно...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.09.2011, 17:02
#1606
dirge


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Так у тебя и так проверяется имя блока. Правда, куда выполняется вставка, не очень понятно...
Во всех листах вставлены два вида блоков динамический и обычный, нужно как то процедурно изменить динамическое свойство блока по имени старого блока. У меня только срабатывает на всех листах, я не пойму как написать условие сравнения имени двух блоков для какого-то листа и если имена имена в списке совпадают и совпадают листы, то выполнить выражение. Может путанно достаточно, но как-то так.
dirge вне форума  
 
Непрочитано 13.09.2011, 17:57
#1607
Кулик Алексей aka kpblc
Moderator

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


Как один из вариантов (сейчас лично мне приходится много работать с неактивными документами, так что от ssget я пока отказываюсь. Что не может не отражаться на кодах )
Код:
[Выделить все]
(vl-load-com)

(defun test (/ adoc blk old_name)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for layout (vla-get-layouts adoc)
    (vlax-for ent (vla-get-block layout)
      (if (= (vla-get-objectname ent) "AcDbBlockReference")
	(cond
	  ((= (vla-get-name ent) "Mp.Stamp")
	   (vlax-for ent1 (vla-get-block layout)
	     (if (and (= (vla-get-objectname ent) "AcDbBlockReference")
		      (= (vla-get-effectivename ent) "Mp.StampSmall")
		      ) ;_ end of and
	      ) ;_ end of if
	     ;; И здесь установка значения
	     ) ;_ end of vlax-for
	   )
	  ) ;_ end of cond
	) ;_ end of if
      ) ;_ end of vlax-for
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Сам понимаешь, код не проверял
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.09.2011, 19:58
#1608
dirge


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


Кулик Алексей aka kpblc, отличный сетап, всё работает как часы! Ты так просто решил проблему над которой я неделю сидел. Огромная благодарность!
dirge вне форума  
 
Непрочитано 13.09.2011, 20:08
#1609
Кулик Алексей aka kpblc
Moderator

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


На самом деле логика элементарна Проходим по всем пространствам листов и модели (layouts). Из указателя на пространство извлекаем указатель на блок этого пространства (vla-get-block). Потом проходим по всем примитивам блока.
Не самое лучшее решение, если честно. Времени нормально посидеть не было, выдал только то, что в голову пришло. Если подключится VVA, код наверняка получится более компактным и быстрым.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.09.2011, 20:47
#1610
dirge


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
На самом деле логика элементарна Проходим по всем пространствам листов и модели (layouts). Из указателя на пространство извлекаем указатель на блок этого пространства (vla-get-block). Потом проходим по всем примитивам блока.
Не самое лучшее решение, если честно. Времени нормально посидеть не было, выдал только то, что в голову пришло. Если подключится VVA, код наверняка получится более компактным и быстрым.
Всё хорошо, но пока есть трудности с пониманием такого количества вложенных циклов. Для меня пока это высшая математика.
dirge вне форума  
 
Непрочитано 13.09.2011, 22:06
#1611
Кулик Алексей aka kpblc
Moderator

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


Ох, как не хочется разбирать изначально порочный код... Ну да ладно, корифеи (надеюсь!) простят...
Код:
[Выделить все]
 (vl-load-com)

(defun test (/ adoc blk old_name)
  (vla-startundomark
    (setq adoc ; Присвоение переменной adoc значения
           (vla-get-activedocument ; активного документа
             (vlax-get-acad-object) ; объекта AutoCAD.
             ) ;_ end of vla-get-activedocument
          ) ;_ end of setq
    ) ;_ end of vla-startundomark
  (vlax-for layout ; для каждого объекта
            (vla-get-layouts adoc); в коллекции Layout активного документа
    (vlax-for ent ; Перебираем все примитивы
              (vla-get-block layout) ; входящие внутрь блока, связанного с текущим Layout
      (if (= (vla-get-objectname ent) "AcDbBlockReference") ; Если объект - вхождение блока
        (cond ; то
          ((= (vla-get-name ent) "Mp.Stamp") ; Если его имя Mp.Stamp, то
           (vlax-for ent1 ; Повторно перебираем все примитивы
                     (vla-get-block layout) ; входящие внутрь блока, связанного с текущим Layout
             (if (and (= (vla-get-objectname ent) "AcDbBlockReference") ; Если примитив - вхождение блока
                      (= (vla-get-effectivename ent) "Mp.StampSmall"); и его эффективное имя Mp.StampSmall
                      ) ;_ end of and
              ) ;_ end of if
             ;; И здесь установка значения
             ) ;_ end of vlax-for
           )
          ) ;_ end of cond
        ) ;_ end of if
      ) ;_ end of vlax-for
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Разницу между эффективным и обычным именем блока можно прочувствовать так: вставляем в файл любой динамический блок и меняем ему хотя бы один из дин.параметров. После этого запускаем такой лисп:
Код:
[Выделить все]
 (vl-load-com)

(defun c:names (/ ent)
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (entsel "\nУкажи блок <Отмена> : "))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "INSERT")
           ) ;_ end of and
    (alert (strcat "Имя блока: "
                   (vla-get-name (setq ent (vlax-ename->vla-object ent)))
                   "\nЭффективное имя блока : "
                   (vla-get-effectivename ent)
                   ) ;_ end of strcat
           ) ;_ end of alert
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.09.2011, 22:13
#1612
dirge


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


Кулик Алексей aka kpblc, спасибо огромное ещё раз подробный разбор полётов! Буду разбираться потихоньку!
dirge вне форума  
 
Непрочитано 13.09.2011, 23:12
#1613
Кулик Алексей aka kpblc
Moderator

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


Да, совсем забыл написать... Конструкцию cond я использовал, чтобы код можно было масштабировать - например, для другого имени дин.блока надо менять другой параметр. А связь все равно со старым блоком. Если этого не надо, то cond безболезненно можно заменить на if. Или (что лучше) - объединить с предыдущим if.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.09.2011, 09:26
#1614
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Цитата:
Сообщение от Дима_ Посмотреть сообщение
ну попробуй разберись:
Код:
[Выделить все]
 (vla-addline 
  (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
  (vlax-3d-point '(0 0 0))
  (vlax-3d-point '(100 100 0)))
p.s. - с тебя два круга с однинаковыми центрами и радиусами 100 и 200 соответственно.
Долго все это пытался понять. Кое что стало доходить
Код:
[Выделить все]
 (vla-addcircle
 	(vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
 	(setq stpt(vlax-3d-point '(0 0 0)))
 	200 
 
   )
(vla-addcircle
 	(vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
 	stpt
 	300 
 
   )
Только так у меня 2 круга получаются, а вот как правильно не знаю . И еще
Код:
[Выделить все]
 (vla-addline 
  (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
читать как создание линии в модели листа активного документа Акада?

Последний раз редактировалось Ubivec81, 14.09.2011 в 11:47.
Ubivec81 вне форума  
 
Непрочитано 21.09.2011, 19:59
#1615
dirge


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


Всем привет, уважаемые форумчане! Ребята, подскажите как можно прервать цикл выбора объектов клавишей Esc?
dirge вне форума  
 
Непрочитано 21.09.2011, 20:21
#1616
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от dirge Посмотреть сообщение
как можно прервать цикл выбора объектов клавишей Esc?
Нажать Esc
gomer вне форума  
 
Непрочитано 21.09.2011, 20:26
#1617
dirge


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


Цитата:
Сообщение от gomer Посмотреть сообщение
Нажать Esc
прикольно, но мне нужен корректный выход, а так выдаётся ошибка
dirge вне форума  
 
Непрочитано 21.09.2011, 20:40
#1618
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от dirge Посмотреть сообщение
мне нужен корректный выход, а так выдаётся ошибка
и правильно выдается... фашисты вообще за побег расстреливали... Ескейп - кнопка выхода, а не прекращения... просто программа не может понять чего вам надо и считает такое нажатие ошибкой пользователя... о чем ему и сообщает а вам как программисту полезно знать о vl-catch-all-apply и иже с ней...
Здесь крыс уже настолько пропиарил свой сайт, что не наткнуться на него уже проблематично, а там все хорошенько разжевано. за что ему и реверанс
gomer вне форума  
 
Непрочитано 22.09.2011, 09:48
#1619
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Подскажите пожалуйста!
На чертеже созданы 2 таблицы и надо значение одной ячейки (F2) первой таблицы перенести в ячейку второй таблицы (tabl 5 4).
Делаю это через
Код:
[Выделить все]
 vla-settext tabl 5 4 (STRCAT "=Table("(itoa(vla-get-objectid tblsn))").F2"))
Все работает хорошо.
Далее в первой таблице меняю какие то цифры и согласно формуле в первой таблице значение F2 меняется а вот значение (tabl 5 4) почему то остается таким же как и было. В EXCEL это все вроде работает,а в АКАДЕ? Или нет вариантов это победить?
Ubivec81 вне форума  
 
Непрочитано 22.09.2011, 10:26
#1620
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Ubivec81, _regen или _updatefield
__________________
cadtools
TararykovDG вне форума  
Ответ
Вернуться   Форум 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