diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 2e08f3d292..45ebfea0b4 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -130,6 +130,7 @@ void DrawPage::onChanged(const App::Property* prop) //would be nice if this message was displayed immediately instead of after the recomputeFeature Base::Console().Message("Rebuilding Views for: %s/%s\n",getNameInDocument(),Label.getValue()); updateAllViews(); + purgeTouched(); } } else if (prop == &Template) { if (!isRestoring() && @@ -176,6 +177,16 @@ App::DocumentObjectExecReturn *DrawPage::execute(void) // this is now irrelevant, b/c DP::execute doesn't do anything. short DrawPage::mustExecute() const { + short result = 0; + if (!isRestoring()) { + result = (Views.isTouched() || + Scale.isTouched() || + ProjectionType.isTouched() || + Template.isTouched()); + if (result) { + return result; + } + } return App::DocumentObject::mustExecute(); } @@ -331,17 +342,27 @@ void DrawPage::onDocumentRestored() App::DocumentObject::onDocumentRestored(); } +void DrawPage::redrawCommand() +{ +// Base::Console().Message("DP::redrawCommand()\n"); + forceRedraw(true); + updateAllViews(); + forceRedraw(false); +} //should really be called "updateMostViews". can still be problems to due execution order. void DrawPage::updateAllViews() { +// Base::Console().Message("DP::updateAllViews()\n"); std::vector featViews = getAllViews(); - std::vector::const_iterator it = featViews.begin(); + std::vector::iterator it = featViews.begin(); //first, make sure all the Parts have been executed so GeometryObjects exist for(; it != featViews.end(); ++it) { TechDraw::DrawViewPart *part = dynamic_cast(*it); - if (part != nullptr && - !part->hasGeometry()) { + TechDraw::DrawViewCollection *collect = dynamic_cast(*it); + if (part != nullptr) { part->recomputeFeature(); + } else if (collect != nullptr) { + collect->recomputeFeature(); } } //second, make sure all the Dimensions have been executed so Measurements have References @@ -448,6 +469,7 @@ void DrawPage::handleChangedPropertyType( } } +//allow/prevent drawing updates for all Pages bool DrawPage::GlobalUpdateDrawings(void) { Base::Reference hGrp = App::GetApplication().GetUserParameter() @@ -456,6 +478,7 @@ bool DrawPage::GlobalUpdateDrawings(void) return result; } +//allow/prevent a single page to update despite GlobalUpdateDrawings setting bool DrawPage::AllowPageOverride(void) { Base::Reference hGrp = App::GetApplication().GetUserParameter() diff --git a/src/Mod/TechDraw/App/DrawPage.h b/src/Mod/TechDraw/App/DrawPage.h index cb45e3944d..b44d393000 100644 --- a/src/Mod/TechDraw/App/DrawPage.h +++ b/src/Mod/TechDraw/App/DrawPage.h @@ -103,6 +103,7 @@ public: static bool AllowPageOverride(void); void forceRedraw(bool b) { m_forceRedraw = b; } bool forceRedraw(void) { return m_forceRedraw; } + void redrawCommand(); protected: void onBeforeChange(const App::Property* prop) override; diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index ca8f060b5b..95a908b071 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -74,9 +74,11 @@ DrawProjGroup::DrawProjGroup(void) ProjectionType.setEnums(ProjectionTypeEnums); - ADD_PROPERTY(ProjectionType, ((long)getDefProjConv())); + ADD_PROPERTY_TYPE(ProjectionType, ((long)getDefProjConv()), group, + App::Prop_None, "First or Third Angle projection"); - ADD_PROPERTY_TYPE(AutoDistribute ,(autoDist),agroup,App::Prop_None,"Distribute Views Automatically or Manually"); + 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"); ADD_PROPERTY_TYPE(spacingY, (15), agroup, App::Prop_None, "Vertical spacing between views"); Rotation.setStatus(App::Property::Hidden,true); //DPG does not rotate @@ -108,8 +110,13 @@ void DrawProjGroup::onChanged(const App::Property* prop) // } } if (prop == &Scale) { - updateChildren(); + updateChildrenScale(); } + + if (prop == &ProjectionType) { + updateChildrenEnforce(); + } + if (prop == &Source) { updateChildrenSource(); } @@ -168,17 +175,8 @@ App::DocumentObjectExecReturn *DrawProjGroup::execute(void) //no anchor yet. nothing to do. return DrawViewCollection::execute(); } - -// for (auto& v: Views.getValues()) { //is this needed here? Up to DPGI to keep up to date. -// v->recomputeFeature(); -// } - for (auto& item: getViewsAsDPGI()) { - bool touched = item->isTouched(); - item->autoPosition(); - if(!touched) - item->purgeTouched(); - } + autoPositionChildren(); return DrawViewCollection::execute(); } @@ -853,16 +851,42 @@ void DrawProjGroup::makeViewBbs(DrawProjGroupItem *viewPtrs[10], } } -/*! - * tell children DPGIs that parent DPG has changed Scale - */ -void DrawProjGroup::updateChildren(void) +void DrawProjGroup::recomputeChildren(void) +{ +// Base::Console().Message("DPG::recomputeChildren()\n"); + for( const auto it : Views.getValues() ) { + auto view( dynamic_cast(it) ); + if (view == nullptr) { + throw Base::TypeError("Error: projection in DPG list is not a DPGI!"); + } else { + view->recomputeFeature(); + } + } +} + +void DrawProjGroup::autoPositionChildren(void) { + for( const auto it : Views.getValues() ) { + auto view( dynamic_cast(it) ); + if (view == nullptr) { + throw Base::TypeError("Error: projection in DPG list is not a DPGI!"); + } else { + view->autoPosition(); + } + } +} + +/*! + * tell children DPGIs that parent DPG has changed Scale + */ +void DrawProjGroup::updateChildrenScale(void) +{ +// Base::Console().Message("DPG::updateChildrenScale\n"); for( const auto it : Views.getValues() ) { auto view( dynamic_cast(it) ); if (view == nullptr) { //if an element in Views is not a DPGI, something really bad has happened somewhere - Base::Console().Log("PROBLEM - DPG::updateChildren - non DPGI entry in Views! %s\n", + Base::Console().Log("PROBLEM - DPG::updateChildrenScale - non DPGI entry in Views! %s\n", getNameInDocument()); throw Base::TypeError("Error: projection in DPG list is not a DPGI!"); } else if(view->Scale.getValue()!=Scale.getValue()) { @@ -906,6 +930,21 @@ void DrawProjGroup::updateChildrenLock(void) } } +void DrawProjGroup::updateChildrenEnforce(void) +{ + for( const auto it : Views.getValues() ) { + auto view( dynamic_cast(it) ); + if (view == nullptr) { + //if an element in Views is not a DPGI, something really bad has happened somewhere + Base::Console().Log("PROBLEM - DPG::updateChildrenEnforce - non DPGI entry in Views! %s\n", + getNameInDocument()); + throw Base::TypeError("Error: projection in DPG list is not a DPGI!"); + } else { + view->enforceRecompute(); + } + } +} + /*! * check if ProjectionGroup fits on Page */ diff --git a/src/Mod/TechDraw/App/DrawProjGroup.h b/src/Mod/TechDraw/App/DrawProjGroup.h index 00d4736f69..1148c4e6e1 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.h +++ b/src/Mod/TechDraw/App/DrawProjGroup.h @@ -127,6 +127,11 @@ public: void dumpISO(char * title); std::vector getViewsAsDPGI(); + void recomputeChildren(void); + void updateChildrenScale(void); + void autoPositionChildren(void); + void updateChildrenEnforce(void); + protected: void onChanged(const App::Property* prop) override; @@ -158,7 +163,7 @@ protected: /// Returns pointer to our page, or NULL if it couldn't be located TechDraw::DrawPage * getPage(void) const; - void updateChildren(void); + void updateChildrenSource(void); void updateChildrenLock(void); int getViewIndex(const char *viewTypeCStr) const; diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp index 25cead722b..fdfafcd80b 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp @@ -133,24 +133,20 @@ bool DrawProjGroupItem::showLock(void) const App::DocumentObjectExecReturn *DrawProjGroupItem::execute(void) { +// Base::Console().Message("DPGI::execute(%s)\n",Label.getValue()); if (DrawUtil::checkParallel(Direction.getValue(), RotationVector.getValue())) { return new App::DocumentObjectExecReturn("DPGI: Direction and RotationVector are parallel"); } - App::DocumentObjectExecReturn * ret = DrawViewPart::execute(); - if (ret != nullptr) { - return ret; - } else { - autoPosition(); - delete ret; - } - return App::DocumentObject::StdReturn; + App::DocumentObjectExecReturn* ret = DrawViewPart::execute(); + autoPosition(); + return ret; } void DrawProjGroupItem::autoPosition() { -// Base::Console().Message("DPGI::autoPosition(%s)\n",getNameInDocument()); +// Base::Console().Message("DPGI::autoPosition(%s)\n",Label.getValue()); auto pgroup = getPGroup(); Base::Vector3d newPos; if (pgroup != nullptr) { diff --git a/src/Mod/TechDraw/App/DrawViewDetail.cpp b/src/Mod/TechDraw/App/DrawViewDetail.cpp index fbd11638b5..ac2cbdb66c 100644 --- a/src/Mod/TechDraw/App/DrawViewDetail.cpp +++ b/src/Mod/TechDraw/App/DrawViewDetail.cpp @@ -144,7 +144,8 @@ void DrawViewDetail::onChanged(const App::Property* prop) if ((prop == &Reference) || (prop == &Radius) || (prop == &AnchorPoint)) { - BaseView.getValue()->touch(); //hack. sb "update graphics" +// BaseView.getValue()->touch(); //hack. sb "update graphics" + enforceRecompute(); } } diff --git a/src/Mod/TechDraw/App/DrawViewDimension.cpp b/src/Mod/TechDraw/App/DrawViewDimension.cpp index 4ff4229250..4dd1e0ac97 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.cpp +++ b/src/Mod/TechDraw/App/DrawViewDimension.cpp @@ -93,22 +93,22 @@ enum RefType{ DrawViewDimension::DrawViewDimension(void) { - ADD_PROPERTY_TYPE(References2D,(0,0),"",(App::PropertyType)(App::Prop_None),"Projected Geometry References"); + ADD_PROPERTY_TYPE(References2D,(0,0),"",(App::Prop_None),"Projected Geometry References"); References2D.setScope(App::LinkScope::Global); - ADD_PROPERTY_TYPE(References3D,(0,0),"",(App::PropertyType)(App::Prop_None),"3D Geometry References"); + ADD_PROPERTY_TYPE(References3D,(0,0),"",(App::Prop_None),"3D Geometry References"); References3D.setScope(App::LinkScope::Global); - ADD_PROPERTY_TYPE(FormatSpec,("") , "Format",(App::PropertyType)(App::Prop_None),"Dimension Format"); - ADD_PROPERTY_TYPE(Arbitrary,(false) ,"Format",(App::PropertyType)(App::Prop_None),"Value overridden by user"); + ADD_PROPERTY_TYPE(FormatSpec,("") , "Format", App::Prop_Output,"Dimension Format"); + ADD_PROPERTY_TYPE(Arbitrary,(false) ,"Format", App::Prop_Output,"Value overridden by user"); Type.setEnums(TypeEnums); //dimension type: length, radius etc ADD_PROPERTY(Type,((long)0)); MeasureType.setEnums(MeasureTypeEnums); ADD_PROPERTY(MeasureType, ((long)1)); //Projected (or True) measurement - ADD_PROPERTY_TYPE(TheoreticalExact,(false),"",(App::PropertyType)(App::Prop_None),"Set for theoretical exact (basic) dimension"); - ADD_PROPERTY_TYPE(OverTolerance ,(0.0),"",App::Prop_None,"+ Tolerance value"); - ADD_PROPERTY_TYPE(UnderTolerance ,(0.0),"",App::Prop_None,"- Tolerance value"); - ADD_PROPERTY_TYPE(Inverted,(false),"",(App::PropertyType)(App::Prop_None),"The dimensional value is displayed inverted"); + ADD_PROPERTY_TYPE(TheoreticalExact,(false),"", App::Prop_Output,"Set for theoretical exact (basic) dimension"); + ADD_PROPERTY_TYPE(OverTolerance ,(0.0),"", App::Prop_Output,"+ Tolerance value"); + ADD_PROPERTY_TYPE(UnderTolerance ,(0.0),"", App::Prop_Output,"- Tolerance value"); + ADD_PROPERTY_TYPE(Inverted,(false),"", App::Prop_Output,"The dimensional value is displayed inverted"); //hide the properties the user can't edit in the property editor // References2D.setStatus(App::Property::Hidden,true); @@ -160,19 +160,25 @@ void DrawViewDimension::onChanged(const App::Property* prop) Base::Console().Warning("%s has no 3D References but is Type: True\n", getNameInDocument()); MeasureType.setValue("Projected"); } - } - if (prop == &References3D) { //have to rebuild the Measurement object + } else if (prop == &References3D) { //have to rebuild the Measurement object clear3DMeasurements(); //Measurement object if (!(References3D.getValues()).empty()) { setAll3DMeasurement(); } else { - if (MeasureType.isValue("True")) { //empty 3dRefs, but True - MeasureType.touch(); //run MeasureType logic for this case + if (MeasureType.isValue("True")) { //empty 3dRefs, but True + MeasureType.touch(); //run MeasureType logic for this case } } - } - if (prop == &Type) { + } else if (prop == &Type) { //why?? FormatSpec.setValue(getDefaultFormatSpec().c_str()); + } else if ( (prop == &FormatSpec) || + (prop == &Arbitrary) || + (prop == &MeasureType) || + (prop == &TheoreticalExact) || + (prop == &OverTolerance) || + (prop == &UnderTolerance) || + (prop == &Inverted) ) { +// nothing in particular } } @@ -191,18 +197,15 @@ short DrawViewDimension::mustExecute() const { bool result = 0; if (!isRestoring()) { - result = (References2D.isTouched() || + result = (References2D.isTouched() || Type.isTouched() || FormatSpec.isTouched() || - MeasureType.isTouched()); - } - if (result) { - return result; - } - - auto dvp = getViewPart(); - if (dvp != nullptr) { - result = dvp->isTouched(); + Arbitrary.isTouched() || + MeasureType.isTouched() || + TheoreticalExact.isTouched() || + OverTolerance.isTouched() || + UnderTolerance.isTouched() || + Inverted.isTouched() ); } if (result) { return result; @@ -572,10 +575,10 @@ std::string DrawViewDimension::getFormatedValue(int partial) } } else { //handle single value schemes - QRegExp rxUnits(QString::fromUtf8(" \\D*$")); //space + any non digits at end of string + QRegExp rxUnits(QString::fromUtf8(" \\D*$")); //space + any non digits at end of string QString userVal = userStr; - userVal.remove(rxUnits); //getUserString(defaultDecimals) without units + userVal.remove(rxUnits); //getUserString(defaultDecimals) without units QLocale loc; double userValNum = loc.toDouble(userVal); @@ -583,7 +586,7 @@ std::string DrawViewDimension::getFormatedValue(int partial) // QString userUnits; int pos = 0; if ((pos = rxUnits.indexIn(userStr, 0)) != -1) { - userUnits = rxUnits.cap(0); //entire capture - non numerics at end of userString + userUnits = rxUnits.cap(0); //entire capture - non numerics at end of userString } //find the %x.y tag in FormatSpec diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 2ca3c495c3..bbb2cf2351 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -133,7 +133,8 @@ DrawViewPart::DrawViewPart(void) : Source.setScope(App::LinkScope::Global); ADD_PROPERTY_TYPE(Direction ,(0.0,-1.0,0.0), group,App::Prop_None,"Projection direction. The direction you are looking from."); - ADD_PROPERTY_TYPE(Perspective ,(false),group,App::Prop_None,"Perspective(true) or Orthographic(false) projection"); + ADD_PROPERTY_TYPE(Perspective ,(false),group,App::Prop_None, + "Perspective(true) or Orthographic(false) projection"); ADD_PROPERTY_TYPE(Focus,(defDist),group,App::Prop_None,"Perspective view focus distance"); //properties that control HLR algoaffect Appearance @@ -149,10 +150,10 @@ DrawViewPart::DrawViewPart(void) : ADD_PROPERTY_TYPE(IsoHidden ,(false),sgroup,App::Prop_None,"Hidden Iso u,v lines on/off"); ADD_PROPERTY_TYPE(IsoCount ,(0),sgroup,App::Prop_None,"Number of isoparameters"); - ADD_PROPERTY_TYPE(CosmeticVertexes ,(0),sgroup,App::Prop_None,"CosmeticVertex Save/Restore"); - ADD_PROPERTY_TYPE(CosmeticEdges ,(0),sgroup,App::Prop_None,"CosmeticEdge Save/Restore"); - ADD_PROPERTY_TYPE(CenterLines ,(0),sgroup,App::Prop_None,"Geometry format Save/Restore"); - ADD_PROPERTY_TYPE(GeomFormats ,(0),sgroup,App::Prop_None,"Geometry format Save/Restore"); + ADD_PROPERTY_TYPE(CosmeticVertexes ,(0),sgroup,App::Prop_Output,"CosmeticVertex Save/Restore"); + ADD_PROPERTY_TYPE(CosmeticEdges ,(0),sgroup,App::Prop_Output,"CosmeticEdge Save/Restore"); + ADD_PROPERTY_TYPE(CenterLines ,(0),sgroup,App::Prop_Output,"Geometry format Save/Restore"); + ADD_PROPERTY_TYPE(GeomFormats ,(0),sgroup,App::Prop_Output,"Geometry format Save/Restore"); geometryObject = nullptr; getRunControl(); @@ -283,7 +284,7 @@ TopoDS_Shape DrawViewPart::getSourceShapeFused(void) const App::DocumentObjectExecReturn *DrawViewPart::execute(void) { -// Base::Console().Message("DVP::execute()\n"); +// Base::Console().Message("DVP::execute() - %s\n", Label.getValue()); if (!keepUpdated()) { return App::DocumentObject::StdReturn; } @@ -323,8 +324,8 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) shapeCentroid = Base::Vector3d(inputCenter.X(),inputCenter.Y(),inputCenter.Z()); TopoDS_Shape mirroredShape; mirroredShape = TechDraw::mirrorShape(shape, - inputCenter, - getScale()); + inputCenter, + getScale()); gp_Ax2 viewAxis = getViewAxis(shapeCentroid,Direction.getValue()); if (!DrawUtil::fpCompare(Rotation.getValue(),0.0)) { @@ -361,8 +362,7 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) #endif //#if MOD_TECHDRAW_HANDLE_FACES - requestPaint(); - return App::DocumentObject::StdReturn; + return DrawView::execute(); } short DrawViewPart::mustExecute() const @@ -371,8 +371,6 @@ short DrawViewPart::mustExecute() const if (!isRestoring()) { result = (Direction.isTouched() || Source.isTouched() || - Scale.isTouched() || - ScaleType.isTouched() || Perspective.isTouched() || Focus.isTouched() || Rotation.isTouched() || @@ -646,9 +644,10 @@ std::vector DrawViewPart::getBalloons() const return result; } -const std::vector & DrawViewPart::getVertexGeometry() const +const std::vector DrawViewPart::getVertexGeometry() const { - return geometryObject->getVertexGeometry(); + std::vector gVerts = geometryObject->getVertexGeometry(); + return gVerts; } const std::vector & DrawViewPart::getFaceGeometry() const @@ -960,6 +959,13 @@ void DrawViewPart::clearCosmeticVertexes(void) CosmeticVertexes.setValues(noVerts); } +//CosmeticVertex x,y are stored as unscaled, but mirrored values. +//if you are creating a CV based on calculations of scaled geometry, you need to +//unscale x,y before creation. +//if you are creating a CV based on calculations of mirrored geometry, you need to +//mirror again before creation. + +//returns CosmeticVertex index! not geomVertexNumber! int DrawViewPart::addCosmeticVertex(Base::Vector3d pos) { std::vector verts = CosmeticVertexes.getValues(); @@ -1000,6 +1006,7 @@ void DrawViewPart::removeCosmeticVertex(TechDraw::CosmeticVertex* cv) } } +//this is by CV index, not the index returned by selection void DrawViewPart::removeCosmeticVertex(int idx) { std::vector verts = CosmeticVertexes.getValues(); @@ -1048,7 +1055,8 @@ TechDraw::CosmeticVertex* DrawViewPart::getCosmeticVertexByIndex(int idx) const return result; } -//find the cosmetic vertex corresponding to geometry vertex idx +// find the cosmetic vertex corresponding to geometry vertex idx +// used when selecting TechDraw::CosmeticVertex* DrawViewPart::getCosmeticVertexByGeom(int idx) const { CosmeticVertex* result = nullptr; diff --git a/src/Mod/TechDraw/App/DrawViewPart.h b/src/Mod/TechDraw/App/DrawViewPart.h index a3f810691f..9afaf4344e 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.h +++ b/src/Mod/TechDraw/App/DrawViewPart.h @@ -127,7 +127,7 @@ public: std::vector getDimensions() const; std::vector getBalloons() const; - const std::vector & getVertexGeometry() const; + const std::vector getVertexGeometry() const; const std::vector & getEdgeGeometry() const; const std::vector getVisibleFaceEdges() const; const std::vector & getFaceGeometry() const; @@ -210,7 +210,7 @@ protected: TechDraw::GeometryObject *geometryObject; Base::BoundBox3d bbox; - void onChanged(const App::Property* prop) override; + virtual void onChanged(const App::Property* prop) override; virtual void unsetupObject() override; virtual TechDraw::GeometryObject* buildGeometryObject(TopoDS_Shape shape, gp_Ax2 viewAxis); diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index 1c2bb4a1ad..b322a04ac5 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -342,8 +342,7 @@ App::DocumentObjectExecReturn *DrawViewSection::execute(void) //add centerlines to geometry edges list addCenterLinesToGeom(); - requestPaint(); - return App::DocumentObject::StdReturn; + return DrawView::execute(); } gp_Pln DrawViewSection::getSectionPlane() const diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 78ac9e54e8..9111363755 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -234,6 +234,43 @@ bool CmdTechDrawNewPage::isActive(void) return hasActiveDocument(); } +//=========================================================================== +// TechDraw_Redraw +//=========================================================================== + +DEF_STD_CMD_A(CmdTechDrawRedraw) + +CmdTechDrawRedraw::CmdTechDrawRedraw() + : Command("TechDraw_Redraw") +{ + sAppModule = "TechDraw"; + sGroup = QT_TR_NOOP("TechDraw"); + sMenuText = QT_TR_NOOP("Redraw a page"); + sToolTipText = QT_TR_NOOP("Redraw a page"); + sWhatsThis = "TechDraw_Redraw"; + sStatusTip = sToolTipText; + sPixmap = "actions/techdraw-forceredraw"; +} + +void CmdTechDrawRedraw::activated(int iMsg) +{ + Q_UNUSED(iMsg); + TechDraw::DrawPage* page = DrawGuiUtil::findPage(this); + if (!page) { + return; + } + Gui::WaitCursor wc; + + page->redrawCommand(); +} + +bool CmdTechDrawRedraw::isActive(void) +{ + bool havePage = DrawGuiUtil::needPage(this); + bool haveView = DrawGuiUtil::needView(this,false); + return (havePage && haveView); +} + //=========================================================================== // TechDraw_NewView //=========================================================================== @@ -561,9 +598,12 @@ void CmdTechDrawProjGroup::activated(int iMsg) Gui::WaitCursor wc; openCommand("Create Projection Group"); + std::string multiViewName = getUniqueObjectName("ProjGroup"); - doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawProjGroup','%s')",multiViewName.c_str()); - doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),multiViewName.c_str()); + doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawProjGroup','%s')", + multiViewName.c_str()); + doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)", + PageName.c_str(),multiViewName.c_str()); App::DocumentObject *docObj = getDocument()->getObject(multiViewName.c_str()); auto multiView( static_cast(docObj) ); @@ -578,7 +618,6 @@ void CmdTechDrawProjGroup::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Anchor.RotationVector = FreeCAD.Vector(%.3f,%.3f,%.3f)", multiViewName.c_str(), dirs.second.x,dirs.second.y,dirs.second.z); getDocument()->setStatus(App::Document::Status::SkipRecompute, false); - doCommand(Doc,"App.activeDocument().%s.Anchor.recompute()", multiViewName.c_str()); } else { std::pair dirs = DrawGuiUtil::get3DDirAndRot(); getDocument()->setStatus(App::Document::Status::SkipRecompute, true); @@ -587,13 +626,14 @@ void CmdTechDrawProjGroup::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Anchor.RotationVector = FreeCAD.Vector(%.3f,%.3f,%.3f)", multiViewName.c_str(), dirs.second.x,dirs.second.y,dirs.second.z); getDocument()->setStatus(App::Document::Status::SkipRecompute, false); - doCommand(Doc,"App.activeDocument().%s.Anchor.recompute()", multiViewName.c_str()); } - commitCommand(); //write the undo + + doCommand(Doc,"App.activeDocument().%s.Anchor.recompute()", multiViewName.c_str()); + commitCommand(); + updateActive(); // create the rest of the desired views Gui::Control().showDialog(new TaskDlgProjGroup(multiView,true)); - } bool CmdTechDrawProjGroup::isActive(void) @@ -1276,6 +1316,7 @@ void CreateTechDrawCommands(void) rcCmdMgr.addCommand(new CmdTechDrawNewPageDef()); rcCmdMgr.addCommand(new CmdTechDrawNewPage()); + rcCmdMgr.addCommand(new CmdTechDrawRedraw()); rcCmdMgr.addCommand(new CmdTechDrawNewView()); rcCmdMgr.addCommand(new CmdTechDrawNewActiveView()); rcCmdMgr.addCommand(new CmdTechDrawNewViewSection()); diff --git a/src/Mod/TechDraw/Gui/CommandDecorate.cpp b/src/Mod/TechDraw/Gui/CommandDecorate.cpp index db246a0d41..12459233f8 100644 --- a/src/Mod/TechDraw/Gui/CommandDecorate.cpp +++ b/src/Mod/TechDraw/Gui/CommandDecorate.cpp @@ -471,43 +471,6 @@ bool CmdTechDrawToggleFrame::isActive(void) return (havePage && haveView); } -//=========================================================================== -// TechDraw_Redraw -//=========================================================================== - -DEF_STD_CMD_A(CmdTechDrawRedraw) - -CmdTechDrawRedraw::CmdTechDrawRedraw() - : Command("TechDraw_Redraw") -{ - sAppModule = "TechDraw"; - sGroup = QT_TR_NOOP("TechDraw"); - sMenuText = QT_TR_NOOP("Redraw a page"); - sToolTipText = QT_TR_NOOP("Redraw a page"); - sWhatsThis = "TechDraw_Redraw"; - sStatusTip = sToolTipText; - sPixmap = "actions/techdraw-forceredraw"; -} - -void CmdTechDrawRedraw::activated(int iMsg) -{ - Q_UNUSED(iMsg); - TechDraw::DrawPage* page = DrawGuiUtil::findPage(this); - if (!page) { - return; - } - Gui::WaitCursor wc; - - page->forceRedraw(true); - page->updateAllViews(); - page->forceRedraw(false); -} - -bool CmdTechDrawRedraw::isActive(void) -{ - bool havePage = DrawGuiUtil::needPage(this); - return (havePage); -} void CreateTechDrawCommandsDecorate(void) { @@ -517,7 +480,6 @@ void CreateTechDrawCommandsDecorate(void) rcCmdMgr.addCommand(new CmdTechDrawNewGeomHatch()); rcCmdMgr.addCommand(new CmdTechDrawImage()); rcCmdMgr.addCommand(new CmdTechDrawToggleFrame()); - rcCmdMgr.addCommand(new CmdTechDrawRedraw()); // rcCmdMgr.addCommand(new CmdTechDrawLeaderLine()); // rcCmdMgr.addCommand(new CmdTechDrawRichAnno()); } diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 0c4a6f394d..1b2a716c6a 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -242,6 +242,7 @@ void QGIView::mousePressEvent(QGraphicsSceneMouseEvent * event) void QGIView::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) { + //TODO: this should be done in itemChange if(!m_locked) { if (!isInnerView()) { double tempX = x(), @@ -337,13 +338,6 @@ void QGIView::updateView(bool update) setFlag(QGraphicsItem::ItemIsMovable, true); } - if (getViewObject()->X.isTouched() || //change in feat position - getViewObject()->Y.isTouched()) { - double featX = Rez::guiX(getViewObject()->X.getValue()); - double featY = Rez::guiX(getViewObject()->Y.getValue()); - setPosition(featX,featY); - } - double appRotation = getViewObject()->Rotation.getValue(); double guiRotation = rotation(); if (!TechDraw::DrawUtil::fpCompare(appRotation,guiRotation)) { @@ -412,6 +406,13 @@ void QGIView::toggleCache(bool state) void QGIView::draw() { +// Base::Console().Message("QGIV::draw()\n"); + double x, y; + if (getViewObject() != nullptr) { + x = Rez::guiX(getViewObject()->X.getValue()); + y = Rez::guiX(getViewObject()->Y.getValue()); + setPosition(x, y); + } if (isVisible()) { drawBorder(); show(); diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index d9da244168..1bbdd5c7ae 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -297,6 +297,7 @@ QPainterPath QGIViewPart::geomToPainterPath(TechDraw::BaseGeom *baseGeom, double void QGIViewPart::updateView(bool update) { +// Base::Console().Message("QGIVP::updateView()\n"); auto start = std::chrono::high_resolution_clock::now(); auto viewPart( dynamic_cast(getViewObject()) ); if( viewPart == nullptr ) { @@ -307,11 +308,10 @@ void QGIViewPart::updateView(bool update) return; } - QGIView::updateView(update); - if (update ) { draw(); } + QGIView::updateView(update); auto end = std::chrono::high_resolution_clock::now(); auto diff = end - start; @@ -320,13 +320,13 @@ void QGIViewPart::updateView(bool update) } void QGIViewPart::draw() { +// Base::Console().Message("QGIVP::draw()\n"); if (!isVisible()) { return; } drawViewPart(); drawMatting(); - QGIView::draw(); //this is old C/L drawCenterLines(true); //have to draw centerlines after border to get size correct. drawAllSectionLines(); //same for section lines @@ -334,7 +334,7 @@ void QGIViewPart::draw() { void QGIViewPart::drawViewPart() { -// Base::Console().Message("QGIVP::dvp()\n"); +// Base::Console().Message("QGIVP::DVP()\n"); auto viewPart( dynamic_cast(getViewObject()) ); if ( viewPart == nullptr ) { return; @@ -519,7 +519,6 @@ void QGIViewPart::drawViewPart() bool showVertices = true; bool showCenterMarks = true; -// bool usePolygonHLR = viewPart->CoarseView.getValue(); if (getFrameState()) { //frames are on if (viewPart->CoarseView.getValue()) { showVertices = false; @@ -655,7 +654,6 @@ void QGIViewPart::removePrimitives() QGIPrimPath* prim = dynamic_cast(c); if (prim) { prim->hide(); -// removeFromGroup(prim); scene()->removeItem(prim); delete prim; } @@ -674,12 +672,10 @@ void QGIViewPart::removeDecorations() QGIMatting* mat = dynamic_cast(c); if (decor) { decor->hide(); -// removeFromGroup(decor); scene()->removeItem(decor); delete decor; } else if (mat) { mat->hide(); -// removeFromGroup(mat); scene()->removeItem(mat); delete mat; } diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp index 88c31a1769..aeb1d55592 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp @@ -27,6 +27,8 @@ #include #endif // #ifndef _PreComp_ +#include + #include #include @@ -116,6 +118,7 @@ TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode) : m_mdi = dvp->getMDIViewPage(); setUiPrimary(); + saveGroupState(); } TaskProjGroup::~TaskProjGroup() @@ -123,6 +126,42 @@ TaskProjGroup::~TaskProjGroup() delete ui; } +void TaskProjGroup::saveGroupState() +{ +// Base::Console().Message("TPG::saveGroupState()\n"); + if (multiView != nullptr) { + m_saveSource = multiView->Source.getValues(); + m_saveProjType = multiView->ProjectionType.getValueAsString(); + m_saveScaleType = multiView->ScaleType.getValueAsString(); + m_saveScale = multiView->Scale.getValue(); + DrawProjGroupItem* anchor = multiView->getAnchor(); + m_saveDirection = anchor->Direction.getValue(); + } + for( const auto it : multiView->Views.getValues() ) { + auto view( dynamic_cast(it) ); + if (view != nullptr) { + m_saveViewNames.push_back(view->Type.getValueAsString()); + } + } +} + +//never used? +void TaskProjGroup::restoreGroupState() +{ + Base::Console().Message("TPG::restoreGroupState()\n"); + if (multiView != nullptr) { + multiView->ProjectionType.setValue(m_saveProjType.c_str()); + multiView->ScaleType.setValue(m_saveScaleType.c_str()); + multiView->Scale.setValue(m_saveScale); + multiView->purgeProjections(); + for(auto & sv : m_saveViewNames) { + if (sv != "Front") { + multiView->addProjection(sv.c_str()); + } + } + } +} + void TaskProjGroup::viewToggled(bool toggle) { Gui::WaitCursor wc; @@ -132,10 +171,9 @@ void TaskProjGroup::viewToggled(bool toggle) int index = viewName.mid(7).toInt(); const char *viewNameCStr = viewChkIndexToCStr(index); if ( toggle && !multiView->hasProjection( viewNameCStr ) ) { - (void) multiView->addProjection( viewNameCStr ); //maybe this should be send a message instead of blocking? -// Gui::Command::doCommand(Gui::Command::Doc, // Gui response is no faster with this. :( -// "App.activeDocument().%s.addProjection('%s')", -// multiView->getNameInDocument(), viewNameCStr); + Gui::Command::doCommand(Gui::Command::Doc, + "App.activeDocument().%s.addProjection('%s')", + multiView->getNameInDocument(), viewNameCStr); changed = true; } else if ( !toggle && multiView->hasProjection( viewNameCStr ) ) { multiView->removeProjection( viewNameCStr ); @@ -164,26 +202,15 @@ void TaskProjGroup::rotateButtonClicked(void) multiView->rotateRight(); } else if ( clicked == ui->butLeftRotate) { multiView->rotateLeft(); - } else if ( clicked == ui->butCWRotate ) { //doesn't change Anchor view dir. changes projType of secondaries, not dir + } else if ( clicked == ui->butCWRotate ) { multiView->spinCW(); } else if ( clicked == ui->butCCWRotate) { multiView->spinCCW(); } setUiPrimary(); - - multiView->recomputeFeature(true); } } -//void TaskProjGroup::onResetClicked(void) -//{ -// TechDraw::DrawProjGroupItem* front = multiView->getProjItem("Front"); -// if (front) { -// setUiPrimary(); -// Gui::Command::updateActive(); -// } -//} - void TaskProjGroup::projectionTypeChanged(int index) { if(blockUpdate) @@ -191,19 +218,14 @@ void TaskProjGroup::projectionTypeChanged(int index) if(index == 0) { //layout per Page (Document) - Gui::Command::doCommand(Gui::Command::Doc, - "App.activeDocument().%s.ProjectionType = '%s'", - multiView->getNameInDocument(), "Default"); + multiView->ProjectionType.setValue("Default"); + } else if(index == 1) { // First Angle layout - Gui::Command::doCommand(Gui::Command::Doc, - "App.activeDocument().%s.ProjectionType = '%s'", - multiView->getNameInDocument(), "First Angle"); + multiView->ProjectionType.setValue("First Angle"); } else if(index == 2) { // Third Angle layout - Gui::Command::doCommand(Gui::Command::Doc, - "App.activeDocument().%s.ProjectionType = '%s'", - multiView->getNameInDocument(), "Third Angle"); + multiView->ProjectionType.setValue("Third Angle"); } else { Base::Console().Log("Error - TaskProjGroup::projectionTypeChanged - unknown projection layout: %d\n", index); @@ -212,9 +234,6 @@ void TaskProjGroup::projectionTypeChanged(int index) // Update checkboxes so checked state matches the drawing setupViewCheckboxes(); - - multiView->recomputeFeature(true); - } void TaskProjGroup::scaleTypeChanged(int index) @@ -228,12 +247,9 @@ void TaskProjGroup::scaleTypeChanged(int index) if(index == 0) { // Document Scale Type - Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.ScaleType = '%s'", multiView->getNameInDocument() - , "Page"); + multiView->ScaleType.setValue("Page"); } else if(index == 1) { // Automatic Scale Type -// Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.ScaleType = '%s'", multiView->getNameInDocument() -// , "Automatic"); //block recompute multiView->ScaleType.setValue("Automatic"); double autoScale = multiView->calculateAutomaticScale(); @@ -243,23 +259,19 @@ void TaskProjGroup::scaleTypeChanged(int index) } else if(index == 2) { // Custom Scale Type //block recompute - Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.ScaleType = '%s'", multiView->getNameInDocument() - , "Custom"); + multiView->ScaleType.setValue("Custom"); ui->sbScaleNum->setEnabled(true); ui->sbScaleDen->setEnabled(true); int a = ui->sbScaleNum->value(); int b = ui->sbScaleDen->value(); double scale = (double) a / (double) b; - Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Scale = %f", multiView->getNameInDocument() - , scale); + multiView->Scale.setValue(scale); //unblock recompute } else { Base::Console().Log("Error - TaskProjGroup::scaleTypeChanged - unknown scale type: %d\n",index); return; } - - multiView->recomputeFeature(true); } std::pair TaskProjGroup::nearestFraction(const double val, const long int maxDenom) const @@ -374,9 +386,10 @@ void TaskProjGroup::scaleManuallyChanged(int i) int b = ui->sbScaleDen->value(); double scale = (double) a / (double) b; + Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Scale = %f", multiView->getNameInDocument() , scale); - multiView->recomputeFeature(); //just a repaint. multiView is already marked for recompute by changed to Scale + multiView->recomputeFeature(); } void TaskProjGroup::changeEvent(QEvent *e) @@ -461,16 +474,34 @@ QString TaskProjGroup::formatVector(Base::Vector3d v) return data; } +void TaskProjGroup::saveButtons(QPushButton* btnOK, + QPushButton* btnCancel, + QPushButton* btnApply) +{ + m_btnOK = btnOK; + m_btnCancel = btnCancel; + m_btnApply = btnApply; +} + + +bool TaskProjGroup::apply() +{ +// Base::Console().Message("TPG::apply()\n"); + multiView->recomputeChildren(); + multiView->recomputeFeature(); + + return true; +} + bool TaskProjGroup::accept() { +// Base::Console().Message("TPG::accept()\n"); Gui::Document* doc = Gui::Application::Instance->getDocument(multiView->getDocument()); if (!doc) return false; - // if (!getCreateMode()) //this is an edit session, end the transaction - { - Gui::Command::commitCommand(); - } - //Gui::Command::updateActive(); //no chain of updates here + multiView->recomputeChildren(); + multiView->recomputeFeature(); + Gui::Command::doCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); return true; @@ -481,8 +512,8 @@ bool TaskProjGroup::reject() Gui::Document* doc = Gui::Application::Instance->getDocument(multiView->getDocument()); if (!doc) return false; -#if 0 if (getCreateMode()) { + //remove the object completely from the document std::string multiViewName = multiView->getNameInDocument(); std::string PageName = multiView->findParentPage()->getNameInDocument(); @@ -492,22 +523,18 @@ bool TaskProjGroup::reject() PageName.c_str(),multiViewName.c_str()); Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().removeObject('%s')",multiViewName.c_str()); Gui::Command::doCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); - //make sure any dangling objects are cleaned up - Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().recompute()"); } else { + //set the DPG and it's views back to entry state. if (Gui::Command::hasPendingCommand()) { - std::vector undos = Gui::Application::Instance->activeDocument()->getUndoVector(); - Gui::Application::Instance->activeDocument()->undo(1); - multiView->rebuildViewList(); + Gui::Command::abortCommand(); +// std::vector undos = Gui::Application::Instance->activeDocument()->getUndoVector(); +// Gui::Application::Instance->activeDocument()->undo(1); +// multiView->rebuildViewList(); +// apply(); } else { Base::Console().Log("TaskProjGroup: Edit mode - NO command is active\n"); } - - Gui::Command::doCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); } -#endif - - Gui::Command::abortCommand(); Gui::Command::runCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); return false; } @@ -541,17 +568,29 @@ void TaskDlgProjGroup::setCreateMode(bool b) widget->setCreateMode(b); } +void TaskDlgProjGroup::modifyStandardButtons(QDialogButtonBox* box) +{ + QPushButton* btnOK = box->button(QDialogButtonBox::Ok); + QPushButton* btnCancel = box->button(QDialogButtonBox::Cancel); + QPushButton* btnApply = box->button(QDialogButtonBox::Apply); + widget->saveButtons(btnOK, btnCancel, btnApply); +} + //==== calls from the TaskView =============================================================== void TaskDlgProjGroup::open() { - // if (!widget->getCreateMode()) { //this is an edit session, start a transaction - // Gui::Command::openCommand("Edit Projection Group"); - // } - App::GetApplication().setActiveTransaction("Edit Projection Group", true); + if (!widget->getCreateMode()) { //this is an edit session, start a transaction + App::GetApplication().setActiveTransaction("Edit Projection Group", true); + } } -void TaskDlgProjGroup::clicked(int) +void TaskDlgProjGroup::clicked(int i) { +// Q_UNUSED(i); +// Base::Console().Message("TDPG::clicked(%X)\n",i); + if (i == QMessageBox::Apply) { + widget->apply(); + } } bool TaskDlgProjGroup::accept() diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.h b/src/Mod/TechDraw/Gui/TaskProjGroup.h index 5100495cbf..fe3c7e12c1 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.h +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.h @@ -62,6 +62,12 @@ public: public: virtual bool accept(); virtual bool reject(); + virtual bool apply(); + void modifyStandardButtons(QDialogButtonBox* box); + void saveButtons(QPushButton* btnOK, + QPushButton* btnCancel, + QPushButton* btnApply); + void updateTask(); std::pair nearestFraction(const double val, const long int maxDenom = 999) const; // Sets the numerator and denominator widgets to match newScale @@ -91,22 +97,33 @@ protected: */ void setupViewCheckboxes(bool addConnections = false); void setUiPrimary(void); + void saveGroupState(); + void restoreGroupState(); + QString formatVector(Base::Vector3d v); + TechDraw::DrawPage* m_page; + MDIViewPage* m_mdi; + private: - //class Private; Ui_TaskProjGroup * ui; + TechDraw::DrawProjGroup* multiView; + bool m_createMode; + bool blockUpdate; /// Translate a view checkbox index into represented view string, depending on projection type const char * viewChkIndexToCStr(int index); -protected: - //ViewProviderProjGroup *viewProvider; - TechDraw::DrawProjGroup* multiView; - bool m_createMode; - TechDraw::DrawPage* m_page; - MDIViewPage* m_mdi; + QPushButton* m_btnOK; + QPushButton* m_btnCancel; + QPushButton* m_btnApply; + std::vector m_saveSource; + std::string m_saveProjType; + std::string m_saveScaleType; + double m_saveScale; + Base::Vector3d m_saveDirection; + std::vector m_saveViewNames; }; /// Simulation dialog for the TaskView @@ -120,6 +137,11 @@ public: const ViewProviderProjGroup * getViewProvider() const { return viewProvider; } TechDraw::DrawProjGroup * getMultiView() const { return multiView; } + + virtual QDialogButtonBox::StandardButtons getStandardButtons() const + { return QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel; } + virtual void modifyStandardButtons(QDialogButtonBox* box); + public: /// is called the TaskView when the dialog is opened virtual void open(); diff --git a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp index 2ca948ebe2..8871908f63 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp @@ -90,29 +90,11 @@ std::vector ViewProviderProjGroup::getDisplayModes(void) const void ViewProviderProjGroup::updateData(const App::Property* prop) { ViewProviderDrawingView::updateData(prop); - - if(prop == &(getObject()->Scale) || - prop == &(getObject()->ScaleType) || - prop == &(getObject()->Views) || - prop == &(getObject()->ProjectionType) || - prop == &(getObject()->LockPosition) ) { - QGIView* qgiv = getQView(); - if (qgiv) { - qgiv->updateView(true); - } - } - } void ViewProviderProjGroup::onChanged(const App::Property *prop) { - if (prop == &(getViewObject()->Scale)) { - if (getViewObject()->ScaleType.isValue("Automatic")) { - getMDIViewPage()->redraw1View(getViewObject()); - } - } else if (prop == &(getViewObject()->ScaleType)) { - getMDIViewPage()->redraw1View(getViewObject()); - } + ViewProviderDrawingView::onChanged(prop); } void ViewProviderProjGroup::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) diff --git a/src/Mod/TechDraw/Gui/Workbench.cpp b/src/Mod/TechDraw/Gui/Workbench.cpp index ce463390bc..e3f2813d53 100644 --- a/src/Mod/TechDraw/Gui/Workbench.cpp +++ b/src/Mod/TechDraw/Gui/Workbench.cpp @@ -53,6 +53,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const draw->setCommand("TechDraw"); *draw << "TechDraw_NewPageDef"; *draw << "TechDraw_NewPage"; + *draw << "TechDraw_Redraw"; *draw << "Separator"; *draw << "TechDraw_NewView"; *draw << "TechDraw_NewActiveView"; @@ -87,7 +88,6 @@ Gui::MenuItem* Workbench::setupMenuBar() const *draw << "TechDraw_Symbol"; *draw << "TechDraw_Image"; *draw << "TechDraw_ToggleFrame"; - *draw << "TechDraw_Redraw"; *draw << "Separator"; *draw << "TechDraw_Annotation"; *draw << "TechDraw_LeaderLine"; @@ -112,6 +112,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const pages->setCommand("TechDraw Pages"); *pages << "TechDraw_NewPageDef"; *pages << "TechDraw_NewPage"; + *pages << "TechDraw_Redraw"; Gui::ToolBarItem *views = new Gui::ToolBarItem(root); views->setCommand("TechDraw Views"); @@ -156,7 +157,6 @@ Gui::ToolBarItem* Workbench::setupToolBars() const *decor << "TechDraw_Symbol"; *decor << "TechDraw_Image"; *decor << "TechDraw_ToggleFrame"; - *decor << "TechDraw_Redraw"; Gui::ToolBarItem *anno = new Gui::ToolBarItem(root); anno->setCommand("TechDraw Annotation"); @@ -182,6 +182,7 @@ Gui::ToolBarItem* Workbench::setupCommandBars() const pages->setCommand("TechDraw Pages"); *pages << "TechDraw_NewPageDef"; *pages << "TechDraw_NewPage"; + *pages << "TechDraw_Redraw"; Gui::ToolBarItem *views = new Gui::ToolBarItem(root); views->setCommand("Views"); @@ -225,7 +226,6 @@ Gui::ToolBarItem* Workbench::setupCommandBars() const *decor << "TechDraw_Symbol"; *decor << "TechDraw_Image"; *decor << "TechDraw_ToggleFrame"; - *decor << "TechDraw_Redraw"; Gui::ToolBarItem *anno = new Gui::ToolBarItem(root); anno->setCommand("TechDraw Annotation");