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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA в AutoCAD

VBA в AutoCAD

Закрытая тема
Поиск в этой теме
Непрочитано 27.12.2005, 21:04
VBA в AutoCAD
alle
 
Регистрация: 11.08.2005
Сообщений: 921

Уважаемые коллеги
Посоветуйте литературу и проч. по использованию VBA для разработки пользовательских приложений применительно к AutoCAD
Просмотров: 17903
 
Непрочитано 15.03.2010, 22:31
#21
Кулик Алексей aka kpblc
Moderator

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


http://www.arcada.com.ua/forum/viewtopic.php?t=653
Offtop: Cейчас в раздумках - вносить статью на сайт autolisp или нет...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2014, 21:26
#22
michvp


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


Очень нужно! Раньше с атрибутами не связывался, не было нужды...
Мне нужно, выделив блок, забрать в MsgBox или в текстовое окно на форме значение атрибута блока.
michvp вне форума  
 
Непрочитано 29.11.2014, 21:38
#23
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от michvp Посмотреть сообщение
Очень нужно!
Вот для начала пример, а далее уже добавите что требуется.
maratovich вне форума  
 
Непрочитано 30.11.2014, 18:12
#24
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Если хотите писать на VBA под 64битный автокад старых версий (вроде в 2014 только новый VBA появился) - то ожидайте "приятных" сюрпризов. Так как нормального 64битного VBA в старых версиях нет, есть лишь обертки над 32битным.. И поэтому может быть все что угодно - у меня "последней каплей" стало периодическое пропадание стандартных функций типа "Mid" во время вызова макросов)
Сергей812 вне форума  
 
Непрочитано 30.11.2014, 19:26
#25
michvp


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


Мне нужно просто переменной присвоить значение атрибута блока, который будет выделен мышкой. На сегодняшний день я вынужден вначале запускать Lisp-программу, которая атрибуты переводит в однострочный текст, а потом МОЕЙ программой на VBA забирать этот текст куда мне надо. Я очень хочу уйти от использования Lisp программы, так как не хочу разрушать блоки.
michvp вне форума  
 
Непрочитано 30.11.2014, 19:39
#26
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Ваше право, хотя чем больше занимаюсь лиспом - тем больше очаровываюсь его элегантностью) Хотя сложные вещи - однозначно NET (из знакомых технологий), имхо.
У вас блок статический, динамический?

----- добавлено через ~9 мин. -----
Точнее атрибут. Для статических атрибутов будет выглядеть примерно так код

Сейчас в блокноте напишу примерный код) А то глючит форма ввода

----- добавлено через ~7 мин. -----
В общем, примерно (написан на коленке) такой код:
Код:
[Выделить все]
Dim lBlock As AcadBlockReference
Dim lAttrBlock As Object
Dim I1 As Integer

'Если у блока есть атрибут
If (lBlock.HasAttributes) Then
	' Получаем атрибуты блока   
	lAttrBlock = lBlock.GetAttributes()
   	For I1 = 0 To UBound(lAttrBlock)
		if(lAttrBlock(I1).TagString = "%Имя атрибута откуда взять значение%")then
			' И получаем значение атрибута
			% Ваша переменная %=lAttrBlock(I1).TextString
                        Exit For
		End If	

   	Next I1
End If
можете оформить в виде функции, принимающей ссылку на блок ( lBlock) и (Название атрибута), можете так использовать.

----- добавлено через ~4 ч. -----
Да, если где то будет ругаться при присваивании - что типа требуется объект, то перед переменной ставите Set %Переменная% = %Выражение%. Выдирал из старого проекта на VB.NET, там чуть синтаксис отличается.

Последний раз редактировалось Сергей812, 30.11.2014 в 19:59. Причина: Добавил выход из цикла
Сергей812 вне форума  
 
Непрочитано 01.12.2014, 07:59
#27
michvp


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


К сожалению код в среде VBA не работает (дает ошибку) VB.net я не знаю. У меня много разных наработок на VBA и очень не хватает теперь этой возможности получить атрибут. Кстати блок у меня динамический, тег у блока например
"WWWW", нужно нажать кнопку на моей форме (немодальной), указать мышкой блок и получить в окне формы значение атрибута
michvp вне форума  
 
Непрочитано 01.12.2014, 08:10
#28
michvp


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


К сожалению код на VBA не работает.
michvp вне форума  
 
Непрочитано 01.12.2014, 08:31
#29
trir


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


Цитата:
Сообщение от michvp Посмотреть сообщение
К сожалению код на VBA не работает.
Какой?
trir вне форума  
 
Непрочитано 01.12.2014, 08:38
#30
michvp


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


Код "Сергей812" на VBA не работает. Мне нужно получит value атрибута блока, который я выделю мышкой

Dim lBlock As AcadBlockReference
Dim lAttrBlock As Object
Dim I1 As Integer

'Если у блока есть атрибут
If (lBlock.HasAttributes) Then
' Получаем атрибуты блока
lAttrBlock = lBlock.GetAttributes()
For I1 = 0 To UBound(lAttrBlock)
if(lAttrBlock(I1).TagString = "%Имя атрибута откуда взять значение%")then
' И получаем значение атрибута
% Ваша переменная %=lAttrBlock(I1).TextString
Exit For
End If

Next I1
End If
michvp вне форума  
 
Непрочитано 01.12.2014, 08:44
#31
trir


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


Цитата:
который я выделю мышкой
Где? Не вижу!
trir вне форума  
 
Непрочитано 01.12.2014, 09:00
#32
michvp


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


У меня есть в модели блоки с атрибутами, например блок в виде круга и атрибут - цифра. Например геодезические отметки. Мне нужно например в MsgBox вывести значение атрибута (цифры-отметки).
michvp вне форума  
 
Непрочитано 01.12.2014, 09:08
#33
trir


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


Цитата:
Сообщение от michvp Посмотреть сообщение
У меня есть в модели блоки с атрибутами, например блок в виде круга и атрибут - цифра. Например геодезические отметки. Мне нужно например в MsgBox вывести значение атрибута (цифры-отметки).
И?

Код:
[Выделить все]
   Dim returnObj As AcadObject
   Dim basePnt As Variant
   ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object"
   If returnObj.ObjectName = "AcDbBlockReference" Then
    MsgBox "good"
   End If
trir вне форума  
 
Непрочитано 01.12.2014, 10:02
#34
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от michvp Посмотреть сообщение
К сожалению код на VBA не работает.
Чего именно не работает? И на этапе компиляции программы ругается, или ничего не делает? Если второе - переменной lBlock было присвоено значение?
Сергей812 вне форума  
 
Непрочитано 01.12.2014, 10:02
#35
Кулик Алексей aka kpblc
Moderator

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


trir, может, не GetEntity, а GetSubEntity?
Код:
[Выделить все]
Sub Example_GetSubEntity()
    ' This example prompts the user to select on object on the screen with a mouse click,
    ' and returns some information about the selected object.
    
    Dim Object As Object
    Dim PickedPoint As Variant, TransMatrix As Variant, ContextData As Variant
    Dim HasContextData As String
    
    On Error GoTo NOT_ENTITY
        
TRYAGAIN:
        
    MsgBox "Use the mouse to click on an object in the current drawing after dismissing this dialog box."
        
    ' Get information about selected object
    ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData
    
    ' Process and display selected object properties
    HasContextData = IIf(VarType(ContextData) = vbEmpty, " does not ", " does ")
    
    MsgBox "The object you chose was an: " & TypeName(Object) & vbCrLf & _
            "Your point of selection was: " & PickedPoint(0) & ", " & _
                                              PickedPoint(1) & ", " & _
                                              PickedPoint(2) & vbCrLf & _
            "This object" & HasContextData & "have nested objects."
    
    Exit Sub
    
NOT_ENTITY:
    ' If you click on empty space or do not select an entity,
    ' this error will be generated
    If MsgBox("You have not selected an object.  Click OK to try again.", _
               vbOKCancel & vbInformation) = vbOK Then
        Resume TRYAGAIN
    End If
End Sub
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.12.2014, 11:42
#36
michvp


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


Код работает, только мне нужно, чтобы еще в MsgBox заходило значение атрибута блока, когда я на нем щелкну курсором в виде квадратика.
Данный код пишет, что объект - атрибут и дает координаты, а нужно ЗНАЧЕНИЕ конкретного атрибута
michvp вне форума  
 
Непрочитано 01.12.2014, 11:49
#37
Кулик Алексей aka kpblc
Moderator

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


Получи указатель на вхождение атрибута и сними TextString (кажется, так).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.12.2014, 12:02
#38
michvp


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


Не совсем понятно, что нужно сделать...
Если бы у меня был не атрибут, а однострочный текст, то переменной txt присваивается значение:
txt = ActiveDocument.ActiveSelectionSet.Item(0).textString
А как у атрибута это же сделать?
michvp вне форума  
 
Непрочитано 01.12.2014, 12:13
#39
trir


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


michvp, тебе просто надо скрестить код Кулик Алексей aka kpblc и Сергей812 (а именно методом GetSubEntity получить блок в переменую lBlock)
trir вне форума  
 
Непрочитано 01.12.2014, 13:17
#40
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


че то типа где то как то..
Код:
[Выделить все]
Dim returnObj As AcadObject, Attr
Dim basePnt As Variant
ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object"
If returnObj.ObjectName = "AcDbBlockReference" Then
 For Each Attr In returnObj.GetAttributes
   If Attr.TagString = "(имя нужного атрибута)" Then
	msgbox Attr.TextString
   End If
 next
End If
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
Закрытая тема
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA в AutoCAD