Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SIMULIA/ABAQUS
  Python - Neuling

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Python - Neuling (1901 mal gelesen)
Gunkerle
Mitglied
WMA


Sehen Sie sich das Profil von Gunkerle an!   Senden Sie eine Private Message an Gunkerle  Schreiben Sie einen Gästebucheintrag für Gunkerle

Beiträge: 133
Registriert: 15.03.2007

erstellt am: 01. Apr. 2008 15:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,
ich versuche mittels Python auf eine bereits vorhandene odb mit dem Namen viscorolle.odb zuzugreifen, um die Daten anschließen manipulieren zu können. Leider funktioniert bereits der erste Schritt nicht richtig.

Die auskommentierte Zeile
#session.openOdb(name='myOdb', path='viscorolle.odb', readOnly=False)
funktioniert einwandfrei, sprich in cae wird dann das ODB file eingeladen. Mit der unten stehenden Variante wird anscheinend
derBefehl: myOdb=visualization.openOdb(path='viscorolle.odb')
zum Öffnen ausgeführt aber dann erhalte ich die Fehlermeldung: type error string expected as dictionary key
in der Zeile: test=session.odbs[myOdb].steps['Step-1'].frames[i].FieldOutputs['EVD'].

Eigentlich möchte ich losgelöst von Abaqus  CAE die odb einlesen und manipulieren. Dazu muesste ich u.a. auch die jeweiligen frames automatisch einlesen koennen. Im Refernzbuch wird leider immer nur als Beispiel der Zugriff auf den letzten bzw. ersten Frame eines Steps angegeben.

Wie kann ich denn mittels einer for-Schleife, also mittels for i in range(ANZAHL_DER_FRAMES) auf alle Frames einer Rechnung mit unbekannter Framelänge zugreifen. Wie kann ich also die Framelaenge bestimmen?


from abaqus import *
from abaqusConstants import *
import visualization
import odbAccess
#session.odbs[name]

#session.openOdb(name='myOdb', path='viscorolle.odb', readOnly=False)
myOdb=visualization.openOdb(path='viscorolle.odb')
test=session.odbs[myOdb].steps['Step-1'].frames[i].fieldOutputs['EVD']

ciao gunkerle

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

carsten1983
Mitglied
Doktorand


Sehen Sie sich das Profil von carsten1983 an!   Senden Sie eine Private Message an carsten1983  Schreiben Sie einen Gästebucheintrag für carsten1983

Beiträge: 125
Registriert: 11.10.2007

erstellt am: 01. Apr. 2008 16:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

Hallo,
der Fehler den du beschreibst kommt denke ich daher, dass du deiner Variable "myOdb" ja eine "Prozedur" (oder was weiß ich wie Informatiker dazu sagen würden) zugewiesen hast. Jetzt versuchst du mit dieser Variable, die ja nur die verküzte Darstellung der Öffnenprozedur darstellt, auf ein Dictionary (nämlich session.odbs) zuzugreifen. Dort muss der String hin, der den Namen der ODB bezeichnet. Deshalb müsstest du "myOdb" mit einem String ersetzen, der den Namen darstellt.
Deshalb z.B.:
bla=session.odbs.keys() --> gibt dir erstmal den Namen im odb Dictionary und weist ihn bla zu
test=session.odbs[bla]  --> mit bla kannst du jetzt die odbs ansprechen, was den 1.Fehler beheben sollte.

Mit Framelänge weiß ich nicht genau was du meinst, aber ich vermute du meinst die Anzahl der Frames. In diesem Fall könntest über

Anzahl_der_frames=len(session.odbs[myOdb].steps['Step-1'].frames) die Anzahl bestimmen

und dann mit
test=session.odbs[myOdb].steps['Step-1'].frames[i] auf den jeweiligen Frame mithilfe einer Schleife zugreifen, denke ich zmindest   


[Diese Nachricht wurde von carsten1983 am 01. Apr. 2008 editiert.]

[Diese Nachricht wurde von carsten1983 am 01. Apr. 2008 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Gunkerle
Mitglied
WMA


Sehen Sie sich das Profil von Gunkerle an!   Senden Sie eine Private Message an Gunkerle  Schreiben Sie einen Gästebucheintrag für Gunkerle

Beiträge: 133
Registriert: 15.03.2007

erstellt am: 02. Apr. 2008 11:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,
ich habe versucht mittels der Variante odbdictionary=session.odbs.keys() wie vorgeschlagen das Problem zu beheben, leider erhalte ich nach wie die Fehlermeldung, dass ein String erwartet wird in der Zeile:
test=session.odbs[odbdictionary].steps['Step-1'].frames[i].fieldOutputs['EVD'].
Offensichtlich habe ich da etwas noch nicht Verstanden.

Unten beigefügte Codezeilen (LastFrame, sollten mein Problem mit dem Einlesen von Frames und eeren Länegenbestimmung beheben).


from abaqus import *
from abaqusConstants import *
import visualization
import odbAccess
#import step
#session.odbs[name='odbdictionary']
#odbdictionary=session.odbs.keys()
#session.openOdb(name='myOdb', path='viscorolle.odb', readOnly=False)
myOdb=visualization.openOdb(path='viscorolle.odb')
odbdictionary=session.odbs.keys()
test=session.odbs[odbdictionary].steps['Step-1'].frames[i].fieldOutputs['EVD']


#lastFrame = odb.steps['Step-1'].frames[-1]
#for fieldName in lastFrame.fieldOutputs.keys():
#print fieldName

Weiss jemand Rat?

ciao gunkerle

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

carsten1983
Mitglied
Doktorand


Sehen Sie sich das Profil von carsten1983 an!   Senden Sie eine Private Message an carsten1983  Schreiben Sie einen Gästebucheintrag für carsten1983

Beiträge: 125
Registriert: 11.10.2007

erstellt am: 02. Apr. 2008 11:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

Hmm ich habs grad mal ausprobiert. Mein Vorschlag war nicht ganz ausgegoren. Das was ich mit bla bezeichnet habe sollte einen String liefern, liefert aber erstmal eine Liste mit Strings. Das heißt du musst bla[Listenindex] in

test=session.odbs[bla[0]]  einsetzen. Wobei Listenindex eine 0 sein sollte, wenn nur die gewünschte odb offen ist.

Damit gibts dann auf jedenfall erstmal keine Fehlermeldung mehr.

mfg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

OldSalt
Mitglied
Dipl.-Ing.

Sehen Sie sich das Profil von OldSalt an!   Senden Sie eine Private Message an OldSalt  Schreiben Sie einen Gästebucheintrag für OldSalt

Beiträge: 1
Registriert: 02.04.2008

erstellt am: 02. Apr. 2008 13:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

Versuch mal
myOdb=('NameDerDatei.odb')
danach siehst Du unter steps den namen des Step
z.B. Step-1
dann
s1=myOdb.steps['Step-1']
die Frames bekommst Du mit z.B.
frK= s1.getFrame(5)

Cheers

OldSalt

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Mustaine
Ehrenmitglied V.I.P. h.c.



Sehen Sie sich das Profil von Mustaine an!   Senden Sie eine Private Message an Mustaine  Schreiben Sie einen Gästebucheintrag für Mustaine

Beiträge: 3554
Registriert: 04.08.2005

Abaqus

erstellt am: 02. Apr. 2008 16:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gunkerle 10 Unities + Antwort hilfreich

Also entweder man gibt direkt die Nummer des gewünschten Steps oder Frames an, oder man generiert sich eine Liste mit Hilfe der keys() und greift auf einen Eintag in der Liste zu. Der Wert -1 heißt in Python dass der letzte Eintrag verwendet wird (also von hinten angefangen der 1.).

Hier ein Beispiel zur Anwendung. Der User hat eine odb geöffnet und startet dann das Script:

Code:

odbName = session.viewports['Viewport: 1'].displayedObject.name
odb= session.odbs[odbName]
#
# request last Frame in last Step
#
lastFrame = odb.steps[odb.steps.keys()[-1]].frames[-1]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz