Skip to content

Commit

Permalink
Add vertex-edge dimension
Browse files Browse the repository at this point in the history
  • Loading branch information
WandererFan authored and wwmayer committed Aug 16, 2016
1 parent af7d257 commit 4fe4c31
Show file tree
Hide file tree
Showing 7 changed files with 223 additions and 135 deletions.
148 changes: 79 additions & 69 deletions src/Mod/TechDraw/App/DrawViewDimension.cpp
Expand Up @@ -79,7 +79,8 @@ enum RefType{
invalidRef,
oneEdge,
twoEdge,
twoVertex
twoVertex,
vertexEdge
};

DrawViewDimension::DrawViewDimension(void)
Expand All @@ -92,7 +93,6 @@ DrawViewDimension::DrawViewDimension(void)
ADD_PROPERTY_TYPE(References3D,(0,0),"",(App::PropertyType)(App::Prop_None),"3D Geometry References");
ADD_PROPERTY_TYPE(Font ,(fontName.c_str()),"Format",App::Prop_None, "The name of the font to use");
ADD_PROPERTY_TYPE(Fontsize,(4) ,"Format",(App::PropertyType)(App::Prop_None),"Dimension text size in mm");
ADD_PROPERTY_TYPE(CentreLines,(0) ,"Format",(App::PropertyType)(App::Prop_None),"Arc Dimension Center Mark");
ADD_PROPERTY_TYPE(FormatSpec,("%value%") ,"Format",(App::PropertyType)(App::Prop_None),"Dimension Format");
ADD_PROPERTY_TYPE(LineWidth,(0.5) ,"Format",(App::PropertyType)(App::Prop_None),"Dimension line weight");

Expand Down Expand Up @@ -129,7 +129,6 @@ void DrawViewDimension::onChanged(const App::Property* prop)
if (prop == &References2D ||
prop == &Font ||
prop == &Fontsize ||
prop == &CentreLines ||
prop == &FormatSpec ||
prop == &LineWidth) {
try {
Expand Down Expand Up @@ -270,71 +269,77 @@ double DrawViewDimension::getDimValue() const
// Projected Values
const std::vector<App::DocumentObject*> &objects = References2D.getValues();
const std::vector<std::string> &subElements = References2D.getSubValues();
if (Type.isValue("Distance") && getRefType() == oneEdge) {
//TODO: Check for straight line Edge?
int idx = DrawUtil::getIndexFromName(subElements[0]);
TechDrawGeometry::BaseGeom* geom = getViewPart()->getProjEdgeByIndex(idx);
TechDrawGeometry::Generic* gen = static_cast<TechDrawGeometry::Generic*>(geom);
Base::Vector2D start = gen->points[0];
Base::Vector2D end = gen->points[1];
Base::Vector2D line = end - start;
result = line.Length() / getViewPart()->Scale.getValue();
} else if (Type.isValue("Distance") && getRefType() == twoEdge) {
//only works for straight line edges
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
int idx1 = DrawUtil::getIndexFromName(subElements[1]);
TechDrawGeometry::BaseGeom* geom0 = getViewPart()->getProjEdgeByIndex(idx0);
TechDrawGeometry::BaseGeom* geom1 = getViewPart()->getProjEdgeByIndex(idx1);
TechDrawGeometry::Generic* gen0 = static_cast<TechDrawGeometry::Generic*>(geom0);
TechDrawGeometry::Generic* gen1 = static_cast<TechDrawGeometry::Generic*>(geom1);
Base::Vector2D s0 = gen0->points[0];
Base::Vector2D e0 = gen0->points[1];
Base::Vector2D s1 = gen1->points[0];
Base::Vector2D e1 = gen1->points[1];
result = dist2Segs(s0,e0,s1,e1) / getViewPart()->Scale.getValue();
} else if (Type.isValue("Distance") && getRefType() == twoVertex) {
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
int idx1 = DrawUtil::getIndexFromName(subElements[1]);
TechDrawGeometry::Vertex* v0 = getViewPart()->getProjVertexByIndex(idx0);
TechDrawGeometry::Vertex* v1 = getViewPart()->getProjVertexByIndex(idx1);
Base::Vector2D start = v0->pnt;
Base::Vector2D end = v1->pnt;
Base::Vector2D line = end - start;
result = line.Length() / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceX") && getRefType() == oneEdge) {
int idx = DrawUtil::getIndexFromName(subElements[0]);
TechDrawGeometry::BaseGeom* geom = getViewPart()->getProjEdgeByIndex(idx);
TechDrawGeometry::Generic* gen = static_cast<TechDrawGeometry::Generic*>(geom);
Base::Vector2D start = gen->points[0];
Base::Vector2D end = gen->points[1];
Base::Vector2D line = end - start;
return fabs(line.fX) / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceY") && getRefType() == oneEdge) {
int idx = DrawUtil::getIndexFromName(subElements[0]);
TechDrawGeometry::BaseGeom* geom = getViewPart()->getProjEdgeByIndex(idx);
TechDrawGeometry::Generic* gen = static_cast<TechDrawGeometry::Generic*>(geom);
Base::Vector2D start = gen->points[0];
Base::Vector2D end = gen->points[1];
Base::Vector2D line = end - start;
result = fabs(line.fY) / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceX") && getRefType() == twoVertex) {
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
int idx1 = DrawUtil::getIndexFromName(subElements[1]);
TechDrawGeometry::Vertex* v0 = getViewPart()->getProjVertexByIndex(idx0);
TechDrawGeometry::Vertex* v1 = getViewPart()->getProjVertexByIndex(idx1);
Base::Vector2D start = v0->pnt;
Base::Vector2D end = v1->pnt;
Base::Vector2D line = end - start;
result = fabs(line.fX) / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceY") && getRefType() == twoVertex) {
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
int idx1 = DrawUtil::getIndexFromName(subElements[1]);
TechDrawGeometry::Vertex* v0 = getViewPart()->getProjVertexByIndex(idx0);
TechDrawGeometry::Vertex* v1 = getViewPart()->getProjVertexByIndex(idx1);
Base::Vector2D start = v0->pnt;
Base::Vector2D end = v1->pnt;
Base::Vector2D line = end - start;
result = fabs(line.fY) / getViewPart()->Scale.getValue();
if ( Type.isValue("Distance") ||
Type.isValue("DistanceX") ||
Type.isValue("DistanceY") ) {
if (getRefType() == oneEdge) {
//TODO: Check for straight line Edge?
int idx = DrawUtil::getIndexFromName(subElements[0]);
TechDrawGeometry::BaseGeom* geom = getViewPart()->getProjEdgeByIndex(idx);
TechDrawGeometry::Generic* gen = static_cast<TechDrawGeometry::Generic*>(geom);
Base::Vector2D start = gen->points[0];
Base::Vector2D end = gen->points[1];
Base::Vector2D line = end - start;
if (Type.isValue("Distance")) {
result = line.Length() / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceX")) {
return fabs(line.fX) / getViewPart()->Scale.getValue();
} else {
result = fabs(line.fY) / getViewPart()->Scale.getValue();
}
}else if (getRefType() == twoEdge) {
//only works for straight line edges
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
int idx1 = DrawUtil::getIndexFromName(subElements[1]);
TechDrawGeometry::BaseGeom* geom0 = getViewPart()->getProjEdgeByIndex(idx0);
TechDrawGeometry::BaseGeom* geom1 = getViewPart()->getProjEdgeByIndex(idx1);
TechDrawGeometry::Generic* gen0 = static_cast<TechDrawGeometry::Generic*>(geom0);
TechDrawGeometry::Generic* gen1 = static_cast<TechDrawGeometry::Generic*>(geom1);
Base::Vector2D s0 = gen0->points[0];
Base::Vector2D e0 = gen0->points[1];
Base::Vector2D s1 = gen1->points[0];
Base::Vector2D e1 = gen1->points[1];
if (Type.isValue("Distance")) {
//we don't do horiz/vertical edge to edge
result = dist2Segs(s0,e0,s1,e1) / getViewPart()->Scale.getValue();
}
} else if (getRefType() == twoVertex) {
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
int idx1 = DrawUtil::getIndexFromName(subElements[1]);
TechDrawGeometry::Vertex* v0 = getViewPart()->getProjVertexByIndex(idx0);
TechDrawGeometry::Vertex* v1 = getViewPart()->getProjVertexByIndex(idx1);
Base::Vector2D start = v0->pnt;
Base::Vector2D end = v1->pnt;
Base::Vector2D line = end - start;
if (Type.isValue("Distance")) {
result = line.Length() / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceX")) {
result = fabs(line.fX) / getViewPart()->Scale.getValue();
} else {
result = fabs(line.fY) / getViewPart()->Scale.getValue();
}
} else if (getRefType() == vertexEdge) {
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
int idx1 = DrawUtil::getIndexFromName(subElements[1]);
TechDrawGeometry::BaseGeom* e;
TechDrawGeometry::Vertex* v;
if (DrawUtil::getGeomTypeFromName(subElements[0]) == "Edge") {
e = getViewPart()->getProjEdgeByIndex(idx0);
v = getViewPart()->getProjVertexByIndex(idx1);
} else {
e = getViewPart()->getProjEdgeByIndex(idx1);
v = getViewPart()->getProjVertexByIndex(idx0);
}
Base::Vector2D nearPoint = e->nearPoint(v->pnt);
Base::Vector2D line = nearPoint - v->pnt;
if (Type.isValue("Distance")) {
result = e->minDist(v->pnt) / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceX")) {
result = fabs(line.fX) / getViewPart()->Scale.getValue();
} else {
result = fabs(line.fY) / getViewPart()->Scale.getValue();
}
} //else tarfu
} else if(Type.isValue("Radius")){
//only 1 reference for a Radius
int idx = DrawUtil::getIndexFromName(subElements[0]);
Expand Down Expand Up @@ -432,8 +437,13 @@ int DrawViewDimension::getRefType() const
} else if ((DrawUtil::getGeomTypeFromName(subElements[0]) == "Vertex") &&
(DrawUtil::getGeomTypeFromName(subElements[1]) == "Vertex")) {
refType = twoVertex;
} else if (((DrawUtil::getGeomTypeFromName(subElements[0]) == "Vertex") &&
(DrawUtil::getGeomTypeFromName(subElements[1]) == "Edge")) ||
((DrawUtil::getGeomTypeFromName(subElements[0]) == "Edge") &&
(DrawUtil::getGeomTypeFromName(subElements[1]) == "Vertex")) ) {
refType = vertexEdge;
}
//} else add different types here - Vertex-Edge, Vertex-Face, ...
//} else add different types here - Vertex-Face, ...
}
return refType;
}
Expand Down
1 change: 0 additions & 1 deletion src/Mod/TechDraw/App/DrawViewDimension.h
Expand Up @@ -54,7 +54,6 @@ class TechDrawExport DrawViewDimension : public TechDraw::DrawView
/// Properties for Visualisation
App::PropertyString Font;
App::PropertyFloat Fontsize;
App::PropertyBool CentreLines;
App::PropertyString FormatSpec;
App::PropertyFloat LineWidth;

Expand Down
62 changes: 49 additions & 13 deletions src/Mod/TechDraw/App/Geometry.cpp
Expand Up @@ -132,6 +132,39 @@ Base::Vector2D BaseGeom::getEndPoint()
}


double BaseGeom::minDist(Base::Vector2D p)
{
double minDist = -1.0;
gp_Pnt pnt(p.fX,p.fY,0.0);
TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(pnt);
BRepExtrema_DistShapeShape extss(occEdge, v);
if (extss.IsDone()) {
int count = extss.NbSolution();
if (count != 0) {
minDist = extss.Value();
}
}
return minDist;
}

//!find point on me nearest to p
Base::Vector2D BaseGeom::nearPoint(Base::Vector2D p)
{
gp_Pnt pnt(p.fX,p.fY,0.0);
Base::Vector2D result(0.0,0.0);
TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(pnt);
BRepExtrema_DistShapeShape extss(occEdge, v);
if (extss.IsDone()) {
int count = extss.NbSolution();
if (count != 0) {
gp_Pnt p1;
p1 = extss.PointOnShape1(1);
result = Base::Vector2D(p1.X(),p1.Y());
}
}
return result;
}

//! Convert 1 OCC edge into 1 BaseGeom (static factory method)
BaseGeom* BaseGeom::baseFactory(TopoDS_Edge edge)
{
Expand Down Expand Up @@ -256,8 +289,8 @@ Circle::Circle(const TopoDS_Edge &e)

gp_Circ circ = c.Circle();
const gp_Pnt& p = circ.Location();
const gp_Ax2& p1 = circ.Position();
const gp_Pnt& l = p1.Location();
//const gp_Ax2& p1 = circ.Position();
//const gp_Pnt& l = p1.Location();

radius = circ.Radius();
center = Base::Vector2D(p.X(), p.Y());
Expand Down Expand Up @@ -311,17 +344,20 @@ bool AOC::isOnArc(Base::Vector3d p)

double AOC::distToArc(Base::Vector3d p)
{
double minDist = -1.0;
gp_Pnt pnt(p.x,p.y,p.z);
TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(pnt);
BRepExtrema_DistShapeShape extss(occEdge, v);
if (extss.IsDone()) {
int count = extss.NbSolution();
if (count != 0) {
minDist = extss.Value();
}
}
return minDist;
Base::Vector2D p2(p.x,p.y);
double result = minDist(p2);
return result;
// double minDist = -1.0;
// gp_Pnt pnt(p.x,p.y,p.z);
// TopoDS_Vertex v = BRepBuilderAPI_MakeVertex(pnt);
// BRepExtrema_DistShapeShape extss(occEdge, v);
// if (extss.IsDone()) {
// int count = extss.NbSolution();
// if (count != 0) {
// minDist = extss.Value();
// }
// }
// return minDist;
}


Expand Down
2 changes: 2 additions & 0 deletions src/Mod/TechDraw/App/Geometry.h
Expand Up @@ -76,6 +76,8 @@ class TechDrawExport BaseGeom
std::vector<Base::Vector2D> findEndPoints();
Base::Vector2D getStartPoint();
Base::Vector2D getEndPoint();
double minDist(Base::Vector2D p);
Base::Vector2D nearPoint(Base::Vector2D p);
static BaseGeom* baseFactory(TopoDS_Edge edge);
};

Expand Down
58 changes: 58 additions & 0 deletions src/Mod/TechDraw/Gui/CommandCreateDims.cpp
Expand Up @@ -114,6 +114,7 @@ bool _checkPartFeature(Gui::Command* cmd);
int _isValidSingleEdge(Gui::Command* cmd);
bool _isValidVertexes(Gui::Command* cmd);
int _isValidEdgeToEdge(Gui::Command* cmd);
bool _isValidVertexToEdge(Gui::Command* cmd);

enum EdgeType{
isInvalid,
Expand Down Expand Up @@ -218,6 +219,12 @@ void CmdTechDrawNewDimension::activated(int iMsg)
default:
break;
}
} else if (_isValidVertexToEdge(this)) {
dimType = "Distance";
objs.push_back(objFeat);
objs.push_back(objFeat);
subs.push_back(SubNames[0]);
subs.push_back(SubNames[1]);
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"),
QObject::tr("Can't make a Dimension from this selection"));
Expand Down Expand Up @@ -512,6 +519,11 @@ void CmdTechDrawNewLengthDimension::activated(int iMsg)
objs.push_back(objFeat);
subs.push_back(SubNames[0]);
subs.push_back(SubNames[1]);
} else if (_isValidVertexToEdge(this)) {
objs.push_back(objFeat);
objs.push_back(objFeat);
subs.push_back(SubNames[0]);
subs.push_back(SubNames[1]);
} else {
std::stringstream edgeMsg;
edgeMsg << "Can't make a length Dimension from this selection (edge type: " << edgeType << ")";
Expand Down Expand Up @@ -608,6 +620,11 @@ void CmdTechDrawNewDistanceXDimension::activated(int iMsg)
objs.push_back(objFeat);
subs.push_back(SubNames[0]);
subs.push_back(SubNames[1]);
} else if (_isValidVertexToEdge(this)) {
objs.push_back(objFeat);
objs.push_back(objFeat);
subs.push_back(SubNames[0]);
subs.push_back(SubNames[1]);
} else {
std::stringstream edgeMsg;
edgeMsg << "Can't make a horizontal Dimension from this selection (edge type: " << edgeType << ")";
Expand Down Expand Up @@ -705,6 +722,11 @@ void CmdTechDrawNewDistanceYDimension::activated(int iMsg)
objs.push_back(objFeat);
subs.push_back(SubNames[0]);
subs.push_back(SubNames[1]);
} else if (_isValidVertexToEdge(this)) {
objs.push_back(objFeat);
objs.push_back(objFeat);
subs.push_back(SubNames[0]);
subs.push_back(SubNames[1]);
} else {
std::stringstream edgeMsg;
edgeMsg << "Can't make a vertical Dimension from this selection (edge type: " << edgeType << ")";
Expand Down Expand Up @@ -1063,3 +1085,39 @@ int _isValidEdgeToEdge(Gui::Command* cmd) {
}
return edgeType;
}

//! verify that the Selection contains valid geometries for a Vertex to Edge Dimension
bool _isValidVertexToEdge(Gui::Command* cmd) {
bool result = false;
std::vector<Gui::SelectionObject> selection = cmd->getSelection().getSelectionEx();
TechDraw::DrawViewPart* objFeat0 = dynamic_cast<TechDraw::DrawViewPart *>(selection[0].getObject());
//TechDraw::DrawViewPart* objFeat1 = dynamic_cast<TechDraw::DrawViewPart *>(selection[1].getObject());
const std::vector<std::string> SubNames = selection[0].getSubNames();
if(SubNames.size() == 2) { //there are 2
int eId,vId;
TechDrawGeometry::BaseGeom* e;
TechDrawGeometry::Vertex* v;
if (TechDraw::DrawUtil::getGeomTypeFromName(SubNames[0]) == "Edge" &&
TechDraw::DrawUtil::getGeomTypeFromName(SubNames[1]) == "Vertex") {
eId = TechDraw::DrawUtil::getIndexFromName(SubNames[0]);
vId = TechDraw::DrawUtil::getIndexFromName(SubNames[1]);
} else if (TechDraw::DrawUtil::getGeomTypeFromName(SubNames[1]) == "Edge" &&
TechDraw::DrawUtil::getGeomTypeFromName(SubNames[0]) == "Vertex") {
eId = TechDraw::DrawUtil::getIndexFromName(SubNames[1]);
vId = TechDraw::DrawUtil::getIndexFromName(SubNames[0]);
} else {
return false;
}
e = objFeat0->getProjEdgeByIndex(eId);
v = objFeat0->getProjVertexByIndex(vId);
if ((!e) || (!v)) {
Base::Console().Error("Logic Error: no geometry for GeoId: %d or GeoId: %d\n",eId,vId);
return false;
}
if (e->geomType != TechDrawGeometry::GENERIC) { //only vertex-line for now.
return false;
}
result = true;
}
return result;
}

0 comments on commit 4fe4c31

Please sign in to comment.