diff --git a/src/Mod/Measure/App/Measurement.cpp b/src/Mod/Measure/App/Measurement.cpp index e9e2523c2bb7..01221d25cc26 100644 --- a/src/Mod/Measure/App/Measurement.cpp +++ b/src/Mod/Measure/App/Measurement.cpp @@ -127,9 +127,6 @@ MeasureType Measurement::getType() for (;obj != objects.end(); ++obj, ++subEl) { - const Part::Feature *refObj = static_cast((*obj)); - const Part::TopoShape& refShape = refObj->Shape.getShape(); - // Check if solid object if(strcmp((*subEl).c_str(), "") == 0) { vols++; @@ -137,7 +134,9 @@ MeasureType Measurement::getType() TopoDS_Shape refSubShape; try { - refSubShape = refShape.getSubShape((*subEl).c_str()); + refSubShape = Part::Feature::getShape(*obj,(*subEl).c_str(),true); + if(refSubShape.IsNull()) + return Invalid; } catch (Standard_Failure& e) { std::stringstream errorMsg; @@ -210,22 +209,13 @@ MeasureType Measurement::getType() TopoDS_Shape Measurement::getShape(App::DocumentObject *obj , const char *subName) const { - const Part::Feature *refObj = static_cast(obj); - const Part::TopoShape& refShape = refObj->Shape.getShape(); - - // Check if selecting whol object - if(strcmp(subName, "") == 0) { - return refShape.getShape(); - } else { - - TopoDS_Shape refSubShape; - try { - refSubShape = refShape.getSubShape(subName); - } - catch (Standard_Failure& e) { - throw Base::CADKernelError(e.GetMessageString()); - } - return refSubShape; + try { + auto shape = Part::Feature::getShape(obj,subName,true); + if(shape.IsNull()) + throw Part::NullShapeException("null shape"); + return shape; + } catch (Standard_Failure& e) { + throw Base::CADKernelError(e.GetMessageString()); } } diff --git a/src/Mod/TechDraw/App/AppTechDrawPy.cpp b/src/Mod/TechDraw/App/AppTechDrawPy.cpp index b4681341c0d0..513b8602f0d2 100644 --- a/src/Mod/TechDraw/App/AppTechDrawPy.cpp +++ b/src/Mod/TechDraw/App/AppTechDrawPy.cpp @@ -308,11 +308,13 @@ class Module : public Py::ExtensionModule try { EdgeWalker ew; ew.loadEdges(edgeList); - success = ew.perform(); - if (success) { + if(ew.perform()) { std::vector rw = ew.getResultNoDups(); std::vector sortedWires = ew.sortStrip(rw,true); - outerWire = new TopoShapeWirePy(new TopoShape(*sortedWires.begin())); + if(sortedWires.size()) { + outerWire = new TopoShapeWirePy(new TopoShape(*sortedWires.begin())); + success = true; + } } else { Base::Console().Warning("ATDP::findShapeOutline: input is not planar graph. Wire detection not done\n"); } @@ -461,6 +463,8 @@ class Module : public Py::ExtensionModule void write1ViewDxf( ImpExpDxfWrite& writer, TechDraw::DrawViewPart* dvp, bool alignPage) { + if(!dvp->hasGeometry()) + return; TechDraw::GeometryObject* go = dvp->getGeometryObject(); TopoDS_Shape s = TechDraw::mirrorShape(go->getVisHard()); double offX = 0.0; diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 8bcc87485a94..084c12325206 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -80,7 +80,7 @@ DrawPage::DrawPage(void) .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/General"); bool autoUpdate = hGrp->GetBool("KeepPagesUpToDate", 1l); - ADD_PROPERTY_TYPE(KeepUpdated, (autoUpdate), group, (App::PropertyType)(App::Prop_None), "Keep page in sync with model"); + ADD_PROPERTY_TYPE(KeepUpdated, (autoUpdate), group, (App::PropertyType)(App::Prop_Output), "Keep page in sync with model"); ADD_PROPERTY_TYPE(Template, (0), group, (App::PropertyType)(App::Prop_None), "Attached Template"); Template.setScope(App::LinkScope::Global); ADD_PROPERTY_TYPE(Views, (0), group, (App::PropertyType)(App::Prop_None), "Attached Views"); @@ -417,68 +417,26 @@ int DrawPage::getNextBalloonIndex(void) return result; } -void DrawPage::Restore(Base::XMLReader &reader) +void DrawPage::handleChangedPropertyType( + Base::XMLReader &reader, const char * TypeName, App::Property * prop) { - reader.readElement("Properties"); - int Cnt = reader.getAttributeAsInteger("Count"); - - for (int i=0 ;igetTypeId().getName(), TypeName) == 0){ //if the property type in obj == type in schema - schemaProp->Restore(reader); //nothing special to do - } else { - if (strcmp(PropName, "Scale") == 0) { - if (schemaProp->isDerivedFrom(App::PropertyFloatConstraint::getClassTypeId())){ //right property type - schemaProp->Restore(reader); //nothing special to do - } else { //Scale, but not PropertyFloatConstraint - App::PropertyFloat tmp; - if (strcmp(tmp.getTypeId().getName(),TypeName)) { //property in file is Float - tmp.setContainer(this); - tmp.Restore(reader); - double tmpValue = tmp.getValue(); - if (tmpValue > 0.0) { - static_cast(schemaProp)->setValue(tmpValue); - } else { - static_cast(schemaProp)->setValue(1.0); - } - } else { - // has Scale prop that isn't Float! - Base::Console().Log("DrawPage::Restore - old Document Scale is Not Float!\n"); - // no idea - } - } - } else { - Base::Console().Log("DrawPage::Restore - old Document has unknown Property\n"); - } - } + if (prop == &Scale) { + App::PropertyFloat tmp; + if (strcmp(tmp.getTypeId().getName(),TypeName)==0) { //property in file is Float + tmp.setContainer(this); + tmp.Restore(reader); + double tmpValue = tmp.getValue(); + if (tmpValue > 0.0) { + Scale.setValue(tmpValue); + } else { + Scale.setValue(1.0); } + } else { + // has Scale prop that isn't Float! + Base::Console().Log("DrawPage::Restore - old Document Scale is Not Float!\n"); + // no idea } - catch (const Base::XMLParseException&) { - throw; // re-throw - } - catch (const Base::Exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const std::exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const char* e) { - Base::Console().Error("%s\n", e); - } -#ifndef FC_DEBUG - catch (...) { - Base::Console().Error("PropertyContainer::Restore: Unknown C++ exception thrown\n"); - } -#endif - - reader.readEndElement("Property"); } - reader.readEndElement("Properties"); } // Python Drawing feature --------------------------------------------------------- diff --git a/src/Mod/TechDraw/App/DrawPage.h b/src/Mod/TechDraw/App/DrawPage.h index 70362a95a832..55d5905e52a4 100644 --- a/src/Mod/TechDraw/App/DrawPage.h +++ b/src/Mod/TechDraw/App/DrawPage.h @@ -57,7 +57,8 @@ class TechDrawExport DrawPage: public App::DocumentObject /// recalculate the Feature virtual App::DocumentObjectExecReturn *execute(void); //@} - void Restore(Base::XMLReader &reader); + virtual void handleChangedPropertyType( + Base::XMLReader &reader, const char * TypeName, App::Property * prop) override; int addView(App::DocumentObject *docObj); int removeView(App::DocumentObject* docObj); diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index eee9de3b46bb..03e47603905b 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -174,7 +174,10 @@ App::DocumentObjectExecReturn *DrawProjGroup::execute(void) // } for (auto& item: getViewsAsDPGI()) { + bool touched = item->isTouched(); item->autoPosition(); + if(!touched) + item->purgeTouched(); } return DrawViewCollection::execute(); @@ -427,7 +430,6 @@ App::DocumentObject * DrawProjGroup::addProjection(const char *viewProjType) Anchor.purgeTouched(); view->LockPosition.setValue(true); //lock "Front" position within DPG (note not Page!). view->LockPosition.setStatus(App::Property::ReadOnly,true); //Front should stay locked. - App::GetApplication().signalChangePropertyEditor(view->LockPosition); view->LockPosition.purgeTouched(); requestPaint(); //make sure the group object is on the Gui page } diff --git a/src/Mod/TechDraw/App/DrawUtil.cpp b/src/Mod/TechDraw/App/DrawUtil.cpp index a4772946514e..f5e6ecc66c85 100644 --- a/src/Mod/TechDraw/App/DrawUtil.cpp +++ b/src/Mod/TechDraw/App/DrawUtil.cpp @@ -83,6 +83,9 @@ using namespace TechDraw; boost::match_flag_type flags = boost::match_default; // char* endChar; std::string::const_iterator begin = geomName.begin(); + auto pos = geomName.rfind('.'); + if(pos!=std::string::npos) + begin += pos+1; std::string::const_iterator end = geomName.end(); std::stringstream ErrorMsg; @@ -105,6 +108,9 @@ std::string DrawUtil::getGeomTypeFromName(std::string geomName) boost::match_results what; boost::match_flag_type flags = boost::match_default; std::string::const_iterator begin = geomName.begin(); + auto pos = geomName.rfind('.'); + if(pos!=std::string::npos) + begin += pos+1; std::string::const_iterator end = geomName.end(); std::stringstream ErrorMsg; diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 392c45350200..5f4e3e7b4103 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -121,7 +121,6 @@ void DrawView::onChanged(const App::Property* prop) auto page = findParentPage(); if (ScaleType.isValue("Page")) { Scale.setStatus(App::Property::ReadOnly,true); - App::GetApplication().signalChangePropertyEditor(Scale); if (page != nullptr) { if(std::abs(page->Scale.getValue() - getScale()) > FLT_EPSILON) { Scale.setValue(page->Scale.getValue()); @@ -131,10 +130,8 @@ void DrawView::onChanged(const App::Property* prop) } else if ( ScaleType.isValue("Custom") ) { //don't change Scale Scale.setStatus(App::Property::ReadOnly,false); - App::GetApplication().signalChangePropertyEditor(Scale); } else if ( ScaleType.isValue("Automatic") ) { Scale.setStatus(App::Property::ReadOnly,true); - App::GetApplication().signalChangePropertyEditor(Scale); if (!checkFit(page)) { double newScale = autoScale(page->getPageWidth(),page->getPageHeight()); if(std::abs(newScale - getScale()) > FLT_EPSILON) { //stops onChanged/execute loop @@ -162,23 +159,19 @@ void DrawView::handleXYLock(void) if (isLocked()) { if (!X.testStatus(App::Property::ReadOnly)) { X.setStatus(App::Property::ReadOnly,true); - App::GetApplication().signalChangePropertyEditor(X); X.purgeTouched(); } if (!Y.testStatus(App::Property::ReadOnly)) { Y.setStatus(App::Property::ReadOnly,true); - App::GetApplication().signalChangePropertyEditor(Y); Y.purgeTouched(); } } else { if (X.testStatus(App::Property::ReadOnly)) { X.setStatus(App::Property::ReadOnly,false); - App::GetApplication().signalChangePropertyEditor(X); X.purgeTouched(); } if (Y.testStatus(App::Property::ReadOnly)) { Y.setStatus(App::Property::ReadOnly,false); - App::GetApplication().signalChangePropertyEditor(Y); Y.purgeTouched(); } } @@ -326,93 +319,46 @@ std::vector DrawView::getLeaders() const return result; } -void DrawView::Restore(Base::XMLReader &reader) +void DrawView::handleChangedPropertyType( + Base::XMLReader &reader, const char * TypeName, App::Property * prop) { -// this is temporary code for backwards compat (within v0.17). can probably be deleted once there are no development -// fcstd files with old property types in use. - reader.readElement("Properties"); - int Cnt = reader.getAttributeAsInteger("Count"); - - for (int i=0 ;igetTypeId().getName(), TypeName) == 0){ //if the property type in obj == type in schema - schemaProp->Restore(reader); //nothing special to do - } else { - if (strcmp(PropName, "Scale") == 0) { - if (schemaProp->isDerivedFrom(App::PropertyFloatConstraint::getClassTypeId())){ //right property type - schemaProp->Restore(reader); //nothing special to do (redundant) - } else { //Scale, but not PropertyFloatConstraint - App::PropertyFloat tmp; - if (strcmp(tmp.getTypeId().getName(),TypeName)) { //property in file is Float - tmp.setContainer(this); - tmp.Restore(reader); - double tmpValue = tmp.getValue(); - if (tmpValue > 0.0) { - static_cast(schemaProp)->setValue(tmpValue); - } else { - static_cast(schemaProp)->setValue(1.0); - } - } else { - // has Scale prop that isn't Float! - Base::Console().Log("DrawView::Restore - old Document Scale is Not Float!\n"); - // no idea - } - } - } else if (strcmp(PropName, "Source") == 0) { - App::PropertyLinkGlobal glink; - App::PropertyLink link; - if (strcmp(glink.getTypeId().getName(),TypeName) == 0) { //property in file is plg - glink.setContainer(this); - glink.Restore(reader); - if (glink.getValue() != nullptr) { - static_cast(schemaProp)->setScope(App::LinkScope::Global); - static_cast(schemaProp)->setValue(glink.getValue()); - } - } else if (strcmp(link.getTypeId().getName(),TypeName) == 0) { //property in file is pl - link.setContainer(this); - link.Restore(reader); - if (link.getValue() != nullptr) { - static_cast(schemaProp)->setScope(App::LinkScope::Global); - static_cast(schemaProp)->setValue(link.getValue()); - } - - } else { - // has Source prop isn't PropertyLink or PropertyLinkGlobal! - Base::Console().Log("DrawView::Restore - old Document Source is weird: %s\n", TypeName); - // no idea - } - } else { - Base::Console().Log("DrawView::Restore - old Document has unknown Property\n"); - } - } + if (prop == &Scale) { + App::PropertyFloat tmp; + if (strcmp(tmp.getTypeId().getName(),TypeName)==0) { //property in file is Float + tmp.setContainer(this); + tmp.Restore(reader); + double tmpValue = tmp.getValue(); + if (tmpValue > 0.0) { + Scale.setValue(tmpValue); + } else { + Scale.setValue(1.0); } + } else { + // has Scale prop that isn't Float! + Base::Console().Log("DrawPage::Restore - old Document Scale is Not Float!\n"); + // no idea } - catch (const Base::XMLParseException&) { - throw; // re-throw - } - catch (const Base::Exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const std::exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const char* e) { - Base::Console().Error("%s\n", e); - } -#ifndef FC_DEBUG - catch (...) { - Base::Console().Error("PropertyContainer::Restore: Unknown C++ exception thrown\n"); + } else if (prop->isDerivedFrom(App::PropertyLinkList::getClassTypeId()) + && strcmp(prop->getName(),"Source")==0) + { + App::PropertyLinkGlobal glink; + App::PropertyLink link; + if (strcmp(glink.getTypeId().getName(),TypeName) == 0) { //property in file is plg + glink.setContainer(this); + glink.Restore(reader); + if (glink.getValue() != nullptr) { + static_cast(prop)->setScope(App::LinkScope::Global); + static_cast(prop)->setValue(glink.getValue()); + } + } else if (strcmp(link.getTypeId().getName(),TypeName) == 0) { //property in file is pl + link.setContainer(this); + link.Restore(reader); + if (link.getValue() != nullptr) { + static_cast(prop)->setScope(App::LinkScope::Global); + static_cast(prop)->setValue(link.getValue()); + } } -#endif - - reader.readEndElement("Property"); } - reader.readEndElement("Properties"); } bool DrawView::keepUpdated(void) diff --git a/src/Mod/TechDraw/App/DrawView.h b/src/Mod/TechDraw/App/DrawView.h index 8950295efb34..99c35d781872 100644 --- a/src/Mod/TechDraw/App/DrawView.h +++ b/src/Mod/TechDraw/App/DrawView.h @@ -67,7 +67,8 @@ class TechDrawExport DrawView : public App::DocumentObject virtual void onDocumentRestored() override; virtual short mustExecute() const override; //@} - void Restore(Base::XMLReader &reader) override; + virtual void handleChangedPropertyType( + Base::XMLReader &reader, const char * TypeName, App::Property * prop) override; bool isInClip(); DrawViewClip* getClipGroup(void); diff --git a/src/Mod/TechDraw/App/DrawViewArch.cpp b/src/Mod/TechDraw/App/DrawViewArch.cpp index 4dca98553ad6..e6127115a646 100644 --- a/src/Mod/TechDraw/App/DrawViewArch.cpp +++ b/src/Mod/TechDraw/App/DrawViewArch.cpp @@ -141,71 +141,3 @@ std::string DrawViewArch::getSVGTail(void) return tail; } -//DVA is still Source PropertyLink so needs different logic vs DV::Restore -void DrawViewArch::Restore(Base::XMLReader &reader) -{ -// this is temporary code for backwards compat (within v0.17). can probably be deleted once there are no development -// fcstd files with old property types in use. - reader.readElement("Properties"); - int Cnt = reader.getAttributeAsInteger("Count"); - - for (int i=0 ;igetTypeId().getName(), TypeName) == 0){ //if the property type in obj == type in schema - schemaProp->Restore(reader); //nothing special to do - } else if (strcmp(PropName, "Source") == 0) { - App::PropertyLinkGlobal glink; - App::PropertyLink link; - if (strcmp(glink.getTypeId().getName(),TypeName) == 0) { //property in file is plg - glink.setContainer(this); - glink.Restore(reader); - if (glink.getValue() != nullptr) { - static_cast(schemaProp)->setScope(App::LinkScope::Global); - static_cast(schemaProp)->setValue(glink.getValue()); - } - } else if (strcmp(link.getTypeId().getName(),TypeName) == 0) { //property in file is pl - link.setContainer(this); - link.Restore(reader); - if (link.getValue() != nullptr) { - static_cast(schemaProp)->setScope(App::LinkScope::Global); - static_cast(schemaProp)->setValue(link.getValue()); - } - - } else { - // has Source prop isn't PropertyLink or PropertyLinkGlobal! - Base::Console().Log("DrawViewArch::Restore - old Document Source is weird: %s\n", TypeName); - // no idea - } - } else { - Base::Console().Log("DrawViewArch::Restore - old Document has unknown Property\n"); - } - } - } - catch (const Base::XMLParseException&) { - throw; // re-throw - } - catch (const Base::Exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const std::exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const char* e) { - Base::Console().Error("%s\n", e); - } -#ifndef FC_DEBUG - catch (...) { - Base::Console().Error("PropertyContainer::Restore: Unknown C++ exception thrown\n"); - } -#endif - - reader.readEndElement("Property"); - } - reader.readEndElement("Properties"); - -} diff --git a/src/Mod/TechDraw/App/DrawViewArch.h b/src/Mod/TechDraw/App/DrawViewArch.h index e430216e34dc..1629afe34f7a 100644 --- a/src/Mod/TechDraw/App/DrawViewArch.h +++ b/src/Mod/TechDraw/App/DrawViewArch.h @@ -64,8 +64,6 @@ class TechDrawExport DrawViewArch : public TechDraw::DrawViewSymbol virtual short mustExecute() const override; - void Restore(Base::XMLReader &reader) override; - protected: /* virtual void onChanged(const App::Property* prop) override;*/ diff --git a/src/Mod/TechDraw/App/DrawViewDraft.cpp b/src/Mod/TechDraw/App/DrawViewDraft.cpp index b992b21f9a74..bdb58a93813e 100644 --- a/src/Mod/TechDraw/App/DrawViewDraft.cpp +++ b/src/Mod/TechDraw/App/DrawViewDraft.cpp @@ -143,75 +143,6 @@ std::string DrawViewDraft::getSVGTail(void) return tail; } -//DVD is still compatible with old Source PropertyLink so doesn't need DV::Restore logic -void DrawViewDraft::Restore(Base::XMLReader &reader) -{ -// this is temporary code for backwards compat (within v0.17). can probably be deleted once there are no development -// fcstd files with old property types in use. - reader.readElement("Properties"); - int Cnt = reader.getAttributeAsInteger("Count"); - - for (int i=0 ;igetTypeId().getName(), TypeName) == 0){ //if the property type in obj == type in schema - schemaProp->Restore(reader); //nothing special to do - } else if (strcmp(PropName, "Source") == 0) { - App::PropertyLinkGlobal glink; - App::PropertyLink link; - if (strcmp(glink.getTypeId().getName(),TypeName) == 0) { //property in file is plg - glink.setContainer(this); - glink.Restore(reader); - if (glink.getValue() != nullptr) { - static_cast(schemaProp)->setScope(App::LinkScope::Global); - static_cast(schemaProp)->setValue(glink.getValue()); - } - } else if (strcmp(link.getTypeId().getName(),TypeName) == 0) { //property in file is pl - link.setContainer(this); - link.Restore(reader); - if (link.getValue() != nullptr) { - static_cast(schemaProp)->setScope(App::LinkScope::Global); - static_cast(schemaProp)->setValue(link.getValue()); - } - - } else { - // has Source prop isn't PropertyLink or PropertyLinkGlobal! - Base::Console().Log("DrawViewDraft::Restore - old Document Source is weird: %s\n", TypeName); - // no idea - } - } else { - Base::Console().Log("DrawViewDraft::Restore - old Document has unknown Property\n"); - } - } - } - catch (const Base::XMLParseException&) { - throw; // re-throw - } - catch (const Base::Exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const std::exception &e) { - Base::Console().Error("%s\n", e.what()); - } - catch (const char* e) { - Base::Console().Error("%s\n", e); - } -#ifndef FC_DEBUG - catch (...) { - Base::Console().Error("PropertyContainer::Restore: Unknown C++ exception thrown\n"); - } -#endif - - reader.readEndElement("Property"); - } - reader.readEndElement("Properties"); - -} - // Python Drawing feature --------------------------------------------------------- namespace App { diff --git a/src/Mod/TechDraw/App/DrawViewDraft.h b/src/Mod/TechDraw/App/DrawViewDraft.h index 6a230a4012f4..411c4e0853d3 100644 --- a/src/Mod/TechDraw/App/DrawViewDraft.h +++ b/src/Mod/TechDraw/App/DrawViewDraft.h @@ -64,9 +64,6 @@ class TechDrawExport DrawViewDraft : public TechDraw::DrawViewSymbol virtual short mustExecute() const override; - void Restore(Base::XMLReader &reader) override; - - protected: /* virtual void onChanged(const App::Property* prop) override;*/ Base::BoundBox3d bbox; diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 8f922e45a5ef..1b0829b1c80c 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -179,8 +179,13 @@ TopoDS_Shape DrawViewPart::getSourceShape(void) const } else { std::vector sourceShapes; for (auto& l:links) { - std::vector shapeList = getShapesFromObject(l); - sourceShapes.insert(sourceShapes.end(),shapeList.begin(),shapeList.end()); + auto shape = Part::Feature::getShape(l); + if(!shape.IsNull()) + sourceShapes.push_back(shape); + else { + std::vector shapeList = getShapesFromObject(l); + sourceShapes.insert(sourceShapes.end(),shapeList.begin(),shapeList.end()); + } } BRep_Builder builder; @@ -330,7 +335,7 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) geometryObject = buildGeometryObject(mirroredShape,viewAxis); #if MOD_TECHDRAW_HANDLE_FACES - auto start = chrono::high_resolution_clock::now(); + auto start = std::chrono::high_resolution_clock::now(); if (handleFaces() && !geometryObject->usePolygonHLR()) { try { extractFaces(); @@ -348,9 +353,9 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) //add centerlines to geometry edges list addCenterLinesToGeom(); - auto end = chrono::high_resolution_clock::now(); + auto end = std::chrono::high_resolution_clock::now(); auto diff = end - start; - double diffOut = chrono::duration (diff).count(); + double diffOut = std::chrono::duration (diff).count(); Base::Console().Log("TIMING - %s DVP spent: %.3f millisecs handling Faces\n", getNameInDocument(),diffOut); @@ -415,7 +420,7 @@ TechDraw::GeometryObject* DrawViewPart::buildGeometryObject(TopoDS_Shape shape, viewAxis); } - auto start = chrono::high_resolution_clock::now(); + auto start = std::chrono::high_resolution_clock::now(); go->extractGeometry(TechDraw::ecHARD, //always show the hard&outline visible lines true); @@ -451,9 +456,9 @@ TechDraw::GeometryObject* DrawViewPart::buildGeometryObject(TopoDS_Shape shape, go->extractGeometry(TechDraw::ecUVISO, false); } - auto end = chrono::high_resolution_clock::now(); + auto end = std::chrono::high_resolution_clock::now(); auto diff = end - start; - double diffOut = chrono::duration (diff).count(); + double diffOut = std::chrono::duration (diff).count(); Base::Console().Log("TIMING - %s DVP spent: %.3f millisecs in GO::extractGeometry\n",getNameInDocument(),diffOut); const std::vector & edges = go->getEdgeGeometry(); diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index a9f126e75e92..e828c8a2dd45 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -266,40 +266,36 @@ void CmdTechDrawNewView::activated(int iMsg) return; } std::string PageName = page->getNameInDocument(); + auto inlist = page->getInListEx(true); + inlist.insert(page); - std::vector shapes = getSelection().getObjectsOfType(App::GeoFeature::getClassTypeId()); - std::vector groups = getSelection().getObjectsOfType(App::DocumentObjectGroup::getClassTypeId()); - if ((shapes.empty()) && - (groups.empty())) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("No Shapes or Groups in this selection")); - return; - } - if (!groups.empty()) { - shapes.insert(shapes.end(),groups.begin(),groups.end()); - } + std::vector shapes; //set projection direction from selected Face //use first object with a face selected - std::vector selection = getSelection().getSelectionEx(); - Part::Feature* partFeat = 0; - std::vector SubNames; - std::string faceName; - bool subFound = false; - std::vector::iterator itSel = selection.begin(); - for (; itSel != selection.end(); itSel++) { - if ((*itSel).getObject()->isDerivedFrom(Part::Feature::getClassTypeId())) { - partFeat = static_cast ((*itSel).getObject()); - SubNames = (*itSel).getSubNames(); - if (!SubNames.empty()) { - faceName = SubNames.front(); - if (TechDraw::DrawUtil::getGeomTypeFromName(faceName) == "Face") { - subFound = true; - break; - } + App::DocumentObject* partObj = 0; + std::string subName; + for(auto &sel : getSelection().getSelectionEx(0,App::DocumentObject::getClassTypeId(),false)) { + auto obj = sel.getObject(); + if(!obj || inlist.count(obj)) + continue; + shapes.push_back(obj); + if(partObj) + continue; + for(auto &sub : sel.getSubNames()) { + if (TechDraw::DrawUtil::getGeomTypeFromName(sub) == "Face") { + subName = sub; + partObj = obj; + break; } } } + if ((shapes.empty())) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), + QObject::tr("No Shapes or Groups in this selection")); + return; + } + Base::Vector3d projDir; Gui::WaitCursor wc; @@ -313,8 +309,8 @@ void CmdTechDrawNewView::activated(int iMsg) } dvp->Source.setValues(shapes); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); - if (subFound) { - std::pair dirs = DrawGuiUtil::getProjDirFromFace(partFeat,faceName); + if (subName.size()) { + std::pair dirs = DrawGuiUtil::getProjDirFromFace(partObj,subName); projDir = dirs.first; getDocument()->setStatus(App::Document::Status::SkipRecompute, true); doCommand(Doc,"App.activeDocument().%s.Direction = FreeCAD.Vector(%.3f,%.3f,%.3f)", @@ -503,40 +499,35 @@ void CmdTechDrawProjGroup::activated(int iMsg) return; } std::string PageName = page->getNameInDocument(); - - std::vector shapes = getSelection().getObjectsOfType(App::GeoFeature::getClassTypeId()); - std::vector groups = getSelection().getObjectsOfType(App::DocumentObjectGroup::getClassTypeId()); - if ((shapes.empty()) && - (groups.empty())) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("No Shapes or Groups in this selection")); - return; - } - if (!groups.empty()) { - shapes.insert(shapes.end(),groups.begin(),groups.end()); - } + auto inlist = page->getInListEx(true); + inlist.insert(page); //set projection direction from selected Face //use first object with a face selected - std::vector selection = getSelection().getSelectionEx(); - Part::Feature* partFeat = 0; - std::vector SubNames; - std::string faceName; - bool subFound = false; - std::vector::iterator itSel = selection.begin(); - for (; itSel != selection.end(); itSel++) { - if ((*itSel).getObject()->isDerivedFrom(Part::Feature::getClassTypeId())) { - partFeat = static_cast ((*itSel).getObject()); - SubNames = (*itSel).getSubNames(); - if (!SubNames.empty()) { - faceName = SubNames.front(); - if (TechDraw::DrawUtil::getGeomTypeFromName(faceName) == "Face") { - subFound = true; - break; - } + + std::vector shapes; + App::DocumentObject* partObj = 0; + std::string subName; + for(auto &sel : getSelection().getSelectionEx(0,App::DocumentObject::getClassTypeId(),false)) { + auto obj = sel.getObject(); + if(inlist.count(obj)) + continue; + shapes.push_back(obj); + if(partObj) + continue; + for(auto &sub : sel.getSubNames()) { + if (TechDraw::DrawUtil::getGeomTypeFromName(sub) == "Face") { + subName = sub; + partObj = obj; + break; } } } + if (shapes.empty()) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), + QObject::tr("No Shapes or Groups in this selection")); + return; + } Base::Vector3d projDir; Gui::WaitCursor wc; @@ -551,8 +542,8 @@ void CmdTechDrawProjGroup::activated(int iMsg) multiView->Source.setValues(shapes); doCommand(Doc,"App.activeDocument().%s.addProjection('Front')",multiViewName.c_str()); - if (subFound) { - std::pair dirs = DrawGuiUtil::getProjDirFromFace(partFeat,faceName); + if (subName.size()) { + std::pair dirs = DrawGuiUtil::getProjDirFromFace(partObj,subName); getDocument()->setStatus(App::Document::Status::SkipRecompute, true); doCommand(Doc,"App.activeDocument().%s.Anchor.Direction = FreeCAD.Vector(%.3f,%.3f,%.3f)", multiViewName.c_str(), dirs.first.x,dirs.first.y,dirs.first.z); diff --git a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp index bf8693f8ad71..976f79a6b794 100644 --- a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp +++ b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp @@ -1023,7 +1023,8 @@ void CmdTechDrawLinkDimension::activated(int iMsg) if (!result) return; - std::vector selection = getSelection().getSelectionEx(); + std::vector selection = getSelection().getSelectionEx(0, + App::DocumentObject::getClassTypeId(),0); App::DocumentObject* obj3D = 0; std::vector parts; @@ -1031,13 +1032,11 @@ void CmdTechDrawLinkDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { - if ((*itSel).getObject()->isDerivedFrom(Part::Feature::getClassTypeId())) { - obj3D = ((*itSel).getObject()); - std::vector subList = (*itSel).getSubNames(); - for (auto& s:subList) { - parts.push_back(obj3D); - subs.push_back(s); - } + obj3D = ((*itSel).getObject()); + std::vector subList = (*itSel).getSubNames(); + for (auto& s:subList) { + parts.push_back(obj3D); + subs.push_back(s); } } diff --git a/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp b/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp index f0ee6f5cfb48..e2bb8fb625d0 100644 --- a/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp +++ b/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp @@ -237,7 +237,7 @@ std::pair DrawGuiUtil::get3DDirAndRot() return result; } -std::pair DrawGuiUtil::getProjDirFromFace(Part::Feature* obj, std::string faceName) +std::pair DrawGuiUtil::getProjDirFromFace(App::DocumentObject* obj, std::string faceName) { std::pair d3Dirs = get3DDirAndRot(); Base::Vector3d d3Up = (d3Dirs.first).Cross(d3Dirs.second); @@ -248,15 +248,13 @@ std::pair DrawGuiUtil::getProjDirFromFace(Part::F projDir = d3Dirs.first; rotVec = d3Dirs.second; - if (DrawUtil::getGeomTypeFromName(faceName) != "Face") { + auto ts = Part::Feature::getShape(obj,faceName.c_str()); + if(ts.IsNull() || ts.ShapeType()!=TopAbs_FACE) { Base::Console().Warning("getProjDirFromFace(%s) is not a Face\n",faceName.c_str()); return dirs; } - Part::TopoShape ts = obj->Shape.getShape(); - ts.setPlacement(obj->globalPlacement()); - TopoDS_Shape subShape = ts.getSubShape(faceName.c_str()); - const TopoDS_Face& face = TopoDS::Face(subShape); + const TopoDS_Face& face = TopoDS::Face(ts); TopAbs_Orientation orient = face.Orientation(); BRepAdaptor_Surface adapt(face); diff --git a/src/Mod/TechDraw/Gui/DrawGuiUtil.h b/src/Mod/TechDraw/Gui/DrawGuiUtil.h index 3a08906f2dac..4d53f682b41b 100644 --- a/src/Mod/TechDraw/Gui/DrawGuiUtil.h +++ b/src/Mod/TechDraw/Gui/DrawGuiUtil.h @@ -51,7 +51,7 @@ class TechDrawGuiExport DrawGuiUtil { static void dumpRectF(const char* text, const QRectF& r); static void dumpPointF(const char* text, const QPointF& p); static std::pair get3DDirAndRot(); - static std::pair getProjDirFromFace(Part::Feature* obj, std::string faceName); + static std::pair getProjDirFromFace(App::DocumentObject* obj, std::string faceName); }; diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index ebff473784d2..566f938f698b 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -843,7 +843,6 @@ void MDIViewPage::toggleKeepUpdated(void) { bool state = m_vpPage->getDrawPage()->KeepUpdated.getValue(); m_vpPage->getDrawPage()->KeepUpdated.setValue(!state); - App::GetApplication().signalChangePropertyEditor(m_vpPage->getDrawPage()->KeepUpdated); } void MDIViewPage::viewAll() diff --git a/src/Mod/TechDraw/Gui/QGIProjGroup.cpp b/src/Mod/TechDraw/Gui/QGIProjGroup.cpp index 5d6031d3f849..d503e8232e49 100644 --- a/src/Mod/TechDraw/Gui/QGIProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/QGIProjGroup.cpp @@ -84,7 +84,7 @@ bool QGIProjGroup::sceneEventFilter(QGraphicsItem* watched, QEvent *event) switch(event->type()) { case QEvent::GraphicsSceneMousePress: // TODO - Perhaps just pass the mouse event on to the anchor somehow? - if (scene()) { + if (scene() && !qAnchor->isSelected()) { scene()->clearSelection(); qAnchor->setSelected(true); } diff --git a/src/Mod/TechDraw/Gui/TaskLinkDim.cpp b/src/Mod/TechDraw/Gui/TaskLinkDim.cpp index 0688e49a81b6..f6e5db617771 100644 --- a/src/Mod/TechDraw/Gui/TaskLinkDim.cpp +++ b/src/Mod/TechDraw/Gui/TaskLinkDim.cpp @@ -154,13 +154,7 @@ bool TaskLinkDim::dimReferencesSelection(const TechDraw::DrawViewDimension* dim) return result; } - //Part::Feature* refPart = static_cast(dim->References3D.getValues().at(0)); - std::vector refParts; - std::vector docObjs = dim->References3D.getValues(); - for (auto& d: docObjs) { - Part::Feature* part = static_cast(d); - refParts.push_back(part); - } + std::vector refParts = dim->References3D.getValues(); std::vector refSubs = dim->References3D.getSubValues(); if (refParts.size() == m_parts.size()) { if(refParts.size() == 0) { diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index 673298e68f2b..a91b8a8da307 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -240,6 +240,10 @@ MDIViewPage* ViewProviderDrawingView::getMDIViewPage() const return result; } +Gui::MDIView *ViewProviderDrawingView::getMDIView() { + return getMDIViewPage(); +} + void ViewProviderDrawingView::onGuiRepaint(const TechDraw::DrawView* dv) { // Base::Console().Message("VPDV::onGuiRepaint(%s)\n", dv->getNameInDocument()); diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h index 31970b4a6772..d37fe0419a6d 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h @@ -70,6 +70,7 @@ class TechDrawGuiExport ViewProviderDrawingView : public Gui::ViewProviderDocume QGIView* getQView(void); MDIViewPage* getMDIViewPage() const; + virtual Gui::MDIView *getMDIView() override; /** @name Restoring view provider from document load */ //@{ diff --git a/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.cpp b/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.cpp index 20cf1b560444..d5d3b3531770 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.cpp @@ -202,3 +202,11 @@ TechDraw::DrawGeomHatch* ViewProviderGeomHatch::getViewObject() const { return dynamic_cast(pcObject); } + +Gui::MDIView *ViewProviderGeomHatch::getMDIView() { + auto obj = getViewObject(); + if(!obj) return 0; + auto vp = Gui::Application::Instance->getViewProvider(obj->getSourceView()); + if(!vp) return 0; + return vp->getMDIView(); +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.h b/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.h index 03198f5f7f63..b521e79e71b9 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.h +++ b/src/Mod/TechDraw/Gui/ViewProviderGeomHatch.h @@ -67,6 +67,8 @@ class TechDrawGuiExport ViewProviderGeomHatch : public Gui::ViewProviderDocument void getParameters(void); TechDraw::DrawGeomHatch* getViewObject() const; + + virtual Gui::MDIView *getMDIView() override; }; } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp b/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp index da2c94194cbb..2ccd7c6c98d1 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp @@ -38,6 +38,7 @@ #include #include #include +#include //#include //#include @@ -114,3 +115,12 @@ TechDraw::DrawHatch* ViewProviderHatch::getViewObject() const { return dynamic_cast(pcObject); } + +Gui::MDIView *ViewProviderHatch::getMDIView() { + auto obj = getViewObject(); + if(!obj) return 0; + auto vp = Gui::Application::Instance->getViewProvider(obj->getSourceView()); + if(!vp) return 0; + return vp->getMDIView(); +} + diff --git a/src/Mod/TechDraw/Gui/ViewProviderHatch.h b/src/Mod/TechDraw/Gui/ViewProviderHatch.h index 5686dcba8881..891f54cb238f 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderHatch.h +++ b/src/Mod/TechDraw/Gui/ViewProviderHatch.h @@ -56,6 +56,8 @@ class TechDrawGuiExport ViewProviderHatch : public Gui::ViewProviderDocumentObje virtual void updateData(const App::Property*); TechDraw::DrawHatch* getViewObject() const; + + virtual Gui::MDIView *getMDIView() override; private: static App::PropertyFloatConstraint::Constraints scaleRange; diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index 35558749bd39..a52151f6a2b8 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -164,6 +164,7 @@ void ViewProviderPage::updateData(const App::Property* prop) } else { sPixmap = "TechDraw_Tree_Page_Unsync"; } + signalChangeIcon(); //if the template is changed, rebuild the visual } else if (prop == &(getDrawPage()->Template)) { if(m_mdiView && @@ -218,8 +219,7 @@ bool ViewProviderPage::setEdit(int ModNum) bool ViewProviderPage::doubleClicked(void) { - Visibility.setValue(true); - showMDIViewPage(); + show(); Gui::getMainWindow()->setActiveWindow(m_mdiView); return true; } @@ -249,6 +249,8 @@ bool ViewProviderPage::showMDIViewPage() Gui::getMainWindow()->addWindow(m_mdiView); m_mdiView->viewAll(); //this is empty function m_mdiView->showMaximized(); + if(!getDrawPage()->KeepUpdated.getValue()) + getDrawPage()->KeepUpdated.setValue(true); } else { m_mdiView->updateDrawing(); m_mdiView->redrawAllViews(); @@ -429,3 +431,8 @@ TechDraw::DrawPage* ViewProviderPage::getDrawPage() const } return dynamic_cast(pcObject); } + +Gui::MDIView *ViewProviderPage::getMDIView() { + showMDIViewPage(); + return m_mdiView.data(); +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.h b/src/Mod/TechDraw/Gui/ViewProviderPage.h index cb29a457e7c1..c472a6e601b4 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.h +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.h @@ -85,6 +85,8 @@ class TechDrawGuiExport ViewProviderPage : public Gui::ViewProviderDocumentObjec bool showMDIViewPage(); void removeMDIView(void); + virtual Gui::MDIView *getMDIView() override; + bool getFrameState(void); void setFrameState(bool state); void toggleFrameState(void); diff --git a/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp b/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp index 5b2d8b107b38..a194338f8060 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp @@ -195,6 +195,10 @@ MDIViewPage* ViewProviderTemplate::getMDIViewPage(void) return myMdi; } +Gui::MDIView *ViewProviderTemplate::getMDIView() { + return getMDIViewPage(); +} + TechDraw::DrawTemplate* ViewProviderTemplate::getTemplate() const { return dynamic_cast(pcObject); diff --git a/src/Mod/TechDraw/Gui/ViewProviderTemplate.h b/src/Mod/TechDraw/Gui/ViewProviderTemplate.h index 8929620cbfae..23b386a9e996 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderTemplate.h +++ b/src/Mod/TechDraw/Gui/ViewProviderTemplate.h @@ -57,6 +57,7 @@ class TechDrawGuiExport ViewProviderTemplate : public Gui::ViewProviderDocumentO QGITemplate* getQTemplate(void); TechDraw::DrawTemplate* getTemplate() const; MDIViewPage* getMDIViewPage(void); + virtual Gui::MDIView *getMDIView() override; void setMarkers(bool state); };