PartDesign: select references for Pattern features from original object
This commit is contained in:
parent
b30a49ece3
commit
16047f452f
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
//**************************************************************************
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user