| | | KISTERS 3DViewStation WebViewer: Sichere 3D-Visualisierung - jederzeit und überall, eine Pressemitteilung
|
Autor
|
Thema: Copy Bodys im Produkt (1510 / mal gelesen)
|
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 06. Jan. 2022 10:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, frohes Neues in die Runde. Vieleicht hat jemand von euch ein paar Codezeilen (nehme auch gerne ganzen Code ) für mein Anliegen. Ich möchte in einem Produkt mit beliebig vielen gleichen Parts "Quellparts" alle gepublishten Elemente (in diesem Fall Bodys) in ein "Zielpart" kopieren. In dem Produkt befindet sich teilweise auch noch ein Unterprodukt, dies soll aber nicht angerührt werden werden. Hier zu Verdeutlichung die Struktur Produkt1 --Produkt2 --Zielpart --Quellpart(mit Publish) --Quellpart(mit Publish) --Quellpart(mit Publish) --Quellpart(mit Publish) --Quellpart(mit Publish) --usw. ------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 06. Jan. 2022 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
|
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 06. Jan. 2022 10:31 <-- editieren / zitieren --> Unities abgeben:
|
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: 06. Jan. 2022 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Hallo Uwe, anbei deiner gewünschte Code (VBA): Code:
Dim SelectedBodies(100) As Variant Dim AssyBodies(6) As Variant Dim BodyCounter As Integer Dim InctanceCounter As Integer Dim LoopCounter As Integer Dim instanceSuffix As String Dim choice Dim SelBackupBody()Sub CATMain() Erase SelectedBodies Erase AssyBodies Set ProductDocument1 = CATIA.ActiveDocument Dim selectionPart 'As Selection Set selectionPart = CATIA.ActiveDocument.Selection 'selection of part to be copied MsgBox "Select the StandardPart you want to copy" Dim InputObjectType(0) InputObjectType(0) = "Product" sSelect = selectionPart.SelectElement2(InputObjectType, "Select a Part", False) If sSelect = "Cancel" Then Exit Sub End If Set CopyFromPart = selectionPart.Item(1).Value 'selection of Body to be copied MsgBox "Select the Bodys you want to copy" Dim InputObjectBody(0) Dim SelectionBody Set SelectionBody = CATIA.ActiveDocument.Selection InputObjectBody(0) = "Body" sSelect = SelectionBody.SelectElement3(InputObjectBody, "Select a Body(s)", True, CATMultiSelTriggWhenUserValidatesSelection, False) If sSelect = "Cancel" Then Exit Sub End If 'Dim SelBackupBody() 'As Object ReDim SelBackupBody(SelectionBody.Count) For i = 1 To SelectionBody.Count Set SelBackupBody(i) = SelectionBody.Item(i).Value Next 'selection of part to paste into Dim castProd As Product MsgBox "Select The Part to Paste Into!" Dim PasteObjectType(0) PasteObjectType(0) = "Product" sSelect = selectionPart.SelectElement2(PasteObjectType, "Select a Part", False) If sSelect = "Cancel" Then Exit Sub End If Set PasteToPart = selectionPart.Item(1).Value 'Check if CATPart or CATProduct If InStr(1, CopyFromPart.ReferenceProduct.Parent.Name, "CATPart") <> 0 Then SearchPartForBodies CopyFromPart, PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesPart CopyFromPart, PasteToPart Else 'Check if CATProduct If InStr(1, CopyFromPart.Products.Item(1).Name, "SK") = 0 Then 'if product not group SearchPartForBodies CopyFromPart.Products.Item(1), PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesProduct CopyFromPart, PasteToPart Else 'if group If InStr(1, CopyFromPart.Products.Item(2).ReferenceProduct.Parent.Name, "CATPart") <> 0 Then 'if part group SearchPartForBodies CopyFromPart.Products.Item(2), PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesPart CopyFromPart.Products.Item(2), PasteToPart Else 'if product group SearchPartForBodies CopyFromPart.Products.Item(2).Products.Item(1), PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesProduct CopyFromPart.Products.Item(2), PasteToPart End If End If End If Dim castPart As Part Set castPart = ProdToPart(PasteToPart) PasteToPart.Update '----cleaner---- Erase SelectedBodies Erase AssyBodies BodyCounter = 0 InctanceCounter = 0 LoopCounter = 0 '---- End Sub Sub SearchPartForBodies(CopyFromPart, PasteToPart, instanceSuffix) 'On Error GoTo ErrorHandler ' Enable error-handling routine. 'search for bodies in source part 'Dim selectedpartRoot As Part Set selectedpartRoot = CopyFromPart.ReferenceProduct.Parent.Part Dim BodiesInPart As Bodies Set BodiesInPart = selectedpartRoot.Bodies Dim BodySelection 'As Selection Set BodySelection = CATIA.ActiveDocument.Selection BodySelection.Clear ' for loops through all the bodies in search for add,remove etc BodyCounter = 0 Dim BodyInPart As Body For i = 1 To UBound(SelBackupBody) Set BodyInPart = SelBackupBody(i) BodySelection.Add BodyInPart On Error Resume Next BodySelection.Add CopyFromPart.Publications.Item(BodyInPart.Name).Valuation If Err.Number <> 0 Then MsgBox "Wrong Publication Name! Check Publication Name For: " & BodyInPart.Name End If BodyCounter = BodyCounter + 1 'End If Next BodySelection.Copy 'Pasteoperation in targetpart starts here Dim targetPartSel As Selection Set targetPartSel = CATIA.ActiveDocument.Selection targetPartSel.Add PasteToPart.ReferenceProduct.Parent.Part targetPartSel.PasteSpecial "CATPrtResult" For i = 1 To targetPartSel.Count 'targetPartSel.Item(i).Value.Name = targetPartSel.Item(i).Value.Name + "." + instanceSuffix targetPartSel.Item(i).Value.Name = SelBackupBody(i).Name + "." + instanceSuffix Next targetPartSel.Clear 'ErrorHandler: ' Error-handling routine. 'If Err.Number <> 0 Then ' msg = "Please Publish!" ' MsgBox msg ' End 'End If End Sub 'part instance searcher Sub SearchForOtherInstancesPart(CopyFromPart, PasteToPart) Dim selectionPart 'As Selection Set selectionPart = CATIA.ActiveDocument.Selection Set InstancePart = CopyFromPart SelectedInstanceName = CopyFromPart.Name 'InctanceCounter = InstancePart.Parent.Count For i = 1 To InstancePart.Parent.Count 'count in father prod If InstancePart.Name <> InstancePart.Parent.Item(i).Name Then 'skip the user selected prod Set MyInstance = InstancePart.Parent.Item(i) If InStr(1, MyInstance.Name, InstancePart.PartNumber) <> 0 Then selectionPart.Clear selectionPart.Add InstancePart.Parent.Item(i) 'select next instance SearchPartForBodies MyInstance, PasteToPart, InstanceNr(MyInstance) 'search in next instace InctanceCounter = InctanceCounter + 1 End If End If Next End Sub 'product instance searcher Sub SearchForOtherInstancesProduct(CopyFromPart, PasteToPart) Dim selectionPart 'As Selection Set selectionPart = CATIA.ActiveDocument.Selection Set InstancePart = CopyFromPart SelectedInstanceName = CopyFromPart.Name 'InctanceCounter = InstancePart.Parent.Count For i = 1 To InstancePart.Parent.Count 'count in father prod Set MyInstance = InstancePart.Parent.Item(i) If InstancePart.Name <> MyInstance.Name Then 'skip the user selected prod If InStr(1, MyInstance.Name, InstancePart.PartNumber) <> 0 Then selectionPart.Clear selectionPart.Add MyInstance 'select next instance SearchPartForBodies MyInstance.Products.Item(1), PasteToPart, InstanceNr(MyInstance) 'search in next instace InctanceCounter = InctanceCounter + 1 End If End If Next End Sub 'conversion of product to part Function ProdToPart(oProduct) As Part Dim documents1 As Documents Set documents1 = CATIA.Documents Dim partDocument1 As Document Set partDocument1 = documents1.Item(oProduct.PartNumber + ".CATPart") Dim targetPart As Part Set targetPart = partDocument1.Part Set ProdToPart = targetPart End Function Sub AddToSelectedBodies(BodyInPart As Body) BodyCounter = BodyCounter + 1 Set SelectedBodies(BodyCounter) = BodyInPart End Sub Function InstanceNr(oProd) As String pointPos = InStr(1, oProd.Name, ".") InstanceNr = Right(oProd.Name, Len(oProd.Name) - pointPos) End Function Function StrippInstanceNr(oStr As String) As String pointPos = InStr(1, oStr, ".") StrippInstanceNr = Left(oStr, pointPos - 1) End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 06. Jan. 2022 19:48 <-- editieren / zitieren --> Unities abgeben:
Hallo imation1999, perfekt. Vielen Dank. Ps. Mir ist aufgefallen, das die Positionsmatrix der Bodys nicht mitgeben wird. Momentan werden die Bodys an der Stelle des Selektierten Quellparts eingfügt. Auch aktualisieren sich die Bodys nicht wenn die Parts verschoben werden. ------------------ Gruß Uwe Auch Catia ist nur ein Mensch!
[Diese Nachricht wurde von moppesle am 06. Jan. 2022 editiert.] 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: 07. Jan. 2022 07:01 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
|
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 07. Jan. 2022 08:05 <-- editieren / zitieren --> Unities abgeben:
Hallo imation1999, ich habe nun herausgefunden warum es nicht funktionierte. Ich hatte die Zeilen auskommentiert weil bei mir die Bodynamen nicht mit den Publikationsnamen übereinstimmen. Code: If Err.Number <> 0 Then MsgBox "Wrong Publication Name! Check Publication Name For: " & BodyInPart.Name End If
Gibt es eine Möglichkeit trotz unterschiedlicher Namensgebung das Makro zum laufen zu bringen? ------------------ Gruß Uwe Auch Catia ist nur ein Mensch! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jan. 2022 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Servus Uwe Bei einer Veröffentlichung kannst du über .Valuation.Displayname auf den "Pfad" zum veröffentlichten Element zugreifen. Somit könntest die "richtige" Veröffentlichung ermitteln. Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. 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: 07. Jan. 2022 11:04 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Hallo, ja, genau, wie Bernd geschrieben hat...ändere mal so ab, dann wird zu dem Body die richtige Publication gesucht: Code:
Dim SelectedBodies(100) As Variant Dim AssyBodies(6) As Variant Dim BodyCounter As Integer Dim InctanceCounter As Integer Dim LoopCounter As Integer Dim instanceSuffix As String Dim choice Dim SelBackupBody()Sub CATMain() Erase SelectedBodies Erase AssyBodies Set productDocument1 = CATIA.ActiveDocument Dim selectionPart 'As Selection Set selectionPart = CATIA.ActiveDocument.Selection 'selection of part to be copied MsgBox "Select the StandardPart you want to copy" Dim InputObjectType(0) InputObjectType(0) = "Product" sSelect = selectionPart.SelectElement2(InputObjectType, "Select a Part", False) If sSelect = "Cancel" Then Exit Sub End If Set CopyFromPart = selectionPart.Item(1).Value 'selection of Body to be copied MsgBox "Select the Bodys you want to copy" Dim InputObjectBody(0) Dim SelectionBody Set SelectionBody = CATIA.ActiveDocument.Selection InputObjectBody(0) = "Body" sSelect = SelectionBody.SelectElement3(InputObjectBody, "Select a Body(s)", True, CATMultiSelTriggWhenUserValidatesSelection, False) If sSelect = "Cancel" Then Exit Sub End If 'Dim SelBackupBody() 'As Object ReDim SelBackupBody(SelectionBody.Count) For i = 1 To SelectionBody.Count Set SelBackupBody(i) = SelectionBody.Item(i).Value Next 'selection of part to paste into Dim castProd As Product MsgBox "Select The Part to Paste Into!" Dim PasteObjectType(0) PasteObjectType(0) = "Product" sSelect = selectionPart.SelectElement2(PasteObjectType, "Select a Part", False) If sSelect = "Cancel" Then Exit Sub End If Set PasteToPart = selectionPart.Item(1).Value 'Check if CATPart or CATProduct If InStr(1, CopyFromPart.ReferenceProduct.Parent.Name, "CATPart") <> 0 Then SearchPartForBodies CopyFromPart, PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesPart CopyFromPart, PasteToPart Else 'Check if CATProduct If InStr(1, CopyFromPart.Products.Item(1).Name, "SK") = 0 Then 'if product not group SearchPartForBodies CopyFromPart.Products.Item(1), PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesProduct CopyFromPart, PasteToPart Else 'if group If InStr(1, CopyFromPart.Products.Item(2).ReferenceProduct.Parent.Name, "CATPart") <> 0 Then 'if part group SearchPartForBodies CopyFromPart.Products.Item(2), PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesPart CopyFromPart.Products.Item(2), PasteToPart Else 'if product group SearchPartForBodies CopyFromPart.Products.Item(2).Products.Item(1), PasteToPart, InstanceNr(CopyFromPart) SearchForOtherInstancesProduct CopyFromPart.Products.Item(2), PasteToPart End If End If End If Dim castPart As Part Set castPart = ProdToPart(PasteToPart) PasteToPart.Update '----cleaner---- Erase SelectedBodies Erase AssyBodies BodyCounter = 0 InctanceCounter = 0 LoopCounter = 0 '---- End Sub Sub SearchPartForBodies(CopyFromPart, PasteToPart, instanceSuffix) 'On Error GoTo ErrorHandler ' Enable error-handling routine. 'search for bodies in source part 'Dim selectedpartRoot As Part Set selectedpartRoot = CopyFromPart.ReferenceProduct.Parent.Part Dim BodiesInPart As Bodies Set BodiesInPart = selectedpartRoot.Bodies Dim BodySelection As Selection Set BodySelection = CATIA.ActiveDocument.Selection BodySelection.Clear ' for loops through all the bodies in search for add,remove etc BodyCounter = 0 Dim BodyInPart As Body For i = 1 To UBound(SelBackupBody) Set BodyInPart = SelBackupBody(i) BodySelection.Add BodyInPart For k = 1 To CopyFromPart.Publications.Count sPubName = Split(CopyFromPart.Publications.Item(k).Valuation.DisplayName, "/")(UBound(Split(CopyFromPart.Publications.Item(k).Valuation.DisplayName, "/"))) If sPubName = BodyInPart.Name Then BodySelection.Add CopyFromPart.Publications.Item(k).Valuation Exit For End If Next BodyCounter = BodyCounter + 1 Next BodySelection.Copy 'Pasteoperation in targetpart starts here Dim targetPartSel As Selection Set targetPartSel = CATIA.ActiveDocument.Selection targetPartSel.Add PasteToPart.ReferenceProduct.Parent.Part targetPartSel.PasteSpecial "CATPrtResult" For i = 1 To targetPartSel.Count 'targetPartSel.Item(i).Value.Name = targetPartSel.Item(i).Value.Name + "." + instanceSuffix targetPartSel.Item(i).Value.Name = SelBackupBody(i).Name + "." + instanceSuffix Next targetPartSel.Clear 'ErrorHandler: ' Error-handling routine. 'If Err.Number <> 0 Then ' msg = "Please Publish!" ' MsgBox msg ' End 'End If End Sub 'part instance searcher Sub SearchForOtherInstancesPart(CopyFromPart, PasteToPart) Dim selectionPart 'As Selection Set selectionPart = CATIA.ActiveDocument.Selection Set InstancePart = CopyFromPart SelectedInstanceName = CopyFromPart.Name 'InctanceCounter = InstancePart.Parent.Count For i = 1 To InstancePart.Parent.Count 'count in father prod If InstancePart.Name <> InstancePart.Parent.Item(i).Name Then 'skip the user selected prod Set MyInstance = InstancePart.Parent.Item(i) If InStr(1, MyInstance.Name, InstancePart.PartNumber) <> 0 Then selectionPart.Clear selectionPart.Add InstancePart.Parent.Item(i) 'select next instance SearchPartForBodies MyInstance, PasteToPart, InstanceNr(MyInstance) 'search in next instace InctanceCounter = InctanceCounter + 1 End If End If Next End Sub 'product instance searcher Sub SearchForOtherInstancesProduct(CopyFromPart, PasteToPart) Dim selectionPart 'As Selection Set selectionPart = CATIA.ActiveDocument.Selection Set InstancePart = CopyFromPart SelectedInstanceName = CopyFromPart.Name 'InctanceCounter = InstancePart.Parent.Count For i = 1 To InstancePart.Parent.Count 'count in father prod Set MyInstance = InstancePart.Parent.Item(i) If InstancePart.Name <> MyInstance.Name Then 'skip the user selected prod If InStr(1, MyInstance.Name, InstancePart.PartNumber) <> 0 Then selectionPart.Clear selectionPart.Add MyInstance 'select next instance SearchPartForBodies MyInstance.Products.Item(1), PasteToPart, InstanceNr(MyInstance) 'search in next instace InctanceCounter = InctanceCounter + 1 End If End If Next End Sub 'conversion of product to part Function ProdToPart(oProduct) As Part Dim documents1 As Documents Set documents1 = CATIA.Documents Dim partDocument1 As Document Set partDocument1 = documents1.Item(oProduct.PartNumber + ".CATPart") Dim targetPart As Part Set targetPart = partDocument1.Part Set ProdToPart = targetPart End Function Sub AddToSelectedBodies(BodyInPart As Body) BodyCounter = BodyCounter + 1 Set SelectedBodies(BodyCounter) = BodyInPart End Sub Function InstanceNr(oProd) As String pointPos = InStr(1, oProd.Name, ".") InstanceNr = Right(oProd.Name, Len(oProd.Name) - pointPos) End Function Function StrippInstanceNr(oStr As String) As String pointPos = InStr(1, oStr, ".") StrippInstanceNr = Left(oStr, pointPos - 1) End Function
[Diese Nachricht wurde von imation1999 am 07. Jan. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 07. Jan. 2022 12:00 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jan. 2022 12:20 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
|
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 07. Jan. 2022 13:55 <-- editieren / zitieren --> Unities abgeben:
|
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: 09. Jan. 2022 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
|
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 09. Jan. 2022 11:38 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Servus Bei mir steht das ! direkt vor dem Körpernamen. Keine Ahnung warum sich das unterscheidet (Release, Einstellungen, ...) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
moppesle Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 3425 Registriert: 28.05.2009 CATIA V5 R19 SP9 WIN 7 64bit
|
erstellt am: 09. Jan. 2022 13:39 <-- editieren / zitieren --> Unities abgeben:
|
ptit.tom Mitglied CAD-Berater
Beiträge: 115 Registriert: 11.02.2005 win10, CATIA R19 bis R30
|
erstellt am: 17. Feb. 2022 15:37 <-- editieren / zitieren --> Unities abgeben: Nur für moppesle
Der Pfad für den Behfehl .CreateReferenceFromName besteht aus 2 Teile: * Pfad des Part im Produkt: Instanznamen mit / getrennt * Pfad des Feature im Part: mit / getrennt Beide Teile werden mit ! getrennt. Empfehlenswert ist es die InternalName (.GetItem("ModelElement").InternalName ) für den Pfad im Part zu verwenden. Dann können auch Elemente mit gleichen Namen erkannt werden.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|