Autor
|
Thema: CATIA V5 Parameter über Python auslesen (4099 mal gelesen)
|
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 10. Jun. 2010 11:15 <-- editieren / zitieren --> Unities abgeben:
Liebe Community, ich befasse mich aufgrund meiner Studienarbeit intensiv mit der CATIA Knowledgeware und wollte nun einen Schritt weiter gehen; und zwar würde ich gerne mit Python eine kleine Oberfläche programmieren, in der ich einen Wert eingebe und dieser an CATIA übermittelt wird und am Ende ein anderer Paramter, der anhand von dem eingegeben Wert, Konstruktionstabellen, Regeln etc berechnet wird und auf meiner Python- Oberfläche wieder erscheint. Speziell bei diesem Beispiel: Eingabe des Wertes = Kraft im CATIA Bauteil Ausgabe: Bolzendurchmesser nach DIN Norm. "Kraft" und "Bolzendurchmesser" sind beides Parameter in meiner CATIA Baugruppe. Wie kann ich diese in Python ansprechen/verändern? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAMiCADse Mitglied
Beiträge: 177 Registriert: 17.02.2006 V5,R19,SP9
|
erstellt am: 10. Jun. 2010 12:38 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
|
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 10. Jun. 2010 14:28 <-- editieren / zitieren --> Unities abgeben:
Danke für die Antwort, aber all diese Seiten habe ich schon durchforstet und leider nur einen Code gefunden, mit dem man sich die Parts einer Baugruppe anzeigen lassen kann. Funktioniert auch wunderbar, aber wie ich über Python auf CATIA-Parameter zugreifen kann habe ich leider noch nicht gefunden... 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: 10. Jun. 2010 14:54 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
Servus IMHO sollte die VB-Befehle (siehe V5Automation.chm) in Python ähnlich verwendbar zu sein. Warum Programmierst du in Python und nicht in VBA? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 15. Jun. 2010 16:44 <-- editieren / zitieren --> Unities abgeben:
Ich weiß selber nich wieso es Python sein soll - ist die Vorgabe meines Betreuers. Ist der Zugriff auf Parameter über VBA einfacher? Und kennst du vielleicht Internetseiten/Bücher/etc., in denen diese Thematik beschrieben wird? 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: 15. Jun. 2010 16:54 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
|
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 17. Jun. 2010 16:23 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmal und bisher vielen Dank für die Antworten. Bin nun zu VBA gewechselt und arbeite mich Stück für Stück in dem Buch "Effiziente Konstruktion mit Makros" von Ziethen durch, komme aber leider nicht allzu weit, vor Allem auch deswegen, weil die Programmierung der Makros nicht zu meinen Aufgaben gehört... Dennoch brauche ich aber ein Makro, welches beim Ausführen alle Parameter einer geöffneten Baugruppe sucht und eine Liste als txt oder excel datei erzeugt. Bisher habe ich es geschafft, ein Makro zu programmieren, welches dem User erlaubt, die neu erzeugte Textfile abzuspeichern. Leider ohne Inhalt... Wie kann ich alle Parameter automatisch suchen lassen und mit Name, Typ und Wert in dieser Datei ausdrucken? Ich hoffe, dass meine Frage nicht zu komplex ist... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 17. Jun. 2010 16:25 <-- editieren / zitieren --> Unities abgeben:
|
Christian.O Mitglied Konstrukteur
Beiträge: 1212 Registriert: 17.07.2009 Celsius-Mobile H720 i7-3840QM 32 Gb Arbeitsspeicher 256 Gb SSD Quadro K2000M Windows 7 Professional (64 Bit) Catia V5R19 (64 Bit) SpacePilot Pro
|
erstellt am: 17. Jun. 2010 16:54 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
|
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 17. Jun. 2010 16:59 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
Hier ein kleines Beispiel: Option Explicit Language="CATSCRIPT" Sub CATMain() Dim productDocument1 As Document Dim selection1 As Selection Dim I As Integer Dim TextFile1 As File Dim fileSys As FileSystem Dim oStream As TextStream Dim Outputtxt, Tmptxt As String Dim param1 As Parameter Set fileSys = CATIA.FileSystem Set productDocument1 = CATIA.ActiveDocument Outputtxt = productDocument1.Path & "\DeinTextFile.txt" Set TextFile1 = fileSys.CreateFile(Outputtxt, True) Set oStream = TextFile1.OpenAsTextStream("ForWriting")
Set selection1 = productDocument1.Selection
selection1.Search "CATKnowledgeSearch.InternalParameter,all" '****Parameter suchen For I= 1 To selection1.Count2 Set param1 = selection1.Item(I).Value If param1.UserAccessMode = 2 Then '*****nur UserParameter Outputtxt = param1.Name & " = " & param1.ValueAsString oStream.Write Outputtxt & Chr(13) & Chr(10) End If Next selection1.Clear End Sub ------------------ - Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 22. Jun. 2010 13:12 <-- editieren / zitieren --> Unities abgeben:
|
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 22. Jun. 2010 15:03 <-- editieren / zitieren --> Unities abgeben:
For I = 1 To selection1.Count2 Set param1 = selection1.Item(I).Value If param1.UserAccessMode = 2 Then 'nur UserParameter Outputtxt = param1.Name & " = " & param1.ValueAsString oStream.Write Outputtxt & Chr(13) & Chr(10) End If In der For-Schleife habe ich ja die Bedingung, dass nur die Parameter berücksichtigt werden, auf die ich vollen Zugriff habe (UserAccessMode=2), was nichts anderes heißt, dass ich diese Parameter selbst erstellt habe. Aber wie muss die Bedingung heißen, wenn ich bspw nur Winkel haben möchte? Oder nur Parameter des Typs Dichte? Also auch die Parameter, die ich NICHT selbst erstellt habe?!
[Diese Nachricht wurde von D.S. am 22. Jun. 2010 editiert.] 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: 22. Jun. 2010 18:22 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
Hallo D.S., mit TypeName(oParam) bekommst du den Datentyp. Die von dir erwähnte Parametertype wie Winkel und Dichte sind alle vom Typ Dimension. Den spezifischen Typ kannst du mit ElseIf strDatatype = "Dimension" Then Dim oDimParam As Dimension Set oDimParam = oParam strTemp = oDimParam.Unit.Magnitude & ";" ausfinden. Gruß, Zoltan
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 23. Jun. 2010 16:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Zoltan. Danke für deine Antwort aber leider reichen meine Programmierkenntnisse nicht aus, um den Code vollkommen zu verstehen... Könntest du mir bitte anstatt folgender Bedingung, die nur die UserParameter selektiert If param1.UserAccessMode = 2 Then ... End If eine spezielle Bedingung zeigen, die beispielsweise aus allen Parametern nur die Längen-Paramter rauspickt? Also komplett amateurhaft so etwas wie: If param1.PARAMETERTYP = LÄNGE/WINKEL/etc. THEN ... End If oder kann man das nicht so direkt filtern?! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 23. Jun. 2010 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
|
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: 23. Jun. 2010 19:47 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
Hallo, so einfach ist die Sache leider nicht. ich würde es in zwei ineinander verschachtelte ifs machen: Code: if TypeName(param1) = "Dimension" then 'Länge, Winkel und andere Parameter mit Einheit haben in VB(A) den Datentyp "Dimenion" Dim oDimParam As Dimension Set oDimParam = param1 'dieser Schritt würde aber Fehler bringen, wenn es kein "Dimension" wäre if lcase(oDimParam.Unit.Magnitude)="length" then 'du hast ein Parameter der Typ Länge 'LCase ist nur für die Vereinfachung drin 'andere Typen kannst du ausfinden, indem du diese Information für Parameter mit bekannter Typ ausgeben lässt end if end if
Gruß, ZoltanEine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 29. Jun. 2010 12:10 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für eure Hilfe aber leider klappt gar nichts... Schreibe ich einen Code um mir die Längen auslesen zu lassen kommen 4 zeilen mit parametern wie biegeschwellfestigkeit und zulässiger spannung. sind nicht ganz Parameter des Typs länge hier mein Code: habe ich irgendwo einen Fehler, den ich nicht sehe oder sehen kann?! Code: Sub CATMain() Dim productDocument1 As Document Dim selection1 As Selection Dim I As Integer Dim TextFile1 As File Dim fileSys As Object Dim oStream As TextStream Dim Outputtxt, Tmptxt As String Dim param1 As Parameter Set fileSys = CATIA.FileSystem Set productDocument1 = CATIA.ActiveDocument Outputtxt = productDocument1.Path & "\UserParameter_VBA.txt" Set TextFile1 = fileSys.CreateFile(Outputtxt, True) Set oStream = TextFile1.OpenAsTextStream("ForWriting") Set selection1 = productDocument1.Selection selection1.Search "CATKnowledgeSearch.InternalParameter,all" For I = 1 To selection1.Count2 Set param1 = selection1.Item(I).Value If TypeName(param1) = "Dimension" Then Dim oDimParam As Dimension Set oDimParam = param1 If LCase(oDimParam.Unit.Magnitude) = "Length" Then Outputtxt = param1.Name & " = " & param1.ValueAsString oStream.Write Outputtxt & Chr(13) & Chr(10) End If End If Next selection1.Clear MsgBox "UserParameter.txt im Ordner " & (productDocument1.Path) & " gespeichert" End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 29. Jun. 2010 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
So wie unten funktioniert es bei mir einwandfrei, ist aber wie oben schon erwähnt nur bei Längen und Winkel so einfach. Sub CATMain() Dim productDocument1 As Document Dim selection1 As Selection Dim I As Integer Dim TextFile1 As File Dim fileSys As Object Dim oStream As TextStream Dim Outputtxt, Tmptxt As String Dim param1 As Parameter Set fileSys = CATIA.FileSystem Set productDocument1 = CATIA.ActiveDocument Outputtxt = productDocument1.Path & "\UserParameter_VBA.txt" Set TextFile1 = fileSys.CreateFile(Outputtxt, True) Set oStream = TextFile1.OpenAsTextStream("ForWriting") Set selection1 = productDocument1.Selection selection1.Search "CATKnowledgeSearch.InternalParameter,all" For I = 1 To selection1.Count2 Set param1 = selection1.Item(I).Value If TypeName(param1) = "Length" Then Outputtxt = param1.Name & " = " & param1.ValueAsString oStream.Write Outputtxt & Chr(13) & Chr(10) End If Next selection1.Clear MsgBox "UserParameter.txt im Ordner " & (productDocument1.Path) & " gespeichert" End Sub
------------------ - Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 29. Jun. 2010 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
ich denke 'Magnitude' ist sprachabhängig und sollte bei dir warscheinlich "länge" anstatt "Length" sein? ------------------ - Robert [Diese Nachricht wurde von EngineeredByRobberts am 29. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 29. Jun. 2010 12:48 <-- editieren / zitieren --> Unities abgeben:
|
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 29. Jun. 2010 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
Hab gerade noch mal rumprobiert, und Längen sind vom Typ 'Length' und NUR vom Typ 'Length' und NICHT vom Typ 'Dimension' 'If TypeName(param1) = "Length" Then' funktioniert einwandfrei, das mit Unit.Magnitude kannst du dich bei Längen sparen ------------------ - Robert 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: 29. Jun. 2010 12:58 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
Servus Du müsstest doch "länge" oder "lenght" schreiben (Kleinschreibung), da du zuvor den String mit LCase konvertiert hast. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 29. Jun. 2010 13:00 <-- editieren / zitieren --> Unities abgeben:
was mich aber auch bei diesem Code verwundert: Code:
Set param1 = selection1.Item(I).Value If TypeName(param1) = "Length" Then Outputtxt = param1.Name & " = " & param1.ValueAsString oStream.Write Outputtxt & Chr(13) & Chr(10) End If
gehe ich über den formel/parametereditor auf den filtertyp länge bekomme ich etwa das 10-fache an parametern als über das makro. woran könnte das nun liegen?! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 29. Jun. 2010 13:09 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bgrittmann: Servus Du müsstest doch "länge" oder "lenght" schreiben (Kleinschreibung), da du zuvor den String mit LCase konvertiert hast.Gruß Bernd
LCase konvertiert den String automatisch in kleinbuchstaben. was aber auch komisch ist, da es bei mir nur mit "Length" funktioniert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 29. Jun. 2010 13:13 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
das liegt an der Suche selection1.Search "CATKnowledgeSearch.InternalParameter,all" Längen aus Skizzen findest du zum Beispiel über: selection1.Search "CATSketchSearch.MfLengthConstraint,all" ------------------ - Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
D.S. Mitglied Student
Beiträge: 18 Registriert: 26.05.2010
|
erstellt am: 29. Jun. 2010 14:29 <-- editieren / zitieren --> Unities abgeben:
erneut herzlichen Dank für all die Antworten, ich habe nun fast alles was ich brauche um meine eigentliche Arbeit fortzuführen. Beim folgenden Code bekomme ich noch die Fehlermeldung "Typen unverträglich", die ich noch gerne weg haben würde, hoffe ihr könnt mir ein letztes mal helfen bitte! Code: Sub CATMain() Dim productDocument1 As Document Dim selection1 As Selection Dim I As Integer Dim TextFile1 As File Dim fileSys As Object Dim oStream As TextStream Dim Outputtxt, Tmptxt As String Dim param1 As ParameterSet fileSys = CATIA.FileSystem Set productDocument1 = CATIA.ActiveDocument Outputtxt = productDocument1.Path & "\LengthParameter_VBA.txt" Set TextFile1 = fileSys.CreateFile(Outputtxt, True) Set oStream = TextFile1.OpenAsTextStream("ForWriting") Set selection1 = productDocument1.Selection selection1.Search "CATSketchSearch.MfLengthConstraint,all" 'dieses Makro soll sich auf Längen beschränken For I = 1 To selection1.Count2 Set param1 = selection1.Item(I).Value 'in dieser zeile versteckt sich ein Fehler...' If TypeName(param1) = "Length" Then Outputtxt = param1.Name & " = " & param1.ValueAsString oStream.Write Outputtxt & Chr(13) & Chr(10) End If Next selection1.Clear MsgBox "UserParameter.txt im Ordner " & (productDocument1.Path) & " gespeichert" End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EngineeredByRobberts Mitglied Ingenieur
Beiträge: 109 Registriert: 27.04.2010 Dell Precision 690 Windows XP V5R19SP3 V5R17SP0
|
erstellt am: 29. Jun. 2010 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für D.S.
du suchst halt jetzt nach Constraints und nicht nach Parameter, deswegen muss der Typ jetzt auf Constraint umgestellt werden. Der 'If Then' Schleife kannst du dich sparen da du schon nach Constraints vom Typ Length gesucht hast. Sub CATMain() Dim productDocument1 As Document Dim selection1 As Selection Dim I As Integer Dim TextFile1 As File Dim fileSys As Object Dim oStream As TextStream Dim Outputtxt, Tmptxt As String Dim constraint1 As Constraint Set fileSys = CATIA.FileSystem Set productDocument1 = CATIA.ActiveDocument Outputtxt = productDocument1.Path & "\UserParameter_VBA.txt" Set TextFile1 = fileSys.CreateFile(Outputtxt, True) Set oStream = TextFile1.OpenAsTextStream("ForWriting") Set selection1 = productDocument1.Selection selection1.Search "CATSketchSearch.MfLengthConstraint,all" For I = 1 To selection1.Count2 Set constraint1 = selection1.Item(I).Value Outputtxt = constraint1.Name & " = " & constraint1.Dimension.ValueAsString oStream.Write Outputtxt & Chr(13) & Chr(10) Next selection1.Clear MsgBox "UserParameter.txt im Ordner " & (productDocument1.Path) & " gespeichert" End Su ------------------ - Robert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |