PartDesign: select references for Pattern features from original object

This commit is contained in:
logari81 2012-09-09 09:19:18 +02:00
parent b30a49ece3
commit 16047f452f
9 changed files with 127 additions and 92 deletions

View File

@ -54,7 +54,6 @@ Transformed::Transformed()
{
ADD_PROPERTY(Originals,(0));
Originals.setSize(0);
ADD_PROPERTY(InsideMultiTransform,(0));
}
void Transformed::positionBySupport(void)
@ -81,12 +80,9 @@ short Transformed::mustExecute() const
App::DocumentObjectExecReturn *Transformed::execute(void)
{
if (InsideMultiTransform.getValue())
return App::DocumentObject::StdReturn;
std::vector<App::DocumentObject*> originals = Originals.getValues();
if (originals.empty())
return new App::DocumentObjectExecReturn("No originals defined");
if (originals.empty()) // typically InsideMultiTransform
return App::DocumentObject::StdReturn;
this->positionBySupport();
@ -99,7 +95,7 @@ App::DocumentObjectExecReturn *Transformed::execute(void)
}
if (transformations.empty())
return new App::DocumentObjectExecReturn("No transformations defined");
return App::DocumentObject::StdReturn; // No transformations defined, exit silently
// Get the support
// NOTE: Because of the way we define the support, FeatureTransformed can only work on

View File

@ -44,10 +44,9 @@ class PartDesignExport Transformed : public PartDesign::Feature
public:
Transformed();
/// The shapes to be transformed
/** The shapes to be transformed
if Originals is empty the instance is just a container for storing transformation data */
App::PropertyLinkList Originals;
/// Flag indicating that the associated FeatureTransformed instance is just a container for storing transformation data
App::PropertyBool InsideMultiTransform;
/// Return first original, which serves as "Support" until Body feature becomes functional
App::DocumentObject* getOriginalObject() const;
@ -64,7 +63,7 @@ public:
* Gets the transformations from the virtual getTransformations() method of the sub class
* and applies them to every member of Originals. The total number of copies including
* the untransformed Originals will be sizeof(Originals) times sizeof(getTransformations())
* If InsideMultiTransform is true, execute() returns immediately without doing anything as
* If Originals is empty, execute() returns immediately without doing anything as
* the actual processing will happen in the MultiTransform feature
*/
App::DocumentObjectExecReturn *execute(void);

View File

@ -221,6 +221,9 @@ void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges
if (!insideMultiTransform)
featureSelectionMode = true; // Jump back to selection of originals
showObject();
hideOriginals();
updateUI();
}
}
@ -293,6 +296,8 @@ void TaskLinearPatternParameters::onButtonReference()
PartDesign::LinearPattern* pcLinearPattern = static_cast<PartDesign::LinearPattern*>(getObject());
pcLinearPattern->StdDirection.setValue("");
featureSelectionMode = false;
hideObject();
showOriginals();
updateUI();
}

View File

@ -200,6 +200,9 @@ void TaskMirroredParameters::onSelectionChanged(const Gui::SelectionChanges& msg
if (!insideMultiTransform)
featureSelectionMode = true; // Jump back to selection of originals
showObject();
hideOriginals();
updateUI();
}
}
@ -242,6 +245,8 @@ void TaskMirroredParameters::onButtonReference()
PartDesign::Mirrored* pcMirrored = static_cast<PartDesign::Mirrored*>(getObject());
pcMirrored->StdMirrorPlane.setValue("");
featureSelectionMode = false;
hideObject();
showOriginals();
updateUI();
}

View File

@ -214,24 +214,20 @@ void TaskMultiTransformParameters::onTransformEdit()
int row = ui->listTransformFeatures->currentIndex().row();
PartDesign::MultiTransform* pcMultiTransform = static_cast<PartDesign::MultiTransform*>(TransformedView->getObject());
std::vector<App::DocumentObject*> transformFeatures = pcMultiTransform->Transformations.getValues();
App::DocumentObject* transformObject = *(transformFeatures.begin() + row);
subFeature = static_cast<PartDesign::Transformed*>(transformObject);
if (transformObject->getTypeId() == PartDesign::Mirrored::getClassTypeId())
subFeature = static_cast<PartDesign::Transformed*>(transformFeatures[row]);
if (transformFeatures[row]->getTypeId() == PartDesign::Mirrored::getClassTypeId())
subTask = new TaskMirroredParameters(ui->widgetFeature, this);
else if (transformObject->getTypeId() == PartDesign::LinearPattern::getClassTypeId())
else if (transformFeatures[row]->getTypeId() == PartDesign::LinearPattern::getClassTypeId())
subTask = new TaskLinearPatternParameters(ui->widgetFeature, this);
else if (transformObject->getTypeId() == PartDesign::PolarPattern::getClassTypeId())
else if (transformFeatures[row]->getTypeId() == PartDesign::PolarPattern::getClassTypeId())
subTask = new TaskPolarPatternParameters(ui->widgetFeature, this);
else if (transformObject->getTypeId() == PartDesign::Scaled::getClassTypeId())
else if (transformFeatures[row]->getTypeId() == PartDesign::Scaled::getClassTypeId())
subTask = new TaskScaledParameters(ui->widgetFeature, this);
else
return; // TODO: Show an error?
ui->widgetFeature->show();
transformFeatures[row] = subFeature;
pcMultiTransform->Transformations.setValues(transformFeatures);
}
void TaskMultiTransformParameters::onTransformActivated(const QModelIndex& index) {
@ -241,89 +237,66 @@ void TaskMultiTransformParameters::onTransformActivated(const QModelIndex& index
void TaskMultiTransformParameters::onTransformAddMirrored()
{
closeSubTask();
PartDesign::MultiTransform* pcMultiTransform = static_cast<PartDesign::MultiTransform*>(TransformedView->getObject());
std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("Mirrored");
App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::Mirrored");
if (newFeature == NULL)
return;
PartDesign::Mirrored* newMirrored = static_cast<PartDesign::Mirrored*>(newFeature);
newMirrored->StdMirrorPlane.setValue("XY");
newMirrored->InsideMultiTransform.setValue(true);
newMirrored->Label.setValue("Mirrored"); // To avoid things like PartDesign__Mirrored001
Gui::Command::openCommand("Mirrored");
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::Mirrored\",\"%s\")",newFeatName.c_str());
Gui::Command::updateActive();
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.StdMirrorPlane = \"XY\"", newFeatName.c_str());
subFeature = newMirrored;
subTask = new TaskMirroredParameters(ui->widgetFeature, this);
ui->widgetFeature->show();
finishAdd(newFeature);
finishAdd(newFeatName);
}
void TaskMultiTransformParameters::onTransformAddLinearPattern()
{
closeSubTask();
PartDesign::MultiTransform* pcMultiTransform = static_cast<PartDesign::MultiTransform*>(TransformedView->getObject());
std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("LinearPattern");
App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::LinearPattern");
if (newFeature == NULL)
return;
PartDesign::LinearPattern* newLinearPattern = static_cast<PartDesign::LinearPattern*>(newFeature);
newLinearPattern->StdDirection.setValue("X");
newLinearPattern->Length.setValue(100);
newLinearPattern->Occurrences.setValue(2);
newLinearPattern->InsideMultiTransform.setValue(true);
newLinearPattern->Label.setValue("LinearPattern");
Gui::Command::openCommand("LinearPattern");
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::LinearPattern\",\"%s\")",newFeatName.c_str());
Gui::Command::updateActive();
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.StdDirection = \"X\"", newFeatName.c_str());
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Length = 100", newFeatName.c_str());
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Occurrences = 2", newFeatName.c_str());
subFeature = newLinearPattern;
subTask = new TaskLinearPatternParameters(ui->widgetFeature, this);
ui->widgetFeature->show();
finishAdd(newFeature);
finishAdd(newFeatName);
}
void TaskMultiTransformParameters::onTransformAddPolarPattern()
{
closeSubTask();
PartDesign::MultiTransform* pcMultiTransform = static_cast<PartDesign::MultiTransform*>(TransformedView->getObject());
std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("PolarPattern");
App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::PolarPattern");
if (newFeature == NULL)
return;
PartDesign::PolarPattern* newPolarPattern = static_cast<PartDesign::PolarPattern*>(newFeature);
newPolarPattern->StdAxis.setValue("Z");
newPolarPattern->Angle.setValue(360);
newPolarPattern->Occurrences.setValue(2);
newPolarPattern->InsideMultiTransform.setValue(true);
newPolarPattern->Label.setValue("PolarPattern");
Gui::Command::openCommand("PolarPattern");
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::PolarPattern\",\"%s\")",newFeatName.c_str());
Gui::Command::updateActive();
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.StdAxis = \"X\"", newFeatName.c_str());
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Angle = 360", newFeatName.c_str());
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Occurrences = 2", newFeatName.c_str());
subFeature = newPolarPattern;
subTask = new TaskPolarPatternParameters(ui->widgetFeature, this);
ui->widgetFeature->show();
finishAdd(newFeature);
finishAdd(newFeatName);
}
void TaskMultiTransformParameters::onTransformAddScaled()
{
closeSubTask();
PartDesign::MultiTransform* pcMultiTransform = static_cast<PartDesign::MultiTransform*>(TransformedView->getObject());
std::string newFeatName = TransformedView->getObject()->getDocument()->getUniqueObjectName("Scaled");
App::DocumentObject* newFeature = pcMultiTransform->getDocument()->addObject("PartDesign::Scaled");
if (newFeature == NULL)
return;
PartDesign::Scaled* newScaled = static_cast<PartDesign::Scaled*>(newFeature);
newScaled->Occurrences.setValue(2);
newScaled->InsideMultiTransform.setValue(true);
newScaled->Label.setValue("Scaled"); // To avoid things like PartDesign__Mirrored001
Gui::Command::openCommand("Scaled");
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject(\"PartDesign::Scaled\",\"%s\")",newFeatName.c_str());
Gui::Command::updateActive();
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Factor = 2", newFeatName.c_str());
Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Occurrences = 2", newFeatName.c_str());
subFeature = newScaled;
subTask = new TaskScaledParameters(ui->widgetFeature, this);
ui->widgetFeature->show();
finishAdd(newFeature);
finishAdd(newFeatName);
}
void TaskMultiTransformParameters::finishAdd(App::DocumentObject* newFeature)
void TaskMultiTransformParameters::finishAdd(std::string &newFeatName)
{
//Gui::Command::updateActive();
//Gui::Command::copyVisual(newFeatName.c_str(), "ShapeColor", getOriginals().front()->getNameInDocument().c_str());
//Gui::Command::copyVisual(newFeatName.c_str(), "DisplayMode", getOriginals().front()->getNameInDocument().c_str());
PartDesign::MultiTransform* pcMultiTransform = static_cast<PartDesign::MultiTransform*>(TransformedView->getObject());
if (editHint) {
// Remove hint, first feature is being added
@ -334,13 +307,11 @@ void TaskMultiTransformParameters::finishAdd(App::DocumentObject* newFeature)
// Happens when first row (first transformation) is created
row = 0;
// Hide all the originals now (hiding them in Command.cpp presents the user with an empty screen!)
std::vector<App::DocumentObject*> originals = pcMultiTransform->getOriginals();
for (std::vector<App::DocumentObject*>::iterator it = originals.begin(); it != originals.end(); ++it)
Gui::Command::doCommand(
Gui::Command::Doc,"Gui.activeDocument().getObject(\"%s\").Visibility=False",(*it)->getNameInDocument());
hideOriginals();
}
std::vector<App::DocumentObject*> transformFeatures = pcMultiTransform->Transformations.getValues();
App::DocumentObject* newFeature = pcMultiTransform->getDocument()->getObject(newFeatName.c_str());
std::vector<App::DocumentObject*> transformFeatures = pcMultiTransform->Transformations.getValues();
if (row == ui->listTransformFeatures->model()->rowCount() - 1) {
// Note: Inserts always happen before the specified iterator so in order to append at the
// end we need to use push_back() and append()
@ -353,13 +324,16 @@ void TaskMultiTransformParameters::finishAdd(App::DocumentObject* newFeature)
ui->listTransformFeatures->setCurrentRow(row, QItemSelectionModel::ClearAndSelect);
}
pcMultiTransform->Transformations.setValues(transformFeatures);
if (ui->checkBoxUpdateView->isChecked())
pcMultiTransform->getDocument()->recomputeFeature(pcMultiTransform);
// Set state to hidden - only the MultiTransform should be visible
Gui::Command::doCommand(
Gui::Command::Doc,"Gui.activeDocument().getObject(\"%s\").Visibility=False", newFeature->getNameInDocument());
Gui::Command::Doc,"Gui.activeDocument().getObject(\"%s\").Visibility=False", newFeatName.c_str());
editHint = false;
onTransformEdit();
}
void TaskMultiTransformParameters::moveTransformFeature(const int increment)

View File

@ -93,7 +93,7 @@ private:
void updateUI();
void closeSubTask();
void moveTransformFeature(const int increment);
void finishAdd(App::DocumentObject *newFeature);
void finishAdd(std::string &newFeatName);
private:
Ui_TaskMultiTransformParameters* ui;

View File

@ -224,6 +224,9 @@ void TaskPolarPatternParameters::onSelectionChanged(const Gui::SelectionChanges&
if (!insideMultiTransform)
featureSelectionMode = true; // Jump back to selection of originals
showObject();
hideOriginals();
updateUI();
}
}
@ -296,6 +299,8 @@ void TaskPolarPatternParameters::onButtonReference()
PartDesign::PolarPattern* pcPolarPattern = static_cast<PartDesign::PolarPattern*>(getObject());
pcPolarPattern->StdAxis.setValue("");
featureSelectionMode = false;
hideObject();
showOriginals();
updateUI();
}

View File

@ -106,14 +106,6 @@ void TaskTransformedParameters::onOriginalDeleted(const int row)
pcTransformed->getDocument()->recomputeFeature(pcTransformed);
}
const std::vector<App::DocumentObject*> TaskTransformedParameters::getOriginals(void) const
{
PartDesign::Transformed* pcTransformed = static_cast<PartDesign::Transformed*>(TransformedView->getObject());
std::vector<App::DocumentObject*> originals = pcTransformed->Originals.getValues();
return originals;
}
PartDesign::Transformed *TaskTransformedParameters::getObject() const
{
@ -133,6 +125,18 @@ void TaskTransformedParameters::recomputeFeature()
}
}
const std::vector<App::DocumentObject*> TaskTransformedParameters::getOriginals(void) const
{
if (insideMultiTransform) {
return parentTask->getOriginals();
} else {
PartDesign::Transformed* pcTransformed = static_cast<PartDesign::Transformed*>(TransformedView->getObject());
std::vector<App::DocumentObject*> originals = pcTransformed->Originals.getValues();
return originals;
}
}
App::DocumentObject* TaskTransformedParameters::getOriginalObject() const
{
if (insideMultiTransform) {
@ -143,6 +147,48 @@ App::DocumentObject* TaskTransformedParameters::getOriginalObject() const
}
}
void TaskTransformedParameters::hideObject()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc)
if (insideMultiTransform) {
doc->setHide(parentTask->TransformedView->getObject()->getNameInDocument());
} else {
doc->setHide(TransformedView->getObject()->getNameInDocument());
}
}
void TaskTransformedParameters::showObject()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc)
if (insideMultiTransform) {
doc->setShow(parentTask->TransformedView->getObject()->getNameInDocument());
} else {
doc->setShow(TransformedView->getObject()->getNameInDocument());
}
}
void TaskTransformedParameters::hideOriginals()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc) {
std::vector<App::DocumentObject*> originals = getOriginals();
for (std::vector<App::DocumentObject*>::iterator it = originals.begin(); it != originals.end(); ++it)
doc->setHide((*it)->getNameInDocument());
}
}
void TaskTransformedParameters::showOriginals()
{
Gui::Document* doc = Gui::Application::Instance->activeDocument();
if (doc) {
std::vector<App::DocumentObject*> originals = getOriginals();
for (std::vector<App::DocumentObject*>::iterator it = originals.begin(); it != originals.end(); ++it)
doc->setShow((*it)->getNameInDocument());
}
}
//**************************************************************************
//**************************************************************************

View File

@ -81,6 +81,11 @@ protected:
/// Get the original object either of the object associated with this feature or with the parent feature (MultiTransform mode)
App::DocumentObject* getOriginalObject() const;
void hideObject();
void showObject();
void hideOriginals();
void showOriginals();
protected:
virtual void changeEvent(QEvent *e) = 0;
virtual void onSelectionChanged(const Gui::SelectionChanges& msg) = 0;