Zerlegung eines mechanisch geschweißten Teils

Hallo

Wir arbeiten dank der mechanisch geschweißten Umgebung (SW 2017). Wenn wir bei der Erstellung unserer allgemeinen Stücklisten die Liste jedes Körpers haben möchten, ohne die entsprechenden Teile anzuzeigen, müssen wir jedes Teil (sowie jede Baugruppe) von Hand zerlegen, was manchmal mühsam sein kann, insbesondere wenn SW beschließt, unsere Baugruppen von Zeit zu Zeit neu zusammenzustellen.

Gibt es eine Möglichkeit, eine Stückliste zu erstellen, die nur die Körper einer Baugruppe auflistet? Oder eine Möglichkeit, alles in eine Nomenklatur "herunterzubrechen"? (Makro?)

Ein großes Dankeschön im Voraus, Sie sparen uns viel Zeit.

Hallo

Ich würde das Thema gerne noch einmal aufgreifen, falls jemand Ideen hat:)

Vielen Dank im Voraus! 

Hallo

Damit unsere Kollegen Ihnen helfen können, sollten wir spezifizieren, was Sie wollen, wenn Sie sagen "ohne die Anzeige der entsprechenden Dokumente zu haben",

Können Sie einen Screenshot davon machen, was Sie mit der mühsamen  Methode erhalten, die Sie sagen: Wir müssen jedes Teil (sowie jede Baugruppe) von Hand zerlegen, )

Wir haben starke Kollegen zu diesen Themen, sie werden wissen, was sie im Hinblick auf Ihre aktuelle Arbeit zu sagen haben.

Herzliche Grüße

Um jede Assembly zu zerlegen, müssen Sie in die Konfigurationseigenschaften gehen (auch wenn es nur eine gibt) und "anzeigen" auswählen:

Um ein Stück automatisch in einen Körper zu zerlegen, sehe ich nur ein Makro.

@Zozo_mp: Mit SW können wir in einer Nomenklatur die Liste der Körper anzeigen, aus denen ein Teil besteht, anstatt des Teils selbst (nach der gleichen Logik wie bei einer "Selbstgefälligkeit"-Teilmenge).

1 „Gefällt mir“

Hallo

Vielen Dank für Ihre Antworten:)

Zum Beispiel, wenn ich eine Baugruppe habe, die aus 20 Teilen besteht, die jeweils mechanisch verschweißt sind und aus jeweils mehreren Körpern bestehen. 
Wenn ich möchte, dass meine Nomenklatur nur die Körper enthält, muss ich jedes Mal meine zwanzig Teile zerlegen (und manchmal haben wir viel mehr).

Hier ist mein Stück A und setzt sich aus A1 bis A10 zusammen.

Darüber hinaus befinden sich meine Unterbaugruppen systematisch in "Anzeigen", und die Baugruppe wird nicht zerlegt. Wäre es nicht nur eine Option, die Teile, aus denen die Baugruppe besteht, in der Stückliste anzuzeigen oder nicht?

Haben Sie für ein Makro irgendwelche Leads, die Sie mir geben können? Ich fühle mich mit dieser Sprache nicht wohl.

Nochmals vielen Dank!

Hallo

Um dies per Makro zu tun, können Sie die Funktion "Auflösen" verwenden, die Sie HIER mit einem Anwendungsbeispiel hier finden.

Herzliche Grüße

2 „Gefällt mir“

Vielen Dank:

Ich konnte ein erstes Makro erstellen, das die Tabelle gut aufschlüsselt, Zeile für Zeile, beginnend mit dem Ende, also schon gute Nachrichten!  :)
Um die Geschwindigkeit zu erhöhen, möchte ich nur die notwendigen Linien aufschlüsseln (also diejenigen, die der Unterbaugruppe oder Schweißkonstruktion entsprechen), gibt es eine Möglichkeit, den Zellentyp wiederherzustellen? Ich kann im Dokument nicht finden, was ich brauche.

Ich glaube nicht, dass es möglich ist, die Art des Artikels aus einer Zeile abzurufen, da es sich normalerweise um ein Textarray handelt, das wir abrufen, wenn wir eine Nomenklatur durch APIs analysieren. Es liegt an Ihnen zu prüfen, ob Sie eine Spalte hinzufügen können, die als Auswahlkriterium verwendet werden kann, wie z.B. "SW-Dateiname".

1 „Gefällt mir“

Ja, ich habe darüber nachgedacht, das Problem ist, dass ein nicht mechanisch geschweißtes Teil aus .sldprt besteht (z.B. alle Schrauben), aber trotzdem nicht zerlegt werden muss. 
Nichtsdestotrotz ist es in der Tat eine erste Verbesserung!

Ich habe gesehen, dass es die Funktion "GetComponents2" gibt, mit der Sie eine Komponente zurückgeben können. Gibt es dafür nicht einen Weg? 
http://help.solidworks.com/2017/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IBomTableAnnotation~GetComponents2.html

Ich habe versucht, eine Spalte mit dem Dateinamen hinzuzufügen, aber ich kann es nicht tun, tatsächlich bleibe ich beim Schritt der Definition des Spaltentyps hängen. Ich schaffe es, die Spalte hinzuzufügen, aber sie ist leer. Ziel ist es, die Dateiendung zu identifizieren, um nur die Dateien .sldprt und .sldasm zu zerlegen
Nach diesem Schritt glaube ich zu wissen, wie es geht.

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

Sie fügen Ihre Spalte ein, geben ihr aber keinen Typ, sehen Sie sich das folgende Beispiel an, es gibt auch eine Zeile mit der SetColumnType-Funktion.

Herzliche Grüße

1 „Gefällt mir“

Ja, ich habe es mit einer SetColumnCustomProperty versucht, aber ich bekomme nur einen Fehler aufgrund eines fehlerhaften Typs. Vielleicht brauche ich zuerst einen setcolumntype .

Hallo

Wenn ich den Diskussionsthread noch einmal lese, gebe ich zu, dass ich nicht mehr allzu viel folgen kann:

- Schritt 1: Die Frage ist, alles aufzuschlüsseln.

- Schritt 2: Teilen Sie nur bestimmte Zeilen auf, um Zeit zu sparen.

- Schritt 3: Zerlegen Sie nicht nach Dateityp, da (zum Beispiel) SDLPRTs Schrauben sein können und nicht zerlegt werden sollten.

- Schritt 4: Fügen Sie eine Spalte ein, da das Ziel darin besteht, die Dateierweiterung zu identifizieren und nur SLDPRT und SLDASM aufzuschlüsseln.

Ich denke, dass es vor dem Fortfahren des Codes notwendig ist, den Bedarf zu definieren (alles zerlegen: ja oder nein?) und, wenn nicht, die Kriterien für die Auswahl der zu zerlegenden Zeilen zu definieren. Die Funktion "GetComponents2" kann in der Tat ein weiterer Gedankengang sein, je nachdem, was Sie aufschlüsseln möchten.

Und um eine neue Spalte einzufügen, kann es einfacher sein, dies einfach in der Stücklistenvorlage zu tun, anstatt zu versuchen, es durch Code zu tun...

Herzliche Grüße

2 „Gefällt mir“

Hallo

Das Ziel bleibt dasselbe: schnell eine vollständig aufgeschlüsselte Nomenklatur zu haben, aber je nach den Schwierigkeiten der Umsetzung gibt es tatsächlich Zwischenschritte. 
Ich habe ein Makro, das alle Komponenten zerlegt, das Problem ist die Schwere dieses Makros, das auch die mechanisch geschweißten Körper und die nicht geschweißten .sldprt zerlegt, die nicht sein müssen, was Zeit verschwendet (die Auflösungsfunktion ist kein Blitz ).

Mein Ideal wäre es daher, nur die Baugruppen und die mechanisch geschweißten Teile zu zerlegen, aber da ich das nicht konnte, habe ich auf die Unterscheidung nach Dateinamen zurückgegriffen. 

Entschuldigung für die Vagheit meiner Anfragen, ich hoffe, diese Nachricht wird uns helfen, ein wenig klarer zu sehen:) 
 

Hallo

Hier ist ein Beispiel, das sich auf das Stücklistenkoordinatensystem stützt, um zu wissen, ob es sich um eine Zerlegung handelt oder nicht, die Stückliste muss in Form einer tabellarischen Liste vorliegen (das Häkchen für die detaillierte Liste der geschweißten Teile ist nicht obligatorisch):

Es ist ein Beispiel, es liegt an Ihnen, sich an Ihre Bedürfnisse anzupassen...

Herzliche Grüße

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

 

Zunächst einmal vielen Dank für Ihre Antwort, es ist wirklich toll! Ihre Lösung durch Nummerierung ist sehr clever!

Ich versuche, ich versuche, es genau an meinen Gebrauch anzupassen, aber das Problem tut unweigerlich weh.

Mein idealer Verwendungszweck wäre, nur die aktive Stückliste aufzuschlüsseln.
Also verwende ich GetSelectedObject6 (1, -1).

Aber es gibt eine Tabelle zurück, und ich kann es nicht schaffen, die entsprechende BOM abzurufen, um die Konfiguration abrufen zu können, die offensichtlich für GetComponentsCount unerlässlich ist.

Wenn ich Ihren Code richtig verstehe, schauen Sie sich alle Stücklisten an, für jede von ihnen sehen Sie sich alle entsprechenden Tabellen an und schlüsseln sie in jede einzelne auf.

Mein Code, der in Anbetracht meines Niveaus recht einfach ist, sah wie folgt aus:

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

Versuchen Sie es mit dem untenstehenden Code, seien Sie vorsichtig, die Auswahl der Nomenklatur muss im Erstellungsbaum und nicht im Plan erfolgen.

Herzliche Grüße

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

Ich hatte darüber nachgedacht, also stelle ich mir vor, dass, wenn Sie diese Lösung vorschlagen, es durch die Auswahl auf dem Plan nicht möglich ist?

Vielen Dank noch einmal

Hallo

Wenn möglich, sehen Sie sich die Version unten mit Auswahl der Stückliste auf dem Plan an.

Herzliche Grüße

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 „Gefällt mir“

Ein riesiges Dankeschön!
Es ist perfekt!

Vielen Dank!!