Afbreken van mechanisch gelast onderdeel

Hallo

We werken dankzij de mechanisch gelaste omgeving (SW 2017). Bij het maken van onze algemene stuklijsten, als we de lijst van elk lichaam willen hebben, zonder de weergave van de bijbehorende onderdelen, moeten we elk onderdeel (evenals elke assemblage) met de hand afbreken, wat soms vervelend kan zijn, vooral wanneer SW besluit om onze assemblages van tijd tot tijd opnieuw samen te stellen.

Is er een manier om een stuklijst te hebben die alleen de organen van een vergadering vermeldt? Of een manier om "alles op te splitsen" in een nomenclatuur? (macro?)

Bij voorbaat hartelijk dank, u bespaart ons veel tijd.

Hallo

Ik wil het onderwerp graag nog een keer ter sprake brengen, voor het geval iemand ideeën heeft:)

Bij voorbaat dank! 

Hallo

Om ervoor te zorgen dat onze collega's u kunnen helpen, moeten we aangeven wat u wilt als u zegt "zonder de bijbehorende documenten weer te geven",

Kun je een screenshot maken van wat je krijgt met de vervelende  methode die je zegt: we moeten elk onderdeel (evenals elke montage) met de hand afbreken, )

We hebben sterke collega's op dit gebied, ze zullen weten wat ze moeten zeggen gezien je huidige werk.

Vriendelijke groeten

Om elke assemblage op te splitsen, moet u naar de configuratie-eigenschappen gaan (zelfs als er maar één is) en "tonen" kiezen:

Om een stuk automatisch op te splitsen in een lichaam, zie ik alleen een macro.

@Zozo_mp: met SW kunnen we, in een nomenclatuur, de lijst weergeven van lichamen die een deel vormen in plaats van het deel zelf (volgens dezelfde logica als bij een "zelfgenoegzaamheid" deelverzameling).

1 like

Hallo

Dank u voor uw antwoorden:)

Als ik bijvoorbeeld een assemblage heb van 20 onderdelen, elk mechanisch gelast en elk samengesteld uit meerdere lichamen. 
Als ik wil dat mijn nomenclatuur alleen de lichamen bevat, moet ik elke keer mijn twintig stukken afbreken (en soms hebben we er veel meer).

Hier is mijn stuk A, en is samengesteld uit A1 tot A10.

Bovendien staan mijn subassemblages systematisch in "Show", en het breekt de assemblage niet af. Zou het niet gewoon een optie zijn om de onderdelen waaruit de assemblage bestaat al dan niet weer te geven in de stuklijst?

Heb je voor een macro aanwijzingen om me te geven? Ik voel me niet op mijn gemak met deze taal.

Nogmaals bedankt!

Hallo

Om het per macro te doen, kunt u de functie "Oplossen" gebruiken die u HIER kunt vinden met een voorbeeld van gebruik hier.

Vriendelijke groeten

2 likes

Hartelijk dank:

Ik was in staat om een eerste macro te maken die de tabel goed opsplitst, regel voor regel beginnend vanaf het einde, dus al goed nieuws!  :)
Om snelheid te winnen, zou ik alleen de noodzakelijke lijnen willen opsplitsen (dus die welke overeenkomen met subassemblage of lassen), is er een manier om het celtype te herstellen? Ik kan niet vinden wat ik nodig heb in het document.

Ik denk niet dat het mogelijk is om het type artikel uit een regel te halen, omdat het meestal een reeks tekst is die we ophalen wanneer we een nomenclatuur analyseren door API's. Het is aan jou om te kijken of je een kolom kunt toevoegen die als selectiecriterium kan worden gebruikt, zoals bijvoorbeeld "SW-File Name".

1 like

Ja ik heb erover nagedacht, het probleem is dat een niet-mechanisch gelast onderdeel van .sldprt wordt gemaakt (bijvoorbeeld alle schroeven), maar nog steeds niet hoeft te worden afgebroken. 
Dat gezegd hebbende, het is inderdaad een eerste verbetering!

Ik zag dat er de functie "GetComponents2" was, waarmee je een onderdeel kunt retourneren. Is er geen manier dankzij dit? 
http://help.solidworks.com/2017/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IBomTableAnnotation~GetComponents2.html

Ik heb geprobeerd een kolom met de bestandsnaam toe te voegen, maar ik kan het niet, in feite loop ik vast bij de stap van het definiëren van het kolomtype. Het lukt me om de kolom toe te voegen, maar deze is leeg. Het doel is om de bestandsextensie te identificeren, om alleen de .sldprt en .sldasm op te splitsen
Na deze stap denk ik dat ik weet hoe het moet.

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
    
Sub main()

    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    Set selmgr = swModel.SelectionManager
    Set vTable = selmgr.GetSelectedObject6(1, -1)
    
    DisolveBomSelect vTable

    MsgBox "Nomenclature décomposée"
    
End Sub

Sub DisolveBomSelect(vTable As Variant)
    Dim swTable As SldWorks.TableAnnotation
    Dim swAnn As SldWorks.Annotation
    Dim nNombreLignes As Long
    Dim sRowStr As String
    Dim i As Long
    
    Set swTable = vTable
    Set swAnn = swTable.GetAnnotation
    
    nNombreLignes = swTable.RowCount
    nNombreColonnes = swTable.ColumnCount

    etape = swTable.InsertColumn2(swTableItemInsertPosition_Last, 0, "New Column", swInsertColumn_DefaultWidth)
    
    swAnn.Visible = swAnnotationHidden
    
    For i = nNombreLignes - 1 To 0 Step -1
         swTable.Dissolve (i)
    Next i
   
    swAnn.Visible = swAnnotationVisible
End Sub

 

Hallo

Je voegt je kolom in maar je geeft hem niet het type, kijk naar het volgende voorbeeld, er is ook een rij met de functie SetColumnType.

Vriendelijke groeten

1 like

Ja, ik heb het geprobeerd met een SetColumnCustomProperty, maar ik krijg alleen een foutmelding vanwege een slecht type. Misschien heb ik eerst een setcolumntype nodig.

Hallo

Als ik de draad van de discussie herlees, geef ik toe dat ik niet al te veel meer kan volgen:

- Stap 1: De vraag is om alles op te splitsen.

- Stap 2: Breek alleen bepaalde regels op om tijd te besparen.

- Stap 3: Ontleed niet volgens het bestandstype, omdat (bijvoorbeeld) SDLPRT's schroeven kunnen zijn en niet mogen worden ontleed.

- Stap 4: Voeg een kolom in, want het doel is om de bestandsextensie te identificeren, om alleen de SLDPRT en SLDASM op te splitsen.

Ik denk dat het, voordat we verder gaan met de code, noodzakelijk is om de noodzaak te definiëren (alles ontleden: ja of nee?) en, zo niet, om de criteria te definiëren voor het selecteren van de te ontleden regels. De functie "GetComponents2" kan inderdaad een andere gedachtegang zijn, afhankelijk van wat u wilt afbreken.

En voor het invoegen van een nieuwe kolom is het misschien gemakkelijker om dit gewoon in de BOM-sjabloon te doen in plaats van te proberen het via code te doen...

Vriendelijke groeten

2 likes

Hallo

Het doel blijft hetzelfde: snel een volledig afgebroken nomenclatuur hebben, maar afhankelijk van de moeilijkheden bij de implementatie zijn er inderdaad tussenstappen. 
Ik heb wel een macro die alle componenten afbreekt, het probleem is de zwaarte van deze macro, die ook de mechanisch gelaste lichamen en de niet-gelaste .sldprt afbreekt, die niet hoeft te zijn, tijdverspilling (de oplosfunctie is geen bliksemschicht). 

Mijn ideaal zou daarom zijn om alleen de assemblages en de mechanisch gelaste onderdelen af te breken, maar aangezien ik dat niet kon doen, viel ik terug op differentiatie op bestandsnaam. 

Sorry voor de vaagheid van mijn verzoeken, ik hoop dat dit bericht ons zal helpen een beetje duidelijker te zien:) 
 

Hallo

Hier is een voorbeeld dat vertrouwt op het BOM-coördinatensysteem om te weten of het al dan niet moet worden ontleed, de stuklijst moet de vorm hebben van een lijst in tabelvorm (het vinkje voor de gedetailleerde lijst van gelaste onderdelen is niet verplicht):

Het is een voorbeeld, het is aan jou om je aan te passen aan je behoeften...

Vriendelijke groeten

Option Explicit

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    Set swFeat = swModel.FirstFeature

    Do While Not swFeat Is Nothing
        If "BomFeat" = swFeat.GetTypeName Then
            Set swBomFeat = swFeat.GetSpecificFeature2
            ProcessBomFeature swApp, swModel, swBomFeat
        End If
        Set swFeat = swFeat.GetNextFeature
    Loop
End Sub

Sub ProcessTableAnn(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swTableAnn As SldWorks.TableAnnotation, ConfigName As String)
    On Error Resume Next
    
    Dim nNumRow As Long
    Dim nNumColumn As Long
    Dim j As Long
    Dim i As Long
    Dim NumberComposant As String
    Dim ItemNumber As String
    Dim ItemNumberPrec As String
    Dim PartNumber As String
    Dim MomTableau() As String
    Dim n As Integer
    Dim nb As Integer
    n = 0
    nb = 0

    nNumRow = swTableAnn.RowCount

    Dim swBOMTableAnn As BomTableAnnotation
    Set swBOMTableAnn = swTableAnn

    For j = 0 To nNumRow - 1
        NumberComposant = swBOMTableAnn.GetComponentsCount2(j, ConfigName, ItemNumber, PartNumber)
        
        If ItemNumber = ItemNumberPrec & ".1" Then
            ReDim Preserve MomTableau(n)
            MomTableau(n) = j - 1
            n = n + 1
        End If

        ItemNumberPrec = ItemNumber
    Next j

    nb = UBound(MomTableau)
    While nb >= 0
        swBOMTableAnn.Dissolve (MomTableau(nb))
        nb = nb - 1
    Wend
End Sub

 
Sub ProcessBomFeature(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swBomFeat As SldWorks.BomFeature)
    Dim swFeat As SldWorks.Feature
    Dim vTableArr As Variant
    Dim vTable As Variant
    Dim vConfigArray As Variant
    Dim vConfig As Variant
    Dim ConfigName As String
    Dim swTable As SldWorks.TableAnnotation

    Set swFeat = swBomFeat.GetFeature
    vTableArr = swBomFeat.GetTableAnnotations

    For Each vTable In vTableArr
        Set swTable = vTable
        vConfigArray = swBomFeat.GetConfigurations(True, True)
        For Each vConfig In vConfigArray
             ConfigName = vConfig
             ProcessTableAnn swApp, swModel, swTable, ConfigName
        Next vConfig
    Next vTable
End Sub

 

Allereerst heel erg bedankt voor je antwoord, het is echt geweldig! Uw oplossing door nummering is heel slim!

Ik probeer, ik probeer het precies aan te passen aan mijn gebruik, maar het is onvermijdelijk dat het probleem pijn doet.

Mijn ideale gebruik zou zijn om alleen de actieve stuklijst op te splitsen.
Dus ik gebruik de GetSelectedObject6(1, -1).

Maar het retourneert een tabel, en het lukt me niet om de bijbehorende BOM op te halen, om de configuratie te kunnen ophalen, uiteraard essentieel voor de GetComponentsCount.

Als ik je code goed begrijp, kijk je naar alle stuklijsten, voor elk van hen kijk je naar alle bijbehorende tabellen, en je splitst ze allemaal op.

Mijn code, vrij eenvoudig gezien mijn niveau, was als volgt:

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
    
Sub main()

    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    Set selmgr = swModel.SelectionManager
    Set vTable = selmgr.GetSelectedObject6(1, -1)
    
    DisolveBomSelect vTable

    MsgBox "Nomenclature décomposée"
    
End Sub

Sub DisolveBomSelect(vTable As Variant)
    Dim swTable As SldWorks.TableAnnotation
    Dim nNombreLignes As Long
    Dim sRowStr As String
    Dim i As Long
    
    Set swTable = vTable
    Set swAnn = swTable.GetAnnotation
    
    nNombreLignes = swTable.RowCount
    nNombreColonnes = swTable.ColumnCount
    
    
    For i = nNombreLignes - 1 To 0 Step -1
         swTable.Dissolve (i)
    Next i
End Sub

 

Hallo

Probeer het met de onderstaande code, wees voorzichtig, de selectie van de nomenclatuur moet gebeuren in de creatieboom en niet op het plan.

Vriendelijke groeten

Option Explicit

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swFeat As SldWorks.Feature
    Dim swBomFeat As SldWorks.BomFeature
    Dim selmgr As SelectionMgr

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    Set selmgr = swModel.SelectionManager
    Set swBomFeat = selmgr.GetSelectedObject6(1, 0)
    ProcessBomFeature swApp, swModel, swBomFeat
End Sub

Sub ProcessTableAnn(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swTableAnn As SldWorks.TableAnnotation, ConfigName As String)
    On Error Resume Next
    
    Dim nNumRow As Long
    Dim nNumColumn As Long
    Dim j As Long
    Dim i As Long
    Dim NumberComposant As String
    Dim ItemNumber As String
    Dim ItemNumberPrec As String
    Dim PartNumber As String
    'Dim RowLocked As Boolean
    'Dim RowHeight As Double
    Dim MomTableau() As String
    Dim n As Integer
    Dim nb As Integer
    n = 0
    nb = 0

    nNumRow = swTableAnn.RowCount

    Dim swBOMTableAnn As BomTableAnnotation
    Set swBOMTableAnn = swTableAnn

    For j = 0 To nNumRow - 1
        NumberComposant = swBOMTableAnn.GetComponentsCount2(j, ConfigName, ItemNumber, PartNumber)

        If ItemNumber = ItemNumberPrec & ".1" Then
            'Debug.Print "Ligne à décomposer : " & j - 1
            ReDim Preserve MomTableau(n)
            MomTableau(n) = j - 1
            n = n + 1
        End If

        ItemNumberPrec = ItemNumber
    Next j

    nb = UBound(MomTableau)
    While nb >= 0
        swBOMTableAnn.Dissolve (MomTableau(nb))
        nb = nb - 1
    Wend
End Sub

 
Sub ProcessBomFeature(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swBomFeat As SldWorks.BomFeature)
    Dim swFeat As SldWorks.Feature
    Dim vTableArr As Variant
    Dim vTable As Variant
    Dim vConfigArray As Variant
    Dim vConfig As Variant
    Dim ConfigName As String
    Dim swTable As SldWorks.TableAnnotation

    Set swFeat = swBomFeat.GetFeature
    vTableArr = swBomFeat.GetTableAnnotations

    ConfigName = swBomFeat.Configuration

    For Each vTable In vTableArr
        Set swTable = vTable
        ProcessTableAnn swApp, swModel, swTable, ConfigName
    Next vTable
End Sub

 

Hallo

Daar had ik over nagedacht, dus ik kan me voorstellen dat als je deze oplossing voorstelt, dat is omdat het door de selectie op het plan niet mogelijk is?

Nogmaals hartelijk dank

Hallo

Zie indien mogelijk de onderstaande versie met selectie van de stuklijst op het plan.

Vriendelijke groeten

Option Explicit

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim selmgr As SelectionMgr

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    Dim vTable As SldWorks.TableAnnotation
    Set selmgr = swModel.SelectionManager
    Set vTable = selmgr.GetSelectedObject6(1, -1)

    ProcessTableAnn swApp, swModel, vTable
End Sub

Sub ProcessTableAnn(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swTableAnn As SldWorks.TableAnnotation)
    On Error Resume Next
    
    Dim nNumRow As Long
    Dim nNumColumn As Long
    Dim j As Long
    Dim i As Long
    Dim NumberComposant As String
    Dim ItemNumber As String
    Dim ItemNumberPrec As String
    Dim PartNumber As String
    Dim MomTableau() As String
    Dim n As Integer
    Dim nb As Integer
    n = 0
    nb = 0

    nNumRow = swTableAnn.RowCount

    Dim swBOMTableAnn As BomTableAnnotation
    Set swBOMTableAnn = swTableAnn
    
    Dim ConfigName As String
    ConfigName = swBOMTableAnn.Configuration

    For j = 0 To nNumRow - 1
        NumberComposant = swBOMTableAnn.GetComponentsCount2(j, ConfigName, ItemNumber, PartNumber)
        
        If ItemNumber = ItemNumberPrec & ".1" Then
            ReDim Preserve MomTableau(n)
            MomTableau(n) = j - 1
            n = n + 1
        End If

        ItemNumberPrec = ItemNumber
    Next j

    nb = UBound(MomTableau)
    While nb >= 0
        swBOMTableAnn.Dissolve (MomTableau(nb))
        nb = nb - 1
    Wend
End Sub

 

1 like

Enorm bedankt!
Het is perfect!

Bedankt!!