Makro-Solidworks zur Generierung von Schweißkonstruktionen

Hallo ihr alle

Ich bin auf der Suche nach einem Code, mit dem ich eine Schweißkonstruktion generieren kann.
Ich muss röhrenförmige Strukturen erstellen, die einander sehr ähnlich sind.

Rohrförmige Strukturen sind immer eine Ansammlung von Rohren in derselben Ebene, diese Struktur ist immer rechteckig und besteht aus einer Reihe von horizontalen und vertikalen Rohren, die weniger als 500 mm voneinander entfernt sind.

Ich hätte gerne einen Code für eine Arbeitsbasis, die den Basissketch generiert und die Rohre auf diesen Sketch anwendet.

Hier ist ein Beispiel dafür, was ich pro Makro erstellen möchte:

Ich denke, eine Basis mit einem Rahmen ist ein Kreuz in der Mitte, sollte für mich ausreichen, um den Rest zu automatisieren, aber ich nehme alles, was Ihnen einfällt.
Denn ich habe noch nie eine makrogeschweißte Konstruktion erstellt.

Ich denke darüber nach, ein UserForm zu durchlaufen, um meine Grunddaten einzugeben und dann die Struktur zu generieren.

Ich hoffe, ich habe mich klar genug ausgedrückt, ansonsten zögert nicht, mich zu fragen.

Ich habe diesen Code, mit dem Sie dank einer vorhandenen Skizze eine Schweißkonstruktion erstellen können.

Das Problem ist, dass, wenn ich den Code mit einem Sketch starte, der 6 Segmente hat, es nur 5 gibt, die in die Schweißkonstruktion gehen.
Dies scheint naheliegend, weil " i=1 ".
Wenn ich jedoch i = 0 eingebe, funktioniert der Code nicht mehr, es wird keine gelötete Konstruktion mehr erstellt.

Code mit i=1:

Dim swApp As SldWorks.SldWorks
Dim Part As ModelDoc2
Dim boolstatus As Boolean
Dim FeatMgr As FeatureManager
Dim SelMgr As SelectionMgr
Dim mySketch As SldWorks.Sketch
Dim swWeldFeat As SldWorks.Feature
Dim swWeldFeatData As SldWorks.StructuralMemberFeatureData
Dim skSegCount As Long
Dim vSkSegments As Variant
Dim skSegment As SldWorks.SketchSegment
Dim i As Integer

Option Explicit

Public Sub Main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    Set FeatMgr = Part.FeatureManager
    Set SelMgr = Part.SelectionManager

    Dim myFeature2 As Object
    Set myFeature2 = Part.FeatureByName("NdM 3D")
    Set mySketch = myFeature2.GetSpecificFeature2()
    vSkSegments = mySketch.GetSketchSegments()
    skSegCount = UBound(vSkSegments)
    Debug.Print "    nombre de segments dans l'esquisse = " & skSegCount
    
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
    Dim GroupArray() As Object
    ReDim GroupArray(0 To 100) As Object
    
    For i = 1 To UBound(vSkSegments)
        Dim Group As StructuralMemberGroup
        Set Group = FeatMgr.CreateStructuralMemberGroup
        Dim Segments(0) As Object
        boolstatus = Part.Extension.SelectByID2("Line" & i & "@NdM 3D", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
        Set Segments(0) = SelMgr.GetSelectedObject6(1, 0)
        Debug.Print "  Sketch = " & vSkSegments(i-1).GetName
        Debug.Print "  Sketch = " & vSkSegments(i-1).GetLength
        Group.Segments = (Segments)
        Set GroupArray(i-1) = Group
    Next i

    Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp 2022\SOLIDWORKS\lang\french\weldment profiles\ISO\Tube (square)\40 x 40 x 3.2.sldlfp", 1, False, (GroupArray))
    Part.ClearSelection2 True

End Sub

Code mit i=0:

Dim swApp As SldWorks.SldWorks
Dim Part As ModelDoc2
Dim boolstatus As Boolean
Dim FeatMgr As FeatureManager
Dim SelMgr As SelectionMgr
Dim mySketch As SldWorks.Sketch
Dim swWeldFeat As SldWorks.Feature
Dim swWeldFeatData As SldWorks.StructuralMemberFeatureData
Dim skSegCount As Long
Dim vSkSegments As Variant
Dim skSegment As SldWorks.SketchSegment
Dim i As Integer

Option Explicit

Public Sub Main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    Set FeatMgr = Part.FeatureManager
    Set SelMgr = Part.SelectionManager

    Dim myFeature2 As Object
    Set myFeature2 = Part.FeatureByName("NdM 3D")
    Set mySketch = myFeature2.GetSpecificFeature2()
    vSkSegments = mySketch.GetSketchSegments()
    skSegCount = UBound(vSkSegments)
    Debug.Print "    nombre de segments dans l'esquisse = " & skSegCount
    
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
    Dim GroupArray() As Object
    ReDim GroupArray(0 To 100) As Object
    
    For i = 0 To UBound(vSkSegments)
        Dim Group As StructuralMemberGroup
        Set Group = FeatMgr.CreateStructuralMemberGroup
        Dim Segments(0) As Object
        boolstatus = Part.Extension.SelectByID2("Line" & i & "@NdM 3D", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
        Set Segments(0) = SelMgr.GetSelectedObject6(1, 0)
        Debug.Print "  Sketch = " & vSkSegments(i).GetName
        Debug.Print "  Sketch = " & vSkSegments(i).GetLength
        Group.Segments = (Segments)
        Set GroupArray(i) = Group
    Next i

    Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp 2022\SOLIDWORKS\lang\french\weldment profiles\ISO\Tube (square)\40 x 40 x 3.2.sldlfp", 1, False, (GroupArray))
    Part.ClearSelection2 True

End Sub

Hier ist die Datei, die zum Testen verwendet wird:
3D-Lautsprecher.SLDPRT (42.5 KB)

Für das obige Code-Problem habe ich eine Lösung gefunden, das Problem mit dem Segmentnamen:

Dim swApp As SldWorks.SldWorks
Dim Part As ModelDoc2
Dim boolstatus As Boolean
Dim FeatMgr As FeatureManager
Dim SelMgr As SelectionMgr
Dim mySketch As SldWorks.Sketch
Dim swWeldFeat As SldWorks.Feature
Dim swWeldFeatData As SldWorks.StructuralMemberFeatureData
Dim skSegCount As Long
Dim vSkSegments As Variant
Dim skSegment As SldWorks.SketchSegment
Dim i As Integer

Option Explicit

Public Sub Main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    Set FeatMgr = Part.FeatureManager
    Set SelMgr = Part.SelectionManager

    Dim myFeature2 As Object
    Set myFeature2 = Part.FeatureByName("NdM 3D")
    Set mySketch = myFeature2.GetSpecificFeature2()
    vSkSegments = mySketch.GetSketchSegments()
    skSegCount = UBound(vSkSegments)
    Debug.Print "    nombre de segments dans l'esquisse = " & skSegCount
    
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
    Dim GroupArray() As Object
    ReDim GroupArray(0 To 100) As Object
    
    For i = 0 To UBound(vSkSegments)
        Dim Group As StructuralMemberGroup
        Set Group = FeatMgr.CreateStructuralMemberGroup
        Dim Segments(0) As Object
        boolstatus = Part.Extension.SelectByID2(vSkSegments(i).GetName & "@NdM 3D", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
        Set Segments(0) = SelMgr.GetSelectedObject6(1, 0)
        Debug.Print "  Sketch = " & vSkSegments(i ).GetName
        Debug.Print "  Sketch = " & vSkSegments(i).GetLength
        Group.Segments = (Segments)
        Set GroupArray(i) = Group
        Stop
    Next i
Debug.Print "  Nb in group = " & UBound(GroupArray)
    Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp 2022\SOLIDWORKS\lang\french\weldment profiles\ISO\Tube (square)\40 x 40 x 3.2.sldlfp", 1, False, (GroupArray))
    Part.ClearSelection2 True

End Sub

Ich habe am Ende angefangen, jetzt muss ich herausfinden, wie ich einen Sketch mit VBA erstellen kann!!

Ohne über Code zu sprechen, haben Sie mit Wiederholungen von Feldern + kleinen Gleichungen getestet?

1 „Gefällt mir“

Hallo

Unterschätzen Sie nicht die Nützlichkeit der Makroaufzeichnung.

Hier ist ein Makro, das ich aufgezeichnet habe und das diese Anfrage beantwortet:

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
boolstatus = Part.Extension.SelectByID2("Plan de dessus", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch True
Part.ClearSelection2 True
boolstatus = Part.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swSketchAddConstToRectEntity, swUserPreferenceOption_e.swDetailingNoOptionSpecified, True)
boolstatus = Part.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swSketchAddConstLineDiagonalType, swUserPreferenceOption_e.swDetailingNoOptionSpecified, True)
Dim vSkLines As Variant
vSkLines = Part.SketchManager.CreateCenterRectangle(0, 0, 0, 0.222, 0.1665, 0)

' Named View
Part.ShowNamedView2 "*Isométrique", 7
Part.ViewZoomtofit2
Part.ClearSelection2 True
Dim skSegment As Object
Set skSegment = Part.SketchManager.CreateLine(-0#, -0.1665, 0#, 0#, 0.1665, 0#)
Part.ClearSelection2 True
Set skSegment = Part.SketchManager.CreateLine(-0.222, 0#, 0#, 0.222, 0#, 0#)
Part.ClearSelection2 True
Part.SketchManager.InsertSketch True
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Esquisse1", "SKETCH", 0, 0, 0, False, 0, Nothing, 0)
Dim myFeature As Object
Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
boolstatus = Part.Extension.SelectByID2("Line2@Esquisse1", "EXTSKETCHSEGMENT", -0.222, -8.77585521755009E-02, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line3@Esquisse1", "EXTSKETCHSEGMENT", -0.14708588433075, 0.1665, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line4@Esquisse1", "EXTSKETCHSEGMENT", 0.222, 7.22480810802039E-02, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line1@Esquisse1", "EXTSKETCHSEGMENT", 7.30118244492815E-02, -0.1665, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line7@Esquisse1", "EXTSKETCHSEGMENT", 0, -6.42442245170969E-02, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line8@Esquisse1", "EXTSKETCHSEGMENT", -0.148081910198584, 0, 0, True, 0, Nothing, 0)
Dim vGroups As Variant
Dim GroupArray() As Object
ReDim GroupArray(0 To 2) As Object
Dim Group1 As Object
Set Group1 = Part.FeatureManager.CreateStructuralMemberGroup()
Dim vSegement1 As Variant
Dim SegementArray1() As Object
ReDim SegementArray1(0 To 3) As Object
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line2@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line3@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line4@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line1@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
Dim Segment As Object
Set Segment = Part.SelectionManager.GetSelectedObject5(1)
Set SegementArray1(0) = Segment
Set Segment = Part.SelectionManager.GetSelectedObject5(2)
Set SegementArray1(1) = Segment
Set Segment = Part.SelectionManager.GetSelectedObject5(3)
Set SegementArray1(2) = Segment
Set Segment = Part.SelectionManager.GetSelectedObject5(4)
Set SegementArray1(3) = Segment
vSegement1 = SegementArray1
Group1.Segments = (vSegement1)
Group1.ApplyCornerTreatment = True
Group1.CornerTreatmentType = 1
Group1.GapWithinGroup = 0
Group1.GapForOtherGroups = 0
Group1.Angle = 0
Set GroupArray(0) = Group1
Dim Group2 As Object
Set Group2 = Part.FeatureManager.CreateStructuralMemberGroup()
Dim vSegement2 As Variant
Dim SegementArray2() As Object
ReDim SegementArray2(0 To 0) As Object
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line7@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
Set Segment = Part.SelectionManager.GetSelectedObject5(1)
Set SegementArray2(0) = Segment
vSegement2 = SegementArray2
Group2.Segments = (vSegement2)
Group2.ApplyCornerTreatment = True
Group2.CornerTreatmentType = 1
Group2.GapWithinGroup = 0
Group2.GapForOtherGroups = 0
Group2.Angle = 0
Set GroupArray(1) = Group2
Dim Group3 As Object
Set Group3 = Part.FeatureManager.CreateStructuralMemberGroup()
Dim vSegement3 As Variant
Dim SegementArray3() As Object
ReDim SegementArray3(0 To 0) As Object
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line8@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
Set Segment = Part.SelectionManager.GetSelectedObject5(1)
Set SegementArray3(0) = Segment
vSegement3 = SegementArray3
Group3.Segments = (vSegement3)
Group3.ApplyCornerTreatment = True
Group3.CornerTreatmentType = 1
Group3.GapWithinGroup = 0
Group3.GapForOtherGroups = 0
Group3.Angle = 0
Set GroupArray(2) = Group3
vGroups = GroupArray
Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\french\weldment profiles\iso\pipe.sldlfp", 1, True, (vGroups))
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Pipe - configured 21.3 X 2.3(1)", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0)
Part.ClearSelection2 True
End Sub

Mecanauto_3.swp (42,5 KB)

Makro, das dies generiert:

Dank @Sylk stimmt es, dass es hilfreich sein kann, die zu verwendenden Funktionen zu kennen, aber Sie müssen den Code immer überarbeiten.

Ja, das ist eine sehr relevante Frage, und Sie haben absolut Recht, und verwalten Sie den Import in einer Baugruppe mit einem Benutzerformular, um die globalen Variablen zu ändern.

Da es sich um ein mechanisch geschweißtes Teil handelt, möchte ich nach dem Import des ersten in die Baugruppe, um es entweder zu einer Symmetrie oder einer Wiederholung zu machen und den Import von Blechen, die auf die mechanisch geschweißten Rahmen angewendet werden, zu automatisieren.

Haben Sie ein Beispiel für den Import eines Teils in eine Baugruppe mit Änderung der globalen Variablen?

Eine Frage auf der Ebene der Gleichungen: Ist es möglich, ein Skizzensegment pro Gleichung anzuzeigen oder nicht?

Auf der anderen Seite war ich an diesem Code, um meinen Sketch zu erstellen, und ich kann die Segmentwiederholung nicht zum Laufen bringen, könnte mir jemand sagen, was mit meinem Code nicht stimmt?

Option Explicit

' Creating variable for Solidworks application
Dim swApp As SldWorks.SldWorks
' Creating variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2
' Boolean Variable
Dim Part As Object
Dim BoolStatus As Boolean
' Creating variable for Solidworks Sketch Manager
Dim swSketchManager As SldWorks.SketchManager
Dim swModelDocExt As SldWorks.ModelDocExtension

Dim hauteur As Double
Dim largeur As Double
Dim separation As Double
Dim nbSep As Integer

' Main function of our VBA program
Sub main()


hauteur = 3
largeur = 1.5
separation = 0.5
nbSep = (largeur / separation) - 1
    ' Setting Solidworks variable to Solidworks application
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    
    ' Creating string type variable for storing default part location
    Dim defaultTemplate As String
    ' Setting value of this string type variable to "Default part template"
    defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)

    ' Setting Solidworks document to new part document
    Set swDoc = swApp.NewDocument(defaultTemplate, 0, 0, 0)
    Set swModelDocExt = swDoc.Extension
    ' Selecting Front Plane
    BoolStatus = Part.Extension.SelectByID2("Line5@Esquisse1", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Setting Sketch manager for our sketch
    Set swSketchManager = swDoc.SketchManager
    
    ' Creating Variable for Solidworks Sketch segment
    Dim mySketchSegment As SketchSegment
    
    ' Inserting a sketch into selected plane
    swSketchManager.InsertSketch True
    
    ' Creating an horizontal line
    Set mySketchSegment = swSketchManager.CreateLine(0, 0, 0, largeur, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, 0, 0, largeur, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, hauteur, 0, 0, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(0, hauteur, 0, 0, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(separation, 0, 0, separation, hauteur, 0)
    BoolStatus = swModelDocExt.SelectByID2("Line5@Esquisse1", "EXTSKETCHSEGMENT", 0, separation, 0, False, 0, Nothing, 0)
    BoolStatus = swSketchManager.CreateLinearSketchStepAndRepeat(nbSep, 1, separation, 0.1, 0, 0, "", True, False, False, True, False)
    'Stop
    ' De-select the line after creation
    swDoc.ClearSelection2 True


    Set Part = swApp.ActiveDoc

    ' Zoom To Fit
    swDoc.ViewZoomtofit2
    Part.SketchManager.InsertSketch True
End Sub

In Bezug auf die Wiederholung ist es gut, dass ich gefunden habe:

Option Explicit

' Creating variable for Solidworks application
Dim swApp As SldWorks.SldWorks
' Creating variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2
' Boolean Variable
Dim Part As Object
Dim BoolStatus As Boolean
' Creating variable for Solidworks Sketch Manager
Dim swSketchManager As SldWorks.SketchManager
Dim swModelDocExt As SldWorks.ModelDocExtension

Dim hauteur As Double
Dim largeur As Double
Dim separationVerticale As Double
Dim separationHorizontale As Double
Dim nbSepVert As Integer
Dim nbSepHor As Integer

' Main function of our VBA program
Sub main()


hauteur = 3
largeur = 1.5
separationVerticale = 0.5
nbSepVert = (largeur / separationVerticale) - 1
nbSepHor = hauteur / 500
If nbSepVert - Fix(nbSepVert) <> 0 Then nbSepVert = nbSepVert + 1
separationHorizontale = hauteur / nbSepVert

    ' Setting Solidworks variable to Solidworks application
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    
    ' Creating string type variable for storing default part location
    Dim defaultTemplate As String
    ' Setting value of this string type variable to "Default part template"
    defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)

    ' Setting Solidworks document to new part document
    Set swDoc = swApp.NewDocument(defaultTemplate, 0, 0, 0)
    Set swModelDocExt = swDoc.Extension
    ' Selecting Front Plane
    BoolStatus = Part.Extension.SelectByID2("Line5@Esquisse1", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Setting Sketch manager for our sketch
    Set swSketchManager = swDoc.SketchManager
    
    ' Creating Variable for Solidworks Sketch segment
    Dim mySketchSegment As SketchSegment
    
    ' Inserting a sketch into selected plane
    swSketchManager.InsertSketch True
    
    ' Creating an horizontal line
    Set mySketchSegment = swSketchManager.CreateLine(0, 0, 0, largeur, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, 0, 0, largeur, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, hauteur, 0, 0, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(0, hauteur, 0, 0, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(separationVerticale, 0, 0, separationVerticale, hauteur, 0)
    BoolStatus = swModelDocExt.SelectByID2("Ligne5", "EXTSKETCHSEGMENT", 0, separationVerticale, 0, False, 0, Nothing, 0)
    'Stop
    BoolStatus = swSketchManager.CreateLinearSketchStepAndRepeat(nbSepVert, 1, separationVerticale, 1, 0, 1.57, "", True, False, False, True, False)
    'Stop
    ' De-select the line after creation
    swDoc.ClearSelection2 True


    Set Part = swApp.ActiveDoc

    ' Zoom To Fit
    swDoc.ViewZoomtofit2
    Part.SketchManager.InsertSketch True
End Sub

Diese beiden Fragen bleiben:

Hallo

Der Vorteil eines fortgeschrittenen Alters besteht darin, dass Sie über eine Bibliothek verfügen, die reich an Makros ist. Indem hier und da Teile ausgewählt und bei Bedarf angepasst werden, ist schnell ein Makro erstellt (siehe angehängte Zip-Datei).
Ohne Moderation zu testen.

GrilleSoudee.zip (455.1 KB)

Um Ihre Fragen zum " Importieren eines Teils in eine Baugruppe mit Änderung der globalen Variablen " und ob es möglich ist, " ein Skizzensegment nach Gleichung anzuzeigen oder nicht " zu beantworten, bin ich versucht, mit JA zu antworten...
Die meisten Konstrukte und Methoden in Solidworks sind makrofähig.
Davon abgesehen ist ein Makro besonders gerechtfertigt, um sich wiederholende und zeitaufwändige Aufgaben auszuführen. Ist das bei Ihrem Projekt auch der Fall?

Herzliche Grüße.

1 „Gefällt mir“

Vielen Dank @m.blt,

Für dieses hervorragende, gut dokumentierte Makro, das es mir ermöglicht, einige meiner Funktionen zu vervollständigen, die einen etwas anderen Bedarf haben.

Was die Zeitersparnis angeht, kann ich Ihnen ja antworten, denn schon die Automatisierung des Schweißbaus wird mir ein wenig Zeit sparen, aber am Ende werde ich mit der Fortsetzung noch mehr sparen
.
Denn bei dieser geschweißten Konstruktion in einer Baugruppe möchte ich Bleche mit einer Breite importieren, die durch das geschweißte Gitter definiert ist (daher ist es wichtig, in eine Baugruppe zu importieren und globale Variablen zu ändern) und ihre Konfiguration entsprechend ihrer Position auf diesem geschweißten Gitter zu verwalten.

Dieses Makro spart mir Zeit bei der Konstruktion dieser Elemente, aber auch bei der Berechnung der Dimension jedes Elements im Vergleich zu den globalen Dimensionen.

Wenn Sie also etwas haben, das sich mit diesen beiden Punkten befasst, bin ich dafür.

Ein kleines Problem beim Experimentieren mit Ihrem Makro, es generiert nicht die Struktur und ich denke, dass einige Comboboxen nicht die richtigen Werte haben.
Da ich in Standards ISO und nicht die Art von Profilen finden sollte, kann es sein, dass meine Datei nicht wie Ihre aufgebaut ist.
Ich muss im Pfad den Standard auswählen, um die Comboboxen zu füllen...

Ich sollte in der Lage sein, es so zu modifizieren, dass es funktioniert, aber wenn andere beim Herunterladen stecken bleiben, habe ich es vorgezogen, Sie zu warnen, dass ich nicht das erwartete Ergebnis erzielt habe.

Ich denke eher, dass Sie den Ordner "Profile" auf "  Schweißkonstruktionsprofile " setzen sollten, nicht auf einen seiner Unterordner.

Da es sich bei der Größe um einen Ordner des Typs handelt, bei dem es sich um einen Standardordner handelt, bei dem es sich um einen Profilordner handelt, wird die gesamte Kaskade versetzt, wenn Sie den Standardordner anstelle des Profilordners auswählen.

1 „Gefällt mir“

Um die entsprechende Botschaft der @Sylk zu untermauern ...
Profilskizzen sind wie folgt organisiert:

1- Die allgemeine Datei der Profile, in der...
2- Die Unterordner von Normen (ISO, ANSI usw.), in denen sich ...
3- Dateien, die die Arten von Profilen definieren (*.sldlfp), in denen
Sind...
4- Skizzen der Profile, deren Konfigurationen ihren unterschiedlichen Größen entsprechen.

Es ist der Ordner Nr. 1 , der in das obere Eingabefeld eingetragen werden muss. Daraus leiten sich die Dropdown-Listen zur Auswahl von Normen, Typen und Größen ab.
Im Prinzip handelt es sich bei diesem Ordner Nr. 1 um den Ordner in den " Dateispeicherorten " des " Systems > Optionen" von Solidworks, der normalerweise beim Start des Makros im Eingabefeld abgerufen wird.

Macro verfügt offensichtlich nicht über alle notwendigen Sicherheitsvorkehrungen.
Und während ich diese Zeilen schreibe, sage ich mir, dass das Makro es Ihnen nicht erlaubt, die Profildatei zu finden, wenn sie in einem persönlichen Ordner gespeichert ist, der diese Organisation nicht respektiert. Grrr! :face_with_symbols_over_mouth:

1 „Gefällt mir“

Ich dachte, wir könnten ein Makro für 2022 auf einem SW 2020 starten, aber nein... Anscheinend brauchen wir 2022 Buchhandlungen. Ich denke, es muss einen Befehl im Code geben, der dies erfordert.

Redigieren:

Diese Variable (swFileLocationsWeldmentProfiles) zum Initialisieren des Inhalts des Textfelds darf in 2020 nicht vorhanden sein:

UserForm1.TextBoxProfil.Text = swApp.GetUserPreferenceStringValue(swFileLocationsWeldmentProfiles)

Also habe ich es durch eine harte leere Zeichenkette ersetzt

UserForm1.TextBoxProfil.Text = ""

Ah, und auch hier:

With folderDialog
        .InitialFileName = ""

Eine Absicherung könnte darin bestehen, zu testen, ob der Befehl ungültig ist, die Wurzel oder eine leere Zeichenfolge zu initialisieren. Für Abwärtskompatibilität.

REDIGIEREN:
Nun, die swDocPART-Variable ist auch ein Problem für mich...

Set swDoc = swApp.OpenDoc6(filePath, swDocPART, swOpenDocOptions_Silent, "", 0, 0)    ' Ouvre le fichier en arrière-plan

Hallo @Sylk,

Makros werden normalerweise nicht auf die gleiche Weise mit SW-Versionen verknüpft wie Baugruppen- oder Teiledateien.
Die einzige Einschränkung besteht darin, dass sich einige API-Eigenschaften oder -Methoden im Laufe der Zeit ändern und von einer älteren Version von SW möglicherweise nicht erkannt werden.
Oft reicht es aus, ein oder zwei Einheiten in der letzten Ziffer zurückzugehen, um die vorherige Funktion zu finden (OpenDoc4 ist die Version vor OpenDoc6).

Für die swDocPart-Konstante :

  • Wenn die SolidWorks API-Typbibliothek in Extras > Referenzen referenziert wird, importiert VBA automatisch die API-Konstanten, die unter ihren abgekürzten Namen verwendet werden können (nur swDocPart ).
  • Wenn die Bibliothek nicht referenziert wird, muss der qualifizierte Name verwendet werden: swDocumentTypes_e.swDocPart

Das Testen von Zeilen mit API-Funktionen wäre umständlich zu verwalten, es würde viel Zeit in Anspruch nehmen und den Code weniger lesbar machen.
Und was tun im Falle eines Fehlers, wenn nicht um aus dem Makro herauszukommen?
Auf der anderen Seite bin ich damit einverstanden, Benutzereingaben so weit wie möglich zu testen...

Zum Schluss werfe ich einen Blick auf diese Sache mit der Profildatei.

1 „Gefällt mir“

Meine Datei ist die richtige:

Screenshot_57

Ich habe nur manuell ISO hinzugefügt, damit die Comboboxen nicht leer bleiben.

Ihre Profile sollten wie folgt strukturiert sein?

In meiner SW 2022-Version sieht der Ordner wie folgt aus:
C:\Programme\SolidWorks_2022\SOLIDWORKS\Daten\Schweißkonstruktionsprofile
image
Der Text wird beim Starten des Makros im Eingabefeld angezeigt, aber Sie müssen auf die Schaltfläche klicken und den Ordner akzeptieren, um die Listen der Normen, Typen und Größen zu vervollständigen.

Sie müssen nichts von Hand hinzufügen...

Ich habe das Problem verstanden, es ist, dass der Ordner beim Start nicht geladen wird, er wird erst geladen, nachdem er im Dialog ausgewählt wurde.

Sie müssen dies hinzufügen, um den Inhalt der Comboboxen beim Start zu laden:

    UserForm1.TextBoxProfil.Text = swApp.GetUserPreferenceStringValue(swFileLocationsWeldmentProfiles) & "\"
    UserForm1.Show
    
    If UserForm1.TextBoxProfil.Text <> "" Then
        dossierProfils = UserForm1.TextBoxProfil.Text
        UserForm1.DossiersNormesProfils
        UserForm1.ComboBoxNorme.Enabled = True
    End If

entweder

    With UserForm1
      .TextBoxProfil.Text = swApp.GetUserPreferenceStringValue(swFileLocationsWeldmentProfiles) & "\"
      .Show
      If .TextBoxProfil.Text <> "" Then
          dossierProfils = .TextBoxProfil.Text
          .DossiersNormesProfils
          .ComboBoxNorme.Enabled = True
      End If
    End With

Auf der anderen Seite ist es zu Hause beim Laden des Profils sehr langsam, es sollte in der Lage sein, die Größen erst bei Bestätigung zu laden. Vielleicht eine Schaltfläche für " Ladungsgrößen ". Es sei denn, es gibt eine Methode, um die Konfigurationen zu extrahieren, ohne die Datei zu öffnen?

Danke, ich hatte die Bibliotheken aktiviert, aber aus irgendeinem unbekannten Grund waren sie nicht aktiviert...

Ich habe nicht die gleiche Ordnerarchitektur wie Sie @m.blt.
Denn im DIN-Ordner habe ich keine .sldfp-Datei, sondern Ordner vom Typ Profil, und in diesen Ordnern vom Typ Profil habe ich die Dateien mit der Erweiterung .sldfp.

Screenshot_58

Screenshot_59

Ich habe den Code entsprechend meiner Architektur neu kalibriert:

Screenshot_60

Auf der anderen Seite, haben Sie etwas zu dem Thema unten, weil ich Schwierigkeiten habe, eine Teiledatei in eine neue Baugruppe zu importieren: