Autor
|
Thema: Abaqus + Python + Loft erstellen Probleme mit Edges (1273 mal gelesen)
|
Scylla Mitglied Ingenieur
Beiträge: 3 Registriert: 30.11.2017
|
erstellt am: 30. Nov. 2017 13:57 <-- editieren / zitieren --> Unities abgeben:
Servus, ich schreibe gerade meine Masterarbeit in welcher ich den Zahnkontakt von Getrieben simuliere. Hierzu habe ich ein Pythonprogramm geschrieben welches die Geometrie berechnet und ein Makro erzeugt. Die Geometrie ist nicht ganz trivial weshalb ich das Zahnrad scheibenweise aufbauen muss. Umgesetzt habe ich das mit Spline bzw. WireSpline was auch gut funktioniert. Das Problem liegt bei der Loft Erzeugung. Hier kann ich kein System finden nachdem die Ecken nummeriert werden. Wenn ich ein Makro aufnehme bei der manuellen Loft Erzeugnung erhalte ich folgendes: p.SolidLoft(loftsections=( (e[70], e[71], e[72], e[73], e[74]), (e[85], e[86], e[87], e[88], e[89])), startCondition=NONE, ... p.SolidLoft(loftsections=( (e1[75], e1[76], e1[77], e1[78], e1[79]), (e1[80], e1[81], e1[82], e1[83], e1[84])), startCondition=NONE, ... p.SolidLoft(loftsections=( (e[0], e[1], e[2], e[3], e[4]), (e[339], e[341], e[343], e[345], e[347])), startCondition=NONE, .... meine Frage ist, ob ich bei der Spline bzw. wireSpline Erstellung schon die Knoten angeben kann und diese durchnummerieren ? weil was Abaqus da macht ist irgendwie total wirr auch hinter dem e[..] und e1[..] gibt es kein Schema danke schonmal fürs lesen. mfg Chris
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: 30. Nov. 2017 17:08 <-- editieren / zitieren --> Unities abgeben: Nur für Scylla
Laut Manual werden bei SolidLoft(loftsection=x) ein Array von Kanten (Edges) bei x angegeben. Ich vermute die Reihenfolge ist nicht beliebig. Du kannst ja in A/CAE mal die Befehle nehmen die auf einzelne Kanten zeigen und dir die Kanten mit highlight() und unhighlight() im Viewport anzeigen lassen. Dann weißt du welche Kante z.B. e[70] usw. ist. Wenn du die Logik dann verstehst, kannst du dir überlegen, wie du das Vorgeben der Kanten beim Loft-Befehl automatisch regelst. Wenn du z.B. weißt wo sich die Kanten befinden, kannst du sie dir mit findAt() greifen. Oder du legst beim Erzeugen einer Kante diese in einer separaten Variable ab und kannst darüber später die ID abfragen. Das hängt aber davon ab, wie du die Splines erzeugst. Bzgl. e und e1 vermute ich, dass beide Variablen auf denselben Container mit Edges zeigen. Insofern ist es egal wie die Variable heißt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Scylla Mitglied Ingenieur
Beiträge: 3 Registriert: 30.11.2017
|
erstellt am: 30. Nov. 2017 22:47 <-- editieren / zitieren --> Unities abgeben:
vielen Dank für die Antwort, ich habe mir die Ecken anzeigen lassen, aber eine Logik kann ich dabei leider nicht erkennen. Mit dem Befehl ".edges.findAt()" erhalte ich die Ausgabe: ['Edge object'] was mir leider auch wenig hilft vielleicht verdeutlicht ein einfaches Beispiel das Problem, so erstelle ich die Geometrie: ####################################################### s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0) g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints s.Line(point1=(10, 10), point2=(10, -10)) s.Line(point1=(10, -10), point2=(-10, -10)) s.Line(point1=(-10, -10), point2=(-10, 10)) s.Line(point1=(-10, 10), point2=(10, 10)) p = mdb.models['Model-1'].Part(name='Rad00', dimensionality=THREE_D, type=DEFORMABLE_BODY) p = mdb.models['Model-1'].parts['Rad00'] p.BaseShell(sketch=s) s.unsetPrimaryObject() session.viewports['Viewport: 1'].setValues(displayedObject=p) del mdb.models['Model-1'].sketches['__profile__'] p.WirePolyLine(points=( ((10, 10, 10), (10, -10, 10)), ((10, -10, 10), (-10, -10, 10)), ((-10, -10, 10), (-10, 10, 10)), ((-10, 10, 10), (10, 10, 10))), mergeType=MERGE, meshable=ON) print(p.edges.findAt(((10, 10, 10),))) ####################################################### wenn ich manuell ein Loft erstelle sind die Ecken mit e[1], e[2], ... durchnummeriert, aber, wie kann ich die Ecken beim erstellen der Geometrie schon zuweisen ? oder wie bekomme ich z.B. e[1] wenn ich die Koordinate eingebe ? vielen Dank schonmal mfg chris 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: 01. Dez. 2017 10:41 <-- editieren / zitieren --> Unities abgeben: Nur für Scylla
Nun ja, in deinem Beispiel erstellst du mehrere Edges in eine Aktion. Da kann man nicht jede Edge direkt in einer Variable abspeichern. Das findAt() liefert dir eine Liste zurück (wobei sie nur einen Eintrag hat). Du brauchst einfach nur mit dem index null auf den ersten Eintrag der Liste zugreifen um die Kante zu finden. Aber ich habe mal was getestet. Es scheint als ob das Loft-Feature intelligent genug ist, dass die Reihenfolge der Edges pro Schicht nicht relevant ist. Insofern kann man einfach einen Punkt in jeder Schicht vorgeben, mit findAt() eine Kante ermitteln und dann über getEdgesByEdgeAngle() alle angrenzenden Kanten greifen.
Hier mal dein letztes Beispiel nach diesem Prinzip erweitert: Code:
from abaqus import * from abaqusConstants import *Mdb() session.viewports['Viewport: 1'].setValues(displayedObject=None) ### s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0) g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints s.Line(point1=(10, 10), point2=(10, -10)) s.Line(point1=(10, -10), point2=(-10, -10)) s.Line(point1=(-10, -10), point2=(-10, 10)) s.Line(point1=(-10, 10), point2=(10, 10)) p = mdb.models['Model-1'].Part(name='Rad00', dimensionality=THREE_D, type=DEFORMABLE_BODY) p = mdb.models['Model-1'].parts['Rad00'] p.BaseShell(sketch=s) s.unsetPrimaryObject() session.viewports['Viewport: 1'].setValues(displayedObject=p) del mdb.models['Model-1'].sketches['__profile__'] p.WirePolyLine(points=( ((10, 10, 10), (10, -10, 10)), ((10, -10, 10), (-10, -10, 10)), ((-10, -10, 10), (-10, 10, 10)), ((-10, 10, 10), (10, 10, 10))), mergeType=MERGE, meshable=ON) #print(p.edges.findAt(((10, 10, 10),))) # neu ab hier e = p.edges # finde eine Kante pro Schicht z0 = e.findAt(((10, 10, 0),)) z10 = e.findAt(((10, 10, 10),)) # index der zwei Kanten ermitteln z0i = z0[0].index z10i = z10[0].index # Loft erzeugen p.SolidLoft(loftsections=((e[z0i].getEdgesByEdgeAngle(90)), (e[z10i].getEdgesByEdgeAngle(90))), startCondition=NONE, endCondition=NONE)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Scylla Mitglied Ingenieur
Beiträge: 3 Registriert: 30.11.2017
|
erstellt am: 07. Dez. 2017 12:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Mustaine, ich möchte mich noch für deine Hilfe bedanken. Mit deiner Hilfestellung und dem Beispiel habe ich es dann hinbekomme... es hat alles einwandfrei funktioniert . vielen Dank mfg chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|