Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Selection ist nicht gleich Selection!?

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Selection ist nicht gleich Selection!? (2623 mal gelesen)
Pausenbrot
Mitglied



Sehen Sie sich das Profil von Pausenbrot an!   Senden Sie eine Private Message an Pausenbrot  Schreiben Sie einen Gästebucheintrag für Pausenbrot

Beiträge: 20
Registriert: 24.10.2007

erstellt am: 20. Dez. 2007 09:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von tomtom1972 an!   Senden Sie eine Private Message an tomtom1972  Schreiben Sie einen Gästebucheintrag für tomtom1972

Beiträge: 605
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Pausenbrot 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Pausenbrot an!   Senden Sie eine Private Message an Pausenbrot  Schreiben Sie einen Gästebucheintrag für Pausenbrot

Beiträge: 20
Registriert: 24.10.2007

erstellt am: 21. Dez. 2007 09:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von tomtom1972 an!   Senden Sie eine Private Message an tomtom1972  Schreiben Sie einen Gästebucheintrag für tomtom1972

Beiträge: 605
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Pausenbrot 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Pausenbrot an!   Senden Sie eine Private Message an Pausenbrot  Schreiben Sie einen Gästebucheintrag für Pausenbrot

Beiträge: 20
Registriert: 24.10.2007

erstellt am: 27. Dez. 2007 10:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von tomtom1972 an!   Senden Sie eine Private Message an tomtom1972  Schreiben Sie einen Gästebucheintrag für tomtom1972

Beiträge: 605
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Pausenbrot 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Pausenbrot an!   Senden Sie eine Private Message an Pausenbrot  Schreiben Sie einen Gästebucheintrag für Pausenbrot

Beiträge: 20
Registriert: 24.10.2007

erstellt am: 02. Jan. 2008 11:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Augustiner an!   Senden Sie eine Private Message an Augustiner  Schreiben Sie einen Gästebucheintrag für Augustiner

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Pausenbrot 10 Unities + Antwort hilfreich

@ TomTom

wie holst Du Dir den Pfad des Bodies? Gibt es dafür eine Funktion, oder machst Du das über einen
rekursiven Scan deiner Stuktur?

Danke

Gruß Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz