From 75d43757c46d2ad64d26051a8fdb48d1bba272a2 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 13 May 2019 09:03:04 -0400 Subject: [PATCH] Fix crash on malformed python script --- src/Mod/TechDraw/App/DrawProjGroup.cpp | 46 ++++++++++++++++++++++---- src/Mod/TechDraw/App/DrawProjGroup.h | 1 + 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 116d3075985d..1d25cee9df29 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -71,8 +71,10 @@ DrawProjGroup::DrawProjGroup(void) Source.setScope(App::LinkScope::Global); ADD_PROPERTY_TYPE(Anchor, (0), group, App::Prop_None, "The root view to align projections with"); Anchor.setScope(App::LinkScope::Global); + + ProjectionType.setEnums(ProjectionTypeEnums); - ADD_PROPERTY(ProjectionType, ((long)0)); + ADD_PROPERTY(ProjectionType, ((long)getDefProjConv())); ADD_PROPERTY_TYPE(AutoDistribute ,(autoDist),agroup,App::Prop_None,"Distribute Views Automatically or Manually"); ADD_PROPERTY_TYPE(spacingX, (15), agroup, App::Prop_None, "Horizontal spacing between views"); @@ -390,6 +392,10 @@ App::DocumentObject * DrawProjGroup::addProjection(const char *viewProjType) DrawProjGroupItem *view( nullptr ); std::pair vecs; + DrawPage* dp = findParentPage(); + if (dp == nullptr) { + Base::Console().Error("DPG:addProjection - %s - DPG is not on a page!\n",getNameInDocument()); + } if ( checkViewProjType(viewProjType) && !hasProjection(viewProjType) ) { std::string FeatName = getDocument()->getUniqueObjectName("ProjItem"); @@ -690,8 +696,16 @@ int DrawProjGroup::getViewIndex(const char *viewTypeCStr) const int result = 4; //default to front view's position // Determine layout - should be either "First Angle" or "Third Angle" const char* projType; + DrawPage* dp = findParentPage(); if (ProjectionType.isValue("Default")) { - projType = findParentPage()->ProjectionType.getValueAsString(); + if (dp != nullptr) { + projType = dp->ProjectionType.getValueAsString(); + } else { + Base::Console().Warning("DPG: %s - can not find parent page. Using default Projection Type. (1)\n", + getNameInDocument()); + int projConv = getDefProjConv(); + projType = ProjectionTypeEnums[projConv + 1]; + } } else { projType = ProjectionType.getValueAsString(); } @@ -745,7 +759,17 @@ void DrawProjGroup::arrangeViewPointers(DrawProjGroupItem *viewPtrs[10]) const // Determine layout - should be either "First Angle" or "Third Angle" const char* projType; if (ProjectionType.isValue("Default")) { - projType = findParentPage()->ProjectionType.getValueAsString(); + DrawPage* dp = findParentPage(); + if (dp != nullptr) { + projType = dp->ProjectionType.getValueAsString(); + } else { + Base::Console().Error("DPG:arrangeViewPointers - %s - DPG is not on a page!\n", + getNameInDocument()); + Base::Console().Warning("DPG:arrangeViewPointers - using system default Projection Type\n", + getNameInDocument()); + int projConv = getDefProjConv(); + projType = ProjectionTypeEnums[projConv + 1]; + } } else { projType = ProjectionType.getValueAsString(); } @@ -793,12 +817,15 @@ void DrawProjGroup::arrangeViewPointers(DrawProjGroupItem *viewPtrs[10]) const } else if (strcmp(viewTypeCStr, "FrontBottomRight") == 0) { viewPtrs[thirdAngle ? 9 : 0] = oView; } else { - throw Base::TypeError("Unknown view type in DrawProjGroup::arrangeViewPointers()"); + Base::Console().Warning("DPG: %s - unknown view type: %s. \n", + getNameInDocument(),viewTypeCStr); + throw Base::TypeError("Unknown view type in DrawProjGroup::arrangeViewPointers."); } } } } else { - throw Base::ValueError("Unknown view type in DrawProjGroup::arrangeViewPointers()"); + Base::Console().Warning("DPG: %s - unknown Projection convention: %s\n",getNameInDocument(),projType); + throw Base::ValueError("Unknown Projection convention in DrawProjGroup::arrangeViewPointers"); } } @@ -1144,7 +1171,6 @@ void DrawProjGroup::spinCCW() updateSecondaryDirs(); } - std::vector DrawProjGroup::getViewsAsDPGI() { std::vector result; @@ -1156,6 +1182,14 @@ std::vector DrawProjGroup::getViewsAsDPGI() return result; } +int DrawProjGroup::getDefProjConv(void) const +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter().GetGroup("BaseApp")-> + GetGroup("Preferences")->GetGroup("Mod/TechDraw/General"); + int defProjConv = hGrp->GetInt("ProjectionAngle",0); + return defProjConv; +} + /*! *dumps the current iso DPGI's */ diff --git a/src/Mod/TechDraw/App/DrawProjGroup.h b/src/Mod/TechDraw/App/DrawProjGroup.h index c38825be1f62..00d4736f69c5 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.h +++ b/src/Mod/TechDraw/App/DrawProjGroup.h @@ -162,6 +162,7 @@ class TechDrawExport DrawProjGroup : public TechDraw::DrawViewCollection void updateChildrenSource(void); void updateChildrenLock(void); int getViewIndex(const char *viewTypeCStr) const; + int getDefProjConv(void) const; };