def ElementAuswahl(elemente, punktliste, bedingung='True', var=[], listenhilfe=[]): """Gib eine Sequenz an Elementen aus den uebergebenen elemente zurueck, die bzw. deren Punkte die bedingung erfuellen. Fuer die Zuordnung der einzelnen Punkte zu den Elementen muss eine punktliste uebergeben werden, die alle Punkte aller elemente enthaelt. Gibt die Sequenz der ausgewaehlten Elemente zurueck. In der Bedingung kann mit elem auf ein einzelnes Element und mit punkt auf einen Punkt des Elements zugegriffen werden. Die Koordinaten eines Punktes koennen mit punkt.coordinates[#] erhalten werden, wobei die Raute fuer 0, 1 oder 2 und somit eine der drei Bezugsrichtungen steht. Optional kann die korrekte Zuordnung der Labels der Punkte bei odb-elementen durch Uebergabe einer listenhilfe beschleunigt werden. Fuer mathematische Zusammenhaenge stehen die Funktionen pi, sqrt, sin, cos, tan, asin, acos, atan zur Verfuegung. WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine oder die folgende listenhilfe uebergeben werden: listenhilfe = [idx for idx in range(len(punktliste))]; """ from hilfen import ElementAusOdb # if (ElementAusOdb(element=elemente[0])): return _OdbElementAuswahl(elemente=elemente, punktliste=punktliste, bedingung=bedingung, var=var, listenhilfe=listenhilfe); else: return _MdbElementAuswahl(elemente=elemente, punktliste=punktliste, bedingung=bedingung, var=var);
def ElementInfolisteErstellen(elemente, knoten, listenhilfe=[]): """Erstelle eine Hilfsliste mit Punktkoordinaten und Volumina aller uebergebenen elemente. Dazu wird neben elemente eine Liste aller Punktkoordinaten (knoten) benoetigt. Die optionale Uebergabe einer Zuordnung listenhilfe von Labels zu Indizes beschleunigt den Vorgang. Gibt elementinfoliste zurueck. WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine oder die folgende listenhilfe uebergeben werden: listenhilfe = [idx for idx in range(len(knoten))]; """ from hilfen import ElementAusOdb, ErstelleLabelsortierteGeomlist # if (listenhilfe == []): if (ElementAusOdb(element=elemente[0])): listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=knoten) else: listenhilfe = [idx for idx in range(len(knoten))] # elementinfoliste = [] dimensionen = 2 if ('3D' in str(elemente[0].type)): dimensionen = 3 # for idx, elem in enumerate(elemente): punkte = PunktkoordinatenVonElement(element=elem, knoten=knoten, listenhilfe=listenhilfe) elementinfoliste += [[ punkte, ElementVolumen(punkte=punkte, dimensionen=dimensionen) ]] # return elementinfoliste
def KnotengewichtungInElement(element, referenzpunkt, knoten, label_zu_idx_punkte=[]): """Bestimmt die Anteile, die ein referenzpunkt aus den Knotenpunkten des in punkte definierten Elements hat. Die Koordinaten der Elemente muessen in knoten definiert sein. Die optionale Uebergabe einer Zuordnung Listenhilfe von Labels zu Indizes beschleunigt den Vorgang. Gibt [labelsEckpunkte, Knotengewichtung] zurueck. WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine oder die folgende label_zu_idx_punkte uebergeben werden: label_zu_idx_punkte = [idx for idx in range(len(knoten))]; """ from hilfen import ElementAusOdb, ErstelleLabelsortierteGeomlist # if (label_zu_idx_punkte == []): if (ElementAusOdb(element=element)): label_zu_idx_punkte = ErstelleLabelsortierteGeomlist(geomliste=knoten); else: label_zu_idx_punkte = [idx for idx in range(len(knoten))]; # dimensionen = 2; if ('3D' in str(element.type)): dimensionen = 3; # punkte = PunktkoordinatenVonElement(element=element, knoten=knoten, listenhilfe=label_zu_idx_punkte); punktlabels = [knoten[label_zu_idx_punkte[einzelpunkt]].label for einzelpunkt in element.connectivity]; return [punktlabels, KnotengewichtungPunktInPunktkoordinaten(punkte=punkte, referenzpunkt=referenzpunkt, dimensionen=dimensionen)];
def ElementAuswahlLabelliste(elemente, punktliste, sortierung=0, aufsteigend=True, listenhilfe=[]): """Sortiert alle uebergebenen elemente nach der Koordinatenrichtung sortierung basierend auf den Koordinaten des Elementmittelpunktes. Fuer die Berechnung der Mittelpunktkoordinaten werden die Knoten der Elemente benutzt. Fuer die Zuordnung der einzelnen Punkte zu den Elementen muss eine punktliste uebergeben werden, die alle Punkte aller elemente enthaelt. Gibt eine Liste der Labels aller uebergebenen elemente zurueck, deren Mittelpunkte nach der Koordinatenrichtung sortierung sortiert ist. Fuer die sortierung ist die jeweilige Richtung (0, 1 oder 2) anzugeben. Die Reihenfolge wird ueber die Koordinaten der Mittelpunkte der Elemente bestimmt. Die Werte koennen entweder aufsteigend oder absteigend sortiert werden. Optional kann die korrekte Zuordnung der Labels der Punkte bei odb-elementen durch Uebergabe einer listenhilfe beschleunigt werden. WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine oder die folgende listenhilfe uebergeben werden: listenhilfe = [idx for idx in range(len(punktliste))]; """ from operator import itemgetter from hilfen import Log, ElementAusOdb, ErstelleLabelsortierteGeomlist # tempsortierung = sortierung; if ((not (sortierung == 0)) and (not (sortierung == 1)) and (not (sortierung == 2))): Log('# Warnung: Ungueltige sortierung, nehme sortierung = 0'); tempsortierung = 0; # if (len(elemente) == 0): Log('# Hinweis: Keine Elemente uebergeben'); return []; # if (listenhilfe == []): if (ElementAusOdb(element=elemente[0])): listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=punktliste); else: listenhilfe = [idx for idx in range(len(punktliste))]; # templiste = []; anzahlpunkte = float(len(elemente[0].connectivity)); for elem in elemente: mittelwert = 0; for punktlabel in elem.connectivity: punkt = punktliste[listenhilfe[punktlabel]]; mittelwert = punkt.coordinates[tempsortierung]/anzahlpunkte; # templiste += [(mittelwert, elem.label), ]; # templiste.sort(key=itemgetter(0)); labelliste = [x[1] for x in templiste]; if (aufsteigend): return labelliste; else: return list(reversed(labelliste));
def PunktInElement(elemente, knoten, referenzpunkt, listenhilfe=[], elementinfoliste=[]): """Gebe den Label des Elements aus elemente zurueck, das referenzpunkt enthaelt. Die Koordinaten der elemente muessen in knoten definiert sein. Die optionale Uebergabe einer Zuordnung listenhilfe von Labels zu Indizes beschleunigt den Vorgang. Falls eine elementinfoliste mit den Volumina und Punktkoordinaten aller Elemente verfuegbar ist, kann ebenfalls eine kleine Beschleunigung erzielt werden. Gibt zielElement zurueck. WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine oder die folgende listenhilfe uebergeben werden: listenhilfe = [idx for idx in range(len(knoten))]; """ from hilfen import Log, ElementAusOdb, ErstelleLabelsortierteGeomlist # if (listenhilfe == []): if (ElementAusOdb(element=elemente[0])): listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=knoten); else: listenhilfe = [idx for idx in range(len(knoten))]; # zielElement = None; minverhaeltnis = 2.0; dimensionen = 2; if ('3D' in str(elemente[0].type)): dimensionen = 3; # if (elementinfoliste == []): for elem in elemente: punkte = PunktkoordinatenVonElement(element=elem, knoten=knoten, listenhilfe=listenhilfe); if (not _PunktMoeglicherweiseInElement(punkte=punkte, referenzpunkt=referenzpunkt, dimensionen=dimensionen)): continue; # volverhaeltnis = _PunktInnerhalbElement(punkte=punkte, referenzpunkt=referenzpunkt, dimensionen=dimensionen); if (volverhaeltnis < minverhaeltnis): zielElement = elem.label; minverhaeltnis = volverhaeltnis; else: if (not len(elemente) == len(elementinfoliste)): Log('# Abbruch: Anzahl Elemente stimmt nicht mit Eintraegen in Elementlist ueberein'); return zielElement; for idx, elem in enumerate(elemente): if (not _PunktMoeglicherweiseInElement(punkte=elementinfoliste[idx][0], referenzpunkt=referenzpunkt, dimensionen=dimensionen)): continue; # referenzpunktvol = _ElementZuReferenzpunktVolumen(punkte=elementinfoliste[idx][0], referenzpunkt=referenzpunkt, dimensionen=dimensionen); volverhaeltnis = referenzpunktvol/elementinfoliste[idx][1]; if (volverhaeltnis < minverhaeltnis): zielElement = elem.label; minverhaeltnis = volverhaeltnis; # return zielElement;