PartDesign changes

* Mostly for supporting in-place editing

* Add new SubShapeBinder that support cross coordinate system,
  external, and sub-object binding
This commit is contained in:
Zheng, Lei
2019-07-13 18:13:21 +08:00
committed by wmayer
parent 11321bb996
commit cd2b7e297c
55 changed files with 1944 additions and 755 deletions

View File

@@ -57,6 +57,7 @@
#include <Mod/Part/App/TopoShape.h>
#include <Mod/PartDesign/App/FeatureTransformed.h>
#include <Mod/PartDesign/App/FeatureAddSub.h>
#include <Mod/PartDesign/App/FeatureMultiTransform.h>
using namespace PartDesignGui;
@@ -70,6 +71,21 @@ void ViewProviderTransformed::setupContextMenu(QMenu* menu, QObject* receiver, c
PartDesignGui::ViewProvider::setupContextMenu(menu, receiver, member);
}
Gui::ViewProvider *ViewProviderTransformed::startEditing(int ModNum) {
PartDesign::Transformed* pcTransformed = static_cast<PartDesign::Transformed*>(getObject());
if(!pcTransformed->Originals.getSize()) {
for(auto obj : pcTransformed->getInList()) {
if(obj->isDerivedFrom(PartDesign::MultiTransform::getClassTypeId())) {
auto vp = Gui::Application::Instance->getViewProvider(obj);
if(vp)
return vp->startEditing(ModNum);
return 0;
}
}
}
return ViewProvider::startEditing(ModNum);
}
bool ViewProviderTransformed::setEdit(int ModNum)
{
pcRejectedRoot = new SoSeparator();
@@ -107,7 +123,7 @@ bool ViewProviderTransformed::setEdit(int ModNum)
pcRejectedRoot->addChild(rejectedNormb); // NOTE: The code relies on the last child added here being index 6
pcRoot->addChild(pcRejectedRoot);
recomputeFeature();
recomputeFeature(false);
return ViewProvider::setEdit(ModNum);
}
@@ -136,12 +152,12 @@ bool ViewProviderTransformed::onDelete(const std::vector<std::string> &s)
return ViewProvider::onDelete(s);
}
void ViewProviderTransformed::recomputeFeature(void)
void ViewProviderTransformed::recomputeFeature(bool recompute)
{
PartDesign::Transformed* pcTransformed = static_cast<PartDesign::Transformed*>(getObject());
pcTransformed->getDocument()->recomputeFeature(pcTransformed);
const std::vector<App::DocumentObjectExecReturn*> log = pcTransformed->getDocument()->getRecomputeLog();
PartDesign::Transformed::rejectedMap rejected_trsf = pcTransformed->getRejectedTransformations();
if(recompute || (pcTransformed->isError() || pcTransformed->mustExecute()))
pcTransformed->recomputeFeature(true);
const PartDesign::Transformed::rejectedMap &rejected_trsf = pcTransformed->getRejectedTransformations();
unsigned rejected = 0;
for (PartDesign::Transformed::rejectedMap::const_iterator r = rejected_trsf.begin(); r != rejected_trsf.end(); r++)
rejected += r->second.size();
@@ -155,13 +171,15 @@ void ViewProviderTransformed::recomputeFeature(void)
msg = msg.arg(rejected);
}
}
if (log.size() > 0) {
auto error = pcTransformed->getDocument()->getErrorDescription(pcTransformed);
if (error) {
msg = msg.arg(QString::fromLatin1("<font color='red'>%1<br/></font>"));
msg = msg.arg(QString::fromStdString(log.back()->Why));
msg = msg.arg(QString::fromUtf8(error));
} else {
msg = msg.arg(QString::fromLatin1("<font color='green'>%1<br/></font>"));
msg = msg.arg(QObject::tr("Transformation succeeded"));
}
diagMessage = msg;
signalDiagnosis(msg);
// Clear all the rejected stuff