diff --git a/src/Mod/TechDraw/App/Cosmetic.cpp b/src/Mod/TechDraw/App/Cosmetic.cpp index 3587ee879d..309b594a5b 100644 --- a/src/Mod/TechDraw/App/Cosmetic.cpp +++ b/src/Mod/TechDraw/App/Cosmetic.cpp @@ -455,7 +455,7 @@ void CosmeticEdge::Save(Base::Writer &writer) const TechDraw::AOC* aoc = static_cast(m_geometry); aoc->Save(writer); } else { - Base::Console().Message("CE::Save - unimplemented geomType: %d\n", m_geometry->geomType); + Base::Console().Warning("CE::Save - unimplemented geomType: %d\n", m_geometry->geomType); } } @@ -490,7 +490,7 @@ void CosmeticEdge::Restore(Base::XMLReader &reader) aoc->occEdge = GeometryUtils::edgeFromCircleArc(aoc); m_geometry = (TechDraw::BaseGeom*) aoc; } else { - Base::Console().Message("CE::Restore - unimplemented geomType: %d\n", gType); + Base::Console().Warning("CE::Restore - unimplemented geomType: %d\n", gType); } } @@ -569,7 +569,7 @@ CenterLine::CenterLine(void) m_geometry = new TechDraw::BaseGeom(); - createNewTag(); + initialize(); } CenterLine::CenterLine(CenterLine* cl) @@ -590,9 +590,10 @@ CenterLine::CenterLine(CenterLine* cl) TechDraw::BaseGeom* newGeom = cl->m_geometry->copy(); m_geometry = newGeom; - m_format = cl->m_format; - createNewTag(); + initialize(); + + m_format = cl->m_format; } CenterLine::CenterLine(Base::Vector3d pt1, Base::Vector3d pt2) @@ -614,7 +615,7 @@ CenterLine::CenterLine(Base::Vector3d pt1, Base::Vector3d pt2) TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp1, gp2); m_geometry = TechDraw::BaseGeom::baseFactory(e); - createNewTag(); + initialize(); } CenterLine::CenterLine(Base::Vector3d pt1, Base::Vector3d pt2, @@ -642,13 +643,24 @@ CenterLine::CenterLine(Base::Vector3d pt1, Base::Vector3d pt2, TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp1, gp2); m_geometry = TechDraw::BaseGeom::baseFactory(e); - createNewTag(); + initialize(); } CenterLine::~CenterLine() { } +void CenterLine::initialize() +{ + m_geometry->classOfEdge = ecHARD; + m_geometry->hlrVisible = true; + m_geometry->cosmetic = true; + m_geometry->source(CENTERLINE); + + createNewTag(); + m_geometry->setCosmeticTag(getTagAsString()); +} + CenterLine* CenterLine::CenterLineBuilder(DrawViewPart* partFeat, std::vector subNames, int mode, @@ -717,25 +729,32 @@ TechDraw::BaseGeom* CenterLine::scaledGeometry(TechDraw::DrawViewPart* partFeat) } std::pair ends; - if (m_type == CLTYPE::FACE) { - ends = calcEndPoints(partFeat, - m_faces, - m_mode, m_extendBy, - m_hShift,m_vShift, m_rotate); - } else if (m_type == CLTYPE::EDGE) { - ends = calcEndPoints2Lines(partFeat, - m_edges, - m_mode, - m_extendBy, - m_hShift, m_vShift, m_rotate, m_flip2Line); - } else if (m_type == CLTYPE::VERTEX) { - ends = calcEndPoints2Points(partFeat, - m_verts, - m_mode, - m_extendBy, - m_hShift, m_vShift, m_rotate, m_flip2Line); + try { + if (m_type == CLTYPE::FACE) { + ends = calcEndPoints(partFeat, + m_faces, + m_mode, m_extendBy, + m_hShift,m_vShift, m_rotate); + } else if (m_type == CLTYPE::EDGE) { + ends = calcEndPoints2Lines(partFeat, + m_edges, + m_mode, + m_extendBy, + m_hShift, m_vShift, m_rotate, m_flip2Line); + } else if (m_type == CLTYPE::VERTEX) { + ends = calcEndPoints2Points(partFeat, + m_verts, + m_mode, + m_extendBy, + m_hShift, m_vShift, m_rotate, m_flip2Line); + } } - + + catch (...) { + Base::Console().Error("CL::scaledGeometry - failed to calculate endpoints!\n"); + return nullptr; + } + TechDraw::BaseGeom* newGeom = nullptr; Base::Vector3d p1 = ends.first; Base::Vector3d p2 = ends.second; @@ -748,6 +767,8 @@ TechDraw::BaseGeom* CenterLine::scaledGeometry(TechDraw::DrawViewPart* partFeat) newGeom->classOfEdge = ecHARD; newGeom->hlrVisible = true; newGeom->cosmetic = true; + newGeom->source(CENTERLINE); + newGeom->setCosmeticTag(getTagAsString()); return newGeom; } @@ -794,10 +815,10 @@ std::pair CenterLine::calcEndPoints(DrawViewPart double hShift, double vShift, double rotate) { - Base::Console().Message("CL::calcEndPoints()\n"); +// Base::Console().Message("CL::calcEndPoints()\n"); std::pair result; if (faceNames.empty()) { - Base::Console().Message("CL::calcEndPoints - no faces!\n"); + Base::Console().Warning("CL::calcEndPoints - no faces!\n"); return result; } @@ -813,16 +834,19 @@ std::pair CenterLine::calcEndPoints(DrawViewPart int idx = TechDraw::DrawUtil::getIndexFromName(fn); std::vector faceEdges = partFeat->getFaceEdgesByIndex(idx); - for (auto& fe: faceEdges) { - if (!fe->cosmetic) { - BRepBndLib::Add(fe->occEdge, faceBox); + if (!faceEdges.empty()) { + for (auto& fe: faceEdges) { + if (!fe->cosmetic) { + BRepBndLib::Add(fe->occEdge, faceBox); + } } } } if (faceBox.IsVoid()) { Base::Console().Error("CL::calcEndPoints - faceBox is void!\n"); - return result; +// return result; + throw Base::IndexError("CenterLine wrong number of faces."); } double Xmin,Ymin,Zmin,Xmax,Ymax,Zmax; @@ -897,10 +921,10 @@ 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"); + Base::Console().Warning("CL::calcEndPoints2Lines - no edges!\n"); return result; } @@ -913,11 +937,14 @@ std::pair CenterLine::calcEndPoints2Lines(DrawVi } int idx = TechDraw::DrawUtil::getIndexFromName(en); TechDraw::BaseGeom* bg = partFeat->getGeomByIndex(idx); - edges.push_back(bg); + if (bg != nullptr) { + edges.push_back(bg); + } } if (edges.size() != 2) { - Base::Console().Message("CL::calcEndPoints2Lines - wrong number of edges!\n"); - return result; +// Base::Console().Message("CL::calcEndPoints2Lines - wrong number of edges!\n"); +// return result; + throw Base::IndexError("CenterLine wrong number of edges."); } Base::Vector3d l1p1 = edges.front()->getStartPoint(); @@ -992,10 +1019,10 @@ 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"); + Base::Console().Warning("CL::calcEndPoints2Points - no points!\n"); return result; } @@ -1008,11 +1035,15 @@ std::pair CenterLine::calcEndPoints2Points(DrawV } int idx = TechDraw::DrawUtil::getIndexFromName(vn); TechDraw::Vertex* v = partFeat->getProjVertexByIndex(idx); - points.push_back(v); + if (v != nullptr) { + points.push_back(v); + } } if (points.size() != 2) { - Base::Console().Message("CL::calcEndPoints2Points - wrong number of points!\n"); - return result; + //this should fail harder. maybe be in a try/catch. +// Base::Console().Message("CL::calcEndPoints2Points - wrong number of points!\n"); +// return result; + throw Base::IndexError("CenterLine wrong number of points."); } Base::Vector3d v1 = points.front()->point(); @@ -1140,18 +1171,18 @@ void CenterLine::Save(Base::Writer &writer) const writer.Stream() << writer.ind() - << "" << endl; writer.incInd(); for (auto& p: m_verts) { writer.Stream() << writer.ind() - << "" << endl; + << "" << endl; } writer.decInd(); - writer.Stream() << writer.ind() << "" << endl ; + writer.Stream() << writer.ind() << "" << endl ; writer.Stream() << writer.ind() << "