diff --git a/src/Mod/PartDesign/App/FeatureDressUp.cpp b/src/Mod/PartDesign/App/FeatureDressUp.cpp index 4b99ad102..dae0a17cb 100644 --- a/src/Mod/PartDesign/App/FeatureDressUp.cpp +++ b/src/Mod/PartDesign/App/FeatureDressUp.cpp @@ -148,9 +148,16 @@ void DressUp::getContiniusEdges(Part::TopoShape TopShape, std::vector< std::stri void DressUp::onChanged(const App::Property* prop) { + // the BaseFeature property should always link to the same feature as the Base if (prop == &BaseFeature) { - // if attached to a sketch then mark it as read-only - this->Placement.setStatus(App::Property::ReadOnly, BaseFeature.getValue() != 0); + if (Base.getValue() != BaseFeature.getValue()) { + Base.setValue (BaseFeature.getValue()); + } + } else if (prop == &Base) { + // track the vice-versa changes + if (Base.getValue() != BaseFeature.getValue()) { + BaseFeature.setValue (Base.getValue()); + } } Feature::onChanged(prop); diff --git a/src/Mod/PartDesign/App/FeatureDressUp.cpp.orig b/src/Mod/PartDesign/App/FeatureDressUp.cpp.orig index 1c0bbfbda..723e4b652 100644 --- a/src/Mod/PartDesign/App/FeatureDressUp.cpp.orig +++ b/src/Mod/PartDesign/App/FeatureDressUp.cpp.orig @@ -27,6 +27,13 @@ #include "FeatureDressUp.h" +#include +#include +#include +#include +#include +#include +#include using namespace PartDesign; @@ -39,6 +46,7 @@ PROPERTY_SOURCE(PartDesign::DressUp, PartDesign::Feature) DressUp::DressUp() { ADD_PROPERTY(Base,(0)); + Placement.StatusBits.set(2, true); } short DressUp::mustExecute() const @@ -56,15 +64,105 @@ void DressUp::positionByBaseFeature(void) this->Placement.setValue(base->Placement.getValue()); } +Part::TopoShape DressUp::getBaseShape() +{ + App::DocumentObject* link = BaseFeature.getValue(); + if (!link) + link = this->Base.getValue(); // For legacy features + if (!link) + throw Base::Exception("No object linked"); + if (!link->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) + throw Base::Exception("Linked object is not a Part object"); + Part::Feature* base = static_cast(link); + const Part::TopoShape& shape = base->Shape.getShape(); + if (shape._Shape.IsNull()) + throw Base::Exception("Cannot draft invalid shape"); + return shape; +} + +void DressUp::getContiniusEdges(Part::TopoShape TopShape, std::vector< std::string >& SubNames) { + + TopTools_IndexedMapOfShape mapOfEdges; + TopTools_IndexedDataMapOfShapeListOfShape mapEdgeFace; + TopExp::MapShapesAndAncestors(TopShape._Shape, TopAbs_EDGE, TopAbs_FACE, mapEdgeFace); + TopExp::MapShapes(TopShape._Shape, TopAbs_EDGE, mapOfEdges); + + unsigned int i = 0; + while(i < SubNames.size()) + { + std::string aSubName = static_cast(SubNames.at(i)); + + if (aSubName.size() > 4 && aSubName.substr(0,4) == "Edge") { + TopoDS_Edge edge = TopoDS::Edge(TopShape.getSubShape(aSubName.c_str())); + const TopTools_ListOfShape& los = mapEdgeFace.FindFromKey(edge); + + if(los.Extent() != 2) + { + SubNames.erase(SubNames.begin()+i); + continue; + } + + const TopoDS_Shape& face1 = los.First(); + const TopoDS_Shape& face2 = los.Last(); + GeomAbs_Shape cont = BRep_Tool::Continuity(TopoDS::Edge(edge), + TopoDS::Face(face1), + TopoDS::Face(face2)); + if (cont != GeomAbs_C0) { + SubNames.erase(SubNames.begin()+i); + continue; + } + + i++; + } + else if(aSubName.size() > 4 && aSubName.substr(0,4) == "Face") { + TopoDS_Face face = TopoDS::Face(TopShape.getSubShape(aSubName.c_str())); + + TopTools_IndexedMapOfShape mapOfFaces; + TopExp::MapShapes(face, TopAbs_EDGE, mapOfFaces); + + for(int j = 1; j <= mapOfFaces.Extent(); ++j) { + TopoDS_Edge edge = TopoDS::Edge(mapOfFaces.FindKey(j)); + + int id = mapOfEdges.FindIndex(edge); + + std::stringstream buf; + buf << "Edge"; + buf << id; + + if(std::find(SubNames.begin(),SubNames.end(),buf.str()) == SubNames.end()) + { + SubNames.push_back(buf.str()); + } + + } + + SubNames.erase(SubNames.begin()+i); + } + // empty name or any other sub-element + else { + SubNames.erase(SubNames.begin()+i); + } + } +} + + void DressUp::onChanged(const App::Property* prop) { + // the BaseFeature property should always link to the same feature as the Base if (prop == &BaseFeature) { +<<<<<<< 3108a1b6d1b9743ebed7c154a07a695bb7207a5d // if attached to a sketch then mark it as read-only -<<<<<<< 9a36c6ffa0c7768669f16ea256e11820bfea6b82 - this->Placement.setStatus(App::Property::ReadOnly, Base.getValue() != 0); + this->Placement.setStatus(App::Property::ReadOnly, BaseFeature.getValue() != 0); ======= - this->Placement.StatusBits.set(2, BaseFeature.getValue() != 0); ->>>>>>> Made the rest of the PartDesign features aware of the Body + if (Base.getValue() != BaseFeature.getValue()) { + Base.setValue (BaseFeature.getValue()); + } + } else if (prop == &Base) { + // track the vice-versa changes + if (Base.getValue() != BaseFeature.getValue()) { + BaseFeature.setValue (Base.getValue()); + } +>>>>>>> PartDesign/FeatureDressUp: make Base and BaseFeature properties track the same feature } Feature::onChanged(prop); diff --git a/src/Mod/PartDesign/App/FeatureDressUp.h b/src/Mod/PartDesign/App/FeatureDressUp.h index e61b2980a..4a9e42ade 100644 --- a/src/Mod/PartDesign/App/FeatureDressUp.h +++ b/src/Mod/PartDesign/App/FeatureDressUp.h @@ -37,6 +37,11 @@ class PartDesignExport DressUp : public PartDesign::Feature public: DressUp(); + /** + * Base feature and it's subelements to which dressup operation will be aplied to. + * It always refers to the same feature Feature::BaseFeature does, but unlike it + * the Base property also includes SubLinks. + */ App::PropertyLinkSub Base; short mustExecute() const;