Autor
|
Thema: Makro soll erkenen wie viele UnterProdukte vorhanden sind (1517 mal gelesen)
|
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 07. Jun. 2017 15:10 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte in einem Product(A) mit einem Part(B) und n-Unterprodukten, in diesem Unterproduct befindet sich ein Part(C), ich möchte eine Fläche kopieren und in dem Product(A) vorhandenen Part(B) einfügen. Gibt es eine Möglichkeit, dass das Makro selbst erkennt wie viele Produkte vorhanden sind. Bisher habe ich die Lösung nur für ein Unterproduct die Lösung (Also solange ein Product vorhanden ist kann ich auf das Part zugreifen), aber ich möchte das Makro erweitern auf n-Produkte. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jun. 2017 15:19 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
Servus Du kannst die Rootproduct-Collection mit einer Schleife durcharbeiten, wenn das Product (also die Instanz) Products enthält (zB oProduct.Products.Count <> 0) ist es eine Componente oder Subproduct (siehe zB auch hier) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 08. Jun. 2017 12:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, vielen Dank für die schnelle Antwort. Ich habe noch eine kurze Frage. Was ich bisher hatte(Code1):
Code:
Set oActiveDoc = CATIA.ActiveDocument Dim oPart1Doc As PartDocument Dim oPart2Doc As PartDocument Set oPart1Doc = oActiveDoc.Product.Products.Item(1).ReferenceProduct.Parent Set oPart2Doc = oActiveDoc.Product.Products.Item(2).ReferenceProduct.Parent
Also benötige ich (Code2):
Code: If oActiveDoc.Products.Count <> 0 Then Call Rekursiv(oActiveDoc) End IfSub Rekursiv(oActiveDoc As Product) Dim oProduct As Product For Each oProduct In oActiveDoc .Products If oProduct.ReferenceProduct.Parent.FullName = oProduct.Parent.Parent.ReferenceProduct.Parent.FullName Then MsgBox oProduct.Name & " ist eine Componente" Else MsgBox oProduct.Name & " ist ein CATProduct" End If If oProduct.Products.Count <> 0 Then Call Rekursiv(oProduct) End If
Um ehrlich zusein, verstehe ich nicht genau, was hinter dem Code2 steckt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jun. 2017 13:18 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
Servus Ob du den Code2 benötigst musst du selbst entscheiden. (wollt mir diesem nur hinweisen dass es auch noch Komponenten gibt) Du hast greift über oActiveDoc.Product.Products.Item(1) direkt auf eine Instanze zurück und wechselst von dort auf das PartDocument. Wenn du oActiveDoc.Product.Products durcharbeitest kannst du auf alle Instanzen zugreifen (also auch wenn dein PartA 20 mal verbaut ist jedes einzeln ansprechen). Über die Überprüfung ob eine Instanz noch (Unter)-Products hat (.Products.Count <> 0 ) weißt du dass es sich bei der Instanz nicht um ein CATPart sondern um ein Unterbaugruppe bzw eine Instanz eines CATProducts (oder auch Komponente) handelt. Programmierst du in VBA? Dann schau dir mal die Struktur im Watch/Localfenster an. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 08. Jun. 2017 13:26 <-- editieren / zitieren --> Unities abgeben:
Vielleicht hast du meine Frage falsch verstanden, deshalb hier nochmal genauer die Struktur Beispiel a) Product -Unterproduct01(Product) -Part1 -Part3 Beispiel b)
Product -Unterproduct01(Product) -Unterproduct02(Product) -Part1 -Part3 Ziel ist es von Part 1 eine Fläche zu kopieren und in Part 3 einzufügen.
Ich möchte ein Makro programmieren das sowohl für a als auch für b gültig ist. (Also für n-Unterproducte) Bin für jede Hilfe sehr Dankbar Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 08. Jun. 2017 13:30 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jun. 2017 13:31 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
Servus Entweder muss du dich mit einem rekursiven Code bis zur passenden Stufe nach unten hangeln (siehe zB den von mir verlinkte Code) oder ggf per Selektion das Part direkt suchen (Namen, Teilenummer, ....) oder ggf per Dateiname direkt ansprechen. Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 08. Jun. 2017 15:02 <-- editieren / zitieren --> Unities abgeben:
Die Parts habe ich schon per selektion definiert. Das heißt die 3 Parts sind schon definiert. Jetzt kann ich auf alle Instanzen zugreifen Was ich leider immer noch nicht verstehe ist, wie ich den Vergleich der Part des Part mit der Count mache Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jun. 2017 15:07 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
|
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 08. Jun. 2017 15:41 <-- editieren / zitieren --> Unities abgeben:
Woher weiß ich denn in welcher instanz(Unterproduct) siehe beispiel b oben sich der Part befindet? Das makro soll ja für beispiel a und b laufen. Mit count meine ich die anzahl der instanzen die habe ich im local fenster ausgelesen. Wie kann ich eine bedingung setzen, dass sowohl beispiel a als auch beispiel b überprüft werden kann? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jun. 2017 15:53 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
Servus Woran kannst du den die beiden Parts erkennen? (es können ja noch viel mehr Parts in den Baugruppen verbaut sein) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 09. Jun. 2017 12:25 <-- editieren / zitieren --> Unities abgeben:
Der Anwender selektiert den Part und das Makro sucht anschließend die Fläche raus, (Selection-Copy), von dem Part der sich im Unterproduct befindet. Eingefügt soll die Fläche in ein Part der sich in dem obersten Product befindet. Mein Problem ist, durch selektion der Parts soll das makro erkenenn wie viele Unterproducte vorhanden sind, damit ich die fläche kopieren und einfügen kann. SOnst kriege ich das nicht hin. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 09. Jun. 2017 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
Servus Und warum benötigst du dann noch die Verbauungsebene des Parts? Du hast es doch zuvor schon selektiert. Wie selektierst du das Part? Selektierst du dabei die Instanz oder das Part oder das PartDocument? Kopierst du dann die Fläche im Baugruppenkontext? Wenn du direkt von Part kopierst brauchst du die Verbauungsebene ja nicht. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 09. Jun. 2017 14:11 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 09. Jun. 2017 14:22 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
Servus Also willst du nur zwischen Parts kopieren. Wie selektierst du das Quellpart? Kannst du mal deinen (ggf auch nur Teile davon) Code posten? Wo benötigst du da die Tiefe er Struktur? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 09. Jun. 2017 14:25 <-- editieren / zitieren --> Unities abgeben:
Code: ' Set odocument = CATIA.ActiveDocument Set oSelection = odocument.Selection Set oProduct = odocument.Product Set oGroups = CATIA.ActiveDocument.Product.GetTechnologicalObject("Groups") Dim pname As String Dim ppart1 As Object ' Catia Status, message an den anwender, dass Flaechen selektiert werden sollen Dim InputObjectType(0) InputObjectType(0) = "AnyObject" oSelection.Clear Status = oSelection.SelectElement2(InputObjectType, "Selektieren Sie bitte Part 1", False) ' Partbenennung in den TextBox einfügen Set hgroup = oGroups.AddFromSel() Set ppart1 = hgroup.ItemExplicit(1) pname1 = ppart1.PartNumber hgroup.Name = "Part_01" Me.TextBox1.Value = pname1
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 09. Jun. 2017 14:39 <-- editieren / zitieren --> Unities abgeben: Nur für student1992
Servus Und nun? Der User soll etwas wählen (egal was!) und was soll nun mit dem weiter passieren? Für was benötigst du die Group? Auch zum kopieren der Fläche? Gruß Bernd PS: Hier mal ein Beispiel zum selektieren eines Parts in der Struktur und anschließendem suchen und kopieren eines Punktes. Code: Sub CATMain()Dim ProductDocument As ProductDocument Dim oSel As Object Dim sFilter() Dim Status As String Dim oQuellpart As Part Dim oZielpart As Part 'Start Set ProductDocument = CATIA.ActiveDocument Set oSel = ProductDocument.Selection 'Ziel ansprechen hier direkt über den Instanznamen Set oZielpart = ProductDocument.Product.Products.Item("Zielpart").ReferenceProduct.Parent.Part 'Quellpart wählen ReDim sFilter(0) sFilter(0) = "Part" Status = oSel.SelectElement2(sFilter, "Bitte Quellpart selektieren", True) If Status = "Normal" Then Set oQuellpart = oSel.Item2(1).Value 'nach dem Punkt (über den Namen) in dem selektierten Part suchen oSel.Search "CATGmoSearch.Point.Name=MeinPunktName,sel" If oSel.Count <> 0 Then 'Punkt kopieren und einfügen oSel.Copy oSel.Clear 'Ziel selektieren und einfügen oSel.Add oZielpart oSel.PasteSpecial "CATPrtResultWithOutLink" End If End If End Sub
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Design Engineer Advanced E-Mobility (all genders) | Accenture ist ein weltweit tätiges Beratungsunternehmen, führend in Digitalisierung, Cloud und Security. Wir bringen unsere umfassende Erfahrung und spezialisierten Fähigkeiten in mehr als 40 Branchen ein und bieten Dienstleistungen aus den Bereichen Strategy & Consulting, Technology, Industry X und Operations sowie Accenture Song ? gestützt auf das weltweit größte Netzwerk aus Centern für Advanced Technology und Intelligent Operations.... | Anzeige ansehen | Fahrzeugtechnik |
|
student1992 Mitglied Student
Beiträge: 98 Registriert: 03.05.2017
|
erstellt am: 09. Jun. 2017 15:49 <-- editieren / zitieren --> Unities abgeben:
Der user soll nur parts selektieren können, anyobject hatte ich der einfachhaltbar verwendet weil ich kein explizites für part gefunden habe. Ich möchte über die groups das selektierte als part definieren. Und dann anschließend von dem selektieren part die Fläche kopieren. Weil wenn ich direkt suche(zuerst hatte ich das mit search) und das bauteil zwei mal vorhanden ist mit nur verschiedner instanz kann es ja zu fehlern kommen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |