From: vsv Date: Tue, 24 Jun 2014 08:48:36 +0000 (+0400) Subject: Merge branch 'master' of newgeom:newgeom X-Git-Tag: V_0.4.4~263^2 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=d7e03da669a038a5a47ce8c8d878d8c81cf3faa5;p=modules%2Fshaper.git Merge branch 'master' of newgeom:newgeom Conflicts: src/ModuleBase/ModuleBase_WidgetFactory.cpp --- d7e03da669a038a5a47ce8c8d878d8c81cf3faa5 diff --cc src/Config/Config_Keywords.h index 050a947fe,0d16ad432..c9d705d55 --- a/src/Config/Config_Keywords.h +++ b/src/Config/Config_Keywords.h @@@ -31,8 -31,9 +31,10 @@@ const static char* WDG_SELECTOR = "sele //Specific widget containers const static char* WDG_POINT_SELECTOR = "point_selector"; +const static char* WDG_POINT2D_DISTANCE = "point2ddistance"; + const static char* WDG_FEATURE_SELECTOR = "feature_selector"; + const static char* _ID = "id"; //const static char* WORKBENCH_ID = "id"; //const static char* GROUP_ID = "id"; diff --cc src/ModuleBase/ModuleBase_WidgetFactory.cpp index 89b82bef4,1c372fd67..4ce4f79aa --- a/src/ModuleBase/ModuleBase_WidgetFactory.cpp +++ b/src/ModuleBase/ModuleBase_WidgetFactory.cpp @@@ -120,10 -120,11 +121,14 @@@ QWidget* ModuleBase_WidgetFactory::crea } else if (theType == WDG_POINT_SELECTOR) { result = pointSelectorControl(theParent); + } else if (theType == WDG_FEATURE_SELECTOR) { + result = featureSelectorControl(theParent); + + } else if (theType == WDG_POINT2D_DISTANCE) { + result = point2dDistanceControl(theParent); + - } else if (myWidgetApi->isContainerWidget() || myWidgetApi->isPagedWidget()) { + } + else if (myWidgetApi->isContainerWidget() || myWidgetApi->isPagedWidget()) { result = createContainer(theType, theParent); } #ifdef _DEBUG diff --cc src/ModuleBase/ModuleBase_WidgetPoint2dDistance.cpp index 53ebdea46,000000000..7597fe126 mode 100644,000000..100644 --- a/src/ModuleBase/ModuleBase_WidgetPoint2dDistance.cpp +++ b/src/ModuleBase/ModuleBase_WidgetPoint2dDistance.cpp @@@ -1,37 -1,0 +1,37 @@@ +// File: ModuleBase_WidgetPoint2dDistance.h +// Created: 23 June 2014 +// Author: Vitaly Smetannikov + +#include "ModuleBase_WidgetPoint2dDistance.h" + +#include +#include +#include + +#include +#include + +#include + +ModuleBase_WidgetPoint2dDistance::ModuleBase_WidgetPoint2dDistance(QWidget* theParent, const Config_WidgetAPI* theData) + : ModuleBase_WidgetDoubleValue(theParent, theData) +{ + myFirstPntName = theData->getProperty("first_point"); +} + +ModuleBase_WidgetPoint2dDistance::~ModuleBase_WidgetPoint2dDistance() +{ +} + +void ModuleBase_WidgetPoint2dDistance::setPoint(FeaturePtr theFeature, const boost::shared_ptr& thePnt) +{ + boost::shared_ptr aData = theFeature->data(); + boost::shared_ptr aPoint = boost::dynamic_pointer_cast + (aData->attribute(myFirstPntName)); + double aRadius = thePnt->distance(aPoint->pnt()); + AttributeDoublePtr aReal = aData->real(attributeID()); - if (aReal && aReal->value() != mySpinBox->value()) { ++ if (aReal && (aReal->value() != aRadius)) { + aReal->setValue(aRadius); + mySpinBox->setValue(aRadius); + } +} diff --cc src/PartSet/PartSet_OperationFeatureCreate.cpp index 000000000,a318a1280..afc823140 mode 000000,100644..100644 --- a/src/PartSet/PartSet_OperationFeatureCreate.cpp +++ b/src/PartSet/PartSet_OperationFeatureCreate.cpp @@@ -1,0 -1,319 +1,327 @@@ + // File: PartSet_OperationFeatureCreate.h + // Created: 20 Apr 2014 + // Author: Natalia ERMOLAEVA + + #include + + #include + #include + #include + #include + #include + #include + + #include + #include + #include + #include + #include + #include + + #include + + #include + #include + #include ++#include + + #include + #include + + #include + #include + #include + #include + + #ifdef _DEBUG + #include + #endif + + #include + + using namespace std; + + PartSet_OperationFeatureCreate::PartSet_OperationFeatureCreate(const QString& theId, + QObject* theParent, + FeaturePtr theFeature) + : PartSet_OperationSketchBase(theId, theParent), mySketch(theFeature), myActiveWidget(0) + { + } + + PartSet_OperationFeatureCreate::~PartSet_OperationFeatureCreate() + { + } + + bool PartSet_OperationFeatureCreate::canProcessKind(const std::string& theId) + { + return theId == SKETCH_LINE_KIND || theId == SKETCH_POINT_KIND /*|| - theId == SKETCH_CONSTRAINT_DISTANCE_KIND/*|| theId == SKETCH_CIRCLE_KIND || ++ theId == SKETCH_CONSTRAINT_DISTANCE_KIND*/ || theId == SKETCH_CIRCLE_KIND /*|| + theId == SKETCH_ARC_KIND*/; + } + + bool PartSet_OperationFeatureCreate::canBeCommitted() const + { + return !myActiveWidget; + } + + bool PartSet_OperationFeatureCreate::isGranted(ModuleBase_IOperation* theOperation) const + { + return theOperation->getDescription()->operationId().toStdString() == PartSet_OperationSketch::Type(); + } + + std::list PartSet_OperationFeatureCreate::getSelectionModes(FeaturePtr theFeature) const + { + std::list aModes; + if (theFeature != feature()) + aModes = PartSet_OperationSketchBase::getSelectionModes(theFeature); + return aModes; + } + + void PartSet_OperationFeatureCreate::init(FeaturePtr theFeature, + const std::list& /*theSelected*/, + const std::list& /*theHighlighted*/) + { + if (!theFeature || theFeature->getKind() != SKETCH_LINE_KIND) + return; + myInitFeature = theFeature; + } + + FeaturePtr PartSet_OperationFeatureCreate::sketch() const + { + return mySketch; + } + + void PartSet_OperationFeatureCreate::mouseReleased(QMouseEvent* theEvent, Handle(V3d_View) theView, + const std::list& theSelected, + const std::list& /*theHighlighted*/) + { + if (canBeCommitted()) + { + // if the point creation is finished, the next mouse release should commit the modification + // the next release can happens by double click in the viewer + commit(); + restartOperation(feature()->getKind(), feature()); + return; + } + + double aX, anY; + + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView); + if (theSelected.empty()) { + PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); + } + else { + XGUI_ViewerPrs aPrs = theSelected.front(); + const TopoDS_Shape& aShape = aPrs.shape(); + if (!aShape.IsNull()) // the point is selected + { + if (aShape.ShapeType() == TopAbs_VERTEX) { + const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape); + if (!aVertex.IsNull()) { + aPoint = BRep_Tool::Pnt(aVertex); + PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); + + PartSet_Tools::setConstraints(sketch(), feature(), myActiveWidget->attributeID(), + aX, anY); + } + } + else if (aShape.ShapeType() == TopAbs_EDGE) // the line is selected + { + PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); + // move to selected line + if (feature()->getKind() == SKETCH_LINE_KIND) { + //boost::shared_ptr aLinePrs = + // boost::dynamic_pointer_cast(myFeaturePrs); + //if (aLinePrs) { + // FeaturePtr aFeature = aPrs.feature(); + //aLinePrs->projectPointOnLine(aFeature, myPointSelectionMode, aPoint, theView, aX, anY); + //} + } + } + } + } + /*if (feature()->getKind() == SKETCH_ARC_KIND) { + boost::shared_ptr anArcPrs = + boost::dynamic_pointer_cast(myFeaturePrs); + if (anArcPrs) { + anArcPrs->projectPointOnFeature(feature(), sketch(), aPoint, theView, aX, anY); + } + }*/ + bool isApplyed = false; + if (isPointWidget()) + isApplyed = setWidgetPoint(aX, anY); + else { + if (!theSelected.empty()) { + XGUI_ViewerPrs aPrs = theSelected.front(); + FeaturePtr aFeature = aPrs.feature(); + if (aFeature) + isApplyed = setWidgetFeature(aFeature); + } + } + flushUpdated(); + emit activateNextWidget(myActiveWidget); + } + + void PartSet_OperationFeatureCreate::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView) + { + if (canBeCommitted()) { + commit(); + restartOperation(feature()->getKind(), feature()); + } + else { + double aX, anY; + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView); + PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); + /*if (myPointSelectionMode == SM_ThirdPoint) { + if (feature()->getKind() == SKETCH_ARC_KIND) { + boost::shared_ptr anArcPrs = + boost::dynamic_pointer_cast(myFeaturePrs); + if (anArcPrs) { + anArcPrs->projectPointOnFeature(feature(), sketch(), aPoint, theView, aX, anY); + } + } + }*/ + setWidgetPoint(aX, anY); + flushUpdated(); + } + } + + void PartSet_OperationFeatureCreate::keyReleased(std::string theName, QKeyEvent* theEvent) + { + int aKeyType = theEvent->key(); + // the second point should be activated by any modification in the property panel + if (!theName.empty()) + { + //setPointSelectionMode(myFeaturePrs->getNextMode(theName), false); + } + keyReleased(theEvent->key()); + } + + void PartSet_OperationFeatureCreate::onWidgetActivated(ModuleBase_ModelWidget* theWidget) + { + myActiveWidget = theWidget; + + if (myInitFeature && myActiveWidget) { + // TODO: to be realized in the custom point selector. The last point values of the init feature + // should be to to the start point of a new feature + //myActiveWidget->init(myInitFeature); + //PartSet_FeatureLinePrs::setFeature(myInitFeature, SM_FirstPoint); + myInitFeature = FeaturePtr(); + emit activateNextWidget(myActiveWidget); + } + } + + void PartSet_OperationFeatureCreate::keyReleased(const int theKey) + { + switch (theKey) { + case Qt::Key_Return: { + if (canBeCommitted()) + { + commit(); + // it start a new line creation at a free point + restartOperation(feature()->getKind(), FeaturePtr()); + } + } + break; + case Qt::Key_Escape: { + if (canBeCommitted()) + { + commit(); + } + else + { + abort(); + } + } + default: + break; + } + } + + void PartSet_OperationFeatureCreate::startOperation() + { + PartSet_OperationSketchBase::startOperation(); + //setPointSelectionMode(!myInitFeature ? SM_FirstPoint : SM_SecondPoint); + + emit multiSelectionEnabled(false); + } + + void PartSet_OperationFeatureCreate::abortOperation() + { + emit featureConstructed(feature(), FM_Hide); + PartSet_OperationSketchBase::abortOperation(); + } + + void PartSet_OperationFeatureCreate::stopOperation() + { + PartSet_OperationSketchBase::stopOperation(); + emit multiSelectionEnabled(true); + } + + void PartSet_OperationFeatureCreate::afterCommitOperation() + { + PartSet_OperationSketchBase::afterCommitOperation(); + emit featureConstructed(feature(), FM_Deactivation); + } + + FeaturePtr PartSet_OperationFeatureCreate::createFeature(const bool theFlushMessage) + { + FeaturePtr aNewFeature = ModuleBase_Operation::createFeature(false); + if (sketch()) { + boost::shared_ptr aFeature = + boost::dynamic_pointer_cast(sketch()); + + aFeature->addSub(aNewFeature); + } + //myFeaturePrs->init(aNewFeature); + //myFeaturePrs->setFeature(myInitFeature, SM_FirstPoint); + + emit featureConstructed(aNewFeature, FM_Activation); + if (theFlushMessage) + flushCreated(); + return aNewFeature; + } + + /*void PartSet_OperationFeatureCreate::setPointSelectionMode(const PartSet_SelectionMode& theMode, + const bool isToEmitSignal) + { + myPointSelectionMode = theMode; + if (isToEmitSignal) { + std::string aName = myFeaturePrs->getAttribute(theMode); + if (aName.empty() && theMode == SM_DonePoint) { + aName = XGUI::PROP_PANEL_OK; + } + emit focusActivated(aName); + } + }*/ + + bool PartSet_OperationFeatureCreate::isPointWidget() const + { + return dynamic_cast(myActiveWidget); + } + + bool PartSet_OperationFeatureCreate::setWidgetPoint(double theX, double theY) + { ++ boost::shared_ptr aPoint(new GeomAPI_Pnt2d(theX, theY)); + ModuleBase_WidgetPoint2D* aWidget = dynamic_cast(myActiveWidget); - if (!aWidget) - return false; - - aWidget->setPoint(boost::shared_ptr(new GeomAPI_Pnt2d(theX, theY))); - return true; ++ if (aWidget) { ++ aWidget->setPoint(aPoint); ++ return true; ++ } else { ++ ModuleBase_WidgetPoint2dDistance* aWgt = dynamic_cast(myActiveWidget); ++ if (aWgt) { ++ aWgt->setPoint(feature(), aPoint); ++ return true; ++ } ++ } ++ return false; + } + + bool PartSet_OperationFeatureCreate::setWidgetFeature(const FeaturePtr& theFeature) + { + ModuleBase_WidgetFeature* aWidget = dynamic_cast(myActiveWidget); + if (!aWidget) + return false; + + return aWidget->setFeature(theFeature); + }