| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Dokumentenmanagement leicht gemacht mit 3DEXPERIENCE SOLIDWORKS |
Autor
|
Thema: API - unterschiedliche Rückgabewerte mit swSheet.GetViews (1611 mal gelesen)
|
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 24. Mai. 2018 14:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, ausgehend von einer Zeichnung, gehe ich mit einer Schleife durch alle Blätter. In einer Unterroutine frage ich die jeweiligen Ansichten darauf ab. Der Code der Routine ist dieser: Code:
Function GetPropertiesView(swSheet As SldWorks.Sheet) As SldWorks.View Dim vViews As Variant Dim swView As SldWorks.View Dim i As Integer vViews = swSheet.GetViews() If Not IsEmpty(vViews) Then For i = 0 To UBound(vViews) Set swView = vViews(i) If UCase(swView.Name) = UCase(swSheet.CustomPropertyView) Then Set GetPropertiesView = swView Exit Function End If Next i Set GetPropertiesView = vViews(0) 'ansonsten ist es die erste Ansicht End If End Function
Die Schleife For i = 0 To UBound(vViews) liefert mir allerdings unterschiedliche Ergebnisse, je nachdem, ob das jeweilige Blatt das aktive ist, oder eben nicht. Ist es nicht das aktive Blatt, liefert sie alle Ansichten, welche auf dem Blatt vorhanden sind. Ist es das aktive Blatt, liefert sie auch diejenigen Ansichten, welche im angehängten Bild zu sehen sind, obwohl die nicht auf dem Blatt sind. Also Ansichten mit dem Namen "Vorderseite" etc. Das fatale dabei ist, befindet sich gar keine Ansicht auf dem Blatt, sollte auch keine gemeldet werden, es kommen aber diese Pseudoansichten. Weiß jemand, wie ich diese Pseudoansichten ignorieren kann, bzw. wie lautet die Abfrage nur der tatsächlichen Ansichten auf dem Blatt? Ich habe schon rumgebastelt mit diesem Code:
Code:
Set swView = swDraw.GetFirstView Set swView = swView.GetNextView Set GetPropertiesView = swView
Aber damit kann ich immer nur das aktive Blatt abfragen. Weiß jemand, wie man hier jedes beliebige Blatt ansprechen kann? Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Torsten Niemeier Ehrenmitglied V.I.P. h.c. Maschinenbau Ingenieur
Beiträge: 3682 Registriert: 21.06.2001 "ZUSE I.36", 8 BIT, 32 Lämpchen, Service-Ölkännchen "ESSO-Super", Software: AO auf Kuhlmann-Parallelogramm-Plattform ** CSWP 04/2011 ** ** CSWE 08/2011 **
|
erstellt am: 24. Mai. 2018 16:44 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
|
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 24. Mai. 2018 18:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Torsten, danke für deine Rückmeldung. Also, diese Variante kannte ich noch nicht. Sie gibt jedenfalls keine Pseudoansichten wieder. Egal welches Blatt aktiv ist. Als Ergebnis bekomme ich z.B. dieses hier. Blatt1 Zeichenansicht1 Blatt2 Auf Blatt2 ist keine Ansicht platziert. Allerdings bin ich mir noch nicht so sicher, ob mir das hier weiterhilft. Da muss ich mal drüber Nachdenken. In diesem Fall müsste ich die jeweiligen echten Ansichten von den jeweiligen Blättern rausfiltern. Die undefinierte Reihenfolge der Blätter in diesem Array ist da sicherlich nicht hilfreich. Wie ich oben schon schrieb, gehe ich Blatt für Blatt durch und schaue nach evtl. enthaltenen Ansichten. Diese verwende ich zur Aktualisierung von evtl. vorhandenen Stücklisten. Nun muss ich alle möglichen Varianten berücksichtigen. Jedes Blatt kann Ansichten und / oder Stücklisten haben oder auch nicht. Und ich frage auch noch folgende Einstellung in den Optionen der Blätter ab. "Verwende benutzerdefinierte Eigenschaftswerte von Modell in:" Alles sehr komplex, aber nochmal Danke für diese Anregung. Evtl. fällt ja noch jemand was anderes ein. Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
Beiträge: 1358 Registriert: 24.07.2002 AutoCAD ACA 2019 Solidworks 2021 Sp5.1 Enterprise PDM 2021 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell T3620 Intel Core i7-7700K 16 GB Arbeitsspeicher 2x Dell Ultrasharp U2415 Dell M4800
|
erstellt am: 24. Mai. 2018 21:14 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hi Andi, Du bekommst doch aus dem Beispiel von Thorsten 2 Arrays wieder zurück: ss enthält die Blätter und darunter sind die Views aufgelistet. vv enthält die Views für das jeweilige Blatt. Schau dir das mal im Debugger an, da kann man das gut sehen. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 24. Mai. 2018 22:23 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Carsten1210:
vv enthält die Views für das jeweilige Blatt.
Hallo Carsten, schon klar, habe ich mir genau angeschaut im Debugger. Aber die erste View von vv ist immer der Blattname und erst ab der 2ten View werden tatsächliche Ansichten aufgezählt. Das Verhalten ist hier ähnlich wie bei der Abfrage mit GetFirstView und GetNextView. Und da die Reihenfolge der Blätter unbestimmt sind, muss ich die erst noch Identifizieren. Das meinte ich auch mit rausfiltern. Wahrscheinlich ist das wirklich nicht so schwierig, ich muss halt einiges Umbauen. Grüße und Danke für deine Bemerkungen, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
Beiträge: 1358 Registriert: 24.07.2002 AutoCAD ACA 2019 Solidworks 2021 Sp5.1 Enterprise PDM 2021 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell T3620 Intel Core i7-7700K 16 GB Arbeitsspeicher 2x Dell Ultrasharp U2415 Dell M4800
|
erstellt am: 25. Mai. 2018 06:17 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hi Andi, Was meinst du mit der unbestimmten Reihenfolge?! In dem Array werden die doch in der Reihenfolge aufgelistet wie diese in der Zeichnung sind, oder nicht?! Oder meinst du das deine eigene Reihenfolge abweichend dazu ist?! Gruß, Carsten 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: 25. Mai. 2018 07:12 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hallo Jörg Andi, könntest du in der Weiterverarbeitung mit dem View Arry über die View Eigenschaft Type nicht rausfiltern bei welchen es sich um die Blätter handelt? Evtl. kannst du das Arry auch in ein neues Arry überführen ohne eben die Blätter. Gruß Bernd
------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht ---
Staatlich anerkannte Deutschniete [Diese Nachricht wurde von bk.sc am 25. Mai. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 25. Mai. 2018 07:16 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Carsten1210:
Was meinst du mit der unbestimmten Reihenfolge?!
Hallo Carsten, in der Beschreibung in der API Hilfe steht folgender Satz. Zitat: "If there are multiple sheets in the drawing document, then the order in which the sheets are returned is undetermined. So, the active sheet and its views might not be returned in the first array."
Googleübersetzung:
Zitat: "Wenn sich im Zeichnungsdokument mehrere Blätter befinden, ist die Reihenfolge, in der die Blätter zurückgegeben werden, unbestimmt. Daher werden das aktive Blatt und seine Ansichten möglicherweise nicht im ersten Array zurückgegeben."
Das ist es, was ich gemeint habe. Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Torsten Niemeier Ehrenmitglied V.I.P. h.c. Maschinenbau Ingenieur
Beiträge: 3682 Registriert: 21.06.2001 "ZUSE I.36", 8 BIT, 32 Lämpchen, Service-Ölkännchen "ESSO-Super", Software: AO auf Kuhlmann-Parallelogramm-Plattform ** CSWP 04/2011 ** ** CSWE 08/2011 **
|
erstellt am: 25. Mai. 2018 07:23 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
|
Carsten1210 Mitglied staatl. geprüfter Holztechniker
Beiträge: 1358 Registriert: 24.07.2002 AutoCAD ACA 2019 Solidworks 2021 Sp5.1 Enterprise PDM 2021 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell T3620 Intel Core i7-7700K 16 GB Arbeitsspeicher 2x Dell Ultrasharp U2415 Dell M4800
|
erstellt am: 25. Mai. 2018 08:50 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
|
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: 25. Mai. 2018 09:49 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Zitat: Welcher Jörg?
ohh da war mein Kopf wohl noch in einem anderen Thread ------------------ --- 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 |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 29. Mai. 2018 03:49 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Andi Beck:
Wahrscheinlich ist das wirklich nicht so schwierig, ich muss halt einiges Umbauen.
Hallo, wollte noch ne Rückmeldung geben, mit dem, was ich gemacht habe. Ich habe jetzt einen verschachtelten Code hinbekommen, der funktioniert, sieht gut aus. Die Routine, welche ich als Basis meines Makros von hier verwendet habe, ist also Fehleranfällig. https://www.codestack.net/solidworks-api/document/drawing/bom-tables-update-referenced-configuration/ Hier der Code, falls sich jemand dafür Interessiert: Code:
Dim swApp As SldWorks.SldWorks Dim swDraw As SldWorks.DrawingDocSub main() Dim swModel As SldWorks.ModelDoc2 Dim vSheetNames As Variant Dim swSheet As SldWorks.Sheet Dim swView As SldWorks.View Dim i As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc 'dann war gar kein Dokument geöffnet, wie soll da was funktionieren If swModel Is Nothing Then Call MsgBox("Kein Dokument geöffnet!", vbSystemModal, "Information") End End If 'nur wenn eine Zeichnung aktiv ist, geht es weiter If (swModel.GetType <> swDocDRAWING) Then Call MsgBox("Nur für Zeichnungen geeignet!", vbSystemModal, "Information") End End If Set swDraw = swApp.ActiveDoc vSheetNames = swDraw.GetSheetNames 'Namen aller Zeichenblätter For i = 0 To UBound(vSheetNames) 'alle Zeichenblätter durchgehen Set swSheet = swDraw.Sheet(vSheetNames(i)) 'der Name des entsprechenden Zeichenblattes Set swView = GetPropertiesView(swSheet) 'gehe zur Function "GetPropertiesView", welche Ansicht verwendet werden soll If Not swView Is Nothing And Not swView.Type = 1 Then 'wenn eine Ansicht vorhanden ist, dann, ansonsten 'Call MsgBox("Auf dem Blatt -" & swSheet.GetName & "- gilt die " & swView.Name & vbCrLf & "mit der Konfiguration " & swView.ReferencedConfiguration, vbSystemModal, "Information") Else Call MsgBox("keine Ansicht auf dem Blatt -" & swSheet.GetName & "- vorhanden", vbSystemModal, "Information") End If Next i End Sub Function GetPropertiesView(swSheet As SldWorks.Sheet) As SldWorks.View 'welche Ansicht auf diesem Blatt verwendet werden soll Dim sheetCount As Long Dim sheetCount2 As Long Dim viewCount As Long Dim viewCount2 As Long Dim ss As Variant Dim vv As Variant ss = swDraw.GetViews 'alle Blätter und Ansichten der Zeichnung in ein Doppel-Array übergeben 'erster Schritt: wenn auf diesem Blatt eine spezielle Ansicht ausgewählt ist, dann diese verwenden If Not swSheet.CustomPropertyView = "Standard" Then 'wenn bei "Verwende benutzerdefinierte Eigenschaftswerte von Modell in:" etwas individuelles eingestellt ist, dann For sheetCount = LBound(ss) To UBound(ss) 'durch alle Blätter gehen vv = ss(sheetCount) For viewCount = LBound(vv) To UBound(vv) 'durch alle Ansichten gehen (Blätter sind auch Ansichten) If UCase(vv(viewCount).GetName2()) = UCase(swSheet.CustomPropertyView) Then 'Vergleich mit der Einstellung "Verwende benutzerdefinierte Eigenschaftswerte von Modell in:" Set GetPropertiesView = vv(viewCount) 'die benutzerdefinierte Ansicht wird gesetzt Exit Function End If Next viewCount Next sheetCount End If 'zweiter Schritt: ansonsten die erste Ansicht auf diesem Blatt verwenden For sheetCount = LBound(ss) To UBound(ss) 'durch alle Blätter gehen vv = ss(sheetCount) For viewCount = LBound(vv) To UBound(vv) 'durch alle Ansichten gehen (Blätter sind auch Ansichten) If vv(viewCount).GetName2() = swSheet.GetName Then 'Vergleich mit dem Blattnamen On Error Resume Next 'bei einem Überlauf des Arrays, Fehler abfangen >> "vv(viewCount + 1)", = keine Ansicht auf dem Blatt vorhanden Set GetPropertiesView = vv(viewCount + 1) 'die Ansicht wird gesetzt 'dritter Schritt: ansonsten die erste Ansicht in dieser Zeichnung verwenden (von allen Blättern) If Err <> 0 Then 'wenn ein Überlauf stattgefunden hat, Meldung machen 'Call MsgBox("Auf dem Blatt -" & swSheet.GetName & "- befindet sich keine Ansicht", vbSystemModal, "Information") For sheetCount2 = LBound(ss) To UBound(ss) 'durch alle Blätter gehen vv = ss(sheetCount2) For viewCount2 = LBound(vv) To UBound(vv) 'durch alle Ansichten gehen (Blätter sind auch Ansichten) Set GetPropertiesView = vv(viewCount2) 'die Ansicht wird gesetzt If GetPropertiesView.Type = 4 Or GetPropertiesView.Type = 7 Then 'wenn es eine normale Ansicht ist, dann Routine verlassen Exit Function End If Next viewCount2 Next sheetCount2 End If Exit Function End If Next viewCount Next sheetCount End Function
Die Problembeschreibung aus meinem Anfangspost ist allerdings nicht geklärt. In meinen Augen scheint das ein Bug in der API zu sein. Danke nochmals an alle, für die Anregungen. Grüße, bis demnächst, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) 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: 30. Mai. 2018 08:32 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hallo Andi, ich mach das bei mir so, dass ich die Blätter durchlaufe (aktiviere) und dann mit getfirstview und getnextview die Ansichten durchlaufe Du solltest halt vorher das aktive Blatt speichern, damit Du nach den Schleifen, dieses Blatt wieder aktivieren kannst ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 30. Mai. 2018 18:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, danke für deine Antwort. Ja, das ist mir schon klar, aber genau das wollte ich nicht, um einen unnötigen Aufbau der einzelnen Seiten zu vermeiden. Je nach Größe der Ansichten kann das ganz schön dauern. Ich brauche ja nur die Namen der Ansichten und ihre Referenzen um Stücklisten zu aktualisieren (nach Konfigwechsel z.B.). Mein gewählter Weg bekommt das auch ohne Blattwechsel hin. Grüße und schönes WE noch, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 30. Mai. 2018 18:46 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|