X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_Module.cpp;h=8292e70d6f6a86c708f5301bba1c18867dd2fe1f;hb=3b02241a66e6be241eebbe70df42349293c5f4ab;hp=8dfec292f04d56fb463bed339aef3065c7424737;hpb=a15ceb1354447d9e1670895ac6414204df831f2b;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 8dfec292f..8292e70d6 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -69,6 +69,7 @@ #include #include #include +#include #include #include @@ -82,7 +83,9 @@ #include #include #include +#include #include +#include #include #include @@ -120,11 +123,12 @@ #include #include +#include #include #include -#include #include +#include #include #include #include @@ -145,6 +149,11 @@ #include #include +#include + +#include + +#include #define FEATURE_ITEM_COLOR "0,0,225" @@ -158,18 +167,15 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* //****************************************************** PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) : ModuleBase_IModule(theWshop), + myIsOperationIsLaunched(false), myVisualLayerId(0), - myRoot(0), - myIsOperationIsLaunched(false) + myRoot(0) { new PartSet_IconFactory(this); mySketchMgr = new PartSet_SketcherMgr(this); mySketchReentrantMgr = new PartSet_SketcherReentrantMgr(theWshop); - XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); - XGUI_Workshop* aWorkshop = aConnector->workshop(); - ModuleBase_IViewer* aViewer = theWshop->viewer(); connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); @@ -184,7 +190,9 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENTS_CLOSED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_LICENSE_VALID)); registerSelectionFilter(SF_GlobalFilter, new PartSet_GlobalFilter(myWorkshop)); registerSelectionFilter(SF_FilterInfinite, new PartSet_FilterInfinite(myWorkshop)); @@ -196,9 +204,6 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) setDefaultConstraintShown(); - //Config_PropManager::registerProp("Visualization", "object_default_color", "Object color", - // Config_Prop::Color, "225,225,225"); - Config_PropManager::registerProp("Visualization", "result_body_color", "Result color", Config_Prop::Color, ModelAPI_ResultBody::DEFAULT_COLOR()); @@ -236,6 +241,7 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) "Hidden faces transparency", Config_Prop::DblSpin, "0.8"); + std::ostringstream aStream; aStream << SketcherPrs_Tools::getDefaultArrowSize(); Config_PropManager::registerProp("Visualization", "dimension_arrow_size", @@ -258,6 +264,12 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) "Feature items in Object Browser", Config_Prop::Color, FEATURE_ITEM_COLOR); + Config_PropManager::registerProp("Visualization", "zoom_trihedron_arrows", + "Keep trihedron arrows view size constant", Config_Prop::Boolean, "false"); + + Config_PropManager::registerProp("Visualization", "axis_arrow_size", + "Trihedron arrows constant size", Config_Prop::IntSpin, "10"); + Config_PropManager::registerProp("Shortcuts", "add_parameter_shortcut", "Add parameter in parameters manager dialog", Config_Prop::Shortcut, "Ctrl+A"); @@ -278,8 +290,16 @@ PartSet_Module::~PartSet_Module() void PartSet_Module::createFeatures() { ModuleBase_IModule::createFeatures(); + + // send signal to initialization plugin about the state of the preferences: to create part or not + bool aCreate = ModuleBase_Preferences::resourceMgr()->booleanValue( + ModuleBase_Preferences::GENERAL_SECTION, "create_init_part", true); + Events_MessageBool aCreateMsg(Events_Loop::eventByName(EVENT_CREATE_PART_ON_START), aCreate); + aCreateMsg.send(); + myRoot = new PartSet_RootNode(); myRoot->setWorkshop(workshop()); + ModuleBase_IModule::loadProprietaryPlugins(); } @@ -350,15 +370,7 @@ void PartSet_Module::operationCommitted(ModuleBase_Operation* theOperation) /// Restart sketcher operations automatically if (!mySketchReentrantMgr->operationCommitted(theOperation)) { - - ModuleBase_OperationFeature* aFOperation = - dynamic_cast(theOperation); - if (aFOperation && !aFOperation->isEditOperation()) { - // the selection is cleared after commit the create operation - // in order to do not use the same selected objects in the restarted operation - // for common behaviour, the selection is cleared even if the operation is not restarted - getWorkshop()->selector()->clearSelection(); - } + getWorkshop()->selector()->clearSelection(); } } @@ -370,6 +382,8 @@ void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) /// deactivate of overconstraint listener should be performed after Sketch abort (#2176) if (PartSet_SketcherMgr::isSketchOperation(theOperation)) overconstraintListener()->setActive(false); + + getWorkshop()->selector()->clearSelection(); } //****************************************************** @@ -881,7 +895,6 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th Config_WidgetAPI* theWidgetApi) { ModuleBase_IWorkshop* aWorkshop = workshop(); - XGUI_Workshop* aXUIWorkshop = getWorkshop(); ModuleBase_ModelWidget* aWgt = NULL; if (theType == "sketch-start-label") { PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, aWorkshop, @@ -1142,10 +1155,9 @@ void PartSet_Module::onViewTransformed(int theTrsfType) Handle(V3d_Viewer) aV3dViewer = aContext->CurrentViewer(); Handle(V3d_View) aView; double aScale = 0; - for (aV3dViewer->InitDefinedViews(); - aV3dViewer->MoreDefinedViews(); - aV3dViewer->NextDefinedViews()) { - Handle(V3d_View) aV = aV3dViewer->DefinedView(); + V3d_ListOfView::Iterator aDefinedViews(aV3dViewer->DefinedViews()); + for (; aDefinedViews.More(); aDefinedViews.Next()) { + Handle(V3d_View) aV = aDefinedViews.Value(); double aS = aV->Scale(); if (aS > aScale) { aScale = aS; @@ -1156,15 +1168,13 @@ void PartSet_Module::onViewTransformed(int theTrsfType) return; bool isModified = false; + double aLen = aView->Convert(SketcherPrs_Tools::getConfigArrowSize()); ModuleBase_Operation* aCurrentOperation = myWorkshop->currentOperation(); if (aCurrentOperation && (PartSet_SketcherMgr::isSketchOperation(aCurrentOperation) || sketchMgr()->isNestedSketchOperation(aCurrentOperation) || (aCurrentOperation->id() == "Measurement"))) { - double aLen = aView->Convert(SketcherPrs_Tools::getConfigArrowSize()); - - double aPrevLen = SketcherPrs_Tools::getArrowSize(); SketcherPrs_Tools::setArrowSize(aLen); const double aCurScale = aViewer->activeView()->Camera()->Scale(); aViewer->SetScale(aViewer->activeView(), aCurScale); @@ -1176,17 +1186,31 @@ void PartSet_Module::onViewTransformed(int theTrsfType) foreach(AISObjectPtr aAIS, aPrsList) { Handle(AIS_InteractiveObject) aAisObj = aAIS->impl(); #endif - Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(aAisObj); + Handle(PrsDim_Dimension) aDim = Handle(PrsDim_Dimension)::DownCast(aAisObj); if (!aDim.IsNull()) { aDim->DimensionAspect()->ArrowAspect()->SetLength(aLen); aContext->Redisplay(aDim, false); isModified = true; } } - if (isModified) - aDisplayer->updateViewer(); } + // Manage trihedron arrows + if (Config_PropManager::boolean("Visualization", "zoom_trihedron_arrows")) { + Handle(AIS_Trihedron) aTrihedron = aViewer->trihedron(); + if (!aTrihedron.IsNull()) { + double aAxLen = + aView->Convert(Config_PropManager::integer("Visualization", "axis_arrow_size")); + Handle(Prs3d_DatumAspect) aDatumAspect = aTrihedron->Attributes()->DatumAspect(); + double aAxisLen = aDatumAspect->AxisLength(Prs3d_DP_XAxis); + aDatumAspect->SetAttribute(Prs3d_DP_ShadingConeLengthPercent, aAxLen / aAxisLen); + aTrihedron->Attributes()->SetDatumAspect(aDatumAspect); + aContext->Redisplay(aTrihedron, false); + isModified = true; + } + } + if (isModified) + aDisplayer->updateViewer(); } //****************************************************** @@ -1376,14 +1400,6 @@ AISObjectPtr PartSet_Module::createPresentation(const ObjectPtr& theObject) return anAIS; } -//****************************************************** -void getResultColor(const ResultPtr& theResult, std::vector& theColor) -{ - ModelAPI_Tools::getColor(theResult, theColor); - if (theColor.empty()) - PartSet_Tools::getDefaultColor(theResult, false, theColor); -} - //****************************************************** double getResultDeflection(const ResultPtr& theResult) { @@ -1402,6 +1418,90 @@ double getResultTransparency(const ResultPtr& theResult) return aTransparency; } +static AttributeImagePtr findImage(const ObjectPtr& theResult) +{ + AttributeImagePtr anImageAttr; + + if (theResult.get()) { + ResultBodyPtr aResultBody = + std::dynamic_pointer_cast(theResult); + if (aResultBody.get()) { + anImageAttr = aResultBody->data()->image(ModelAPI_ResultBody::IMAGE_ID()); + if (!anImageAttr.get() || !anImageAttr->hasTexture()) { + // try to find an image attribute in parents + ObjectPtr aParent = theResult->document()->parent(theResult); + anImageAttr = findImage(aParent); + } + } + } + + return anImageAttr; +} + +//****************************************************** +void PartSet_Module::setTexture(const AISObjectPtr& thePrs, + const ResultPtr& theResult) +{ + ResultBodyPtr aResultBody = + std::dynamic_pointer_cast(theResult); + if (!aResultBody.get()) + return; + + AttributeImagePtr anImageAttr = findImage(theResult); + if (!anImageAttr.get() || !anImageAttr->hasTexture()) + return; + + int aWidth, aHeight; + std::string aFormat; + std::list aByteList; + anImageAttr->texture(aWidth, aHeight, aByteList, aFormat); + + Handle(AIS_InteractiveObject) anAIS = thePrs->impl(); + if (!anAIS.IsNull()) { + /// set color to white and change material aspect, + /// in order to keep a natural apect of the image. + thePrs->setColor(255, 255, 255); + Quantity_Color myShadingColor(NCollection_Vec3(1., 1., 1.)); + Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS); + if (!anAISShape.IsNull()) + { + auto myDrawer = anAISShape->Attributes(); + + myDrawer->ShadingAspect()->SetColor(myShadingColor); + myDrawer->ShadingAspect()->Aspect()->SetDistinguishOn(); + Graphic3d_MaterialAspect aMatAspect(Graphic3d_NOM_PLASTIC); + aMatAspect.SetTransparency(0.0); + myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(aMatAspect); + myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(aMatAspect); + + //aPixmap = OCCViewer_Utilities::imageToPixmap( px.toImage()); + Handle(Image_PixMap) aPixmap = new Image_PixMap(); +#if OCC_VERSION_LARGE < 0x07070000 + aPixmap->InitTrash(Image_PixMap::ImgBGRA, aWidth, aHeight); +#else + aPixmap->InitTrash(Image_Format_BGRA, aWidth, aHeight); +#endif + std::list::iterator aByteIter = aByteList.begin(); + for (int aLine = 0; aLine < aHeight; ++aLine) { + // convert pixels from ARGB to renderer-compatible RGBA + for (int aByte = 0; aByte < aWidth; ++aByte) { + Image_ColorBGRA& aPixmapBytes = aPixmap->ChangeValue(aLine, aByte); + + aPixmapBytes.b() = (Standard_Byte) *aByteIter++; + aPixmapBytes.g() = (Standard_Byte) *aByteIter++; + aPixmapBytes.r() = (Standard_Byte) *aByteIter++; + aPixmapBytes.a() = (Standard_Byte) *aByteIter++; + } + } + + anAISShape->Attributes()->ShadingAspect()->Aspect()->SetTextureMap + (new Graphic3d_Texture2Dmanual(aPixmap)); + anAISShape->Attributes()->ShadingAspect()->Aspect()->SetTextureMapOn(); + + anAISShape->SetDisplayMode(AIS_Shaded); + } + } +} //****************************************************** void PartSet_Module::customizePresentation(const ObjectPtr& theObject, @@ -1412,28 +1512,43 @@ void PartSet_Module::customizePresentation(const ObjectPtr& theObject, } else { ResultPtr aResult = std::dynamic_pointer_cast(theObject); + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); if (aResult.get()) { std::vector aColor; - getResultColor(aResult, aColor); - - SessionPtr aMgr = ModelAPI_Session::get(); - if (aMgr->activeDocument() != aResult->document()) { + bool isSameDoc = (ModelAPI_Session::get()->activeDocument() == aResult->document()); + // Get user defined color for the object + ModelAPI_Tools::getColor(aResult, aColor); + if (isSameDoc) { + bool isCustomized = false; + if (aColor.empty() && aFeature.get()) { + GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast(aFeature); + if (aCustPrs.get()) { + isCustomized = aCustPrs->customisePresentation(aResult, thePrs); + } + } + if (!isCustomized) { + if (aColor.empty()) { + PartSet_Tools::getDefaultColor(aResult, false, aColor); + } + thePrs->setColor(aColor[0], aColor[1], aColor[2]); + } + } + else { + if (aColor.empty()) { + PartSet_Tools::getDefaultColor(aResult, false, aColor); + } QColor aQColor(aColor[0], aColor[1], aColor[2]); QColor aNewColor = QColor::fromHsvF(aQColor.hueF(), aQColor.saturationF() / 3., aQColor.valueF()); - aColor[0] = aNewColor.red(); - aColor[1] = aNewColor.green(); - aColor[2] = aNewColor.blue(); + thePrs->setColor(aNewColor.red(), aNewColor.green(), aNewColor.blue()); } - thePrs->setColor(aColor[0], aColor[1], aColor[2]); - thePrs->setDeflection(getResultDeflection(aResult)); - thePrs->setTransparency(getResultTransparency(aResult)); + + /// set texture parameters, if any + setTexture(thePrs, aResult); } - FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (aFeature.get()) { - if (aFeature->getKind() == SketchPlugin_Sketch::ID()) + if (aFeature.get() && (aFeature->getKind() == SketchPlugin_Sketch::ID())) { thePrs->setWidth(2); } } @@ -1489,8 +1604,9 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const bool hasCompositeOwner = false; bool hasResultInHistory = false; bool hasFolder = false; + bool hasGroupsOnly = false; ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, - hasCompositeOwner, hasResultInHistory, hasFolder); + hasCompositeOwner, hasResultInHistory, hasFolder, hasGroupsOnly); ModuleBase_Operation* aCurrentOp = myWorkshop->currentOperation(); if (aSelected == 1) { @@ -1513,11 +1629,29 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const } else if (aObject->document() == aMgr->activeDocument()) { if (hasParameter || hasFeature) { - myMenuMgr->action("EDIT_CMD")->setEnabled(true); - theMenu->addAction(myMenuMgr->action("EDIT_CMD")); - if (aCurrentOp && aFeature.get()) { - if (aCurrentOp->id().toStdString() == aFeature->getKind()) + + // disable Edit menu for groups under ImportResult feature + bool isEnabled = true; + if (aFeature.get() && aFeature->getKind() == "Group") + { + std::shared_ptr anOwner = + ModelAPI_Tools::compositeOwner (aFeature); + + if (anOwner.get() && anOwner->getKind() == "ImportResult") + { myMenuMgr->action("EDIT_CMD")->setEnabled(false); + isEnabled = false; + } + } + + if (isEnabled) + { + myMenuMgr->action("EDIT_CMD")->setEnabled(true); + theMenu->addAction(myMenuMgr->action("EDIT_CMD")); + if (aCurrentOp && aFeature.get()) { + if (aCurrentOp->id().toStdString() == aFeature->getKind()) + myMenuMgr->action("EDIT_CMD")->setEnabled(false); + } } } } @@ -1548,7 +1682,12 @@ if (aObjIndex.isValid()) { \ //****************************************************** void PartSet_Module::processEvent(const std::shared_ptr& theMessage) { - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENTS_CLOSED)) { + closeDocument(); + } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { + SessionPtr aMgr = ModelAPI_Session::get(); + if (!aMgr->hasModuleDocument()) // if document is closed, do not call the document creation + return; // Do not change activation of parts if an operation active static QStringList aAllowActivationList; if (aAllowActivationList.isEmpty()) @@ -1560,32 +1699,34 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess (!aAllowActivationList.contains(myWorkshop->currentOperation()->id()))) return; XGUI_Workshop* aWorkshop = getWorkshop(); - XGUI_DataTree* aTreeView = aWorkshop->objectBrowser()->treeView(); - QLabel* aLabel = aWorkshop->objectBrowser()->activeDocLabel(); - QPalette aPalet = aLabel->palette(); + bool needUpdate = false; + XGUI_DataTree* aTreeView = 0; + if (aWorkshop->objectBrowser()) { + aTreeView = aWorkshop->objectBrowser()->treeView(); + QLabel* aLabel = aWorkshop->objectBrowser()->activeDocLabel(); + QPalette aPalet = aLabel->palette(); - SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aActiveDoc = aMgr->activeDocument(); + DocumentPtr aActiveDoc = aMgr->activeDocument(); - // Clear active part index if there is no Part documents - // It could be not null if document was closed and opened a new - // without closeDocument call - if (aMgr->allOpenedDocuments().size() <= 1) - myActivePartIndex = QModelIndex(); + // Clear active part index if there is no Part documents + // It could be not null if document was closed and opened a new + // without closeDocument call + if (aMgr->allOpenedDocuments().size() <= 1) + myActivePartIndex = QModelIndex(); - XGUI_DataModel* aDataModel = aWorkshop->objectBrowser()->dataModel(); - QModelIndex aOldActive = myActivePartIndex; - myActivePartIndex = aDataModel->documentRootIndex(aActiveDoc, 0); - bool needUpdate = false; - if (myActivePartIndex.isValid()) { - needUpdate = aTreeView->isExpanded(myActivePartIndex); - if (!needUpdate) - aTreeView->setExpanded(myActivePartIndex, true); - } - if ((aOldActive != myActivePartIndex) && (aOldActive.isValid())) - aTreeView->setExpanded(aOldActive, false); + XGUI_DataModel* aDataModel = aWorkshop->objectBrowser()->dataModel(); + QModelIndex aOldActive = myActivePartIndex; + myActivePartIndex = aDataModel->documentRootIndex(aActiveDoc, 0); + if (myActivePartIndex.isValid()) { + needUpdate = aTreeView->isExpanded(myActivePartIndex); + if (!needUpdate) + aTreeView->setExpanded(myActivePartIndex, true); + } + if ((aOldActive != myActivePartIndex) && (aOldActive.isValid())) + aTreeView->setExpanded(aOldActive, false); - aLabel->setPalette(aPalet); + aLabel->setPalette(aPalet); + } aWorkshop->updateCommandStatus(); // Update displayed objects in order to update active color @@ -1642,10 +1783,17 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess CompositeFeaturePtr aSketch = mySketchMgr->activeSketch(); if (aSketch.get()) { ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - if (PartSet_SketcherMgr::isSketchOperation(anOperation)) + if (PartSet_SketcherMgr::isSketchOperation(anOperation) && + mySketchMgr->previewSketchPlane()->isDisplayed()) mySketchMgr->previewSketchPlane()->createSketchPlane(aSketch, myWorkshop); } } + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_LICENSE_VALID)) { + std::shared_ptr aMsg = + std::dynamic_pointer_cast(theMessage); + myFeaturesValidLicense.insert(aMsg->features().begin(), aMsg->features().end()); + processProprietaryFeatures(); + } } //****************************************************** @@ -1675,6 +1823,25 @@ void PartSet_Module::onTreeViewDoubleClick(const QModelIndex& theIndex) if (aPartFeature.get() && (aPartFeature->getKind() == PartSetPlugin_Part::ID())) { aPart = std::dynamic_pointer_cast(aPartFeature->firstResult()); } + if (aObj.get()) + { + if (!aPart.get() && aObj->groupName() == ModelAPI_ResultParameter::group()) + { + QObjectPtrList aSelectedObjects = aWorkshop->objectBrowser()->selectedObjects(); + FeaturePtr aFeature; + ResultParameterPtr aParam; + foreach(ObjectPtr aSelected, aSelectedObjects) { + aParam = std::dynamic_pointer_cast(aSelected); + if (aParam.get()) + break; + } + if (aParam.get()) + aFeature = ModelAPI_Feature::feature(aParam); + + if (aFeature.get()) + editFeature(aFeature); + } + } } if (aPart.get()) { // if this is a part if (aPart->partDoc() == aMgr->activeDocument()) { @@ -1833,3 +2000,56 @@ void PartSet_Module::disableCustomMode(ModuleBase_CustomizeFlag theMode) { void PartSet_Module::enableCustomModes() { myCustomPrs->enableCustomModes(); } + +//****************************************************** +void PartSet_Module::onRemoveConflictingConstraints() +{ + const std::set& aConstraints = myOverconstraintListener->objectsToRemove(); + std::set::const_iterator anIt; + + XGUI_Workshop* aWorkshop = getWorkshop(); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + + bool isAllowToNotify = ModuleBase_Preferences::resourceMgr()->booleanValue(SKETCH_TAB_NAME, + "notify_change_constraint"); + + if (isAllowToNotify) { + anIt = aConstraints.begin(); + std::string aText("Conflict in constraints: \n"); + + for (; anIt != aConstraints.end(); anIt++) + { + ObjectPtr anObject = *anIt; + FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); + TCollection_AsciiString aStr(aFeature->name().c_str()); + std::string aName(aStr.ToCString()); + aText += aName + "\n"; + } + + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + ModuleBase_Tools::warningAboutConflict(aConnector->desktop(), + aText); + } + + ModuleBase_Operation* anOp = anOpMgr->currentOperation(); + if (sketchMgr()->isNestedSketchOperation(anOp)) { + std::set aFeatures; + for (anIt = aConstraints.cbegin(); anIt != aConstraints.cend(); anIt++) + aFeatures.insert(ModelAPI_Feature::feature(*anIt)); + + ModelAPI_Tools::removeFeaturesAndReferences(aFeatures); + } + else { + QObjectPtrList anObjectsList; + for (anIt = aConstraints.cbegin(); anIt != aConstraints.cend(); anIt++) + anObjectsList.append(*anIt); + + QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); + ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription); + + anOpMgr->startOperation(anOpAction); + aWorkshop->deleteFeatures(anObjectsList); + anOpMgr->commitOperation(); + } + ModuleBase_Tools::flushUpdated(sketchMgr()->activeSketch()); +}