def _BedingteAuswahlLabel(elemente, bedingung='True', var=[]): """Erstelle eine Sequenz aus den Labels aller uebergebenen elemente, die bedingung erfuellen. Alle Variablen aus bedingung muessen global lesbar oder optional in var uebergeben und als var[...] bezeichnet sein, sonst kann die bedingung nicht korrekt ausgewertet werden. Gibt die Sequenz der ausgewaehlten Elemente zurueck. In der Bedingung kann mit elem auf ein einzelnes Element zugegriffen werden. Auf die Basiskoordinaten eines Elementes kann mit elem.coordinates[#] zugegriffen werden, wobei die Raute fuer 0, 1 oder 2 und somit eine der drei Bezugsrichtungen steht. """ from math import pi, sqrt, sin, cos, tan, asin, acos, atan from hilfen import Log, _Eval_Basispruefung # erlaubt = ['coordinates', 'connectivity', 'featureName', 'index', 'instanceName', 'instanceNames', 'isReferenceRep', 'pointOn', 'sectionCategory', 'label', 'type', 'var', 'elem']; # if (not _Eval_Basispruefung(code=bedingung, zusatz_erlaubt=erlaubt)): Log('# Abbruch: Uebergebene bedingung ist ungueltig'); return elemente[0:0]; # ausgewaehlteLabels = []; for elem in elemente: if (eval(bedingung)): ausgewaehlteLabels += [elem.label]; # return LabelAuswahl(elemente=elemente, labelliste=ausgewaehlteLabels);
def _MdbElementAuswahl(elemente, punktliste, bedingung='True', var=[]): """Gib eine Sequenz an Elementen aus den uebergebenen elemente zurueck, die bzw. deren Punkte die bedingung erfuellen (nur mdb). 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. """ from math import pi, sqrt, sin, cos, tan, asin, acos, atan from hilfen import Log, _Eval_Basispruefung # ausgewaehlteElemente = elemente[0:0]; erlaubt = ['coordinates', 'connectivity', 'featureName', 'index', 'instanceName', 'instanceNames', 'isReferenceRep', 'pointOn', 'sectionCategory', 'label', 'type', 'var', 'elem', 'punkt']; # if (not _Eval_Basispruefung(code=bedingung, zusatz_erlaubt=erlaubt)): Log('# Abbruch: Uebergebene bedingung ist ungueltig'); return ausgewaehlteElemente; # numPunkte = len(elemente[0].connectivity); for idx, elem in enumerate(elemente): numErfuellt = 0; for punktidx in elem.connectivity: punkt = punktliste[punktidx]; if (eval(bedingung)): numErfuellt += 1; # if (numErfuellt == numPunkte): ausgewaehlteElemente += elemente[idx:idx+1]; # return ausgewaehlteElemente;
def ZweifachbedingteKantenAuswahl(elemente, bedingung1='True', bedingung2='True', bedingung3='True', var=[]): """Erstelle eine Sequenz aller Kanten aus elemente, die bedingung1 und bedingung2 erfuellen. Die Rueckgabe der Kanten ist sortiert nach bedingung3. Alle Variablen aus bedingung1, bedingung2 und bedingung3 muessen global lesbar oder optional in var uebergeben und als var[...] bezeichnet sein, sonst koennen die Bedingungen nicht korrekt ausgewertet werden. In der ersten Bedingung kann mit edge auf eine einzelne Kante zugegriffen werden (bspw. edge.pointOn[0][#], wobei die Raute fuer 0, 1 oder 2 und somit eine der drei Bezugsrichtungen steht). In der zweiten und dritten Bedingung kann zusaetzlich auch auf die beiden Endpunkte vert1 sowie vert2 zugegriffen werden (ebenfalls vert.pointOn[0][#] mit Raute als 0, 1 oder 2). Die ersten beiden Bedingungen sind zur Auswahl der der Kanten. Kanten die eine der ersten beiden Bedingungen nicht erfuellen, werdne ignoriert. Die restlichen Kanten werden sortiert, abhaengig davon, ob sie die letzte Bedingung erfuellen oder nicht. Gibt eine Liste mit zwei Sequenzen der ausgewaehlten Kanten [kanten_bedingung3_True, kanten_bedingung3_False] zurueck. Fuer mathematische Zusammenhaenge stehen die Funktionen sqrt, sin, cos, tan, asin, acos, atan zur Verfuegung. """ from math import sqrt, sin, cos, tan, asin, acos, atan from hilfen import Log, _Eval_Basispruefung # kanten1 = elemente.edges[0:0] kanten2 = elemente.edges[0:0] # erlaubt = [ 'coordinates', 'connectivity', 'featureName', 'index', 'instanceName', 'instanceNames', 'isReferenceRep', 'pointOn', 'sectionCategory', 'label', 'type', 'var', 'edge', 'vert1', 'vert2' ] # if (any([(not _Eval_Basispruefung(code=bedingung, zusatz_erlaubt=erlaubt)) for bedingung in [bedingung1, bedingung2, bedingung3]])): Log('# Abbruch: Uebergebene bedingung1/bedingung2/bedingung3 ungueltig' ) return # for edge in elemente.edges: if (eval(bedingung1)): vert1 = elemente.vertices[edge.getVertices()[0]] vert2 = elemente.vertices[edge.getVertices()[1]] if (eval(bedingung2)): if (eval(bedingung3)): kanten1 += elemente.edges[edge.index:edge.index + 1] else: kanten2 += elemente.edges[edge.index:edge.index + 1] # kanten = [kanten1, kanten2] return kanten
def Knotentransformation(punktliste, xneu='x', yneu='y', zneu='z'): """Erstelle eine neue Knotenliste basierend auf punktliste. Dabei werden von allen Eintraegen nur label und coordinates uebernommen. Die Koordinaten koennen ueber die Felder xneu, yneu und zneu transformiert werden. Gibt die transformierte punktliste zurueck. Fuer alle drei Variablen kann eine Transformationsanweisung wie bspw. "sqrt(x**2+y**2)" uebergeben werden, wobei jeweils die Variablen x, y und z zur Verfuegung stehen, die die Orignalwerte fuer jeden Knoten enthalten. Fuer mathematische Zusammenhaenge stehen die Funktionen pi, sqrt, sin, cos, tan, asin, acos, atan zur Verfuegung. WICHTIG: Wenn eine Zustandsuebertragung mit Knoten stattfinden soll, die in dieser Funktion transformiert worden sind, dann werden auch tatsaechlich nur die Knotenkoordinaten und keinerlei Werte modifiziert. Das gilt insbesondere fuer Drehungen wie im angegebenen Beispiel, bei dem Tensorergebnisse nicht gedreht, sondern nur an anderer Stelle ausgegeben werden. """ from math import pi, sqrt, sin, cos, tan, asin, acos, atan from hilfen import Log, _Eval_Basispruefung # neue_knotenliste = [] # if (any([(not _Eval_Basispruefung(code=bedingung, zusatz_erlaubt=['x', 'y', 'z'])) for bedingung in [xneu, yneu, zneu]])): Log('# Abbruch: Uebergebene xneu/yneu/zneu ungueltig') return # for knoten in punktliste: x = knoten.coordinates[0] y = knoten.coordinates[1] z = knoten.coordinates[2] xmod = eval(xneu) ymod = eval(yneu) zmod = eval(zneu) # if (not (zneu is None)): neue_knotenliste += [ PunktListe(coordinates=(xmod, ymod, zmod), label=knoten.label) ] else: neue_knotenliste += [ PunktListe(coordinates=(xmod, ymod), label=knoten.label) ] # return neue_knotenliste
def _OdbElementAuswahl(elemente, punktliste, bedingung='True', var=[], listenhilfe=[]): """Gib eine Sequenz an Elementen aus den uebergebenen elemente zurueck, die bzw. deren Punkte die bedingung erfuellen (nur odb). Fuer die Zuordnung der einzelnen Punkte zu den Elementen muss eine punktliste uebergeben werden, die alle Punkte aller elemente enthaelt. Die korrekte Zuordnung der Labels der Punkte kann durch Uebergabe einer listenhilfe beschleunigt werden. 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. """ from math import pi, sqrt, sin, cos, tan, asin, acos, atan from hilfen import Log, _Eval_Basispruefung, ErstelleLabelsortierteGeomlist # ausgewaehlteElemente = elemente[0:0] erlaubt = [ 'coordinates', 'connectivity', 'featureName', 'index', 'instanceName', 'instanceNames', 'isReferenceRep', 'pointOn', 'sectionCategory', 'label', 'type', 'var', 'elem', 'punkt' ] # if (not _Eval_Basispruefung(code=bedingung, zusatz_erlaubt=erlaubt)): Log('# Abbruch: Uebergebene bedingung ist ungueltig') return ausgewaehlteElemente # if (listenhilfe == []): listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=punktliste) # numPunkte = len(elemente[0].connectivity) for idx, elem in enumerate(elemente): numErfuellt = 0 for punktlabel in elem.connectivity: punkt = punktliste[listenhilfe[punktlabel]] if (eval(bedingung)): numErfuellt += 1 else: continue # if (numErfuellt == numPunkte): ausgewaehlteElemente += elemente[idx:idx + 1] # return ausgewaehlteElemente