Jump to content

Recommended Posts

Chuvak

@makarov

Option Explicit

'---БЛОК ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ SOLIDWORKS---
Private swApp           As SldWorks.SldWorks
Private swModel         As SldWorks.ModelDoc2
Private swView          As SldWorks.View
Private swSelectionMgr  As SldWorks.SelectionMgr
Private Pi              As Double
Private boolStatus      As Boolean

Public Sub Prog1_MainProgram()

    On Error GoTo ErrorHandler      ' активируем обработчик ошибок
        
    Pi = 4 * Atn(1)     ' задаем значение числа пи
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swSelectionMgr = swModel.SelectionManager
    Set swView = swSelectionMgr.GetSelectedObjectsDrawingView2(1, -1) ' получаем указатель на выбранный вид
    If Not swView Is Nothing Then ' если вид был реально выбран, то
        swView.Angle = swView.Angle + (Pi / 2)                              ' поворачиваем вид на 90 гр. против часовой стрелки
        boolStatus = swSelectionMgr.AddSelectionListObject(swView, Nothing) ' выбираем вид заново
    End If
    End ' закрываем макрос

ErrorHandler:   ' если в макросе произошла ошибка, то
    MsgBox Prompt:="ВНИМАНИЕ! Произошла непредвиденная ошибка." & vbNewLine & "Код и описание ошибки: " & vbNewLine & Err.Number & " - " & Err.Description, Buttons:=16, Title:="ОШИБКА" ' информируем о критической ошибке
    End     ' закрываем макрос
    
End Sub

 

Link to post
Share on other sites


Chuvak

@makarov , усовершенствовал макрос, теперь можно также поворачивать несколько видов сразу. Рекомендую выбирать виды через дерево модели чертежа

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

Option Explicit

'---БЛОК ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ SOLIDWORKS---
Private swApp               As SldWorks.SldWorks
Private swModel             As SldWorks.ModelDoc2
Private swView              As SldWorks.View
Private swArrViews()        As SldWorks.View
Private swSelectionMgr      As SldWorks.SelectionMgr
Private Pi                  As Double
Private i                   As Long
Private j                   As Long
Private boolStatus          As Boolean

Public Sub Prog1_MainProgram()  ' программа "Поворот чертежных видов"

    On Error GoTo ErrorHandler  ' активируем обработчик ошибок
        
    Pi = 4 * Atn(1)     ' задаем значение числа пи
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swSelectionMgr = swModel.SelectionManager
    
    If swSelectionMgr.GetSelectedObjectCount2(-1) > 0 Then  ' если кол-во выбранных объектов больше нуля, тогда
        j = 0
        ReDim swArrViews(j) ' создаем массив для чертеж. видов
        For i = 1 To swSelectionMgr.GetSelectedObjectCount2(-1)         ' проходим циклом по выбранным объектам
            If swSelectionMgr.GetSelectedObjectType3(i, -1) = 12 Then   ' если выбранный объект - это чертеж. вид, то
                Set swView = swSelectionMgr.GetSelectedObjectsDrawingView2(i, -1) ' получаем указатель на выбранный вид
                If j <> 0 Then ReDim Preserve swArrViews(j) 'если в массиве с видами уже есть вид, то расширяем массив на 1 место
                Set swArrViews(j) = swView  ' добавляем чертежный вид в массив
                j = j + 1
            End If
        Next i
        
        If Not swArrViews(0) Is Nothing Then    ' если в массив был добавлен хоть один чертеж. вид, то
            For i = LBound(swArrViews) To UBound(swArrViews)            ' проходим циклом по массиву с видами
                swArrViews(i).Angle = swArrViews(i).Angle + (Pi / 2)    ' поворачиваем вид на 90 гр. против часовой стрелки
            Next i
            
            For i = LBound(swArrViews) To UBound(swArrViews)    ' проходим циклом по массиву с видами
                boolStatus = swSelectionMgr.AddSelectionListObject(swArrViews(i), Nothing) ' выбираем вид заново
            Next i
        End If
    End If
    
    End ' закрываем макрос

ErrorHandler:   ' если в макросе произошла ошибка, то
    MsgBox Prompt:="ВНИМАНИЕ! Произошла непредвиденная ошибка." & vbNewLine & "Код и описание ошибки: " & vbNewLine & Err.Number & " - " & Err.Description, Buttons:=16, Title:="ОШИБКА" ' информируем о критической ошибке
    End     ' закрываем макрос
    
End Sub

 

 

  • Нравится 2
  • Чемпион 1
Link to post
Share on other sites

@Chuvak Спасибо! То, что надо!

 

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

Можно поиграться с китайским https://www.deepseek.com/en он бесплатный и вроде как по качеству на уровне платных. Но все равно безбожно косячит, придумывает сам методы, которых в АПИ солида нет. Зато можно какие-то простые вещи у него спрашивать. Так что макрос полностью не напишет, но помощь какую-то оказать может.

  • Нравится 1
Link to post
Share on other sites
Chuvak

@makarov , благодарю за ссылку! Макросы то я пишу самостоятельно, благо там ничего прям мегасложного нет) Просто стало интересно, какой код и за какое время выдают нейросети. В любом случае приходится копаться в объектной модели Solidworks, там все методы, свойства и события описаны.

Link to post
Share on other sites
freedom8005

Здравствуйте. Можете пояснить мне скорее всего элементарные следующие понятия:

1. modeldoc2 это модель открытая в редакторе

2. modeldoc2  это объект который может быть одновременно Assemblydoc/component2/partdoc до тех пор пока не происходит действительное присвоение конкретному типу

3. если с деталью работаю из контекста сборки это component2, если с этой же деталью работают из отдельно открытого окна это partdoc

4. метод который имеет название swModel.FeatureManager.CreateDefinition(swFmFillet)  создаёт структуру перед передачей её в метод swModel.FeatureManager.CreateFeature(swFeatData)

5. что за тип IFeature, ну I видимо интерфейс, а Feature??

 

У меня проблемы с контекстом выполнения макроса. Если я выполняю его из под partdoc в отдельном окне, всё работает, если из под  modeldoc2  в контексте сборки то нет. Не делать же переход ради этого на ходу между выделенным редактированием и редактированием детали в сборке. В компонент2 нет нужных операций. Всё собирается и выполняется без ошибок. Уже не знаю куда копать.

Link to post
Share on other sites
Maik812

 

01.09.2025 в 05:45, ЮрЮрыч сказал:

Здравствуйте, как отсортировать свойства (по алфавиту или иным способом). Пример нашел, но там через del и add. Хотелось бы просто заменой номера свойства. 

Я только так работаю..

Frame1.gif

Jpegc1111.jpg

Link to post
Share on other sites
10 минут назад, freedom8005 сказал:

может быть одновременно Assemblydoc/component2/partdoc

Насколько я знаю, не component2, а drawingdoc. Если вы пытаетесь факсу в чертеж, то понятно методов таких нет. 

Link to post
Share on other sites
freedom8005
20 часов назад, jtok сказал:

Насколько я знаю, не component2, а drawingdoc. Если вы пытаетесь факсу в чертеж, то понятно методов таких нет. 

Значит я неправильно назвал первую и третью позицию. Все работы ведутся в 3д редакторе. Всё что имеет на конце doc относится только к 2д чертежам?

Link to post
Share on other sites
1 час назад, freedom8005 сказал:

Всё что имеет на конце doc относится только к 2д чертежам?

Нет. AssemblyDoc - это сборка. partDoc это деталь. DrawingDoc это чертеж.

Link to post
Share on other sites
freedom8005

Собственно вот кусок кода, работает только если взять деталь в отдельное окно. В контексте сборки part получаю через getedittarget. В контексте сборки не работает(деталь взята на редактирование). Если есть куда - подтолкните и дайте направление или пальцем ткните где проблема. Будет круто.

 

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
'тут ручной выбор грани
Dim swFeatData As Object
Set swFeatData = Part.FeatureManager.CreateDefinition(swFmFillet)

swFeatData.Initialize swConstRadiusFillet

Dim swFace As Object
Dim facesArray(0) As Object
Set swFace = Part.SelectionManager.GetSelectedObject6(1, 1)
Set facesArray(0) = swFace
Dim facesVar As Variant
facesVar = facesArray
swFeatData.SetFaces 0, (facesVar)

swFeatData.AsymmetricFillet = False
swFeatData.DefaultRadius = 0.01
swFeatData.ConicTypeForCrossSectionProfile = swFeatureFilletCircular
swFeatData.CurvatureContinuous = False
swFeatData.ConstantWidth = 0.01
swFeatData.IsMultipleRadius = False
swFeatData.OverflowType = swFilletOverFlowType_Default

Dim swFeature As Object
Set swFeature = Part.FeatureManager.CreateFeature(swFeatData)
End Sub

 

Link to post
Share on other sites
Kelny
17.09.2025 в 21:47, freedom8005 сказал:

У меня проблемы с контекстом выполнения макроса. Если я выполняю его из под partdoc в отдельном окне, всё работает, если из под  modeldoc2  в контексте сборки то нет. Не делать же переход ради этого на ходу между выделенным редактированием и редактированием детали в сборке.

Немного не так, МОДЕЛДОК2 в вашем случае завязан со сборкой и ей вы наверняка присволи АКТИВДОК :

 

...
Dim swApp As Object

Dim Part As Object
...
Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
...

Во первых в вашем коде Part не объявлен явно как МоделДок2 (Dim Part as SldWorks.ModelDoc2 - при таком объявлении компилятор будет подсказывать с возможными вариантами для ввода, не нужно будет искать и вбивать самостоятельно), во вторых Part это всего лишь имя-указатель, но в вашем конетксте это фактически ссылка на открутую сборку, так что можно было бы дать имя PartAsm для наглядности в коде.

 

Для того что бы получить указатель на один из компонетов сборки, думается, надо для этой детали создать свой МОДЕЛДОК2, но уже не как АКТИВДОК, а с указанием на конкретную модель с которой вы желаете работать. Но при этом создать именно ещё один, а не заменить первый. То есть в данном случае вы после получения указателя на сборку, найти нужную деталь или выбрать её самостоятельно в графической области или в дереве, а потом новому идентификатору, например, Part2 присвоить указатель на выбранную деталь Dim Part2 As SldWorks.ModelDoc2, Set Part2 = и тут указатель на ту самю выбранную деталь (swApp.GetOpenDocument("имя_детали-заголовок")), например (не уверен нужно ли в этом случае брать деталь на редактирование в контексте, как это делается при ручном редактировании детали в контексте сборки с выбором соответствующего документа, но возможно будте зависеть от желаемого результата):

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

https://help.solidworks.com/2018/english/api/sldworksapi/Get_Names_of_Open_Documents_Example_VB.htm

Get Names of Open Documents Example (VBA)

This example shows how to get the names of the open documents, the names of the referenced model documents, and their visibility.






'-------------------------------------
' Preconditions:
' 1. Open multiple model documents.
' 2. Open the Immediate window.
'
' Postconditions:
' 1. Gets the names of the open and referenced model documents.
' 2. Examine the Immediate window.
'-------------------------------------
Option Explicit





Sub main()





    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swModelTitle As SldWorks.ModelDoc2
    Dim swModelPath As SldWorks.ModelDoc2
    Dim cTitle As New Collection
    Dim vTitle As Variant
    Dim cPath As New Collection
    Dim vPath As Variant





    Set swApp = Application.SldWorks
    Set swModel = swApp.GetFirstDocument





    While Not swModel Is Nothing
        ' Assembly components are opened, but are not visible
        ' until opened by the user
        Debug.Print swModel.GetPathName & "  [" & swModel.Visible & "]"
        Debug.Print "  " & swModel.GetTitle & " [" & swModel.GetType & "]"





        ' The document name contains a filename extension
        ' if the document has been saved
        ' and is subject to Microsoft Windows Explorer setting;
        ' the document name does not contain a
        ' filename extension if the document has not been saved;
        ' ModelDoc2::GetPathName is blank until the file is saved
        cTitle.Add swModel.GetTitle
        cPath.Add swModel.GetPathName
        Set swModel = swModel.GetNext
    Wend





    Debug.Print " "





    For Each vTitle In cTitle
        Set swModelTitle = swApp.GetOpenDocument(vTitle): Debug.Assert Not swModelTitle Is Nothing
        Debug.Print swModelTitle.GetPathName & "  [" & swModelTitle.Visible & "]"
        Debug.Print "  " & swModelTitle.GetTitle & " [" & swModelTitle.GetType & "]"
    Next vTitle
    





    Debug.Print " "





    For Each vPath In cPath
        Set swModelPath = swApp.GetOpenDocument(vPath)
        If Not swModelPath Is Nothing Then
        Debug.Print swModelPath.GetPathName & "  [" & swModelPath.Visible & "]"
            Debug.Print "  " & swModelPath.GetTitle & " [" & swModelPath.GetType & "]"
        End If
    Next vPath





End Sub

 

 

 

Edited by Kelny

Макросы и программы для Solidworks: http://kelnyproject.ucoz.ru/

Link to post
Share on other sites
freedom8005
14 часов назад, Kelny сказал:

Немного не так, МОДЕЛДОК2 в вашем случае завязан со сборкой и ей вы наверняка присволи АКТИВДОК :

 


...
Dim swApp As Object

Dim Part As Object
...
Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
...

Во первых в вашем коде Part не объявлен явно как МоделДок2 (Dim Part as SldWorks.ModelDoc2 - при таком объявлении компилятор будет подсказывать с возможными вариантами для ввода, не нужно будет искать и вбивать самостоятельно), во вторых Part это всего лишь имя-указатель, но в вашем конетксте это фактически ссылка на открутую сборку, так что можно было бы дать имя PartAsm для наглядности в коде.

 

Для того что бы получить указатель на один из компонетов сборки, думается, надо для этой детали создать свой МОДЕЛДОК2, но уже не как АКТИВДОК, а с указанием на конкретную модель с которой вы желаете работать. Но при этом создать именно ещё один, а не заменить первый. То есть в данном случае вы после получения указателя на сборку, найти нужную деталь или выбрать её самостоятельно в графической области или в дереве, а потом новому идентификатору, например, Part2 присвоить указатель на выбранную деталь Dim Part2 As SldWorks.ModelDoc2, Set Part2 = и тут указатель на ту самю выбранную деталь (swApp.GetOpenDocument("имя_детали-заголовок")), например (не уверен нужно ли в этом случае брать деталь на редактирование в контексте, как это делается при ручном редактировании детали в контексте сборки с выбором соответствующего документа, но возможно будте зависеть от желаемого результата):

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

https://help.solidworks.com/2018/english/api/sldworksapi/Get_Names_of_Open_Documents_Example_VB.htm

Get Names of Open Documents Example (VBA)

This example shows how to get the names of the open documents, the names of the referenced model documents, and their visibility.





'-------------------------------------
' Preconditions:
' 1. Open multiple model documents.
' 2. Open the Immediate window.
'
' Postconditions:
' 1. Gets the names of the open and referenced model documents.
' 2. Examine the Immediate window.
'-------------------------------------
Option Explicit




Sub main()




    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swModelTitle As SldWorks.ModelDoc2
    Dim swModelPath As SldWorks.ModelDoc2
    Dim cTitle As New Collection
    Dim vTitle As Variant
    Dim cPath As New Collection
    Dim vPath As Variant




    Set swApp = Application.SldWorks
    Set swModel = swApp.GetFirstDocument




    While Not swModel Is Nothing
        ' Assembly components are opened, but are not visible
        ' until opened by the user
        Debug.Print swModel.GetPathName & "  [" & swModel.Visible & "]"
        Debug.Print "  " & swModel.GetTitle & " [" & swModel.GetType & "]"




        ' The document name contains a filename extension
        ' if the document has been saved
        ' and is subject to Microsoft Windows Explorer setting;
        ' the document name does not contain a
        ' filename extension if the document has not been saved;
        ' ModelDoc2::GetPathName is blank until the file is saved
        cTitle.Add swModel.GetTitle
        cPath.Add swModel.GetPathName
        Set swModel = swModel.GetNext
    Wend




    Debug.Print " "




    For Each vTitle In cTitle
        Set swModelTitle = swApp.GetOpenDocument(vTitle): Debug.Assert Not swModelTitle Is Nothing
        Debug.Print swModelTitle.GetPathName & "  [" & swModelTitle.Visible & "]"
        Debug.Print "  " & swModelTitle.GetTitle & " [" & swModelTitle.GetType & "]"
    Next vTitle
    




    Debug.Print " "




    For Each vPath In cPath
        Set swModelPath = swApp.GetOpenDocument(vPath)
        If Not swModelPath Is Nothing Then
        Debug.Print swModelPath.GetPathName & "  [" & swModelPath.Visible & "]"
            Debug.Print "  " & swModelPath.GetTitle & " [" & swModelPath.GetType & "]"
        End If
    Next vPath




End Sub

 

 

 

Здравствуйте. Я попробовал как вы упомянули, создал отдельный ModelDoc для компонента получив его через  GetEditTarget. По ходу выполнения кода из контекста сборки все действия выполняются лишь от asmModel(иначе просто не работает), partModel используется только для получения тел/имен граней и поверхностей. Скругление так и не заработало - печаль. К сожалению создание детали вне контекста не представляется возможным в связи с необходимостью проецирования других компонентов. Посижу, почитаю может что найду.

Link to post
Share on other sites
  • 2 weeks later...
freedom8005

Подскажите по методу AccessSelections Method (ISimpleFilletFeatureData2), согласно описанию он предоставляет доступ к выделенным объектам для создания определения. В аргументы подпихиваю согласно таблице из хелпа (AsmModel, PartComp) в любых раскладах при проходе по строчке падает Solidworks. Оба аргумента инициализированы, Где мне стоит поискать решение проблемы?

Link to post
Share on other sites
ЮрЮрыч

Здравствуйте. Как установить длину сплайна? Занимаюсь routing, есть команда зафиксировать длину маршрута, но в api такой команды нет. Есть получить или установить фиксированую длину, а вот поменять статус длины маршрута нет. Поэтому хочу просто задать длины сегментов маршрута. 

Link to post
Share on other sites
freedom8005

Добро пожаловать, снова. Подскажите с чем может быть связана ошибка Automation error, код ошибки больше похож на диапазон значения типа данных. появляется при следующей последовательности.

    Set face = group.Faces.Item(1)
    face.Select4 False, Nothing

 group это локальная переменная типа класс, face as face2. при вызове метода insertnewpart2 возвращает ошибку 7 (swInsertNewPartError_CannotSelectFaceOrPlane), проблема в том что не может выбрать опорную плоскость/грань для создания компонента, но не пойму почему. Этот кусок находится внутри цикла, и стабильно на второй итерации - краш, т.е. при первом проходе(i=0) всё работает, а при втором нет. Если есть мысли или направление, подскажите буду там копать.

05.10.2025 в 05:50, ЮрЮрыч сказал:

Здравствуйте. Как установить длину сплайна? Занимаюсь routing, есть команда зафиксировать длину маршрута, но в api такой команды нет. Есть получить или установить фиксированую длину, а вот поменять статус длины маршрута нет. Поэтому хочу просто задать длины сегментов маршрута. 

А в чем разница между задать длину и зафиксировать длину? 

Link to post
Share on other sites
  • 2 weeks later...
freedom8005

Добро пожаловать, снова. Суть проблемы: код выполняется быстрее чем отвечает графическая оболочка, из-за этого возникают ошибки. Участок кода по шагам проходит отлично, а насквозь падает в ошибку. В прикладном С я обычно навтыкиваю условий, накрайняк программный таймер по систик. А тут то можно без костылей как то? в частности метод selectbyid2

Link to post
Share on other sites
freedom8005
18.10.2025 в 11:01, Chuvak сказал:

@freedom8005 , на каком языке написан макрос? На C или на VBA?

макрос написан на VBA, еще заметил что элемент не выбирается если находится в невидимой зоне, чертовщина какая то. И еще вопрос "не отходя от кассы", есть такой параметр как ID (метод SetId и GetId), насколько я понял из описания это уникальный временный идентификатор объекта который виден только в текущем рабочем пространстве (если был присвоен в сборке, то при редактировании детали в новом окне он будет равен 0). Как с его помощью производить выборку?

Edited by freedom8005
Дополнен вопрос
Link to post
Share on other sites
Chuvak

@freedom8005, мне будет проще вам ответить, если Вы объясните, какую именно задачу вы хотите решить с помощью макроса и увидеть бы сам код)

Link to post
Share on other sites
freedom8005
12 часов назад, Chuvak сказал:

@freedom8005, мне будет проще вам ответить, если Вы объясните, какую именно задачу вы хотите решить с помощью макроса и увидеть бы сам код)

 

Я по очереди на справочных поверхностях создаю эскизы.

Коллекция Planes содержит item1 и item2. Первый вариант работает в зависимости от машины (скорее всего в настройках где то пути относительные или абсолютные), а второй не работает совсем хотя должен. Переменные имеют конкретный тип (не object). name после операций имеет вид "Плоскость1@Деталь1-1@asm.sldasm".

 

    For i = 1 To planes.Count 
		//Вариант 1
        name = partModel.GetEntityName(planes.Item(i))
        name = name & "@" & PartComp.Name2 & "@" & asmModel.GetTitle
        asmModel.Extension.SelectByID2 name, "PLANE", 0, 0, 0, False, 0, Nothing, 0 
        
		//Вариант 2
        Set tRefplane = planes.Item(i)
        tRefplane.Select4 False,nothing
        
        asmModel.InsertSketch2 True
        //графические операции
        asmModel.InsertSketch2 True 'на этом этапе имеем закрытый эскиз с графикой
	next i

 

Edited by freedom8005
уточнения
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...