Hallo
Ik denk momenteel aan een systeem om de nomenclatuur van een machine te controleren. De machineboom is gestructureerd in subsets, gegroepeerd in "functie"-mappen in de creatieboom.
Het liefst zou ik de stuklijst van de machine naar Excel willen kunnen exporteren, met respect voor de groeperingen in assemblagemappen. Ik heb geen manier gevonden om het direct te doen, misschien zou het mogelijk zijn om het via VBA te doen? Wat denk je?
Bij voorbaat dank!
Hallo. De onderstaande macro exporteert de boomstructuur, inclusief de mappen zoals:
TopLevelAsm1 > Asm3-1 > deel 4-1
TopLevelAsm1 > Folder1 > Asm2-1
TopLevelAsm1 > Folder1 > Asm2-1 > Part1-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 likes
Hallo
Hartelijk dank!
Ik wilde dit testen, maar ik heb een fout 91 op de volgende regel:
swCompModel.ShowConfiguration2 swComp.ReferencedConfiguration
objectvariabele of blokvariabele met niet gedefinieerd
Het bestand is gemaakt, maar er staat maar één regel in
Heeft u enig idee waar het probleem vandaan komt? Bij voorbaat dank!
Deze regel is niet per se nodig als de onderdelen slechts één configuratie hebben (of worden opgeslagen in de configuratie die in de assemblage wordt gebruikt). Je kunt het dus verwijderen.
Het mag echter geen fout veroorzaken. Controleert of het onderdeel geldig is met:
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
Als je me de montage kunt sturen met het onderdeel dat het probleem veroorzaakt, zal ik ernaar kijken.
1 like
Ik heb dezelfde fout (91) op de lijn
Set swCompModel = swComp.GetModelDoc2
Door het rangeren van de lijnen van dit blok wordt mijn bestand gegenereerd.
Dit blok wordt gebruikt om subassemblages te verwerken. Als de assembly geen subassemblages heeft, kunt u deze uitgeschakeld laten of het volgende gebruiken:
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
Anders:
Wat zegt het "onmiddellijke" venster? (Menuweergave > Onmiddellijk)
Ik kan niet echt meer helpen zonder de bestanden te hebben.
Ik heb het "onmiddellijke" venster niet gevonden... Is dit het uitvoeringsvenster van VBA?
Van wat ik heb gezien, treedt de fout op in het eerste deel van de eerste subset in de eerste map van de boom ("Comp-probleem met: 23495-4364-2")
De map en subset verschijnen in het bestand, maar het deel niet.
Dit venster:

Nogmaals: "Ik kan niet echt meer helpen zonder de bestanden te hebben."
Sorry, ik kan mijn montage om privacyredenen niet verzenden zoals hij is. Ik denk dat ik wat tests ga doen met een testmontage, als ik er niet uit kom stuur ik je dit om te verdiepen.
Bedankt voor je hulp in ieder geval!
Ik heb het ontwerp van de onderdelen niet nodig.
Maak een kopie van de montage, open elk van de onderdelen, wis de functies, sla op.
Zie bijgevoegd bestand. Overigens kun je met deze montage controleren of het werkt.
asm.zip
Hallo
De macro die aan het begin van de discussie wordt gegeven, werkt erg goed, je hoeft alleen maar alle componenten in te stellen om opgelost te zijn voordat je het start, anders bugs omdat de lichtgewicht componenten niet toegankelijk zijn, vandaar de foutmelding "objectvariabele of blokvariabele met niet gedefinieerd".
Vriendelijke groeten
2 likes
Dank je wel d.roger.
De oorspronkelijke code is gewijzigd om het volgende op te nemen:
swComp.SetSuppression2 swComponentSuppressionState_e.swComponentFullyResolved
Na: Stel swComp = ...
1 like
Bedankt d.roger en JeromeP!
Helaas krijg ik altijd een foutmelding bij het uitvoeren van de macro, hetzij na het passeren van alle op te lossen onderdelen, hetzij met de toevoeging van de regel (deze crasht op de betreffende regel).
Dat gezegd hebbende, werkt het in eerste instantie omdat ik nog een dozijn regels in het TSV-bestand heb.
Ik ga testen met onderdelen "from scratch" om te zien of ik dezelfde problemen heb, ik hou jullie op de hoogte!
Heeft u hetzelfde probleem met de assemblage die 3 berichten eerder als bijlage is bijgevoegd?
Ja, de uitvoering is vastgelopen op de volgende regel:
swComp.SetSuppression2 swComponentSuppressionState_e.swComponentFullyResolved
In de foutopsporingsmodus zie ik dat de waarde van swComponentSuppressionState_e.swComponentFullyResolved 2 is.
Ik heb net een test gedaan met lege delen, de macro voert correct uit.
Denkt u dat dit probleem te maken kan hebben met een configuratie van de onderdelen of met het gebruik van de PDM?
Ja, het komt waarschijnlijk van de PDM, om te testen doe een get latest versie op al uw bestanden om ze in uw lokale cache te zetten ...
De macro's die gemaakt zijn om met de PDM te werken, zijn helemaal niet op dezelfde manier gebouwd, je moet vertrouwen op de Epdm-API's om verbinding te maken met de kluis, het bestand in de lokale cache te krijgen, enz ... Het is niet helemaal hetzelfde werk meer...
1 like
De waarde van 2 voor swComponentSuppressionState_e.swComponentFullyResolved is normaal.
Het probleem met SetSuppression2 kan ook bij de PDM liggen. U kunt swComp.SetSuppression2 swComponentSuppressionState_e.swComponentResolved proberen
Ik heb "de nieuwste versie" op alle bestanden (en de JeromeP-coderegel gewijzigd), het exporteert goed, maar het crasht op de 1e subset van de boom.