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

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

Обращение к выбранному блоку

Ответ
Поиск в этой теме
Непрочитано 26.03.2011, 08:24 #1
Обращение к выбранному блоку
serg72
 
Регистрация: 26.03.2011
Сообщений: 13

Уважаемые форумчане! Окажите помощь новичку. Как мне обратиться к выбранному в чертеже объекту (блоку) чтобы в макросе VBA изменить его атрибуты. Для нового вставляемого блока есть примеры - там мне все понятно, а вот как быть с уже выбранным?
Просмотров: 4220
 
Непрочитано 26.03.2011, 08:37
#2
trir


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


А в чём проблема? К выбранному - через текущий SelectSet.
trir вне форума  
 
Непрочитано 26.03.2011, 09:42
#3
casemsot

Архитектор
 
Регистрация: 12.10.2004
Новосибирск
Сообщений: 1,139


Offtop: Глукоуважаемый, ваше благородие мой избранник! Разрешите пожалуйста к Вам обратиться....
casemsot вне форума  
 
Автор темы   Непрочитано 26.03.2011, 10:02
#4
serg72


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


Пробую так:

Dim blockRefObj As AcadBlockReferenc
Dim sset As AcadSelectionSet
Dim currXScaleFactor As Double

Set sset = ThisDrawing.ActiveSelectionSet
currXScaleFactor = blockRefObj.XScaleFactor

Как теперь от sset перейти к blockRefObj чтобы менять свойства блока?
serg72 вне форума  
 
Непрочитано 26.03.2011, 10:09
#5
gomer

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


Цитата:
Сообщение от casemsot Посмотреть сообщение
Глукоуважаемый, ваше благородие мой избранник! Разрешите пожалуйста к Вам обратиться....
Цитата:
Сообщение от serg72 Посмотреть сообщение
Для нового вставляемого блока есть примеры - там мне все понятно, а вот как быть с уже выбранным?
Читайте справку и начинайте уже думать!!! У каждого объекта есть методы и свойства... Посмотрите свойство Attributes у объекта BlockRef (экземпляр блока)! Нету??? А методы какие есть?
зы код из #4 работать не будет
gomer вне форума  
 
Непрочитано 26.03.2011, 10:18
#6
trir


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


AcadSelectionSet - это коллекция, перебираем её в поисках нашего блока, получаем его как блок и работаем
trir вне форума  
 
Непрочитано 26.03.2011, 10:23
#7
gomer

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


Цитата:
Сообщение от trir Посмотреть сообщение
AcadSelectionSet - это коллекция, перебираем её в поисках нашего блока, получаем его как блок и работаем


Цитата:
Сообщение от gomer Посмотреть сообщение
Читайте справку и начинайте уже думать!!!
Для кого есть метод GetEntity ?
gomer вне форума  
 
Непрочитано 26.03.2011, 12:00
#8
Олег (jr.)

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


Цитата:
Сообщение от serg72 Посмотреть сообщение
Уважаемые форумчане! Окажите помощь новичку. Как мне обратиться к выбранному в чертеже объекту (блоку) чтобы в макросе VBA изменить его атрибуты. Для нового вставляемого блока есть примеры - там мне все понятно, а вот как быть с уже выбранным?
Код:
[Выделить все]
Option Explicit
' change all attributes
' based on Tony Tanzillo's code
Public Function GatteEx(ByRef objBlk As AcadBlockReference, _
                              tagArr As Variant, valArr As Variant)
     Dim attVar As Variant
     Dim objAtt As AcadAttributeReference
     Dim i As Long, j As Long
     attVar = objBlk.GetAttributes
     If UBound(attVar) <> UBound(tagArr) Or _
        UBound(valArr) <> UBound(tagArr) Then
          MsgBox "Error with array"
          Exit Function
     End If
     For i = LBound(attVar) To UBound(attVar)
          Set objAtt = attVar(i)
          For j = LBound(tagArr) To UBound(tagArr)
               If objAtt.TagString = tagArr(j) And _
                  valArr(j) <> "" Then
                    objAtt.TextString = valArr(j)
               End If
          Next j
     Next i
     objBlk.Update

End Function

' Usage example:
Sub DoStuff()
Dim oEnt As AcadEntity
Dim varPt, tagArray, valueArray ' all are variants
Dim blk As AcadBlockReference
ThisDrawing.Utility.GetEntity oEnt, varPt, "Select block"
Set blk = oEnt
' tag array:
tagArray = Array("TAG1", "TAG2", "TAG3", "TAG4") ' <--your attributes tags here
' to change all the attributes:
valueArray = Array("0.001", "0.002", "0.003", "0.004") ' <--your attributes values here
' but if you need to change certain attributes only
' you can pass empty string in place where you do not want
' to change these attributes, i. e.:
' valueArray = Array("0.001", "0.002", "", "0.004") ' <-- the second attribute tag was omitted
' you can get these both arrays from excel sheet, i.e.
' tags= Sheet1.Range("A1:D1").Value
' values= Sheet1.Range("A2:D2").Value or something similar on it
GatteEx blk, tagArray, valueArray
' or you can call it like this (argumments are inside of parenthesises):
' Call GatteEx( blk, tagArray, valueArray)
End Sub]
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 02.04.2011, 09:24
#9
serg72


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


Всем спасибо за помощь. Получилось через GetEntity. Сейчас возникла другая проблема в лиспе не получается переименовать блок.

_$ (setq blk (vlax-ename->vla-object (car (entsel "/nУкажите блок"))))
#<VLA-OBJECT IAcadBlockReference 2e2cb5b4>
_$ (vla-put-name blk "0")
; ошибка: Ошибка Automation. Ключ не найден
serg72 вне форума  
 
Непрочитано 02.04.2011, 09:36
#10
trir


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


Переименовать блок можно, только если нет его вхождений.
trir вне форума  
 
Автор темы   Непрочитано 02.04.2011, 09:48
#11
serg72


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


Цитата:
Сообщение от trir Посмотреть сообщение
Переименовать блок можно, только если нет его вхождений.
Как раз уменя вхожнение в блок. Может есть другие способы, ведь в Acad есть возможность вручную переименовать блок.
serg72 вне форума  
 
Непрочитано 02.04.2011, 10:14
#12
trir


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


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

BlockRef: A block reference can be assigned the name of only a valid block definition in the drawing. Assigning a block reference a unique name will not automatically create a new block definition. To create a new block definition, use the Add method to add a new Block object to the Blocks collection.
trir вне форума  
 
Непрочитано 02.04.2011, 10:20
1 | #13
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от trir Посмотреть сообщение
Переименовать блок можно
В любом случае. Вручную: _.rename. Программно - просто надо работать с описаниями блоков, а не с вхождениями:
Код:
[Выделить все]
 (vla-put-name (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-effectivename (vlax-ename->vla-object (car (entsel "\nSelect block : "))))) "Новое имя")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.04.2011, 11:53
#14
serg72


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


Спасибо за помощь, все понял.
serg72 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Обращение к выбранному блоку



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp. Присвоение блоку атрибута и Z из текста. Ancient John LISP 31 20.02.2023 17:20
Как задать блоку с атрибуты? kosolapi AutoCAD 20 02.12.2009 13:54
Как получить текст пояснения к блоку? mmmx Программирование 13 13.12.2006 03:47
ACAD 2006 виснет при попытке объектной привязки к блоку Tramp AutoCAD 1 16.03.2006 09:29