[TD]use UUID for CosmeticEdges instead of indices

This commit is contained in:
wandererfan
2019-11-05 14:24:04 -05:00
committed by WandererFan
parent 95c22f7c3b
commit f539a0ea8c
13 changed files with 330 additions and 163 deletions

View File

@@ -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<Base::Vector3d, Base::Vector3d> CenterLine::calcEndPoints(DrawViewPart
double hShift, double vShift,
double rotate)
{
Base::Console().Message("CL::calcEndPoints()\n");
std::pair<Base::Vector3d, Base::Vector3d> result;
if (faceNames.empty()) {
Base::Console().Message("CL::calcEndPoints - no faces!\n");
@@ -862,7 +897,7 @@ std::pair<Base::Vector3d, Base::Vector3d> 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<Base::Vector3d, Base::Vector3d> result;
if (edgeNames.empty()) {
Base::Console().Message("CL::calcEndPoints2Lines - no edges!\n");
@@ -957,7 +992,7 @@ std::pair<Base::Vector3d, Base::Vector3d> CenterLine::calcEndPoints2Points(DrawV
double rotate, bool flip)
{
// Base::Console().Message("CL::calc2Points()\n");
Base::Console().Message("CL::calc2Points()\n");
std::pair<Base::Vector3d, Base::Vector3d> 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() << "<Color value=\"" << m_format.m_color.asHexString() << "\"/>" << endl;
const char v = m_format.m_visible?'1':'0';
writer.Stream() << writer.ind() << "<Visible value=\"" << v << "\"/>" << endl;
//stored geometry
writer.Stream() << writer.ind() << "<GeometryType value=\"" << m_geometry->geomType <<"\"/>" << endl;
if (m_geometry->geomType == TechDraw::GeomType::GENERIC) {
Generic* gen = static_cast<Generic*>(m_geometry);
gen->Save(writer);
} else if (m_geometry->geomType == TechDraw::GeomType::CIRCLE) {
TechDraw::Circle* circ = static_cast<TechDraw::Circle*>(m_geometry);
circ->Save(writer);
} else if (m_geometry->geomType == TechDraw::GeomType::ARCOFCIRCLE) {
TechDraw::AOC* aoc = static_cast<TechDraw::AOC*>(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.

View File

@@ -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);

View File

@@ -1110,6 +1110,7 @@ int DrawViewPart::add1CVToGV(std::string tag)
//CosmeticEdges -------------------------------------------------------------------
//for completeness. not actually used anywhere
void DrawViewPart::clearCosmeticEdges(void)
{
std::vector<CosmeticEdge*> 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<CosmeticEdge*> 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<CosmeticEdge*> 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<CosmeticEdge*> 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<CosmeticEdge*> 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<CosmeticEdge*> 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<CosmeticEdge*> cEdges = CosmeticEdges.getValues();
std::vector<CosmeticEdge*> 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<std::string> delTags)
{
const std::vector<TechDraw::BaseGeom*> &geoms = getEdgeGeometry();
int source = geoms.at(geomIndex)->source();
if (source == 1) { //CosmeticEdge
int sourceIndex = geoms.at(geomIndex)->sourceIndex();
replaceCosmeticEdge(sourceIndex, ce);
std::vector<CosmeticEdge*> cEdges = CosmeticEdges.getValues();
std::vector<CosmeticEdge*> 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<TechDraw::CosmeticEdge*> 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<TechDraw::BaseGeom*> &geoms = getEdgeGeometry();
int sourceIndex = geoms.at(idx)->sourceIndex();
// Base::Console().Message("DVP::getCosmeticEdgeByGeom(%d)\n",idx);
CosmeticEdge* result = nullptr;
const std::vector<TechDraw::CosmeticEdge*> 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<TechDraw::CosmeticEdge*> 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<TechDraw::CosmeticEdge*> 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);
}
}

View File

@@ -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<std::string> 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);

View File

@@ -58,11 +58,6 @@
<UserDocu>getCosmeticEdgeByGeom(idx) - returns CosmeticEdge using geometry index.</UserDocu>
</Documentation>
</Methode>
<Methode Name="replaceCosmeticEdge">
<Documentation>
<UserDocu>replaceCosmeticEdge(idx, ce) - replaces CosmeticEdge[idx] with ce.</UserDocu>
</Documentation>
</Methode>
<Methode Name="removeCosmeticEdge">
<Documentation>
<UserDocu>removeCosmeticEdge(idx) - remove CosmeticEdge[idx] from View. Returns None.</UserDocu>

View File

@@ -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<CosmeticEdgePy*>(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<CosmeticEdgePy*>(pCE)->getCosmeticEdgePtr();
// DrawViewPart* dvp = getDrawViewPartPtr();
// dvp->replaceCosmeticEdge(idx, ce);
return result;
}
// return result;
//}
PyObject* DrawViewPartPy::removeCosmeticEdge(PyObject *args)
{

View File

@@ -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<std::string> 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() << "<GeomType value=\"" << geomType << "\"/>" << endl;
writer.Stream() << writer.ind() << "<ExtractType value=\"" << extractType << "\"/>" << endl;
writer.Stream() << writer.ind() << "<EdgeClass value=\"" << classOfEdge << "\"/>" << endl;
const char v = visible?'1':'0';
writer.Stream() << writer.ind() << "<Visible value=\"" << v << "\"/>" << endl;
const char v = hlrVisible?'1':'0';
writer.Stream() << writer.ind() << "<HLRVisible value=\"" << v << "\"/>" << endl;
const char r = reversed?'1':'0';
writer.Stream() << writer.ind() << "<Reversed value=\"" << r << "\"/>" << endl;
writer.Stream() << writer.ind() << "<Ref3D value=\"" << ref3D << "\"/>" << endl;
@@ -199,6 +191,8 @@ void BaseGeom::Save(Base::Writer &writer) const
writer.Stream() << writer.ind() << "<Cosmetic value=\"" << c << "\"/>" << endl;
writer.Stream() << writer.ind() << "<Source value=\"" << m_source << "\"/>" << endl;
writer.Stream() << writer.ind() << "<SourceIndex value=\"" << m_sourceIndex << "\"/>" << endl;
writer.Stream() << writer.ind() << "<CosmeticTag value=\"" << cosmeticTag << "\"/>" << endl;
// writer.Stream() << writer.ind() << "<Tag value=\"" << getTagAsString() << "\"/>" << 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<Base::Vector3d> 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() << "<Extract value=\"" << extractType << "\"/>" << endl;
const char v = visible?'1':'0';
writer.Stream() << writer.ind() << "<Visible value=\"" << v << "\"/>" << endl;
const char v = hlrVisible?'1':'0';
writer.Stream() << writer.ind() << "<HLRVisible value=\"" << v << "\"/>" << endl;
writer.Stream() << writer.ind() << "<Ref3D value=\"" << ref3D << "\"/>" << endl;
const char c = isCenter?'1':'0';
writer.Stream() << writer.ind() << "<IsCenter value=\"" << c << "\"/>" << endl;
@@ -1375,7 +1379,7 @@ void Vertex::Save(Base::Writer &writer) const
writer.Stream() << writer.ind() << "<Cosmetic value=\"" << c2 << "\"/>" << endl;
writer.Stream() << writer.ind() << "<CosmeticLink value=\"" << cosmeticLink << "\"/>" << endl;
writer.Stream() << writer.ind() << "<CosmeticTag value=\"" << cosmeticTag << "\"/>" << endl;
writer.Stream() << writer.ind() << "<Tag value=\"" << getTagAsString() << "\"/>" << endl;
writer.Stream() << writer.ind() << "<VertexTag value=\"" << getTagAsString() << "\"/>" << 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<unsigned int>(std::time(0)));
seeded = true;
}
static boost::uuids::basic_random_generator<boost::mt19937> 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());
}

View File

@@ -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<BaseGeom *> 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;

View File

@@ -109,7 +109,7 @@ const std::vector<BaseGeom *> 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<Vertex *>::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;

View File

@@ -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:

View File

@@ -1015,20 +1015,27 @@ void CmdTechDrawCosmeticEraser::activated(int iMsg)
objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
subNames = (*itSel).getSubNames();
}
if (objFeat == nullptr) {
break;
}
std::vector<std::string> cv2Delete;
std::vector<int> ce2Delete;
std::vector<std::string> ce2Delete;
std::vector<int> 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();
}
}

View File

@@ -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<TechDraw::DrawViewPart *>(getViewObject()) );
TechDraw::CosmeticEdge* ce = partFeat->getCosmeticEdge(cTag);
if (ce != nullptr) {
item->setNormalColor(ce->m_format.m_color.asValue<QColor>());
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);

View File

@@ -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<QGraphicsItem*> deleteItems;
};