| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
|
Autor
|
Thema: SW2008 Virtualle Komponenten per API abfragen (1214 mal gelesen)
|
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 17. Nov. 2010 14:35 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ich steh grad ein wenig auf dem Schlauch... Ich möchte in einer Baugruppe, die externen Teilen auch Virtuelle, intern gespeicherte Teile enthält, diese virtuellen Teile per Makro umbenennen. Irgendwie bekomm ich aber noch nicht mal eine Abfrage hin, ob ein gewähltes Teil ein virtuelles Teil ist hin... Dazu wollte ich eigentlich alle Komponenten einer Baugruppe der Reihe nach Abfragen: ub Main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swAssy As SldWorks.AssemblyDoc Dim swComp As SldWorks.Component2 Dim virtstat As Boolean Set swApp = Application.SldWorks Set swModel = swApp.GetFirstDocument
Do While Not swModel Is Nothing
Set swAssy = swModel Set swComp = swAssy.GetComponents(True) virtstat = swComp.IsVirtual If virtstat Then MsgBox ("JA") Else MsgBox ("Nein") End If Set swModel = swModel.GetNext Loop End Sub Was mach ich falsch? ich mein es wird schon gemeckert, dass swAssy und swModel nicht verträglich sind... wie gesagt ich steh etwas auf dem Schlauch und hab jetz auch nicht soooo den Einblick und die Erfahrung in sachen SW API Gruß Alex Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
    
 Beiträge: 1764 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: 17. Nov. 2010 15:36 <-- editieren / zitieren --> Unities abgeben:          Nur für oeNkraD
Hallo Alex also so wie ich das sehe bekommst Du mit "Set swComp = swAssy.GetComponents" nur eine Liste der Komponenten und mit "virtstat = swComp.IsVirtual" würdest Du eigentlich prüfen ob die Liste virtuell ist, was natürlich unsinnig ist. Die müsstest die Liste durchlaufen und für jeden Eintrag der Liste prüfen ob das Teil virtuel ist oder nicht. so in der Art von For Each x In SwComp virtstat = x.IsVirtual next wie gesagt, ist nur eine Vermutung von mir, ich hab das nciht getestet ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 18. Nov. 2010 09:41 <-- editieren / zitieren --> Unities abgeben:         
hmm... aber mit swModel = swApp.GetFirstdocument und der anschließenden Do-While Schleife frag ich doch schon Dokument für dokument ab... Die isVirtual funktion benötig für eine Abfrage ein component2 objekt... wie kann ich aus dem swModel - doc eine component2 herauslesen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
    
 Beiträge: 1764 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: 18. Nov. 2010 10:19 <-- editieren / zitieren --> Unities abgeben:          Nur für oeNkraD
Hallo ich bin mal davon ausgegangen, dass die Dokumente die Du durchlaufen willst alle Baugruppen sind, da "GetComponents" eine Methode von "AssemblyDoc" ist. (zwar nicht nur, aber in diesem Fall wohl die einzig vernünftige Anwendung) Die Komponenten hast Du ja in der Liste gespeichert die swAssy.GetComponents(True) zurückgibt. Diese Liste musst Du nochmals wie oben geschrieben durchlaufen. Mit "GetFirstDocument" bekommst Du nur das erste in SWX geöffnete Dokument das hat nichts mit den Komponenten in der Baugruppe zu tun. siehe dazu auch die Online-Hilfe in SWX Gets the document opened first in this SolidWorks session. So wie Du das zur Zeit hast, werden alle in SWX geöffneten Dokumente durchsucht (egal ob Baugruppe, Bauteil, Zeichnung,...). Meiner Meinung solltest Du noch eine Prüfung einbauen ob das aktuelle Dokument das Du gerade durchsuchst auch eine Baugruppe ist und wenn nicht gleich zum nächsten Dokument springen. Ich hab mich mit virtuellen Komponenten noch nicht wirklich befasst, nehme aber an, dass Dein Programm auch nur Sinn macht wenn Du Baugruppen-Dateien nach virtuell Komponeten durchforstest.
PS Die API-Hilfe von SWX enthält sehr viele Beispiele und ich nehm immer wieder Code-Schnipsel von den Beispielen für meine Spinnereien. Das solltest Du Dir mal genauer ansehen.
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 30. Nov. 2010 07:58 <-- editieren / zitieren --> Unities abgeben:         
Hallo, hab nun das ganze endlich mal modifizieren können, bin aber nicht wirklich schlauer...: Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2 Dim swAssy As SldWorks.AssemblyDoc Dim swComp As SldWorks.Component2 Dim swCompArr As Variant Dim virtstat As Boolean Set swApp = Application.SldWorks Set swModel = swApp.GetFirstDocument If swModel.GetType() = swDocAssemly Then Set swCompArr = swAssy.GetComponents(True) For Each swComp In swCompArr virtstat = swComp.IsVirtual If virtstat Then MsgBox ("JA") Else MsgBox ("Nein") End If Next End If Nun wird mir bei "Set swCompArr = swAssy.GetComponents(True)" der Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt." ausgegeben. Hat wer eine idee? Ich steh immer noch auf dem Schlauch  Verschneite Grüße! Alex [Diese Nachricht wurde von oeNkraD am 30. Nov. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
    
 Beiträge: 1764 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. Nov. 2010 09:58 <-- editieren / zitieren --> Unities abgeben:          Nur für oeNkraD
Hallo Alex ist doch klar, weil swAssy ja noch nicht zugewiesen wurde nach "If swModel.GetType() = swDocAssemly Then" müsstest Du "swAssy" noch mit "set swAssy = swModel" swAssy einen Wert zuweisen
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 30. Nov. 2010 10:27 <-- editieren / zitieren --> Unities abgeben:         
Hallo nochmal  das ist wiedermal die Geschichte mit dem Wald und den Bäumen *g* Nun hab ich allerdings das problem, dass die Typen unverträglich sind... was ich nun mal so gar nicht verstehe...
"Set swCompArr = swAssy.GetComponents(True)" swCompArr ist doch ein Variant, und GetComponents soll doch ein Variant liefern, warum mögen die sich dann nicht?  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
    
 Beiträge: 1764 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. Nov. 2010 11:44 <-- editieren / zitieren --> Unities abgeben:          Nur für oeNkraD
Hallo nochmals wird wahrscheinlich Zeit, dass Du Dir mal die API Hilfe ansiehst dort steht "vComponents = swAssem.GetComponents(True)" und nicht "Set vComponents = swAssem.GetComponents(True)" ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 30. Nov. 2010 12:08 <-- editieren / zitieren --> Unities abgeben:         
Hallo wiederum, also nun hab ichs hinbekommen, allerdings lags dran, dass die For Each Schleife nicht so richtig funktioniert... ich mach nun einen vorhergehenden GetcomponentsCount und anschließend eine Do While Schleife. Vielen Dank für die Hilfe, und die API Hilfe kenn ich schon... nur ist das seeeeehr Umfangreich für nen Quereinsteiger und Autodidakten - kommt Zeit kommt Rat  Gruß Alex
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |