Autor
|
Thema: python: faces.findAt() (8434 mal gelesen)
|
Capucho2002 Mitglied Bauing.
Beiträge: 17 Registriert: 17.10.2007
|
erstellt am: 20. Mrz. 2008 14:42 <-- editieren / zitieren --> Unities abgeben:
Hallo, wiedermal ein Pythonproblem: Ich möchte eine Auswahl von faces erstellen mit faces.findAt(). so funktionerts:
Code:
Instance.faces.findAt(((150.0, 150.0, 0.0),), ((62.5, 150.0, 0.0),))
so leider nicht (fehlermeldung (too many arguments, expected 1, got 2):
Code:
a=((150.0, 150.0, 0.0),), ((62.5, 150.0, 0.0),) Instance.faces.findAt(a)
Bei 2 Flaechen die ich auswählen möchte ist dies sicherlich noch zu verschmerzen, jedoch sollte es auf sowas hinaus laufen:
Code:
xyz=[] for i in range(len(Instance.faces)): a=Instance.faces.getCentroid() b=list(a) if b[0][2]==0: xyz+=(b[0],), Instance.faces.findAt(xyz)
Wäre schön, wenn jemand eine Idee hätte, wie die Auswahl der faces über eine Schleife funktionieren könnte, oder kann Abaqus mit Tuplen/Listen nichts in dieser Form anfangen? Grüße und vielen Dank für eure Hilfe! 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: 26. Mrz. 2008 10:38 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Ich weiß nicht genau was du vorhast, aber wenn man gleichzeitig über findAt nicht mehrere Flächen ansprechen kann dann mach das doch in einer Schleife. Schreib die Centroids in eine Liste und geh diese dann in einer extra Schleife durch. Hier ein Beispiel. Erzeuge ein Part-1 und eine Instance Part-1-1. Dann ruf' dieses Script auf. Code:
a = mdb.models['Model-1'].rootAssembly.instances['Part-1-1'] centroidlist = [] for i in range(len(a.faces)): x=a.faces[i].getCentroid() #Kontrollausgaben #print '************' #print x #print x[0][0] #print x[0][1] #print x[0][2] #print '************' centroidlist.append(x) print centroidlist for k in range(len(centroidlist)): if centroidlist[k][0][2]== 0: print 'Flaeche '+str(k)+' in Liste hat Centroid bei z = 0' print 'Erstelle Surface-Set von dieser Fläche' face_x = a.faces.findAt(centroidlist[k]) s1 = mdb.models['Model-1'].rootAssembly s1.Surface(side1Faces=face_x, name='Surf-'+str(k))
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Capucho2002 Mitglied Bauing.
Beiträge: 17 Registriert: 17.10.2007
|
erstellt am: 26. Mrz. 2008 17:42 <-- editieren / zitieren --> Unities abgeben:
Hallo Mustaine, vielen Dank schonmal für deine Antwort. Du hast Recht, ich hätte vielleicht mehr Infos zu meinem Problem geben sollen. Mein Ziel war alle Faces eines Körpers auf der Symmetrieachse (z=0) zu "fangen" und sie anschliessend in ein Set zusammenzufassen. Auf Grund von einigen Schnittenebenen ist der gesamte Körper ziemlich "verhunzt". Bin glaube ich einen ähnlichen Weg gegangen, den du vorschlägst:
Code: t=[] xyz=[] for i in range(len(Part.faces)): a=Part.faces[i].getCentroid() #gibt ((x1,y1,z1) b=list(a) if b[0][2]==0: t+=a, for i in range(len(t)): faceSymm=Part.faces.findAt(t[i]) a=Part.Set(name="test"+str(i), faces=faceSymm) Part.SetByMerge(name="PartSymm",sets=Part.sets.values())for name in Part.sets.keys(): if name<>"PartSymm": del Part.sets[name] else: pass
Meine Frage zielte eigentlich mehr auf die Tatsache ab, dass Python/Abaqus Sequencen(d.h. Tupel), wenn ich es richtig verstanden habe, zurückt gibt. Wenn ich jetzt also z.B. findAt() aufrufe und mir das Ergebnisse ausgebe, kriege ich ein face object zurück. Programmier ich findAt() über eine Schleife muss es ja eine Liste sein, leider funkt das anschliessende Umwandeln in einen Tupel nicht. Hier krieg ich die Fehlermeldung bzw. ich kann dieses Tupel nicht ohne Fehlermeldung übergeben. Der Umweg den wir beide gehen über die dicts finde ich recht umständlich, aber anscheinend der einzigste Weg der machbar ist? Gruesse und nochmal Danke für deine Hilfe!
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: 27. Mrz. 2008 12:27 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Ich finde den Weg über eine extra Schleife eigentlich sogar übersichtlicher. Um alle Symmetrieflächen in ein Set zu bekommen braucht man auch nicht mehr viel machen. Man prüft halt alle Flächen. Die Flächen die das Kriterium erfüllen werden in ein Set gelegt und eine Liste mit den Sets wird angelegt. Dann werden alle diese Sets zu einem gemerged und ggf. die einzelnen Sets wieder gelöscht. Code:
a = mdb.models['Model-1'].rootAssembly.instances['Part-1-1'] centroidlist = [] listfaceset = [] listsetnames = []for i in range(len(a.faces)): x=a.faces[i].getCentroid() centroidlist.append(x) # Kontrolle # print centroidlist for k in range(len(centroidlist)): if centroidlist[k][0][2]== 0: print 'Flaeche '+str(k)+' in Liste hat Centroid bei z = 0' print 'Erstelle Set von dieser Fläche' face_x = a.faces.findAt(centroidlist[k]) s1 = mdb.models['Model-1'].rootAssembly setname = 'Set_Surf-'+str(k) s1.Set(faces=face_x, name=setname) set_x = s1.sets[setname] listfaceset.append(set_x) listsetnames.append(setname) if len(sets) > 0: s1.SetByMerge(name='Set-symm_z', sets=(listfaceset)) # löschen der einzelnen Sets if len(listsetnames) > 0: s1.deleteSets(setNames=(listsetnames))
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Capucho2002 Mitglied Bauing.
Beiträge: 17 Registriert: 17.10.2007
|
erstellt am: 28. Mrz. 2008 16:11 <-- editieren / zitieren --> Unities abgeben:
Mich hat bei meiner Lösung vorallem meine letzte Schleife (Löschen der Sets) gestört, da ich vorher schon andere Sets erstellt habe. Diese wollte ich natürlich nicht löschen. Hier ist deine Lösung sicher besser! Ich werde sie mir borgen gruss und schönes Wochende! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Cosynus Mitglied
Beiträge: 3 Registriert: 07.08.2014
|
erstellt am: 07. Aug. 2014 18:42 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Hallo, vielen Dank erstmal für das oben genannte Beispiel, das hat mir sehr weitergeholfen! Hier meine Frage: Wie erstellt man aus dem gerade erstellten Set eine Surface? Vielen Dank im Voraus Lg
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: 12. Aug. 2014 17:01 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Das geht nicht so einfach. Ein Set kann schließlich auch Kanten und Punkte beinhalten; eine Surface nur Flächen, ggf. auch noch mit einer Richtungsinformation. Bei Solids kannst du ggf. ein kleines Skript schreiben und alle Flächen in einem Set sammeln und in eine neue Surface-Definition stecken. Ansonsten kann man auch in CAE einfach ein Set (nur Flächen) einblenden und dann eine Surface erstellen, wobei man dann einfach eine Dragbox über alle Flächen zieht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Cosynus Mitglied
Beiträge: 3 Registriert: 07.08.2014
|
erstellt am: 13. Aug. 2014 11:36 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Gibt es keine Möglichkeit dies mithilfe von Python zu modellieren? Im obengenannten Beispiel kann man doch bestimmt auch irgendwie die gleiche Surface erstellen, die auch das Set darstellt? Vielleicht baut man die Surface dann von Anfang an in die Schleifen mit ein anstatt später das Set in eine Surface umzuwandeln? Also: Code: a = mdb.models['Model-1'].rootAssembly.instances['Part-1-1'] centroidlist = [] listfaceset = [] listsetnames = [] for i in range(len(a.faces)): x=a.faces[i].getCentroid() centroidlist.append(x) # Kontrolle # print centroidlist for k in range(len(centroidlist)): if centroidlist[k][0][2]== 0: print 'Flaeche '+str(k)+' in Liste hat Centroid bei z = 0' print 'Erstelle Set von dieser Fläche' face_x = a.faces.findAt(centroidlist[k]) s1 = mdb.models['Model-1'].rootAssembly setname = 'Set_Surf-'+str(k) s1.Set(faces=face_x, name=setname) set_x = s1.sets[setname] listfaceset.append(set_x) listsetnames.append(setname) if len(sets) > 0: s1.SetByMerge(name='Set-symm_z', sets=(listfaceset)) # löschen der einzelnen Sets if len(listsetnames) > 0: s1.deleteSets(setNames=(listsetnames)) #Surface erstellen Total_Surface = ... ??? [Diese Nachricht wurde von Cosynus am 13. Aug. 2014 editiert.] 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: 13. Aug. 2014 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Ich habe das Skript erweitert. Code:
a = mdb.models['Model-1'].rootAssembly.instances['Part-1-1'] centroidlist = [] listfaceset = [] listsetnames = []listsurfaceset = [] listsurfacenames = [] for i in range(len(a.faces)): x=a.faces[i].getCentroid() centroidlist.append(x) for k in range(len(centroidlist)): if centroidlist[k][0][2]== 0: print 'Flaeche '+str(k)+' in Liste hat Centroid bei z = 0' print 'Erstelle Set von dieser Flaeche' face_x = a.faces.findAt(centroidlist[k]) s1 = mdb.models['Model-1'].rootAssembly setname = 'Set_Surf-'+str(k) s1.Set(faces=face_x, name=setname) set_x = s1.sets[setname] listfaceset.append(set_x) listsetnames.append(setname) surfname = 'Surf-'+str(k) s1.Surface(side1Faces=face_x, name=surfname) face_x1 = s1.surfaces[surfname] listsurfaceset.append(face_x1) listsurfacenames.append(surfname) if len(s1.sets) > 0: s1.SetByBoolean(name='Set-symm_z', sets=(listfaceset)) s1.SurfaceByBoolean(name='Surface-symm_z', surfaces=(listsurfaceset)) # Befehl alte Abaqus Version # s1.SetByMerge(name='Set-symm_z', sets=(listfaceset)) # optional loeschen der einzelnen Sets if len(listsetnames) > 0: s1.deleteSets(setNames=(listsetnames)) s1.deleteSurfaces(surfaceNames=(listsurfacenames))
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Cosynus Mitglied
Beiträge: 3 Registriert: 07.08.2014
|
erstellt am: 13. Aug. 2014 15:21 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
|
marekijkl Mitglied
Beiträge: 11 Registriert: 16.08.2013
|
erstellt am: 05. Nov. 2014 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Hallo zusammen, da meine Frage der obigen Frage sehr ähnlich ist, aber eben doch ein bisschen anders, schreibe ich hier in diesem Thread... Ich möchte gerne eine Liste von Flächen erstellen, die ich dann nachfolgend als eine Surface definiere, um dort eine Last aufzubringen. Da ich ein parametrisiertes Modell habe, ist die Anzahl der Flächen in der Liste variabel. Ich würde gerne die Flächen mit einem Kristerium auswählen. Ich habe oben schon gesehen, dass man das anscheinend mit dem centroid befehl macht. Allerdings ist mir die Syntax mit den eckigen Klammern nicht ganz klar! In meinem Minimalbeispiel unten wüsste ich gerne, wie ich eine Schleife aufbauen kann, bei der der x-Wert dann in Abhängigkeit eines Parameters festgelegt wird. Danke schonmal! CCFaces = part1.faces.findAt(((0, 0.5*h, 0.5*c),), ((0.25*a, 0.0, 0.5*c),), ((0.25*a, h, 0.5*c),), ((a, 0.5*h, 0.5*c),), ((a, 0.5*h, 0.5*c),), ((1.25*a, 0.0, 0.5*c),), ((1.25*a, h, 0.5*c),), ((2*a, 0.5*h, 0.5*c),))
part1.Set(faces=CCFaces, name='CCFaces') part1.Surface(side1Faces = CCFaces, name ='CCWall') Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marekijkl Mitglied
Beiträge: 11 Registriert: 16.08.2013
|
erstellt am: 05. Nov. 2014 13:29 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
vielleicht sollte ich noch anmerken, dass bei mir eben nicht nur ein kriterium (wie zu vor z.B. z=0) erfüllt sein muss, sondern auch noch für y und x. Außerdem ändern sich die x-Werte nach einer bestimmten Vorschrift (siehe Beispiel). 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: 06. Nov. 2014 14:17 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Ich glaube ich verstehe die Frage noch nicht. Bei findAt() kannst du Koordinaten mit Variablen ersetzen - wie in deinem Beispiel. Außerdem kannst du ja mit findAt() eine beliebige Menge an Flächen finden. Das kannst du zusätzlich in einer Schleife wiederholen und damit die bestehende Menge erweitern. Am Ende gibst du deine Ansammlungen von Flächen dem Kommando, das daraus eine Surface macht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marekijkl Mitglied
Beiträge: 11 Registriert: 16.08.2013
|
erstellt am: 07. Nov. 2014 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Mein erstes Beispiel war vielleicht nicht so gut. Also ganz vereinfacht würde ich gerne wissen, wie man eine Schleife um den findAt Befehl drumherumbaut. Also statt z.B. Code: CCFaces = part1.faces.findAt(((a, b, c),), ((2*a, b, c),), ((3*a, b, c),), ((4*a, b, c),))part1.Set(faces=CCFaces, name='CCFaces') part1.Surface(side1Faces = CCFaces, name ='CCWall')
würde ich gerne eine Schleife bauen bei der dann der x-Wert in Abhängigkeit der Schleifenkoordinate (z.B. n) berechnet wird. Nur wie mache ich das? Ich kann ja nicht einfach eine Schleife benutzen oder? Ich muss ja irgendwie sagen, dass er die Liste CCFaces erweitert oder? Sonst hätte ich das nämlich so gelöst (ist aber wahrscheinlich nicht möglich oder?) Code:
for i in range(0,n): CCFaces = part1.faces.findAt(((n*a, b, c),))
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: 07. Nov. 2014 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Das erweitern der Liste dürfte das sein was du brauchst. Hier ein einfaches Beispiel, wo in z-Richtung mehrere Flächen aufgesammelt werden sollen. Ab dem zweiten Schleifendurchlauf wird bei dem "else" die Flächenliste immer erweitert. Code:
p = mdb.models['Model-1'].parts['Part-1']for i in range(1,5): a=p.faces.findAt(((5, 0, i*10-5),),) if i==1: x=a else: x=x+a p.Surface(side1Faces=x, name='Surf-1')
[Diese Nachricht wurde von Mustaine am 07. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marekijkl Mitglied
Beiträge: 11 Registriert: 16.08.2013
|
erstellt am: 07. Nov. 2014 16:54 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
|
Mustaine Ehrenmitglied V.I.P. h.c.
Beiträge: 3554 Registriert: 04.08.2005 Abaqus
|
erstellt am: 07. Nov. 2014 18:51 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Bei normalen Listen geht das auch nicht. Da müsste man mit append arbeiten. Abaqus verwendet diesem Fall für die Flächenmenge aber irgendeine andere Art von Sequenz und die erlaubt diese Methode. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
slein89 Mitglied
Beiträge: 139 Registriert: 30.04.2012
|
erstellt am: 10. Nov. 2014 08:21 <-- editieren / zitieren --> Unities abgeben: Nur für Capucho2002
Ich würde als FineTuning noch auf die If-Abfrage verzichten und auch mit append arbeiten: Code:
p = mdb.models['Model-1'].parts['Part-1'] x = [] for i in range(1,5): a=p.faces.findAt(((5, 0, i*10-5),),) x.append(a) p.Surface(side1Faces=x, name='Surf-1')
oder noch kompakter mit einer List Comprehension siehe hier, Abschnitt 5.1.4 : Code:
p = mdb.models['Model-1'].parts['Part-1'] x = [ p.faces.findAt(((5, 0, i*10-5),),) for i in range(1,5) ] p.Surface(side1Faces=x, name='Surf-1')
Grüße Slein [Diese Nachricht wurde von slein89 am 10. Nov. 2014 editiert.] [Diese Nachricht wurde von slein89 am 10. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|