| |
 | Die Gewinne der Zukunft werden mit intelligenten, autonomen Elektrofahrzeugen eingefahren. (3DEXPERIENCE) |
Autor
|
Thema: [Python Skript] Ausgewählte Daten aus odb auslesen (3624 mal gelesen)
|
O Shovah Mitglied Student

 Beiträge: 17 Registriert: 01.03.2011 Catia V5 R19 Phenom II X4 940 BE HD 4870X2 8 GB RAM
|
erstellt am: 01. Aug. 2013 16:50 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich bin noch ziemlich neu im Thema python scripting für Abaqus und tue mich etwas schwer mich durchs Scripting User´s und Reference Manual zu kämpfen. Grundsätzlich brauche ich das Skript um Daten aus verschiedenen odb-Dateien auszulesen und in eine Textdatei zu schreiben. Erste Iteration, die schon klappt ist manuell im Skript Jobname, gewünschten Step etc. einzutragen und dann das Skript die Ergebnisdatei schreiben zu lassen. Jetzt würde ich das gerne ein wenig automatisieren oder vereinfachen, damit man nicht für jede Auswertung erst das halbe Skript umschrieben muss. In einem Beispielcode hab ich folgendes gefunden: odbName = session.viewports['Viewport: 1'].displayedObject.name odb= session.odbs[odbName] womit ich schon mal den Job über die aktive Auswahl in Abaqus auswählen kann. Das würd eich jetzt gerne weiterführen und z.B. auch über Auswahl der Elemente festlegen können, welche Werte rausgeschrieben werden. Der Befehl getActiveNodeLabels() scheint da aber nicht das richtige zu sein, oder? Activ sind hier scheinbar immer alle im Viewport angezeigten Elemente. Gibts ne einfach Möglichkeit die markierten Elemente zu verwenden? Vielen Dank schon mal im Vorraus! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
O Shovah Mitglied Student

 Beiträge: 17 Registriert: 01.03.2011 Catia V5 R19 Phenom II X4 940 BE HD 4870X2 8 GB RAM
|
erstellt am: 02. Aug. 2013 14:31 <-- editieren / zitieren --> Unities abgeben:         
Ich glaube ich bin der Lösung schon ein wenig näher gekommen mit diesem Codebeispiel: vp = session.viewports.values()[0] odbName = vp.displayedObject.name odb= session.odbs[odbName] current_step_number = vp.odbDisplay.fieldFrame[0] current_step_name = odb.steps.keys()[current_step_number] current_frame_number = vp.odbDisplay.fieldFrame[1]
Damit kann ich jetzt entweder alle Frames oder einen bestimmten übers selektieren ausgeben. Wie könnte man jetzt am besten eine Auswahl an Frames bestimmen? Markieren lässt sich ja immer nur einer. Doch wieder mauell ins Skript eintragen? Das Thema Knoten auswählen müsste doch irgendwie über leaf zu Lösen sein oder? leaf = dgo.LeafFromOdbElementPick(elementPick=(('PART-1-1', 225, (........ Hier sind dann die ganzen selektierten Knoten in irgendeiner Form aufgelistet session.viewports['Viewport: 1'].odbDisplay.displayGroup.replace(leaf=leaf) Wie bekomme ich jetzt die Knoten aus der aktuellen Auswahl? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mustaine Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 02. Aug. 2013 15:21 <-- editieren / zitieren --> Unities abgeben:          Nur für O Shovah
Wenn Regionen (Knoten oder Elemente) erst während dem Postprocessing ausgewählt werden sollen, ist es das Beste wirklich mit ein- und ausblenden zu arbeiten und dann die aktiven Knoten und Elemente abzufragen. Sind die Regionen vorher schon klar, arbeitet man am besten mit Knoten- und Elementsets. Will man während das Skript läuft Daten eingeben (z.B. den zu verwendenden Frame), kann man sich mit getInput() oder raw_input() eine kleine Abfrage einbauen.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
O Shovah Mitglied Student

 Beiträge: 17 Registriert: 01.03.2011 Catia V5 R19 Phenom II X4 940 BE HD 4870X2 8 GB RAM
|
erstellt am: 05. Aug. 2013 14:04 <-- editieren / zitieren --> Unities abgeben:         
danke für die Antwort Mustaine! Ja, ich bekomme die odbs und muss damit arbeiten, am Modell kann ich nichts beeinflussen, aber es soll natürlich möglichst universell auf verschiebene Jobs passen. Aber ausblenden ist denk ich auch nicht viel mehr Arbeit als markieren, das stimmt schon. Ich werde denk ich eh zwei Skripte machen. Eins das mit der Auswahl im CAE arbeitet und eins das man über mehrere odbs laufen lassen kann mit festen Eingaben. Da tu ich mich als jemand der nur gelegentlich programmiert aber etwas schwerer. Wie strukturiere ich das Skript am besten, dass sich einerseits möglichs variabel alles einstellen und auswählen lässt, andererseits der User aber nicht das ganze Skript nach den Stellgrößen durchsuchen muss. Im ersten Schritt hab ich einfach ein-/auskommentiert, aber das ist ja nicht zumutbar. Vielleicht am Anfang des Skripts ein paar Variablen einführen mit denen man bestimmte Funktionen über if-Abfragen einschaltet oder Stellgrößen bereits am Anfang definiert?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mustaine Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 05. Aug. 2013 17:55 <-- editieren / zitieren --> Unities abgeben:          Nur für O Shovah
|
O Shovah Mitglied Student

 Beiträge: 17 Registriert: 01.03.2011 Catia V5 R19 Phenom II X4 940 BE HD 4870X2 8 GB RAM
|
erstellt am: 06. Aug. 2013 14:47 <-- editieren / zitieren --> Unities abgeben:         
|
Mustaine Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 06. Aug. 2013 15:03 <-- editieren / zitieren --> Unities abgeben:          Nur für O Shovah
|
O Shovah Mitglied Student

 Beiträge: 17 Registriert: 01.03.2011 Catia V5 R19 Phenom II X4 940 BE HD 4870X2 8 GB RAM
|
erstellt am: 07. Aug. 2013 14:28 <-- editieren / zitieren --> Unities abgeben:         
wenn ich den Abschnitt richtig verstehe kann ich zwischen odb.steps[AB].frames[bla].FieldOutput[XY] und .values[Yz].data ein .getSubset(position=INTEGRATION_POINT) einfügen. Das läuft auch ohne Fehler, gibt aber die gleichen Werte aus. Nimmt er wenn ich den Teil weglasse default die Integrationspunkte? Der Fehler liegt doch wo anders. Der Code gibt zwar die richtige Anzahl an Werten aus, aber leider die falschen wie ich jetzt bemerkt habe und sogar für Elemente die keine Werte für die SDVs haben. Ich glaub die Schleife über die activeNodeLabels ist flasch, da muss ich nochmal drüber schaun. Wichtiger wäre es jetzt eigentlich die gewünschten Elemente auch ohne CAE übers Skript auszuwählen. Über ElementLabel wird keinen Sinn machen, eher über Koordinaten. Die Proben sind i.d.R. quaderförmig. Edit: Nach kleineren Schwierigkeiten kann ich jetzt auf die Koordinaten zugreifen, aber wie verknüpfe ich die jetzt? Über odb.rootAssembly.instance['PART-1-1'].nodes[n].coordinates bringts mir ja nichts, weil ich dann immern noch nicht weiß welches values.data zu welchen Koordinaten gehört. Aber über step.frames[Y].fieldOutputs['bla'].values[X].instance.nodes[Z].coordinates bekommt man sie ja auch. Aber warum gibts zu einem Value wieder alle Knoten? Ich glaube ich habe da noch ein Verständnisproblem. Ich bekomme doch von jedem Element zu jedem Integrationspunkt einen Wert, deswegen hab ich auch mehr Values als Knoten. Aber müsste ein Value (oder eben max. 8) nicht trotzdem einem Knoten zugeordnet werden können? Gibt es sowas wie die Koordinaten eines Integrationspunktes? Ich muss für die Werte ja mit einer Schleife übe rdie Values laufen und die Abbruchbedingung sollte aus der Geometire folgen. [Diese Nachricht wurde von O Shovah am 07. Aug. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mustaine Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 08. Aug. 2013 09:56 <-- editieren / zitieren --> Unities abgeben:          Nur für O Shovah
|
O Shovah Mitglied Student

 Beiträge: 17 Registriert: 01.03.2011 Catia V5 R19 Phenom II X4 940 BE HD 4870X2 8 GB RAM
|
erstellt am: 30. Aug. 2013 14:55 <-- editieren / zitieren --> Unities abgeben:         
Komme jetzt erst wieder dazu am Skript weiter zu arbeiten. Den Field Output müsste ich ja vor der Simulation anfordern oder? Das Problem ist, dass ich fertige odbs bekomme bei denen dieser Fieldoutput im Moment nicht gesetzt ist. Würde das überhaupt mein Problem lösen? Damit kann die Koordinaten doch immer noch nicht bestimmten Values zuweisen. Das einzige was ich bisher gesehen hatte war über das assembly die ElementLabels zu bekommen und die zugehörigen Nodes. Deren Koordinaten vergleiche ich dann in der Schleife mit meinem gewünschten Bereich. Mit den gefilterten Labels geh ich dann wieder in die FieldOutputs mach ne Schleife über die Values mit passendem Label und schreib mir deren Wert raus. Geht das nicht irgendwie eleganter? Das sind ja jetzt 3 Schleifen über alle Elemente/Knoten was bei größeren Parts mit vielen Frames ganz schön dauern kann.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |