#include <XGUI_ModuleConnector.h>
#include <XGUI_OperationMgr.h>
#include <XGUI_PropertyPanel.h>
+#include <XGUI_ErrorMgr.h>
#include <QToolButton>
ModuleBase_Operation* anOperation = myWorkshop->currentOperation();
if (anOperation) {
ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel();
- ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
- if (myIsInternalEditOperation && (!anActiveWidget || !anActiveWidget->isViewerSelector()))
- aWidget = myInternalActiveWidget;
+ if (aPanel) { // check for case when the operation is started but property panel is not filled
+ ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
+ if (myIsInternalEditOperation && (!anActiveWidget || !anActiveWidget->isViewerSelector()))
+ aWidget = myInternalActiveWidget;
+ }
}
return aWidget;
}
//workshop()->operationMgr()->updateApplyOfOperations();
beforeStopInternalEdit();
myIsInternalEditOperation = false;
+ updateAcceptAllAction();
}
}
}
if (!isActiveMgr())
return;
+ if (myPreviousFeature.get() && myRestartingMode == RM_LastFeatureUsed) {
+ ModuleBase_OperationFeature* aCurrentOperation = dynamic_cast<ModuleBase_OperationFeature*>(
+ myWorkshop->currentOperation());
+ CompositeFeaturePtr aSketch = module()->sketchMgr()->activeSketch();
+ copyReetntrantAttributes(myPreviousFeature, aCurrentOperation->feature(), aSketch);
+ }
resetFlags();
}
resetFlags();
}
-bool PartSet_SketcherReetntrantMgr::processMouseMoved(ModuleBase_IViewWindow* /* theWnd*/,
- QMouseEvent* /* theEvent*/)
+bool PartSet_SketcherReetntrantMgr::processMouseMoved(ModuleBase_IViewWindow* theWnd,
+ QMouseEvent* theEvent)
{
bool aProcessed = false;
if (!isActiveMgr())
if (aLastFeature) {
ModuleBase_ModelWidget* anActiveWidget = module()->activeWidget();
ModuleBase_IPropertyPanel* aPanel = myWorkshop->currentOperation()->propertyPanel();
- bool aWidgetIsFilled = false;
- //bool aCanBeActivatedByMove = false;
FeaturePtr aCurrentFeature = aFOperation->feature();
bool isLineFeature = false, isArcFeature = false;
- if (aCurrentFeature->getKind() == SketchPlugin_Line::ID())
- isLineFeature = anActiveWidget->attributeID() == SketchPlugin_Line::START_ID();
- else if (isTangentArc(aFOperation))
- isArcFeature = anActiveWidget->attributeID() == SketchPlugin_Arc::TANGENT_POINT_ID();
-
+ std::string anAttributeOnStart;
+ if (aCurrentFeature->getKind() == SketchPlugin_Line::ID()) {
+ anAttributeOnStart = SketchPlugin_Line::START_ID();
+ isLineFeature = anActiveWidget->attributeID() == anAttributeOnStart;
+ }
+ else if (isTangentArc(aFOperation, module()->sketchMgr()->activeSketch())) {
+ anAttributeOnStart = SketchPlugin_Arc::TANGENT_POINT_ID();
+ isArcFeature = anActiveWidget->attributeID() == anAttributeOnStart;
+ }
bool aCanBeActivatedByMove = isLineFeature || isArcFeature;
if (aCanBeActivatedByMove) {
+ myPreviousFeature = aFOperation->feature();
restartOperation();
+ myPreviousFeature = FeaturePtr();
anActiveWidget = module()->activeWidget();
aCurrentFeature = anActiveWidget->feature();
aProcessed = true;
- if (isLineFeature) {
- PartSet_WidgetPoint2D* aPoint2DWdg = dynamic_cast<PartSet_WidgetPoint2D*>(anActiveWidget);
- if (aPoint2DWdg) { // line, start point should be equal last point of the last feature line
- QList<ModuleBase_ViewerPrs> aSelection;
- aSelection.append(ModuleBase_ViewerPrs(aLastFeature, GeomShapePtr(), NULL));
- aWidgetIsFilled = aPoint2DWdg->setSelection(aSelection, true);
- }
- }
- else if (isArcFeature) { // arc, start point should be equal last point of the last feature arc
- if (aCurrentFeature->getKind() == SketchPlugin_Arc::ID()) {
- // get the last point of the previuos arc feature(geom point 2d)
- std::shared_ptr<ModelAPI_Data> aData = aLastFeature->data();
- std::shared_ptr<GeomDataAPI_Point2D> aPointAttr =
- std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
- aData->attribute(SketchPlugin_Arc::END_ID()));
- // get point attribute on the current feature
- AttributeRefAttrPtr aTangentPointAttr = aCurrentFeature->data()->refattr(
- SketchPlugin_Arc::TANGENT_POINT_ID());
- aTangentPointAttr->setAttr(aPointAttr);
- aWidgetIsFilled = true;
- }
+ if (anActiveWidget->attributeID() == anAttributeOnStart) {
+ // it was not deactivated by preselection processing
+ aPanel->activateNextWidget(anActiveWidget);
}
+ } else {
+ // processing mouse move in active widget of restarted operation
+ ModuleBase_ModelWidget* anActiveWidget = module()->activeWidget();
+ PartSet_MouseProcessor* aProcessor = dynamic_cast<PartSet_MouseProcessor*>(anActiveWidget);
+ if (aProcessor)
+ aProcessor->mouseMoved(theWnd, theEvent);
}
- if (aWidgetIsFilled)
- aPanel->activateNextWidget(anActiveWidget);
}
}
return aProcessed;
// in activate() the value of the point is initialized and it can be displayed
// but the default value is [0, 0]. So, we block update viewer contentent until
// onMouseRelease happens, which correct the point position
- ModuleBase_ModelWidget::blockUpdateViewer(true);
+ ModuleBase_Tools::blockUpdateViewer(true);
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (myWorkshop->currentOperation());
+ myPreviousFeature = aFOperation->feature();
restartOperation();
+ myPreviousFeature = FeaturePtr();
aProcessed = true;
// fill the first widget by the mouse event point
PartSet_WidgetPoint2D* aPoint2DWdg = dynamic_cast<PartSet_WidgetPoint2D*>(module()->activeWidget());
ModuleBase_ModelWidget* aFirstWidget = aPanel->findFirstAcceptingValueWidget();
if (aPoint2DWdg && aPoint2DWdg == aFirstWidget) {
- aPoint2DWdg->onMouseRelease(theWnd, theEvent);
+ aPoint2DWdg->mouseReleased(theWnd, theEvent);
}
// unblock viewer update
- ModuleBase_ModelWidget::blockUpdateViewer(false);
+ ModuleBase_Tools::blockUpdateViewer(false);
}
}
if (!myWorkshop->module()->getFeatureError(aFOperation->feature()).isEmpty())
return;
- if (aFOperation && PartSet_SketcherMgr::isNestedSketchOperation(aFOperation)) {
+ if (aFOperation && module()->sketchMgr()->isNestedSketchOperation(aFOperation)) {
bool isStarted = false;
if (!module()->sketchMgr()->sketchSolverError()) {
if (myRestartingMode != RM_Forbided) {
ModuleBase_Operation* anOperation = myWorkshop->currentOperation();
std::string anOperationId = anOperation->id().toStdString();
- if (anOperationId == SketchPlugin_Line::ID() || isTangentArc(anOperation)) {
+ if (anOperationId == SketchPlugin_Line::ID() ||
+ isTangentArc(anOperation, module()->sketchMgr()->activeSketch())) {
/// If last line finished on vertex the lines creation sequence has to be break
ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel();
ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
return !isActiveMgr() || myRestartingMode == RM_None;
}
+bool PartSet_SketcherReetntrantMgr::isInternalEditStarted() const
+{
+ return myIsInternalEditOperation;
+}
+
bool PartSet_SketcherReetntrantMgr::isActiveMgr() const
{
ModuleBase_Operation* aCurrentOperation = myWorkshop->currentOperation();
bool anActive = PartSet_SketcherMgr::isSketchOperation(aCurrentOperation);
if (!anActive) {
- anActive = PartSet_SketcherMgr::isNestedSketchOperation(aCurrentOperation);
+ anActive = module()->sketchMgr()->isNestedSketchOperation(aCurrentOperation);
if (anActive) { // the manager is not active when the current operation is a usual Edit
ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
(myWorkshop->currentOperation());
ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
(myWorkshop->currentOperation());
- if (aFOperation && PartSet_SketcherMgr::isNestedSketchOperation(aFOperation)) {
+ if (aFOperation && module()->sketchMgr()->isNestedSketchOperation(aFOperation)) {
aFOperation->setEditOperation(true/*, false*/);
- workshop()->operationMgr()->updateApplyOfOperations();
-
createInternalFeature();
myIsInternalEditOperation = true;
+ updateAcceptAllAction();
+
isDone = true;
connect(aFOperation, SIGNAL(beforeCommitted()), this, SLOT(onBeforeStopped()));
connect(aFOperation, SIGNAL(beforeAborted()), this, SLOT(onBeforeStopped()));
}
// if there is no the next widget to be automatically activated, the Ok button in property
// panel should accept the focus(example is parallel constraint on sketch lines)
- QToolButton* anOkBtn = aPanel->findChild<QToolButton*>(PROP_PANEL_OK);
+ QToolButton* anOkBtn = dynamic_cast<XGUI_PropertyPanel*>(aPanel)->findButton(PROP_PANEL_OK);
if (anOkBtn)
anOkBtn->setFocus(Qt::TabFocusReason);
}
if (aFOperation) {
myNoMoreWidgetsAttribute = "";
myIsFlagsBlocked = true;
- FeaturePtr aPrevFeature = aFOperation->feature();
- aFOperation->commit();
module()->launchOperation(aFOperation->id());
- // allow the same attribute values in restarted operation
- ModuleBase_OperationFeature* aCurrentOperation = dynamic_cast<ModuleBase_OperationFeature*>(
- myWorkshop->currentOperation());
- copyReetntrantAttributes(aPrevFeature, aCurrentOperation->feature());
-
myIsFlagsBlocked = false;
resetFlags();
// we should avoid processing of the signal about no more widgets attributes and
ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
(myWorkshop->currentOperation());
- if (aFOperation && PartSet_SketcherMgr::isNestedSketchOperation(aFOperation)) {
+ if (aFOperation && module()->sketchMgr()->isNestedSketchOperation(aFOperation)) {
FeaturePtr anOperationFeature = aFOperation->feature();
CompositeFeaturePtr aSketch = module()->sketchMgr()->activeSketch();
myInternalFeature = aSketch->addFeature(anOperationFeature->getKind());
- bool isFeatureChanged = copyReetntrantAttributes(anOperationFeature, myInternalFeature);
+ bool isFeatureChanged = copyReetntrantAttributes(anOperationFeature, myInternalFeature,
+ aSketch, false);
XGUI_PropertyPanel* aPropertyPanel = dynamic_cast<XGUI_PropertyPanel*>
(aFOperation->propertyPanel());
QObjectPtrList anObjects;
anObjects.append(myInternalFeature);
workshop()->deleteFeatures(anObjects);
+ myInternalFeature = FeaturePtr();
}
void PartSet_SketcherReetntrantMgr::resetFlags()
{
if (!myIsFlagsBlocked) {
myIsInternalEditOperation = false;
+ updateAcceptAllAction();
myRestartingMode = RM_None;
}
}
bool PartSet_SketcherReetntrantMgr::copyReetntrantAttributes(const FeaturePtr& theSourceFeature,
- const FeaturePtr& theNewFeature)
+ const FeaturePtr& theNewFeature,
+ const CompositeFeaturePtr& theSketch,
+ const bool isTemporary)
{
bool aChanged = false;
- std::string aTypeAttributeId;
- if (theSourceFeature->getKind() == SketchPlugin_Circle::ID()) {
- aTypeAttributeId = SketchPlugin_Circle::CIRCLE_TYPE();
+ if (!theSourceFeature.get())
+ return aChanged;
+
+ std::string aFeatureKind = theSourceFeature->getKind();
+ if (aFeatureKind == SketchPlugin_Line::ID()) {
+ // Initialize new line with first point equal to end of previous
+ std::shared_ptr<ModelAPI_Data> aSFData = theSourceFeature->data();
+ std::shared_ptr<GeomDataAPI_Point2D> aSPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ aSFData->attribute(SketchPlugin_Line::END_ID()));
+ std::shared_ptr<ModelAPI_Data> aNFData = theNewFeature->data();
+ std::shared_ptr<GeomDataAPI_Point2D> aNPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ aNFData->attribute(SketchPlugin_Line::START_ID()));
+ aNPoint->setValue(aSPoint->x(), aSPoint->y());
+ PartSet_Tools::createConstraint(theSketch, aSPoint, aNPoint);
+
+ aNPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ aSFData->attribute(SketchPlugin_Line::END_ID()));
+ aNPoint->setValue(aSPoint->x(), aSPoint->y());
}
- if (theSourceFeature->getKind() == SketchPlugin_Arc::ID()) {
- aTypeAttributeId = SketchPlugin_Arc::ARC_TYPE();
+ else if (aFeatureKind == SketchPlugin_Circle::ID()) {
+ // set circle type
+ std::string aTypeAttributeId = SketchPlugin_Circle::CIRCLE_TYPE();
+ AttributeStringPtr aSourceFeatureTypeAttr = theSourceFeature->data()->string(aTypeAttributeId);
+ AttributeStringPtr aNewFeatureTypeAttr = theNewFeature->data()->string(aTypeAttributeId);
+ aNewFeatureTypeAttr->setValue(aSourceFeatureTypeAttr->value());
+ //ModuleBase_Tools::flushUpdated(theNewFeature);
+ aChanged = true;
}
- if (!aTypeAttributeId.empty()) {
+ else if (aFeatureKind == SketchPlugin_Arc::ID()) {
+ // set arc type
+ std::string aTypeAttributeId = SketchPlugin_Arc::ARC_TYPE();
AttributeStringPtr aSourceFeatureTypeAttr = theSourceFeature->data()->string(aTypeAttributeId);
AttributeStringPtr aNewFeatureTypeAttr = theNewFeature->data()->string(aTypeAttributeId);
aNewFeatureTypeAttr->setValue(aSourceFeatureTypeAttr->value());
- ModuleBase_ModelWidget::updateObject(theNewFeature);
+
+ // if the arc is tangent, set coincidence to end point of the previous arc
+ std::string anArcType = aSourceFeatureTypeAttr->value();
+ if (anArcType == SketchPlugin_Arc::ARC_TYPE_TANGENT()) {
+ // get the last point of the previuos arc feature(geom point 2d)
+ std::shared_ptr<ModelAPI_Data> aSData = theSourceFeature->data();
+ std::shared_ptr<GeomDataAPI_Point2D> aSPointAttr =
+ std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ aSData->attribute(SketchPlugin_Arc::END_ID()));
+ // get point attribute on the current feature
+ AttributeRefAttrPtr aTangentPointAttr = theNewFeature->data()->refattr(
+ SketchPlugin_Arc::TANGENT_POINT_ID());
+ aTangentPointAttr->setAttr(aSPointAttr);
+
+ std::shared_ptr<GeomDataAPI_Point2D> aNPointAttr =
+ std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ theNewFeature->data()->attribute(SketchPlugin_Arc::END_ID()));
+ aNPointAttr->setValue(aSPointAttr->x(), aSPointAttr->y());
+
+ }
+ //ModuleBase_Tools::flushUpdated(theNewFeature);
aChanged = true;
}
return aChanged;
}
-bool PartSet_SketcherReetntrantMgr::isTangentArc(ModuleBase_Operation* theOperation)
+bool PartSet_SketcherReetntrantMgr::isTangentArc(ModuleBase_Operation* theOperation,
+ const CompositeFeaturePtr& /*theSketch*/) const
{
bool aTangentArc = false;
ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
(theOperation);
- if (aFOperation && PartSet_SketcherMgr::isNestedSketchOperation(aFOperation)) {
+ if (aFOperation && module()->sketchMgr()->isNestedSketchOperation(aFOperation)) {
FeaturePtr aFeature = aFOperation->feature();
if (aFeature.get() && aFeature->getKind() == SketchPlugin_Arc::ID()) {
AttributeStringPtr aTypeAttr = aFeature->data()->string(SketchPlugin_Arc::ARC_TYPE());
return aTangentArc;
}
+void PartSet_SketcherReetntrantMgr::updateAcceptAllAction()
+{
+ CompositeFeaturePtr aSketch = module()->sketchMgr()->activeSketch();
+ if (aSketch.get())
+ workshop()->errorMgr()->updateAcceptAllAction(aSketch);
+}
+
XGUI_Workshop* PartSet_SketcherReetntrantMgr::workshop() const
{
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myWorkshop);