PartDesign/FeatureDressUp: make Base and BaseFeature properties track the same feature

Also remove reseting of read-only flag on placement properties on
removing Base feature: it doesn't make any scense for dressup features.
This commit is contained in:
Alexander Golubev 2015-07-22 11:34:55 +03:00 committed by Stefan Tröger
parent 98a0e30582
commit 0208a3667d
3 changed files with 116 additions and 6 deletions

View File

@ -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);

View File

@ -27,6 +27,13 @@
#include "FeatureDressUp.h"
#include <Base/Exception.h>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopExp.hxx>
#include <TopoDS.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS_Edge.hxx>
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<Part::Feature*>(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<std::string>(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);

View File

@ -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;