]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
merge-branch-pre-V9_3_BR_HYDRO
authorYOANN AUDOUIN <B61570@dsp0919998.atlas.edf.fr>
Fri, 5 Feb 2021 09:17:39 +0000 (10:17 +0100)
committerYOANN AUDOUIN <B61570@dsp0919998.atlas.edf.fr>
Thu, 4 Mar 2021 09:54:04 +0000 (10:54 +0100)
21 files changed:
resources/CMakeLists.txt
resources/setcolor.png [new file with mode: 0644]
src/CurveCreator/CMakeLists.txt
src/CurveCreator/CurveCreator_Curve.cxx
src/CurveCreator/CurveCreator_Curve.hxx
src/CurveCreator/CurveCreator_Diff.cxx
src/CurveCreator/CurveCreator_Displayer.hxx
src/CurveCreator/CurveCreator_Operation.cxx
src/CurveCreator/CurveCreator_Operation.hxx
src/CurveCreator/CurveCreator_Section.hxx
src/CurveCreator/CurveCreator_ShapeFilter.cxx [new file with mode: 0644]
src/CurveCreator/CurveCreator_ShapeFilter.hxx [new file with mode: 0644]
src/CurveCreator/CurveCreator_TreeView.cxx
src/CurveCreator/CurveCreator_TreeView.h
src/CurveCreator/CurveCreator_Utils.cxx
src/CurveCreator/CurveCreator_Utils.hxx
src/CurveCreator/CurveCreator_UtilsICurve.cxx
src/CurveCreator/CurveCreator_Widget.cxx
src/CurveCreator/CurveCreator_Widget.h
src/GEOMGUI/GEOM_images.ts
src/GEOMGUI/GEOM_msg_en.ts

index c17e9819ccac5b32be28307ecff91110d0129a89..09745bafada7a0bd929d17d593608fb04ffd96c4 100644 (file)
@@ -267,6 +267,7 @@ SET( _res_files
   propagate.png
   redo.png
   undo.png
+  setcolor.png
   glue2.png
   remove_webs.png
   remove_extra_edges.png
diff --git a/resources/setcolor.png b/resources/setcolor.png
new file mode 100644 (file)
index 0000000..15b9545
Binary files /dev/null and b/resources/setcolor.png differ
index 442c3754b06927524337e1acf365219286719cca..253160f2696b22757ee2f1b31d7d5e50b44ade69 100644 (file)
@@ -26,7 +26,7 @@ ENDIF(SALOME_BUILD_GUI)
 # additional include directories
 INCLUDE_DIRECTORIES(
   ${PTHREAD_INCLUDE_DIR}
-  ${OpenCASCADE_INCLUDE_DIR}
+  ${CAS_INCLUDE_DIR}
   ${KERNEL_INCLUDE_DIRS}
   ${GUI_INCLUDE_DIRS}
   ${PROJECT_SOURCE_DIR}/src/GEOMUtils
@@ -34,12 +34,15 @@ INCLUDE_DIRECTORIES(
 
 # additional preprocessor / compiler flags
 ADD_DEFINITIONS(
+  ${CAS_DEFINITIONS}
   ${OpenCASCADE_DEFINITIONS}
   ${QT_DEFINITIONS}
 )
 
 # libraries to link to
 SET(_link_LIBRARIES
+  ${CAS_KERNEL}
+  ${CAS_TKernel}
   GEOMUtils
 )
 IF(SALOME_BUILD_GUI)
@@ -66,6 +69,7 @@ ENDIF(SALOME_BUILD_GUI)
 SET(_other_HEADERS
   CurveCreator.hxx
   CurveCreator_Curve.hxx
+  CurveCreator_ShapeFilter.hxx
   CurveCreator_Diff.hxx
   CurveCreator_Displayer.hxx
   CurveCreator_ICurve.hxx
@@ -92,6 +96,7 @@ SET(_other_SOURCES
   CurveCreator_Curve.cxx
   CurveCreator_Diff.cxx
   CurveCreator_Displayer.cxx
+  CurveCreator_ShapeFilter.cxx
   CurveCreator_Operation.cxx
   CurveCreator_Section.cxx
   CurveCreator_Utils.cxx
index c9f64e2523ccb7de9748b0ef24ec2d0f6b9c54a1..54b74380e7a0bb966f87ad6543b41b8ccf49f5bd 100644 (file)
@@ -52,8 +52,8 @@ CurveCreator_Curve::CurveCreator_Curve( const CurveCreator::Dimension theDimensi
   myIsLocked (false),
   myDimension (theDimension),
   myDisplayer (NULL),
-  myPointAspectColor (Quantity_NOC_ROYALBLUE4), 
-  myCurveColor (Quantity_NOC_RED),
+  myPointAspectColor (Quantity_NOC_ROYALBLUE4),
+  //myCurveColor (Quantity_NOC_RED),
   myLineWidth (1),
   myNbUndos (0),
   myNbRedos (0),
@@ -256,7 +256,7 @@ void CurveCreator_Curve::getCoordinates( int theISection, int theIPoint, double&
 void CurveCreator_Curve::redisplayCurve(bool preEraseAllObjects)
 {
   //DEBTRACE("redisplayCurve");
-  if( myDisplayer ) 
+  if( myDisplayer )
   {
     if (preEraseAllObjects)
       myDisplayer->eraseAll( false );
@@ -384,7 +384,7 @@ bool CurveCreator_Curve::clearInternal()
   }
 
   mySections.clear();
-  
+
   return true;
 }
 
@@ -480,7 +480,8 @@ int CurveCreator_Curve::getNbSections() const
 //! For internal use only! Undo/Redo are not used here.
 int CurveCreator_Curve::addSectionInternal
         (const std::string& theName, const CurveCreator::SectionType theType,
-         const bool theIsClosed, const CurveCreator::Coordinates &thePoints)
+         const bool theIsClosed, const CurveCreator::Coordinates &thePoints,
+         const Quantity_Color& aColor)
 {
   CurveCreator_Section *aSection = new CurveCreator_Section;
 
@@ -492,6 +493,7 @@ int CurveCreator_Curve::addSectionInternal
   aSection->myType     = theType;
   aSection->myIsClosed = theIsClosed;
   aSection->myPoints   = thePoints;
+  aSection->myColor    = aColor;//getRandColor();  //TODO temp
   mySections.push_back(aSection);
   redisplayCurve(false);
   return mySections.size()-1;
@@ -514,7 +516,9 @@ int CurveCreator_Curve::addSection
                             theName, aCoords, theType, theIsClosed);
   }
 
-  resISection = addSectionInternal(theName, theType, theIsClosed, aCoords);
+  Quantity_Color aRColor = CurveCreator_Utils::getRandColor();
+
+  resISection = addSectionInternal(theName, theType, theIsClosed, aCoords, aRColor);
 
   finishOperation();
   return resISection;
@@ -535,7 +539,7 @@ int CurveCreator_Curve::addSection
                             theName, thePoints, theType, theIsClosed);
   }
 
-  resISection = addSectionInternal(theName, theType, theIsClosed, thePoints);
+  resISection = addSectionInternal(theName, theType, theIsClosed, thePoints, Quantity_NOC_YELLOW);
 
   finishOperation();
   return resISection;
@@ -545,18 +549,21 @@ int CurveCreator_Curve::addSection
 bool CurveCreator_Curve::removeSectionInternal( const int theISection )
 {
   if (theISection == -1) {
+    myRemColors.push_back(mySections.back()->myColor);
     delete mySections.back();
     mySections.pop_back();
   } else {
     CurveCreator::Sections::iterator anIterRm = mySections.begin() + theISection;
 
+    myRemColors.push_back((*anIterRm)->myColor);
+
     delete *anIterRm;
     mySections.erase(anIterRm);
   }
   redisplayCurve(false);
   return true;
 }
-  
+
 //! Removes the given sections.
 bool CurveCreator_Curve::removeSection( const int theISection )
 {
@@ -572,6 +579,49 @@ bool CurveCreator_Curve::removeSection( const int theISection )
   return res;
 }
 
+bool CurveCreator_Curve::setColorSection( int SectInd, Quantity_Color theNewColor )
+{
+  bool res = false;
+  // Set the difference.
+  startOperation();
+
+  int ColorParam[3] = { (int)( theNewColor.Red() * 255 ),
+    (int)( theNewColor.Green() * 255 ),
+    (int)( theNewColor.Blue() * 255 ) };
+
+  if (addEmptyDiff())
+    myListDiffs.back().init(this, CurveCreator_Operation::SetColorSection, SectInd, ColorParam);
+
+  setColorSectionInternal(SectInd, theNewColor);
+
+  finishOperation();
+  return res;
+}
+
+void CurveCreator_Curve::setColorSectionInternal( int SectInd, Quantity_Color theNewColor )
+{
+  CurveCreator_Section* aSec = (CurveCreator_Section*)(getSection(SectInd));
+  aSec->myColor = theNewColor;
+
+  redisplayCurve(false);
+}
+
+Quantity_Color CurveCreator_Curve::getColorSection( int SectInd ) const
+{
+  CurveCreator_Section* aSec = (CurveCreator_Section*)(getSection(SectInd));
+  return aSec->myColor;
+}
+
+Quantity_Color CurveCreator_Curve::getLastRemovedColor() const
+{
+  return myRemColors.empty() ? Quantity_NOC_BLACK : myRemColors.back();
+}
+
+void CurveCreator_Curve::popLastRemovedColor()
+{
+  myRemColors.pop_back();
+}
+
 /**
  *  Get number of points in specified section or (the total number of points
  *  in Curve if theISection is equal to -1).
@@ -632,7 +682,7 @@ bool CurveCreator_Curve::isClosed( const int theISection ) const
 }
 
 //! For internal use only! Undo/Redo are not used here.
-bool CurveCreator_Curve::setClosedInternal( const int theISection, 
+bool CurveCreator_Curve::setClosedInternal( const int theISection,
                                             const bool theIsClosed )
 {
   CurveCreator_Section* aSection = 0;
@@ -661,7 +711,7 @@ bool CurveCreator_Curve::setClosedInternal( const int theISection,
  *  Set "closed" flag of the specified section (all sections if
  *  \a theISection is -1).
  */
-bool CurveCreator_Curve::setClosed( const int theISection, 
+bool CurveCreator_Curve::setClosed( const int theISection,
                                     const bool theIsClosed )
 {
   bool res = false;
@@ -684,7 +734,7 @@ std::string CurveCreator_Curve::getSectionName( const int theISection ) const
 }
 
 //! For internal use only! Undo/Redo are not used here.
-bool CurveCreator_Curve::setSectionNameInternal( const int theISection, 
+bool CurveCreator_Curve::setSectionNameInternal( const int theISection,
                                                  const std::string& theName )
 {
   bool res = false;
@@ -697,7 +747,7 @@ bool CurveCreator_Curve::setSectionNameInternal( const int theISection,
 }
 
 /** Set name of the specified section */
-bool CurveCreator_Curve::setSectionName( const int theISection, 
+bool CurveCreator_Curve::setSectionName( const int theISection,
                                          const std::string& theName )
 {
   bool res = false;
@@ -721,7 +771,7 @@ CurveCreator::SectionType CurveCreator_Curve::getSectionType
 }
 
 //! For internal use only! Undo/Redo are not used here.
-bool CurveCreator_Curve::setSectionTypeInternal( const int theISection, 
+bool CurveCreator_Curve::setSectionTypeInternal( const int theISection,
                                                  const CurveCreator::SectionType theType )
 {
   CurveCreator_Section* aSection;
@@ -749,7 +799,7 @@ bool CurveCreator_Curve::setSectionTypeInternal( const int theISection,
  *  Set type of the specified section (or all sections
  *  if \a theISection is -1).
  */
-bool CurveCreator_Curve::setSectionType( const int theISection, 
+bool CurveCreator_Curve::setSectionType( const int theISection,
                                          const CurveCreator::SectionType theType )
 {
   bool res = false;
@@ -791,7 +841,7 @@ bool CurveCreator_Curve::addPointsInternal( const CurveCreator::SectionsMap &the
           anIterPosition = aSection->myPoints.end();
         else
           anIterPosition = aSection->myPoints.begin() + toICoord(anIPnt);
-        /*CurveCreator::Coordinates::const_iterator aFirstPosition = 
+        /*CurveCreator::Coordinates::const_iterator aFirstPosition =
           aCoords.begin();*/
         aSection->myPoints.insert(anIterPosition,
                                   aCoords.begin(), aCoords.end());
@@ -845,7 +895,7 @@ bool CurveCreator_Curve::setPointInternal( const CurveCreator::SectionsMap &theS
   for ( ; anIt != theSectionsMap.end(); anIt++ ) {
     int anISection = anIt->first;
     aSection = (CurveCreator_Section*)getSection( anISection );
-    if( aSection ) { 
+    if( aSection ) {
       CurveCreator::PosPointsList aSectionPoints = anIt->second;
       CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin();
       for( ; aPntIt != aSectionPoints.end(); aPntIt++ ){
@@ -859,7 +909,7 @@ bool CurveCreator_Curve::setPointInternal( const CurveCreator::SectionsMap &theS
   }
   if(res)
     redisplayCurve(false);
-  
+
   return res;
 }
 
@@ -890,7 +940,7 @@ bool CurveCreator_Curve::setPoint( const int theISection,
 
   finishOperation();
 
-  return res; 
+  return res;
 }
 
 //! Set coordinates of specified points from different sections
@@ -907,7 +957,7 @@ bool CurveCreator_Curve::setSeveralPoints( const SectionToPointCoordsList &theSe
   }
   CurveCreator::SectionsMap aSectionsMap;
   CurveCreator::PosPointsList aPosPoints;
-  CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt = 
+  CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt =
     theSectionToPntCoords.begin(), aLast = theSectionToPntCoords.end();
   int aSectionId, aPointId;
   for ( ; anIt != aLast; anIt++ ) {
@@ -915,18 +965,18 @@ bool CurveCreator_Curve::setSeveralPoints( const SectionToPointCoordsList &theSe
     aSectionId = anIt->first.first;
     aPointId = anIt->first.second;
     CurveCreator::Coordinates aNewCoords = anIt->second;
-    CurveCreator_PosPoint* aPosPoint = 
+    CurveCreator_PosPoint* aPosPoint =
       new CurveCreator_PosPoint( aPointId, aNewCoords );
     if( aSectionsMap.find(aSectionId) != aSectionsMap.end() )
       aPosPoints = aSectionsMap[aSectionId];
     aPosPoints.push_back( aPosPoint );
     aSectionsMap[aSectionId] = aPosPoints;
-    
+
   }
   res = setPointInternal( aSectionsMap );
   finishOperation();
 
-  return res; 
+  return res;
 }
 
 //! For internal use only! Undo/Redo are not used here.
@@ -1016,9 +1066,28 @@ void CurveCreator_Curve::constructAISObject()
 {
   //DEBTRACE("constructAISObject");
   TopoDS_Shape aShape;
-  CurveCreator_Utils::constructShape( this, aShape );
-  myAISShape = new AIS_Shape( aShape );  
-  myAISShape->SetColor( myCurveColor );
+  mySect2Shape.Clear();
+  CurveCreator_Utils::constructShape( this, aShape, &mySect2Shape );
+  myAISShape = new AIS_ColoredShape( aShape );
+  AIS_ColoredShape* AISColoredShape = dynamic_cast<AIS_ColoredShape*>(myAISShape);
+
+  std::map<int, TopoDS_Shape>::iterator it;
+
+  //for ( it = mySect2Shape.begin(); it != mySect2Shape.end(); it++ )
+  for (int i = 1; i <= mySect2Shape.Extent(); i++ )
+  {
+    CurveCreator_Section* aSect = (CurveCreator_Section*)getSection(mySect2Shape.FindKey(i));
+    Quantity_Color aColor = aSect->myColor;
+    const TopoDS_Shape& aShape = mySect2Shape.FindFromIndex(i); //should contain: one wire + vertices
+    TopoDS_Iterator it(aShape);
+    for (;it.More();it.Next())
+    {
+      if (it.Value().ShapeType() == TopAbs_WIRE)
+        AISColoredShape->SetCustomColor(it.Value(), aColor);
+    }
+  }
+
+  // myAISShape->SetColor( myCurveColor );
   myAISShape->SetWidth( myLineWidth );
   Handle(Prs3d_PointAspect) anAspect = myAISShape->Attributes()->PointAspect();
   anAspect->SetScale( 3.0 );
@@ -1030,7 +1099,7 @@ void CurveCreator_Curve::constructAISObject()
 Handle(AIS_InteractiveObject) CurveCreator_Curve::getAISObject( const bool theNeedToBuild ) const
 {
   //DEBTRACE("getAISObject");
-  if ( !myAISShape && theNeedToBuild ) 
+  if ( !myAISShape && theNeedToBuild )
   {
     CurveCreator_Curve* aCurve = (CurveCreator_Curve*)this;
     aCurve->constructAISObject();
index b0d89d9b38cae5d6828a0c4f5588d7c12aa868de..5667150ccaf02884a10255cadb6a5f1c450f8a20 100644 (file)
 
 #include <list>
 #include <map>
+#include <NCollection_IndexedDataMap.hxx>
 
 struct CurveCreator_Section;
 class CurveCreator_Displayer;
 class AIS_Shape;
 class AIS_InteractiveObject;
 class Quantity_Color;
+class TopoDS_Shape;
 
 /**
  *  The CurveCreator_Curve object is represented as one or more sets of
@@ -108,7 +110,7 @@ protected:
 
 public: // TODO: remove public
   void getCoordinates( int theISection, int theIPoint, double& theX, double& theY, double& theZ ) const;
-protected:  // TODO: remove public
+protected:  // TODO
   void redisplayCurve(bool preEraseAllObjects = true);
 
 public:
@@ -159,20 +161,21 @@ public:
   virtual int getNbSections() const;
 
   //! For internal use only! Undo/Redo are not used here.
-  virtual int addSectionInternal( const std::string &theName, 
+  virtual int addSectionInternal( const std::string &theName,
                                   const CurveCreator::SectionType theType,
                                   const bool theIsClosed,
-                                  const CurveCreator::Coordinates &thePoints);
+                                  const CurveCreator::Coordinates &thePoints,
+                                  const Quantity_Color& aColor);
   //! Add a new section.
-  virtual int addSection( const std::string &theName, 
+  virtual int addSection( const std::string &theName,
                            const CurveCreator::SectionType theType,
                            const bool theIsClosed );
   //! Add a new section.
-  virtual int addSection( const std::string &theName, 
+  virtual int addSection( const std::string &theName,
                            const CurveCreator::SectionType theType,
                            const bool theIsClosed,
                            const CurveCreator::Coordinates &thePoints);
-  
+
   //! For internal use only! Undo/Redo are not used here.
   virtual bool removeSectionInternal( const int theISection );
   //! Removes the given sections.
@@ -182,36 +185,49 @@ public:
   virtual bool isClosed( const int theISection ) const;
 
   //! For internal use only! Undo/Redo are not used here.
-  virtual bool setClosedInternal( const int theISection, 
+  virtual bool setClosedInternal( const int theISection,
                                   const bool theIsClosed );
   /**
    *  Set "closed" flag of the specified section (all sections if
    *  \a theISection is -1).
    */
-  virtual bool setClosed( const int theISection, 
+  virtual bool setClosed( const int theISection,
                           const bool theIsClosed );
 
+  //! Sets color of section by index
+  virtual bool setColorSection(  int SectInd, Quantity_Color theNewColor );
+
+  //! For internal use only! Undo/Redo are not used here.
+  virtual void setColorSectionInternal( int SectInd, Quantity_Color theNewColor );
+
+  virtual Quantity_Color getLastRemovedColor() const;
+
+  virtual void popLastRemovedColor();
+
+  //! Gets color of section by index
+  virtual Quantity_Color getColorSection( int SectInd ) const;
+
   //! Returns specifyed section name
   virtual std::string getSectionName( const int theISection ) const;
 
   //! For internal use only! Undo/Redo are not used here.
-  virtual bool setSectionNameInternal( const int theISection, 
+  virtual bool setSectionNameInternal( const int theISection,
                                        const std::string& theName );
   /** Set name of the specified section */
-  virtual bool setSectionName( const int theISection, 
+  virtual bool setSectionName( const int theISection,
                                const std::string& theName );
 
   //! Get type of the specified section
   virtual CurveCreator::SectionType getSectionType( const int theISection ) const;
 
   //! For internal use only! Undo/Redo are not used here.
-  virtual bool setSectionTypeInternal( const int theISection, 
+  virtual bool setSectionTypeInternal( const int theISection,
                                        const CurveCreator::SectionType theType );
   /**
    *  Set type of the specified section (or all sections
    *  if \a theISection is -1).
    */
-  virtual bool setSectionType( const int theISection, 
+  virtual bool setSectionType( const int theISection,
                                const CurveCreator::SectionType theType );
 
   //! A virtual method.
@@ -264,7 +280,7 @@ public:
   virtual bool removeSeveralPoints( const SectionToPointList &theSectionToPntIDs);
 
   //! Get coordinates of specified point
-  virtual CurveCreator::Coordinates getPoint( const int theISection, 
+  virtual CurveCreator::Coordinates getPoint( const int theISection,
                                               const int theIPnt ) const;
 
   /**
@@ -327,6 +343,7 @@ protected:
 
 protected:
   bool                            mySkipSorting;
+  AIS_Shape*                      myAISShape;   //!< AIS shape
 
 public:
   bool                            myIsLocked;
@@ -334,8 +351,10 @@ public:
   CurveCreator::Dimension         myDimension;  //!< curve dimension
   CurveCreator_Displayer*         myDisplayer;  //!< curve displayer
   Quantity_Color myPointAspectColor;
-  Quantity_Color myCurveColor;
+  //Quantity_Color myCurveColor;
   double myLineWidth;
+  NCollection_IndexedDataMap<int, TopoDS_Shape> mySect2Shape;
+  std::vector<int> myCurSectInd;
 
 private:
 
@@ -345,8 +364,8 @@ private:
   ListDiff                        myListDiffs;
   int                             myUndoDepth;
   int                             myOpLevel;
-  AIS_Shape*                      myAISShape;   //!< AIS shape
   bool                            myEraseAll;
+  std::vector<Quantity_Color>     myRemColors;
 };
 
 #endif
index de33d8e64ab5632a071abb0ce4c654754796dc99..305c98d1994cb64fdb4b511c3408fbb6ae8c84d8 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "CurveCreator_Diff.hxx"
 #include "CurveCreator_Curve.hxx"
+#include "CurveCreator_Section.hxx"
+#include "CurveCreator_Utils.hxx"
 
 #include <list>
 
@@ -171,6 +173,36 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
   return isOK;
 }
 
+bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
+                             const CurveCreator_Operation::Type theType,
+                             const int theIntParam1,
+                             const int theIntParam2[3])
+{
+  bool isOK = false;
+
+  if (theCurve != NULL)
+  {
+    clear();
+    myPRedo = new CurveCreator_Operation;
+
+    if (myPRedo->init(theType, theIntParam1, theIntParam2))
+    {
+      Quantity_Color aColor =  theCurve->getColorSection(theIntParam1);
+
+      setNbUndos(1);
+      QColor aQColor = CurveCreator_Utils::colorConv(aColor);
+      int colorArr[3] = {aQColor.red(),aQColor.green(), aQColor.blue()};
+
+      isOK = myPUndo[0].init(theType, theIntParam1, colorArr);
+    }
+
+    if (!isOK)
+      clear();
+  }
+
+  return isOK;
+}
+
 //=======================================================================
 // function: init
 // purpose:
@@ -343,7 +375,7 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
                       theCurve->getCoords(aSectionId);
               CurveCreator::Coordinates::const_iterator anIterBegin =
                   aPoints.begin() + (aDim*aPointId);
-              CurveCreator::Coordinates::const_iterator anIterEnd = 
+              CurveCreator::Coordinates::const_iterator anIterEnd =
                 anIterBegin + aDim;
               aPointsToAdd.insert(aPointsToAdd.end(), anIterBegin, anIterEnd);
               aSectionToPointCoords.push_back(std::make_pair(*anIt, aPointsToAdd));
@@ -435,7 +467,7 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
 
     // Construct redo for SetCoordinates command.
     CurveCreator_ICurve::SectionToPointCoordsList aSectionToPointActualCoords;
-    CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt = 
+    CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt =
       theOldParamList.begin(), aLast = theOldParamList.end();
     for ( ; anIt != aLast; anIt++ ) {
       CurveCreator::Coordinates anActualCoords = theCurve->getPoint(anIt->first.first, anIt->first.second);
index 24c82b25602e7b4c9f2466324522af1d1c23f9b8..485468aac62e78b0db12ad16d410576813017cd4 100644 (file)
@@ -40,6 +40,12 @@ public:
   void eraseAll( bool isUpdate );
   void erase( const Handle(AIS_InteractiveObject)& theObject, bool isUpdate );
   void Update();
+
+  Handle(AIS_InteractiveContext) getContext()
+  {
+    return myContext;
+  }
+
   //void highlight( const AISObjectsList& theObjects, bool isHL );
 
 protected:
index dbdf235646136b5be947cfb003a6b82047061898..6098ffbc962e51c582219f04ab799d2234b86838 100644 (file)
@@ -23,6 +23,9 @@
 #include "CurveCreator_Operation.hxx"
 #include "CurveCreator_Curve.hxx"
 #include "CurveCreator.hxx"
+#include "CurveCreator_Section.hxx"
+#include "CurveCreator_Utils.hxx"
+#include <QColor>
 
 #include <string>
 #include <stdlib.h>
@@ -114,6 +117,28 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
   return isOK;
 }
 
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+                                  const int theIntParam1,
+                                  const int theIntParam2[3])
+{
+  bool isOK = false;
+
+  if (theType == CurveCreator_Operation::SetColorSection)
+  {
+    int *pData = (int *)allocate(4*sizeof(int));
+
+    pData[0] = theIntParam1;
+    pData[1] = theIntParam2[0];
+    pData[2] = theIntParam2[1];
+    pData[3] = theIntParam2[2];
+    myType   = theType;
+    isOK     = true;
+  }
+
+  return isOK;
+}
+
+
 //=======================================================================
 // function: Constructor
 // purpose:
@@ -252,12 +277,12 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
 
     const int aNbPoints = theParamList1.size();
 
-    CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt = 
+    CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt =
       theParamList1.begin();
     const int aNbCoords = anIt->second.size();
 
     const size_t aSize =
-      sizeof(aNbPoints) + sizeof(aNbCoords) + 
+      sizeof(aNbPoints) + sizeof(aNbCoords) +
       aNbPoints * (3*sizeof(int) + aNbCoords*sizeof(CurveCreator::TypeCoord));
     int *pIntData = (int *)allocate(aSize);
 
@@ -295,7 +320,7 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
   if (theType == CurveCreator_Operation::RemovePoints) {
     const int aNbPoints = theParamList1.size();
 
-    CurveCreator_ICurve::SectionToPointList::const_iterator anIt = 
+    CurveCreator_ICurve::SectionToPointList::const_iterator anIt =
       theParamList1.begin();
 
     const size_t aSize =
@@ -416,7 +441,9 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve)
           char* aPtr =  ((char*)&pInt[2]);
           aPtr += (aName.length()) + 1;
           getCoords((int*)aPtr, aCoords);
-          theCurve->addSectionInternal(aName, aType, (pInt[1] != 0), aCoords);
+          Quantity_Color aLastColor = theCurve->getLastRemovedColor();
+          theCurve->popLastRemovedColor();
+          theCurve->addSectionInternal(aName, aType, (pInt[1] != 0), aCoords, aLastColor);
         }
         break;
       case CurveCreator_Operation::RemoveSection:
@@ -428,6 +455,13 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve)
             theCurve->setSectionNameInternal(pInt[0], aName);
         }
         break;
+      case CurveCreator_Operation::SetColorSection:
+        {
+          Quantity_Color aColor = CurveCreator_Utils::colorConv(QColor(pInt[1], pInt[2], pInt[3]));
+          theCurve->setColorSectionInternal(pInt[0], aColor);
+          //theCurve->redisplayCurve(false);
+        }
+        break;
       default:
         break;
     }
index 73842a37ce0455f9c673cae74d53c6329728fc2f..8694c56b04dde217fae3a16aa6caf41820f5fafc 100644 (file)
@@ -59,7 +59,8 @@ public:
     Join,           //!< Method CurveCreator_Curve::join
     AddSection,     //!< Method CurveCreator_Curve::addSection
     RemoveSection,   //!< Method CurveCreator_Curve::removeSection
-    RenameSection   //!< Method CurveCreator_Curve::renameSection
+    RenameSection,  //!< Method CurveCreator_Curve::renameSection
+    SetColorSection //!< Method CurveCreator_Curve::setColorSection
   };
 
   /**
@@ -106,6 +107,14 @@ public:
   bool init(const Type theType, const int theIntParam1,
             const int theIntParam2);
 
+  /**
+   * This method initializes the object with an operation with 4 integer
+   * parameter (1 as first param + 3 as interger array)
+   */
+  bool init(const Type theType, const int theIntParam1,
+            const int theIntParam2[3]);
+
+
   /**
    * This method initializes the object with an operation with two integer
    * parameters. It is applicable to the following operations:
@@ -117,15 +126,15 @@ public:
   bool init(const Type theType, const std::list<int> theParamList);
 
   /**
-   * This method initializes the object with an operation with 
-   * list of pairs of integer parameters. 
+   * This method initializes the object with an operation with
+   * list of pairs of integer parameters.
    * It is applicable to the following operations:
    * <UL>
    *   <LI>RemovePoints</LI>
    * </UL>
    * @return true in case of success; false otherwise.
    */
-  bool init(const Type theType, 
+  bool init(const Type theType,
     const CurveCreator_ICurve::SectionToPointList &theParamList1);
 
   /**
@@ -149,7 +158,7 @@ public:
    * </UL>
    * @return true in case of success; false otherwise.
    */
-  bool init(const Type theType, 
+  bool init(const Type theType,
             const CurveCreator_ICurve::SectionToPointCoordsList &theParamList1);
 
   /**
index dcf359809b4a6814b631995724cb4249e02d6120..87d1c095146fc231919bcc935ba47e34a00dfa4a 100644 (file)
@@ -33,13 +33,15 @@ struct CURVECREATOR_EXPORT CurveCreator_Section :
   public CurveCreator_ISection
 {
   //! Constructor. Initializes object with default values.
-  CurveCreator_Section() : myName("Section"),myType(CurveCreator::Polyline), myIsClosed(false)
+  CurveCreator_Section() : myName("Section"),myType(CurveCreator::Polyline),
+    myIsClosed(false), myColor (Quantity_NOC_RED)
   { }
 
   std::string               myName;     //!< section name
   CurveCreator::Coordinates myPoints;   //!< points coordinates
   CurveCreator::SectionType myType;     //!< type of the section
   bool                      myIsClosed; //!< closed or not
+  Quantity_Color            myColor;    //!< color of section
 
   //! A virtual method.
   Handle(TColgp_HArray1OfPnt) GetDifferentPoints( int theDimension ) const;
diff --git a/src/CurveCreator/CurveCreator_ShapeFilter.cxx b/src/CurveCreator/CurveCreator_ShapeFilter.cxx
new file mode 100644 (file)
index 0000000..d3424b7
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright (C) 2013-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+// File:        CurveCreator_ShapeFilter.cxx
+// Author:      Ilya Shchekin
+
+
+#include "CurveCreator_ShapeFilter.hxx"
+
+#include <SelectMgr_EntityOwner.hxx>
+#include <StdSelect_BRepOwner.hxx>
+#include <TopoDS_Vertex.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(CurveCreator_ShapeFilter,SelectMgr_Filter)
+
+CurveCreator_ShapeFilter::CurveCreator_ShapeFilter()
+: SelectMgr_Filter()
+{
+}
+
+CurveCreator_ShapeFilter::~CurveCreator_ShapeFilter()
+{
+}
+
+Standard_Boolean CurveCreator_ShapeFilter::ActsOn(const TopAbs_ShapeEnum aType) const
+{
+  return (aType == TopAbs_VERTEX);
+}
+
+Standard_Boolean CurveCreator_ShapeFilter::IsOk(const Handle(SelectMgr_EntityOwner)& EO) const
+{
+  Handle(StdSelect_BRepOwner) aBO = Handle(StdSelect_BRepOwner)::DownCast(EO);
+  if (aBO.IsNull())
+    return Standard_False;
+
+  const TopoDS_Shape& aShape = aBO->Shape();
+
+  if(aShape.ShapeType()!= TopAbs_VERTEX)
+    return Standard_False;
+
+  return myShapes.Contains(aShape);
+}
+
+void CurveCreator_ShapeFilter::AddShape(const TopoDS_Shape& aShape)
+{
+  myShapes.Add(aShape);  
+}
+
+void CurveCreator_ShapeFilter::RemoveShape(const TopoDS_Shape& aShape)
+{
+  myShapes.Remove(aShape);
+}
+
+void CurveCreator_ShapeFilter::ClearShapes()
+{
+  myShapes.Clear();
+}
+
diff --git a/src/CurveCreator/CurveCreator_ShapeFilter.hxx b/src/CurveCreator/CurveCreator_ShapeFilter.hxx
new file mode 100644 (file)
index 0000000..cc4912e
--- /dev/null
@@ -0,0 +1,73 @@
+// Copyright (C) 2013-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+// File:        CurveCreator_ShapeFilter.hxx
+// Author:      Ilya Shchekin
+
+
+#ifndef _CurveCreator_ShapeFilter_HeaderFile
+#define _CurveCreator_ShapeFilter_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_Type.hxx>
+#include <Basics_OCCTVersion.hxx>
+#include <Standard_DefineHandle.hxx>
+#include <SelectMgr_Filter.hxx>
+#include <TopAbs_ShapeEnum.hxx> 
+#include <TopTools_MapOfShape.hxx>
+
+class SelectMgr_EntityOwner;
+class TopoDS_Shape;
+
+
+class CurveCreator_ShapeFilter : public SelectMgr_Filter
+{
+                               
+public:
+
+  
+  Standard_EXPORT CurveCreator_ShapeFilter();
+
+  Standard_EXPORT ~CurveCreator_ShapeFilter();
+  
+  Standard_EXPORT virtual Standard_Boolean ActsOn (const TopAbs_ShapeEnum aType) const Standard_OVERRIDE;
+  
+  Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& EO) const Standard_OVERRIDE;
+  
+  Standard_EXPORT void AddShape (const TopoDS_Shape& aShape);
+  
+  Standard_EXPORT void RemoveShape (const TopoDS_Shape& aShape);
+
+  Standard_EXPORT void ClearShapes ();
+
+
+private:
+
+  TopTools_MapOfShape myShapes;
+
+public:
+
+  DEFINE_STANDARD_RTTIEXT(CurveCreator_ShapeFilter,SelectMgr_Filter)
+
+};
+
+DEFINE_STANDARD_HANDLE(CurveCreator_ShapeFilter, SelectMgr_Filter)
+
+#endif 
+                                               
\ No newline at end of file
index bec6d1b964d2a11b086ab0de96be17d99bf74358..cd54305d45327f0952a7ae19be25a84f7b1abd67 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "CurveCreator_TreeView.h"
 #include "CurveCreator_ICurve.hxx"
+#include "CurveCreator_Curve.hxx"
+#include "CurveCreator_Utils.hxx"
 
 #include <SUIT_Session.h>
 #include <SUIT_ResourceMgr.h>
@@ -28,8 +30,8 @@
 
 #define ID_SECTION -1
 
-CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent ) :
-  QAbstractItemModel(parent), myCurve(theCurve)
+CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent, bool toDrawColorIcon ) :
+  QAbstractItemModel(parent), myCurve(theCurve), myDrawColorIcon(toDrawColorIcon)
 {
   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
   QPixmap aSplineIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_SPLINE")));
@@ -65,8 +67,8 @@ CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* the
 
 int    CurveCreator_TreeViewModel::columnCount(const QModelIndex & parent ) const
 {
-  if( parent.internalId() == (quintptr)ID_SECTION )
-    return 2;
+  if( myDrawColorIcon )
+    return 3;
   else
     return 2;
 }
@@ -104,6 +106,13 @@ QVariant   CurveCreator_TreeViewModel::data(const QModelIndex & index, int role )
             }
           }
         }
+        else if (myDrawColorIcon && aColumn == 2)
+        {
+          Quantity_Color color = ((CurveCreator_Curve*)myCurve)->getColorSection(aRow);
+          QPixmap pixmap(16,16);
+          pixmap.fill( CurveCreator_Utils::colorConv(color));
+          return pixmap;
+        }
       }
     }
 /*    else{
@@ -218,14 +227,14 @@ void CurveCreator_TreeViewModel::setCurve( CurveCreator_ICurve* theCurve )
 }
 
 /*****************************************************************************************/
-CurveCreator_TreeView::CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent) :
+CurveCreator_TreeView::CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent, bool toDrawColorIcon) :
   QTreeView(parent)
 {
   header()->hide();
   header()->setSectionResizeMode(QHeaderView::ResizeToContents);
   setUniformRowHeights(true);
   setContextMenuPolicy( Qt::CustomContextMenu );
-  CurveCreator_TreeViewModel* aModel = new CurveCreator_TreeViewModel(theCurve, this);
+  CurveCreator_TreeViewModel* aModel = new CurveCreator_TreeViewModel(theCurve, this, toDrawColorIcon);
   setModel(aModel);
   setSelectionBehavior(SelectRows);
   setSelectionMode(SingleSelection);
index bd164cde4657589a0bf63ddf72780077ba6e7d6a..8133d7207ec21cf9654dbe2303d5f74d3bbeb900 100644 (file)
@@ -28,7 +28,7 @@ class CurveCreator_ICurve;
 class CurveCreator_TreeViewModel : public QAbstractItemModel
 {
 public:
-  CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent );
+  CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent, bool toDrawColorIcon );
   virtual int  columnCount(const QModelIndex & parent = QModelIndex()) const;
   virtual int  rowCount(const QModelIndex & parent = QModelIndex()) const;
   virtual QVariant     data(const QModelIndex & index, int role = Qt::DisplayRole) const;
@@ -50,6 +50,7 @@ private:
   enum IconType{ ICON_POLYLINE, ICON_SPLINE, ICON_CLOSED_SPLINE, ICON_CLOSED_POLYLINE, ICON_POINT };
 private:
   CurveCreator_ICurve*          myCurve;
+  bool                         myDrawColorIcon;
   QMap<IconType, QPixmap>      myCachedIcons;
 };
 
@@ -59,7 +60,7 @@ class CurveCreator_TreeView : public QTreeView
 public:
   enum SelectionType{ ST_NOSEL, ST_POINTS, ST_POINTS_ONE_SECTION, ST_SECTIONS, ST_MIXED };
 public:
-  explicit CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent = 0);
+  explicit CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent = 0, bool toDrawColorIcon = true);
   SelectionType getSelectionType() const;
   QList<int> getSelectedSections() const;
 
index ef1705d473e175a490648effe5d3782b86a129f4..250971e9e45c30a44f27085311e392255dde072e 100644 (file)
@@ -295,11 +295,13 @@ TopoDS_Wire CurveCreator_Utils::ConstructWire(
 // purpose  :
 //=======================================================================
 void CurveCreator_Utils::constructShape(
-  const CurveCreator_ICurve* theCurve, TopoDS_Shape& theShape)
+  const CurveCreator_ICurve* theCurve, TopoDS_Shape& theShape,
+  NCollection_IndexedDataMap<int, TopoDS_Shape>* theSect2Shape )
 {
   BRep_Builder aBuilder;
   TopoDS_Compound aShape;
   aBuilder.MakeCompound(aShape);
+
   const int aSectionCount = theCurve->getNbSections();
   for (int aSectionI = 0; aSectionI < aSectionCount; ++aSectionI)
   {
@@ -314,10 +316,18 @@ void CurveCreator_Utils::constructShape(
     const int aPointCount = aPoints->Length();
     const bool isClosed = theCurve->isClosed(aSectionI);
 
+    TopoDS_Compound ShapeWireWithV;
+    if (theSect2Shape)
+      aBuilder.MakeCompound(ShapeWireWithV);
+
     // Add the vertices to the shape.
     for (Standard_Integer aPN = 1; aPN <= aPointCount; ++aPN)
     {
-      aBuilder.Add(aShape, BRepBuilderAPI_MakeVertex(aPoints->Value(aPN)));
+      TopoDS_Vertex V;
+      aBuilder.MakeVertex(V,aPoints->Value(aPN),Precision::Confusion());
+      aBuilder.Add(aShape, V);
+      if (theSect2Shape)
+        aBuilder.Add(ShapeWireWithV, V);
     }
 
     // Add the wire to the shape.
@@ -327,6 +337,11 @@ void CurveCreator_Utils::constructShape(
     if (!aWire.IsNull())
     {
       aBuilder.Add(aShape, aWire);
+      if (theSect2Shape)
+      {
+        aBuilder.Add(ShapeWireWithV, aWire);
+        (*theSect2Shape).Add(aSectionI, ShapeWireWithV);
+      }
     }
   }
   theShape = aShape;
@@ -345,9 +360,36 @@ struct Section3D
   Handle(TColgp_HArray1OfPnt) myPoints;
 };
 
+Quantity_Color CurveCreator_Utils::getRandColor()
+{
+  float aHue = ( rand()%1000 ) * 0.001f;
+
+  QColor aColor;
+  aColor.setHsl( (int)(aHue*255.), 200, 128 );
+  int r = aColor.red();
+  int g = aColor.green();
+  int b = aColor.blue();
+
+  double r1 = r / 255.0;
+  double g1 = g / 255.0;
+  double b1 = b / 255.0;
+  return Quantity_Color( r1, g1, b1, Quantity_TOC_RGB );
+}
+
+Quantity_Color CurveCreator_Utils::colorConv(QColor color)
+{
+  return  Quantity_Color( color.red() / 255.,
+    color.green() / 255., color.blue() / 255., Quantity_TOC_RGB );
+}
+
+QColor CurveCreator_Utils::colorConv(Quantity_Color color)
+{
+  return QColor( (int)( color.Red() * 255 ), (int)( color.Green() * 255 ), (int)( color.Blue() * 255 ) );
+}
+
 //=======================================================================
 // function : constructCurve
-// purpose  : 
+// purpose  :
 //=======================================================================
 bool CurveCreator_Utils::constructCurve
                       (const TopoDS_Shape        theShape,
@@ -517,7 +559,7 @@ bool CurveCreator_Utils::constructCurve
       CurveCreator::Spline : CurveCreator::Polyline;
 
     theCurve->addSectionInternal(aSecName, aSecType,
-                                 aSecIt->myIsClosed, aCoords);
+                                 aSecIt->myIsClosed, aCoords, Quantity_NOC_RED);
   }
 
   // Set the local coordinate system.
@@ -625,7 +667,7 @@ void CurveCreator_Utils::setSelectedPoints( Handle(AIS_InteractiveContext) theCo
   {
   for ( NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator selIter( selected );
         selIter.More(); selIter.Next() )
-  {    
+  {
     const Handle(SelectMgr_SensitiveEntity) aHSenEntity = selIter.Value();
     if( aHSenEntity.IsNull() )
       continue;
@@ -820,7 +862,7 @@ bool CurveCreator_Utils::isEqualPoints( const gp_Pnt& thePoint, const gp_Pnt& th
 
 //=======================================================================
 // function : getPoints
-// purpose  : 
+// purpose  :
 //=======================================================================
 Handle(TColgp_HArray1OfPnt) CurveCreator_Utils::getPoints
                   (const TopoDS_Shape &theShape,
@@ -909,7 +951,7 @@ Handle(TColgp_HArray1OfPnt) CurveCreator_Utils::getPoints
     }
 
     IsClosed = aV[0].IsSame(aV[1]) ? true : false;
-    
+
     Standard_Integer aNbPoints = aBSplCurve->NbKnots();
     TColStd_Array1OfReal aKnots(1, aNbPoints);
     aBSplCurve->Knots(aKnots);
@@ -979,7 +1021,7 @@ Handle(TColgp_HArray1OfPnt) CurveCreator_Utils::getPoints
 }
 //=======================================================================
 // function : FindPlane
-// purpose  : 
+// purpose  :
 //=======================================================================
 void CurveCreator_Utils::FindPlane
                        (const Handle(TColgp_HArray1OfPnt) &thePoints,
index d7a022f63e0ae80950f569bf863ff0e0937cb9f8..1a961b6e6a535e53359733493f975b8004e88d03 100644 (file)
 #include <TopoDS_Wire.hxx>
 #include <TColgp_HArray1OfPnt.hxx>
 #include <Geom_BSplineCurve.hxx>
+#include <QColor>
 
 #include <list>
 #include <vector> // TODO: remove
+#include <NCollection_IndexedDataMap.hxx>
 
 class CurveCreator_Curve;
 
@@ -55,6 +57,21 @@ public:
                                                        Handle(V3d_View) theView,
                                                        int& x, int& y );
 
+  /**
+  * Generates a random color
+  */
+  CURVECREATOR_EXPORT static Quantity_Color getRandColor();
+
+  /**
+  * Convert QColor to Quantity_Color
+  */
+  CURVECREATOR_EXPORT static Quantity_Color colorConv(QColor color);
+
+  /**
+  * Convert Quantity_Color to QColor
+  */
+  CURVECREATOR_EXPORT static QColor colorConv(Quantity_Color color);
+
   /*!
    * \brief Returns the point clicked in 3D view.
    *
@@ -70,9 +87,11 @@ public:
    * Generates shape on the curve
    * \param theCurve a curve object, that contains data
    * \param theShape a generated shape
+   * \param Sect2Shape optional out map: section to constructed shape (wire+vertices)
    */
   CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve,
-                                                  TopoDS_Shape& theShape );
+                                                  TopoDS_Shape& theShape,
+                                                  NCollection_IndexedDataMap<int, TopoDS_Shape>* Sect2Shape = NULL);
 
   /**
    * Generates a curve from a shape.
index 5be3e4a5c87f6e05c3e69c557a3cc4de71d24031..a6aff1fb64d1e736dac4fe10e2bc33b13f1a8a9f 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "CurveCreator.hxx"
 #include <gp_Pnt.hxx>
+#include <TopoDS_Shape.hxx>
 
 const double LOCAL_SELECTION_TOLERANCE = 0.0001;
 
index b853429caaec690f4f8e38d1cf9eef25c2017684..c2f409ed9758e8104ca4ccbd54e5eb8112cef858 100644 (file)
 #include "CurveCreator_UtilsICurve.hxx"
 #include "CurveCreator_TableView.h"
 
+#include "CurveCreator_Curve.hxx"
+#include "CurveCreator_Section.hxx"
+#include <QColorDialog>
+
 #include <SUIT_Session.h>
 #include <SUIT_Desktop.h>
 #include <SUIT_ResourceMgr.h>
 #include <SUIT_ViewManager.h>
 
+#include <TopExp_Explorer.hxx>
+#include "CurveCreator_ShapeFilter.hxx"
+
 #include <OCCViewer_ViewManager.h>
 #include <OCCViewer_ViewPort3d.h>
 #include <OCCViewer_Utilities.h>
@@ -97,7 +104,10 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
 
   QGroupBox* aSectionGroup = new QGroupBox(tr("SECTION_GROUP_TITLE"),this);
 
-  mySectionView = new CurveCreator_TreeView(myCurve, aSectionGroup);
+
+  bool toDrawSectColor = !(theActionFlags & DisableSetColor);
+
+  mySectionView = new CurveCreator_TreeView(myCurve, aSectionGroup, toDrawSectColor);
   mySectionView->setSelectionMode( QTreeView::ExtendedSelection );
   connect( mySectionView, SIGNAL(selectionChanged()), this, SLOT( onSelectionChanged() ) );
   connect( mySectionView, SIGNAL(sectionEntered(int)), this, SLOT(onEditSection(int)) );
@@ -124,20 +134,21 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
   QPixmap aBringTogetherPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_BRING_TOGETHER")));
   QPixmap aStepUpPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_UP")));
   QPixmap aStepDownPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_DOWN")));
+  QPixmap aSetColorPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_SETCOLOR")));
 
-  QAction* anAct = createAction( UNDO_ID, tr("UNDO"), anUndoPixmap, tr("UNDO_TLT"), 
+  QAction* anAct = createAction( UNDO_ID, tr("UNDO"), anUndoPixmap, tr("UNDO_TLT"),
                                  QKeySequence(Qt::ControlModifier|Qt::Key_Z) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onUndo()) );
   aTB->addAction(anAct);
 
-  anAct = createAction( REDO_ID, tr("REDO"), aRedoPixmap, tr("REDO_TLT"), 
+  anAct = createAction( REDO_ID, tr("REDO"), aRedoPixmap, tr("REDO_TLT"),
                         QKeySequence(Qt::ControlModifier|Qt::Key_Y) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onRedo()) );
   aTB->addAction(anAct);
 
   aTB->addSeparator();
-  
-  anAct = createAction( NEW_SECTION_ID, tr("NEW_SECTION"), aNewSectionPixmap, tr("NEW_SECTION_TLT"), 
+
+  anAct = createAction( NEW_SECTION_ID, tr("NEW_SECTION"), aNewSectionPixmap, tr("NEW_SECTION_TLT"),
                         QKeySequence(Qt::ControlModifier|Qt::Key_N) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onNewSection()) );
   if ( !(theActionFlags & DisableNewSection) ) {
@@ -145,21 +156,21 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
     aTB->addSeparator();
   }
 
-  anAct = createAction( ADDITION_MODE_ID, tr("ADDITION_MODE"), aNewPointPixmap, tr("ADDITION_MODE_TLT"), 
+  anAct = createAction( ADDITION_MODE_ID, tr("ADDITION_MODE"), aNewPointPixmap, tr("ADDITION_MODE_TLT"),
                         QKeySequence() );
   anAct->setCheckable(true);
   connect(anAct, SIGNAL(triggered(bool)), this, SLOT(onAdditionMode(bool)) );
   connect(anAct, SIGNAL(toggled(bool)), this, SLOT(onModeChanged(bool)) );
   aTB->addAction(anAct);
-  
-  anAct = createAction( MODIFICATION_MODE_ID, tr("MODIFICATION_MODE"), anEditPointsPixmap, tr("MODIFICATION_MODE_TLT"), 
+
+  anAct = createAction( MODIFICATION_MODE_ID, tr("MODIFICATION_MODE"), anEditPointsPixmap, tr("MODIFICATION_MODE_TLT"),
                         QKeySequence() );
   anAct->setCheckable(true);
   connect(anAct, SIGNAL(triggered(bool)), this, SLOT(onModificationMode(bool)) );
   connect(anAct, SIGNAL(toggled(bool)), this, SLOT(onModeChanged(bool)) );
   aTB->addAction(anAct);
 
-  anAct = createAction( DETECTION_MODE_ID, tr("DETECTION_MODE"), aDetectPointsPixmap, tr("DETECTION_MODE_TLT"), 
+  anAct = createAction( DETECTION_MODE_ID, tr("DETECTION_MODE"), aDetectPointsPixmap, tr("DETECTION_MODE_TLT"),
                         QKeySequence() );
   anAct->setCheckable(true);
   connect(anAct, SIGNAL(triggered(bool)), this, SLOT(onDetectionMode(bool)) );
@@ -167,32 +178,39 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
 //  if ( !(theActionFlags & DisableDetectionMode) ) {
 //    aTB->addAction(anAct);
 //  }
-  
-  anAct = createAction( CLOSE_SECTIONS_ID, tr("CLOSE_SECTIONS"), QPixmap(), tr("CLOSE_SECTIONS_TLT"), 
+
+  anAct = createAction( CLOSE_SECTIONS_ID, tr("CLOSE_SECTIONS"), QPixmap(), tr("CLOSE_SECTIONS_TLT"),
                         QKeySequence(Qt::ControlModifier|Qt::Key_W) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onCloseSections()) );
 
-  anAct = createAction( UNCLOSE_SECTIONS_ID, tr("UNCLOSE_SECTIONS"), QPixmap(), 
+  anAct = createAction( UNCLOSE_SECTIONS_ID, tr("UNCLOSE_SECTIONS"), QPixmap(),
                         tr("UNCLOSE_SECTIONS_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_S) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onUncloseSections()) );
 
-  anAct = createAction( SET_SECTIONS_POLYLINE_ID, tr("SET_SECTIONS_POLYLINE"), 
-                        aPolylinePixmap, tr("SET_SECTIONS_POLYLINE_TLT"), 
+  anAct = createAction( SET_SECTIONS_POLYLINE_ID, tr("SET_SECTIONS_POLYLINE"),
+                        aPolylinePixmap, tr("SET_SECTIONS_POLYLINE_TLT"),
                         QKeySequence(Qt::ControlModifier|Qt::Key_E) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onSetPolyline()) );
 
-  anAct = createAction( SET_SECTIONS_SPLINE_ID, tr("SET_SECTIONS_SPLINE"), aSplinePixmap, 
+  anAct = createAction( SET_SECTIONS_SPLINE_ID, tr("SET_SECTIONS_SPLINE"), aSplinePixmap,
                         tr("SET_SECTIONS_SPLINE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_R) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onSetSpline()) );
 
   aTB->addSeparator();
 
-  anAct = createAction( REMOVE_ID, tr("REMOVE"), aRemovePixmap, tr("REMOVE_TLT"), 
+  anAct = createAction( REMOVE_ID, tr("REMOVE"), aRemovePixmap, tr("REMOVE_TLT"),
                         QKeySequence(Qt::ControlModifier|Qt::Key_Delete ) );
   connect(anAct, SIGNAL(triggered()), this, SLOT(onRemove()) );
   aTB->addAction(anAct);
-  
-  anAct = createAction( JOIN_ID, tr("JOIN"), aJoinPixmap, tr("JOIN_TLT"), 
+
+  anAct = createAction( SETCOLOR_ID, tr("SETCOLOR"), aSetColorPixmap, tr("SETCOLOR_TLT"),
+                        QKeySequence(Qt::ControlModifier|Qt::Key_C ) );
+  connect(anAct, SIGNAL(triggered()), this, SLOT(onSetColor()) );
+
+  if ( !(theActionFlags & DisableSetColor) )
+    aTB->addAction(anAct);
+
+  anAct = createAction( JOIN_ID, tr("JOIN"), aJoinPixmap, tr("JOIN_TLT"),
                         QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) );
   connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) );
   aTB->addAction(anAct);
@@ -202,11 +220,11 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
   connect( anAct, SIGNAL(triggered()), this, SLOT(onBringTogether()) );
   aTB->addAction(anAct);
 
-  anAct = createAction( CLEAR_ALL_ID, tr("CLEAR_ALL"), QPixmap(), tr("CLEAR_ALL_TLT"), 
+  anAct = createAction( CLEAR_ALL_ID, tr("CLEAR_ALL"), QPixmap(), tr("CLEAR_ALL_TLT"),
                         QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Delete ) );
   connect( anAct, SIGNAL(triggered()), this, SLOT( onClearAll()) );
 
-  anAct = createAction( JOIN_ALL_ID, tr("JOIN_ALL"), QPixmap(), tr("JOIN_ALL_TLT"), 
+  anAct = createAction( JOIN_ALL_ID, tr("JOIN_ALL"), QPixmap(), tr("JOIN_ALL_TLT"),
                         QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Plus ) );
   connect( anAct, SIGNAL(triggered()), this, SLOT(onJoinAll()) );
 
@@ -305,7 +323,7 @@ OCCViewer_ViewPort3d* CurveCreator_Widget::getViewPort()
   OCCViewer_Viewer* aViewer = getOCCViewer();
   if ( aViewer )
     aViewPort = ((OCCViewer_ViewWindow*)aViewer->getViewManager()->getActiveView())->getViewPort();
-    
+
   return aViewPort;
 }
 
@@ -349,6 +367,11 @@ void CurveCreator_Widget::onSelectionChanged()
   updateActionsStates();
   updateUndoRedo();
   emit selectionChanged();
+  QList<int> selectedSections = mySectionView->getSelectedSections();
+  CurveCreator_Curve* Curve =  ((CurveCreator_Curve*)myCurve);
+  Curve->myCurSectInd.clear();
+  foreach (int sectInd, selectedSections)
+    Curve->myCurSectInd.push_back(sectInd);
 }
 
 void CurveCreator_Widget::updateActionsStates()
@@ -359,6 +382,8 @@ void CurveCreator_Widget::updateActionsStates()
     if ( removeEnabled() )
       anEnabledAct << REMOVE_ID;
     QList<int> aSelSections = mySectionView->getSelectedSections();
+    if (aSelSections.size() == 1)
+      anEnabledAct << SETCOLOR_ID;
     CurveCreator_TreeView::SelectionType aSelType = mySectionView->getSelectionType();
     switch( aSelType ){
     case CurveCreator_TreeView::ST_NOSEL:{
@@ -434,7 +459,7 @@ void CurveCreator_Widget::updateActionsStates()
     default:
       break;
     }
-    
+
     /*int aSelObjsCnt = aSelPoints.size() + aSelSections.size();
     if( aSelObjsCnt > 0 ){
       anEnabledAct << REMOVE_ID;
@@ -601,7 +626,7 @@ void CurveCreator_Widget::onEditSection( int theSection )
 {
   if( !myCurve )
     return;
-  
+
   stopActionMode();
   mySection = theSection;
   QString aSectName = QString::fromStdString( myCurve->getSectionName(theSection));
@@ -689,6 +714,31 @@ void CurveCreator_Widget::onRemove()
   }
 }
 
+void CurveCreator_Widget::onSetColor()
+{
+  if( !myCurve )
+    return;
+
+  QList<int> aSections = mySectionView->getSelectedSections();
+  if (aSections.size() != 1)
+    return;
+
+  int aSectNum = aSections[0];
+  Quantity_Color aColor = ((CurveCreator_Curve*)myCurve)->getColorSection( aSectNum );;
+
+  QColor aQColor = CurveCreator_Utils::colorConv(aColor);
+  QColor aNewQColor = QColorDialog::getColor( aQColor, this );
+  if( !aNewQColor.isValid() )
+    return;
+
+  Quantity_Color aNewColor = CurveCreator_Utils::colorConv(aNewQColor);
+
+  ((CurveCreator_Curve*)myCurve)->setColorSection( aSectNum, aNewColor);
+
+  updateUndoRedo();
+}
+
+
 void CurveCreator_Widget::onClearAll()
 {
   if( !myCurve )
@@ -971,7 +1021,7 @@ void CurveCreator_Widget::addCoordsByClick( QMouseEvent* pe )
     if ( ic.IsNull() )
       return;
 
-    gp_Pnt aPnt;    
+    gp_Pnt aPnt;
     OCCViewer_ViewPort3d* vp = getViewPort();
 
     aPnt = CurveCreator_Utils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
@@ -1098,7 +1148,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
         aCtx->ClearSelected( Standard_True );
     }
     return;
-  } 
+  }
   if (theEvent->button() != Qt::LeftButton) return;
   if (!theWindow->inherits("OCCViewer_ViewWindow")) return;
 
@@ -1122,6 +1172,28 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
     Handle(V3d_View) aView3d = aView->getViewPort()->getView();
     if ( !aView3d.IsNull() )
     {
+      CurveCreator_Curve* Curve =  ((CurveCreator_Curve*)myCurve);
+      //if (!Curve->myCurSectInd.empty())
+      //{
+        aCtx->RemoveFilters();
+        Handle(CurveCreator_ShapeFilter) filter = new CurveCreator_ShapeFilter();
+        for (int i=0; i<Curve->myCurSectInd.size(); i++)
+        {
+          int sectInd = Curve->myCurSectInd[i];
+          const TopoDS_Shape& W = Curve->mySect2Shape(sectInd+1);
+          TopExp_Explorer exp(W, TopAbs_VERTEX);
+          for (;exp.More();exp.Next())
+            filter->AddShape(exp.Current());
+        }
+        aCtx->AddFilter(filter);
+        if (aCtx->HasOpenedContext())
+        {
+          Handle(AIS_LocalContext) aLctx = aCtx->LocalContext();
+          aLctx->Filter()->Clear();
+          aLctx->AddFilter(filter);
+        }
+      //}
+
       // Initialize the single selection if start and end points are equal,
       // otherwise a rectangular selection.
       if ( myStartPoint == myEndPoint )
@@ -1171,7 +1243,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
             if ( aCoords.size() < 2 ) {
               continue;
             }
-            
+
             CurveCreator_ICurve::SectionToPoint aSectionToPoint = std::make_pair( aSectionId, aPointId );
 
             if ( !anInitialDragPointsCoords.contains( aSectionToPoint ) ) {
@@ -1179,7 +1251,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
             }
           }
         }
-        
+
         // Apply points sorting
         CurveCreator_ICurve::SectionToPointList aPoints;
         startCurveModification( aPoints, false );
@@ -1199,7 +1271,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
         }
 
         myCurve->setSeveralPoints( aCoordList, false );
-    
+
         finishCurveModification( aDraggedPoints );
       } else {
         // if the drag of some points has happened, restore the drag selection
@@ -1391,7 +1463,7 @@ void CurveCreator_Widget::insertPointToSelectedSegment( const int theX,
   }
 
   int anInsertPos = -1;
-  int aLastPoint = myCurve->getNbPoints( aSectionId )-1; 
+  int aLastPoint = myCurve->getNbPoints( aSectionId )-1;
   if ( ( aPoint1Id == aLastPoint && aPoint2Id == 0 ) ||
        ( aPoint2Id == aLastPoint && aPoint1Id == 0 ) )
     anInsertPos = -1; // if the section happens between first and last points
@@ -1442,9 +1514,9 @@ void CurveCreator_Widget::moveSelectedPoints( const int theXPosition,
 
     aChangedPos[0] = aChangedPos[0] - aXDelta;
     aChangedPos[1] = aChangedPos[1] - anYDelta;
-    
+
     aCoordList.push_back(
-      std::make_pair(std::make_pair( aSectionId, aPointId ), 
+      std::make_pair(std::make_pair( aSectionId, aPointId ),
                      aChangedPos ));
   }
   myCurve->setSeveralPoints( aCoordList, false );
@@ -1477,7 +1549,7 @@ void CurveCreator_Widget::updateLocalPointView()
 }
 
 /**
- * 
+ *
  */
 void CurveCreator_Widget::setLocalPointContext( const bool theOpen, const bool isUpdateTable )
 {
index 12ea2ec007c16c54dbb78ec5aa1ad7be742cf8a5..3819c62e4e26070f7c6bc996e3928e22fd16f22d 100644 (file)
@@ -56,7 +56,8 @@ public:
     NoFlags              = 0x00000000,
     DisableDetectionMode = 0x00000001,
     DisableNewSection    = 0x00000002,
-    DisableClosedSection = 0x00000004
+    DisableClosedSection = 0x00000004,
+    DisableSetColor      = 0x00000008
   };
 
   enum ActionMode {
@@ -119,6 +120,7 @@ public slots:
   void     onJoin();
   void     onBringTogether();
   void     onRemove();
+  void     onSetColor();
   void     onClearAll();
   void     onJoinAll();
   void     onSetSpline();
@@ -146,23 +148,24 @@ protected:
 
 protected:
   enum ActionId{ NONE_ID,
-                 UNDO_ID, 
-                 REDO_ID, 
-                 NEW_SECTION_ID, 
-                 ADDITION_MODE_ID, 
-                 REMOVE_ID, 
-                 REMOVE_ALL_ID, 
+                 UNDO_ID,
+                 REDO_ID,
+                 NEW_SECTION_ID,
+                 ADDITION_MODE_ID,
+                 REMOVE_ID,
+                 REMOVE_ALL_ID,
                  JOIN_ID,
-                 JOIN_ALL_ID, 
-                 CLOSE_SECTIONS_ID, 
+                 JOIN_ALL_ID,
+                 CLOSE_SECTIONS_ID,
                  UNCLOSE_SECTIONS_ID,
-                 SET_SECTIONS_POLYLINE_ID, 
-                 SET_SECTIONS_SPLINE_ID, 
-                 CLEAR_ALL_ID, 
-                 SEPARATOR_ID, 
-                 MODIFICATION_MODE_ID, 
+                 SET_SECTIONS_POLYLINE_ID,
+                 SET_SECTIONS_SPLINE_ID,
+                 CLEAR_ALL_ID,
+                 SEPARATOR_ID,
+                 MODIFICATION_MODE_ID,
                  DETECTION_MODE_ID,
-                 BRING_TOGETHER_ID
+                 BRING_TOGETHER_ID,
+                 SETCOLOR_ID
   };
 
 public:
@@ -193,7 +196,7 @@ private:
 
   void startCurveModification( CurveCreator_ICurve::SectionToPointList& thePoints,
                                const bool theFillPoints = true );
-  void finishCurveModification( const CurveCreator_ICurve::SectionToPointList& thePoints = 
+  void finishCurveModification( const CurveCreator_ICurve::SectionToPointList& thePoints =
                                       CurveCreator_ICurve::SectionToPointList() );
 
   // curve algorithm
index 4b1c19571d8d41262e7088c7fb5cee0736c59704..03ffd98e9e2ef25b5d77f3e0387a22dbf5047275 100644 (file)
             <source>ICON_CC_UNDO</source>
             <translation>undo.png</translation>
         </message>
+        <message>
+            <source>ICON_CC_SETCOLOR</source>
+            <translation>setcolor.png</translation>
+        </message>
         <message>
             <source>ICON_FOLDER</source>
             <translation>folder.png</translation>
index 7826f6e224e313bc8097bdf70db4d95612930b67..abc4146e74f9981542b146a70b4549550450c342 100644 (file)
@@ -6103,6 +6103,14 @@ shells and solids on the other hand.</translation>
         <source>SET_SECTIONS_SPLINE_TLT</source>
         <translation>Set selected section type to spline</translation>
     </message>
+    <message>
+        <source>SETCOLOR</source>
+        <translation>Set color</translation>
+    </message>
+    <message>
+        <source>SETCOLOR_TLT</source>
+        <translation>Set color</translation>
+    </message>
     <message>
         <source>REMOVE</source>
         <translation>Remove</translation>