Add 2 color stock, speed control and resolution control
This commit is contained in:
committed by
Yorik van Havre
parent
77193b7e36
commit
1322bbf13d
@@ -89,10 +89,15 @@ PyObject* PathSimPy::GetResultMesh(PyObject * args)
|
||||
return 0;
|
||||
cStock *stock = getPathSimPtr()->m_stock;
|
||||
|
||||
Mesh::MeshObject *mesh = new Mesh::MeshObject();
|
||||
Mesh::MeshPy *meshpy = new Mesh::MeshPy(mesh);
|
||||
stock->Tesselate(*mesh);
|
||||
return meshpy;
|
||||
Mesh::MeshObject *meshOuter = new Mesh::MeshObject();
|
||||
Mesh::MeshPy *meshOuterpy = new Mesh::MeshPy(meshOuter);
|
||||
Mesh::MeshObject *meshInner = new Mesh::MeshObject();
|
||||
Mesh::MeshPy *meshInnerpy = new Mesh::MeshPy(meshInner);
|
||||
stock->Tesselate(*meshOuter, *meshInner);
|
||||
PyObject *tuple = PyTuple_New(2);
|
||||
PyTuple_SetItem(tuple, 0, meshOuterpy);
|
||||
PyTuple_SetItem(tuple, 1, meshInnerpy);
|
||||
return tuple;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -183,7 +183,10 @@ int cStock::TesselTop(int xp, int yp)
|
||||
Point3D pbr(xp + x_size, yp, z);
|
||||
Point3D ptl(xp, yp + y_size, z);
|
||||
Point3D ptr(xp + x_size, yp + y_size, z);
|
||||
AddQuad(pbl, pbr, ptr, ptl);
|
||||
if (abs(m_pz + m_lz - z) < SIM_EPSILON)
|
||||
AddQuad(pbl, pbr, ptr, ptl, facetsOuter);
|
||||
else
|
||||
AddQuad(pbl, pbr, ptr, ptl, facetsInner);
|
||||
}
|
||||
|
||||
if (farRect)
|
||||
@@ -324,7 +327,7 @@ int cStock::TesselBot(int xp, int yp)
|
||||
Point3D pbr(xp + x_size, yp, m_pz);
|
||||
Point3D ptl(xp, yp + y_size, m_pz);
|
||||
Point3D ptr(xp + x_size, yp + y_size, m_pz);
|
||||
AddQuad(pbl, ptl, ptr, pbr);
|
||||
AddQuad(pbl, ptl, ptr, pbr, facetsOuter);
|
||||
|
||||
if (farRect)
|
||||
return -1;
|
||||
@@ -342,6 +345,10 @@ int cStock::TesselSidesX(int yp)
|
||||
if (yp > 0)
|
||||
lastz2 = std::max(m_stock[0][yp - 1], m_pz);
|
||||
|
||||
std::vector<MeshCore::MeshGeomFacet> *facets = &facetsInner;
|
||||
if (yp == 0 || yp == m_y)
|
||||
facets = &facetsOuter;
|
||||
|
||||
//bool lastzclip = (lastz - m_pz) < m_res;
|
||||
int lastpoint = 0;
|
||||
for (int x = 1; x <= m_x; x++)
|
||||
@@ -361,7 +368,7 @@ int cStock::TesselSidesX(int yp)
|
||||
Point3D pbr(x, yp, lastz1);
|
||||
Point3D ptl(lastpoint, yp, lastz2);
|
||||
Point3D ptr(x, yp, lastz2);
|
||||
AddQuad(pbl, ptl, ptr, pbr);
|
||||
AddQuad(pbl, ptl, ptr, pbr, *facets);
|
||||
}
|
||||
lastz1 = newz1;
|
||||
lastz2 = newz2;
|
||||
@@ -379,6 +386,10 @@ int cStock::TesselSidesY(int xp)
|
||||
if (xp > 0)
|
||||
lastz2 = std::max(m_stock[xp - 1][0], m_pz);
|
||||
|
||||
std::vector<MeshCore::MeshGeomFacet> *facets = &facetsInner;
|
||||
if (xp == 0 || xp == m_x)
|
||||
facets = &facetsOuter;
|
||||
|
||||
//bool lastzclip = (lastz - m_pz) < m_res;
|
||||
int lastpoint = 0;
|
||||
for (int y = 1; y <= m_y; y++)
|
||||
@@ -398,7 +409,7 @@ int cStock::TesselSidesY(int xp)
|
||||
Point3D pbl(xp, y, lastz1);
|
||||
Point3D ptr(xp, lastpoint, lastz2);
|
||||
Point3D ptl(xp, y, lastz2);
|
||||
AddQuad(pbl, ptl, ptr, pbr);
|
||||
AddQuad(pbl, ptl, ptr, pbr, *facets);
|
||||
}
|
||||
lastz1 = newz1;
|
||||
lastz2 = newz2;
|
||||
@@ -421,7 +432,7 @@ void cStock::SetFacetPoints(MeshCore::MeshGeomFacet & facet, Point3D & p1, Point
|
||||
facet.CalcNormal();
|
||||
}
|
||||
|
||||
void cStock::AddQuad(Point3D & p1, Point3D & p2, Point3D & p3, Point3D & p4)
|
||||
void cStock::AddQuad(Point3D & p1, Point3D & p2, Point3D & p3, Point3D & p4, std::vector<MeshCore::MeshGeomFacet> & facets)
|
||||
{
|
||||
MeshCore::MeshGeomFacet facet;
|
||||
SetFacetPoints(facet, p1, p2, p3);
|
||||
@@ -430,14 +441,15 @@ void cStock::AddQuad(Point3D & p1, Point3D & p2, Point3D & p3, Point3D & p4)
|
||||
facets.push_back(facet);
|
||||
}
|
||||
|
||||
void cStock::Tesselate(Mesh::MeshObject & mesh)
|
||||
void cStock::Tesselate(Mesh::MeshObject & meshOuter, Mesh::MeshObject & meshInner)
|
||||
{
|
||||
// reset attribs
|
||||
for (int y = 0; y < m_y; y++)
|
||||
for (int x = 0; x < m_x; x++)
|
||||
m_attr[x][y] = 0;
|
||||
|
||||
facets.clear();
|
||||
facetsOuter.clear();
|
||||
facetsInner.clear();
|
||||
|
||||
for (int y = 0; y < m_y; y++)
|
||||
{
|
||||
@@ -462,8 +474,10 @@ void cStock::Tesselate(Mesh::MeshObject & mesh)
|
||||
TesselSidesX(y);
|
||||
for (int x = 0; x <= m_x; x++)
|
||||
TesselSidesY(x);
|
||||
mesh.addFacets(facets);
|
||||
facets.clear();
|
||||
meshOuter.addFacets(facetsOuter);
|
||||
meshInner.addFacets(facetsInner);
|
||||
facetsOuter.clear();
|
||||
facetsInner.clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -85,36 +85,6 @@ struct cLineSegment
|
||||
float lenXY;
|
||||
};
|
||||
|
||||
struct Model3D
|
||||
{
|
||||
Model3D(float px, float py, float res) : pos_x(px), pos_y(py), resolution(res) {}
|
||||
void SetFacetPoints(MeshCore::MeshGeomFacet & facet, Point3D & p1, Point3D & p2, Point3D & p3)
|
||||
{
|
||||
facet._aclPoints[0][0] = p1.x * resolution + pos_x;
|
||||
facet._aclPoints[0][1] = p1.y * resolution + pos_y;
|
||||
facet._aclPoints[0][2] = p1.z;
|
||||
facet._aclPoints[1][0] = p2.x * resolution + pos_x;
|
||||
facet._aclPoints[1][1] = p2.y * resolution + pos_y;
|
||||
facet._aclPoints[1][2] = p2.z;
|
||||
facet._aclPoints[2][0] = p3.x * resolution + pos_x;
|
||||
facet._aclPoints[2][1] = p3.y * resolution + pos_y;
|
||||
facet._aclPoints[2][2] = p3.z;
|
||||
facet.CalcNormal();
|
||||
}
|
||||
|
||||
inline void AddQuad(Point3D & p1, Point3D & p2, Point3D & p3, Point3D & p4)
|
||||
{
|
||||
MeshCore::MeshGeomFacet facet;
|
||||
SetFacetPoints(facet, p1, p2, p3);
|
||||
mesh.addFacet(facet);
|
||||
SetFacetPoints(facet, p1, p3, p4);
|
||||
mesh.addFacet(facet);
|
||||
}
|
||||
|
||||
float pos_x, pos_y, resolution;
|
||||
Mesh::MeshObject mesh;
|
||||
};
|
||||
|
||||
class cSimTool
|
||||
{
|
||||
public:
|
||||
@@ -167,7 +137,7 @@ class cStock
|
||||
public:
|
||||
cStock(float px, float py, float pz, float lx, float ly, float lz, float res);
|
||||
~cStock();
|
||||
void Tesselate(Mesh::MeshObject & mesh);
|
||||
void Tesselate(Mesh::MeshObject & meshOuter, Mesh::MeshObject & meshInner);
|
||||
void CreatePocket(float x, float y, float rad, float height);
|
||||
void ApplyLinearTool(Point3D & p1, Point3D & p2, cSimTool &tool);
|
||||
void ApplyCircularTool(Point3D & p1, Point3D & p2, Point3D & cent, cSimTool &tool, bool isCCW);
|
||||
@@ -179,7 +149,7 @@ private:
|
||||
float FindRectTop(int & xp, int & yp, int & x_size, int & y_size, bool scanHoriz);
|
||||
void FindRectBot(int & xp, int & yp, int & x_size, int & y_size, bool scanHoriz);
|
||||
void SetFacetPoints(MeshCore::MeshGeomFacet & facet, Point3D & p1, Point3D & p2, Point3D & p3);
|
||||
void AddQuad(Point3D & p1, Point3D & p2, Point3D & p3, Point3D & p4);
|
||||
void AddQuad(Point3D & p1, Point3D & p2, Point3D & p3, Point3D & p4, std::vector<MeshCore::MeshGeomFacet> & facets);
|
||||
int TesselTop(int x, int y);
|
||||
int TesselBot(int x, int y);
|
||||
int TesselSidesX(int yp);
|
||||
@@ -191,7 +161,8 @@ private:
|
||||
float m_res; // resoulution
|
||||
float m_plane; // stock plane height
|
||||
int m_x, m_y; // stock array size
|
||||
std::vector<MeshCore::MeshGeomFacet> facets;
|
||||
std::vector<MeshCore::MeshGeomFacet> facetsOuter;
|
||||
std::vector<MeshCore::MeshGeomFacet> facetsInner;
|
||||
};
|
||||
|
||||
class cVolSim
|
||||
|
||||
Reference in New Issue
Block a user