diff --git a/src/Mod/TechDraw/App/Cosmetic.cpp b/src/Mod/TechDraw/App/Cosmetic.cpp index a3feb0332b..3587ee879d 100644 --- a/src/Mod/TechDraw/App/Cosmetic.cpp +++ b/src/Mod/TechDraw/App/Cosmetic.cpp @@ -63,6 +63,10 @@ using namespace TechDraw; using namespace std; +#define GEOMETRYEDGE 0 +#define COSMETICEDGE 1 +#define CENTERLINE 2 + LineFormat::LineFormat() { m_style = getDefEdgeStyle(); @@ -147,7 +151,7 @@ CosmeticVertex::CosmeticVertex() : TechDraw::Vertex() style = 1; visible = true; //TODO: sort out 2x visible variables - Vertex::visible = true; //yuck + hlrVisible = true; //yuck cosmetic = true; createNewTag(); @@ -161,7 +165,7 @@ CosmeticVertex::CosmeticVertex(const TechDraw::CosmeticVertex* cv) : TechDraw::V size = cv->size; style = cv->style; visible = cv->visible; - Vertex::visible = true; //yuck + hlrVisible = true; //yuck cosmetic = true; createNewTag(); @@ -181,7 +185,7 @@ CosmeticVertex::CosmeticVertex(Base::Vector3d loc) : TechDraw::Vertex(loc) size = 30.0; style = 1; //TODO: implement styled vertexes visible = true; - Vertex::visible = true; //yuck + hlrVisible = true; cosmetic = true; createNewTag(); @@ -336,16 +340,16 @@ CosmeticEdge::CosmeticEdge() // Base::Console().Message("CE::CE()\n"); m_geometry = new TechDraw::BaseGeom(); initialize(); + } CosmeticEdge::CosmeticEdge(CosmeticEdge* ce) { // Base::Console().Message("CE::CE(ce)\n"); - //if ce gets deleted later, this CE will have an invalid pointer to geometry! - //need to make our own copy of the geometry TechDraw::BaseGeom* newGeom = ce->m_geometry->copy(); m_geometry = newGeom; m_format = ce->m_format; + initialize(); } CosmeticEdge::CosmeticEdge(Base::Vector3d pt1, Base::Vector3d pt2) @@ -384,11 +388,12 @@ CosmeticEdge::~CosmeticEdge(void) void CosmeticEdge::initialize(void) { m_geometry->classOfEdge = ecHARD; - m_geometry->visible = true; + m_geometry->hlrVisible = true; m_geometry->cosmetic = true; + m_geometry->source(COSMETICEDGE); createNewTag(); - + m_geometry->setCosmeticTag(getTagAsString()); } TechDraw::BaseGeom* CosmeticEdge::scaledGeometry(double scale) @@ -399,8 +404,10 @@ TechDraw::BaseGeom* CosmeticEdge::scaledGeometry(double scale) TopoDS_Edge newEdge = TopoDS::Edge(s); newGeom = TechDraw::BaseGeom::baseFactory(newEdge); newGeom->classOfEdge = ecHARD; - newGeom->visible = true; + newGeom->hlrVisible = true; newGeom->cosmetic = true; + newGeom->source(COSMETICEDGE); + newGeom->setCosmeticTag(getTagAsString()); return newGeom; } @@ -492,6 +499,12 @@ boost::uuids::uuid CosmeticEdge::getTag() const return tag; } +std::string CosmeticEdge::getTagAsString(void) const +{ + std::string tmp = boost::uuids::to_string(getTag()); + return tmp; +} + void CosmeticEdge::createNewTag() { // Initialize a random number generator, to avoid Valgrind false positives. @@ -554,6 +567,8 @@ CenterLine::CenterLine(void) m_type = CLTYPE::FACE; m_flip2Line = false; + m_geometry = new TechDraw::BaseGeom(); + createNewTag(); } @@ -573,13 +588,17 @@ CenterLine::CenterLine(CenterLine* cl) m_edges = cl->m_edges; m_verts = cl->m_verts; + TechDraw::BaseGeom* newGeom = cl->m_geometry->copy(); + m_geometry = newGeom; + m_format = cl->m_format; + createNewTag(); } -CenterLine::CenterLine(Base::Vector3d p1, Base::Vector3d p2) +CenterLine::CenterLine(Base::Vector3d pt1, Base::Vector3d pt2) { - m_start = p1; - m_end = p2; + m_start = pt1; + m_end = pt2; m_mode = CLMODE::VERTICAL; m_hShift = 0.0; m_vShift = 0.0; @@ -588,18 +607,25 @@ CenterLine::CenterLine(Base::Vector3d p1, Base::Vector3d p2) m_type = CLTYPE::FACE; m_flip2Line = false; + Base::Vector3d p1 = DrawUtil::invertY(pt1); + Base::Vector3d p2 = DrawUtil::invertY(pt2); + gp_Pnt gp1(p1.x,p1.y,p1.z); + gp_Pnt gp2(p2.x,p2.y,p2.z); + TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp1, gp2); + m_geometry = TechDraw::BaseGeom::baseFactory(e); + createNewTag(); } -CenterLine::CenterLine(Base::Vector3d p1, Base::Vector3d p2, +CenterLine::CenterLine(Base::Vector3d pt1, Base::Vector3d pt2, int m, double h, double v, double r, double x) { - m_start = p1; - m_end = p2; + m_start = pt1; + m_end = pt2; m_mode = m; m_hShift = h; m_vShift = v; @@ -608,6 +634,14 @@ CenterLine::CenterLine(Base::Vector3d p1, Base::Vector3d p2, m_type = CLTYPE::FACE; m_flip2Line = false; + //not sure this is right? + Base::Vector3d p1 = DrawUtil::invertY(pt1); + Base::Vector3d p2 = DrawUtil::invertY(pt2); + gp_Pnt gp1(p1.x,p1.y,p1.z); + gp_Pnt gp2(p2.x,p2.y,p2.z); + TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp1, gp2); + m_geometry = TechDraw::BaseGeom::baseFactory(e); + createNewTag(); } @@ -712,7 +746,7 @@ TechDraw::BaseGeom* CenterLine::scaledGeometry(TechDraw::DrawViewPart* partFeat) TopoDS_Edge newEdge = TopoDS::Edge(s); newGeom = TechDraw::BaseGeom::baseFactory(newEdge); newGeom->classOfEdge = ecHARD; - newGeom->visible = true; + newGeom->hlrVisible = true; newGeom->cosmetic = true; return newGeom; } @@ -760,6 +794,7 @@ std::pair CenterLine::calcEndPoints(DrawViewPart double hShift, double vShift, double rotate) { + Base::Console().Message("CL::calcEndPoints()\n"); std::pair result; if (faceNames.empty()) { Base::Console().Message("CL::calcEndPoints - no faces!\n"); @@ -862,7 +897,7 @@ std::pair CenterLine::calcEndPoints2Lines(DrawVi double rotate, bool flip) { -// Base::Console().Message("CL::calc2Lines() - mode: %d flip: %d\n", mode, flip); + Base::Console().Message("CL::calc2Lines() - mode: %d flip: %d\n", mode, flip); std::pair result; if (edgeNames.empty()) { Base::Console().Message("CL::calcEndPoints2Lines - no edges!\n"); @@ -957,7 +992,7 @@ std::pair CenterLine::calcEndPoints2Points(DrawV double rotate, bool flip) { -// Base::Console().Message("CL::calc2Points()\n"); + Base::Console().Message("CL::calc2Points()\n"); std::pair result; if (vertNames.empty()) { Base::Console().Message("CL::calcEndPoints2Points - no points!\n"); @@ -1123,6 +1158,22 @@ void CenterLine::Save(Base::Writer &writer) const writer.Stream() << writer.ind() << "" << endl; const char v = m_format.m_visible?'1':'0'; writer.Stream() << writer.ind() << "" << endl; + +//stored geometry + writer.Stream() << writer.ind() << "geomType <<"\"/>" << endl; + if (m_geometry->geomType == TechDraw::GeomType::GENERIC) { + Generic* gen = static_cast(m_geometry); + gen->Save(writer); + } else if (m_geometry->geomType == TechDraw::GeomType::CIRCLE) { + TechDraw::Circle* circ = static_cast(m_geometry); + circ->Save(writer); + } else if (m_geometry->geomType == TechDraw::GeomType::ARCOFCIRCLE) { + TechDraw::AOC* aoc = static_cast(m_geometry); + aoc->Save(writer); + } else { + Base::Console().Message("CE::Save - unimplemented geomType: %d\n", m_geometry->geomType); + } + } void CenterLine::Restore(Base::XMLReader &reader) @@ -1197,6 +1248,30 @@ void CenterLine::Restore(Base::XMLReader &reader) m_format.m_color.fromHexString(temp); reader.readElement("Visible"); m_format.m_visible = (int)reader.getAttributeAsInteger("value")==0?false:true; + +//stored geometry + reader.readElement("GeometryType"); + TechDraw::GeomType gType = (TechDraw::GeomType)reader.getAttributeAsInteger("value"); + if (gType == TechDraw::GeomType::GENERIC) { + TechDraw::Generic* gen = new TechDraw::Generic(); + gen->Restore(reader); + gen->occEdge = GeometryUtils::edgeFromGeneric(gen); + m_geometry = (TechDraw::BaseGeom*) gen; + + } else if (gType == TechDraw::GeomType::CIRCLE) { + TechDraw::Circle* circ = new TechDraw::Circle(); + circ->Restore(reader); + circ->occEdge = GeometryUtils::edgeFromCircle(circ); + m_geometry = (TechDraw::BaseGeom*) circ; + } else if (gType == TechDraw::GeomType::ARCOFCIRCLE) { + TechDraw::AOC* aoc = new TechDraw::AOC(); + aoc->Restore(reader); + aoc->occEdge = GeometryUtils::edgeFromCircleArc(aoc); + m_geometry = (TechDraw::BaseGeom*) aoc; + } else { + Base::Console().Message("CE::Restore - unimplemented geomType: %d\n", gType); + } + } CenterLine* CenterLine::copy(void) const @@ -1228,6 +1303,12 @@ boost::uuids::uuid CenterLine::getTag() const return tag; } +std::string CenterLine::getTagAsString(void) const +{ + std::string tmp = boost::uuids::to_string(getTag()); + return tmp; +} + void CenterLine::createNewTag() { // Initialize a random number generator, to avoid Valgrind false positives. diff --git a/src/Mod/TechDraw/App/Cosmetic.h b/src/Mod/TechDraw/App/Cosmetic.h index ed1534c642..2dbd07abf2 100644 --- a/src/Mod/TechDraw/App/Cosmetic.h +++ b/src/Mod/TechDraw/App/Cosmetic.h @@ -107,7 +107,7 @@ protected: }; -class TechDrawExport CosmeticEdge : public Base::Persistence +class TechDrawExport CosmeticEdge : public Base::Persistence, public TechDraw::BaseGeom { TYPESYSTEM_HEADER(); public: @@ -138,6 +138,7 @@ public: LineFormat m_format; boost::uuids::uuid getTag() const; + virtual std::string getTagAsString(void) const; protected: //Uniqueness @@ -236,8 +237,12 @@ public: LineFormat m_format; bool m_flip2Line; + TechDraw::BaseGeom* m_geometry; + //Uniqueness boost::uuids::uuid getTag() const; + virtual std::string getTagAsString(void) const; + protected: void createNewTag(); void assignTag(const TechDraw::CenterLine* cl); diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 67a7c2b763..8dfec7ed4e 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -1110,6 +1110,7 @@ int DrawViewPart::add1CVToGV(std::string tag) //CosmeticEdges ------------------------------------------------------------------- +//for completeness. not actually used anywhere void DrawViewPart::clearCosmeticEdges(void) { std::vector noEdges; @@ -1120,7 +1121,8 @@ void DrawViewPart::clearCosmeticEdges(void) } } -// adds a cosmetic edge to CEdgeTable and CosmeticEdgeList +// adds a cosmetic edge to CosmeticEdges property +// this should probably return tag instead of index int DrawViewPart::addCosmeticEdge(Base::Vector3d p1, Base::Vector3d p2) { // Base::Console().Message("DVP::addCosmeticEdge(p1,p2)\n"); @@ -1133,9 +1135,11 @@ int DrawViewPart::addCosmeticEdge(Base::Vector3d p1, Base::Vector3d p2) return newIdx; } +// adds a cosmetic edge to CosmeticEdges property +// this should probably return tag instead of index int DrawViewPart::addCosmeticEdge(TopoDS_Edge e) { -// Base::Console().Message("DVP::addCosmeticEdge(p1,p2)\n"); +// Base::Console().Message("DVP::addCosmeticEdge(occ edge)\n"); TechDraw::CosmeticEdge* ce = new TechDraw::CosmeticEdge(e); std::vector edges = CosmeticEdges.getValues(); int newIdx = (int) (edges.size()); @@ -1145,8 +1149,11 @@ int DrawViewPart::addCosmeticEdge(TopoDS_Edge e) return newIdx; } +// adds a cosmetic edge to CosmeticEdges property +// this should probably return tag instead of index int DrawViewPart::addCosmeticEdge(CosmeticEdge* ce) { +// Base::Console().Message("DVP::addCosmeticEdge(%X)\n", ce); std::vector edges = CosmeticEdges.getValues(); int newIdx = (int) (edges.size()); edges.push_back(ce); @@ -1157,25 +1164,16 @@ int DrawViewPart::addCosmeticEdge(CosmeticEdge* ce) void DrawViewPart::removeCosmeticEdge(TechDraw::CosmeticEdge* ce) { - bool found = false; - int i = 0; - std::vector edges = CosmeticEdges.getValues(); - int stop = edges.size(); - for ( ; i < stop; i++) { - TechDraw::CosmeticEdge* e = edges.at(i); - if (ce == e) { - found = true; - break; - } - } - if ( (ce != nullptr) && - (found) ) { - removeCosmeticEdge(i); +// Base::Console().Message("DVP::removeCosmeticEdge(%X)\n", ce); + if (ce != nullptr) { + std::string ceTag = ce->getTagAsString(); + removeCosmeticEdge(ceTag); } } void DrawViewPart::removeCosmeticEdge(int idx) { +// Base::Console().Message("DVP::removeCosmeticEdge(%d) - deprecated. use by tag.\n", idx); std::vector edges = CosmeticEdges.getValues(); if (idx < (int) edges.size()) { edges.erase(edges.begin() + idx); @@ -1184,25 +1182,50 @@ void DrawViewPart::removeCosmeticEdge(int idx) } } -void DrawViewPart::replaceCosmeticEdge(int idx, TechDraw::CosmeticEdge* ce) +void DrawViewPart::removeCosmeticEdge(std::string delTag) { -// Base::Console().Message("DVP::replaceCosmeticEdge(%d, ce)\n", idx); - std::vector edges = CosmeticEdges.getValues(); - if (idx < (int) edges.size()) { - edges.at(idx) = ce; - CosmeticEdges.setValues(edges); - recomputeFeature(); +// Base::Console().Message("DVP::removeCE(%s)\n", delTag.c_str()); + std::vector cEdges = CosmeticEdges.getValues(); + std::vector newEdges; + for (auto& ce: cEdges) { + if (ce->getTagAsString() != delTag) { + newEdges.push_back(ce); + } } + CosmeticEdges.setValues(newEdges); } -void DrawViewPart::replaceCosmeticEdgeByGeom(int geomIndex, TechDraw::CosmeticEdge* ce) +void DrawViewPart::removeCosmeticEdge(std::vector delTags) { - const std::vector &geoms = getEdgeGeometry(); - int source = geoms.at(geomIndex)->source(); - if (source == 1) { //CosmeticEdge - int sourceIndex = geoms.at(geomIndex)->sourceIndex(); - replaceCosmeticEdge(sourceIndex, ce); + std::vector cEdges = CosmeticEdges.getValues(); + std::vector newEdges; + for (auto& ce: cEdges) { + bool found = false; + for (auto& dt: delTags) { + if (ce->getTagAsString() == dt) { + found = true; //this ce is in delete list + break; + } + } + if (!found) { + newEdges.push_back(ce); + } } + CosmeticEdges.setValues(newEdges); +} + +TechDraw::CosmeticEdge* DrawViewPart::getCosmeticEdge(std::string tagString) const +{ +// Base::Console().Message("DVP::getCosmeticEdge(%s)\n", tagString.c_str()); + TechDraw::CosmeticEdge* result = nullptr; + const std::vector cEdges = CosmeticEdges.getValues(); + for (auto& ce: cEdges) { + if (ce->getTagAsString() == tagString) { + result = ce; + break; + } + } + return result; } TechDraw::CosmeticEdge* DrawViewPart::getCosmeticEdgeByIndex(int idx) const @@ -1219,17 +1242,22 @@ TechDraw::CosmeticEdge* DrawViewPart::getCosmeticEdgeByIndex(int idx) const //find the cosmetic edge corresponding to geometry edge idx TechDraw::CosmeticEdge* DrawViewPart::getCosmeticEdgeByGeom(int idx) const { - const std::vector &geoms = getEdgeGeometry(); - int sourceIndex = geoms.at(idx)->sourceIndex(); +// Base::Console().Message("DVP::getCosmeticEdgeByGeom(%d)\n",idx); CosmeticEdge* result = nullptr; - const std::vector edges = CosmeticEdges.getValues(); - result = edges.at(sourceIndex); + BaseGeom* geom = getGeomByIndex(idx); + if (geom == nullptr) { + return result; + } + if (!geom->getCosmeticTag().empty()) { + result = getCosmeticEdge(geom->getCosmeticTag()); + } return result; } //find the index of a cosmetic edge int DrawViewPart::getCosmeticEdgeIndex(TechDraw::CosmeticEdge* ce) const { +// Base::Console().Message("DVP::getCosmeticEdgeIndex(%X) - deprec?\n",ce); int result = -1; const std::vector edges = CosmeticEdges.getValues(); int i = 0; @@ -1243,20 +1271,18 @@ int DrawViewPart::getCosmeticEdgeIndex(TechDraw::CosmeticEdge* ce) const return result; } -//add the cosmetic edges to geometry Edges list +//add the cosmetic edges to geometryObject edges list void DrawViewPart::addCosmeticEdgesToGeom(void) { - int i = 0; const std::vector edges = CosmeticEdges.getValues(); - int stop = (int) edges.size(); - for ( ; i < stop; i++) { - TechDraw::BaseGeom* scaledGeom = edges.at(i)->scaledGeometry(getScale()); + for (auto& ce: edges) { + TechDraw::BaseGeom* scaledGeom = ce->scaledGeometry(getScale()); if (scaledGeom == nullptr) { Base::Console().Error("DVP::addCosmeticEdgesToGeom - scaledGeometry is null\n"); continue; } // int idx = - (void) geometryObject->addCosmeticEdge(scaledGeom, 1, i); + (void) geometryObject->addCosmeticEdge(scaledGeom, 1); } } diff --git a/src/Mod/TechDraw/App/DrawViewPart.h b/src/Mod/TechDraw/App/DrawViewPart.h index debca7063d..c8ba11398e 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.h +++ b/src/Mod/TechDraw/App/DrawViewPart.h @@ -188,17 +188,17 @@ public: int add1CVToGV(int iCV); int add1CVToGV(std::string tag); - virtual int addCosmeticEdge(Base::Vector3d start, Base::Vector3d end); virtual int addCosmeticEdge(TopoDS_Edge e); virtual int addCosmeticEdge(TechDraw::CosmeticEdge*); virtual void removeCosmeticEdge(TechDraw::CosmeticEdge* ce); virtual void removeCosmeticEdge(int idx); + virtual void removeCosmeticEdge(std::string delTag); + virtual void removeCosmeticEdge(std::vector delTags); + TechDraw::CosmeticEdge* getCosmeticEdge(std::string tagString) const; TechDraw::CosmeticEdge* getCosmeticEdgeByIndex(int idx) const; TechDraw::CosmeticEdge* getCosmeticEdgeByGeom(int idx) const; int getCosmeticEdgeIndex(TechDraw::CosmeticEdge* ce) const; - void replaceCosmeticEdge(int idx, TechDraw::CosmeticEdge* ce); - void replaceCosmeticEdgeByGeom(int geomIndex, TechDraw::CosmeticEdge* ce); void clearCosmeticEdges(void); void addCosmeticEdgesToGeom(void); diff --git a/src/Mod/TechDraw/App/DrawViewPartPy.xml b/src/Mod/TechDraw/App/DrawViewPartPy.xml index 91c7efe9d5..f6921ae78a 100644 --- a/src/Mod/TechDraw/App/DrawViewPartPy.xml +++ b/src/Mod/TechDraw/App/DrawViewPartPy.xml @@ -58,11 +58,6 @@ getCosmeticEdgeByGeom(idx) - returns CosmeticEdge using geometry index. - - - replaceCosmeticEdge(idx, ce) - replaces CosmeticEdge[idx] with ce. - - removeCosmeticEdge(idx) - remove CosmeticEdge[idx] from View. Returns None. diff --git a/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp b/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp index c42d83673e..403fd0fbfe 100644 --- a/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp @@ -333,21 +333,21 @@ PyObject* DrawViewPartPy::getCosmeticEdgeByGeom(PyObject *args) return result; } -PyObject* DrawViewPartPy::replaceCosmeticEdge(PyObject *args) -{ -// Base::Console().Message("DVPPI::replaceCosmeticEdge()\n"); - int idx = 0; - PyObject* result = Py_None; - PyObject* pCE; - if (!PyArg_ParseTuple(args, "iO!", &idx, &(TechDraw::CosmeticEdgePy::Type), &pCE)) { - throw Py::TypeError("expected (index, CosmeticEdge)"); - } - TechDraw::CosmeticEdge* ce = static_cast(pCE)->getCosmeticEdgePtr(); - DrawViewPart* dvp = getDrawViewPartPtr(); - dvp->replaceCosmeticEdge(idx, ce); +//PyObject* DrawViewPartPy::replaceCosmeticEdge(PyObject *args) +//{ +//// Base::Console().Message("DVPPI::replaceCosmeticEdge()\n"); +// int idx = 0; +// PyObject* result = Py_None; +// PyObject* pCE; +// if (!PyArg_ParseTuple(args, "iO!", &idx, &(TechDraw::CosmeticEdgePy::Type), &pCE)) { +// throw Py::TypeError("expected (index, CosmeticEdge)"); +// } +// TechDraw::CosmeticEdge* ce = static_cast(pCE)->getCosmeticEdgePtr(); +// DrawViewPart* dvp = getDrawViewPartPtr(); +// dvp->replaceCosmeticEdge(idx, ce); - return result; -} +// return result; +//} PyObject* DrawViewPartPy::removeCosmeticEdge(PyObject *args) { diff --git a/src/Mod/TechDraw/App/Geometry.cpp b/src/Mod/TechDraw/App/Geometry.cpp index 08e3fcda6a..cc8997fad1 100644 --- a/src/Mod/TechDraw/App/Geometry.cpp +++ b/src/Mod/TechDraw/App/Geometry.cpp @@ -82,6 +82,10 @@ using namespace TechDraw; using namespace std; +#define GEOMETRYEDGE 0 +#define COSMETICEDGE 1 +#define CENTERLINE 2 + // Collection of Geometric Features Wire::Wire() { @@ -116,13 +120,14 @@ BaseGeom::BaseGeom() : geomType(NOTDEF), extractType(Plain), //obs classOfEdge(ecNONE), - visible(true), + hlrVisible(true), reversed(false), ref3D(-1), //obs? cosmetic(false), m_source(0), m_sourceIndex(-1) { + cosmeticTag = std::string(); } BaseGeom* BaseGeom::copy() @@ -133,12 +138,13 @@ BaseGeom* BaseGeom::copy() if (result != nullptr) { result->extractType = extractType; result->classOfEdge = classOfEdge; - result->visible = visible; + result->hlrVisible = hlrVisible; result->reversed = reversed; result->ref3D = ref3D; result->cosmetic = cosmetic; result->source(m_source); result->sourceIndex(m_sourceIndex); + result->cosmeticTag = cosmeticTag; } } @@ -151,7 +157,7 @@ std::string BaseGeom::toString(void) const ss << geomType << "," << extractType << "," << classOfEdge << "," << - visible << "," << + hlrVisible << "," << reversed << "," << ref3D << "," << cosmetic << "," << @@ -160,38 +166,24 @@ std::string BaseGeom::toString(void) const return ss.str(); } -//bool BaseGeom::fromCSV(std::string lineSpec) -//{ -// unsigned int maxCells = 9; -// if (lineSpec.length() == 0) { -// Base::Console().Message( "BG::fromCSV - lineSpec empty\n"); -// return false; -// } -// std::vector values = DrawUtil::split(lineSpec); -// if (values.size() < maxCells) { -// Base::Console().Message( "BG::fromCSV(%s) invalid CSV entry\n",lineSpec.c_str() ); -// return false; -// } +boost::uuids::uuid BaseGeom::getTag() const +{ + return tag; +} -// geomType = (TechDraw::GeomType) atoi(values[0].c_str()); -// extractType = (TechDraw::ExtractionType) atoi(values[1].c_str()); -// classOfEdge = (TechDraw::edgeClass) atoi(values[2].c_str()); -// visible = (bool) atoi(values[3].c_str()); -// reversed = (bool) atoi(values[4].c_str()); -// ref3D = atoi(values[5].c_str()); -// cosmetic = (bool) atoi(values[6].c_str()); -// m_source = atoi(values[7].c_str()); -// m_sourceIndex = atoi(values[8].c_str()); -// return true; -//} +std::string BaseGeom::getTagAsString(void) const +{ + std::string tmp = boost::uuids::to_string(getTag()); + return tmp; +} void BaseGeom::Save(Base::Writer &writer) const { writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; - const char v = visible?'1':'0'; - writer.Stream() << writer.ind() << "" << endl; + const char v = hlrVisible?'1':'0'; + writer.Stream() << writer.ind() << "" << endl; const char r = reversed?'1':'0'; writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; @@ -199,6 +191,8 @@ void BaseGeom::Save(Base::Writer &writer) const writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; + writer.Stream() << writer.ind() << "" << endl; +// writer.Stream() << writer.ind() << "" << endl; } void BaseGeom::Restore(Base::XMLReader &reader) @@ -209,8 +203,8 @@ void BaseGeom::Restore(Base::XMLReader &reader) extractType = (TechDraw::ExtractionType) reader.getAttributeAsInteger("value"); reader.readElement("EdgeClass"); classOfEdge = (TechDraw::edgeClass) reader.getAttributeAsInteger("value"); - reader.readElement("Visible"); - visible = (int)reader.getAttributeAsInteger("value")==0?false:true; + reader.readElement("HLRVisible"); + hlrVisible = (int)reader.getAttributeAsInteger("value")==0?false:true; reader.readElement("Reversed"); reversed = (int)reader.getAttributeAsInteger("value")==0?false:true; reader.readElement("Ref3D"); @@ -221,6 +215,13 @@ void BaseGeom::Restore(Base::XMLReader &reader) m_source = reader.getAttributeAsInteger("value"); reader.readElement("SourceIndex"); m_sourceIndex = reader.getAttributeAsInteger("value"); + reader.readElement("CosmeticTag"); + cosmeticTag = reader.getAttribute("value"); +// reader.readElement("Tag"); +// std::string temp = reader.getAttribute("value"); +// boost::uuids::string_generator gen; +// boost::uuids::uuid u1 = gen(temp); +// tag = u1; } std::vector BaseGeom::findEndPoints() @@ -352,7 +353,7 @@ std::string BaseGeom::dump() Base::Vector3d end = getEndPoint(); std::stringstream ss; ss << "BaseGeom: s:(" << start.x << "," << start.y << ") e:(" << end.x << "," << end.y << ") "; - ss << "type: " << geomType << " class: " << classOfEdge << " viz: " << visible << " rev: " << reversed; + ss << "type: " << geomType << " class: " << classOfEdge << " viz: " << hlrVisible << " rev: " << reversed; ss << "cosmetic: " << cosmetic << " source: " << source() << " iSource: " << sourceIndex(); return ss.str(); } @@ -1303,7 +1304,7 @@ Vertex::Vertex() { pnt = Base::Vector3d(0.0, 0.0, 0.0); extractType = ExtractionType::Plain; //obs? - visible = false; + hlrVisible = false; ref3D = -1; //obs. never used. isCenter = false; BRepBuilderAPI_MakeVertex mkVert(gp_Pnt(0.0, 0.0, 0.0)); @@ -1311,26 +1312,28 @@ Vertex::Vertex() cosmetic = false; cosmeticLink = -1; cosmeticTag = std::string(); + createNewTag(); } Vertex::Vertex(const Vertex* v) { pnt = v->pnt; extractType = v->extractType; //obs? - visible = v->visible; + hlrVisible = v->hlrVisible; ref3D = v->ref3D; //obs. never used. isCenter = v->isCenter; occVertex = v->occVertex; cosmetic = v->cosmetic; cosmeticLink = v->cosmeticLink; cosmeticTag = v->cosmeticTag; + createNewTag(); } Vertex::Vertex(double x, double y) { pnt = Base::Vector3d(x, y, 0.0); extractType = ExtractionType::Plain; //obs? - visible = false; + hlrVisible = false; ref3D = -1; //obs. never used. isCenter = false; BRepBuilderAPI_MakeVertex mkVert(gp_Pnt(x,y,0.0)); @@ -1338,6 +1341,7 @@ Vertex::Vertex(double x, double y) cosmetic = false; cosmeticLink = -1; cosmeticTag = std::string(); + createNewTag(); } Vertex::Vertex(Base::Vector3d v) : Vertex(v.x,v.y) @@ -1366,8 +1370,8 @@ void Vertex::Save(Base::Writer &writer) const "\"/>" << endl; writer.Stream() << writer.ind() << "" << endl; - const char v = visible?'1':'0'; - writer.Stream() << writer.ind() << "" << endl; + const char v = hlrVisible?'1':'0'; + writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; const char c = isCenter?'1':'0'; writer.Stream() << writer.ind() << "" << endl; @@ -1375,7 +1379,7 @@ void Vertex::Save(Base::Writer &writer) const writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; writer.Stream() << writer.ind() << "" << endl; - writer.Stream() << writer.ind() << "" << endl; + writer.Stream() << writer.ind() << "" << endl; } void Vertex::Restore(Base::XMLReader &reader) @@ -1387,19 +1391,19 @@ void Vertex::Restore(Base::XMLReader &reader) reader.readElement("Extract"); extractType = (ExtractionType) reader.getAttributeAsInteger("value"); - reader.readElement("Visible"); - visible = (bool)reader.getAttributeAsInteger("value")==0?false:true; +// reader.readElement("Visible"); +// hlrVisible = (bool)reader.getAttributeAsInteger("value")==0?false:true; reader.readElement("Ref3D"); ref3D = reader.getAttributeAsInteger("value"); reader.readElement("IsCenter"); - visible = (bool)reader.getAttributeAsInteger("value")==0?false:true; + hlrVisible = (bool)reader.getAttributeAsInteger("value")==0?false:true; reader.readElement("Cosmetic"); cosmetic = (bool)reader.getAttributeAsInteger("value")==0?false:true; reader.readElement("CosmeticLink"); cosmeticLink = reader.getAttributeAsInteger("value"); reader.readElement("CosmeticTag"); cosmeticTag = reader.getAttribute("value"); - reader.readElement("Tag"); + reader.readElement("VertexTag"); std::string temp = reader.getAttribute("value"); boost::uuids::string_generator gen; boost::uuids::uuid u1 = gen(temp); @@ -1409,6 +1413,22 @@ void Vertex::Restore(Base::XMLReader &reader) occVertex = mkVert.Vertex(); } +void Vertex::createNewTag() +{ + // Initialize a random number generator, to avoid Valgrind false positives. + static boost::mt19937 ran; + static bool seeded = false; + + if (!seeded) { + ran.seed(static_cast(std::time(0))); + seeded = true; + } + static boost::uuids::basic_random_generator gen(&ran); + + tag = gen(); +} + + boost::uuids::uuid Vertex::getTag() const { return tag; @@ -1420,10 +1440,18 @@ std::string Vertex::getTagAsString(void) const return tmp; } +//void Vertex::assignTag(const TechDraw::Vertex* v) +//{ +// if(v->getTypeId() == this->getTypeId()) +// this->tag = v->tag; +// else +// throw Base::TypeError("Vertex tag can not be assigned as types do not match."); +//} + void Vertex::dump() { Base::Console().Message("TD::Vertex point: %s vis: %d cosmetic: %d cosLink: %d cosTag: %s\n", - DrawUtil::formatVector(pnt).c_str(), visible, cosmetic, cosmeticLink, + DrawUtil::formatVector(pnt).c_str(), hlrVisible, cosmetic, cosmeticLink, cosmeticTag.c_str()); } diff --git a/src/Mod/TechDraw/App/Geometry.h b/src/Mod/TechDraw/App/Geometry.h index df5ca43273..5c86ee369e 100644 --- a/src/Mod/TechDraw/App/Geometry.h +++ b/src/Mod/TechDraw/App/Geometry.h @@ -81,7 +81,7 @@ class TechDrawExport BaseGeom GeomType geomType; ExtractionType extractType; //obs edgeClass classOfEdge; - bool visible; + bool hlrVisible; bool reversed; int ref3D; //obs? TopoDS_Edge occEdge; //projected Edge @@ -90,6 +90,8 @@ class TechDrawExport BaseGeom void source(int s) { m_source = s; } int sourceIndex(void) { return m_sourceIndex; } void sourceIndex(int si) { m_sourceIndex = si; } + std::string getCosmeticTag(void) { return cosmeticTag; } + void setCosmeticTag(std::string t) { cosmeticTag = t; } virtual std::string toString(void) const; /* virtual bool fromCSV(std::string s);*/ @@ -108,10 +110,19 @@ class TechDrawExport BaseGeom BaseGeom* copy(); std::string dump(); - protected: + //Uniqueness + boost::uuids::uuid getTag() const; + virtual std::string getTagAsString(void) const; + +protected: int m_source; //0 - geom, 1 - cosmetic edge, 2 - centerline int m_sourceIndex; + std::string cosmeticTag; + void createNewTag(); +/* void assignTag(const TechDraw::BaseGeom* bg);*/ + + boost::uuids::uuid tag; }; typedef std::vector BaseGeomPtrVector; //obs? @@ -294,7 +305,7 @@ class TechDrawExport Vertex Base::Vector3d pnt; ExtractionType extractType; //obs? - bool visible; + bool hlrVisible; //visible according to HLR int ref3D; //obs. never used. bool isCenter; TopoDS_Vertex occVertex; diff --git a/src/Mod/TechDraw/App/GeometryObject.cpp b/src/Mod/TechDraw/App/GeometryObject.cpp index 7a219621d0..9cab71e0a5 100644 --- a/src/Mod/TechDraw/App/GeometryObject.cpp +++ b/src/Mod/TechDraw/App/GeometryObject.cpp @@ -109,7 +109,7 @@ const std::vector GeometryObject::getVisibleFaceEdges(const bool smo bool seamOK = seam; for (auto& e:edgeGeom) { - if (e->visible) { + if (e->hlrVisible) { switch (e->classOfEdge) { case ecHARD: case ecOUTLINE: @@ -334,11 +334,11 @@ void GeometryObject::projectShapeWithPolygonAlgo(const TopoDS_Shape& input, } //!add edges meeting filter criteria for category, visibility -void GeometryObject::extractGeometry(edgeClass category, bool visible) +void GeometryObject::extractGeometry(edgeClass category, bool hlrVisible) { -// Base::Console().Message("GO::extractGeometry(%d, %d)\n",category, visible); +// Base::Console().Message("GO::extractGeometry(%d, %d)\n",category, hlrVisible); TopoDS_Shape filtEdges; - if (visible) { + if (hlrVisible) { switch (category) { case ecHARD: filtEdges = visHard; @@ -356,7 +356,7 @@ void GeometryObject::extractGeometry(edgeClass category, bool visible) filtEdges = visIso; break; default: - Base::Console().Warning("GeometryObject::ExtractGeometry - unsupported visible edgeClass: %d\n",category); + Base::Console().Warning("GeometryObject::ExtractGeometry - unsupported hlrVisible edgeClass: %d\n",category); return; } } else { @@ -382,11 +382,11 @@ void GeometryObject::extractGeometry(edgeClass category, bool visible) } } - addGeomFromCompound(filtEdges, category, visible); + addGeomFromCompound(filtEdges, category, hlrVisible); } //! update edgeGeom and vertexGeom from Compound of edges -void GeometryObject::addGeomFromCompound(TopoDS_Shape edgeCompound, edgeClass category, bool visible) +void GeometryObject::addGeomFromCompound(TopoDS_Shape edgeCompound, edgeClass category, bool hlrVisible) { // Base::Console().Message("GO::addGeomFromCompound()\n"); if(edgeCompound.IsNull()) { @@ -416,11 +416,11 @@ void GeometryObject::addGeomFromCompound(TopoDS_Shape edgeCompound, edgeClass ca base->source(0); //object geometry base->sourceIndex(i-1); base->classOfEdge = category; - base->visible = visible; + base->hlrVisible = hlrVisible; edgeGeom.push_back(base); //add vertices of new edge if not already in list - if (visible) { + if (hlrVisible) { BaseGeom* lastAdded = edgeGeom.back(); bool v1Add = true, v2Add = true; bool c1Add = true; @@ -431,7 +431,7 @@ void GeometryObject::addGeomFromCompound(TopoDS_Shape edgeCompound, edgeClass ca if (circle) { c1 = new TechDraw::Vertex(circle->center); c1->isCenter = true; - c1->visible = true; + c1->hlrVisible = true; } std::vector::iterator itVertex = vertexGeom.begin(); @@ -451,13 +451,13 @@ void GeometryObject::addGeomFromCompound(TopoDS_Shape edgeCompound, edgeClass ca } if (v1Add) { vertexGeom.push_back(v1); - v1->visible = true; + v1->hlrVisible = true; } else { delete v1; } if (v2Add) { vertexGeom.push_back(v2); - v2->visible = true; + v2->hlrVisible = true; } else { delete v2; } @@ -465,7 +465,7 @@ void GeometryObject::addGeomFromCompound(TopoDS_Shape edgeCompound, edgeClass ca if (circle) { if (c1Add) { vertexGeom.push_back(c1); - c1->visible = true; + c1->hlrVisible = true; } else { delete c1; } @@ -482,7 +482,7 @@ int GeometryObject::addCosmeticVertex(Base::Vector3d pos, int link) v->cosmetic = true; v->cosmeticLink = link; v->cosmeticTag = "tbi"; - v->visible = true; + v->hlrVisible = true; int idx = vertexGeom.size(); vertexGeom.push_back(v); return idx; @@ -495,18 +495,18 @@ int GeometryObject::addCosmeticVertex(Base::Vector3d pos, std::string tagString, v->cosmetic = true; v->cosmeticLink = link; v->cosmeticTag = tagString; - v->visible = true; + v->hlrVisible = true; int idx = vertexGeom.size(); vertexGeom.push_back(v); return idx; } +//do not need source index anymore. base has CosmeticTag int GeometryObject::addCosmeticEdge(TechDraw::BaseGeom* base, - int s, int si) + int s) { base->cosmetic = true; base->source(s); //1-CosmeticEdge, 2-CenterLine - base->sourceIndex(si); //index into source; edgeGeom.push_back(base); int idx = edgeGeom.size() - 1; diff --git a/src/Mod/TechDraw/App/GeometryObject.h b/src/Mod/TechDraw/App/GeometryObject.h index 1dc52e6785..38163831af 100644 --- a/src/Mod/TechDraw/App/GeometryObject.h +++ b/src/Mod/TechDraw/App/GeometryObject.h @@ -136,7 +136,7 @@ public: //Are removeXXXXX functions really needed for GO? int addCosmeticVertex(Base::Vector3d pos, int link = -1); int addCosmeticVertex(Base::Vector3d pos, std::string tagString, int link = -1); - int addCosmeticEdge(TechDraw::BaseGeom* bg, int s = 0, int si = -1); + int addCosmeticEdge(TechDraw::BaseGeom* bg, int s = 0); int addCenterLine(TechDraw::BaseGeom* bg, int s = 0, int si = -1); protected: diff --git a/src/Mod/TechDraw/Gui/CommandAnnotate.cpp b/src/Mod/TechDraw/Gui/CommandAnnotate.cpp index 20310efd85..dae71372a9 100644 --- a/src/Mod/TechDraw/Gui/CommandAnnotate.cpp +++ b/src/Mod/TechDraw/Gui/CommandAnnotate.cpp @@ -1015,20 +1015,27 @@ void CmdTechDrawCosmeticEraser::activated(int iMsg) objFeat = static_cast ((*itSel).getObject()); subNames = (*itSel).getSubNames(); } + if (objFeat == nullptr) { + break; + } std::vector cv2Delete; - std::vector ce2Delete; + std::vector ce2Delete; std::vector cl2Delete; for (auto& s: subNames) { int idx = TechDraw::DrawUtil::getIndexFromName(s); std::string geomType = TechDraw::DrawUtil::getGeomTypeFromName(s); if (geomType == "Edge") { TechDraw::BaseGeom* bg = objFeat->getGeomByIndex(idx); + Base::Console().Message("CMD::Eraser - have an edge: %s - bg: %X\n", s.c_str(), bg); if ((bg != nullptr) && (bg->cosmetic) ) { + Base::Console().Message("CMD::Eraser - cos: %d source: %d tag: %s\n", + bg->cosmetic, bg->sourceIndex(), bg->getCosmeticTag().c_str()); int source = bg->source(); int sourceIndex = bg->sourceIndex(); + std::string tag = bg->getCosmeticTag(); if (source == 1) { //this is a "CosmeticEdge" - ce2Delete.push_back(sourceIndex); + ce2Delete.push_back(tag); } else if (source == 2) { //this is a "CenterLine" cl2Delete.push_back(sourceIndex); } else { @@ -1037,15 +1044,13 @@ void CmdTechDrawCosmeticEraser::activated(int iMsg) } } } else if (geomType == "Vertex") { - //TODO: delete by tag TechDraw::Vertex* tdv = objFeat->getProjVertexByIndex(idx); if (tdv != nullptr) { -// int delIndex = tdv->cosmeticLink; std::string delTag = tdv->cosmeticTag; if (!delTag.empty()) { cv2Delete.push_back(delTag); } else { - Base::Console().Message("CMD::eraser - geom: %d has no cv\n", idx); + Base::Console().Warning("Vertex%d is not cosmetic! Can not erase.\n", idx); } } else { Base::Console().Message("CMD::eraser - geom: %d not found!\n", idx); @@ -1058,18 +1063,11 @@ void CmdTechDrawCosmeticEraser::activated(int iMsg) } if (!cv2Delete.empty()) { - for (auto& cvTag: cv2Delete) { - objFeat->removeCosmeticVertex(cvTag); - } - objFeat->enforceRecompute(); + objFeat->removeCosmeticVertex(cv2Delete); } if (!ce2Delete.empty()) { - std::sort(ce2Delete.begin(), ce2Delete.end()); - auto itce = ce2Delete.rbegin(); - for ( ; itce != ce2Delete.rend(); itce++) { - objFeat->removeCosmeticEdge((*itce)); - } + objFeat->removeCosmeticEdge(ce2Delete); } if (!cl2Delete.empty()) { std::sort(cl2Delete.begin(), cl2Delete.end()); @@ -1078,6 +1076,7 @@ void CmdTechDrawCosmeticEraser::activated(int iMsg) objFeat->removeCenterLine((*itcl)); } } + objFeat->recomputeFeature(); } } diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 1bbdd5c7ae..ba091adbab 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -83,6 +83,11 @@ using namespace TechDraw; using namespace TechDrawGui; +#define GEOMETRYEDGE 0 +#define COSMETICEDGE 1 +#define CENTERLINE 2 + + const float lineScaleFactor = Rez::guiX(1.); // temp fiddle for devel QGIViewPart::QGIViewPart() @@ -437,7 +442,7 @@ void QGIViewPart::drawViewPart() QGIEdge* item; for(int i = 0 ; itGeom != geoms.end(); itGeom++, i++) { bool showEdge = false; - if ((*itGeom)->visible) { + if ((*itGeom)->hlrVisible) { if (((*itGeom)->classOfEdge == ecHARD) || ((*itGeom)->classOfEdge == ecOUTLINE) || (((*itGeom)->classOfEdge == ecSMOOTH) && viewPart->SmoothVisible.getValue()) || @@ -463,9 +468,11 @@ void QGIViewPart::drawViewPart() if ((*itGeom)->cosmetic == true) { int source = (*itGeom)->source(); int sourceIndex = (*itGeom)->sourceIndex(); - if (source == 1) { //this is a "CosmeticEdge" - showItem = formatGeomFromCosmetic(sourceIndex, item); - } else if (source == 2) { //this is a "CenterLine" + if (source == COSMETICEDGE) { +// showItem = formatGeomFromCosmetic(sourceIndex, item); + std::string cTag = (*itGeom)->getCosmeticTag(); + showItem = formatGeomFromCosmetic(cTag, item); + } else if (source == CENTERLINE) { showItem = formatGeomFromCenterLine(sourceIndex, item); } else { Base::Console().Message("QGIVP::drawVP - edge: %d is confused - source: %d\n",i,source); @@ -484,7 +491,7 @@ void QGIViewPart::drawViewPart() item->setPos(0.0,0.0); //now at group(0,0) item->setPath(drawPainterPath(*itGeom)); item->setZValue(ZVALUE::EDGE); - if(!(*itGeom)->visible) { + if(!(*itGeom)->hlrVisible) { item->setWidth(lineWidthHid); item->setHiddenEdge(true); item->setZValue(ZVALUE::HIDEDGE); @@ -593,6 +600,22 @@ bool QGIViewPart::formatGeomFromCosmetic(int sourceIndex, QGIEdge* item) return result; } +bool QGIViewPart::formatGeomFromCosmetic(std::string cTag, QGIEdge* item) +{ +// Base::Console().Message("QGIVP::formatGeomFromCosmetic(%s)\n", cTag.c_str()); + bool result = true; + auto partFeat( dynamic_cast(getViewObject()) ); + TechDraw::CosmeticEdge* ce = partFeat->getCosmeticEdge(cTag); + if (ce != nullptr) { + item->setNormalColor(ce->m_format.m_color.asValue()); + item->setWidth(ce->m_format.m_weight * lineScaleFactor); + item->setStyle(ce->m_format.m_style); + result = ce->m_format.m_visible; + } + return result; +} + + bool QGIViewPart::formatGeomFromCenterLine(int sourceIndex, QGIEdge* item) { // Base::Console().Message("QGIVP::formatGeomFromCenterLine(%d)\n",sourceIndex); diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.h b/src/Mod/TechDraw/Gui/QGIViewPart.h index 60f8d42b41..fd8030e66d 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.h +++ b/src/Mod/TechDraw/Gui/QGIViewPart.h @@ -106,11 +106,10 @@ protected: bool prefFaceEdges(void); bool prefPrintCenters(void); - bool formatGeomFromCosmetic(int sourceIndex, QGIEdge* item); + bool formatGeomFromCosmetic(std::string cTag, QGIEdge* item); bool formatGeomFromCenterLine(int sourceIndex, QGIEdge* item); - private: QList deleteItems; };