Hallo
Ich denke gerade über ein System nach, um die Nomenklatur einer Maschine zu überprüfen. Der Maschinenbaum ist in Teilmengen strukturiert, die in "function"-Ordnern im Erstellungsbaum gruppiert sind.
Im Idealfall möchte ich in der Lage sein, die Stückliste der Maschine nach Excel zu exportieren und dabei die Gruppierungen in den Montageordnern zu berücksichtigen. Ich habe keinen Weg gefunden, es direkt zu tun, vielleicht wäre es möglich, es über VBA zu tun? Was denkst du?
Vielen Dank im Voraus!
Hallo. Mit dem folgenden Makro wird die Baumstruktur einschließlich der Ordner exportiert, wie z. B.:
TopLevelAsm1 > Asm3-1 > Teil4-1
TopLevelAsm1 > Ordner1 > Asm2-1
TopLevelAsm1 > Ordner1 > Asm2-1 > Teil1-1
Option Explicit
Dim FilePath As String
Sub main()
FilePath = "C:\Temp\myBOM.TSV"
If Dir(FilePath) <> "" Then Kill FilePath
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
TraverseAssyFeatures swModel, Mid(swModel.GetPathName, InStrRev(swModel.GetPathName, "\") + 1, InStrRev(swModel.GetPathName, ".") - InStrRev(swModel.GetPathName, "\") - 1)
End Sub
Sub TraverseAssyFeatures(ByVal swModel As SldWorks.ModelDoc2, ByRef Rep As String)
Dim swComp As SldWorks.Component2
Dim swCompModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim swEntity As SldWorks.Entity
Set swFeat = swModel.FirstFeature
While Not swFeat Is Nothing
Set swEntity = swFeat
If swEntity.GetType = swSelectType_e.swSelFTRFOLDER Then
If InStr(swFeat.Name, "EndTag") = 0 Then
Rep = Rep & " > " & swFeat.Name
Else
Rep = Left(Rep, InStrRev(Rep, " > ") - 1)
End If
End If
If swEntity.GetType = swSelectType_e.swSelCOMPONENTS Then
WriteIntoFile Rep & " > " & swFeat.Name
If swModel.GetType = swDocumentTypes_e.swDocASSEMBLY Then
Set swComp = swFeat.GetSpecificFeature2
swComp.SetSuppression2 swComponentSuppressionState_e.swComponentFullyResolved
Set swCompModel = swComp.GetModelDoc2
swCompModel.ShowConfiguration2 swComp.ReferencedConfiguration
TraverseAssyFeatures swCompModel, Rep & " > " & swFeat.Name
End If
End If
Set swFeat = swFeat.GetNextFeature
Wend
End Sub
Sub WriteIntoFile(logSTR As String)
Dim My_fileNum As Integer
My_fileNum = FreeFile
Open FilePath For Append As #My_fileNum
Print #My_fileNum, logSTR
Close #My_fileNum
End Sub
4 „Gefällt mir“
Hallo
Vielen Dank!
Ich wollte das testen, aber ich habe einen Fehler 91 in der folgenden Zeile:
swCompModel.ShowConfiguration2 swComp.ReferencedConfiguration
Objektvariable oder Blockvariable mit nicht definierter
Die Datei wird erstellt, aber sie enthält nur eine Zeile
Haben Sie eine Idee, was der Ursprung des Problems ist? Vielen Dank im Voraus!
Diese Zeile ist nicht unbedingt erforderlich, wenn die Teile nur eine Konfiguration haben (oder in der Konfiguration gespeichert sind, die in der Baugruppe verwendet wird). Damit Sie es entfernen können.
Es sollte jedoch kein Fehler verursacht werden. Überprüft, ob die Komponente gültig ist mit:
If swModel.GetType = swDocumentTypes_e.swDocASSEMBLY Then
Set swComp = swFeat.GetSpecificFeature2
If swComp is Nothing then Debug.print "Problème comp avec: " & swFeat.Name
Set swCompModel = swComp.GetModelDoc2
If swCompModel is Nothing then Debug.print "Problème modèle avec: " & swFeat.Name
If Not swCompModel is Nothing then
'Debug.Print "Config Name: " & swComp.ReferencedConfiguration
'swCompModel.ShowConfiguration2 swComp.ReferencedConfiguration
TraverseAssyFeatures swCompModel, Rep & " > " & swFeat.Name
End If
End If
Wenn Sie mir die Baugruppe mit dem Teil schicken können, das das Problem verursacht, werde ich mich darum kümmern.
1 „Gefällt mir“
Ich habe den gleichen Fehler (91) in der Leitung
Set swCompModel = swComp.GetModelDoc2
Durch das Verschieben der Zeilen dieses Blocks wird meine Datei erzeugt.
Dieser Block wird zum Verarbeiten von Baugruppen verwendet. Wenn die Baugruppe nicht über Unterbaugruppen verfügt, können Sie sie deaktiviert lassen oder Folgendes verwenden:
If swModel.GetType = swDocumentTypes_e.swDocASSEMBLY Then
Set swComp = swFeat.GetSpecificFeature2
If swComp is Nothing then Debug.print "Problème comp avec: " & swFeat.Name
If Not swComp is Nothing then
Set swCompModel = swComp.GetModelDoc2
If swCompModel is Nothing then Debug.print "Problème modèle avec: " & swFeat.Name
If Not swCompModel is Nothing then
'Debug.Print "Config Name: " & swComp.ReferencedConfiguration
'swCompModel.ShowConfiguration2 swComp.ReferencedConfiguration
TraverseAssyFeatures swCompModel, Rep & " > " & swFeat.Name
End If
End If
End If
Sonst:
Was sagt das "unmittelbare" Fenster? (Menüansicht > Sofort)
Ich kann nicht wirklich mehr helfen, ohne die Dateien zu haben.
Ich habe das "unmittelbare" Fenster nicht gefunden... Ist dies das Ausführungsfenster von VBA?
Nach dem, was ich gesehen habe, tritt der Fehler beim ersten Teil der ersten Teilmenge im ersten Ordner des Baums auf ("Comp-Problem mit: 23495-4364-2")
Der Ordner und die Teilmenge werden in der Datei angezeigt , das Teil jedoch nicht.
Dieses Fenster:
Nochmals: "Ich kann nicht wirklich mehr helfen, ohne die Dateien zu haben."
Leider kann ich meine Assembly aus Datenschutzgründen nicht so versenden, wie sie ist. Ich denke, ich werde einige Tests mit einer Testassembly machen, wenn ich nicht rauskomme, schicke ich Ihnen das zur Vertiefung.
Vielen Dank auf jeden Fall für Ihre Hilfe!
Ich brauche das Design der Teile nicht.
Erstellen Sie eine Kopie der Baugruppe, öffnen Sie jedes Teil, löschen Sie die Funktionen, und speichern Sie.
Siehe angehängte Datei. Übrigens können Sie mit dieser Assembly überprüfen, ob sie funktioniert.
asm.zip
Hallo
Das zu Beginn der Diskussion angegebene Makro funktioniert sehr gut, Sie müssen nur alle Komponenten auf gelöst setzen, bevor Sie es starten, sonst kommt es zu Fehlern, da die leichtgewichtigen Komponenten nicht zugänglich sind, daher die Fehlermeldung "Objektvariable oder Blockvariable mit nicht definiert".
Herzliche Grüße
2 „Gefällt mir“
Vielen Dank, d.roger.
Ursprünglicher Code geändert und enthält nun Folgendes:
swComp.SetSuppression2 swComponentSuppressionState_e.swComponentFullyResolved
Nachher: Set swComp = ...
1 „Gefällt mir“
Danke d.roger und JeromeP!
Leider bekomme ich beim Ausführen des Makros immer eine Fehlermeldung, entweder nach dem Übergeben aller zu lösenden Teile oder beim Hinzufügen der Zeile (es stürzt auf der betreffenden Zeile ab).
Das heißt, es funktioniert zunächst, weil ich noch ein Dutzend Zeilen in der TSV-Datei habe.
Ich werde mit Teilen "von Grund auf" testen, um zu sehen, ob ich die gleichen Probleme habe, ich halte Sie auf dem Laufenden!
Haben Sie das gleiche Problem mit der Baugruppe, die als Anhang 3 Nachrichten angehängt wurde?
Ja, die Ausführung bleibt in der folgenden Zeile hängen:
swComp.SetSuppression2 swComponentSuppressionState_e.swComponentFullyResolved
Im Debugmodus sehe ich, dass der Wert von swComponentSuppressionState_e.swComponentFullyResolved 2 ist.
Ich habe gerade einen Test mit leeren Teilen gemacht, das Makro wird ordnungsgemäß ausgeführt.
Glauben Sie, dass dieses Problem mit einer Konfiguration der Teile oder mit der Verwendung des PDM zusammenhängen könnte ?
Ja, es kommt wahrscheinlich vom PDM, um zu testen, holen Sie sich die neueste Version für alle Ihre Dateien, um sie in Ihren lokalen Cache zu legen ...
Die Makros, die für die Arbeit mit dem PDM erstellt wurden, sind überhaupt nicht auf die gleiche Weise erstellt, Sie müssen sich auf die Epdm-APIs verlassen, um eine Verbindung zum Tresor herzustellen, die Datei in den lokalen Cache zu bringen usw. Es ist nicht mehr ganz derselbe Job...
1 „Gefällt mir“
Der Wert 2 für swComponentSuppressionState_e.swComponentFullyResolved ist normal.
Das Problem mit SetSuppression2 kann auch am PDM liegen. Sie können swComp.SetSuppression2 swComponentSuppressionState_e.swComponentResolved ausprobieren
Ich habe für alle Dateien die neueste Version abgerufen (und die JeromeP-Codezeile geändert), es wird gut exportiert, aber es stürzt in der 1. Teilmenge des Baums ab.