bbox_tokens

This commit is contained in:
jmespadero 2023-10-04 15:44:37 +02:00
parent cb34356dad
commit 74be3fc6fc
2 changed files with 104 additions and 21 deletions

View File

@ -30,6 +30,8 @@
#include "muParser.h"
#include "string_conversion.h"
#include <random>
using namespace mu;
using namespace vcg;
@ -123,34 +125,45 @@ QString FilterFunctionPlugin::pythonFilterName(ActionIDType f) const
}
const QString PossibleOperators(
"<br>It's possible to use parenthesis <b>()</b>, and predefined "
"<a href='https://beltoforion.de/en/muparser/features.php#idDef2'>muparser built-in operators</a>, like:<br>"
"<br>It's possible to use any of the predefined muparser built-in "
"<a href='https://beltoforion.de/en/muparser/features.php#idDef2'>operators</a> and "
"<a href='https://beltoforion.de/en/muparser/features.php#idDef1'>functions</a>, like: "
"<b>&&</b> (logic and), <b>||</b> (logic or), <b>&lt;</b>, <b>&lt;=</b>, <b>></b>, <b>>=</b>, "
"<b>!=</b> (not equal), <b>==</b> (equal), <b>_?_:_</b> (c/c++ ternary operator).<br><br>");
"<b>!=</b> (not equal), <b>==</b> (equal), <b>_?_:_</b> (c/c++ ternary operator), and "
"<b>rnd()</b> (random value in [0..1])" );
const QString PerVertexAttributeString(
"It's possible to use <a href='https://beltoforion.de/en/muparser/features.php#idDef1'>muparser built-in functions</a>"
"and the following per-vertex variables in the expression:<br>"
"<ul><li>Per-vertex variables:<br>"
"<b>x,y,z</b> (position), <b>nx,ny,nz</b> (normal), <b>r,g,b,a</b> (color), <b>q</b> "
"(quality), <b>vi</b> (vertex index), <b>vtu,vtv,ti</b> (texture coords and texture "
"index), <b>vsel</b> (is the vertex selected? 1 yes, 0 no) "
"and all custom <i>vertex attributes</i> already defined by user."
"Point3 attribute are available as three variables with _x, _y, _z appended to the attribute name.<br>");
"index), <b>vsel</b> ( 1 if selected, 0 if not selected)."
"</li><li>Bounding Box variables:<br>"
"<b>xmin,ymin,zmin</b> (min coordinates), <b>xmax,ymax,zmax</b> (max coordinates), "
"<b>xmid,ymid,zmid</b> (midpoint coordinates), <b>xdim,ydim,zdim</b> (dimensions), <b>bbdiag</b> (diagonal length)"
"</li><li>User-defined attributes:<br>"
"All user defined custom <i>vertex attributes</i> are available. "
"Point3 attribute are available as 3 variables with _x, _y, _z appended to the attribute name."
"</li></ul>");
const QString PerFaceAttributeString(
"It's possible to use <a href='https://beltoforion.de/en/muparser/features.php#idDef1'>muparser built-in functions</a>"
"and the following per-face or per-vertex variables:<br>"
"<b>x0,y0,z0</b> for the first vertex position, <b>x1,y1,z1</b> for the second vertex "
"position, <b>x2,y2,z2</b> for the third vertex position, "
"<b>nx0,ny0,nz0 nx1,ny1,nz1 nx2,ny2,nz2</b> for vertex normals, <b>r0,g0,b0,a0 r1,g1,b1,a1 "
"r2,g2,b2,a2</b> for vertex colors, <b>vi0, vi1, vi2</b> for vertex indices, "
"<b>q0,q1,q2</b> for vertex quality, <b>wtu0,wtv0 wtu1,wtv1 wtu2,wtv2</b> for per-wedge "
"texture coords, <b>ti</b> for face texture index, <b>vsel0,vsel1,vsel2</b> for vertex "
"selection (1 yes, 0 no) "
"<b>fi</b> for face index, <b>fr,fg,fb,fa</b> for face color, <b>fq</b> for face quality, "
"<b>fnx,fny,fnz</b> for face normal, <b>fsel</b> face selection (1 yes, 0 no)."
"All user defined <i>face scalar attributes</i> are available."
"Point3 attribute are available as three variables with _x, _y, _z appended to the attribute name.<br><br>");
"<ul><li>Per-face variables:<br>"
"<b>fi</b> (face index), <b>fr,fg,fb,fa</b> (face color), <b>fq</b> (face quality), "
"<b>fnx,fny,fnz</b> (face normal), <b>fsel</b> ( 1 if selected, 0 if not selected)."
"</li><li>Per-vertex variables:<br>"
"<b>x0,y0,z0</b> (first vertex position), <b>x1,y1,z1</b> (second vertex position),"
"<b>x2,y2,z2</b> (third vertex position), "
"<b>nx0,ny0,nz0 nx1,ny1,nz1 nx2,ny2,nz2</b> (vertex normals), <b>r0,g0,b0,a0 r1,g1,b1,a1 "
"r2,g2,b2,a2</b> (vertex colors), <b>vi0, vi1, vi2</b> (vertex indices), "
"<b>q0,q1,q2</b> (vertex quality), <b>wtu0,wtv0 wtu1,wtv1 wtu2,wtv2</b> (per-wedge "
"texture coords), <b>ti</b> (face texture index), <b>vsel0,vsel1,vsel2</b> (vertex selected (1 yes, 0 no))."
"</li><li>Bounding Box variables:<br>"
"<b>xmin,ymin,zmin</b> (min coordinates), <b>xmax,ymax,zmax</b> (max coordinates), "
"<b>xmid,ymid,zmid</b> (midpoint coordinates), <b>xdim,ydim,zdim</b> (dimensions), <b>bbdiag</b> (diagonal length)."
"</li><li>User-defined attributes:<br>"
"All user defined custom <i>face scalar attributes</i> are available. "
"Point3 attribute are available as 3 variables with _x, _y, _z appended to the attribute name."
"</li></ul>");
// long string describing each filtering action
QString FilterFunctionPlugin::filterInfo(ActionIDType filterId) const
@ -696,6 +709,24 @@ std::map<std::string, QVariant> FilterFunctionPlugin::applyFilter(
md.addNewMesh("", this->filterName(ID(filter)));
MeshModel& m = *(md.mm());
Q_UNUSED(cb);
//Set values to parser variables related to BBox
vcg::Box3f bbox = m.cm.bbox;
xmin = bbox.min.X();
ymin = bbox.min.Y();
zmin = bbox.min.Z();
xmax = bbox.max.X();
ymax = bbox.max.Y();
zmax = bbox.max.Z();
xdim = bbox.DimX();
ydim = bbox.DimY();
zdim = bbox.DimZ();
bbdiag = bbox.Diag();
vcg::Point3f bbCenter = bbox.Center();
xmid = bbCenter.X();
ymid = bbCenter.Y();
zmid = bbCenter.Z();
switch (ID(filter)) {
case FF_VERT_SELECTION: {
std::string expr = par.getString("condSelect").toStdString();
@ -1762,6 +1793,15 @@ void FilterFunctionPlugin::setAttributes(CMeshO::FaceIterator& fi, CMeshO& m)
}
// Generate a random double in [0.0, 1.0] interval
double FilterFunctionPlugin::random()
{
std::random_device rd; // Seed for the random number engine
std::mt19937 gen(rd()); // Mersenne Twister engine
std::uniform_real_distribution<double> dis(0.0, 1.0);
return dis(gen); // Generate a random double in [0.0, 1.0]
}
// Function explicitly define parser variables to perform per-vertex filter action
// x, y, z for vertex coord, nx, ny, nz for normal coord, r, g ,b for color
// and q for quality
@ -1784,6 +1824,24 @@ void FilterFunctionPlugin::setPerVertexVariables(Parser& p, CMeshO& m)
p.DefineVar(conversion::fromStringToWString("ti"), &ti);
p.DefineVar(conversion::fromStringToWString("vsel"), &vsel);
//Add tokens related to mesh bounding box
p.DefineVar(conversion::fromStringToWString("xmin"), &xmin);
p.DefineVar(conversion::fromStringToWString("ymin"), &ymin);
p.DefineVar(conversion::fromStringToWString("zmin"), &zmin);
p.DefineVar(conversion::fromStringToWString("xmax"), &xmax);
p.DefineVar(conversion::fromStringToWString("ymax"), &ymax);
p.DefineVar(conversion::fromStringToWString("zmax"), &zmax);
p.DefineVar(conversion::fromStringToWString("bbdiag"), &bbdiag);
p.DefineVar(conversion::fromStringToWString("xdim"), &xdim);
p.DefineVar(conversion::fromStringToWString("ydim"), &ydim);
p.DefineVar(conversion::fromStringToWString("zdim"), &zdim);
p.DefineVar(conversion::fromStringToWString("xmid"), &xmid);
p.DefineVar(conversion::fromStringToWString("ymid"), &ymid);
p.DefineVar(conversion::fromStringToWString("zmid"), &zmid);
//Add function rnd()
p.DefineFun("rnd", random);
// define var for user-defined attributes (if any exists)
// if vector is empty, code won't be executed
v_handlers.clear();
@ -1912,6 +1970,24 @@ void FilterFunctionPlugin::setPerFaceVariables(Parser& p, CMeshO& m)
p.DefineVar(conversion::fromStringToWString("vsel2"), &vsel2);
p.DefineVar(conversion::fromStringToWString("fsel"), &fsel);
//Add tokens related to mesh bounding box
p.DefineVar(conversion::fromStringToWString("xmin"), &xmin);
p.DefineVar(conversion::fromStringToWString("ymin"), &ymin);
p.DefineVar(conversion::fromStringToWString("zmin"), &zmin);
p.DefineVar(conversion::fromStringToWString("xmax"), &xmax);
p.DefineVar(conversion::fromStringToWString("ymax"), &ymax);
p.DefineVar(conversion::fromStringToWString("zmax"), &zmax);
p.DefineVar(conversion::fromStringToWString("bbdiag"), &bbdiag);
p.DefineVar(conversion::fromStringToWString("xdim"), &xdim);
p.DefineVar(conversion::fromStringToWString("ydim"), &ydim);
p.DefineVar(conversion::fromStringToWString("zdim"), &zdim);
p.DefineVar(conversion::fromStringToWString("xmid"), &xmid);
p.DefineVar(conversion::fromStringToWString("ymid"), &ymid);
p.DefineVar(conversion::fromStringToWString("zmid"), &zmid);
//Add function rnd()
p.DefineFun("rnd", random);
// define var for user-defined attributes (if any exists)
// if vector is empty, code won't be executed
f_handlers.clear();

View File

@ -44,6 +44,10 @@ protected:
vsel0, vsel1, vsel2;
double fr, fg, fb, fa, fnx, fny, fnz, fq, fsel;
double v, f, v0i, v1i, v2i, ti;
//Bounding Box of the mesh
double xmin, ymin, zmin, xmax, ymax, zmax, xdim, ydim, zdim, bbdiag, xmid, ymid, zmid;
std::vector<std::string> v_attrNames; // names of the <float> per vertex attributes
std::vector<double> v_attrValue; // values of the <Scalarm> per vertex attributes
std::vector<std::string> v3_attrNames; // names of the <Point3f> per vertex attributes There are
@ -62,6 +66,9 @@ protected:
QString errorMsg;
// Generate a random double in [0.0, 1.0] interval
static double random();
public:
enum {
FF_VERT_SELECTION,