Why does my imported geometry show only 1 face & 1 edge?
4 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
I'm trying to do static structural fem in matlab following "deflection of bracket" example. When i import my own geometry (human femur bone) in matlab, it shows only 1 face and 1 edge for it! Whole geometry is shown when i plot it. But now i can't proceed as i will need to select faces to apply boundary conditions and that won't be possible. Is there a solution to this?
Note: My stl is ascii and i have tried with single solid (one time solid-endsolid in ascii) geometry as well as 3 solid (3 times solid-endsolid in ascii) bodies making complete geometry after splitting it in cad software. Both show 1 cell, 2 vertices, 1 face & 1 edge upon import.
1 Commento
Cris LaPierre
il 30 Giu 2023
Could you share your STL file by attaching it to your post using the paperclip icon? You many need to zip it in order to upload it.
Risposta accettata
Ravi Kumar
il 5 Lug 2023
Hi Muhammad,
As Cris noted, the lack of sharp edges in the triangulation results in a single face for the whole geometry.
Here is a workaround to update the geometry using the mesh data to create additional faces. The overall idea is to generate mesh on the single-cell geometry. Use the mesh data and create a new geometry with more than one cell by manually selecting a few elements and assigning a specific cell ID to those elements. You get a few more faces once you have more than one cell. In the script below, I have created a three-cell geometry. I also show how to collect the faces associated with the cells to assign loads/BCs.
modelGeom = createpde('structural');
modelGeom.importGeometry('ascii_femur.stl')
figure
pdegplot(modelGeom)
% Generate mesh and use the mesh data to create additional cells and hence
% faces.
generateMesh(modelGeom)
% Find elements near top and bottom using a box search method
elemTop = findElements(modelGeom.Mesh,'box',[-300,300],[-300,300],[750,900]);
elemBottom = findElements(modelGeom.Mesh,'box',[-300,300],[-300,300],[0,450]);
% Create elements to region mapping
elemToRegion = ones(1,size(modelGeom.Mesh.Elements,2));
% Assign cell #2 to top elements
elemToRegion(elemTop) = 2;
% Assign cell #3 to bottom elements
elemToRegion(elemBottom) = 3;
% all other elements remain in cell 1.
% Create a new geometry containing three cells.
model = createpde('structural');
gm = geometryFromMesh(model,modelGeom.Mesh.Nodes,modelGeom.Mesh.Elements,elemToRegion);
figure
pdegplot(model,'CellLabels','on','FaceLabels','on','FaceAlpha',0.4)
% Find face IDs to apply BCs.
cell2Faces = cellFaces(model.Geometry,2,'external')
cell3Faces = cellFaces(model.Geometry,3,'external')
0 Commenti
Più risposte (1)
Cris LaPierre
il 2 Lug 2023
Modificato: Cris LaPierre
il 2 Lug 2023
- Reconstruction from STL data is not precise and can result in a loss of edges and, therefore, the merging of adjacent faces. Typically, lost edges are the edges between two adjacent faces meeting at a small angle, or smooth edges bounding blend surfaces. Usually, the loss of such edges does not affect the analysis workflow.
unzip('femur.zip')
model = createpde;
importGeometry(model,"ascii_femur_cut.stl")
pdegplot(model)
You can then add a mesu using the generateMesh function, but I don't think this helps solve your original issue of setting boundary conditions.
generateMesh(model)
pdeplot3D(model)
Vedere anche
Categorie
Scopri di più su Geometry and Mesh in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!