Why does my imported geometry show only 1 face & 1 edge?
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Muhammad
am 30 Jun. 2023
Beantwortet: Ravi Kumar
am 5 Jul. 2023
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 Kommentar
Cris LaPierre
am 30 Jun. 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.
Akzeptierte Antwort
Ravi Kumar
am 5 Jul. 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 Kommentare
Weitere Antworten (1)
Cris LaPierre
am 2 Jul. 2023
Bearbeitet: Cris LaPierre
am 2 Jul. 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)
1 Kommentar
Siehe auch
Kategorien
Mehr zu Geometry and Mesh finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!