| |
| KISTERS 3DViewStation WebViewer: Sichere 3D-Visualisierung - jederzeit und überall, eine Pressemitteilung
|
Autor
|
Thema: Knotenkoordinaten ausgeben lassen (5591 mal gelesen)
|
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 09. Jul. 2012 15:30 <-- editieren / zitieren --> Unities abgeben:
Hey, ich stehe im Moment wohl ein bisschen auf dem Schlauch. Ich will mir die Koordinaten zu den Knoten ausgeben lassen. Das Bauteil sollte sich im unverformten Zustand befinden. Da ich immer noch Schwierigkeiten mit dem Python-Programmieren habe, kann es auch sein, dass mein Ansatz schon falsch ist Im Abaqus Scripting Manual hab ich jetzt auch nicht den Nötigen Hinweis finden können. Wenn ich das Programm in Abaqus laufen lasse, passiert einfach nichts. Es kommt keine Fehlermeldung, daher weiß ich nicht wo ich ansetzten soll. Hier mein Code: # Do not delete the following import lines
from abaqus import * from abaqusConstants import * import part Teil = mdb.models['Model-1'].parts['balken_test_parameterexport'] Knotenliste = Teil.nodes for i in Knotenliste: print 'Node = %d x = %6.4f, y = %6.4f, z = %6.4f\n' % (i.label, i.coordinates[0], i.coordinates[1], i.coordinates[2]) Kann mir da jemand weiterhelfen? Grüße, Elias
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
slein89 Mitglied
Beiträge: 139 Registriert: 30.04.2012
|
erstellt am: 10. Jul. 2012 09:23 <-- editieren / zitieren --> Unities abgeben: Nur für exzessiv
Willst du die Knoten wirklich aus der Model Datei (MDB) auslesen oder aus einer ODB? Bei ersterem kannst du dir die Knoten auch einfach aus dem INPUT File nehmen. Dein Code funktioniert bei mir auf jeden Fall. Ich erhalte die Koordinaten der Knoten. Hast du dein Part vielleicht noch nicht vernetzt? Hast du den Code eingefügt so wie er hier in deinem Post steht? Dann müsstest du noch einen Tabulator/ eine Einrückung bei der letzten Zeile einfügen. Grüße Slein P.S.: Es wäre schön, wenn du immer eine Rückmeldung gibst, ob das Problem gelöst werden konnte oder nicht (siehe dein letzter Beitrag) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 10. Jul. 2012 20:10 <-- editieren / zitieren --> Unities abgeben:
In meinem Code ist die Zeile schon eingerückt. Es passiert immernoch nichts... Vernetzt ist alles, ich habe auch schon eine Berechnung durchgeführt. Wie kann man sich die Koordinaten aus der odb holen? Im Scripting Manual steht irgendwas, ich steig aber noch nicht durch. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
slein89 Mitglied
Beiträge: 139 Registriert: 30.04.2012
|
erstellt am: 11. Jul. 2012 09:26 <-- editieren / zitieren --> Unities abgeben: Nur für exzessiv
Hier mal ein Skript, welches dir aus der ODB folgendes ausliest: Knotenkoordinaten im undefinierten Zustand Elemente mit zugehörigen Knoten Knotenkoordinaten im deformierten Zustand <-- dazu musst du bei deiner Rechnung den FieldOutput "COORD" eingestellt haben Verschiebungen Spannungen Ich hoffe das hilft. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 11. Jul. 2012 10:04 <-- editieren / zitieren --> Unities abgeben:
Ich habe versucht das Skript so zu ändern, dass ich erstmal nur die Koordinaten bekomme: from odbAccess import * from abaqusConstants import * import part odbPath = 'Verschiebung_Test.odb' Part = 'Part-1-1' Step = 'Step-1' odb = openOdb(path=odbPath) assembly = odb.rootAssembly OUT=open('Koordinaten.txt','w')
for n in assembly.instances[Part].nodes: OUT.write(str(n.label) + '\t' + str(n.coordinates[0]) +'\t' + str(n.coordinates[1]) + \ '\t' + str(n.coordinates[2]) + '\n') OUT.close() In der for-Schleife ist die Zeile im Skript auch eingerückt. Es kommt allerdings folgende Fehlermeldung: line 21, in <module> for n in assemly.instances[Part].nodes: KeyError: Part-1-1 Auserdem habe ich es vorhin auch selbst versucht:
from odbAccess import * from abaqusConstants import * from math import * import part import odbAccess odbPath = 'Verschiebung_Test.odb' odb = openOdb(path=odbPath) a = odb.rootAssembly Knotenliste = a.nodes for i in Knotenliste: print 'Node = %d x = %6.4f, y = %6.4f, z = %6.4f\n' % (i.label, i.coordinates[0], i.coordinates[1], i.coordinates[2]) Wenn ich dieses Skript ausführe passiert überhaupt nichts.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
slein89 Mitglied
Beiträge: 139 Registriert: 30.04.2012
|
erstellt am: 11. Jul. 2012 10:13 <-- editieren / zitieren --> Unities abgeben: Nur für exzessiv
Bei dem ersten Skript: "Part-1-1" ist offensichtlich falsch. Groß und Kleinschreibung sind wichtig. Also entweder heißt der Part "PART-1-1" oder noch anders. Öffne am besten die ODB im Viewer und klappe den Reiter "Instances" auf. Dort sollte der Part drinne stehen. Warum bei deinem zweiten Skript nichts passiert, sehe ich so auch nicht. Lade am besten mal die ODB hoch (musst du vorher als ZIP packen). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 11. Jul. 2012 10:38 <-- editieren / zitieren --> Unities abgeben:
|
slein89 Mitglied
Beiträge: 139 Registriert: 30.04.2012
|
erstellt am: 11. Jul. 2012 10:45 <-- editieren / zitieren --> Unities abgeben: Nur für exzessiv
|
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 11. Jul. 2012 10:51 <-- editieren / zitieren --> Unities abgeben:
|
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 11. Jul. 2012 12:15 <-- editieren / zitieren --> Unities abgeben:
Ich habe noch ein kleines Problem, wie kann ich ein Dictionary erstellen, in dem jedem Knoten die Magnitude zugewiesen wird? Ich habe es mal versucht, allerdings haut das nicht wirklich hin: from odbAccess import * from abaqusConstants import * from math import sqrt import part odbPath = 'Job-1.odb'
odb = openOdb(path=odbPath) lastFrame = odb.steps['Step-1'].frames[-1] displacement=lastFrame.fieldOutputs['U'] fieldValues=displacement.values Verschiebung = {} #Hier meine ich ein Dictionary erstellt zu haben for v in fieldValues: magnitude = sqrt(v.data[0]**2 + v.data[1]**2 + v.data[2]**2) Verschiebung['v.nodeLabel'] = magnitude # Hier wollte ich das Dictionary in der for-Schleife mit Einträgen füllen a = len(Verschiebung) print a Als Ergebnis bekomme ich 1, allerdings habe ich knapp 500 Knoten... Auserdem kommt im Ausgabefenster: Warning: The database has been opened with readOnly flag on. It will remain readOnly. Aber ich will ja eigentlich auch nur lesen und nix in die odb schreiben.
[Diese Nachricht wurde von exzessiv am 11. Jul. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
slein89 Mitglied
Beiträge: 139 Registriert: 30.04.2012
|
erstellt am: 11. Jul. 2012 14:07 <-- editieren / zitieren --> Unities abgeben: Nur für exzessiv
Zu deinem letzten Beitrag: Die Meldung mit Read-Only erhältest du, wenn du das Skript aufrufst und die ODB bereits geöffnet war (z.B. im Viewer). Mann könnte noch eine Option angeben, dass das Skript auch schreiben darf, aber das willst du ja nicht. Schreibe mal "Verschiebung[v.nodeLabel]" statt Verschiebung['v.nodeLabel']". Bei deiner Variante besitzt das Dictionary nur einen einzigen key und der heißt "v.nodeLabel". Lässt du die Apostrophe weg, werden die Knotennummern als keys benutzt und es sollte 500 keys geben. Dein INPUT File schau ich mir gleich mal an. EDIT: Also wenn ich dein INPUTFILE ausführe und danach mein Skript auf die ODB loslasse, erhalte ich alle Werte (Knoten, Elemente,Spannung, Verschiebung). Du musst bei der Zeile mit part auch wirklich "PART-1-1" schreiben und nicht "Part-1-1". Groß- und Kleinschreibung sind wichtig!!! [Diese Nachricht wurde von slein89 am 11. Jul. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 11. Jul. 2012 14:35 <-- editieren / zitieren --> Unities abgeben:
Ich bekomme jetzt auch die Koordinaten, und das mit dem Dictionary hat auch funktioniert, vielen Dank. Wenn ich bei mir den Reiter Instances öffne steht da Part-1-1 ist das im Code dann immer PART-1-1 oder muss man das einfach ausprobieren wenns nicht geht? Kann man aus einem Dictionary auch die größten 5 oder 20 Elemente auslesen? Im Internet finde ich nur den Befehl, der das größte Element ausgiebt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
slein89 Mitglied
Beiträge: 139 Registriert: 30.04.2012
|
erstellt am: 11. Jul. 2012 15:17 <-- editieren / zitieren --> Unities abgeben: Nur für exzessiv
|
exzessiv Mitglied Student
Beiträge: 23 Registriert: 04.07.2012
|
erstellt am: 11. Jul. 2012 15:34 <-- editieren / zitieren --> Unities abgeben:
Ich wäre gern kein so ein Experte wie du Ich habe mir etwas gebastelt/ gefunden: Verschiebung = { } for v in fieldValues: magnitude = sqrt(v.data[0]**2 + v.data[1]**2 + v.data[2]**2) Verschiebung[v.nodeLabel] = magnitude a = int(len(Verschiebung)*0.05) b = Verschiebung.keys() b.sort(key=Verschiebung.__getitem__) Knoten_mit_groester_Verschiebung = b[-a:] print Knoten_mit_groester_Verschiebung Aus dem Dictionary bekomme ich zum Schluss die 5% der Knoten mit der Größten Verschiebung. Ich habe das Dictionary umgedreht (Knoten:Verschiebung ---> Verschiebung: Knoten)und sortiert. Dann musste ich mir nurnoch die letzten 5 % ausgeben lassen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |