Schöck
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Выбор динамических блоков с атрибутам скопом.

Lisp. Выбор динамических блоков с атрибутам скопом.

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 26.05.2013, 17:30 #1
Lisp. Выбор динамических блоков с атрибутам скопом.
Kirill_Ja
 
Мурманск
Регистрация: 28.07.2008
Сообщений: 208
Отправить сообщение для Kirill_Ja с помощью ICQ

Kirill_Ja вне форума Вставить имя

Итак снова про динамические блоки.
Есть задача выделить все блоки с определенным именем на чертеже.
Первая мысль была

(ssget "_X" (list (cons 0 "INSERT") (cons 2 <имя>)))

пока не вспомнил, что блоки динамические.

Есть какое-нибудь решение более элегантное, чем выбрать все блоки с именами, начинающимися со звездочки
и потом у каждого проверить EffectiveName?
Просмотров: 7611
 
Непрочитано 26.05.2013, 18:21
1 | #2
Олег (jr.)

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


Так пойдёт?
Код:
[Выделить все]
(setq blockname "wall")
(while (setq blkdef (tblnext "BLOCK" (null blkdef)))
  (if (or (wcmatch (cdr (assoc 2 blkdef))blockname )
	  (wcmatch (cdr (assoc 2 blkdef)) "`*U*")
	  )
(setq blklist (cons (cdr (assoc 2 blkdef))blklist))))
(setq filter (apply 'strcat(append
			     (mapcar '(lambda(x)
					(strcat "`"x ","))
				     (reverse (cdr (reverse  blklist))))
			     (list (last blklist))
			     )
		    )
      )
(setq sset (ssget "_X" (list (cons 0 "insert")(cons 2 filter)(cons 66 1)(cons 410 (getvar "ctab")))))
(repeat (setq n (sslength sset))
  (setq blk (ssname sset (setq n (1- n))))
  (princ (strcat "\n" (vla-get-effectivename (vlax-ename->vla-object blk))))
  )
Олег (jr.) вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.05.2013, 20:39
#3
Дима_

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


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Есть какое-нибудь решение более элегантное, чем выбрать все блоки с именами, начинающимися со звездочки...
В авто\визал-лиспе нет, через Arx/.Net можно сразу получить список всех вхождений по блоку.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 27.05.2013, 00:35
#4
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
Отправить сообщение для Kirill_Ja с помощью ICQ


Ага. Ну как-то так я и предполагал. Олег, спасибо, что напомнил, что пользовательские блоки начинаются с "*U". Не смог погонять твой. Какой-то сбой в редакторе VLIDE. Подправил свой.

Еще давно хотел спросить. Если писать через Arx/.Net, программа станет чувствительна к версии AutoCad, системы и .Net Framework (если вопрос очень дурацкий - не отвечайте)
Kirill_Ja вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.05.2013, 00:48
#5
Олег (jr.)

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


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Еще давно хотел спросить. Если писать через Arx/.Net, программа станет чувствительна к версии AutoCad, системы и .Net Framework (если вопрос очень дурацкий - не отвечайте)
Да, однозначно и по всем позициям, посмотри последние сообщения на болоте
там как раз эта тема обсуждается (ТТ и компания)
http://www.theswamp.org/index.php?topic=41047.0

Последний раз редактировалось Олег (jr.), 27.05.2013 в 08:22.
Олег (jr.) вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2013, 19:26
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,690
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Итак снова про динамические блоки.
Есть задача выделить все блоки с определенным именем на чертеже.
Первая мысль была

(ssget "_X" (list (cons 0 "INSERT") (cons 2 <имя>)))

пока не вспомнил, что блоки динамические.

Есть какое-нибудь решение более элегантное, чем выбрать все блоки с именами, начинающимися со звездочки
и потом у каждого проверить EffectiveName
Есть.
Код:
[Выделить все]
;;;Вместо "TITLEBLOCK" ввести имя блока
(ssget "_X"
  (list
    (cons 0 "INSERT")
    (cons 2 (LM:BlockList->Str (cons "TITLEBLOCK" (AnonymousInstancesof "TITLEBLOCK")) ","))
    (cons 66 1)
  )
)
Недостающие функции с правками по замечаниям #11
Код:
[Выделить все]
(defun AnonymousInstancesof ( block / def rec nme ref lst )
;; Returns list of the Anonymous names taken by a Dynamic Block (if any)  -  Lee Mac 2011  -  www.lee-mac.com
;; edit VVA 2013.10.16
;; Arguments:  block  - name of Dynamic Block.
;; http://www.cadtutor.net/forum/showthread.php?56447-Automatically-filling-out-the-Drawing-Property-from-Titleblock-Information&p=382978&viewfull=1#post382978
;; http://forum.dwg.ru/showthread.php?t=99353  
  (while (setq def (tblnext "BLOCK" (null def)))
    (if (= 1 (logand 1 (cdr (assoc 70 def))))
      (progn
        (setq rec
          (entget
            (cdr
              (assoc 330
                (entget
                  (tblobjname "BLOCK" (setq nme (cdr (assoc 2 def))))
                )
              )
            )
          )
        )
        (while (setq ref (assoc 331 rec))
          (if
            (and
              (cdr ref) ;;;Add VVA 2013-10-16
              (entget (cdr ref)) ;;;Add VVA 2013-10-16
              (eq block (vla-get-effectivename (vlax-ename->vla-object (cdr ref))))
              (not (member nme lst))
            )
            (setq lst (cons nme lst))
          )
          (setq rec (cdr (member (assoc 331 rec) rec)))
        )
      )
    )
  )
  (reverse lst)
)

(defun LM:BlockList->Str ( lst del / f )
  ;; © Lee Mac 2011

  (defun f ( s ) (if (wcmatch s "`**") (strcat "`" s) s))
  
  (if (cdr lst)
    (strcat (f (car lst)) del (LM:BlockList->Str (cdr lst) del))
    (f (car lst))
  )
)
Источник Automatically filling out the Drawing Property from Titleblock Information
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 16.10.2013 в 09:29. Причина: Правка по замечаниям #11
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.06.2013, 00:17
#7
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
Отправить сообщение для Kirill_Ja с помощью ICQ


В общем не стал сильно усложнять.
Получилось так:


Код:
[Выделить все]
 
       (vl-remove-if-not (function (lambda (x)
			(and (= 'ENAME (type x)) (member (vla-get-EffectiveName (vlax-ename->vla-object x)) ss_filter))
      
			      ))
  (mapcar 'cadr (ssnamex (ssget "_X" (list (cons 0 "insert"))))))
Kirill_Ja вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.10.2013, 01:04
#8
AndruxaZ


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Есть.
Код:
[Выделить все]
(ssget "_X"
  (list
    (cons 0 "INSERT")
    (cons 2 (LM:BlockList->Str (cons "TITLEBLOCK" (AnonymousInstancesof "TITLEBLOCK")) ","))
    (cons 66 1)
  )
)
Недостающие функции в этой теме: Automatically filling out the Drawing Property from Titleblock Information
Владимир, а подскажите куда нужно вводить имя блоков, которые должны попасть в выбор?
AndruxaZ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.10.2013, 08:30
#9
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


http://www.cad.dp.ua/sovets/lisp-functions/blockset.php
Наверняка чего то найдешь тут
nolte вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 14.10.2013, 16:12
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,690
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
Владимир, а подскажите куда нужно вводить имя блоков, которые должны попасть в выбор?
Обновил #6
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 15.10.2013, 09:48
#11
AndruxaZ


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Обновил #6
Владимир, относительно кода из #6. Заметил следующее. После открытия файла с уже вставленными динамическими блоками код работает, но стоит только удалить хоть один блок выдаёт ошибку - неверный тип аргумента: VLA-OBJECT nil. Что-то можете прокомментировать или же к автору (Lee Mac) кода нужно обращаться. Если что, то vla-load-com выполнен.
AndruxaZ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 15.10.2013, 11:59
#12
Дима_

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


Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
Если что, то vla-load-com выполнен.
если именно он выполнен, то неудивительно
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 15.10.2013, 12:39
#13
AndruxaZ


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


Так, и как это можно исправить?? Я только что проверил, запустил функцию (AnonymousInstancesof "TITLEBLOCK") из VLISPa. Сначала сработала, удалил один объект - таже ошибка. "vla-load-com" не вводил...
AndruxaZ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 15.10.2013, 18:21
#14
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 164
Отправить сообщение для Эдуард с помощью ICQ


Всем привет!
Цитата:
В авто\визал-лиспе нет, через Arx/.Net можно сразу получить список всех вхождений по блоку.
Позвольте с Димой не согласиться.
Набрасал на коленке ,поэтому извините за корявый код.
Результат - список в котором членами являются списки типа '(имя блока entity name всех insert-ов)
Код:
[Выделить все]
 
(defun es_insert_list (/ list_insert)
    (vlax-map-collection
    (vla-get-blocks
      (vla-get-ActiveDocument (vlax-get-acad-object))
    )

    '(lambda (x)
       (setq list_insert
	      (cons
		(mapcar	'cdr
			(vl-remove-if-not
			  '(lambda (y)
			     (or
			       (= (car y) 2)
			       (= (car y) 331)
			     )
			   )
			  (entget (vlax-vla-object->ename x))
			)

		)

		list_insert
	      )
       )
     )
  )
  (vl-remove-if '(lambda (z) (= (length z) 1)) list_insert)
)

Последний раз редактировалось Эдуард, 15.10.2013 в 20:33.
Эдуард вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 16.10.2013, 09:30
#15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,690
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
но стоит только удалить хоть один блок выдаёт ошибку - неверный тип аргумента: VLA-OBJECT nil.
Внес изменения в #6
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 16.10.2013, 10:15
#16
AndruxaZ


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Внес изменения в #6
Теперь всё работает. Большущее спасибо Владимир !
AndruxaZ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 16.10.2013, 12:34
#17
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 164
Отправить сообщение для Эдуард с помощью ICQ


Привет.
А мы не ищем легких путей. Предлагаю еще одно нестандартное решение данной задачи.
Определяем зависимость анонимных блоков от динамического в таблице блоков и составляем список их имен используя только объектный метод.
Код:
[Выделить все]
 
(defun es_depend_blocks	(dyn_block_name	     /
			 blocks_base	     dyn_block_name_handl
			 handle_block	     name_item_list
			)
  (setq	blocks_base
	 (vla-get-blocks
	   (vla-get-ActiveDocument (vlax-get-acad-object))
	 )
  )
  (if
    (and
      (tblsearch "block" dyn_block_name)
      (setq dyn_block_name_handl
	     (vla-item blocks_base
		       dyn_block_name
	     )


	    dyn_block_name_handl
	     (vla-get-Handle dyn_block_name_handl)

      )
    )

     (vlax-for item blocks_base
       (vla-getxdata item "AcDbBlockRepBTag" 'tdata 'vdata)
       (if
	 (and
	   tdata
	   (setq handle_block
		  (vlax-variant-value
		    (last
		      (vlax-safearray->list vdata)
		    )
		  )
	   )
	   (= dyn_block_name_handl handle_block)
	 )
	  (setq name_item_list (cons (vla-get-name item) name_item_list))
       )
     )
  )
  name_item_list
)
Эдуард вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 16.10.2013, 13:41
#18
Дима_

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


Цитата:
Сообщение от Эдуард Посмотреть сообщение
Позвольте с Димой не согласиться.
DXF DXF - да там периодически можно найти удивительные вещи... жаль документация хромает (я до сего момента думал, что эта "индексация", доступная из ARX/Net, только в памяти кэшируется), а нет... Интересно для чего она в "базе"?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.10.2013, 11:58
#19
AndruxaZ


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


Вот ещё один вариант, предложенный тем же Lee Mac - http://lee-mac.com/getanonymousreferences.html
AndruxaZ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.10.2013, 13:17
#20
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 164
Отправить сообщение для Эдуард с помощью ICQ


Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
Вот ещё один вариант, предложенный тем же Lee Mac - http://lee-mac.com/getanonymousreferences.html
Этот метод аналогичен моему посту 16.10.2013, 08:34.
Идет анализ РД анонимного блока записанных в приложение "AcDbBlockRepBTag" (1005 . "хендл динамического блока от которого зависит анонимный) , только используется чисто entity подход.
У кого есть еще варианты ?
Эдуард вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Выбор динамических блоков с атрибутам скопом.

КОМПОЗИТНЫЕ ПАНЕЛИ ДЛЯ ФАСАДА
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 669 24.03.2017 20:16
Выбор динамических блоков по значению линейного параметра aso3 Программирование 15 01.10.2015 22:13
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 12 10.09.2015 14:31
Библиотека динамических блоков + XML + Lisp = I-Draw ( первая web палета инструментов ) gabrin AutoCAD 55 24.05.2013 11:32
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||