#include "PartSet_Tools.h"
#include "PartSet_WidgetSketchLabel.h"
#include "PartSet_WidgetEditor.h"
+#include "PartSet_ResultSketchPrs.h"
#include <XGUI_ModuleConnector.h>
#include <XGUI_Displayer.h>
#include <XGUI_PropertyPanel.h>
#include <XGUI_ViewerProxy.h>
#include <XGUI_OperationMgr.h>
+#include <XGUI_Tools.h>
#include <ModuleBase_IPropertyPanel.h>
#include <ModuleBase_ISelection.h>
#include <ModuleBase_OperationFeature.h>
#include <ModuleBase_Operation.h>
#include <ModuleBase_WidgetEditor.h>
+#include <ModuleBase_ViewerPrs.h>
#include <GeomDataAPI_Point2D.h>
#include <SketchPlugin_ConstraintFillet.h>
#include <SketchPlugin_ConstraintMirror.h>
#include <SketchPlugin_ConstraintAngle.h>
+#include <SketchPlugin_ConstraintCollinear.h>
+#include <SketchPlugin_ConstraintMiddle.h>
#include <SketchPlugin_MultiRotation.h>
#include <SketchPlugin_MultiTranslation.h>
+#include <SketchPlugin_IntersectionPoint.h>
#include <SketcherPrs_Tools.h>
//#include <AIS_DimensionSelectionMode.hxx>
#include <AIS_Shape.hxx>
+#include <AIS_Dimension.hxx>
#include <ModelAPI_Events.h>
#include <ModelAPI_Session.h>
#include <QMouseEvent>
#include <QApplication>
#include <QCursor>
+#include <QMessageBox>
//#define DEBUG_DO_NOT_BY_ENTER
//#define DEBUG_CURSOR
/// Returns list of unique objects by sum of objects from List1 and List2
-/*QList<ModuleBase_ViewerPrs> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
- const QList<ModuleBase_ViewerPrs>& theList2)
+/*QList<ModuleBase_ViewerPrsPtr> getSumList(const QList<ModuleBase_ViewerPrsPtr>& theList1,
+ const QList<ModuleBase_ViewerPrsPtr>& theList2)
{
- QList<ModuleBase_ViewerPrs> aRes;
- foreach (ModuleBase_ViewerPrs aPrs, theList1) {
+ QList<ModuleBase_ViewerPrsPtr> aRes;
+ foreach (ModuleBase_ViewerPrsPtr aPrs, theList1) {
if (!aRes.contains(aPrs))
aRes.append(aPrs);
}
- foreach (ModuleBase_ViewerPrs aPrs, theList2) {
+ foreach (ModuleBase_ViewerPrsPtr aPrs, theList2) {
if (!aRes.contains(aPrs))
aRes.append(aPrs);
}
// \param theSketch a sketch to project a vertex shape of a presentation to the plane
// and find the corresponded attribute
// \param theFeatureList an output list of features
-void fillFeatureList(const QList<ModuleBase_ViewerPrs>& theList,
+void fillFeatureList(const QList<ModuleBase_ViewerPrsPtr>& theList,
const FeaturePtr theSketch,
QList<FeaturePtr>& theFeatureList)
{
- QList<ModuleBase_ViewerPrs> aRes;
+ QList<ModuleBase_ViewerPrsPtr> aRes;
- QList<ModuleBase_ViewerPrs>::const_iterator anIt = theList.begin(),
+ QList<ModuleBase_ViewerPrsPtr>::const_iterator anIt = theList.begin(),
aLast = theList.end();
for (; anIt != aLast; anIt++)
{
- ModuleBase_ViewerPrs aPrs = *anIt;
- FeaturePtr aFeature = ModelAPI_Feature::feature(aPrs.object());
+ ModuleBase_ViewerPrsPtr aPrs = *anIt;
+ FeaturePtr aFeature = ModelAPI_Feature::feature(aPrs->object());
if (aFeature.get() && !theFeatureList.contains(aFeature))
theFeatureList.append(aFeature);
}
: QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false),
myIsMouseOverWindow(false),
myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true),
- myIsPopupMenuActive(false), myIsConstraintsShown(true)
+ myIsPopupMenuActive(false)
{
ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
ModuleBase_IViewer* aViewer = anIWorkshop->viewer();
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(anIWorkshop);
XGUI_Workshop* aWorkshop = aConnector->workshop();
connect(aWorkshop, SIGNAL(applicationStarted()), this, SLOT(onApplicationStarted()));
+
+ myIsConstraintsShown[PartSet_Tools::Geometrical] = true;
+ myIsConstraintsShown[PartSet_Tools::Dimensional] = true;
+ myIsConstraintsShown[PartSet_Tools::Expressions] = false;
}
PartSet_SketcherMgr::~PartSet_SketcherMgr()
{
myIsMouseOverViewProcessed = false;
myIsMouseOverWindow = false;
- // it is important to validate operation here only if sketch entity create operation is active
- // because at this operation we reacts to the mouse leave/enter view port
- //operationMgr()->onValidateOperation();
#ifdef DEBUG_DO_NOT_BY_ENTER
return;
if (myIsPopupMenuActive)
return;
+ // it is important to validate operation here only if sketch entity create operation is active
+ // because at this operation we reacts to the mouse leave/enter view port
operationMgr()->onValidateOperation();
// 2. if the mouse IS NOT over window, reset the active widget value and hide the presentation
void PartSet_SketcherMgr::onAfterValuesChangedInPropertyPanel()
{
if (!isNestedEditOperation(getCurrentOperation()) ||
- myModule->sketchReentranceMgr()->isInternalEditActive())
+ myModule->sketchReentranceMgr()->isInternalEditActive()) {
+ myModule->sketchReentranceMgr()->updateInternalEditActiveState();
return;
+ }
// it is necessary to restore current selection in order to restore it after the values are modified
restoreSelection();
myCurrentSelection.clear();
XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
aDisplayer->enableUpdateViewer(myPreviousUpdateViewerEnabled);
aDisplayer->updateViewer();
+
+
}
void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
myIsDragging = true;
get2dPoint(theWnd, theEvent, myCurrentPoint);
myDragDone = false;
- // TODO: Has to be uncommented when SALOME patch on draw mode become avialable
+
myPreviousDrawModeEnabled = aViewer->enableDrawMode(false);
launchEditing();
if (aFeature.get() != NULL) {
myIsDragging = true;
get2dPoint(theWnd, theEvent, myCurrentPoint);
myDragDone = false;
- // TODO: Has to be uncommented when SALOME patch on draw mode become avialable
+
myPreviousDrawModeEnabled = aViewer->enableDrawMode(false);
+ // this is temporary commented in order to avoid the following wrong case:
+ // Distance constraint is under edition, double click on the digit -> nothing happens
+ // because QApplication::processEvents() calls onMouseDoubleClick, which try to show editor
+ // but as the prev edit is commited an new one is not started, editor is not shown.
// This is necessary in order to finalize previous operation
- QApplication::processEvents();
+ //QApplication::processEvents();
launchEditing();
}
}
}
}
}
- // TODO: Has to be uncommented when SALOME patch on draw mode become avialable
+
aWorkshop->viewer()->enableDrawMode(myPreviousDrawModeEnabled);
- //aWorkshop->viewer()->enableSelection(myPreviousDrawModeEnabled);
myIsDragging = false;
}
// mouse press signal in the viewer(it call Select for AIS context and the dragged objects are
// deselected). This flag should be restored in the slot, processed the mouse release signal.
- // TODO: Has to be commented out when SALOME patch on draw mode become avialable
- //ModuleBase_IViewer* aViewer = myModule->workshop()->viewer();
- //aViewer->enableSelection(false);
-
ModuleBase_Operation* aCurrentOperation = getCurrentOperation();
if (!aCurrentOperation)
return;
aIds << SketchPlugin_Arc::ID().c_str();
aIds << SketchPlugin_Circle::ID().c_str();
aIds << SketchPlugin_ConstraintFillet::ID().c_str();
+ aIds << SketchPlugin_IntersectionPoint::ID().c_str();
+ // TODO
+ // SketchRectangle is a python feature, so its ID is passed just as a string
+ aIds << "SketchRectangle";
aIds.append(constraintsIdList());
}
return aIds;
aIds << SketchPlugin_ConstraintAngle::ID().c_str();
aIds << SketchPlugin_MultiRotation::ID().c_str();
aIds << SketchPlugin_MultiTranslation::ID().c_str();
+ aIds << SketchPlugin_ConstraintCollinear::ID().c_str();
+ aIds << SketchPlugin_ConstraintMiddle::ID().c_str();
}
return aIds;
}
theModes.append(TopAbs_EDGE);
}
+Handle(AIS_InteractiveObject) PartSet_SketcherMgr::createPresentation(const ResultPtr& theResult)
+{
+ Handle(AIS_InteractiveObject) aPrs;
+
+ FeaturePtr aFeature = ModelAPI_Feature::feature(theResult);
+ if (aFeature.get() && aFeature->getKind() == SketchPlugin_Sketch::ID()) {
+ aPrs = new PartSet_ResultSketchPrs(theResult);
+ }
+ return aPrs;
+}
+
bool PartSet_SketcherMgr::isSketchOperation(ModuleBase_Operation* theOperation)
{
return theOperation && theOperation->id().toStdString() == SketchPlugin_Sketch::ID();
bool PartSet_SketcherMgr::isDistanceOperation(ModuleBase_Operation* theOperation)
{
- std::string aId = theOperation ? theOperation->id().toStdString() : "";
+ std::string anId = theOperation ? theOperation->id().toStdString() : "";
+
+ return isDistanceKind(anId);
+}
- return (aId == SketchPlugin_ConstraintLength::ID()) ||
- (aId == SketchPlugin_ConstraintDistance::ID()) ||
- (aId == SketchPlugin_ConstraintRadius::ID()) ||
- (aId == SketchPlugin_ConstraintAngle::ID());
+bool PartSet_SketcherMgr::isDistanceKind(std::string& theKind)
+{
+ return (theKind == SketchPlugin_ConstraintLength::ID()) ||
+ (theKind == SketchPlugin_ConstraintDistance::ID()) ||
+ (theKind == SketchPlugin_ConstraintRadius::ID()) ||
+ (theKind == SketchPlugin_ConstraintAngle::ID());
}
void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
aFeature->setDisplayed(true);
}
+ if(myCirclePointFilter.IsNull()) {
+ myCirclePointFilter = new PartSet_CirclePointFilter(myModule->workshop());
+ }
+
+ myModule->workshop()->viewer()->addSelectionFilter(myCirclePointFilter);
+
if (myPlaneFilter.IsNull())
myPlaneFilter = new ModuleBase_ShapeInPlaneFilter();
myModule->workshop()->viewer()->addSelectionFilter(myPlaneFilter);
-
bool aHasPlane = false;
std::shared_ptr<GeomAPI_Pln> aPln;
- if (aFOperation->isEditOperation()) {
- // If it is editing of sketch then it means that plane is already defined
- aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
- if (aPln.get())
- aHasPlane = true;
- }
+ aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
myPlaneFilter->setPlane(aPln);
Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
- // all sketch objects should be activated in the sketch selection modes by edit operation start
- // in case of creation operation, there is an active widget, which activates own selection mode
- if (aFOperation->isEditOperation() && aHasPlane)
+ // all displayed objects should be activated in current selection modes according to switched
+ // plane filter
+ if (aPln.get())
aConnector->activateModuleSelectionModes();
}
void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation)
{
myIsMouseOverWindow = false;
- myIsConstraintsShown = true;
+ myIsConstraintsShown[PartSet_Tools::Geometrical] = true;
+ myIsConstraintsShown[PartSet_Tools::Dimensional] = true;
+ myIsConstraintsShown[PartSet_Tools::Expressions] = false;
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
// The sketch was aborted
myCurrentSketch = CompositeFeaturePtr();
+ // TODO: move this outside of if-else
+ myModule->workshop()->viewer()->removeSelectionFilter(myCirclePointFilter);
myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter);
// Erase all sketcher objects
myCurrentSketch->setDisplayed(true);
myCurrentSketch = CompositeFeaturePtr();
+
+ myModule->workshop()->viewer()->removeSelectionFilter(myCirclePointFilter);
myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter);
Events_Loop::loop()->flush(aDispEvent);
}
}
+void PartSet_SketcherMgr::activatePlaneFilter(const bool& toActivate)
+{
+ if (toActivate)
+ myModule->workshop()->viewer()->addSelectionFilter(myPlaneFilter);
+ else
+ myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter);
+}
+
+bool PartSet_SketcherMgr::operationActivatedByPreselection()
+{
+ bool isOperationStopped = false;
+ ModuleBase_Operation* anOperation = getCurrentOperation();
+ if(anOperation && PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) {
+ // Set final definitions if they are necessary
+ //propertyPanelDefined(aOperation);
+ /// Commit sketcher operations automatically
+ /// distance operation are able to show popup editor to modify the distance value
+ /// after entering the value, the operation should be committed/aborted(by Esc key)
+ bool aCanCommitOperation = true;
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (anOperation);
+ if (aFOperation && PartSet_SketcherMgr::isDistanceOperation(aFOperation))
+ aCanCommitOperation = setDistanceValueByPreselection(anOperation, myModule->workshop());
+
+ if (aCanCommitOperation)
+ isOperationStopped = anOperation->commit();
+ else {
+ anOperation->abort();
+ isOperationStopped = true;
+ }
+ }
+ return isOperationStopped;
+}
+
bool PartSet_SketcherMgr::canUndo() const
{
return isNestedCreateOperation(getCurrentOperation());
}
}
}
- if (!isObjectFound)
- return aCanDisplay;
-
- // 4. For created nested feature operation do not display the created feature if
- // the mouse curstor leaves the OCC window.
- // The correction cases, which ignores this condition:
- // a. the property panel values modification
- // b. the popup menu activated
- // c. widget editor control
- #ifndef DEBUG_DO_NOT_BY_ENTER
- if (aCanDisplay && isNestedCreateOperation(getCurrentOperation())) {
- ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
- ModuleBase_WidgetEditor* anEditorWdg = anActiveWidget ? dynamic_cast<ModuleBase_WidgetEditor*>(anActiveWidget) : 0;
- // the active widget editor should not influence here. The presentation should be visible always
- // when this widget is active.
- if (!anEditorWdg && !myIsPopupMenuActive) {
- // during a nested create operation, the feature is redisplayed only if the mouse over view
- // of there was a value modified in the property panel after the mouse left the view
- aCanDisplay = canDisplayCurrentCreatedFeature();
+ if (isObjectFound) {
+ // 4. For created nested feature operation do not display the created feature if
+ // the mouse curstor leaves the OCC window.
+ // The correction cases, which ignores this condition:
+ // a. the property panel values modification
+ // b. the popup menu activated
+ // c. widget editor control
+ #ifndef DEBUG_DO_NOT_BY_ENTER
+ if (aCanDisplay && isNestedCreateOperation(getCurrentOperation())) {
+ ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
+ ModuleBase_WidgetEditor* anEditorWdg = anActiveWidget ? dynamic_cast<ModuleBase_WidgetEditor*>(anActiveWidget) : 0;
+ // the active widget editor should not influence here. The presentation should be visible always
+ // when this widget is active.
+ if (!anEditorWdg && !myIsPopupMenuActive) {
+ // during a nested create operation, the feature is redisplayed only if the mouse over view
+ // of there was a value modified in the property panel after the mouse left the view
+ aCanDisplay = canDisplayCurrentCreatedFeature();
+ }
}
+ #endif
}
- #endif
+
+ // checks the sketcher constraints visibility according to active sketch check box states
+ if (aCanDisplay) {
+ bool aProcessed = false;
+ FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+ if (aFeature.get()) {
+ bool aConstraintDisplayed = canDisplayConstraint(aFeature, PartSet_Tools::Any, aProcessed);
+ if (aProcessed)
+ aCanDisplay = aConstraintDisplayed;
+ }
+ }
+
return aCanDisplay;
}
+bool PartSet_SketcherMgr::canDisplayConstraint(const FeaturePtr& theFeature,
+ const PartSet_Tools::ConstraintVisibleState& theState,
+ bool& isProcessed) const
+{
+ bool aSwitchedOn = true;
+
+ const QStringList& aConstrIds = constraintsIdList();
+
+ std::string aKind = theFeature->getKind();
+ if (aConstrIds.contains(QString(aKind.c_str()))) {
+ bool isTypedConstraint = false;
+
+ switch (theState) {
+ case PartSet_Tools::Dimensional: {
+ bool isDistance = isDistanceKind(aKind);
+ if (isDistance) {
+ isProcessed = true;
+ aSwitchedOn = myIsConstraintsShown[theState];
+ }
+ }
+ break;
+ case PartSet_Tools::Geometrical: {
+ bool isGeometrical = !isDistanceKind(aKind);
+ if (isGeometrical) {
+ isProcessed = true;
+ aSwitchedOn = myIsConstraintsShown[theState];
+ }
+ }
+ break;
+ case PartSet_Tools::Any: {
+ isProcessed = true;
+ bool isDistance = isDistanceKind(aKind);
+ if (isDistance)
+ aSwitchedOn = myIsConstraintsShown[PartSet_Tools::Dimensional];
+ else
+ aSwitchedOn = myIsConstraintsShown[PartSet_Tools::Geometrical];
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return aSwitchedOn;
+}
+
+void PartSet_SketcherMgr::processHiddenObject(const std::list<ObjectPtr>& theObjects)
+{
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (getCurrentOperation());
+ if (aFOperation && myCurrentSketch.get()) {
+ // find results of the current operation
+ // these results should not be proposed to be deleted
+ FeaturePtr anOperationFeature = aFOperation->feature();
+ std::list<ResultPtr> anOperationResultList = anOperationFeature->results();
+ std::set<ResultPtr> anOperationResults;
+ std::list<ResultPtr>::const_iterator aRIt = anOperationResultList.begin(),
+ aRLast = anOperationResultList.end();
+ for (; aRIt != aRLast; aRIt++)
+ anOperationResults.insert(*aRIt);
+
+ std::set<FeaturePtr> anObjectsToBeDeleted;
+ QStringList anObjectsToBeDeletedNames;
+ std::list<ObjectPtr>::const_iterator anIt = theObjects.begin(), aLast = theObjects.end();
+ for (; anIt != aLast; anIt++) {
+ ObjectPtr anObject = *anIt;
+ bool aCanErase = true;
+ // when the sketch operation is active, results of sketch sub-feature can not be hidden
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
+ // the result is found between current feature results
+ if (anOperationResults.find(aResult) != anOperationResults.end())
+ continue;
+
+ if (aResult.get()) {
+ // Display sketcher objects
+ for (int i = 0; i < myCurrentSketch->numberOfSubs() && aCanErase; i++) {
+ FeaturePtr aFeature = myCurrentSketch->subFeature(i);
+ std::list<ResultPtr> aResults = aFeature->results();
+ std::list<ResultPtr>::const_iterator anIt;
+ for (anIt = aResults.begin(); anIt != aResults.end() && aCanErase; ++anIt) {
+ aCanErase = *anIt != aResult;
+ }
+ }
+ }
+ if (!aCanErase) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(anObject);
+ if (aFeature.get() && anObjectsToBeDeleted.find(aFeature) == anObjectsToBeDeleted.end()) {
+ anObjectsToBeDeleted.insert(aFeature);
+ anObjectsToBeDeletedNames.append(aFeature->name().c_str());
+ }
+ }
+ }
+ if (!anObjectsToBeDeleted.empty()) {
+ QString aFeatureNames = anObjectsToBeDeletedNames.join(", ");
+ QString aMessage = tr("The following features have incorrect presentation and \
+will be hidden: %1. Would you like to delete them?")
+ .arg(aFeatureNames);
+ int anAnswer = QMessageBox::question(qApp->activeWindow(), tr("Features hide"),
+ aMessage, QMessageBox::Ok | QMessageBox::Cancel,
+ QMessageBox::Cancel);
+ if (anAnswer == QMessageBox::Ok) {
+ QObjectPtrList anObjects;
+ std::set<FeaturePtr>::const_iterator anIt = anObjectsToBeDeleted.begin(),
+ aLast = anObjectsToBeDeleted.end();
+ for (; anIt != aLast; anIt++)
+ anObjects.append(*anIt);
+ SessionPtr aMgr = ModelAPI_Session::get();
+ DocumentPtr aDoc = aMgr->activeDocument();
+ bool aIsOp = aMgr->isOperation();
+ if (!aIsOp)
+ aMgr->startOperation();
+ workshop()->deleteFeatures(anObjects);
+ //static Events_ID aDeletedEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED);
+ //static Events_ID aRedispEvent = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY);
+ //Events_Loop::loop()->flush(aDeletedEvent);
+ //Events_Loop::loop()->flush(aRedispEvent);
+
+ if (!aIsOp)
+ aMgr->finishOperation();
+ }
+ }
+ }
+}
+
bool PartSet_SketcherMgr::canDisplayCurrentCreatedFeature() const
{
bool aCanDisplay = myIsMouseOverWindow;
myModule->sketchReentranceMgr()->isInternalEditActive();
}
+const QMap<PartSet_Tools::ConstraintVisibleState, bool>& PartSet_SketcherMgr::showConstraintStates()
+{
+ return myIsConstraintsShown;
+}
+
bool PartSet_SketcherMgr::isObjectOfSketch(const ObjectPtr& theObject) const
{
bool isFoundObject = false;
myPlaneFilter->setPlane(thePln);
}
+bool PartSet_SketcherMgr::setDistanceValueByPreselection(ModuleBase_Operation* theOperation,
+ ModuleBase_IWorkshop* theWorkshop)
+{
+ bool isValueAccepted = false;
+
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (theOperation);
+ FeaturePtr aFeature = aFOperation->feature();
+ // editor is shown only if all attribute references are filled by preseletion
+ bool anAllRefAttrInitialized = true;
+
+ std::list<AttributePtr> aRefAttrs = aFeature->data()->attributes(
+ ModelAPI_AttributeRefAttr::typeId());
+ std::list<AttributePtr>::const_iterator anIt = aRefAttrs.begin(), aLast = aRefAttrs.end();
+ for (; anIt != aLast && anAllRefAttrInitialized; anIt++) {
+ anAllRefAttrInitialized = (*anIt)->isInitialized();
+ }
+ if (anAllRefAttrInitialized) {
+ // Activate dimension value editing on double click
+ ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel();
+ QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
+ // Find corresponded widget to activate value editing
+ foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
+ if (aWgt->attributeID() == "ConstraintValue") {
+ // the featue should be displayed in order to find the AIS text position,
+ // the place where the editor will be shown
+ aFeature->setDisplayed(true);
+ /// the execute is necessary to perform in the feature compute for flyout position
+ aFeature->execute();
+
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+
+ PartSet_WidgetEditor* anEditor = dynamic_cast<PartSet_WidgetEditor*>(aWgt);
+ if (anEditor) {
+ int aX = 0, anY = 0;
+
+ XGUI_Workshop* aWorkshop = XGUI_Tools::workshop(theWorkshop);
+ XGUI_Displayer* aDisplayer = aWorkshop->displayer();
+ AISObjectPtr anAIS = aDisplayer->getAISObject(aFeature);
+ Handle(AIS_InteractiveObject) anAISIO;
+ if (anAIS.get() != NULL) {
+ anAISIO = anAIS->impl<Handle(AIS_InteractiveObject)>();
+ }
+ if (anAIS.get() != NULL) {
+ Handle(AIS_InteractiveObject) anAISIO = anAIS->impl<Handle(AIS_InteractiveObject)>();
+
+ if (!anAISIO.IsNull()) {
+ Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(anAISIO);
+ if (!aDim.IsNull()) {
+ gp_Pnt aPosition = aDim->GetTextPosition();
+
+ ModuleBase_IViewer* aViewer = aWorkshop->viewer();
+ Handle(V3d_View) aView = aViewer->activeView();
+ int aCX, aCY;
+ aView->Convert(aPosition.X(), aPosition.Y(), aPosition.Z(), aCX, aCY);
+
+ QWidget* aViewPort = aViewer->activeViewPort();
+ QPoint aGlPoint = aViewPort->mapToGlobal(QPoint(aCX, aCY));
+ aX = aGlPoint.x();
+ anY = aGlPoint.y();
+ }
+ }
+ anEditor->setCursorPosition(aX, anY);
+ isValueAccepted = anEditor->showPopupEditor(false);
+ }
+ }
+ }
+ }
+ }
+ return isValueAccepted;
+}
+
void PartSet_SketcherMgr::getCurrentSelection(const FeaturePtr& theFeature,
const FeaturePtr& theSketch,
ModuleBase_IWorkshop* theWorkshop,
}
}
+void PartSet_SketcherMgr::customizePresentation(const ObjectPtr& theObject)
+{
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (getCurrentOperation());
+ if (aFOperation && (PartSet_SketcherMgr::isSketchOperation(aFOperation) ||
+ PartSet_SketcherMgr::isNestedSketchOperation(aFOperation)))
+ SketcherPrs_Tools::sendExpressionShownEvent(myIsConstraintsShown[PartSet_Tools::Expressions]);
+}
+
ModuleBase_Operation* PartSet_SketcherMgr::getCurrentOperation() const
{
return myModule->workshop()->currentOperation();
void PartSet_SketcherMgr::storeSelection(const bool theHighlightedOnly)
{
+ if (!myCurrentSketch.get())
+ return;
+
ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
ModuleBase_ISelection* aSelect = aWorkshop->selection();
- QList<ModuleBase_ViewerPrs> aHighlighted = aSelect->getHighlighted();
+ QList<ModuleBase_ViewerPrsPtr> aHighlighted = aSelect->getHighlighted();
QList<FeaturePtr> aFeatureList;
if (theHighlightedOnly) {
else {
fillFeatureList(aHighlighted, myCurrentSketch, aFeatureList);
- QList<ModuleBase_ViewerPrs> aSelected = aSelect->getSelected(ModuleBase_ISelection::AllControls);
+ QList<ModuleBase_ViewerPrsPtr> aSelected = aSelect->getSelected(ModuleBase_ISelection::AllControls);
fillFeatureList(aSelected, myCurrentSketch, aFeatureList);
}
void PartSet_SketcherMgr::restoreSelection()
{
+ if (!myCurrentSketch.get())
+ return;
+
//qDebug(QString("restoreSelection: %1").arg(myCurrentSelection.size()).toStdString().c_str());
ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(aWorkshop);
}
}
-void PartSet_SketcherMgr::onShowConstraintsToggle(bool theOn)
+void PartSet_SketcherMgr::onShowConstraintsToggle(int theType, bool theState)
{
- if (myIsConstraintsShown == theOn)
- return;
- if (myCurrentSketch.get() == NULL)
- return;
+ PartSet_Tools::ConstraintVisibleState aType = (PartSet_Tools::ConstraintVisibleState)theType;
- myIsConstraintsShown = theOn;
+ updateBySketchParameters(aType, theState);
+}
- ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
- XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(aWorkshop);
+void PartSet_SketcherMgr::updateBySketchParameters(
+ const PartSet_Tools::ConstraintVisibleState& theType,
+ bool theState)
+{
+ if (myCurrentSketch.get() == NULL)
+ return;
- const QStringList& aConstrIds = constraintsIdList();
- for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
- FeaturePtr aSubFeature = myCurrentSketch->subFeature(i);
- if (aConstrIds.contains(QString(aSubFeature->getKind().c_str()))) {
- if (myIsConstraintsShown)
- aSubFeature->setDisplayed(true);
- else
- aSubFeature->setDisplayed(false);
+ bool aPrevState = myIsConstraintsShown[theType];
+ myIsConstraintsShown[theType] = theState;
+
+ switch (theType) {
+ case PartSet_Tools::Geometrical:
+ case PartSet_Tools::Dimensional: {
+ if (aPrevState != theState) {
+ ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(aWorkshop);
+ for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
+ FeaturePtr aSubFeature = myCurrentSketch->subFeature(i);
+ bool aProcessed = false;
+ bool aConstraintDisplayed = canDisplayConstraint(aSubFeature, theType, aProcessed);
+ if (aProcessed)
+ aSubFeature->setDisplayed(aConstraintDisplayed);
+ }
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+ }
}
+ break;
+ case PartSet_Tools::Expressions: {
+ /// call all sketch features redisplay, the expression state will be corrected in customize
+ /// of distance presentation
+ Events_ID anEventId = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+ PartSet_Tools::sendSubFeaturesEvent(myCurrentSketch, anEventId);
+ }
+ break;
}
- Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
}
-XGUI_OperationMgr* PartSet_SketcherMgr::operationMgr() const
+XGUI_Workshop* PartSet_SketcherMgr::workshop() const
{
ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(anIWorkshop);
- XGUI_Workshop* aWorkshop = aConnector->workshop();
+ return aConnector->workshop();
+}
- return aWorkshop->operationMgr();
+XGUI_OperationMgr* PartSet_SketcherMgr::operationMgr() const
+{
+ return workshop()->operationMgr();
}