| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Social Business Analyst liefert die Antworten auf Ihre wichtigsten geschäftlichen Fragen - natürlich in Echtzeit! |
Autor
|
Thema: Makro - Stücklistenzeilen auslesen (2103 / mal gelesen)
|
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 21. Sep. 2017 15:29 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Gemeinde, jetzt bin ich interessiert an der Makro Programmierung für SW. Ich habe mich durch diverse Formen gelesen und gemerkt das viele vor dem gleichen Problem stehen -> http://ww3.cad.de/foren/ubb/Forum2/HTML/010932.shtml Es geht darum die Positionsnummer die von der Solidworks generierte Stückliste erstellt wird (ohne Umweg über die Erweiterung der Benutzerdefinierten Eigenschaft um die Pos.nr.) auszulesen und weiter zuverarbeiten (als nützliche Nebeninformation mit auf das Blatt bsp. im Textfeld mit auszugeben). Ich habe ein Stück Code gefunden, dass verspricht einzelnene Zellen der Stückliste auszulesen: Code: 'Demonstrates how to get the data from the cells of a BOM table. 'Preconditions: Drawing is open. 'Results: See immediate window. 'Written by Keith Rice 'CADSharp LLC 'www.cadsharp.com Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim swTable As SldWorks.TableAnnotation Dim swBomTable As SldWorks.TableAnnotation Dim vTables As Variant Dim i As Integer Dim intRow As Integer, intCol As Integer Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swDraw = swModel Set swView = swDraw.GetFirstView vTables = swView.GetTableAnnotations For i = 0 To UBound(vTables) Set swTable = vTables(i) If swTable.Type = swTableAnnotationType_e.swTableAnnotation_BillOfMaterials Then Exit For Next i For intCol = 0 To swTable.ColumnCount - 1 For intRow = 0 To swTable.RowCount - 1 Debug.Print swTable.Text(intRow, intCol) Next intRow Next intCol End Sub
Wie zu erwarten war funktioniert es nicht auf anhieb und ich erhalte einen Fehler in der Fett gedruckten Zeile... es geht darum das uBund Typenunverträglich ist. Jetzt meine eigentliche Frage (als offensichtlicher Anfänger) lohnt es sich hier überhaupt anzusetzen und kann mit dem Kern des Codes mein Wunsch erfüllt werden wenn dieses Makro kurz vor Ende der Zeichnungserstellung zu aktivieren, dass man auf allen Blättern die Positionsnummer der Solidworks generierten Stückliste für die dargestellten Bauteile (zb. durch vergleich des Pfades und des Dokumentennamens aus der Stückliste mit der Ansicht) irgendwo auf dem jeweiligen Blatt darstellen lässt? Beste Grüße Michael
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 22. Sep. 2017 07:25 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo Michael, also bei mir funktioniert der Code, mit einer Zeichnungsableitung von einer Baugruppe und eigefügter Stückliste Er funktioniert nur nicht, wenn keine Tabelle gefunden wird. (dann kommt der Fehler "Typen unverträglich") Übrigens Du solltest vor "For intCol = 0 To swTable.ColumnCount - 1" nochmals prüfen ob Du eine Stückliste gefunden hast, sonst wird in der "For intCol = 0 To swTable.ColumnCount - 1" Schleife auch jede andere Tabelle abgearbeitet könnte ja auch sein, dass Du auch noch andere Tabellen auf der Zeichnung hast ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 22. Sep. 2017 08:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, danke für dein Feedback. Ja du hast Recht das Makro funktioniert wenn die Tabelle sich auf dem aktiven Blatt befindet. Wie kann ich denn die Tabelle als Array zwischenspeichern und so mit den werten weiterarbeiten kann? Ich stelle mir momentan diese schleifen vor Code:
such die tabelle -> mit abfrage ob tabelle da ist lies sie in ein array aus ermittel die Blatt anzahl for i ... 'jedes Blatt durchgehen while j 'jede Zeile der Tabelle durchgehen if "Stücklistenname aus Ansicht" == "Stücklistenname aus array" then nehme Posnr aus array (0,j) und setze sie auf das entsprechende sheet Else "nicht auf Stückliste" ausgeben Endif wend
wäre der Ansatz richtig oder habe ich einen wichtigen (Schleifen-)Punkt übersehen? Grüße Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 25. Sep. 2017 10:29 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo Michael, m.M. nach müsste es in etwa so aussehen Variant für Zeilen initialisieren for i jedes Blatt wenn Stückliste auf Blatt vorhanden for j jedes Zeile der Stückliste wenn zeile(j) noch nicht im Variant enthalten ist Variant um zeile(j) erweitern ende wenn zeile(j) noch nicht im Variant enthalten ist next j ende wenn Stückliste auf Blatt vorhanden next i Schleife für alle Werte in Variant Werte vom Variant ausgeben Schleifenende PS wegen Wie kann ich denn die Tabelle als Array zwischenspeichern und so mit den werten weiterarbeiten kann? dazu solltest Dich mal mit Dim, ReDim und ReDim Preserve vertraut machen ------------------ Grüße Heinz
[Diese Nachricht wurde von nahe am 25. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 26. Sep. 2017 10:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, danke für den Hinweis - die Stückliste als Array auszulesen funktioniert; auch die Positionierung auf dem jeweiligen Blatt - jedoch bekomme ich den "alten" Bezugshinweis nicht gelöscht. Auch wenn ich ein neues Makro aufnehmen und es dann ausführe erhalte ich die Fehlermeldung "keines der ausgewählten Elemente konnte gelöscht werden" Code: Dim swApp As ObjectDim Part As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Sub main() Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc boolstatus = Part.Extension.SelectByID2("Blatt2", "SHEET", 0.386724172947239, 3.59903913530905E-02, 0, False, 0, Nothing, 0) boolstatus = Part.Extension.SketchBoxSelect("0.386724", "0.035990", "0.000000", "0.317097", "0.073298", "0.000000") Part.EditDelete End Sub
wenn ich den Bezugshinweis selber auswähle und dann das aufgenommene Makro abspiele wird es gelöscht. Logische konsequenz: meine Auswahl scheint nicht zu funktionieren. Kann mir jemand dabei helfen? Danke Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 26. Sep. 2017 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo Michael, was verstehst Du unter Bezugshinweis? Meinst Du damit ein Annotation Objekt? Wenn ja, dann kannst Du dem beim Erstellen mit "SetName" einen Namen zuordnen über den Du es dann später wieder suchen kannst. Mit SketchBoxSelect wird das wohl nicht funktionieren, weil sich die Bezugshinweise ja wahrscheinlich immer wo anders befinden.
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 26. Sep. 2017 14:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, es handelt sich im VBA code um eine Notiz - wie kann ich der denn einen Namen zuweisen? Code: value = instance.InsertNote(Text)
Dazu kommt, dass ich ja beim ersten durchlauf bei null anfange und wenn keine Notiz da ist - ich mir durch löschen des Textes über den Namen doch einen Fehler generiere? Der Bezugshinweis befindet sich zwar pro unterschiedlicher Blattgröße in einem anderen Bereich - würde sich jedoch über die gleiche Verzweigung anpassen lassen. Trotzdem versteh ich nicht, warum durch dieses SketchBoxSelect keine adäquate Löschmöglichkeit entsteht. Grüße Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 27. Sep. 2017 07:04 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo Michael, sollte lt. Online-Hilfe (lt. Deiner Code-Zeile) so funktionieren value = instance.InsertNote(Text) ok = value.setname("Name") wenn ich es richtig verstehe, muss der Name aber eindeutig sein darum ist es auch wichtig den Rückgabewert auf "true" zu prüfen, denn nur wenn der true ist, konnte der Name vergeben werden
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |