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

Вернуться   Форум 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.
Просмотров: 2048365
 
Непрочитано 02.11.2015, 16:36
#2801
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от ProPeller Посмотреть сообщение
Рекомендую описание функции PPT:2D->StEnd переместить из цикла по списку (foreach), например в начало описания программы, где у тебя комментарий ;;; Вспомогательные функции, иначе функция будет переопределяться столько раз, сколько элементов у тебя будет в списке.
Спс. Поправил.
Цитата:
Сообщение от ProPeller Посмотреть сообщение
Если мы на сто процентов уверены, что существует только лишь два варианта k, то я бы начал с этого, а потом стал бы думать дальше.
Понял. спс.

ProPeller подскажи, что прописать, чтобы после построения опять появлялся вопрос какое смещение ввести и указать сторону? пока не нажму отмена.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 03.11.2015 в 10:37.
Pavel_GP вне форума  
 
Непрочитано 05.11.2015, 10:52
#2802
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Попробовал с помощью цикла, но тогда построения тянуться друг за другом.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 05.11.2015, 15:38
#2803
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Здравствуйте! Подскажите, пожалуйста, как добраться до свойств примитивов входящих в описание блока?
До свойств самого блока добраться легко, а вот до примитивов в блоке пока не представляю как.
В какую сторону копать, подскажите.
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 05.11.2015, 20:33
1 | #2804
gomer

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


Цитата:
Сообщение от Fedorino Посмотреть сообщение
В какую сторону копать, подскажите.
rкопай в сторону entnext
gomer вне форума  
 
Непрочитано 06.11.2015, 08:37
#2805
Кулик Алексей aka kpblc
Moderator

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


А не проще найти темы "Нормализация блоков" и "Подготовка подосновы"? Там вариантов "захода внутрь блока" - тьма!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.11.2015, 08:56
#2806
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Fedorino Посмотреть сообщение
До свойств самого блока добраться легко
Не совсем правильное определение. То что вы называете блоком, на самом деле является ссылкой на блок или же Reference.
Если знакомы с технологией ActiveX, то рекомендую воспользоваться следующими командами.

Код:
[Выделить все]
 (vl-load-com)
;;;Подгрузка ActiveX
(setq BlkFam (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
;;;Получили сенмейство блоков в текущем чертеже
(setq ParBlk (vla-item BlkFam "Имя_блока"))
;;;Получили указатель на исходный блок
(vlax-for v1 ParBlk (setq BlkEntLst (cons v1 BlkEntLst)))
;;;Получили список указателей на примитивы блока

;;;В упрощенном варианте будет выглядеть так

(vlax-for v1 (vla-item (vla-get-blocks
			(vla-get-ActiveDocument (vlax-get-acad-object))
		       )
		       "Имя_блока"
	     )
 (setq BlkEntLst (cons v1 BlkEntLst))
)
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 06.11.2015, 09:55
#2807
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Цитата:
Сообщение от gomer Посмотреть сообщение
rкопай в сторону entnext
Начал копать в сторону entnext, действительно можно добраться до примитивов.

Код:
[Выделить все]
(defun vvv ( / vb v_lst)
	(setq vb (cdr (assoc -2 (tblnext "BLOCK" "имя блока"))))
		(while (/= nil vb)
			(setq v_lst (cons vb v_lst))
			(setq vb (entnext vb))
		)
	(length v_lst)
)
Кулик Алексей, да видел эту тему, но разбираться в этих нагромождениях кода, где сам черт ногу сломит, увы не в состоянии.

ProPeller, спасибо за информацию, попробую использовать active x.
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 11.11.2015, 13:54
#2808
Jerald

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


Цитата:
Сообщение от ProPeller Посмотреть сообщение
К сожалению нет.

Может вас спасет вот эта программка, будет как
Не могу адаптировать эту функцию в команду:
Команда: (setvar "cecolor" (LM:randrange 0 10))
; ошибка: Настройка переменной AutoCAD отвергнута: "cecolor" 2
Jerald вне форума  
 
Непрочитано 11.11.2015, 14:13
1 | #2809
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
  (setvar "cecolor" (itoa (fix (LM:randrange 0 10))))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.11.2015, 15:19
#2810
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Здравствуйте! Пишу в ветку для чайников, так как сам пока не могу сообразить то, каким образом решить свою проблему.
Lisp знаю неважно, а методы АктивХ вообще плохо. Поэтому решил написать сюда, может кто-то поможет советом.
Есть задача, используя метод Актив Х, добраться до свойств блока, лучше конечно до атрибутов, но хотя бы просто до блока расположенного на листе.
Назрело несколько вариантов
Вариант 1.
Активный документ-семейство блоков-подсчет количества-переборка всех блоков.
Но тут запинка - не знаю как распознать на каком листе лежит тот или иной блок.
Блоки нашел с листами связать не знаю как.

Вариант 2.
Активный документ-семейство листов-подсчет количества-переборка всех листов.
Но и тут увы проблема, как на листе искать нужный блок?
Искать в пространстве PaperSpace или Layout?
Наоборот, листы нашел, как искать блоки на них?

Вопросов море, ответов мало. Направьте заблудшего дальше, прошу.
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 16.11.2015, 15:32
#2811
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Fedorino Посмотреть сообщение
Есть задача, используя метод Актив Х, добраться до свойств блока, лучше конечно до атрибутов, но хотя бы просто до блока расположенного на листе.
Назрело несколько вариантов

Наоборот, листы нашел, как искать блоки на них?

Вопросов море, ответов мало. Направьте заблудшего дальше, прошу.
Если блок не динамический, то будет проще. Если блок динамический, да еще у него изменен какой-то параметр, то придется ковырять глубже, но тоже все вполне выполнимо.
Перед тем как давать советы, хотелось бы узнать, по каким свойствам данный блок должен находиться (Имя, Имя листа, цвет, запах и т.д.)? Это значительно уменьшит количество советов и направит в нужное русло.
Заодно можете приложить файл с этим блоком, расположенным там где его нужно искать. Там можно уже будет подсказать, как добраться до атрибутов.
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 16.11.2015, 16:00
#2812
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


ProPeller, спасибо за проявленный интерес, выкладываю файл.
В файле лситы с блоком основной надписи, блок динамический.
Итоговая задача-максимум пройти каждый лист чертежа, найти блок "Осннадпись" и в зависимости от параметра видимости в блоке,
считывать информацию из атрибута "НАЗВАНИЕ-ТЕКУЩ-ЛИСТА", запоминая ее.
Затем данную инфу размещаем в таблице ведомости листов.
Атрибуты считывать я научился, правда пока у простых блоков, инфу запоминать и размещать в таблице тоже.
А вот оперируя методами актив Х добраться до блока пока не хватает опыта и знаний.
Поэтому, прошу, подскажите каким образом оптимальнее добраться до блока.
Вложения
Тип файла: dwg
DWG 2013
Чертеж.dwg (165.8 Кб, 1452 просмотров)
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 16.11.2015, 16:26
#2813
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 910


Fedorino, посмотрите эту тему http://forum.dwg.ru/showthread.php?t=14548
kacugu вне форума  
 
Непрочитано 16.11.2015, 16:32
#2814
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Fedorino Посмотреть сообщение
ProPeller, спасибо за проявленный интерес, выкладываю файл.
В файле лситы с блоком основной надписи, блок динамический.
Итоговая задача-максимум пройти каждый лист чертежа, найти блок "Осннадпись" и в зависимости от параметра видимости в блоке,
считывать информацию из атрибута "НАЗВАНИЕ-ТЕКУЩ-ЛИСТА", запоминая ее.
Затем данную инфу размещаем в таблице ведомости листов.
Атрибуты считывать я научился, правда пока у простых блоков, инфу запоминать и размещать в таблице тоже.
А вот оперируя методами актив Х добраться до блока пока не хватает опыта и знаний.
Поэтому, прошу, подскажите каким образом оптимальнее добраться до блока.
Так, ну для начала можно достать все блоки со всех листов. Если прогнать этот код, то получим список1, состоящий из списков2. Каждый из списков2, содержит название листа и указатели на все блоки "Осннадпись", найденные на этом листе. Этого достаточно? Или будем ковырять дальше?))
Код:
[Выделить все]
 (mapcar
 '(lambda (l1)
   (cons l1
	 (vl-remove-if-not
	  '(lambda (l2)
	    (= (vla-get-EffectiveName l2)
	       "Осннадпись"
	    )
	   )
	  (mapcar
	   'vlax-ename->vla-object
	   (mapcar
	    'cadr
	    (ssnamex
	     (ssget "_X"
		    (list (cons 0 "INSERT")
			  (cons 2 "Осннадпись,`*U*")
			  (cons 410 l1)
		    )
	     )
	    )
	   )
	  )
	 )
   )
  )
 (reverse (layoutlist)))
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 17.11.2015, 09:25
#2815
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


kacugu, спасибо за ссылочку, гляну.
ProPeller, спасибо за код, а вообще возможно полноценно использовать АктивХ, т.е. добраться до блоков через семейства?
Например, через семейство листов - найти нужный лист, оттуда выудить инфу о семействе блоков - затем о нужном блоке.
Или сразу через семейство блоков получить инфу о нужном блоке, а из него выудить на каком он листе располагается.
Таким образом до объектов можно добираться или же все же придеться использовать стандартные lisp функции?
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 17.11.2015, 09:50
#2816
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Fedorino Посмотреть сообщение
ProPeller, спасибо за код, а вообще возможно полноценно использовать АктивХ, т.е. добраться до блоков через семейства?
Добраться до семейства не составляет труда, но важно понимать, что из себя представляет семейство. В семействе блоков хранится только определение блоков, а то что мы видим когда вставляем эти блоки в чертеж называется ссылками или же reference. Они уже в свою очередь обладают свойствами и т.д.
Цитата:
Сообщение от Fedorino Посмотреть сообщение
Например, через семейство листов - найти нужный лист, оттуда выудить инфу о семействе блоков - затем о нужном блоке.
Вот тут сразу нужно понять, что семейство блоков одно для всего чертежа.
Цитата:
Сообщение от Fedorino Посмотреть сообщение
Или сразу через семейство блоков получить инфу о нужном блоке, а из него выудить на каком он листе располагается.
Исходя из сказанного мной выше, так сделать нельзя.
Цитата:
Сообщение от Fedorino Посмотреть сообщение
Таким образом до объектов можно добираться или же все же придеться использовать стандартные lisp функции?
Добраться до этих блоков можно как стандартными средствами, так и посредством ActiveX, но вот например добраться до атрибутов этих блоков стандартными средствами скорее всего не получится, а уж до параметров динамического блока тем более.

Отсюда вывод. В связи с тем что AutoCAD хранит информацию об объектах одним целым, не разделяя её на листы и т.д., приходится искать нужные объекты посредством анализа их свойств.
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 17.11.2015, 15:04
#2817
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


ProPeller, информация оказалась полезной, многое встало на свои места, будем работать с вхождениями блока, а не с описаниями, которые хранятся в семействе.
Цитата:
В связи с тем что AutoCAD хранит информацию об объектах одним целым, не разделяя её на листы и т.д.,
Посмотрел справку, там по поводу BlockRef object написано
Цитата:
Access via:
ModelSpace.Item
PaperSpace.Item
Block.Item
SelectionSet.Item
Group.Item
PaperSpace - это разве не пространство листа?
Или я в чем то ошибаюсь?
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 17.11.2015, 15:14
#2818
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Fedorino Посмотреть сообщение
PaperSpace - это разве не пространство листа?
Да, это пространство листа. Именно листа, а не листов, к тому же именно последнего активного листа.
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 17.11.2015, 15:29
#2819
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Ясно, последовательное активирование листов и поиск нужного блока, увеличат время работы программы,
по сравнению с алгоритмом поиска сразу всех блоков и анализа их свойств.
Пока информации достаточно, спасибо за ликбез, нужно переварить полученное .
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 17.11.2015, 15:46
#2820
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Цитата:
Сообщение от Fedorino Посмотреть сообщение
Ясно, последовательное активирование листов и поиск нужного блока, увеличат время работы программы,
по сравнению с алгоритмом поиска сразу всех блоков и анализа их свойств.
Не совсем так. Даже активировав нужный лист, найти блоки с помощью PaperSpace скорее всего не получится.
В том варианте который я предложил, как раз и происходит поочередная фильтрация по листам, но на скорость это не сильно влияет. Я бы даже сказал наоборот, что это наиболее быстрый вариантом поиска. Более того, даже несколько тысяч таких блоков, расположенных на разных листах, найдутся в течении 1-2 секунд.
П.С. Если бы блок был не динамическим и мы бы точно знали в каком листе искать, то код сократился бы втрое.
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
Ответ
Вернуться   Форум 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