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

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

VBA. Редактирование аттрибутов блока.

Ответ
Поиск в этой теме
Непрочитано 23.09.2009, 16:35
VBA. Редактирование аттрибутов блока.
Bart
 
Регистрация: 23.07.2009
Сообщений: 35

Пишу программу на VBA. Задача поставлена такая: задавать данные и должен формироваться шкаф (система управления) и куча чертежей к нему на основе входящих данных. Хотят, чтобы нажал кнопку и все само нарисовалось.
В VBA я не силен. Написал одну програмку лет 5 назад.

Начал я с эл. схемы. Задаю количество источников питания, нажимаю OK и вставляется определенное количество блоков. Там обозначения, нумерация, маркировка проводов. Все сделано аттрибутами. Как мне эти аттрибуты изменять при вставке автоматом? Там к значению просто +1 прибавляется у 5 аттрибутов. Как до аттрибутов добраться?
Просмотров: 8894
 
Непрочитано 24.09.2009, 15:26
#21
Кулик Алексей aka kpblc
Moderator

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


Интегрируется как обычная .NET-сборка. Но с Express Edition лучше уточнять - на caduser.ru А.Ривилис говорил по этой теме.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.09.2009, 16:37
#22
Bart


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


Попробую сделать это все на .net. От VBA откажусь.
Различия большие?

Сижу ищи и не могу найти как прогу из VBA в VB.net конвертнуть. Пока кроме видео ничего не нашел. А видео у меня не показывает.

Последний раз редактировалось Bart, 24.09.2009 в 17:22.
Bart вне форума  
 
Непрочитано 24.09.2009, 16:41
#23
AlexV

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


Цитата:
Сообщение от Bart Посмотреть сообщение
Попробую сделать это все на .net. От VBA откажусь.
Различия большие?
Вообще, интересно было бы глянуть на какую-нибудь открытую простенькую vb.net сборку... Может, кто покажет, с чем его едят? И можно ли VBA-шные модули как-то с минимальными затратами импортировать в net?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 24.09.2009, 17:44
#24
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


По поводу перехода с VBA на VB.NET: http://through-the-interface.typepad...on-basics.html
А сборки есть в примерах в ObjectARX SDK.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 02.10.2009, 17:46
#25
Bart


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


А как все то же самое на vb.net пишется? Я пытаюсь просто блок вставить, но пока никак не найду как все описывается.

Покопался я во всяких обучалках, посмотрел лекции (почти ничего нет, нужно самому догадываться). Как-то все сложно в .net. Код получается раз в 5 больше, чем на VBA.
Попытаюсь что-либо сотворить. Если ничего не выйдет - брошу и буду делать на VBA. Литературы нет.
Хелп такой, что мало что описано.
На VBA на данный момент все гораздо доступнее.

Последний раз редактировалось Bart, 06.10.2009 в 17:26.
Bart вне форума  
 
Автор темы   Непрочитано 06.10.2009, 17:28
#26
Bart


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


Код вставки блока на vb.net ниже.

Последний раз редактировалось Bart, 24.11.2009 в 12:33.
Bart вне форума  
 
Непрочитано 11.10.2009, 02:31 VBA Редактирование аттрибутов блока
#27
CrazyBaby

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


Здравствуйте. Если в VBA есть средства создания элементов управления на пользовательской форме в момент выполнения программы , то IMHO должен существовать и способ создания событий типа "onclick" во время работы программы. Подскажите ,pls, какой?
CrazyBaby вне форума  
 
Непрочитано 11.10.2009, 09:08
#28
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от CrazyBaby Посмотреть сообщение
Если в VBA есть средства создания элементов управления на пользовательской форме в момент выполнения программы
А они есть?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.10.2009, 11:18
#29
AlexV

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А они есть?
Да, их есть.. В смысле, возможность создания контролов и кодов обработки событий программно...
http://www.caduser.ru/forum/index.ph...#message261100
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 22.10.2009, 15:47
#30
Bart


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


Переписал я свою программу на vb.net.
Написанный выше скрипт вставки блока и редактирования атрибутов работает, но я его немного изменил, а то не работал. Пришлось, конечно, посидеть и во всем разобраться.
Честно, скажу, не все понятно, но работает :-)

Ну и вот мой код.
Код:
[Выделить все]
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Public Class InsertBlock
    Public Shared Sub ImportBlock(ByVal BlockFile As String, ByVal BlockName As String)

        Dim myDwg As Document
        Dim myDwgLoc As DocumentLock
        Dim mySourceDB As New Database(False, False)
        Dim myActiveDB As Database
        'Read file and load block into current database
        Try
            myDwg = Application.DocumentManager.MdiActiveDocument
            myDwgLoc = myDwg.LockDocument()
            myActiveDB = myDwg.Database
            mySourceDB.ReadDwgFile(BlockFile, IO.FileShare.ReadWrite, True, "")
            myActiveDB.Insert(BlockName, mySourceDB, False)
            mySourceDB.Dispose()
            myDwgLoc.Dispose()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "AutoGen Error")
        End Try

    End Sub

    Public Shared Function InsertBlock(ByVal InsPt As Point3d, ByVal BlockName As String, Optional ByVal XScale As Double = 1.0, Optional ByVal YScale As Double = 1.0, Optional ByVal ZScale As Double = 1.0) As ObjectId

        Try
            Dim myTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager
            Dim myTrans As Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord
            Dim myAttColl As AttributeCollection
            Dim myEnt As Entity
            Dim myBTREnum As BlockTableRecordEnumerator
            Dim myDwgLoc As DocumentLock

            'Get active document and begin transaction
            myDwg = Application.DocumentManager.MdiActiveDocument
            myDwgLoc = myDwg.LockDocument()
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open Block Table
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForRead)
            myBTR = myBT(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite)

            'Insert the Block
            Dim myBlockDef As BlockTableRecord = myBT(BlockName).GetObject(OpenMode.ForRead)
            Dim myBlockRef As New BlockReference(InsPt, myBT(BlockName))
            myBlockRef.ScaleFactors = New Scale3d(XScale, YScale, ZScale)
            myBTR.AppendEntity(myBlockRef)
            myTrans.AddNewlyCreatedDBObject(myBlockRef, True)

            'Set Attribute values
            myAttColl = myBlockRef.AttributeCollection
            myBTREnum = myBlockDef.GetEnumerator
            While myBTREnum.MoveNext
                myEnt = myBTREnum.Current.GetObject(OpenMode.ForWrite)
                If TypeOf myEnt Is AttributeDefinition Then
                    Dim myAttDef As AttributeDefinition = myEnt
                    Dim myAttRef As New AttributeReference
                    myAttRef.SetAttributeFromBlock(myAttDef, myBlockRef.BlockTransform)
                    myAttColl.AppendAttribute(myAttRef)
                    myTrans.AddNewlyCreatedDBObject(myAttRef, True)
                End If
            End While
            myDwgLoc.Dispose()
            myTrans.Commit()

            'Clean(up)
            myTrans.Dispose()
            myTransMan.Dispose()
            Return myBlockRef.ObjectId
        Catch e As Exception
            MsgBox(e.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "AutoGen Error")
        End Try
    End Function
    Public Shared Sub SetAttributes(ByVal BlockId As ObjectId, ByVal TagList As Collection)

        Try
            Dim myTransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager
            Dim myTrans As Transaction
            Dim myDwg As Document
            Dim myDwgLoc As DocumentLock
            Dim myBlkRef As BlockReference
            Dim myAttColl As AttributeCollection
            Dim myEnt As ObjectId
            Dim myAttRef As AttributeReference

            'Get active document and begin transaction
            myDwg = Application.DocumentManager.MdiActiveDocument
            myDwgLoc = myDwg.LockDocument()
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Find block and set attributes
            myBlkRef = BlockId.GetObject(OpenMode.ForWrite)
            myAttColl = myBlkRef.AttributeCollection
            For Each myEnt In myAttColl
                myAttRef = myEnt.GetObject(OpenMode.ForWrite)
                Dim myItem As String
                Try
                    myItem = TagList(myAttRef.Tag)
                    myAttRef.TextString = myItem
                Catch
                End Try
            Next
            myDwgLoc.Dispose()
            myTrans.Commit()

            'Clean up
            myTrans.Dispose()
            myTransMan.Dispose()
        Catch e As Exception
            MsgBox(e.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "AutoGen Error")
        End Try
    End Sub
End Class

'Обращение к вставке из основной программы
Private Sub CommandButton1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CommandButton1.Click

InsertBlock.ImportBlock(BFile, BName) 'BFile и BName - ваши имена
Dim myBlk As ObjectId
myBlk = InsertBlock.InsertBlock(New Point3d(x, y, z), BName)

Dim myTags As New Collection
myTags.Add("ваше значение", "имя аттрибута")

InsertBlock.SetAttributes(myBlk, myTags) 'myBlk и myTags - ваши имена

End Sub

Последний раз редактировалось Bart, 24.11.2009 в 12:32.
Bart вне форума  
 
Автор темы   Непрочитано 03.12.2009, 16:38
#31
Bart


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


Подскажите в чем трабл. Делаю вставку блока на vb.net так, как постил выше.
Если делаю вставку через юзер форм, то все работает. Делаю немного иначе в другом модуле (class1) - не пашет. Код вставки блока и открытия чертежа тот же. Все лишние строки отключал. Открывает файл, но вставку делает не в открытый чертеж, а в drawing1, который автоматом открывается вместе с автокадом. Делал принудительно нужный мне файл активным - все равно вставка делается в другой чертеж.

В чем тут дело?
Bart вне форума  
 
Непрочитано 04.12.2009, 08:43
#32
Сергей Дубина


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


Цитата:
Сообщение от Bart Посмотреть сообщение
На VBA на данный момент все гораздо доступнее.
на VBA максимально похож VB6.
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Автор темы   Непрочитано 04.12.2009, 13:59
#33
Bart


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


Нашел решение.
Все дело вот тут...

<CommandMethod("command", CommandFlags.Session)>

Надо было добавить CommandFlags.Session.
Bart вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Редактирование аттрибутов блока.

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование блока, используя значение его атрибутов Mazai Программирование 14 19.01.2009 20:49
Редактирование блока ALM AutoCAD 1 27.06.2008 10:54
Как в пространстве редактора блоков запустить редактирование вложенного блока. Supermax Программирование 5 18.12.2007 17:50
Измнение через ексель (через макрос в VBA) аттрибутов динамического блока VitaminC Программирование 4 20.10.2007 14:52