Autor
|
Thema: Bedingungen im Strukturbaum entsprechend Komponenten automatisch in Sets verschieben (2953 mal gelesen)
|
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 13. Mrz. 2013 16:14 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, derzeit versuche ich, ein Makro zu erstellen, welches mir innerhalb der ersten Ebene einer Struktur die Bedingungen entsprechend der Komponenten in benannte Sets sortiert. Im Detail soll das Ganze wie folgt ablaufen: 1. Unterscheidung, ob das aktuell aktive Dokument eine Struktur oder ein Einzelteil ist. - Wenn es ein Einzelteil ist: Abbruch des Makros mit Ausgabe einer Fehlermeldung. - Wenn es eine Struktur ist: Start des Makros 2. Ausführen eines externen Makros (exe-file) 3. "[Part Number] + [Revision] + [Description]" der Komponenten auslesen und in ein Array schreiben. Ist diese Komponente mehr als einmal in der Struktur soll die Komponete nur einmal aufgenommen werden. 4. Erstellen jeweils eines Sets mit der Benennung "[Part Number] + [Revision] + [Description]", sofern eines der Sets schon vorhanden ist, soll es logischerweise nicht nocheinmal erstellt werden. 5. Alle Bedingungen der Komponeten und ihrer Instanzen sollen entsprechend der bei der Bedingungserstellung zuerst ausgewählten Komponete/Instanz in das entsprechende Set verschoben werden. Punkt 1 und Punkt 2 habe ich erfolgreich hinbekommen.
Ab Punkt 3 bin ich jedoch mit meinem Latein (oder besser meinen CATScript Kenntnissen) am Ende. Bereits meine Versuche, mit Hilfe des Makro Rekorders auf einen vernünftigen Ansatz zu kommen scheiterten alle. Kann mir einer von Euch bitte ein paar Tipps geben, wie ich zu meinem gewünschten Ergebnis komme? Vielen Dank 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: 14. Mrz. 2013 10:53 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Hallo ashneel, ich empfehle Dir meinen Artikel http://ww3.cad.de/foren/ubb/Forum137/HTML/005045.shtml als Grundlage für meinen Vorschlag. Nun gehst Du die Produktsturktur im CATIA durch, also Product.Products, etc. sollte nicht die Hürde sein. Für jedes Produkt und Part fragst Du dann nach den Eigenschaften .Name, Instancename, etc.. Einige Eigenschaften verstecken sich auch in den .Properties eines Produrkts oder Parts. Hast Du ein Element, so nimmst Du die Dictionary-Klasse oder eine Collection. Der fügst Du über .Add das Element hinzu. Als Key vergibst Du den Namen. Da jeder Key nur einmal existieren kann / darf, wird das Dictionary oder die Collection das erneute Hinzufügen eines Elements ablehnen. Am Ende hast Du ein Objekt, welches ein Array Deiner gesuchten Daten enthält. ich empfehle Dir eine eigene Klasse für Deine zu sammelnden Daten zu schreiben, so sind sie einfacher zu handeln. Die Objekte der Klasse dann einfach dem Dictionary hinzufügen und später darauf zurückgreifen. ------------------ 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 |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 14. Mrz. 2013 11:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Lila, vielen Dank für Deinen Denkanstoß. Ich werde versuchen, das Ganze nachzuvollziehen. Allerdings habe ich nach dem ersten groben Überfliegen des Grundlagenartikels meine Zweifel, ob ich das auf diese Weise hinbekomme, denn meine Programmierkenntnisse beschränken sich auf ein Semester C/C++ und das ist schon ein Weilchen her Schönen Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 14. Mrz. 2013 12:04 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Moin moin, bin noch ein wenig durcheinander vom Zahnarztbetäubung, was meinst du mit Sets? Meinst du das erstellen von Gruppen? Unter C:\...\catia\v5r18\win_b64\code\bin\ findest du die V5Automation.chm Datei. Hier sind viele Funktionen und wie man sie per Makro steuert beschrieben. Das hilft am anfang ungemein. Den Inhalt eines products bekommst du mit oProd.Products zusehen. Ich würde für 3. So etwas vorschlagen.
Code:
for each oChild in oProduct.Products if oDict.Exists(oChild.Partnumber) = False Then oDict.Add oChild.Partnumber, oChild.Revision & ";" & oChild.DescriptionRef end if next
damit bekommst du alle unterschiedlichen parts in einem Dictionary nun muss du nur noch für jedes oDict Ojekt ein "SET" erzeugen. noch mal Code: for each oChild in oProduct.Products
und alle gefundenen kinder in den entsprechenden SET verschieben.Probier mal. Wenn du nicht weiterkommst poste dein vorhadenen code und dir wird bestimmt weitergeholfen. Gruß, DasDon
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 14. Mrz. 2013 14:31 <-- editieren / zitieren --> Unities abgeben:
Mahlzeit, also mit sets meine ich die "Unterordner", welche sich innerhalb des Strukturbaums hierachrisch unter den Bedingungen erzeugen lassen. Habe einen Screenshot angehängt. Noch eine grundlegende Frage vorneweg. Ich habe das Makro in CATScript begonnen. Macht es in diesem Anwendungsfall Sinn, eher MS VBScript zu verwenden? Deine Codezeilen scheinen mir in VB geschrieben zu sein. Momentan sieht derzeit so aus: Sub CATMain() 'Unterscheidung Product Part ------------------------- DName = CATIA.ActiveDocument.FullName 'Product --------------------------------------------- If InStr(DName, "CATProduct") Then MsgBox ("Document is handled as Product") 'Run Converter ------------------------ Dim sMessage
exepath = "D:\macro\" rollingpath = exepath + "converter" s = rollingpath set sh = CreateObject("WScript.Shell") sh.run s, 1, true Dim productDocument1 As Document Set productDocument1 = CATIA.ActiveDocument
Set ListeAS2 = productDocument1.Selection
'Update All ------------------------------------------ Dim product1 As Product Set product1 = productDocument1.Product
product1.ApplyWorkMode DESIGN_MODE 'product1.Update '[Part Number] + [Revision] + [Description] -> "Name" auslesen und in Liste speichern 'Sets "Name" hinzufügen, wenn vorhanden nicht neu erstellen 'Bedingungen in entsprechende Sets sortieren 'PART ------------------------------------------------
Else MsgBox ("Document is not a Product. Process aborted.") end if End Sub
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: 14. Mrz. 2013 14:40 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Hallo ashneel, VBScript macht keinen Sinn, da Du so die CATIA-Funktionalität verlieren würdest. Sofern es aber nicht unter UNIX laufen muss, macht es immer sinn das Ganze in CATVBA abzubilden, da der Editor um Welten komfortabler ist und vor allem Debugger und Syntax-Highlighting hat. ------------------ 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 |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 14. Mrz. 2013 14:59 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Moin moin, in der Tat sind meine Zeilen als CATScript geschrieben. Ich arbeite in eine Firma wo die macros auf unix maschinen auch laufen müssen und habe es deshalb mir so angewöhnt. CATVBA würde ich dir eigentlich auch empfehlen aus den gleichen Gründen wie HoBLila. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 04. Apr. 2013 11:33 <-- editieren / zitieren --> Unities abgeben:
Mahlzeit, nach langer Zeit habe ich mal wieder Zeit gefunden, mich um das Thema zu kümmern. Etwas bin ich weiter gekommen, allerdings bin ich – wie zu erwarten war – auf ein paar Fragen gestoßen: 1. Die Definition von oChild Ich verwende momentan dim oChild As Part und set oChild = partDocument.part Das scheint nicht zu stimmen, denn es funktioniert nicht. 2. Ich konnte in der V5automation.chm keinen Hinweis finden, wie man ein Set für Constraints erzeugt, nur wie man ein geometrisches Set erzeugt. Der Makrorecorder half mir in diesem Fall auch nicht weiter, denn er zeichnet nichts auf, wenn ich so ein Set manuell erzeuge. 3. Zudem bin ich mir nicht ganz sicher, ob ich oDict und seine Objekte richtig definiert habe. Anbei der abgespeckte Code, ohne den Teil, der bereits funktioniert. Meinungen? Hinweise? Code: Sub CATMain()Dim productDocument1 As Document Set productDocument1 = CATIA.ActiveDocument Dim oProduct As Product Set oProduct = productDocument1.Product oProduct.ApplyWorkMode DESIGN_MODE '[Part Number] + [Revision] + [Description] -> "Name" auslesen und in Liste speichern dim oChild As Part set oChild = partDocument.Part dim oDict As dictionary dim itemPN, itemREV, itemDES set itemPN = oChild.Partnumber set itemREV = oChild.Revision set itemDES = oChild.DescriptionRef for each oChild in oProduct.Products if oDict.Exists(oChild.Partnumber) = False Then oDict.Add oChild.Partnumber, oChild.Revision & ";" & oChild.DescriptionRef end if next
'Sets "Name" hinzufügen, wenn vorhanden nicht neu erstellen for each itemPN in oDict 'erstelle Constraint Set (oChild.Partnumber&_&oChild.Revision&_&oChild.DescriptionRef) next 'Bedingungen in entsprechende Sets sortieren End Sub
Vielen Dank!
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: 04. Apr. 2013 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Servus Wo ist die Variable "partDocument" definiert und zugewiesen? Ich befürchte du kannst ein Bedingungset nicht per Makro erzeugen (Objektauflösung sowie Selektion liefern nichts brauchbaren zurück) Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 04. Apr. 2013 12:11 <-- editieren / zitieren --> Unities abgeben:
Servus, zu partDocument: zugebenermaßen, gar nicht. Hab ich glatt vergessen Aber selbst wenn ich diese Variable definiere, bekomme ich die Fehlermeldung "Das Objekt unterstützt die Eigenschaft oder Methode nicht" drum scheint mir die Definition von oChild As Part als falsch. Hm... wenn es wirklich nicht möglich ist, solche Sets per Makro zu erzeugen, wäre das äußerst schlecht, würde aber die Geschichte mit dem Makrorecorder erklären... Schönen Gruß 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: 04. Apr. 2013 19:43 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Servus Was hast du denn dem PartDocument zugewiesen? Was "sagt" das Watchfenster (in VBA) zu diesem Objekt? Was passiert wenn in der Baugruppe eine Unterbaugruppe verbaut ist? ... Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ashneel Mitglied
Beiträge: 21 Registriert: 08.10.2012 HP Z420 Intel Xeon E5-1620 Quadro K2000 16GB RAM Win7 x64 CATIA V5 R19
|
erstellt am: 05. Apr. 2013 07:21 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, der code: Code: Sub CATMain()Dim productDocument1 As Document Set productDocument1 = CATIA.ActiveDocument Dim oProduct As Product Set oProduct = productDocument1.Product oProduct.ApplyWorkMode DESIGN_MODE '[Part Number] + [Revision] + [Description] -> "Name" auslesen und in Liste speichern dim oChild As Part set oChild = oProduct.Part dim oDict As dictionary dim itemPN, itemREV, itemDES set itemPN = oChild.Partnumber set itemREV = oChild.Revision set itemDES = oChild.DescriptionRef for each oChild in oProduct.Products if oDict.Exists(oChild.Partnumber) = False Then oDict.Add oChild.Partnumber, oChild.Revision & ";" & oChild.DescriptionRef end if next
'Sets "Name" hinzufügen, wenn vorhanden nicht neu erstellen for each itemPN in oDict 'erstelle Constraint Set (oChild.Partnumber&_&oChild.Revision&_&oChild.DescriptionRef) next 'Bedingungen in entsprechende Sets sortieren End Sub
Testbaugruppe und Fehlermeldung sind im Anhang Aber wie gesagt, wenn es nicht möglich ist die sets für Bedinungen per Makro zu erstellen, bringt mir das ganze leider herzlich wenig. Schönen Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 05. Apr. 2013 08:53 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
moin moin, das kann auch so nicht gehen. oProduct deklarierst du als CATIA.ActiveDocument.Product dann versuchst du oChild als oProduct.Part zu deklarieren. Leider hat aber oProduct nicht die Methoded oder die eigenschaft Part! Das ist es auch was dir die Fehlermeldung sagt. Schaue dir lieber mal die V5Automation.chm an um zu sehen was du mit einen Product mnachen kannst.
Gruß, DasDon PS: nach genauem hinschauen sieht alles etwas merkwürdig aus! Ich schaue mir es mal genau an und poste bald was dazu. [Diese Nachricht wurde von DasDon am 05. Apr. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DasDon Mitglied Konstruktuer
Beiträge: 169 Registriert: 25.07.2011 R18 SP2. WIN
|
erstellt am: 05. Apr. 2013 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für ashneel
Sub CATMain() Dim productDocument1 As Document Set productDocument1 = CATIA.ActiveDocument Dim oProduct As Product Set oProduct = productDocument1.Product oProduct.ApplyWorkMode DESIGN_MODE '[Part Number] + [Revision] + [Description] -> "Name" auslesen und in Liste speichern 'dim oChild As Part 'set oChild = oProduct.Part '###wie gesagt. geht nicht. Parts die in einem Produkt aufgehängt sind, werden trotzdem als Product deklariert. '###CATIA.ActiveDocument.Product.Products (die Gruppe Kinder des Produkts.) '###Returns the collection of products contained in the current product. '--> Dim oChild As Product 'im oDict As dictionary '###ein Dictionary Object muss erstellt werden denn als Object exestiert es nicht in der CATIA Biliothek '###(ich glaube das war die erklärung korrigiere mich wenn es müll ist, bin auch anfänger) '### diese Methode funktioniert nicht auf UNIX OS! Set oDict = CreateObject("Scripting.Dictionary")
'dim itemPN, itemREV, itemDES '###setzte die variablen als Strings '--> Dim itemPN As String Dim itemREV As String Dim itemDES As String '###kann nicht funktionieren. oChild ist noch nichts! ausserdem wäre hier nur die information von einem Kind enthalten. 'du möchstest jedoch die information von allen kinder. das tut die for each schleife weiter unten. 'set itemPN = oChild.Partnumber 'set itemREV = oChild.Revision 'set itemDES = oChild.DescriptionRef For Each oChild In oProduct.Products If oDict.Exists(oChild.PartNumber) = False Then oDict.Add oChild.PartNumber, oChild.Revision & ";" & oChild.DescriptionRef End If Next
'Sets "Name" hinzufügen, wenn vorhanden nicht neu erstellen '###bei einer for each schleife muss das "empfangsobjekt" von type OBJECKT oder VARIANT sein, nicht vom type string! '###wir nehmen hier Variant Dim otmp As Variant Dim oCol 'As Collection 'For Each itemPN In oDict For Each otmp In oDict 'erstelle Constraint Set (oChild.Partnumber&_&oChild.Revision&_&oChild.DescriptionRef) Set oCol = oProduct.Connections("CATIAConstraints") '### hier finde ich einfach keine weg SETS zu erzeugenNext '###im WATCH-Fenster wird für oCol die Constraints angezeigt, jedoch werden die, die im Set sind, '###genau so dargestellt wie die ohne set. PARENT ist auch identisch. Next 'Bedingungen in entsprechende Sets sortieren End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |