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
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
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
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
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
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'))
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'))
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
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
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
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
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
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'))
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))
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))
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))
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
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
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)
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
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'))
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)))
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