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 {
virtual GPoint point(double p) const;
virtual SVector3 firstDer(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 Range<double> parBounds(int) const;
......
......@@ -7,9 +7,17 @@
#include "Skin.h"
#include "Context.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[] = {
{GMSH_FULLRC, "Visible", NULL, 1.},
{GMSH_FULLRC, "FromMesh", NULL, 0.},
{GMSH_FULLRC, "View", NULL, -1.}
};
......@@ -23,11 +31,12 @@ extern "C"
std::string GMSH_SkinPlugin::getHelp() const
{
return "Plugin(Skin) extracts the boundary (skin) of "
"the view `View'. If `Visible' is set, the plugin only "
"extracts the skin of visible entities.\n\n"
"If `View' < 0, the plugin is run on the current view.\n\n"
"Plugin(Skin) creates one new view.";
return "Plugin(Skin) extracts the boundary (skin) of the current "
"mesh (if `FromMesh' = 1), or from the the view `View' (in which "
"case it creates a new view). If `View' < 0 and `FromMesh' = 0, "
"the plugin is run on the current view.\n"
"If `Visible' is set, the plugin only extracts the skin of visible "
"entities.";
}
int GMSH_SkinPlugin::getNbOptions() const
......@@ -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)
{
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);
if(!v1) return v;
PViewData *data1 = getPossiblyAdaptiveData(v1);
......@@ -150,6 +224,8 @@ PView *GMSH_SkinPlugin::execute(PView *v)
return v;
}
Msg::Info("Extracting boundary from View[%d]", v1->getIndex());
PView *v2 = new PView();
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