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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA Autocad 2016 как заполнить подшивку данными из Excel?

VBA Autocad 2016 как заполнить подшивку данными из Excel?

Ответ
Поиск в этой теме
Непрочитано 20.11.2016, 22:15 #1
VBA Autocad 2016 как заполнить подшивку данными из Excel?
KomProekt
 
Регистрация: 12.08.2016
Сообщений: 59

Здравствуйте!

Есть задача: из таблицы Excel нужно взять данные и внести их в подшивку Акадовскую (желательно создать новую подшивку с заданными свойствами, заполненными из Excel). Какими методами это можно сделать? Или удобней использовать не VBA, а что то другое для этой задачи (например .Net) ?

Спасибо!
Просмотров: 15067
 
Непрочитано 20.11.2016, 22:58
#2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,091


Для начала:
- посмотреть здесь, здесь и кучу тем о программной связке Акада и Экселя (поиск в помощь);
- определиться, откуда надо запускать команду - из Акада или из Экселя. Второе гораздо сложнее.
kp+ вне форума  
 
Автор темы   Непрочитано 21.11.2016, 00:04
#3
KomProekt


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


Можно и не создавать новую подшивку, а добавить значения в открытую подшивку из таблицы эксель. Подскажите, в Object Model (ActiveX) есть такие методы?
KomProekt вне форума  
 
Непрочитано 21.11.2016, 01:39
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,091


Цитата:
Сообщение от KomProekt Посмотреть сообщение
Можно и не создавать новую подшивку, а добавить значения в открытую подшивку из таблицы эксель.
Т.е. команда на заполнение подшивки все-таки будет подаваться из Акада? Так?

Цитата:
Сообщение от KomProekt Посмотреть сообщение
Подскажите, в Object Model (ActiveX) есть такие методы?
Готового метода вроде IzExcelVPodshiffku, к несчастью, нет (хотя для Автодеск было бы нетрудно его написать, ведь связь таблиц Акада с Эксель написали). Придется применять отдельные методы для чтения из Экселя и отдельные - для открытия подшивки и записи данных в нее. Вы темы по приведенным в #2 ссылкам хотя бы открывали? Там все это обсуждалось

Последний раз редактировалось kp+, 21.11.2016 в 01:45.
kp+ вне форума  
 
Непрочитано 21.11.2016, 02:10
#5
Сергей812


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


Цитата:
Сообщение от KomProekt Посмотреть сообщение
Подскажите, в Object Model (ActiveX) есть такие методы?
Есть и методы создания, и модификации.

Цитата:
Сообщение от kp+ Посмотреть сообщение
связь таблиц Акада с Эксель написали
связь написали, а возможность манипулировать связями из VBA, судя по недавним постам, реализовать забыли)
Сергей812 вне форума  
 
Непрочитано 21.11.2016, 06:49
#6
trir


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


Есть два варианта
1. Через COM - VBA или .NET
2. Прямая работа с dst-файлами
я использую оба метода

пример
Код:
[Выделить все]
="(command ""SetProjValue"" """ & RC[-2] & """ ""name"" ""<новое значение>"")"
Код:
[Выделить все]
    Public Function GetSSDB(editor As acEdInp.Editor) As AcSmDatabase
        Dim pStrOpts As acEdInp.PromptStringOptions = New acEdInp.PromptStringOptions(vbLf & "Путь к подшивке: ")
        pStrOpts.AllowSpaces = True
        Dim PrRes As acEdInp.PromptResult = editor.GetString(pStrOpts)
        If PrRes.Status = acEdInp.PromptStatus.OK Then
            Dim Path As String = PrRes.StringResult
            Try
                If sheetSetManager Is Nothing Then sheetSetManager = New AcSmSheetSetMgr
                Return sheetSetManager.OpenDatabase(Path, False)
            Catch ex As System.Exception
                editor.WriteMessage("error: " & ex.ToString)
                Return Nothing
            End Try
        Else
            Return Nothing
        End If
    End Function

    <CommandMethod("SetCustomProperty")> _
    Public Sub SetCustomProperty()
        Dim editor As Autodesk.AutoCAD.EditorInput.Editor = acApp.Application.DocumentManager.MdiActiveDocument.Editor()
        Dim sheetSetDatabase As AcSmDatabase = GetSSDB(editor)
        If sheetSetDatabase IsNot Nothing Then
            Dim pStrOpts As acEdInp.PromptStringOptions = New acEdInp.PromptStringOptions(vbLf & "Имя свойства: ")
            pStrOpts.AllowSpaces = True
            Dim PrRes As acEdInp.PromptResult = editor.GetString(pStrOpts)
            If PrRes.Status = acEdInp.PromptStatus.OK Then
                Dim PropertyName As String = PrRes.StringResult
                pStrOpts.Message = "Новое значение: "
                PrRes = editor.GetString(pStrOpts)
                If PrRes.Status = acEdInp.PromptStatus.OK Then
                    Dim nValue As String = PrRes.StringResult
                    Try
                        If sheetSetDatabase.GetLockStatus = AcSmLockStatus.AcSmLockStatus_UnLocked Then
                            SetCP(sheetSetDatabase, PropertyName, nValue)
                        Else
                            editor.WriteMessage(sheetSetDatabase.GetFileName & " is Lock")
                        End If
                    Catch ex As System.Exception
                        editor.WriteMessage("error: " & ex.ToString)
                    End Try
                End If
            End If
        End If
    End Sub

    <CommandMethod("SetProjValue", CommandFlags.Interruptible)> _
    Public Sub SetProjValue()
        Dim editor As Autodesk.AutoCAD.EditorInput.Editor = acApp.Application.DocumentManager.MdiActiveDocument.Editor()
        'Path As String, PropertyName As String, nValue As String
        Dim sheetSetDatabase As AcSmDatabase = GetSSDB(editor)
        If sheetSetDatabase IsNot Nothing Then
            Dim pStrOpts As acEdInp.PromptStringOptions = New acEdInp.PromptStringOptions(vbLf & "Имя свойства (Number/nAme/Phase/Milestone): ")
            pStrOpts.AllowSpaces = True
            Dim PrRes As acEdInp.PromptResult = editor.GetString(pStrOpts)
            If PrRes.Status = acEdInp.PromptStatus.OK Then
                Dim PropertyName As String = PrRes.StringResult
                pStrOpts.Message = "Новое значение: "
                PrRes = editor.GetString(pStrOpts)
                If PrRes.Status = acEdInp.PromptStatus.OK Then
                    Dim nValue As String = PrRes.StringResult
                    Try
                        If sheetSetDatabase.GetLockStatus = AcSmLockStatus.AcSmLockStatus_UnLocked Then
                            SetProjP(sheetSetDatabase, PropertyName, nValue)
                        Else
                            editor.WriteMessage(sheetSetDatabase.GetFileName & " is Lock")
                        End If
                        sheetSetManager.Close(sheetSetDatabase)
                    Catch ex As System.Exception
                        editor.WriteMessage("error: " & ex.ToString)
                    End Try
                End If
            End If
        End If
    End Sub

Последний раз редактировалось trir, 21.11.2016 в 08:20.
trir вне форума  
 
Автор темы   Непрочитано 21.11.2016, 11:45
#7
KomProekt


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Есть и методы создания, и модификации.
Какие это методы?

У меня задача совсем простая. Есть файл эксел, в нем номер проекта и еще несколько параметров. Нужно эти данные по одному нажатию внести в свойства подшивки (новой или уже открытой, как проще).
Команда подается из экселя, что бы потом кнопочку в быстром запуске сделать.

По какой ветке в Object Model (ActiveX) двигаться?
KomProekt вне форума  
 
Непрочитано 21.11.2016, 11:54
1 | #8
trir


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


Код:
[Выделить все]
    Public Sub SetCP(sheetSetDatabase As AcSmDatabase, PropertyName As String, nValue As String)
        Dim SmEnumProperty As AcSmCustomPropertyBag
        Dim CPV As New AcSmCustomPropertyValue
        SmEnumProperty = sheetSetDatabase.GetSheetSet.GetCustomPropertyBag
        If sheetSetDatabase.GetLockStatus = AcSmLockStatus.AcSmLockStatus_UnLocked Then
            sheetSetDatabase.LockDb(sheetSetDatabase) 'start
            CPV = SmEnumProperty.GetProperty(PropertyName)
            CPV.SetValue(nValue)
            SmEnumProperty.SetProperty(PropertyName, CPV)
            sheetSetDatabase.UnlockDb(sheetSetDatabase) 'end
        End If
    End Sub

    Public Sub SetProjP(sheetSetDatabase As AcSmDatabase, PropertyName As String, nValue As String)
        Dim ss2 As IAcSmSheetSet2
        ss2 = sheetSetDatabase.GetSheetSet
        If sheetSetDatabase.GetLockStatus = AcSmLockStatus.AcSmLockStatus_UnLocked Then
            sheetSetDatabase.LockDb(sheetSetDatabase)
            Select Case PropertyName.ToLower
                Case "n", "number"
                    ss2.SetProjectNumber(nValue)
                Case "a", "name"
                    ss2.SetProjectName(nValue)
                Case "p", "phase"
                    ss2.SetProjectPhase(nValue)
                Case "m", "milestone"
                    ss2.SetProjectMilestone(nValue)
            End Select
            sheetSetDatabase.UnlockDb(sheetSetDatabase)
        End If
    End Sub
Цитата:
По какой ветке в Object Model (ActiveX) двигаться?
ACSMCOMPONENTS20Lib
trir вне форума  
 
Автор темы   Непрочитано 21.11.2016, 16:37
#9
KomProekt


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


Почему у меня этот код вообще не видит редактор? Никак на него не реагирует при запуске...
KomProekt вне форума  
 
Непрочитано 21.11.2016, 16:58
#10
trir


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


какой редактор?
trir вне форума  
 
Автор темы   Непрочитано 21.11.2016, 17:05
#11
KomProekt


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


Редактор VBA. Ни через эксель, ни через автокад не видит.
KomProekt вне форума  
 
Непрочитано 21.11.2016, 17:12
#12
trir


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


Это VB.NET
trir вне форума  
 
Непрочитано 21.11.2016, 17:14
#13
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Тут еще такая же тема... http://forum.dwg.ru/showthread.php?t=41088
И тут еще интересный код http://forums.autodesk.com/t5/visual...n/td-p/1776019

Последний раз редактировалось Boxa, 21.11.2016 в 17:33.
Boxa вне форума  
 
Автор темы   Непрочитано 21.11.2016, 22:52
#14
KomProekt


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


Цитата:
Сообщение от trir Посмотреть сообщение
Это VB.NET
Т.е. на VB.NET есть возможность, а на VBA сложнее, судя по разрозненному материалу и ноль законченных кодов?)
KomProekt вне форума  
 
Непрочитано 21.11.2016, 22:54
#15
trir


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


На VBA то же самое, просто на VBA мне не интересно писать. Но этот код переводится на VBA на раз, но мне влом
Работа с COM на VBA и VB/NET мало отличается...
trir вне форума  
 
Непрочитано 21.11.2016, 23:16
#16
Сергей812


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


Цитата:
Сообщение от KomProekt Посмотреть сообщение
VBA сложнее, судя по разрозненному материалу и ноль законченных кодов?)
На самом деле, в инете давно гуляет документ от разработчиков аутодеска, где как раз на VBA показаны все основные примеры работы с подшивкой - если хотели бы найти, должны были наткнуться.
Сергей812 вне форума  
 
Автор темы   Непрочитано 21.11.2016, 23:19
#17
KomProekt


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


Цитата:
Сообщение от trir Посмотреть сообщение
На VBA то же самое, просто на VBA мне не интересно писать. Но этот код переводится на VBA на раз, но мне влом
Работа с COM на VBA и VB/NET мало отличается...
Ну как так? В начале написано, что вопрос по VBA, а Вы дразните VB.NET. Скажите хотя бы, какими методами из VBA пользоваться?

----- добавлено через ~6 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
На самом деле, в инете давно гуляет документ от разработчиков аутодеска, где как раз на VBA показаны все основные примеры работы с подшивкой - если хотели бы найти, должны были наткнуться.
Третий день в поисках, пока без успеха(

----- добавлено через ~43 мин. -----
Цитата:
Сообщение от trir Посмотреть сообщение
Работа с COM на VBA
Что нужно для этой работы? доп установки или Редактора VBA достаточно?

----- добавлено через ~1 ч. -----
Нашел вот такой код:

Код:
[Выделить все]
'' ОТКРЫТЬ ПОДШИВКУ
Public Sub OpenSheetSet()
'' Create a Reference to the Sheet Set Manager Object
Dim oSheetSetMgr As AcSmSheetSetMgr
Set oSheetSetMgr = New AcSmSheetSetMgr
'' Open a Sheet Set file
Dim oSheetDb As AcSmDatabase
Set oSheetDb = oSheetSetMgr.OpenDatabase("d:\Подшивка.dst", False)
 
'' Lock the Database
LockDatabase oSheetDb
 
'' СОЗДАТЬ СВОЙСТВА ПОДШИВКИ
SetCustomProperty oSheetDb, "Свойство подшивки 1", TextBox1
SetCustomProperty oSheetDb, "Свойство подшивки 2", TextBox2
'' СОЗДАТЬ СВОЙСТВА ЛИСТА
SetCustomProperty oSheetDb, "Свойство листа1", TextBox3, False
SetCustomProperty oSheetDb, "Свойство листа2", TextBox4, False
 
'' Unlock the database
UnlockDatabase oSheetDb
 
End Sub
 
'' Used to Lock the database (SheetSet)
Private Function LockDatabase(oSheetDb As AcSmDatabase) As Boolean
'' Check the status of the database
If oSheetDb.GetLockStatus = AcSmLockStatus_UnLocked Then
oSheetDb.LockDb oSheetDb
LockDatabase = True
Else
LockDatabase = False
End If
End Function
'' Used to Unlock the database (SheetSet)
Private Function UnlockDatabase(oSheetDb As AcSmDatabase) As Boolean
'' Check the status of the database
If oSheetDb.GetLockStatus = AcSmLockStatus_Locked_Local Then
oSheetDb.UnlockDb oSheetDb
UnlockDatabase = True
Else
UnlockDatabase = False
End If
End Function
 
'' Set/Create a Sheet Set Property
Private Sub SetCustomProperty(oSheetDb As AcSmDatabase, _
strName As String, _
strValue As String, _
Optional bSheetSetFlag As Boolean = True)
'' Create a Reference to the Custom Property Bag
Dim cBag As AcSmCustomPropertyBag
Set cBag = oSheetDb.GetSheetSet().GetCustomPropertyBag
'' Create a Reference to a Custom Property Value
Dim cBagVal As New AcSmCustomPropertyValue
cBagVal.InitNew oSheetDb.GetSheetSet() '' cBag
'' Set the Flag for Sheet Set or Sheet Property
If bSheetSetFlag = True Then
cBagVal.SetFlags CUSTOM_SHEETSET_PROP
Else
cBagVal.SetFlags CUSTOM_SHEET_PROP
End If
'' Set the value for the Bag
cBagVal.SetValue strValue
'' Create the property
cBag.SetProperty strName, cBagVal
'' Cleat variable
Set cBagVal = Nothing
End Sub
Но почему подшивка даже не открывается (естественно указал путь к сущ. подшивке)?
KomProekt вне форума  
 
Непрочитано 22.11.2016, 04:50
#18
trir


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


Доступ к подшивке через COM будет работать только из AutoCAD'а
trir вне форума  
 
Автор темы   Непрочитано 22.11.2016, 10:35
#19
KomProekt


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


Цитата:
Сообщение от trir Посмотреть сообщение
Доступ к подшивке через COM будет работать только из AutoCAD'а
В том то и дело, она даже из атокада не открывается.
KomProekt вне форума  
 
Непрочитано 22.11.2016, 10:43
#20
Сергей812


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


Что значит, не открывается?
Код:
[Выделить все]
Set oSheetDb = oSheetSetMgr.OpenDatabase("d:\Подшивка.dst", False)
что в переменной oSheetDb после прохода этой строчки при пошаговой отладке?
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA Autocad 2016 как заполнить подшивку данными из Excel?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связка AutoCAD с Excel через командную строку. raffnec AutoCAD 9 19.09.2016 10:54
Заполнение размеров в Autocad из Excel zenija2007 AutoCAD 9 18.09.2015 12:53
Как добавить префикс к однострочному тексту в AutoCAD 2016 andrey_artphoto AutoCAD 5 27.05.2015 17:11
Привязка таблицы Excel к чертежу AutoCad Teo-one Программирование 5 22.03.2014 00:11
Таблица из Excel в AutoCAD Elbrus AutoCAD 56 11.06.2012 11:41