Autor
|
Thema: Cells mit Python auswählen (2657 mal gelesen)
|
Sigbert98 Mitglied
Beiträge: 48 Registriert: 26.02.2009
|
erstellt am: 29. Nov. 2009 15:54 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen! Gibt es mit Python eine Möglichkeit, Zellen automatisch auszuwählen? Ich benötige z.B. alle Zellen, deren x-Koordinate > 500 mm ist. Vielen Dank und weiterhin ein schönes Wochenende! Sigbert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 30. Nov. 2009 07:47 <-- editieren / zitieren --> Unities abgeben: Nur für Sigbert98
Die Frage ist, wie du z.B. die x-Koordinate deiner Zelle festmachst. Du kannst z.B. den Mittelpunkt nehmen: Code: mdb.models['Model-1'].rootAssembly.instances['Name'].cells.getSize()[1]
Wenn du das für alle Zellen machst, kennst du alle Mittelpunkte. Auf alle Tupel die du so erhalten hast musst du nun dein Auswahlkriterium anwenden. Danahc kannst du alle Zellen die noch übrig sind, der Reihe nach anwählen mit:
Code: mdb.models['Unit-Cell'].rootAssembly.instances['Unit-Cell'].cells.findAt(mittelpunkt)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sigbert98 Mitglied
Beiträge: 48 Registriert: 26.02.2009
|
erstellt am: 30. Nov. 2009 23:51 <-- editieren / zitieren --> Unities abgeben:
Hallo Carsten, vielen Dank für Deine Antwort. Leider habe ich noch ein Problem damit, mein Auswahlkriterium anzuwenden (also z.B. über eine x-Koordinate > 500 mm). Ich versuche das mit dem getSize-Befehl hinzubekommen. Leider scheitere ich daran. Für Deine/Eure Hilfe wäre ich sehr dankbar! Viele Grüße, Sigbert Code: Zellen = mdb.models['Modell'].rootAssembly.instances['Instance'].cells Liste1 = [] Liste2 = [] for i in range(0, 28): Zellen[i].getSize() Liste1.append(Zellen[i]) for k in range(len(Liste1)): if Liste1[k].getSize()>=((500.0, 0.0, 0.0), ): a = mdb.models['Modell'].rootAssembly region = (Liste1[k],) a.setMeshControls(regions=region, elemShape=TET, technique=FREE)
[Diese Nachricht wurde von Sigbert98 am 30. Nov. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 01. Dez. 2009 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für Sigbert98
Hallo, Ich denke ein Problem ist, dass Du in Liste1 lediglich eine Kopie von Zellen anlegst. Was Du vermutlich willst, sind jedoch die Koordinaten des Mittelpunkts. Code:
Zellen = mdb.models['Modell'].rootAssembly.instances['Instance'].cells Liste1 = [] Liste2 = [] xKriterium = 500.0 for zelle in Zellen: mittelpunkt = zelle.getSize()[1] # getSize liefert mehrere Werte zurück Liste1.append(mittelpunkt) for k in range(len(Liste1)): if Liste1[k][0]>=xKriterium: # mittelpunkt liefert ja drei Koordinaten, die 0. ist x a = mdb.models['Modell'].rootAssembly region = (Zellen[k],) a.setMeshControls(regions=region, elemShape=TET, technique=FREE)
Zusätzlich vergleichst Du bei dem if-Statement Äpfel mit Birnen. Soll heißen: du bekommst mit getSize raus: (Volumen der Zelle, Mittelpunkt als (x,y,z), und noch irgendwas). Wenn Du das mit dieser Sequence hinter dem if vergleichst, könnte ich mir vorstellen, dass Python überfordert ist. Das ist jedenfalls meine Vermutung. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sigbert98 Mitglied
Beiträge: 48 Registriert: 26.02.2009
|
erstellt am: 01. Dez. 2009 09:51 <-- editieren / zitieren --> Unities abgeben:
Hallo Carsten, vielen Dank für die schnelle Antwort. Ich habe nun Dein Skript übernommen. Leider meckert Abaqus immer noch bei folgender Zeile Code:
mittelpunkt = zelle.getSize()[1]
Die Fehlermeldung lautet 'Type error: unsubsricptable object'. Ich vermute, mit der [1] willst Du die x-Koordinate des Mittelpunkts ansteuern? Herzlichen Dank für Deine Hilfe! Sigbert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 01. Dez. 2009 09:56 <-- editieren / zitieren --> Unities abgeben: Nur für Sigbert98
Du hast Recht, der getSize() Befehl liefert als Rückgabewertnur das Volumen und löst gleichzeitig ein print mit den Koordinaten aus. Auf die kann man aber nicht direkt zugreifen. Vielleicht ist das doch nicht der richtige Weg.. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
carsten1983 Mitglied Doktorand
Beiträge: 125 Registriert: 11.10.2007
|
erstellt am: 01. Dez. 2009 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für Sigbert98
Code: mdb.models['Modell'].rootAssembly.instances['Instance'].cells.getVertices()
Liefert eine Liste der Punkt, die zu der Zelle gehören. Mit
Code: mdb.models['Unit-Cell'].rootAssembly.instances['Unit-Cell'].vertices[i].pointOn[0]
kannst Du die Koordinaten der Vertices bekommen.Wenn Du jetzt also mit dem 2. Befehl alle Punkte, die der erste Befehl auswirft, bezüglich ihrer Koordinaten überprüfst, hast du die gesuchte Information. Ich denke das müsste jetzt aber wirklich gehen 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. 2009 11:08 <-- editieren / zitieren --> Unities abgeben: Nur für Sigbert98
Code:
from abaqus import * from abaqusConstants import * modelName = session.sessionState[session.currentViewportName]['modelName']
m=mdb.models[modelName] r = m.rootAssembly i = r.instances['Part-1-1'] Liste1 = [] xKriterium = 18.0 for zelle in i.cells: # ueber alle Zellen der Instance zaehlen v=zelle.getVertices() # Liste mit Eckpunkten ermitteln for vertex in v: # ueber alle Eckpunkte zaehlen coords=i.vertices[vertex].pointOn # Koordinaten des Eckpunktes ermitteln if coords[0][0]>xKriterium: # Kriterium der x-Koordinate kontrollieren if Liste1.count(zelle.index)<1: # ist Zelle schon in Liste Liste1.append(zelle.index) # falls nein, dann jetzt #print Liste1
for k in Liste1: # ueber die Zellen in der Liste zaehlen region=(i.cells[k],) # Zelle wird region r.setMeshControls(regions=region, elemShape=TET, technique=FREE) # region wird angesprochen
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sigbert98 Mitglied
Beiträge: 48 Registriert: 26.02.2009
|
erstellt am: 02. Dez. 2009 07:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Mustaine, vielen Dank für Deine Hilfe. In meinem Modell scheint das Skript aber noch nicht ganz zu laufen. In der Cae wird lediglich "[81]" ausgegeben, die Elementierung wird jedoch nicht umgestellt. Hast Du evtl. noch eine Idee, woran das liegen könnte? Herzlichen Dank und einen schönen Tag! Sigbert 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. Dez. 2009 14:15 <-- editieren / zitieren --> Unities abgeben: Nur für Sigbert98
|
Sigbert98 Mitglied
Beiträge: 48 Registriert: 26.02.2009
|
erstellt am: 07. Dez. 2009 09:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Mustaine, Du hattest Recht! Ich habe das Skript in die Makro-Datei aufgenommen. Dort lief es nicht. Als eingeständiges Python-Skript läuft es aber super durch. Vielen Dank dafür und eine schöne Woche! Sigbert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |