Dimension fixes

Prevent _M_range_check on wrong selection

Allow unlinking of linked Dimension

Allow Horiz/Vert projected Dims
Improve error msg for invalid selction
This commit is contained in:
WandererFan
2016-10-21 09:37:20 -04:00
committed by Yorik van Havre
parent a662cad5be
commit 6abce56595
8 changed files with 279 additions and 72 deletions

View File

@@ -128,15 +128,23 @@ void DrawViewDimension::onChanged(const App::Property* prop)
{
if (!isRestoring()) {
if (prop == &MeasureType) {
// Base::Console().Message("TRACE -DVD::onChanged(MeasureType) - MeasureType: %d Measurehas3D: %d thisHas3D: %d\n",
// MeasureType.getValue(),measurement->has3DReferences(),has3DReferences());
if (MeasureType.isValue("True") && !measurement->has3DReferences()) {
Base::Console().Warning("Dimension %s missing Reference to 3D model. Must be Projected.\n", getNameInDocument());
MeasureType.setValue("Projected");
}
}
if (prop == &References3D) { //have to rebuild the Measurement object
clear3DMeasurements();
// Base::Console().Message("TRACE -DVD::onChanged(References3D) - MeasureType: %d has3D: %d thisHas3D: %d\n",
// MeasureType.getValue(),measurement->has3DReferences(),has3DReferences());
clear3DMeasurements(); //Measurement object
if (!(References3D.getValues()).empty()) {
set3DMeasurement(References3D.getValues().at(0),References3D.getSubValues());
set3DMeasurement(References3D.getValues().at(0),References3D.getSubValues()); //Measurement object
} else {
if (MeasureType.isValue("True")) { //empty 3dRefs, but True
MeasureType.touch(); //run MeasureType logic for this case
}
}
}
@@ -301,8 +309,15 @@ double DrawViewDimension::getDimValue() const
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 (Type.isValue("DistanceX")) {
Base::Vector2D p1 = geom0->nearPoint(geom1);
Base::Vector2D p2 = geom1->nearPoint(geom0);
result = fabs(p1.fX - p2.fX) / getViewPart()->Scale.getValue();
} else if (Type.isValue("DistanceY")) {
Base::Vector2D p1 = geom0->nearPoint(geom1);
Base::Vector2D p2 = geom1->nearPoint(geom0);
result = fabs(p1.fY - p2.fY) / getViewPart()->Scale.getValue();
}
} else if (getRefType() == twoVertex) {
int idx0 = DrawUtil::getIndexFromName(subElements[0]);
@@ -432,27 +447,45 @@ int DrawViewDimension::getRefType() const
{
int refType = invalidRef;
const std::vector<std::string> &subElements = References2D.getSubValues();
if ((subElements.size() == 1) &&
(DrawUtil::getGeomTypeFromName(subElements[0]) == "Edge")) {
refType = oneEdge;
if (subElements.size() == 1) {
refType = getRefType1(subElements[0]);
} else if (subElements.size() == 2) {
if ((DrawUtil::getGeomTypeFromName(subElements[0]) == "Edge") &&
(DrawUtil::getGeomTypeFromName(subElements[1]) == "Edge")) {
refType = twoEdge;
} 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-Face, ...
refType = getRefType2(subElements[0],subElements[1]);
}
return refType;
}
//static
int DrawViewDimension::getRefType1(const std::string g1)
{
int refType = invalidRef;
if (DrawUtil::getGeomTypeFromName(g1) == "Edge") {
refType = oneEdge;
}
return refType;
}
//static
int DrawViewDimension::getRefType2(const std::string g1, const std::string g2)
{
int refType = invalidRef;
if ((DrawUtil::getGeomTypeFromName(g1) == "Edge") &&
(DrawUtil::getGeomTypeFromName(g2) == "Edge")) {
refType = twoEdge;
} else if ((DrawUtil::getGeomTypeFromName(g1) == "Vertex") &&
(DrawUtil::getGeomTypeFromName(g2) == "Vertex")) {
refType = twoVertex;
} else if (((DrawUtil::getGeomTypeFromName(g1) == "Vertex") &&
(DrawUtil::getGeomTypeFromName(g2) == "Edge")) ||
((DrawUtil::getGeomTypeFromName(g1) == "Edge") &&
(DrawUtil::getGeomTypeFromName(g2) == "Vertex")) ) {
refType = vertexEdge;
}
//} else add different types here - Vertex-Face, ...
return refType;
}
//!add 1 3D measurement Reference
void DrawViewDimension::set3DMeasurement(DocumentObject* const &obj, const std::vector<std::string>& subElements)
{
@@ -466,6 +499,7 @@ void DrawViewDimension::set3DMeasurement(DocumentObject* const &obj, const std::
//delete all previous measurements
void DrawViewDimension::clear3DMeasurements()
{
//set sublinklist to empty?
measurement->clear();
}

View File

@@ -22,6 +22,7 @@
#ifndef _TechDraw_DrawViewDimension_h_
#define _TechDraw_DrawViewDimension_h_
#include <tuple>
# include <App/DocumentObject.h>
# include <App/FeaturePython.h>
@@ -82,12 +83,14 @@ public:
virtual double getDimValue() const;
DrawViewPart* getViewPart() const;
virtual QRectF getRect() const { return QRectF(0,0,1,1);} //pretend dimensions always fit!
static int getRefType1(const std::string s);
static int getRefType2(const std::string s1, const std::string s2);
int getRefType() const; //Vertex-Vertex, Edge, Edge-Edge
protected:
void onChanged(const App::Property* prop);
virtual void onDocumentRestored();
int getIndexFromName(std::string geomName) const;
int getRefType() const; //Vertex-Vertex, Edge, Edge-Edge
bool showUnits() const;
protected:

View File

@@ -148,6 +148,22 @@ double BaseGeom::minDist(Base::Vector2D p)
}
//!find point on me nearest to p
Base::Vector2D BaseGeom::nearPoint(const BaseGeom* p)
{
Base::Vector2D result(0.0,0.0);
TopoDS_Edge pEdge = p->occEdge;
BRepExtrema_DistShapeShape extss(occEdge, pEdge);
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;
}
Base::Vector2D BaseGeom::nearPoint(Base::Vector2D p)
{
gp_Pnt pnt(p.fX,p.fY,0.0);
@@ -165,6 +181,7 @@ Base::Vector2D BaseGeom::nearPoint(Base::Vector2D p)
return result;
}
//! Convert 1 OCC edge into 1 BaseGeom (static factory method)
BaseGeom* BaseGeom::baseFactory(TopoDS_Edge edge)
{

View File

@@ -78,6 +78,7 @@ class TechDrawExport BaseGeom
Base::Vector2D getEndPoint();
double minDist(Base::Vector2D p);
Base::Vector2D nearPoint(Base::Vector2D p);
Base::Vector2D nearPoint(const BaseGeom* p);
static BaseGeom* baseFactory(TopoDS_Edge edge);
};