Skip to content
Snippets Groups Projects
Commit 6269177e authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

Plugin(Skin) can now also compute the boundary from a mesh

parent 751dea3f
No related branches found
No related tags found
No related merge requests found
...@@ -23,13 +23,14 @@ class discreteEdge : public GEdge { ...@@ -23,13 +23,14 @@ class discreteEdge : public GEdge {
virtual GPoint point(double p) const; virtual GPoint point(double p) const;
virtual SVector3 firstDer(double par) const; virtual SVector3 firstDer(double par) const;
virtual double curvature(double par) const; virtual double curvature(double par) const;
virtual double curvatures(const double par, SVector3 *dirMax, SVector3 *dirMin, double *curvMax, double *curvMin) const; virtual double curvatures(const double par, SVector3 *dirMax, SVector3 *dirMin,
double *curvMax, double *curvMin) const;
virtual bool haveParametrization(){ return !_pars.empty(); } virtual bool haveParametrization(){ return !_pars.empty(); }
virtual Range<double> parBounds(int) const; virtual Range<double> parBounds(int) const;
bool getLocalParameter(const double &t, int &iEdge, double &tLoc) const; bool getLocalParameter(const double &t, int &iEdge, double &tLoc) const;
void parametrize(std::map<GFace*, std::map<MVertex*, MVertex*, void parametrize(std::map<GFace*, std::map<MVertex*, MVertex*,
std::less<MVertex*> > > &face2Verts, std::less<MVertex*> > > &face2Verts,
std::map<GRegion*, std::map<MVertex*, MVertex*, std::map<GRegion*, std::map<MVertex*, MVertex*,
std::less<MVertex*> > > &region2Vert); std::less<MVertex*> > > &region2Vert);
void orderMLines(); void orderMLines();
......
...@@ -7,9 +7,17 @@ ...@@ -7,9 +7,17 @@
#include "Skin.h" #include "Skin.h"
#include "Context.h" #include "Context.h"
#include "GmshDefines.h" #include "GmshDefines.h"
#include "MTriangle.h"
#include "MQuadrangle.h"
#include "MLine.h"
#include "MFace.h"
#include "MEdge.h"
#include "discreteFace.h"
#include "discreteEdge.h"
StringXNumber SkinOptions_Number[] = { StringXNumber SkinOptions_Number[] = {
{GMSH_FULLRC, "Visible", NULL, 1.}, {GMSH_FULLRC, "Visible", NULL, 1.},
{GMSH_FULLRC, "FromMesh", NULL, 0.},
{GMSH_FULLRC, "View", NULL, -1.} {GMSH_FULLRC, "View", NULL, -1.}
}; };
...@@ -23,11 +31,12 @@ extern "C" ...@@ -23,11 +31,12 @@ extern "C"
std::string GMSH_SkinPlugin::getHelp() const std::string GMSH_SkinPlugin::getHelp() const
{ {
return "Plugin(Skin) extracts the boundary (skin) of " return "Plugin(Skin) extracts the boundary (skin) of the current "
"the view `View'. If `Visible' is set, the plugin only " "mesh (if `FromMesh' = 1), or from the the view `View' (in which "
"extracts the skin of visible entities.\n\n" "case it creates a new view). If `View' < 0 and `FromMesh' = 0, "
"If `View' < 0, the plugin is run on the current view.\n\n" "the plugin is run on the current view.\n"
"Plugin(Skin) creates one new view."; "If `Visible' is set, the plugin only extracts the skin of visible "
"entities.";
} }
int GMSH_SkinPlugin::getNbOptions() const int GMSH_SkinPlugin::getNbOptions() const
...@@ -74,12 +83,12 @@ class ElmData { ...@@ -74,12 +83,12 @@ class ElmData {
else if(numComp == 3){ data->NbVL++; vec = &data->VL; break; } else if(numComp == 3){ data->NbVL++; vec = &data->VL; break; }
else if(numComp == 9){ data->NbTL++; vec = &data->TL; break; } else if(numComp == 9){ data->NbTL++; vec = &data->TL; break; }
break; break;
case 3: case 3:
if (numComp == 1){ data->NbST++; vec = &data->ST; break; } if (numComp == 1){ data->NbST++; vec = &data->ST; break; }
else if(numComp == 3){ data->NbVT++; vec = &data->VT; break; } else if(numComp == 3){ data->NbVT++; vec = &data->VT; break; }
else if(numComp == 9){ data->NbTT++; vec = &data->TT; break; } else if(numComp == 9){ data->NbTT++; vec = &data->TT; break; }
break; break;
case 4: case 4:
if (numComp == 1){ data->NbSQ++; vec = &data->SQ; break; } if (numComp == 1){ data->NbSQ++; vec = &data->SQ; break; }
else if(numComp == 3){ data->NbVQ++; vec = &data->VQ; break; } else if(numComp == 3){ data->NbVQ++; vec = &data->VQ; break; }
else if(numComp == 9){ data->NbTQ++; vec = &data->TQ; break; } else if(numComp == 9){ data->NbTQ++; vec = &data->TQ; break; }
...@@ -113,17 +122,17 @@ double ElmDataLessThan::tolerance = 1.e-12; ...@@ -113,17 +122,17 @@ double ElmDataLessThan::tolerance = 1.e-12;
static int getBoundary(int type, const int (**boundary)[6][4]) static int getBoundary(int type, const int (**boundary)[6][4])
{ {
static const int tri[6][4] = static const int tri[6][4] =
{{0,1,-1,-1}, {1,2,-1,-1}, {2,0,-1,-1}}; {{0,1,-1,-1}, {1,2,-1,-1}, {2,0,-1,-1}};
static const int qua[6][4] = static const int qua[6][4] =
{{0,1,-1,-1}, {1,2,-1,-1}, {2,3,-1,-1}, {3,0,-1,-1}}; {{0,1,-1,-1}, {1,2,-1,-1}, {2,3,-1,-1}, {3,0,-1,-1}};
static const int tet[6][4] = static const int tet[6][4] =
{{0,1,3,-1}, {0,2,1,-1}, {0,3,2,-1}, {1,2,3,-1}}; {{0,1,3,-1}, {0,2,1,-1}, {0,3,2,-1}, {1,2,3,-1}};
static const int hex[6][4] = static const int hex[6][4] =
{{0,1,5,4}, {0,3,2,1}, {0,4,7,3}, {1,2,6,5}, {2,3,7,6}, {4,5,6,7}}; {{0,1,5,4}, {0,3,2,1}, {0,4,7,3}, {1,2,6,5}, {2,3,7,6}, {4,5,6,7}};
static const int pri[6][4] = static const int pri[6][4] =
{{0,1,4,3}, {0,3,5,2}, {1,2,5,4}, {0,2,1,-1}, {3,4,5,-1}}; {{0,1,4,3}, {0,3,5,2}, {1,2,5,4}, {0,2,1,-1}, {3,4,5,-1}};
static const int pyr[6][4] = static const int pyr[6][4] =
{{0,3,2,1}, {0,1,4,-1}, {0,4,3,-1}, {1,2,4,-1}, {2,3,4,-1}}; {{0,3,2,1}, {0,1,4,-1}, {0,4,3,-1}, {1,2,4,-1}, {2,3,4,-1}};
switch(type){ switch(type){
case TYPE_TRI: *boundary = &tri; return 3; case TYPE_TRI: *boundary = &tri; return 3;
...@@ -136,11 +145,76 @@ static int getBoundary(int type, const int (**boundary)[6][4]) ...@@ -136,11 +145,76 @@ static int getBoundary(int type, const int (**boundary)[6][4])
} }
} }
static void getBoundaryFromMesh(GModel *m, int visible)
{
int dim = m->getDim();
std::vector<GEntity*> entities;
m->getEntities(entities);
std::set<MFace, Less_Face> bndFaces;
std::set<MEdge, Less_Edge> bndEdges;
for(unsigned int i = 0; i < entities.size(); i++){
GEntity *ge = entities[i];
if(ge->dim() != dim) continue;
if(visible && !ge->getVisibility()) continue;
for(unsigned int j = 0; j < ge->getNumMeshElements(); j++){
MElement *e = ge->getMeshElement(j);
if(dim == 2){
for(int i = 0; i < e->getNumEdges(); i++){
MEdge f = e->getEdge(i);
if(bndEdges.find(f) == bndEdges.end())
bndEdges.insert(f);
else
bndEdges.erase(f);
}
}
else if(dim == 3){
for(int i = 0; i < e->getNumFaces(); i++){
MFace f = e->getFace(i);
if(bndFaces.find(f) == bndFaces.end())
bndFaces.insert(f);
else
bndFaces.erase(f);
}
}
}
}
if(dim == 2){
discreteEdge *e = new discreteEdge(m, m->getMaxElementaryNumber(1) + 1, 0, 0);
m->add(e);
for(std::set<MEdge, Less_Edge>::iterator it = bndEdges.begin();
it != bndEdges.end(); it++){
e->lines.push_back(new MLine(it->getVertex(0), it->getVertex(1)));
}
}
else if(dim == 3){
discreteFace *f = new discreteFace(m, m->getMaxElementaryNumber(2) + 1);
m->add(f);
for(std::set<MFace, Less_Face>::iterator it = bndFaces.begin();
it != bndFaces.end(); it++){
if(it->getNumVertices() == 3)
f->triangles.push_back(new MTriangle(it->getVertex(0), it->getVertex(1),
it->getVertex(2)));
else if(it->getNumVertices() == 4)
f->quadrangles.push_back(new MQuadrangle(it->getVertex(0), it->getVertex(1),
it->getVertex(2), it->getVertex(3)));
}
}
}
PView *GMSH_SkinPlugin::execute(PView *v) PView *GMSH_SkinPlugin::execute(PView *v)
{ {
int visible = (int)SkinOptions_Number[0].def; int visible = (int)SkinOptions_Number[0].def;
int iView = (int)SkinOptions_Number[1].def; int fromMesh = (int)SkinOptions_Number[1].def;
int iView = (int)SkinOptions_Number[2].def;
// compute boundary of current mesh
if(fromMesh){
getBoundaryFromMesh(GModel::current(), visible);
return v;
}
// compute boundary of post-processing data set
PView *v1 = getView(iView, v); PView *v1 = getView(iView, v);
if(!v1) return v; if(!v1) return v;
PViewData *data1 = getPossiblyAdaptiveData(v1); PViewData *data1 = getPossiblyAdaptiveData(v1);
...@@ -150,6 +224,8 @@ PView *GMSH_SkinPlugin::execute(PView *v) ...@@ -150,6 +224,8 @@ PView *GMSH_SkinPlugin::execute(PView *v)
return v; return v;
} }
Msg::Info("Extracting boundary from View[%d]", v1->getIndex());
PView *v2 = new PView(); PView *v2 = new PView();
PViewDataList *data2 = getDataList(v2); PViewDataList *data2 = getDataList(v2);
...@@ -203,7 +279,7 @@ PView *GMSH_SkinPlugin::execute(PView *v) ...@@ -203,7 +279,7 @@ PView *GMSH_SkinPlugin::execute(PView *v)
for(std::set<ElmData, ElmDataLessThan>::iterator it = skin.begin(); for(std::set<ElmData, ElmDataLessThan>::iterator it = skin.begin();
it != skin.end(); it++) it != skin.end(); it++)
it->addInView(data2); it->addInView(data2);
for(int i = 0; i < data1->getNumTimeSteps(); i++) for(int i = 0; i < data1->getNumTimeSteps(); i++)
if(data1->hasTimeStep(i)) if(data1->hasTimeStep(i))
data2->Time.push_back(data1->getTime(i)); data2->Time.push_back(data1->getTime(i));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment