X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_Module.cpp;h=3999ae85e8778acfb834a6fbd78cec5f635ddcfd;hb=9e28b1097a2ca2b6bd9d301bd2a3059331ab8c90;hp=24070e7a7e180221c133e238fcfe7e16b1ce0e2f;hpb=3d4040199faaa10d515ad758873e051af5654771;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 24070e7a7..3999ae85e 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-2021 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 @@ -145,6 +145,14 @@ #include #include +#include + +#ifdef HAVE_SALOME +#include +#endif + +#define FEATURE_ITEM_COLOR "0,0,225" + /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) @@ -155,18 +163,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*))); @@ -193,19 +198,15 @@ 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()); Config_PropManager::registerProp("Visualization", "result_group_color", "Group color", Config_Prop::Color, ModelAPI_ResultGroup::DEFAULT_COLOR()); - Config_PropManager::registerProp("Visualization", "result_construction_color", - "Construction color", - Config_Prop::Color, - ModelAPI_ResultConstruction::DEFAULT_COLOR()); + Config_PropManager::registerProp("Visualization", + ModelAPI_ResultConstruction::RESULT_COLOR_NAME(), + "Construction color", Config_Prop::Color, ModelAPI_ResultConstruction::DEFAULT_COLOR()); Config_PropManager::registerProp("Visualization", "result_part_color", "Part color", Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR()); @@ -233,6 +234,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", @@ -251,6 +253,16 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) "Dimension color", Config_Prop::Color, SKETCH_DIMENSION_COLOR); + Config_PropManager::registerProp("Visualization", "feature_objectbrowser_color", + "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"); @@ -343,15 +355,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(); } } @@ -363,6 +367,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(); } //****************************************************** @@ -461,9 +467,9 @@ void PartSet_Module::updateSketcherOnStart(ModuleBase_Operation* theOperation) } // It is switched off because of // Task #3067: 5.2.2 Drawing in the sketcher: change the mouse cursor arrow - //else if (sketchMgr()->isNestedSketchOperation(theOperation)) { - // mySketchMgr->startNestedSketch(theOperation); - //} + else if (sketchMgr()->isNestedSketchOperation(theOperation)) { + mySketchMgr->startNestedSketch(theOperation); + } } //****************************************************** @@ -874,7 +880,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, @@ -1149,15 +1154,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,10 +1179,24 @@ void PartSet_Module::onViewTransformed(int theTrsfType) 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(); } //****************************************************** @@ -1313,6 +1330,27 @@ void PartSet_Module::onActiveDocPopup(const QPoint& thePnt) QMenu aMenu; aMenu.addAction(aActivatePartAction); + +#ifndef HAVE_SALOME + if (aMgr->activeDocument() == aMgr->moduleDocument()) { + DocumentPtr aDoc = aMgr->moduleDocument(); + int aNbParts = aDoc->size(ModelAPI_ResultPart::group()); + bool aHaveToActivate = false; + for (int i = 0; i < aNbParts; i++) { + ObjectPtr aObj = aDoc->object(ModelAPI_ResultPart::group(), i); + ResultPartPtr aPartRes = std::dynamic_pointer_cast(aObj); + if (!aPartRes->partDoc().get()) { + aHaveToActivate = true; + break; + } + } + if (aHaveToActivate) { + QAction* aActivateAllPartAction = myMenuMgr->action("ACTIVATE_ALL_PARTS_CMD"); + aMenu.addAction(aActivateAllPartAction); + } + } +#endif + aMenu.exec(aHeader->mapToGlobal(thePnt)); } @@ -1348,14 +1386,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) { @@ -1374,6 +1404,44 @@ double getResultTransparency(const ResultPtr& theResult) return aTransparency; } +//****************************************************** +void PartSet_Module::setTexture(const std::string & theTextureFile, const AISObjectPtr& thePrs) +{ +#ifdef HAVE_SALOME + 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); + + Handle(Image_PixMap) aPixmap; + QPixmap px(theTextureFile.c_str()); + + if (!px.isNull() ) + aPixmap = OCCViewer_Utilities::imageToPixmap( px.toImage()); + + anAISShape->Attributes()->ShadingAspect()->Aspect()->SetTextureMap + (new Graphic3d_Texture2Dmanual(aPixmap)); + anAISShape->Attributes()->ShadingAspect()->Aspect()->SetTextureMapOn(); + + anAISShape->SetDisplayMode(AIS_Shaded); + } + } +#endif +} //****************************************************** void PartSet_Module::customizePresentation(const ObjectPtr& theObject, @@ -1384,28 +1452,45 @@ 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(aResult->hasTextureFile()) { + setTexture(aResult->getTextureFile(), thePrs); + } } - 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); } } @@ -1521,6 +1606,9 @@ if (aObjIndex.isValid()) { \ void PartSet_Module::processEvent(const std::shared_ptr& theMessage) { 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()) @@ -1532,49 +1620,48 @@ 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 XGUI_Displayer* aDisplayer = aWorkshop->displayer(); QObjectPtrList aObjects = aDisplayer->displayedObjects(); bool aHidden; - bool aUpdateViewer = false; foreach(ObjectPtr aObj, aObjects) { aHidden = !aObj->data() || !aObj->data()->isValid() || aObj->isDisabled() || (!aObj->isDisplayed()); if (!aHidden) { aDisplayer->redisplay(aObj, false); - aUpdateViewer = true; } } - if (aUpdateViewer) - aDisplayer->updateViewer(); + aDisplayer->updateViewer(); // Update tree items if they are expanded if (needUpdate) { aTreeView->viewport()->update(aTreeView->viewport()->rect()); @@ -1617,7 +1704,8 @@ 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); } } @@ -1808,3 +1896,30 @@ void PartSet_Module::disableCustomMode(ModuleBase_CustomizeFlag theMode) { void PartSet_Module::enableCustomModes() { myCustomPrs->enableCustomModes(); } + +//****************************************************** +void PartSet_Module::onConflictingConstraints() +{ + const std::set& aConstraints = myOverconstraintListener->conflictingObjects(); + QObjectPtrList aObjectsList; + std::set::const_iterator aIt; + for (aIt = aConstraints.cbegin(); aIt != aConstraints.cend(); aIt++) { + if (mySketchReentrantMgr->isLastAutoConstraint(*aIt)) + aObjectsList.append(*aIt); + } + if (aObjectsList.size() > 0) { + XGUI_Workshop* aWorkshop = getWorkshop(); + QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); + ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + + ModuleBase_Operation* anOp = anOpMgr->currentOperation(); + if (sketchMgr()->isNestedSketchOperation(anOp)) + anOp->abort(); + + anOpMgr->startOperation(anOpAction); + aWorkshop->deleteFeatures(aObjectsList); + anOpMgr->commitOperation(); + ModuleBase_Tools::flushUpdated(sketchMgr()->activeSketch()); + } +}