Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SIMULIA/ABAQUS
  Abaqus + Python + Loft erstellen Probleme mit Edges

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:   Abaqus + Python + Loft erstellen Probleme mit Edges (150 mal gelesen)
Scylla
Mitglied
Ingenieur

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

Beiträge: 3
Registriert: 30.11.2017

erstellt am: 30. Nov. 2017 13:57    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


Zahnflanke.JPG

 
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.



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: 3062
Registriert: 04.08.2005

Abaqus

erstellt am: 30. Nov. 2017 17:08    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 Scylla 10 Unities + Antwort hilfreich

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

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

Beiträge: 3
Registriert: 30.11.2017

erstellt am: 30. Nov. 2017 22: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

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.



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: 3062
Registriert: 04.08.2005

Abaqus

erstellt am: 01. Dez. 2017 10:41    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 Scylla 10 Unities + Antwort hilfreich

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

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

Beiträge: 3
Registriert: 30.11.2017

erstellt am: 07. Dez. 2017 12:41    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 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 >>)

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)2017 CAD.de