| | | CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min | | | | KISTERS 3DViewStation: Unterstützung für 3D CAD Kollaboration mit Lieferanten, eine Pressemitteilung
|
Autor
|
Thema: Selection ist nicht gleich Selection!? (2692 mal gelesen)
|
Pausenbrot Mitglied
Beiträge: 20 Registriert: 24.10.2007
|
erstellt am: 20. Dez. 2007 09:52 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, folgendes Szenarium (1): Produkt aktiv (blau unterlegt) mit mehreren Instancen eines Bauteils (Part). Parts mit verschiedenen Lagen im Raum. [Product] | +-Part.1 | +-Part.2 | +-Part.3 | +-Part.4 | +-Part.5 | +-Part.6 | +-Part.7 | +-Part.8 | +-Part.9 ---------------------------------------- Wird im "Space" eine Fläche selektiert und diese auf ein Object abgelegt, die Selection gelöscht und dannach der Selection wieder das Object zugewiesen, so wird im Raum die Fläche wieder "gehighlightet" - aber nicht oder nicht immer in der OriginalInstance. -> Dim objDoc As ProductDocument Set objDoc = CATIA.ActiveDocument Dim objSel As Selection Set objSel = CATIA.ActiveDocument.Selection Dim objSelArray() ReDim objSelArray(0) Dim iCounter As Integer For iCounter = 1 To objSel.Count2 Set objSelArray(UBound(objSelArray)) = objSel.Item(iCounter).Value ReDim Preserve objSelArray(UBound(objSelArray) + 1) Next objSel.Clear For iCounter = 0 To UBound(objSelArray) - 1 objSel.Add (objSelArray(iCounter)) Next Frage: Warum ist das so? Wie kann man die Selection in der OrginalInstannce wiederherstellen? Szenarium (2): Instance (.3) aktiv (blau unterlegt) Product | +-Part.1 | +-Part.2 | +-+-[Part.3] | +--Part | +-Part.4 | +-Part.5 | +-Part.6 | +-Part.7 | +-Part.8 | +-Part.9 ---------------------------------------- Wird nun die Selction ausgelesen, gelöscht und wiederhergestellt, erfolgt die Selection korrekt in der Originalinstance! Kann mich hier jemand aufschlauen? Hat jemand den passenden Code, wie ich immer die Selektion in der Originalinstance wiederbekomme? Grüße vom Pausenbrot Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 21. Dez. 2007 06:53 <-- editieren / zitieren --> Unities abgeben: Nur für Pausenbrot
Moin Pausenbrot, der Grund ist immer noch der gleiche wie in deinem vorhergehenden Post: Wenn der "Einstieg" über ein Geometrieelement kommt (welches sich im PartDokument befindet), ist die Instance Information nicht mehr verfügbar. Selektiert / gehighlighted werden dann immer die Objekte der ersten im Baum auftretenden Instance deines Parts bzw. auch eine zuvor schon einmal selektierte), aber nicht immer die "richtige", d.h. jene, aus der die ursprüngliche Selektion einmal gekommen ist. Wenn die "gewünschte" Instance die aktivierte ist, ist es eben sozusagen die erste im Tree auftretende. So würde ich es mir selbst erklären. Zu den Problem gibst auch schon Beiträge in einem US-Forum (Coe.org). Folgender Workaround funtioniert einwandfrei, auch wenn dein Root-Product das aktive Dokument ist : - Selection ausführen - einem Array zuordnen und zugehörige Instance auslesen (bis dahin bist du schon gekommen) - rekursiv durch den Tree gehen, die Nodes aller Instancen des Parts deaktivieren Parts, nur die benötigte Instance eingeschaltet lassen - Objekt aus dem Array wieder der Selektion zufügen ->> richtige Instance ist selektiert / gehighlighted (bzw. die Objekte in ihr) - rekursiv durch den Tree gehen, alle Instance Nodes wieder ein Die Frage die sich mir stellt ist: Was hast du eigentlich vor? Der einzige Anwendungsfall für o.g. Problem (der mir bekannt ist) wäre die Funktion "CATProduct to Part" nachzubauen (d.h. das lagerichtige Kopieren von Geometrien unterscghiedlicher Instancen eines Parts mit unterschiedlicher Transformation). Gruß TomTom ------------------ tomtom1972
[Diese Nachricht wurde von tomtom1972 am 21. Dez. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Pausenbrot Mitglied
Beiträge: 20 Registriert: 24.10.2007
|
erstellt am: 21. Dez. 2007 09:44 <-- editieren / zitieren --> Unities abgeben:
Hallo TomTom, erst mal Danke für den Tipp. Ich werd ihn mich mal "mit durch den Baum hangeln" beschäftigen. Schon mal ne Frage: Meinst du die Instance deaktivieren. Händisch hatte ich dies schon mal im Baum getan, führte aber dennoch zur "falschen" Selection. Aber Sinn meiner Fragen: Es geht darum, eine geöffnete Stellung um einen Drehpunkt zu visuallisieren. Dies geschieht durch Kopieren der selektierten Body in eine neues Part. Die Lage des Part im Raum bestimmt der User durch anklicken eines AxisSystem. Auch den Ort im Tree wird durch den User bestimmt. Dann erfolgt der Kopiervergang. Deswegen ist es wichtig, dass die Body kopiert werden, welche anselektiert wurden und nicht ein Body einer anderen Instance. Zum Schluss werden die kopierten Bodys um die X-Achse des AxisSystem gedreht. Das ganze Makro funktioniert solange nur eine Instance des Selektierten Bodys im darübergelegenden Produkt verhanden ist. Logisch, ist ja auch den immer der erste im Tree. Sind mehrere Instancen verhanden, werden immer Bodys kopiert, welche nicht selektiert wurden. Prinzipiell ist es eine MiniAnwendung der "CATProduct to Part"-Funktion. Nur nicht alle Bodys des Produktes sondern nur die selektierten + Rotation... gibt es eigentlich die Möglichkeit, mittels Selection.search(...) in nur einer Instance nach einen Body mit Namen "xyz" zu suchen und zu selektieren? Wäre evtl. eine Lösung für mein Problem... Gruß das Pausenbrot Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 24. Dez. 2007 08:11 <-- editieren / zitieren --> Unities abgeben: Nur für Pausenbrot
Hallo Pausenbrot, die einzige mir bekannte Lösung ist die, welche ich oben beschrieben habe. Dein Problem ist ja genau der Fall, der bei mir auch vorlag. Mit Instance deaktivieren meine ich die Funktion "deactivate node". Um deine letzte Frage zu beantworten: Du kannst mit Hilfe einer logischen Verknüpfung (und) im Search nach Bodies in einer bestimmten Instance suchen. Es werden dann auch die richtigen Bodies selektiert, aber eben nicht kopiert.... An deinem Problem ändert sich nichts. Ich habe mich vor etwa 2 Jahren länger damit beschäftigt und eben nur den o.g. Workaround gefunden. Der allerdings funktioniert jetzt schon seit mehreren Releases einwandfrei. Falls du noch auf eine andere Lösung kommst würde ich mich übere eine Info freuen. Schöne Weihnachten & Gruss TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Pausenbrot Mitglied
Beiträge: 20 Registriert: 24.10.2007
|
erstellt am: 27. Dez. 2007 10:42 <-- editieren / zitieren --> Unities abgeben:
Hallo TomTom, das reine deaktivieren aller Knoten bis auf den benötigten, führt bei Verwendung von Selection.Copy und Selection.PasteSpecial(..) zu den gleichen Ergebnis, wie bereits oben beschrieben. Es wird immer diese scheinbar 1. Instance kopiert. Die einzige Lösung, welche eine lagekorrekte Kopie eines Bodys in ein Part bei einer Produktstruktur ergab, funktionierte bei mir so: 1. komplette Selection zwischenspeichern 2. aus Selection die Instancen auslesen -> Selection.FindObject("CATIAProduct") 3. 1.Selection wiederherstellen, Body auslesen -> Selection.FindObject("CATIABody") 4. 2.Selection wiederherstellen...usw. 5. Prüfen ob Anzahl Instancen=Bodys sind -> Wenn nein, war eine Selection ohne Body -> Makro beenden 6. ...Part erzeugen..benennen...verschieben... und was man noch so alles will ---- Jetzt das eigentliche Copy and Paste ---- 7. Alle Knoten deaktivieren 8. 1.Instance aktivieren 9. nach Body mit Name "XYZ" mittels Selection.Search(..) suchen -> Body wird in die Selection genommen 10. Selection.Copy 11. Selection.Clear 12. Alle Knoten deaktivieren 13. Nur Part aktivieren 14. nach Part mit Name "XYZ" mittels Selection.Search(..) suchen -> Part wird in die Selection genommen 15. Selection.PasteSpecial ("CATPrtResultWithOutLink") 16. Selection.Clear 17. Punkt 7 bis 16 entsprechend Anzahl Instancen wiederholen ...und dit funzte. Du siehst, es sollte relativ allgemeingültig in jeder Produktstruktur einen sauberen "Copy and Paste"-Vorgang erzeugen. Wenn jemand eine Vorgehensweise hat, welche nicht so "kompliziert" ist, kann er diese ja mal posten.... Grüße das Pausenbrot Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 28. Dez. 2007 08:31 <-- editieren / zitieren --> Unities abgeben: Nur für Pausenbrot
Hallo Pausenbrot, ich habe wie bereits in dem vorhergehenden Post erwähnt vor einiger Zeit ein Script geschrieben, welches .ALLCATParts erzeugt, dessen Geometrie aus verlinkte Kopien mit der Geometrie der Original Struktur besteht. Dabei bin auf auf das diskutierte Problem gestoßen. Mein Ablauf ist folgender: * ich erzeuge ein mehrdimensionales Array, sagen wir aFeld(3,n), wobei n der absoluten Anzahl der in der kompletten Produkt-Struktur vorhandenen Bodies entspricht. * ich "scanne" rekursiv die Struktur und befülle das Feld, wobei * aFeld(0,n) das jeweilige Objekt enthält (also den Body) * aFeld(1,n) den Pfad des Bodies über alle Knoten in der Struktur, also z.B. Root/Product1/Product2/Part1/PartBody/BooleanOperation1/BodyTarget * aFeld(2,n) ... weitere Infos (Material, sonst was...) * ich gehe rekursiv durch die Struktur und deaktiviere die Nodes jedes Parts * ich gehe rekursiv durch die Struktur und aktiviere ein Part, selektiere (Aufgrund des Abgleiches der "Pfadangabe" im Array mit der "Pfadangabe" des Bodies in der org. Struktur) über ein Selection.Search (nach dem Body Namen) den zu kopierenden Body in der Struktur erneut (das ist wichtig!!), kopiere ihn, selektiere das .ALLCATPart (dessen Node natürlich als einziger abgesehen vom jeweiligen Part, aus dem kopiert werden soll, aktiviert ist) und füge die Selektion ein (die Kopie). Wichtig ist noch, das die Bodys im .ALLCATPart unikal benannt sind, also auf jeden Fall niemals so heissen, wie die in der Org. Struktur, da das ALLCATPart ja immer aktiviert ist und die Selektion über den Body Namen erfolgt. * jeweiligen Node wieder deaktivieren * nächstes Part Der Vorteil ist hierbei, dass ich mich um die Instanzen nicht scheren muss, es wird immer von alleine die richtige genommen, da ja nur diese aktiv ist. Und das Ganze geht schneller, da die Selektion (als zeitintensivster Vorgang) pro Body nur einmal ausgeführt wird (beim Kopieren selbst). Funktioniert wie gesagt seit langen reibungslos. Gruß TomTom
------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Pausenbrot Mitglied
Beiträge: 20 Registriert: 24.10.2007
|
erstellt am: 02. Jan. 2008 11:15 <-- editieren / zitieren --> Unities abgeben:
Hallo TomTom, erstmal: "Ein frohes neues Jahr!" Prinzipiell sind sich die Lösungen ähnlich. Das Geheimnis, die korrekte Selektion wieder in die Selection zu bekommen, ist die selection.search(..) - Methode. Der von mir beschriebene Punkt 14 ist nur dann nötig, wenn nicht garantiert werden kann, dass nur ein Part (eine Instance) vorhanden ist. Aber dennoch ganz schön umständlich. Der selection's-Aufruf sollte doch schon, ich sage mal "rootwissender" arbeiten. Kann man ja nur hoffen, dass DS vielleicht mal nachbessert. Grüße das Pausenbrot Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Augustiner Mitglied Konstrukteur
Beiträge: 188 Registriert: 02.12.2005 HP Workstation Windows XP Professional Visual Studio 2005 Professional CATIA V5 R14SP5 & R17SP3
|
erstellt am: 18. Nov. 2009 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für Pausenbrot
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|