| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Technische Kommunikation mit der 3DEXPERIENCE Plattform |
Autor
|
Thema: API CloseDoc-Befehl (2694 mal gelesen)
|
3df002 Mitglied
Beiträge: 6 Registriert: 11.07.2011 Umgebung: SW2011 und S2012
|
erstellt am: 15. Jan. 2013 15:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, ich habe eine Frage zum CloseDoc-Befehl. Meine Annahme. Wenn ich ein Dokument mit dem CloseDoc-Befehl schliesse, wird das letzte aktive Dokument angezeigt. Bei folgender Vorgehensweise ist dies allerdings nicht so: Baugruppe 1 manuell öffnen. Zeichnung 1 manuell öffnen. Manuell auf die Baugruppe umschalten. Jetzt das Bauteil Teil 2 manuell öffnen. Manuell auf die Baugruppe umschalten. Manuell das Teil 2 in die Baugruppe einfügen. Wenn ich jetzt das Teil 2 über die Api schliesse, wird die Zeichnung aktiviert, nicht wie ich es gerne hätte (und auch erwartet hätte) die Baugruppe! Hat jemand eine Idee bzw. ein Hinweis für mich, warum das so ist und wie ich ich das umgehen könnte. Wichtiger Hinweis: Bei den Originaldaten dauert das erneute Umschalten von der Zeichnung auf die Baugruppe zu lange, deswegen kommt der Workaround mit ActivateDoc2(Baugruppe 1) nach dem schliessen des Bauteils nicht in Frage. Angefügt die Testteile und hier die Code-Zeile, die ich zum Schliessen verwende. object _o = Marshal.GetActiveObject(ProgID_VersionIndependent); SldWorks _tmpSW = null; // Object pruefen if (_o != null) { // Auf SldWorks casten _tmpSW = (SldWorks)_o; string docName = @"C:\temp\Testdaten_ulr\Teil2.SLDPRT"; _tmpSW.CloseDoc(docName); }
Besten Dank für Eure Hinweise. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 15. Jan. 2013 15:36 <-- editieren / zitieren --> Unities abgeben: Nur für 3df002
Hallo 3df002, Zitat: Original erstellt von 3df002: Wichtiger Hinweis: Bei den Originaldaten dauert das erneute Umschalten von der Zeichnung auf die Baugruppe zu lange, deswegen kommt der Workaround mit ActivateDoc2(Baugruppe 1) nach dem schliessen des Bauteils nicht in Frage.
Wenn ich dich richtig verstehe willst du, dass ein ganz bestimmtes deiner offenen Dokumenten angezeigt wird, wenn du dein Teil schließt? Warum aktivierst du nicht vorher deine Baugruppe und schließt dann erst das anzeigende Fenster des Teils? Das sollte funktionieren. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
3df002 Mitglied
Beiträge: 6 Registriert: 11.07.2011 Umgebung: SW2011 und S2012
|
erstellt am: 15. Jan. 2013 15:52 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, besten Dank für Deine super schnelle Reaktion. Das mit dem Aktivieren (sofern ich es korrekt gemacht habe) der Baugruppe im Vorfeld funktioniert bei mir leider nicht. Meinen Code habe ich entsprechend erweitert und trotzdem den gleichen Effekt. Den ActivateDoc3 (Sw2012) Befehl kann ich leider nicht ausprobieren, da dieser mir bei der Endversion nicht zur Verfügung stehen wird. string docName = @"C:\temp\Testdaten_ulr\Teil2.SLDPRT"; //_SldWorks.QuitDoc(docName); int intError = 0; ModelDoc2 _ModelDoc2 = (ModelDoc2)_SldWorks.ActivateDoc2(@"C:\temp\Testdaten_ulr\Baugruppe1.SLDASM", true, ref intError); if (_ModelDoc2 != null) { string open = _ModelDoc2.GetPathName(); } _SldWorks.CloseDoc(docName);
Gruß 3df002 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ad_man Mitglied freiberuflicher Entwicklungsing. (Fahrzeugtechnik, CSWP, CPPA))
Beiträge: 1366 Registriert: 20.12.2003
|
erstellt am: 15. Jan. 2013 16:57 <-- editieren / zitieren --> Unities abgeben: Nur für 3df002
Hallo 3df002, Zitat: Original erstellt von 3df002:
Den ActivateDoc3 (Sw2012) Befehl kann ich leider nicht ausprobieren, da dieser mir bei der Endversion nicht zur Verfügung stehen wird.
Dann nimm doch ActivateDoc bzw. ActivateDoc2... Die alten Befehle funktionieren meistens auch in den neueren Versionen. ------------------ ========== Gruß Andreas ========== Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
3df002 Mitglied
Beiträge: 6 Registriert: 11.07.2011 Umgebung: SW2011 und S2012
|
erstellt am: 15. Jan. 2013 17:00 <-- editieren / zitieren --> Unities abgeben:
|
ad_man Mitglied freiberuflicher Entwicklungsing. (Fahrzeugtechnik, CSWP, CPPA))
Beiträge: 1366 Registriert: 20.12.2003
|
erstellt am: 15. Jan. 2013 17:03 <-- editieren / zitieren --> Unities abgeben: Nur für 3df002
Und wie sieht es mit dem ganz alten Befehl ActivateDoc aus? Leider kenne ich mich mit C-Programmierung nicht aus, ich verwende meistens VBA... ------------------ ========== Gruß Andreas ========== Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
3df002 Mitglied
Beiträge: 6 Registriert: 11.07.2011 Umgebung: SW2011 und S2012
|
erstellt am: 15. Jan. 2013 18:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, den alten Befehl habe ich gerade auch ausprobiert. Leider wieder negativ. Trotzdem, danke. Ich habe heute auch den ganzen Tag in der API gestöbert, aber keine Idee mehr für ein Workaround erhalten. Gruß 3df002 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 16. Jan. 2013 08:25 <-- editieren / zitieren --> Unities abgeben: Nur für 3df002
Hallo 3df002, bei mir klappt das konsistent, wenn ich vorher das ModelDoc aktiviere, dass ich anschließend aktiv haben möchte, dann das ModelDoc, dass geschlossen werden soll und dann dieses schließe. In VBA (was ich nutze) sieht das so aus:
Code: Dim swApp As SldWorks.SldWorks Dim ModelDoc As SldWorks.ModelDoc2Sub main() Set swApp = Application.SldWorks Set ModelDoc = swApp.ActiveDoc ' jetzt ist irgendein ModelDoc aktiv und sichtbar ' das ModelDoc aktivieren, dass anschließend aktiv sein soll swApp.ActivateDoc "baugruppe.sldasm" ' zurück zu dem zu schließenden ModelDoc swApp.ActivateDoc "teil2.sldprt" ' und schließen swApp.CloseDoc "teil2.sldprt" End Sub
Das ergibt zwar ein bisschen Bildschirmgeflacker durch das zweimal hin- und herschalten, hat aber anschließend bei meinen Versuchen immer die gewünschte Baugruppe.sldasm aktiv und offen.Ciao, Stefan
------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
3df002 Mitglied
Beiträge: 6 Registriert: 11.07.2011 Umgebung: SW2011 und S2012
|
erstellt am: 16. Jan. 2013 13:39 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, besten Dank. Die Zeile mit dem aktiveren des zu löschenden Dokuments hat bei mir den Erfolg gebracht. ' zurück zu dem zu schließenden ModelDoc swApp.ActivateDoc "teil2.sldprt" ' und schließen swApp.CloseDoc "teil2.sldprt" Trotzdem finde ich das Verhalten von SolidWorks nicht ganz so stimmig. Bei meinen Tests habe ich festgestellt, das SolidWorks beim Schließen eines Dokumentes (das nicht vorher aktiviert wurde) immer das direkt davor geladene Dokument anzeigt, egal was eigentlich sichtbar war. Ich habe das ganze mal an den apisupport von SW gegeben und warte dort auf eine Antwort, die ich dann auch hier wieder publik mache. Aus meiner Sicht ist Deine Idee ein Workaround, der für mich eine Lösung darstellt. Danke Gruß 3df002 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |