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)
|
void DressUp::onChanged(const App::Property* prop)
|
||||||
{
|
{
|
||||||
|
// the BaseFeature property should always link to the same feature as the Base
|
||||||
if (prop == &BaseFeature) {
|
if (prop == &BaseFeature) {
|
||||||
// if attached to a sketch then mark it as read-only
|
if (Base.getValue() != BaseFeature.getValue()) {
|
||||||
this->Placement.setStatus(App::Property::ReadOnly, BaseFeature.getValue() != 0);
|
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);
|
Feature::onChanged(prop);
|
||||||
|
|
|
@ -27,6 +27,13 @@
|
||||||
|
|
||||||
|
|
||||||
#include "FeatureDressUp.h"
|
#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;
|
using namespace PartDesign;
|
||||||
|
@ -39,6 +46,7 @@ PROPERTY_SOURCE(PartDesign::DressUp, PartDesign::Feature)
|
||||||
DressUp::DressUp()
|
DressUp::DressUp()
|
||||||
{
|
{
|
||||||
ADD_PROPERTY(Base,(0));
|
ADD_PROPERTY(Base,(0));
|
||||||
|
Placement.StatusBits.set(2, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
short DressUp::mustExecute() const
|
short DressUp::mustExecute() const
|
||||||
|
@ -56,15 +64,105 @@ void DressUp::positionByBaseFeature(void)
|
||||||
this->Placement.setValue(base->Placement.getValue());
|
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)
|
void DressUp::onChanged(const App::Property* prop)
|
||||||
{
|
{
|
||||||
|
// the BaseFeature property should always link to the same feature as the Base
|
||||||
if (prop == &BaseFeature) {
|
if (prop == &BaseFeature) {
|
||||||
|
<<<<<<< 3108a1b6d1b9743ebed7c154a07a695bb7207a5d
|
||||||
// if attached to a sketch then mark it as read-only
|
// if attached to a sketch then mark it as read-only
|
||||||
<<<<<<< 9a36c6ffa0c7768669f16ea256e11820bfea6b82
|
this->Placement.setStatus(App::Property::ReadOnly, BaseFeature.getValue() != 0);
|
||||||
this->Placement.setStatus(App::Property::ReadOnly, Base.getValue() != 0);
|
|
||||||
=======
|
=======
|
||||||
this->Placement.StatusBits.set(2, BaseFeature.getValue() != 0);
|
if (Base.getValue() != BaseFeature.getValue()) {
|
||||||
>>>>>>> Made the rest of the PartDesign features aware of the Body
|
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);
|
Feature::onChanged(prop);
|
||||||
|
|
|
@ -37,6 +37,11 @@ class PartDesignExport DressUp : public PartDesign::Feature
|
||||||
public:
|
public:
|
||||||
DressUp();
|
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;
|
App::PropertyLinkSub Base;
|
||||||
|
|
||||||
short mustExecute() const;
|
short mustExecute() const;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user