0000735: Feature request for better Fillet/Chamfer
This commit is contained in:
parent
e3b0c111be
commit
2b0757c3a6
|
@ -75,7 +75,11 @@ App::DocumentObjectExecReturn *Chamfer::execute(void)
|
|||
TopoDS_Shape shape = mkChamfer.Shape();
|
||||
if (shape.IsNull())
|
||||
return new App::DocumentObjectExecReturn("Resulting shape is null");
|
||||
ShapeHistory history = buildHistory(mkChamfer, TopAbs_FACE, shape, base->Shape.getValue());
|
||||
this->Shape.setValue(shape);
|
||||
PropertyShapeHistory prop;
|
||||
prop.setContainer(this);
|
||||
prop.setValue(history);
|
||||
return App::DocumentObject::StdReturn;
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
|
|
|
@ -74,7 +74,11 @@ App::DocumentObjectExecReturn *Fillet::execute(void)
|
|||
TopoDS_Shape shape = mkFillet.Shape();
|
||||
if (shape.IsNull())
|
||||
return new App::DocumentObjectExecReturn("Resulting shape is null");
|
||||
ShapeHistory history = buildHistory(mkFillet, TopAbs_FACE, shape, base->Shape.getValue());
|
||||
this->Shape.setValue(shape);
|
||||
PropertyShapeHistory prop;
|
||||
prop.setContainer(this);
|
||||
prop.setValue(history);
|
||||
return App::DocumentObject::StdReturn;
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
|
|
|
@ -703,7 +703,6 @@ bool DlgFilletEdges::accept()
|
|||
|
||||
QByteArray to = name.toAscii();
|
||||
QByteArray from = shape.toAscii();
|
||||
Gui::Command::copyVisual(to, "ShapeColor", from);
|
||||
Gui::Command::copyVisual(to, "LineColor", from);
|
||||
Gui::Command::copyVisual(to, "PointColor", from);
|
||||
return true;
|
||||
|
|
|
@ -120,6 +120,20 @@ bool ViewProviderPart::doubleClicked(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
void ViewProviderPart::applyColor(const Part::ShapeHistory& hist,
|
||||
const std::vector<App::Color>& colBase,
|
||||
std::vector<App::Color>& colBool)
|
||||
{
|
||||
std::map<int, std::vector<int> >::const_iterator jt;
|
||||
// apply color from modified faces
|
||||
for (jt = hist.shapeMap.begin(); jt != hist.shapeMap.end(); ++jt) {
|
||||
std::vector<int>::const_iterator kt;
|
||||
for (kt = jt->second.begin(); kt != jt->second.end(); ++kt) {
|
||||
colBool[*kt] = colBase[jt->first];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
PROPERTY_SOURCE(PartGui::ViewProviderPart, PartGui::ViewProviderPartBase)
|
||||
|
||||
|
|
|
@ -50,6 +50,8 @@ class SoScale;
|
|||
// Set this to use the fast rendering of shapes
|
||||
#define FC_USE_FAST_SHAPE_RENDERING
|
||||
|
||||
namespace Part { struct ShapeHistory; }
|
||||
|
||||
namespace PartGui {
|
||||
|
||||
class ViewProviderShapeBuilder : public Gui::ViewProviderBuilder
|
||||
|
@ -157,6 +159,11 @@ public:
|
|||
/// destructor
|
||||
virtual ~ViewProviderPart();
|
||||
virtual bool doubleClicked(void);
|
||||
|
||||
protected:
|
||||
void applyColor(const Part::ShapeHistory& hist,
|
||||
const std::vector<App::Color>& colBase,
|
||||
std::vector<App::Color>& colBool);
|
||||
};
|
||||
#else
|
||||
class PartGuiExport ViewProviderPart : public ViewProviderPartBase
|
||||
|
|
|
@ -77,20 +77,6 @@ QIcon ViewProviderBoolean::getIcon(void) const
|
|||
return ViewProviderPart::getIcon();
|
||||
}
|
||||
|
||||
void applyColor(const Part::ShapeHistory& hist,
|
||||
const std::vector<App::Color>& colBase,
|
||||
std::vector<App::Color>& colBool)
|
||||
{
|
||||
std::map<int, std::vector<int> >::const_iterator jt;
|
||||
// apply color from modified faces
|
||||
for (jt = hist.shapeMap.begin(); jt != hist.shapeMap.end(); ++jt) {
|
||||
std::vector<int>::const_iterator kt;
|
||||
for (kt = jt->second.begin(); kt != jt->second.end(); ++kt) {
|
||||
colBool[*kt] = colBase[jt->first];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ViewProviderBoolean::updateData(const App::Property* prop)
|
||||
{
|
||||
PartGui::ViewProviderPart::updateData(prop);
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
# include <QMenu>
|
||||
# include <QTimer>
|
||||
# include <Standard_math.hxx>
|
||||
# include <TopExp.hxx>
|
||||
# include <TopTools_IndexedMapOfShape.hxx>
|
||||
# include <TopTools_ListOfShape.hxx>
|
||||
# include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||
# include <Inventor/actions/SoSearchAction.h>
|
||||
# include <Inventor/draggers/SoDragger.h>
|
||||
# include <Inventor/nodes/SoCoordinate3.h>
|
||||
|
@ -225,6 +229,45 @@ ViewProviderFillet::~ViewProviderFillet()
|
|||
{
|
||||
}
|
||||
|
||||
void ViewProviderFillet::updateData(const App::Property* prop)
|
||||
{
|
||||
PartGui::ViewProviderPart::updateData(prop);
|
||||
if (prop->getTypeId() == Part::PropertyShapeHistory::getClassTypeId()) {
|
||||
const std::vector<Part::ShapeHistory>& hist = static_cast<const Part::PropertyShapeHistory*>
|
||||
(prop)->getValues();
|
||||
if (hist.size() != 1)
|
||||
return;
|
||||
Part::Fillet* objFill = dynamic_cast<Part::Fillet*>(getObject());
|
||||
Part::Feature* objBase = dynamic_cast<Part::Feature*>(objFill->Base.getValue());
|
||||
if (objBase) {
|
||||
const TopoDS_Shape& baseShape = objBase->Shape.getValue();
|
||||
const TopoDS_Shape& fillShape = objFill->Shape.getValue();
|
||||
|
||||
TopTools_IndexedMapOfShape baseMap, fillMap;
|
||||
TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap);
|
||||
TopExp::MapShapes(fillShape, TopAbs_FACE, fillMap);
|
||||
|
||||
Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase);
|
||||
std::vector<App::Color> colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->DiffuseColor.getValues();
|
||||
std::vector<App::Color> colFill;
|
||||
colFill.resize(fillMap.Extent(), static_cast<PartGui::ViewProviderPart*>(vpBase)->ShapeColor.getValue());
|
||||
|
||||
bool setColor=false;
|
||||
if (colBase.size() == baseMap.Extent()) {
|
||||
applyColor(hist[0], colBase, colFill);
|
||||
setColor = true;
|
||||
}
|
||||
else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) {
|
||||
colBase.resize(baseMap.Extent(), colBase[0]);
|
||||
applyColor(hist[0], colBase, colFill);
|
||||
setColor = true;
|
||||
}
|
||||
if (setColor)
|
||||
this->DiffuseColor.setValues(colFill);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ViewProviderFillet::setupContextMenu(QMenu* menu, QObject* receiver, const char* member)
|
||||
{
|
||||
QAction* act;
|
||||
|
@ -289,6 +332,45 @@ ViewProviderChamfer::~ViewProviderChamfer()
|
|||
{
|
||||
}
|
||||
|
||||
void ViewProviderChamfer::updateData(const App::Property* prop)
|
||||
{
|
||||
PartGui::ViewProviderPart::updateData(prop);
|
||||
if (prop->getTypeId() == Part::PropertyShapeHistory::getClassTypeId()) {
|
||||
const std::vector<Part::ShapeHistory>& hist = static_cast<const Part::PropertyShapeHistory*>
|
||||
(prop)->getValues();
|
||||
if (hist.size() != 1)
|
||||
return;
|
||||
Part::Chamfer* objCham = dynamic_cast<Part::Chamfer*>(getObject());
|
||||
Part::Feature* objBase = dynamic_cast<Part::Feature*>(objCham->Base.getValue());
|
||||
if (objBase) {
|
||||
const TopoDS_Shape& baseShape = objBase->Shape.getValue();
|
||||
const TopoDS_Shape& chamShape = objCham->Shape.getValue();
|
||||
|
||||
TopTools_IndexedMapOfShape baseMap, chamMap;
|
||||
TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap);
|
||||
TopExp::MapShapes(chamShape, TopAbs_FACE, chamMap);
|
||||
|
||||
Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase);
|
||||
std::vector<App::Color> colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->DiffuseColor.getValues();
|
||||
std::vector<App::Color> colCham;
|
||||
colCham.resize(chamMap.Extent(), static_cast<PartGui::ViewProviderPart*>(vpBase)->ShapeColor.getValue());
|
||||
|
||||
bool setColor=false;
|
||||
if (colBase.size() == baseMap.Extent()) {
|
||||
applyColor(hist[0], colBase, colCham);
|
||||
setColor = true;
|
||||
}
|
||||
else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) {
|
||||
colBase.resize(baseMap.Extent(), colBase[0]);
|
||||
applyColor(hist[0], colBase, colCham);
|
||||
setColor = true;
|
||||
}
|
||||
if (setColor)
|
||||
this->DiffuseColor.setValues(colCham);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ViewProviderChamfer::setupContextMenu(QMenu* menu, QObject* receiver, const char* member)
|
||||
{
|
||||
QAction* act;
|
||||
|
|
|
@ -70,6 +70,7 @@ public:
|
|||
bool onDelete(const std::vector<std::string> &);
|
||||
|
||||
protected:
|
||||
void updateData(const App::Property*);
|
||||
bool setEdit(int ModNum);
|
||||
void unsetEdit(int ModNum);
|
||||
//@}
|
||||
|
@ -91,6 +92,7 @@ public:
|
|||
bool onDelete(const std::vector<std::string> &);
|
||||
|
||||
protected:
|
||||
void updateData(const App::Property*);
|
||||
bool setEdit(int ModNum);
|
||||
void unsetEdit(int ModNum);
|
||||
//@}
|
||||
|
|
Loading…
Reference in New Issue
Block a user