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

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

Спасибо за деталь. Написал макрос, который переносит  свойства из списков вырезов активной моделе (сборка или деталь) в свойства конфигурации. Скачать можно здесь: http://cloud.ic3d.com.au/macros/CopyPropertiesFromCutListToConf.swp

 

~A.

Спасибо огромное. Выш макрос работает в несколько раз быстрее моего. Разбираю построчно ваш макрос. Будут вопросы можно Вам позадавать?

 

И еще вопрос не подскажите макрос для подсчета колличества деталей в сборке?

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


Будут вопросы можно Вам позадавать?

 
Да. конечно.
 
 

И еще вопрос не подскажите макрос для подсчета колличества деталей в сборке?

 
Посмотрите пример ниже. Выводится в окно Immediate (Cctrl+G). Выводится путь к файлу, конфигурация и количество. Для виртуальных компонентов выводится временный путь.
 
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc

Sub main()

    Set swApp = Application.SldWorks
    
    Set swAssy = swApp.ActiveDoc
    
    Dim procFiles As Object
    Set procFiles = CreateObject("Scripting.Dictionary")
    
    Dim vComps As Variant
    vComps = swAssy.GetComponents(False)
    
    Dim i As Integer
    
    For i = 0 To UBound(vComps)
        Dim swComp As SldWorks.Component2
        Set swComp = vComps(i)
        Dim key As String
        key = UCase(swComp.GetPathName() & ":" & swComp.ReferencedConfiguration)
        If Not procFiles.Exists(key) Then
            procFiles.Add key, 1
        Else
            procFiles.Item(key) = procFiles.Item(key) + 1
        End If
    Next
    
    Dim compNames As Variant
    compNames = procFiles.keys
    For i = 0 To UBound(compNames)
        Dim compName As String
        compName = copNames(i)
        Debug.Print compName & " - " & procFiles.Item(compName)
    Next
    
End Sub
Ссылка на сообщение
Поделиться на других сайтах

Разобрал Ваш код макроса Вы просто гуру в SolidWorks API, возникла гора вопросов, если Вам не сложно просветите пожалуйста. Все вопросы изложены прямо в коде в комментариях. Буду очень благодарен в пределах разумного.

 

 С уважением science

 

P.S. В приведенном Вами макросе опечатка в строке

compName = compNames(i)

Макрос с вопросами.txt

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

Я только начинаю писать на VBA с применение SW API. До этого все время (лет 7) писал на lisp для AutoCAD. В этой области я достаточно подкован а вот в VBA и SW API только разбираюсь.

 

 С уважением science

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

Разобрал Ваш код макроса Вы просто гуру в SolidWorks API, возникла гора вопросов, если Вам не сложно просветите пожалуйста. Все вопросы изложены прямо в коде в комментариях. Буду очень благодарен в пределах разумного.

 

 С уважением science

 

P.S. В приведенном Вами макросе опечатка в строке

compName = compNames(i)

 

Тут попытался ответить на Ваши вопросы:

 

http://cloud.ic3d.com.au/macros/sw_api_exp.pdf

 

Заранее прошу прощения за ошибки, если есть - у меня нет русской орфографии в Word. Решил сделать PDF, так как более удобно читать. Ваши вопросы окрашены зеленым, мои ответы - синим.

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

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

 

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

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

 

Закрывайте документ методом QuitDoc

 

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

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

Ну так дайте пользователю кнопку - "закрыть документ"

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

Вы не поняли. Пользователь открывает модель, запускает макрос. Макрос отрабатывает, а потом пользователь, если ему нужно, сам закрывает документ. Надо, чтобы при этом не появлялось окно запроса на сохранение.

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

Да всё я понял. Если макрос уже отработал, то какая пользователю разница? Если есть - дайте ему кнопку "выйти без сохранения", прям на CommandGroup повесьте.

Насколько я понимаю, модифицированный документ не вернуть в "немодифицированное состояние", флаг IsDirty срабатывает и всё. Если сделать документ "только для чтения", и так же попытаться его модифицировать (галка в настройках "не подсказывать о сохранении документов только для чтения" стоит), то при обычном закрытии окошко всё равно всплывает.

 

 Можно ещё с Undo поиграться программно. Не уверен что поможет.


если ему нужно, сам закрывает документ
 

Тем более, если всё это происходит потом! То работа вашего макроса никак с вашим же вопросом не связана)))

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

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

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

Я предлагаю решения  :smile: 

не должно появляться окно запроса
флаг IsDirty срабатывает и всё
Ссылка на сообщение
Поделиться на других сайтах

Возник вопрос.

Подскажите пожалуйста

 

    vComps = swAssy.GetComponents(False)

 

GetComponents - возвращает компонент модели

Можно ли как то просмотреть этот компонент например его имя или еще какие либо характеристики (нужно для сравнения с другим компонентом).

Изменено пользователем science
Ссылка на сообщение
Поделиться на других сайтах
    vComps = swAssy.GetComponents(False)   GetComponents - возвращает компонент модели

Вобщето не компонент, а набор компонентов: false to get the number of  top level and all child components http://help.solidworks.com/2010/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iassemblydoc~getcomponents.html

 

 

 

Можно ли как то просмотреть этот компонент например его имя
Dim oneComponent As Component2
oneComponent = vComps(i) 'i- номер компонента который вы хотите изучить внимательнее
oneComponent.Name2 'Имя i-того компонента 

Пример из справки по теме перечисления всех компонентов из выбранной сборки: http://help.solidworks.com/2010/english/api/sldworksapi/get_bodies_in_components_example_vbnet.htm

в VBA и SW API только разбираюсь

После открытия VBA нажмите F1 вам станет доступна справка.

SW API ищите информацию на сайте компании, там же можно и примеры поискать (раздел Справка по API, или тоже самое в справке программы на вашем компьютере): http://help.solidworks.com/

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

Вобщето не компонент, а набор компонентов: false to get the number of  top level and all child components http://help.solidworks.com/2010/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iassemblydoc~getcomponents.html

Dim oneComponent As Component2
oneComponent = vComps(i) 'i- номер компонента который вы хотите изучить внимательнее
oneComponent.Name2 'Имя i-того компонента 

Пример из справки по теме перечисления всех компонентов из выбранной сборки: http://help.solidworks.com/2010/english/api/sldworksapi/get_bodies_in_components_example_vbnet.htm

После открытия VBA нажмите F1 вам станет доступна справка.

SW API ищите информацию на сайте компании, там же можно и примеры поискать (раздел Справка по API, или тоже самое в справке программы на вашем компьютере): http://help.solidworks.com/

Спасибо огромное я сам дотопал. В хелпах нашел.

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

 

Подскажите пожалуйста еще в одном вопросе.

Как определить открыт ли файл сборки и если открыт то сделать его активным а если нет то открыть и сделать активным.

Задача в следующем в макросе предусмотрены варианты при открытой детали или сборки, а при открытом чертеже все намного сложнее. Я упростил задачу хочу сделать так.

Файл чертежа должен будет иметь такоеже имя как у файла сборки. Затем меняю расширение фала чертежа на сборку открываю сборку делаю ее активной и получаю тип открытого документа, далее закрываю активный файл. Однако если до этого файл был открыт и с ним работали то макрос закроет и его.

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

В детали имеется один нарисованный сгиб, однако длины у него разные (длины отмечены размерными линиями на прилагаемом рисунке).

Можно ли получить длины сгибов с помощью API? Заранее спасибо за подсказки.

post-14868-0-83131500-1450714825.png

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

В детали имеется один нарисованный сгиб, однако длины у него разные (длины отмечены размерными линиями на прилагаемом рисунке).

Можно ли получить длины сгибов с помощью API? Заранее спасибо за подсказки.

 

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

Ниже пример, который выводит все длины сгибов в метрах выделенного "нарисованного сгиба"

 

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Sub main()

    Set swApp = Application.SldWorks
    
    Set swModel = swApp.ActiveDoc
    
    Dim swSelMgr As SldWorks.SelectionMgr
    
    Set swSelMgr = swModel.SelectionManager
    
    Dim swFeat As SldWorks.Feature
    
    Set swFeat = swSelMgr.GetSelectedObject6(1, -1)

    Dim swBendSketch As SldWorks.Sketch
    
    Set swBendSketch = GetBendSketch(swFeat)
    
    Dim lengths As String
    Dim vSegs As Variant
    vSegs = swBendSketch.GetSketchSegments()
    
    Dim i As Integer
    
    For i = 0 To UBound(vSegs)
        Dim swSkSeg As SldWorks.SketchSegment
        Set swSkSeg = vSegs(i)
        If swSkSeg.GetType() = swSketchSegments_e.swSketchLINE Then
            lengths = lengths & swSkSeg.GetLength() & "m; "
        End If
    Next
    
    MsgBox lengths
    
End Sub

Function GetBendSketch(swFeat As SldWorks.Feature) As SldWorks.Sketch
    
    Dim swSubFeat As SldWorks.Feature
    
    Set swSubFeat = swFeat.GetFirstSubFeature
    
    Do While Not swSubFeat Is Nothing
        Dim swSketch As SldWorks.Sketch
        Set swSketch = swSubFeat.GetSpecificFeature2
        If Not swSketch Is Nothing Then
            Set GetBendSketch = swSketch
            Exit Do
        End If
        Set swSubFeat = swSubFeat.GetNextSubFeature
    Loop
    
End Function

Спасибо огромное я сам дотопал. В хелпах нашел.

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

 

Подскажите пожалуйста еще в одном вопросе.

Как определить открыт ли файл сборки и если открыт то сделать его активным а если нет то открыть и сделать активным.

Задача в следующем в макросе предусмотрены варианты при открытой детали или сборки, а при открытом чертеже все намного сложнее. Я упростил задачу хочу сделать так.

Файл чертежа должен будет иметь такоеже имя как у файла сборки. Затем меняю расширение фала чертежа на сборку открываю сборку делаю ее активной и получаю тип открытого документа, далее закрываю активный файл. Однако если до этого файл был открыт и с ним работали то макрос закроет и его.

 

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

В данном случае нужно предусмотреть два варианта. Файл сборки открыт в отдельном окне и файл сборки открыт, но невидим. Например, в случае с чертежом (если чертеж не detached и не lightweight), то его модели уже подгружены в мамять, но они невидимы. Ниже пример, который активирует сборку с указаным именем и закроет ее в случае, когда она не была открыта в собственном окне перед запуском макроса. Замените путь в константе PATH на Ваш путь к файлу.

Const PATH As String = "C:\Samples\Assembly.SLDASM"

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    
    Dim swModel As SldWorks.ModelDoc2
    
    Set swModel = swApp.GetOpenDocumentByName(PATH)
    
    Dim isOpened As Boolean
    
    If Not swModel Is Nothing Then
        isOpened = swModel.Visible
    End If
    
    Set swModel = swApp.OpenDoc6(PATH, swDocumentTypes_e.swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", 0, 0)
    
    If Not swModel Is Nothing Then
        swApp.ActivateDoc3 swModel.GetTitle(), False, swRebuildOnActivation_e.swDontRebuildActiveDoc, 0
    End If
    
    MsgBox "Is Opened: " & isOpened
    
    If False = isOpened Then
        swApp.CloseDoc swModel.GetTitle
    End If
    
End Sub

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

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

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

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

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

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

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

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

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

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

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



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