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

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

(Lisp) Работа с объектами внутри блоков

Ответ
Поиск в этой теме
Непрочитано 03.04.2014, 23:18 #1
(Lisp) Работа с объектами внутри блоков
maotai
 
Регистрация: 29.11.2011
Сообщений: 5

Добрый день!

Нужна помощь. Подскажи где поискать инфу о структуре блоков в автокаде (lisp) и методах работы с его внутренностями.
Мне нужно получить набор объектов внутри блока, для того чтобы впоследствии посчитать нужные мне элементы не разбивая блоки с ними.

Кратко о том зачем это нужно:

При проектировании мы используем многоуровневые динамические блоки.
Внутри динамических блоков существуют обычные блоки, которые требуется посчитать для составления спецификации (они имеют имена с уникальным тегом, позволяющим отличить их от остальных объектов на чертеже).

На данный момент мне приходится разбивать динблоки, так как blockcount не считает объекты внутри них.
После этого трудоемкость внесения изменений в чертеж возрастает многократно.
Просмотров: 5248
 
Непрочитано 04.04.2014, 08:55
#2
Кулик Алексей aka kpblc
Moderator

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


DXF Reference -> Block entity (а не INSERT)
ActiveX -> (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "<BlockName>")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.04.2014, 10:10
#3
maotai


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


Спасибо за оперативный ответ! Все работает и через item и через vlax-for, но в этом случае мы работаем с общим описание блока.
Как быть с конкретным блоком на чертеже имеющим динамические свойствами, а именно динмассивы, содержащие объекты подсчета.

То есть в каждом вхождении блока размещенном на чертеже есть разное кол-во объектов.

----- добавлено через ~6 мин. -----
И еще один момент..vla-item выдает объект по ключу и можно составить список всех объектов перебирая item по индексу до первой ошибки.
Но неужели нет возможности сразу получить весь набор объектов семейства конкретного блока?

(vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "<BlockName>")
maotai вне форума  
 
Непрочитано 04.04.2014, 10:46
#4
Кулик Алексей aka kpblc
Moderator

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


http://autolisp.ru/wp-content/upload...k-in-block.lsp
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.04.2014, 10:48
#5
Дима_

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


Цитата:
Сообщение от maotai Посмотреть сообщение
...мы работаем с общим описание блока. Как быть с конкретным блоком на чертеже имеющим динамические свойствами...
Но неужели нет возможности сразу получить весь набор объектов семейства конкретного блока?
1. Изменение параметров динамического блока ведет к фоновому созданию нового описания анонимного блока (то есть блока с новым именем - см. различие свойств Name и EffectiveName) вот его и надо анализировать.
2. Можно его "собрать" например через vlax-for.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.04.2014, 14:54
#6
maotai


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


То что надо! Спасибо!!!
maotai вне форума  
 
Непрочитано 25.10.2018, 11:41
#7
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


не получилось мне добраться до внутренностей блока с помощью
Цитата:
Сообщение от maotai Посмотреть сообщение
Код:
[Выделить все]
 (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "<BlockName>")
всё это можно заменить функциями
Код:
и
Код:
[Выделить все]
 (CAR (ENTSEL))
далее либо
Код:
либо
Код:
[Выделить все]
 (SETQ vla_obj (vlax-ename->vla-object obj))
(vlax-dump-Object vla_obj )
что в свою очередь выдает:
Код:
[Выделить все]
 (
 (-1 . <Имя объекта: 7fffc690010>)
  (0 . "INSERT")
  (330 . <Имя объекта: 7fffd2ec9f0>)
  (5 . "3D1")
  (100 . "AcDbEntity")
  (67 . 0)
  (410 . "Model")
  (8 . "0")
  (100 . "AcDbBlockReference")
  (2 . "A$C4E9E243C")
  (10 370.049 110.037 0.0)
  (41 . 1.0)
  (42 . 1.0)
  (43 . 1.0)
  (50 . 0.0)
  (70 . 0)
  (71 . 0)
  (44 . 0.0)
  (45 . 0.0)
  (210 0.0 0.0 1.0)
)
и
Код:
[Выделить все]
 #<VLA-OBJECT IAcadBlockReference 00000000de9d3238> 
; IAcadBlockReference: Интерфейс AutoCAD для работы с вхождениями блоков.
; Значения свойств:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 000000013fffd910>
;   Document (RO) = #<VLA-OBJECT IAcadDocument 00000000b0d825e8>
;   EffectiveName (RO) = "A$C4E9E243C"
;   EntityTransparency = "ПоСлою"
;   Handle (RO) = "3D1"
;   HasAttributes (RO) = 0
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000000017ecac1f8>
;   InsertionPoint = (370.049 110.037 0.0)
;   InsUnits (RO) = "Дюймы"
;   InsUnitsFactor (RO) = 1.0
;   IsDynamicBlock (RO) = 0
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   Name = "A$C4E9E243C"
;   Normal = (0.0 0.0 1.0)
;   ObjectID (RO) = 207976
;   ObjectID32 (RO) = 207976
;   ObjectName (RO) = "AcDbBlockReference"
;   OwnerID (RO) = 132556
;   OwnerID32 (RO) = 132556
;   PlotStyleName = "ByLayer"
;   Rotation = 0.0
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 000000017ecadf90>
;   Visible = -1
;   XEffectiveScaleFactor = 1.0
;   XScaleFactor = 1.0
;   YEffectiveScaleFactor = 1.0
;   YScaleFactor = 1.0
;   ZEffectiveScaleFactor = 1.0
;   ZScaleFactor = 1.0

T 
_$ 
соответственно...
А вот что дальше? куда копать где найти эти вложенные блоки...я незнаю... по всем красным веткам акадовского дерева лазил ничего не нашел!!! и тут (330 . <Имя объекта: 7fffd2ec9f0>) и тут Application (RO) = #<VLA-OBJECT IAcadApplication 000000013fffd910> да и не только тут... ничего не вышло(((
__________________
Вечность это:
 (while T)
OKJI вне форума  
 
Непрочитано 25.10.2018, 12:16
#8
RrRR


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


Ты можешь немного с другой стороны посмотреть на блоки.
В примитивном командном стиле, может это тебя подтолкнет в нужную сторону.
Смотри, в каде есть команды типа:

Код:
[Выделить все]
 (command "-BEDIT" blk_name)
Открываем блок на редактирования (параметр - его имя)

+ команды:
Код:
[Выделить все]
 (command "_BSAVE")
(command "_BCLOSE") 
т.е. после проделанной работы в редакторе, сохраняем и закрываем.

Для проверки в редакторе ли мы (сработают ли BSAVE, BCLOSE) можно так:

Код:
[Выделить все]
 (if (= (getvar "BLOCKEDITOR") 1)
 …
)
RrRR вне форума  
 
Непрочитано 25.10.2018, 12:30
#9
trir


 
Регистрация: 18.12.2010
Сообщений: 5,057


Цитата:
всё это можно заменить функциями
нельзя, ты получил вставку блока, а нужно - описание
trir вне форума  
 
Непрочитано 25.10.2018, 12:42
#10
Кулик Алексей aka kpblc
Moderator

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


OKJI, тебе надо осознать разницу между описанием блока и его вставкой вхождением.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.10.2018, 14:18
#11
OKJI

AutoLISP
 
Регистрация: 19.06.2018
Харьков
Сообщений: 101
Отправить сообщение для OKJI с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
OKJI, тебе надо осознать разницу между описанием блока и его вставкой вхождением.
Вроде понимаю.... Описание блока, это шаблон для наполнения то есть если изменить описание блока изменишь все блоки в документе
А вхождение - это набор параметров и свойств в рамках изначального шаблона которые можно менять индивидуально для каждого вставленного блока/вхождения...
__________________
Вечность это:
 (while T)
OKJI вне форума  
 
Непрочитано 25.10.2018, 14:38
#12
Кулик Алексей aka kpblc
Moderator

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


И что тогда в твоем коде делают entlast, entsel и иже с ними?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.10.2018, 15:22
#13
Vladimir_Sergeevich

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


IAcadBlockReference - примитив, то что видно на чертеже. Из него можно вытащить имя описания блока
(vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "<BlockName>;") вернет IAcadBlock - описание блока.
У описания блока есть свойство Database в котором лежат примитивы входящие в блок... дальше как с матрешкой.

entlast это вообще причем?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > (Lisp) Работа с объектами внутри блоков

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Простановка площадей внутри полилинии. Klo LISP 26 14.12.2018 17:43
Как удалить определенный элемент (в данном случае Raster Image) внутри всех блоков не разрушая их? Victor_Sh AutoCAD 10 01.08.2012 11:29
Изменить параметры у всех объектов внутри блоков 800x600 AutoCAD 5 25.03.2008 14:21
Работа с примитивами внутри блока. Toy AutoCAD 22 16.04.2007 21:22
Отображение точек внутри блоков Кулик Алексей aka kpblc AutoCAD 14 12.12.2006 14:37