Autor
|
Thema: Makro für Achsensystem einfügen (3990 mal gelesen)
|
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 30. Jul. 2009 07:48 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen! Ich hoffe hier kann mir jemand helfen. Da ich leider mit Makroprogrammierung etwas auf dem Kriegsfuß stehe wende ich mich an euch. Folgende Aufgabe: Für eine im CATIA V5 R16 SP5 geladene Baugruppe soll für jedes Teil folgendes ausgeführt werden: 1. In Part schauen ob es mindestens ein Achsensystem gibt 2. Wenn es kein Achsensystem gibt eins an den PartUrsprung einfügen 3. Alle vorhandenen Achsensystem ausblenden Ist dies mit einem Makro möglich? Gruss Doc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 30. Jul. 2009 08:12 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
Ja, das müsste schon gehen. 1. Würde ich über eine Suchfunktion machen. Am Besten mal mit dem Makro-Rekorder aufzeichnen, dann hast du auch den richtigen Code (kann bei jedem Release anscheinend ein bißchen anders aussehen). 2. Über eine If-Abfrage 3. Das geht dann mit der Funktion VisProperties: Ref.VisProperties.SetShow catVisPropertyNoShowAttr (Das ist der Befehl fürs Ausblenden. 'Ref' ist die Refernez von deinen Achsensystemen, die du gesucht/erstellt hast) Gruß Betty
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 30. Jul. 2009 09:39 <-- editieren / zitieren --> Unities abgeben:
|
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: 30. Jul. 2009 12:37 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
1. Stell mal deinen bisherigen Code hier rein. 2. Setze dich mit den Grundlagen der Programmierung auseinander (Visual Basic) 3. Arbeite dich in die CATIA-Makroprogrammierung ein. 4. Wenn dann noch bestimmte Fragen auftauchen, kann man dir gezielt helfen. Grüße Dominik Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 30. Jul. 2009 13:45 <-- editieren / zitieren --> Unities abgeben:
Das ist bis jetzt mein Code: (zusammengebastelt aus verschiedenen Codeschnipseln des Forums) __________________________________________________________________________________________
Language="VBSCRIPT" Sub CATMain() Set oRoot = Catia.ActiveDocument Set oProd = oRoot.Product Set oProducts = oRoot.Product.Products SUB_CHECKAXIS oProducts End Sub Sub SUB_CHECKAXIS(oProducts) For i = 1 To oProducts.Count If TypeName(oProducts.Item(n).ReferenceProduct.Parent) = "PartDocument" Then If oProducts.Item(n).GetAxisSystem.Item > 0 then
End If ElseIf TypeName(oProducts.Item(n).ReferenceProduct.Parent) = "ProductDocument" Then If oProducts.Item(n).Products.Count > 0 Then SUB_CHECKAXIS oProducts.Item(n).Products End If End If Next End Sub __________________________________________________________________________________________ in der Zeile "If TypeName(oProducts.Item(n).ReferenceProduct.Parent) = "PartDocument" Then" bekomme ich immer folgenden Fehler: Source: CATIAProducts Description: The method Item failed Line: 13 Column: 4
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator 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: 30. Jul. 2009 16:59 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
Hallo Doc , man sieht das du das Script zusammenkopierst hast. Du musst in einer Schleife für ein Item schon den selben Zähler hernhemen wie in der Schleifeninitialisierung. n ist in deinem Fall Nothing weil der Zähler i ist Hier mal eine funktionierende "ein wenig erweiterte" Version deines Scriptes: Code:
Private Counter As IntegerSub CATMain() '**********************************Deklarationen********************************** Dim oRoot As Document Dim oProd As Product Dim oProducts As Products Dim myPart As Part Counter = 0 '**********************************Abfrage Dokumente********************************** Dim oFenster As Windows Dim ObjType As String Set oFenster = CATIA.Windows If oFenster.Count = 0 Then Box = MsgBox("Es ist kein Dokument geladen!" + Chr(10) + "Das Makro kann nicht ausgeführt werden und wird beendet!", vbCritical, "Keine Dokument geladen") Exit Sub End If Set oRoot = CATIA.ActiveDocument ObjType = TypeName(oRoot) If ObjType <> "ProductDocument" Then Box = MsgBox("Das aktive Dokument ist kein Produkt!" + Chr(10) + "Das Makro kann nicht ausgeführt werden!", _ vbCritical + vbOKOnly, "Falscher Dateityp") Exit Sub End If ObjType = "" '**********************************Producte instanzieren********************************** Set oProd = oRoot.Product Set oProducts = oRoot.Product.Products SUB_CHECKAXIS oProducts '**********************************Ausgabe********************************** Box = MsgBox("Es wurden " & Counter & " Achsensystem erzeugt", vbInformation + vbOKOnly, "Makro erfolgreich beendet") End Sub Sub SUB_CHECKAXIS(oProducts) For i = 1 To oProducts.Count If TypeName(oProducts.Item(i).ReferenceProduct.Parent) = "PartDocument" Then If oProducts.Item(i).ReferenceProduct.Parent.Part.AxisSystems.Count = 0 Then Set myPart = oProducts.Item(i).ReferenceProduct.Parent.Part Set NewAxisSystem = myPart.AxisSystems.Add() NewAxisSystem.Name = "Neues Achsensystem" myPart.Update Counter = Counter + 1 End If ElseIf TypeName(oProducts.Item(i).ReferenceProduct.Parent) = "ProductDocument" Then If oProducts.Item(i).Products.Count > 0 Then SUB_CHECKAXIS oProducts.Item(i).Products End If End If Next End Sub
------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 31. Jul. 2009 07:07 <-- editieren / zitieren --> Unities abgeben:
Danke, hab es mal gerade eben ausprobiert! Leider erhalte ich folgende Fehlermeldung: Source: Komilierungsfehler in Microsoft VBScript Description: Anweisungsende erwartet Statement: Private Counter As Integer Line: 1 Column: 16 Wie kann ich die Anweisung beenden? Habe hier leider keinen Zugriff auf die V5Automation.chm
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: 31. Jul. 2009 07:21 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
Servus Hast du das Makro als .CATScript oder .catvbs abgespeichert? Versuch mal das andere Format (ich vermute .catvbs sollte passen). Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 31. Jul. 2009 07:31 <-- editieren / zitieren --> Unities abgeben:
|
DanielFr. Moderator 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: 31. Jul. 2009 10:54 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
Hallo Doc, das liegt an der als "Private" deklarierten Variable. Übergebe sie einfach mit in die Sub dann musst du sie nicht zusätzlich als "Private" deklarieren und das Script sollte in allen Sprachen (also auch als *.CATScript) laufen. Ich hab´s hier mal als Anhang (*.CATScript) drangehängt. Ich habe es gerade auf einer R18 SP6 getestet und es läuft ohne Probleme durch. ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 31. Jul. 2009 11:16 <-- editieren / zitieren --> Unities abgeben:
Danke, läuft super! 10 Unities für dich! Auch mein dank an alle anderen. Jetzt muss ich nur noch die sichtbarkeit der Achsensystem ausschalten. Mal schauen ob ich das hinkriege. Werde mich wohl doch mal intensiver mit Makros beschäftigen! Welches Buch könnt ihr da empfehlen? Ich habe schon einige mit Programmiererfahrung (Delphi)! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
danielsc Mitglied
Beiträge: 45 Registriert: 18.06.2009
|
erstellt am: 31. Jul. 2009 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
Also ich hab zwei Bücher und die haben mir echt schon oft geholfen. 1. Kochbuch - CATIA V5 automatisieren von Jens Hansen (welcher auch öfters hier im Forum ist) 2. CATIA V5 - Makroprogrammierung mit Visual Basic Script von Dieter R. Ziethen MfG Danny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator 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: 31. Jul. 2009 12:19 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
Hallo Doc, oh das war mein Fehler hatte ich wieder ganz vergessen das du sie auch noch unsichtbar machen wolltest. Im Anhang ist die aktualisierte Version des Scriptes ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 04. Aug. 2009 10:24 <-- editieren / zitieren --> Unities abgeben:
Hallo danke für deine Hilfe! Ich habe mich am Wochenende mal hingesetzt und etwas in die Materie eingearbeitet. (Buch ist auch schon bestellt) Ich habe die ganze Sache noch etwas erweitert. Hänge hier mal mein Ergebniss an: __________________________________________________________________________________ Sub CATMain() '*** CHANGELOG *** '0: DocMurphy => Achsensysteme werden erzeugt und ausgeblendet '1: DocMurphy => OriginalPlanes werden ausgeblendet '2: DocMurphy => Bedingungen werden ausgeblendet '3: DocMurphy => Fehlerhafte Bedingungen werden deaktiviert '4: DocMurphy => Geometrische Sets werden ausgeblendet '*** Deklarationen *** Dim oRoot As Document Dim oProd As Product Dim oProducts As Products Dim myPart As Part Dim Counter As Integer Dim oSel As Selection Counter = 0 '*** Abfrage Dokumente *** Dim oFenster As Windows Dim ObjType As String Set oFenster = CATIA.Windows If oFenster.Count = 0 Then Box = MsgBox("Es ist kein Dokument geladen!" + Chr(10) + "Das Makro kann nicht ausgeführt werden und wird beendet!", vbCritical, "Kein Dokument geladen") Exit Sub End If Set oRoot = CATIA.ActiveDocument ObjType = TypeName(oRoot) If ObjType <> "ProductDocument" Then Box = MsgBox("Das aktive Dokument ist kein Produkt!" + Chr(10) + "Das Makro kann nicht ausgeführt werden!", _ vbCritical + vbOKOnly, "Falscher Dateityp") Exit Sub End If ObjType = "" '*** Producte instanzieren *** Set oSel = oRoot.Selection oSel.Clear Set oProd = oRoot.Product Set oProducts = oRoot.Product.Products '*** Abarbeitung startet hier *** SUB_CHECKAXIS oProducts, Counter, oSel '*** Ausgabe *** Box = MsgBox("Fertig! Es wurden " & Counter & " Achsensysteme erzeugt", vbInformation + vbOKOnly, "Makro erfolgreich beendet") End Sub Sub SUB_CHECKAXIS(oProducts,Counter,oSel) For i = 1 To oProducts.Count If TypeName(oProducts.Item(i).ReferenceProduct.Parent) = "PartDocument" Then If oProducts.Item(i).ReferenceProduct.Parent.Part.AxisSystems.Count = 0 Then Set myPart = oProducts.Item(i).ReferenceProduct.Parent.Part Set NewAxisSystem = myPart.AxisSystems.Add() NewAxisSystem.Name = "AXS_SYSTEM " myPart.Update Counter = Counter + 1 '*** Neu erzeugtes Achsensystem ausblenden *** oSel.Add NewAxisSystem oSel.VisProperties.SetShow 1 oSel.Clear '*** Ende: Neu erzeugtes Achsensystem ausblenden *** Else If oProducts.Item(i).ReferenceProduct.Parent.Part.AxisSystems.Count > 0 Then '*** Wenn schon Achsensysteme im Teil vorhanden sind so blende diese aus *** Set myPart = oProducts.Item(i).ReferenceProduct.Parent.Part Set myAxisSystems = myPart.AxisSystems For j = 1 to myPart.AxisSystems.Count Set actAxisSystem = myPart.AxisSystems.Item(j) oSel.Clear oSel. Add actAxisSystem oSel.VisProperties.SetShow 1 oSel.Clear Next '*** Ende: Vorhandene Achsensysteme ausblenden *** '*** Blende Original-Planes aus *** Set plnXY = myPart.originElements.PlaneXY Set plnYZ = myPart.originElements.PlaneYZ Set plnZX = myPart.originElements.PlaneZX oSel.Clear oSel. Add plnXY oSel. Add plnYZ oSel. Add plnZX oSel.VisProperties.SetShow 1 oSel.Clear '*** Ende: Blende Original-Planes aus *** '*** Blende Geometrische Sets aus *** Set hybBodies1 = myPart.HybridBodies For l = 1 to myPart.HybridBodies.Count Set my_hyb = myPart.Hybridbodies.Item(l) oSel.Clear oSel.Add my_hyb oSel.VisProperties.SetShow 1 oSel.Clear Next '*** Ende: Blende Geometrische Sets aus *** End If End If ElseIf TypeName(oProducts.Item(i).ReferenceProduct.Parent) = "ProductDocument" Then '*** Du befindest dich im Product -> führe Arbeiten fürs Product durch *** '*** Blende Constraints aus *** Set myProduct = CATIA.ActiveDocument.Product Set my_Constraints = myProduct.Connections("CATIAConstraints") For k = 1 to my_Constraints.Count oSel.Clear Dim MyConstrain As Constraint Set MyConstrain =my_Constraints.Item(k) oSel.Add MyConstrain oSel.VisProperties.SetShow 1 oSel.Clear Next '*** Ende: Blende Constraints aus *** '*** Deaktiviere fehlerhafte Constraints *** Set myProduct = CATIA.ActiveDocument.Product Set my_Constraints = myProduct.Connections("CATIAConstraints") For k = 1 to my_Constraints.Count Set MyConstrain =my_Constraints.Item(k) If MyConstrain.Status = catCstStatusKOBroken Then MyConstrain.Deactivate End If Next '*** Ende: Deaktiviere fehlerhafte Constraints *** If oProducts.Item(i).Products.Count > 0 Then SUB_CHECKAXIS oProducts.Item(i).Products, Counter, oSel End If End If Next End Sub __________________________________________________________________________________
Jetzt meine Fragen: 1. In grossen Baugruppen werden nicht alle Äste korrekt abgearbeitet, was kann das sein? 2. Ich würde gern für die einzelnen Funktionalitäten Unterprozeduren schreiben Das habe ich aber nicht hinbekommen, es hapert immer irgendwie an der Parameterübergabe Habt ihr hier Tipps die mir weiterhelfen würden? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator 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: 04. Aug. 2009 10:36 <-- editieren / zitieren --> Unities abgeben: Nur für DocMurphy
Hallo Doc, Ich würde das mit dem Ausblenden generell anders lösen. Versuch es über eine Selection.Search. Hier kannst du auf einmal alle Hauptebenen, Geosets und Constaints in eine Selektion packen und diese ausblenden. Dazu brauchst du keine rekursive Funktion (die macht das Makro nur unnötig langsamer). Auch die gebrochenen Constaints kannst du damit abarbeiten. Wie du schon sagst würde ich das ganze dann aber auf Unteroutinen aufteilen (Übersicht). Eine Parameterübergabe ist keien CATIA Feature sondern ein Basic von VB. Von dem her würde ich einfach mal bei Google suchen da findest du soviel Anleitungen, Toturials, etc. zu diesem Thema. Es gibt zwei Möglichkeiten das ganze in deinem Projket zu realisieren. 1. Du definierst du Variablen die du in allen Sub´s brauchst als Private (bzw. Public) dann sind sie in allen Sub´s verfügbar 2. Du übergibst beim Prozzeduraufruf die entsprechenden Variablen an die Sub (siehe Codebeispiel) Codebeispiel (Parameterübergabe) Code:
Sub CATMain()Dim myString as String MyString = InputBox("Bitte geben Sie einen Text ein") ShowMsgBox(myString) End Sub Sub ShowMsgBox(StringZumAnzeigen) Box = MsgBox (StringZumAnzeigen, vbInformation,"Übergabestring") End Sub
Hierbei wird in der CATMain einer Variablen ein String (Userinput) zugeweisen. Beim Prozzeduraufruf (ShowMsgBox) wird dieser String übergeben und in eine andere variable (StringZumAnzeigen) in der aufgerufenen Sub verfügbar. ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DocMurphy Mitglied Konstrukteur
Beiträge: 37 Registriert: 22.07.2009
|
erstellt am: 05. Aug. 2009 09:55 <-- editieren / zitieren --> Unities abgeben:
|