FEM and Blender: Difference between revisions

From wikiluntti
Line 89: Line 89:
Cad mesh cube FreeCAD FEM.png|thumb|The FreeCAD FEM solver gives some results.  
Cad mesh cube FreeCAD FEM.png|thumb|The FreeCAD FEM solver gives some results.  
Cad cube importToGMSH error.png|thumb|However, when importing to GMSH, it will produce an error.  
Cad cube importToGMSH error.png|thumb|However, when importing to GMSH, it will produce an error.  
Cad cube stl importToGMSH ok.png|thumb|If the cube is exported as STL, then GMSH will work better.
Cad cube stl importToGMSH meshFails.png|thumb|The mesh generation does not work: "PLC Error:  A segment and a facet intersect at point" and "Invalid boundary mesh (segment-facet intersection) on surface 1, intersection (0.333327,0.333327,1)".
</gallery>
</gallery>


Line 96: Line 94:
<gallery>
<gallery>
Cad cube stl imported NormalsDone gmsh ok.png|thumb|Meshing works, if the normals are done.
Cad cube stl imported NormalsDone gmsh ok.png|thumb|Meshing works, if the normals are done.
Cad cube stl importToGMSH ok.png|thumb|If the cube is exported as STL, then GMSH will work better (if not normals done).
Cad cube stl importToGMSH meshFails.png|thumb|The mesh generation does not work: "PLC Error:  A segment and a facet intersect at point" and "Invalid boundary mesh (segment-facet intersection) on surface 1, intersection (0.333327,0.333327,1)". (if not normals done.)
</gallery>
</gallery>



Revision as of 16:58, 28 June 2025

Introduction

Blender and CAD

import bpy
import csv

def export_selected_mesh_dimensions_to_csv(filepath):
    """Export Parts
    Args:
        filepath (str): Le chemin du fichier CSV de sortie.
    """

    with open(filepath, 'w', newline='', encoding='utf-8') as csvfile:
        fieldnames = ['Part', 'Section X (mm)', 'Section Y (mm)', 'Length Z (mm)']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        writer.writeheader()
        for obj in bpy.context.selected_objects:
            if obj.type == 'MESH':
                
                dimensions = obj.dimensions
                x = [0,0,0]
                x[0] = round(dimensions.x * 1000, 3)
                x[1] = round(dimensions.y * 1000, 3)
                x[2] = round(dimensions.z * 1000, 3)
                x.sort()

                writer.writerow({'Part': obj.name, 'X (mm)': x[0], 'Y (mm)': x[1], 'Z (mm)': x[2]})

filepath = "/home/user/Downloads/part_list.csv"  # Replace destination path

export_selected_mesh_dimensions_to_csv(filepath)

FreeCAD import

Steps:

  • Export in Blender
    • Use Boolean
    • Eliminate the bolts and some holes
  • Part -> Create shape from mesh
  • Part -> MakeSolid


Some problems (see a Part check Geometry)

  • Geometry is a shell -- not a solid: a shell mesh on meshing
    • Check this by right clicking on the mesh and printing mesh informations (Tasks: Node count vs Triangle count vs Tetrahedron count)
  • Self intersections
    • Use Boolean in Blender for all parts (both, if two are overlapping)
    • Self intersecting meshes are considered dirty
    • Use Part -> View -> Transparency to see the intersection points, if they persist.
    • eg Netfabb cleans

Workflow and test examples

  1. Make the Blender mesh and export as .obj file
  2. Make the mesh using GMSH or FreeCAD, and use FreeCAD to FEM calculations

Simple Cube

Works OK with the FreeCAD, not with the Gmsh

OBJ

STL

Two Cubes

Theory

Frame formulas: https://structx.com/frames.html

References