[TD]fix fail on corrupt dimension reference

This commit is contained in:
wandererfan
2024-04-01 14:57:38 -04:00
committed by WandererFan
parent d92267c6a7
commit 94c2d4fff1
2 changed files with 120 additions and 13 deletions

View File

@@ -446,7 +446,7 @@ App::DocumentObjectExecReturn* DrawViewDimension::execute()
{
// Base::Console().Message("DVD::execute() - %s\n", getNameInDocument());
if (!okToProceed()) {
return App::DocumentObject::StdReturn;
return new App::DocumentObjectExecReturn("Dimension could not execute");
}
resetLinear();
@@ -479,13 +479,6 @@ App::DocumentObjectExecReturn* DrawViewDimension::execute()
// references are good, we can proceed
m_referencesCorrect = true;
// is this check still relevant or is it replace by the autocorrect and
// validate methods?
if (References3D.getValues().empty() && !checkReferences2D()) {
Base::Console().Warning("%s has invalid 2D References\n", getNameInDocument());
return new App::DocumentObjectExecReturn("Dimension object has invalid 2d references");
}
// we have either or both valid References3D and References2D
ReferenceVector references = getEffectiveReferences();
@@ -544,7 +537,8 @@ bool DrawViewDimension::okToProceed()
if (!has2DReferences() && !has3DReferences()) {
// no references, can't do anything
return App::DocumentObject::StdReturn;
Base::Console().Warning("Dimension object has no valid references\n");
return false;
}
if (!getViewPart()->hasGeometry()) {
@@ -552,7 +546,13 @@ bool DrawViewDimension::okToProceed()
return false;
}
return true;
// is this check still relevant or is it replaced by the autocorrect and
// validate methods?
if (References3D.getValues().empty() && !checkReferences2D()) {
Base::Console().Warning("%s has invalid 2D References\n", getNameInDocument());
return false;
}
return validateReferenceForm();
}
bool DrawViewDimension::isMultiValueSchema() const
@@ -1451,8 +1451,8 @@ bool DrawViewDimension::hasBroken3dReferences() const
void DrawViewDimension::updateSavedGeometry()
{
// Base::Console().Message("DVD::updateSavedGeometry() - %s - savedGeometry: %d\n",
// getNameInDocument(), SavedGeometry.getValues().size());
// Base::Console().Message("DVD::updateSavedGeometry() - %s - savedGeometry: %d\n",
// getNameInDocument(), SavedGeometry.getValues().size());
ReferenceVector references = getEffectiveReferences();
if (references.empty()) {
// no references to save
@@ -1624,6 +1624,108 @@ void DrawViewDimension::setAll3DMeasurement()
}
}
//! check the effective references have the correct number and type for this
//! dimension.
bool DrawViewDimension::validateReferenceForm() const
{
// we have either or both valid References3D and References2D
ReferenceVector references = getEffectiveReferences();
if (references.empty()) {
return false;
}
if (Type.isValue("Distance") || Type.isValue("DistanceX") || Type.isValue("DistanceY")) {
if (getRefType() == oneEdge) {
if (references.size() != 1) {
return false;
}
std::string subGeom = DrawUtil::getGeomTypeFromName(references.front().getSubName());
if (subGeom != "Edge") {
return false;
}
return true;
}
else if (getRefType() == twoEdge) {
if (references.size() != 2) {
return false;
}
std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName());
std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName());
if (subGeom0 != "Edge" || subGeom1 != "Edge") {
return false;
}
return true;
}
else if (getRefType() == twoVertex) {
if (references.size() != 2) {
return false;
}
std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName());
std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName());
if (subGeom0 != "Vertex" || subGeom1 != "Vertex") {
return false;
}
return true;
}
else if (getRefType() == vertexEdge) {
if (references.size() != 2) {
return false;
}
std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName());
std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName());
if ( (subGeom0 == "Vertex" && subGeom1 == "Edge") ||
(subGeom0 == "Edge" && subGeom1 == "Vertex") ) {
return true;
}
return false;
}
}
else if (Type.isValue("Radius")) {
if (references.size() != 1) {
return false;
}
std::string subGeom = DrawUtil::getGeomTypeFromName(references.front().getSubName());
if (subGeom != "Edge") {
return false;
}
return true;
}
else if (Type.isValue("Diameter")) {
if (references.size() != 1) {
return false;
}
std::string subGeom = DrawUtil::getGeomTypeFromName(references.front().getSubName());
if (subGeom != "Edge") {
return false;
}
return true;
}
else if (Type.isValue("Angle")) {
if (references.size() != 2) {
return false;
}
std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName());
std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName());
if (subGeom0 != "Edge" || subGeom1 != "Edge") {
return false;
}
return true;
}
else if (Type.isValue("Angle3Pt")) {
if (references.size() != 3) {
return false;
}
std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.at(0).getSubName());
std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.at(1).getSubName());
std::string subGeom2 = DrawUtil::getGeomTypeFromName(references.at(2).getSubName());
if (subGeom0 != "Vertex" || subGeom1 != "Vertex" || subGeom2 != "Vertex") {
return false;
}
return true;
}
return false;
}
// delete all previous measurements
void DrawViewDimension::clear3DMeasurements()
{
@@ -1862,5 +1964,8 @@ Base::BoundBox3d DrawViewDimension::getSavedBox()
Base::BoundBox3d DrawViewDimension::getFeatureBox()
{
return getViewPart()->getBoundingBox();
if (getViewPart() && getViewPart()->getBoundingBox().IsValid()) {
return getViewPart()->getBoundingBox();
}
return Base::BoundBox3d();
}

View File

@@ -237,6 +237,8 @@ protected:
bool okToProceed();
void updateSavedGeometry();
bool validateReferenceForm() const;
private:
static const char* TypeEnums[];
static const char* MeasureTypeEnums[];