Перейти к публикации

Рекомендованные сообщения

В 28.01.2019 в 21:07, alek77 сказал:

Прошу подсказать:

Записываю свойства пользователя компонента макросом, после записи они не отображаются в таббилдере, пока не откроешь вкладку свойства пользователя, где все вновь записанные свойства отображаются сразу, и не закроешь её. Или можно перечертить пару раз, плюс глубокое перестроение и сохранение. Только после такого подшаманивания, новые значения свойств начинают отображаться в таббилдере. В конце макроса перечерчивание, перестроение и сохранение есть. Значения в системе прописываются, только в таббилдере не отображаются сразу, поля остаются не заполненными, и если в таббилдере нажать применить, благополучно стираются из системы. Надоело после работы макроса открывать свойства пользователя. Думаю, что это чистейший баг таббилдера. Как решить? 

 

 

В 31.01.2019 в 12:13, alek77 сказал:

Что примечательно, не все свойства пользователя не сразу отображаются в таббилдере, только те, что завязаны на список или радиокнопку.

Они начинают корректно отображаться только после нажатия кнопки ОК окошка суммарная информация

 

Разобрался. Сначала пытался в конце работы макроса кодом открыть и закрыть диалог суммарная информация. Работает конечно, но в исполнении кривовато.

Другое решение гораздо проще. Для того, чтобы после записи макросом свойств пользователя эти свойства отображались корректно в Таббилдере,

нужно в конце работы макроса добавить строку FileReload ко всем сохранениям и перечерчиваниям

 

В C# завершение кода теперь у меня выглядит так:

            swApp.Visible = true;
            swModel.ShowNamedView2("*Триметрия", 8);
            swModel.ViewZoomtofit2();
            swModel.EditRebuild3(); //Перестраивает только те функции, которые необходимо перестроить в активной конфигурации в модели (перечерчивание)
            swModel.Rebuild((int)swRebuildOptions_e.swForceRebuildAll);
            swModel.ForceRebuild3(true); //Принудительно перестраивает все функции активной конфигурации в модели (глубокое перестроение)
            swModel.Save();

            swModel.FileReload();//перезагрузка модели

            Debug.Print("Выполнено");

Наворотил конечно, перестраиваю всё и вся, но зато работает корректно.

FileReload выполняется без каких-либо манипуляций заметных глазу

 

Ссылка на сообщение
Поделиться на других сайтах


Доброго времени суток Уважаемые форумчане
Возможно кто-то может поделиться макросом для хранения спецификации в файл экселя, поскольку штатный способ хранения в формате экселя то срабатывает не всегда.
Наткнулся на форуме файл макроса господина v-david только этот макрос также отказывается работать.

Ссылка на сообщение
Поделиться на других сайтах

Сложно ответить почему у вас не работает мой макрос. Из технических возможны 2 причины, первая это несоответствие 32- и 64-разрядных оболочек (для 64 перевыкладываю) и вторая - наличие ошибок в модели (красное). Причину почему из-за "красного" он не работает не выяснял.

В выложенном макросе много "лишнего", т.к. писал давно когда только разбирался в теме, но зато есть комменты. Запускайте и Main_modul_BOM.main. Ну а других причин может быть масса, например вы пытаетесь перепереть в эксель список вырезов. Этим макросом не получиться, у списка вырезов другой идентификатор и искать таблицу на листе бесполезно. 

BOM to EXCEL.rar

Ссылка на сообщение
Поделиться на других сайтах
20 часов назад, Sagrado911 сказал:

Возможно кто-то может поделиться макросом для хранения спецификации в файл экселя

Попробуйте такой вариант - немного из справки солида и много кода из макроса одного автора, там в шапке записано.

Сохраняет спецификацию в папку Temp на диске C. В чертеже предварительно необходимо выбрать спецификацию за крестик в левом верхнем углу.

В коде путь для сохранения и наименование файла можно переписать, при желании.

 

Скрытый текст

'SOLIDWORKS API Help
'Save Table to Microsoft Excel Example (VBA)
'This example shows how to save a BOM table annotation to a Microsoft Excel document.
'+
' Author: Luke Malpass
' Website: http://www.angelsix.com
' Date: 01/04/08
'
' Prerequisits: Have a drawing open, and for it to export anything, have at least one table created (such as a BOM)
'
'
'---------------------------------------------------------------------------
' Preconditions:
' 1. Open a drawing of an assembly with a BOM.
' 2. Click the move-table icon in the upper-left corner
'    of the BOM table to open the table's PropertyManager page.
'
' Postconditions: Saves the selected BOM to c:\temp\BOMTable.xls.
'--------------------------------------------------------------------------
Dim swApp As SldWorks.SldWorks
Dim swModDoc As SldWorks.IModelDoc2
Dim swTable As SldWorks.ITableAnnotation
Dim Status  As Boolean

Option Explicit

Public Sub Main()
    Set swApp = Application.SldWorks

    Set swModDoc = swApp.ActiveDoc
    Dim swSM As ISelectionMgr
    Set swSM = swModDoc.SelectionManager
    Set swTable = swSM.GetSelectedObject6(1, -1)
    swModDoc.ClearSelection2 (True)

    Dim swSpecTable As IBomTableAnnotation
    Set swSpecTable = swTable
    
    Dim swAnn                   As SldWorks.Annotation
    Dim nNumCol                 As Long
    Dim nNumRow                 As Long
    Dim sRowStr                 As String
    Dim i                       As Long
    Dim j                       As Long
    
    Dim objExcelObject          As Excel.Application
    Dim objBook1                As Excel.Workbook
    Dim objSheet1               As Excel.Worksheet
    
    Set objExcelObject = CreateObject("Excel.Application")
    objExcelObject.Visible = False
    objExcelObject.ScreenUpdating = False
    objExcelObject.Interactive = False
    
    Set objBook1 = objExcelObject.Workbooks.Add()
    Set objSheet1 = objBook1.ActiveSheet
        
    Set swAnn = swTable.GetAnnotation
    
    'путь для сохранения
    objBook1.SaveAs "C:\Temp\" & swAnn.GetName

    objSheet1.Activate

    'Set worksheet name
    objSheet1.Name = "BOM"


    nNumCol = swTable.ColumnCount
    nNumRow = swTable.RowCount

    ' Only export Bills of Materials (EDIT, OR REMOVE TO PROCESS ALL TABLES)
    If swTable.Type <> SwConst.swTableAnnotationType_e.swTableAnnotation_BillOfMaterials Then Exit Sub
    
    ' Get the table contents
    For i = 0 To nNumRow - 1
        For j = 0 To nNumCol - 1
            objSheet1.Range("A1").Offset(i, j).Value = swTable.DisplayedText(i, j)
            ' Bold top column
            If i = 0 Then objSheet1.Range("A1").Offset(i, j).Font.Bold = True
        Next j
    Next i
        
    objSheet1.Range("A1").Activate
    objSheet1.Range("A1", objSheet1.Range("A1").SpecialCells(xlCellTypeLastCell)).Columns.AutoFit
        
    ' Clean-up
    objExcelObject.ScreenUpdating = True
    objExcelObject.Interactive = True
    
    objExcelObject.ActiveWorkbook.Save
    objExcelObject.Workbooks.Close
    objExcelObject.Quit
    
    Set objSheet1 = Nothing
    Set objBook1 = Nothing
    Set objExcelObject = Nothing

    ' Save the selected BOM table to Microsoft Excel, including hidden cells
    ' and images
'    Status = swSpecTable.SaveAsExcel("c:\temp\BOMTable.xls", False, False)

End Sub

 

 

Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

Прошу помощи... Как в макросе VBA после преобразования объекта (кромки) в чертеже определить, что полученный сегмент окружность? И как этот сегмент выделить для дальнейшей обработки в коде?

boolstatus = Part.SketchManager.SketchUseEdge3(False, True)

 

Ссылка на сообщение
Поделиться на других сайтах

Кто нибудь программировал в SW PDM 2018? Есть задача вытащить все dxf файлы листовых деталей сборки из разных папок хранилища (DXF хранится  рядом с деталями) и поместить в "общей" копией в целевую папку этого же хранилища. Сколько смотрел справку по API SW не смог найти упоминания о команде позволяющей создать "общую" копию.... Никто не сталкивался?

Ссылка на сообщение
Поделиться на других сайтах

Я представляю себе эту задачу таким образом - найти перечень деталей из листового материала, найти их место хранения, найти контура в дхф, создать папки (проверить наличие) и сделать общую копию. в Вашем варианте работы предлагаете работать с таблицей sql?

Ссылка на сообщение
Поделиться на других сайтах
  • 4 месяца спустя...

Всем привет!

Может кому будет полезно и не придется потом править уже написанные макросы, а тем кто уже знает - напомнит!

На основе полученного опыта, хочу поделиться следующей информацией:

в некоторых своих макросах я брал наименование компонента используя метод swModel.GetTitle.

На разных компах настройки отображения расширения файлов, в зависимости от предпочтения пользователя, либо отображают расширение, либо нет. Соответственно,

и метод swModel.GetTitle возвращает наименование файла с расширением или без него. Чтобы макрос работал на любых компах одинаково, предпочтительно

имя файла вытаскивать из полного пути файла используя метод swModel.GetPathName, тогда макрос не будет зависим от настроек винды. Приведу простой пример:

 

Показать содержимое  

Option Explicit
 
Global swApp            As ISldWorks
Global swModel          As IModelDoc2
 
Global TempString       As String
Global sFullFilePath    As String
Global sFilePath        As String
Global sFileExt         As String
Global sFileName        As String
Global CharPos          As Long


Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

 Select Case swModel.GetType
        Case swDocPART
            sFileExt = ".SLDPRT"
        Case swDocASSEMBLY
            sFileExt = ".SLDASM"
        Case Else
            MsgBox "Только для деталей и сборок!"
            End
    End Select

GetFilePathAndName swModel.GetPathName

sFullFilePath = sFilePath & sFileName & sFileExt

Debug.Print "Путь файла - "; sFilePath
Debug.Print "Имя файла - "; sFileName
Debug.Print "Расширение файла - "; sFileExt
Debug.Print
Debug.Print "Полный путь и наименование файла - "; sFullFilePath

End Sub

Function GetFilePathAndName(TempString)

    If TempString = "" Then
        MsgBox "Компонент не сохранен!"
        End
    End If

    CharPos = InStrRev(TempString, "\")
    sFilePath = Left$(TempString, CharPos)
    sFileName = Right$(TempString, (Len(TempString) - CharPos))
    sFileName = Left$(sFileName, Len(sFileName) - 7)
End Function

Hide  

А сам сижу и правлю, жалею, что сразу не знал про такие подводные камни, зависящие от настроек винды.

В приложенном макросе этот же кусок кода

 

 

 

Macro1.swp

Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, alek77 сказал:

А сам сижу и правлю, жалею, что сразу не знал про такие подводные камни, зависящие от настроек винды.

В приложенном макросе этот же кусок кода

Почему нельзя использовать функцию Replace? Тогда расширение будет удаляться только когда оно есть.

Другой вариант, проверять наличия расширения (например InStr) и резать знаки с конца только когда расширение есть.

Ссылка на сообщение
Поделиться на других сайтах
38 минут назад, Kelny сказал:

Почему нельзя использовать функцию Replace? Тогда расширение будет удаляться только когда оно есть.

Другой вариант, проверять наличия расширения (например InStr) и резать знаки с конца только когда расширение есть.

Согласен, тоже отличный вариант

Ссылка на сообщение
Поделиться на других сайтах
  • 5 недель спустя...

подскажите, как отключить обновление графики во время работы макроса vba?

Ссылка на сообщение
Поделиться на других сайтах

вот я бы тоже хотел знать, по похоже по-легкому это не получится. Можно попробовать поиграть с оконным интерфейсом

 

Ссылка на сообщение
Поделиться на других сайтах
В 30.08.2019 в 09:51, alek77 сказал:

подскажите, как отключить обновление графики во время работы макроса vba?

У Артёма Татуревича на сайте пример есть, посмотри

https://www.codestack.net/solidworks-api/document/suspend-graphics-update/

Скрытый текст
'**********************
'Copyright(C) 2019 www.codestack.net
'Reference: https://www.codestack.net/solidworks-api/document/suspend-graphics-update/
'License: https://www.codestack.net/LICENSE.md
'**********************
Sub SuppressUpdates(model As SldWorks.ModelDoc2, suppress As Boolean)
   
    Dim enable As Boolean
    enable = Not suppress
   
    Dim swView As SldWorks.ModelView
    Set swView = model.ActiveView
   
    swView.EnableGraphicsUpdate = enable
   
    model.FeatureManager.EnableFeatureTree = enable
    model.FeatureManager.EnableFeatureTreeWindow = enable
       
    swApp.DocumentVisible enable, swDocumentTypes_e.swDocPART
    swApp.DocumentVisible enable, swDocumentTypes_e.swDocASSEMBLY
    swApp.DocumentVisible enable, swDocumentTypes_e.swDocDRAWING
   
End Sub

 

Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Подскажите пожалуйста, ситуация вымышленная, но по другому не могу описать, то, что мне нужно:

вот есть у меня файл модели, скопированный, не через пакэндго, а просто проводником, уже с новым обозначением и наименованием в имени файла, а чертеж не скопирован, и как исходники назывались до копирования тоже хз. Но точно все было оформлено как положено в первоначальном виде до копирования. Связь между новой моделью и чертежом потеряна, чертеж почти утерян, так как следов нет. Есть какие варианты найти на сервере с тысячами файлов чертеж от первоначальной детали, при условии что он точно есть на сервере, но мы не знаем его номера и соответственно пути?

Связь ведь между чертежом и моделью есть, и не зависит она от имен файлов. У чертежа и модели могут быть разные имена файлов, но они будут прекрасно открывать друг друга по ссылкам. Но если я переименую совершенно другую модель по имени чертежа, солид будет ругаться, что модель не та. Соответственно, у модели есть внутренний идентификатор, по которому чертеж понимает, тот файл ему подсунули или нет. Как выйти на этот идентификатор, где он находится, что это и с чем его есть? Можно ли с ним работать через API?

Спасибо!

 

 

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, alek77 сказал:

у модели есть внутренний идентификатор, по которому чертеж понимает, тот файл ему подсунули или нет. Как выйти на этот идентификатор

"SW не делает эти данные общедоступными, очевидно, потому что это было бы слишком удобно для программистов, которым нужна эта информация" ( Гуглоперевод )))

Ссылка на пост и возможный способ решения твоей задачи -

https://forum.solidworks.com/thread/11814

 

У автора поста есть и прога соответствующая, но "за древностию лет", скорее всего нерабочая (

http://esoxrepublic.com/freeware/WhereUsed.php

 

 

 

 

 

Ссылка на сообщение
Поделиться на других сайтах
15 часов назад, alek77 сказал:

Связь ведь между чертежом и моделью есть, и не зависит она от имен файлов.

Не правда ваша, связь исключительно по имени, при чём по первому попавшемуся с таким же именем файлу.

А вообще тут бы наводить порядок не с АПИ, а в головах пользователей превращающих хранение своих файлов в большую файловую помойку.

15 часов назад, alek77 сказал:

чертеж почти утерян, так как следов нет.

Откройте в этом случае документ в  режиме только просмотра и/или через eDrawings - это возможно позволить хотя бы посмотреть, что было в документе, что бы поискать потом что-то похожее в моделях.

15 часов назад, alek77 сказал:

Соответственно, у модели есть внутренний идентификатор, по которому чертеж понимает, тот файл ему подсунули или нет. Как выйти на этот идентификатор, где он находится, что это и с чем его есть?

Как ни крути, что бы его получить простыми средствами АПИ нужно открыть файл и это происходит не быстро, а при обилии файлов это бесперспективно.

 

15 часов назад, alek77 сказал:

Можно ли с ним работать через API?

Вероятно чем-то может помочь раздел DocumentManager, что бы можно было извлекать данные не открывая файл (получая данные напрямую из файла), но данный раздел требует отдельного запроса для получения ключа при наличии активной подписки на буржуйскую поддержку. Так же данный инструмент предоставляется на свой страх и риск, настоятельно предлагая резервировать файлы в которые происходит вмешательство через данный инструмент.

Ссылка на сообщение
Поделиться на других сайтах

Уважаемые форумчане!

Подскажите кто-нибудь сталкивался с макросом, который создаёт лог всех сохраненных файлов в SW? В логе дата время и название сохраненного файла.

Ссылка на сообщение
Поделиться на других сайтах
54 минуты назад, Redinskiy сказал:

Подскажите кто-нибудь сталкивался с макросом, который создаёт лог всех сохраненных файлов в SW? В логе дата время и название сохраненного файла.

Теоретически возможно, через EVENTS с отслеживанием события сохранения. Но какой практический смысл от это информации? Ведь после сохранения файл может быть удалён/перенесён/переименован...

 

 

Ссылка на сообщение
Поделиться на других сайтах

@Kelny Мне это необходимо для анализа рабочего времени затраченного на каждый проект. Лог я умею обрабатывать.

Изменено пользователем Redinskiy
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...