#include "PartSet_Tools.h"
#include "PartSet_WidgetSketchLabel.h"
-#include <ModuleBase_WidgetEditor.h>
-#include <ModuleBase_ModelWidget.h>
-
#include <XGUI_ModuleConnector.h>
#include <XGUI_Displayer.h>
#include <XGUI_Workshop.h>
#include <XGUI_ViewerProxy.h>
#include <XGUI_OperationMgr.h>
+#include <ModuleBase_IPropertyPanel.h>
+#include <ModuleBase_ISelection.h>
#include <ModuleBase_IViewer.h>
#include <ModuleBase_IWorkshop.h>
#include <ModuleBase_IViewWindow.h>
+#include <ModuleBase_ModelWidget.h>
#include <ModuleBase_Operation.h>
#include <ModuleBase_OperationFeature.h>
-#include <ModuleBase_ISelection.h>
-#include <ModuleBase_IPropertyPanel.h>
#include <ModuleBase_Operation.h>
+#include <ModuleBase_WidgetEditor.h>
#include <GeomDataAPI_Point2D.h>
#include <ModelAPI_Events.h>
#include <ModelAPI_Session.h>
+#include <ModelAPI_AttributeString.h>
#include <QMouseEvent>
#include <QApplication>
{
myIsMouseOverViewProcessed = false;
myIsMouseOverWindow = false;
- operationMgr()->onValidateOperation();
+ // 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_MOUSE_OVER_WINDOW_FLAGS
qDebug(QString("onLeaveViewPort: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str());
#endif
if (myIsPopupMenuActive)
return;
+ operationMgr()->onValidateOperation();
+
// 2. if the mouse IS NOT over window, reset the active widget value and hide the presentation
ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(aWorkshop);
void PartSet_SketcherMgr::onBeforeValuesChangedInPropertyPanel()
{
+ myIsResetCurrentValue = false;
+
if (isNestedCreateOperation(getCurrentOperation()))
return;
// it is necessary to save current selection in order to restore it after the values are modifed
return;
// visualize the current operation feature
- myIsResetCurrentValue = false;
+ //myIsResetCurrentValue = false;
operationMgr()->onValidateOperation();
// the feature is to be erased here, but it is correct to call canDisplayObject because
// there can be additional check (e.g. editor widget in distance constraint)
if ((!isSketcher) && (!isEditing))
return;
- // MoveTo in order to highlight current object
- aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView());
-
+ Handle(AIS_InteractiveContext) aContext = aViewer->AISContext();
+ if (!aContext.IsNull()) {
+ // MoveTo in order to highlight current object
+ aContext->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView());
+ }
// Remember highlighted objects for editing
ModuleBase_ISelection* aSelect = aWorkshop->selection();
if (myDragDone) {
//aOp->commit();
myCurrentSelection.clear();
+ /*Handle(AIS_InteractiveContext) aContext = aViewer->AISContext();
+ if (!aContext.IsNull()) {
// Reselect edited object
- /*aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView());
+ aContext->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView());
if (theEvent->modifiers() & Qt::ShiftModifier)
- aViewer->AISContext()->ShiftSelect();
+ aContext->ShiftSelect();
else
- aViewer->AISContext()->Select();
- */
+ aContext->Select();
+ */
}
}
}
}
}
+bool PartSet_SketcherMgr::sketchSolverError()
+{
+ bool anError = false;
+ CompositeFeaturePtr aSketch = activeSketch();
+ if (aSketch.get()) {
+ AttributeStringPtr aAttributeString = aSketch->string(SketchPlugin_Sketch::SOLVER_ERROR());
+ anError = !aAttributeString->value().empty();
+ }
+ return anError;
+}
+
+QString PartSet_SketcherMgr::getFeatureError(const FeaturePtr& theFeature)
+{
+ QString anError = "";
+ if (!theFeature.get() || !theFeature->data()->isValid())
+ return anError;
+
+ CompositeFeaturePtr aSketch = activeSketch();
+ if (aSketch.get() && aSketch == theFeature) {
+ AttributeStringPtr aAttributeString = aSketch->string(SketchPlugin_Sketch::SOLVER_ERROR());
+ anError = aAttributeString->value().c_str();
+ }
+ else if (myIsResetCurrentValue) { // this flag do not allow commit of the current operation
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (getCurrentOperation());
+ if (aFOperation) {
+ FeaturePtr aFeature = aFOperation->feature();
+ if (aFeature.get() && aFeature == theFeature && isNestedCreateOperation(aFOperation)) {
+ QString anAttributeName = "";
+ ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel();
+ ModuleBase_ModelWidget* anActiveWgt = aPanel->activeWidget();
+ if (anActiveWgt) {
+ AttributePtr anAttr = aFeature->attribute(anActiveWgt->attributeID());
+ if (anAttr.get())
+ anAttributeName = anAttr->id().c_str();
+ }
+ anError = "Attribute \"" + anAttributeName + "\" is not initialized.";
+ }
+ }
+ }
+ return anError;
+}
const QStringList& PartSet_SketcherMgr::sketchOperationIdList()
{
aConnector->activateModuleSelectionModes();
}
-void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* /* theOperation*/)
+void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation)
{
myIsMouseOverWindow = false;
myIsConstraintsShown = true;
std::list<ResultPtr>::const_iterator aIt;
Events_Loop* aLoop = Events_Loop::loop();
static Events_ID aDispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (theOperation);
for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
- (*aIt)->setDisplayed(true);
- // this display event is needed because sketch already may have "displayed" state,
- // but not displayed while it is still active (issue 613, abort of existing sketch)
- ModelAPI_EventCreator::get()->sendUpdated(*aIt, aDispEvent);
+ if (!aFOperation->isDisplayedOnStart(*aIt)) {
+ (*aIt)->setDisplayed(true);
+ // this display event is needed because sketch already may have "displayed" state,
+ // but not displayed while it is still active (issue 613, abort of existing sketch)
+ ModelAPI_EventCreator::get()->sendUpdated(*aIt, aDispEvent);
+ }
}
- myCurrentSketch->setDisplayed(true);
+ if (!aFOperation->isDisplayedOnStart(myCurrentSketch))
+ myCurrentSketch->setDisplayed(true);
myCurrentSketch = CompositeFeaturePtr();
myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter);
void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation)
{
- if (constraintsIdList().contains(theOperation->id())) {
- // Show constraints if a constraint was created
- onShowConstraintsToggle(true);
- }
connectToPropertyPanel(true);
+ if (isNestedCreateOperation(theOperation))
+ QApplication::setOverrideCursor(QCursor(QIcon(":pictures/button_plus.png").pixmap(20,20)));
}
void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOp)
myIsResetCurrentValue = false;
myIsMouseOverViewProcessed = true;
operationMgr()->onValidateOperation();
+ if (isNestedCreateOperation(theOp))
+ QApplication::restoreOverrideCursor();
}
void PartSet_SketcherMgr::commitNestedSketch(ModuleBase_Operation* theOperation)
isObjectFound = true;
else {
std::list<ResultPtr>::const_iterator anIt = aResults.begin(), aLast = aResults.end();
- for (; anIt != aLast; anIt++) {
+ for (; anIt != aLast && !isObjectFound; anIt++) {
isObjectFound = *anIt == theObject;
}
}
ModuleBase_IViewer* aViewer = theWorkshop->viewer();
Handle(AIS_InteractiveContext) aContext = aViewer->AISContext();
- XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(theWorkshop);
- XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+ if (!aContext.IsNull()) {
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(theWorkshop);
+ XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
- std::list<ResultPtr> aResults = theFeature->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt)
- {
- ResultPtr aResult = *aIt;
- AISObjectPtr aAISObj = aDisplayer->getAISObject(aResult);
- if (aAISObj.get() == NULL)
- continue;
- Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
- for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected())
+ std::list<ResultPtr> aResults = theFeature->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt)
{
- Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
- if (anOwner->Selectable() != anAISIO)
+ ResultPtr aResult = *aIt;
+ AISObjectPtr aAISObj = aDisplayer->getAISObject(aResult);
+ if (aAISObj.get() == NULL)
continue;
- getAttributesOrResults(anOwner, theFeature, theSketch, aResult,
- aSelectedAttributes, aSelectedResults);
- }
- for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) {
- Handle(SelectMgr_EntityOwner) anOwner = aContext->DetectedOwner();
- if (anOwner.IsNull())
- continue;
- if (anOwner->Selectable() != anAISIO)
- continue;
- getAttributesOrResults(anOwner, theFeature, theSketch, aResult,
- aSelectedAttributes, aSelectedResults);
+ Handle(AIS_InteractiveObject) anAISIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
+ for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected())
+ {
+ Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
+ if (anOwner->Selectable() != anAISIO)
+ continue;
+ getAttributesOrResults(anOwner, theFeature, theSketch, aResult,
+ aSelectedAttributes, aSelectedResults);
+ }
+ for (aContext->InitDetected(); aContext->MoreDetected(); aContext->NextDetected()) {
+ Handle(SelectMgr_EntityOwner) anOwner = aContext->DetectedOwner();
+ if (anOwner.IsNull())
+ continue;
+ if (anOwner->Selectable() != anAISIO)
+ continue;
+ getAttributesOrResults(anOwner, theFeature, theSketch, aResult,
+ aSelectedAttributes, aSelectedResults);
+ }
}
}
theSelection[theFeature] = std::make_pair(aSelectedAttributes, aSelectedResults);
const FeaturePtr& theSketch,
ModuleBase_IWorkshop* theWorkshop,
const FeatureToSelectionMap& theSelection,
- SelectMgr_IndexedMapOfOwner& anOwnersToSelect)
+ SelectMgr_IndexedMapOfOwner& theOwnersToSelect)
{
if (theFeature.get() == NULL)
return;
std::set<ResultPtr> aSelectedResults = anIt.value().second;
ModuleBase_IViewer* aViewer = theWorkshop->viewer();
- Handle(AIS_InteractiveContext) aContext = aViewer->AISContext();
+
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(theWorkshop);
XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
for (Standard_Integer i = 1, n = aSelectedOwners.Extent(); i <= n; i++) {
Handle(SelectMgr_EntityOwner) anOwner = aSelectedOwners(i);
if (!anOwner.IsNull())
- anOwnersToSelect.Add(anOwner);
+ theOwnersToSelect.Add(anOwner);
}
}
AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(theFeature, aShape, theSketch);
if (aPntAttr.get() != NULL &&
aSelectedAttributes.find(aPntAttr) != aSelectedAttributes.end()) {
- anOwnersToSelect.Add(anOwner);
+ theOwnersToSelect.Add(anOwner);
}
}
else if (aShapeType == TopAbs_EDGE) {
bool aFound = aSelectedResults.find(aResult) != aSelectedResults.end();
if (aSelectedResults.find(aResult) != aSelectedResults.end() &&
- anOwnersToSelect.FindIndex(anOwner) <= 0)
- anOwnersToSelect.Add(anOwner);
+ theOwnersToSelect.FindIndex(anOwner) <= 0)
+ theOwnersToSelect.Add(anOwner);
}
}
}