Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

LISP. Как найти блоки в блоках?

Ответ
Поиск в этой теме
Непрочитано 03.07.2015, 05:57 #1
LISP. Как найти блоки в блоках?
Krieger
 
инженер (КМ)
 
Красноярск
Регистрация: 30.10.2004
Сообщений: 3,826

Как найти блоки в блоках?
1. Есть некий блок bloсk1, который входит в состав блоков block2-1, block2-2 и т. д. Нужно выбрать все блоки в состав которых входят блоки bloсk1.
2. Получить список всех блоков (bloсk1-1, bloсk1-2 и т.д.) входящих в блок (block2-1).

Наверняка кто-то решал подобные задачки, поделитесь примером.

Может быть как то штатными средствами можно это решить? Я вижу только один - расчленить все и найти qselect-ом. Потом все восстанавливать. Но это долго и не удобно.
__________________
Делай хорошо, плохо само получится.
Просмотров: 2040
 
Непрочитано 03.07.2015, 09:14
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Что-то наподобие
Код:
[Выделить все]
 (vl-load-com)

(defun tt (blk-name / res f)
  (defun f (ent)
    (if (vlax-property-available-p ent 'effectivename)
      (vla-get-effectivename ent)
      (vla-get-name ent)
      ) ;_ end of if
    ) ;_ end of defun

  (vlax-for blk_def (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vlax-for subent blk_def
        (if (and (wcmatch (strcase (vla-get-objectname subent)) "*BLOCKREF*")
                 (wcmatch (strcase (f subent)) (strcase blk-name))
                 (not (member (f blk_def) res))
                 ) ;_ end of and
          (setq res (cons (f blk_def) res))
          ) ;_ end of if
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  res
  ) ;_ end of defun
Код не тестировал. blk-name - полное имя искомого блока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 03.07.2015 в 12:20.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.07.2015, 11:35
#3
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Спасибо. А что этот код делает? Что то не могу я в него врубиться. Выдает nil.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 03.07.2015, 11:48
#4
Кулик Алексей aka kpblc
Moderator

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


Образец файла приложи, попробую проверить. И укажи, какой блок ищешь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.07.2015, 12:06
#5
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Например, ищу кружочки.
Вложения
Тип файла: dwg
DWG 2010
Пример.dwg (61.9 Кб, 560 просмотров)
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 03.07.2015, 12:20
#6
Кулик Алексей aka kpblc
Moderator

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


Код исправил - звездочку одну забыл ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.07.2015, 13:08
#7
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Спасибо. Теперь работает. Список создается, дальше допилю.

А по второму пункту не поможешь? Нужен список блоков 1-го уровня вложенности в блоке, например, "Набор1".
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 03.07.2015, 13:10
#8
Кулик Алексей aka kpblc
Moderator

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


Если коротко: получаешь указатель на описание блока, проходишь по всем элементам блока. Если элемент удовлетворяет каким-либо требованиям - то его в результирующий список.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.07.2015, 13:30
#9
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Спасибо. Сам я долго копать буду...
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 03.07.2015, 13:49
1 | #10
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (vl-load-com)

(defun tt1 (/ f ent res)
  (defun f (ent)
    (if (vlax-property-available-p ent 'effectivename)
      (vla-get-effectivename ent)
      (vla-get-name ent)
      ) ;_ end of if
    ) ;_ end of defun

  (if (and (setq ent (car (entsel "\nSelect block <Cancel> : ")))
           (= (cdr (assoc 0 (entget ent))) "INSERT")
           ) ;_ end of and
    (vlax-for subent (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                               (f (vlax-ename->vla-object ent))
                               ) ;_ end of vla-item
      (if (and (= (vla-get-objectname subent) "AcDbBlockReference")
               (not (member (f subent) res))
               ) ;_ end of and
        (setq res (cons (f subent) res))
        ) ;_ end of if
      ) ;_ end of vlax-for
    ) ;_ end of if
  (vl-sort res '<)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.07.2015, 14:11
#11
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Спасибо. Ты лучший.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 04.07.2015, 11:30
#12
VVA

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


Еще похожие темы
Find nested blocks
Nested Block Counter
Как lisp-ом вывести список вхождений блоков?
Extract Nested Block
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как найти блоки в блоках?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск скрытых атрибутов в динамических блоках dip Программирование 5 22.06.2012 11:43
Как найти блоки по имени динамического свойства? Klo Программирование 2 11.10.2011 13:42
LISP. Как найти точку пересечения полилинии и сплайна или другой полилинии? LastGraff LISP 11 09.09.2011 13:23
найти все блоки, и сохранить их кол-во элементов Юрий_2007z Программирование 8 07.05.2009 17:12