#include "PartSet_WidgetPoint2d.h"
#include <PartSet_Tools.h>
+#include <PartSet_Module.h>
+#include <PartSet_LockApplyMgr.h>
-#include <XGUI_Workshop.h>
-#include <XGUI_ViewerProxy.h>
-#include <XGUI_ModuleConnector.h>
-#include <XGUI_SelectionMgr.h>
-#include <XGUI_Selection.h>
-#include <XGUI_OperationMgr.h>
-
-#include <ModuleBase_DoubleSpinBox.h>
+#include <ModuleBase_ParamSpinBox.h>
#include <ModuleBase_Tools.h>
+#include <ModuleBase_IViewer.h>
#include <ModuleBase_IViewWindow.h>
+#include <ModuleBase_ISelection.h>
#include <Config_Keywords.h>
#include <Config_WidgetAPI.h>
#include <GeomAPI_Pnt2d.h>
#include <SketchPlugin_Feature.h>
+#include <SketchPlugin_ConstraintCoincidence.h>
#include <QGroupBox>
#include <QGridLayout>
PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent,
- const Config_WidgetAPI* theData,
- const std::string& theParentId)
- : ModuleBase_ModelWidget(theParent, theData, theParentId)
+ ModuleBase_IWorkshop* theWorkshop,
+ const Config_WidgetAPI* theData,
+ const std::string& theParentId)
+ : ModuleBase_ModelWidget(theParent, theData, theParentId), myWorkshop(theWorkshop)
{
+ myLockApplyMgr = new PartSet_LockApplyMgr(theParent, myWorkshop);
+
// the control should accept the focus, so the boolen flag is corrected to be true
myIsObligatory = true;
//myOptionParam = theData->getProperty(PREVIOUS_FEATURE_PARAM);
aLabel->setPixmap(QPixmap(":pictures/x_point.png"));
aGroupLay->addWidget(aLabel, 0, 0);
- myXSpin = new ModuleBase_DoubleSpinBox(myGroupBox);
+ myXSpin = new ModuleBase_ParamSpinBox(myGroupBox);
myXSpin->setMinimum(-DBL_MAX);
myXSpin->setMaximum(DBL_MAX);
myXSpin->setToolTip(tr("X"));
aGroupLay->addWidget(myXSpin, 0, 1);
- connect(myXSpin, SIGNAL(valueChanged(double)), this, SLOT(onValuesChanged()));
+ connect(myXSpin, SIGNAL(valueChanged(const QString&)), this, SLOT(onValuesChanged()));
}
{
QLabel* aLabel = new QLabel(myGroupBox);
aLabel->setPixmap(QPixmap(":pictures/y_point.png"));
aGroupLay->addWidget(aLabel, 1, 0);
- myYSpin = new ModuleBase_DoubleSpinBox(myGroupBox);
+ myYSpin = new ModuleBase_ParamSpinBox(myGroupBox);
myYSpin->setMinimum(-DBL_MAX);
myYSpin->setMaximum(DBL_MAX);
myYSpin->setToolTip(tr("Y"));
aGroupLay->addWidget(myYSpin, 1, 1);
- connect(myYSpin, SIGNAL(valueChanged(double)), this, SLOT(onValuesChanged()));
+ connect(myYSpin, SIGNAL(valueChanged(const QString&)), this, SLOT(onValuesChanged()));
}
QVBoxLayout* aLayout = new QVBoxLayout(this);
ModuleBase_Tools::zeroMargins(aLayout);
setLayout(aLayout);
}
-void PartSet_WidgetPoint2D::reset()
+bool PartSet_WidgetPoint2D::reset()
{
- if (isComputedDefault()) {
- //return;
- if (myFeature->compute(myAttributeID))
- restoreValue();
+ bool aDone = false;
+ if (!isUseReset() || isComputedDefault() || myXSpin->hasVariable() || myYSpin->hasVariable()) {
+ aDone = false;
}
else {
bool isOk;
ModuleBase_Tools::setSpinValue(myXSpin, isOk ? aDefValue : 0.0);
ModuleBase_Tools::setSpinValue(myYSpin, isOk ? aDefValue : 0.0);
storeValueCustom();
+ aDone = true;
}
+ return aDone;
}
PartSet_WidgetPoint2D::~PartSet_WidgetPoint2D()
{
}
-bool PartSet_WidgetPoint2D::setSelection(ModuleBase_ViewerPrs theValue)
+bool PartSet_WidgetPoint2D::setSelection(QList<ModuleBase_ViewerPrs>& theValues,
+ const bool theToValidate)
{
+ if (theValues.empty())
+ return false;
+
+ ModuleBase_ViewerPrs aValue = theValues.takeFirst();
+
Handle(V3d_View) aView = myWorkshop->viewer()->activeView();
bool isDone = false;
- TopoDS_Shape aShape = theValue.shape();
+ TopoDS_Shape aShape = aValue.shape();
double aX, aY;
if (getPoint2d(aView, aShape, aX, aY)) {
isDone = setPoint(aX, aY);
PartSet_WidgetPoint2D* that = (PartSet_WidgetPoint2D*) this;
bool isBlocked = that->blockSignals(true);
bool isImmutable = aPoint->setImmutable(true);
-#ifdef _DEBUG
- std::string _attr_name = myAttributeID;
- double _X = myXSpin->value();
- double _Y = myYSpin->value();
-#endif
- aPoint->setValue(myXSpin->value(), myYSpin->value());
+
+ if (myXSpin->hasVariable() || myYSpin->hasVariable()) {
+ aPoint->setText(myXSpin->text().toStdString(), myYSpin->text().toStdString());
+ } else {
+ aPoint->setValue(myXSpin->value(), myYSpin->value());
+ aPoint->setText("", "");
+ }
// after movement the solver will call the update event: optimization
moveObject(myFeature);
aPoint->setImmutable(isImmutable);
std::shared_ptr<ModelAPI_Data> aData = myFeature->data();
std::shared_ptr<GeomDataAPI_Point2D> aPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
aData->attribute(attributeID()));
-
-#ifdef _DEBUG
- std::string _attr_name = myAttributeID;
- double _X = aPoint->x();
- double _Y = aPoint->y();
-#endif
-
- ModuleBase_Tools::setSpinValue(myXSpin, aPoint->x());
- ModuleBase_Tools::setSpinValue(myYSpin, aPoint->y());
+ QString aTextX = QString::fromStdString(aPoint->textX());
+ QString aTextY = QString::fromStdString(aPoint->textY());
+
+ bool isDouble = false;
+ double aVal = 0;
+ if (aTextX.isEmpty()) {
+ ModuleBase_Tools::setSpinValue(myXSpin, aPoint->x());
+ } else {
+ aVal = aTextX.toDouble(&isDouble);
+ if (isDouble)
+ ModuleBase_Tools::setSpinValue(myXSpin, aVal);
+ else
+ ModuleBase_Tools::setSpinText(myXSpin, aTextX);
+ }
+ if (aTextY.isEmpty()) {
+ ModuleBase_Tools::setSpinValue(myYSpin, aPoint->y());
+ } else {
+ aVal = aTextY.toDouble(&isDouble);
+ if (isDouble)
+ ModuleBase_Tools::setSpinValue(myYSpin, aVal);
+ else
+ ModuleBase_Tools::setSpinText(myYSpin, aTextY);
+ }
+ //if (aTextX.empty() || aTextY.empty()) {
+ // ModuleBase_Tools::setSpinValue(myXSpin, aPoint->x());
+ // ModuleBase_Tools::setSpinValue(myYSpin, aPoint->y());
+ //} else {
+ // ModuleBase_Tools::setSpinText(myXSpin, QString::fromStdString(aTextX));
+ // ModuleBase_Tools::setSpinText(myYSpin, QString::fromStdString(aTextY));
+ //}
return true;
}
void PartSet_WidgetPoint2D::activateCustom()
{
- XGUI_ViewerProxy* aViewer = myWorkshop->viewer();
+ ModuleBase_IViewer* aViewer = myWorkshop->viewer();
connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*)));
connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)),
QIntList aModes;
aModes << TopAbs_VERTEX;
- if (isEditingMode())
- aModes << TopAbs_EDGE;
- myWorkshop->moduleConnector()->activateSubShapesSelection(aModes);
+ aModes << TopAbs_EDGE;
+ myWorkshop->activateSubShapesSelection(aModes);
+
+ myLockApplyMgr->activate();
}
void PartSet_WidgetPoint2D::deactivate()
{
ModuleBase_IViewer* aViewer = myWorkshop->viewer();
- disconnect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
+ disconnect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*)));
disconnect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)),
this, SLOT(onMouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)));
- myWorkshop->moduleConnector()->deactivateSubShapesSelection();
- myWorkshop->operationMgr()->setLockValidating(false);
+
+ myWorkshop->deactivateSubShapesSelection();
+
+ myLockApplyMgr->deactivate();
}
bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView,
return false;
}
+void PartSet_WidgetPoint2D::setConstraintWith(const ObjectPtr& theObject)
+{
+ // Create point-edge coincedence
+ FeaturePtr aFeature = mySketch->addFeature(SketchPlugin_ConstraintCoincidence::ID());
+ std::shared_ptr<ModelAPI_Data> aData = aFeature->data();
+
+ std::shared_ptr<ModelAPI_AttributeRefAttr> aRef1 = std::dynamic_pointer_cast<
+ ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_A()));
+ AttributePtr aThisAttr = feature()->data()->attribute(attributeID());
+ std::shared_ptr<GeomDataAPI_Point2D> aThisPoint =
+ std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aThisAttr);
+ aRef1->setAttr(aThisPoint);
+
+ std::shared_ptr<ModelAPI_AttributeRefAttr> aRef2 = std::dynamic_pointer_cast<
+ ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_B()));
+ aRef2->setObject(theObject);
+
+ aFeature->execute();
+}
void PartSet_WidgetPoint2D::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
{
if (theEvent->button() != Qt::LeftButton)
return;
- XGUI_Selection* aSelection = myWorkshop->selector()->selection();
+ ModuleBase_ISelection* aSelection = myWorkshop->selection();
Handle(V3d_View) aView = theWnd->v3dView();
// TODO: This fragment doesn't work because bug in OCC Viewer. It can be used after fixing.
NCollection_List<TopoDS_Shape> aShapes;
if ((!aSPFeature) && (!aShape.IsNull())) {
ResultPtr aFixedObject = PartSet_Tools::findFixedObjectByExternal(aShape, aObject, mySketch);
if (!aFixedObject.get())
- aFixedObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch);
+ aObject = PartSet_Tools::createFixedObjectByExternal(aShape, aObject, mySketch);
+ setConstraintWith(aObject);
+ emit vertexSelected();
+ emit focusOutWidget(this);
+ return;
}
}
double aX, aY;
if (getPoint2d(aView, aShape, aX, aY)) {
- setPoint(aX, aY);
-
PartSet_Tools::setConstraints(mySketch, feature(), attributeID(),aX, aY);
emit vertexSelected();
emit focusOutWidget(this);
return;
+ } else if (aShape.ShapeType() == TopAbs_EDGE) {
+ setConstraintWith(aObject);
+ emit vertexSelected();
+ emit focusOutWidget(this);
+ return;
}
}
// End of Bug dependent fragment
{
if (isEditingMode())
return;
- myWorkshop->operationMgr()->setLockValidating(true);
- // the Ok button should be disabled in the property panel by moving the mouse point in the viewer
- // this leads that the user does not try to click Ok and it avoids an incorrect situation that the
- // line is moved to the cursor to the Ok button
- myWorkshop->operationMgr()->setApplyEnabled(false);
gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView());
void PartSet_WidgetPoint2D::onValuesChanged()
{
- myWorkshop->operationMgr()->setLockValidating(false);
+ myLockApplyMgr->valuesChanged();
emit valuesChanged();
}