Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Makro - Stücklistenzeilen auslesen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von remtc an!   Senden Sie eine Private Message an remtc  Schreiben Sie einen Gästebucheintrag für remtc

Beiträge: 34
Registriert: 18.09.2017

Solidworks Prof. 2023SP3 x64 auf Win 10

erstellt am: 21. Sep. 2017 15:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von nahe an!   Senden Sie eine Private Message an nahe  Schreiben Sie einen Gästebucheintrag für nahe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für remtc 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von remtc an!   Senden Sie eine Private Message an remtc  Schreiben Sie einen Gästebucheintrag für remtc

Beiträge: 34
Registriert: 18.09.2017

Solidworks Prof. 2023SP3 x64 auf Win 10

erstellt am: 22. Sep. 2017 08:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von nahe an!   Senden Sie eine Private Message an nahe  Schreiben Sie einen Gästebucheintrag für nahe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für remtc 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von remtc an!   Senden Sie eine Private Message an remtc  Schreiben Sie einen Gästebucheintrag für remtc

Beiträge: 34
Registriert: 18.09.2017

Solidworks Prof. 2023SP3 x64 auf Win 10

erstellt am: 26. Sep. 2017 10:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 Object

Dim 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



Sehen Sie sich das Profil von nahe an!   Senden Sie eine Private Message an nahe  Schreiben Sie einen Gästebucheintrag für nahe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für remtc 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von remtc an!   Senden Sie eine Private Message an remtc  Schreiben Sie einen Gästebucheintrag für remtc

Beiträge: 34
Registriert: 18.09.2017

Solidworks Prof. 2023SP3 x64 auf Win 10

erstellt am: 26. Sep. 2017 14:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von nahe an!   Senden Sie eine Private Message an nahe  Schreiben Sie einen Gästebucheintrag für nahe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für remtc 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz