Why does my imported geometry show only 1 face & 1 edge?
8 次查看(过去 30 天)
显示 更早的评论
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 个评论
Cris LaPierre
2023-6-30
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.
采纳的回答
Ravi Kumar
2023-7-5
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')
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1427623/image.png)
0 个评论
更多回答(1 个)
Cris LaPierre
2023-7-2
编辑:Cris LaPierre
2023-7-2
- 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)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Geometry and Mesh 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!