Macro solidworks voor het genereren van gelaste constructies

Hoi allemaal

Ik ben op zoek naar een stuk code waarmee ik een gelaste constructie kan genereren.
Ik moet buisvormige structuren maken die erg op elkaar lijken.

Buisvormige structuren zijn altijd een samenstel van buizen in hetzelfde vlak, deze structuur is altijd rechthoekig en heeft een aantal horizontale en verticale buizen die minder dan 500 mm uit elkaar liggen.

Ik zou graag een code willen hebben voor een werkende basis die de basisschets genereert en de buizen op deze schets toepast.

Hier is een voorbeeld van wat ik per macro wil maken:

Ik denk dat een basis met een frame een kruis in het midden voor mij genoeg zou moeten zijn om de rest te automatiseren, maar ik neem alles wat je zou kunnen bedenken.
Omdat ik nog nooit een macro-gelaste constructie heb gemaakt.

Ik denk erover om een gebruikersformulier te doorlopen om mijn basisgegevens in te voeren en vervolgens de structuur te genereren.

Ik hoop dat ik duidelijk genoeg ben geweest, aarzel anders niet om het mij te vragen.

Ik heb deze code waarmee je een gelaste constructie kunt maken dankzij een bestaande schets.

Het probleem is dat wanneer ik de code start met een schets die 6 segmenten heeft, er slechts 5 zijn die in gelaste constructie gaan.
Dit lijkt voor de hand liggend omdat " i = 1 ".
Maar als ik i=0 zet, werkt de code niet meer, er wordt geen gesoldeerde constructie meer gemaakt.

Code met 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 met 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 is het bestand dat wordt gebruikt voor het testen:
3D-luidspreker.SLDPRT (42,5 KB)

Voor het codeprobleem hierboven heb ik een oplossing gevonden, segmentnaamprobleem:

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

Ik ben aan het einde begonnen, nu moet ik uitzoeken hoe ik een schets van VBA kan maken!!

Zonder over code te praten, heb je getest met herhalingen van velden + kleine vergelijkingen?

1 like

Hallo

Onderschat het nut van macro-opname niet.

Hier is een macro die ik heb opgenomen die dit verzoek beantwoordt:

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)

Macro die dit genereert:

Dankzij @Sylk is het waar dat het kan helpen om de te gebruiken functies te kennen, maar je zult altijd de code moeten herwerken.

Ja, het is een zeer relevante vraag, en je hebt helemaal gelijk, en beheer de import in een assembly met een gebruikersformulier om de globale variabelen te wijzigen.

Omdat dit mechanisch gelast onderdeel is, wil ik na het importeren van het eerste in de assemblage er een symmetrie of een herhaling van maken en de import van plaatwerk automatiseren dat op de mechanisch gelaste frames zal worden aangebracht.

Dus heb je een voorbeeld van het importeren van een onderdeel in een assembly met wijziging van de globale variabelen?

Een vraag op het niveau van vergelijkingen, is het mogelijk om al dan niet een schetssegment per vergelijking weer te geven?

Aan de andere kant was ik op deze code om mijn schets te maken en ik kan de segmentherhaling niet aan het werk krijgen, kan iemand me vertellen wat er mis is met mijn code?

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

Qua herhaling is het goed dat ik heb gevonden:

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

Deze twee vragen blijven over:

Hallo

Het voordeel van een hoge leeftijd is dat je een bibliotheek hebt die rijk is aan macro's. Door hier en daar stukjes te plukken en aan te passen waar nodig, is er snel een macro gemaakt (zie bijgevoegd Zip-bestand).
Zonder mate te testen.

GrilleSoudee.zip (455.1 KB)

Om uw vragen te beantwoorden over " het importeren van een onderdeel in een assemblage met wijziging van de globale variabelen " en of het al dan niet mogelijk is om " een schetssegment al dan niet weer te geven door vergelijking ", kom ik in de verleiding om JA te antwoorden...
De meeste constructies en methoden in Solidworks zijn geschikt voor macro's.
Dat gezegd hebbende, is een macro vooral gerechtvaardigd om repetitieve en tijdrovende taken uit te voeren. Is dit het geval voor uw project?

Vriendelijke groeten.

1 like

Dank je wel @m_blt,

Voor deze uitstekende, goed gedocumenteerde macro, waarmee ik een aantal functies van mij kan voltooien die een iets andere behoefte hebben.

Wat betreft de tijdwinst, kan ik je ja antwoorden, want de automatisering van gelaste constructie zal me al wat tijd besparen, maar uiteindelijk is het met het vervolg dat ik nog meer zal besparen
.
Omdat ik op deze gelaste constructie in een assemblage vellen wil importeren met een breedte die wordt gedefinieerd door het gelaste raster (vandaar het belang van het importeren in een assemblage en het wijzigen van globale variabelen) en hun configuratie beheren op basis van hun positie op dit gelaste raster.

Deze macro zal me tijd besparen op de constructie van deze elementen, maar ook op de berekening van de afmeting van elk element in vergelijking met de globale afmetingen.

Dus als je iets hebt dat met deze twee punten te maken heeft, ben ik er helemaal voor.

Een klein probleem bij het experimenteren met je macro, het genereert de structuur niet en ik denk dat sommige comboboxen niet de juiste waarden hebben.
Omdat ik in normen ISO zou moeten vinden en niet het type profielen, is mijn bestand mogelijk niet samengesteld zoals het uwe.
Ik moet de standaard selecteren in het pad om de comboboxen te vullen...

Ik zou het moeten kunnen aanpassen om het te laten werken, maar als anderen door het downloaden vast komen te zitten, waarschuwde ik je liever dat ik niet het verwachte resultaat had.

Ik denk eerder dat je de profielenmap moet instellen op "  lasprofielen ", niet op een van de submappen.

Aangezien de grootte een map is van het type dat een standaardmap is die een profielenmap is, wordt de hele cascade gecompenseerd als u de standaardmap selecteert in plaats van de profielenmap.

1 like

Ter ondersteuning van de relevante boodschap van @Sylk ...
Profielschetsen zijn als volgt geordend:

1- Het algemene bestand met profielen, waarin zijn...
2- De submappen van normen (ISO, ANSI, enz.), waarin zich bevinden...
3- Bestanden die de soorten profielen (*.sldlfp) definiëren, waarin
Zijn...
4- Schetsen van de profielen waarvan de configuraties overeenkomen met hun verschillende afmetingen.

Het is Map nr. 1 die moet worden ingevuld in het bovenste invoervak. Hieruit worden de dropdown-lijsten voor het selecteren van normen, typen en maten afgeleid.
In principe is deze map nr. 1 degene in de " Bestandslocaties " van het " Systeem > Opties" van Solidworks, meestal opgehaald in het invoervak wanneer de macro wordt gestart.

Macro beschikt uiteraard niet over alle nodige waarborgen.
En terwijl ik deze regels schrijf, zeg ik tegen mezelf dat als het profielbestand is opgeslagen in een persoonlijke map die deze organisatie niet respecteert, de macro je niet toestaat om het te vinden. Grrr! :face_with_symbols_over_mouth:

1 like

Ik dacht dat we een macro voor 2022 konden lanceren op een SW 2020, maar nee... Blijkbaar hebben we boekhandels 2022 nodig. Ik denk dat er een commando in de code moet zijn dat het vereist.

Bewerken:

Deze variabele (swFileLocationsWeldmentProfiles) voor het initialiseren van de inhoud van het tekstvak mag niet bestaan in 2020:

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

Dus ik verving het door een hard leeg touwtje

UserForm1.TextBoxProfil.Text = ""

Ah, en hier ook:

With folderDialog
        .InitialFileName = ""

Een beveiliging zou kunnen zijn om te testen of de opdracht ongeldig is, om de root of een lege string te initialiseren. Voor achterwaartse compatibiliteit.

BEWERKEN:
Nou, de variabele swDocPART is ook een probleem voor mij...

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

Hallo @Sylk,

Macro's zijn normaal gesproken niet op dezelfde manier gekoppeld aan SW-versies als assembly- of onderdeelbestanden.
De enige beperking is dat sommige API-eigenschappen of -methoden in de loop van de tijd veranderen en dat een oudere versie van SW ze mogelijk niet herkent.
Het is vaak voldoende om een of twee eenheden terug te gaan in het laatste cijfer om de vorige functie te vinden (OpenDoc4 is de versie die voorafgaat aan OpenDoc6).

Voor de swDocPart constante:

  • Als er naar de SolidWorks API Type Library wordt verwezen in Tools > References, importeert VBA automatisch de API-constanten, die kunnen worden gebruikt onder hun afgekorte namen (alleen swDocPart ).
  • Als er niet naar de bibliotheek wordt verwezen, moet de gekwalificeerde naam worden gebruikt: swDocumentTypes_e.swDocPart

Wat betreft het testen van lijnen met API-functies, het zou omslachtig zijn om te beheren, het zou veel tijd kosten en het zou de code minder leesbaar maken.
En wat te doen in geval van een fout, zo niet om uit de macro te komen?
Aan de andere kant ga ik ermee akkoord om de input van gebruikers zoveel mogelijk te testen...

Om af te sluiten, ga ik eens kijken naar dit profielbestand.

1 like

Mijn dossier is het juiste:

Screenshot_57

Ik heb zojuist handmatig ISO toegevoegd, zodat de comboboxen niet leeg blijven.

Uw set profielen moet zijn gestructureerd zoals hieronder?

Op mijn SW 2022-versie is de map als volgt:
C:\Program Files\SolidWorks_2022\SOLIDWORKS\data\lasprofielen
image
De tekst wordt weergegeven in het invoervak wanneer de macro wordt gestart, maar u moet op de knop klikken en de map accepteren om de lijsten met normen, typen en maten te voltooien.

Je hoeft niets met de hand toe te voegen...

Ik begreep het probleem, het is dat de map niet wordt geladen bij het opstarten, maar pas wordt geladen nadat ik deze in het dialoogvenster heb gekozen.

Je moet dit toevoegen om de inhoud van de comboboxen bij het opstarten te 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

hetzij

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

Aan de andere kant is het thuis erg traag bij het laden van het profiel, het zou de maten alleen bij bevestiging moeten kunnen laden. Misschien een knop " laadmaten ". Tenzij er een methode is om de configuraties uit te pakken zonder het bestand te openen?

Bedankt, ik had de bibliotheken geactiveerd, maar om de een of andere onbekende reden waren ze niet aangevinkt...

Ik heb niet dezelfde mappenarchitectuur als jij @m_blt.
Omdat ik in de DIN-map geen .sldfp-bestand heb maar profieltypemappen en in deze profieltypemappen heb ik de bestanden met de extensie .sldfp.

Screenshot_58

Screenshot_59

Ik heb de code opnieuw gekalibreerd volgens mijn architectuur:

Screenshot_60

Aan de andere kant, heb je iets over het onderstaande onderwerp omdat ik moeite heb om te proberen een onderdeelbestand in een nieuwe assemblage te importeren: