dist_admlocalm4_DATA = \
check_GEOM.m4 \
check_GUI.m4 \
-check_OpenCV.m4
+check_OpenCV.m4 \
+check_CurveCreator.m4
--- /dev/null
+dnl Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+dnl
+dnl This library is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Lesser General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2.1 of the License.
+dnl
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl Lesser General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU Lesser General Public
+dnl License along with this library; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+dnl
+dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+dnl
+
+dnl File : check_CurveCreator.m4
+dnl Author : Sergey KHROMOV
+dnl
+AC_DEFUN([USE_CURVECREATOR],[
+
+CPPFLAGS="-DUSE_CURVE_CREATOR $CPPFLAGS"
+
+])dnl
AC_SUBST(SETX) SETX="set -x"
fi
+if test "${SalomeGUI_need}" != "no"; then
+ USE_CURVECREATOR
+fi
+
echo
echo ---------------------------------------------
echo generating Makefiles and configure files
src/GEOM_SWIG_WITHIHM/Makefile \
src/GEOM_PY/Makefile \
src/GEOM_PY/structelem/Makefile \
+ src/CurveCreator/Makefile \
src/GenerationGUI/Makefile \
src/GroupGUI/Makefile \
src/IGESExport/Makefile \
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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.hxx
+// Created: Tue Jun 25 16:34:39 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_HeaderFile
+#define _CurveCreator_HeaderFile
+
+
+#include <deque>
+
+
+namespace CurveCreator
+{
+
+ //! Dimension of the curve
+ enum Dimension
+ {
+ Dim2d = 2,
+ Dim3d = 3
+ };
+
+ //! Type of the section
+ enum Type
+ {
+ Polyline,
+ BSpline
+ };
+
+ //! Points coordinates
+ typedef float TypeCoord;
+
+ typedef std::deque<TypeCoord> Coordinates;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Curve.cxx
+// Created: Thu Jun 20 9:54:07 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_Curve.hxx>
+#include <CurveCreator_Section.hxx>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_Curve::CurveCreator_Curve
+ (const CurveCreator::Dimension theDimension)
+: myIsLocked (false),
+ myDimension (theDimension)
+{
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_Curve::~CurveCreator_Curve()
+{
+ // Delete all allocated data.
+ clear();
+}
+
+//=======================================================================
+// function: isLocked
+// purpose:
+//=======================================================================
+bool CurveCreator_Curve::isLocked() const
+{
+ return myIsLocked;
+}
+
+//=======================================================================
+// function: getDimension
+// purpose:
+//=======================================================================
+CurveCreator::Dimension CurveCreator_Curve::getDimension() const
+{
+ return myDimension;
+}
+
+//=======================================================================
+// function: getNbPoints
+// purpose:
+//=======================================================================
+int CurveCreator_Curve::getNbPoints(const int theISection) const
+{
+ int aNbCoords = 0;
+
+ if (theISection == -1) {
+ int i = 0;
+ const int aNbSections = getNbSections();
+
+ for (; i < aNbSections; i++) {
+ aNbCoords += mySections[i]->myPoints.size();
+ }
+ } else {
+ aNbCoords = mySections.at(theISection)->myPoints.size();
+ }
+
+ return aNbCoords/myDimension;
+}
+
+//=======================================================================
+// function: getNbSections
+// purpose:
+//=======================================================================
+int CurveCreator_Curve::getNbSections() const
+{
+ return mySections.size();
+}
+
+//=======================================================================
+// function: getCoordinates
+// purpose:
+//=======================================================================
+CurveCreator::Coordinates CurveCreator_Curve::getCoordinates
+ (const int theISection, const int theIPnt) const
+{
+ CurveCreator_Section *aSection = mySections.at(theISection);
+ CurveCreator::Coordinates::const_iterator
+ anIter = aSection->myPoints.begin() + toICoord(theIPnt);
+ CurveCreator::Coordinates aResult(anIter, anIter + myDimension);
+
+ return aResult;
+}
+
+//=======================================================================
+// function: getType
+// purpose:
+//=======================================================================
+CurveCreator::Type CurveCreator_Curve::getType(const int theISection) const
+{
+ return mySections.at(theISection)->myType;
+}
+
+//=======================================================================
+// function: getPoints
+// purpose:
+//=======================================================================
+const CurveCreator::Coordinates &CurveCreator_Curve::getPoints
+ (const int theISection) const
+{
+ return mySections.at(theISection)->myPoints;
+}
+
+//=======================================================================
+// function: isClosed
+// purpose:
+//=======================================================================
+bool CurveCreator_Curve::isClosed(const int theISection) const
+{
+ return mySections.at(theISection)->myIsClosed;
+}
+
+//=======================================================================
+// function: setType
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::setType
+ (const CurveCreator::Type theType, const int theISection)
+{
+ if (theISection == -1) {
+ int i = 0;
+ const int aNbSections = getNbSections();
+
+ for (; i < aNbSections; i++) {
+ mySections[i]->myType = theType;
+ }
+ } else {
+ mySections.at(theISection)->myType = theType;
+ }
+}
+
+//=======================================================================
+// function: addPoints
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::addPoints
+ (const CurveCreator::Coordinates &thePoints, const int theISection)
+{
+ CurveCreator_Section *aSection =
+ (theISection == -1 ? mySections.back() : mySections.at(theISection));
+
+ aSection->myPoints.insert(aSection->myPoints.end(),
+ thePoints.begin(), thePoints.end());
+}
+
+//=======================================================================
+// function: addSection
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::addSection
+ (const CurveCreator::Type theType,
+ const bool theIsClosed,
+ const CurveCreator::Coordinates &thePoints)
+{
+ CurveCreator_Section *aSection = new CurveCreator_Section;
+
+ aSection->myType = theType;
+ aSection->myIsClosed = theIsClosed;
+ aSection->myPoints = thePoints;
+ mySections.push_back(aSection);
+}
+
+//=======================================================================
+// function: removeSection
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::removeSection(const int theISection)
+{
+ if (theISection == -1) {
+ delete mySections.back();
+ mySections.pop_back();
+ } else {
+ Sections::iterator anIterRm = mySections.begin() + theISection;
+
+ delete *anIterRm;
+ mySections.erase(anIterRm);
+ }
+}
+
+//=======================================================================
+// function: insertPoints
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::insertPoints
+ (const CurveCreator::Coordinates &thePoints,
+ const int theISection,
+ const int theIPnt)
+{
+ if (theIPnt == -1) {
+ // Add points to the end of section points.
+ addPoints(thePoints, theISection);
+ } else {
+ CurveCreator_Section *aSection =
+ (theISection == -1 ? mySections.back() : mySections.at(theISection));
+
+ aSection->myPoints.insert(aSection->myPoints.begin() + toICoord(theIPnt),
+ thePoints.begin(), thePoints.end());
+ }
+}
+
+//=======================================================================
+// function: removePoints
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::removePoints(const int theISection,
+ const int theIPnt,
+ const int theNbPoints)
+{
+ CurveCreator_Section *aSection = mySections.at(theISection);
+ CurveCreator::Coordinates::iterator anIterBegin =
+ aSection->myPoints.begin() + toICoord(theIPnt);
+ CurveCreator::Coordinates::iterator anIterEnd =
+ (theNbPoints == -1 ?
+ aSection->myPoints.end() : anIterBegin + toICoord(theNbPoints));
+
+ aSection->myPoints.erase(anIterBegin, anIterEnd);
+}
+
+//=======================================================================
+// function: clear
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::clear()
+{
+ // Delete all allocated data.
+ int i = 0;
+ const int aNbSections = getNbSections();
+
+ for (; i < aNbSections; i++) {
+ delete mySections[i];
+ }
+
+ mySections.clear();
+}
+
+//=======================================================================
+// function: setCoordinates
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::setCoordinates
+ (const CurveCreator::Coordinates &theCoords,
+ const int theISection,
+ const int theIPnt)
+{
+ if (theCoords.size() == myDimension) {
+ CurveCreator_Section *aSection = mySections.at(theISection);
+ int i;
+
+ for (i = 0; i < myDimension; i++) {
+ aSection->myPoints.at(toICoord(theIPnt) + i) = theCoords[i];
+ }
+ }
+}
+
+//=======================================================================
+// function: setClosed
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::setClosed(const bool theIsClosed,
+ const int theISection)
+{
+ if (theISection == -1) {
+ int aSize = mySections.size();
+ int i;
+
+ for (i = 0; i < aSize; i++) {
+ mySections[i]->myIsClosed = theIsClosed;
+ }
+ } else {
+ mySections.at(theISection)->myIsClosed = theIsClosed;
+ }
+}
+
+//=======================================================================
+// function: moveSection
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::moveSection(const int theISection,
+ const int theNewIndex)
+{
+ if (theISection != theNewIndex) {
+ CurveCreator_Section *aSection = mySections.at(theISection);
+
+ // Remove section
+ Sections::iterator anIter = mySections.begin() + theISection;
+
+ mySections.erase(anIter);
+
+ // Insert section.
+ anIter = mySections.begin() + theNewIndex;
+ mySections.insert(anIter, aSection);
+ }
+}
+
+//=======================================================================
+// function: join
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::join(const int theISectionTo,
+ const int theISectionFrom)
+{
+ if (theISectionTo != theISectionFrom) {
+ CurveCreator_Section *aSection1 = mySections.at(theISectionTo);
+ CurveCreator_Section *aSection2 = mySections.at(theISectionFrom);
+
+ aSection1->myPoints.insert(aSection1->myPoints.end(),
+ aSection2->myPoints.begin(), aSection2->myPoints.end());
+
+ removeSection(theISectionFrom);
+ }
+}
+
+//=======================================================================
+// function: join
+// purpose:
+//=======================================================================
+void CurveCreator_Curve::join()
+{
+ const int aSize = mySections.size();
+
+ if (aSize > 1) {
+ CurveCreator_Section *aSection1 = mySections[0];
+ int i;
+
+ for (i = 1; i < aSize; i++) {
+ CurveCreator_Section *aSection2 = mySections[i];
+
+ aSection1->myPoints.insert(aSection1->myPoints.end(),
+ aSection2->myPoints.begin(), aSection2->myPoints.end());
+ delete aSection2;
+ }
+
+ // Just erace section pointers as they were deleted before.
+ mySections.erase(mySections.begin() + 1, mySections.end());
+ }
+}
+
+//=======================================================================
+// function: toICoord
+// purpose:
+//=======================================================================
+int CurveCreator_Curve::toICoord(const int theIPnt) const
+{
+ return theIPnt*myDimension;
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Curve.hxx
+// Created: Thu Jun 20 9:54:14 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_Curve_HeaderFile
+#define _CurveCreator_Curve_HeaderFile
+
+
+#include <CurveCreator.hxx>
+#include <CurveCreator_Macro.hxx>
+#include <CurveCreator_Operation.hxx>
+
+class CurveCreator_Section;
+
+
+/**
+ * The CurveCreator_Curve object is represented as one or more sets of
+ * connected points; thus CurveCreator_Curve object can contain several
+ * not connected curves (polylines or b-splines), each such curve has two
+ * only ends \96 start and end points \96 in other words non-manifold curves
+ * are not supported.
+ */
+class CURVECREATOR_EXPORT CurveCreator_Curve
+{
+
+ //! List of curves
+ typedef std::deque<CurveCreator_Section *> Sections;
+
+public:
+ //! Constructor of the curve.
+ /** The dimension is explicitly specified in the constructor
+ * and cannot be changed later.
+ */
+ CurveCreator_Curve(const CurveCreator::Dimension theDimension);
+
+ //! Destructor.
+ ~CurveCreator_Curve();
+
+ //! Returns true if this curve is locked by a curve editor.
+ bool isLocked() const;
+
+ //! Get the dimension.
+ CurveCreator::Dimension getDimension() const;
+
+ //! Get number of sections.
+ int getNbSections() const;
+
+ /** Get number of points in specified section or (the total number of points
+ * in Curve if theISection is equal to -1).
+ */
+ int getNbPoints(const int theISection = -1) const;
+
+ //! Get coordinates of specified point
+ CurveCreator::Coordinates getCoordinates
+ (const int theISection, const int theIPnt) const;
+
+ //! Get points of a section.
+ const CurveCreator::Coordinates &getPoints(const int theISection) const;
+
+ //! Get type of the specified section
+ CurveCreator::Type getType(const int theISection) const;
+
+ //! Get \93closed\94 flag of the specified section
+ bool isClosed(const int theISection) const;
+
+protected:
+
+ /** Set type of the specified section (or all sections
+ * if \a theISection is -1).
+ */
+ void setType(const CurveCreator::Type theType, const int theISection = -1);
+
+ /** Add points to the specified section (or last section
+ * if \a theISection is -1).
+ */
+ void addPoints
+ (const CurveCreator::Coordinates &thePoints, const int theISection = -1);
+
+ //! Add a new section.
+ void addSection (const CurveCreator::Type theType,
+ const bool theIsClosed,
+ const CurveCreator::Coordinates &thePoints);
+
+ //! Removes the section. If theISection equals -1, removes the last section.
+ void removeSection(const int theISection = -1);
+
+ /** Insert points in the given position (add to the end of list
+ * if \a theIPnt parameter is -1) of the specified section
+ * (or last section if \a theISection parameter is -1).
+ */
+ void insertPoints(const CurveCreator::Coordinates &thePoints,
+ const int theISection = -1,
+ const int theIPnt = -1);
+
+ /** Remove \a nbPoints points from given \a theISection,
+ * starting from given \a theIPnt (of all points up to the end of
+ * section if \a theNbPoints is -1).
+ */
+ void removePoints(const int theISection,
+ const int theIPnt,
+ const int theNbPoints = -1);
+
+ //! Remove all sections.
+ void clear();
+
+ //! Set coordinates of specified point
+ void setCoordinates(const CurveCreator::Coordinates &theCoords,
+ const int theISection,
+ const int theIPnt);
+
+ /** Set \93closed\94 flag of the specified section (all sections if
+ * \a theISection is -1).
+ */
+ void setClosed(const bool theIsClosed, const int theISection = -1);
+
+ /** Move specified \a theISection to the specified position
+ * in the sections list.
+ */
+ void moveSection(const int theISection, const int theNewIndex);
+
+ //! Join two sections to one section
+ void join(const int theISectionTo, const int theISectionFrom);
+
+ //! Join all sections to the single curve
+ void join();
+
+ /**
+ * This method converts the point index to the index in
+ * an array of coordinates.
+ */
+ int toICoord(const int theIPnt) const;
+
+protected:
+
+ bool myIsLocked;
+ Sections mySections; //!< curve data
+ CurveCreator::Dimension myDimension; //!< curve dimension
+
+ friend class CurveCreator_CurveEditor;
+ friend class CurveCreator_Operation;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_CurveEditor.cxx
+// Created: Mon Jun 24 14:33:50 2013
+// Author: Sergey KHROMOV
+//
+
+#include <CurveCreator_CurveEditor.hxx>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_CurveEditor::CurveCreator_CurveEditor
+ (CurveCreator_Curve* thePCurve)
+ : myNbUndos (0),
+ myNbRedos (0),
+ myPCurve (thePCurve),
+ myUndoDepth (-1)
+{
+ if (myPCurve != NULL) {
+ if (myPCurve->isLocked()) {
+ // This curve is locked by another editor. Invalid case.
+ myPCurve = NULL;
+ } else {
+ // Lock the curve.
+ myPCurve->myIsLocked = true;
+ myCurrenPos = myListDiffs.end();
+ }
+ }
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_CurveEditor::~CurveCreator_CurveEditor()
+{
+ if (myPCurve != NULL) {
+ // Unlock the curve.
+ myPCurve->myIsLocked = false;
+ }
+}
+
+//=======================================================================
+// function: getCurve
+// purpose:
+//=======================================================================
+CurveCreator_Curve *CurveCreator_CurveEditor::getCurve() const
+{
+ return myPCurve;
+}
+
+//=======================================================================
+// function: isAttached
+// purpose:
+//=======================================================================
+bool CurveCreator_CurveEditor::isAttached() const
+{
+ return (myPCurve != NULL);
+}
+
+//=======================================================================
+// function: undo
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::undo()
+{
+ if (myNbUndos > 0) {
+ myNbUndos--;
+ myNbRedos++;
+ myCurrenPos--;
+ myCurrenPos->applyUndo(myPCurve);
+ }
+}
+
+//=======================================================================
+// function: redo
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::redo()
+{
+ if (myNbRedos > 0) {
+ myCurrenPos->applyRedo(myPCurve);
+ myCurrenPos++;
+ myNbRedos--;
+ myNbUndos++;
+ }
+}
+
+//=======================================================================
+// function: getNbUndo
+// purpose:
+//=======================================================================
+int CurveCreator_CurveEditor::getNbUndo() const
+{
+ return myNbUndos;
+}
+
+//=======================================================================
+// function: getNbRedo
+// purpose:
+//=======================================================================
+int CurveCreator_CurveEditor::getNbRedo() const
+{
+ return myNbRedos;
+}
+
+//=======================================================================
+// function: setUndoDepth
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::setUndoDepth(const int theDepth)
+{
+ if (theDepth == 0) {
+ // Reset all undo/redo data.
+ myNbUndos = 0;
+ myNbRedos = 0;
+ myListDiffs.clear();
+ myCurrenPos = myListDiffs.end();
+ myUndoDepth = 0;
+ } else if (theDepth == -1) {
+ // There is nothing to do as the depth become unlimited.
+ myUndoDepth = -1;
+ } else if (theDepth > 0) {
+ // The new "real" depth is set.
+ if (theDepth < myNbRedos) {
+ // The new depth is less then number of redos. Remove the latest redos.
+ int aShift = (myNbRedos - theDepth);
+ ListDiff::iterator aFromPos = myListDiffs.end();
+
+ while (aShift--) {
+ aFromPos--;
+ }
+
+ myListDiffs.erase(aFromPos, myListDiffs.end());
+ myNbRedos = theDepth;
+ }
+
+ if (theDepth < myNbUndos + myNbRedos) {
+ // The new depth is less then the total number of differences.
+ // Remove the first undos.
+ int aShift = (myNbUndos + myNbRedos - theDepth);
+ ListDiff::iterator aToPos = myListDiffs.begin();
+
+ while (aShift--) {
+ aToPos++;
+ }
+
+ myListDiffs.erase(myListDiffs.begin(), aToPos);
+ myNbUndos = theDepth - myNbRedos;
+ }
+
+ myUndoDepth = theDepth;
+ }
+}
+
+//=======================================================================
+// function: getUndoDepth
+// purpose:
+//=======================================================================
+int CurveCreator_CurveEditor::getUndoDepth() const
+{
+ return myUndoDepth;
+}
+
+//=======================================================================
+// function: setType
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::setType(const CurveCreator::Type theType,
+ const int theISection)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::SetType,
+ theType, theISection);
+ }
+
+ // Update the curve.
+ myPCurve->setType(theType, theISection);
+ }
+}
+
+//=======================================================================
+// function: addPoints
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::addPoints
+ (const CurveCreator::Coordinates &thePoints,
+ const int theISection)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::AddPoints,
+ thePoints, theISection);
+ }
+
+ // Update the curve.
+ myPCurve->addPoints(thePoints, theISection);
+ }
+}
+
+//=======================================================================
+// function: addSection
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::addSection
+ (const CurveCreator::Type theType,
+ const bool theIsClosed,
+ const CurveCreator::Coordinates &thePoints)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::AddSection,
+ thePoints, theType, theIsClosed);
+ }
+
+ // Update the curve.
+ myPCurve->addSection(theType, theIsClosed, thePoints);
+ }
+}
+
+//=======================================================================
+// function: removeSection
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::removeSection(const int theISection)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::RemoveSection,
+ theISection);
+ }
+
+ // Update the curve.
+ myPCurve->removeSection(theISection);
+ }
+}
+
+//=======================================================================
+// function: insertPoints
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::insertPoints
+ (const CurveCreator::Coordinates &thePoints,
+ const int theISection,
+ const int theIPnt)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::InsertPoints,
+ thePoints, theISection, theIPnt);
+ }
+
+ // Update the curve.
+ myPCurve->insertPoints(thePoints, theISection, theIPnt);
+ }
+}
+
+//=======================================================================
+// function: removePoints
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::removePoints
+ (const int theISection,
+ const int theIPnt,
+ const int theNbPoints)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::RemovePoints,
+ theISection, theIPnt, theNbPoints);
+ }
+
+ // Update the curve.
+ myPCurve->removePoints(theISection, theIPnt, theNbPoints);
+ }
+}
+
+//=======================================================================
+// function: clear
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::clear()
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::Clear);
+ }
+
+ // Update the curve.
+ myPCurve->clear();
+ }
+}
+
+//=======================================================================
+// function: setCoordinates
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::setCoordinates
+ (const CurveCreator::Coordinates &theCoords,
+ const int theISection,
+ const int theIPnt)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::SetCoordinates,
+ theCoords, theISection, theIPnt);
+ }
+
+ // Update the curve.
+ myPCurve->setCoordinates(theCoords, theISection, theIPnt);
+ }
+}
+
+//=======================================================================
+// function: setClosed
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::setClosed(const bool theIsClosed,
+ const int theISection)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::SetClosed,
+ theIsClosed, theISection);
+ }
+
+ // Update the curve.
+ myPCurve->setClosed(theIsClosed, theISection);
+ }
+}
+
+//=======================================================================
+// function: moveSection
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::moveSection(const int theISection,
+ const int theNewIndex)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::MoveSection,
+ theISection, theNewIndex);
+ }
+
+ // Update the curve.
+ myPCurve->moveSection(theISection, theNewIndex);
+ }
+}
+
+//=======================================================================
+// function: join
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::join(const int theISectionTo,
+ const int theISectionFrom)
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::Join,
+ theISectionTo, theISectionFrom);
+ }
+
+ // Update the curve.
+ myPCurve->join(theISectionTo, theISectionFrom);
+ }
+}
+
+//=======================================================================
+// function: join
+// purpose:
+//=======================================================================
+void CurveCreator_CurveEditor::join()
+{
+ if (myPCurve != NULL) {
+ // Set the difference.
+ if (addEmptyDiff()) {
+ myListDiffs.back().init(myPCurve, CurveCreator_Operation::Join);
+ }
+
+ // Update the curve.
+ myPCurve->join();
+ }
+}
+
+//=======================================================================
+// function: addDiff
+// purpose:
+//=======================================================================
+bool CurveCreator_CurveEditor::addEmptyDiff()
+{
+ bool isEnabled = false;
+
+ if (myUndoDepth != 0) {
+ // Forget all Redos after the current one.
+ if (myNbRedos > 0) {
+ myNbRedos = 0;
+ myListDiffs.erase(myCurrenPos, myListDiffs.end());
+ }
+
+ if (myUndoDepth == -1 || myNbUndos < myUndoDepth) {
+ // Increase the number of undos.
+ myNbUndos++;
+ } else {
+ // If there are too many differences, remove the first one.
+ myListDiffs.pop_front();
+ }
+
+ // Add new difference.
+ myListDiffs.push_back(CurveCreator_Diff());
+ myCurrenPos = myListDiffs.end();
+ isEnabled = true;
+ }
+
+ return isEnabled;
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_CurveEditor.hxx
+// Created: Mon Jun 24 14:33:40 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_CurveEditor_HeaderFile
+#define _CurveCreator_CurveEditor_HeaderFile
+
+#include <list>
+#include <CurveCreator_Diff.hxx>
+#include <CurveCreator_Curve.hxx>
+
+/**
+ * The CurveCreator_CurveEditor is designed to manage of
+ * editing operations of CurveCreator_Curve class.
+ */
+class CURVECREATOR_EXPORT CurveCreator_CurveEditor
+{
+
+private:
+
+ typedef std::list<CurveCreator_Diff> ListDiff;
+
+public:
+
+ //! Constuctor, initialized by the curve object
+ CurveCreator_CurveEditor(CurveCreator_Curve* thePCurve);
+
+ //! Destructor, detaches from the Curve
+ ~CurveCreator_CurveEditor();
+
+ //! Returns the curve.
+ CurveCreator_Curve *getCurve() const;
+
+ //! This method returns true if this editor is attached to a valid curve.
+ bool isAttached() const;
+
+ //! Undo previous operation
+ void undo();
+
+ //! Redo last previously \93undoed\94 operation
+ void redo();
+
+ //! Get number of available undo operations
+ int getNbUndo() const;
+
+ //! Get number of available redo operations
+ int getNbRedo() const;
+
+ //! Set depth of undo operations (unlimited if \a theDepth is -1
+ // or disabled if \a theDepth is 0)
+ void setUndoDepth(const int theDepth = -1);
+
+ //! Get depth of undo operations.
+ int getUndoDepth() const;
+
+ /** Set type of the specified section (or all sections
+ * if \a theISection is -1).
+ */
+ void setType(const CurveCreator::Type theType, const int theISection = -1);
+
+ /** Add points to the specified section (or last section
+ * if \a theISection is -1).
+ */
+ void addPoints(const CurveCreator::Coordinates &thePoints,
+ const int theISection = -1);
+
+ //! Add a new section.
+ void addSection(const CurveCreator::Type theType,
+ const bool theIsClosed,
+ const CurveCreator::Coordinates &thePoints);
+
+ //! Removes the section. If theISection equals -1, removes the last section.
+ void removeSection(const int theISection = -1);
+
+ /** Insert points in the given position (add to the end of list
+ * if \a theIPnt parameter is -1) of the specified section
+ * (or last section if \a theISection parameter is -1).
+ */
+ void insertPoints(const CurveCreator::Coordinates &thePoints,
+ const int theISection = -1,
+ const int theIPnt = -1);
+
+ /** Remove \a nbPoints points from given \a theISection,
+ * starting from given \a theIPnt (of all points up to the end of
+ * section if \a theNbPoints is -1).
+ */
+ void removePoints(const int theISection,
+ const int theIPnt,
+ const int theNbPoints = -1);
+
+ //! Remove all sections.
+ void clear();
+
+ //! Set coordinates of specified point
+ void setCoordinates(const CurveCreator::Coordinates &theCoords,
+ const int theISection,
+ const int theIPnt);
+
+ /** Set \93closed\94 flag of the specified section (all sections if
+ * \a theISection is -1).
+ */
+ void setClosed(const bool theIsClosed, const int theISection = -1);
+
+ /** Move specified \a theISection to the specified position
+ * in the sections list.
+ */
+ void moveSection(const int theISection, const int theNewIndex);
+
+ //! Join two sections to one section
+ void join(const int theISectionTo, const int theISectionFrom);
+
+ //! Join all sections to the single curve
+ void join();
+
+private:
+
+ /** This method updates all undo/redo information required to be updated
+ * after curve modification operation. It returns false if undo/redo
+ * is disabled and true otherwise.
+ */
+ bool addEmptyDiff();
+
+private:
+
+ int myNbUndos;
+ int myNbRedos;
+ ListDiff::iterator myCurrenPos;
+ ListDiff myListDiffs;
+ CurveCreator_Curve* myPCurve;
+ int myUndoDepth;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Diff.cxx
+// Created: Wed Jun 26 10:58:46 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_Diff.hxx>
+#include <CurveCreator_Curve.hxx>
+#include <list>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_Diff::CurveCreator_Diff()
+: myNbUndos (0),
+ myPUndo (NULL),
+ myPRedo (NULL)
+{
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_Diff::~CurveCreator_Diff()
+{
+ clear();
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType)
+{
+ bool isOK = false;
+
+ if (theCurve != NULL) {
+ clear();
+
+ // Set redo.
+ myPRedo = new CurveCreator_Operation;
+
+ if (myPRedo->init(theType)) {
+ isOK = true;
+
+ const int aNbSections = theCurve->getNbSections();
+
+ if (theType == CurveCreator_Operation::Clear) {
+ // Construct undo for Clear command.
+ if (aNbSections > 0) {
+ setNbUndos(aNbSections);
+
+ for (int i = 0; i < aNbSections && isOK; i++) {
+ // Add AddSection command.
+ isOK = addSectionToUndo(theCurve, i, myPUndo[i]);
+ }
+ }
+ } else { // theType == CurveCreator_Operation::Join
+ // Construct undo for Join command.
+ if (aNbSections > 1) {
+ // Add the RemovePoints command to remove points of
+ // the second section fron the first one.
+ const int aNbPoints = theCurve->getNbPoints(0);
+
+ setNbUndos(aNbSections);
+ isOK = myPUndo[0].init(CurveCreator_Operation::RemovePoints,
+ 0, aNbPoints, -1);
+
+ for (int i = 1; i < aNbSections && isOK; i++) {
+ // Add AddSection command.
+ isOK = addSectionToUndo(theCurve, i, myPUndo[i]);
+ }
+ }
+ }
+ }
+
+ if (!isOK) {
+ clear();
+ }
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam)
+{
+ bool isOK = false;
+
+ if (theCurve != NULL) {
+ clear();
+
+ // Set redo.
+ myPRedo = new CurveCreator_Operation;
+
+ if (myPRedo->init(theType, theIntParam)) {
+ // Construct undo for RemoveSection command.
+ // If the last section is removed, one AddSection command is enough.
+ // If not last section is removed, two commands are requred: AddSection
+ // and MoveSection.
+ const int aLastIndex = theCurve->getNbSections() - 1;
+
+ if (theIntParam == aLastIndex) {
+ setNbUndos(1);
+ } else {
+ setNbUndos(2);
+ }
+
+ isOK = addSectionToUndo(theCurve, theIntParam, myPUndo[0]);
+
+ if (isOK && theIntParam != aLastIndex) {
+ isOK = myPUndo[1].init(CurveCreator_Operation::MoveSection,
+ aLastIndex, theIntParam);
+ }
+ }
+
+ if (!isOK) {
+ clear();
+ }
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2)
+{
+ bool isOK = false;
+
+ if (theCurve != NULL) {
+ clear();
+
+ // Set redo.
+ myPRedo = new CurveCreator_Operation;
+
+ if (myPRedo->init(theType, theIntParam1, theIntParam2)) {
+ // Construct undo for different commands.
+ switch (theType) {
+ case CurveCreator_Operation::SetType:
+ case CurveCreator_Operation::SetClosed:
+ isOK = setTypeOrClosedToUndo
+ (theCurve, theType, theIntParam1, theIntParam2);
+ break;
+ case CurveCreator_Operation::MoveSection:
+ setNbUndos(1);
+ isOK = myPUndo[0].init(theType, theIntParam2, theIntParam1);
+ break;
+ case CurveCreator_Operation::Join:
+ {
+ // If the last section is removed, one AddSection command is
+ // enough. If not last section is removed, two commands are
+ // requred: AddSection and MoveSection.
+ const int aLastIndex = theCurve->getNbSections() - 1;
+ const int aNbPoints = theCurve->getNbPoints(theIntParam1);
+
+ if (theIntParam2 == aLastIndex) {
+ setNbUndos(2);
+ } else {
+ setNbUndos(3);
+ }
+
+ isOK = myPUndo[0].init(CurveCreator_Operation::RemovePoints,
+ theIntParam1, aNbPoints, -1);
+
+ if (isOK) {
+ isOK = addSectionToUndo(theCurve, theIntParam2, myPUndo[1]);
+
+ if (isOK && theIntParam2 != aLastIndex) {
+ isOK = myPUndo[2].init(CurveCreator_Operation::MoveSection,
+ aLastIndex, theIntParam2);
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!isOK) {
+ clear();
+ }
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2,
+ const int theIntParam3)
+{
+ bool isOK = false;
+
+ if (theCurve != NULL) {
+ clear();
+
+ // Set redo.
+ myPRedo = new CurveCreator_Operation;
+
+ if (myPRedo->init(theType, theIntParam1, theIntParam2, theIntParam3)) {
+ // Construct undo for RemovePoints command.
+ const CurveCreator::Dimension aDim = theCurve->getDimension();
+ const CurveCreator::Coordinates &aPoints =
+ theCurve->getPoints(theIntParam1);
+ CurveCreator::Coordinates::const_iterator anIterBegin =
+ aPoints.begin() + (aDim*theIntParam2);
+ CurveCreator::Coordinates::const_iterator anIterEnd;
+
+ if (theIntParam3 == -1) {
+ anIterEnd = aPoints.end();
+ } else {
+ anIterEnd = anIterBegin + (aDim*theIntParam3);
+ }
+
+ CurveCreator::Coordinates aPointsToAdd;
+
+ setNbUndos(1);
+ aPointsToAdd.insert(aPointsToAdd.end(), anIterBegin, anIterEnd);
+ isOK = myPUndo[0].init(CurveCreator_Operation::InsertPoints,
+ aPointsToAdd, theIntParam1, theIntParam2);
+ }
+
+ if (!isOK) {
+ clear();
+ }
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const CurveCreator::Coordinates &theCoords,
+ const int theIntParam)
+{
+ bool isOK = false;
+
+ if (theCurve != NULL) {
+ clear();
+
+ // Set redo.
+ myPRedo = new CurveCreator_Operation;
+
+ if (myPRedo->init(theType, theCoords, theIntParam)) {
+ // Construct undo for AddPoints command.
+ const int aSectionInd = getSectionIndex(theCurve, theIntParam);
+ const CurveCreator::Dimension aDim = theCurve->getDimension();
+ const CurveCreator::Coordinates &aPoints =
+ theCurve->getPoints(aSectionInd);
+ const int aNbPoints = (aPoints.size()/aDim);
+
+ setNbUndos(1);
+ isOK = myPUndo[0].init(CurveCreator_Operation::RemovePoints,
+ aSectionInd, aNbPoints, -1);
+ }
+
+ if (!isOK) {
+ clear();
+ }
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const CurveCreator::Coordinates &theCoords,
+ const int theIntParam1,
+ const int theIntParam2)
+{
+ bool isOK = false;
+
+ if (theCurve != NULL) {
+ clear();
+
+ // Set redo.
+ myPRedo = new CurveCreator_Operation;
+
+ if (myPRedo->init(theType, theCoords, theIntParam1, theIntParam2)) {
+ // Construct undo for different commands.
+ switch (theType) {
+ case CurveCreator_Operation::AddSection:
+ setNbUndos(1);
+ isOK = myPUndo[0].init(CurveCreator_Operation::RemoveSection, -1);
+ break;
+ case CurveCreator_Operation::InsertPoints:
+ {
+ const CurveCreator::Dimension aDim = theCurve->getDimension();
+ const int aNbPoints = (theCoords.size()/aDim);
+ const int aSectionInd = getSectionIndex(theCurve, theIntParam1);
+ int aPointInd;
+
+ if (theIntParam2 == -1) {
+ aPointInd = theCurve->getNbPoints(aSectionInd);
+ } else {
+ aPointInd = theIntParam2;
+ }
+
+ setNbUndos(1);
+ isOK = myPUndo[0].init(CurveCreator_Operation::RemovePoints,
+ aSectionInd, aPointInd, aNbPoints);
+ }
+ break;
+ case CurveCreator_Operation::SetCoordinates:
+ {
+ const CurveCreator::Coordinates anOldCoords =
+ theCurve->getCoordinates(theIntParam1, theIntParam2);
+
+ setNbUndos(1);
+ isOK = myPUndo[0].init(CurveCreator_Operation::SetCoordinates,
+ anOldCoords, theIntParam1, theIntParam2);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!isOK) {
+ clear();
+ }
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: applyUndo
+// purpose:
+//=======================================================================
+void CurveCreator_Diff::applyUndo(CurveCreator_Curve *theCurve)
+{
+ if (myNbUndos > 0 && myPUndo != NULL) {
+ for (int i = 0; i < myNbUndos; i++) {
+ myPUndo[i].apply(theCurve);
+ }
+ }
+}
+
+//=======================================================================
+// function: applyRedo
+// purpose:
+//=======================================================================
+void CurveCreator_Diff::applyRedo(CurveCreator_Curve *theCurve)
+{
+ if (myPRedo != NULL) {
+ myPRedo->apply(theCurve);
+ }
+}
+
+//=======================================================================
+// function: clear
+// purpose:
+//=======================================================================
+void CurveCreator_Diff::clear()
+{
+ if (myPUndo != NULL) {
+ delete [] myPUndo;
+ myPUndo = NULL;
+ }
+
+ myNbUndos = 0;
+
+ if (myPRedo != NULL) {
+ delete myPRedo;
+ myPRedo = NULL;
+ }
+}
+
+//=======================================================================
+// function: setNbUndos
+// purpose:
+//=======================================================================
+void CurveCreator_Diff::setNbUndos(const int theNbUndos)
+{
+ myNbUndos = theNbUndos;
+ myPUndo = new CurveCreator_Operation[myNbUndos];
+}
+
+//=======================================================================
+// function: getSectionIndex
+// purpose:
+//=======================================================================
+int CurveCreator_Diff::getSectionIndex(const CurveCreator_Curve *theCurve,
+ const int theIndex) const
+{
+ return (theIndex == -1 ? theCurve->getNbSections() - 1 : theIndex);
+}
+
+//=======================================================================
+// function: addSectionToUndo
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::addSectionToUndo
+ (const CurveCreator_Curve *theCurve,
+ const int theIndex,
+ CurveCreator_Operation &theOperation) const
+{
+ const CurveCreator::Coordinates &aPnts = theCurve->getPoints(theIndex);
+ const CurveCreator::Type aType = theCurve->getType(theIndex);
+ const bool isClosed = theCurve->isClosed(theIndex);
+
+ bool isOK = theOperation.init(CurveCreator_Operation::AddSection,
+ aPnts, aType, isClosed);
+
+ return isOK;
+}
+
+//=======================================================================
+// function: setTypeOrClosedToUndo
+// purpose:
+//=======================================================================
+bool CurveCreator_Diff::setTypeOrClosedToUndo
+ (const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2)
+{
+ bool isOK = true;
+
+ // Compute number of modified sections.
+ const bool isSetType = (theType == CurveCreator_Operation::SetType);
+ int aNbModif = 0;
+ std::list<int> aListOfInd;
+ int aValue;
+ int i;
+
+ if (theIntParam2 == -1) {
+ // The operation is applied to all sections. We need to collect
+ // really modified sections for undo.
+ const int aNbSections = theCurve->getNbSections();
+
+ if (aNbSections > 0) {
+ // Get sections to be modified.
+ for (i = 0; i < aNbSections; i++) {
+ if (isSetType) {
+ aValue = theCurve->getType(i);
+ } else {
+ aValue = theCurve->isClosed(i);
+ }
+
+ if (theIntParam1 != aValue) {
+ aNbModif++;
+ aListOfInd.push_back(i);
+ }
+ }
+
+ if (aNbSections == aNbModif) {
+ // All sections are modified. We can use one single command
+ // with -1 section index.
+ aNbModif = 1;
+ aListOfInd.clear();
+ aListOfInd.push_back(-1);
+ }
+ }
+ } else {
+ // There is only particular section modified.
+ // Check if there is a real modification required.
+ if (isSetType) {
+ aValue = theCurve->getType(theIntParam2);
+ } else {
+ aValue = theCurve->isClosed(theIntParam2);
+ }
+
+ if (theIntParam1 != aValue) {
+ aNbModif = 1;
+ aListOfInd.push_back(theIntParam2);
+ }
+ }
+
+ if (aNbModif > 0) {
+ // Store the undos
+ std::list<int>::iterator anIter = aListOfInd.begin();
+
+ if (isSetType) {
+ aValue = theCurve->getType(*anIter);
+ } else {
+ aValue = theCurve->isClosed(*anIter);
+ }
+
+ setNbUndos(aNbModif);
+
+ for (i = 0; anIter != aListOfInd.end() && isOK; i++, anIter++) {
+ isOK = myPUndo[i].init(theType, aValue, *anIter);
+ }
+ }
+
+ return isOK;
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Diff.hxx
+// Created: Wed Jun 26 10:58:46 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_Diff_HeaderFile
+#define _CurveCreator_Diff_HeaderFile
+
+
+#include <CurveCreator_Operation.hxx>
+
+class CurveCreator_Curve;
+
+
+/**
+ * This is the support class for store/retrieve differences of undo/redo
+ * operations. To fill the difference it is necessary to create it with
+ * an appropriate type and to call the method initialize with required
+ * parameters.
+ */
+class CurveCreator_Diff
+{
+
+private:
+
+public:
+
+ /**
+ * Constructor.
+ */
+ CurveCreator_Diff();
+
+ /**
+ * Destructor.
+ */
+ ~CurveCreator_Diff();
+
+ /**
+ * This method initializes the difference with an operation without
+ * parameters. It is applicable to the following operations:
+ * <UL>
+ * <LI>Clear</LI>
+ * <LI>Join (without arguments)</LI>
+ * </UL>
+ */
+ bool init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType);
+
+ /**
+ * This method initializes the difference with an operation with one integer
+ * parameter. It is applicable to the following operations:
+ * <UL>
+ * <LI>RemoveSection</LI>
+ * </UL>
+ */
+ bool init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam);
+
+ /**
+ * This method initializes the difference with an operation with two integer
+ * parameters. It is applicable to the following operations:
+ * <UL>
+ * <LI>SetType</LI>
+ * <LI>SetClosed</LI>
+ * <LI>MoveSection</LI>
+ * <LI>Join (with 2 int arguments)</LI>
+ * </UL>
+ */
+ bool init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2);
+
+ /**
+ * This method initializes the difference with an operation with three
+ * integer parameters. It is applicable to the following operations:
+ * <UL>
+ * <LI>RemovePoints</LI>
+ * </UL>
+ */
+ bool init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2,
+ const int theIntParam3);
+
+ /**
+ * This method initializes the difference with an operation with one
+ * CurveCreator::Coordinates parameter and one integer parameter.
+ * It is applicable to the following operations:
+ * <UL>
+ * <LI>AddPoints</LI>
+ * </UL>
+ */
+ bool init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const CurveCreator::Coordinates &theCoords,
+ const int theIntParam);
+
+ /**
+ * This method initializes the difference with an operation with one
+ * CurveCreator::Coordinates parameter and two integer parameters.
+ * It is applicable to the following operations:
+ * <UL>
+ * <LI>AddSection</LI>
+ * <LI>InsertPoints</LI>
+ * <LI>SetCoordinates</LI>
+ * </UL>
+ */
+ bool init(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const CurveCreator::Coordinates &theCoords,
+ const int theIntParam1,
+ const int theIntParam2);
+
+ /**
+ * This method applies undo operation to theCurve.
+ */
+ void applyUndo(CurveCreator_Curve *theCurve);
+
+ /**
+ * This method applies redo operation to theCurve.
+ */
+ void applyRedo(CurveCreator_Curve *theCurve);
+
+private:
+
+ /**
+ * This method clears initialized data pointers.
+ */
+ void clear();
+
+ /**
+ * This method sets the number of undos and allocates the required
+ * space for myPUndo.
+ */
+ void setNbUndos(const int theNbUndos);
+
+ /**
+ * This method returns the section index. It returns theIndex if it is
+ * a real index and the last section's index if theIndex is equal to -1.
+ */
+ int getSectionIndex(const CurveCreator_Curve *theCurve,
+ const int theIndex) const;
+
+ /**
+ * Convert theIndex'th section of theCurve into AddSection command
+ * and store it in theOperation. Returns true in case of success and
+ * false otherwise.
+ */
+ bool addSectionToUndo(const CurveCreator_Curve *theCurve,
+ const int theIndex,
+ CurveCreator_Operation &theOperation) const;
+
+ /**
+ * Construct undos for SetType and SetClosed operations. Note: the
+ * algorithm is optimized taking into account that there are only 2 types
+ * and 2 values of isClosed flag. If the number of types is increased,
+ * this algorithm should be re-implemented.
+ */
+ bool setTypeOrClosedToUndo(const CurveCreator_Curve *theCurve,
+ const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2);
+
+private:
+
+ int myNbUndos;
+ CurveCreator_Operation *myPUndo;
+ CurveCreator_Operation *myPRedo;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_EditPntDlg.cxx
+// Created: Tue Jul 16 10:58:31 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_EditPntDlg.h>
+#include <CurveCreator_PointItem.h>
+#include <QGroupBox>
+#include <QVBoxLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QSpinBox>
+#include <QListWidget>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_EditPntDlg::CurveCreator_EditPntDlg
+ (QWidget* parent,
+ const CurveCreator::Dimension theDimension)
+ : QDialog (parent),
+ myDimension (theDimension),
+ myXSpn (NULL),
+ myYSpn (NULL),
+ myZSpn (NULL),
+ myOkBtn (NULL),
+ myCancelBtn (NULL)
+{
+ setWindowTitle(tr("CC_EDIT_POINT_TITLE"));
+
+ // Set Add/modify point group
+ QGroupBox *aModifPntGrp =
+ new QGroupBox(tr("CC_EDIT_POINT_MODIFY"));
+ QGridLayout *aModifPntLO = new QGridLayout(aModifPntGrp);
+ QLabel *aXLbl =
+ new QLabel(tr("CC_EDIT_POINT_X"), aModifPntGrp);
+ QLabel *aYLbl =
+ new QLabel(tr("CC_EDIT_POINT_Y"), aModifPntGrp);
+
+ aXLbl->setAlignment(Qt::AlignRight);
+ aYLbl->setAlignment(Qt::AlignRight);
+ myXSpn = new QDoubleSpinBox(aModifPntGrp);
+ myYSpn = new QDoubleSpinBox(aModifPntGrp);
+ aModifPntLO->setMargin(9);
+ aModifPntLO->setSpacing(6);
+ aModifPntLO->addWidget(aXLbl, 0, 0);
+ aModifPntLO->addWidget(aYLbl, 1, 0);
+ aModifPntLO->addWidget(myXSpn, 0, 1);
+ aModifPntLO->addWidget(myYSpn, 1, 1);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ QLabel *aZLbl = new QLabel(tr("CC_EDIT_POINT_Z"), aModifPntGrp);
+
+ aZLbl->setAlignment(Qt::AlignRight);
+ myZSpn = new QDoubleSpinBox(aModifPntGrp);
+ aModifPntLO->addWidget(aZLbl, 2, 0);
+ aModifPntLO->addWidget(myZSpn, 2, 1);
+ }
+
+ // Set OK/Cancel buttons group
+ QGroupBox *anOkCancelGrp = new QGroupBox;
+ QGridLayout *anOkCancelLO = new QGridLayout(anOkCancelGrp);
+
+ myOkBtn = new QPushButton(tr("GEOM_BUT_OK"), anOkCancelGrp);
+ myCancelBtn = new QPushButton(tr("GEOM_BUT_CANCEL"), anOkCancelGrp);
+ anOkCancelLO->setMargin(9);
+ anOkCancelLO->setSpacing(6);
+ anOkCancelLO->addWidget(myOkBtn, 0, 0);
+ anOkCancelLO->addWidget(myCancelBtn, 0, 1);
+
+ // Set main group
+ QGroupBox *aMainGrp = new QGroupBox;
+ QVBoxLayout *aMainLO = new QVBoxLayout(aMainGrp);
+
+ aMainLO->addWidget(aModifPntGrp);
+ aMainLO->addWidget(anOkCancelGrp);
+
+ setLayout(aMainLO);
+
+ init();
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_EditPntDlg::~CurveCreator_EditPntDlg()
+{
+}
+
+//=======================================================================
+// function: setPoint
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntDlg::setPoint
+ (const CurveCreator::Coordinates &thePoint)
+{
+ myPoint = thePoint;
+
+ if (myPoint.size() == myDimension) {
+ myXSpn->setValue(myPoint[0]);
+ myYSpn->setValue(myPoint[1]);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ myZSpn->setValue(myPoint[2]);
+ }
+ }
+}
+
+//=======================================================================
+// function: getPoint
+// purpose:
+//=======================================================================
+const CurveCreator::Coordinates &CurveCreator_EditPntDlg::getPoint() const
+{
+ return myPoint;
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntDlg::init()
+{
+ // Init spin boxes.
+ initSpinBox(myXSpn);
+ initSpinBox(myYSpn);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ initSpinBox(myZSpn);
+ }
+
+ // Init buttons.
+ myOkBtn->setDefault(true);
+
+ connect(myOkBtn, SIGNAL(clicked()), this, SLOT(accept()));
+ connect(myCancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
+
+ setTabOrder();
+}
+
+//=======================================================================
+// function: initSpinBox
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntDlg::initSpinBox(QDoubleSpinBox *theSpinBox)
+{
+ const double aCoordMin = -1.e+15;
+ const double aCoordMax = 1.e+15;
+ const double aStep = 10;
+ const int aPrecision = 6;
+
+ theSpinBox->setDecimals( qAbs( aPrecision ) );
+ theSpinBox->setRange(aCoordMin, aCoordMax);
+ theSpinBox->setSingleStep(aStep);
+ theSpinBox->setValue(0.);
+}
+
+//=======================================================================
+// function: setTabOrder
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntDlg::setTabOrder()
+{
+ QWidget::setTabOrder(myXSpn, myYSpn);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ QWidget::setTabOrder(myYSpn, myZSpn);
+ QWidget::setTabOrder(myZSpn, myOkBtn);
+ } else {
+ QWidget::setTabOrder(myYSpn, myOkBtn);
+ }
+
+ QWidget::setTabOrder(myOkBtn, myCancelBtn);
+}
+
+//=======================================================================
+// function: accept
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntDlg::accept()
+{
+ // Copy point
+ myPoint.clear();
+ myPoint.push_back(myXSpn->value());
+ myPoint.push_back(myYSpn->value());
+
+ if (myDimension == CurveCreator::Dim3d) {
+ myPoint.push_back(myZSpn->value());
+ }
+
+ QDialog::accept();
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_EditPntDlg.h
+// Created: Tue Jul 16 10:58:22 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_EditPntDlg_HeaderFile
+#define _CurveCreator_EditPntDlg_HeaderFile
+
+
+#include <QDialog>
+#include <CurveCreator.hxx>
+
+class QListWidget;
+class QDoubleSpinBox;
+class QPushButton;
+
+
+class CurveCreator_EditPntDlg : public QDialog
+{
+ Q_OBJECT
+
+public:
+
+ CurveCreator_EditPntDlg(QWidget* parent,
+ const CurveCreator::Dimension theDimension);
+
+ ~CurveCreator_EditPntDlg();
+
+ void setPoint(const CurveCreator::Coordinates &thePoint);
+
+ const CurveCreator::Coordinates &getPoint() const;
+
+private:
+
+ void init();
+
+ void initSpinBox(QDoubleSpinBox *theSpinBox);
+
+ void setTabOrder();
+
+private slots:
+
+ void accept();
+
+protected:
+
+ CurveCreator::Dimension myDimension;
+ CurveCreator::Coordinates myPoint;
+ QDoubleSpinBox *myXSpn;
+ QDoubleSpinBox *myYSpn;
+ QDoubleSpinBox *myZSpn;
+ QPushButton *myOkBtn;
+ QPushButton *myCancelBtn;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_EditPntsDlg.cxx
+// Created: Fri Jul 05 16:29:53 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_EditPntsDlg.h>
+#include <CurveCreator_PointItem.h>
+#include <QGroupBox>
+#include <QVBoxLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QSpinBox>
+#include <QListWidget>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_EditPntsDlg::CurveCreator_EditPntsDlg
+ (QWidget* parent, const CurveCreator::Dimension theDimension)
+ : QDialog (parent),
+ myDimension (theDimension),
+ myPntsList (NULL),
+ myXSpn (NULL),
+ myYSpn (NULL),
+ myZSpn (NULL),
+ myAddBtn (NULL),
+ myModifBtn (NULL),
+ myRmBtn (NULL),
+ myClearBtn (NULL),
+ myPntUpBtn (NULL),
+ myPntDownBtn (NULL),
+ myOkBtn (NULL),
+ myCancelBtn (NULL)
+{
+ setWindowTitle(tr("CC_EDIT_POINTS_TITLE"));
+
+ // Set Add/modify point group
+ QGroupBox *aModifPntGrp =
+ new QGroupBox(tr("CC_EDIT_POINTS_ADD_MODIFY"));
+ QGridLayout *aModifPntLO = new QGridLayout(aModifPntGrp);
+ QLabel *aXLbl =
+ new QLabel(tr("CC_EDIT_POINTS_X"), aModifPntGrp);
+ QLabel *aYLbl =
+ new QLabel(tr("CC_EDIT_POINTS_Y"), aModifPntGrp);
+
+ aXLbl->setAlignment(Qt::AlignRight);
+ aYLbl->setAlignment(Qt::AlignRight);
+ myXSpn = new QDoubleSpinBox(aModifPntGrp);
+ myYSpn = new QDoubleSpinBox(aModifPntGrp);
+ myAddBtn = new QPushButton(tr("CC_EDIT_POINTS_ADD"), aModifPntGrp);
+ myModifBtn = new QPushButton(tr("CC_EDIT_POINTS_MODIFY"), aModifPntGrp);
+ myRmBtn = new QPushButton(tr("CC_EDIT_POINTS_REMOVE"), aModifPntGrp);
+ aModifPntLO->setMargin(9);
+ aModifPntLO->setSpacing(6);
+ aModifPntLO->addWidget(aXLbl, 0, 0);
+ aModifPntLO->addWidget(aYLbl, 1, 0);
+ aModifPntLO->addWidget(myXSpn, 0, 1);
+ aModifPntLO->addWidget(myYSpn, 1, 1);
+ aModifPntLO->addWidget(myAddBtn, 0, 2);
+ aModifPntLO->addWidget(myModifBtn, 1, 2);
+ aModifPntLO->addWidget(myRmBtn, 2, 2);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ QLabel *aZLbl = new QLabel(tr("CC_EDIT_POINTS_Z"), aModifPntGrp);
+
+ aZLbl->setAlignment(Qt::AlignRight);
+ myZSpn = new QDoubleSpinBox(aModifPntGrp);
+ aModifPntLO->addWidget(aZLbl, 2, 0);
+ aModifPntLO->addWidget(myZSpn, 2, 1);
+ }
+
+ // Set Buttons group
+ QGroupBox *aPntsGrp = new QGroupBox();
+ QGridLayout *aPntsLO = new QGridLayout(aPntsGrp);
+
+ myClearBtn = new QPushButton(tr("CC_EDIT_POINTS_CLEAR"), aModifPntGrp);
+ myPntUpBtn = new QPushButton(tr("CC_EDIT_POINTS_UP"), aPntsGrp);
+ myPntDownBtn = new QPushButton(tr("CC_EDIT_POINTS_DOWN"), aPntsGrp);
+ myPntsList = new QListWidget(aPntsGrp);
+ aPntsLO->setMargin(9);
+ aPntsLO->setSpacing(6);
+ aPntsLO->addWidget(myClearBtn, 0, 0);
+ aPntsLO->addWidget(myPntUpBtn, 2, 4);
+ aPntsLO->addWidget(myPntDownBtn, 3, 4);
+ aPntsLO->addWidget(myPntsList, 1, 0, 4, 4);
+
+ // Set OK/Cancel buttons group
+ QGroupBox *anOkCancelGrp = new QGroupBox();
+ QGridLayout *anOkCancelLO = new QGridLayout(anOkCancelGrp);
+
+ myOkBtn = new QPushButton(tr("GEOM_BUT_OK"), anOkCancelGrp);
+ myCancelBtn = new QPushButton(tr("GEOM_BUT_CANCEL"), anOkCancelGrp);
+ anOkCancelLO->setMargin(9);
+ anOkCancelLO->setSpacing(6);
+ anOkCancelLO->addWidget(myOkBtn, 0, 3);
+ anOkCancelLO->addWidget(myCancelBtn, 0, 4);
+
+ // Set main group
+ QGroupBox *aMainGrp = new QGroupBox;
+ QVBoxLayout *aMainLO = new QVBoxLayout(aMainGrp);
+
+ aMainLO->addWidget(aModifPntGrp);
+ aMainLO->addWidget(aPntsGrp);
+ aMainLO->addWidget(anOkCancelGrp);
+
+ setLayout(aMainLO);
+
+ init();
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_EditPntsDlg::~CurveCreator_EditPntsDlg()
+{
+}
+
+//=======================================================================
+// function: setPoints
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::setPoints
+ (const CurveCreator::Coordinates &thePoints)
+{
+ myPoints = thePoints;
+ updateEditList();
+}
+
+//=======================================================================
+// function: getPoints
+// purpose:
+//=======================================================================
+const CurveCreator::Coordinates &CurveCreator_EditPntsDlg::getPoints() const
+{
+ return myPoints;
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::init()
+{
+ // Init spin boxes.
+ initSpinBox(myXSpn);
+ initSpinBox(myYSpn);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ initSpinBox(myZSpn);
+ }
+
+ // Init buttons.
+ myModifBtn->setEnabled(false);
+ myRmBtn->setEnabled(false);
+ myClearBtn->setEnabled(false);
+ myPntUpBtn->setEnabled(false);
+ myPntDownBtn->setEnabled(false);
+ myOkBtn->setDefault(true);
+
+ connect(myAddBtn, SIGNAL(clicked()), this, SLOT(appendPoint()));
+ connect(myModifBtn, SIGNAL(clicked()), this, SLOT(modifyPoint()));
+ connect(myRmBtn, SIGNAL(clicked()), this, SLOT(removePoint()));
+ connect(myClearBtn, SIGNAL(clicked()), this, SLOT(clear()));
+ connect(myPntUpBtn, SIGNAL(clicked()), this, SLOT(upPoint()));
+ connect(myPntDownBtn, SIGNAL(clicked()), this, SLOT(downPoint()));
+ connect(myOkBtn, SIGNAL(clicked()), this, SLOT(accept()));
+ connect(myCancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
+
+ // Init list widget.
+ myPntsList->clear();
+ myPntsList->setSelectionMode(QAbstractItemView::ExtendedSelection);
+ myPntsList->setDragEnabled(true);
+ myPntsList->setDragDropMode(QAbstractItemView::InternalMove);
+ myPntsList->viewport()->setAcceptDrops(true);
+
+ connect(myPntsList, SIGNAL(itemSelectionChanged()),
+ this, SLOT(changeSelection()));
+ connect(this, SIGNAL(numberOfItemsChanged(int)),
+ this, SLOT(onNumberOfItemsChanged(int)));
+
+ // Set tab order.
+ setTabOrder();
+}
+
+//=======================================================================
+// function: initSpinBox
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::initSpinBox(QDoubleSpinBox *theSpinBox)
+{
+ const double aCoordMin = -1.e+15;
+ const double aCoordMax = 1.e+15;
+ const double aStep = 10;
+ const int aPrecision = 6;
+
+ theSpinBox->setDecimals( qAbs( aPrecision ) );
+ theSpinBox->setRange(aCoordMin, aCoordMax);
+ theSpinBox->setSingleStep(aStep);
+ theSpinBox->setValue(0.0);
+}
+
+//=======================================================================
+// function: updateEditList
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::updateEditList()
+{
+ myPntsList->clear();
+
+ const int aNbCoords = myPoints.size();
+
+ if (aNbCoords % myDimension == 0) {
+ int i = 0;
+
+ while (i < aNbCoords) {
+ const CurveCreator::TypeCoord aX = myPoints[i++];
+ const CurveCreator::TypeCoord aY = myPoints[i++];
+
+ if (myDimension == CurveCreator::Dim3d) {
+ const CurveCreator::TypeCoord aZ = myPoints[i++];
+
+ new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
+ } else {
+ new CurveCreator_PointItem(aX, aY, myPntsList);
+ }
+ }
+ }
+
+ emit numberOfItemsChanged(myPntsList->count());
+}
+
+//=======================================================================
+// function: movePoints
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::movePoints(const int theShift)
+{
+ // Sort list items in ascending or descending order depending on
+ // the sign of theShift.
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+
+ if (!aListItems.empty() && theShift != 0) {
+ QMap<int, QListWidgetItem *> aMapItems;
+
+ foreach(QListWidgetItem *anItem, aListItems) {
+ int aRow = myPntsList->row(anItem);
+
+ if (theShift > 0) {
+ aRow = -aRow;
+ }
+
+ aMapItems.insert(aRow, anItem);
+ }
+
+ // Compute new rows
+ QList<int> aListRows = aMapItems.keys();
+ QList<int> aListNewRows;
+ int i;
+ const int aSize = aListRows.size();
+
+
+ if (theShift < 0) {
+ // Check each row to be positive.
+ int aMinIndex = 0;
+
+ for (i = 0; i < aSize; i++) {
+ int aRow = aListRows[i] + theShift;
+
+ if (aRow < aMinIndex) {
+ aRow = aMinIndex++;
+ }
+
+ aListNewRows.append(aRow);
+ }
+ } else {
+ // Check each row to be not greater then a myPntsList's size.
+ int aMaxIndex = myPntsList->count() - 1;
+
+ for (i = 0; i < aSize; i++) {
+ int aRow = -aListRows[i] + theShift;
+
+ if (aRow > aMaxIndex) {
+ aRow = aMaxIndex--;
+ }
+
+ aListRows[i] = -aListRows[i];
+ aListNewRows.append(aRow);
+ }
+ }
+
+ // Move each item to another position.
+ for (i = 0; i < aSize; i++) {
+ if (aListRows[i] != aListNewRows[i]) {
+ QListWidgetItem *anItem = myPntsList->takeItem(aListRows[i]);
+
+ myPntsList->insertItem(aListNewRows[i], anItem);
+ }
+ }
+
+ // Select added items.
+ foreach (int anIndex, aListNewRows) {
+ myPntsList->item(anIndex)->setSelected(true);
+ }
+ }
+}
+
+//=======================================================================
+// function: setTabOrder
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::setTabOrder()
+{
+ QWidget::setTabOrder(myXSpn, myYSpn);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ QWidget::setTabOrder(myYSpn, myZSpn);
+ QWidget::setTabOrder(myZSpn, myAddBtn);
+ } else {
+ QWidget::setTabOrder(myYSpn, myAddBtn);
+ }
+
+ QWidget::setTabOrder(myAddBtn, myModifBtn);
+ QWidget::setTabOrder(myModifBtn, myRmBtn);
+ QWidget::setTabOrder(myRmBtn, myClearBtn);
+ QWidget::setTabOrder(myClearBtn, myPntsList);
+ QWidget::setTabOrder(myPntsList, myPntUpBtn);
+ QWidget::setTabOrder(myPntUpBtn, myPntDownBtn);
+ QWidget::setTabOrder(myPntDownBtn, myOkBtn);
+ QWidget::setTabOrder(myOkBtn, myCancelBtn);
+}
+
+//=======================================================================
+// function: appendPoint
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::appendPoint()
+{
+ if (myDimension == CurveCreator::Dim3d) {
+ new CurveCreator_PointItem(myXSpn->value(), myYSpn->value(),
+ myZSpn->value(), myPntsList);
+ } else {
+ new CurveCreator_PointItem(myXSpn->value(), myYSpn->value(), myPntsList);
+ }
+
+ emit numberOfItemsChanged(myPntsList->count());
+}
+
+//=======================================================================
+// function: modifyPoint
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::modifyPoint()
+{
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+
+ if (aListItems.size() == 1) {
+ CurveCreator_PointItem *aPntItem =
+ (CurveCreator_PointItem *)aListItems.first();
+
+ if (myDimension == CurveCreator::Dim3d) {
+ aPntItem->setCoord(myXSpn->value(), myYSpn->value(), myZSpn->value());
+ } else {
+ aPntItem->setCoord(myXSpn->value(), myYSpn->value());
+ }
+ }
+}
+
+//=======================================================================
+// function: removePoint
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::removePoint()
+{
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+ int aRow = -1;
+
+ foreach(QListWidgetItem *anItem, aListItems) {
+ if (aRow < 0) {
+ aRow = myPntsList->row(anItem);
+ }
+
+ delete anItem;
+ }
+
+ if (aRow >= 0) {
+ emit numberOfItemsChanged(myPntsList->count());
+ }
+
+ // Set the new selection.
+ if (aRow >= myPntsList->count()) {
+ aRow = myPntsList->count() - 1;
+ }
+
+ if (aRow >= 0) {
+ myPntsList->item(aRow)->setSelected(true);
+ }
+}
+
+//=======================================================================
+// function: upPoint
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::upPoint()
+{
+ movePoints(-1);
+}
+
+//=======================================================================
+// function: downPoint
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::downPoint()
+{
+ movePoints(1);
+}
+
+//=======================================================================
+// function: changeSelection
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::changeSelection()
+{
+ // Update modify button and spin boxes.
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+ const int aNbItems = aListItems.size();
+
+ if (aNbItems == 1) {
+ const CurveCreator_PointItem *aPntItem =
+ (const CurveCreator_PointItem *)aListItems.first();
+
+ myModifBtn->setEnabled(true);
+ myXSpn->setValue(aPntItem->getX());
+ myYSpn->setValue(aPntItem->getY());
+
+ if (myDimension == CurveCreator::Dim3d) {
+ myZSpn->setValue(aPntItem->getZ());
+ }
+ } else if (myModifBtn->isEnabled()) {
+ myModifBtn->setEnabled(false);
+ myXSpn->setValue(0.0);
+ myYSpn->setValue(0.0);
+
+ if (myDimension == CurveCreator::Dim3d) {
+ myZSpn->setValue(0.0);
+ }
+ }
+
+ // Set enabled remove, up and down points.
+ bool isEnabled = (aNbItems > 0);
+
+ myRmBtn->setEnabled(isEnabled);
+ isEnabled &= (aNbItems < myPntsList->count());
+ myPntUpBtn->setEnabled(isEnabled);
+ myPntDownBtn->setEnabled(isEnabled);
+}
+
+//=======================================================================
+// function: accept
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::accept()
+{
+ // Copy points
+ myPoints.clear();
+
+ const int aNbPoints = myPntsList->count();
+ int i;
+
+ for (i = 0; i < aNbPoints; i++) {
+ const CurveCreator_PointItem *aPntItem =
+ (const CurveCreator_PointItem *)myPntsList->item(i);
+
+ myPoints.push_back(aPntItem->getX());
+ myPoints.push_back(aPntItem->getY());
+
+ if (myDimension == CurveCreator::Dim3d) {
+ myPoints.push_back(aPntItem->getZ());
+ }
+ }
+
+ QDialog::accept();
+}
+
+//=======================================================================
+// function: clear
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::clear()
+{
+ bool isEmpty = (myPntsList->count() == 0);
+
+ myPntsList->clear();
+
+ if (!isEmpty) {
+ emit onNumberOfItemsChanged(0);
+ }
+}
+
+//=======================================================================
+// function: onNumberOfItemsChanged
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsDlg::onNumberOfItemsChanged(int theNewValue)
+{
+ myClearBtn->setEnabled(theNewValue > 0);
+
+ // Update Up and down buttons
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+ const int aNbItems = aListItems.size();
+ const bool isEnabled = (aNbItems > 0 && aNbItems < theNewValue);
+
+ myPntUpBtn->setEnabled(isEnabled);
+ myPntDownBtn->setEnabled(isEnabled);
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_EditPntsDlg.h
+// Created: Fri Jul 05 16:29:48 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_EditPntsDlg_HeaderFile
+#define _CurveCreator_EditPntsDlg_HeaderFile
+
+
+#include <QDialog>
+#include <CurveCreator.hxx>
+
+class QListWidget;
+class QDoubleSpinBox;
+class QPushButton;
+
+
+class CurveCreator_EditPntsDlg : public QDialog
+{
+ Q_OBJECT
+
+public:
+
+ CurveCreator_EditPntsDlg(QWidget* parent,
+ const CurveCreator::Dimension theDimension);
+
+ ~CurveCreator_EditPntsDlg();
+
+ void setPoints(const CurveCreator::Coordinates &thePoints);
+
+ const CurveCreator::Coordinates &getPoints() const;
+
+private:
+
+ void init();
+
+ void initSpinBox(QDoubleSpinBox *theSpinBox);
+
+ void updateEditList();
+
+ void movePoints(const int theShift);
+
+ void setTabOrder();
+
+private slots:
+
+ void appendPoint();
+
+ void modifyPoint();
+
+ void removePoint();
+
+ void upPoint();
+
+ void downPoint();
+
+ void changeSelection();
+
+ void accept();
+
+ void clear();
+
+ void onNumberOfItemsChanged(int theNewValue);
+
+signals:
+
+ void numberOfItemsChanged(int theNewValue);
+
+protected:
+
+ CurveCreator::Dimension myDimension;
+ CurveCreator::Coordinates myPoints;
+ QListWidget *myPntsList;
+ QDoubleSpinBox *myXSpn;
+ QDoubleSpinBox *myYSpn;
+ QDoubleSpinBox *myZSpn;
+ QPushButton *myAddBtn;
+ QPushButton *myModifBtn;
+ QPushButton *myRmBtn;
+ QPushButton *myClearBtn;
+ QPushButton *myPntUpBtn;
+ QPushButton *myPntDownBtn;
+ QPushButton *myOkBtn;
+ QPushButton *myCancelBtn;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_EditPntsWidget.cxx
+// Created: Fri Jul 05 16:30:11 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_EditPntsWidget.h>
+#include <CurveCreator_EditPntsDlg.h>
+#include <CurveCreator_PointItem.h>
+#include <QGroupBox>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QListWidget>
+#include <QPushButton>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_EditPntsWidget::CurveCreator_EditPntsWidget
+ (QWidget* parent,
+ const bool IsSection,
+ const CurveCreator::Dimension theDimension)
+ : QWidget (parent),
+ myDimension (theDimension),
+ myPntsEdit (NULL),
+ myPntsBtn (NULL),
+ myPntsEditDlg (NULL),
+ myPntsList (NULL)
+{
+ QGroupBox *aMainGrp = new QGroupBox;
+ QHBoxLayout *aMainLO = new QHBoxLayout(aMainGrp);
+
+ myPntsEdit = new QLineEdit(aMainGrp);
+ myPntsBtn = new QPushButton
+ (IsSection? tr("CC_SECTION_POINTS_EDIT") : tr("CC_POINTS_EDIT"), aMainGrp);
+ aMainLO->addWidget(myPntsEdit);
+ aMainLO->addWidget(myPntsBtn);
+
+ setLayout(aMainLO);
+
+ init();
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_EditPntsWidget::~CurveCreator_EditPntsWidget()
+{
+}
+
+//=======================================================================
+// function: setPoints
+// purpose:
+//=======================================================================
+void CurveCreator_EditPntsWidget::setPoints
+ (const CurveCreator::Coordinates &thePoints)
+{
+ myPoints = thePoints;
+ updateEditLine();
+}
+
+//=======================================================================
+// function: getPoints
+// purpose:
+//=======================================================================
+const CurveCreator::Coordinates &CurveCreator_EditPntsWidget::getPoints() const
+{
+ return myPoints;
+}
+
+//=======================================================================
+// function : setPointsList
+// purpose :
+//=======================================================================
+void CurveCreator_EditPntsWidget::setPointsList(QListWidget *thePntsList)
+{
+ myPntsList = thePntsList;
+}
+
+//=======================================================================
+// function : clear
+// purpose :
+//=======================================================================
+void CurveCreator_EditPntsWidget::clear()
+{
+ myPoints.clear();
+ myPntsEdit->setText("");
+}
+
+//=======================================================================
+// function : getPointsEdit
+// purpose :
+//=======================================================================
+QLineEdit *CurveCreator_EditPntsWidget::getPointsEdit() const
+{
+ return myPntsEdit;
+}
+
+//=======================================================================
+// function : getPointsButton
+// purpose :
+//=======================================================================
+QPushButton *CurveCreator_EditPntsWidget::getPointsButton() const
+{
+ return myPntsBtn;
+}
+
+//=======================================================================
+// function : init
+// purpose :
+//=======================================================================
+void CurveCreator_EditPntsWidget::init()
+{
+ connect(myPntsBtn, SIGNAL(clicked()), this, SLOT(editPoints()));
+
+ myPntsEdit->setReadOnly(true);
+ updateEditLine();
+
+ // Set tab order.
+ QWidget::setTabOrder(myPntsEdit, myPntsBtn);
+}
+
+//=======================================================================
+// function : editPoints
+// purpose :
+//=======================================================================
+void CurveCreator_EditPntsWidget::editPoints()
+{
+ if (myPntsEditDlg == NULL) {
+ // Create the dialog.
+ myPntsEditDlg = new CurveCreator_EditPntsDlg(this, myDimension);
+ }
+
+ // Set points to dialog.
+ setPointsToDialog();
+
+ const int aResult = myPntsEditDlg->exec();
+
+ if (aResult == QDialog::Accepted) {
+ // Update the list of points and myPntsEdit.
+ const CurveCreator::Coordinates &aNewPoints = myPntsEditDlg->getPoints();
+
+ myPoints.clear();
+ myPoints.insert(myPoints.end(), aNewPoints.begin(), aNewPoints.end());
+ updateEditLine();
+ }
+}
+
+//=======================================================================
+// function : updateEditLine
+// purpose :
+//=======================================================================
+void CurveCreator_EditPntsWidget::updateEditLine()
+{
+ const int aNbPnts = myPoints.size();
+
+ if ( aNbPnts == 0 ) {
+ myPntsEdit->setText("");
+ } else if ( aNbPnts == myDimension ) {
+ // One point.
+ QString aText;
+
+ if (myDimension == CurveCreator::Dim3d) {
+ aText = CurveCreator_PointItem::getText
+ (myPoints[0], myPoints[1], myPoints[2]);
+ } else {
+ aText = CurveCreator_PointItem::getText(myPoints[0], myPoints[1]);
+ }
+
+ myPntsEdit->setText(aText);
+ } else if ( aNbPnts > 0 ) {
+ myPntsEdit->setText(tr("CC_POINTS_NUMBER").arg(aNbPnts/myDimension));
+ }
+}
+
+//=======================================================================
+// function : setPointsToDialog
+// purpose :
+//=======================================================================
+void CurveCreator_EditPntsWidget::setPointsToDialog()
+{
+ bool isPntsFromWidget = false;
+
+ if (myPntsList != NULL) {
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+
+ if (aListItems.size() > 0) {
+ CurveCreator::Coordinates aPoints;
+
+ foreach (QListWidgetItem *anItem, aListItems) {
+ const CurveCreator_PointItem *aPntItem =
+ (const CurveCreator_PointItem *)anItem;
+
+ aPoints.push_back(aPntItem->getX());
+ aPoints.push_back(aPntItem->getY());
+
+ if (myDimension == CurveCreator::Dim3d) {
+ aPoints.push_back(aPntItem->getZ());
+ }
+ }
+
+ myPntsEditDlg->setPoints(aPoints);
+ isPntsFromWidget = true;
+ }
+ }
+
+ if (!isPntsFromWidget) {
+ myPntsEditDlg->setPoints(myPoints);
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_EditPntsWidget.h
+// Created: Fri Jul 05 16:30:17 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_EditPntsWidget_HeaderFile
+#define _CurveCreator_EditPntsWidget_HeaderFile
+
+
+#include <QWidget>
+#include <CurveCreator.hxx>
+
+class QLineEdit;
+class QPushButton;
+class QListWidget;
+class CurveCreator_EditPntsDlg;
+
+
+class CurveCreator_EditPntsWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ CurveCreator_EditPntsWidget(QWidget* parent,
+ const bool IsSection,
+ const CurveCreator::Dimension theDimension);
+
+ ~CurveCreator_EditPntsWidget();
+
+ void setPoints(const CurveCreator::Coordinates &thePoints);
+
+ const CurveCreator::Coordinates &getPoints() const;
+
+ void setPointsList(QListWidget *thePntsList);
+
+ void clear();
+
+ QLineEdit *getPointsEdit() const;
+
+ QPushButton *getPointsButton() const;
+
+private slots:
+
+ void editPoints();
+
+private:
+
+ void init();
+
+ void updateEditLine();
+
+ void setPointsToDialog();
+
+protected:
+
+ CurveCreator::Coordinates myPoints;
+ CurveCreator::Dimension myDimension;
+ QPushButton *myPntsBtn;
+ QLineEdit *myPntsEdit;
+ CurveCreator_EditPntsDlg *myPntsEditDlg;
+ QListWidget *myPntsList;
+
+};
+
+#endif
+
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Macro.hxx
+// Created: Fri Jun 28 13:21:59 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_Macro_HeaderFile
+#define _CurveCreator_Macro_HeaderFile
+
+#ifdef WNT
+ #if defined CURVECREATOR_EXPORTS || defined CurveCreator_EXPORTS
+ #if defined WIN32
+ #define CURVECREATOR_EXPORT __declspec( dllexport )
+ #else
+ #define CURVECREATOR_EXPORT
+ #endif
+ #else
+ #if defined WIN32
+ #define CURVECREATOR_EXPORT __declspec( dllimport )
+ #else
+ #define CURVECREATOR_EXPORT
+ #endif
+ #endif
+#else
+ #define CURVECREATOR_EXPORT
+#endif
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Operation.cxx
+// Created: Wed Jun 26 13:06:56 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_Operation.hxx>
+#include <CurveCreator_Curve.hxx>
+#include <stdlib.h>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_Operation::CurveCreator_Operation()
+: myType (CurveCreator_Operation::Unknown),
+ myPData (NULL)
+{
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_Operation::~CurveCreator_Operation()
+{
+ clear();
+}
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::Clear ||
+ theType == CurveCreator_Operation::Join) {
+ clear();
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+ const int theIntParam)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::RemoveSection) {
+ int *pData = (int *)allocate(sizeof(int));
+
+ pData[0] = theIntParam;
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::SetType ||
+ theType == CurveCreator_Operation::SetClosed ||
+ theType == CurveCreator_Operation::MoveSection ||
+ theType == CurveCreator_Operation::Join) {
+ int *pData = (int *)allocate(2*sizeof(int));
+
+ pData[0] = theIntParam1;
+ pData[1] = theIntParam2;
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+ const int theIntParam1,
+ const int theIntParam2,
+ const int theIntParam3)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::RemovePoints) {
+ int *pData = (int *)allocate(3*sizeof(int));
+
+ pData[0] = theIntParam1;
+ pData[1] = theIntParam2;
+ pData[2] = theIntParam3;
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+ const CurveCreator::Coordinates &theCoords,
+ const int theIntParam)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::AddPoints) {
+ const int aNbCoords = theCoords.size();
+ const size_t aSize =
+ 2*sizeof(theIntParam) + aNbCoords*sizeof(CurveCreator::TypeCoord);
+ int *pIntData = (int *)allocate(aSize);
+
+ *pIntData++ = theIntParam;
+ *pIntData++ = aNbCoords;
+
+ CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)pIntData;
+ int i = 0;
+
+ for (; i < aNbCoords; i++) {
+ *pRealData++ = theCoords[i];
+ }
+
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
+ const CurveCreator::Coordinates &theCoords,
+ const int theIntParam1,
+ const int theIntParam2)
+{
+ bool isOK = false;
+
+ if (theType == CurveCreator_Operation::AddSection ||
+ theType == CurveCreator_Operation::InsertPoints ||
+ theType == CurveCreator_Operation::SetCoordinates) {
+ const int aNbCoords = theCoords.size();
+ const size_t aSize =
+ 3*sizeof(theIntParam1) + aNbCoords*sizeof(CurveCreator::TypeCoord);
+ int *pIntData = (int *)allocate(aSize);
+
+ *pIntData++ = theIntParam1;
+ *pIntData++ = theIntParam2;
+ *pIntData++ = aNbCoords;
+
+ CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)pIntData;
+ int i = 0;
+
+ for (; i < aNbCoords; i++) {
+ *pRealData++ = theCoords[i];
+ }
+
+ myType = theType;
+ isOK = true;
+ }
+
+ return isOK;
+}
+
+//=======================================================================
+// function: apply
+// purpose:
+//=======================================================================
+void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve)
+{
+ if (theCurve != NULL) {
+ int *pInt = (int *)myPData;
+
+ switch (myType) {
+ case CurveCreator_Operation::AddPoints:
+ {
+ CurveCreator::Coordinates aCoords;
+
+ getCoords(&pInt[1], aCoords);
+ theCurve->addPoints(aCoords, pInt[0]);
+ }
+ break;
+ case CurveCreator_Operation::RemovePoints:
+ theCurve->removePoints(pInt[0], pInt[1], pInt[2]);
+ break;
+ case CurveCreator_Operation::InsertPoints:
+ {
+ CurveCreator::Coordinates aCoords;
+
+ getCoords(&pInt[2], aCoords);
+ theCurve->insertPoints(aCoords, pInt[0], pInt[1]);
+ }
+ break;
+ case CurveCreator_Operation::SetType:
+ {
+ const CurveCreator::Type aType = (CurveCreator::Type) pInt[0];
+
+ theCurve->setType(aType, pInt[1]);
+ }
+ break;
+ case CurveCreator_Operation::Clear:
+ theCurve->clear();
+ break;
+ case CurveCreator_Operation::SetCoordinates:
+ {
+ CurveCreator::Coordinates aCoords;
+
+ getCoords(&pInt[2], aCoords);
+ theCurve->setCoordinates(aCoords, pInt[0], pInt[1]);
+ }
+ break;
+ case CurveCreator_Operation::SetClosed:
+ theCurve->setClosed((pInt[0] != 0), pInt[1]);
+ break;
+ case CurveCreator_Operation::MoveSection:
+ theCurve->moveSection(pInt[0], pInt[1]);
+ break;
+ case CurveCreator_Operation::Join:
+ if (myPData == NULL) {
+ theCurve->join();
+ } else {
+ theCurve->join(pInt[0], pInt[1]);
+ }
+ break;
+ case CurveCreator_Operation::AddSection:
+ {
+ const CurveCreator::Type aType = (CurveCreator::Type) pInt[0];
+ CurveCreator::Coordinates aCoords;
+
+ getCoords(&pInt[2], aCoords);
+ theCurve->addSection(aType, (pInt[1] != 0), aCoords);
+ }
+ break;
+ case CurveCreator_Operation::RemoveSection:
+ theCurve->removeSection(pInt[0]);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+//=======================================================================
+// function: allocate
+// purpose:
+//=======================================================================
+void *CurveCreator_Operation::allocate(const size_t theSize)
+{
+ if (myPData != NULL) {
+ clear();
+ }
+
+ myPData = malloc(theSize);
+
+ return myPData;
+}
+
+//=======================================================================
+// function: clear
+// purpose:
+//=======================================================================
+void CurveCreator_Operation::clear()
+{
+ myType = CurveCreator_Operation::Unknown;
+
+ if (myPData != NULL) {
+ free(myPData);
+ myPData = NULL;
+ }
+}
+
+//=======================================================================
+// function: getCoords
+// purpose:
+//=======================================================================
+void CurveCreator_Operation::getCoords
+ (int *thePInt, CurveCreator::Coordinates &theCoords) const
+{
+ const int aNbPnts = *thePInt;
+ CurveCreator::TypeCoord *pCoord = (CurveCreator::TypeCoord *)&thePInt[1];
+
+ for (int i = 0; i < aNbPnts; i++) {
+ theCoords.push_back(pCoord[i]);
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Operation.hxx
+// Created: Wed Jun 26 13:06:51 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_Operation_HeaderFile
+#define _CurveCreator_Operation_HeaderFile
+
+
+#include <CurveCreator.hxx>
+
+class CurveCreator_Curve;
+
+
+/**
+ * This is the support class that describes a modification operation that
+ * can be applied to CurveCreator_Curve.
+ */
+class CurveCreator_Operation
+{
+
+public:
+
+ /**
+ * This is a type of CurveCreator_Curve modification operation.
+ */
+ enum Type
+ {
+ Unknown = 0, //!< Unknown method.
+ AddPoints, //!< Method CurveCreator_Curve::addPoints
+ RemovePoints, //!< Method CurveCreator_Curve::removePoints
+ InsertPoints, //!< Method CurveCreator_Curve::insertPoints
+ SetType, //!< Method CurveCreator_Curve::setType
+ Clear, //!< Method CurveCreator_Curve::clear
+ SetCoordinates, //!< Method CurveCreator_Curve::setCoordinates
+ SetClosed, //!< Method CurveCreator_Curve::setClosed
+ MoveSection, //!< Method CurveCreator_Curve::moveSection
+ Join, //!< Method CurveCreator_Curve::join
+ AddSection, //!< Method CurveCreator_Curve::addSection
+ RemoveSection //!< Method CurveCreator_Curve::removeSection
+ };
+
+ /**
+ * Empty constructor.
+ */
+ CurveCreator_Operation();
+
+ /**
+ * Destructor.
+ */
+ ~CurveCreator_Operation();
+
+ /**
+ * This method initializes the object with an operation without parameters.
+ * It is applicable to the following operations:
+ * <UL>
+ * <LI>Clear</LI>
+ * <LI>Join (without arguments)</LI>
+ * </UL>
+ * @return true in case of success; false otherwise.
+ */
+ bool init(const Type theType);
+
+ /**
+ * This method initializes the object with an operation with one integer
+ * parameter. It is applicable to the following operations:
+ * <UL>
+ * <LI>RemoveSection</LI>
+ * </UL>
+ * @return true in case of success; false otherwise.
+ */
+ bool init(const Type theType, const int theIntParam);
+
+ /**
+ * This method initializes the object with an operation with two integer
+ * parameters. It is applicable to the following operations:
+ * <UL>
+ * <LI>SetType</LI>
+ * <LI>SetClosed</LI>
+ * <LI>MoveSection</LI>
+ * <LI>Join (with 2 int arguments)</LI>
+ * </UL>
+ * @return true in case of success; false otherwise.
+ */
+ bool init(const Type theType, const int theIntParam1,
+ const int theIntParam2);
+
+ /**
+ * This method initializes the object with an operation with three 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, const int theIntParam1,
+ const int theIntParam2, const int theIntParam3);
+
+ /**
+ * This method initializes the object with an operation with one
+ * CurveCreator::Coordinates parameter and one integer parameter.
+ * It is applicable to the following operations:
+ * <UL>
+ * <LI>AddPoints</LI>
+ * </UL>
+ * @return true in case of success; false otherwise.
+ */
+ bool init(const Type theType, const CurveCreator::Coordinates &theCoords,
+ const int theIntParam);
+
+ /**
+ * This method initializes the object with an operation with one
+ * CurveCreator::Coordinates parameter and two integer parameters.
+ * It is applicable to the following operations:
+ * <UL>
+ * <LI>AddSection</LI>
+ * <LI>InsertPoints</LI>
+ * <LI>SetCoordinates</LI>
+ * </UL>
+ * @return true in case of success; false otherwise.
+ */
+ bool init(const Type theType, const CurveCreator::Coordinates &theCoords,
+ const int theIntParam1, const int theIntParam2);
+
+ /**
+ * This method applies the current operation to theCurve.
+ */
+ void apply(CurveCreator_Curve *theCurve);
+
+private:
+
+ /**
+ * This method allocates required memory for the operation data.
+ * Returns myPData for convenience purpose.
+ */
+ void *allocate(const size_t theSize);
+
+ /**
+ * This method clears initialized data pointers.
+ */
+ void clear();
+
+ /**
+ * This method returns the coordinates read from thePInt.
+ */
+ void getCoords(int *thePInt, CurveCreator::Coordinates &theCoords) const;
+
+private:
+
+ Type myType;
+ void *myPData;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_PointItem.cxx
+// Created: Wed Jul 10 12:17:47 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_PointItem.h>
+#include <QVariant>
+
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_PointItem::CurveCreator_PointItem
+ (const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ QListWidget *theParent)
+ : QListWidgetItem(theParent, ITEM_TYPE_XY)
+{
+ setCoord(theX, theY);
+}
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_PointItem::CurveCreator_PointItem
+ (const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ const CurveCreator::TypeCoord theZ,
+ QListWidget *theParent)
+ : QListWidgetItem(theParent, ITEM_TYPE_XYZ)
+{
+ setCoord(theX, theY, theZ);
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_PointItem::~CurveCreator_PointItem()
+{
+}
+
+//=======================================================================
+// function: getText
+// purpose:
+//=======================================================================
+QString CurveCreator_PointItem::getText(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY)
+{
+ return QObject::tr("CC_PNT_ITEM_X_Y").arg(theX).arg(theY);
+}
+
+//=======================================================================
+// function: getText
+// purpose:
+//=======================================================================
+QString CurveCreator_PointItem::getText(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ const CurveCreator::TypeCoord theZ)
+{
+ return QObject::tr("CC_PNT_ITEM_X_Y_Z").arg(theX).arg(theY).arg(theZ);
+}
+
+//=======================================================================
+// function: setCoord
+// purpose:
+//=======================================================================
+void CurveCreator_PointItem::setCoord(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY)
+{
+ if (!is3d()) {
+ setData(ROLE_X, theX);
+ setData(ROLE_Y, theY);
+ setText(getText(theX, theY));
+ }
+}
+
+//=======================================================================
+// function: setCoord
+// purpose:
+//=======================================================================
+void CurveCreator_PointItem::setCoord(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ const CurveCreator::TypeCoord theZ)
+{
+ if (is3d()) {
+ setData(ROLE_X, theX);
+ setData(ROLE_Y, theY);
+ setData(ROLE_Z, theZ);
+ setText(getText(theX, theY, theZ));
+ }
+}
+
+//=======================================================================
+// function: getX
+// purpose:
+//=======================================================================
+CurveCreator::TypeCoord CurveCreator_PointItem::getX() const
+{
+ return data(ROLE_X).value<CurveCreator::TypeCoord>();
+}
+
+//=======================================================================
+// function: getY
+// purpose:
+//=======================================================================
+CurveCreator::TypeCoord CurveCreator_PointItem::getY() const
+{
+ return data(ROLE_Y).value<CurveCreator::TypeCoord>();
+}
+
+//=======================================================================
+// function: getZ
+// purpose:
+//=======================================================================
+CurveCreator::TypeCoord CurveCreator_PointItem::getZ() const
+{
+ return (is3d() ? data(ROLE_Z).value<CurveCreator::TypeCoord>() : 0.);
+}
+
+//=======================================================================
+// function: is3d
+// purpose:
+//=======================================================================
+bool CurveCreator_PointItem::is3d() const
+{
+ return (type() == ITEM_TYPE_XYZ);
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_PointItem.h
+// Created: Wed Jul 10 12:17:40 2013
+// Author: Sergey KHROMOV
+//
+
+
+#ifndef _CurveCreator_PointItem_HeaderFile
+#define _CurveCreator_PointItem_HeaderFile
+
+
+#include <QListWidgetItem>
+#include <CurveCreator.hxx>
+
+
+#define ITEM_TYPE_XY QListWidgetItem::UserType + 1
+#define ITEM_TYPE_XYZ QListWidgetItem::UserType + 2
+#define ROLE_X Qt::UserRole + 1
+#define ROLE_Y Qt::UserRole + 2
+#define ROLE_Z Qt::UserRole + 3
+
+/**
+ * This class represents a list widget item to facilitate storage
+ * of 2d or 3d points in a list widget. The type of a stored point
+ * (2d or 3d) is determined by a constructor chosen to create an object.
+ */
+class CurveCreator_PointItem : public QListWidgetItem
+{
+
+public:
+
+ /**
+ * Constructor. Initializes the object with 2d point.
+ */
+ CurveCreator_PointItem(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ QListWidget * theParent = 0);
+
+ /**
+ * Constructor. Initializes the object with 3d point.
+ */
+ CurveCreator_PointItem(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ const CurveCreator::TypeCoord theZ,
+ QListWidget * theParent = 0);
+
+ /**
+ * Destructor
+ */
+ ~CurveCreator_PointItem();
+
+ /**
+ * This static method is used to construct the text to be displayed by this
+ * item for 2d point.
+ */
+ static QString getText(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY);
+
+ /**
+ * This static method is used to construct the text to be displayed by this
+ * item for 3d point.
+ */
+ static QString getText(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ const CurveCreator::TypeCoord theZ);
+
+ /**
+ * This method sets the coordinates for 2d point. If the object has type
+ * 3d point this method does nothing.
+ */
+ void setCoord(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY);
+
+ /**
+ * This method sets the coordinates for 3d point. If the object has type
+ * 2d point this method does nothing.
+ */
+ void setCoord(const CurveCreator::TypeCoord theX,
+ const CurveCreator::TypeCoord theY,
+ const CurveCreator::TypeCoord theZ);
+
+ /**
+ * Query the X coordinate of the point.
+ */
+ CurveCreator::TypeCoord getX() const;
+
+ /**
+ * Query the Y coordinate of the point.
+ */
+ CurveCreator::TypeCoord getY() const;
+
+ /**
+ * Query the Z coordinate of the point. Return 0 for the type 2d point.
+ */
+ CurveCreator::TypeCoord getZ() const;
+
+ /**
+ * Returns true if the type of the stored point is 3d; false otherwise.
+ */
+ bool is3d() const;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Section.hxx
+// Created: Tue Jun 25 16:04:25 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_Section_HeaderFile
+#define _CurveCreator_Section_HeaderFile
+
+
+#include <CurveCreator.hxx>
+
+
+//! Structure to store sections representing the CurveCreator_Curve object
+struct CurveCreator_Section
+{
+ //! Constructor. Initializes object with default values.
+ CurveCreator_Section() : myType(CurveCreator::Polyline), myIsClosed(false)
+ { }
+
+ CurveCreator::Coordinates myPoints; //!< points coordinates
+ CurveCreator::Type myType; //!< type of the section
+ bool myIsClosed; //!< closed or not
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_UndoOptsDlg.cxx
+// Created: Wed Jul 17 12:50:46 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_UndoOptsDlg.h>
+#include <QButtonGroup>
+#include <QGridLayout>
+#include <QGroupBox>
+#include <QIntValidator>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QRadioButton>
+
+#define UNDO_DEPTH_UNLIMITED 0
+#define UNDO_DEPTH_DISABLED 1
+#define UNDO_DEPTH_FIX_SIZE 2
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_UndoOptsDlg::CurveCreator_UndoOptsDlg(QWidget* parent)
+ : QDialog (parent),
+ myUndoDepth (UNDO_DEPTH_UNLIMITED),
+ myOptsBtnGrp (NULL),
+ myBufferSizeEdit (NULL),
+ myOkBtn (NULL),
+ myCancelBtn (NULL)
+{
+ setWindowTitle(tr("CC_UNDO_OPTIONS_TITLE"));
+
+ // Set Undo/Redo options group
+ QGroupBox *anUndoOptsGrp =
+ new QGroupBox(tr("CC_UNDO_OPTIONS_MODIFY"));
+ QGridLayout *anUndoOptsLO = new QGridLayout(anUndoOptsGrp);
+ QRadioButton *aDisabledRdBtn =
+ new QRadioButton(tr("CC_UNDO_OPTIONS_DISABLED"), anUndoOptsGrp);
+ QRadioButton *aFixSizeRdBtn =
+ new QRadioButton(tr("CC_UNDO_OPTIONS_FIXED_SIZE"), anUndoOptsGrp);
+ QRadioButton *anUnlimRdBtn =
+ new QRadioButton(tr("CC_UNDO_OPTIONS_UNLIMITED"), anUndoOptsGrp);
+
+ myOptsBtnGrp = new QButtonGroup(anUndoOptsGrp);
+ myBufferSizeEdit = new QLineEdit(anUndoOptsGrp);
+ anUndoOptsLO->setMargin(9);
+ anUndoOptsLO->setSpacing(6);
+ anUndoOptsLO->addWidget(aDisabledRdBtn, 0, 0);
+ anUndoOptsLO->addWidget(aFixSizeRdBtn, 1, 0);
+ anUndoOptsLO->addWidget(anUnlimRdBtn, 2, 0);
+ anUndoOptsLO->addWidget(myBufferSizeEdit, 1, 1);
+ myOptsBtnGrp->addButton(anUnlimRdBtn, UNDO_DEPTH_UNLIMITED);
+ myOptsBtnGrp->addButton(aDisabledRdBtn, UNDO_DEPTH_DISABLED);
+ myOptsBtnGrp->addButton(aFixSizeRdBtn, UNDO_DEPTH_FIX_SIZE);
+
+ // Set OK/Cancel buttons group
+ QGroupBox *anOkCancelGrp = new QGroupBox;
+ QGridLayout *anOkCancelLO = new QGridLayout(anOkCancelGrp);
+
+ myOkBtn = new QPushButton(tr("GEOM_BUT_OK"), anOkCancelGrp);
+ myCancelBtn = new QPushButton(tr("GEOM_BUT_CANCEL"), anOkCancelGrp);
+ anOkCancelLO->setMargin(9);
+ anOkCancelLO->setSpacing(6);
+ anOkCancelLO->addWidget(myOkBtn, 0, 0);
+ anOkCancelLO->addWidget(myCancelBtn, 0, 1);
+
+ // Set main group
+ QGroupBox *aMainGrp = new QGroupBox;
+ QVBoxLayout *aMainLO = new QVBoxLayout(aMainGrp);
+
+ aMainLO->addWidget(anUndoOptsGrp);
+ aMainLO->addWidget(anOkCancelGrp);
+
+ setLayout(aMainLO);
+
+ init();
+}
+
+//=======================================================================
+// function: Destructor
+// purpose:
+//=======================================================================
+CurveCreator_UndoOptsDlg::~CurveCreator_UndoOptsDlg()
+{
+}
+
+//=======================================================================
+// function: setUndoDepth
+// purpose:
+//=======================================================================
+void CurveCreator_UndoOptsDlg::setUndoDepth(const int theDepth)
+{
+ myUndoDepth = theDepth;
+
+ const int aDepthId = myUndoDepth + 1;
+ int anId = UNDO_DEPTH_FIX_SIZE;
+
+ if (aDepthId == UNDO_DEPTH_UNLIMITED ||
+ aDepthId == UNDO_DEPTH_DISABLED) {
+ anId = aDepthId;
+ } else if (myUndoDepth > 0) {
+ myBufferSizeEdit->setText(QString::number(myUndoDepth));
+ }
+
+ myOptsBtnGrp->button(anId)->setChecked(true);
+ optionChanged(anId);
+}
+
+//=======================================================================
+// function: getUndoDepth
+// purpose:
+//=======================================================================
+int CurveCreator_UndoOptsDlg::getUndoDepth() const
+{
+ return myUndoDepth;
+}
+
+//=======================================================================
+// function: isEnabled
+// purpose:
+//=======================================================================
+bool CurveCreator_UndoOptsDlg::isEnabled() const
+{
+ return (myUndoDepth + 1 != UNDO_DEPTH_DISABLED);
+}
+
+//=======================================================================
+// function: isUnlimited
+// purpose:
+//=======================================================================
+bool CurveCreator_UndoOptsDlg::isUnlimited() const
+{
+ return (myUndoDepth + 1 == UNDO_DEPTH_UNLIMITED);
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+void CurveCreator_UndoOptsDlg::init()
+{
+ // Initialize sections group.
+ myOptsBtnGrp->setExclusive(true);
+ myOptsBtnGrp->button(UNDO_DEPTH_UNLIMITED)->setChecked(true);
+ connect(myOptsBtnGrp, SIGNAL(buttonClicked(int)),
+ this, SLOT(optionChanged(int)));
+
+ // Initialize line edit.
+ QIntValidator *aValidator = new QIntValidator(myBufferSizeEdit);
+
+ aValidator->setBottom(1);
+ myBufferSizeEdit->setValidator(aValidator);
+ optionChanged(UNDO_DEPTH_UNLIMITED);
+
+ // Init buttons.
+ myOkBtn->setDefault(true);
+
+ connect(myOkBtn, SIGNAL(clicked()), this, SLOT(accept()));
+ connect(myCancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
+
+ setTabOrder();
+}
+
+//=======================================================================
+// function: setTabOrder
+// purpose:
+//=======================================================================
+void CurveCreator_UndoOptsDlg::setTabOrder()
+{
+ QWidget::setTabOrder(myOptsBtnGrp->button(UNDO_DEPTH_DISABLED),
+ myOptsBtnGrp->button(UNDO_DEPTH_FIX_SIZE));
+ QWidget::setTabOrder(myOptsBtnGrp->button(UNDO_DEPTH_FIX_SIZE),
+ myBufferSizeEdit);
+ QWidget::setTabOrder(myBufferSizeEdit,
+ myOptsBtnGrp->button(UNDO_DEPTH_UNLIMITED));
+ QWidget::setTabOrder(myOptsBtnGrp->button(UNDO_DEPTH_UNLIMITED), myOkBtn);
+ QWidget::setTabOrder(myOkBtn, myCancelBtn);
+}
+
+//=======================================================================
+// function: optionChanged
+// purpose:
+//=======================================================================
+void CurveCreator_UndoOptsDlg::optionChanged(int theId)
+{
+ switch (theId) {
+ case UNDO_DEPTH_FIX_SIZE:
+ myBufferSizeEdit->setEnabled(true);
+ break;
+ case UNDO_DEPTH_UNLIMITED:
+ case UNDO_DEPTH_DISABLED:
+ default:
+ myBufferSizeEdit->setEnabled(false);
+ break;
+ }
+}
+
+//=======================================================================
+// function: accept
+// purpose:
+//=======================================================================
+void CurveCreator_UndoOptsDlg::accept()
+{
+ const int anId = myOptsBtnGrp->checkedId();
+
+ switch (anId) {
+ case UNDO_DEPTH_FIX_SIZE:
+ myUndoDepth = myBufferSizeEdit->text().toInt();
+ break;
+ case UNDO_DEPTH_UNLIMITED:
+ case UNDO_DEPTH_DISABLED:
+ myUndoDepth = anId - 1;
+ break;
+ default:
+ break;
+ }
+
+ QDialog::accept();
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_UndoOptsDlg.h
+// Created: Wed Jul 17 12:50:42 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_UndoOptsDlg_HeaderFile
+#define _CurveCreator_UndoOptsDlg_HeaderFile
+
+
+#include <QDialog>
+
+class QButtonGroup;
+class QLineEdit;
+class QPushButton;
+
+
+class CurveCreator_UndoOptsDlg : public QDialog
+{
+ Q_OBJECT
+
+public:
+
+ CurveCreator_UndoOptsDlg(QWidget* parent);
+
+ ~CurveCreator_UndoOptsDlg();
+
+ void setUndoDepth(const int theDepth);
+
+ int getUndoDepth() const;
+
+ bool isEnabled() const;
+
+ bool isUnlimited() const;
+
+private:
+
+ void init();
+
+ void setTabOrder();
+
+private slots:
+
+ void optionChanged(int theId);
+
+ void accept();
+
+protected:
+
+ int myUndoDepth;
+ QButtonGroup *myOptsBtnGrp;
+ QLineEdit *myBufferSizeEdit;
+ QPushButton *myOkBtn;
+ QPushButton *myCancelBtn;
+
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Widget.cxx
+// Created: Mon Jul 01 12:49:31 2013
+// Author: Sergey KHROMOV
+//
+
+
+#include <CurveCreator_Widget.h>
+#include <CurveCreator_EditPntsWidget.h>
+#include <CurveCreator_UndoOptsDlg.h>
+#include <CurveCreator_EditPntDlg.h>
+#include <CurveCreator_PointItem.h>
+#include <QPushButton>
+#include <QButtonGroup>
+#include <QHBoxLayout>
+#include <QListWidget>
+#include <QGroupBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QRadioButton>
+#include <QComboBox>
+#include <QCheckBox>
+
+#define SECTION_ADD 0
+#define SECTION_MODIFY 1
+#define POLYLINE_INDEX 0
+#define BSPLINE_INDEX 1
+#define UNDO_REDO_DISABLED 0
+#define UNDO_REDO_UNLIMITED -1
+
+//=======================================================================
+// function: Constructor
+// purpose:
+//=======================================================================
+CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
+ CurveCreator_Curve *theCurve,
+ Qt::WindowFlags fl)
+ : QWidget (parent, fl),
+ myEditor (theCurve),
+ myDimension (theCurve == NULL ?
+ CurveCreator::Dim2d : theCurve->getDimension()),
+ myEnabledUndoLbl (NULL),
+ myBufSizeUndoLbl (NULL),
+ myUndoBtn (NULL),
+ myRedoBtn (NULL),
+ myUndoOptsBtn (NULL),
+ myUndoOptsDlg (NULL),
+ myAddSecGrp (NULL),
+ mySecBtnGrp (NULL),
+ mySecTypeCmbBox (NULL),
+ mySecCloseChkBox (NULL),
+ mySecAddModifBtn (NULL),
+ mySecRmBtn (NULL),
+ mySecJoinBtn (NULL),
+ mySecJoinAllBtn (NULL),
+ mySecClearBtn (NULL),
+ mySecUpBtn (NULL),
+ mySecDownBtn (NULL),
+ mySecList (NULL),
+ myEditSecPnts (NULL),
+ myPntsGrp (NULL),
+ myPntsList (NULL),
+ myPntEditDlg (NULL),
+ myEditPnts (NULL),
+ myAddPntsBtn (NULL),
+ myInsertPntsBtn (NULL),
+ myRmPntsBtn (NULL)
+{
+ setWindowTitle(tr("CC_TITLE"));
+
+ // Set undo/redo options group
+ QGroupBox *anUndoOptsGrp = new QGroupBox(tr("CC_UNDO_REDO_OPTIONS"));
+ QGridLayout *anUndoOptsLO = new QGridLayout(anUndoOptsGrp);
+
+ myEnabledUndoLbl = new QLabel(tr("CC_UNDO_REDO_ENABLED"), anUndoOptsGrp);
+ myBufSizeUndoLbl = new QLabel(tr("CC_UNDO_REDO_BUFFER_SIZE"), anUndoOptsGrp);
+ myUndoOptsBtn = new QPushButton(tr("CC_UNDO_REDO_MODIFY"), anUndoOptsGrp);
+ anUndoOptsLO->setMargin(9);
+ anUndoOptsLO->setSpacing(6);
+ anUndoOptsLO->addWidget(myEnabledUndoLbl, 0, 0);
+ anUndoOptsLO->addWidget(myBufSizeUndoLbl, 1, 0);
+ anUndoOptsLO->addWidget(myUndoOptsBtn, 0, 1, 2, 1);
+
+ // Set undo/redo group
+ QGroupBox *anUndoRedoGrp = new QGroupBox(tr("CC_UNDO_REDO_TITLE"));
+ QHBoxLayout *anUndoRedoLO = new QHBoxLayout(anUndoRedoGrp);
+
+ myUndoBtn = new QPushButton(tr("CC_UNDO"), anUndoRedoGrp);
+ myRedoBtn = new QPushButton(tr("CC_REDO"), anUndoRedoGrp);
+ anUndoRedoLO->setMargin(9);
+ anUndoRedoLO->setSpacing(6);
+ anUndoRedoLO->addWidget(myUndoBtn, 0, Qt::AlignRight);
+ anUndoRedoLO->addWidget(myRedoBtn, 0, Qt::AlignLeft);
+ anUndoRedoLO->addWidget(anUndoOptsGrp, 0, Qt::AlignRight);
+
+ // Set section add/modification group.
+ myAddSecGrp = new QGroupBox(tr("CC_SECTION_ADD_TITLE"));
+
+ QGridLayout *anAddSecLO = new QGridLayout(myAddSecGrp);
+ QLabel *aSectTypeLbl =
+ new QLabel(tr("CC_SECTION_TYPE"), myAddSecGrp);
+ QLabel *aSecPntsLbl =
+ new QLabel(tr("CC_SECTION_POINTS_ADD_LBL"), myAddSecGrp);
+
+ mySecCloseChkBox = new QCheckBox(tr("CC_SECTION_CLOSED"), myAddSecGrp);
+ mySecTypeCmbBox = new QComboBox(myAddSecGrp);
+ mySecAddModifBtn = new QPushButton(tr("CC_SECTION_NEW"), myAddSecGrp);
+ myEditSecPnts = new CurveCreator_EditPntsWidget
+ (myAddSecGrp, true, myDimension);
+ anAddSecLO->setMargin(9);
+ anAddSecLO->setSpacing(6);
+ anAddSecLO->addWidget(mySecCloseChkBox, 0, 0);
+ anAddSecLO->addWidget(aSectTypeLbl, 1, 0);
+ anAddSecLO->addWidget(mySecTypeCmbBox, 1, 1);
+ anAddSecLO->addWidget(aSecPntsLbl, 2, 0);
+ anAddSecLO->addWidget(myEditSecPnts, 2, 1);
+ anAddSecLO->addWidget(mySecAddModifBtn, 1, 3);
+
+ // Set section group
+ QGroupBox *aSecGrp = new QGroupBox(tr("CC_SECTION_TITLE"));
+ QGridLayout *aSecLO = new QGridLayout(aSecGrp);
+ QRadioButton *anAddSecRdBtn =
+ new QRadioButton(tr("CC_SECTION_ADD_TITLE"), aSecGrp);
+ QRadioButton *aModifSecRdBtn =
+ new QRadioButton(tr("CC_SECTION_MODIFY_TITLE"), aSecGrp);
+
+ mySecRmBtn = new QPushButton(tr("CC_SECTION_REMOVE"), aSecGrp);
+ mySecJoinBtn = new QPushButton(tr("CC_SECTION_JOIN"), aSecGrp);
+ mySecJoinAllBtn = new QPushButton(tr("CC_SECTION_JOIN_ALL"), aSecGrp);
+ mySecClearBtn = new QPushButton(tr("CC_SECTION_CLEAR"), aSecGrp);
+ mySecUpBtn = new QPushButton(tr("CC_SECTION_UP"), aSecGrp);
+ mySecDownBtn = new QPushButton(tr("CC_SECTION_DOWN"), aSecGrp);
+ mySecBtnGrp = new QButtonGroup(aSecGrp);
+ mySecList = new QListWidget(aSecGrp);
+ aSecLO->setMargin(9);
+ aSecLO->setSpacing(6);
+ aSecLO->addWidget(anAddSecRdBtn, 0, 0);
+ aSecLO->addWidget(aModifSecRdBtn, 0, 1);
+ aSecLO->addWidget(myAddSecGrp, 1, 0, 1, 5);
+ aSecLO->addWidget(mySecRmBtn, 2, 0);
+ aSecLO->addWidget(mySecJoinBtn, 2, 1);
+ aSecLO->addWidget(mySecJoinAllBtn, 2, 2);
+ aSecLO->addWidget(mySecClearBtn, 2, 3);
+ aSecLO->addWidget(mySecUpBtn, 4, 4);
+ aSecLO->addWidget(mySecDownBtn, 5, 4);
+ aSecLO->addWidget(mySecList, 3, 0, 4, 4);
+ mySecBtnGrp->addButton(anAddSecRdBtn, SECTION_ADD);
+ mySecBtnGrp->addButton(aModifSecRdBtn, SECTION_MODIFY);
+
+ // Set point add/modification group.
+ QGroupBox *anAddPntsGrp = new QGroupBox(tr("CC_POINTS_ADD_TITLE"));
+
+ QGridLayout *anAddPntsLO = new QGridLayout(anAddPntsGrp);
+ QLabel *aPntsLbl =
+ new QLabel(tr("CC_POINTS_ADD_LBL"), anAddPntsGrp);
+
+ myEditPnts = new CurveCreator_EditPntsWidget
+ (anAddPntsGrp, false, myDimension);
+ myAddPntsBtn = new QPushButton(tr("CC_POINTS_ADD"), anAddPntsGrp);
+ myInsertPntsBtn = new QPushButton(tr("CC_POINTS_INSERT"), anAddPntsGrp);
+ anAddPntsLO->setMargin(9);
+ anAddPntsLO->setSpacing(6);
+ anAddPntsLO->addWidget(aPntsLbl, 0, 0);
+ anAddPntsLO->addWidget(myEditPnts, 0, 1);
+ anAddPntsLO->addWidget(myAddPntsBtn, 0, 4);
+ anAddPntsLO->addWidget(myInsertPntsBtn, 1, 4);
+
+ // Set Points group
+ myPntsGrp = new QGroupBox(tr("CC_POINTS_TITLE"));
+
+ QGridLayout *aPntsLO = new QGridLayout(myPntsGrp);
+
+ myPntsList = new QListWidget(myPntsGrp);
+ myRmPntsBtn = new QPushButton(tr("CC_POINTS_REMOVE"), myPntsGrp);
+ aPntsLO->setMargin(9);
+ aPntsLO->setSpacing(6);
+ aPntsLO->addWidget(anAddPntsGrp, 0, 0, 1, 4);
+ aPntsLO->addWidget(myRmPntsBtn, 1, 0);
+ aPntsLO->addWidget(myPntsList, 2, 0, 4, 4);
+
+ // Set main group
+ QGroupBox *aMainGrp = new QGroupBox(tr("CC_TITLE"));
+ QGridLayout *aMainLO = new QGridLayout(aMainGrp);
+
+ aMainLO->setMargin(9);
+ aMainLO->setSpacing(6);
+ aMainLO->addWidget(anUndoRedoGrp, 0, 0, 1, 2);
+ aMainLO->addWidget(aSecGrp, 1, 0);
+ aMainLO->addWidget(myPntsGrp, 1, 1);
+
+ setLayout(aMainLO);
+
+ init();
+}
+
+//=======================================================================
+// function: init
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::init()
+{
+ // Initialize Undo/Redo group.
+ QString anUnlim = tr("CC_UNDO_REDO_UNLIMITED");
+
+ myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_ENABLED"));
+ myBufSizeUndoLbl->setText(tr("CC_UNDO_REDO_BUFFER_SIZE").arg(anUnlim));
+ connect(myUndoOptsBtn, SIGNAL(clicked()), this, SLOT(undoOptionsChanged()));
+ connect(myUndoBtn, SIGNAL(clicked()), this, SLOT(undo()));
+ connect(myRedoBtn, SIGNAL(clicked()), this, SLOT(redo()));
+ updateUndoRedoButtons();
+
+ // Initialize sections group.
+ mySecBtnGrp->setExclusive(true);
+ mySecBtnGrp->button(SECTION_ADD)->setChecked(true);
+ connect(mySecBtnGrp, SIGNAL(buttonClicked(int)),
+ this, SLOT(addModifChanged(int)));
+
+ // Init section buttons.
+ mySecAddModifBtn->setEnabled(true);
+ mySecRmBtn->setEnabled(false);
+ mySecJoinBtn->setEnabled(false);
+ mySecJoinAllBtn->setEnabled(false);
+ mySecClearBtn->setEnabled(false);
+ mySecUpBtn->setEnabled(false);
+ mySecDownBtn->setEnabled(false);
+
+ connect(mySecAddModifBtn, SIGNAL(clicked()),this, SLOT(sectionAddOrModify()));
+ connect(mySecRmBtn, SIGNAL(clicked()),this, SLOT(sectionRemove()));
+ connect(mySecJoinBtn, SIGNAL(clicked()),this, SLOT(sectionJoin()));
+ connect(mySecJoinAllBtn, SIGNAL(clicked()),this, SLOT(sectionJoinAll()));
+ connect(mySecClearBtn, SIGNAL(clicked()),this, SLOT(sectionClear()));
+ connect(mySecUpBtn, SIGNAL(clicked()),this, SLOT(sectionUp()));
+ connect(mySecDownBtn, SIGNAL(clicked()),this, SLOT(sectionDown()));
+
+ // Init section input fields.
+ mySecCloseChkBox->setChecked(false);
+ mySecTypeCmbBox->addItem(tr("CC_SECTION_TYPE_POLYLINE"));
+ mySecTypeCmbBox->addItem(tr("CC_SECTION_TYPE_BSPLINE"));
+ mySecTypeCmbBox->setCurrentIndex(POLYLINE_INDEX);
+ myEditSecPnts->clear();
+
+ // Init sections list widget.
+ mySecList->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+ connect(this, SIGNAL(numberOfItemsChanged(QListWidget *)),
+ this, SLOT(onNumberOfItemsChanged(QListWidget *)));
+ initSections();
+ connect(mySecList, SIGNAL(itemSelectionChanged()),
+ this, SLOT(changeSecSelection()));
+
+ // Init points list widget.
+ myPntsGrp->setEnabled(false);
+ myPntsList->clear();
+ myPntsList->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+ connect(myPntsList, SIGNAL(itemSelectionChanged()),
+ this, SLOT(changePntsSelection()));
+ connect(myPntsList, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
+ this, SLOT(editPnt(QListWidgetItem *)));
+
+ // Init points buttons.
+ connect(myAddPntsBtn, SIGNAL(clicked()),this, SLOT(pntsAdd()));
+ connect(myInsertPntsBtn, SIGNAL(clicked()),this, SLOT(pntsInsert()));
+ connect(myRmPntsBtn, SIGNAL(clicked()),this, SLOT(pntsRemove()));
+
+ // Init edit points widgets.
+ myEditSecPnts->setPointsList(myPntsList);
+ myEditPnts->setPointsList(myPntsList);
+
+ // Set tab order
+ setTabOrder();
+}
+
+//=======================================================================
+// function: initSections
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::initSections()
+{
+ CurveCreator_Curve *aCurve = myEditor.getCurve();
+
+ const int aNbSections = aCurve->getNbSections();
+ int i;
+
+ mySecList->clear();
+
+ for (i = 0; i < aNbSections; i++) {
+ addSectionItem(aCurve->getType(i), aCurve->isClosed(i));
+ }
+
+ emit numberOfItemsChanged(mySecList);
+}
+
+//=======================================================================
+// function: addSectionItem
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::addSectionItem(const CurveCreator::Type theType,
+ const bool isClosed)
+{
+ const int aRow = mySecList->count();
+
+ new QListWidgetItem(mySecList);
+ updateSectionItem(aRow, theType, isClosed);
+ emit numberOfItemsChanged(mySecList);
+}
+
+//=======================================================================
+// function: updateSectionItem
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::updateSectionItem(const int theRow,
+ const CurveCreator::Type theType,
+ const bool isClosed)
+{
+ QListWidgetItem *anItem = mySecList->item(theRow);
+ QString aStrType;
+
+ if (theType == CurveCreator::Polyline) {
+ aStrType = tr("CC_SECTION_ITEM_POLYLINE");
+ } else {
+ aStrType = tr("CC_SECTION_ITEM_BSPLINE");
+ }
+
+ const QString aTrCode =
+ (isClosed ? "CC_SECTION_ITEM_CLOSED" : "CC_SECTION_ITEM");
+
+ anItem->setText(tr(aTrCode.toLatin1().constData()).arg(aStrType));
+}
+
+//=======================================================================
+// function: sectionMove
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionMove(const int theShift)
+{
+ // Sort list items in ascending or descending order depending on
+ // the sign of theShift.
+ QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
+
+ if (!aListItems.empty() && theShift != 0) {
+ QMap<int, QListWidgetItem *> aMapItems;
+
+ foreach(QListWidgetItem *anItem, aListItems) {
+ int aRow = mySecList->row(anItem);
+
+ if (theShift > 0) {
+ aRow = -aRow;
+ }
+
+ aMapItems.insert(aRow, anItem);
+ }
+
+ // Compute new rows
+ QList<int> aListRows = aMapItems.keys();
+ QList<int> aListNewRows;
+ int i;
+ const int aSize = aListRows.size();
+
+
+ if (theShift < 0) {
+ // Check each row to be positive.
+ int aMinIndex = 0;
+
+ for (i = 0; i < aSize; i++) {
+ int aRow = aListRows[i] + theShift;
+
+ if (aRow < aMinIndex) {
+ aRow = aMinIndex++;
+ }
+
+ aListNewRows.append(aRow);
+ }
+ } else {
+ // Check each row to be not greater then a mySecList's size.
+ int aMaxIndex = mySecList->count() - 1;
+
+ for (i = 0; i < aSize; i++) {
+ int aRow = -aListRows[i] + theShift;
+
+ if (aRow > aMaxIndex) {
+ aRow = aMaxIndex--;
+ }
+
+ aListRows[i] = -aListRows[i];
+ aListNewRows.append(aRow);
+ }
+ }
+
+ // Move each item to another position.
+ for (i = 0; i < aSize; i++) {
+ if (aListRows[i] != aListNewRows[i]) {
+ QListWidgetItem *anItem = mySecList->takeItem(aListRows[i]);
+
+ // Move section.
+ mySecList->insertItem(aListNewRows[i], anItem);
+ myEditor.moveSection(aListRows[i], aListNewRows[i]);
+ }
+ }
+
+ // Select added items.
+ foreach (int anIndex, aListNewRows) {
+ mySecList->item(anIndex)->setSelected(true);
+ }
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+}
+
+//=======================================================================
+// function: initPoints
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::initPoints(const int theSectionIndex)
+{
+ // Clear the points list
+ const int aNbPnts = myPntsList->count();
+
+ myPntsList->clear();
+
+ if (theSectionIndex < 0) {
+ if (aNbPnts > 0) {
+ emit numberOfItemsChanged(myPntsList);
+ }
+ } else {
+ // Fill the points list with the points of the section.
+ const CurveCreator::Coordinates &aPoints =
+ myEditor.getCurve()->getPoints(theSectionIndex);
+ const int aNbCoords = aPoints.size();
+
+ if (aNbCoords % myDimension == 0) {
+ int i = 0;
+
+ while (i < aNbCoords) {
+ const CurveCreator::TypeCoord aX = aPoints[i++];
+ const CurveCreator::TypeCoord aY = aPoints[i++];
+
+ if (myDimension == CurveCreator::Dim3d) {
+ const CurveCreator::TypeCoord aZ = aPoints[i++];
+
+ new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
+ } else {
+ new CurveCreator_PointItem(aX, aY, myPntsList);
+ }
+ }
+ }
+
+ if (aNbPnts != aNbCoords/myDimension) {
+ emit numberOfItemsChanged(myPntsList);
+ }
+ }
+}
+
+//=======================================================================
+// function: getCurrentSectionIndex
+// purpose:
+//=======================================================================
+int CurveCreator_Widget::getCurrentSectionIndex()
+{
+ int anIndex = -1;
+ QList<QListWidgetItem *> aListSec = mySecList->selectedItems();
+
+ if (aListSec.size() == 1) {
+ anIndex = mySecList->row(aListSec.first());
+ }
+
+ return anIndex;
+}
+
+//=======================================================================
+// function: updateUndoRedo
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::updateUndoRedo()
+{
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+
+ // Update sections.
+ CurveCreator_Curve *aCurve = myEditor.getCurve();
+ const bool isKeepSelection = (mySecList->count() == aCurve->getNbSections());
+ QList<int> aSelectedRows;
+ QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
+
+ if (isKeepSelection) {
+ foreach (QListWidgetItem *anItem, aListItems) {
+ aSelectedRows.append(mySecList->row(anItem));
+ }
+ }
+
+ initSections();
+
+ // Set selection.
+ if (isKeepSelection) {
+ foreach (int aRow, aSelectedRows) {
+ mySecList->item(aRow)->setSelected(true);
+ }
+ }
+
+ changeSecSelection();
+}
+
+//=======================================================================
+// function: updateUndoRedoButtons
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::updateUndoRedoButtons()
+{
+ // Update undo/redo buttons.
+ const int anUndoDepth = myEditor.getUndoDepth();
+
+ if (anUndoDepth == UNDO_REDO_DISABLED) {
+ myUndoBtn->setEnabled(false);
+ myRedoBtn->setEnabled(false);
+ } else {
+ myUndoBtn->setEnabled(myEditor.getNbUndo() > 0);
+ myRedoBtn->setEnabled(myEditor.getNbRedo() > 0);
+ }
+}
+
+
+//=======================================================================
+// function: setTabOrder
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::setTabOrder()
+{
+ QWidget::setTabOrder(myUndoBtn, myRedoBtn);
+ QWidget::setTabOrder(myRedoBtn, myUndoOptsBtn);
+ QWidget::setTabOrder(myUndoOptsBtn, mySecBtnGrp->button(SECTION_ADD));
+ QWidget::setTabOrder(mySecBtnGrp->button(SECTION_ADD),
+ mySecBtnGrp->button(SECTION_MODIFY));
+ QWidget::setTabOrder(mySecBtnGrp->button(SECTION_MODIFY), mySecCloseChkBox);
+ QWidget::setTabOrder(mySecCloseChkBox, mySecTypeCmbBox);
+ QWidget::setTabOrder(mySecTypeCmbBox, myEditSecPnts->getPointsEdit());
+ QWidget::setTabOrder(myEditSecPnts->getPointsEdit(),
+ myEditSecPnts->getPointsButton());
+ QWidget::setTabOrder(myEditSecPnts->getPointsButton(), mySecAddModifBtn);
+ QWidget::setTabOrder(mySecAddModifBtn, mySecRmBtn);
+ QWidget::setTabOrder(mySecRmBtn, mySecJoinBtn);
+ QWidget::setTabOrder(mySecJoinBtn, mySecJoinAllBtn);
+ QWidget::setTabOrder(mySecJoinAllBtn, mySecClearBtn);
+ QWidget::setTabOrder(mySecClearBtn, mySecList);
+ QWidget::setTabOrder(mySecList, mySecUpBtn);
+ QWidget::setTabOrder(mySecUpBtn, mySecDownBtn);
+ QWidget::setTabOrder(mySecDownBtn, myEditPnts->getPointsEdit());
+ QWidget::setTabOrder(myEditPnts->getPointsEdit(),
+ myEditPnts->getPointsButton());
+ QWidget::setTabOrder(myEditPnts->getPointsButton(), myAddPntsBtn);
+ QWidget::setTabOrder(myAddPntsBtn, myInsertPntsBtn);
+ QWidget::setTabOrder(myInsertPntsBtn, myRmPntsBtn);
+ QWidget::setTabOrder(myRmPntsBtn, myPntsList);
+}
+
+//=======================================================================
+// function: undoOptionsChanged
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::undoOptionsChanged()
+{
+ if (myUndoOptsDlg == NULL) {
+ // Create the dialog.
+ myUndoOptsDlg = new CurveCreator_UndoOptsDlg(this);
+ }
+
+ // set undo depth.
+ myUndoOptsDlg->setUndoDepth(myEditor.getUndoDepth());
+
+ const int aResult = myUndoOptsDlg->exec();
+
+ if (aResult == QDialog::Accepted) {
+ // Get undo depth.
+ const int anUndoDepth = myUndoOptsDlg->getUndoDepth();
+ const bool isEnabled = myUndoOptsDlg->isEnabled();
+
+ myEditor.setUndoDepth(anUndoDepth);
+
+ // Update options labels.
+ myBufSizeUndoLbl->setVisible(isEnabled);
+
+ if (isEnabled) {
+ QString aSize;
+
+ if (myUndoOptsDlg->isUnlimited()) {
+ aSize = tr("CC_UNDO_REDO_UNLIMITED");
+ } else {
+ aSize = QString::number(anUndoDepth);
+ }
+
+ myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_ENABLED"));
+ myBufSizeUndoLbl->setText(tr("CC_UNDO_REDO_BUFFER_SIZE").arg(aSize));
+ } else {
+ myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_DISABLED"));
+ }
+ }
+
+ // Update Undo Redo buttons.
+ updateUndoRedoButtons();
+}
+
+//=======================================================================
+// function: sectionAddOrModify
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionAddOrModify()
+{
+ const bool isClosed = mySecCloseChkBox->isChecked();
+ CurveCreator::Type aType;
+
+ if (mySecTypeCmbBox->currentIndex() == POLYLINE_INDEX) {
+ aType = CurveCreator::Polyline;
+ } else {
+ aType = CurveCreator::BSpline;
+ }
+
+ if (mySecBtnGrp->checkedId() == SECTION_MODIFY) {
+ // Modify section mode.
+ QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
+
+ if (aListItems.size() == 1) {
+ const int aRow = mySecList->row(aListItems.first());
+ bool isModified = false;
+ CurveCreator_Curve *aCurve = myEditor.getCurve();
+
+
+ if (aCurve->getType(aRow) != aType) {
+ // Set type.
+ isModified = true;
+ myEditor.setType(aType, aRow);
+ }
+
+ if (aCurve->isClosed(aRow) != isClosed) {
+ // Set closed flag.
+ isModified = true;
+ myEditor.setClosed(isClosed, aRow);
+ }
+
+ if (isModified) {
+ updateSectionItem(aRow, aType, isClosed);
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+ }
+ } else {
+ // Add section mode. Add section.
+ myEditor.addSection(aType, isClosed, myEditSecPnts->getPoints());
+ addSectionItem(aType, isClosed);
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+}
+
+//=======================================================================
+// function: secButtonClicked
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::addModifChanged(int theId)
+{
+ if (theId == SECTION_ADD) {
+ // Add section
+ myAddSecGrp->setTitle(tr("CC_SECTION_ADD_TITLE"));
+ mySecAddModifBtn->setText(tr("CC_SECTION_NEW"));
+ myEditSecPnts->setEnabled(true);
+ mySecAddModifBtn->setEnabled(true);
+ } else {
+ // Modify section
+ myAddSecGrp->setTitle(tr("CC_SECTION_MODIFICATION_TITLE"));
+ mySecAddModifBtn->setText(tr("CC_SECTION_MODIFY"));
+ myEditSecPnts->setEnabled(false);
+ changeSecSelection();
+ }
+}
+
+//=======================================================================
+// function: changeSecSelection
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::changeSecSelection()
+{
+ // Update modify button and section data.
+ QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
+ const int aNbItems = aListItems.size();
+
+ if (mySecBtnGrp->checkedId() == SECTION_MODIFY) {
+ // Modify section mode.
+ if (aNbItems == 1) {
+ // Initialize type and closed flags.
+ CurveCreator_Curve *aCurve = myEditor.getCurve();
+ const int anIndex = mySecList->row(aListItems.first());
+
+ mySecAddModifBtn->setEnabled(true);
+ mySecCloseChkBox->setChecked(aCurve->isClosed(anIndex));
+
+ if (aCurve->getType(anIndex) == CurveCreator::Polyline) {
+ mySecTypeCmbBox->setCurrentIndex(POLYLINE_INDEX);
+ } else {
+ mySecTypeCmbBox->setCurrentIndex(BSPLINE_INDEX);
+ }
+ } else if (mySecAddModifBtn->isEnabled()) {
+ mySecAddModifBtn->setEnabled(false);
+ }
+ } else {
+ // Add section mode.
+ mySecAddModifBtn->setEnabled(true);
+ }
+
+ // Set enabled remove, up and down points.
+ bool isEnabled = (aNbItems > 0);
+ const int aCount = mySecList->count();
+
+ mySecRmBtn->setEnabled(isEnabled);
+ isEnabled &= (aNbItems < aCount);
+ mySecUpBtn->setEnabled(isEnabled);
+ mySecDownBtn->setEnabled(isEnabled);
+ mySecJoinBtn->setEnabled(aNbItems == 2);
+
+ // Init points.
+ myPntsGrp->setEnabled(aNbItems == 1);
+
+ if (aNbItems == 1) {
+ const int aSecIndex = mySecList->row(aListItems.first());
+
+ initPoints(aSecIndex);
+ } else {
+ initPoints(-1);
+ }
+}
+
+//=======================================================================
+// function: sectionRemove
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionRemove()
+{
+ QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
+
+ if (!aListItems.empty()) {
+ QList<int> aListRows;
+
+ // Get items rows.
+ foreach(QListWidgetItem *anItem, aListItems) {
+ aListRows.append(mySecList->row(anItem));
+ }
+
+ // Delete items.
+ foreach(QListWidgetItem *anItem, aListItems) {
+ delete anItem;
+ }
+
+ qSort(aListRows);
+
+ // Delete points from curve.
+ const int aNbPnts = aListRows.size();
+ int i;
+
+ for (i = aNbPnts - 1; i >= 0; i--) {
+ myEditor.removeSection(aListRows[i]);
+ }
+
+ // Set the new selection.
+ int aRow = aListRows[0];
+
+ if (aListRows[0] >= mySecList->count()) {
+ aRow = mySecList->count() - 1;
+ }
+
+ if (aRow >= 0) {
+ mySecList->item(aRow)->setSelected(true);
+ }
+
+ emit numberOfItemsChanged(mySecList);
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+}
+
+//=======================================================================
+// function: sectionJoin
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionJoin()
+{
+ QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
+
+ if (aListItems.size() == 2) {
+ int aRowTo = mySecList->row(aListItems.first());
+ int aRowFrom = mySecList->row(aListItems.last());
+
+ if (aRowTo > aRowFrom) {
+ // Swap rows.
+ int aTmp = aRowTo;
+
+ aRowTo = aRowFrom;
+ aRowFrom = aTmp;
+ }
+
+ // Join two sections.
+ myEditor.join(aRowTo, aRowFrom);
+ delete mySecList->takeItem(aRowFrom);
+ emit numberOfItemsChanged(mySecList);
+ // Select the joined item.
+ mySecList->item(aRowTo)->setSelected(true);
+ changeSecSelection();
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+}
+
+//=======================================================================
+// function: sectionJoinAll
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionJoinAll()
+{
+ const int aNbItems = mySecList->count();
+
+ if (aNbItems > 1) {
+ // Join two sections.
+ myEditor.join();
+
+ // Update mySecList.
+ for (int i = 1; i < aNbItems; i++) {
+ delete mySecList->takeItem(1);
+ }
+
+ emit numberOfItemsChanged(mySecList);
+ // Select the joined item.
+ mySecList->item(0)->setSelected(true);
+ changeSecSelection();
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+}
+
+//=======================================================================
+// function: sectionClear
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionClear()
+{
+ bool isEmpty = (mySecList->count() == 0);
+
+ if (!isEmpty) {
+ mySecList->clear();
+ myEditor.clear();
+ emit numberOfItemsChanged(mySecList);
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+}
+
+//=======================================================================
+// function: sectionUp
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionUp()
+{
+ sectionMove(-1);
+}
+
+//=======================================================================
+// function: sectionDown
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::sectionDown()
+{
+ sectionMove(1);
+}
+
+//=======================================================================
+// function: onNumberOfItemsChanged
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::onNumberOfItemsChanged(QListWidget *theListWidget)
+{
+ if (theListWidget == mySecList) {
+ // List of sections is modified.
+ mySecJoinAllBtn->setEnabled(mySecList->count() > 1);
+ mySecClearBtn->setEnabled(mySecList->count() > 0);
+ } else {
+ // List of points is modified.
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+ const int aNbItems = aListItems.size();
+
+ myRmPntsBtn->setEnabled(aNbItems > 0);
+ }
+}
+
+//=======================================================================
+// function: changePntsSelection
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::changePntsSelection()
+{
+ // Update modify buttons and section data.
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+ const int aNbItems = aListItems.size();
+ const int aCount = myPntsList->count();
+
+ myRmPntsBtn->setEnabled(aNbItems > 0);
+ myInsertPntsBtn->setEnabled(aCount == 0 || aNbItems == 1);
+}
+
+//=======================================================================
+// function: editPnt
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::editPnt(QListWidgetItem *theItem)
+{
+ if (theItem != NULL) {
+ if (myPntEditDlg == NULL) {
+ // Create the dialog.
+ myPntEditDlg = new CurveCreator_EditPntDlg(this, myDimension);
+ }
+
+ // Get coordinates.
+ CurveCreator_PointItem *aPntItem = (CurveCreator_PointItem *)theItem;
+ CurveCreator::Coordinates aPoint;
+
+ aPoint.push_back(aPntItem->getX());
+ aPoint.push_back(aPntItem->getY());
+
+ if (myDimension == CurveCreator::Dim3d) {
+ aPoint.push_back(aPntItem->getZ());
+ }
+
+ myPntEditDlg->setPoint(aPoint);
+
+ const int aResult = myPntEditDlg->exec();
+
+ if (aResult == QDialog::Accepted) {
+ // Get the section index.
+ const int aSectionIndex = getCurrentSectionIndex();
+
+ if (aSectionIndex >= 0) {
+ // Update the point.
+ const CurveCreator::Coordinates &aNewPoint = myPntEditDlg->getPoint();
+
+ if (myDimension == CurveCreator::Dim3d) {
+ aPntItem->setCoord(aNewPoint[0], aNewPoint[1], aNewPoint[2]);
+ } else {
+ aPntItem->setCoord(aNewPoint[0], aNewPoint[1]);
+ }
+
+ // Update curve
+ const int aPntIndex = myPntsList->row(theItem);
+
+ myEditor.setCoordinates(aNewPoint, aSectionIndex, aPntIndex);
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+ }
+ }
+}
+
+//=======================================================================
+// function: pntsAdd
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::pntsAdd()
+{
+ const CurveCreator::Coordinates &aNewPoints = myEditPnts->getPoints();
+ const int aNbCoords = aNewPoints.size();
+
+ if (aNbCoords > 0 && aNbCoords % myDimension == 0) {
+ // Get the section index.
+ const int aSectionIndex = getCurrentSectionIndex();
+
+ if (aSectionIndex >= 0) {
+ // Update list.
+ int i = 0;
+
+ while (i < aNbCoords) {
+ const CurveCreator::TypeCoord aX = aNewPoints[i++];
+ const CurveCreator::TypeCoord aY = aNewPoints[i++];
+
+ if (myDimension == CurveCreator::Dim3d) {
+ const CurveCreator::TypeCoord aZ = aNewPoints[i++];
+
+ new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
+ } else {
+ new CurveCreator_PointItem(aX, aY, myPntsList);
+ }
+ }
+
+ // Update curve
+ myEditor.addPoints(aNewPoints, aSectionIndex);
+ emit numberOfItemsChanged(myPntsList);
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+ }
+}
+
+//=======================================================================
+// function: pntsInsert
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::pntsInsert()
+{
+ const CurveCreator::Coordinates &aNewPoints = myEditPnts->getPoints();
+ const int aNbCoords = aNewPoints.size();
+
+ if (aNbCoords > 0 && aNbCoords % myDimension == 0) {
+ // Get the section index.
+ const int aSectionIndex = getCurrentSectionIndex();
+
+ if (aSectionIndex >= 0) {
+ // Get the selected point index.
+ int aPntIndex = -1;
+ QList<QListWidgetItem *> aListPnts = myPntsList->selectedItems();
+
+ if (aListPnts.size() == 1) {
+ aPntIndex = myPntsList->row(aListPnts.first());
+ }
+
+ // Update list.
+ int i = 0;
+ int aRow = aPntIndex;
+
+ while (i < aNbCoords) {
+ const CurveCreator::TypeCoord aX = aNewPoints[i++];
+ const CurveCreator::TypeCoord aY = aNewPoints[i++];
+ CurveCreator_PointItem *aNewItem = NULL;
+
+ if (myDimension == CurveCreator::Dim3d) {
+ const CurveCreator::TypeCoord aZ = aNewPoints[i++];
+
+ aNewItem = new CurveCreator_PointItem(aX, aY, aZ);
+ } else {
+ aNewItem = new CurveCreator_PointItem(aX, aY);
+ }
+
+
+ if (aPntIndex < 0) {
+ // Append point.
+ myPntsList->addItem(aNewItem);
+ } else {
+ // Insert point.
+ myPntsList->insertItem(aRow++, aNewItem);
+ }
+ }
+
+ // Update curve
+ myEditor.insertPoints(aNewPoints, aSectionIndex, aPntIndex);
+ emit numberOfItemsChanged(myPntsList);
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+ }
+}
+
+//=======================================================================
+// function: pntsRemove
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::pntsRemove()
+{
+ QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
+ const int aSectionIndex = getCurrentSectionIndex();
+
+ if (aSectionIndex >= 0 && aListItems.size() > 0) {
+ QList<int> aListRows;
+
+ // Get items rows.
+ foreach(QListWidgetItem *anItem, aListItems) {
+ aListRows.append(myPntsList->row(anItem));
+ }
+
+ // Delete items.
+ foreach(QListWidgetItem *anItem, aListItems) {
+ delete anItem;
+ }
+
+ qSort(aListRows);
+
+ // Delete points from curve.
+ const int aNbPnts = aListRows.size();
+ int aNbPntsRm = 1;
+ int aCurRow = aListRows.last();
+ int i;
+
+ for (i = aNbPnts - 2; i >= 0; i--) {
+ if (aListRows[i] == aCurRow - 1) {
+ // This is the previous index.
+ aCurRow--;
+ aNbPntsRm++;
+ } else {
+ // This is not the previous index. Remove the current chain of points.
+ myEditor.removePoints(aSectionIndex, aCurRow, aNbPntsRm);
+ aCurRow = aListRows[i];
+ aNbPntsRm = 1;
+ }
+ }
+
+ // Remove last points.
+ myEditor.removePoints(aSectionIndex, aCurRow, aNbPntsRm);
+
+ emit numberOfItemsChanged(myPntsList);
+
+ // Set the new selection.
+ int aRow = aListRows.first();
+
+ if (aRow >= myPntsList->count()) {
+ aRow = myPntsList->count() - 1;
+ }
+
+ if (aRow >= 0) {
+ myPntsList->item(aRow)->setSelected(true);
+ }
+
+ // Update undo/redo buttons.
+ updateUndoRedoButtons();
+ }
+}
+
+//=======================================================================
+// function: undo
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::undo()
+{
+ if (myEditor.getNbUndo() > 0) {
+ // Perform undo
+ myEditor.undo();
+
+ // Reinitialize required widgets.
+ updateUndoRedo();
+ }
+}
+
+//=======================================================================
+// function: redo
+// purpose:
+//=======================================================================
+void CurveCreator_Widget::redo()
+{
+ if (myEditor.getNbRedo() > 0) {
+ // Perform undo
+ myEditor.redo();
+
+ // Reinitialize required widgets.
+ updateUndoRedo();
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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.
+//
+// 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_Widget.h
+// Created: Mon Jul 01 12:49:21 2013
+// Author: Sergey KHROMOV
+//
+
+#ifndef _CurveCreator_Widget_HeaderFile
+#define _CurveCreator_Widget_HeaderFile
+
+
+#include <QWidget>
+#include <CurveCreator_CurveEditor.hxx>
+
+class CurveCreator_Curve;
+class QGroupBox;
+class QButtonGroup;
+class QComboBox;
+class QCheckBox;
+class QPushButton;
+class QLabel;
+class QListWidget;
+class QListWidgetItem;
+class CurveCreator_EditPntsWidget;
+class CurveCreator_EditPntDlg;
+class CurveCreator_UndoOptsDlg;
+
+
+class CurveCreator_Widget : public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ CurveCreator_Widget(QWidget* parent,
+ CurveCreator_Curve *theCurve,
+ Qt::WindowFlags fl = 0);
+
+private:
+
+ void init();
+
+ void initSections();
+
+ void addSectionItem(const CurveCreator::Type theType, const bool isClosed);
+
+ void updateSectionItem(const int theRow, const CurveCreator::Type theType,
+ const bool isClosed);
+
+ void sectionMove(const int theShift);
+
+ void initPoints(const int theSectionIndex);
+
+ int getCurrentSectionIndex();
+
+ void updateUndoRedo();
+
+ void updateUndoRedoButtons();
+
+ void setTabOrder();
+
+private slots:
+
+ void undoOptionsChanged();
+
+ void sectionAddOrModify();
+
+ void addModifChanged(int theId);
+
+ void changeSecSelection();
+
+ void sectionRemove();
+
+ void sectionJoin();
+
+ void sectionJoinAll();
+
+ void sectionClear();
+
+ void sectionUp();
+
+ void sectionDown();
+
+ void onNumberOfItemsChanged(QListWidget *theListWidget);
+
+ void changePntsSelection();
+
+ void editPnt(QListWidgetItem *theItem);
+
+ void pntsAdd();
+
+ void pntsInsert();
+
+ void pntsRemove();
+
+ void undo();
+
+ void redo();
+
+signals:
+
+ void numberOfItemsChanged(QListWidget *theListWidget);
+
+protected:
+
+ CurveCreator_CurveEditor myEditor;
+ CurveCreator::Dimension myDimension;
+ // Undo/redo widgets
+ QLabel *myEnabledUndoLbl;
+ QLabel *myBufSizeUndoLbl;
+ QPushButton *myUndoBtn;
+ QPushButton *myRedoBtn;
+ QPushButton *myUndoOptsBtn;
+ CurveCreator_UndoOptsDlg *myUndoOptsDlg;
+ // Sections widgets
+ QGroupBox *myAddSecGrp;
+ QButtonGroup *mySecBtnGrp;
+ QComboBox *mySecTypeCmbBox;
+ QCheckBox *mySecCloseChkBox;
+ QPushButton *mySecAddModifBtn;
+ QPushButton *mySecRmBtn;
+ QPushButton *mySecJoinBtn;
+ QPushButton *mySecJoinAllBtn;
+ QPushButton *mySecClearBtn;
+ QPushButton *mySecUpBtn;
+ QPushButton *mySecDownBtn;
+ QListWidget *mySecList;
+ CurveCreator_EditPntsWidget *myEditSecPnts;
+ // Points widgets
+ QGroupBox *myPntsGrp;
+ QListWidget *myPntsList;
+ CurveCreator_EditPntDlg *myPntEditDlg;
+ CurveCreator_EditPntsWidget *myEditPnts;
+ QPushButton *myAddPntsBtn;
+ QPushButton *myInsertPntsBtn;
+ QPushButton *myRmPntsBtn;
+
+};
+
+#endif
--- /dev/null
+# Copyright (C) 2007-2013 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.
+#
+# 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 : Makefile.am
+# Author : Sergey KHROMOV
+# Modified by :
+# Module : GEOM
+#
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+# Libraries targets
+lib_LTLIBRARIES = libCurveCreator.la
+
+# Sources files
+dist_libCurveCreator_la_SOURCES = \
+ CurveCreator_Macro.hxx \
+ CurveCreator.hxx \
+ CurveCreator_Operation.hxx \
+ CurveCreator_Diff.hxx \
+ CurveCreator_Section.hxx \
+ CurveCreator_Curve.hxx \
+ CurveCreator_CurveEditor.hxx \
+ CurveCreator_Operation.cxx \
+ CurveCreator_Diff.cxx \
+ CurveCreator_Curve.cxx \
+ CurveCreator_CurveEditor.cxx
+
+# Header files
+salomeinclude_HEADERS = \
+ CurveCreator_Macro.hxx \
+ CurveCreator.hxx \
+ CurveCreator_Operation.hxx \
+ CurveCreator_Diff.hxx \
+ CurveCreator_Section.hxx \
+ CurveCreator_Curve.hxx \
+ CurveCreator_CurveEditor.hxx
+
+# Compilation options for GUI mode
+if GEOM_ENABLE_GUI
+ dist_libCurveCreator_la_SOURCES += \
+ CurveCreator_PointItem.h \
+ CurveCreator_UndoOptsDlg.h \
+ CurveCreator_EditPntDlg.h \
+ CurveCreator_EditPntsDlg.h \
+ CurveCreator_EditPntsWidget.h \
+ CurveCreator_Widget.h \
+ CurveCreator_PointItem.cxx \
+ CurveCreator_UndoOptsDlg.cxx \
+ CurveCreator_EditPntDlg.cxx \
+ CurveCreator_EditPntsDlg.cxx \
+ CurveCreator_EditPntsWidget.cxx \
+ CurveCreator_Widget.cxx
+
+ salomeinclude_HEADERS += \
+ CurveCreator_PointItem.h \
+ CurveCreator_UndoOptsDlg.h \
+ CurveCreator_EditPntDlg.h \
+ CurveCreator_EditPntsDlg.h \
+ CurveCreator_EditPntsWidget.h \
+ CurveCreator_Widget.h
+
+ MOC_FILES = \
+ CurveCreator_UndoOptsDlg_moc.cxx \
+ CurveCreator_EditPntDlg_moc.cxx \
+ CurveCreator_EditPntsDlg_moc.cxx \
+ CurveCreator_EditPntsWidget_moc.cxx \
+ CurveCreator_Widget_moc.cxx
+
+ nodist_libCurveCreator_la_SOURCES = $(MOC_FILES)
+endif
+
+# additional information to compile and link file
+
+libCurveCreator_la_CPPFLAGS = \
+ $(QT_INCLUDES) \
+ $(CAS_CPPFLAGS) \
+ $(KERNEL_CXXFLAGS)
+
+libCurveCreator_la_LDFLAGS = \
+ $(KERNEL_LDFLAGS) \
+ $(CAS_KERNEL)
<source>GEOM_SELECT_IMAGE</source>
<translation>Select image...</translation>
</message>
+ <message>
+ <source>CC_PNT_ITEM_X_Y</source>
+ <translation>X=%1, Y=%2</translation>
+ </message>
+ <message>
+ <source>CC_PNT_ITEM_X_Y_Z</source>
+ <translation>X=%1, Y=%2, Z=%3</translation>
+ </message>
</context>
<context>
<name>BasicGUI_CurveDlg</name>
<translation>P&ublish And Close</translation>
</message>
</context>
+<context>
+ <name>CurveCreator_Widget</name>
+ <message>
+ <source>CC_TITLE</source>
+ <translation>Curve Creator</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_REDO_TITLE</source>
+ <translation>Undo/Redo operations</translation>
+ </message>
+ <message>
+ <source>CC_UNDO</source>
+ <translation>Undo</translation>
+ </message>
+ <message>
+ <source>CC_REDO</source>
+ <translation>Redo</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_REDO_ENABLED</source>
+ <translation>Status: Enabled</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_REDO_DISABLED</source>
+ <translation>Status: Disabled</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_REDO_BUFFER_SIZE</source>
+ <translation>Undo buffer size: %1</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_REDO_UNLIMITED</source>
+ <translation>Unlimited</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_REDO_OPTIONS</source>
+ <translation>Undo/Redo options</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_REDO_MODIFY</source>
+ <translation>Modify</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_ADD_TITLE</source>
+ <translation>Add section</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_MODIFICATION_TITLE</source>
+ <translation>Section modification</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_TYPE</source>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_CLOSED</source>
+ <translation>Closed</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_NEW</source>
+ <translation>New</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_MODIFY</source>
+ <translation>Modify</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_POINTS_ADD_LBL</source>
+ <translation>Add points</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_TITLE</source>
+ <translation>Sections</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_MODIFY_TITLE</source>
+ <translation>Modify section</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_REMOVE</source>
+ <translation>Remove</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_JOIN</source>
+ <translation>Join</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_JOIN_ALL</source>
+ <translation>Join all</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_CLEAR</source>
+ <translation>Clear</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_UP</source>
+ <translation>Up</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_DOWN</source>
+ <translation>Down</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_ADD_TITLE</source>
+ <translation>Add points</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_MODIFICATION_TITLE</source>
+ <translation>Points modification</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_ADD_LBL</source>
+ <translation>Add points</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_ADD</source>
+ <translation>Add</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_INSERT</source>
+ <translation>Insert</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_TITLE</source>
+ <translation>Points</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_REMOVE</source>
+ <translation>Remove</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_ITEM</source>
+ <translation>%1</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_ITEM_CLOSED</source>
+ <translation>%1, closed</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_ITEM_POLYLINE</source>
+ <translation>Polyline</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_ITEM_BSPLINE</source>
+ <translation>B-spline</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_TYPE_POLYLINE</source>
+ <translation>Polyline</translation>
+ </message>
+ <message>
+ <source>CC_SECTION_TYPE_BSPLINE</source>
+ <translation>B-spline</translation>
+ </message>
+</context>
+<context>
+ <name>CurveCreator_EditPntsWidget</name>
+ <message>
+ <source>CC_SECTION_POINTS_EDIT</source>
+ <translation>Edit section points</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_EDIT</source>
+ <translation>Edit points</translation>
+ </message>
+ <message>
+ <source>CC_POINTS_NUMBER</source>
+ <translation>%1 points</translation>
+ </message>
+</context>
+<context>
+ <name>CurveCreator_EditPntsDlg</name>
+ <message>
+ <source>CC_EDIT_POINTS_TITLE</source>
+ <translation>Edit points</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_ADD_MODIFY</source>
+ <translation>Add or modify points</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_X</source>
+ <translation>X :</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_Y</source>
+ <translation>Y :</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_Z</source>
+ <translation>Z :</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_ADD</source>
+ <translation>Add</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_MODIFY</source>
+ <translation>Modify</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_REMOVE</source>
+ <translation>Remove</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_CLEAR</source>
+ <translation>Clear</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_UP</source>
+ <translation>Up</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINTS_DOWN</source>
+ <translation>Down</translation>
+ </message>
+</context>
+<context>
+ <name>CurveCreator_EditPntDlg</name>
+ <message>
+ <source>CC_EDIT_POINT_TITLE</source>
+ <translation>Edit point</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINT_MODIFY</source>
+ <translation>Modify point</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINT_X</source>
+ <translation>X :</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINT_Y</source>
+ <translation>Y :</translation>
+ </message>
+ <message>
+ <source>CC_EDIT_POINT_Z</source>
+ <translation>Z :</translation>
+ </message>
+</context>
+<context>
+ <name>CurveCreator_UndoOptsDlg</name>
+ <message>
+ <source>CC_UNDO_OPTIONS_TITLE</source>
+ <translation>Undo/Redo options</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_OPTIONS_MODIFY</source>
+ <translation>Modify</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_OPTIONS_DISABLED</source>
+ <translation>Undo/Redo operations disabled</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_OPTIONS_FIXED_SIZE</source>
+ <translation>Fixed Undo/Redo buffer size</translation>
+ </message>
+ <message>
+ <source>CC_UNDO_OPTIONS_UNLIMITED</source>
+ <translation>Unlimited Undo/Redo buffer size</translation>
+ </message>
+</context>
</TS>
case GEOMOp::OpSharedShapes: // MENU OPERATION - GET SHARED SHAPES
case GEOMOp::OpExtrudedBoss: // MENU OPERATION - EXTRUDED BOSS
case GEOMOp::OpExtrudedCut: // MENU OPERATION - EXTRUDED CUT
+#ifdef USE_CURVE_CREATOR
+ case GEOMOp::OpCurveCreator: // MENU OPERATION - CURVE CREATOR
+#endif
libName = "OperationGUI";
break;
case GEOMOp::OpSewing: // MENU REPAIR - SEWING
createGeomAction( GEOMOp::OpSharedShapes, "GET_SHARED_SHAPES" );
createGeomAction( GEOMOp::OpExtrudedCut, "EXTRUDED_CUT" );
createGeomAction( GEOMOp::OpExtrudedBoss, "EXTRUDED_BOSS" );
+#ifdef USE_CURVE_CREATOR
+ createGeomAction( GEOMOp::OpCurveCreator, "CURVE_CREATOR" );
+#endif
createGeomAction( GEOMOp::OpFillet1d, "FILLET_1D" );
createGeomAction( GEOMOp::OpFillet2d, "FILLET_2D" );
createMenu( GEOMOp::OpChamfer, operId, -1 );
createMenu( GEOMOp::OpExtrudedBoss, operId, -1 );
createMenu( GEOMOp::OpExtrudedCut, operId, -1 );
+#ifdef USE_CURVE_CREATOR
+ createMenu( separator(), operId, -1 );
+ createMenu( GEOMOp::OpCurveCreator, operId, -1 );
+#endif
//createMenu( GEOMOp::OpClipping, operId, -1 );
int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
createTool( GEOMOp::OpChamfer, featTbId );
createTool( GEOMOp::OpExtrudedBoss, featTbId );
createTool( GEOMOp::OpExtrudedCut, featTbId );
+#ifdef USE_CURVE_CREATOR
+ createTool( GEOMOp::OpCurveCreator, featTbId );
+#endif
int buildTbId = createTool( tr( "TOOL_BUILD" ) );
createTool( GEOMOp::OpEdge, buildTbId );
OpSharedShapes = 3708, // MENU OPERATION - GET SHARED SHAPES
OpExtrudedBoss = 3709, // MENU OPERATION - ETRUDED BOSS
OpExtrudedCut = 3710, // MENU OPERATION - ETRUDED CUT
+#ifdef USE_CURVE_CREATOR
+ OpCurveCreator = 3711, // MENU OPERATION - CURVE CREATOR
+#endif
// RepairGUI -------------------//--------------------------------
OpSewing = 4000, // MENU REPAIR - SEWING
OpSuppressFaces = 4001, // MENU REPAIR - SUPPRESS FACES
SUBDIRS = ARCHIMEDE NMTDS NMTTools BlockFix GEOMAlgo SKETCHER OCC2VTK GEOM \
BREPExport BREPImport IGESExport IGESImport STEPExport STEPImport \
STLExport VTKExport ShHealOper GEOMUtils GEOMImpl GEOM_I \
- GEOMClient GEOM_I_Superv GEOM_SWIG GEOM_PY
+ GEOMClient GEOM_I_Superv GEOM_SWIG GEOM_PY CurveCreator
if WITH_OPENCV
SUBDIRS += ShapeRecognition
GEOMToolsGUI DisplayGUI BasicGUI PrimitiveGUI GenerationGUI \
EntityGUI BuildGUI BooleanGUI TransformationGUI OperationGUI \
RepairGUI MeasureGUI GroupGUI BlocksGUI AdvancedGUI \
- GEOM_SWIG_WITHIHM GEOM_PY ShapeRecognition
+ GEOM_SWIG_WITHIHM GEOM_PY ShapeRecognition CurveCreator
-I$(srcdir)/../GEOMAlgo \
-I$(srcdir)/../GEOM \
-I$(top_builddir)/src/DlgRef \
- -I$(top_builddir)/idl
+ -I$(top_builddir)/idl \
+ -I$(srcdir)/../CurveCreator
libOperationGUI_la_LDFLAGS = \
../GEOMBase/libGEOMBase.la \
+ ../CurveCreator/libCurveCreator.la \
$(CAS_LDPATH) -lTKFillet \
$(OPENCV_LIBS)
###############################
#include "OperationGUI_GetSharedShapesDlg.h"
#include "OperationGUI_ExtrudedFeatureDlg.h" // Methods EXTRUDED BOSS / CUT
+#ifdef USE_CURVE_CREATOR
+#include <CurveCreator_Widget.h>
+#include <QVBoxLayout>
+#include <QPushButton>
+#endif
+
//=======================================================================
// function : OperationGUI()
// purpose : Constructor
case GEOMOp::OpExtrudedCut: (new OperationGUI_ExtrudedFeatureDlg (CUT, getGeometryGUI(), parent))->show(); break;
case GEOMOp::OpFillet1d: (new OperationGUI_Fillet1d2dDlg (getGeometryGUI(), parent, true))->show(); break;
case GEOMOp::OpFillet2d: (new OperationGUI_Fillet1d2dDlg (getGeometryGUI(), parent, false))->show(); break;
+#ifdef USE_CURVE_CREATOR
+ // The following code is used for testing purpose only.
+ // To be removed when tested functionality is completed.
+ case GEOMOp::OpCurveCreator:
+ {
+ static CurveCreator_Curve *aStaticCurve = NULL;
+
+ if (aStaticCurve == NULL) {
+ aStaticCurve = new CurveCreator_Curve(CurveCreator::Dim3d);
+ }
+
+ QDialog *aDialog = new QDialog(parent);
+ QVBoxLayout *aMainLO = new QVBoxLayout;
+ QPushButton *aQuitButton = new QPushButton(tr("CC_CLOSE"));
+ CurveCreator_Widget *aWidget =
+ new CurveCreator_Widget (aDialog, aStaticCurve);
+
+ connect(aQuitButton, SIGNAL(clicked()), aDialog, SLOT(close()));
+ aMainLO->addWidget(aWidget);
+ aMainLO->addWidget(aQuitButton);
+
+ aDialog->setLayout(aMainLO);
+ aDialog->setAttribute(Qt::WA_DeleteOnClose);
+ aDialog->show();
+ }
+ break;
+#endif
default:
app->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID));
}