Пример #1
0
def Quader_flaechensets(modell, name, laenge, breite, hoehe):
    """Erzeuge Flaechensets an der Oberseite, Unterseite und allen Seiten des Quaderbauteils (Part)
   name im modell. Zur richtigen Zuordnung werden die Abmessungen laenge, breite und hoehe des
   Quaders benoetigt. laenge und breite koennen entweder als Zahlenwert für eine symmetrische
   Anordnung um den Ursprung (-zahl/2.0, zahl/2.0) oder direkt als (startpunkt, endpunkt) uebergeben
   werden. Die hoehe wird als Zahlenwert erwartet und immer von Null an gestartet.
   """
    import part
    from auswahl import BedingteAuswahl
    from hilfen import abapys_tol
    #
    laenge, breite = _Quader_Einheitliche_Geometrieangaben(laenge=laenge,
                                                           breite=breite)
    partQuader = modell.parts[name]
    #
    flaechen_Unterseite = BedingteAuswahl(
        elemente=partQuader.faces,
        bedingung='elem.pointOn[0][2] < var[0]',
        var=[abapys_tol])
    partQuader.Set(name='setUnterseite', faces=flaechen_Unterseite)
    flaechen_Oberseite = BedingteAuswahl(
        elemente=partQuader.faces,
        bedingung='elem.pointOn[0][2] > var[0]-var[1]',
        var=[hoehe, abapys_tol])
    partQuader.Set(name='setOberseite', faces=flaechen_Oberseite)
    #
    flaechen_X = BedingteAuswahl(
        elemente=partQuader.faces,
        bedingung=
        '((elem.pointOn[0][0] < var[0]+var[2]) or (elem.pointOn[0][0] > var[1]-var[2]))',
        var=[laenge[0], laenge[1], abapys_tol])
    partQuader.Set(name='setXFlaeche', faces=flaechen_X)
    flaechen_Y = BedingteAuswahl(
        elemente=partQuader.faces,
        bedingung=
        '((elem.pointOn[0][1] < var[0]+var[2]) or (elem.pointOn[0][1] > var[1]-var[2]))',
        var=[breite[0], breite[1], abapys_tol])
    partQuader.Set(name='setYFlaeche', faces=flaechen_Y)
Пример #2
0
def Kugel(modell,
          name,
          radius,
          materialtyp,
          gittergroesse,
          rp=False,
          extrasets=False,
          r_innen=[]):
    """Erzeuge eine Kugel name im modell mit dem uebergebenem radius vom Typ materialtyp
   (Abaqus-Konstante, bspw. DEFORMABLE_BODY) und der Netzgroesse gittergroesse (Zahlenwert).
   Optional kann ein Referenzpunkt rp oder extrasets erstellt werden. Optional kann ausserdem statt
   einer Vollkugel eine Hohlkugel erzeugt werden, wenn r_innen gegeben ist.
   Gibt [part<name>, inst<name>] zurueck.
   """
    import part
    import assembly
    from abaqusConstants import TET, FREE, ON
    from auswahl import BedingteAuswahl
    from hilfen import abapys_tol
    #
    Kugel_erstellen(modell=modell,
                    name=name,
                    radius=radius,
                    materialtyp=materialtyp,
                    r_innen=r_innen)
    partKugel = modell.parts[name]
    Grundkoerper_standardpartitionen(modell=modell, name=name, rp=rp)
    Grundkoerper_sets(modell=modell, name=name)
    if (extrasets):
        flaechen_Mantel = BedingteAuswahl(
            elemente=partKugel.faces,
            bedingung=
            'sqrt(elem.pointOn[0][0]**2 + elem.pointOn[0][1]**2 + elem.pointOn[0][2]**2)) > var[0]-var[1]',
            var=[radius, abapys_tol])
        partKugel.Set(name='setMantelflaeche', faces=flaechen_Mantel)
    #
    # FIXME: Immer notwendig, Kugeln als TET zu diskretisieren?
    partKugel.setMeshControls(elemShape=TET,
                              regions=partKugel.cells,
                              technique=FREE)
    Grundkoerper_vernetzen(modell=modell,
                           name=name,
                           materialtyp=materialtyp,
                           gittergroesse=gittergroesse)
    #
    instname = 'inst' + name
    modell.rootAssembly.Instance(dependent=ON, name=instname, part=partKugel)
    return [partKugel, modell.rootAssembly.instances[instname]]
Пример #3
0
def Zylinder_flaechensets(modell, name, radius, hoehe, r_innen=[], viertel=4):
    """Erzeuge Flaechensets an der Oberseite, Unterseite und Mantel des Zylinderbauteils (Part) name
   im modell. Zur richtigen Zuordnung werden radius und hoehe des Zylinders benoetigt. Falls nur ein
   Viertel-/Halbzylinder erzeugt werden soll, werden zusaetzliche Sets erstellt.
   """
    import part
    from auswahl import BedingteAuswahl
    from hilfen import abapys_tol
    #
    partZylinder = modell.parts[name]
    #
    flaechen_Unterseite = BedingteAuswahl(
        elemente=partZylinder.faces,
        bedingung='elem.pointOn[0][2] < var[0]',
        var=[abapys_tol])
    partZylinder.Set(name='setUnterseite', faces=flaechen_Unterseite)
    flaechen_Oberseite = BedingteAuswahl(
        elemente=partZylinder.faces,
        bedingung='elem.pointOn[0][2] > var[0]-var[1]',
        var=[hoehe, abapys_tol])
    partZylinder.Set(name='setOberseite', faces=flaechen_Oberseite)
    #
    flaechen_Mantel = BedingteAuswahl(
        elemente=partZylinder.faces,
        bedingung=
        'sqrt(elem.pointOn[0][0]**2 + elem.pointOn[0][1]**2) > var[0]-var[1]',
        var=[radius, abapys_tol])
    partZylinder.Set(name='setMantelflaeche', faces=flaechen_Mantel)
    if ((viertel == 1) or (viertel == 2)):
        if (viertel == 1):
            flaechen_Y = BedingteAuswahl(
                elemente=partZylinder.faces,
                bedingung='(elem.pointOn[0][1] < var[0])',
                var=[abapys_tol])
            partZylinder.Set(name='setYFlaeche', faces=flaechen_Y)
        #
        flaechen_X = BedingteAuswahl(elemente=partZylinder.faces,
                                     bedingung='(elem.pointOn[0][0] < var[0])',
                                     var=[abapys_tol])
        partZylinder.Set(name='setXFlaeche', faces=flaechen_X)
    #
    if (not r_innen == []):
        flaechen_Mantelinnen = BedingteAuswahl(
            elemente=partZylinder.faces,
            bedingung=
            'sqrt(elem.pointOn[0][0]**2 + elem.pointOn[0][1]**2) < var[0]+var[1]',
            var=[r_innen, abapys_tol])
        partZylinder.Set(name='setMantelinnen', faces=flaechen_Mantelinnen)
Пример #4
0
def _ConnectorErstellen(modell, verbindungstyp, name, punkt1, punkt2, kos):
    """Erzeuge im modell einen Connector name von punkt1 zu punkt2 mit dem Koordinatensystem kos. Je
   nach verbindungstyp werden gewisse Einschraenkungen der Freiheitsgrade - bezogen auf das
   uebergebene KOS (!) - fest zugewiesen:
   - 'TranslateConnector': Beim Axiallager ist nur eine Verschiebung entlang der x-Achse moeglich.
   - 'HingeConnector': Beim Drehscharnier ist nur eine Drehung um die x-Achse moeglich.
   """
    import section
    import assembly
    from abaqusConstants import TRANSLATOR, HINGE, IMPRINT
    from auswahl import BedingteAuswahl
    from hilfen import Log
    #
    if (verbindungstyp == 'TranslateConnector'):
        if (not modell.sections.has_key('TranslateConnector')):
            modell.ConnectorSection(assembledType=TRANSLATOR,
                                    name='TranslateConnector')
    #
    elif (verbindungstyp == 'HingeConnector'):
        if (not modell.sections.has_key('HingeConnector')):
            modell.ConnectorSection(assembledType=HINGE, name='HingeConnector')
    else:
        Log('# Warnung: Connector nicht implementiert')
    #
    modell.rootAssembly.WirePolyLine(mergeType=IMPRINT,
                                     meshable=False,
                                     points=((punkt1, punkt2), ))
    modell.rootAssembly.features.changeKey(fromName='Wire-1', toName=name)
    #
    KabelKanten = BedingteAuswahl(elemente=modell.rootAssembly.edges,
                                  bedingung='elem.featureName == \'' + name +
                                  '\'')
    modell.rootAssembly.Set(edges=KabelKanten, name='set' + name)
    #
    modell.rootAssembly.SectionAssignment(
        sectionName=verbindungstyp,
        region=modell.rootAssembly.sets['set' + name])
    modell.rootAssembly.ConnectorOrientation(
        localCsys1=kos, region=modell.rootAssembly.sets['set' + name])
Пример #5
0
def _Bohrprofil_partitionieren(modell,
                               name,
                               spitzenwinkel,
                               partitionsradius=None):
    """Erstelle Datums und Partitionen eines Bohrprofils am Bauteil (Part) name
   im modell mit dem uebergebenem spitzenwinkel.
   Optional kann das Gewinde bei einem uebergebenem partitionsradius partitioniert werden.
   """
    import sketch
    import part
    from abaqusConstants import XAXIS, YAXIS, ZAXIS, XYPLANE, COPLANAR_EDGES, SIDE2, RIGHT
    from auswahl import BedingteAuswahl
    from zeichnung import Kreis
    #
    partWerkzeug = modell.parts[name]
    # Datums
    partWerkzeug.DatumAxisByPrincipalAxis(principalAxis=XAXIS)
    partWerkzeug.features.changeKey(fromName='Datum axis-1', toName='xAchse')
    xachsenid = partWerkzeug.features['xAchse'].id
    partWerkzeug.DatumAxisByPrincipalAxis(principalAxis=YAXIS)
    partWerkzeug.features.changeKey(fromName='Datum axis-1', toName='yAchse')
    yachsenid = partWerkzeug.features['yAchse'].id
    partWerkzeug.DatumAxisByPrincipalAxis(principalAxis=ZAXIS)
    partWerkzeug.features.changeKey(fromName='Datum axis-1', toName='zAchse')
    zachsenid = partWerkzeug.features['zAchse'].id
    #
    partWerkzeug.DatumPointByCoordinate(coords=(0.0, 0.0, 0.0))
    partWerkzeug.features.changeKey(fromName='Datum pt-1',
                                    toName='datum_Spitzenaufsatz')
    datumbeginnid = partWerkzeug.features['datum_Spitzenaufsatz'].id
    # Partitionen
    if (partWerkzeug.features.has_key('datum_Gewindeende')):
        # Pfahltyp SOBP
        if (spitzenwinkel > 0.0):
            partWerkzeug.PartitionCellByPlanePointNormal(
                cells=partWerkzeug.cells,
                normal=partWerkzeug.datums[zachsenid],
                point=partWerkzeug.datums[datumbeginnid])
        datumendeid = partWerkzeug.features['datum_Gewindeende'].id
        partWerkzeug.PartitionCellByPlanePointNormal(
            cells=partWerkzeug.cells,
            normal=partWerkzeug.datums[zachsenid],
            point=partWerkzeug.datums[datumendeid])
        # Zellen vor und nach Gewinde (falls existent)
        zellenOhneGewindebereich = BedingteAuswahl(
            elemente=partWerkzeug.cells,
            bedingung=
            '(elem.pointOn[0][2] > var[0]) or (elem.pointOn[0][2] < var[1])',
            var=[
                partWerkzeug.features['datum_Gewindeende'].zValue,
                partWerkzeug.features['datum_Spitzenaufsatz'].zValue
            ])
        if (not zellenOhneGewindebereich == ()):
            partWerkzeug.PartitionCellByPlanePointNormal(
                cells=zellenOhneGewindebereich,
                normal=partWerkzeug.datums[xachsenid],
                point=partWerkzeug.datums[datumbeginnid])
            zellenOhneGewindebereich = BedingteAuswahl(
                elemente=partWerkzeug.cells,
                bedingung=
                '(elem.pointOn[0][2] > var[0]) or (elem.pointOn[0][2] < var[1])',
                var=[
                    partWerkzeug.features['datum_Gewindeende'].zValue,
                    partWerkzeug.features['datum_Spitzenaufsatz'].zValue
                ])
            partWerkzeug.PartitionCellByPlanePointNormal(
                cells=zellenOhneGewindebereich,
                normal=partWerkzeug.datums[yachsenid],
                point=partWerkzeug.datums[datumbeginnid])
        if ((not partWerkzeug.features.has_key('datum_Gewindeendea'))
                and (not (partitionsradius is None))):
            # SOBP
            # Zellen auf dem Gewinde abtrennen
            partWerkzeug.DatumPlaneByPrincipalPlane(offset=0.0,
                                                    principalPlane=XYPLANE)
            partWerkzeug.features.changeKey(fromName='Datum plane-1',
                                            toName='XYEbene')
            xyebeneid = partWerkzeug.features['XYEbene'].id
            modell.ConstrainedSketch(
                gridSpacing=0.01,
                name='__profile__',
                sheetSize=0.6,
                transform=partWerkzeug.MakeSketchTransform(
                    sketchPlane=partWerkzeug.datums[xyebeneid],
                    sketchPlaneSide=SIDE2,
                    sketchUpEdge=partWerkzeug.datums[yachsenid],
                    sketchOrientation=RIGHT,
                    origin=(0.0, 0.0, 0.0)))
            zeichnung = modell.sketches['__profile__']
            partWerkzeug.projectReferencesOntoSketch(filter=COPLANAR_EDGES,
                                                     sketch=zeichnung)
            Kreis(zeichnung=zeichnung,
                  mittelpunkt=(0.0, 0.0),
                  radius=partitionsradius)
            partWerkzeug.PartitionFaceBySketchThruAll(
                faces=partWerkzeug.faces,
                sketch=zeichnung,
                sketchPlane=partWerkzeug.datums[xyebeneid],
                sketchPlaneSide=SIDE2,
                sketchUpEdge=partWerkzeug.datums[yachsenid])
            del zeichnung
    else:
        # Alle Pfahltypen ausser SOBP und VVBP
        partWerkzeug.PartitionCellByPlanePointNormal(
            cells=partWerkzeug.cells,
            normal=partWerkzeug.datums[xachsenid],
            point=partWerkzeug.datums[datumbeginnid])
        partWerkzeug.PartitionCellByPlanePointNormal(
            cells=partWerkzeug.cells,
            normal=partWerkzeug.datums[zachsenid],
            point=partWerkzeug.datums[datumbeginnid])
        if (spitzenwinkel > 0.0):
            partWerkzeug.PartitionCellByPlanePointNormal(
                cells=partWerkzeug.cells,
                normal=partWerkzeug.datums[yachsenid],
                point=partWerkzeug.datums[datumbeginnid])
    # VVBP mit Vorlaufgewinde
    if (partWerkzeug.features.has_key('datum_Gewindeendea')):
        datumendeid = partWerkzeug.features['datum_Gewindeendea'].id
        partWerkzeug.PartitionCellByPlanePointNormal(
            cells=partWerkzeug.cells,
            normal=partWerkzeug.datums[zachsenid],
            point=partWerkzeug.datums[datumendeid])
    # VVBP mit Ruecklaufgewinde
    if (partWerkzeug.features.has_key('datum_Gewindeendeb')):
        datumendeid = partWerkzeug.features['datum_Gewindeendeb'].id
        partWerkzeug.PartitionCellByPlanePointNormal(
            cells=partWerkzeug.cells,
            normal=partWerkzeug.datums[zachsenid],
            point=partWerkzeug.datums[datumendeid])
    # VVBP mit Anfang Verdickung
    if (partWerkzeug.features.has_key('datum_Profilendea')):
        datumendeid = partWerkzeug.features['datum_Profilendea'].id
        partWerkzeug.PartitionCellByPlanePointNormal(
            cells=partWerkzeug.cells,
            normal=partWerkzeug.datums[zachsenid],
            point=partWerkzeug.datums[datumendeid])
    # VVBP mit Ende Verdickung
    if (partWerkzeug.features.has_key('datum_Profilendeb')):
        datumendeid = partWerkzeug.features['datum_Profilendeb'].id
        partWerkzeug.PartitionCellByPlanePointNormal(
            cells=partWerkzeug.cells,
            normal=partWerkzeug.datums[zachsenid],
            point=partWerkzeug.datums[datumendeid])