| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | E-Book: Simulation für Hightech Innovationen |
Autor
|
Thema: Makro: Stückliste umbenennen/Schleife durch Features (3028 mal gelesen)
|
red5000 Mitglied
Beiträge: 47 Registriert: 23.08.2011 Solidworks 2012 x64 Windows 7 Xeon W3565 Quadro 4000 RAM 12 GB
|
erstellt am: 02. Mai. 2013 15:50 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin zur Zeit dabei ein Makro zu schreiben mit dem autom. zwei verschiedene Stücklisten eingefügt werden. Ich weiß aber nicht wie ich die Stücklisten umbenennen kann. Wenn es direkt beim einfügen nicht geht, könnte ich mit einer Schleife durch alle Features im Featuremanager nach den Stücklisten suchen und diese umbenennen. Weiter unten im Code ist was ich aufgenommen habe, das Problem ist aber, dass die Stücklisten nicht unbedingt Stückliste1, 2 etc. heißen (zb. wenn man vorher welche eingefügt und dann gelöscht hat kann die Numerierung sonstwo anfangen). Wie kann ich außerdem die Konfiguration der Zeichenansicht herauskriegen (siehe Makro), damit ich diese bei den Stücklisten verwenden kann? Lösungs- sowie Verbesserungsvorschläge sind willkommen! Benutze SWX 2012 gruß, red Code:
Option ExplicitDim swApp As Object Dim swModel As Object Dim swView As Object Dim boolstatus As Boolean Dim anchorType As Long Dim bomTypeMS As Long Dim bomTypeTS As Long Dim configuration As String Dim templateMS As String Dim templateTS As String Dim swBomAnn As BomTableAnnotation Dim swBomFeat As SldWorks.BomFeature Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc 'Aktives Dokument If swModel Is Nothing Then 'Falls kein Dokument geöffnet ist MsgBox "Bitte eine Zeichnung öffnen.", _ vbOKOnly + vbExclamation, "Keine Datei geöffnet" ClearObjects Exit Sub End If If swModel.GetType <> swDocDRAWING Then 'Falls es keine Zeichnung ist MsgBox "Bitte eine Zeichnung öffnen.", _ vbOKOnly + vbExclamation, "Keine Zeichnung" ClearObjects Exit Sub End If ' Set swView = swModel.ActiveDrawingView 'Aktive Zeichenansicht wählen swModel.ClearSelection2 True Set swView = swModel.GetCurrentSheet.GetViews()(0) 'Erste Zeichenansicht wählen (Konfiguration??) anchorType = swBOMConfigurationAnchor_BottomRight bomTypeMS = swBomType_Indented bomTypeTS = swBomType_PartsOnly configuration = "Standard" templateMS = "C:\Workspace\...\Tabellen\Stuecklisten\SW-Stueckliste\Montagestueckliste.sldbomtbt" templateTS = "C:\Workspace\...\Tabellen\Stuecklisten\SW-Stueckliste\Teilestueckliste.sldbomtbt" Set swBomAnn = swView.InsertBomTable2(False, -0.01, 0.5, anchorType, bomTypeMS, configuration, templateMS) 'Montagestückliste ' Set swBomFeat = swBomAnn.BomFeature ' MsgBox "Benutzte Konfiguration: " & swBomFeat.configuration Set swBomAnn = swView.InsertBomTable2(False, 1.85, 0.6, anchorType, bomTypeTS, configuration, templateTS) 'Teilestueckliste boolstatus = swModel.EditRebuild3() ' 'selektieren für umbenennen ' boolstatus = swModel.Extension.SelectByID2("Stückliste1", "BOMFEATURE", 0, 0, 0, False, 0, Nothing, 0) ' ' 'umbenennen ' boolstatus = swModel.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, "Montagestueckliste") ClearObjects End Sub Sub ClearObjects() Set swApp = Nothing Set swModel = Nothing Set swView = Nothing Set swBomAnn = Nothing Set swBomFeat = Nothing End Sub
P.S. Grund für die zwei verschiedenen Stücklisten ist, dass ich gerne eine Kombination aus "nur Teile" und "mit Einzug" hätte. D.h. Optimal wäre eine Stückliste mit Einzug in der die Anzahl der Teile *nicht* pro Baugruppe angegeben werden, sondern sozusagen mit der Anzahl der Baugruppe multipliziert werden. Gibt es dafür irgendwo eine Einstellungsmöglichkeit? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 03. Mai. 2013 07:24 <-- editieren / zitieren --> Unities abgeben: Nur für red5000
Hallo red, mit diesen 2 Befehlen könntest du dich schonmal von der ersten bis zur letzten Tabelle durch hangeln GetFirstTableAnnotation Method (IView)
Code: value = instance.GetFirstTableAnnotation()
GetNext Method (ITableAnnotation)
Code: value = instance.GetNext()
Und hiermiet bekommst du die verwendete Konfiguration zur Ansicht. ReferencedConfiguration Property (IView)
Code: value = instance.ReferencedConfiguration
Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
red5000 Mitglied
Beiträge: 47 Registriert: 23.08.2011 Solidworks 2012 x64 Windows 7 Xeon W3565 Quadro 4000 RAM 12 GB
|
erstellt am: 03. Mai. 2013 08:49 <-- editieren / zitieren --> Unities abgeben:
Hallo und danke Bernd, das hilft schon mal weiter. In der SolidWorks API Help hab ich auch gleich ein super Beispiel-Makro gefunden, aber... In diesem Programm wird an einer Stelle mit GetName auf den "Namen" der Tabelle zugegriffen: Code:
'...Sub ProcessTable _ (swApp As SldWorks.SldWorks, _ swModel As SldWorks.ModelDoc2, _ swTable As SldWorks.TableAnnotation) Dim swAnn As SldWorks.Annotation Dim nNumCol As Long Dim nNumRow As Long Dim sRowStr As String Dim i As Long Dim j As Long Set swAnn = swTable.GetAnnotation nNumCol = swTable.ColumnCount nNumRow = swTable.RowCount ' Show the name and type of table Debug.Print " " & swAnn.GetName & " <" & swTable.Type & ">" '....
Aber das ist nicht der Name wie er im Featuremanager steht. Dort heißt die Tabelle "Stückliste5" während das Makro "Detailelement445" (oder ähnlich) ausgibt. Weißt du wie ich den richtigen Namen rauskriegen oder besser ändern kann? Gruß red Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 03. Mai. 2013 10:53 <-- editieren / zitieren --> Unities abgeben: Nur für red5000
Hallo red, mhh keine Ahnung aber evtl. mußt du dir das Feature dazu im Featurebaum holen und kannst es da umbenennen. GetFeature Method (IBomFeature) und Name Property (IFeature). Das ist jetzt keine wissen sondern nur raten , vielleicht kommt ja noch einer der VBA-Profis vorbei. Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
red5000 Mitglied
Beiträge: 47 Registriert: 23.08.2011 Solidworks 2012 x64 Windows 7 Xeon W3565 Quadro 4000 RAM 12 GB
|
erstellt am: 04. Jun. 2013 12:51 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmal, ist schon lange her aber musste mich zwischenzeitlich um andere Sachen kümmern. Bei meinem Stücklisten-umbenenn-Problem bin ich aber nicht viel weiter. Einen Schritt habe ich aber gemacht: Ich kriege zb. mit swBomFeat.GetFeature.Name den alten (zu ändernden) Namen der Stückliste raus (zb. Stückliste23, 24 usw.) Ich kann auch die jeweiligen Stücklisten selektieren in dem ich den alten Namen benutze (mit swModel.Extension.SelectByID2) oder auch ohne den Namen zu wissen/herauszufinden (mit swBomFeat.GetFeature.Select2) Was aber immer noch nicht geht ist umbenennen. Durch Makro aufzeichnen habe ich folgendes erhalten: boolstatus = swModel.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, neunameTS) aber es funktioniert nicht.. Es kommt auch keine Fehlermeldung oder sonstwas. Ansonsten habe ich lange Zeit mit SetName Method (IAnnotation) rumprobiert ohne Erfolg. Code:
Option ExplicitDim boolstatus As Boolean Dim anchorType As Long Dim bomTypeMS As Long Dim bomTypeTS As Long Dim configuration As String Dim templateMS As String Dim templateTS As String 'Dim altnameMS As String 'Dim altnameTS As String Dim neunameMS As String Dim neunameTS As String Dim swApp As SldWorks.SldWorks 'Solidworks Dim swModel As SldWorks.ModelDoc2 'Dokument Dim swView As Object 'Zeichnungsansicht Dim swBomAnnMS As BomTableAnnotation 'Stückliste Dim swBomAnnTS As BomTableAnnotation 'Stückliste Dim swBomFeat As SldWorks.BomFeature 'Stücklistenfeature 'Dim swTable As SldWorks.TableAnnotation 'Dim swAnn As SldWorks.Annotation 'Dim swSelMgr As SldWorks.SelectionMgr 'Dim swFeat As SldWorks.Feature Sub BomInsert() Set swApp = Application.SldWorks 'swApp = Solidworks Set swModel = swApp.ActiveDoc 'swModel = aktives Dokument If swModel Is Nothing Then 'Falls kein Dokument geöffnet ist MsgBox "Bitte eine Zeichnung öffnen.", _ vbOKOnly + vbExclamation, "Keine Datei geöffnet" ClearObjects Exit Sub End If If swModel.GetType <> swDocDRAWING Then 'Falls es keine Zeichnung ist MsgBox "Bitte eine Zeichnung öffnen.", _ vbOKOnly + vbExclamation, "Keine Zeichnung" ClearObjects Exit Sub End If If swModel.ActiveDrawingView Is Nothing Then 'Falls keine Zeichnungsansicht gewählt ist MsgBox "Bitte eine Zeichenansicht für die Stücklisten wählen", _ vbOKOnly + vbExclamation, "Keine Zeichenansicht gewählt" ClearObjects Exit Sub End If Set swView = swModel.ActiveDrawingView 'Aktive/gewählte Zeichenansicht wählen anchorType = swBOMConfigurationAnchor_BottomRight 'Anker für Stückliste (Unten rechts) bomTypeMS = swBomType_Indented 'Mit Einzug für MS bomTypeTS = swBomType_PartsOnly 'Nur Teile für TS configuration = swView.ReferencedConfiguration 'Selbe Konfiguration wie die gewählte Zeichnungsansicht wählen templateMS = "C:\Workspace\LMH\Systemdaten\Tabellen\Stuecklisten\SW-Stueckliste\Montagestueckliste.sldbomtbt" 'Vorlage für MS templateTS = "C:\Workspace\LMH\Systemdaten\Tabellen\Stuecklisten\SW-Stueckliste\Teilestueckliste.sldbomtbt" 'Vorlage für TS neunameMS = "Montagestueckliste" neunameTS = "Teilestueckliste" Set swBomAnnMS = swView.InsertBomTable2(False, -0.01, 0, anchorType, bomTypeMS, configuration, templateMS) 'Montagestückliste einfügen Set swBomAnnTS = swView.InsertBomTable2(False, 1.85, 0, anchorType, bomTypeTS, configuration, templateTS) 'Teilestueckliste einfügen boolstatus = swModel.EditRebuild3() 'Neu aufbauen ' Set swSelMgr = swModel.SelectionManager ' Set swFeat = swSelMgr.GetSelectedObject6(1, -1) ' boolstatus = swFeat.SetName("test") Set swBomFeat = swBomAnnMS.BomFeature 'swBomFeat = Stücklistenfeature boolstatus = swBomFeat.GetFeature.Select2(False, 0) 'Stückliste selektieren boolstatus = swModel.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, neunameMS) 'rename Set swBomFeat = swBomAnnTS.BomFeature 'swBomFeat = Stücklistenfeature ' MsgBox swBomFeat.GetFeature.Name 'alten Namen der Teilestueckliste speichern boolstatus = swBomFeat.GetFeature.Select2(False, 0) 'Stückliste selektieren ' boolstatus = swModel.Extension.SelectByID2(altnameTS, "BOMFEATURE", 0, 0, 0, False, 0, Nothing, 0) 'select boolstatus = swModel.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, neunameTS) 'rename boolstatus = swModel.EditRebuild3() 'Neu aufbauen ClearObjects End Sub Sub ClearObjects() 'Objekte leeren Set swApp = Nothing Set swModel = Nothing Set swView = Nothing Set swBomAnnMS = Nothing Set swBomAnnTS = Nothing Set swBomFeat = Nothing End Sub
Kann mir jemand weiterhelfen? Viele Grüße red Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
red5000 Mitglied
Beiträge: 47 Registriert: 23.08.2011 Solidworks 2012 x64 Windows 7 Xeon W3565 Quadro 4000 RAM 12 GB
|
erstellt am: 04. Jun. 2013 15:45 <-- editieren / zitieren --> Unities abgeben:
habs doch hingekriegt, dabei hab ich die Antwort schon seit Stunden... dachte ich hätte es schon versucht Im Makro ist es auskommentiert und benutze es um den alten Namen rauszukriegen (MsgBox swBomFeat.GetFeature.Name). Andersherum kann ich den Namen natürlich einfach überschreiben: swBomFeat.GetFeature.Name = "test". Danke nochmal Bernd für die Hilfe. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|