| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| 3DEXPERIENCE Conference 2024 | München, eine Veranstaltung am 16.10.2024
|
Autor
|
Thema: API: ishidden geht scheinbar für unterbaugruppen nicht (1586 / mal gelesen)
|
LeonardStark Mitglied
Beiträge: 108 Registriert: 14.08.2018
|
erstellt am: 16. Mai. 2019 13:21 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich versuche in einem Makro jede sichtbare Komponente einer Baugruppe auszulesen. dafür nutze ich icomp.IsHidden(true) Im Falle, dass ich eine Baugruppe ausblendet habe, die eine unteraugruppe enthält, wird die Unterbaugruppe weiterhin als sichtbar zurück gemeldet (ishidden(true)=false). Mach ich da mit der Funktion etwas falsch oder gibt es eine andere Funktion, mit der ich den status der Komponente prüfen kann? Danke schonmal für eure soweit immer hilfreichen Anregungen und Hinweise. Viele Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SLDW-FEM Mitglied Simulations-Ingenieur
Beiträge: 643 Registriert: 21.02.2005 Solidworks 2017+2019+20+22 SpaceClaim Windows 11 64bit HP-ZBook 32gbRAM NVIDIA
|
erstellt am: 16. Mai. 2019 14:25 <-- editieren / zitieren --> Unities abgeben: Nur für LeonardStark
Hallo bei mir geht es ! (sld2017sp5-+hotfix) dir ist aber schon klar, daß der Kontext der Baugruppe wichtig ist! d.h. bei einer 3-stufigen Assy gibt es die tiefste Komponente 2mal und sie kann überall nen eigenen Anzeigestatus haben! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeonardStark Mitglied
Beiträge: 108 Registriert: 14.08.2018
|
erstellt am: 16. Mai. 2019 14:42 <-- editieren / zitieren --> Unities abgeben:
hallo SLDW-FEM, mit Kontext der Baugruppe meinst du, dass es in einer hauptbaugruppe liegen muss? Der ist eigentlich gegeben. nur damit wir nicht aneinander vorbei reden, noch mal etwas anschaulicher (hoffentlich) meine Ausgangssituation beschrieben -Assembly- ----------part1 ----------part2 ----------Subassembly1- -----------------------subassembly1.2 gekürzter code: AssemblyDoc doc = swApp.ActiveDoc; object[] comps = doc.GetComponents(false); foreach (object comp in comps) //durchlaufe jede Komponente {IComponent2 icomp = (IComponent2)comp; IModelDoc2 modeldoc2 = icomp.GetModelDoc2(); Debug.Print(" ishidden: " + icomp.ishidden.ToString()); } blende ich subassembly1.2 einzeln aus. wird es als ishidden=true angezeigt. blende ich aber subassembly1 aus, sind darunter liegende subassemblys weiterhin für den code eingeblendet (ishidden=false)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ConZept Mitglied Maschinenbautechniker
Beiträge: 15 Registriert: 19.02.2019 SolidWorks 2018 / SP 4.0 Win7x64 /HP Z440
|
erstellt am: 16. Mai. 2019 20:54 <-- editieren / zitieren --> Unities abgeben: Nur für LeonardStark
Hallo Leonard, kenne jetzt deinen traverse code nicht, aber GetComponents gibt dir "irgendeine" Reihenfolge (siehe remarks) der Komponenten wieder. Ist es sicher, dass die Komponente auch tatsächlich die ausgeblendete ist und nicht eine mit dem gleichen Namen, aber wo anders verbaut? Für mich funktioniert folgende traverse um herauszufinden, ob Komponenten unterdrückt und Toolbox-Teile sind:
Code:
private void TraverseAssembly(Component2 swComp, int depth) { try { object[] vChildComp; Component2 swChildComp; ModelDoc2 swModel; long i = 0; vChildComp = (object[])swComp.GetChildren(); for (i = 0; i < vChildComp.Length; i++) { swChildComp = (Component2)vChildComp[i]; // check if the component is supressed if (!swChildComp.IsSuppressed()) { swModel = (ModelDoc2)swChildComp.GetModelDoc2(); if (swModel?.Extension.ToolboxPartType == (int)swToolBoxPartType_e.swNotAToolboxPart)// check if component is toolboxpart { etc... } } TraverseAssembly(swChildComp, depth++); } } catch (Exception ex) { // error handling } }
Wobei swComp hier die Root Komponente, also deine Assembly ist. Ansonsten kennst du bestimmt das Beispiel in der API-Hilfe, aber vielleicht hilft es dir weiter. Müsste ich jetzt mal mit ausgeblendeten Teilen testen um zu sehen ob ich das reproduzieren kann. ------------------ Gruß ConZept [Diese Nachricht wurde von ConZept am 16. Mai. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeonardStark Mitglied
Beiträge: 108 Registriert: 14.08.2018
|
erstellt am: 17. Mai. 2019 10:26 <-- editieren / zitieren --> Unities abgeben:
Danke ConZept, leider hat der Code auch keine Änderung gebracht. wenn eine "Unter-Unterbaugruppe" mit ihrer darüberliegenden "Unterbaugruppe" zusammen ausgeblendet wird, scheint der Marker "hidden" nicht gesetzt zu werden. Auch wenn ich über getcomponents nicht in definierter Reihenfolge die Komponenten durchlaufe, bin ich trotzdem sicher, dass es die gesuchte Baugruppe ist. ich hab das auch mit kleinen Baugruppen getestet und mir die "ishidden" werte ausgeben lassen. weiß vielleicht jemand noch andere Möglichkeiten um die Sichtbarkeit zu prüfen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3256 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 17. Mai. 2019 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für LeonardStark
Hallo, du wirst in das traverse eine Abfrage einbauen müssen, ob die Unterbaugruppe auch noch aufgelöst werden muss. getcomponents(false) holt alle Komponenten incl. unterunterunter...baugruppenkomponenten getcomponents(true) würde nur die oberste Ebene liefern. wenn unsichtbar --> ignorieren, nächste wenn sichtbar --> sammeln (oder ausgeben oder …) wenn (sichtbar und) Assembly --> traverse (unterkomponenten) Gruß, Christian
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeonardStark Mitglied
Beiträge: 108 Registriert: 14.08.2018
|
erstellt am: 17. Mai. 2019 12:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Christian, Super die zusätzliche Abfrage hats gebracht. Ich verstehs nur noch nicht ganz. Eben WEIL getcomponents(false) alle Komponenten holt, hätte ich gedacht, dass er auch den hidden Status richtig erkennt. aber da scheint solidworks dann die Baugruppe separat zu untersuchen, richtig? Vielen Dank euch auf jeden Fall für eure Hilfe. Ich finds wirklich super, dass man hier zu fast allen Problemen Unterstützung bekommt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ConZept Mitglied Maschinenbautechniker
Beiträge: 15 Registriert: 19.02.2019 SolidWorks 2018 / SP 4.0 Win7x64 /HP Z440
|
erstellt am: 17. Mai. 2019 13:45 <-- editieren / zitieren --> Unities abgeben: Nur für LeonardStark
Hallo, ist tatsächlich so, dass die ausgeblendete assembly bei der traverse nicht mehr aufgelöst wird. Mit folgendem Code läuft auch die subassembly durch und gibt den Status der Komponente richtig wieder: Code:
private void TraverseAssemblyHidden(Component2 swComp, int depth, bool hidden) { try { object[] vChildComp; Component2 swChildComp; long i = 0; vChildComp = (object[])swComp.GetChildren(); for (i = 0; i < vChildComp.Length; i++) { swChildComp = (Component2)vChildComp[i]; // check if the component is supressed if (!swChildComp.IsSuppressed()) { if (hidden | | swChildComp.IsHidden(false)) { string name = swChildComp.GetPathName(); swApp.ShowMessageBox("hidden: " + name, SolidWorksMessageBoxIcon.Information, SolidWorksMessageBoxButtons.Ok); TraverseAssemblyHidden(swChildComp, depth++, true); } } TraverseAssemblyHidden(swChildComp, depth++, false); } } catch (Exception ex) { // error handling } }
------------------ Gruß ConZept Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |