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:
@@ -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 ();
|
||||
|
||||
Reference in New Issue
Block a user