Rozbijanie części spawanej mechanicznie

Witam

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.

Witam

Chciałbym poruszyć temat jeszcze raz, na wypadek gdyby ktoś miał jakieś pomysły :)

Z góry dzięki! 

Witam

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ą.

Pozdrowienia

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").

1 polubienie

Witam

Dziękuję za odpowiedzi :)

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.

Jeszcze raz dziękujemy!

Witam

Aby zrobić to za pomocą makra możesz skorzystać z funkcji "Rozpuszczaj", którą znajdziesz TUTAJ z przykładem użycia tutaj.

Pozdrowienia

2 polubienia

Dziękuję bardzo:

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".

1 polubienie

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!

Widziałem, że jest funkcja "GetComponents2", która pozwala na zwrócenie komponentu. Czy nie ma na to sposobu? 
http://help.solidworks.com/2017/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IBomTableAnnotation~GetComponents2.html

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

 

Witam

Wstawiasz kolumnę, ale nie nadajesz jej typu, spójrz na poniższy przykład, jest tam również wiersz z funkcją SetColumnType.

Pozdrowienia

1 polubienie

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 .

Witam

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...

Pozdrowienia

2 polubienia

Witam

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 :) 
 

Witam

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

 

Witam

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

 

Witam

Myślałem o tym, więc wyobrażam sobie, że jeśli proponujesz takie rozwiązanie, to dlatego, że przez wybór na planie nie jest to możliwe?

Jeszcze raz bardzo dziękuję

Witam

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

 

1 polubienie

Ogromne podziękowania!
Jest idealny!

Dziękuję!!