| |
| KISTERS 3DViewStation: Unterstützung für 3D CAD Kollaboration mit Lieferanten, eine Pressemitteilung
|
Autor
|
Thema: Body aus Instanz kopieren und einfügen mit Position (5774 mal gelesen)
|
Michel EF Mitglied Dipl.-Ing. Maschinenbau
Beiträge: 7 Registriert: 27.08.2009
|
erstellt am: 29. Sep. 2009 14:56 <-- editieren / zitieren --> Unities abgeben:
Hallo, so muss nun auch mal um Rat fragen. Das Forum hat mir schon hin und wieder sehr geholfen. Nun komm ich aber auch mit der Suchfunktion nicht weiter. Ich möchte dieverse Bodies aus verschiedenen Part's slektieren und in ein neues Part einfügen. Dies funktioniert auch einwandfrei, solange es sich bei den Ursprungparts nicht um Instanzen handelt. Bei denen wird immer der Body der ertsen Instanz kopiert und eingefügt. Ich möchte aber das die Position der Bodies im Raum erhalten beleibt. Gibt es ein Möglichkeit den Body in der jeweiligen Instanz anzusprechen? Bei dem Kopieren per Maus funktioiert dies ja auch. Hier ma der Auszug aus meinem Script Sub CATMain()
'#################################----ABFRAGE USER---#
Dim Eingabe As String Eingabe = "GEOEFFNETE_STELLUNG" '---Default value EingabeUser = InputBox("Benennung", "Geöffnete Stellung", Eingabe) If EingabeUser= "" Then Exit Sub Dim EingabePlus as String EingabePlus = EingabeUser & ".CATPart" '---Bei Paste-Function benötigt Benennung Part+ Dateiendung Dim productDocument1 As Document Set productDocument1 = CATIA.ActiveDocument Dim product1 As Product Set product1 = productDocument1.Product Dim products1 As Products Set products1 = product1.Products Dim newPart As Document Set newPart = products1.AddNewComponent("Part", EingabeUser) '----Part für geöffnete Stellung erstellen '##########################----Selection der Bodies----#
Dim selection1 As Selection Set selection1 = productDocument1.Selection selection1.Clear '----FILTER festlegen
Dim Was(0) Was(0) = "Body" '-----Selektion definieren und leeren --------------------------------- Dim UserSel As Selection Set UserSel= CATIA.activeDocument.Selection UserSel.Clear '-----Selektion vornehmen lassen -------------------------------------- Dim Auswahl as Objekt Auswahl = UserSel.SelectElement3(Was, "Selektieren Sie die Parts", False, CATMultiSelTriggWhenUserValidatesSelection , true) '------------------------Schleife Speicher füllen--------------------------------------------------------- t=0 Do while( t < UserSel.count2) X =UserSel.Item(1).value.name '----Name des Body Y = UserSel.Item(1).value.parent.parent.name '----Name des Elternpart des Bodys Str = y & ".CATPart" '----Name des Elternpart des Bodys + Dateiendung Dim documents1 As Documents Set documents1 = CATIA.Documents Dim partDocument1 As Document Set partDocument1 = documents1.Item(str) Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body As Body Set body1 = bodies1.Item(x) selection1.Add body1 '----der jeweilige Body wird zur selection hinzugefügt t=t+1 loop selection1.Copy '----die Selektion1 wird in den Speicher geladen '-----Ablage des Speicherinhaltes----------------------
Dim partDocument2 As Document Set partDocument2 = documents1.Item(EingabePlus) '----das neue Part für die offene Stellung partDocument2.Activate Dim part2 As Part Set part2 = partDocument2.Part Dim selCopy2 As Selection Set selCopy2 = productDocument1.Selection selCopy2.Clear '----Selektion leeren selection1.Add part2 '----Ablageort für den Inhalt des Speichers wird hinzugefügt selection1.PasteSpecial "CATPrtResult" '----Speicher wird mit als Result with Link eingefügt End Sub Ich hoffe, dass mir da jemand helfen kann. Vielen Dank u. Gruß Michel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 30. Sep. 2009 10:20 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Da hier keiner antwortet und eine bessere Idee hat wird Dir wohl nichts anderes übrig bleiben, als über das product der Instanz zu gehen und dessen Matrix auszulesen. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Michel EF Mitglied Dipl.-Ing. Maschinenbau
Beiträge: 7 Registriert: 27.08.2009
|
erstellt am: 30. Sep. 2009 14:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, is ja schonmal gut, dass es wohl eine Lösung gibt. Ich hab jetzt schon einiges probiert: Instanzen nach dem Kopieren deaktiviert ==> Position wird nicht beibehalten Instanzen-Node nach dem Kopieren deaktiviert ==> Position wird nicht beibehalten Referenz des zu kopierenden Körper erstellt und kopiert ==> Position wird beibehalten allerdings nur paste without Link möglich, da die Referenz ja nicht veröffentlicht ist, ich brauch aber nen Link Leider hab ich noch keienen Plan was du mit deinem Ansatz meinst Zitat: Dir wohl nichts anderes übrig bleiben, als über das product der Instanz zu gehen und dessen Matrix auszulesen.
Kannst dur mir das nochmal erklären, bin im Scripten eigentlich noch Laie Gruß Michel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Michel EF Mitglied Dipl.-Ing. Maschinenbau
Beiträge: 7 Registriert: 27.08.2009
|
erstellt am: 30. Sep. 2009 14:51 <-- editieren / zitieren --> Unities abgeben:
Ich formuliere mein Problem nochmal anders. Gibt es eine Möglichkeit, dass ich einen Body selektiere der in einem Instanz-Part liegt und dass ich dann auch auf diese Instanz zugreife? Bis jetzt ist es immer so, dass ich automatisch in der ersten Instanz lande, egal welchen Body ich selektriere. Bildlich gesprochen: Instanz erst durch Doppelklick aktivieren (blauer Balken) und dann den Body kopieren. Wie kann ich das in einem Makro einbauen? Vielen Dank Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 30. Sep. 2009 14:51 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Jedes Product besitzt eine Methode, die deine Transformationsmatrix zurück gibt. Diese könntest du auslesen und dann deinem neuen Körper zuweisen. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Randle Mitglied CAD/PLM Consultant
Beiträge: 743 Registriert: 12.04.2003 Win10 x64 CATIA V5 R18, R19, R21, R27-29
|
erstellt am: 30. Sep. 2009 14:57 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo, ich nehme an, das du derzeit über die Selection Klasse die Bodys kopierst. Versuche das ganz mal über boolsche Operationen in dein Zielpart zu holen. Am ende kannst du die boolschen Operationen dann wieder im Zielpart löschen und hast verknüpfte Bodys untereinander. ------------------ MfG Randle ! It's not a bug, it's a feature ! [Diese Nachricht wurde von Randle am 30. Sep. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Michel EF Mitglied Dipl.-Ing. Maschinenbau
Beiträge: 7 Registriert: 27.08.2009
|
erstellt am: 30. Sep. 2009 16:29 <-- editieren / zitieren --> Unities abgeben:
So hab das ma mit den Boolschen versucht. mauell per Maus klappt das ja wunderbar, aber per Makro wird der Body aus dem Quellpart ausgeschnitten und mit Fehlern in das Zielpart eingefügt. Hier mein Makro dazu. Code: Language="VBSCRIPT" Sub CATMain()
'#################################----ABFRAGE USER---######################################
Dim Eingabe As String Eingabe = "GEOEFFNETE_STELLUNG" '---Default value EingabeUser = InputBox("Benennung", "Geöffnete Stellung", Eingabe) If EingabeUser= "" Then Exit Sub Dim EingabePlus as String EingabePlus = EingabeUser & ".CATPart" Dim productDocument1 As Document Set productDocument1 = CATIA.ActiveDocument Dim product1 As Product Set product1 = productDocument1.Product Dim products1 As Products Set products1 = product1.Products '##########################----Selection der Bodies----###########################################
Dim Was(0) Was(0) = "Body" '-----Selektion definieren und leeren --------------------------------- Dim UserSel As Selection Set UserSel= CATIA.activeDocument.Selection UserSel.Clear '-----Selektion vornehmen lassen -------------------------------------- Dim Auswahl as Objekt Auswahl = UserSel.SelectElement3(Was, "Selektieren Sie die Parts", False, CATMultiSelTriggWhenUserValidatesSelection , true) X =UserSel.Item(1).value.name '----Name des Body Y = UserSel.Item(1).value.parent.parent.name '----Name des Elternpart des Bodys Str = y & ".CATPart"
'-----------Quelle----------------------- Dim documents1 As Documents Set documents1 = CATIA.Documents
Dim partDocument1 As Document Set partDocument1 = documents1.Item(str) Dim part1 As Part Set part1 = partDocument1.Part Dim bodies1 As Bodies Set bodies1 = part1.Bodies Dim body As Body Set body1 = bodies1.Item(x) 'Quellkörper '-----Ziel-Part---------------------- Dim newPart As Document Set newPart = products1.AddNewComponent("Part", EingabeUser) Dim partDocument2 As Document Set partDocument2 = documents1.Item(EingabePlus) Dim part2 As Part Set part2 = partDocument2.Part
Dim bodies2 As Bodies Set bodies2 = part2.Bodies Dim body2 As Body Set body2 = bodies2.Item(1)'Zielkörper part2.InWorkObject = body2 Dim shFac1 As Factory Set shFac1 = part2.ShapeFactory Dim Bool1 As Add Set Bool1 = shFac1.AddNewAdd (body1) End Sub
Wo liegt da jetzt der Fehler? Ich hoff da kann mir jemand helfen. Die Lösung sieht ja ganz vielversprechend aus, zumindest manuell. Gruß Michel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Randle Mitglied CAD/PLM Consultant
Beiträge: 743 Registriert: 12.04.2003 Win10 x64 CATIA V5 R18, R19, R21, R27-29
|
erstellt am: 30. Sep. 2009 16:33 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo, weiss jetzt nicht ob es daran liegt, aber versuche mal statt Add mit Assemble. Edit: Ich habe nochmal nachgeschaut, ich befürchte Dassault hat das was geändert. Ich meine unter R16 ging dasa noch. Bei R13 bin ich sicher dass es ging. Sorry, wenn ich dich dadurch in die Irre geführt habe. Vielleicht kannst du ja auch die Funktion Associativity (seit R18) aus der AssemblyFeature Symbolleiste für dein Problem nutzen. ------------------ MfG Randle ! It's not a bug, it's a feature ! [Diese Nachricht wurde von Randle am 30. Sep. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Michel EF Mitglied Dipl.-Ing. Maschinenbau
Beiträge: 7 Registriert: 27.08.2009
|
erstellt am: 01. Okt. 2009 11:10 <-- editieren / zitieren --> Unities abgeben:
Hallo, was für ein wunderbarer Morgen, ich hab ne Lösung. Ich erzeuge erst ne Referenz des Body und kopiere diese dann. Hatte diesen Ansatz schonmal, nur war da die Referenz, aus mir nicht erklärlichen Gründen, nicht publiziert. Jetzt nochmal ausprobiert und sieh da es geht. Gestern und vorgestern in R16 ausprobiert Referenz wird nicht veröffentlicht Heute ma zufällig in in R19 getestet ==> die Sch... geht Ein Hoch auf die neue Release Hier der Code dazu. Geht vieleicht noch ein bischen schöner, aber nach 8h Kopfzerbrechen nun erstmal egal.
Code: Language="VBSCRIPT"Sub CATMain() '#################################----ABFRAGE USER---######################################
Dim Eingabe As String Dim EingabePlus as String Eingabe = "GEOEFFNETE_STELLUNG" '---Default value EingabeUser = InputBox("Benennung", "Geöffnete Stellung", Eingabe) If EingabeUser= "" Then Exit Sub EingabePlus = EingabeUser & ".CATPart" '---Bei Paste-Function benötigt Benennung Part+ Dateiendung Dim productDocument1 As Document Set productDocument1 = CATIA.ActiveDocument Dim product1 As Product Set product1 = productDocument1.Product Dim products1 As Products Set products1 = product1.Products Dim newPart As Document Set newPart = products1.AddNewComponent("Part", EingabeUser) '----Part für geöffnete Stellung erstellen '##########################----Selection der Bodies----###########################################
Dim selection1 As Selection Set selection1 = productDocument1.Selection selection1.Clear '----FILTERfestlegen ==> Muss bezeichnung aus Catia sein z.B. Pad, Hole, etc.----------------------------------------------- Dim Was(0) Was(0) = "Body" '-----Selektion definieren und leeren --------------------------------- Dim UserSel As Selection Set UserSel= CATIA.activeDocument.Selection Do '-----Schleife laüft solange bis User alle Teile gewählt hat UserSel.Clear
'-----Selektion vornehmen lassen -------------------------------------- Dim Auswahl as Objekt Auswahl = UserSel.SelectElement3(Was, "Selektieren Sie die Parts", False, CATMultiSelTriggWhenUserValidatesSelection , true) '------------------------Schleife Speicher füllen--------------------------------------------------------- t=0 Do while( t < UserSel.count2) X =UserSel.Item(1).value.name '----Name des Body z = UserSel.Item(1).Leafproduct.name '----Instanzname wird ausgegeben PathReferenz = z & "/!" & X Dim documents1 As Documents Set documents1 = CATIA.Documents Dim Ref as Reference Set Ref = product1.CreateReferenceFromName( PathReferenz) selection1.Add Ref '----der jeweilige Referenzody wird zur selection hinzugefügt t=t+1 loop selection1.Copy '----die Selektion1 wird in den Speicher geladen '-----Ablage des Speicherinhaltes----------------------
Dim partDocument2 As Document Set partDocument2 = documents1.Item(EingabePlus) '----das neue Part für die offene Stellung wird angesprochen partDocument2.Activate Dim part2 As Part Set part2 = partDocument2.Part '----die Eigenschaften der Klasse Part werden zugewiesen selection1.Add part2 '----Ablageort für den Inhalt des Speichers wird hinzugefügt selection1.PasteSpecial "CATPrtResult" '----Speicher wird mit als Result with '###########################---Grafikproperties setzen----#################################################
Dim selection2 as Selection Set selection2 = productDocument1.Selection '----Selektion um die einzelnen Bodys neu einzufärben Dim VisPro As VisPropertySet Set VisPro = selection2.VisProperties Dim ResultBody As Bodies Set ResultBody = partDocument2.Part.Bodies koerperAnzahl = ResultBody.Count '----Zähler For I = 2 To koerperAnzahl '----Schleife beginnt nach dem Part Body Set Koerper = ResultBody.Item(I) part2.InWorkObject = ResultBody.Item(I) selection2.Add ResultBody.Item(I) VisPro.SetRealColor 255,255,0,0 '----Farbe wird gesetzt VisPro.SetRealOpacity 0, 0 '----Tranzparenz wird gesetzt next part2.Update Dim Box_Sel as Long Box_Sel=msgbox("Haben Sie alle Teile für die geöffnete Stellung selektiert?", 4, "Auswahl fertig ?") '---- wenn User Ja drückt wird die Schleife beendet Loop Until (Box_Sel=6) End Sub
Hab nun noch ein Problem in der Selektion-Box. Und zwar ist es so, dass ich ja Bodies selektieren lasse, nur haben die bei Instanzen alle die geleiche Benennung. Wenn man nun in einem Durchlauf zwei Bodies aus Instanzen selektiert, wird der 1te beim selektieren des 2ten wieder aus der Selktion entfernt. Hat dafür jemand einen Typ wie man das umgehen kann? Momentan lass ich halt ne Schleife mit Abfrage laufen. Bei vielen Instanzen ist das aber sehr umständlich Gruß Michel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Erich Mitglied Senior Consultant selbstständig
Beiträge: 223 Registriert: 03.10.2000 i7-9850H RAM 32,0 GB Nvidia Quadro T2000 Windows 7 Professional 64Bit
|
erstellt am: 23. Jan. 2014 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo ich möchte gerne diesen Beitrag noch einmal anfassen. D.h. das Kopieren von Bodies aus einer oder mehreren Instanzen in ein weiteres Part konnte ich mit diesem Script nicht nachbauen? Wer hat Tips wie das Script ergänzt werden muss? Danke ------------------ mfg Erich Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 24. Jan. 2014 08:21 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo Erich, ich würde folgendes machen: - suchen nach weitere Parts For i=1 to UserSel.Item(1).Leafproduct.parent.Count - PartName vergleichen - bei Überstimmung ----> Set myInstance = UserSel.Item(1).Leafproduct.parent.Item(i) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Erich Mitglied Senior Consultant selbstständig
Beiträge: 223 Registriert: 03.10.2000 i7-9850H RAM 32,0 GB Nvidia Quadro T2000 Windows 7 Professional 64Bit
|
erstellt am: 29. Jan. 2014 08:39 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo imation1999 meine Versuche Deine For - Schleife einzubauen erbrachte mangels Kenntnisse mit dem Umgang des Leafproducts nicht den gewünschten Effekt. Könntest Du anhand des vorstehenden Scriptes die For-Schleife exemplarisch für mich einbauen. Würde mir helfen. Danke ------------------ mfg Erich 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: 30. Jan. 2014 07:18 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Moin, das Problem des Kopierens von Geometrie (egal ob Bodies, Linien, Flächen ...) aus einer Struktur heraus bei mehrfach verbauten Instanzen wurde schon in mehreren Beiträgen besprochen, incl. der zugehörigen Lösung. Helfen die Beiträge bei deinem Problem nicht weiter (ich sehe auf den ersten Blick keinen Unterschied bzgl. der Fragestellung) oder hast du sie gar nicht gefunden? Gruß TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Erich Mitglied Senior Consultant selbstständig
Beiträge: 223 Registriert: 03.10.2000 i7-9850H RAM 32,0 GB Nvidia Quadro T2000 Windows 7 Professional 64Bit
|
erstellt am: 30. Jan. 2014 10:30 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo tomtom1972 Richtig - meine Recherche hat leider nicht die richtigen Tips finden können. Gerne nehme ich auch von Dir Tips an, um diese nachzuvollziehen zu können. Schwerpunkt ist, ich wiederhole, Bodies aus Instanzen in ein Part mit Position (und Material) zu kopieren. ------------------ mfg Erich 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: 30. Jan. 2014 11:56 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hi, und welcher Art genau ist dein Problem? Die Transformation des Bodies/Solids (also nach dem paste) im "Ergebnispart" oder schon der select/copy/paste Vorgang selbst? Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Erich Mitglied Senior Consultant selbstständig
Beiträge: 223 Registriert: 03.10.2000 i7-9850H RAM 32,0 GB Nvidia Quadro T2000 Windows 7 Professional 64Bit
|
erstellt am: 30. Jan. 2014 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo tomtom1972 der Select/Copy/Paste funktioniert (auch aus der Instanz), bis auf das Material welches mitkopiert werden soll. Ich denke in zwei nacheinander folgenden Operationen? Aber wie genau? D.h. ausgehend von einer separaten Selection oder komme ich über den bereits in einer Selection befindlichen Body an das Material heran? Die Transformation ist dann mein zweites Problem? D.h. die Analogie zum interaktiven Copy/Paste konnte ich nicht umsetzen. Danke für Deine Nachfrage. ------------------ mfg Erich 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: 30. Jan. 2014 17:07 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo erich, noch ein paar Fragen: - selektierst du nur Bodies aus der ersten Ebene oder auch aus boolschen Operationen? - ist das Material in deinen Parts im jeweiligen Body den du kopieren willst vorhanden, oder unterm Part-Knoten abgelegt? Und bzgl. der Transformation: - hat dein Ergebnis (Result) Body immer die Transformation, die der des Ursprungs-Bodies der ersten Instanz entspricht? Oder anders? Und zu guter letzt: gibts das Part, in welches du einfügst auch öfter? Also in Instanzen? Gruß ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 30. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Erich Mitglied Senior Consultant selbstständig
Beiträge: 223 Registriert: 03.10.2000 i7-9850H RAM 32,0 GB Nvidia Quadro T2000 Windows 7 Professional 64Bit
|
erstellt am: 30. Jan. 2014 20:25 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo tomtom1972 - Ja, aus der ersten Ebene, da mir der Solid ohne Historie reicht ("CATPrtResultWithOutLink"). - Der Body benötigt die Transformation der jeweiligen Instanz aus der dieser herauskopiert wurde. Mein gedankliches Beispiel Schrauben - diese sind in einem Zusammenbau an unterschiedlichen Positionen in Unterprodukten verbaut und bekommen somit zum Root-Produkt unterschiedliche Transformationen. - Eingefügt werden alle Bodies in ein neu eingefügtes Part. Bin auf Deine Anworten sehr gespannt. ------------------ mfg Erich 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: 31. Jan. 2014 10:27 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Moin, ich fang mal einfach von vorne an ohne auf weiter auf das o.s. Script einzugehen. Um die korrekte Transformation zu erhalten muss lediglich die Selection mithilfe einer geeigneten Referenzerzeugung erfolgen, in diesem Fall mittels der Methode .CreateReferenceFromName. Alles andere ist in Strukturen uneindeutig und damit ungeeignet. Den prinzipiellen Ablauf kannst du dir anschauen wenn du eine Constraint-Erzeugung mit dem Makrorekorder aufzeichnest. In deinem Fall hier sieht die Referenzerzeugung zu einem Body über den Namen dann z.B. so aus: "BspRootProduct/BspUnterProduct.1/BspPart.1!BspBody" und ist damit eindeutig, da der "Pfad" durch die Instanzen "abgebildet" ist. Um unabhängig von der "Lage" der Teile in der Struktur zu sein baut man das ganze rekursiv auf, d.h. ausgehend vom selektierten Body (egal in welcher Strukturtiefe der ist) wird der String bis nach oben hin ausgelesen. Da es nur "eine Selektion gibt" (was das genau heißen soll findest du in anderen Beiträgen, z.B. von mir) "speichert" man alles in einem Array zwischen, sprich: -> Selektion enthält mehrere Bodies, verteilt über mehrere Parts in mehrerern Strukturtiefen -> Referenz auslesen -> in Array (=Feld) speichern -> Selection leeren -> Zielpart selektieren und "Zwischenspeichern" -> mittels Schleife jeden Body aus dem Array aufrufen und select, copy,paste Zur Veranschaulichung entsprechen unten im Script die Bodynamen im Zielpart dem "Pfad" durch die Struktur Die Materialinfo erlangst du über den Materialmanager (.GetItem("CATMatManagerVBExt")) Das Prinzip der Materialzuweisung erfolgt analog, allerdings nicht durch kopieren, sondern durch direkte Zuweisung. Soll heißen: auslesen des Materials des selektierten Bodies (.GetMaterialOnBody), im Array (welches du einfach mehrdimensional machst) zwischenbunkern und nach dem einfügen (kopieren) eines jeden Bodies im Zielpart das Material auf den Body zuweisen (.ApplyMaterialOnBody). Das ist im u.s. Script nicht enthalten, aber auch kein Problem (hab ich in einem anderen Zusammenhang schon mal so gemacht). Schwieriger wird es wenn die Materialinfo nicht im Body selbst liegt sonndern im Part. Ebenfalls abfangen solltest du den Fall, das gar kein Material vorhanden ist. Eine Massenberechnung deines Ergebinsparts wäre nicht korrekt, da CATIA bei nichtvorhandener Mat-Zuweisung die Dichte von Wasser zu grunde legt (1000) und damit ein Body (mit z.B. dem Volumen 1 Kubikdezimeter) ohne Material nicht nichts wiegt sondern 1 kg. Soll er nichts wiegen musst du ein Material mit einer Dichte von 0,0001 zuweisen (0 geht systembedingt nicht) Ebenfalls schwieriger wird es wenn du Bodies unterhalb der ersten Ebene auswählen willst. NoGo sind ebenfalls bestimmte Sonderzeichen in der Benennung der Products / Parts / Bodies, insbesondere dürfen keine Anführungszeichen " oder Ausrufezeichen ! oder Slashes / vorhanden sein, da dann die Referenzerzeugung (aufgrund der Nomenklatur) so nicht mehr funktioniert (in diesem Fall hilft temopäres Umbenennen) Und: Ein paar Errorhandlings sollten mit drin sein. Auf die Schnelle fällt mir dazu ein: Assembydesign muss es sein (im Partdesign fiunktioniert es nicht) usw. Selektion der Bodies kann erfolgen durch einzelnes selektieren mehrerer Bodies im Tree / 3D bei gedrückt gehaltener Str-Taste oder mittels Multiselektion (Fenster mit Maus im 3D aufziehen). Im VisualStudio (VB.net oder VB6) geht das ganze noch wesentlich schöner mit Eingabeaufforderungen über Forms. Hoffe das hilft dir weiter. Gruß TomTom Beispielcode für CATScript: Language="VBSCRIPT"
Sub CATMain() Set oRoot = Catia.ActiveDocument If TypeName(oRoot) <> "ProductDocument" Then MsgBox "Das aktive Dokument ist kein .CATProduct " & vbLf _ & "Abbruch. ", 16, " " & TypeName(oRoot) & " geöffnet." Exit Sub End If Catia.DisplayFileAlerts = False Set oRootProd = oRoot.Product If Catia.GetWorkbenchId <> "Assembly" Then MsgBox "Scriptausführung nur in der AssemblyDesignWorkbench möglich. " & vbLf & "Abbruch.", 16, " Aktive Workbench " & Catia.GetWorkbenchId Exit Sub End If Set oSelection = Catia.ActiveDocument.Selection Dim InputObjectType(0) Dim Status InputObjectType(0) = "Body" oSelection.Clear Status = oSelection.SelectElement3(InputObjectType, "**************** Bitte ein oder mehrere Bodies auswählen oder <ESC> drücken zum Abbrechen " & _ "****************", False, CATMultiSelTriggWhenUserValidatesSelection, False) If (Status <> "Normal") Then Exit Sub Else Dim aSelectedElements() ReDim aSelectedElements(0) iSelCounter = oSelection.Count Dim i As Integer For i = 1 To oSelection.Count Dim sRefString As String Set oSelElement = oSelection.Item(i).Value 'oSelection.Item(1).Value sRefString = "!" & oSelElement.Name Set oLeafProd = oSelection.Item(i).LeafProduct Set oParent = oLeafProd sRefString = oParent.Name & "/" & sRefString Do Set oParent = FUNC_PathToRoot(oParent) sRefString = oParent.Name & "/" & sRefString Loop Until LCase(oParent.Parent.Parent.Name) = "cnext" Dim bNotInBooleanOp As Boolean bNotInBooleanOp = FUNC_NotInBooleanOp(oSelElement, oLeafProd) If bNotInBooleanOp Then ReDim Preserve aSelectedElements(UBound(aSelectedElements) + 1) Set aSelectedElements(UBound(aSelectedElements)) = oRootProd.CreateReferenceFromName(sRefString) End If Next End If Dim InputObjectType2(0) InputObjectType2(0) = "Product" oSelection.Clear Status = oSelection.SelectElement2(InputObjectType2, "**************** Bitte das Zielpart auswählen oder <ESC> drücken zum Abbrechen " & _ "****************", False) If (Status <> "Normal") Then Exit Sub Else If oSelection.Count <> 1 Then MsgBox oSelection.Count & " Elemente selektiert. " & vbLf & "Abbruch.", 16, " Falsche Selektion." Exit Sub Else Set oZP = oSelection.Item(1).Value oSelection.Clear End If End If '--- Ziel-Part Dim j As Integer For j = 1 To UBound(aSelectedElements) Set oZPBodies = oZP.ReferenceProduct.Parent.Part.Bodies oSelection.Clear oSelection.Add aSelectedElements(j) oSelection.Copy oSelection.Clear oSelection.Add oZPBodies oSelection.PasteSpecial "CATPrtResultWithOutLink" oSelection.Clear oZP.Update Set oLastBody = oZPBodies.Item(oZPBodies.Count) aLastBodyName = Split(aSelectedElements(j).Displayname, "!") oLastBody.Name = aLastBodyName(0) & aLastBodyName(1) oZP.ReferenceProduct.Parent.Part.Update Next oSelection.Clear End Sub Function FUNC_PathToRoot(oProdOnWayToRoot) Set FUNC_PathToRoot = oProdOnWayToRoot.Parent.Parent End Function
Function FUNC_NotInBooleanOp(oSelectedElement, oSelProd) bIsInBoolOp = oSelectedElement.InBooleanOperation If bIsInBoolOp = 0 Then FUNC_NotInBooleanOp = True Else sBodyName = oSelectedElement.Name MsgBox oSelectedElement.Name & " im Part " & oSelProd.Name & vbLf _ & "wird nicht kopiert ", 16, " Body in boolscher Operation enthalten" FUNC_NotInBooleanOp = False End If End Function ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 31. Jan. 2014 editiert.] [Diese Nachricht wurde von tomtom1972 am 31. Jan. 2014 editiert.] [Diese Nachricht wurde von tomtom1972 am 31. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Erich Mitglied Senior Consultant selbstständig
Beiträge: 223 Registriert: 03.10.2000 i7-9850H RAM 32,0 GB Nvidia Quadro T2000 Windows 7 Professional 64Bit
|
erstellt am: 03. Feb. 2014 11:32 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hallo tomtom1972 Deine Hinweise haben alle funktioniert. Vielen Dank. Ein Tip bräuchte ich doch noch, d.h. das Material aus dem Ausgangspart zu holen, funktioniert. Im Zielpart auf den eingefuegten Body einzufuegen, fehlt mir die Logik? D.h. wie fasse ich den gerade eingfügten Body an? Anbei die Script-Sequenz: Set Ref = product1.CreateReferenceFromName(PathReferenz) Selection1.Clear Selection1.Add Ref 'Material holen Set oManager = oParent.GetItem("CATMatManagerVBExt") oManager.GetMaterialOnBody Body1, oMaterial ' Body kopieren Selection1.Copy Set PartDocZiel = partDocument1 Selection1.Clear Selection1.Add PartDocZiel.Part 'Body in Part pasten Selection1.PasteSpecial "CATPrtResultWithOutLink" 'Matertial zuordnen linkMode = 1 oManager.ApplyMaterialOnBody Body1,oMaterial,linkMode product1.update D.h. Body1 heisst er aus dem Ausgangspart und im Zielpart, wie komme ich dort an das Body-Object? ------------------ mfg Erich 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: 03. Feb. 2014 11:51 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
Hi, wie o.s. im Bsp-Script beschrieben. Der neu eingefügte ist immer der letzte. Eventuell ist jeweils ein Update davor notwendig. Code: Set oLastBody = oZPBodies.Item(oZPBodies.Count) Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Erich Mitglied Senior Consultant selbstständig
Beiträge: 223 Registriert: 03.10.2000 i7-9850H RAM 32,0 GB Nvidia Quadro T2000 Windows 7 Professional 64Bit
|
erstellt am: 03. Feb. 2014 15:23 <-- editieren / zitieren --> Unities abgeben: Nur für Michel EF
|