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:
parent
98a0e30582
commit
0208a3667d
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user