Exemple #1
0
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);
Exemple #2
0
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;
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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