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;