MESSAGE(STATUS "FWOS " ${CAS_FWOSPlugin})
FIND_LIBRARY(CAS_PTKernel PTKernel )
-FIND_LIBRARY(CAS_TKAdvTools TKAdvTools )
FIND_LIBRARY(CAS_TKBin TKBin )
FIND_LIBRARY(CAS_TKBinL TKBinL )
FIND_LIBRARY(CAS_TKBinTObj TKBinTObj )
REQUIRED_VARS CAS_INCLUDE_DIRS
CAS_FWOSPlugin
CAS_PTKernel
- CAS_TKAdvTools
CAS_TKBin
CAS_TKBinL
CAS_TKBinTObj
{
//load result
theResultBody->store(theGeomShape);
+ std::string aPrefix = data()->name() + "/";
int aTag(1);
- theResultBody->loadFirstLevel(theGeomShape, aTag);
- theResultBody->loadDisconnectedEdges(theGeomShape, aTag);
- theResultBody->loadDisconnectedVertexes(theGeomShape, aTag);
+ std::string aNameMS = aPrefix + "Shape";
+ theResultBody->loadFirstLevel(theGeomShape, aNameMS, aTag);
+ std::string aNameDE = aPrefix + "DiscEdges";
+ theResultBody->loadDisconnectedEdges(theGeomShape, aNameDE, aTag);
+ std::string aNameDV = aPrefix + "DiscVertexes";
+ theResultBody->loadDisconnectedVertexes(theGeomShape, aNameDV, aTag);
}
LibHandle ExchangePlugin_ImportFeature::loadImportPlugin(const std::string& theFormatName)
GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape();
theFeature->mapOfShapes(*aSubShapes);
-
+ std::string aPrefix = data()->name() + "/";
// Put in DF modified faces
- theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theObject, FACE, _MODIFY_TAG, *aSubShapes);
- theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theTool, FACE, _MODIFY_TAG, *aSubShapes);
+ theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theObject, FACE, _MODIFY_TAG, aPrefix, *aSubShapes);
+ theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theTool, FACE, _MODIFY_TAG, aPrefix, *aSubShapes);
//Put in DF deleted faces
theResultBody->loadDeletedShapes(theFeature->makeShape(), theObject, FACE, _DELETED_TAG);
GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape();
theFeature.mapOfShapes(*aSubShapes);
-
+ std::string aPrefix = data()->name() + "/";
//Insert lateral face : Face from Edge
- theResultBody->loadAndOrientGeneratedShapes(theFeature.makeShape(), theBasis, EDGE,_LATERAL_TAG, *aSubShapes);
+ theResultBody->loadAndOrientGeneratedShapes(theFeature.makeShape(), theBasis, EDGE,_LATERAL_TAG, aPrefix, *aSubShapes);
//Insert bottom face
std::shared_ptr<GeomAPI_Shape> aBottomFace = theFeature.firstShape();
if (!aBottomFace->isNull()) {
if (aSubShapes->isBound(aBottomFace)) {
aBottomFace = aSubShapes->find(aBottomFace);
- }
- theResultBody->generated(aBottomFace, _FIRST_TAG);
+ }
+ theResultBody->generated(aBottomFace, aPrefix, _FIRST_TAG);
}
if (aSubShapes->isBound(aTopFace)) {
aTopFace = aSubShapes->find(aTopFace);
}
- theResultBody->generated(aTopFace, _LAST_TAG);
+ theResultBody->generated(aTopFace, aPrefix, _LAST_TAG);
}
GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape();
theFeature.mapOfShapes(*aSubShapes);
-
+ std::string aPrefix = data()->name() + "/";
// put modifed faces in DF
- theResultBody->loadAndOrientModifiedShapes(theFeature.makeShape(), theSlaveObject, _FACE, _MODIFIEDF_TAG, *aSubShapes);
+ theResultBody->loadAndOrientModifiedShapes(theFeature.makeShape(), theSlaveObject, _FACE, _MODIFIEDF_TAG, aPrefix, *aSubShapes);
}
#include <Model_Data.h>
#include <TNaming_Builder.hxx>
#include <TNaming_NamedShape.hxx>
+#include <TDataStd_Name.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Face.hxx>
if (aShape.IsNull())
return; // null shape inside
- aBuilder.Generated(aShape);
+ aBuilder.Generated(aShape);
}
}
return myBuilders[theTag];
}
+void Model_ResultBody::buildName(const int theTag, const std::string& theName)
+{
+ std::string aName = data()->name() + "/" + theName;
+ TDataStd_Name::Set(builder(theTag)->NamedShape()->Label(),aName.c_str());
+}
void Model_ResultBody::generated(
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag)
{
TopoDS_Shape aShape = theNewShape->impl<TopoDS_Shape>();
builder(theTag)->Generated(aShape);
+ if(!theName.empty())
+ buildName(theTag, theName);
}
void Model_ResultBody::generated(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag)
{
TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
builder(theTag)->Generated(anOldShape, aNewShape);
+ if(!theName.empty())
+ buildName(theTag, theName);
}
void Model_ResultBody::modified(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag)
{
TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
builder(theTag)->Modify(anOldShape, aNewShape);
+ if(!theName.empty())
+ buildName(theTag, theName);
}
void Model_ResultBody::deleted(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
std::shared_ptr<GeomAPI_Shape> theShapeIn,
const int theKindOfShape,
const int theTag,
+ const std::string& theName,
GeomAPI_DataMapOfShapeShape& theSubShapes)
{
TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
TopTools_MapOfShape aView;
+ bool isBuilt = theName.empty();
TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape);
for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
std::shared_ptr<GeomAPI_Shape> aMapShape(theSubShapes.find(*anIt));
aNewShape.Orientation(aMapShape->impl<TopoDS_Shape>().Orientation());
}
- if (!aRoot.IsSame (aNewShape))
+ if (!aRoot.IsSame (aNewShape)) {
builder(theTag)->Modify(aRoot,aNewShape);
+ if(!isBuilt)
+ buildName(theTag, theName);
+ }
}
}
}
std::shared_ptr<GeomAPI_Shape> theShapeIn,
const int theKindOfShape,
const int theTag,
+ const std::string& theName,
GeomAPI_DataMapOfShapeShape& theSubShapes)
{
TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
TopTools_MapOfShape aView;
+ bool isBuilt = theName.empty();
TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape);
for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
std::shared_ptr<GeomAPI_Shape> aMapShape(theSubShapes.find(*anIt));
aNewShape.Orientation(aMapShape->impl<TopoDS_Shape>().Orientation());
}
- if (!aRoot.IsSame (aNewShape))
+ if (!aRoot.IsSame (aNewShape)) {
builder(theTag)->Generated(aRoot,aNewShape);
+ if(!isBuilt)
+ buildName(theTag, theName);
+ }
}
}
}
//=======================================================================
void Model_ResultBody::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
- int& theTag)
+ const std::string& theName, int& theTag)
{
if(theShape->isNull()) return;
TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
+ std::string aName;
if (aShape.ShapeType() == TopAbs_SOLID) {
TopExp_Explorer expl(aShape, TopAbs_FACE);
for (; expl.More(); expl.Next())
- builder(++theTag)->Generated(expl.Current());
+ builder(++theTag)->Generated(expl.Current());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
}
else if (aShape.ShapeType() == TopAbs_SHELL || aShape.ShapeType() == TopAbs_FACE) {
// load faces and all the free edges
TopExp::MapShapes(aShape, TopAbs_FACE, Faces);
if (Faces.Extent() > 1 || (aShape.ShapeType() == TopAbs_SHELL && Faces.Extent() == 1)) {
TopExp_Explorer expl(aShape, TopAbs_FACE);
- for (; expl.More(); expl.Next())
+ for (; expl.More(); expl.Next()) {
builder(++theTag)->Generated(expl.Current());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
+ }
}
TopTools_IndexedDataMapOfShapeListOfShape anEdgeAndNeighbourFaces;
TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, anEdgeAndNeighbourFaces);
{
const TopTools_ListOfShape& aLL = anEdgeAndNeighbourFaces.FindFromIndex(i);
if (aLL.Extent() < 2) {
- builder(++theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i));
+ builder(++theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i));
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
} else {
TopTools_ListIteratorOfListOfShape anIter(aLL);
const TopoDS_Face& aFace = TopoDS::Face(anIter.Value());
anIter.Next();
if(aFace.IsEqual(anIter.Value())) {
builder(++theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i));
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
}
}
}
TopExp_Explorer expl(aShape, TopAbs_VERTEX);
for (; expl.More(); expl.Next()) {
builder(++theTag)->Generated(expl.Current());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
}
} else {
TopExp_Explorer expl(aShape, TopAbs_EDGE);
for (; expl.More(); expl.Next()) {
builder(++theTag)->Generated(expl.Current());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
}
// and load generated vertices.
TopTools_DataMapOfShapeShape generated;
TopExp_Explorer expl(aShape, TopAbs_VERTEX);
for (; expl.More(); expl.Next()) {
builder(++theTag)->Generated(expl.Current());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
}
}
}
//=======================================================================
void Model_ResultBody::loadFirstLevel(
- std::shared_ptr<GeomAPI_Shape> theShape, int& theTag)
+ std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag)
{
- if(theShape->isNull()) return;
- TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
+ if(theShape->isNull()) return;
+ TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
+ std::string aName;
if (aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID) {
TopoDS_Iterator itr(aShape);
for (; itr.More(); itr.Next()) {
- builder(++theTag)->Generated(itr.Value());
+ builder(++theTag)->Generated(itr.Value());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
+ if(!theName.empty()) buildName(theTag, aName);
if (itr.Value().ShapeType() == TopAbs_COMPOUND ||
itr.Value().ShapeType() == TopAbs_COMPSOLID)
{
std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
itrShape->setImpl(new TopoDS_Shape(itr.Value()));
- loadFirstLevel(itrShape, theTag);
+ loadFirstLevel(itrShape, theName, theTag);
} else {
std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
- itrShape->setImpl(new TopoDS_Shape(itr.Value()));
- loadNextLevels(itrShape, theTag);
+ itrShape->setImpl(new TopoDS_Shape(itr.Value()));
+ loadNextLevels(itrShape, theName, theTag);
}
}
} else {
std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
itrShape->setImpl(new TopoDS_Shape(aShape));
- loadNextLevels(itrShape, theTag);
+ loadNextLevels(itrShape, theName, theTag);
}
}
//=======================================================================
void Model_ResultBody::loadDisconnectedEdges(
- std::shared_ptr<GeomAPI_Shape> theShape, int& theTag)
+ std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag)
{
if(theShape->isNull()) return;
TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
TopTools_MapOfShape anEdgesToDelete;
TopExp_Explorer anEx(aShape,TopAbs_EDGE);
+ std::string aName;
for(;anEx.More();anEx.Next()) {
Standard_Boolean aC0 = Standard_False;
TopoDS_Shape anEdge1 = anEx.Current();
if (aLIter1.Value().IsSame(aLIter2.Value())) aMatches++;
if (aMatches == aList1.Extent()) {
aC0=Standard_True;
- builder(++theTag)->Generated(anEdge2);
+ builder(++theTag)->Generated(anEdge2);
anEdgesToDelete.Add(anEdge2);
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
}
}
}
edgeNaborFaces.UnBind(itDelete.Key());
edgeNaborFaces.UnBind(anEdge1);
}
- if (aC0)
- builder(++theTag)->Generated(anEdge1);
+ if (aC0) {
+ builder(++theTag)->Generated(anEdge1);
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
+ }
}
}
-void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag)
+void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag)
{
if(theShape->isNull()) return;
TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
}
}
}
-
+ std::string aName;
TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itr(vertexNaborFaces);
for (; itr.More(); itr.Next()) {
const TopTools_ListOfShape& naborFaces = itr.Value();
- if (naborFaces.Extent() < 3)
- builder(++theTag)->Generated(itr.Key());
+ if (naborFaces.Extent() < 3) {
+ builder(++theTag)->Generated(itr.Key());
+ TCollection_AsciiString aStr(theTag);
+ aName = theName + aStr.ToCString();
+ buildName(theTag, aName);
+ }
}
}
\ No newline at end of file
/// Records the subshape newShape which was generated during a topological construction.
/// As an example, consider the case of a face generated in construction of a box.
MODEL_EXPORT virtual void generated(const std::shared_ptr<GeomAPI_Shape>& theNewShape,
- const int theTag = 1);
+ const std::string& theName, const int theTag = 1);
/// Records the shape newShape which was generated from the shape oldShape during a topological
/// construction. As an example, consider the case of a face generated from an edge in
/// construction of a prism.
MODEL_EXPORT virtual void generated(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1);
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1);
/// Records the shape newShape which is a modification of the shape oldShape.
/// As an example, consider the case of a face split or merged in a Boolean operation.
MODEL_EXPORT virtual void modified(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1);
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1);
/// Records the shape oldShape which was deleted from the current label.
/// As an example, consider the case of a face removed by a Boolean operation.
std::shared_ptr<GeomAPI_Shape> theShapeIn,
const int theKindOfShape,
const int theTag,
+ const std::string& theName,
GeomAPI_DataMapOfShapeShape& theSubShapes);
/// load and orient generated shapes
MODEL_EXPORT virtual void loadAndOrientGeneratedShapes (
std::shared_ptr<GeomAPI_Shape> theShapeIn,
const int theKindOfShape,
const int theTag,
+ const std::string& theName,
GeomAPI_DataMapOfShapeShape& theSubShapes);
/// Loads shapes of the first level (to be used during shape import)
- MODEL_EXPORT virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag);
+ MODEL_EXPORT virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag);
/// Loads disconnected edges
- MODEL_EXPORT virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag);
+ MODEL_EXPORT virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag);
/// Loads disconnected vetexes
- MODEL_EXPORT virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag);
+ MODEL_EXPORT virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag);
/// Removes the stored builders
MODEL_EXPORT virtual ~Model_ResultBody();
private:
/// Loads shapes of the next level (to be used during shape import)
- void loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag);
+ void loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag);
+
+ /// builds name for the shape kept at the specified tag
+ void buildName(const int theTag, const std::string& theName);
friend class Model_Document;
};
/// Records the subshape newShape which was generated during a topological construction.
/// As an example, consider the case of a face generated in construction of a box.
virtual void generated(
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1) = 0;
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1) = 0;
/// Records the shape newShape which was generated from the shape oldShape during a topological
/// construction. As an example, consider the case of a face generated from an edge in
/// construction of a prism.
virtual void generated(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1) = 0;
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1) = 0;
/// Records the shape newShape which is a modification of the shape oldShape.
/// As an example, consider the case of a face split or merged in a Boolean operation.
virtual void modified(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
- const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1) = 0;
+ const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1) = 0;
/// Records the shape oldShape which was deleted from the current label.
/// As an example, consider the case of a face removed by a Boolean operation.
std::shared_ptr<GeomAPI_Shape> theShapeIn,
const int theKindOfShape,
const int theTag,
+ const std::string& theName,
GeomAPI_DataMapOfShapeShape& theSubShapes) = 0;
/// load and orient generated shapes
virtual void loadAndOrientGeneratedShapes (
std::shared_ptr<GeomAPI_Shape> theShapeIn,
const int theKindOfShape,
const int theTag,
+ const std::string& theName,
GeomAPI_DataMapOfShapeShape& theSubShapes) = 0;
/// load shapes of the first level (to be used during shape import)
- virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag) = 0;
+ virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag) = 0;
/// load disconnected edges
- virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag) = 0;
+ virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int& theTag) = 0;
/// load disconnected vetexes
- virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, int& theTag) = 0;
+ virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName,int& theTag) = 0;
protected:
};
/// Remove all selection filters from the viewer
virtual void clearSelectionFilters() = 0;
+ /// Update current viewer
+ virtual void update() = 0;
+
signals:
void lastViewClosed();
void tryCloseView(ModuleBase_IViewWindow* theWnd);
virtual ModuleBase_ISelection* selection() const = 0;
/// Activate sub-shapes selection (opens local context)
- /// Types has to be dined according to TopAbs_ShapeEnum
+ /// Types has to be defined according to TopAbs_ShapeEnum
virtual void activateSubShapesSelection(const QIntList& theTypes) = 0;
/// Deactivate sub-shapes selection (closes local context)
aContext->RemoveFilters();
}
}
+
+//***************************************
+void NewGeom_SalomeViewer::update()
+{
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ if (!aContext.IsNull()) {
+ aContext->UpdateCurrentViewer();
+ }
+}
return mySelector;
}
+ /// Update current viewer
+ virtual void update();
+
+
private slots:
void onMousePress(SUIT_ViewWindow*, QMouseEvent*);
void onMouseRelease(SUIT_ViewWindow*, QMouseEvent*);
PartSet_WidgetPoint2dDistance.h
PartSet_WidgetShapeSelector.h
PartSet_Filters.h
+ PartSet_SketcherMgr.h
)
SET(PROJECT_SOURCES
PartSet_WidgetPoint2dDistance.cpp
PartSet_WidgetShapeSelector.cpp
PartSet_Filters.cpp
+ PartSet_SketcherMgr.cpp
)
SET(PROJECT_RESOURCES
#include <PartSet_WidgetPoint2d.h>
#include <PartSet_WidgetPoint2dDistance.h>
#include <PartSet_WidgetShapeSelector.h>
+#include <PartSet_SketcherMgr.h>
#include <ModuleBase_Operation.h>
#include <ModuleBase_IViewer.h>
#include <XGUI_ModuleConnector.h>
#include <XGUI_Tools.h>
-#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Feature.h>
#include <SketchPlugin_Sketch.h>
-#include <SketchPlugin_Point.h>
-#include <SketchPlugin_Arc.h>
-#include <SketchPlugin_Circle.h>
+#include <SketchPlugin_Line.h>
+//#include <SketchPlugin_Arc.h>
+//#include <SketchPlugin_Circle.h>
#include <SketchPlugin_ConstraintLength.h>
#include <SketchPlugin_ConstraintDistance.h>
#include <SketchPlugin_ConstraintParallel.h>
#include <SketchPlugin_ConstraintPerpendicular.h>
#include <SketchPlugin_ConstraintRadius.h>
-#include <SketchPlugin_ConstraintRigid.h>
+//#include <SketchPlugin_ConstraintRigid.h>
#include <Events_Loop.h>
#include <QDebug>
#endif
-
-/// Returns list of unique objects by sum of objects from List1 and List2
-QList<ObjectPtr> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
- const QList<ModuleBase_ViewerPrs>& theList2)
-{
- QList<ObjectPtr> aRes;
- foreach (ModuleBase_ViewerPrs aPrs, theList1) {
- if (!aRes.contains(aPrs.object()))
- aRes.append(aPrs.object());
- }
- foreach (ModuleBase_ViewerPrs aPrs, theList2) {
- if (!aRes.contains(aPrs.object()))
- aRes.append(aPrs.object());
- }
- return aRes;
-}
-
/*!Create and return new instance of XGUI_Module*/
extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop)
{
PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop)
: ModuleBase_IModule(theWshop),
- myIsDragging(false), myRestartingMode(RM_None), myDragDone(false)
+ myRestartingMode(RM_None)
{
//myWorkshop = dynamic_cast<XGUI_Workshop*>(theWshop);
- ModuleBase_IViewer* aViewer = aViewer = theWshop->viewer();
- connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)),
- this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*)));
-
- connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)),
- this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*)));
-
- connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
- this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*)));
-
- connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)),
- this, SLOT(onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)));
+ mySketchMgr = new PartSet_SketcherMgr(this);
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(theWshop);
XGUI_Workshop* aWorkshop = aConnector->workshop();
connect(anOpMgr, SIGNAL(operationActivatedByPreselection()),
this, SLOT(onOperationActivatedByPreselection()));
+ ModuleBase_IViewer* aViewer = theWshop->viewer();
connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)),
this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*)));
}
{
if (!myDocumentShapeFilter.IsNull())
myDocumentShapeFilter.Nullify();
- if (!myPlaneFilter.IsNull())
- myPlaneFilter.Nullify();
}
void PartSet_Module::registerValidators()
void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation)
{
if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) {
- // Display all sketcher sub-Objects
- myCurrentSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theOperation->feature());
- XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(workshop());
- XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
-
- for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
- FeaturePtr aFeature = myCurrentSketch->subFeature(i);
- std::list<ResultPtr> aResults = aFeature->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
- aDisplayer->display((*aIt), false);
- }
- aDisplayer->display(aFeature);
- }
- // Hide sketcher result
- std::list<ResultPtr> aResults = myCurrentSketch->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
- aDisplayer->erase((*aIt), false);
- }
- aDisplayer->erase(myCurrentSketch);
-
-
- if (myPlaneFilter.IsNull())
- myPlaneFilter = new ModuleBase_ShapeInPlaneFilter();
- myWorkshop->viewer()->addSelectionFilter(myPlaneFilter);
- if (theOperation->isEditOperation()) {
- // If it is editing of sketch then it means that plane is already defined
- std::shared_ptr<GeomAPI_Pln> aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
- myPlaneFilter->setPlane(aPln->impl<gp_Pln>());
- }
+ mySketchMgr->startSketch(theOperation);
}
if (myDocumentShapeFilter.IsNull())
myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop);
void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation)
{
if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) {
- DataPtr aData = myCurrentSketch->data();
- if ((!aData) || (!aData->isValid())) {
- // The sketch was aborted
- myCurrentSketch = CompositeFeaturePtr();
- return;
- }
- // Hide all sketcher sub-Objects
- XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(workshop());
- XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
- for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
- FeaturePtr aFeature = myCurrentSketch->subFeature(i);
- std::list<ResultPtr> aResults = aFeature->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
- aDisplayer->erase((*aIt), false);
- }
- aDisplayer->erase(aFeature, false);
- }
- // Display sketcher result
- std::list<ResultPtr> aResults = myCurrentSketch->results();
- std::list<ResultPtr>::const_iterator aIt;
- for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
- aDisplayer->display((*aIt), false);
- }
- aDisplayer->display(myCurrentSketch);
-
- myCurrentSketch = CompositeFeaturePtr();
- myWorkshop->viewer()->removeSelectionFilter(myPlaneFilter);
+ mySketchMgr->stopSketch(theOperation);
}
myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter);
}
-void PartSet_Module::onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln)
-{
- myPlaneFilter->setPlane(thePln->impl<gp_Pln>());
-}
-
void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation)
{
std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(SketchPlugin_Line::END_ID()));
if (aPoint) {
aPnt2dWgt->setPoint(aPoint->x(), aPoint->y());
- PartSet_Tools::setConstraints(myCurrentSketch, theOperation->feature(),
+ PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), theOperation->feature(),
aWgt->attributeID(), aPoint->x(), aPoint->y());
theOperation->propertyPanel()->activateNextWidget(aPnt2dWgt);
}
// Start editing constraint
if (theOperation->isEditOperation()) {
std::string aId = theOperation->id().toStdString();
- if (sketchOperationIdList().contains(QString(aId.c_str()))) {
+ if (PartSet_SketcherMgr::sketchOperationIdList().contains(QString(aId.c_str()))) {
if ((aId == SketchPlugin_ConstraintRadius::ID()) ||
(aId == SketchPlugin_ConstraintLength::ID()) ||
(aId == SketchPlugin_ConstraintDistance::ID())) {
ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
bool isSketcherOp = false;
// An edit operation is enable only if the current opeation is the sketch operation
- if (aOperation && myCurrentSketch) {
- if (PartSet_Tools::sketchPlane(myCurrentSketch))
+ if (aOperation && mySketchMgr->activeSketch()) {
+ if (PartSet_Tools::sketchPlane(mySketchMgr->activeSketch()))
isSketcherOp = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID());
}
if (!isSketcherOp)
}
}
-void PartSet_Module::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
- if (!(theEvent->buttons() & Qt::LeftButton))
- return;
-
- ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
- // Use only for sketch operations
- if (aOperation && myCurrentSketch) {
- if (!PartSet_Tools::sketchPlane(myCurrentSketch))
- return;
-
- bool isSketcher = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID());
- bool isSketchOpe = sketchOperationIdList().contains(aOperation->id());
-
- // Avoid non-sketch operations
- if ((!isSketchOpe) && (!isSketcher))
- return;
-
- bool isEditing = aOperation->isEditOperation();
-
- // Ignore creation sketch operation
- if ((!isSketcher) && (!isEditing))
- return;
-
- if (theEvent->modifiers()) {
- // If user performs multiselection
- if (isSketchOpe && (!isSketcher))
- if (!aOperation->commit())
- aOperation->abort();
- return;
- }
- // Remember highlighted objects for editing
- ModuleBase_ISelection* aSelect = myWorkshop->selection();
- QList<ModuleBase_ViewerPrs> aHighlighted = aSelect->getHighlighted();
- QList<ModuleBase_ViewerPrs> aSelected = aSelect->getSelected();
- myEditingFeatures.clear();
- myEditingAttr.clear();
- if ((aHighlighted.size() == 0) && (aSelected.size() == 0)) {
- if (isSketchOpe && (!isSketcher))
- // commit previous operation
- if (!aOperation->commit())
- aOperation->abort();
- return;
- }
-
- QObjectPtrList aSelObjects = getSumList(aHighlighted, aSelected);
- if ((aHighlighted.size() == 1) && (aSelected.size() == 0)) {
- // Move by selected shape (vertex). Can be used only for single selection
- foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) {
- FeaturePtr aFeature = ModelAPI_Feature::feature(aHighlighted.first().object());
- if (aFeature) {
- myEditingFeatures.append(aFeature);
- TopoDS_Shape aShape = aPrs.shape();
- if (!aShape.IsNull()) {
- if (aShape.ShapeType() == TopAbs_VERTEX) {
- AttributePtr aAttr = PartSet_Tools::findAttributeBy2dPoint(myEditingFeatures.first(),
- aShape, myCurrentSketch);
- if (aAttr)
- myEditingAttr.append(aAttr);
- }
- }
- }
- }
- } else {
- // Provide multi-selection. Can be used only for features
- foreach (ObjectPtr aObj, aSelObjects) {
- FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
- if (aFeature && (!myEditingFeatures.contains(aFeature)))
- myEditingFeatures.append(aFeature);
- }
-
- }
- // If nothing highlighted - return
- if (myEditingFeatures.size() == 0)
- return;
-
- if (isSketcher) {
- myIsDragging = true;
- get2dPoint(theWnd, theEvent, myCurX, myCurY);
- myDragDone = false;
- myWorkshop->viewer()->enableSelection(false);
- launchEditing();
-
- } else if (isSketchOpe && isEditing) {
- // If selected another object
- aOperation->abort();
-
- myIsDragging = true;
- get2dPoint(theWnd, theEvent, myCurX, myCurY);
- myDragDone = false;
- myWorkshop->viewer()->enableSelection(false);
-
- // This is necessary in order to finalize previous operation
- QApplication::processEvents();
- launchEditing();
- }
- }
-}
-
-
-void PartSet_Module::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent,
- double& theX, double& theY)
-{
- Handle(V3d_View) aView = theWnd->v3dView();
- gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
- PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, theX, theY);
-}
-
-
-void PartSet_Module::launchEditing()
-{
- if (myEditingFeatures.size() > 0) {
- FeaturePtr aFeature = myEditingFeatures.first();
- std::shared_ptr<SketchPlugin_Feature> aSPFeature =
- std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
- if (aSPFeature) {
- editFeature(aSPFeature);
- }
- }
-}
-
-void PartSet_Module::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
- myWorkshop->viewer()->enableSelection(true);
- if (myIsDragging) {
- myIsDragging = false;
- if (myDragDone) {
- myWorkshop->currentOperation()->commit();
- myEditingFeatures.clear();
- myEditingAttr.clear();
- }
- }
-}
-
-
-void PartSet_Module::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
- if (myIsDragging) {
- ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
- if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID())
- return; // No edit operation activated
-
- static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
- Handle(V3d_View) aView = theWnd->v3dView();
- gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
- double aX, aY;
- PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, aX, aY);
- double dX = aX - myCurX;
- double dY = aY - myCurY;
-
- if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) &&
- (myEditingAttr.size() == 1) &&
- myEditingAttr.first()) {
- // probably we have prehighlighted point
- AttributePtr aAttr = myEditingAttr.first();
- std::string aAttrId = aAttr->id();
- ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
- QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
- // Find corresponded widget to provide dragging
- foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
- if (aWgt->attributeID() == aAttrId) {
- PartSet_WidgetPoint2D* aWgt2d = dynamic_cast<PartSet_WidgetPoint2D*>(aWgt);
- if (aWgt2d) {
- aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY);
- break;
- }
- }
- }
- } else {
- foreach(FeaturePtr aFeature, myEditingFeatures) {
- std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
- std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
- if (aSketchFeature) {
- aSketchFeature->move(dX, dY);
- ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent);
- }
- }
// after movement the solver will call the update event: optimization
- Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_MOVED));
- }
- myDragDone = true;
- myCurX = aX;
- myCurY = aY;
- }
-}
-
-void PartSet_Module::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
- ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
- if (aOperation && aOperation->isEditOperation()) {
- std::string aId = aOperation->id().toStdString();
- if ((aId == SketchPlugin_ConstraintLength::ID()) ||
- (aId == SketchPlugin_ConstraintDistance::ID()) ||
- (aId == SketchPlugin_ConstraintRadius::ID()))
- {
- // Activate dimension value editing on double click
- ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
- QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
- // Find corresponded widget to activate value editing
- foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
- if (aWgt->attributeID() == "ConstraintValue") {
- aWgt->focusTo();
- return;
- }
- }
- }
- }
-}
void PartSet_Module::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent)
{
}
}
-QStringList PartSet_Module::sketchOperationIdList() const
-{
- QStringList aIds;
- aIds << SketchPlugin_Line::ID().c_str();
- aIds << SketchPlugin_Point::ID().c_str();
- aIds << SketchPlugin_Arc::ID().c_str();
- aIds << SketchPlugin_Circle::ID().c_str();
- aIds << SketchPlugin_ConstraintLength::ID().c_str();
- aIds << SketchPlugin_ConstraintDistance::ID().c_str();
- aIds << SketchPlugin_ConstraintRigid::ID().c_str();
- aIds << SketchPlugin_ConstraintRadius::ID().c_str();
- aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str();
- aIds << SketchPlugin_ConstraintParallel::ID().c_str();
- return aIds;
-}
-
void PartSet_Module::onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape)
{
ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId);
aWgt->setWorkshop(aWorkshop);
connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr<GeomAPI_Pln>&)),
- this, SLOT(onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>&)));
+ mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>&)));
theModelWidgets.append(aWgt);
return aWgt->getControl();
} else if (theType == "sketch-2dpoint_selector") {
PartSet_WidgetPoint2D* aWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId);
aWgt->setWorkshop(aWorkshop);
- aWgt->setSketch(myCurrentSketch);
+ aWgt->setSketch(mySketchMgr->activeSketch());
connect(aWgt, SIGNAL(vertexSelected(ObjectPtr, const TopoDS_Shape&)),
this, SLOT(onVertexSelected(ObjectPtr, const TopoDS_Shape&)));
} if (theType == "point2ddistance") {
PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId);
aWgt->setWorkshop(aWorkshop);
- aWgt->setSketch(myCurrentSketch);
+ aWgt->setSketch(mySketchMgr->activeSketch());
theModelWidgets.append(aWgt);
return aWgt->getControl();
} if (theType == "sketch_shape_selector") {
PartSet_WidgetShapeSelector* aWgt =
new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId);
- aWgt->setSketcher(myCurrentSketch);
+ aWgt->setSketcher(mySketchMgr->activeSketch());
theModelWidgets.append(aWgt);
return aWgt->getControl();
} if (theType == "sketch_constraint_shape_selector") {
PartSet_WidgetConstraintShapeSelector* aWgt =
new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId);
- aWgt->setSketcher(myCurrentSketch);
+ aWgt->setSketcher(mySketchMgr->activeSketch());
theModelWidgets.append(aWgt);
return aWgt->getControl();
- }else
+ } else
return 0;
}
#define PartSet_Module_H
#include "PartSet.h"
-#include <PartSet_Filters.h>
+#include "PartSet_Filters.h"
+#include "PartSet_SketcherMgr.h"
#include <ModuleBase_IModule.h>
#include <ModuleBase_Definitions.h>
#include <ModelAPI_Attribute.h>
#include <ModelAPI_CompositeFeature.h>
-#include <StdSelect_FaceFilter.hxx>
+//#include <StdSelect_FaceFilter.hxx>
#include <TopoDS_Shape.hxx>
#include <QMap>
/// Call back forlast tuning of property panel before operation performance
virtual void propertyPanelDefined(ModuleBase_Operation* theOperation);
- QStringList sketchOperationIdList() const;
/// Realizes some functionality by an operation start
/// Displays all sketcher sub-Objects, hides sketcher result, appends selection filters
/// SLOT, that is called by mouse press in the viewer.
/// \param theWnd - the window where the event happens
/// \param theEvent the mouse event
- void onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+ //void onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
/// SLOT, that is called by mouse release in the viewer.
/// \param theWnd - the window where the event happens
/// \param theEvent the mouse event
- void onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+ //void onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
/// SLOT, that is called by mouse move in the viewer.
/// \param theWnd - the window where the event happens
/// \param theEvent the mouse event
- void onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+ //void onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
/// SLOT, that is called by mouse double click in the viewer.
/// \param theWnd - the window where the event happens
/// \param theEvent the mouse event
- void onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+ //void onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
/// SLOT, that is called by key release in the viewer.
/// The mouse moved point is sent to the current operation to be processed.
/// It commits the operation of it is can be committed
void onOperationActivatedByPreselection();
- /// Launches the operation from current highlighting
- void launchEditing();
protected:
/// Register validators for this module
private slots:
void onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape);
- void onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
private:
- /// Converts mouse position to 2d coordinates.
- /// Member myCurrentSketch has to be correctly defined
- void get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent,
- double& theX, double& theY);
/// Breaks sequense of automatically resterted operations
void breakOperationSequence();
QString myLastOperationId;
FeaturePtr myLastFeature;
- bool myIsDragging;
- bool myDragDone;
-
// Automatical restarting mode flag
RestartingMode myRestartingMode;
- double myCurX, myCurY;
- CompositeFeaturePtr myCurrentSketch;
- QList<FeaturePtr> myEditingFeatures;
- QList<AttributePtr> myEditingAttr;
-
- Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter;
/// A filter which provides selection within a current document or whole PartSet
Handle(PartSet_GlobalFilter) myDocumentShapeFilter;
+
+ PartSet_SketcherMgr* mySketchMgr;
};
#endif
--- /dev/null
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File: PartSet_SketcherMgr.cpp
+// Created: 19 Dec 2014
+// Author: Vitaly SMETANNIKOV
+
+#include "PartSet_SketcherMgr.h"
+#include "PartSet_Module.h"
+#include "PartSet_WidgetPoint2D.h"
+#include "PartSet_Tools.h"
+
+#include <XGUI_ModuleConnector.h>
+#include <XGUI_Displayer.h>
+#include <XGUI_Workshop.h>
+
+#include <ModuleBase_IViewer.h>
+#include <ModuleBase_IWorkshop.h>
+#include <ModuleBase_IViewWindow.h>
+#include <ModuleBase_Operation.h>
+#include <ModuleBase_ISelection.h>
+#include <ModuleBase_IPropertyPanel.h>
+#include <ModuleBase_Operation.h>
+
+#include <Events_Loop.h>
+
+#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Sketch.h>
+#include <SketchPlugin_Point.h>
+#include <SketchPlugin_Arc.h>
+#include <SketchPlugin_Circle.h>
+#include <SketchPlugin_ConstraintLength.h>
+#include <SketchPlugin_ConstraintDistance.h>
+#include <SketchPlugin_ConstraintParallel.h>
+#include <SketchPlugin_ConstraintPerpendicular.h>
+#include <SketchPlugin_ConstraintRadius.h>
+#include <SketchPlugin_ConstraintRigid.h>
+
+#include <ModelAPI_Events.h>
+
+#include <QMouseEvent>
+#include <QApplication>
+
+
+
+
+/// Returns list of unique objects by sum of objects from List1 and List2
+QList<ObjectPtr> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
+ const QList<ModuleBase_ViewerPrs>& theList2)
+{
+ QList<ObjectPtr> aRes;
+ foreach (ModuleBase_ViewerPrs aPrs, theList1) {
+ if (!aRes.contains(aPrs.object()))
+ aRes.append(aPrs.object());
+ }
+ foreach (ModuleBase_ViewerPrs aPrs, theList2) {
+ if (!aRes.contains(aPrs.object()))
+ aRes.append(aPrs.object());
+ }
+ return aRes;
+}
+
+
+
+
+PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule)
+ : QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false)
+{
+ ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+ ModuleBase_IViewer* aViewer = aWorkshop->viewer();
+
+ connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)),
+ this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*)));
+
+ connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)),
+ this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*)));
+
+ connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
+ this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*)));
+
+ connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)),
+ this, SLOT(onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)));
+}
+
+PartSet_SketcherMgr::~PartSet_SketcherMgr()
+{
+ if (!myPlaneFilter.IsNull())
+ myPlaneFilter.Nullify();
+}
+
+void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+ //
+ if (!(theEvent->buttons() & Qt::LeftButton))
+ return;
+
+ ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+ ModuleBase_Operation* aOperation = aWorkshop->currentOperation();
+ // Use only for sketch operations
+ if (aOperation && myCurrentSketch) {
+ if (!PartSet_Tools::sketchPlane(myCurrentSketch))
+ return;
+
+ bool isSketcher = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID());
+ bool isSketchOpe = sketchOperationIdList().contains(aOperation->id());
+
+ // Avoid non-sketch operations
+ if ((!isSketchOpe) && (!isSketcher))
+ return;
+
+ bool isEditing = aOperation->isEditOperation();
+
+ // Ignore creation sketch operation
+ if ((!isSketcher) && (!isEditing))
+ return;
+
+ if (theEvent->modifiers()) {
+ // If user performs multiselection
+ if (isSketchOpe /* && (!isSketcher)*/)
+ if (!aOperation->commit())
+ aOperation->abort();
+ return;
+ }
+ // Remember highlighted objects for editing
+ ModuleBase_ISelection* aSelect = aWorkshop->selection();
+ QList<ModuleBase_ViewerPrs> aHighlighted = aSelect->getHighlighted();
+ QList<ModuleBase_ViewerPrs> aSelected = aSelect->getSelected();
+ myEditingFeatures.clear();
+ myEditingAttr.clear();
+ if ((aHighlighted.size() == 0) && (aSelected.size() == 0)) {
+ if (isSketchOpe && (!isSketcher))
+ // commit previous operation
+ if (!aOperation->commit())
+ aOperation->abort();
+ return;
+ }
+
+ QObjectPtrList aSelObjects = getSumList(aHighlighted, aSelected);
+ //foreach (ModuleBase_ViewerPrs aPrs, aHighlighted) {
+ // aSelObjects.append(aPrs.object());
+ //}
+
+ if ((aHighlighted.size() == 1) && (aSelected.size() == 0)) {
+ // Move by selected shape (vertex). Can be used only for single selection
+ foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(aHighlighted.first().object());
+ if (aFeature) {
+ myEditingFeatures.append(aFeature);
+ TopoDS_Shape aShape = aPrs.shape();
+ if (!aShape.IsNull()) {
+ if (aShape.ShapeType() == TopAbs_VERTEX) {
+ AttributePtr aAttr = PartSet_Tools::findAttributeBy2dPoint(myEditingFeatures.first(),
+ aShape, myCurrentSketch);
+ if (aAttr)
+ myEditingAttr.append(aAttr);
+ }
+ }
+ }
+ }
+ } else {
+ // Provide multi-selection. Can be used only for features
+ foreach (ObjectPtr aObj, aSelObjects) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
+ if (aFeature && (!myEditingFeatures.contains(aFeature)))
+ myEditingFeatures.append(aFeature);
+ }
+
+ }
+ // If nothing highlighted - return
+ if (myEditingFeatures.size() == 0)
+ return;
+
+ if (isSketcher) {
+ myIsDragging = true;
+ get2dPoint(theWnd, theEvent, myCurX, myCurY);
+ myDragDone = false;
+ aWorkshop->viewer()->enableMultiselection(false);
+ launchEditing();
+
+ } else if (isSketchOpe && isEditing) {
+ // If selected another object
+ aOperation->abort();
+
+ myIsDragging = true;
+ get2dPoint(theWnd, theEvent, myCurX, myCurY);
+ myDragDone = false;
+ aWorkshop->viewer()->enableMultiselection(false);
+
+ // This is necessary in order to finalize previous operation
+ QApplication::processEvents();
+ launchEditing();
+ }
+ }
+}
+
+void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+ ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+ ModuleBase_Operation* aOp = aWorkshop->currentOperation();
+ if (!aOp)
+ return;
+ if (!sketchOperationIdList().contains(aOp->id()))
+ return;
+
+ // Only for sketcher operations
+ ModuleBase_IViewer* aViewer = aWorkshop->viewer();
+ if (myIsDragging) {
+ myIsDragging = false;
+ if (myDragDone) {
+ aViewer->enableMultiselection(true);
+ aOp->commit();
+ myEditingFeatures.clear();
+ myEditingAttr.clear();
+ return;
+ }
+ }
+ if (!aViewer->isMultiSelectionEnabled()) {
+ aViewer->enableMultiselection(true);
+ }
+ aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView());
+ if (theEvent->modifiers() & Qt::ShiftModifier)
+ aViewer->AISContext()->ShiftSelect();
+ else
+ aViewer->AISContext()->Select();
+}
+
+void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+ if (myIsDragging) {
+ ModuleBase_Operation* aOperation = myModule->workshop()->currentOperation();
+ if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID())
+ return; // No edit operation activated
+
+ static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
+ Handle(V3d_View) aView = theWnd->v3dView();
+ gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
+ double aX, aY;
+ PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, aX, aY);
+ double dX = aX - myCurX;
+ double dY = aY - myCurY;
+
+ if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) &&
+ (myEditingAttr.size() == 1) &&
+ myEditingAttr.first()) {
+ // probably we have prehighlighted point
+ AttributePtr aAttr = myEditingAttr.first();
+ std::string aAttrId = aAttr->id();
+ ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
+ QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
+ // Find corresponded widget to provide dragging
+ foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
+ if (aWgt->attributeID() == aAttrId) {
+ PartSet_WidgetPoint2D* aWgt2d = dynamic_cast<PartSet_WidgetPoint2D*>(aWgt);
+ if (aWgt2d) {
+ aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY);
+ break;
+ }
+ }
+ }
+ } else {
+ foreach(FeaturePtr aFeature, myEditingFeatures) {
+ std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
+ if (aSketchFeature) {
+ aSketchFeature->move(dX, dY);
+ ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent);
+ }
+ }
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_MOVED));
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
+ }
+ myDragDone = true;
+ myCurX = aX;
+ myCurY = aY;
+ }
+}
+
+void PartSet_SketcherMgr::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+ ModuleBase_Operation* aOperation = myModule->workshop()->currentOperation();
+ if (aOperation && aOperation->isEditOperation()) {
+ std::string aId = aOperation->id().toStdString();
+ if ((aId == SketchPlugin_ConstraintLength::ID()) ||
+ (aId == SketchPlugin_ConstraintDistance::ID()) ||
+ (aId == SketchPlugin_ConstraintRadius::ID()))
+ {
+ // Activate dimension value editing on double click
+ ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
+ QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
+ // Find corresponded widget to activate value editing
+ foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
+ if (aWgt->attributeID() == "ConstraintValue") {
+ aWgt->focusTo();
+ return;
+ }
+ }
+ }
+ }
+}
+
+void PartSet_SketcherMgr::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent,
+ double& theX, double& theY)
+{
+ Handle(V3d_View) aView = theWnd->v3dView();
+ gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
+ PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, theX, theY);
+}
+
+void PartSet_SketcherMgr::launchEditing()
+{
+ if (myEditingFeatures.size() > 0) {
+ FeaturePtr aFeature = myEditingFeatures.first();
+ std::shared_ptr<SketchPlugin_Feature> aSPFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
+ if (aSPFeature) {
+ myModule->editFeature(aSPFeature);
+ }
+ }
+}
+
+
+QStringList PartSet_SketcherMgr::sketchOperationIdList()
+{
+ static QStringList aIds;
+ if (aIds.size() == 0) {
+ aIds << SketchPlugin_Line::ID().c_str();
+ aIds << SketchPlugin_Point::ID().c_str();
+ aIds << SketchPlugin_Arc::ID().c_str();
+ aIds << SketchPlugin_Circle::ID().c_str();
+ aIds << SketchPlugin_ConstraintLength::ID().c_str();
+ aIds << SketchPlugin_ConstraintDistance::ID().c_str();
+ aIds << SketchPlugin_ConstraintRigid::ID().c_str();
+ aIds << SketchPlugin_ConstraintRadius::ID().c_str();
+ aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str();
+ aIds << SketchPlugin_ConstraintParallel::ID().c_str();
+ }
+ return aIds;
+}
+
+void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
+{
+ // Display all sketcher sub-Objects
+ myCurrentSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theOperation->feature());
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
+ XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+
+ // Hide sketcher result
+ std::list<ResultPtr> aResults = myCurrentSketch->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+ aDisplayer->erase((*aIt), false);
+ }
+ aDisplayer->erase(myCurrentSketch, false);
+
+ // Display sketcher objects
+ for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
+ FeaturePtr aFeature = myCurrentSketch->subFeature(i);
+ std::list<ResultPtr> aResults = aFeature->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+ aDisplayer->display((*aIt), false);
+ }
+ aDisplayer->display(aFeature, false);
+ }
+
+ if (myPlaneFilter.IsNull())
+ myPlaneFilter = new ModuleBase_ShapeInPlaneFilter();
+
+ myModule->workshop()->viewer()->addSelectionFilter(myPlaneFilter);
+ if (theOperation->isEditOperation()) {
+ // If it is editing of sketch then it means that plane is already defined
+ std::shared_ptr<GeomAPI_Pln> aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
+ myPlaneFilter->setPlane(aPln->impl<gp_Pln>());
+ }
+ aDisplayer->updateViewer();
+}
+
+void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation)
+{
+ DataPtr aData = myCurrentSketch->data();
+ if ((!aData) || (!aData->isValid())) {
+ // The sketch was aborted
+ myCurrentSketch = CompositeFeaturePtr();
+ return;
+ }
+ // Hide all sketcher sub-Objects
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
+ XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+ for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
+ FeaturePtr aFeature = myCurrentSketch->subFeature(i);
+ std::list<ResultPtr> aResults = aFeature->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+ aDisplayer->erase((*aIt), false);
+ }
+ aDisplayer->erase(aFeature, false);
+ }
+ // Display sketcher result
+ std::list<ResultPtr> aResults = myCurrentSketch->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+ aDisplayer->display((*aIt), false);
+ }
+ aDisplayer->display(myCurrentSketch);
+
+ myCurrentSketch = CompositeFeaturePtr();
+ myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter);
+ aDisplayer->updateViewer();
+}
+
+
+void PartSet_SketcherMgr::onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln)
+{
+ myPlaneFilter->setPlane(thePln->impl<gp_Pln>());
+}
--- /dev/null
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File: PartSet_SketcherMgr.h
+// Created: 19 Dec 2014
+// Author: Vitaly SMETANNIKOV
+
+#ifndef PartSet_SketcherMgr_H
+#define PartSet_SketcherMgr_H
+
+#include "PartSet.h"
+
+#include <ModelAPI_Feature.h>
+#include <ModelAPI_Attribute.h>
+#include <ModelAPI_CompositeFeature.h>
+
+#include <ModuleBase_ViewerFilters.h>
+
+#include <GeomAPI_Pln.h>
+
+#include <QObject>
+#include <QList>
+
+class PartSet_Module;
+class ModuleBase_IViewWindow;
+class ModuleBase_Operation;
+class QMouseEvent;
+
+
+/**
+* A class for management of sketch operations
+*/
+class PARTSET_EXPORT PartSet_SketcherMgr : public QObject
+{
+ Q_OBJECT
+public:
+ PartSet_SketcherMgr(PartSet_Module* theModule);
+
+ virtual ~PartSet_SketcherMgr();
+
+ static QStringList sketchOperationIdList();
+
+ /// Launches the operation from current highlighting
+ void launchEditing();
+
+ // Returns current Sketch feature/ Returns NULL if there is no launched sketch operation
+ CompositeFeaturePtr activeSketch() const { return myCurrentSketch; }
+
+ /// Starts sketch operation
+ void startSketch(ModuleBase_Operation* theOperation);
+
+ /// Stops sketch operation
+ void stopSketch(ModuleBase_Operation* theOperation);
+
+public slots:
+ void onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
+
+
+private slots:
+ void onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*);
+ void onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*);
+ void onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*);
+ void onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*);
+
+private:
+ /// Converts mouse position to 2d coordinates.
+ /// Member myCurrentSketch has to be correctly defined
+ void get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent,
+ double& theX, double& theY);
+
+
+private:
+ PartSet_Module* myModule;
+
+ bool myIsDragging;
+ bool myDragDone;
+ double myCurX, myCurY;
+
+ CompositeFeaturePtr myCurrentSketch;
+ QList<FeaturePtr> myEditingFeatures;
+ QList<AttributePtr> myEditingAttr;
+
+ Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter;
+};
+
+
+#endif
\ No newline at end of file
#include <Config_PropManager.h>
#include <QLabel>
+#include <QTimer>
#define PLANE_SIZE "200"
#define SKETCH_WIDTH "4"
myTooltip = QString::fromStdString(theData->getProperty("tooltip"));
myLabel->setToolTip("");
myLabel->setIndent(5);
+
+ mySelectionTimer = new QTimer(this);
+ connect(mySelectionTimer, SIGNAL(timeout()), SLOT(setSketchingMode()));
+ mySelectionTimer->setSingleShot(true);
}
PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel()
// Clear selection mode and define sketching mode
XGUI_Displayer* aDisp = myWorkshop->displayer();
aDisp->removeSelectionFilter(myFaceFilter);
- aDisp->closeLocalContexts();
+ //aDisp->closeLocalContexts();
emit planeSelected(plane());
setSketchingMode();
{
std::shared_ptr<GeomAPI_Pln> aPlane = plane();
if (aPlane) {
- setSketchingMode();
+ //setSketchingMode();
+ // In order to avoid Opening/Closing of context too often
+ mySelectionTimer->start(20);
} else {
// We have to select a plane before any operation
showPreviewPlanes();
XGUI_Displayer* aDisp = myWorkshop->displayer();
- aDisp->openLocalContext();
- aDisp->activateObjects(QIntList());
+ //aDisp->openLocalContext();
+ //aDisp->activateObjects(QIntList());
if (myFaceFilter.IsNull())
myFaceFilter = new StdSelect_FaceFilter(StdSelect_Plane);
aDisp->addSelectionFilter(myFaceFilter);
void PartSet_WidgetSketchLabel::deactivate()
{
-
+ // Do not set selection mode if the widget was activated for a small moment
+ mySelectionTimer->stop();
XGUI_Displayer* aDisp = myWorkshop->displayer();
aDisp->removeSelectionFilter(myFaceFilter);
//aDisp->removeSelectionFilter(mySketchFilter);
- aDisp->closeLocalContexts();
+ //aDisp->closeLocalContexts();
erasePreviewPlanes();
}
void PartSet_WidgetSketchLabel::setSketchingMode()
{
+ qDebug("### Set sketching mode");
+
XGUI_Displayer* aDisp = myWorkshop->displayer();
- QIntList aModes;
// Clear standard selection modes if they are defined
- aDisp->activateObjects(aModes);
- aDisp->openLocalContext();
-
- // Set filter
- std::shared_ptr<GeomAPI_Pln> aPlane = plane();
- double aA, aB, aC, aD;
- aPlane->coefficients(aA, aB, aC, aD);
- gp_Pln aPln(aA, aB, aC, aD);
- // No selection of external objects
- //mySketchFilter = new ModuleBase_ShapeInPlaneFilter(aPln);
- //aDisp->addSelectionFilter(mySketchFilter);
+ //aDisp->activateObjects(aModes);
+ //aDisp->openLocalContext();
// Get default selection modes
+ QIntList aModes;
aModes.append(AIS_DSM_Text);
aModes.append(AIS_DSM_Line);
aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_VERTEX));
#include <TopoDS_Shape.hxx>
class QLabel;
+class QTimer;
class XGUI_OperationMgr;
class XGUI_Workshop;
-//class PartSet_OperationSketch;
class PARTSET_EXPORT PartSet_WidgetSketchLabel : public ModuleBase_ModelWidget
{
private slots:
void onPlaneSelected();
+ void setSketchingMode();
private:
AISObjectPtr createPreviewPlane(std::shared_ptr<GeomAPI_Pnt> theOrigin,
void erasePreviewPlanes();
void showPreviewPlanes();
- void setSketchingMode();
QLabel* myLabel;
QString myText;
bool myPreviewDisplayed;
Handle(StdSelect_FaceFilter) myFaceFilter;
- //Handle(ModuleBase_ShapeInPlaneFilter) mySketchFilter;
+
+ QTimer* mySelectionTimer;
};
#endif
#include <SelectMgr_ListOfFilter.hxx>
#include <SelectMgr_ListIteratorOfListOfFilter.hxx>
+#include <TColStd_MapOfTransient.hxx>
+#include <TColStd_MapIteratorOfMapOfTransient.hxx>
+
#include <set>
const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity
XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
- : myUseExternalObjects(false), myWorkshop(theWorkshop)
+ : myWorkshop(theWorkshop)
{
}
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
if (!anAISIO.IsNull()) {
myResult2AISObjectMap[theObject] = theAIS;
+
+ closeLocalContexts(false);
aContext->Display(anAISIO, false);
aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, false);
-
+ // Customization of presentation
FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
if (aFeature.get() != NULL) {
GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast<GeomAPI_ICustomPrs>(aFeature);
if (aCustPrs.get() != NULL)
aCustPrs->customisePresentation(theAIS);
}
- if (aContext->HasOpenedContext()) {
- if (myUseExternalObjects) {
- if (myActiveSelectionModes.size() == 0)
- aContext->Activate(anAISIO);
- else {
- foreach(int aMode, myActiveSelectionModes) {
- aContext->Activate(anAISIO, aMode);
- }
- }
- }
- }
+ openLocalContext();
+ aContext->Load(anAISIO, -1, true);
+ activate(theObject);
+ //if (aContext->HasOpenedContext()) {
+ //if (myUseExternalObjects) {
+ //if (myActiveSelectionModes.size() == 0)
+ // aContext->Activate(anAISIO);
+ //else {
+ // foreach(int aMode, myActiveSelectionModes) {
+ // aContext->Activate(anAISIO, aMode);
+ // }
+ //}
+ //}
+ //}
}
if (isUpdateViewer)
updateViewer();
void XGUI_Displayer::activate(ObjectPtr theFeature)
{
- QIntList aModes;
- activate(theFeature, aModes);
+ activate(theFeature, myActiveSelectionModes);
}
void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes)
AISObjectPtr anObj = myResult2AISObjectMap[theObject];
Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
- if (aContext->HasOpenedContext()) {
- aContext->Load(anAIS, -1, true);
- }
+ aContext->Deactivate(anAIS);
+ //if (aContext->HasOpenedContext()) {
+ // aContext->Load(anAIS, -1, true);
+ //}
+ // In order to clear active modes list
if (theModes.size() > 0) {
foreach(int aMode, theModes) {
aContext->Activate(anAIS, aMode);
}
}
+void XGUI_Displayer::activateObjects(const QIntList& theModes)
+{
+ // In order to avoid doblications of selection modes
+ myActiveSelectionModes.clear();
+ foreach (int aMode, theModes) {
+ if (!myActiveSelectionModes.contains(aMode))
+ myActiveSelectionModes.append(aMode);
+ }
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ // Open local context if there is no one
+ if (!aContext->HasOpenedContext())
+ return;
+
+ //aContext->UseDisplayedObjects();
+ //myUseExternalObjects = true;
+
+ AIS_ListOfInteractive aPrsList;
+ aContext->DisplayedObjects(aPrsList, true);
+ //Deactivate trihedron which can be activated in local selector
+
+ Handle(AIS_Trihedron) aTrihedron;
+ AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
+ Handle(AIS_InteractiveObject) anAISIO;
+ for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
+ anAISIO = aLIt.Value();
+ aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO);
+ if (!aTrihedron.IsNull()) {
+ aContext->Deactivate(aTrihedron);
+ } else {
+ //aContext->Load(anAISIO, -1, true);
+ // In order to clear active modes list
+ aContext->Deactivate(anAISIO);
+ if (myActiveSelectionModes.size() == 0)
+ aContext->Activate(anAISIO);
+ else {
+ foreach(int aMode, myActiveSelectionModes) {
+ aContext->Activate(anAISIO, aMode);
+ }
+ }
+ }
+ }
+}
+
+
+void XGUI_Displayer::deactivateObjects()
+{
+ myActiveSelectionModes.clear();
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ // Open local context if there is no one
+ if (!aContext->HasOpenedContext())
+ return;
+
+ aContext->NotUseDisplayedObjects();
+ AIS_ListOfInteractive aPrsList;
+ aContext->DisplayedObjects(aPrsList);
+
+ AIS_ListIteratorOfListOfInteractive aLIt;
+ Handle(AIS_Trihedron) aTrihedron;
+ Handle(AIS_InteractiveObject) anAISIO;
+ for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
+ anAISIO = aLIt.Value();
+ aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO);
+ if (!aTrihedron.IsNull()) {
+ aContext->Deactivate(aTrihedron);
+ } else {
+ //aContext->Load(anAISIO, -1, true);
+ aContext->Deactivate(anAISIO);
+ //aContext->Activate(anAISIO);
+ }
+ }
+}
+
bool XGUI_Displayer::isActive(ObjectPtr theObject) const
{
Handle(AIS_InteractiveContext) aContext = AISContext();
updateViewer();
}
-void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer)
-{
- Handle(AIS_InteractiveContext) aContext = AISContext();
- if (aContext.IsNull())
- return;
-
- QObjectPtrList aRemoved;
- foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) {
- if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) {
- AISObjectPtr anObj = myResult2AISObjectMap[aFeature];
- if (!anObj)
- continue;
- Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
- if (!anAIS.IsNull()) {
- aContext->Remove(anAIS, false);
- aRemoved.append(aFeature);
- }
- }
- }
- foreach(ObjectPtr aObj, aRemoved) {
- myResult2AISObjectMap.remove(aObj);
- }
-
- if (isUpdateViewer)
- updateViewer();
-}
+//void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer)
+//{
+// Handle(AIS_InteractiveContext) aContext = AISContext();
+// if (aContext.IsNull())
+// return;
+//
+// QObjectPtrList aRemoved;
+// foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) {
+// if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) {
+// AISObjectPtr anObj = myResult2AISObjectMap[aFeature];
+// if (!anObj)
+// continue;
+// Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
+// if (!anAIS.IsNull()) {
+// aContext->Remove(anAIS, false);
+// aRemoved.append(aFeature);
+// }
+// }
+// }
+// foreach(ObjectPtr aObj, aRemoved) {
+// myResult2AISObjectMap.remove(aObj);
+// }
+//
+// if (isUpdateViewer)
+// updateViewer();
+//}
void XGUI_Displayer::openLocalContext()
{
aContext->ClearCurrents();
aContext->OpenLocalContext();
- aContext->NotUseDisplayedObjects();
+ //aContext->NotUseDisplayedObjects();
- myUseExternalObjects = false;
+ //myUseExternalObjects = false;
myActiveSelectionModes.clear();
SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
if (isUpdateViewer)
updateViewer();
- myUseExternalObjects = false;
+ //myUseExternalObjects = false;
myActiveSelectionModes.clear();
// Restore selection
Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const
{
- return myWorkshop->viewer()->AISContext();
+ Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
+ if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) {
+ aContext->OpenLocalContext();
+ }
+ return aContext;
}
Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter()
if (!anAISIO.IsNull()) {
aContext->Display(anAISIO, isUpdate);
if (aContext->HasOpenedContext()) {
- if (myUseExternalObjects) {
+ //if (myUseExternalObjects) {
if (myActiveSelectionModes.size() == 0)
aContext->Activate(anAISIO);
else {
aContext->Activate(anAISIO, aMode);
}
}
- }
+ //}
}
}
}
}
}
-void XGUI_Displayer::activateObjects(const QIntList& theModes)
-{
- Handle(AIS_InteractiveContext) aContext = AISContext();
- // Open local context if there is no one
- if (!aContext->HasOpenedContext())
- return;
-
- aContext->UseDisplayedObjects();
- myUseExternalObjects = true;
- myActiveSelectionModes = theModes;
-
- //Deactivate trihedron which can be activated in local selector
- AIS_ListOfInteractive aPrsList;
- aContext->DisplayedObjects(aPrsList, true);
-
- Handle(AIS_Trihedron) aTrihedron;
- AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
- for(; aLIt.More(); aLIt.Next()){
- aTrihedron = Handle(AIS_Trihedron)::DownCast(aLIt.Value());
- if (!aTrihedron.IsNull()) {
- aContext->Deactivate(aTrihedron);
- break;
- }
- }
-
- //Activate all displayed objects with the module modes
- //AIS_ListOfInteractive aPrsList;
- //aContext->DisplayedObjects(aPrsList, true);
-
- //AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
- Handle(AIS_InteractiveObject) anAISIO;
- for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
- anAISIO = aLIt.Value();
- aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO);
- if (!aTrihedron.IsNull())
- continue;
-
- aContext->Load(anAISIO, -1, true);
- if (theModes.size() == 0)
- aContext->Activate(anAISIO);
- else {
- foreach(int aMode, theModes) {
- aContext->Activate(anAISIO, aMode);
- }
- }
- }
-}
-
-
-void XGUI_Displayer::deactivateObjects()
-{
- Handle(AIS_InteractiveContext) aContext = AISContext();
- // Open local context if there is no one
- if (!aContext->HasOpenedContext())
- return;
-
- aContext->NotUseDisplayedObjects();
-}
-
void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bool toUpdate)
{
/// Erase AIS interactive objects, which has an empty feature in the internal map
/// \param isUpdateViewer the parameter whether the viewer should be update immediatelly
- void eraseDeletedResults(const bool isUpdateViewer = true);
-
- /// Opens local context. Does nothing if it is already opened.
- void openLocalContext();
+ //void eraseDeletedResults(const bool isUpdateViewer = true);
/// Deactivates selection of sub-shapes
/// \param isUpdateViewer the parameter whether the viewer should be update immediatelly
*/
void redisplay(ObjectPtr theObject, bool isUpdateViewer = true);
+ /// Opens local context. Does nothing if it is already opened.
+ void openLocalContext();
+
protected:
XGUI_Workshop* myWorkshop;
ResultToAISMap myResult2AISObjectMap;
// A flag of initialization of external objects selection
- bool myUseExternalObjects;
+ //bool myUseExternalObjects;
// Selection modes installed for external objects in local context
QIntList myActiveSelectionModes;
};
{
XGUI_Displayer* aDisp = myWorkshop->displayer();
// Close context if it was opened in order to clear stsndard selection modes
- aDisp->closeLocalContexts(false);
- aDisp->openLocalContext();
+ //aDisp->closeLocalContexts(false);
+ //aDisp->openLocalContext();
// Convert shape types to selection types
QIntList aModes;
foreach(int aType, theTypes) {
XGUI_Displayer* aDisp = myWorkshop->displayer();
// The document limitation selection has to be only during operation
//aDisp->removeSelectionFilter(myDocumentShapeFilter);
- aDisp->closeLocalContexts(false);
+ //aDisp->closeLocalContexts(false);
}
AISObjectPtr XGUI_ModuleConnector::findPresentation(const ObjectPtr& theObject) const
{
myWorkshop->displayer()->removeFilters();
}
+
+//***************************************
+void XGUI_ViewerProxy::update()
+{
+ myWorkshop->displayer()->updateViewer();
+}
/// Remove all selection filters from the viewer
virtual void clearSelectionFilters();
+ /// Update current viewer
+ virtual void update();
+
private slots:
void onTryCloseView(AppElements_ViewWindow*);
void onDeleteView(AppElements_ViewWindow*);