| |
| KISTERS 3DViewStation: Mit Modellbasiertem Design zum Modellbasierten Unternehmen , eine Pressemitteilung
|
Autor
|
Thema: Copy & Paste (7484 mal gelesen)
|
Makronizer Mitglied Dipl.-Ing Maschinenbau-Integrierte Produktentwicklung
Beiträge: 51 Registriert: 15.09.2009
|
erstellt am: 13. Nov. 2009 11:38 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Makrogemeinde, ich habe mal wieder ein Problem, wo ich ohne eure Hilfe nicht weiterkomme... Randinformationen: Ich habe ein Makro geschrieben, welches über eine erste Selektionen den Namen eines Bodies ausliest, diesen Namen in einer zweiten Multiselektion sucht, diese gesuchten Bodies kopiert und in ein Part (dritte selektion) in einen gewünschten Körper (4te Selektion) über AddNewAdd mit "As Result" einfügt. Dies funktioniert wunderbar, solang es sich um unterschiedliche Normteile handelt. Ziel ist es allerdings auch aus gleichen Normteilen (x-mal mit Copy Paste eingefügt, unterscheidet sich also im Namen nur durch die .x im Instance Name) die Bodies zu kopieren. Und dies funktioniert nicht. Sind die Part Namen gleich, so fügt er zwar die Bodies hinzu, die Referenz ist allerdings immer das gleiche Part, bei Normteilen bedeutet dies, das die Position nicht die gleiche ist. Ich hoffe, ich konnte dies einigermaßen gut erklären. Ich möchte also auf den Instance Name inklusive des .x zugreifen um die richtige Referenz zu bekommen, habe leider im Watch-Fenster keine Informationen darüber gefunden. Irgendwelche Ideen? Code:
Set oactivePart = abodies(i).Parent.Parent <--- der Name dieses Parent ist bei mehrfach eingefügten Normteilen immer gleich, das heißt er aktiviert beliebig ein Part und kopiert den richtigen Körper aus dem falschen Part, bzw mit der falschen Position! Brauche daher den Zugriff auf das richtige Part
[Diese Nachricht wurde von Makronizer am 13. Nov. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pittyplatsh Mitglied
Beiträge: 62 Registriert: 27.12.2008 CATIA V5 R16 SP3
|
erstellt am: 14. Nov. 2009 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Ich würde sagen dass der Code zu wenig ist um zu sagen wo es klemmt. Ein möglichen fehler würde ich in den Selektionen vermuten. Poste bitte mal den gesamten Block von Selektion bis Einfügen der Parts. Liebe Grüße, pitty Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Makronizer Mitglied Dipl.-Ing Maschinenbau-Integrierte Produktentwicklung
Beiträge: 51 Registriert: 15.09.2009
|
erstellt am: 16. Nov. 2009 11:02 <-- editieren / zitieren --> Unities abgeben:
Die Selektionen funktionieren ja. Das Problem liegt in der Aktivierung des Parts, wo der Körper herauskopiert werden soll. Hier wird scheinbar nach zufallsprinzip ein Part aktiviert, da die Normteile ja alle die gleiche PartNumber besitzen. ich poste mal den kompletten Code des Makros. Bin für jede Hilfe dankbar. Set activedoc = CATIA.ActiveDocument If Err.Number <> 0 Then MsgBox "Es ist kein Dokument geöffnet", 16, makroname + " " + Version Exit Sub End If If (Right(activedoc.Name, 10) <> "CATProduct") Then MsgBox "Aktives Dokument ist keine Baugruppe", 16, makroname + " " + Version Exit Sub End If
' Selektion definieren -------------------------------------------------------------- ' Auswahl festlegen ---------------------------------------------------------- Dim selElements(0) selElements(0) = "Part" 'ZielPart angeben ------------------------------------------------------------ Dim selElements3(0) selElements3(0) = "Body" ' Selektion definieren und leeren -------------------------------------------- Dim userSel3 As Object Set userSel3 = CATIA.ActiveDocument.Selection userSel3.Clear 'Selektion vornehmen lassen ------------------------------------------------- Dim G As String G = userSel3.SelectElement2(selElements3, "Referenz-Publikation wählen.", True) Dim oSelElem3 As SelectedElement Set oSelElem3 = CATIA.ActiveDocument.Selection.Item(1) Dim searchString1 As String searchString1 = oSelElem3.Value.Name ' Selektion der Parts, in denen String gesucht und selektiert werden soll ------------------- Set onormteil_window = CATIA.ActiveWindow Dim abodies() ReDim abodies(0) Dim awindowfilter(1) awindowfilter(0) = "Part" awindowfilter(1) = "Product" Set oSel = CATIA.ActiveDocument.Selection ibody = 1 t = 1 Do oSel.Clear sstatus = oSel.SelectElement2(awindowfilter, "Selektieren Part " & ibody & " zum weiterkopieren (ESC um weiter zu machen)", True) ibody = ibody + 1 t = t + 1 If sstatus <> "Normal" Then Exit Do End If Dim oSelElem2 As SelectedElement Set oSelElem2 = CATIA.ActiveDocument.Selection.Item(1) Dim foundString1 As Object Set foundString1 = oSelElem2.Value.Bodies.GetItem(searchString1) Dim bbodies Set abodies(UBound(abodies)) = foundString1 ReDim Preserve abodies(UBound(abodies) + 1) 'osel.Clear 'osel.Add obody 'osel.Copy Loop Set oSel = CATIA.ActiveDocument.Selection oSel.Clear Dim aparts(10, 10)
Dim awindowfilter4(1) awindowfilter4(1) = "Product" awindowfilter4(0) = "Part" Dim anumber_of_parts() On Error Resume Next ReDim anumber_of_parts(UBound(abodies) - 1) If Err.Number <> 0 Then Exit Sub End If On Error GoTo 0 weiter_selektieren = "Ja" oSel.Clear n = 0 For n = 0 To UBound(abodies) - 1 i = 1 If n = 1 Then Msg = "Sie haben mehrere Körper zum Verteilen selektiert." & vbCr & "" & vbCr & "Möchten Sie alle Korrekturkörper in die soeben selektierten Parts kopieren ?" & vbCr & "" & vbCr & "Bei Selektion von NEIN können für die weiteren Korrekturkörper erneut Zielparts selektiert werden." & vbCr & "" Select Case MsgBox(Msg, vbQuestion Or vbYesNo, "Körper verteilen") Case vbYes ' Ja weiter_selektieren = "Nein" Case vbNo ' Nein weiter_selektieren = "Ja" End Select End If If weiter_selektieren = "Nein" Then For t = 0 To anumber_of_parts(n - 1) - 1 Set aparts(n, t) = aparts(n - 1, t) anumber_of_parts(n) = anumber_of_parts(n - 1) Next Else MsgBox "Parts für den Körper " & abodies(n).Name & " werden selektiert." oSel.Clear X = 1 For X = 1 To 50 Err.Clear On Error Resume Next oSel.Clear sstatus = oSel.SelectElement2(awindowfilter4, "Selektieren Sie das Zielpart " & i & " in welchen der Körper " & abodies(n).Name & " kopiert werden soll. (ESC um weiter zu machen)", True) If Err.Number <> 0 Then oSel.Clear sstatus = oSel.SelectElement2(awindowfilter4, "Selektieren Sie das Zielpart " & i & " in welchen der Körper " & abodies(n).Name & " kopiert werden soll. (ESC um weiter zu machen)", True) End If On Error GoTo 0 Err.Clear If sstatus = "Cancel" Then oSel.Clear anumber_of_parts(n) = i - 1 Exit For Else Set otmpobject = oSel.Item(1).Value sseltype = TypeName(otmpobject) If sseltype = "Product" Then otmpobject.ApplyWorkMode DESIGN_MODE 'Check if it a Part On Error Resume Next Err.Clear Set otester = otmpobject.ReferenceProduct.Parent.Part If Err.Number = 0 Then Set otmpobject = otester i = i + 1 Set aparts(n, i - 2) = otmpobject Else Dim sdMsg As String sdMsg = "Sie haben kein Teil selektiert sondern eine Baugruppe." MsgBox sdMsg, vbExclamation Or vbOKOnly, "Selektion" End If On Error GoTo 0 Else i = i + 1 Set aparts(n, i - 2) = otmpobject End If End If Next End If Next Dim selElements4(0) selElements4(0) = "Body" ' Selektion definieren und leeren -------------------------------------------- Dim userSel5 As Object Set userSel5 = CATIA.ActiveDocument.Selection userSel5.Clear 'Selektion vornehmen lassen ------------------------------------------------- Dim H As String H = userSel5.SelectElement2(selElements4, "übergeordneten Body bestimmen....", True) Dim oSelElem4 As SelectedElement Set oSelElem4 = CATIA.ActiveDocument.Selection.Item(1) Dim searchString2 As String searchString2 = oSelElem4.Value.Name For i = 0 To UBound(abodies) - 1 oSel.Clear onormteil_window.Activate oSel.Add abodies(i) '-------------------------Publikation von Solidkoerper hinzufügen, falls nicht vorhanden -------------------------------- Set oactivePart = abodies(i).Parent.Parent sSolidname = abodies(i).Name Set opartDocument = CATIA.ActiveDocument Set product1 = oactivePart.Parent.Product.ReferenceProduct Set publications1 = product1.Publications Err.Clear On Error Resume Next Set reference1 = product1.CreateReferenceFromName(oactivePart.Name & "/!" & sSolidname) Set publication1 = publications1.Add(sSolidname) publications1.SetDirect sSolidname, reference1 On Error GoTo 0 '-------------------------------------- oSel.Copy For n = 0 To anumber_of_parts(i) - 1 Set oPart = aparts(i, n) On Error Resume Next On Error GoTo 0 Set oSel = CATIA.ActiveDocument.Selection oSel.Clear oSel.Add oPart oSel.PasteSpecial "CATPrtResult" Set obody = oPart.Bodies.Item(oPart.Bodies.Count) oPart.InWorkObject = oSelElem4.Value Set newadd = oPart.ShapeFactory.AddNewAdd(obody) obody.Name = Replace(obody.Name, "Result of ", "") newadd.Name = obody.Name oPart.InWorkObject = oPart.Bodies.Item(searchString2) On Error Resume Next oPart.Update Next Next End Sub Bitte beachten, bei der Zielpart wahl sind mehrere Selektionen noch nicht möglich. Und der filter "Produkt" funktioniert noch nicht, wollte darüber versuchen das richtige Part anzusteuern, leider bisher erfolglos. Das Makro funktioniert, für solche, die keine Parts mit Copy-Paste mehrfach im Produkt haben. (unterschiedliche Part-Namen) [Diese Nachricht wurde von Makronizer am 16. Nov. 2009 editiert.] 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: 16. Nov. 2009 12:37 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
|
Makronizer Mitglied Dipl.-Ing Maschinenbau-Integrierte Produktentwicklung
Beiträge: 51 Registriert: 15.09.2009
|
erstellt am: 16. Nov. 2009 13:02 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die schnelle Antwort, versuche mich durch den Baum durchzuhangeln. Ich hoffe, ich verstehe die im obigen Beitrag beschriebene Vorgehensweise. Bezweifele es jedoch, da ich noch nicht über so viel Programmier-Erfahrung verfüge. Die Idee erschien mir gut, nur hapert es mal wieder an der Ausführung. Versuche es jedoch weiter. Gruß Makronizer Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Makronizer Mitglied Dipl.-Ing Maschinenbau-Integrierte Produktentwicklung
Beiträge: 51 Registriert: 15.09.2009
|
erstellt am: 17. Nov. 2009 08:06 <-- editieren / zitieren --> Unities abgeben:
Wenn ich den Beitrag richtig verstehe, dann gehe ich die Struktur durch und deaktiviere die Nodes, aktiviere dann die jeweiligen Parts neu (bei copy Paste 2 Parts) und initiiere dann das Copy&Paste, in dem ich den richtigen Körper und das Part aus der Selektion (bzw Array) herauspicke. Hab ich das soweit richtig verstanden? Könntest Du mir vllt mit nem Bruchstück deines Codes auf die Sprünge helfen? Ich drehe mich seit Tagen im Kreis und da dies ja bekanntlich nicht besonders produktiv ist, werde ich das ganze wohl erstmal aufschieben. Ärgerlich bloss, da es dann das erste Problem in meiner jungen Programmierkarriere wäre, welches ich nicht gelöst habe... schlecht fürs Ego. Gruß Thomas alias Makronizer 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: 19. Nov. 2009 06:24 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
|
Makronizer Mitglied Dipl.-Ing Maschinenbau-Integrierte Produktentwicklung
Beiträge: 51 Registriert: 15.09.2009
|
erstellt am: 19. Nov. 2009 07:39 <-- editieren / zitieren --> Unities abgeben:
Moin Moin TomTom ja, das Problem ist mir klar. Habe aber bisher keine Lösung gefunden. Habe verschiedene Dinge ausprobiert. Habe bisher nicht mit einem Array gearbeitet und weiß daher nicht, wie ich die Information des Pfades des Bodies innerhalb der Struktur abspeichere. Das ist der einzige Punkt der mir noch fehlt. Ansonsten funktioniert das Makro ja, mal davon abgesehen, das es sicherlich noch "schöner" gestaltet werden kann. Schmeiße aber nie das Handtuch, es liegt nur auf eis und ich hoffe, dass ich nach einigen weiteren Makros das Problem lösen kann. Ausgebremst hat mich die Tatsache das ein bekannter OEM angefangen mit M und reimt sich auf ercedes für genau den gleichen anwendungsfall ein Hilfspart benutzt (NTI). Bin aber immernoch der Meinung, das es auch so gehen kann (du sagtest ja bereits, das du dich da eingehend mit bechäftigt hast und bist gleicher meinung). Nur wie heißt es so schön im "Kochbuch"? Wenn man sich Tage mit ein und dem selben Problem rumschlägt muss man es auch irgendwann gut sein lassen. (oder so ähnlich) Gruß und frohes Schaffen Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
V5Playaz Mitglied Dipl.-Ing (BA)
Beiträge: 447 Registriert: 12.07.2005 DELL PRECISION 390 3,25 GB RAM WIN XP PRO SP2 CATIA V5 R16-19 Delmia V5 R19 VB6, VB2008 Adobe Acrobat 9 Pro Extended
|
erstellt am: 26. Mrz. 2010 07:39 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo Thomas, besteht das Problem mit der Referenz bei gleichnamigen Bodies? Hast du schon mal versucht die Bodies umzubenennen (automatisch per Schleife)? Ich hatte nämlich ein ähnliches Problem mit gleichnamigen Solids. Grüsse Dominik 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: 26. Mrz. 2010 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo, das Problem besteht beim Kopieren von Bodies aus einer Struktur, in welcher mehrere Instanzen eines Parts zueinander verschoben verbaut sind: Nach dem Paste ist die Lage falsch. Das Umbenenennen der Bodies hilf gar nichts, da dies in jeder Intanz des Parts erfolt. Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 26. Mrz. 2010 19:03 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo alle zusammen, wenn ich euch richtig verstanden habe, habe ich ein ähnliche Problem. wie in meinem thread -> http://ww3.cad.de/foren/ubb/Forum137/HTML/003831.shtml beschrieben, versuche ich auch körper zu kopieren. Ich habe festgestellt, das es einen Unterschied macht, welche Ebene aktiv ist (Im Catiabaum Blau hinterlegt). Dazu ein beispiel: Ich verwende für alle drei fälle den gleichen Code:
Code: sendepart.Parent.Activate Set sel1 = CATIA.ActiveDocument.Selection sel1.Clear Dim i i = 1 For i = 1 To pubs.Count If ListView1.ListItems(i).Checked = True Then sel1.Add veroeff(i).Valuation End If Next sel1.Copy sel1.Clear Set sel2 = Dokument.Selection sel2.Clear sel2.Add empfaengerpart empfaengerpart.sel2.PasteSpecial "CATPrtResult" empfaengerpart.Update
Nun zu den Unterschieden: Fall1: Siehe Anhang Die oberste Produktebene ist aktiv(WorkbenchID "Assembly"). Der Code kopiert mir den Körper Cop1 von Part1 in Part3. Soweit alles OK ! Fall2: Siehe Anhang Die Instanz des Parts, aus dem Kopiert wird ist aktiv(WorkbenchID "Assembly"). Der Code kopiert mir den Körper Cop1 von Part1 in Part3, aber dieses mal im Kontext, wie eigentlich von mir gewollt! Fall3: Siehe Anhang Irgendein Part ist aktiv (WorkbenchID"Prtcfg"). Der Code bricht mit einer Fehlermeldung an der Zeile. Fazit: Es macht einen Unterschied welche Ebene im Catia aktiv ist. Wenn wie im Fall 3 das Part, aus dem kopiert wird, aktiv ist, kann ich durch einen Workbenchwelchsel (CATIA.StartWorkbench "Assembly") die richtige Ebene aktivieren. In denn anderen Fällen habe ich keine Chance. Sind meine annahmen richtig? Ich hoffe diese Erkenntnis bringt uns irgendwie weiter. Weiss jemand eine Antwort?
viel Glück Lars [Diese Nachricht wurde von INLU am 26. Mrz. 2010 editiert.] 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: 29. Mrz. 2010 07:25 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Moin, Es ist richtig, das du für das CopyPaste per Script in der Assembly Design Workbench sein musst; ansonsten erzeugst du einen Error. Darüber hinaus hat das o.a. Problem überhaupt nichts damit zu tun, welche Produkt-Ebene aktiv ist. Zum Nachvollziehen: Erstelle dir ein Product, füge ein Part (mit Volumen-Geometrie) zu und instanziiere es zum Beispiel 3x mit jeweils 100 mm Verschiebung. Versuche nun per Script alle Volumen in ein neues Part zu kopieren (also ein ALLCATPart zu erstellen). Sehr wahrscheinlich werden alle vier Volumen-Geometrien letztendlich die gleiche Transformation haben , sprich: sie liegen auf der selben Stelle. Ohne große Verschachtelungs-Tiefen in der Struktur, in welcher unterschiedliche Ebenen aktiv sein könnten. Der Grund: wenn du einfach in der Product-Struktur über z.B. das Catia.ActiveDocument.Product.Products.Item(1).ReferenceProduct.Parent zur "Geometrie" und damit ins Dokument (.Part) wechselst geht die Transformation flöten. Ausser du gehst wie o.b. mit der Deaktivierung der Knoten vor. Oder: anstatt die Geometrie selbst der Selektion zuzufügen (.Add) erzeugst du jeweils nur eine Referenz und fügst diese in die Selektion. Dies geschieht übers .CreateReferenceFromName (analog der Referenzen z.B. bei der Constraint-Erzeugung). Da die Referenz den "Pfad" in der Struktur enthält (Product1/Part1.4 ......) wird jeweils die Geometrie der korrekten Instanz (mit korrekter Transformation) kopiert. Das geht wesentlich schneller als mit der Inaktiviererei der Knoten, ist von Code her aber anspruchsvoller. Gruß TomTom ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 29. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
die-schwaben Mitglied
Beiträge: 2 Registriert: 11.04.2010
|
erstellt am: 11. Apr. 2010 08:05 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo Makronizer, hast du dein Problem mit dem Kopieren gelöst? Ich habe dasselbe Prob. Mein Macro soll nach einer Publication fragen, das es kopieren soll, und anschließend das Part oder Product wo es diese Publicationen in einen Body kopiert. Anschließend muß es jede Publication aus den einzelnen Instanzen kopieren und in den Body einfügen. Dies muß aber nacheinander erfolgen, da ein Multiselekt der einzelnen Publicationen dazu führt, dass nur eine Publication kopiert wird. Vieleicht kann mir hier das Forum helfen. Grüße Alfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Ehrenmitglied V.I.P. h.c. Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 11. Apr. 2010 08:17 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
|
die-schwaben Mitglied
Beiträge: 2 Registriert: 11.04.2010
|
erstellt am: 11. Apr. 2010 11:32 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo Daniel, danke für deine schnelle Antwort. Ich habe folgende Ausgangssituation. In einem Product sind ein oder mehrere Parts mehrfach eingebaut, also Partname gleich, aber unterschiedliche Instanznames. Diese Parts sind dann auf verschiedene Achsen constraint, und erhalten so ihre Position in der Konstruktion. In diesen Parts sind mehrere Bodies erzeugt, die publiziert sind. Diese Publications müssen kopiert und in einen Body eingefügt werden. Nun könnte man ja diese Publications der einzelnen Instanzen multiselektieren und dann auf einmal in einen Body einfügen, geht aber nicht, da sie ja alle gleich heißen. Sie kommen ja auch aus einem Part. Das ist eben die mühselige Arbeit, die Zeit kostet. Nun möchte ich ein Macro schreiben, das folgendes tut. Es soll als erstes nach der oder den Publications fragen, die kopiert werden sollen, dannach die Selektion abschließen, und dann nach dem Part fragen, in dem die Publications in einen Body eingefügt werden. Dieses Part liegt aber einem anderen Product, als die Publication. Den Body soll es natürlich auch erzeugen. Ich hoffe, es war verständlich und du hast mir eine Lösung. Grüße Alfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 25. Sep. 2010 15:32 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo TomTom1972, ich versuche das problem wieder anzugehen. Ich habe deinen vorschlag ausprobiert. Dabei habe ich folgendes festgestellt: Wenn ich die Publication über Publications.Valuation anspreche, habe ich eine Reference! Trotzdem habe ich das Problem, das er mir die Publication nicht im Kontext kopiert. Ausser ich habe Fall 2, den ich im vorherigen thread angesprochen habe . Es muss doch möglich sein eine Publication im Kontext zu kopieren! Oder ist das so geheim?? mfg Lars Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 25. Sep. 2010 18:58 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo Lars, für das kopieren aus verschiedenen Instanzen eines Parts kann ich auch eine andere Vorgehensweise vorschlagen. Die Bedingung hierzu ist, dass du die Instanznamen der Quellen wissen musst. Ich habe es noch nie so verwendet, dass ich ein Body von der User selektieren ließ, für das Erstellen eines AllCATParts funktioniert es aber einwandfrei. Der Trick bei der Sache ist, dass du ganz eindeutig auf eine Body in einen Instanz zugreifen kannst, wenn du den Pfad dafür zusammenstellst und den Reference zum Kopieren über CreateReferenceFromName erzeugst. Über die Zusammenstellung des Pfades ist hier ein Beitrag. Sagen wir, du hast +Root +Product A.1 +Part A.1 +Part A.2 und in "Part A" ein Body Namens "ZuKopierendeBody", dann lautet dein Pfad "Root/Product A.2/Part A.2/!ZuKopierendeBody". Für mein Arbeitgeber habe ich ein kleines Makro geschrieben, was eine komplette Baugruppe kopiert und transformiert. Dabei habe ich das kopieren der Bodies wie eben beschrieben gelöst. Bei Geometrical sets kann der Teil hinter "/!" etwas komplexer aussehen, hier hilft aber der Makrorekorder. Ich setze normalerweise Constraints und zeichne dieses Prozess auf, da ist der Pfad enthalten. Ich hoffe, das bringt zumindest einige Leser weiter. Gruß, Z. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 26. Sep. 2010 10:46 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo Zoltan, danke für die Antwort. Interessanter Ansatz. Eigentlich arbeite ich ganz ungern mit Elementnamen, da sie ja mehrmals vorkommen können. In diesen Fall, arbeite ich aber mit Publicationen, deren Name ja eindeutig ist. Ich werdes es mal ausprobieren. mfg Lars 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: 27. Sep. 2010 13:22 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo INLU, mit den Namen der Publikationen geht es definitiv nicht, du musst so vorgehen, wie Zoltan es beschrieben hat. Du musst nicht mit hardgecodeten Strings abeiten (die z.B. der Makrorekorder aufzeichnet), sondern kannst diese während der Laufzeit (deines Scripts) über die Objektnamen erzeugen. Die verwendete Methode (.CreateReferenceFromName) ist die einzige Art der Referenzerzeugung, die in Strunkturen mit Instanzen eindeutig ist. Die gleichen Elementnamen können gar nicht vorliegen, da CATIA das beim Erzeugen nicht zulässt. Du kannst z.B. in einem Geo.Set nicht zwei Punkte mit Namen Point.1 erzeugen. In der Referenz ist der "Pfad" innerhalb des Parts mit "abgelegt". Die Kopiererei funktioniert dann fehlerfrei. Gruß TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 30. Sep. 2010 10:43 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo tomtom, selbstverständlich kann es zwei Elemente in einem geometrischen Set mit dem gleichen Namen geben. Dafür gibt es sogar in den Tools Optionen -Infrastruktur - Teileinfrastruktur eine Einstellung. Daher habe ich schon damit ein Problem, wenn Elemente den gleichen Namen haben. Wenn man eine Reference über GetReferencefromObject erzeugt, ist das etwas anderes? Das war mir nicht klar. mfg Lars Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 30. Sep. 2010 21:26 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
|
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: 01. Okt. 2010 08:09 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo INLU, das kannst du zwar tun (die Elemente umbenennen, so das sie die gleichen Namen haben), CATIA interessiert sich aber für deine Umbenennerei nicht unbedingt. Das kannst du mal wie folgt ausprobieren: Öffne ein neues, leeres Product (PRODUCT1). Füge zwei Unterschiedliche, leere Parts ein (PART1 und PART2) und erzeuge in jedem einen Punkt, der heißt dann jeweils einfach Point.1. Jetzt startest du den Makrorekorder und erzeugst einen Coincidence Constraint zwischen den zwei Punkten. Makrorekorder anhalten. Wenn du den Constraint löscht und das aufgezeichnete Script ablaufen lässt, wird der Constraint wieder erzeugt. Soweit, so gut. Lösche den Constraint wieder, geh' ins erste Part und benenne deinen ersten Punkt Point.1 in Point.2 um. Erzeuge noch einen neuen, der heisst dann Point.3 und benenne den in Point.1 um. Jetzt gehst du wieder ins Product und führst das Script aus. Und jetzt schau mal nach, worauf dein neu erzeugter Constraint geht. Nicht auf Point.1 sondern auf Point.2, der mal Point.1 war. Obwohl im Script Point.1 steht. Wenn du im Constraint Definition Menü (den Constraint im Baum doppelklicken, Menü über More aufklappen) den Punkt selektierst und den Mauszeiger auf dem blau unterlegten Feld stehen lässt zeigt CATIA den Pfad zum Punkt an: PRODUCT1/PART1.1/PART1/Geometrical Set.1/Point.2 Hmmmm. Und was sagt uns das jetzt? CATIA arbeitet bei der Referenzerstellung mittels .CreateReferenceFromName teilweise mit den InternalNames (wie Zoltan schon vermutet hat) und die kannst du nicht umbenenennen. An den InternalName (eines jeden CATIA-Objects) kommst über die Methode .GetItem("ModelElement"), also z.B. Set oModelElement = oObject.GetItem("ModelElement") sInternalName = oModelElement.InternalName oObject ist z.B. dein Point.1 Hierbei handelt es sich um eine nicht Dokumentierte Methode, d.h. du findest nichts in der Doku. Lediglich im Objektkatalog in der Klasse CATIAModelElement. Und in ein paar beiträgen hier im Forum. Aber weils sonst zu einfach wäre: der InternalName (IN) eines Punktes hat z.B. den Präfix GSM, heißt also GSMPoint.1, für die Referenzerzeugung (RE) darst du "GSM" nicht mitbenutzen. Der IN eines Geometrical Sets wiederum hat keinen Präfix, der weggelassen werden muss, er heißt z.B. Open_body.1 (so hiessen die Dinger mal vor der R10 oder so), d.h. für die RE verwendet man den kompletten Namen. Für Bodies ist es wieder anders. Erzeugst du eine Referenz über .GetReferencefromObject, so kannst du dir das wie folgt vorstellen: du wechselst aus der Instanz eines Parts über das .ReferenceProduct.Parent ins Dokument, dieses gehört zu den CATIA.Documents.Item(n) (Document-Container). Hier sind die Infos der ürsprünglichen Instanz nicht mehr verfügbar, beim angesprochenen Problemfall waren das mehrere Instanzen eines Parts transformiert, d.h. verschoben in einem Product verbaut. CATIA nimmt dann beim Kopieren im Kontext immer die Transformation vom ersten Part (im Baum) des Products. Alle Referenzen in Strukturen (mit Instanzen) funktionieren nur über den Namen (Constraints etc.). Siehe auch Doku. Hoffe das bringt ein wenig Licht ins Dunkel. Gruß & einen schönen Tag TomTom ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 01. Okt. 2010 editiert.] [Diese Nachricht wurde von tomtom1972 am 01. Okt. 2010 editiert.] [Diese Nachricht wurde von tomtom1972 am 01. Okt. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 01. Okt. 2010 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo Zoltan, Hallo tomtom, danke für Eure Antworten. @Zoltan: Die Option, dass ein Elementname nur einmal verwendet werden darf, ist für mich keine Option, da sich in meinen Konstruktion die Namen sehr oft wiederholen. @tomtom: <Überrascht guckend> Du hast Recht Ist mir noch gar nicht aufgefallen. Dann ist der Weg über den Internen Namen ja eine sehr gute Lösung! So, ich hoffe, dass ich nun mein Kopiermacro fertig bekomme. Danke Euch Thx noch einmal für alle Helfer. Ich hoffe, mahl etwas zurück geben zu können!
mfg Lars Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 01. Okt. 2010 18:33 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo, ist eine erfreuliche Überraschung, dass InternalName jetzt auch für GSM Objekte funktioniert. Mein Wissenstand bisher war, dass es hierfür nur bedingt einsetzbar ist. Das Öffnet natürlich neue Möglichkeiten... Danke tomtom! Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
alfquattro Mitglied Konstrukteur
Beiträge: 6 Registriert: 03.10.2010 Windows 7 Catia V5R19 SP6 64bit
|
erstellt am: 03. Okt. 2010 00:53 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo TomTom, ich versuche auch gerade wie meine Vorgänger im product unter Beibehaltung der Constraints Körper von einem Part in einderes zu kopieren. So wie ich das verstanden habe muss dass was ich kopieren möchte den "kompletten Pfad" aufweisen. Ich bin soweit gekommen, dass ich den InternalName wie in eurem posting beschrieben von meinem zu kopierenden Körper erzeugt habe. Jetzt komme ich aber nicht weiter. Ein paar Zeilen Code wären ganz schön um zu sehen, was jetzt zu tun ist um die richtige Selektion hinzubekommen. Vielen Dank alfquattro
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 03. Okt. 2010 10:22 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo alfquattro, hier ein Teil meiner Lösung. Allerdings verwende ich eine Selektion auf veröffentlichte Elemente, also ohne ModelElement Namen. Aber der Weg dahin müßte der Gleiche sein.
Code:
Schnipp------ 'referenz für das Element das kopiertr werden soll Set oselroot = selektion.Item(1).LeafProduct ' LeafProduct funktioniert nur mit einer selektion!! sRefpfad = oselroot.Name Set oProduct = oselroot Do Set oProduct = oProduct.Parent.Parent sRefpfad = oProduct.Name & "/" & sRefpfad Loop Until oProduct Is CATIA.ActiveDocument.Product selektion.Clear Schnapp---- Schnipp---- 'referenz für empfangspartpfad zusammensetzen eRefpfad = selektion.Item(1).LeafProduct.Name Set oProduct = selektion.Item(1).LeafProduct Do Set oProduct = oProduct.Parent.Parent eRefpfad = oProduct.Name & "/" & eRefpfad Loop Until oProduct Is CATIA.ActiveDocument.Product Schnapp---- Schnipp---- 'Hier werden die Elemente in eine neue selektion eingefügt und in das Zielpart kopiert Set sel1 = CATIA.ActiveDocument.Selection sel1.Clear Dim i i = 1 For i = 1 To pubs.Count If ListView1.ListItems(i).Checked = True Then Dim copref As Reference sRefpfad = sRefpfad & "/!" & veroeff(i).Name Set copref = CATIA.ActiveDocument.Product.CreateReferenceFromName(sRefpfad) sel1.Add copref End If Next sel1.Copy sel1.Clear If CheckBox_kont.Value = True Then Set sel2 = dokument.Selection sel2.Clear Set copref = CATIA.ActiveDocument.Product.CreateReferenceFromName(eRefpfad & "/!" & empfaengerpart.Bodies.Item(1).Name) sel2.Add copref sel2.PasteSpecial "CATPrtResult" empfaengerpart.update Schnapp---- Ich hoffe, das hilft dir weiter. mfg Lars
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
alfquattro Mitglied Konstrukteur
Beiträge: 6 Registriert: 03.10.2010 Windows 7 Catia V5R19 SP6 64bit
|
erstellt am: 03. Okt. 2010 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo Lars, vielen Dank für Deine Antwort. Das ist genau das was ich gebraucht habe. Wie es funktioniert kann ich aus deinem Code gut erkennen. Leider beschäftige ich mich nur gelegentlich mit der Makroprogrammierung unter V5, so dass ich noch ein kleines Problemchen mit deinem Code habe. Ich vermute dass die "selektion" bei Dir wie folgt definiert ist: Set selektion = CATIA.ActiveDocument.Selection Leider kommt es bei mir dann immer zu einer Fehlermeldung (Das Verfahren Item ist fehlgeschlagen) in der Zeile: Set oselroot = selektion.Item(1).LeafProduct Ich vermute, dass das etwas mit dem aktiven Catia Dokument zu tun hat. Ich habe im catia ein Produkt auf, dass zwei Parts enthält, dass Quelldokument und das Zieldokument. Über: Quelldok.Parent.Activate oder Zieldok.Parent.Activate aktiviere ich entweder das eine oder andere Dokument. Aber wenn ich auch die Aktivierung des Dokuments weglasse bekomme ich die Fehlermeldung, egal ob ich im catia das Fenster mit dem Produkt aufhabe oder eines der parts. Ich hoffe Ihr könnt aus meiner Beschreibung erkennen was ich noch falsch mache. Vielen Dank alfquattro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 03. Okt. 2010 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo alfquattro, füge mal die Selektion zur Watchliste hinzu, und gucke, ob dort überhaupt ein Element drin ist. Hört sich für mich so an , als wäre sie leer. Das mit dem Quelldok.Parent.Activate oder Zieldok.Parent.Activate funktioniert so leider nicht. Es ist meines Wissens nach nicht möglich, die Aktivität eines Parts oder Produktes zu beeinflussen (Ich meine das Blau hinterlegte Element im Catiabaum). Man kann höchstens durch einen Workbenchwechsel erreichen, dass man bei einem aktiven Parts, in das Assembly-Design wechselt. mfg Lars P.S.: Das kopieren funktioniert anscheinend nur, wenn das Assembly-Design aktiv ist. Die passende Fehlermeldung kommt aber erst, wenn du die selektion kopieren willst. Dann musst du einfach den Workbench wechseln! [Diese Nachricht wurde von INLU am 03. Okt. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
alfquattro Mitglied Konstrukteur
Beiträge: 6 Registriert: 03.10.2010 Windows 7 Catia V5R19 SP6 64bit
|
erstellt am: 03. Okt. 2010 17:08 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo, Das war natürlich mein Fehler. Du hattest Recht es war gar nichts selektiert. Nachdem ich im Baum ein beliebiges Element meines Quelldokumentes selektiert hatte, funktionierte dein Code wunderbar. Wenn ich mir den srefpfad anschaue, sehe ich den Pfad root-producht/Instanzname_UnterProduct/Instanzname_Quellpart. Ich wollte aber nichts selektieren, das makro soll eine x beliebige Anzahl an Parts in einem bestimmten Product abarbeiten und dabei die publizierten Körper in ein Zielpart mittels boolscher Operation einbauen. Vereinfacht gesagt sieht die Struktur so aus: root_Product Zielpart (Zielpart_Instanz) Quell_Product (Quell_Product_Instanz) Quelldok_1(Quelldok_1) Quelldok_2(Quelldok_2) Quelldok_2(Quelldok_2.1) Soweit so gut. Ich habe den code zum testen wie folgt angepasst:
Set MeineGeo = Quelldok.FindObjectByName("Hauptkörper") Set selektion = CATIA.ActiveDocument.Selection selektion.Clear selektion.Add MeineGeo Set oselroot = selektion.Item(1).LeafProduct ..... Das ganze in eine Schleife gepackt damit für jedes Quelldok der srefpfad angezeigt wird. Das funktiniert jetzt ohne dass ich etwas im catia Baum selektieren muss. Aber bei dem Quelldok_2, dass mehrfach verbaut ist, wird im srefpfad immer der Instanzname des zuletzt eingebauten Quelldoks ausgegeben. Mit anderen Worten der srefpfad für Quelldok_2(Quelldok_2) und Quelldok_2(Quelldok_2.1) ist identisch und lautet: root_Product/Quell_Product_Instanz/Quelldok_2.1 Wenn ich mit der Selektion gearbeitet habe wie in deinem code ursprünglich vorgesehen, gibt das makro bei entsprechender Selektion auch den korrekten srefpfad mit .../Quelldok_2 zwei aus. Was kann man tun um ohne Selektion im Baum für das erst verbaute Quelldok_2 den korrekten Instanznamen angezeigt zu bekommen? Nochmals vielen vielen Dank, ohne Deine Hilfe wäre ich wahrscheinlich in Wochen noch nicht so weit gewesen alfquattro
[Diese Nachricht wurde von alfquattro am 03. Okt. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
alfquattro Mitglied Konstrukteur
Beiträge: 6 Registriert: 03.10.2010 Windows 7 Catia V5R19 SP6 64bit
|
erstellt am: 03. Okt. 2010 21:47 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo, habe das ganze zum laufen gebracht. Man steht sich halt manchmal selber im Weg. Ich habe nur noch ene Anmerkung zu dem Code von Lars. Wenn der Name der Publikation von dem veröffentlichten Element abweicht geht es nicht. Es muss der Name des Körpers angegeben werden der kopiert werden soll und nicht der Pubikationsname. In den meisten Fällen stimmt er überein, bei mir halt nicht. Aber nochmals vielen vielen Dank an Euch. alfquattro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INLU Mitglied Konstrukteur Automotive
Beiträge: 71 Registriert: 01.03.2008
|
erstellt am: 25. Jan. 2011 13:10 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
Hallo! Ich muss das Problem noch einmal aufgreifen. Der Code aus meinem vorherigen Beitrag hat noch einen Hacken. Wenn ich zwei Elemente im ersten Part habe, die den gleichen Namen tragen, funktioniert das Verwenden von CreateReferenceFromName nicht, da Catia sich dann wohl nicht entscheiden kann. Ich habe daraufhin versucht, die Referenz über pubs.Item(i).Valuation direkt auf das veröffentlichte Objekt zu setzen. Dadurch hat man das Objekt gleich als Referenz, aber die Referenz zeigt nur auf das selektierte Part, und nicht auf die komplette Hierachie der Veröffentlichung. Diese brauche ich aber, da ich sonst nicht im Kontext kopieren kann. Beispiel: Referenz mit CreateReferenceFromName ="Product1/Product3.1/Product4.1/Product5.1/Part1.1/!Gusskorrektur_Anguss_Part1" Referenz mit pubs.Item(i).Valuation = "Part1/!Gusskorrektur_Anguss_Part1" Eine weitere Überlegung war, die Referenz mir CreateReferenceFromName auf den InternalName des ModelElementes zu setzt. Das scheint aber auch nicht zu gehen Gibt es eine Möglichkeit die Referenzen zu "addieren" ? Oder gibt es eine andere Lösung? mfg INLU Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MakroNoob Mitglied Ingenieur
Beiträge: 1 Registriert: 05.04.2012
|
erstellt am: 05. Apr. 2012 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für Makronizer
|