-// 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 "PartSet_Validators.h"
#include "PartSet_Tools.h"
#include "PartSet_PreviewPlanes.h"
+#include "PartSet_WidgetBSplinePoints.h"
#include "PartSet_WidgetPoint2d.h"
#include "PartSet_WidgetPoint2DFlyout.h"
#include "PartSet_WidgetShapeSelector.h"
#include "PartSet_OverconstraintListener.h"
#include "PartSet_TreeNodes.h"
#include "PartSet_FieldStepPrs.h"
+#include "PartSet_BSplineWidget.h"
#include "PartSet_Filters.h"
#include "PartSet_FilterInfinite.h"
+#ifdef _DEBUG
+#include <QDebug>
+#endif
+
#include <PartSetPlugin_Remove.h>
#include <PartSetPlugin_Part.h>
#include <PartSetPlugin_Duplicate.h>
#include <SketchPlugin_ConstraintCoincidence.h>
#include <ModuleBase_Operation.h>
-#include <ModuleBase_OperationAction.h>
#include <ModuleBase_IViewer.h>
#include <ModuleBase_IViewWindow.h>
#include <ModuleBase_IPropertyPanel.h>
#include <ModuleBase_WidgetFactory.h>
#include <ModuleBase_OperationDescription.h>
#include <ModuleBase_ViewerPrs.h>
-#include <ModelAPI_ResultField.h>
+#include <ModuleBase_ResultPrs.h>
+#include <ModuleBase_Preferences.h>
+#include <ModelAPI_ResultField.h>
#include <ModelAPI_Object.h>
#include <ModelAPI_Events.h>
#include <ModelAPI_Validator.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 <XGUI_ActiveControlSelector.h>
#include <XGUI_ActionsMgr.h>
#include <XGUI_ContextMenuMgr.h>
-#include <XGUI_CustomPrs.h>
#include <XGUI_DataModel.h>
#include <XGUI_Displayer.h>
#include <XGUI_ErrorMgr.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"
-#ifdef _DEBUG
-#include <QDebug>
-#endif
/*!Create and return new instance of XGUI_Module*/
extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop)
//******************************************************
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", "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", "result_part_color", "Part color",
+ Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR());
+
+ Config_PropManager::registerProp("Visualization", "result_field_color", "Field color",
+ Config_Prop::Color, ModelAPI_ResultField::DEFAULT_COLOR());
+
Config_PropManager::registerProp("Visualization", "operation_parameter_color",
"Reference shape wireframe color in operation", Config_Prop::Color,
PartSet_CustomPrs::OPERATION_PARAMETER_COLOR());
"Hidden faces transparency",
Config_Prop::DblSpin,
"0.8");
+
std::ostringstream aStream;
aStream << SketcherPrs_Tools::getDefaultArrowSize();
Config_PropManager::registerProp("Visualization", "dimension_arrow_size",
Config_PropManager::registerProp("Visualization", "sketch_dimension_color",
"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");
+
+ Config_PropManager::registerProp("Windows", "use_hide_faces_panel",
+ "Use HideFaces panel in operations", Config_Prop::Boolean, "false");
}
//******************************************************
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();
}
//******************************************************
if (PartSet_SketcherMgr::isSketchOperation(theOperation)) {
mySketchMgr->startSketch(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);
}
ModuleBase_OperationFeature* aFOperation =
dynamic_cast<ModuleBase_OperationFeature*>(theOperation);
if (aFOperation) {
- myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, true);
- myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, true);
+ myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, false);
+ myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, false);
}
}
ModuleBase_OperationFeature* aFOperation =
dynamic_cast<ModuleBase_OperationFeature*>(theOperation);
if (aFOperation) {
- myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, true);
- myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, true);
+ myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, false);
+ myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, false);
}
}
bool PartSet_Module::canApplyAction(const ObjectPtr& theObject, const QString& theActionId) const
{
bool aValid = true;
- if (theActionId == "MOVE_CMD") {
+ if (theActionId == "MOVE_CMD" || theActionId == "MOVE_SPLIT_CMD") {
FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
if (aFeature) {
ResultPtr aResult = ModuleBase_Tools::firstResult(aFeature);
}
//******************************************************
-bool PartSet_Module::createWidgets(ModuleBase_Operation* theOperation,
+bool PartSet_Module::createWidgets(const FeaturePtr& theFeature, const QString& theXmlRepr,
QList<ModuleBase_ModelWidget*>& theWidgets) const
{
bool aProcessed = false;
- ModuleBase_OperationFeature* aFOperation =
- dynamic_cast<ModuleBase_OperationFeature*>(theOperation);
XGUI_Workshop* aWorkshop = getWorkshop();
XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel();
- if (mySketchMgr->activeSketch().get() && aFOperation && aPropertyPanel) {
+ if (mySketchMgr->activeSketch().get() && aPropertyPanel) {
ModuleBase_ISelection* aSelection = workshop()->selection();
// click on a point in sketch leads here with the point is highlighted, not yet selected
QList<ModuleBase_ViewerPrsPtr> aPreselection = aSelection->getHighlighted();
ObjectPtr anObject = aSelectedPrs->object();
FeaturePtr aFeature = ModelAPI_Feature::feature(anObject);
- FeaturePtr anOpFeature = aFOperation->feature();
GeomShapePtr aShape = aSelectedPrs->shape();
// click on the digit of dimension constrain comes here
// with an empty shape, so we need the check
- if (aFeature == anOpFeature && aShape.get() && !aShape->isNull()) {
+ if (aFeature == theFeature && aShape.get() && !aShape->isNull()) {
// if feature has only one result and shape of result is equal to selected shape
// this attribute is not processed. It is a case of Sketch Point.
if (aFeature->results().size() == 1) {
return aProcessed;
}
const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
- AttributePtr anAttribute = PartSet_Tools::findAttributeBy2dPoint(anObject, aTDShape,
- mySketchMgr->activeSketch());
- if (anAttribute.get()) {
- QString aXmlRepr = aFOperation->getDescription()->xmlRepresentation();
- ModuleBase_WidgetFactory aFactory(aXmlRepr.toStdString(), workshop());
+ std::pair<AttributePtr, int> anAttribute =
+ PartSet_Tools::findAttributeBy2dPoint(anObject, aTDShape, mySketchMgr->activeSketch());
+ if (anAttribute.first.get()) {
+ ModuleBase_WidgetFactory aFactory(theXmlRepr.toStdString(), workshop());
- const std::string anAttributeId = anAttribute->id();
+ const std::string anAttributeId = anAttribute.first->id();
aFactory.createWidget(aPropertyPanel->contentWidget(), anAttributeId);
theWidgets = aFactory.getModelWidgets();
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,
connect(aLabelWgt, SIGNAL(showConstraintToggled(int, bool)),
mySketchMgr, SLOT(onShowConstraintsToggle(int, bool)));
connect(aLabelWgt, SIGNAL(showFreePoints(bool)), mySketchMgr, SLOT(onShowPoints(bool)));
+ connect(aLabelWgt, SIGNAL(autoConstraints(bool)),
+ sketchReentranceMgr(), SLOT(onAutoConstraints(bool)));
aLabelWgt->setShowPointsState(mySketchMgr->isShowFreePointsShown());
aWgt = aLabelWgt;
} else if (theType == "sketch-2dpoint_selector") {
aPointSelectorWgt->setSketcher(mySketchMgr->activeSketch());
aWgt = aPointSelectorWgt;
}
+ else if (theType == "sketch-bspline_selector") {
+ PartSet_WidgetBSplinePoints* aBSplineWgt =
+ new PartSet_WidgetBSplinePoints(theParent, aWorkshop, theWidgetApi);
+ aBSplineWgt->setSketch(mySketchMgr->activeSketch());
+ aWgt = aBSplineWgt;
+ }
else if (theType == WDG_DOUBLEVALUE_EDITOR) {
aWgt = new PartSet_WidgetEditor(theParent, aWorkshop, theWidgetApi);
} else if (theType == "export_file_selector") {
aWgt = new PartSet_WidgetFileSelector(theParent, aWorkshop, theWidgetApi);
} else if (theType == "sketch_launcher") {
aWgt = new PartSet_WidgetSketchCreator(theParent, this, theWidgetApi);
- } else if (theType == "module_choice") {
+ }
+ else if (theType == "module_choice") {
aWgt = new ModuleBase_WidgetChoice(theParent, theWidgetApi);
connect(aWgt, SIGNAL(itemSelected(ModuleBase_ModelWidget*, int)),
- this, SLOT(onChoiceChanged(ModuleBase_ModelWidget*, int)));
+ this, SLOT(onChoiceChanged(ModuleBase_ModelWidget*, int)));
+ } else if (theType == "bspline-panel") {
+ PartSet_BSplineWidget* aPanel = new PartSet_BSplineWidget(theParent, theWidgetApi);
+ //aPanel->setFeature(theFeature);
+ aWgt = aPanel;
}
return aWgt;
}
// 3. start operation
QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text();
- ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, this);
+ ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription, this);
// the active nested sketch operation should be aborted unconditionally
// the Delete action should be additionally granted for the Sketch operation
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;
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);
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);
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();
}
//******************************************************
}
//******************************************************
-bool PartSet_Module::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
- std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs)
-{
- bool aCustomized = false;
-
- XGUI_Workshop* aWorkshop = getWorkshop();
- XGUI_Displayer* aDisplayer = aWorkshop->displayer();
- ObjectPtr anObject = aDisplayer->getObject(thePrs);
- if (!anObject)
- return aCustomized;
-
- if (!theResult.get()) {
- std::vector<int> aColor;
- XGUI_CustomPrs::getDefaultColor(anObject, true, aColor);
- if (!aColor.empty()) {
- aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
- }
- }
- // customize dimentional constrains
- sketchMgr()->customizePresentation(anObject);
-
- return aCustomized;
-}
-
-//******************************************************
-bool PartSet_Module::afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
- AISObjectPtr thePrs,
- GeomCustomPrsPtr theCustomPrs)
-{
- bool aCustomized = false;
-
- XGUI_Workshop* aWorkshop = getWorkshop();
- XGUI_Displayer* aDisplayer = aWorkshop->displayer();
- ObjectPtr anObject = aDisplayer->getObject(thePrs);
- if (!anObject)
- return aCustomized;
-
- std::vector<int> aColor;
- bool aUseCustomColor = true;
- if (aUseCustomColor)
- myOverconstraintListener->getCustomColor(anObject, aColor);
- // customize sketch symbol presentation
- Handle(AIS_InteractiveObject) anAISIO = thePrs->impl<Handle(AIS_InteractiveObject)>();
- if (!anAISIO.IsNull()) {
- if (!Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO).IsNull()) {
- Handle(SketcherPrs_SymbolPrs) aPrs = Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO);
- if (!aPrs.IsNull()) {
- aPrs->SetCustomColor(aColor);
- aCustomized = true;
- }
- } else if (!Handle(SketcherPrs_Coincident)::DownCast(anAISIO).IsNull()) {
- Handle(SketcherPrs_Coincident) aPrs = Handle(SketcherPrs_Coincident)::DownCast(anAISIO);
- if (!aPrs.IsNull()) {
- aPrs->SetCustomColor(aColor);
- aCustomized = true;
- }
- }
- }
- // customize sketch dimension constraint presentation
- if (!aCustomized) {
- if (!aColor.empty()) { // otherwise presentation has the default color
- aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
- }
- }
- return aCustomized;
-}
-
-//******************************************************
-bool PartSet_Module::customizeObject(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
+//bool PartSet_Module::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
+// std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs)
+//{
+// bool aCustomized = false;
+//
+// XGUI_Workshop* aWorkshop = getWorkshop();
+// XGUI_Displayer* aDisplayer = aWorkshop->displayer();
+// ObjectPtr anObject = aDisplayer->getObject(thePrs);
+// if (!anObject)
+// return aCustomized;
+//
+// if (!theResult.get()) {
+// std::vector<int> aColor;
+// XGUI_CustomPrs::getDefaultColor(anObject, true, aColor);
+// if (!aColor.empty()) {
+// aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+// }
+// }
+// // customize dimentional constrains
+// sketchMgr()->customisePresentation(anObject);
+//
+// return aCustomized;
+//}
+//
+////******************************************************
+//bool PartSet_Module::afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
+// AISObjectPtr thePrs,
+// GeomCustomPrsPtr theCustomPrs)
+//{
+// bool aCustomized = false;
+//
+// XGUI_Workshop* aWorkshop = getWorkshop();
+// XGUI_Displayer* aDisplayer = aWorkshop->displayer();
+// ObjectPtr anObject = aDisplayer->getObject(thePrs);
+// if (!anObject)
+// return aCustomized;
+//
+// std::vector<int> aColor;
+// bool aUseCustomColor = true;
+// if (aUseCustomColor)
+// myOverconstraintListener->getCustomColor(anObject, aColor);
+// // customize sketch symbol presentation
+// Handle(AIS_InteractiveObject) anAISIO = thePrs->impl<Handle(AIS_InteractiveObject)>();
+// if (!anAISIO.IsNull()) {
+// if (!Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO).IsNull()) {
+// Handle(SketcherPrs_SymbolPrs) aPrs = Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO);
+// if (!aPrs.IsNull()) {
+// aPrs->SetCustomColor(aColor);
+// aCustomized = true;
+// }
+// } else if (!Handle(SketcherPrs_Coincident)::DownCast(anAISIO).IsNull()) {
+// Handle(SketcherPrs_Coincident) aPrs = Handle(SketcherPrs_Coincident)::DownCast(anAISIO);
+// if (!aPrs.IsNull()) {
+// aPrs->SetCustomColor(aColor);
+// aCustomized = true;
+// }
+// }
+// }
+// // customize sketch dimension constraint presentation
+// if (!aCustomized) {
+// if (!aColor.empty()) { // otherwise presentation has the default color
+// aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+// }
+// }
+// return aCustomized;
+//}
+
+//******************************************************
+bool PartSet_Module::customizeFeature(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
const bool theUpdateViewer)
{
bool isRedisplayed = false;
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<ModelAPI_ResultPart>(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));
}
//******************************************************
-Handle(AIS_InteractiveObject) PartSet_Module::createPresentation(const ObjectPtr& theObject)
+AISObjectPtr PartSet_Module::createPresentation(const ObjectPtr& theObject)
+{
+ Handle(AIS_InteractiveObject) anAISPrs = mySketchMgr->createPresentation(theObject);
+ if (anAISPrs.IsNull()) {
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ if (aResult.get()) {
+ std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
+ if (aShapePtr.get() != NULL)
+ anAISPrs = new ModuleBase_ResultPrs(aResult);
+ }
+ else {
+ FieldStepPtr aStep =
+ std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(theObject);
+ if (aStep.get()) {
+ anAISPrs = new PartSet_FieldStepPrs(aStep);
+ }
+ }
+ }
+ AISObjectPtr anAIS;
+ if (!anAISPrs.IsNull()) {
+ Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs);
+ if (!aShapePrs.IsNull())
+ ModuleBase_Tools::setPointBallHighlighting((AIS_Shape*)aShapePrs.get());
+
+ anAIS = AISObjectPtr(new GeomAPI_AISObject());
+ anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
+ customizePresentation(theObject, anAIS);
+ }
+ return anAIS;
+}
+
+//******************************************************
+double getResultDeflection(const ResultPtr& theResult)
+{
+ double aDeflection = ModelAPI_Tools::getDeflection(theResult);
+ if (aDeflection < 0)
+ aDeflection = PartSet_Tools::getDefaultDeflection(theResult);
+ return aDeflection;
+}
+
+//******************************************************
+double getResultTransparency(const ResultPtr& theResult)
{
- ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
- if (aResult.get())
- return mySketchMgr->createPresentation(aResult);
+ double aTransparency = ModelAPI_Tools::getTransparency(theResult);
+ if (aTransparency < 0)
+ aTransparency = PartSet_Tools::getDefaultTransparency();
+ 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,
+ const AISObjectPtr& thePrs) const
+{
+ if (mySketchMgr->isObjectOfSketch(theObject)) {
+ mySketchMgr->customizeSketchPresentation(theObject, thePrs);
+ }
else {
- FieldStepPtr aStep =
- std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(theObject);
- if (aStep.get()) {
- return new PartSet_FieldStepPrs(aStep);
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+ if (aResult.get()) {
+ std::vector<int> aColor;
+ 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());
+ thePrs->setColor(aNewColor.red(), aNewColor.green(), aNewColor.blue());
+ }
+ thePrs->setDeflection(getResultDeflection(aResult));
+ thePrs->setTransparency(getResultTransparency(aResult));
+
+ /// set texture parameters, if any
+ setTexture(thePrs, aResult);
+ }
+ if (aFeature.get() && (aFeature->getKind() == SketchPlugin_Sketch::ID())) {
+ thePrs->setWidth(2);
}
}
- return Handle(AIS_InteractiveObject)();
}
+
//******************************************************
ObjectPtr PartSet_Module::findPresentedObject(const AISObjectPtr& theAIS) 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<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
foreach(ObjectPtr aObj, aObjects) {
aHidden = !aObj->data() || !aObj->data()->isValid() ||
aObj->isDisabled() || (!aObj->isDisplayed());
- if (!aHidden)
+ if (!aHidden) {
aDisplayer->redisplay(aObj, false);
+ }
}
aDisplayer->updateViewer();
// Update tree items if they are expanded
if (needUpdate) {
- aTreeView->viewport()->repaint(aTreeView->viewport()->rect());
+ aTreeView->viewport()->update(aTreeView->viewport()->rect());
}
} else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) {
std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
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()) {
if (aGeomShape.get()) {
TopoDS_Shape aTDSShape = aGeomShape->impl<TopoDS_Shape>();
- return PartSet_Tools::findAttributeBy2dPoint(theObject, aTDSShape,
- mySketchMgr->activeSketch());
+ std::pair<AttributePtr, int> anAttrAndIndex =
+ PartSet_Tools::findAttributeBy2dPoint(theObject, aTDSShape, mySketchMgr->activeSketch());
+ return anAttrAndIndex.first;
}
return anAttribute;
}
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());
+}