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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCad c 2010 по 2015 не сохраняет DWG чертеж если к нему прикрепить проект VBA

AutoCad c 2010 по 2015 не сохраняет DWG чертеж если к нему прикрепить проект VBA

Ответ
Поиск в этой теме
Непрочитано 09.02.2019, 16:35 #1
AutoCad c 2010 по 2015 не сохраняет DWG чертеж если к нему прикрепить проект VBA
stuff
 
Регистрация: 28.01.2019
Сообщений: 14

Всем привет.

Вообще очень странное поведение Autocad c 2010 по 2015.

Если открыть чертеж и потом открыть VBA проект, то потом версии Autocad c 2010 по 2015 зависают при сохранении DWG файла,
хотя код VBA был или завершен или вообще не запускался.

2016 Автокад после загрузки VBA проекта DWG файл сохраняет и не зависает.

Что может быть?
Просмотров: 3695
 
Непрочитано 09.02.2019, 20:15
#2
Кулик Алексей aka kpblc
Moderator

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


Возможно, проблема в самом VBA-проекте и используемых в нем элементах форм (т.н. контролы).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.02.2019, 20:48
#3
stuff


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


Вот код VBA проекта:

Код:
[Выделить все]
Option Explicit

       
Public Sub CopyText(Text As String)
    'VBA Macro using late binding to copy text to clipboard.
    'By Justin Kay, 8/15/2014
    Dim MSForms_DataObject As Object
    Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    MSForms_DataObject.SetText Text
    MSForms_DataObject.PutInClipboard
    Set MSForms_DataObject = Nothing
End Sub

Public Sub CreateIfMissing()
  Dim objMenuGrp As AcadMenuGroup
  Dim objTbarCol As AcadToolbars
  Dim objTbar As AcadToolbar
  Dim objItem As AcadToolbarItem
  Dim blnExist As Boolean
  Dim strMacro As String
  strMacro = "_-vbarun SampleStuff "
  Set objMenuGrp = ThisDrawing.Application.MenuGroups(0)
  Set objTbarCol = objMenuGrp.Toolbars
  For Each objTbar In objTbarCol
    If objTbar.Name = "Sample" Then
      blnExist = True
    End If
  Next objTbar
  If Not blnExist Then
    Set objTbar = objTbarCol.Add("Sample")
    Set objItem = objTbar.AddToolbarButton("", "Sample", _
    "MsgBox", strMacro)
    objTbar.Visible = True 'view it!
    objTbar.Dock acToolbarDockTop 'Dock it!
  End If
End Sub

Sub CleanTextFile()
    ' Must add reference to Tools > References > Microsoft Scripting Runtime
    ' (1) Open an instance of the FileSystemObject.
    ' (2) Open an instance of the FileSystemObject TextStream.
    ' (3) Append lines to the TextStream object.
    ' (4) Close the TextStream object.

    Dim fso As Scripting.FileSystemObject
    Dim tsTxtFile As Scripting.TextStream
    
    ' (1) Open an instance of the FileSystemObject.
    Set fso = New Scripting.FileSystemObject
    
    ' (2) Open an instance of the FileSystemObject TextStream.
    Set tsTxtFile = fso.OpenTextFile("c:\test\test.txt", 2, False, TristateTrue) 'Const ForReading = 1 , ForWriting = 2 , ForAppending = 8 Const TristateUseDefault = - 2 , TristateTrue = - 1 , TristateFalse = 0
    
    With tsTxtFile
    
        ' (3) Append lines to the TextStream object.
        .Write ""
        .Close
        
    End With

End Sub

Sub OpenTextFileAppend(str As String)
    ' Must add reference to Tools > References > Microsoft Scripting Runtime
    ' (1) Open an instance of the FileSystemObject.
    ' (2) Open an instance of the FileSystemObject TextStream.
    ' (3) Append lines to the TextStream object.
    ' (4) Close the TextStream object.

    Dim fso As Scripting.FileSystemObject
    Dim tsTxtFile As Scripting.TextStream
    
    ' (1) Open an instance of the FileSystemObject.
    Set fso = New Scripting.FileSystemObject
    
    ' (2) Open an instance of the FileSystemObject TextStream.
    Set tsTxtFile = fso.OpenTextFile("c:\test\test.txt", 8, False, TristateTrue) 'Const ForReading = 1 , ForWriting = 2 , ForAppending = 8 Const TristateUseDefault = - 2 , TristateTrue = - 1 , TristateFalse = 0
    
    With tsTxtFile
    
        ' (3) Append lines to the TextStream object.
        .WriteBlankLines 1
        .Write str
        .Close
        
    End With

End Sub


Sub SelectObjectsOnscreen()


Dim acEnt As AcadEntity
 
 Dim varAtts As Variant
 Dim intCnt As Integer

 Dim strKVT, strObor, sss As String
 Dim sumKVT As Single
 Dim CountObor As Integer
 Dim IsElectric As Boolean
 
 
 Dim Msg As String
 'Dim iii As Integer
 'iii = 0
 
 strKVT = ""
 CountObor = 0
 IsElectric = False
 
 ' Создание нового набора
 Dim sset As AcadSelectionSet
 Set sset = ThisDrawing.SelectionSets.Add("SS1")

 On Error GoTo ErrorHandler

 ' Запрос пользователю выбрать объекты и добаволение их в набор
 sset.SelectOnScreen

 ' Перебор выбранных объектов
 For Each acEnt In sset

 
   If TypeOf acEnt Is AcadBlockReference Then

      If acEnt.HasAttributes Then
      
         varAtts = acEnt.GetAttributes
      
         For intCnt = LBound(varAtts) To UBound(varAtts)
             
             'OpenTextFileAppend (varAtts(intCnt).TagString + " - " + varAtts(intCnt).TextString)
             
             
             If Trim(varAtts(intCnt).TagString) = "ЕЛ.ПОТУЖНІСТЬ,КВТ" And Trim(varAtts(intCnt).TextString) <> "" Then
                
                
                 'MsgBox varAtts(intCnt).TextString 'If iii > 605 Then
                
                If InStr(1, varAtts(intCnt).TextString, "кВт", 1) <> 0 Then
                   sss = Left(varAtts(intCnt).TextString, InStr(1, varAtts(intCnt).TextString, "кВт", 1) - 1)
                Else
                   'MsgBox varAtts(intCnt).TagString + " - " + varAtts(intCnt).TextString
                End If
                   
                strKVT = strKVT + sss + "+"
                
                'если десятичный разделитель точка, меняем на запятую
                If InStr(sss, ".") <> 0 Then sss = Replace(sss, ".", ",")
                
                'игнорируем выражение типа 31+2х0.15
                If IsNumeric(sss) Then
                   sumKVT = sumKVT + CSng(sss)
                Else
                   'MsgBox sss + vbCrLf + vbCrLf + varAtts(intCnt).TagString + " - " + varAtts(intCnt).TextString + " - " + str(ChangeNumer(sss))
                   'MsgBox ChangeNumer(sss)
                   sumKVT = sumKVT + ChangeNumer(sss)
                End If
                   
                CountObor = CountObor + 1
                IsElectric = True
             End If
             
            
         Next intCnt
         
         If IsElectric = True Then
            For intCnt = LBound(varAtts) To UBound(varAtts)
                If Trim(varAtts(intCnt).TagString) = "НАЙМЕНУВАННЯ" Then
                   strObor = strObor + varAtts(intCnt).TextString + ", "
             End If
            Next intCnt
         End If
         
         IsElectric = False
         
      End If
      
    End If
    
 Next acEnt



ErrorHandler:
 ' Удаление набора
 sset.Delete
 
 ' Если возникла ошибка, ее описание
 If Err.Number <> 0 Then
    Msg = "Error # " & str(Err.Number) & " was generated by " _
            & Err.Source & Chr(13) & Err.Description
    MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
 End If

 
 strKVT = Replace(strKVT, ",", ".")
 strKVT = "=" + Left(strKVT, Len(strKVT) - 1)
 
 'MsgBox "Общая нагрузка: " + CStr(sumKVT) + " кВт, Количество потребителей - " + CStr(CountObor) + vbCrLf + vbCrLf + strKVT + vbCrLf + vbCrLf + strObor

 'чистим
 CleanTextFile
 
 'добавляем данные
 OpenTextFileAppend ("Общая нагрузка: " + CStr(sumKVT) + " кВт, Количество потребителей - " + CStr(CountObor) + vbCrLf)
 OpenTextFileAppend (strKVT + vbCrLf)
 OpenTextFileAppend (strObor + vbCrLf)
 
 'открываем в блокноте
 Shell "notepad C:\test\test.txt", vbNormalFocus
  
End Sub

Public Function ChangeNumer(sss As String) As Single

 Dim kol As Integer
  
 kol = (Len(sss) - Len(Replace(sss, "x", ""))) / Len("x")
 
 'sss = "2x1,5"
 If (InStr(1, sss, "x", 1) <> 0) And (kol = 1) And (InStr(1, sss, "+", 1) = 0) Then
    ChangeNumer = (Left(sss, (InStr(1, sss, "x", 1)) - 1)) * CSng(Right(sss, (Len(sss) - InStr(1, sss, "x", 1))))
 'sss = "37,0+2x0,1"
 ElseIf (InStr(1, sss, "+", 1) <> 0) Then
    ChangeNumer = CSng(Left(sss, (InStr(1, sss, "+", 1)) - 1))
 Else
    ChangeNumer = 0
 End If
 
End Function


Public Sub SampleStuff()

  SelectObjectsOnscreen
 
End Sub
И что плохого в этом коде, что DWG файл не может сохранить?
Формы и контролы не используются...

----- добавлено через ~1 мин. -----
Более того, DWG файл становиться не сохраняемым...
Если его потом еще раз открыть - сохранить DWG файл уже не представляется возможным...
Все Автокады до 2016 версии в процессе сохранения данного файла просто зависают.

Получается, что VBA проект как-то влияет на DWG файл, и он после этого становится не пригодным для сохранения...

----- добавлено через ~12 мин. -----
Правда данный глюк наблюдается только с одним большим файлом. Т.е. причина не в самом VBA проекте, а только в одном крупном файле (18 мегабайт), который при запуске VBA перестает сохраняться.
Вот сам файл - https://drive.google.com/open?id=161...dnvRhaCE62xQ47
stuff вне форума  
 
Непрочитано 09.02.2019, 21:13
#4
Сергей812


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


Цитата:
Сообщение от stuff Посмотреть сообщение
то потом версии Autocad c 2010 по 2015 зависают при сохранении DWG файла
Есть интересная статья
Может вы просто не дожидаетесь сохранения на большом файле?
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.02.2019, 21:41
#5
stuff


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Есть интересная статья
Может вы просто не дожидаетесь сохранения на большом файле?
Если не загружать VBA проект, то дожидаюсь сохранения крупного файла.

Но если загрузить VBA проект, то сохранение DWG файла уходить в бескончность...
stuff вне форума  
 
Непрочитано 10.02.2019, 00:07
#6
Кулик Алексей aka kpblc
Moderator

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


... о чем и говорится в приведенной статье.
Offtop: Код ни оценить, ни проверить не могу - нет ни ACAD ниже 2018, ни установленных VBA
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.02.2019, 00:32
#7
Сергей812


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


Цитата:
Сообщение от stuff Посмотреть сообщение
Но если загрузить VBA проект, то сохранение DWG файла уходить в бескончность...
а если перед сохранением выгрузить проект VBA? Вроде их тоже можно на ходу выгружать, насколько помню...
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.02.2019, 09:46
#8
stuff


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а если перед сохранением выгрузить проект VBA? Вроде их тоже можно на ходу выгружать, насколько помню...
Если перед сохранение выгрузить проект VBA, то то же зависание при сохранении DWG файла.
Ранее загруженный VBA проект оставляет какой-то "след", да же если его выгрузить...

Выход нашел в том, что загружаю VBA проект в отдельном автокаде, в другом автокаде сохраняю DWG файлы...

----- добавлено через ~17 мин. -----
Вообще это серьезный "бок" со стороны разработчиков Autodesk...
Странно, что они на это не обратили внимание...

Это все равно как Excel, или Access зависали при сохранении, если в них использовался VBA...
stuff вне форума  
 
Непрочитано 10.02.2019, 10:07
#9
Сергей812


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


Цитата:
Сообщение от stuff Посмотреть сообщение
Ранее загруженный VBA проект оставляет какой-то "след", да же если его выгрузить...
значит, не проект VBA "чудит" - а сам компонент VBA акада, видимо.
Цитата:
Сообщение от stuff Посмотреть сообщение
Выход нашел в том, что загружаю VBA проект в отдельном автокаде, в другом автокаде сохраняю DWG файлы...
это как? Одновременно в двух экземплярах акада чертеж можно только для чтения открыть в одном из них..

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от stuff Посмотреть сообщение
Вообще это серьезный "бок" со стороны разработчиков Autodesk...
Странно, что они на это не обратили внимание...
Потому что Аутодеск давно проводит достаточное активную поддержку для перевода приложений VBA на другие языки. Последний раз VBA в акаде запускал толи в 2011, толи в начале 2012 года - нафиг такое "счастье" нужно, которое заметно акад подтормаживает даже на ПК среднего уровня).

Цитата:
Сообщение от stuff Посмотреть сообщение
Это все равно как Excel, или Access зависали при сохранении, если в них использовался VBA...
видел только в 2016 екселе проблему с VBA, пока апдейты не выпустили - да и то не зависание, а просто с ошибкой вылетал при попытке закрытия. А так VBA для MS Office является родным, в отличие от акада.
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.02.2019, 10:23
#10
stuff


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
это как? Одновременно в двух экземплярах акада чертеж можно только для чтения открыть в одном из них..
Один чертеж в режиме чтения - из него VBA вытаскивает нужную мне информацию.
И тот же чертеж в другом автокаде, там этот чертеж редактируется и сохраняется.

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
видел только в 2016 екселе проблему с VBA, пока апдейты не выпустили - да и то не зависание, а просто с ошибкой вылетал при попытке закрытия. А так VBA для MS Office является родным, в отличие от акада.
К VBA уже привык. Все просто интуитивно + конструирование визуального интерфейса удобное. Жаль, что прейдется от VBA отказаться...
stuff вне форума  
 
Непрочитано 10.02.2019, 10:37
#11
Сергей812


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


Цитата:
Сообщение от stuff Посмотреть сообщение
К VBA уже привык. Все просто интуитивно + конструирование визуального интерфейса удобное. Жаль, что прейдется от VBA отказаться...
Можно собирать информацию извне через COM-интерфейс, например - из экселя. Это будет работать помедленнее, чем встроенный VBA, но зато можно будет удалить Enabler VBA из акада и не придется жонглировать двумя экземплярами приложения. А код в VBA экселе будет фактически один в один.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCad c 2010 по 2015 не сохраняет DWG чертеж если к нему прикрепить проект VBA

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Autocad mechanical 2010 после ACAD 2008 прблемы с графикой konstant55 Вертикальные решения на базе AutoCAD 2 08.11.2011 10:12
Зависание системы после установки AutoCAD 2010 Westroy AutoCAD 1 11.05.2010 15:27
Проблема с Autocad 2010. Не сохраняет панели инструментов Askarov AutoCAD 4 11.05.2010 12:17
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27
не печатает чертеж. Autocad 2010 Romeo1786 AutoCAD 6 25.03.2010 14:24