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

@@ -31,6 +31,8 @@
# include <BRepAdaptor_Surface.hxx>
#endif
#include <boost/algorithm/string/predicate.hpp>
#include <Base/Console.h>
#include <App/Application.h>
#include <App/Document.h>
@@ -54,6 +56,7 @@
#include "TaskTransformedParameters.h"
FC_LOG_LEVEL_INIT("PartDesign",true,true)
using namespace PartDesignGui;
using namespace Gui;
@@ -139,6 +142,7 @@ bool TaskTransformedParameters::originalSelected(const Gui::SelectionChanges& ms
else
return false;
}
setupTransaction();
pcTransformed->Originals.setValues(originals);
recomputeFeature();
@@ -149,6 +153,15 @@ bool TaskTransformedParameters::originalSelected(const Gui::SelectionChanges& ms
return false;
}
void TaskTransformedParameters::setupTransaction() {
int tid = 0;
const char *name = App::GetApplication().getActiveTransaction(&tid);
std::string n("Edit ");
n += getObject()->Label.getValue();
if(!name || n != name)
App::GetApplication().setActiveTransaction(n.c_str());
}
void TaskTransformedParameters::onButtonAddFeature(bool checked)
{
if (checked) {
@@ -161,11 +174,28 @@ void TaskTransformedParameters::onButtonAddFeature(bool checked)
}
}
// Make sure only some feature before the given one is visible
void TaskTransformedParameters::checkVisibility() {
auto feat = getObject();
auto body = feat->getFeatureBody();
if(!body) return;
auto inset = feat->getInListEx(true);
inset.emplace(feat);
for(auto o : body->Group.getValues()) {
if(!o->Visibility.getValue()
|| !o->isDerivedFrom(PartDesign::Feature::getClassTypeId()))
continue;
if(inset.count(o))
break;
return;
}
FCMD_OBJ_SHOW(getBaseObject());
}
void TaskTransformedParameters::onButtonRemoveFeature(bool checked)
{
if (checked) {
hideObject();
showBase();
checkVisibility();
selectionMode = removeFeature;
Gui::Selection().clearSelection();
} else {
@@ -289,14 +319,16 @@ PartDesign::Transformed *TaskTransformedParameters::getObject() const {
return nullptr;
}
Part::Feature *TaskTransformedParameters::getBaseObject() const {
App::DocumentObject *TaskTransformedParameters::getBaseObject() const {
PartDesign::Feature* feature = getTopTransformedObject ();
// NOTE: getBaseObject() throws if there is no base; shouldn't happen here.
return feature->getBaseObject();
}
const std::vector<App::DocumentObject*> & TaskTransformedParameters::getOriginals(void) const {
return getTopTransformedObject()->Originals.getValues();
App::DocumentObject *base = feature->getBaseObject(true);
if(!base) {
auto body = feature->getFeatureBody();
if(body)
base = body->getPrevSolidFeature(feature);
}
return base;
}
App::DocumentObject* TaskTransformedParameters::getSketchObject() const {
@@ -305,52 +337,40 @@ App::DocumentObject* TaskTransformedParameters::getSketchObject() const {
void TaskTransformedParameters::hideObject()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc) {
doc->setHide(getTopTransformedObject()->getNameInDocument());
}
FCMD_OBJ_HIDE(getTopTransformedObject());
}
void TaskTransformedParameters::showObject()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc) {
doc->setShow(getTopTransformedObject()->getNameInDocument());
}
FCMD_OBJ_SHOW(getTopTransformedObject());
}
void TaskTransformedParameters::hideBase()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc) {
try {
doc->setHide(getBaseObject()->getNameInDocument());
} catch (const Base::Exception &) { }
}
FCMD_OBJ_HIDE(getBaseObject());
}
void TaskTransformedParameters::showBase()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc) {
try {
doc->setShow(getBaseObject()->getNameInDocument());
} catch (const Base::Exception &) { }
}
FCMD_OBJ_SHOW(getBaseObject());
}
void TaskTransformedParameters::exitSelectionMode()
{
clearButtons();
selectionMode = none;
Gui::Selection().rmvSelectionGate();
showObject();
hideBase();
try {
clearButtons();
selectionMode = none;
Gui::Selection().rmvSelectionGate();
showObject();
} catch(Base::Exception &e) {
e.ReportException();
}
}
void TaskTransformedParameters::addReferenceSelectionGate(bool edge, bool face)
void TaskTransformedParameters::addReferenceSelectionGate(bool edge, bool face, bool planar, bool whole)
{
std::unique_ptr<Gui::SelectionFilterGate> gateRefPtr(new ReferenceSelection(getBaseObject(), edge, face, /*point =*/ true));
std::unique_ptr<Gui::SelectionFilterGate> gateRefPtr(
new ReferenceSelection(getBaseObject(), edge, face, planar,false,whole));
std::unique_ptr<Gui::SelectionFilterGate> gateDepPtr(new NoDependentsSelection(getTopTransformedObject()));
Gui::Selection().addSelectionGate(new CombineSelectionFilterGates(gateRefPtr, gateDepPtr));
}
@@ -373,19 +393,7 @@ TaskDlgTransformedParameters::TaskDlgTransformedParameters(ViewProviderTransform
bool TaskDlgTransformedParameters::accept()
{
std::string name = vp->getObject()->getNameInDocument();
//Gui::Command::openCommand(featureName + " changed");
std::vector<App::DocumentObject*> originals = parameter->getOriginals();
std::stringstream str;
str << "App.ActiveDocument." << name.c_str() << ".Originals = [";
for (std::vector<App::DocumentObject*>::const_iterator it = originals.begin(); it != originals.end(); ++it)
{
if ((*it) != NULL)
str << "App.ActiveDocument." << (*it)->getNameInDocument() << ",";
}
str << "]";
Gui::Command::runCommand(Gui::Command::Doc,str.str().c_str());
parameter->exitSelectionMode();
// Continue (usually in virtual method accept())
return TaskDlgFeatureParameters::accept ();