From 9bdf964be3e4987830d2edca75c3bb3d1cbc7bbb Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Thu, 29 Apr 2010 07:42:33 +0000 Subject: [PATCH] more work on new cad creation stuff --- Geo/GModel.cpp | 25 +++++++++++-------------- Geo/GModel.h | 5 +++-- Geo/GModelFactory.cpp | 27 +++++++++++++++++++-------- Geo/GModelFactory.h | 16 ++++++++-------- benchmarks/boolean/square2.lua | 10 +--------- benchmarks/boolean/wikipedia.lua | 1 + 6 files changed, 43 insertions(+), 41 deletions(-) diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index 4f953e58b3..e7b7f1590a 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -1461,19 +1461,17 @@ GEdge *GModel::addBezier(GVertex *start, GVertex *end, return 0; } -GEntity *GModel::revolve(GEntity *e, double angle, fullMatrix<double> *axis) +GEntity *GModel::revolve(GEntity *e, std::vector<double> p1, std::vector<double> p2, double angle) { if(_factory) - return _factory->revolve(this, e, (*axis)(0, 0), (*axis)(0, 1), (*axis)(0, 2), - (*axis)(1, 0), (*axis)(1, 1), (*axis)(1, 2), angle); + return _factory->revolve(this, e, p1, p2, angle); return 0; } -GEntity *GModel::extrude(GEntity *e, fullMatrix<double> *axis) +GEntity *GModel::extrude(GEntity *e, std::vector<double> p1, std::vector<double> p2) { if(_factory) - return _factory->extrude(this, e, (*axis)(0, 0), (*axis)(0, 1), (*axis)(0, 2), - (*axis)(1, 0), (*axis)(1, 1), (*axis)(1, 2)); + return _factory->extrude(this, e, p1, p2); return 0; } @@ -1833,13 +1831,11 @@ void GModel::registerBindings(binding *b) cm->setArgNames("x", "y", "z", "v1", "v2", NULL); cm = cb->addMethod("revolve", &GModel::revolve); cm->setDescription("revolve an entity of a given angle. Axis is defined by 2 " - "points " - "in a full Matrix(2,3)"); - cm->setArgNames("entity", "angle", "axis", NULL); + "points"); + cm->setArgNames("entity", "{x1,y1,z1}", "{x2,y2,z2}", "angle", NULL); cm = cb->addMethod("extrude", &GModel::extrude); - cm->setDescription("extrudes an entity. Axis is defined by 2 points in a full " - "Matrix(2,3)"); - cm->setArgNames("entity", "axis", NULL); + cm->setDescription("extrudes an entity. Axis is defined by 2 points"); + cm->setArgNames("entity", "{x1,y1,z1}", "{x2,y2,z2}", NULL); cm = cb->addMethod("addSphere", &GModel::addSphere); cm->setDescription("add a sphere"); cm->setArgNames("xc", "yc", "zc", "radius", NULL); @@ -1871,8 +1867,9 @@ void GModel::registerBindings(binding *b) cm->setArgNames("tool","createNewGModel",NULL); cm = cb->addMethod("glue", &GModel::glue); cm->setDescription("glue the geometric model using geometric tolerance eps"); - cm->setArgNames("eps", NULL); - + cm->setArgNames("eps",NULL); + cm = cb->addMethod("setAsCurrent", &GModel::setAsCurrent); + cm->setDescription("set the model as the current (active) one"); cm = cb->setConstructor<GModel>(); cm->setDescription("Create an empty GModel"); } diff --git a/Geo/GModel.h b/Geo/GModel.h index 9d70d4563c..65d2af4850 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -133,6 +133,7 @@ class GModel // sets a model to current static int setCurrent(GModel *m); + int setAsCurrent(){ return setCurrent(this); } // find a model by name static GModel *findByName(std::string name); @@ -354,8 +355,8 @@ class GModel GEdge *addCircleArcCenter(double x, double y, double z, GVertex *start, GVertex *end); GEdge *addCircleArc3Points(double x, double y, double z, GVertex *start, GVertex *end); GEdge *addBezier(GVertex *start, GVertex *end, fullMatrix<double> *controlPoints); - GEntity *revolve(GEntity *e, double angle, fullMatrix<double> *axis); - GEntity *extrude(GEntity *e, fullMatrix<double> *axis); + GEntity *revolve(GEntity *e, std::vector<double> p1, std::vector<double> p2, double angle); + GEntity *extrude(GEntity *e, std::vector<double> p1, std::vector<double> p2); // create solid geometry primitives using the factory GEntity *addSphere(double cx, double cy, double cz, double radius); diff --git a/Geo/GModelFactory.cpp b/Geo/GModelFactory.cpp index 1ef30f0b8d..cc89b6f58e 100644 --- a/Geo/GModelFactory.cpp +++ b/Geo/GModelFactory.cpp @@ -98,7 +98,7 @@ GEdge *OCCFactory::addSpline(GModel *gm, const splineType &type, OCCEdge *occEd = 0; int nbControlPoints = points->size1(); - TColgp_Array1OfPnt ctrlPoints (1, nbControlPoints + 2); + TColgp_Array1OfPnt ctrlPoints(1, nbControlPoints + 2); int index = 1; ctrlPoints.SetValue(index++, gp_Pnt(start->x(), start->y(), start->z())); for (int i = 0; i < nbControlPoints; i++) { @@ -115,14 +115,19 @@ GEdge *OCCFactory::addSpline(GModel *gm, const splineType &type, return 0; } -GEntity *OCCFactory::revolve(GModel *gm, GEntity* base, - double x1, double y1, double z1, - double x2, double y2, double z2, - double angle) +GEntity *OCCFactory::revolve(GModel *gm, GEntity* base, std::vector<double> p1, + std::vector<double> p2, double angle) { if (!gm->_occ_internals) gm->_occ_internals = new OCC_Internals; + const double x1 = p1[0]; + const double y1 = p1[1]; + const double z1 = p1[2]; + const double x2 = p2[0]; + const double y2 = p2[1]; + const double z2 = p2[2]; + gp_Dir direction(x2 - x1, y2 - y1, z2 - z1); gp_Ax1 axisOfRevolution(gp_Pnt(x1, y1, z1), direction); BRepPrimAPI_MakeRevol MR(*(TopoDS_Shape*)base->getNativePtr(), @@ -144,13 +149,19 @@ GEntity *OCCFactory::revolve(GModel *gm, GEntity* base, return ret; } -GEntity *OCCFactory::extrude(GModel *gm, GEntity* base, - double x1, double y1, double z1, - double x2, double y2, double z2) +GEntity *OCCFactory::extrude(GModel *gm, GEntity* base, std::vector<double> p1, + std::vector<double> p2) { if (!gm->_occ_internals) gm->_occ_internals = new OCC_Internals; + const double x1 = p1[0]; + const double y1 = p1[1]; + const double z1 = p1[2]; + const double x2 = p2[0]; + const double y2 = p2[1]; + const double z2 = p2[2]; + gp_Vec direction(gp_Pnt(x1, y1, z1), gp_Pnt(x2, y2, z2)); gp_Ax1 axisOfRevolution(gp_Pnt(x1, y1, z1), direction); diff --git a/Geo/GModelFactory.h b/Geo/GModelFactory.h index 218ae2cc87..c4bbbc28ba 100644 --- a/Geo/GModelFactory.h +++ b/Geo/GModelFactory.h @@ -34,10 +34,10 @@ class GModelFactory { virtual GEdge *addSpline(GModel *gm, const splineType &type, GVertex *start, GVertex *end, fullMatrix<double> *controlPoints) = 0; - virtual GEntity *revolve(GModel *gm, GEntity*, double x1, double y1, double z1, - double x2, double y2, double z2, double angle) = 0; - virtual GEntity *extrude(GModel *gm, GEntity*, double x1, double y1, double z1, - double x2, double y2, double z2) = 0; + virtual GEntity *revolve(GModel *gm, GEntity*, std::vector<double> p1, + std::vector<double> p2, double angle) = 0; + virtual GEntity *extrude(GModel *gm, GEntity*, std::vector<double> p1, + std::vector<double> p2) = 0; // solid primitives virtual GEntity *addSphere(GModel *gm, double cx, double cy, double cz, @@ -77,10 +77,10 @@ class OCCFactory : public GModelFactory { virtual GEdge *addSpline(GModel *gm, const splineType &type, GVertex *start, GVertex *end, fullMatrix<double> *controlPoints); - virtual GEntity *revolve(GModel *gm, GEntity*, double x1, double y1, double z1, - double x2, double y2, double z2, double angle); - virtual GEntity *extrude(GModel *gm, GEntity*, double x1, double y1, double z1, - double x2, double y2, double z2); + virtual GEntity *revolve(GModel *gm, GEntity*, std::vector<double> p1, + std::vector<double> p2, double angle); + virtual GEntity *extrude(GModel *gm, GEntity*, std::vector<double> p1, + std::vector<double> p2); virtual GEntity *addSphere(GModel *gm, double cx, double cy, double cz, double radius) ; virtual GEntity *addCylinder(GModel *gm, std::vector<double> p1, diff --git a/benchmarks/boolean/square2.lua b/benchmarks/boolean/square2.lua index ff0236efcd..32d2c748c3 100644 --- a/benchmarks/boolean/square2.lua +++ b/benchmarks/boolean/square2.lua @@ -3,13 +3,5 @@ g = GModel() v1 = g:addVertex(0, 0, 0, 1) v2 = g:addVertex(1, 0, 0, 1) e1 = g:addLine(v1, v2) - -dir = fullMatrix(2,3) -dir:set(0,0, 0); -dir:set(0,1, 0); -dir:set(0,2, 0); -dir:set(1,0, 0); -dir:set(1,1, 1); -dir:set(1,2, 0); -f1 = g:extrude(e1, dir) +f1 = g:extrude(e1, {0,0,0}, {0,1,0}) diff --git a/benchmarks/boolean/wikipedia.lua b/benchmarks/boolean/wikipedia.lua index b6494b4320..bd1ee4e9b5 100644 --- a/benchmarks/boolean/wikipedia.lua +++ b/benchmarks/boolean/wikipedia.lua @@ -24,3 +24,4 @@ myModel2:computeUnion(myTool2,0); myModel2:computeUnion(myTool3,0); myModel:computeDifference(myModel2,0); +myModel:setAsCurrent(); -- GitLab