Pracujemy dzięki środowisku spawanemu mechanicznie (SW 2017). Tworząc nasze ogólne BOM-y, jeśli chcemy mieć listę każdego ciała, bez wyświetlania odpowiadających im części, musimy ręcznie rozłożyć każdą część (jak również każdy zespół), co czasami może być żmudne, zwłaszcza gdy SW decyduje się od czasu do czasu na rekompozycję naszych złożeń.
Czy istnieje sposób na to, aby zestawienie komponentów zawierało tylko zawartość zespołu? A może sposób na "rozłożenie tego wszystkiego na czynniki pierwsze" w nomenklaturę? (makro?)
Z góry wielkie dzięki, zaoszczędziliście nam dużo czasu.
Aby nasi koledzy mogli Ci pomóc, powinniśmy określić, czego chcesz, mówiąc "bez wyświetlania odpowiednich dokumentów".
Czy możesz zrobić zrzut ekranu tego, co otrzymujesz za pomocą żmudnej metody, o której mówisz: musimy rozłożyć każdą część (a także każdy zespół) ręcznie, )
Mamy silnych kolegów w tych tematach, będą wiedzieli, co powiedzieć w związku z twoją obecną pracą.
Aby rozbić każdy zespół, musisz przejść do właściwości konfiguracji (nawet jeśli jest tylko jeden) i wybrać "pokaż":
Aby automatycznie podzielić element na treść, widzę tylko makro.
@Zozo_mp: za pomocą SW możemy wyświetlić, w nomenklaturze, listę ciał składających się na część zamiast samej części (zgodnie z tą samą logiką, co w przypadku podzbioru "samozadowolenia").
Na przykład, jeśli mam zespół składający się z 20 części, z których każda jest mechanicznie spawana i składa się z kilku korpusów każda. Jeśli chcę, aby moja nomenklatura zawierała tylko ciała, muszę za każdym razem rozłożyć moje dwadzieścia kawałków (a czasami mamy ich znacznie więcej).
Tutaj mój kawałek to A i składa się z A1 do A10.
Co więcej, moje podzespoły są systematycznie w "Show" i nie rozbija to montażu. Czy nie byłaby to po prostu opcja wyświetlenia lub nie części składających się na zespół w zestawieniu materiałów?
Czy w przypadku makra masz jakieś wskazówki, które możesz mi przekazać? Nie czuję się komfortowo z tym językiem.
Udało mi się zrobić pierwsze makro, które dobrze rozkłada tabelę, wiersz po wierszu, zaczynając od końca, więc to już dobra wiadomość! :) Aby nabrać prędkości, chciałbym rozbić tylko niezbędne linie (a więc te odpowiadające podmontażowi lub spawaniu), czy istnieje sposób na odzyskanie typu ogniwa? Nie mogę znaleźć tego, czego potrzebuję, w dokumencie.
Nie sądzę, aby możliwe było pobranie typu artykułu z wiersza, ponieważ zwykle jest to tablica tekstu, którą pobieramy, gdy analizujemy nomenklaturę za pomocą interfejsów API. To od Ciebie zależy, czy możesz dodać kolumnę, która może być używana jako kryterium wyboru, na przykład "Nazwa pliku SW".
Tak, myślałem o tym, problem polega na tym, że część niespawana mechanicznie będzie wykonana z .sldprt (na przykład wszystkie), ale nadal nie trzeba jej rozkładać. To powiedziawszy, jest to rzeczywiście pierwsza poprawa!
Próbowałem dodać kolumnę z nazwą pliku, ale nie mogę tego zrobić, w rzeczywistości utknąłem na etapie definiowania typu kolumny. Udaje mi się dodać kolumnę, ale jest pusta. Celem jest zidentyfikowanie rozszerzenia pliku, aby rozbić tylko .sldprt i .sldasm Po tym kroku myślę, że wiem, jak to zrobić.
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
Tak, próbowałem użyć właściwości SetColumnCustomProperty, ale otrzymuję błąd tylko z powodu nieprawidłowego typu. Może najpierw potrzebuję setcolumntype .
Czytając ponownie wątek dyskusji, przyznaję, że nie mogę już za bardzo śledzić:
- Krok 1: Chodzi o to, aby to wszystko rozłożyć na czynniki pierwsze.
- Krok 2: Podziel tylko niektóre linie, aby zaoszczędzić czas.
- Krok 3: Nie rozkładaj pliku w zależności od typu pliku, ponieważ (na przykład) SDLPRT mogą być i nie powinny być rozkładane.
- Krok 4: Wstaw kolumnę, ponieważ celem jest zidentyfikowanie rozszerzenia pliku, aby podzielić tylko SLDPRT i SLDASM.
Myślę, że przed kontynuacją kodu należy zdefiniować potrzebę (zdekomponować wszystko: tak czy nie?), a jeśli nie, to określić kryteria wyboru linii do dekompozycji. Funkcja "GetComponents2" może być rzeczywiście innym tokiem myślenia w zależności od tego, co chcesz rozbić.
A w przypadku wstawiania nowej kolumny może być łatwiej po prostu zrobić to w szablonie BOM, zamiast próbować zrobić to za pomocą kodu...
Cel pozostaje ten sam: jak najszybsze opracowanie całkowicie rozbitej nomenklatury, ale w zależności od trudności związanych z wdrożeniem rzeczywiście istnieją etapy pośrednie. Mam makro, które rozkłada wszystkie komponenty, problemem jest ciężar tego makra, które rozkłada również mechanicznie spawane korpusy i niespawane .sldprt , które nie muszą być, marnując czas (funkcja rozpuszczania to nie błyskawica).
Moim ideałem byłoby więc rozbicie tylko zespołów i części spawanych mechanicznie, ale ponieważ nie mogłem tego zrobić, wróciłem do rozróżniania według nazwy pliku.
Przepraszam za ogólnikowość moich próśb, mam nadzieję, że ta wiadomość pomoże nam zobaczyć trochę jaśniej :)
Oto przykład, który opiera się na układzie współrzędnych BOM, aby wiedzieć, czy dekompozycja, czy nie, BOM musi mieć postać listy tabelarycznej (znacznik wyboru szczegółowej listy spawanych części nie jest obowiązkowy):
To przykład, od Ciebie zależy, czy dostosujesz się do swoich potrzeb...
Pozdrowienia
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
Przede wszystkim bardzo dziękuję za odpowiedź, jest naprawdę świetna! Twoje rozwiązanie poprzez numerację jest bardzo sprytne!
Staram się, staram się dostosować go dokładnie do mojego użytku, ale nieuchronnie problem boli.
Moim idealnym zastosowaniem byłoby rozbicie tylko aktywnego BOM. Dlatego używam GetSelectedObject6 (1, -1).
Ale zwraca tabelę, a ja nie mogę pobrać odpowiedniego BOM, aby móc pobrać konfigurację, oczywiście niezbędną dla GetComponentsCount.
Jeśli dobrze rozumiem Twój kod, patrzysz na wszystkie BOM-y, dla każdego z nich patrzysz na wszystkie odpowiadające im tabele i rozkładasz je na części.
Mój kod, dość prosty jak na mój poziom, wyglądał następująco:
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
Spróbuj z poniższym kodem, bądź ostrożny, wybór nomenklatury musi być dokonany w drzewie tworzenia, a nie na planie.
Pozdrowienia
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
Jeśli to możliwe, zapoznaj się z poniższą wersją z wyborem BOM na planie.
Pozdrowienia
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