We werken dankzij de mechanisch gelaste omgeving (SW 2017). Bij het maken van onze algemene stuklijsten, als we de lijst van elk lichaam willen hebben, zonder de weergave van de bijbehorende onderdelen, moeten we elk onderdeel (evenals elke assemblage) met de hand afbreken, wat soms vervelend kan zijn, vooral wanneer SW besluit om onze assemblages van tijd tot tijd opnieuw samen te stellen.
Is er een manier om een stuklijst te hebben die alleen de organen van een vergadering vermeldt? Of een manier om "alles op te splitsen" in een nomenclatuur? (macro?)
Bij voorbaat hartelijk dank, u bespaart ons veel tijd.
Om ervoor te zorgen dat onze collega's u kunnen helpen, moeten we aangeven wat u wilt als u zegt "zonder de bijbehorende documenten weer te geven",
Kun je een screenshot maken van wat je krijgt met de vervelende methode die je zegt: we moeten elk onderdeel (evenals elke montage) met de hand afbreken, )
We hebben sterke collega's op dit gebied, ze zullen weten wat ze moeten zeggen gezien je huidige werk.
Om elke assemblage op te splitsen, moet u naar de configuratie-eigenschappen gaan (zelfs als er maar één is) en "tonen" kiezen:
Om een stuk automatisch op te splitsen in een lichaam, zie ik alleen een macro.
@Zozo_mp: met SW kunnen we, in een nomenclatuur, de lijst weergeven van lichamen die een deel vormen in plaats van het deel zelf (volgens dezelfde logica als bij een "zelfgenoegzaamheid" deelverzameling).
Als ik bijvoorbeeld een assemblage heb van 20 onderdelen, elk mechanisch gelast en elk samengesteld uit meerdere lichamen. Als ik wil dat mijn nomenclatuur alleen de lichamen bevat, moet ik elke keer mijn twintig stukken afbreken (en soms hebben we er veel meer).
Hier is mijn stuk A, en is samengesteld uit A1 tot A10.
Bovendien staan mijn subassemblages systematisch in "Show", en het breekt de assemblage niet af. Zou het niet gewoon een optie zijn om de onderdelen waaruit de assemblage bestaat al dan niet weer te geven in de stuklijst?
Heb je voor een macro aanwijzingen om me te geven? Ik voel me niet op mijn gemak met deze taal.
Ik was in staat om een eerste macro te maken die de tabel goed opsplitst, regel voor regel beginnend vanaf het einde, dus al goed nieuws! :) Om snelheid te winnen, zou ik alleen de noodzakelijke lijnen willen opsplitsen (dus die welke overeenkomen met subassemblage of lassen), is er een manier om het celtype te herstellen? Ik kan niet vinden wat ik nodig heb in het document.
Ik denk niet dat het mogelijk is om het type artikel uit een regel te halen, omdat het meestal een reeks tekst is die we ophalen wanneer we een nomenclatuur analyseren door API's. Het is aan jou om te kijken of je een kolom kunt toevoegen die als selectiecriterium kan worden gebruikt, zoals bijvoorbeeld "SW-File Name".
Ja ik heb erover nagedacht, het probleem is dat een niet-mechanisch gelast onderdeel van .sldprt wordt gemaakt (bijvoorbeeld alle schroeven), maar nog steeds niet hoeft te worden afgebroken. Dat gezegd hebbende, het is inderdaad een eerste verbetering!
Ik heb geprobeerd een kolom met de bestandsnaam toe te voegen, maar ik kan het niet, in feite loop ik vast bij de stap van het definiëren van het kolomtype. Het lukt me om de kolom toe te voegen, maar deze is leeg. Het doel is om de bestandsextensie te identificeren, om alleen de .sldprt en .sldasm op te splitsen Na deze stap denk ik dat ik weet hoe het moet.
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
Ja, ik heb het geprobeerd met een SetColumnCustomProperty, maar ik krijg alleen een foutmelding vanwege een slecht type. Misschien heb ik eerst een setcolumntype nodig.
Als ik de draad van de discussie herlees, geef ik toe dat ik niet al te veel meer kan volgen:
- Stap 1: De vraag is om alles op te splitsen.
- Stap 2: Breek alleen bepaalde regels op om tijd te besparen.
- Stap 3: Ontleed niet volgens het bestandstype, omdat (bijvoorbeeld) SDLPRT's schroeven kunnen zijn en niet mogen worden ontleed.
- Stap 4: Voeg een kolom in, want het doel is om de bestandsextensie te identificeren, om alleen de SLDPRT en SLDASM op te splitsen.
Ik denk dat het, voordat we verder gaan met de code, noodzakelijk is om de noodzaak te definiëren (alles ontleden: ja of nee?) en, zo niet, om de criteria te definiëren voor het selecteren van de te ontleden regels. De functie "GetComponents2" kan inderdaad een andere gedachtegang zijn, afhankelijk van wat u wilt afbreken.
En voor het invoegen van een nieuwe kolom is het misschien gemakkelijker om dit gewoon in de BOM-sjabloon te doen in plaats van te proberen het via code te doen...
Het doel blijft hetzelfde: snel een volledig afgebroken nomenclatuur hebben, maar afhankelijk van de moeilijkheden bij de implementatie zijn er inderdaad tussenstappen. Ik heb wel een macro die alle componenten afbreekt, het probleem is de zwaarte van deze macro, die ook de mechanisch gelaste lichamen en de niet-gelaste .sldprt afbreekt, die niet hoeft te zijn, tijdverspilling (de oplosfunctie is geen bliksemschicht).
Mijn ideaal zou daarom zijn om alleen de assemblages en de mechanisch gelaste onderdelen af te breken, maar aangezien ik dat niet kon doen, viel ik terug op differentiatie op bestandsnaam.
Sorry voor de vaagheid van mijn verzoeken, ik hoop dat dit bericht ons zal helpen een beetje duidelijker te zien:)
Hier is een voorbeeld dat vertrouwt op het BOM-coördinatensysteem om te weten of het al dan niet moet worden ontleed, de stuklijst moet de vorm hebben van een lijst in tabelvorm (het vinkje voor de gedetailleerde lijst van gelaste onderdelen is niet verplicht):
Het is een voorbeeld, het is aan jou om je aan te passen aan je behoeften...
Vriendelijke groeten
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
Allereerst heel erg bedankt voor je antwoord, het is echt geweldig! Uw oplossing door nummering is heel slim!
Ik probeer, ik probeer het precies aan te passen aan mijn gebruik, maar het is onvermijdelijk dat het probleem pijn doet.
Mijn ideale gebruik zou zijn om alleen de actieve stuklijst op te splitsen. Dus ik gebruik de GetSelectedObject6(1, -1).
Maar het retourneert een tabel, en het lukt me niet om de bijbehorende BOM op te halen, om de configuratie te kunnen ophalen, uiteraard essentieel voor de GetComponentsCount.
Als ik je code goed begrijp, kijk je naar alle stuklijsten, voor elk van hen kijk je naar alle bijbehorende tabellen, en je splitst ze allemaal op.
Mijn code, vrij eenvoudig gezien mijn niveau, was als volgt:
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
Probeer het met de onderstaande code, wees voorzichtig, de selectie van de nomenclatuur moet gebeuren in de creatieboom en niet op het plan.
Vriendelijke groeten
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
Daar had ik over nagedacht, dus ik kan me voorstellen dat als je deze oplossing voorstelt, dat is omdat het door de selectie op het plan niet mogelijk is?
Zie indien mogelijk de onderstaande versie met selectie van de stuklijst op het plan.
Vriendelijke groeten
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