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.
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.
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).
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.
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".
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 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
Ja, ich habe es mit einer SetColumnCustomProperty versucht, aber ich bekomme nur einen Fehler aufgrund eines fehlerhaften Typs. Vielleicht brauche ich zuerst einen setcolumntype .
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...
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:)
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
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
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