diff --git a/src/Mod/PartDesign/App/FeatureSketchBased.cpp b/src/Mod/PartDesign/App/FeatureSketchBased.cpp index 133650146..b5f3633b6 100644 --- a/src/Mod/PartDesign/App/FeatureSketchBased.cpp +++ b/src/Mod/PartDesign/App/FeatureSketchBased.cpp @@ -1020,6 +1020,9 @@ void SketchBased::getAxis(const App::DocumentObject *pcReferenceAxis, const std: Base::Vector3d& base, Base::Vector3d& dir) { dir = Base::Vector3d(0,0,0); // If unchanged signals that no valid axis was found + if (pcReferenceAxis == NULL) + return; + Part::Part2DObject* sketch = getVerifiedSketch(); Base::Placement SketchPlm = sketch->Placement.getValue(); Base::Vector3d SketchPos = SketchPlm.getPosition(); diff --git a/src/Mod/PartDesign/Gui/Command.cpp b/src/Mod/PartDesign/Gui/Command.cpp index df36ff97c..462cb3447 100644 --- a/src/Mod/PartDesign/Gui/Command.cpp +++ b/src/Mod/PartDesign/Gui/Command.cpp @@ -300,6 +300,88 @@ bool CmdPartDesignDuplicateSelection::isActive(void) return false; } +//=========================================================================== +// PartDesign_MoveFeature +//=========================================================================== + +DEF_STD_CMD_A(CmdPartDesignMoveFeature); + +CmdPartDesignMoveFeature::CmdPartDesignMoveFeature() + :Command("PartDesign_MoveFeature") +{ + sAppModule = "PartDesign"; + sGroup = QT_TR_NOOP("PartDesign"); + sMenuText = QT_TR_NOOP("Move object to other body"); + sToolTipText = QT_TR_NOOP("Moves the selected object to another body"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = ""; +} + +void CmdPartDesignMoveFeature::activated(int iMsg) +{ + PartDesign::Body *pcActiveBody = PartDesignGui::getBody(); + if(!pcActiveBody) return; + + std::vector features = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); + if (features.empty()) return; + + // Create a list of all bodies in this part + std::vector bodies = getDocument()->getObjectsOfType(Part::BodyBase::getClassTypeId()); + + // Ask user to select the target body + bool ok; + QStringList items; + for (std::vector::iterator it = bodies.begin(); it != bodies.end(); ++it) + items.push_back(QString::fromUtf8((*it)->Label.getValue())); + QString text = QInputDialog::getItem(Gui::getMainWindow(), + qApp->translate(className(), "Select body"), + qApp->translate(className(), "Select a body from the list"), + items, 0, false, &ok); + if (!ok) return; + int index = items.indexOf(text); + + PartDesign::Body* target = static_cast(bodies[index]); + + openCommand("Move an object"); + + for (std::vector::const_iterator f = features.begin(); f != features.end(); f++) { + // Find body of this feature + Part::BodyBase* source = PartDesign::Body::findBodyOf(*f); + if (source == target) continue; + bool featureIsTip = (source->Tip.getValue() == *f); + + // Remove from source body + doCommand(Doc,"App.activeDocument().%s.removeFeature(App.activeDocument().%s)", + source->getNameInDocument(), (*f)->getNameInDocument()); + // Add to target body (always at the Tip) + doCommand(Doc,"App.activeDocument().%s.addFeature(App.activeDocument().%s)", + target->getNameInDocument(), (*f)->getNameInDocument()); + + // Adjust visibility of features + if (PartDesign::Body::isSolidFeature(*f)) { + // If we removed the tip of the source body, make the new tip visible + if (featureIsTip) { + App::DocumentObject* prevSolidFeature = source->getPrevSolidFeature(); + doCommand(Gui,"Gui.activeDocument().show(\"%s\")", prevSolidFeature->getNameInDocument()); + } + + // Hide old tip and show new tip (the moved feature) of the target body + App::DocumentObject* prevSolidFeature = target->getPrevSolidFeature(); + doCommand(Gui,"Gui.activeDocument().hide(\"%s\")", prevSolidFeature->getNameInDocument()); + doCommand(Gui,"Gui.activeDocument().show(\"%s\")", (*f)->getNameInDocument()); + } + } +} + +bool CmdPartDesignMoveFeature::isActive(void) +{ + if (getActiveGuiDocument()) + return true; + else + return false; +} + //=========================================================================== // PartDesign_Datum //=========================================================================== @@ -1690,6 +1772,7 @@ void CreatePartDesignCommands(void) rcCmdMgr.addCommand(new CmdPartDesignMoveTip()); rcCmdMgr.addCommand(new CmdPartDesignDuplicateSelection()); + rcCmdMgr.addCommand(new CmdPartDesignMoveFeature()); rcCmdMgr.addCommand(new CmdPartDesignPlane()); rcCmdMgr.addCommand(new CmdPartDesignLine()); diff --git a/src/Mod/PartDesign/Gui/Workbench.cpp b/src/Mod/PartDesign/Gui/Workbench.cpp index 665cda863..5e104fe55 100644 --- a/src/Mod/PartDesign/Gui/Workbench.cpp +++ b/src/Mod/PartDesign/Gui/Workbench.cpp @@ -280,7 +280,8 @@ void Workbench::setupContextMenu(const char* recipient, Gui::MenuItem* item) con Gui::Selection().countObjectsOfType(PartDesign::Feature::getClassTypeId()) + Gui::Selection().countObjectsOfType(Part::Datum::getClassTypeId()) + Gui::Selection().countObjectsOfType(Part::Part2DObject::getClassTypeId()) > 0 ) - *item << "PartDesign_MoveTip"; + *item << "PartDesign_MoveTip" + << "PartDesign_MoveFeature"; } }