Ejemplo n.º 1
0
    def test_femobjects_make(self):
        doc = self.active_doc
        analysis = ObjectsFem.makeAnalysis(doc)

        analysis.addObject(ObjectsFem.makeConstraintBearing(doc))
        analysis.addObject(ObjectsFem.makeConstraintBodyHeatSource(doc))
        analysis.addObject(ObjectsFem.makeConstraintContact(doc))
        analysis.addObject(ObjectsFem.makeConstraintDisplacement(doc))
        analysis.addObject(
            ObjectsFem.makeConstraintElectrostaticPotential(doc))
        analysis.addObject(ObjectsFem.makeConstraintFixed(doc))
        analysis.addObject(ObjectsFem.makeConstraintFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintFluidBoundary(doc))
        analysis.addObject(ObjectsFem.makeConstraintForce(doc))
        analysis.addObject(ObjectsFem.makeConstraintGear(doc))
        analysis.addObject(ObjectsFem.makeConstraintHeatflux(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintPlaneRotation(doc))
        analysis.addObject(ObjectsFem.makeConstraintPressure(doc))
        analysis.addObject(ObjectsFem.makeConstraintPulley(doc))
        analysis.addObject(ObjectsFem.makeConstraintSelfWeight(doc))
        analysis.addObject(ObjectsFem.makeConstraintTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintTransform(doc))

        analysis.addObject(ObjectsFem.makeElementFluid1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry2D(doc))
        analysis.addObject(ObjectsFem.makeElementRotation1D(doc))

        analysis.addObject(ObjectsFem.makeMaterialFluid(doc))
        mat = analysis.addObject(ObjectsFem.makeMaterialSolid(doc))[0]
        analysis.addObject(ObjectsFem.makeMaterialMechanicalNonlinear(
            doc, mat))

        msh = analysis.addObject(ObjectsFem.makeMeshGmsh(doc))[0]
        analysis.addObject(ObjectsFem.makeMeshBoundaryLayer(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshGroup(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshRegion(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshNetgen(doc))
        analysis.addObject(ObjectsFem.makeMeshResult(doc))

        analysis.addObject(ObjectsFem.makeResultMechanical(doc))

        analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc))
        analysis.addObject(ObjectsFem.makeSolverCalculix(doc))
        sol = analysis.addObject(ObjectsFem.makeSolverElmer(doc))[0]
        analysis.addObject(ObjectsFem.makeSolverZ88(doc))

        analysis.addObject(ObjectsFem.makeEquationElasticity(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationElectrostatic(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFlow(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFluxsolver(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationHeat(doc, sol))
        # TODO the equations show up twice on Tree (on solver and on analysis), if they are added to the analysis group

        doc.recompute()
        self.assertEqual(len(analysis.Group),
                         testtools.get_defmake_count() -
                         1)  # because of the analysis itself count -1
Ejemplo n.º 2
0
    def test_femobjects_make(self):
        doc = self.active_doc
        analysis = ObjectsFem.makeAnalysis(doc)

        analysis.addObject(ObjectsFem.makeConstraintBearing(doc))
        analysis.addObject(ObjectsFem.makeConstraintBodyHeatSource(doc))
        analysis.addObject(ObjectsFem.makeConstraintContact(doc))
        analysis.addObject(ObjectsFem.makeConstraintDisplacement(doc))
        analysis.addObject(ObjectsFem.makeConstraintElectrostaticPotential(doc))
        analysis.addObject(ObjectsFem.makeConstraintFixed(doc))
        analysis.addObject(ObjectsFem.makeConstraintFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintFluidBoundary(doc))
        analysis.addObject(ObjectsFem.makeConstraintForce(doc))
        analysis.addObject(ObjectsFem.makeConstraintGear(doc))
        analysis.addObject(ObjectsFem.makeConstraintHeatflux(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintPlaneRotation(doc))
        analysis.addObject(ObjectsFem.makeConstraintPressure(doc))
        analysis.addObject(ObjectsFem.makeConstraintPulley(doc))
        analysis.addObject(ObjectsFem.makeConstraintSelfWeight(doc))
        analysis.addObject(ObjectsFem.makeConstraintTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintTransform(doc))

        analysis.addObject(ObjectsFem.makeElementFluid1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry2D(doc))
        analysis.addObject(ObjectsFem.makeElementRotation1D(doc))

        analysis.addObject(ObjectsFem.makeMaterialFluid(doc))
        mat = analysis.addObject(ObjectsFem.makeMaterialSolid(doc))[0]
        analysis.addObject(ObjectsFem.makeMaterialMechanicalNonlinear(doc, mat))

        msh = analysis.addObject(ObjectsFem.makeMeshGmsh(doc))[0]
        analysis.addObject(ObjectsFem.makeMeshBoundaryLayer(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshGroup(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshRegion(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshNetgen(doc))
        analysis.addObject(ObjectsFem.makeMeshResult(doc))

        analysis.addObject(ObjectsFem.makeResultMechanical(doc))

        analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc))
        analysis.addObject(ObjectsFem.makeSolverCalculix(doc))
        sol = analysis.addObject(ObjectsFem.makeSolverElmer(doc))[0]
        analysis.addObject(ObjectsFem.makeSolverZ88(doc))

        analysis.addObject(ObjectsFem.makeEquationElasticity(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationElectrostatic(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFlow(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFluxsolver(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationHeat(doc, sol))
        # is = 43 (just copy in empty file to test, or run unit test case, it is printed)
        # TODO if the equations and gmsh mesh childs are added to the analysis,
        # they show up twice on Tree (on solver resp. gemsh mesh obj and on analysis)
        # https://forum.freecadweb.org/viewtopic.php?t=25283

        doc.recompute()
        self.assertEqual(len(analysis.Group), testtools.get_defmake_count() - 1)  # because of the analysis itself count -1
Ejemplo n.º 3
0
    def test_femobjects_make(self):
        doc = self.active_doc
        analysis = ObjectsFem.makeAnalysis(doc)

        analysis.addObject(ObjectsFem.makeConstraintBearing(doc))
        analysis.addObject(ObjectsFem.makeConstraintBodyHeatSource(doc))
        analysis.addObject(ObjectsFem.makeConstraintContact(doc))
        analysis.addObject(ObjectsFem.makeConstraintDisplacement(doc))
        analysis.addObject(ObjectsFem.makeConstraintElectrostaticPotential(doc))
        analysis.addObject(ObjectsFem.makeConstraintFixed(doc))
        analysis.addObject(ObjectsFem.makeConstraintFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintFluidBoundary(doc))
        analysis.addObject(ObjectsFem.makeConstraintForce(doc))
        analysis.addObject(ObjectsFem.makeConstraintGear(doc))
        analysis.addObject(ObjectsFem.makeConstraintHeatflux(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintPlaneRotation(doc))
        analysis.addObject(ObjectsFem.makeConstraintPressure(doc))
        analysis.addObject(ObjectsFem.makeConstraintPulley(doc))
        analysis.addObject(ObjectsFem.makeConstraintSelfWeight(doc))
        analysis.addObject(ObjectsFem.makeConstraintTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintTransform(doc))

        analysis.addObject(ObjectsFem.makeElementFluid1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry2D(doc))
        analysis.addObject(ObjectsFem.makeElementRotation1D(doc))

        analysis.addObject(ObjectsFem.makeMaterialFluid(doc))
        mat = analysis.addObject(ObjectsFem.makeMaterialSolid(doc))[0]
        analysis.addObject(ObjectsFem.makeMaterialMechanicalNonlinear(doc, mat))

        msh = analysis.addObject(ObjectsFem.makeMeshGmsh(doc))[0]
        analysis.addObject(ObjectsFem.makeMeshBoundaryLayer(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshGroup(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshRegion(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshNetgen(doc))
        analysis.addObject(ObjectsFem.makeMeshResult(doc))

        analysis.addObject(ObjectsFem.makeResultMechanical(doc))

        analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc))
        analysis.addObject(ObjectsFem.makeSolverCalculix(doc))
        sol = analysis.addObject(ObjectsFem.makeSolverElmer(doc))[0]
        analysis.addObject(ObjectsFem.makeSolverZ88(doc))

        analysis.addObject(ObjectsFem.makeEquationElasticity(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationElectrostatic(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFlow(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFluxsolver(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationHeat(doc, sol))
        # is = 43 (just copy in empty file to test, or run unit test case, it is printed)
        # TODO if the equations and gmsh mesh childs are added to the analysis,
        # they show up twice on Tree (on solver resp. gemsh mesh obj and on analysis)
        # https://forum.freecadweb.org/viewtopic.php?t=25283

        doc.recompute()
        self.assertEqual(len(analysis.Group), testtools.get_defmake_count() - 1)  # because of the analysis itself count -1
Ejemplo n.º 4
0
def setup(doc=None, solvertype="ccxtools"):
    # setup box static, add a fixed, force and a pressure constraint

    doc = setup_base(doc, solvertype)
    geom_obj = doc.Box
    analysis = doc.Analysis

    # solver
    if solvertype == "calculix":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX"))[0]
    elif solvertype == "ccxtools":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools"))[0]
        solver_object.WorkingDir = u""
    elif solvertype == "elmer":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverElmer(doc, "SolverElmer"))[0]
        ObjectsFem.makeEquationElasticity(doc, solver_object)
    elif solvertype == "z88":
        analysis.addObject(ObjectsFem.makeSolverZ88(doc, "SolverZ88"))
    else:
        FreeCAD.Console.PrintWarning(
            "Not known or not supported solver type: {}. "
            "No solver object was created.\n".format(solvertype))
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_object.SplitInputWriter = False
        solver_object.AnalysisType = "static"
        solver_object.GeometricalNonlinearity = "linear"
        solver_object.ThermoMechSteadyState = False
        solver_object.MatrixSolverType = "default"
        solver_object.IterationsControlParameterTimeUse = False

    # fixed_constraint
    fixed_constraint = analysis.addObject(
        ObjectsFem.makeConstraintFixed(doc, name="FemConstraintFixed"))[0]
    fixed_constraint.References = [(geom_obj, "Face1")]

    # force_constraint
    force_constraint = analysis.addObject(
        ObjectsFem.makeConstraintForce(doc, name="FemConstraintForce"))[0]
    force_constraint.References = [(geom_obj, "Face6")]
    force_constraint.Force = 40000.0
    force_constraint.Direction = (geom_obj, ["Edge5"])
    force_constraint.Reversed = True

    # pressure_constraint
    pressure_constraint = analysis.addObject(
        ObjectsFem.makeConstraintPressure(doc,
                                          name="FemConstraintPressure"))[0]
    pressure_constraint.References = [(geom_obj, "Face2")]
    pressure_constraint.Pressure = 1000.0
    pressure_constraint.Reversed = False

    doc.recompute()
    return doc
Ejemplo n.º 5
0
    def test_femobjects_make(self):
        doc = self.active_doc
        analysis = ObjectsFem.makeAnalysis(doc)

        analysis.addObject(ObjectsFem.makeConstraintBearing(doc))
        analysis.addObject(ObjectsFem.makeConstraintBodyHeatSource(doc))
        analysis.addObject(ObjectsFem.makeConstraintContact(doc))
        analysis.addObject(ObjectsFem.makeConstraintDisplacement(doc))
        analysis.addObject(ObjectsFem.makeConstraintElectrostaticPotential(doc))
        analysis.addObject(ObjectsFem.makeConstraintFixed(doc))
        analysis.addObject(ObjectsFem.makeConstraintFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintFluidBoundary(doc))
        analysis.addObject(ObjectsFem.makeConstraintForce(doc))
        analysis.addObject(ObjectsFem.makeConstraintGear(doc))
        analysis.addObject(ObjectsFem.makeConstraintHeatflux(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintPlaneRotation(doc))
        analysis.addObject(ObjectsFem.makeConstraintPressure(doc))
        analysis.addObject(ObjectsFem.makeConstraintPulley(doc))
        analysis.addObject(ObjectsFem.makeConstraintSelfWeight(doc))
        analysis.addObject(ObjectsFem.makeConstraintTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintTransform(doc))

        analysis.addObject(ObjectsFem.makeElementFluid1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry2D(doc))
        analysis.addObject(ObjectsFem.makeElementRotation1D(doc))

        analysis.addObject(ObjectsFem.makeMaterialFluid(doc))
        mat = analysis.addObject(ObjectsFem.makeMaterialSolid(doc))[0]
        analysis.addObject(ObjectsFem.makeMaterialMechanicalNonlinear(doc, mat))

        msh = analysis.addObject(ObjectsFem.makeMeshGmsh(doc))[0]
        analysis.addObject(ObjectsFem.makeMeshBoundaryLayer(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshGroup(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshRegion(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshNetgen(doc))
        analysis.addObject(ObjectsFem.makeMeshResult(doc))

        analysis.addObject(ObjectsFem.makeResultMechanical(doc))

        analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc))
        analysis.addObject(ObjectsFem.makeSolverCalculix(doc))
        sol = analysis.addObject(ObjectsFem.makeSolverElmer(doc))[0]
        analysis.addObject(ObjectsFem.makeSolverZ88(doc))

        analysis.addObject(ObjectsFem.makeEquationElasticity(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationElectrostatic(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFlow(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFluxsolver(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationHeat(doc, sol))
        # TODO the equations show up twice on Tree (on solver and on analysis), if they are added to the analysis group

        doc.recompute()
        self.assertEqual(len(analysis.Group), testtools.get_defmake_count() - 1)  # because of the analysis itself count -1
Ejemplo n.º 6
0
def setup_static(doc=None, solver="ccxtools"):
    # setup box static, add a fixed, force and a pressure constraint

    doc = setup_base(doc, solver)
    box_obj = doc.Box
    analysis = doc.Analysis

    # solver
    # TODO How to pass multiple solver for one analysis in one doc
    if solver == "calculix":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
        )[0]
    elif solver == "ccxtools":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools")
        )[0]
        solver_object.WorkingDir = u""
    elif solver == "elmer":
        analysis.addObject(ObjectsFem.makeSolverElmer(doc, "SolverElmer"))
    elif solver == "z88":
        analysis.addObject(ObjectsFem.makeSolverZ88(doc, "SolverZ88"))
    if solver == "calculix" or solver == "ccxtools":
        solver_object.AnalysisType = "static"
        solver_object.GeometricalNonlinearity = "linear"
        solver_object.ThermoMechSteadyState = False
        solver_object.MatrixSolverType = "default"
        solver_object.IterationsControlParameterTimeUse = False

    # fixed_constraint
    fixed_constraint = analysis.addObject(
        ObjectsFem.makeConstraintFixed(doc, name="FemConstraintFixed")
    )[0]
    fixed_constraint.References = [(box_obj, "Face1")]

    # force_constraint
    force_constraint = analysis.addObject(
        ObjectsFem.makeConstraintForce(doc, name="FemConstraintForce")
    )[0]
    force_constraint.References = [(box_obj, "Face6")]
    force_constraint.Force = 40000.0
    force_constraint.Direction = (box_obj, ["Edge5"])
    force_constraint.Reversed = True

    # pressure_constraint
    pressure_constraint = analysis.addObject(
        ObjectsFem.makeConstraintPressure(doc, name="FemConstraintPressure")
    )[0]
    pressure_constraint.References = [(box_obj, "Face2")]
    pressure_constraint.Pressure = 1000.0
    pressure_constraint.Reversed = False

    doc.recompute()
    return doc
Ejemplo n.º 7
0
    def test_femobjects_derivedfromstd(self):
        # only the last True type is used
        doc = self.active_doc

        self.assertTrue(ObjectsFem.makeAnalysis(doc).isDerivedFrom('Fem::FemAnalysis'))
        self.assertTrue(ObjectsFem.makeConstraintBearing(doc).isDerivedFrom('Fem::ConstraintBearing'))
        self.assertTrue(ObjectsFem.makeConstraintBodyHeatSource(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintContact(doc).isDerivedFrom('Fem::ConstraintContact'))
        self.assertTrue(ObjectsFem.makeConstraintDisplacement(doc).isDerivedFrom('Fem::ConstraintDisplacement'))
        self.assertTrue(ObjectsFem.makeConstraintElectrostaticPotential(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintFixed(doc).isDerivedFrom('Fem::ConstraintFixed'))
        self.assertTrue(ObjectsFem.makeConstraintFlowVelocity(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintFluidBoundary(doc).isDerivedFrom('Fem::ConstraintFluidBoundary'))
        self.assertTrue(ObjectsFem.makeConstraintForce(doc).isDerivedFrom('Fem::ConstraintForce'))
        self.assertTrue(ObjectsFem.makeConstraintGear(doc).isDerivedFrom('Fem::ConstraintGear'))
        self.assertTrue(ObjectsFem.makeConstraintHeatflux(doc).isDerivedFrom('Fem::ConstraintHeatflux'))
        self.assertTrue(ObjectsFem.makeConstraintInitialFlowVelocity(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintInitialTemperature(doc).isDerivedFrom('Fem::ConstraintInitialTemperature'))
        self.assertTrue(ObjectsFem.makeConstraintPlaneRotation(doc).isDerivedFrom('Fem::ConstraintPlaneRotation'))
        self.assertTrue(ObjectsFem.makeConstraintPressure(doc).isDerivedFrom('Fem::ConstraintPressure'))
        self.assertTrue(ObjectsFem.makeConstraintPulley(doc).isDerivedFrom('Fem::ConstraintPulley'))
        self.assertTrue(ObjectsFem.makeConstraintSelfWeight(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintTemperature(doc).isDerivedFrom('Fem::ConstraintTemperature'))
        self.assertTrue(ObjectsFem.makeConstraintTransform(doc).isDerivedFrom('Fem::ConstraintTransform'))
        self.assertTrue(ObjectsFem.makeElementFluid1D(doc).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeElementGeometry1D(doc).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeElementGeometry2D(doc).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeElementRotation1D(doc).isDerivedFrom('Fem::FeaturePython'))
        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        self.assertTrue(ObjectsFem.makeMaterialFluid(doc).isDerivedFrom('App::MaterialObjectPython'))
        self.assertTrue(materialsolid.isDerivedFrom('App::MaterialObjectPython'))
        self.assertTrue(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid).isDerivedFrom('Fem::FeaturePython'))
        mesh = ObjectsFem.makeMeshGmsh(doc)
        self.assertTrue(mesh.isDerivedFrom('Fem::FemMeshObjectPython'))
        self.assertTrue(ObjectsFem.makeMeshBoundaryLayer(doc, mesh).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeMeshGroup(doc, mesh).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeMeshRegion(doc, mesh).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeMeshNetgen(doc).isDerivedFrom('Fem::FemMeshShapeNetgenObject'))
        self.assertTrue(ObjectsFem.makeMeshResult(doc).isDerivedFrom('Fem::FemMeshObjectPython'))
        self.assertTrue(ObjectsFem.makeResultMechanical(doc).isDerivedFrom('Fem::FemResultObjectPython'))
        solverelmer = ObjectsFem.makeSolverElmer(doc)
        self.assertTrue(ObjectsFem.makeSolverCalculixCcxTools(doc).isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(ObjectsFem.makeSolverCalculix(doc).isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(solverelmer.isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(ObjectsFem.makeSolverZ88(doc).isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(ObjectsFem.makeEquationElasticity(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationElectrostatic(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationFlow(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationFluxsolver(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationHeat(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
Ejemplo n.º 8
0
    def test_femobjects_derivedfromstd(self):
        # only the last True type is used
        doc = self.active_doc

        self.assertTrue(ObjectsFem.makeAnalysis(doc).isDerivedFrom('Fem::FemAnalysis'))
        self.assertTrue(ObjectsFem.makeConstraintBearing(doc).isDerivedFrom('Fem::ConstraintBearing'))
        self.assertTrue(ObjectsFem.makeConstraintBodyHeatSource(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintContact(doc).isDerivedFrom('Fem::ConstraintContact'))
        self.assertTrue(ObjectsFem.makeConstraintDisplacement(doc).isDerivedFrom('Fem::ConstraintDisplacement'))
        self.assertTrue(ObjectsFem.makeConstraintElectrostaticPotential(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintFixed(doc).isDerivedFrom('Fem::ConstraintFixed'))
        self.assertTrue(ObjectsFem.makeConstraintFlowVelocity(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintFluidBoundary(doc).isDerivedFrom('Fem::ConstraintFluidBoundary'))
        self.assertTrue(ObjectsFem.makeConstraintForce(doc).isDerivedFrom('Fem::ConstraintForce'))
        self.assertTrue(ObjectsFem.makeConstraintGear(doc).isDerivedFrom('Fem::ConstraintGear'))
        self.assertTrue(ObjectsFem.makeConstraintHeatflux(doc).isDerivedFrom('Fem::ConstraintHeatflux'))
        self.assertTrue(ObjectsFem.makeConstraintInitialFlowVelocity(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintInitialTemperature(doc).isDerivedFrom('Fem::ConstraintInitialTemperature'))
        self.assertTrue(ObjectsFem.makeConstraintPlaneRotation(doc).isDerivedFrom('Fem::ConstraintPlaneRotation'))
        self.assertTrue(ObjectsFem.makeConstraintPressure(doc).isDerivedFrom('Fem::ConstraintPressure'))
        self.assertTrue(ObjectsFem.makeConstraintPulley(doc).isDerivedFrom('Fem::ConstraintPulley'))
        self.assertTrue(ObjectsFem.makeConstraintSelfWeight(doc).isDerivedFrom('Fem::ConstraintPython'))
        self.assertTrue(ObjectsFem.makeConstraintTemperature(doc).isDerivedFrom('Fem::ConstraintTemperature'))
        self.assertTrue(ObjectsFem.makeConstraintTransform(doc).isDerivedFrom('Fem::ConstraintTransform'))
        self.assertTrue(ObjectsFem.makeElementFluid1D(doc).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeElementGeometry1D(doc).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeElementGeometry2D(doc).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeElementRotation1D(doc).isDerivedFrom('Fem::FeaturePython'))
        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        self.assertTrue(ObjectsFem.makeMaterialFluid(doc).isDerivedFrom('App::MaterialObjectPython'))
        self.assertTrue(materialsolid.isDerivedFrom('App::MaterialObjectPython'))
        self.assertTrue(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid).isDerivedFrom('Fem::FeaturePython'))
        mesh = ObjectsFem.makeMeshGmsh(doc)
        self.assertTrue(mesh.isDerivedFrom('Fem::FemMeshObjectPython'))
        self.assertTrue(ObjectsFem.makeMeshBoundaryLayer(doc, mesh).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeMeshGroup(doc, mesh).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeMeshRegion(doc, mesh).isDerivedFrom('Fem::FeaturePython'))
        self.assertTrue(ObjectsFem.makeMeshNetgen(doc).isDerivedFrom('Fem::FemMeshShapeNetgenObject'))
        self.assertTrue(ObjectsFem.makeMeshResult(doc).isDerivedFrom('Fem::FemMeshObjectPython'))
        self.assertTrue(ObjectsFem.makeResultMechanical(doc).isDerivedFrom('Fem::FemResultObjectPython'))
        solverelmer = ObjectsFem.makeSolverElmer(doc)
        self.assertTrue(ObjectsFem.makeSolverCalculixCcxTools(doc).isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(ObjectsFem.makeSolverCalculix(doc).isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(solverelmer.isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(ObjectsFem.makeSolverZ88(doc).isDerivedFrom('Fem::FemSolverObjectPython'))
        self.assertTrue(ObjectsFem.makeEquationElasticity(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationElectrostatic(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationFlow(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationFluxsolver(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
        self.assertTrue(ObjectsFem.makeEquationHeat(doc, solverelmer).isDerivedFrom('App::FeaturePython'))
Ejemplo n.º 9
0
    def test_femobjects_isoftype(self):
        doc = self.active_doc

        from femtools.femutils import is_of_type
        self.assertTrue(is_of_type(ObjectsFem.makeAnalysis(doc), 'Fem::FemAnalysis'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintBearing(doc), 'Fem::ConstraintBearing'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintBodyHeatSource(doc), 'Fem::ConstraintBodyHeatSource'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintContact(doc), 'Fem::ConstraintContact'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintDisplacement(doc), 'Fem::ConstraintDisplacement'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintElectrostaticPotential(doc), 'Fem::ConstraintElectrostaticPotential'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintFixed(doc), 'Fem::ConstraintFixed'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintFlowVelocity(doc), 'Fem::ConstraintFlowVelocity'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintFluidBoundary(doc), 'Fem::ConstraintFluidBoundary'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintForce(doc), 'Fem::ConstraintForce'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintGear(doc), 'Fem::ConstraintGear'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintHeatflux(doc), 'Fem::ConstraintHeatflux'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintInitialFlowVelocity(doc), 'Fem::ConstraintInitialFlowVelocity'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintInitialTemperature(doc), 'Fem::ConstraintInitialTemperature'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintPlaneRotation(doc), 'Fem::ConstraintPlaneRotation'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintPressure(doc), 'Fem::ConstraintPressure'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintPulley(doc), 'Fem::ConstraintPulley'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintSelfWeight(doc), 'Fem::ConstraintSelfWeight'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintTemperature(doc), 'Fem::ConstraintTemperature'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintTransform(doc), 'Fem::ConstraintTransform'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementFluid1D(doc), 'Fem::FemElementFluid1D'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementGeometry1D(doc), 'Fem::FemElementGeometry1D'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementGeometry2D(doc), 'Fem::FemElementGeometry2D'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementRotation1D(doc), 'Fem::FemElementRotation1D'))
        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        self.assertTrue(is_of_type(ObjectsFem.makeMaterialFluid(doc), 'Fem::Material'))
        self.assertTrue(is_of_type(materialsolid, 'Fem::Material'))
        self.assertTrue(is_of_type(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid), 'Fem::MaterialMechanicalNonlinear'))
        mesh = ObjectsFem.makeMeshGmsh(doc)
        self.assertTrue(is_of_type(mesh, 'Fem::FemMeshGmsh'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshBoundaryLayer(doc, mesh), 'Fem::FemMeshBoundaryLayer'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshGroup(doc, mesh), 'Fem::FemMeshGroup'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshRegion(doc, mesh), 'Fem::FemMeshRegion'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshNetgen(doc), 'Fem::FemMeshShapeNetgenObject'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshResult(doc), 'Fem::FemMeshResult'))
        self.assertTrue(is_of_type(ObjectsFem.makeResultMechanical(doc), 'Fem::FemResultMechanical'))
        solverelmer = ObjectsFem.makeSolverElmer(doc)
        self.assertTrue(is_of_type(ObjectsFem.makeSolverCalculixCcxTools(doc), 'Fem::FemSolverCalculixCcxTools'))
        self.assertTrue(is_of_type(ObjectsFem.makeSolverCalculix(doc), 'Fem::FemSolverObjectCalculix'))
        self.assertTrue(is_of_type(solverelmer, 'Fem::FemSolverObjectElmer'))
        self.assertTrue(is_of_type(ObjectsFem.makeSolverZ88(doc), 'Fem::FemSolverObjectZ88'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationElasticity(doc, solverelmer), 'Fem::FemEquationElmerElasticity'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationElectrostatic(doc, solverelmer), 'Fem::FemEquationElmerElectrostatic'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationFlow(doc, solverelmer), 'Fem::FemEquationElmerFlow'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationFluxsolver(doc, solverelmer), 'Fem::FemEquationElmerFluxsolver'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationHeat(doc, solverelmer), 'Fem::FemEquationElmerHeat'))
Ejemplo n.º 10
0
    def test_femobjects_isoftype(self):
        doc = self.active_doc

        from femtools.femutils import is_of_type
        self.assertTrue(is_of_type(ObjectsFem.makeAnalysis(doc), 'Fem::FemAnalysis'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintBearing(doc), 'Fem::ConstraintBearing'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintBodyHeatSource(doc), 'Fem::ConstraintBodyHeatSource'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintContact(doc), 'Fem::ConstraintContact'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintDisplacement(doc), 'Fem::ConstraintDisplacement'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintElectrostaticPotential(doc), 'Fem::ConstraintElectrostaticPotential'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintFixed(doc), 'Fem::ConstraintFixed'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintFlowVelocity(doc), 'Fem::ConstraintFlowVelocity'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintFluidBoundary(doc), 'Fem::ConstraintFluidBoundary'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintForce(doc), 'Fem::ConstraintForce'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintGear(doc), 'Fem::ConstraintGear'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintHeatflux(doc), 'Fem::ConstraintHeatflux'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintInitialFlowVelocity(doc), 'Fem::ConstraintInitialFlowVelocity'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintInitialTemperature(doc), 'Fem::ConstraintInitialTemperature'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintPlaneRotation(doc), 'Fem::ConstraintPlaneRotation'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintPressure(doc), 'Fem::ConstraintPressure'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintPulley(doc), 'Fem::ConstraintPulley'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintSelfWeight(doc), 'Fem::ConstraintSelfWeight'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintTemperature(doc), 'Fem::ConstraintTemperature'))
        self.assertTrue(is_of_type(ObjectsFem.makeConstraintTransform(doc), 'Fem::ConstraintTransform'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementFluid1D(doc), 'Fem::FemElementFluid1D'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementGeometry1D(doc), 'Fem::FemElementGeometry1D'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementGeometry2D(doc), 'Fem::FemElementGeometry2D'))
        self.assertTrue(is_of_type(ObjectsFem.makeElementRotation1D(doc), 'Fem::FemElementRotation1D'))
        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        self.assertTrue(is_of_type(ObjectsFem.makeMaterialFluid(doc), 'Fem::Material'))
        self.assertTrue(is_of_type(materialsolid, 'Fem::Material'))
        self.assertTrue(is_of_type(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid), 'Fem::MaterialMechanicalNonlinear'))
        mesh = ObjectsFem.makeMeshGmsh(doc)
        self.assertTrue(is_of_type(mesh, 'Fem::FemMeshGmsh'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshBoundaryLayer(doc, mesh), 'Fem::FemMeshBoundaryLayer'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshGroup(doc, mesh), 'Fem::FemMeshGroup'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshRegion(doc, mesh), 'Fem::FemMeshRegion'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshNetgen(doc), 'Fem::FemMeshShapeNetgenObject'))
        self.assertTrue(is_of_type(ObjectsFem.makeMeshResult(doc), 'Fem::FemMeshResult'))
        self.assertTrue(is_of_type(ObjectsFem.makeResultMechanical(doc), 'Fem::FemResultMechanical'))
        solverelmer = ObjectsFem.makeSolverElmer(doc)
        self.assertTrue(is_of_type(ObjectsFem.makeSolverCalculixCcxTools(doc), 'Fem::FemSolverCalculixCcxTools'))
        self.assertTrue(is_of_type(ObjectsFem.makeSolverCalculix(doc), 'Fem::FemSolverObjectCalculix'))
        self.assertTrue(is_of_type(solverelmer, 'Fem::FemSolverObjectElmer'))
        self.assertTrue(is_of_type(ObjectsFem.makeSolverZ88(doc), 'Fem::FemSolverObjectZ88'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationElasticity(doc, solverelmer), 'Fem::FemEquationElmerElasticity'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationElectrostatic(doc, solverelmer), 'Fem::FemEquationElmerElectrostatic'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationFlow(doc, solverelmer), 'Fem::FemEquationElmerFlow'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationFluxsolver(doc, solverelmer), 'Fem::FemEquationElmerFluxsolver'))
        self.assertTrue(is_of_type(ObjectsFem.makeEquationHeat(doc, solverelmer), 'Fem::FemEquationElmerHeat'))
Ejemplo n.º 11
0
def setup(doc=None, solvertype="ccxtools"):
    # setup model

    if doc is None:
        doc = init_doc()

    # geometry objects
    # two boxes
    boxlow = doc.addObject("Part::Box", "BoxLower")
    boxupp = doc.addObject("Part::Box", "BoxUpper")
    boxupp.Placement.Base = (0, 0, 10)

    # boolean fragment of the two boxes
    bf = SplitFeatures.makeBooleanFragments(name="BooleanFragments")
    bf.Objects = [boxlow, boxupp]
    bf.Mode = "CompSolid"
    doc.recompute()
    bf.Proxy.execute(bf)
    bf.purgeTouched()
    if FreeCAD.GuiUp:
        for child in bf.ViewObject.Proxy.claimChildren():
            child.ViewObject.hide()
    doc.recompute()

    # extract CompSolid by compound filter tool
    geom_obj = CompoundFilter.makeCompoundFilter(name="MultiMatCompSolid")
    geom_obj.Base = bf
    geom_obj.FilterType = "window-volume"
    geom_obj.Proxy.execute(geom_obj)
    geom_obj.purgeTouched()
    if FreeCAD.GuiUp:
        geom_obj.Base.ViewObject.hide()
    doc.recompute()

    if FreeCAD.GuiUp:
        geom_obj.ViewObject.Document.activeView().viewAxonometric()
        geom_obj.ViewObject.Document.activeView().fitAll()

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX"))[0]
    elif solvertype == "ccxtools":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools"))[0]
        solver_object.WorkingDir = u""
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_object.SplitInputWriter = False
        solver_object.AnalysisType = "static"
        solver_object.GeometricalNonlinearity = "linear"
        solver_object.ThermoMechSteadyState = False
        solver_object.MatrixSolverType = "default"
        solver_object.IterationsControlParameterTimeUse = False

    # material
    material_object_low = analysis.addObject(
        ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterialLow"))[0]
    mat = material_object_low.Material
    mat["Name"] = "Aluminium-Generic"
    mat["YoungsModulus"] = "70000 MPa"
    mat["PoissonRatio"] = "0.35"
    mat["Density"] = "2700  kg/m^3"
    material_object_low.Material = mat
    material_object_low.References = [(boxlow, "Solid1")]
    analysis.addObject(material_object_low)

    material_object_upp = analysis.addObject(
        ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterialUpp"))[0]
    mat = material_object_upp.Material
    mat["Name"] = "Steel-Generic"
    mat["YoungsModulus"] = "200000 MPa"
    mat["PoissonRatio"] = "0.30"
    mat["Density"] = "7980 kg/m^3"
    material_object_upp.Material = mat
    material_object_upp.References = [(boxupp, "Solid1")]

    # fixed_constraint
    fixed_constraint = analysis.addObject(
        ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed"))[0]
    fixed_constraint.References = [(geom_obj, "Face5")]

    # pressure_constraint
    pressure_constraint = analysis.addObject(
        ObjectsFem.makeConstraintPressure(doc, "ConstraintPressure"))[0]
    pressure_constraint.References = [(geom_obj, "Face11")]
    pressure_constraint.Pressure = 1000.0
    pressure_constraint.Reversed = False

    # mesh
    from .meshes.mesh_boxes_2_vertikal_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(ObjectsFem.makeMeshGmsh(doc,
                                                             mesh_name))[0]
    femmesh_obj.FemMesh = fem_mesh
    femmesh_obj.Part = geom_obj
    femmesh_obj.SecondOrderLinear = False

    doc.recompute()
    return doc
Ejemplo n.º 12
0
def setup(doc=None, solvertype="ccxtools"):
    """ Nonlinear material example, plate with hole.

    https://forum.freecadweb.org/viewtopic.php?f=24&t=31997&start=30
    https://forum.freecadweb.org/viewtopic.php?t=33974&start=90
    https://forum.freecadweb.org/viewtopic.php?t=35893

    plate: 400x200x10 mm
    hole: diameter 100 mm (half cross section)
    load: 130 MPa tension
    linear material: Steel, E = 210000 MPa, my = 0.3
    nonlinear material: '240.0, 0.0' to '270.0, 0.025'
    TODO nonlinear material: give more information, use values from harry
    TODO compare results with example from HarryvL

    """

    if doc is None:
        doc = init_doc()

    # part
    import Part
    from FreeCAD import Vector as vec
    from Part import makeLine as ln
    from Part import makeCircle as ci

    v1 = vec(-200, -100, 0)
    v2 = vec(200, -100, 0)
    v3 = vec(200, 100, 0)
    v4 = vec(-200, 100, 0)
    l1 = ln(v1, v2)
    l2 = ln(v2, v3)
    l3 = ln(v3, v4)
    l4 = ln(v4, v1)
    v5 = vec(0, 0, 0)
    c1 = ci(50, v5)
    face = Part.makeFace([Part.Wire([l1, l2, l3, l4]), c1],
                         "Part::FaceMakerBullseye")
    partfem = doc.addObject("Part::Feature", "Hole_Plate")
    partfem.Shape = face.extrude(vec(0, 0, 10))
    doc.recompute()

    if FreeCAD.GuiUp:
        import FreeCADGui
        FreeCADGui.ActiveDocument.activeView().viewAxonometric()
        FreeCADGui.SendMsgToActiveView("ViewFit")

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver = analysis.addObject(
            ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX"))[0]
    elif solvertype == "ccxtools":
        solver = analysis.addObject(
            ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools"))[0]
        solver.WorkingDir = u""
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver.SplitInputWriter = False
        solver.AnalysisType = "static"
        solver.GeometricalNonlinearity = "linear"
        solver.ThermoMechSteadyState = False
        solver.MatrixSolverType = "default"
        solver.IterationsControlParameterTimeUse = False
        solver.GeometricalNonlinearity = 'nonlinear'
        solver.MaterialNonlinearity = 'nonlinear'

    # linear material
    matprop = {}
    matprop["Name"] = "CalculiX-Steel"
    matprop["YoungsModulus"] = "210000 MPa"
    matprop["PoissonRatio"] = "0.30"
    matprop["Density"] = "7900 kg/m^3"
    material = analysis.addObject(
        ObjectsFem.makeMaterialSolid(doc, "Material_lin"))[0]
    material.Material = matprop

    # nonlinear material
    nonlinear_material = analysis.addObject(
        ObjectsFem.makeMaterialMechanicalNonlinear(doc, material,
                                                   "Material_nonlin"))[0]
    nonlinear_material.YieldPoint1 = '240.0, 0.0'
    nonlinear_material.YieldPoint2 = '270.0, 0.025'
    # check solver attributes, Nonlinearity needs to be set to nonlinear

    # fixed_constraint
    fixed_constraint = analysis.addObject(
        ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed"))[0]
    fixed_constraint.References = [(partfem, "Face4")]

    # force constraint
    pressure_constraint = doc.Analysis.addObject(
        ObjectsFem.makeConstraintPressure(doc, "ConstraintPressure"))[0]
    pressure_constraint.References = [(partfem, "Face2")]
    pressure_constraint.Pressure = 130.0
    pressure_constraint.Reversed = True

    # mesh
    from .meshes.mesh_platewithhole_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(
        doc.addObject("Fem::FemMeshObject", mesh_name))[0]
    femmesh_obj.FemMesh = fem_mesh

    doc.recompute()
    return doc
Ejemplo n.º 13
0
def setup(doc=None, solvertype="ccxtools"):

    # init FreeCAD document
    if doc is None:
        doc = init_doc()

    # explanation object
    # just keep the following line and change text string in get_explanation method
    manager.add_explanation_obj(
        doc, get_explanation(manager.get_header(get_information())))

    # geometric objects
    # the part sketch
    arc_sketch = doc.addObject("Sketcher::SketchObject", "Arc_Sketch")
    arc_sketch.Placement = FreeCAD.Placement(Vector(0, 0, 0),
                                             Rotation(0, 0, 0, 1))
    arc_sketch.MapMode = "Deactivated"
    # not the exact geometry which makes a closed wire
    # exact geometry will be made by the constraints
    # the order is important for the constraints definition
    geoList = [
        Part.ArcOfCircle(Part.Circle(Vector(0, 0, 0), Vector(0, 0, 1), 47), 0,
                         math.pi),
        Part.ArcOfCircle(Part.Circle(Vector(-19, -22, 0), Vector(0, 0, 1), 89),
                         math.pi / 12, math.pi / 1.1),
        Part.LineSegment(Vector(-105, 0, 0), Vector(-47, 0, 0)),
        Part.LineSegment(Vector(47, 0, 0), Vector(67, 0, 0))
    ]
    arc_sketch.addGeometry(geoList, False)
    # https://wiki.freecadweb.org/Sketcher_ConstrainCoincident
    # but the best way is to add a constraint is watching
    # FreeCAD python console while create this one by the Gui
    conList = [
        Sketcher.Constraint("Coincident", 0, 3, -1, 1),
        Sketcher.Constraint("PointOnObject", 0, 2, -1),
        Sketcher.Constraint("PointOnObject", 0, 1, -1),
        Sketcher.Constraint("PointOnObject", 1, 2, -1),
        Sketcher.Constraint("PointOnObject", 1, 1, -1),
        Sketcher.Constraint("Coincident", 2, 1, 0, 2),
        Sketcher.Constraint("Coincident", 2, 2, 1, 2),
        Sketcher.Constraint("Coincident", 3, 1, 1, 1),
        Sketcher.Constraint("Coincident", 3, 2, 0, 1),
        Sketcher.Constraint("DistanceX", 2, 2, 2, 1, 58),
        Sketcher.Constraint("DistanceX", 3, 2, 3, 1, 20),
        Sketcher.Constraint("Radius", 0, 47),
        Sketcher.Constraint("Radius", 1, 89)
    ]
    arc_sketch.addConstraint(conList)

    # the part extrusion
    extrude_part = doc.addObject("Part::Extrusion", "ArcExtrude")
    extrude_part.Base = arc_sketch
    extrude_part.DirMode = "Custom"
    extrude_part.Dir = Vector(0.00, 0.00, 1.00)
    extrude_part.DirLink = None
    extrude_part.LengthFwd = 30.00
    extrude_part.LengthRev = 0.00
    extrude_part.Solid = True
    extrude_part.Reversed = False
    extrude_part.Symmetric = True
    extrude_part.TaperAngle = 0.00
    extrude_part.TaperAngleRev = 0.00

    # section plane sketch
    section_sketch = doc.addObject("Sketcher::SketchObject", "Section_Sketch")
    section_sketch.Placement = FreeCAD.Placement(
        Vector(0.000000, 0.000000, 0.000000),
        Rotation(0.000000, 0.000000, 0.000000, 1.000000))
    section_sketch.MapMode = "Deactivated"
    section_sketch.addGeometry(
        Part.LineSegment(Vector(-6.691961, -16.840161, 0),
                         Vector(75.156087, 79.421394, 0)), False)
    # section_sketch.ExternalGeometry = extrude_part

    # section plane extrusion
    extrude_section_plane = doc.addObject("Part::Extrusion",
                                          "SectionPlaneExtrude")
    extrude_section_plane.Base = section_sketch
    extrude_section_plane.DirMode = "Custom"
    extrude_section_plane.Dir = Vector(0.00, 0.00, -1.00)
    extrude_section_plane.DirLink = None
    extrude_section_plane.LengthFwd = 40.00
    extrude_section_plane.LengthRev = 0.00
    extrude_section_plane.Solid = False
    extrude_section_plane.Reversed = False
    extrude_section_plane.Symmetric = True
    extrude_section_plane.TaperAngle = 0.00
    extrude_section_plane.TaperAngleRev = 0.00

    # TODO the extrusions could be done with much less code, see BOLTS

    if FreeCAD.GuiUp:
        arc_sketch.ViewObject.hide()
        section_sketch.ViewObject.hide()
        extrude_part.ViewObject.hide()
        extrude_section_plane.ViewObject.hide()

    Slice = makeSlice(name="Slice")
    Slice.Base = extrude_part
    Slice.Tools = extrude_section_plane
    Slice.Mode = "Split"
    # Slice.Proxy.execute(Slice)
    Slice.purgeTouched()

    # compound filter to get the solids of the slice
    solid_one = makeCompoundFilter(name="SolidOne")
    solid_one.Base = Slice
    solid_one.FilterType = "specific items"
    solid_one.items = "0"
    # solid_one.Proxy.execute(solid_one)
    solid_one.purgeTouched()
    if FreeCAD.GuiUp:
        solid_one.Base.ViewObject.hide()

    solid_two = makeCompoundFilter(name="SolidTwo")
    solid_two.Base = Slice
    solid_two.FilterType = "specific items"
    solid_two.items = "1"
    # solid_two.Proxy.execute(solid_two)
    solid_two.purgeTouched()
    if FreeCAD.GuiUp:
        solid_two.Base.ViewObject.hide()

    # CompSolid out of the two solids
    geom_obj = makeBooleanFragments(name="BooleanFragments")
    geom_obj.Objects = [solid_one, solid_two]
    geom_obj.Mode = "CompSolid"
    # geom_obj.Proxy.execute(geom_obj)
    geom_obj.purgeTouched()
    if FreeCAD.GuiUp:
        solid_one.ViewObject.hide()
        solid_two.ViewObject.hide()
    doc.recompute()

    if FreeCAD.GuiUp:
        geom_obj.ViewObject.Transparency = 50
        geom_obj.ViewObject.Document.activeView().viewAxonometric()
        geom_obj.ViewObject.Document.activeView().fitAll()

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver_obj = ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
    elif solvertype == "ccxtools":
        solver_obj = ObjectsFem.makeSolverCalculixCcxTools(
            doc, "CalculiXccxTools")
        solver_obj.WorkingDir = u""
    else:
        FreeCAD.Console.PrintWarning(
            "Not known or not supported solver type: {}. "
            "No solver object was created.\n".format(solvertype))
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_obj.SplitInputWriter = False
        solver_obj.AnalysisType = "static"
        solver_obj.GeometricalNonlinearity = "linear"
        solver_obj.ThermoMechSteadyState = False
        solver_obj.MatrixSolverType = "default"
        solver_obj.IterationsControlParameterTimeUse = False
    analysis.addObject(solver_obj)

    # material
    material_obj = ObjectsFem.makeMaterialSolid(doc, "Material")
    mat = material_obj.Material
    mat["Name"] = "CalculiX-Steel"
    mat["YoungsModulus"] = "210000 MPa"
    mat["PoissonRatio"] = "0.30"
    material_obj.Material = mat
    analysis.addObject(material_obj)

    # constraint fixed
    con_fixed = ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed")
    con_fixed.References = [(geom_obj, "Face9")]
    analysis.addObject(con_fixed)

    # constraint pressure
    con_pressure = ObjectsFem.makeConstraintPressure(doc, "ConstraintPressure")
    con_pressure.References = [(geom_obj, "Face1")]
    con_pressure.Pressure = 100.0
    con_pressure.Reversed = False
    analysis.addObject(con_pressure)

    # constraint section print
    con_sectionpr = ObjectsFem.makeConstraintSectionPrint(
        doc, "ConstraintSectionPrint")
    con_sectionpr.References = [(geom_obj, "Face6")]
    analysis.addObject(con_sectionpr)

    # mesh
    from .meshes.mesh_section_print_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(
        ObjectsFem.makeMeshGmsh(doc, get_meshname()))[0]
    femmesh_obj.FemMesh = fem_mesh
    femmesh_obj.Part = geom_obj
    femmesh_obj.SecondOrderLinear = False

    doc.recompute()
    return doc
Ejemplo n.º 14
0
def setup(doc=None, solvertype="ccxtools"):
    # setup model

    if doc is None:
        doc = init_doc()

    # parts
    # bottom box
    bottom_box_obj = doc.addObject("Part::Box", "BottomBox")
    bottom_box_obj.Length = 100
    bottom_box_obj.Width = 25
    bottom_box_obj.Height = 500
    bottom_box_obj.Placement = FreeCAD.Placement(
        Vector(186, 0, -247),
        Rotation(0, 0, 0),
        Vector(0, 0, 0),
    )
    doc.recompute()

    # top half cylinder, https://forum.freecadweb.org/viewtopic.php?f=18&t=43001#p366111
    top_halfcyl_obj = doc.addObject("Part::Cylinder", "TopHalfCylinder")
    top_halfcyl_obj.Radius = 30
    top_halfcyl_obj.Height = 500
    top_halfcyl_obj.Angle = 180
    top_halfcyl_sh = Part.getShape(top_halfcyl_obj,
                                   '',
                                   needSubElement=False,
                                   refine=True)
    top_halfcyl_obj.Shape = top_halfcyl_sh
    top_halfcyl_obj.Placement = FreeCAD.Placement(
        Vector(0, -42, 0),
        Rotation(0, 90, 0),
        Vector(0, 0, 0),
    )
    doc.recompute()

    # all geom fusion
    all_geom_fusion_obj = doc.addObject("Part::MultiFuse", "AllGeomFusion")
    all_geom_fusion_obj.Shapes = [bottom_box_obj, top_halfcyl_obj]
    if FreeCAD.GuiUp:
        bottom_box_obj.ViewObject.hide()
        top_halfcyl_obj.ViewObject.hide()
    doc.recompute()

    if FreeCAD.GuiUp:
        import FreeCADGui
        FreeCADGui.ActiveDocument.activeView().viewAxonometric()
        FreeCADGui.SendMsgToActiveView("ViewFit")

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX"))[0]
    elif solvertype == "ccxtools":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools"))[0]
        solver_object.WorkingDir = u""
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_object.AnalysisType = "static"
        solver_object.GeometricalNonlinearity = "linear"
        solver_object.ThermoMechSteadyState = False
        solver_object.MatrixSolverType = "default"
        solver_object.IterationsControlParameterTimeUse = False
        solver_object.SplitInputWriter = False
        """
        # solver parameter from fandaL, but they are not needed (see forum topic)
        solver_object.IterationsControlParameterTimeUse = True
        solver_object.IterationsControlParameterCutb = '0.25,0.5,0.75,0.85,,,1.5,'
        solver_object.IterationsControlParameterIter = '4,8,9,200,10,400,,200,,'
        solver_object.IterationsUserDefinedTimeStepLength = True
        solver_object.TimeInitialStep = 0.1
        solver_object.TimeEnd = 1.0
        solver_object.IterationsUserDefinedIncrementations = True  # parameter DIRECT
        """

    # material
    material_obj = analysis.addObject(
        ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterial"))[0]
    mat = material_obj.Material
    mat["Name"] = "Steel-Generic"
    mat["YoungsModulus"] = "200000 MPa"
    mat["PoissonRatio"] = "0.30"
    material_obj.Material = mat
    analysis.addObject(material_obj)

    # constraint fixed
    con_fixed = analysis.addObject(
        ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed"))[0]
    con_fixed.References = [
        (all_geom_fusion_obj, "Face5"),
        (all_geom_fusion_obj, "Face6"),
        (all_geom_fusion_obj, "Face8"),
        (all_geom_fusion_obj, "Face9"),
    ]

    # constraint pressure
    con_pressure = analysis.addObject(
        ObjectsFem.makeConstraintPressure(doc, name="ConstraintPressure"))[0]
    con_pressure.References = [(all_geom_fusion_obj, "Face10")]
    con_pressure.Pressure = 100.0  # Pa ? = 100 Mpa ?
    con_pressure.Reversed = False

    # constraint contact
    con_contact = doc.Analysis.addObject(
        ObjectsFem.makeConstraintContact(doc, name="ConstraintContact"))[0]
    con_contact.References = [
        (all_geom_fusion_obj,
         "Face7"),  # first seams slave face, TODO proof in writer code!
        (all_geom_fusion_obj,
         "Face3"),  # second seams master face, TODO proof in writer code!
    ]
    con_contact.Friction = 0.0
    con_contact.Slope = 1000000.0  # contact stiffness 1000000.0 kg/(mm*s^2)

    # mesh
    from .meshes.mesh_contact_box_halfcylinder_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(
        doc.addObject("Fem::FemMeshObject", mesh_name))[0]
    femmesh_obj.FemMesh = fem_mesh

    doc.recompute()
    return doc
Ejemplo n.º 15
0
def setup(doc=None, solvertype="ccxtools"):
    # setup model

    if doc is None:
        doc = init_doc()

    # geometry objects
    v1 = vec(-200, -100, 0)
    v2 = vec(200, -100, 0)
    v3 = vec(200, 100, 0)
    v4 = vec(-200, 100, 0)
    l1 = ln(v1, v2)
    l2 = ln(v2, v3)
    l3 = ln(v3, v4)
    l4 = ln(v4, v1)
    v5 = vec(0, 0, 0)
    c1 = ci(50, v5)
    face = Part.makeFace([Part.Wire([l1, l2, l3, l4]), c1],
                         "Part::FaceMakerBullseye")
    geom_obj = doc.addObject("Part::Feature", "Hole_Plate")
    geom_obj.Shape = face.extrude(vec(0, 0, 10))
    doc.recompute()

    if FreeCAD.GuiUp:
        geom_obj.ViewObject.Document.activeView().viewAxonometric()
        geom_obj.ViewObject.Document.activeView().fitAll()

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver = analysis.addObject(
            ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX"))[0]
    elif solvertype == "ccxtools":
        solver = analysis.addObject(
            ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools"))[0]
        solver.WorkingDir = u""
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver.SplitInputWriter = False
        solver.AnalysisType = "static"
        solver.GeometricalNonlinearity = "linear"
        solver.ThermoMechSteadyState = False
        solver.MatrixSolverType = "default"
        solver.IterationsControlParameterTimeUse = False
        solver.GeometricalNonlinearity = 'nonlinear'
        solver.MaterialNonlinearity = 'nonlinear'

    # linear material
    matprop = {}
    matprop["Name"] = "CalculiX-Steel"
    matprop["YoungsModulus"] = "210000 MPa"
    matprop["PoissonRatio"] = "0.30"
    matprop["Density"] = "7900 kg/m^3"
    material = analysis.addObject(
        ObjectsFem.makeMaterialSolid(doc, "Material_lin"))[0]
    material.Material = matprop

    # nonlinear material
    nonlinear_material = analysis.addObject(
        ObjectsFem.makeMaterialMechanicalNonlinear(doc, material,
                                                   "Material_nonlin"))[0]
    nonlinear_material.YieldPoint1 = '240.0, 0.0'
    nonlinear_material.YieldPoint2 = '270.0, 0.025'
    # check solver attributes, Nonlinearity needs to be set to nonlinear

    # fixed_constraint
    fixed_constraint = analysis.addObject(
        ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed"))[0]
    fixed_constraint.References = [(geom_obj, "Face4")]

    # force constraint
    pressure_constraint = doc.Analysis.addObject(
        ObjectsFem.makeConstraintPressure(doc, "ConstraintPressure"))[0]
    pressure_constraint.References = [(geom_obj, "Face2")]
    pressure_constraint.Pressure = 130.0
    pressure_constraint.Reversed = True

    # mesh
    from .meshes.mesh_platewithhole_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(ObjectsFem.makeMeshGmsh(doc,
                                                             mesh_name))[0]
    femmesh_obj.FemMesh = fem_mesh
    femmesh_obj.Part = geom_obj
    femmesh_obj.SecondOrderLinear = False

    doc.recompute()
    return doc
Ejemplo n.º 16
0
    def test_femobjects_derivedfromfem(self):
        # try to add all possible True types from inheritance chain see
        # https://forum.freecadweb.org/viewtopic.php?f=10&t=32625
        doc = self.active_doc

        from femtools.femutils import is_derived_from

        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        mesh = ObjectsFem.makeMeshGmsh(doc)
        solverelmer = ObjectsFem.makeSolverElmer(doc)

        # FemAnalysis
        self.assertTrue(
            is_derived_from(ObjectsFem.makeAnalysis(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeAnalysis(doc), 'Fem::FemAnalysis'))

        # ConstraintBearing
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintBearing(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintBearing(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintBearing(doc),
                            'Fem::ConstraintBearing'))

        # ConstraintBodyHeatSource
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintBodyHeatSource(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintBodyHeatSource(doc),
                            'Fem::ConstraintPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintBodyHeatSource(doc),
                            'Fem::ConstraintBodyHeatSource'))

        # ConstraintContact
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintContact(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintContact(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintContact(doc),
                            'Fem::ConstraintContact'))

        # ConstraintDisplacement
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintDisplacement(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintDisplacement(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintDisplacement(doc),
                            'Fem::ConstraintDisplacement'))

        # ConstraintElectrostaticPotential
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeConstraintElectrostaticPotential(doc),
                'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeConstraintElectrostaticPotential(doc),
                'Fem::ConstraintPython'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeConstraintElectrostaticPotential(doc),
                'Fem::ConstraintElectrostaticPotential'))

        # ConstraintFixed
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFixed(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFixed(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFixed(doc),
                            'Fem::ConstraintFixed'))

        # ConstraintFlowVelocity
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFlowVelocity(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFlowVelocity(doc),
                            'Fem::ConstraintPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFlowVelocity(doc),
                            'Fem::ConstraintFlowVelocity'))

        # ConstraintFluidBoundary
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFluidBoundary(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFluidBoundary(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintFluidBoundary(doc),
                            'Fem::ConstraintFluidBoundary'))

        # ConstraintForce
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintForce(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintForce(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintForce(doc),
                            'Fem::ConstraintForce'))

        # ConstraintGear
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintGear(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintGear(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintGear(doc),
                            'Fem::ConstraintGear'))

        # ConstraintHeatflux
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintHeatflux(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintHeatflux(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintHeatflux(doc),
                            'Fem::ConstraintHeatflux'))

        # ConstraintInitialFlowVelocity
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintInitialFlowVelocity(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintInitialFlowVelocity(doc),
                            'Fem::ConstraintPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintInitialFlowVelocity(doc),
                            'Fem::ConstraintInitialFlowVelocity'))

        # ConstraintInitialTemperature
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintInitialTemperature(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintInitialTemperature(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintInitialTemperature(doc),
                            'Fem::ConstraintInitialTemperature'))

        # ConstraintPlaneRotation
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPlaneRotation(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPlaneRotation(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPlaneRotation(doc),
                            'Fem::ConstraintPlaneRotation'))

        # ConstraintPressure
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPressure(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPressure(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPressure(doc),
                            'Fem::ConstraintPressure'))

        # ConstraintPulley
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPulley(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPulley(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintPulley(doc),
                            'Fem::ConstraintPulley'))

        # ConstraintSelfWeight
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintSelfWeight(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintSelfWeight(doc),
                            'Fem::ConstraintPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintSelfWeight(doc),
                            'Fem::ConstraintSelfWeight'))

        # ConstraintTemperature
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintTemperature(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintTemperature(doc),
                            'Fem::Constraint'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintTemperature(doc),
                            'Fem::ConstraintTemperature'))

        # ConstraintTransform
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintTransform(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeConstraintTransform(doc),
                            'Fem::ConstraintTransform'))

        # FemElementFluid1D
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementFluid1D(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementFluid1D(doc),
                            'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementFluid1D(doc),
                            'Fem::FemElementFluid1D'))

        # FemElementGeometry1D
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementGeometry1D(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementGeometry1D(doc),
                            'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementGeometry1D(doc),
                            'Fem::FemElementGeometry1D'))

        # FemElementGeometry2D
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementGeometry2D(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementGeometry2D(doc),
                            'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementGeometry2D(doc),
                            'Fem::FemElementGeometry2D'))

        # FemElementRotation1D
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementRotation1D(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementRotation1D(doc),
                            'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeElementRotation1D(doc),
                            'Fem::FemElementRotation1D'))

        # Material
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMaterialFluid(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMaterialFluid(doc),
                            'App::MaterialObjectPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMaterialFluid(doc),
                            'Fem::Material'))

        # Material
        self.assertTrue(is_derived_from(materialsolid, 'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(materialsolid, 'App::MaterialObjectPython'))
        self.assertTrue(is_derived_from(materialsolid, 'Fem::Material'))

        # MaterialMechanicalNonlinear
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid),
                'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid),
                'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid),
                'Fem::MaterialMechanicalNonlinear'))

        # MaterialReinforced
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMaterialReinforced(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMaterialReinforced(doc),
                            'App::MaterialObjectPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMaterialReinforced(doc),
                            'Fem::MaterialReinforced'))

        # FemMeshGmsh
        self.assertTrue(is_derived_from(mesh, 'App::DocumentObject'))
        self.assertTrue(is_derived_from(mesh, 'Fem::FemMeshObjectPython'))
        self.assertTrue(is_derived_from(mesh, 'Fem::FemMeshGmsh'))

        # FemMeshBoundaryLayer
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshBoundaryLayer(doc, mesh),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshBoundaryLayer(doc, mesh),
                            'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshBoundaryLayer(doc, mesh),
                            'Fem::FemMeshBoundaryLayer'))

        # FemMeshGroup
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshGroup(doc, mesh),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshGroup(doc, mesh),
                            'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshGroup(doc, mesh),
                            'Fem::FemMeshGroup'))

        # FemMeshRegion
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshRegion(doc, mesh),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshRegion(doc, mesh),
                            'Fem::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshRegion(doc, mesh),
                            'Fem::FemMeshRegion'))

        # FemMeshShapeNetgenObject
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshNetgen(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshNetgen(doc),
                            'Fem::FemMeshShapeNetgenObject'))

        # FemMeshResult
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshResult(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshResult(doc),
                            'Fem::FemMeshObjectPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeMeshResult(doc),
                            'Fem::FemMeshResult'))

        # FemResultMechanical
        self.assertTrue(
            is_derived_from(ObjectsFem.makeResultMechanical(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeResultMechanical(doc),
                            'Fem::FemResultObjectPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeResultMechanical(doc),
                            'Fem::FemResultMechanical'))

        # FemSolverCalculixCcxTools
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc),
                            'Fem::FemSolverObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc),
                            'Fem::FemSolverObjectPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc),
                            'Fem::FemSolverCalculixCcxTools'))

        # FemSolverObjectCalculix
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculix(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculix(doc),
                            'Fem::FemSolverObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculix(doc),
                            'Fem::FemSolverObjectPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverCalculix(doc),
                            'Fem::FemSolverObjectCalculix'))

        # FemSolverObjectElmer
        self.assertTrue(is_derived_from(solverelmer, 'App::DocumentObject'))
        self.assertTrue(is_derived_from(solverelmer, 'Fem::FemSolverObject'))
        self.assertTrue(
            is_derived_from(solverelmer, 'Fem::FemSolverObjectPython'))
        self.assertTrue(
            is_derived_from(solverelmer, 'Fem::FemSolverObjectElmer'))

        # FemSolverObjectZ88
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverZ88(doc),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverZ88(doc),
                            'Fem::FemSolverObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverZ88(doc),
                            'Fem::FemSolverObjectPython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeSolverZ88(doc),
                            'Fem::FemSolverObjectZ88'))

        # FemEquationElmerElasticity
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationElasticity(doc, solverelmer),
                'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationElasticity(doc, solverelmer),
                'App::FeaturePython'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationElasticity(doc, solverelmer),
                'Fem::FemEquationElmerElasticity'))

        # FemEquationElmerElectrostatic
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationElectrostatic(doc, solverelmer),
                'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationElectrostatic(doc, solverelmer),
                'App::FeaturePython'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationElectrostatic(doc, solverelmer),
                'Fem::FemEquationElmerElectrostatic'))

        # FemEquationElmerFlow
        self.assertTrue(
            is_derived_from(ObjectsFem.makeEquationFlow(doc, solverelmer),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeEquationFlow(doc, solverelmer),
                            'App::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeEquationFlow(doc, solverelmer),
                            'Fem::FemEquationElmerFlow'))

        # FemEquationElmerFluxsolver
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationFluxsolver(doc, solverelmer),
                'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationFluxsolver(doc, solverelmer),
                'App::FeaturePython'))
        self.assertTrue(
            is_derived_from(
                ObjectsFem.makeEquationFluxsolver(doc, solverelmer),
                'Fem::FemEquationElmerFluxsolver'))

        # FemEquationElmerHeat
        self.assertTrue(
            is_derived_from(ObjectsFem.makeEquationHeat(doc, solverelmer),
                            'App::DocumentObject'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeEquationHeat(doc, solverelmer),
                            'App::FeaturePython'))
        self.assertTrue(
            is_derived_from(ObjectsFem.makeEquationHeat(doc, solverelmer),
                            'Fem::FemEquationElmerHeat'))
Ejemplo n.º 17
0
    def test_femobjects_derivedfromfem(self):
        # try to add all possible True types from inheritance chain see
        # https://forum.freecadweb.org/viewtopic.php?f=10&t=32625
        doc = self.active_doc

        from femtools.femutils import is_derived_from

        # FemAnalysis
        analysis = ObjectsFem.makeAnalysis(doc)
        self.assertTrue(is_derived_from(analysis, "App::DocumentObject"))
        self.assertTrue(is_derived_from(analysis, "Fem::FemAnalysis"))

        # ConstraintBearing
        constraint_bearing = ObjectsFem.makeConstraintBearing(doc)
        self.assertTrue(
            is_derived_from(constraint_bearing, "App::DocumentObject"))
        self.assertTrue(is_derived_from(constraint_bearing, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_bearing, "Fem::ConstraintBearing"))

        # ConstraintBodyHeatSource
        constraint_body_heat_source = ObjectsFem.makeConstraintBodyHeatSource(
            doc)
        self.assertTrue(
            is_derived_from(constraint_body_heat_source,
                            "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_body_heat_source,
                            "Fem::ConstraintPython"))
        self.assertTrue(
            is_derived_from(constraint_body_heat_source,
                            "Fem::ConstraintBodyHeatSource"))

        # ConstraintContact
        constraint_contact = ObjectsFem.makeConstraintContact(doc)
        self.assertTrue(
            is_derived_from(constraint_contact, "App::DocumentObject"))
        self.assertTrue(is_derived_from(constraint_contact, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_contact, "Fem::ConstraintContact"))

        # ConstraintDisplacement
        constraint_dicplacement = ObjectsFem.makeConstraintDisplacement(doc)
        self.assertTrue(
            is_derived_from(constraint_dicplacement, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_dicplacement, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_dicplacement,
                            "Fem::ConstraintDisplacement"))

        # ConstraintElectrostaticPotential
        constraint_electorstatic_potential = ObjectsFem.makeConstraintElectrostaticPotential(
            doc)
        self.assertTrue(
            is_derived_from(constraint_electorstatic_potential,
                            "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_electorstatic_potential,
                            "Fem::ConstraintPython"))
        self.assertTrue(
            is_derived_from(constraint_electorstatic_potential,
                            "Fem::ConstraintElectrostaticPotential"))

        # ConstraintFixed
        constraint_fixed = ObjectsFem.makeConstraintFixed(doc)
        self.assertTrue(
            is_derived_from(constraint_fixed, "App::DocumentObject"))
        self.assertTrue(is_derived_from(constraint_fixed, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_fixed, "Fem::ConstraintFixed"))

        # ConstraintFlowVelocity
        constraint_flow_velocity = ObjectsFem.makeConstraintFlowVelocity(doc)
        self.assertTrue(
            is_derived_from(constraint_flow_velocity, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_flow_velocity, "Fem::ConstraintPython"))
        self.assertTrue(
            is_derived_from(constraint_flow_velocity,
                            "Fem::ConstraintFlowVelocity"))

        # ConstraintFluidBoundary
        constraint_fluid_boundary = ObjectsFem.makeConstraintFluidBoundary(doc)
        self.assertTrue(
            is_derived_from(constraint_fluid_boundary, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_fluid_boundary, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_fluid_boundary,
                            "Fem::ConstraintFluidBoundary"))

        # ConstraintForce
        constraint_force = ObjectsFem.makeConstraintForce(doc)
        self.assertTrue(
            is_derived_from(constraint_force, "App::DocumentObject"))
        self.assertTrue(is_derived_from(constraint_force, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_force, "Fem::ConstraintForce"))

        # ConstraintGear
        constraint_gear = ObjectsFem.makeConstraintGear(doc)
        self.assertTrue(is_derived_from(constraint_gear,
                                        "App::DocumentObject"))
        self.assertTrue(is_derived_from(constraint_gear, "Fem::Constraint"))
        self.assertTrue(is_derived_from(constraint_gear,
                                        "Fem::ConstraintGear"))

        # ConstraintHeatflux
        constraint_heat_flux = ObjectsFem.makeConstraintHeatflux(doc)
        self.assertTrue(
            is_derived_from(constraint_heat_flux, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_heat_flux, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_heat_flux, "Fem::ConstraintHeatflux"))

        # ConstraintInitialFlowVelocity
        constraint_initial_flow_velocity = ObjectsFem.makeConstraintInitialFlowVelocity(
            doc)
        self.assertTrue(
            is_derived_from(constraint_initial_flow_velocity,
                            "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_initial_flow_velocity,
                            "Fem::ConstraintPython"))
        self.assertTrue(
            is_derived_from(constraint_initial_flow_velocity,
                            "Fem::ConstraintInitialFlowVelocity"))

        # ConstraintInitialTemperature
        constraint_initial_temperature = ObjectsFem.makeConstraintInitialTemperature(
            doc)
        self.assertTrue(
            is_derived_from(constraint_initial_temperature,
                            "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_initial_temperature, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_initial_temperature,
                            "Fem::ConstraintInitialTemperature"))

        # ConstraintPlaneRotation
        constraint_plane_rotation = ObjectsFem.makeConstraintPlaneRotation(doc)
        self.assertTrue(
            is_derived_from(constraint_plane_rotation, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_plane_rotation, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_plane_rotation,
                            "Fem::ConstraintPlaneRotation"))

        # ConstraintPressure
        constraint_pressure = ObjectsFem.makeConstraintPressure(doc)
        self.assertTrue(
            is_derived_from(constraint_pressure, "App::DocumentObject"))
        self.assertTrue(is_derived_from(constraint_pressure,
                                        "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_pressure, "Fem::ConstraintPressure"))

        # ConstraintPulley
        constraint_pulley = ObjectsFem.makeConstraintPulley(doc)
        self.assertTrue(
            is_derived_from(constraint_pulley, "App::DocumentObject"))
        self.assertTrue(is_derived_from(constraint_pulley, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_pulley, "Fem::ConstraintPulley"))

        # ConstraintSelfWeight
        constraint_self_weight = ObjectsFem.makeConstraintSelfWeight(doc)
        self.assertTrue(
            is_derived_from(constraint_self_weight, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_self_weight, "Fem::ConstraintPython"))
        self.assertTrue(
            is_derived_from(constraint_self_weight,
                            "Fem::ConstraintSelfWeight"))

        # ConstraintTemperature
        constraint_temperature = ObjectsFem.makeConstraintTemperature(doc)
        self.assertTrue(
            is_derived_from(constraint_temperature, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_temperature, "Fem::Constraint"))
        self.assertTrue(
            is_derived_from(constraint_temperature,
                            "Fem::ConstraintTemperature"))

        # ConstraintTransform
        constraint_transform = ObjectsFem.makeConstraintTransform(doc)
        self.assertTrue(
            is_derived_from(constraint_transform, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(constraint_transform, "Fem::ConstraintTransform"))

        # FemElementFluid1D
        fluid1d = ObjectsFem.makeElementFluid1D(doc)
        self.assertTrue(is_derived_from(fluid1d, "App::DocumentObject"))
        self.assertTrue(is_derived_from(fluid1d, "Fem::FeaturePython"))
        self.assertTrue(is_derived_from(fluid1d, "Fem::FemElementFluid1D"))

        # FemElementGeometry1D
        geometry1d = ObjectsFem.makeElementGeometry1D(doc)
        self.assertTrue(is_derived_from(geometry1d, "App::DocumentObject"))
        self.assertTrue(is_derived_from(geometry1d, "Fem::FeaturePython"))
        self.assertTrue(
            is_derived_from(geometry1d, "Fem::FemElementGeometry1D"))

        # FemElementGeometry2D
        geometry2d = ObjectsFem.makeElementGeometry2D(doc)
        self.assertTrue(is_derived_from(geometry2d, "App::DocumentObject"))
        self.assertTrue(is_derived_from(geometry2d, "Fem::FeaturePython"))
        self.assertTrue(
            is_derived_from(geometry2d, "Fem::FemElementGeometry2D"))

        # FemElementRotation1D
        rotation1d = ObjectsFem.makeElementRotation1D(doc)
        self.assertTrue(is_derived_from(rotation1d, "App::DocumentObject"))
        self.assertTrue(is_derived_from(rotation1d, "Fem::FeaturePython"))
        self.assertTrue(
            is_derived_from(rotation1d, "Fem::FemElementRotation1D"))

        # Material Fluid
        material_fluid = ObjectsFem.makeMaterialFluid(doc)
        self.assertTrue(is_derived_from(material_fluid, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(material_fluid, "App::MaterialObjectPython"))
        self.assertTrue(is_derived_from(material_fluid, "Fem::Material"))

        # Material Solid
        material_solid = ObjectsFem.makeMaterialSolid(doc)
        self.assertTrue(is_derived_from(material_solid, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(material_solid, "App::MaterialObjectPython"))
        self.assertTrue(is_derived_from(material_solid, "Fem::Material"))

        # MaterialMechanicalNonlinear
        material_nonlinear = ObjectsFem.makeMaterialMechanicalNonlinear(
            doc, material_solid)
        self.assertTrue(
            is_derived_from(material_nonlinear, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(material_nonlinear, "Fem::FeaturePython"))
        self.assertTrue(
            is_derived_from(material_nonlinear,
                            "Fem::MaterialMechanicalNonlinear"))

        # MaterialReinforced
        material_reinforced = ObjectsFem.makeMaterialReinforced(doc)
        self.assertTrue(
            is_derived_from(material_reinforced, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(material_reinforced, "App::MaterialObjectPython"))
        self.assertTrue(
            is_derived_from(material_reinforced, "Fem::MaterialReinforced"))

        # FemMeshGmsh
        mesh_gmsh = ObjectsFem.makeMeshGmsh(doc)
        self.assertTrue(is_derived_from(mesh_gmsh, "App::DocumentObject"))
        self.assertTrue(is_derived_from(mesh_gmsh, "Fem::FemMeshObjectPython"))
        self.assertTrue(is_derived_from(mesh_gmsh, "Fem::FemMeshGmsh"))

        # FemMeshBoundaryLayer
        mesh_boundarylayer = ObjectsFem.makeMeshBoundaryLayer(doc, mesh_gmsh)
        self.assertTrue(
            is_derived_from(mesh_boundarylayer, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(mesh_boundarylayer, "Fem::FeaturePython"))
        self.assertTrue(
            is_derived_from(mesh_boundarylayer, "Fem::FemMeshBoundaryLayer"))

        # FemMeshGroup
        mesh_group = ObjectsFem.makeMeshGroup(doc, mesh_gmsh)
        self.assertTrue(is_derived_from(mesh_group, "App::DocumentObject"))
        self.assertTrue(is_derived_from(mesh_group, "Fem::FeaturePython"))
        self.assertTrue(is_derived_from(mesh_group, "Fem::FemMeshGroup"))

        # FemMeshRegion
        mesh_region = ObjectsFem.makeMeshRegion(doc, mesh_gmsh)
        self.assertTrue(is_derived_from(mesh_region, "App::DocumentObject"))
        self.assertTrue(is_derived_from(mesh_region, "Fem::FeaturePython"))
        self.assertTrue(is_derived_from(mesh_region, "Fem::FemMeshRegion"))

        # FemMeshShapeNetgenObject
        mesh_netgen = ObjectsFem.makeMeshNetgen(doc)
        self.assertTrue(is_derived_from(mesh_netgen, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(mesh_netgen, "Fem::FemMeshShapeNetgenObject"))

        # FemMeshResult
        mesh_result = ObjectsFem.makeMeshResult(doc)
        self.assertTrue(is_derived_from(mesh_result, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(mesh_result, "Fem::FemMeshObjectPython"))
        self.assertTrue(is_derived_from(mesh_result, "Fem::FemMeshResult"))

        # FemResultMechanical
        result_mechanical = ObjectsFem.makeResultMechanical(doc)
        self.assertTrue(
            is_derived_from(result_mechanical, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(result_mechanical, "Fem::FemResultObjectPython"))
        self.assertTrue(
            is_derived_from(result_mechanical, "Fem::FemResultMechanical"))

        # FemSolverCalculixCcxTools
        solver_ccxtools = ObjectsFem.makeSolverCalculixCcxTools(doc)
        self.assertTrue(is_derived_from(solver_ccxtools,
                                        "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(solver_ccxtools, "Fem::FemSolverObject"))
        self.assertTrue(
            is_derived_from(solver_ccxtools, "Fem::FemSolverObjectPython"))
        self.assertTrue(
            is_derived_from(solver_ccxtools, "Fem::FemSolverCalculixCcxTools"))

        # FemSolverObjectCalculix
        solver_calculix = ObjectsFem.makeSolverCalculix(doc)
        self.assertTrue(is_derived_from(solver_calculix,
                                        "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(solver_calculix, "Fem::FemSolverObject"))
        self.assertTrue(
            is_derived_from(solver_calculix, "Fem::FemSolverObjectPython"))
        self.assertTrue(
            is_derived_from(solver_calculix, "Fem::FemSolverObjectCalculix"))

        # FemSolverObjectElmer
        solver_elmer = ObjectsFem.makeSolverElmer(doc)
        self.assertTrue(is_derived_from(solver_elmer, "App::DocumentObject"))
        self.assertTrue(is_derived_from(solver_elmer, "Fem::FemSolverObject"))
        self.assertTrue(
            is_derived_from(solver_elmer, "Fem::FemSolverObjectPython"))
        self.assertTrue(
            is_derived_from(solver_elmer, "Fem::FemSolverObjectElmer"))

        # FemSolverObjectZ88
        solver_z88 = ObjectsFem.makeSolverZ88(doc)
        self.assertTrue(is_derived_from(solver_z88, "App::DocumentObject"))
        self.assertTrue(is_derived_from(solver_z88, "Fem::FemSolverObject"))
        self.assertTrue(
            is_derived_from(solver_z88, "Fem::FemSolverObjectPython"))
        self.assertTrue(is_derived_from(solver_z88, "Fem::FemSolverObjectZ88"))

        # FemEquationElmerElasticity
        equation_elasticity = ObjectsFem.makeEquationElasticity(
            doc, solver_elmer)
        self.assertTrue(
            is_derived_from(equation_elasticity, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(equation_elasticity, "App::FeaturePython"))
        self.assertTrue(
            is_derived_from(equation_elasticity,
                            "Fem::FemEquationElmerElasticity"))

        # FemEquationElmerElectrostatic
        equation_electrostatic = ObjectsFem.makeEquationElectrostatic(
            doc, solver_elmer)
        self.assertTrue(
            is_derived_from(equation_electrostatic, "App::DocumentObject"))
        self.assertTrue(
            is_derived_from(equation_electrostatic, "App::FeaturePython"))
        self.assertTrue(
            is_derived_from(equation_electrostatic,
                            "Fem::FemEquationElmerElectrostatic"))

        # FemEquationElmerFlow
        equation_flow = ObjectsFem.makeEquationFlow(doc, solver_elmer)
        self.assertTrue(is_derived_from(equation_flow, "App::DocumentObject"))
        self.assertTrue(is_derived_from(equation_flow, "App::FeaturePython"))
        self.assertTrue(
            is_derived_from(equation_flow, "Fem::FemEquationElmerFlow"))

        # FemEquationElmerFluxsolver
        equation_flux = ObjectsFem.makeEquationFluxsolver(doc, solver_elmer)
        self.assertTrue(is_derived_from(equation_flux, "App::DocumentObject"))
        self.assertTrue(is_derived_from(equation_flux, "App::FeaturePython"))
        self.assertTrue(
            is_derived_from(equation_flux, "Fem::FemEquationElmerFluxsolver"))

        # FemEquationElmerHeat
        equation_heat = ObjectsFem.makeEquationHeat(doc, solver_elmer)
        self.assertTrue(is_derived_from(equation_heat, "App::DocumentObject"))
        self.assertTrue(is_derived_from(equation_heat, "App::FeaturePython"))
        self.assertTrue(
            is_derived_from(equation_heat, "Fem::FemEquationElmerHeat"))

        fcc_print("doc objects count: {}, method: {}".format(
            len(doc.Objects),
            sys._getframe().f_code.co_name))
        # TODO: vtk post objs, thus 5 obj less than test_femobjects_make
        self.assertEqual(len(doc.Objects), testtools.get_defmake_count(False))
Ejemplo n.º 18
0
    def test_femobjects_make(self):
        doc = self.active_doc
        analysis = ObjectsFem.makeAnalysis(doc)

        analysis.addObject(ObjectsFem.makeConstraintBearing(doc))
        analysis.addObject(ObjectsFem.makeConstraintBodyHeatSource(doc))
        analysis.addObject(ObjectsFem.makeConstraintContact(doc))
        analysis.addObject(ObjectsFem.makeConstraintDisplacement(doc))
        analysis.addObject(
            ObjectsFem.makeConstraintElectrostaticPotential(doc))
        analysis.addObject(ObjectsFem.makeConstraintFixed(doc))
        analysis.addObject(ObjectsFem.makeConstraintFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintFluidBoundary(doc))
        analysis.addObject(ObjectsFem.makeConstraintForce(doc))
        analysis.addObject(ObjectsFem.makeConstraintGear(doc))
        analysis.addObject(ObjectsFem.makeConstraintHeatflux(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintPlaneRotation(doc))
        analysis.addObject(ObjectsFem.makeConstraintPressure(doc))
        analysis.addObject(ObjectsFem.makeConstraintPulley(doc))
        analysis.addObject(ObjectsFem.makeConstraintSelfWeight(doc))
        analysis.addObject(ObjectsFem.makeConstraintTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintTransform(doc))

        analysis.addObject(ObjectsFem.makeElementFluid1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry2D(doc))
        analysis.addObject(ObjectsFem.makeElementRotation1D(doc))

        analysis.addObject(ObjectsFem.makeMaterialFluid(doc))
        mat = analysis.addObject(ObjectsFem.makeMaterialSolid(doc))[0]
        analysis.addObject(ObjectsFem.makeMaterialMechanicalNonlinear(
            doc, mat))
        analysis.addObject(ObjectsFem.makeMaterialReinforced(doc))

        msh = analysis.addObject(ObjectsFem.makeMeshGmsh(doc))[0]
        analysis.addObject(ObjectsFem.makeMeshBoundaryLayer(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshGroup(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshRegion(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshNetgen(doc))
        analysis.addObject(ObjectsFem.makeMeshResult(doc))

        res = analysis.addObject(ObjectsFem.makeResultMechanical(doc))[0]
        if "BUILD_FEM_VTK" in FreeCAD.__cmake__:
            vres = analysis.addObject(ObjectsFem.makePostVtkResult(doc,
                                                                   res))[0]
            analysis.addObject(
                ObjectsFem.makePostVtkFilterClipRegion(doc, vres))
            analysis.addObject(
                ObjectsFem.makePostVtkFilterClipScalar(doc, vres))
            analysis.addObject(
                ObjectsFem.makePostVtkFilterCutFunction(doc, vres))
            analysis.addObject(ObjectsFem.makePostVtkFilterWarp(doc, vres))

        analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc))
        analysis.addObject(ObjectsFem.makeSolverCalculix(doc))
        sol = analysis.addObject(ObjectsFem.makeSolverElmer(doc))[0]
        analysis.addObject(ObjectsFem.makeSolverZ88(doc))

        analysis.addObject(ObjectsFem.makeEquationElasticity(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationElectrostatic(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFlow(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFluxsolver(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationHeat(doc, sol))

        doc.recompute()

        # if FEM VTK post processing is disabled, we are not able to create VTK post objects
        if "BUILD_FEM_VTK" in FreeCAD.__cmake__:
            fem_vtk_post = True
        else:
            fem_vtk_post = False
        count_defmake = testtools.get_defmake_count(fem_vtk_post)
        # because of the analysis itself count -1
        self.assertEqual(len(analysis.Group), count_defmake - 1)
        self.assertEqual(len(doc.Objects), count_defmake)

        fcc_print("doc objects count: {}, method: {}".format(
            len(doc.Objects),
            sys._getframe().f_code.co_name))
Ejemplo n.º 19
0
    def test_femobjects_derivedfromstd(self):
        # only the last True type is used
        doc = self.active_doc

        self.assertTrue(
            ObjectsFem.makeAnalysis(doc).isDerivedFrom("Fem::FemAnalysis"))
        self.assertTrue(
            ObjectsFem.makeConstraintBearing(doc).isDerivedFrom(
                "Fem::ConstraintBearing"))
        self.assertTrue(
            ObjectsFem.makeConstraintBodyHeatSource(doc).isDerivedFrom(
                "Fem::ConstraintPython"))
        self.assertTrue(
            ObjectsFem.makeConstraintContact(doc).isDerivedFrom(
                "Fem::ConstraintContact"))
        self.assertTrue(
            ObjectsFem.makeConstraintDisplacement(doc).isDerivedFrom(
                "Fem::ConstraintDisplacement"))
        self.assertTrue(
            ObjectsFem.makeConstraintElectrostaticPotential(doc).isDerivedFrom(
                "Fem::ConstraintPython"))
        self.assertTrue(
            ObjectsFem.makeConstraintFixed(doc).isDerivedFrom(
                "Fem::ConstraintFixed"))
        self.assertTrue(
            ObjectsFem.makeConstraintFlowVelocity(doc).isDerivedFrom(
                "Fem::ConstraintPython"))
        self.assertTrue(
            ObjectsFem.makeConstraintFluidBoundary(doc).isDerivedFrom(
                "Fem::ConstraintFluidBoundary"))
        self.assertTrue(
            ObjectsFem.makeConstraintForce(doc).isDerivedFrom(
                "Fem::ConstraintForce"))
        self.assertTrue(
            ObjectsFem.makeConstraintGear(doc).isDerivedFrom(
                "Fem::ConstraintGear"))
        self.assertTrue(
            ObjectsFem.makeConstraintHeatflux(doc).isDerivedFrom(
                "Fem::ConstraintHeatflux"))
        self.assertTrue(
            ObjectsFem.makeConstraintInitialFlowVelocity(doc).isDerivedFrom(
                "Fem::ConstraintPython"))
        self.assertTrue(
            ObjectsFem.makeConstraintInitialTemperature(doc).isDerivedFrom(
                "Fem::ConstraintInitialTemperature"))
        self.assertTrue(
            ObjectsFem.makeConstraintPlaneRotation(doc).isDerivedFrom(
                "Fem::ConstraintPlaneRotation"))
        self.assertTrue(
            ObjectsFem.makeConstraintPressure(doc).isDerivedFrom(
                "Fem::ConstraintPressure"))
        self.assertTrue(
            ObjectsFem.makeConstraintPulley(doc).isDerivedFrom(
                "Fem::ConstraintPulley"))
        self.assertTrue(
            ObjectsFem.makeConstraintSelfWeight(doc).isDerivedFrom(
                "Fem::ConstraintPython"))
        self.assertTrue(
            ObjectsFem.makeConstraintTemperature(doc).isDerivedFrom(
                "Fem::ConstraintTemperature"))
        self.assertTrue(
            ObjectsFem.makeConstraintTransform(doc).isDerivedFrom(
                "Fem::ConstraintTransform"))
        self.assertTrue(
            ObjectsFem.makeElementFluid1D(doc).isDerivedFrom(
                "Fem::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeElementGeometry1D(doc).isDerivedFrom(
                "Fem::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeElementGeometry2D(doc).isDerivedFrom(
                "Fem::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeElementRotation1D(doc).isDerivedFrom(
                "Fem::FeaturePython"))
        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        self.assertTrue(
            ObjectsFem.makeMaterialFluid(doc).isDerivedFrom(
                "App::MaterialObjectPython"))
        self.assertTrue(
            materialsolid.isDerivedFrom("App::MaterialObjectPython"))
        self.assertTrue(
            ObjectsFem.makeMaterialMechanicalNonlinear(
                doc, materialsolid).isDerivedFrom("Fem::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeMaterialReinforced(doc).isDerivedFrom(
                "App::MaterialObjectPython"))
        mesh = ObjectsFem.makeMeshGmsh(doc)
        self.assertTrue(mesh.isDerivedFrom("Fem::FemMeshObjectPython"))
        self.assertTrue(
            ObjectsFem.makeMeshBoundaryLayer(
                doc, mesh).isDerivedFrom("Fem::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeMeshGroup(doc,
                                     mesh).isDerivedFrom("Fem::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeMeshRegion(
                doc, mesh).isDerivedFrom("Fem::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeMeshNetgen(doc).isDerivedFrom(
                "Fem::FemMeshShapeNetgenObject"))
        self.assertTrue(
            ObjectsFem.makeMeshResult(doc).isDerivedFrom(
                "Fem::FemMeshObjectPython"))
        self.assertTrue(
            ObjectsFem.makeResultMechanical(doc).isDerivedFrom(
                "Fem::FemResultObjectPython"))
        solverelmer = ObjectsFem.makeSolverElmer(doc)
        self.assertTrue(
            ObjectsFem.makeSolverCalculixCcxTools(doc).isDerivedFrom(
                "Fem::FemSolverObjectPython"))
        self.assertTrue(
            ObjectsFem.makeSolverCalculix(doc).isDerivedFrom(
                "Fem::FemSolverObjectPython"))
        self.assertTrue(
            solverelmer.isDerivedFrom("Fem::FemSolverObjectPython"))
        self.assertTrue(
            ObjectsFem.makeSolverZ88(doc).isDerivedFrom(
                "Fem::FemSolverObjectPython"))
        self.assertTrue(
            ObjectsFem.makeEquationElasticity(
                doc, solverelmer).isDerivedFrom("App::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeEquationElectrostatic(
                doc, solverelmer).isDerivedFrom("App::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeEquationFlow(
                doc, solverelmer).isDerivedFrom("App::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeEquationFluxsolver(
                doc, solverelmer).isDerivedFrom("App::FeaturePython"))
        self.assertTrue(
            ObjectsFem.makeEquationHeat(
                doc, solverelmer).isDerivedFrom("App::FeaturePython"))

        fcc_print("doc objects count: {}, method: {}".format(
            len(doc.Objects),
            sys._getframe().f_code.co_name))
        # TODO: vtk post objs, thus 5 obj less than test_femobjects_make
        self.assertEqual(len(doc.Objects), testtools.get_defmake_count(False))
Ejemplo n.º 20
0
def setup(doc=None, solvertype="ccxtools"):

    # init FreeCAD document
    if doc is None:
        doc = init_doc()

    # explanation object
    # just keep the following line and change text string in get_explanation method
    manager.add_explanation_obj(
        doc, get_explanation(manager.get_header(get_information())))

    # setup box static, add a fixed, force and a pressure constraint
    doc = setup_boxanalysisbase(doc, solvertype)
    geom_obj = doc.Box
    analysis = doc.Analysis

    # solver
    if solvertype == "calculix":
        solver_obj = ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
    elif solvertype == "ccxtools":
        solver_obj = ObjectsFem.makeSolverCalculixCcxTools(
            doc, "CalculiXccxTools")
        solver_obj.WorkingDir = u""
    elif solvertype == "elmer":
        solver_obj = ObjectsFem.makeSolverElmer(doc, "SolverElmer")
        ObjectsFem.makeEquationElasticity(doc, solver_obj)
    else:
        FreeCAD.Console.PrintWarning(
            "Not known or not supported solver type: {}. "
            "No solver object was created.\n".format(solvertype))
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_obj.SplitInputWriter = False
        solver_obj.AnalysisType = "static"
        solver_obj.GeometricalNonlinearity = "linear"
        solver_obj.ThermoMechSteadyState = False
        solver_obj.MatrixSolverType = "default"
        solver_obj.IterationsControlParameterTimeUse = False
    analysis.addObject(solver_obj)

    # constraint fixed
    con_fixed = ObjectsFem.makeConstraintFixed(doc, "FemConstraintFixed")
    con_fixed.References = [(geom_obj, "Face1")]
    analysis.addObject(con_fixed)

    # constraint force
    con_force = ObjectsFem.makeConstraintForce(doc, "FemConstraintForce")
    con_force.References = [(geom_obj, "Face6")]
    con_force.Force = 40000.0
    con_force.Direction = (geom_obj, ["Edge5"])
    con_force.Reversed = True
    analysis.addObject(con_force)

    # constraint pressure
    con_pressure = ObjectsFem.makeConstraintPressure(
        doc, name="FemConstraintPressure")
    con_pressure.References = [(geom_obj, "Face2")]
    con_pressure.Pressure = 1000.0
    con_pressure.Reversed = False
    analysis.addObject(con_pressure)

    doc.recompute()
    return doc
Ejemplo n.º 21
0
def setup(doc=None, solvertype="ccxtools"):

    # init FreeCAD document
    if doc is None:
        doc = init_doc()

    # explanation object
    # just keep the following line and change text string in get_explanation method
    manager.add_explanation_obj(
        doc, get_explanation(manager.get_header(get_information())))

    # geometric object
    v1 = vec(-200, -100, 0)
    v2 = vec(200, -100, 0)
    v3 = vec(200, 100, 0)
    v4 = vec(-200, 100, 0)
    l1 = ln(v1, v2)
    l2 = ln(v2, v3)
    l3 = ln(v3, v4)
    l4 = ln(v4, v1)
    v5 = vec(0, 0, 0)
    c1 = ci(50, v5)
    face = Part.makeFace([Part.Wire([l1, l2, l3, l4]), c1],
                         "Part::FaceMakerBullseye")
    geom_obj = doc.addObject("Part::Feature", "Hole_Plate")
    geom_obj.Shape = face.extrude(vec(0, 0, 10))
    doc.recompute()

    if FreeCAD.GuiUp:
        geom_obj.ViewObject.Document.activeView().viewAxonometric()
        geom_obj.ViewObject.Document.activeView().fitAll()

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver_obj = ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
    elif solvertype == "ccxtools":
        solver_obj = ObjectsFem.makeSolverCalculixCcxTools(
            doc, "CalculiXccxTools")
        solver_obj.WorkingDir = u""
    else:
        FreeCAD.Console.PrintWarning(
            "Not known or not supported solver type: {}. "
            "No solver object was created.\n".format(solvertype))
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_obj.SplitInputWriter = False
        solver_obj.AnalysisType = "static"
        solver_obj.GeometricalNonlinearity = "linear"
        solver_obj.ThermoMechSteadyState = False
        solver_obj.MatrixSolverType = "default"
        solver_obj.IterationsControlParameterTimeUse = False
        solver_obj.GeometricalNonlinearity = 'nonlinear'
        solver_obj.MaterialNonlinearity = 'nonlinear'
    analysis.addObject(solver_obj)

    # linear material
    material_obj = ObjectsFem.makeMaterialSolid(doc, "Material_lin")
    matprop = material_obj.Material
    matprop["Name"] = "CalculiX-Steel"
    matprop["YoungsModulus"] = "210000 MPa"
    matprop["PoissonRatio"] = "0.30"
    material_obj.Material = matprop
    analysis.addObject(material_obj)

    # nonlinear material
    name_nlm = "Material_nonlin"
    nonlinear_mat = ObjectsFem.makeMaterialMechanicalNonlinear(
        doc, material_obj, name_nlm)
    nonlinear_mat.YieldPoint1 = '240.0, 0.0'
    nonlinear_mat.YieldPoint2 = '270.0, 0.025'
    analysis.addObject(nonlinear_mat)
    # check solver attributes, Nonlinearity needs to be set to nonlinear

    # constraint fixed
    con_fixed = ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed")
    con_fixed.References = [(geom_obj, "Face4")]
    analysis.addObject(con_fixed)

    # pressure constraint
    con_pressure = ObjectsFem.makeConstraintPressure(doc, "ConstraintPressure")
    con_pressure.References = [(geom_obj, "Face2")]
    con_pressure.Pressure = 130.0
    con_pressure.Reversed = True
    analysis.addObject(con_pressure)

    # mesh
    from .meshes.mesh_platewithhole_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(
        ObjectsFem.makeMeshGmsh(doc, get_meshname()))[0]
    femmesh_obj.FemMesh = fem_mesh
    femmesh_obj.Part = geom_obj
    femmesh_obj.SecondOrderLinear = False

    doc.recompute()
    return doc
Ejemplo n.º 22
0
    def test_femobjects_make(self):
        doc = self.active_doc
        analysis = ObjectsFem.makeAnalysis(doc)

        analysis.addObject(ObjectsFem.makeConstraintBearing(doc))
        analysis.addObject(ObjectsFem.makeConstraintBodyHeatSource(doc))
        analysis.addObject(ObjectsFem.makeConstraintContact(doc))
        analysis.addObject(ObjectsFem.makeConstraintDisplacement(doc))
        analysis.addObject(
            ObjectsFem.makeConstraintElectrostaticPotential(doc))
        analysis.addObject(ObjectsFem.makeConstraintFixed(doc))
        analysis.addObject(ObjectsFem.makeConstraintFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintFluidBoundary(doc))
        analysis.addObject(ObjectsFem.makeConstraintForce(doc))
        analysis.addObject(ObjectsFem.makeConstraintGear(doc))
        analysis.addObject(ObjectsFem.makeConstraintHeatflux(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialFlowVelocity(doc))
        analysis.addObject(ObjectsFem.makeConstraintInitialTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintPlaneRotation(doc))
        analysis.addObject(ObjectsFem.makeConstraintPressure(doc))
        analysis.addObject(ObjectsFem.makeConstraintPulley(doc))
        analysis.addObject(ObjectsFem.makeConstraintSelfWeight(doc))
        analysis.addObject(ObjectsFem.makeConstraintTemperature(doc))
        analysis.addObject(ObjectsFem.makeConstraintTransform(doc))

        analysis.addObject(ObjectsFem.makeElementFluid1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry1D(doc))
        analysis.addObject(ObjectsFem.makeElementGeometry2D(doc))
        analysis.addObject(ObjectsFem.makeElementRotation1D(doc))

        analysis.addObject(ObjectsFem.makeMaterialFluid(doc))
        mat = analysis.addObject(ObjectsFem.makeMaterialSolid(doc))[0]
        analysis.addObject(ObjectsFem.makeMaterialMechanicalNonlinear(
            doc, mat))
        analysis.addObject(ObjectsFem.makeMaterialReinforced(doc))

        msh = analysis.addObject(ObjectsFem.makeMeshGmsh(doc))[0]
        analysis.addObject(ObjectsFem.makeMeshBoundaryLayer(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshGroup(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshRegion(doc, msh))
        analysis.addObject(ObjectsFem.makeMeshNetgen(doc))
        analysis.addObject(ObjectsFem.makeMeshResult(doc))

        res = analysis.addObject(ObjectsFem.makeResultMechanical(doc))[0]
        if "BUILD_FEM_VTK" in FreeCAD.__cmake__:
            vres = analysis.addObject(ObjectsFem.makePostVtkResult(doc,
                                                                   res))[0]
            analysis.addObject(
                ObjectsFem.makePostVtkFilterClipRegion(doc, vres))
            analysis.addObject(
                ObjectsFem.makePostVtkFilterClipScalar(doc, vres))
            analysis.addObject(
                ObjectsFem.makePostVtkFilterCutFunction(doc, vres))
            analysis.addObject(ObjectsFem.makePostVtkFilterWarp(doc, vres))

        analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc))
        analysis.addObject(ObjectsFem.makeSolverCalculix(doc))
        sol = analysis.addObject(ObjectsFem.makeSolverElmer(doc))[0]
        analysis.addObject(ObjectsFem.makeSolverZ88(doc))

        analysis.addObject(ObjectsFem.makeEquationElasticity(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationElectrostatic(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFlow(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationFluxsolver(doc, sol))
        analysis.addObject(ObjectsFem.makeEquationHeat(doc, sol))
        # is = 48 (just copy in empty file to test, or run unit test case, it is printed)
        # TODO if the equations and gmsh mesh childs are added to the analysis,
        # they show up twice on Tree (on solver resp. gemsh mesh obj and on analysis)
        # https://forum.freecadweb.org/viewtopic.php?t=25283

        doc.recompute()

        # if FEM VTK post processing is disabled, we are not able to create VTK post objects
        if "BUILD_FEM_VTK" in FreeCAD.__cmake__:
            fem_vtk_post = True
        else:
            fem_vtk_post = False
        # because of the analysis itself count -1
        self.assertEqual(len(analysis.Group),
                         testtools.get_defmake_count(fem_vtk_post) - 1)
Ejemplo n.º 23
0
def setup(doc=None, solvertype="ccxtools"):

    # init FreeCAD document
    if doc is None:
        doc = init_doc()

    # explanation object
    # just keep the following line and change text string in get_explanation method
    manager.add_explanation_obj(
        doc, get_explanation(manager.get_header(get_information())))

    # geometric object
    # name is important because the other method in this module use obj name
    cube = doc.addObject("Part::Box", "Cube")
    cube.Height = "20 mm"
    cube.Length = "100 mm"
    cylinder = doc.addObject("Part::Cylinder", "Cylinder")
    cylinder.Height = "20 mm"
    cylinder.Radius = "6 mm"
    cylinder.Placement = FreeCAD.Placement(
        Vector(10, 12, 10),
        Rotation(0, 0, 90),
        Vector(0, 0, 0),
    )
    cut = doc.addObject("Part::Cut", "Cut")
    cut.Base = cube
    cut.Tool = cylinder

    # mirroring
    mirror = doc.addObject("Part::Mirroring", "Mirror")
    mirror.Source = cut
    mirror.Normal = (1, 0, 0)
    mirror.Base = (100, 100, 20)

    # fusing
    fusion = doc.addObject("Part::Fuse", "Fusion")
    fusion.Base = cut
    fusion.Tool = mirror
    fusion.Refine = True

    # compound filter
    geom_obj = CompoundFilter.makeCompoundFilter(name='CompoundFilter')
    geom_obj.Base = fusion
    geom_obj.FilterType = 'window-volume'
    doc.recompute()

    if FreeCAD.GuiUp:
        geom_obj.Base.ViewObject.hide()
        geom_obj.ViewObject.Document.activeView().viewAxonometric()
        geom_obj.ViewObject.Document.activeView().fitAll()

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver_obj = ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
    elif solvertype == "ccxtools":
        solver_obj = ObjectsFem.makeSolverCalculixCcxTools(
            doc, "CalculiXccxTools")
        solver_obj.WorkingDir = u""
    else:
        FreeCAD.Console.PrintWarning(
            "Not known or not supported solver type: {}. "
            "No solver object was created.\n".format(solvertype))
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_obj.SplitInputWriter = False
        solver_obj.AnalysisType = "static"
        solver_obj.GeometricalNonlinearity = "linear"
        solver_obj.ThermoMechSteadyState = False
        solver_obj.MatrixSolverType = "default"
        solver_obj.IterationsControlParameterTimeUse = False
    analysis.addObject(solver_obj)

    # material
    material_obj = ObjectsFem.makeMaterialSolid(doc, "FemMaterial")
    mat = material_obj.Material
    mat["Name"] = "CalculiX-Steel"
    mat["YoungsModulus"] = "210000 MPa"
    mat["PoissonRatio"] = "0.30"
    material_obj.Material = mat
    analysis.addObject(material_obj)

    # constraint pressure
    con_pressure = ObjectsFem.makeConstraintPressure(
        doc, name="FemConstraintPressure")
    con_pressure.References = [(geom_obj, "Face8")]
    con_pressure.Pressure = 10.0
    con_pressure.Reversed = False
    analysis.addObject(con_pressure)

    # constraint displacement
    con_disp = ObjectsFem.makeConstraintDisplacement(
        doc, name="FemConstraintDisplacment")
    con_disp.References = [(geom_obj, "Face4"), (geom_obj, "Face5")]
    con_disp.xFree = False
    con_disp.xFix = True
    analysis.addObject(con_disp)

    # constraints transform
    con_transform1 = ObjectsFem.makeConstraintTransform(
        doc, name="FemConstraintTransform1")
    con_transform1.References = [(geom_obj, "Face4")]
    con_transform1.TransformType = "Cylindrical"
    con_transform1.X_rot = 0.0
    con_transform1.Y_rot = 0.0
    con_transform1.Z_rot = 0.0
    analysis.addObject(con_transform1)

    con_transform2 = ObjectsFem.makeConstraintTransform(
        doc, name="FemConstraintTransform2")
    con_transform2.References = [(geom_obj, "Face5")]
    con_transform2.TransformType = "Cylindrical"
    con_transform2.X_rot = 0.0
    con_transform2.Y_rot = 0.0
    con_transform2.Z_rot = 0.0
    analysis.addObject(con_transform2)

    # mesh
    from .meshes.mesh_transform_beam_hinged_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(
        ObjectsFem.makeMeshGmsh(doc, get_meshname()))[0]
    femmesh_obj.FemMesh = fem_mesh
    femmesh_obj.Part = geom_obj
    femmesh_obj.SecondOrderLinear = False
    femmesh_obj.CharacteristicLengthMax = '7 mm'

    doc.recompute()
    return doc
Ejemplo n.º 24
0
    def test_femobjects_derivedfromfem(self):
        # try to add all possible True types from inheritance chain see https://forum.freecadweb.org/viewtopic.php?f=10&t=32625
        doc = self.active_doc

        from femtools.femutils import is_derived_from

        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        mesh = ObjectsFem.makeMeshGmsh(doc)
        solverelmer = ObjectsFem.makeSolverElmer(doc)

        self.assertTrue(is_derived_from(ObjectsFem.makeAnalysis(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeAnalysis(doc), 'Fem::FemAnalysis'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBearing(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBearing(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBearing(doc), 'Fem::ConstraintBearing'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBodyHeatSource(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBodyHeatSource(doc), 'Fem::ConstraintPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBodyHeatSource(doc), 'Fem::ConstraintBodyHeatSource'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintContact(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintContact(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintContact(doc), 'Fem::ConstraintContact'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintDisplacement(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintDisplacement(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintDisplacement(doc), 'Fem::ConstraintDisplacement'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintElectrostaticPotential(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintElectrostaticPotential(doc), 'Fem::ConstraintPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintElectrostaticPotential(doc), 'Fem::ConstraintElectrostaticPotential'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFixed(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFixed(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFixed(doc), 'Fem::ConstraintFixed'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFlowVelocity(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFlowVelocity(doc), 'Fem::ConstraintPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFlowVelocity(doc), 'Fem::ConstraintFlowVelocity'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFluidBoundary(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFluidBoundary(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFluidBoundary(doc), 'Fem::ConstraintFluidBoundary'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintForce(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintForce(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintForce(doc), 'Fem::ConstraintForce'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintGear(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintGear(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintGear(doc), 'Fem::ConstraintGear'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintHeatflux(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintHeatflux(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintHeatflux(doc), 'Fem::ConstraintHeatflux'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialFlowVelocity(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialFlowVelocity(doc), 'Fem::ConstraintPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialFlowVelocity(doc), 'Fem::ConstraintInitialFlowVelocity'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialTemperature(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialTemperature(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialTemperature(doc), 'Fem::ConstraintInitialTemperature'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPlaneRotation(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPlaneRotation(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPlaneRotation(doc), 'Fem::ConstraintPlaneRotation'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPressure(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPressure(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPressure(doc), 'Fem::ConstraintPressure'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPulley(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPulley(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPulley(doc), 'Fem::ConstraintPulley'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintSelfWeight(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintSelfWeight(doc), 'Fem::ConstraintPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintSelfWeight(doc), 'Fem::ConstraintSelfWeight'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintTemperature(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintTemperature(doc), 'Fem::Constraint'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintTemperature(doc), 'Fem::ConstraintTemperature'))

        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintTransform(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeConstraintTransform(doc), 'Fem::ConstraintTransform'))

        self.assertTrue(is_derived_from(ObjectsFem.makeElementFluid1D(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementFluid1D(doc), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementFluid1D(doc), 'Fem::FemElementFluid1D'))

        self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry1D(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry1D(doc), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry1D(doc), 'Fem::FemElementGeometry1D'))

        self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry2D(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry2D(doc), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry2D(doc), 'Fem::FemElementGeometry2D'))

        self.assertTrue(is_derived_from(ObjectsFem.makeElementRotation1D(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementRotation1D(doc), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeElementRotation1D(doc), 'Fem::FemElementRotation1D'))

        self.assertTrue(is_derived_from(ObjectsFem.makeMaterialFluid(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMaterialFluid(doc), 'App::MaterialObjectPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMaterialFluid(doc), 'Fem::Material'))

        self.assertTrue(is_derived_from(materialsolid, 'App::DocumentObject'))
        self.assertTrue(is_derived_from(materialsolid, 'App::MaterialObjectPython'))
        self.assertTrue(is_derived_from(materialsolid, 'Fem::Material'))

        self.assertTrue(is_derived_from(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid), 'Fem::MaterialMechanicalNonlinear'))

        self.assertTrue(is_derived_from(mesh, 'App::DocumentObject'))
        self.assertTrue(is_derived_from(mesh, 'Fem::FemMeshObjectPython'))
        self.assertTrue(is_derived_from(mesh, 'Fem::FemMeshGmsh'))

        self.assertTrue(is_derived_from(ObjectsFem.makeMeshBoundaryLayer(doc, mesh), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshBoundaryLayer(doc, mesh), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshBoundaryLayer(doc, mesh), 'Fem::FemMeshBoundaryLayer'))

        self.assertTrue(is_derived_from(ObjectsFem.makeMeshGroup(doc, mesh), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshGroup(doc, mesh), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshGroup(doc, mesh), 'Fem::FemMeshGroup'))

        self.assertTrue(is_derived_from(ObjectsFem.makeMeshRegion(doc, mesh), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshRegion(doc, mesh), 'Fem::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshRegion(doc, mesh), 'Fem::FemMeshRegion'))

        self.assertTrue(is_derived_from(ObjectsFem.makeMeshNetgen(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshNetgen(doc), 'Fem::FemMeshShapeNetgenObject'))

        self.assertTrue(is_derived_from(ObjectsFem.makeMeshResult(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshResult(doc), 'Fem::FemMeshObjectPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeMeshResult(doc), 'Fem::FemMeshResult'))

        self.assertTrue(is_derived_from(ObjectsFem.makeResultMechanical(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeResultMechanical(doc), 'Fem::FemResultObjectPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeResultMechanical(doc), 'Fem::FemResultMechanical'))

        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc), 'Fem::FemSolverObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc), 'Fem::FemSolverObjectPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc), 'Fem::FemSolverCalculixCcxTools'))

        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculix(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculix(doc), 'Fem::FemSolverObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculix(doc), 'Fem::FemSolverObjectPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculix(doc), 'Fem::FemSolverObjectCalculix'))

        self.assertTrue(is_derived_from(solverelmer, 'App::DocumentObject'))
        self.assertTrue(is_derived_from(solverelmer, 'Fem::FemSolverObject'))
        self.assertTrue(is_derived_from(solverelmer, 'Fem::FemSolverObjectPython'))
        self.assertTrue(is_derived_from(solverelmer, 'Fem::FemSolverObjectElmer'))

        self.assertTrue(is_derived_from(ObjectsFem.makeSolverZ88(doc), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverZ88(doc), 'Fem::FemSolverObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverZ88(doc), 'Fem::FemSolverObjectPython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeSolverZ88(doc), 'Fem::FemSolverObjectZ88'))

        self.assertTrue(is_derived_from(ObjectsFem.makeEquationElasticity(doc, solverelmer), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationElasticity(doc, solverelmer), 'App::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationElasticity(doc, solverelmer), 'Fem::FemEquationElmerElasticity'))

        self.assertTrue(is_derived_from(ObjectsFem.makeEquationElectrostatic(doc, solverelmer), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationElectrostatic(doc, solverelmer), 'App::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationElectrostatic(doc, solverelmer), 'Fem::FemEquationElmerElectrostatic'))

        self.assertTrue(is_derived_from(ObjectsFem.makeEquationFlow(doc, solverelmer), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationFlow(doc, solverelmer), 'App::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationFlow(doc, solverelmer), 'Fem::FemEquationElmerFlow'))

        self.assertTrue(is_derived_from(ObjectsFem.makeEquationFluxsolver(doc, solverelmer), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationFluxsolver(doc, solverelmer), 'App::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationFluxsolver(doc, solverelmer), 'Fem::FemEquationElmerFluxsolver'))

        self.assertTrue(is_derived_from(ObjectsFem.makeEquationHeat(doc, solverelmer), 'App::DocumentObject'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationHeat(doc, solverelmer), 'App::FeaturePython'))
        self.assertTrue(is_derived_from(ObjectsFem.makeEquationHeat(doc, solverelmer), 'Fem::FemEquationElmerHeat'))
Ejemplo n.º 25
0
    def test_femobjects_type(self):
        doc = self.active_doc

        from femtools.femutils import type_of_obj
        self.assertEqual("Fem::FemAnalysis",
                         type_of_obj(ObjectsFem.makeAnalysis(doc)))
        self.assertEqual("Fem::ConstraintBearing",
                         type_of_obj(ObjectsFem.makeConstraintBearing(doc)))
        self.assertEqual(
            "Fem::ConstraintBodyHeatSource",
            type_of_obj(ObjectsFem.makeConstraintBodyHeatSource(doc)))
        self.assertEqual("Fem::ConstraintContact",
                         type_of_obj(ObjectsFem.makeConstraintContact(doc)))
        self.assertEqual(
            "Fem::ConstraintDisplacement",
            type_of_obj(ObjectsFem.makeConstraintDisplacement(doc)))
        self.assertEqual(
            "Fem::ConstraintElectrostaticPotential",
            type_of_obj(ObjectsFem.makeConstraintElectrostaticPotential(doc)))
        self.assertEqual("Fem::ConstraintFixed",
                         type_of_obj(ObjectsFem.makeConstraintFixed(doc)))
        self.assertEqual(
            "Fem::ConstraintFlowVelocity",
            type_of_obj(ObjectsFem.makeConstraintFlowVelocity(doc)))
        self.assertEqual(
            "Fem::ConstraintFluidBoundary",
            type_of_obj(ObjectsFem.makeConstraintFluidBoundary(doc)))
        self.assertEqual("Fem::ConstraintForce",
                         type_of_obj(ObjectsFem.makeConstraintForce(doc)))
        self.assertEqual("Fem::ConstraintGear",
                         type_of_obj(ObjectsFem.makeConstraintGear(doc)))
        self.assertEqual("Fem::ConstraintHeatflux",
                         type_of_obj(ObjectsFem.makeConstraintHeatflux(doc)))
        self.assertEqual(
            "Fem::ConstraintInitialFlowVelocity",
            type_of_obj(ObjectsFem.makeConstraintInitialFlowVelocity(doc)))
        self.assertEqual(
            "Fem::ConstraintInitialTemperature",
            type_of_obj(ObjectsFem.makeConstraintInitialTemperature(doc)))
        self.assertEqual(
            "Fem::ConstraintPlaneRotation",
            type_of_obj(ObjectsFem.makeConstraintPlaneRotation(doc)))
        self.assertEqual("Fem::ConstraintPressure",
                         type_of_obj(ObjectsFem.makeConstraintPressure(doc)))
        self.assertEqual("Fem::ConstraintPulley",
                         type_of_obj(ObjectsFem.makeConstraintPulley(doc)))
        self.assertEqual("Fem::ConstraintSelfWeight",
                         type_of_obj(ObjectsFem.makeConstraintSelfWeight(doc)))
        self.assertEqual(
            "Fem::ConstraintTemperature",
            type_of_obj(ObjectsFem.makeConstraintTemperature(doc)))
        self.assertEqual("Fem::ConstraintTransform",
                         type_of_obj(ObjectsFem.makeConstraintTransform(doc)))
        self.assertEqual("Fem::FemElementFluid1D",
                         type_of_obj(ObjectsFem.makeElementFluid1D(doc)))
        self.assertEqual("Fem::FemElementGeometry1D",
                         type_of_obj(ObjectsFem.makeElementGeometry1D(doc)))
        self.assertEqual("Fem::FemElementGeometry2D",
                         type_of_obj(ObjectsFem.makeElementGeometry2D(doc)))
        self.assertEqual("Fem::FemElementRotation1D",
                         type_of_obj(ObjectsFem.makeElementRotation1D(doc)))
        materialsolid = ObjectsFem.makeMaterialSolid(doc)
        self.assertEqual("Fem::Material",
                         type_of_obj(ObjectsFem.makeMaterialFluid(doc)))
        self.assertEqual("Fem::Material", type_of_obj(materialsolid))
        self.assertEqual(
            "Fem::MaterialMechanicalNonlinear",
            type_of_obj(
                ObjectsFem.makeMaterialMechanicalNonlinear(doc,
                                                           materialsolid)))
        self.assertEqual("Fem::MaterialReinforced",
                         type_of_obj(ObjectsFem.makeMaterialReinforced(doc)))
        mesh = ObjectsFem.makeMeshGmsh(doc)
        self.assertEqual("Fem::FemMeshGmsh", type_of_obj(mesh))
        self.assertEqual(
            "Fem::FemMeshBoundaryLayer",
            type_of_obj(ObjectsFem.makeMeshBoundaryLayer(doc, mesh)))
        self.assertEqual("Fem::FemMeshGroup",
                         type_of_obj(ObjectsFem.makeMeshGroup(doc, mesh)))
        self.assertEqual("Fem::FemMeshRegion",
                         type_of_obj(ObjectsFem.makeMeshRegion(doc, mesh)))
        self.assertEqual("Fem::FemMeshShapeNetgenObject",
                         type_of_obj(ObjectsFem.makeMeshNetgen(doc)))
        self.assertEqual("Fem::FemMeshResult",
                         type_of_obj(ObjectsFem.makeMeshResult(doc)))
        self.assertEqual("Fem::FemResultMechanical",
                         type_of_obj(ObjectsFem.makeResultMechanical(doc)))
        solverelmer = ObjectsFem.makeSolverElmer(doc)
        self.assertEqual(
            "Fem::FemSolverCalculixCcxTools",
            type_of_obj(ObjectsFem.makeSolverCalculixCcxTools(doc)))
        self.assertEqual("Fem::FemSolverObjectCalculix",
                         type_of_obj(ObjectsFem.makeSolverCalculix(doc)))
        self.assertEqual("Fem::FemSolverObjectElmer", type_of_obj(solverelmer))
        self.assertEqual("Fem::FemSolverObjectZ88",
                         type_of_obj(ObjectsFem.makeSolverZ88(doc)))
        self.assertEqual(
            "Fem::FemEquationElmerElasticity",
            type_of_obj(ObjectsFem.makeEquationElasticity(doc, solverelmer)))
        self.assertEqual(
            "Fem::FemEquationElmerElectrostatic",
            type_of_obj(ObjectsFem.makeEquationElectrostatic(doc,
                                                             solverelmer)))
        self.assertEqual(
            "Fem::FemEquationElmerFlow",
            type_of_obj(ObjectsFem.makeEquationFlow(doc, solverelmer)))
        self.assertEqual(
            "Fem::FemEquationElmerFluxsolver",
            type_of_obj(ObjectsFem.makeEquationFluxsolver(doc, solverelmer)))
        self.assertEqual(
            "Fem::FemEquationElmerHeat",
            type_of_obj(ObjectsFem.makeEquationHeat(doc, solverelmer)))
Ejemplo n.º 26
0
def setup(doc=None, solvertype="ccxtools"):
    # setup model

    if doc is None:
        doc = init_doc()

    # part
    # create a CompSolid of two Boxes extract the CompSolid
    # we are able to remesh if needed
    boxlow = doc.addObject("Part::Box", "BoxLower")
    boxupp = doc.addObject("Part::Box", "BoxUpper")
    boxupp.Placement.Base = (0, 0, 10)

    # for BooleanFragments Occt >=6.9 is needed
    """
    import BOPTools.SplitFeatures
    bf = BOPTools.SplitFeatures.makeBooleanFragments(name="BooleanFragments")
    bf.Objects = [boxlow, boxupp]
    bf.Mode = "CompSolid"
    self.active_doc.recompute()
    bf.Proxy.execute(bf)
    bf.purgeTouched()
    for obj in bf.ViewObject.Proxy.claimChildren():
        obj.ViewObject.hide()
    self.active_doc.recompute()
    import CompoundTools.CompoundFilter
    cf = CompoundTools.CompoundFilter.makeCompoundFilter(name="MultiMatCompSolid")
    cf.Base = bf
    cf.FilterType = "window-volume"
    cf.Proxy.execute(cf)
    cf.purgeTouched()
    cf.Base.ViewObject.hide()
    """
    doc.recompute()

    if FreeCAD.GuiUp:
        import FreeCADGui
        FreeCADGui.ActiveDocument.activeView().viewAxonometric()
        FreeCADGui.SendMsgToActiveView("ViewFit")

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
        )[0]
    elif solvertype == "ccxtools":
        solver_object = analysis.addObject(
            ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools")
        )[0]
        solver_object.WorkingDir = u""
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_object.SplitInputWriter = False
        solver_object.AnalysisType = "static"
        solver_object.GeometricalNonlinearity = "linear"
        solver_object.ThermoMechSteadyState = False
        solver_object.MatrixSolverType = "default"
        solver_object.IterationsControlParameterTimeUse = False

    # material
    material_object_low = analysis.addObject(
        ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterialLow")
    )[0]
    mat = material_object_low.Material
    mat["Name"] = "Aluminium-Generic"
    mat["YoungsModulus"] = "70000 MPa"
    mat["PoissonRatio"] = "0.35"
    mat["Density"] = "2700  kg/m^3"
    material_object_low.Material = mat
    material_object_low.References = [(boxlow, "Solid1")]
    analysis.addObject(material_object_low)

    material_object_upp = analysis.addObject(
        ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterialUpp")
    )[0]
    mat = material_object_upp.Material
    mat["Name"] = "Steel-Generic"
    mat["YoungsModulus"] = "200000 MPa"
    mat["PoissonRatio"] = "0.30"
    mat["Density"] = "7980 kg/m^3"
    material_object_upp.Material = mat
    material_object_upp.References = [(boxupp, "Solid1")]

    # fixed_constraint
    fixed_constraint = analysis.addObject(
        ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed")
    )[0]
    # fixed_constraint.References = [(cf, "Face3")]
    fixed_constraint.References = [(boxlow, "Face5")]

    # pressure_constraint
    pressure_constraint = analysis.addObject(
        ObjectsFem.makeConstraintPressure(doc, "ConstraintPressure")
    )[0]
    # pressure_constraint.References = [(cf, "Face3")]
    pressure_constraint.References = [(boxlow, "Face5")]
    # pressure_constraint.References = [(cf, "Face9")]
    pressure_constraint.References = [(boxupp, "Face6")]
    pressure_constraint.Pressure = 1000.0
    pressure_constraint.Reversed = False

    # mesh
    from .meshes.mesh_boxes_2_vertikal_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(
        doc.addObject("Fem::FemMeshObject", mesh_name)
    )[0]
    femmesh_obj.FemMesh = fem_mesh

    doc.recompute()
    return doc
def setup(doc=None, solvertype="ccxtools"):

    # init FreeCAD document
    if doc is None:
        doc = init_doc()

    # explanation object
    # just keep the following line and change text string in get_explanation method
    manager.add_explanation_obj(doc, get_explanation(manager.get_header(get_information())))

    # geometric objects
    # two boxes
    boxlow = doc.addObject("Part::Box", "BoxLower")
    boxupp = doc.addObject("Part::Box", "BoxUpper")
    boxupp.Placement.Base = (0, 0, 10)

    # boolean fragment of the two boxes
    bf = SplitFeatures.makeBooleanFragments(name="BooleanFragments")
    bf.Objects = [boxlow, boxupp]
    bf.Mode = "CompSolid"
    doc.recompute()
    bf.Proxy.execute(bf)
    bf.purgeTouched()
    doc.recompute()
    if FreeCAD.GuiUp:
        for child in bf.ViewObject.Proxy.claimChildren():
            child.ViewObject.hide()

    # extract CompSolid by compound filter tool
    geom_obj = CompoundFilter.makeCompoundFilter(name="MultiMatCompSolid")
    geom_obj.Base = bf
    geom_obj.FilterType = "window-volume"
    geom_obj.Proxy.execute(geom_obj)
    geom_obj.purgeTouched()
    if FreeCAD.GuiUp:
        bf.ViewObject.hide()
    doc.recompute()

    if FreeCAD.GuiUp:
        geom_obj.ViewObject.Document.activeView().viewAxonometric()
        geom_obj.ViewObject.Document.activeView().fitAll()

    # analysis
    analysis = ObjectsFem.makeAnalysis(doc, "Analysis")

    # solver
    if solvertype == "calculix":
        solver_obj = ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
    elif solvertype == "ccxtools":
        solver_obj = ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools")
        solver_obj.WorkingDir = u""
    else:
        FreeCAD.Console.PrintWarning(
            "Not known or not supported solver type: {}. "
            "No solver object was created.\n".format(solvertype)
        )
    if solvertype == "calculix" or solvertype == "ccxtools":
        solver_obj.SplitInputWriter = False
        solver_obj.AnalysisType = "static"
        solver_obj.GeometricalNonlinearity = "linear"
        solver_obj.ThermoMechSteadyState = False
        solver_obj.MatrixSolverType = "default"
        solver_obj.IterationsControlParameterTimeUse = False
    analysis.addObject(solver_obj)

    # materials
    material_obj_low = ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterialLow")
    mat = material_obj_low.Material
    mat["Name"] = "Aluminium-Generic"
    mat["YoungsModulus"] = "70000 MPa"
    mat["PoissonRatio"] = "0.35"
    material_obj_low.Material = mat
    material_obj_low.References = [(boxlow, "Solid1")]
    analysis.addObject(material_obj_low)

    material_obj_upp = ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterialUpp")
    mat = material_obj_upp.Material
    mat["Name"] = "Steel-Generic"
    mat["YoungsModulus"] = "200000 MPa"
    mat["PoissonRatio"] = "0.30"
    material_obj_upp.Material = mat
    material_obj_upp.References = [(boxupp, "Solid1")]
    analysis.addObject(material_obj_upp)

    # constraint fixed
    con_fixed = ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed")
    con_fixed.References = [(geom_obj, "Face5")]
    analysis.addObject(con_fixed)

    # constraint pressure
    con_pressure = ObjectsFem.makeConstraintPressure(doc, "ConstraintPressure")
    con_pressure.References = [(geom_obj, "Face11")]
    con_pressure.Pressure = 1000.0
    con_pressure.Reversed = False
    analysis.addObject(con_pressure)

    # mesh
    from .meshes.mesh_boxes_2_vertikal_tetra10 import create_nodes, create_elements
    fem_mesh = Fem.FemMesh()
    control = create_nodes(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating nodes.\n")
    control = create_elements(fem_mesh)
    if not control:
        FreeCAD.Console.PrintError("Error on creating elements.\n")
    femmesh_obj = analysis.addObject(ObjectsFem.makeMeshGmsh(doc, get_meshname()))[0]
    femmesh_obj.FemMesh = fem_mesh
    femmesh_obj.Part = geom_obj
    femmesh_obj.SecondOrderLinear = False

    doc.recompute()
    return doc