Witam
Obecnie zastanawiam się nad systemem do sprawdzania nazewnictwa maszyny. Drzewo maszyn jest podzielone na podzbiory, pogrupowane w foldery "funkcji" w drzewie tworzenia.
Idealnie byłoby mieć możliwość wyeksportowania zestawienia materiałów maszyny do Excela , z poszanowaniem grupowania w folderach montażowych. Nie znalazłem sposobu, aby zrobić to bezpośrednio, może dałoby się to zrobić przez VBA? Co myślisz?
Z góry dzięki!
Witam. Poniższe makro wyeksportuje strukturę drzewa, w tym foldery, takie jak:
TopLevelAsm1 > Asm3-1 > Część 4-1
TopLevelAsm1 > Folder1 > Asm2-1
TopLevelAsm1 > Folder1 > Asm2-1 > Część 1-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 polubienia
Witam
Dziękuję bardzo!
Chciałem to przetestować, ale mam błąd 91 w następującym wierszu:
swCompModel.ShowConfiguration2 swComp.ReferencedConfiguration
zmienna obiektowa lub zmienna blokowa z niezdefiniowaną wartością
Plik został utworzony, ale jest w nim tylko jeden wiersz
Czy masz jakieś pojęcie o pochodzeniu problemu? Z góry dzięki!
Ta linia nie jest konieczna, jeśli części mają tylko jedną konfigurację (lub są zapisane w konfiguracji używanej w złożeniu). Więc możesz go usunąć.
Nie powinno to jednak powodować błędu. Sprawdza, czy składnik jest prawidłowy z:
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
Jeśli możesz wysłać mi zespół z częścią, która powoduje problem, przyjrzę się temu.
1 polubienie
Mam ten sam błąd (91) na linii
Set swCompModel = swComp.GetModelDoc2
Poprzez przetaczanie linii tego bloku generowany jest mój plik.
Ten blok służy do przetwarzania podzespołów. Jeśli zespół nie ma podzespołów, można pozostawić go wyłączonym lub użyć:
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
Inaczej:
Co mówi "natychmiastowe" okno? (Widok menu > natychmiast)
Naprawdę nie mogę pomóc więcej, nie mając plików.
Nie znalazłem okna "natychmiastowego"... Czy to jest okno wykonywania VBA?
Z tego, co widziałem, błąd występuje w pierwszej części pierwszego podzbioru w pierwszym folderze drzewa ("Problem z komp: 23495-4364-2")
Folder i podzbiór pojawiają się w pliku, ale część nie.
W tym oknie:

I znowu: "Naprawdę nie mogę bardziej pomóc, nie mając plików".
Przepraszamy, nie mogę wysłać mojego zestawu w takiej postaci, w jakiej jest, ze względu na ochronę prywatności. Myślę, że zrobię kilka testów z montażem testowym, jeśli z tego nie wyjdę, wyślę Ci to do pogłębienia.
Dziękuję za pomoc w każdym razie!
Nie potrzebuję projektu części.
Zrób kopię zespołu, otwórz każdą z części, usuń funkcje, zapisz.
Zobacz załączony plik. Nawiasem mówiąc, możesz sprawdzić za pomocą tego zespołu, czy to działa.
asm.zip
Witam
Makro podane na początku dyskusji działa bardzo dobrze, wystarczy ustawić wszystkie komponenty na rozwiązane przed jego uruchomieniem, w przeciwnym razie powoduje błędy, ponieważ lekkie komponenty nie są dostępne, stąd komunikat o błędzie "zmienna obiektu lub zmienna blokowa z niezdefiniowaną".
Pozdrowienia
2 polubienia
Dziękuję d.roger.
Oryginalny kod został zmieniony w celu uwzględnienia:
swComp.SetSuppression2 swComponentSuppressionState_e.swComponentFullyResolved
Po: Ustaw swComp = ...
1 polubienie
Dziękuję d.roger i JeromeP!
Niestety zawsze otrzymuję komunikat o błędzie podczas uruchamiania makra, albo po przekazaniu wszystkich części do rozwiązania, albo po dodaniu linii (zawiesza się na danej linii).
To powiedziawszy, na początku działa, ponieważ nadal mam kilkanaście wierszy w pliku TSV.
Zamierzam przetestować z częściami "od zera", aby zobaczyć, czy mam te same problemy, będę Cię informować na bieżąco!
Czy masz wcześniej ten sam problem z zestawem dołączonym jako załącznik 3 wiadomości?
Tak, wykonanie utknęło w następującym wierszu:
swComp.SetSuppression2 swComponentSuppressionState_e.swComponentFullyResolved
W trybie debugowania widzę, że wartość swComponentSuppressionState_e.swComponentFullyResolved wynosi 2.
Właśnie zrobiłem test z pustymi częściami, makro wykonuje się poprawnie.
Czy uważasz, że ten problem może być związany z konfiguracją części lub z użyciem PDM?
Tak, prawdopodobnie pochodzi z PDM, aby przetestować najnowszą wersję wszystkich plików, aby umieścić je w lokalnej pamięci podręcznej...
Makra stworzone do pracy z PDM nie są w ogóle zbudowane w ten sam sposób, musisz polegać na interfejsach API Epdm, aby połączyć się z repozytorium, pobrać plik do lokalnej pamięci podręcznej itp. To już nie jest ta sama praca...
1 polubienie
Wartość 2 dla swComponentSuppressionState_e.swComponentFullyResolved jest normalna.
Problem z SetSuppression2 może również dotyczyć PDM. Możesz spróbować swComp.SetSuppression2 swComponentSuppressionState_e.swComponentResolved
Zrobiłem "najnowszą wersję" na wszystkich plikach (i zmodyfikowałem linię kodu JeromeP), eksportuje dobrze, ale zawiesza się na 1. podzbiorze drzewa.