-// 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
#include <ModuleBase_OperationDescription.h>
#include <ModuleBase_ViewerPrs.h>
#include <ModuleBase_ResultPrs.h>
+#include <ModuleBase_Preferences.h>
#include <ModelAPI_ResultField.h>
#include <ModelAPI_Object.h>
#include <ModelAPI_Tools.h>
#include <ModelAPI_ResultConstruction.h>
#include <ModelAPI_AttributeIntArray.h>
+#include <ModelAPI_AttributeImage.h>
#include <ModelAPI_ResultGroup.h>
+#include <ModelAPI_ResultParameter.h>
#include <GeomDataAPI_Point2D.h>
#include <GeomDataAPI_Point.h>
#include <SketcherPrs_Tools.h>
#include <Events_Loop.h>
+#include <Events_MessageBool.h>
#include <Config_PropManager.h>
#include <Config_Keywords.h>
-#include <AIS_Dimension.hxx>
#include <AIS_InteractiveObject.hxx>
+#include <PrsDim_Dimension.hxx>
#include <StdSelect_TypeOfFace.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS.hxx>
#include <GeomDataAPI_Dir.h>
#include <SelectMgr_ListIteratorOfListOfFilter.hxx>
+#include <Graphic3d_Texture2Dmanual.hxx>
+
+#include <SUIT_ResourceMgr.h>
#define FEATURE_ITEM_COLOR "0,0,225"
//******************************************************
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<XGUI_ModuleConnector*>(theWshop);
- XGUI_Workshop* aWorkshop = aConnector->workshop();
-
ModuleBase_IViewer* aViewer = theWshop->viewer();
connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)),
this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*)));
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));
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_Prop::Color, FEATURE_ITEM_COLOR);
Config_PropManager::registerProp("Visualization", "zoom_trihedron_arrows",
- "Zoom trihedron arrows", Config_Prop::Boolean, "false");
+ "Keep trihedron arrows view size constant", Config_Prop::Boolean, "false");
Config_PropManager::registerProp("Visualization", "axis_arrow_size",
- "Axis arrow size", Config_Prop::IntSpin, "10");
+ "Trihedron arrows constant size", Config_Prop::IntSpin, "10");
Config_PropManager::registerProp("Shortcuts", "add_parameter_shortcut",
"Add parameter in parameters manager dialog",
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();
}
/// Restart sketcher operations automatically
if (!mySketchReentrantMgr->operationCommitted(theOperation)) {
-
- ModuleBase_OperationFeature* aFOperation =
- dynamic_cast<ModuleBase_OperationFeature*>(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();
}
}
/// deactivate of overconstraint listener should be performed after Sketch abort (#2176)
if (PartSet_SketcherMgr::isSketchOperation(theOperation))
overconstraintListener()->setActive(false);
+
+ getWorkshop()->selector()->clearSelection();
}
//******************************************************
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,
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;
sketchMgr()->isNestedSketchOperation(aCurrentOperation) ||
(aCurrentOperation->id() == "Measurement")))
{
-
- double aPrevLen = SketcherPrs_Tools::getArrowSize();
SketcherPrs_Tools::setArrowSize(aLen);
const double aCurScale = aViewer->activeView()->Camera()->Scale();
aViewer->SetScale(aViewer->activeView(), aCurScale);
foreach(AISObjectPtr aAIS, aPrsList) {
Handle(AIS_InteractiveObject) aAisObj = aAIS->impl<Handle(AIS_InteractiveObject)>();
#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);
return anAIS;
}
-//******************************************************
-void getResultColor(const ResultPtr& theResult, std::vector<int>& theColor)
-{
- ModelAPI_Tools::getColor(theResult, theColor);
- if (theColor.empty())
- PartSet_Tools::getDefaultColor(theResult, false, theColor);
-}
-
//******************************************************
double getResultDeflection(const ResultPtr& theResult)
{
return aTransparency;
}
+static AttributeImagePtr findImage(const ObjectPtr& theResult)
+{
+ AttributeImagePtr anImageAttr;
+
+ if (theResult.get()) {
+ ResultBodyPtr aResultBody =
+ std::dynamic_pointer_cast<ModelAPI_ResultBody>(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<ModelAPI_ResultBody>(theResult);
+ if (!aResultBody.get())
+ return;
+
+ AttributeImagePtr anImageAttr = findImage(theResult);
+ if (!anImageAttr.get() || !anImageAttr->hasTexture())
+ return;
+
+ int aWidth, aHeight;
+ std::string aFormat;
+ std::list<unsigned char> aByteList;
+ anImageAttr->texture(aWidth, aHeight, aByteList, aFormat);
+
+ Handle(AIS_InteractiveObject) anAIS = thePrs->impl<Handle(AIS_InteractiveObject)>();
+ 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<float>(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();
+ aPixmap->InitTrash(Image_PixMap::ImgBGRA, aWidth, aHeight);
+ std::list<unsigned char>::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<Image_ColorBGRA>(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,
}
else {
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
if (aResult.get()) {
std::vector<int> 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<GeomAPI_ICustomPrs>(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);
}
}
} 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<ModelAPI_CompositeFeature> 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);
+ }
}
}
}
//******************************************************
void PartSet_Module::processEvent(const std::shared_ptr<Events_Message>& 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())
(!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
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<ModelAPI_FeaturesLicenseValidMessage> aMsg =
+ std::dynamic_pointer_cast<ModelAPI_FeaturesLicenseValidMessage>(theMessage);
+ myFeaturesValidLicense.insert(aMsg->features().begin(), aMsg->features().end());
+ processProprietaryFeatures();
+ }
}
//******************************************************
if (aPartFeature.get() && (aPartFeature->getKind() == PartSetPlugin_Part::ID())) {
aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(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<ModelAPI_ResultParameter>(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()) {
void PartSet_Module::enableCustomModes() {
myCustomPrs->enableCustomModes();
}
+
+//******************************************************
+void PartSet_Module::onRemoveConflictingConstraints()
+{
+ const std::set<ObjectPtr>& aConstraints = myOverconstraintListener->objectsToRemove();
+ std::set<ObjectPtr>::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<ModelAPI_Feature>(anObject);
+ TCollection_AsciiString aStr(aFeature->name().c_str());
+ std::string aName(aStr.ToCString());
+ aText += aName + "\n";
+ }
+
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myWorkshop);
+ ModuleBase_Tools::warningAboutConflict(aConnector->desktop(),
+ aText);
+ }
+
+ ModuleBase_Operation* anOp = anOpMgr->currentOperation();
+ if (sketchMgr()->isNestedSketchOperation(anOp)) {
+ std::set<FeaturePtr> 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());
+}