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,7 +23,8 @@ class discreteEdge : public GEdge { ...@@ -23,7 +23,8 @@ 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;
......
...@@ -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
...@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment