- QStringList aIndirectRefNames;
- foreach (const FeaturePtr& aFeature, aIndirectRefFeatures)
- aIndirectRefNames.append(aFeature->name().c_str());
- aIndirectNames = aIndirectRefNames.join(", ");
- }
-
- bool aCanReplaceParameters = !aDirectRefFeatures.empty();
- QStringList aPartFeatureNames;
- foreach (ObjectPtr aObj, theList) {
- FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
- // invalid feature data means that the feature is already removed in model,
- // we needn't process it. E.g. delete of feature from create operation. The operation abort
- // will delete the operation
- if (!aFeature->data()->isValid())
- continue;
- ResultPtr aFirstResult = aFeature->firstResult();
- std::string aResultGroupName = aFirstResult->groupName();
- if (aResultGroupName == ModelAPI_ResultPart::group())
- aPartFeatureNames.append(aFeature->name().c_str());
-
- if (aCanReplaceParameters && aResultGroupName != ModelAPI_ResultParameter::group())
- aCanReplaceParameters = false;
- }
- QString aPartNames = aPartFeatureNames.join(", ");
-
- QMessageBox aMessageBox(theParent);
- aMessageBox.setWindowTitle(tr("Delete features"));
- aMessageBox.setIcon(QMessageBox::Warning);
- aMessageBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
- aMessageBox.setDefaultButton(QMessageBox::No);
-
- QString aText;
- if (!aDirectNames.isEmpty() || !aIndirectNames.isEmpty()) {
- if (aCanReplaceParameters) {
- aText = QString(tr("Selected parameters are used in the following features: %1.\nThese features will be deleted.\nOr parameters could be replaced by their values.\n")
- .arg(aDirectNames));
- if (!aIndirectNames.isEmpty())
- aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
- QPushButton *aReplaceButton = aMessageBox.addButton(tr("Replace"), QMessageBox::ActionRole);
- } else {
- aText = QString(tr("Selected features are used in the following features: %1.\nThese features will be deleted.\n")).arg(aDirectNames);
- if (!aIndirectNames.isEmpty())
- aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
- }
- }
- if (!aPartNames.isEmpty())
- aText += QString(tr("The following parts will be deleted: %1.\n")).arg(aPartNames);
-
- if (!aText.isEmpty()) {
- aText += "Would you like to continue?";
- aMessageBox.setText(aText);
- aMessageBox.exec();
- QMessageBox::ButtonRole aButtonRole = aMessageBox.buttonRole(aMessageBox.clickedButton());
-
- if (aButtonRole == QMessageBox::NoRole)
- return false;
-
- if (aButtonRole == QMessageBox::ActionRole) {
- foreach (ObjectPtr aObj, theList)
- ModelAPI_ReplaceParameterMessage::send(aObj, this);
- doDeleteReferences = false;
- }
- }
- return true;
-}
-
-bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theFeatures,
- const std::set<FeaturePtr>& theIgnoredFeatures)
-{
- std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
- findReferences(theFeatures, aDirectRefFeatures, aIndirectRefFeatures);
- return deleteFeaturesInternal(theFeatures, aDirectRefFeatures, aIndirectRefFeatures,
- theIgnoredFeatures);
-}
-
-bool XGUI_Workshop::deleteFeaturesInternal(const QObjectPtrList& theList,
- const std::set<FeaturePtr>& aDirectRefFeatures,
- const std::set<FeaturePtr>& aIndirectRefFeatures,
- const std::set<FeaturePtr>& theIgnoredFeatures,
- const bool doDeleteReferences)
-{
- if (doDeleteReferences) {
- std::set<FeaturePtr> aFeaturesToDelete = aDirectRefFeatures;
- aFeaturesToDelete.insert(aIndirectRefFeatures.begin(), aIndirectRefFeatures.end());
- std::set<FeaturePtr>::const_iterator anIt = aFeaturesToDelete.begin(),
- aLast = aFeaturesToDelete.end();
-#ifdef DEBUG_DELETE
- QStringList anInfo;
-#endif
- for (; anIt != aLast; anIt++) {
- FeaturePtr aFeature = (*anIt);
- DocumentPtr aDoc = aFeature->document();
- if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) {
- aDoc->removeFeature(aFeature);
-#ifdef DEBUG_DELETE
- anInfo.append(ModuleBase_Tools::objectInfo(aFeature).toStdString().c_str());
-#endif
- }
- }
-#ifdef DEBUG_DELETE
- qDebug(QString("remove references:%1").arg(anInfo.join("; ")).toStdString().c_str());
- anInfo.clear();
-#endif
- }
-
- QString anActionId = "DELETE_CMD";
- return removeFeatures(theList, theIgnoredFeatures, anActionId);
-}
-
-//**************************************************************
-bool XGUI_Workshop::removeFeatures(const QObjectPtrList& theList,
- const std::set<FeaturePtr>& theIgnoredFeatures,
- const QString& theActionId)
-{
- bool isDone = false;
-
- QString anId = QString::fromStdString(theActionId.toStdString().c_str());
- QStringList anObjectGroups = contextMenuMgr()->actionObjectGroups(anId);
- // 4. remove the parameter features
- foreach (ObjectPtr aObj, theList) {
- // features and parameters can be removed here,
- // the results are removed only by a corresponded feature remove
- std::string aGroupName = aObj->groupName();
- if (!anObjectGroups.contains(aGroupName.c_str()))
- continue;
-
- FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
- if (aFeature) {
- /*// TODO: to learn the workshop to delegate the Part object deletion to the PartSet module
- // part features are removed in the PartSet module. This condition should be moved there
- if (aFeature->getKind() == "Part")
- continue;
- */
- DocumentPtr aDoc = aObj->document();
- if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) {
-#ifdef DEBUG_DELETE
- QString anInfoStr = ModuleBase_Tools::objectInfo(aFeature);
- anInfo.append(anInfoStr);
- qDebug(QString("remove feature :%1").arg(anInfoStr).toStdString().c_str());
-#endif
- aDoc->removeFeature(aFeature);
- isDone = true;
- }
- }
- }
-#ifdef DEBUG_DELETE
- qDebug(QString("remove features:%1").arg(anInfo.join("; ")).toStdString().c_str());
-#endif
- return true;