0022661: EDF GEOM: [HYDRO] Integration of the polyline editor in GEOM

This commit is contained in:
skv 2014-09-08 16:07:16 +04:00 committed by vsr
parent f4bb8ea64a
commit 8866b5fcd5
78 changed files with 8006 additions and 3195 deletions

View File

@ -67,20 +67,7 @@ OPTION(SALOME_BUILD_TESTS "Build SALOME tests" ON)
OPTION(SALOME_BUILD_GUI "Enable GUI" ON)
CMAKE_DEPENDENT_OPTION(SALOME_GEOM_USE_OPENCV "Enable shape recognition from picture" OFF
"SALOME_BUILD_GUI" OFF)
CMAKE_DEPENDENT_OPTION(SALOME_GEOM_BUILD_CC "Enable curve creator (experimental)" OFF
"SALOME_BUILD_GUI" OFF)
MARK_AS_ADVANCED(SALOME_BUILD_GUI SALOME_GEOM_USE_OPENCV SALOME_GEOM_BUILD_CC)
# Debug options (!!! FOR DEVELOPERS ONLY !!! TO BE REMOVED LATER !!!)
IF(CMAKE_BUILD_TYPE MATCHES "^Debug$")
CMAKE_DEPENDENT_OPTION(SALOME_GEOM_DEBUG_CC "Debug curve creator" OFF
"SALOME_GEOM_BUILD_CC" OFF)
MARK_AS_ADVANCED(SALOME_GEOM_DEBUG_CC)
IF(SALOME_GEOM_DEBUG_CC)
ADD_DEFINITIONS(-DDEBUG_CURVE_CREATOR)
ENDIF(SALOME_GEOM_DEBUG_CC)
ENDIF()
MARK_AS_ADVANCED(SALOME_BUILD_GUI SALOME_GEOM_USE_OPENCV)
# Prerequisites
# =============
@ -242,7 +229,7 @@ SET(_${PROJECT_NAME}_exposed_targets
)
IF(SALOME_BUILD_GUI)
LIST(APPEND _${PROJECT_NAME}_exposed_targets
AdvancedGUI BasicGUI BlocksGUI BooleanGUI BuildGUI DisplayGUI DlgRef EntityGUI GEOMBase
AdvancedGUI BasicGUI BlocksGUI BooleanGUI BuildGUI DisplayGUI DlgRef CurveCreator EntityGUI GEOMBase
GEOMFiltersSelection GEOM GEOMToolsGUI GenerationGUI GroupGUI Material MeasureGUI GEOMObject
OperationGUI PrimitiveGUI RepairGUI TransformationGUI DependencyTree
STLPluginGUI BREPPluginGUI STEPPluginGUI IGESPluginGUI XAOPluginGUI VTKPluginGUI
@ -255,12 +242,6 @@ IF(SALOME_GEOM_USE_OPENCV)
)
ENDIF(SALOME_GEOM_USE_OPENCV)
IF(SALOME_GEOM_BUILD_CC)
LIST(APPEND _${PROJECT_NAME}_exposed_targets
CurveCreator
)
ENDIF(SALOME_GEOM_BUILD_CC)
# Add all targets to the build-tree export set
EXPORT(TARGETS ${_${PROJECT_NAME}_exposed_targets}
FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake)

View File

@ -0,0 +1,48 @@
# 2D polyline
import salome
salome.salome_init()
import GEOM
from salome.geom import geomBuilder
geompy = geomBuilder.New(salome.myStudy)
gg = salome.ImportComponentGUI("GEOM")
# create vertices
p1 = geompy.MakeVertex(70., 0., 0.)
p2 = geompy.MakeVertex(70., 70., 80.)
p3 = geompy.MakeVertex( 0., 70., 0.)
#create a vector from two points
vector_arc = geompy.MakeVector(p1, p3)
# create an arc from three points
arc = geompy.MakeArc(p1, p2, p3)
# create a wire
wire = geompy.MakeWire([vector_arc, arc])
# create a planar face
isPlanarWanted = 1
face = geompy.MakeFace(wire, isPlanarWanted)
# Create a 2D polyline with Polyline2D interface
pl = geompy.Polyline2D()
pl.addSection("section 1", GEOM.Polyline, True, [0, 0, 10, 0, 10, 10])
polyline1 = pl.result([100, 0, 0, 1, 1, 1, -1, 1, 0])
pl = geompy.Polyline2D()
pl.addSection("section 2", GEOM.Interpolation, False)
pl.addPoints([20, 0, 30, 0, 30, 10])
polyline2 = pl.result(face)
# add objects in the study
id_face = geompy.addToStudy(face,"Face")
id_polyline1 = geompy.addToStudy(polyline1, "Polyline1")
id_polyline2 = geompy.addToStudy(polyline2, "Polyline2")
# display the first polyline and the second polyline with its planar face
gg.createAndDisplayGO(id_face)
gg.setDisplayMode(id_face,1)
gg.setTransparency(id_face,0.5)
gg.createAndDisplayGO(id_polyline1)
gg.createAndDisplayGO(id_polyline2)

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -15,6 +15,7 @@ geometrical objects as:
<li>\subpage create_isoline_page</li>
<li>\subpage create_sketcher_page</li>
<li>\subpage create_3dsketcher_page</li>
<li>\subpage create_polyline_page</li>
<li>\subpage create_vector_page</li>
<li>\subpage create_plane_page</li>
<li>\subpage create_lcs_page</li>

View File

@ -0,0 +1,107 @@
/*!
\page create_polyline_page 2D Polyline
The 2D Polyline allows drawing arbitrary 2D shapes.
To create a <b>2D Polyline</b> select in the main menu <b>New Entity -> Basic -> 2D Polyline</b>.
\image html polyline_dlg.png
A polyline represents a section or a set of sections. Each section is constructed from a sequence of 2D points
connected either by linear setgments or an interpolation curve. Every section has its own attributes:
- \b Name,
- \b Type (Polyline or Spline),
- \b Closed flag.
A Polyline created represents a shape that lies on the XOY plane. It can have the following types:
- \b Vertex for a single section with only 1 point.
- \b Wire for a single section with 2 or more points. A Wire can have multiple edges for more then 2 points if the section type is Polyline.
A single edge in the result wire is obtained for a Spline or Polyline with 2 points.
- \b Compound of Wires and/or Vertices if there are several sections.
For the moment only one reference coordinate system for polyline creation is supported. The XOY plane of the <b>Global coordinate system</b>
is suggested. Implementation of another reference coordinate system is a subject of further development of this functionality.
Restore button orientates the viewer correspondingly to the chosen working plane and fits the scene to show all objects.
For the moment this button works with only one plane.
It is possible to import a shape in this dialog using <b>Import polyline</b> selection button. To do it an imported object should satisfy conditions
for polyline shapes mentioned above. If a valid shape is selected, when dialog is opened, it is initialized by this shape.
Though the shape can be on any plane, an imported polyline will be defined on XOY plane only due to the limitation.
The group \b Sections in this dialog represents the Polyline construction framework. Its toolbar has the following operations:
- \b Undo
- \b Redo
- <b>Insert new section</b>
- <b>Addition mode</b>
- <b>Modification mode</b> - not implemented
- <b>Detection mode</b> - not implemented
- \b Remove
- <b>Join selected sections</b>
<b>Undo/Redo</b> buttons allows to undo/redo changes of the polyline.
<b>Insert new section</b> button opens a dialog that allows to add a new section:
\image html polyline_dlg_add_section.png
In this dialog it is possible to choose:
- \b Name of section
- \b Type of section
- \b Closed flag
To create a new section \b Add button should be clicked. \b Cancel button is used to cancel this operation.
After clicking \b Add button a new section is appeared on the list. Its name supplemented by its type and closedness
information (see icon) and the number of points (equal to 0 after creation).
To modify section parameters it is possible to double-click on a section in the list. In this case the following dialog appears:
\image html polyline_dlg_edit_section.png
To apply modifications the button \b Ok should be clicked.
<b>Addition mode</b> allows to add points to a section. It is necessary to select a particular section in a list of sections
and make some mouse clicks in the viewer. A section preview is recomputed after each click.
<b>Modification mode</b> and <b>Detection mode</b> are not implemented for the moment.
\b Remove button allows to remove a section. It is available if all modes are deactivated and one section is selected.
<b>Join selected sections</b> button is available in modification mode if two or more sections are selected. It is used to
merge several sections into the first one from selection list. Joined section has parameters of the first selected one. Points of
the other sections are appended at the end of the list of the first section points.
Some actions are available via popup menu by right mouse button click.
If all modes are deactivated:
- <b>Join all sections</b> - join all defined sections into the first one.
- \b Join - join sections. Available if two or more sections are selected.
In <b>Addition mode</b>:
- <b>Join all sections</b> - join all defined sections into the first one.
In <b>Modification mode</b>:
- <b>Join all sections</b> - join all defined sections into the first one.
- \b Join - join sections. Available if two or more sections are selected.
- <b>Clear all</b> - remove all sections. Available if at least one section is selected.
- <b>Set closed</b> - set all selected section's Closed flag. Available if at least one section is selected.
- <b>Set open</b> - reset all selected section's Closed flag. Available if at least one section is selected.
- <b>Set polyline</b> - set all selected section's type to Polyline. Available if at least one section is selected.
- <b>Set spline</b> - set all selected section's type to Spline. Available if at least one section is selected.
In <b>Detection mode</b>:
- <b>Join all sections</b> - join all defined sections into the first one.
- \b Join - join sections. Available if two or more sections are selected.
<h2>TUI Commands</h2>
To create the 2D polyline in TUI Polyline2D interface is used.
<em>pl = geompy.Polyline2D()</em> - returns an instance of Polyline2D interface <i>pl</i>.
See the \ref gsketcher.Polyline2D "Polyline2D" interface documentation for more information.
Our <b>TUI Scripts</b> provide you with useful examples of the use of
\ref tui_polyline_page "2D Polyline".
*/

View File

@ -0,0 +1,6 @@
/*!
\page tui_polyline_page 2D Polyline
\tui_script{polyline.py}
*/

View File

@ -164,7 +164,8 @@ module GEOM
/*!
* \brief Kind of the curves.
*
* Used in the functions GEOM_ICurvesOperations.MakeCurveParametric(), GEOM_ICurvesOperations.MakeCurveParametricNew()
* Used in the functions GEOM_ICurvesOperations.MakeCurveParametric(), GEOM_ICurvesOperations.MakeCurveParametricNew(),
* GEOM_ICurvesOperations.MakePolyline2D, GEOM_ICurvesOperations.MakePolyline2DOnPlane.
*/
enum curve_type {
/*! Polyline curve */
@ -208,11 +209,12 @@ module GEOM
};
typedef sequence<string> string_array;
typedef sequence<short> short_array;
typedef sequence<boolean> ListOfBool;
typedef sequence<long> ListOfLong;
typedef sequence<double> ListOfDouble;
typedef sequence<string> string_array;
typedef sequence<short> short_array;
typedef sequence<boolean> ListOfBool;
typedef sequence<long> ListOfLong;
typedef sequence<double> ListOfDouble;
typedef sequence<ListOfDouble> ListOfListOfDouble;
interface GEOM_Object;
interface GEOM_BaseObject;
@ -3332,6 +3334,72 @@ module GEOM
* \return New GEOM_Object, containing the created wire.
*/
GEOM_Object Make3DSketcher (in ListOfDouble theCoordinates);
/*!
* \brief Create a 2D polyline (wire or a compound of wires).
*
* The polyline can have several sections. Each section represents a set
* of points in the form of list of coordinates of the following order:
* x1, y1, x2, y2, ..., xN, yN
* Each section has its own name, type of curve (can be either
* GEOM::Polyline or GEOM::Interpolation) and Closed flag.
* For each section a wire is created. It represents either a polyline or
* interpolation BSpline either closed or not depending on the Closed flag.
* The result represents a wire if there is only one section is defined.
* Otherwise a compound of wires is returned.
*
* \param theCoordsList the list of coordinates list. theCoordsList[0]
* is the coordinates list of the first section. theCoordsList[1]
* is for the second section etc.
* \param theNamesList the list of names. The order corresponds to
* theCoordsList.
* \param theTypesList the list of curve types. The order corresponds to
* theCoordsList.
* \param theClosedList the list of Closed flags. The order corresponds to
* theCoordsList.
* \param theWorkingPlane 9 double values, defining origin,
* OZ and OX directions of the working plane.
* \return New GEOM_Object, containing the created wire or a compound
* of wires.
*/
GEOM_Object MakePolyline2D (in ListOfListOfDouble theCoordsList,
in string_array theNamesList,
in short_array theTypesList,
in ListOfBool theClosedList,
in ListOfDouble theWorkingPlane);
/*!
* \brief Create a 2D polyline (wire or a compound of wires).
*
* The polyline can have several sections. Each section represents a set
* of points in the form of list of coordinates of the following order:
* x1, y1, x2, y2, ..., xN, yN
* Each section has its own name, type of curve (can be either
* GEOM::Polyline or GEOM::Interpolation) and Closed flag.
* For each section a wire is created. It represents either a polyline or
* interpolation BSpline either closed or not depending on the Closed flag.
* The result represents a wire if there is only one section is defined.
* Otherwise a compound of wires is returned.
*
* \param theCoordsList the list of coordinates list. theCoordsList[0]
* is the coordinates list of the first section. theCoordsList[1]
* is for the second section etc.
* \param theNamesList the list of names. The order corresponds to
* theCoordsList.
* \param theTypesList the list of curve types. The order corresponds to
* theCoordsList.
* \param theClosedList the list of Closed flags. The order corresponds to
* theCoordsList.
* \param theWorkingPlane planar Face or LCS(Marker) of the working plane.
* \return New GEOM_Object, containing the created wire or a compound
* of wires.
*/
GEOM_Object MakePolyline2DOnPlane (in ListOfListOfDouble theCoordsList,
in string_array theNamesList,
in short_array theTypesList,
in ListOfBool theClosedList,
in GEOM_Object theWorkingPlane);
};
// # GEOM_ILocalOperations:

View File

@ -27,15 +27,6 @@ SET(SUBDIRS_COMMON
STLPlugin BREPPlugin STEPPlugin IGESPlugin XAOPlugin VTKPlugin
)
##
# Curve creator
##
IF(SALOME_GEOM_BUILD_CC)
SET(SUBDIRS_CC
CurveCreator
)
ENDIF()
##
# OPENCV
##
@ -52,7 +43,7 @@ IF(SALOME_BUILD_GUI)
SET(SUBDIRS_GUI
OBJECT DlgRef GEOMFiltersSelection Material GEOMGUI
GEOMBase DependencyTree GEOMToolsGUI DisplayGUI BasicGUI PrimitiveGUI GenerationGUI
EntityGUI BuildGUI BooleanGUI TransformationGUI OperationGUI
CurveCreator EntityGUI BuildGUI BooleanGUI TransformationGUI OperationGUI
RepairGUI MeasureGUI GroupGUI BlocksGUI AdvancedGUI
GEOM_SWIG_WITHIHM
)

View File

@ -57,9 +57,8 @@ IF(SALOME_BUILD_GUI)
# header files / to be processed by moc
SET(_moc_HEADERS
CurveCreator_NewSectionDlg.h
CurveCreator_NewPointDlg.h
CurveCreator_TableView.h
CurveCreator_TreeView.h
# CurveCreator_UndoOptsDlg.h
CurveCreator_Widget.h
)
ENDIF(SALOME_BUILD_GUI)
@ -68,13 +67,15 @@ ENDIF(SALOME_BUILD_GUI)
SET(_other_HEADERS
CurveCreator.hxx
CurveCreator_Curve.hxx
CurveCreator_CurveEditor.hxx
CurveCreator_Diff.hxx
CurveCreator_Displayer.hxx
CurveCreator_ICurve.hxx
CurveCreator_Listener.hxx
CurveCreator_Macro.hxx
CurveCreator_Operation.hxx
CurveCreator_PosPoint.hxx
CurveCreator_Section.hxx
CurveCreator_UtilsICurve.hxx
CurveCreator_Utils.hxx
)
# header files / to install
@ -90,17 +91,17 @@ ENDIF(SALOME_BUILD_GUI)
# sources / static
SET(_other_SOURCES
CurveCreator_Curve.cxx
CurveCreator_CurveEditor.cxx
CurveCreator_Diff.cxx
CurveCreator_ICurve.cxx
CurveCreator_Displayer.cxx
CurveCreator_Operation.cxx
CurveCreator_Utils.cxx
CurveCreator_UtilsICurve.cxx
)
IF(SALOME_BUILD_GUI)
LIST(APPEND _other_SOURCES
CurveCreator_NewPointDlg.cxx
CurveCreator_NewSectionDlg.cxx
CurveCreator_TableView.cxx
CurveCreator_TreeView.cxx
# CurveCreator_UndoOptsDlg.cxx
CurveCreator_Widget.cxx
)
ENDIF(SALOME_BUILD_GUI)

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -24,29 +24,30 @@
#define _CurveCreator_HeaderFile
#include <deque>
#include <map>
#include <list>
struct CurveCreator_Section;
struct CurveCreator_PosPoint;
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;
/** List of coordinates in format depends on section dimension:
* 2D: [x1, y1, x2, y2, x3, y3, ..]
* 3D: [x1, y1, z1, x2, y2, z2, x3, y3, z3, ..]
*/
typedef std::deque<TypeCoord> Coordinates;
//! List of sections
typedef std::deque<CurveCreator_Section *> Sections;
// List of positioned points (points with coordinates)
typedef std::list<CurveCreator_PosPoint*> PosPointsList;
//! Map of sections with positioned points
typedef std::map<int,PosPointsList> SectionsMap;
};
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -23,23 +23,32 @@
#ifndef _CurveCreator_Curve_HeaderFile
#define _CurveCreator_Curve_HeaderFile
#include "CurveCreator.hxx"
#include "CurveCreator_ICurve.hxx"
#include "CurveCreator_Macro.hxx"
#include "CurveCreator_Operation.hxx"
class CurveCreator_Section;
class CurveCreator_Listener;
#include "CurveCreator_Macro.hxx"
#include "CurveCreator.hxx"
#include "CurveCreator_Diff.hxx"
#include <list>
#include <map>
struct CurveCreator_Section;
class CurveCreator_Displayer;
class AIS_Shape;
class Handle_AIS_InteractiveObject;
/**
* 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 <EFBFBD> start and end points <EFBFBD> in other words non-manifold curves
* only ends "start and end points" in other words non-manifold curves
* are not supported.
*/
class CURVECREATOR_EXPORT CurveCreator_Curve : public CurveCreator_ICurve
{
protected:
typedef std::list<CurveCreator_Diff> ListDiff;
public:
//! Constructor of the curve.
/** The dimension is explicitly specified in the constructor
@ -47,15 +56,273 @@ public:
*/
CurveCreator_Curve(const CurveCreator::Dimension theDimension);
/** Add points to the specified section (or last section
//! Destructor.
virtual ~CurveCreator_Curve();
//! Get the dimension.
virtual CurveCreator::Dimension getDimension() const;
//! Return unique section name
virtual std::string getUniqSectionName() const;
//! Set curve creator Displayer object
virtual void setDisplayer( CurveCreator_Displayer* theDisplayer );
//! Return curve creator Displayer object
CurveCreator_Displayer* getDisplayer();
//! Remove curve creator Displayer object
virtual void removeDisplayer();
/** Set depth of undo operations (unlimited if \a theDepth is -1
* or disabled if \a theDepth is 0)
*/
virtual void setUndoDepth(const int theDepth = -1);
//! Get depth of undo operations.
virtual int getUndoDepth() const;
virtual void startOperation();
virtual void finishOperation();
/**
* This method converts the point index to the index in
* an array of coordinates.
*/
virtual int toICoord(const int theIPnt) const;
//! For internal use only! Undo/Redo are not used here.
virtual bool moveSectionInternal(const int theISection,
const int theNewIndex);
//! Move section to new position in list
virtual bool moveSection(const int theISection,
const int theNewIndex);
protected:
/** 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.
*/
virtual bool addEmptyDiff();
public: // TODO: remove public
void getCoordinates( int theISection, int theIPoint, double& theX, double& theY, double& theZ ) const;
protected: // TODO: remove public
void redisplayCurve();
public:
/************ Implementation of INTERFACE methods ************/
/***********************************************/
/*** Undo/Redo methods ***/
/***********************************************/
//! Get number of available undo operations
virtual int getNbUndo() const;
//! Undo previous operation
virtual bool undo();
//! Get number of available redo operations
virtual int getNbRedo() const;
//! Redo last previously "undone" operation
virtual bool redo();
/***********************************************/
/*** Section methods ***/
/***********************************************/
//! For internal use only! Undo/Redo are not used here.
virtual bool clearInternal();
//! Clear the polyline (remove all sections)
virtual bool clear();
//! For internal use only! Undo/Redo are not used here.
virtual bool joinInternal( const std::list<int>& theSections );
//! Join list of sections to one section (join all if the list is empty)
// The first section in the list is a leader, another sections are joined to it
virtual bool join( const std::list<int>& theSections );
//! Get number of sections
virtual int getNbSections() const;
//! For internal use only! Undo/Redo are not used here.
virtual int addSectionInternal( const std::string &theName,
const CurveCreator::SectionType theType,
const bool theIsClosed,
const CurveCreator::Coordinates &thePoints);
//! Add a new section.
virtual int addSection( const std::string &theName,
const CurveCreator::SectionType theType,
const bool theIsClosed );
//! Add a new section.
virtual int addSection( const std::string &theName,
const CurveCreator::SectionType theType,
const bool theIsClosed,
const CurveCreator::Coordinates &thePoints);
//! For internal use only! Undo/Redo are not used here.
virtual bool removeSectionInternal( const int theISection );
//! Removes the given sections.
virtual bool removeSection( const int theISection );
//! Get "closed" flag of the specified section
virtual bool isClosed( const int theISection ) const;
//! For internal use only! Undo/Redo are not used here.
virtual bool setClosedInternal( const int theISection,
const bool theIsClosed );
/**
* Set "closed" flag of the specified section (all sections if
* \a theISection is -1).
*/
virtual bool setClosed( const int theISection,
const bool theIsClosed );
//! Returns specifyed section name
virtual std::string getSectionName( const int theISection ) const;
//! For internal use only! Undo/Redo are not used here.
virtual bool setSectionNameInternal( const int theISection,
const std::string& theName );
/** Set name of the specified section */
virtual bool setSectionName( const int theISection,
const std::string& theName );
//! Get type of the specified section
virtual CurveCreator::SectionType getSectionType( const int theISection ) const;
//! For internal use only! Undo/Redo are not used here.
virtual bool setSectionTypeInternal( const int theISection,
const CurveCreator::SectionType theType );
/**
* Set type of the specified section (or all sections
* if \a theISection is -1).
*/
virtual void addPoints
(const CurveCreator::Coordinates &thePoints, const int theISection = -1);
virtual bool setSectionType( const int theISection,
const CurveCreator::SectionType theType );
friend class CurveCreator_CurveEditor;
friend class CurveCreator_Operation;
/***********************************************/
/*** Point methods ***/
/***********************************************/
//! For internal use only! Undo/Redo are not used here.
virtual bool addPointsInternal( const CurveCreator::SectionsMap &theSectionsMap );
/**
* Add one point to the specified section starting from the given theIPnt index
* (or at the end of points if \a theIPnt is -1).
*/
virtual bool addPoints( const CurveCreator::Coordinates &theCoords,
const int theISection,
const int theIPnt = -1 );
//! For internal use only! Undo/Redo are not used here.
virtual bool setPointInternal( const CurveCreator::SectionsMap &theSectionsMap );
//! Set coordinates of specified point
virtual bool setPoint( const int theISection,
const int theIPnt,
const CurveCreator::Coordinates& theNewCoords );
//! Set coordinates of specified points from different sections
virtual bool setSeveralPoints( const SectionToPointCoordsList &theSectionToPntCoords,
const bool theIsToSaveDiff = true );
//! For internal use only! Undo/Redo are not used here.
virtual bool removePointsInternal( const SectionToPointList &thePoints );
/** Remove point with given id */
virtual bool removePoint( const int theISection, const int theIPnt = -1 );
//! Remove several points from different sections with given ids
virtual bool removeSeveralPoints( const SectionToPointList &theSectionToPntIDs);
//! Get coordinates of specified point
virtual CurveCreator::Coordinates getPoint( const int theISection,
const int theIPnt ) const;
/**
* Get points of a section (the total points in Curve if theISection is equal to -1)..
*/
virtual CurveCreator::Coordinates getPoints( const int theISection = -1 ) const;
/**
* Get number of points in specified section or (the total number of points
* in Curve if theISection is equal to -1).
*/
virtual int getNbPoints( const int theISection ) const;
/**
* Set skip sorting flag. If the flag is true - points sorting will be skipped.
*/
virtual void setSkipSorting( const bool theIsToSkip );
/**
* Indicates whether the points can be sorted.
*/
virtual bool canPointsBeSorted();
/**
* Saves points coordinates difference.
* \param theOldCoords the old points coordinates
*/
virtual void saveCoordDiff( const SectionToPointCoordsList &theOldCoords );
/***********************************************/
/*** Presentation methods ***/
/***********************************************/
/**
* Get the curve AIS object
*/
virtual Handle_AIS_InteractiveObject getAISObject( const bool theNeedToBuild = false ) const;
protected:
/**
* Removes the points from the section. It sortes the points and remove them
* in the decreasing order
* \param theSectionId a section index
* \param thePointIds a list of section points
*/
bool removeSectionPoints( const int theSectionId,
const std::list<int>& thePointIds );
/**
* Converts the list of pairs of section to point into map of a section to list of points
* \param thePoints an source list
* \param theConvPoints a converted map
*/
void convert( const SectionToPointList &thePoints,
std::map<int, std::list<int> > &theConvPoints );
protected:
virtual void constructAISObject();
/**
* Returns the section by the section index or NULL if the index is out of the section
* list range
* \param theSectionId the section index
*/
CurveCreator_Section* getSection( const int theSectionId ) const;
protected:
bool mySkipSorting;
public:
bool myIsLocked;
CurveCreator::Sections mySections; //!< curve data
CurveCreator::Dimension myDimension; //!< curve dimension
CurveCreator_Displayer* myDisplayer; //!< curve displayer
private:
int myNbUndos;
int myNbRedos;
ListDiff::iterator myCurrenPos;
ListDiff myListDiffs;
int myUndoDepth;
int myOpLevel;
AIS_Shape* myAISShape; //!< AIS shape
};
#endif

View File

@ -1,511 +0,0 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_CurveEditor.cxx
// 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),
myOpLevel(0)
{
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) {
startOperation();
// Set the difference.
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::SetType,
theType, theISection);
}
// Update the curve.
myPCurve->setType(theType, theISection);
finishOperation();
}
}
//=======================================================================
// function: addPoints
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::addPoints
(const CurveCreator::Coordinates &thePoints,
const int theISection)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::AddPoints,
thePoints, theISection);
}
// Update the curve.
myPCurve->addPoints(thePoints, theISection);
finishOperation();
}
}
//=======================================================================
// function: addSection
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::addSection
(const std::string& theName, const CurveCreator::Type theType,
const bool theIsClosed,
const CurveCreator::Coordinates &thePoints)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::AddSection,
theName, thePoints, theType, theIsClosed);
}
// Update the curve.
myPCurve->addSection(theName, theType, theIsClosed, thePoints);
finishOperation();
}
}
//=======================================================================
// function: removeSection
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::removeSection(const int theISection)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::RemoveSection,
theISection);
}
// Update the curve.
myPCurve->removeSection(theISection);
finishOperation();
}
}
//=======================================================================
// function: insertPoints
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::insertPoints
(const CurveCreator::Coordinates &thePoints,
const int theISection,
const int theIPnt)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::InsertPoints,
thePoints, theISection, theIPnt);
}
// Update the curve.
myPCurve->insertPoints(thePoints, theISection, theIPnt);
finishOperation();
}
}
//=======================================================================
// function: movePoints
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::movePoint(const int theISection,
const int theOrigIPnt,
const int theNewIPnt )
{
startOperation();
myPCurve->movePoint(theISection, theOrigIPnt, theNewIPnt);
finishOperation();
}
//=======================================================================
// function: removePoints
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::removePoints
(const int theISection,
const int theIPnt,
const int theNbPoints)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::RemovePoints,
theISection, theIPnt, theNbPoints);
}
// Update the curve.
myPCurve->removePoints(theISection, theIPnt, theNbPoints);
finishOperation();
}
}
//=======================================================================
// function: clear
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::clear()
{
if (myPCurve != NULL) {
startOperation();
// Set the difference.
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::Clear);
}
// Update the curve.
myPCurve->clear();
finishOperation();
}
}
//=======================================================================
// function: setCoordinates
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::setCoordinates
(const CurveCreator::Coordinates &theCoords,
const int theISection,
const int theIPnt)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::SetCoordinates,
theCoords, theISection, theIPnt);
}
// Update the curve.
myPCurve->setCoordinates(theCoords, theISection, theIPnt);
finishOperation();
}
}
//=======================================================================
// function: setClosed
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::setClosed(const bool theIsClosed,
const int theISection)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::SetClosed,
theIsClosed, theISection);
}
// Update the curve.
myPCurve->setClosed(theIsClosed, theISection);
finishOperation();
}
}
//=======================================================================
// function: setName
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::setName(const std::string& theName,
const int theISection)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::RenameSection,
theName, theISection);
}
myPCurve->setName( theName, theISection );
finishOperation();
}
}
//=======================================================================
// function: moveSection
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::moveSection(const int theISection,
const int theNewIndex)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::MoveSection,
theISection, theNewIndex);
}
// Update the curve.
myPCurve->moveSection(theISection, theNewIndex);
finishOperation();
}
}
//=======================================================================
// function: join
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::join(const int theISectionTo,
const int theISectionFrom)
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::Join,
theISectionTo, theISectionFrom);
}
// Update the curve.
myPCurve->join(theISectionTo, theISectionFrom);
finishOperation();
}
}
//=======================================================================
// function: join
// purpose:
//=======================================================================
void CurveCreator_CurveEditor::join()
{
if (myPCurve != NULL) {
// Set the difference.
startOperation();
if (addEmptyDiff()) {
myListDiffs.back().init(myPCurve, CurveCreator_Operation::Join);
}
// Update the curve.
myPCurve->join();
finishOperation();
}
}
//=======================================================================
// 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;
}
void CurveCreator_CurveEditor::startOperation()
{
myOpLevel++;
}
void CurveCreator_CurveEditor::finishOperation()
{
myOpLevel--;
}

View File

@ -1,166 +0,0 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_CurveEditor.hxx
// Author: Sergey KHROMOV
#ifndef _CurveCreator_CurveEditor_HeaderFile
#define _CurveCreator_CurveEditor_HeaderFile
#include "CurveCreator_Diff.hxx"
#include "CurveCreator_Curve.hxx"
#include <list>
/**
* 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 <20>undoed<65> 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);
/** Set section closed (or all sections
* if \a theISection is -1).
*/
void setClosed(const bool theIsClosed, const int theISection);
/** Set section name (if theISection is invalid it is ignored).
*/
void setName(const std::string& theName, const int theISection);
/** 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 std::string &theName, 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);
/** Mobe point in \a theISection from given position \a theOrigIPnt
* to new position \a theNewIPnt.
*/
void movePoint(const int theISection,
const int theOrigIPnt,
const int theNewIPnt );
//! Remove all sections.
void clear();
//! Set coordinates of specified point
void setCoordinates(const CurveCreator::Coordinates &theCoords,
const int theISection,
const int theIPnt);
/** 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();
void startOperation();
void finishOperation();
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;
int myOpLevel;
};
#endif

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -49,9 +49,9 @@ CurveCreator_Diff::~CurveCreator_Diff()
// function: init
// purpose:
//=======================================================================
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType)
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve)
{
CurveCreator_Operation::Type aType = CurveCreator_Operation::Clear;
bool isOK = false;
if (theCurve != NULL) {
@ -60,36 +60,18 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
// Set redo.
myPRedo = new CurveCreator_Operation;
if (myPRedo->init(theType)) {
if (myPRedo->init(aType)) {
isOK = true;
const int aNbSections = theCurve->getNbSections();
if (theType == CurveCreator_Operation::Clear) {
// Construct undo for Clear command.
if (aNbSections > 0) {
setNbUndos(aNbSections);
// 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]);
}
for (int i = 0; i < aNbSections && isOK; i++) {
// Add AddSection command.
isOK = addSectionToUndo(theCurve, i, myPUndo[i]);
}
}
}
@ -176,33 +158,6 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
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;
}
@ -222,77 +177,68 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
//=======================================================================
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType,
const int theIntParam1,
const int theIntParam2,
const int theIntParam3)
const std::list<int>& theParams)
{
bool isOK = false;
if (theCurve != NULL) {
if (theCurve != NULL || theParams.empty()) {
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 (myPRedo->init(theType, theParams)) {
// Construct undo for different commands.
switch (theType) {
case CurveCreator_Operation::Join:
{
int aSectionMain = theParams.front();
const int aNbPointsMain = theCurve->getNbPoints(aSectionMain);
if (theIntParam3 == -1) {
anIterEnd = aPoints.end();
} else {
anIterEnd = anIterBegin + (aDim*theIntParam3);
std::list<int> aSectionsToJoin = theParams;
aSectionsToJoin.erase( aSectionsToJoin.begin() );
// it is important to sort the section indices in order to correct perform undo
// for the move sections to the previous positions
aSectionsToJoin.sort();
// 1rst undo for remove points from the main and n-1 undoes to contain joined sections
int aSectionsToJoinNb = aSectionsToJoin.size();
int aNbUndos = 2*aSectionsToJoinNb + 1;
setNbUndos( aNbUndos );
// Add joined sections to undo
std::list<int>::const_iterator anIt = aSectionsToJoin.begin(),
aLast = aSectionsToJoin.end();
anIt = aSectionsToJoin.begin();
int aLastSectionId = -1;
for (int i = 0; anIt != aLast && i < aSectionsToJoinNb; anIt++, i++) {
int anISection = *anIt;
isOK = addSectionToUndo( theCurve, anISection, myPUndo[i*2] );
if (isOK) {
isOK = myPUndo[i*2+1].init(CurveCreator_Operation::MoveSection,
aLastSectionId, anISection);
if (!isOK)
break;
}
}
// Construct undo for RemovePoints command.
if (isOK) {
int aNbPointsInJoined = 0;
anIt = aSectionsToJoin.begin();
for ( ; anIt != aLast; anIt++ )
aNbPointsInJoined += theCurve->getNbPoints( *anIt );
int aJoinedSize = aNbPointsMain + aNbPointsInJoined;
CurveCreator_ICurve::SectionToPointList aSectionToPointList;
for (int anIPoint = aNbPointsMain; anIPoint < aJoinedSize; anIPoint++)
aSectionToPointList.push_back(std::make_pair(aSectionMain, anIPoint));
isOK = myPUndo[aNbUndos-1].init(CurveCreator_Operation::RemovePoints, aSectionToPointList);
}
}
break;
default:
break;
}
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) {
@ -337,68 +283,6 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
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::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;
}
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType,
const std::string &theName,
@ -423,6 +307,152 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
return isOK;
}
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType,
const CurveCreator_ICurve::SectionToPointList &theParamList1)
{
bool isOK = false;
if (theCurve != NULL) {
clear();
// Set redo.
myPRedo = new CurveCreator_Operation;
if (myPRedo->init(theType, theParamList1)) {
// Construct undo for different commands.
switch (theType) {
case CurveCreator_Operation::RemovePoints:
{
// Construct undo for RemovePoints command.
CurveCreator_ICurve::SectionToPointCoordsList aSectionToPointCoords;
CurveCreator::Coordinates aPointsToAdd;
const CurveCreator::Dimension aDim = theCurve->getDimension();
CurveCreator_ICurve::SectionToPointList::const_iterator anIt = theParamList1.begin(), aLast = theParamList1.end();
std::list<int> aPoints;
int aSectionId, aPointId;
for ( ; anIt != aLast; anIt++ ) {
aPointsToAdd.clear();
aSectionId = anIt->first;
aPointId = anIt->second;
const CurveCreator::Coordinates &aPoints =
theCurve->getPoints(aSectionId);
CurveCreator::Coordinates::const_iterator anIterBegin =
aPoints.begin() + (aDim*aPointId);
CurveCreator::Coordinates::const_iterator anIterEnd =
anIterBegin + aDim;
aPointsToAdd.insert(aPointsToAdd.end(), anIterBegin, anIterEnd);
aSectionToPointCoords.push_back(std::make_pair(*anIt, aPointsToAdd));
}
setNbUndos(1);
isOK = myPUndo[0].init(CurveCreator_Operation::InsertPoints,
aSectionToPointCoords);
}
break;
default:
break;
}
}
if (!isOK) {
clear();
}
}
return isOK;
}
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType,
const CurveCreator_ICurve::SectionToPointCoordsList &theParamList1)
{
bool isOK = false;
if (theCurve != NULL) {
clear();
// Set redo.
myPRedo = new CurveCreator_Operation;
if (myPRedo->init(theType, theParamList1)) {
// Construct undo for different commands.
switch (theType) {
case CurveCreator_Operation::InsertPoints:
{
// Construct undo for RemovePoints command.
CurveCreator_ICurve::SectionToPointList aSectionToPointList;
CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt = theParamList1.begin(), aLast = theParamList1.end();
for ( ; anIt != aLast; anIt++ ) {
aSectionToPointList.push_back(anIt->first);
}
setNbUndos(1);
isOK = myPUndo[0].init(CurveCreator_Operation::RemovePoints,
aSectionToPointList);
}
break;
case CurveCreator_Operation::SetCoordinates:
{
// Construct undo for SetCoordinates command.
CurveCreator_ICurve::SectionToPointCoordsList aSectionToPointOldCoords;
CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt = theParamList1.begin(), aLast = theParamList1.end();
for ( ; anIt != aLast; anIt++ ) {
CurveCreator::Coordinates anOldCoords = theCurve->getPoint(anIt->first.first, anIt->first.second);
aSectionToPointOldCoords.push_back(std::make_pair(anIt->first, anOldCoords));
}
setNbUndos(1);
isOK = myPUndo[0].init(CurveCreator_Operation::SetCoordinates,
aSectionToPointOldCoords);
}
break;
default:
break;
}
}
if (!isOK) {
clear();
}
}
return isOK;
}
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
const CurveCreator_ICurve::SectionToPointCoordsList &theOldParamList)
{
bool isOK = false;
if (theCurve != NULL && theOldParamList.size() > 0) {
clear();
// Set redo.
myPRedo = new CurveCreator_Operation;
// Construct redo for SetCoordinates command.
CurveCreator_ICurve::SectionToPointCoordsList aSectionToPointActualCoords;
CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt =
theOldParamList.begin(), aLast = theOldParamList.end();
for ( ; anIt != aLast; anIt++ ) {
CurveCreator::Coordinates anActualCoords = theCurve->getPoint(anIt->first.first, anIt->first.second);
aSectionToPointActualCoords.push_back(std::make_pair(anIt->first, anActualCoords));
}
if (myPRedo->init(CurveCreator_Operation::SetCoordinates, aSectionToPointActualCoords)) {
// Undo for SetCoordinates command.
setNbUndos(1);
isOK = myPUndo[0].init(CurveCreator_Operation::SetCoordinates,
theOldParamList);
}
if (!isOK) {
clear();
}
}
return isOK;
}
//=======================================================================
// function: applyUndo
// purpose:
@ -495,12 +525,13 @@ bool CurveCreator_Diff::addSectionToUndo
const int theIndex,
CurveCreator_Operation &theOperation) const
{
const std::string aName = theCurve->getSectionName(theIndex);
const CurveCreator::Coordinates &aPnts = theCurve->getPoints(theIndex);
const CurveCreator::Type aType = theCurve->getType(theIndex);
const CurveCreator::SectionType aType = theCurve->getSectionType(theIndex);
const bool isClosed = theCurve->isClosed(theIndex);
bool isOK = theOperation.init(CurveCreator_Operation::AddSection,
aPnts, aType, isClosed);
aName, aPnts, aType, isClosed);
return isOK;
}
@ -533,7 +564,7 @@ bool CurveCreator_Diff::setTypeOrClosedToUndo
// Get sections to be modified.
for (i = 0; i < aNbSections; i++) {
if (isSetType) {
aValue = theCurve->getType(i);
aValue = theCurve->getSectionType(i);
} else {
aValue = theCurve->isClosed(i);
}
@ -556,7 +587,7 @@ bool CurveCreator_Diff::setTypeOrClosedToUndo
// There is only particular section modified.
// Check if there is a real modification required.
if (isSetType) {
aValue = theCurve->getType(theIntParam2);
aValue = theCurve->getSectionType(theIntParam2);
} else {
aValue = theCurve->isClosed(theIntParam2);
}
@ -572,7 +603,7 @@ bool CurveCreator_Diff::setTypeOrClosedToUndo
std::list<int>::iterator anIter = aListOfInd.begin();
if (isSetType) {
aValue = theCurve->getType(*anIter);
aValue = theCurve->getSectionType(*anIter);
} else {
aValue = theCurve->isClosed(*anIter);
}

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -56,11 +56,9 @@ public:
* 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);
bool init(const CurveCreator_Curve *theCurve);
/**
* This method initializes the difference with an operation with one integer
@ -80,7 +78,6 @@ public:
* <LI>SetType</LI>
* <LI>SetClosed</LI>
* <LI>MoveSection</LI>
* <LI>Join (with 2 int arguments)</LI>
* </UL>
*/
bool init(const CurveCreator_Curve *theCurve,
@ -88,46 +85,16 @@ public:
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:
/**
* This method initializes the difference with an operation with two integer
* parameters. It is applicable to the following operations:
* <UL>
* <LI>RemovePoints</LI>
* <LI>Join (with a list of int arguments)</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>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);
const std::list<int>& theParams);
/**
* This method initializes the difference with an operation with one
@ -157,6 +124,39 @@ public:
const std::string &theName,
const int theIntParam1 );
/**
* This method initializes the difference with an operation with
* list of pairs of 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 CurveCreator_ICurve::SectionToPointList &theParamList);
/**
* This method initializes the difference with an operation with
* list of pairs of integer parameters with point coordinates.
* It is applicable to the following operations:
* <UL>
* <LI>RemovePoints</LI>
* </UL>
*/
bool init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType,
const CurveCreator_ICurve::SectionToPointCoordsList &theParamList);
/**
* This method initializes the difference with an operation with
* list of pairs of integer parameters with point coordinates.
* \param theCurve the modified curve
* \param theOldParamList the old parameters (to be saved for undo)
*/
bool init(const CurveCreator_Curve *theCurve,
const CurveCreator_ICurve::SectionToPointCoordsList &theOldParamList);
/**
* This method applies undo operation to theCurve.
*/

View File

@ -0,0 +1,64 @@
#include "CurveCreator_Displayer.hxx"
CurveCreator_Displayer::CurveCreator_Displayer( Handle_AIS_InteractiveContext theContext,
const int theZLayer ) :
myContext( theContext ), myZLayer( theZLayer )
{
myObjects.clear();
}
CurveCreator_Displayer::~CurveCreator_Displayer(void)
{
eraseAll( true );
for( int i = 0 ; i < myObjects.size() ; i++ ){
myObjects[i].Nullify();
}
myObjects.clear();
}
void CurveCreator_Displayer::display( const Handle(AIS_InteractiveObject)& theObject, bool isUpdate )
{
if ( theObject.IsNull() )
return;
myObjects.push_back( theObject );
myContext->Display( theObject, Standard_False );
if ( myZLayer >= 0 )
myContext->SetZLayer( theObject, myZLayer );
if( isUpdate )
myContext->UpdateCurrentViewer();
}
void CurveCreator_Displayer::eraseAll( bool isUpdate )
{
if(myObjects.empty())
return;
for( int i = 0 ; i < myObjects.size() ; i++ ){
myContext->Erase(myObjects[i], Standard_False);
}
myObjects.clear();
if( isUpdate )
myContext->UpdateCurrentViewer();
}
Quantity_Color CurveCreator_Displayer::getActiveColor( bool isHL )
{
if( isHL ){
return Quantity_Color( 1., 0., 0., Quantity_TOC_RGB );
}
return Quantity_Color( 0., 1., 0., Quantity_TOC_RGB );
}
/*void CurveCreator_Displayer::highlight( const AISObjectsList& theObjects, bool isHL )
{
return;
//TODO:
Quantity_Color aColor = getActiveColor( isHL );
for( int i = 0 ; i < theObjects.size() ; i++ ){
theObjects[i]->SetColor(aColor);
myContext->Display(theObjects[i], Standard_False);
}
myContext->UpdateCurrentViewer();
}*/

View File

@ -0,0 +1,33 @@
#ifndef CURVECREATOR_DISPLAYER_H
#define CURVECREATOR_DISPLAYER_H
#include "CurveCreator_Macro.hxx"
#include <AIS_InteractiveObject.hxx>
#include <AIS_InteractiveContext.hxx>
#include <vector>
class CURVECREATOR_EXPORT CurveCreator_Displayer
{
typedef std::vector<Handle_AIS_InteractiveObject> AISObjectsList;
public:
CurveCreator_Displayer( Handle_AIS_InteractiveContext theContext,
const int theZLayer = -1 );
~CurveCreator_Displayer(void);
void display( const Handle_AIS_InteractiveObject& theObject, bool isUpdate );
void eraseAll( bool isUpdate );
//void highlight( const AISObjectsList& theObjects, bool isHL );
protected:
Quantity_Color getActiveColor( bool isHL );
private:
Handle_AIS_InteractiveContext myContext;
AISObjectsList myObjects;
int myZLayer;
};
#endif

View File

@ -1,459 +0,0 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_ICurve.cxx
// Author: Sergey KHROMOV
#include "CurveCreator_ICurve.hxx"
#include "CurveCreator_Section.hxx"
#include "CurveCreator_Listener.hxx"
#include <stdio.h>
//=======================================================================
// function: Constructor
// purpose:
//=======================================================================
CurveCreator_ICurve::CurveCreator_ICurve
(const CurveCreator::Dimension theDimension)
: myIsLocked (false),
myDimension (theDimension),
myListener(NULL)
{
}
//=======================================================================
// function: Destructor
// purpose:
//=======================================================================
CurveCreator_ICurve::~CurveCreator_ICurve()
{
// Delete all allocated data.
clear();
}
//=======================================================================
// function: isLocked
// purpose:
//=======================================================================
bool CurveCreator_ICurve::isLocked() const
{
return myIsLocked;
}
//=======================================================================
// function: getDimension
// purpose:
//=======================================================================
CurveCreator::Dimension CurveCreator_ICurve::getDimension() const
{
return myDimension;
}
//=======================================================================
// function: getNbPoints
// purpose:
//=======================================================================
int CurveCreator_ICurve::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_ICurve::getNbSections() const
{
return mySections.size();
}
//=======================================================================
// function: getCoordinates
// purpose:
//=======================================================================
CurveCreator::Coordinates CurveCreator_ICurve::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_ICurve::getType(const int theISection) const
{
return mySections.at(theISection)->myType;
}
//=======================================================================
// function: getPoints
// purpose:
//=======================================================================
const CurveCreator::Coordinates &CurveCreator_ICurve::getPoints
(const int theISection) const
{
return mySections.at(theISection)->myPoints;
}
//=======================================================================
// function: isClosed
// purpose:
//=======================================================================
bool CurveCreator_ICurve::isClosed(const int theISection) const
{
return mySections.at(theISection)->myIsClosed;
}
std::string CurveCreator_ICurve::getSectionName(const int theISection) const
{
return mySections.at(theISection)->myName;
}
//=======================================================================
// function: setType
// purpose:
//=======================================================================
void CurveCreator_ICurve::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;
}
if( myListener )
myListener->curveChanged();
} else {
if( mySections.at(theISection)->myType != theType ){
mySections.at(theISection)->myType = theType;
if( myListener )
myListener->sectionTypeChanged(theISection);
}
}
}
//=======================================================================
// function: addSection
// purpose:
//=======================================================================
void CurveCreator_ICurve::addSection
(const std::string& theName,
const CurveCreator::Type theType,
const bool theIsClosed,
const CurveCreator::Coordinates &thePoints)
{
CurveCreator_Section *aSection = new CurveCreator_Section;
std::string aName = theName;
if( aName.empty() ){
aName = getUnicSectionName();
}
aSection->myName = aName;
aSection->myType = theType;
aSection->myIsClosed = theIsClosed;
aSection->myPoints = thePoints;
mySections.push_back(aSection);
if( myListener )
myListener->sectionAdded( -1 );
}
//=======================================================================
// function: removeSection
// purpose:
//=======================================================================
void CurveCreator_ICurve::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);
}
if( myListener )
myListener->sectionRemoved(theISection);
}
//=======================================================================
// function: insertPoints
// purpose:
//=======================================================================
void CurveCreator_ICurve::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());
if( myListener )
myListener->pointInserted( theISection, theIPnt );
}
}
void CurveCreator_ICurve::movePoint(const int theISection, const int theIPointFrom, const int theNewIndex)
{
CurveCreator::Coordinates aCoords = getCoordinates(theISection, theIPointFrom );
insertPoints(aCoords, theISection, theNewIndex+1);
int aRemPntIndx = theIPointFrom;
if( theNewIndex < theIPointFrom )
aRemPntIndx++;
removePoints(theISection, aRemPntIndx, 1 );
}
//=======================================================================
// function: removePoints
// purpose:
//=======================================================================
void CurveCreator_ICurve::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);
if( myListener )
myListener->pointRemoved(theISection, theIPnt, theNbPoints );
}
//=======================================================================
// function: clear
// purpose:
//=======================================================================
void CurveCreator_ICurve::clear()
{
// Delete all allocated data.
int i = 0;
const int aNbSections = getNbSections();
for (; i < aNbSections; i++) {
delete mySections[i];
}
mySections.clear();
if( myListener )
myListener->curveChanged();
}
//=======================================================================
// function: setCoordinates
// purpose:
//=======================================================================
void CurveCreator_ICurve::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];
}
if( myListener )
myListener->pointChanged( theISection, theIPnt );
}
}
//=======================================================================
// function: setClosed
// purpose:
//=======================================================================
void CurveCreator_ICurve::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;
if( myListener ){
myListener->sectionClosed( theISection, theIsClosed );
}
}
} else {
mySections.at(theISection)->myIsClosed = theIsClosed;
if( myListener ){
myListener->sectionClosed( theISection, theIsClosed );
}
}
}
/** Set name of the specified section.
*/
void CurveCreator_ICurve::setName( const std::string& theName, const int theISection )
{
if( ( theISection >= 0 ) && ( theISection < mySections.size() )){
mySections.at(theISection)->myName = theName;
}
}
//=======================================================================
// function: moveSection
// purpose:
//=======================================================================
void CurveCreator_ICurve::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_ICurve::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);
if( myListener )
myListener->curveChanged();
}
}
//=======================================================================
// function: join
// purpose:
//=======================================================================
void CurveCreator_ICurve::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());
if( myListener )
myListener->curveChanged();
}
}
//=======================================================================
// function: toICoord
// purpose:
//=======================================================================
int CurveCreator_ICurve::toICoord(const int theIPnt) const
{
return theIPnt*myDimension;
}
//=======================================================================
// function: getUnicSectionName
// purpose: return unic section name
//=======================================================================
std::string CurveCreator_ICurve::getUnicSectionName()
{
for( int i = 0 ; i < 1000000 ; i++ ){
char aBuffer[255];
sprintf( aBuffer, "Section_%d", i+1 );
std::string aName(aBuffer);
int j;
for( j = 0 ; j < mySections.size() ; j++ ){
if( mySections[j]->myName == aName )
break;
}
if( j == mySections.size() )
return aName;
}
return "";
}
//=======================================================================
// function: setListener
// purpose: set curve changes listener
//=======================================================================
void CurveCreator_ICurve::setListener( CurveCreator_Listener* theListener )
{
myListener = theListener;
}
//=======================================================================
// function: setListener
// purpose: set curve changes listener
//=======================================================================
void CurveCreator_ICurve::removeListener()
{
myListener = NULL;
}

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -17,170 +17,189 @@
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_Curve.hxx
// Author: Sergey KHROMOV
// File: CurveCreator_ICurve.hxx
// Author: Alexander KOVALEV and Alexander SOLOVYOV
#ifndef _CurveCreator_ICurve_HeaderFile
#define _CurveCreator_ICurve_HeaderFile
#include "CurveCreator.hxx"
#include "CurveCreator_Macro.hxx"
#include "CurveCreator_Operation.hxx"
#include <deque>
#include <vector>
#include <string>
#include <list>
class CurveCreator_Section;
class CurveCreator_Listener;
class Handle_AIS_InteractiveObject;
namespace CurveCreator
{
//! Type of the section
enum SectionType
{
Polyline,
Spline,
};
//! Dimension of the curve
enum Dimension
{
Dim2d = 2,
Dim3d = 3
};
};
/**
* The CurveCreator_ICurve object is represented as one or more sets of
* connected points; thus CurveCreator_ICurve object can contain several
* not connected curves (polylines or b-splines), each such curve has two
* only ends <EFBFBD> start and end points <EFBFBD> in other words non-manifold curves
* only ends "start and end points" in other words non-manifold curves
* are not supported.
*/
class CURVECREATOR_EXPORT CurveCreator_ICurve
{
public:
typedef std::pair<int,int> SectionToPoint;
typedef std::deque<SectionToPoint> SectionToPointList;
//! List of curves
typedef std::deque<CurveCreator_Section *> Sections;
typedef std::deque< std::pair< SectionToPoint,std::deque< float > > > SectionToPointCoordsList;
public:
//! Constructor of the curve.
/** The dimension is explicitly specified in the constructor
* and cannot be changed later.
*/
CurveCreator_ICurve(const CurveCreator::Dimension theDimension);
/***********************************************/
/*** Undo/Redo methods ***/
/***********************************************/
//! Destructor.
virtual ~CurveCreator_ICurve();
//! Get number of available undo operations
virtual int getNbUndo() const = 0;
//! Returns true if this curve is locked by a curve editor.
virtual bool isLocked() const;
//! Undo previous operation
virtual bool undo() = 0;
//! Get the dimension.
virtual CurveCreator::Dimension getDimension() const;
//! Get number of available redo operations
virtual int getNbRedo() const = 0;
//! Get number of sections.
virtual int getNbSections() const;
//! Redo last previously "undone" operation
virtual bool redo() = 0;
/** Get number of points in specified section or (the total number of points
* in Curve if theISection is equal to -1).
*/
virtual int getNbPoints(const int theISection = -1) const;
//! Get coordinates of specified point
virtual CurveCreator::Coordinates getCoordinates
(const int theISection, const int theIPnt) const;
/***********************************************/
/*** Section methods ***/
/***********************************************/
//! Get points of a section.
virtual const CurveCreator::Coordinates &getPoints(const int theISection) const;
//! Clear the polyline (remove all sections)
virtual bool clear() = 0;
//! Get type of the specified section
virtual CurveCreator::Type getType(const int theISection) const;
//! Join list of sections to one section (join all if the list is empty)
// The first section in the list is a leader, another sections are joined to it
virtual bool join( const std::list<int>& theSections ) = 0;
//! Get <20>closed<65> flag of the specified section
virtual bool isClosed(const int theISection) const;
//! Returns specifyed section name
virtual std::string getSectionName(const int theISection) const;
/**
* Return unic section name
*/
virtual std::string getUnicSectionName();
/**
* Set curve creator listener object
*/
virtual void setListener( CurveCreator_Listener* myWatcher );
/**
* Remove curve creator listener object
*/
virtual void removeListener();
protected:
/** Set type of the specified section (or all sections
* if \a theISection is -1).
*/
virtual void setType(const CurveCreator::Type theType, const int theISection = -1);
/** Add points to the specified section (or last section
* if \a theISection is -1).
*/
virtual void addPoints
(const CurveCreator::Coordinates &thePoints, const int theISection = -1) = 0;
//! Get number of sections
virtual int getNbSections() const = 0;
//! Add a new section.
virtual void addSection (const std::string &theName, const CurveCreator::Type theType,
const bool theIsClosed,
const CurveCreator::Coordinates &thePoints);
virtual int addSection( const std::string& theName,
const CurveCreator::SectionType theType,
const bool theIsClosed ) = 0;
//! Removes the section. If theISection equals -1, removes the last section.
virtual void removeSection(const int theISection = -1);
//! Removes the given sections.
virtual bool removeSection( const int theISection ) = 0;
/** 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).
*/
virtual 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).
*/
virtual void removePoints(const int theISection,
const int theIPnt,
const int theNbPoints = -1);
/** Move specified point within section to new position
*/
virtual void movePoint(const int theISection,
const int theIPointFrom,
const int theNewIndex);
//! Remove all sections.
virtual void clear();
//! Set coordinates of specified point
virtual void setCoordinates(const CurveCreator::Coordinates &theCoords,
const int theISection,
const int theIPnt);
/** Set <20>closed<65> flag of the specified section (all sections if
* \a theISection is -1).
*/
virtual void setClosed(const bool theIsClosed, const int theISection = -1);
/** Set name of the specified section.
*/
virtual void setName( const std::string& theName, const int theISection );
/** Move specified \a theISection to the specified position
* in the sections list.
*/
virtual void moveSection(const int theISection, const int theNewIndex);
//! Join two sections to one section
virtual void join(const int theISectionTo, const int theISectionFrom);
//! Join all sections to the single curve
virtual void join();
//! Get "closed" flag of the specified section
virtual bool isClosed( const int theISection ) const = 0;
/**
* This method converts the point index to the index in
* an array of coordinates.
* Set "closed" flag of the specified section (all sections if
* \a theISection is -1).
*/
virtual int toICoord(const int theIPnt) const;
virtual bool setClosed( const int theISection,
const bool theIsClosed ) = 0;
public:
//! Returns specifyed section name
virtual std::string getSectionName( const int theISection ) const = 0;
bool myIsLocked;
Sections mySections; //!< curve data
CurveCreator::Dimension myDimension; //!< curve dimension
CurveCreator_Listener* myListener; //!< listener
/** Set name of the specified section */
virtual bool setSectionName( const int theISection,
const std::string& theName ) = 0;
//! Get type of the specified section
virtual CurveCreator::SectionType getSectionType( const int theISection ) const = 0;
/**
* Set type of the specified section (or all sections
* if \a theISection is -1).
*/
virtual bool setSectionType( const int theISection,
const CurveCreator::SectionType theType ) = 0;
/***********************************************/
/*** Point methods ***/
/***********************************************/
//! Get the dimension.
virtual CurveCreator::Dimension getDimension() const = 0;
/**
* Insert one or several points to the specified section starting from the given theIPnt index
* (or add these at the end of section points if \a theIPnt is -1).
*/
virtual bool addPoints( const std::deque<float>& theCoords,
const int theISection,
const int theIPnt = -1 ) = 0;
//! Set coordinates of specified point
virtual bool setPoint( const int theISection,
const int theIPnt,
const std::deque<float>& theNewCoords ) = 0;
//! Set coordinates of specified points from different sections
virtual bool setSeveralPoints( const SectionToPointCoordsList &theSectionToPntCoords,
const bool theIsToSaveDiff = true ) = 0;
//! Remove point with given id
virtual bool removePoint( const int theISection, const int theIPnt = -1 ) = 0;
//! Remove several points from different sections
virtual bool removeSeveralPoints( const SectionToPointList &theSectionToPntIDs) = 0;
//! Get coordinates of specified point
virtual std::deque<float> getPoint( const int theISection,
const int theIPnt ) const = 0;
/**
* Get points of a section (the total points in Curve if theISection is equal to -1)..
*/
virtual std::deque<float> getPoints( const int theISection = -1 ) const = 0;
/**
* Get number of points in specified section or (the total number of points
* in Curve if theISection is equal to -1).
*/
virtual int getNbPoints( const int theISection ) const = 0;
/**
* Set skip sorting flag. If the flag is true - points sorting will be skipped.
*/
virtual void setSkipSorting( const bool ) = 0;
/**
* Indicates whether the points can be sorted.
*/
virtual bool canPointsBeSorted() = 0;
/**
* Saves points coordinates difference.
* \param theOldCoords the old points coordinates
*/
virtual void saveCoordDiff( const SectionToPointCoordsList &theOldCoords ) = 0;
/***********************************************/
/*** Presentation methods ***/
/***********************************************/
virtual Handle_AIS_InteractiveObject getAISObject( const bool theNeedToBuild = false ) const = 0;
protected:
virtual void constructAISObject() = 0;
};

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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

View File

@ -1,196 +0,0 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include "CurveCreator_NewPointDlg.h"
#include <QGridLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QDoubleSpinBox>
#include <QDialogButtonBox>
#include <QDoubleValidator>
#include <QRegExpValidator>
#include <QAbstractButton>
#include <QPushButton>
#include <QLocale>
CurveCreator_NewPointDlg::CurveCreator_NewPointDlg(CurveCreator::Dimension theDim, QWidget *parent) :
QWidget(parent), myX(NULL), myY(NULL), myZ(NULL), myIsEdit(false), myDim(theDim),
myIsInstantSketchingEnabled(false)
{
QString aTitle = QString(tr("ADD_NEW_POINT"));
setWindowTitle(aTitle);
QFrame* aFrame = new QFrame( this );
QVBoxLayout* aLayout = new QVBoxLayout( aFrame );
QFrame* aCoordFrame = new QFrame( aFrame );
QGridLayout* aCoordLayout = new QGridLayout( aCoordFrame );
QLabel* aLbl = new QLabel( tr("X_COORD"), this);
myX = new QDoubleSpinBox(this);
aCoordLayout->addWidget(aLbl, 0, 0);
aCoordLayout->addWidget(myX, 0, 1 );
aLbl = new QLabel( tr("Y_COORD"), this);
myY = new QDoubleSpinBox(this);
aCoordLayout->addWidget(aLbl, 1, 0 );
aCoordLayout->addWidget(myY, 1, 1 );
myZLabel = new QLabel( tr("Z_COORD"), this);
myZ = new QDoubleSpinBox(this);
aCoordLayout->addWidget(myZLabel, 2,0 );
aCoordLayout->addWidget(myZ, 2,1 );
if( theDim != CurveCreator::Dim3d ){
myZ->hide();
myZLabel->hide();
}
myBtnFrame = new QFrame( aFrame );
QHBoxLayout* aBtnsLayout = new QHBoxLayout( myBtnFrame );
myAddBtn = new QPushButton( tr( "ADD_BTN" ), myBtnFrame );
myCancelBtn = new QPushButton( tr( "CANCEL" ), myBtnFrame );
connect( myCancelBtn, SIGNAL( clicked() ), this, SIGNAL( cancelPoint() ) );
aBtnsLayout->addWidget( myAddBtn );
aBtnsLayout->addStretch( 1 );
aBtnsLayout->addWidget( myCancelBtn );
aLayout->addWidget( aCoordFrame, 0 );
aLayout->addWidget( myBtnFrame, 1 );
clear();
updateTitle();
}
void CurveCreator_NewPointDlg::setSectionName( const QString& theName )
{
mySectionName = theName;
updateTitle();
}
void CurveCreator_NewPointDlg::setEditMode( bool isEdit )
{
myIsEdit = isEdit;
if( myIsEdit ){
myAddBtn->setText(tr("OK"));
myAddBtn->disconnect( SIGNAL( clicked() ) );
connect( myAddBtn, SIGNAL( clicked() ), this, SIGNAL( modifyPoint() ) );
}
else{
myAddBtn->setText(tr("ADD_BTN"));
myAddBtn->disconnect( SIGNAL( clicked() ) );
connect( myAddBtn, SIGNAL( clicked() ), this, SIGNAL( addPoint() ) );
}
updateTitle();
}
void CurveCreator_NewPointDlg::updateTitle()
{
QString aTitle;
if( !myIsEdit ){
if( mySectionName.isEmpty() ){
aTitle = tr("ADD_NEW_POINT");
}
else{
aTitle = QString(tr("ADD_NEW_POINT_TO_%1")).arg(mySectionName);
}
}
else{
aTitle = tr("SET_POINT_COORDINATES");
}
setWindowTitle(aTitle);
}
CurveCreator::Coordinates CurveCreator_NewPointDlg::getCoordinates() const
{
CurveCreator::Coordinates aCoords;
double anX = myX->value();
aCoords.push_back(anX);
double anY = myY->value();
aCoords.push_back(anY);
if( myDim == CurveCreator::Dim3d ){
double aZ = myZ->value();
aCoords.push_back(aZ);
}
return aCoords;
}
void CurveCreator_NewPointDlg::clear()
{
initSpinBox(myX);
initSpinBox(myY);
initSpinBox(myZ);
}
void CurveCreator_NewPointDlg::setDimension(CurveCreator::Dimension theDim)
{
if( theDim == CurveCreator::Dim2d ){
myZ->hide();
myZLabel->hide();
}
else{
myZ->show();
myZLabel->show();
}
}
void CurveCreator_NewPointDlg::setCoordinates( const CurveCreator::Coordinates& theCoords )
{
double anX = theCoords[0];
myX->setValue(anX);
double anY = theCoords[1];
myY->setValue(anY);
if( theCoords.size() == 3 ){
double aZ = theCoords[2];
myZ->setValue(aZ);
}
if( isInstantSketchingEnabled() )
emit addPoint();
}
bool CurveCreator_NewPointDlg::isInstantSketchingEnabled() const
{
return myIsInstantSketchingEnabled;
}
void CurveCreator_NewPointDlg::setInstantSketchingEnabled( const bool theState )
{
myIsInstantSketchingEnabled = theState;
}
//=======================================================================
// function: initSpinBox
// purpose:
//=======================================================================
void CurveCreator_NewPointDlg::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);
}

View File

@ -1,70 +0,0 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#ifndef CURVECREATOR_NEWPOINTDLG_H
#define CURVECREATOR_NEWPOINTDLG_H
#include "CurveCreator.hxx"
#include <QDockWidget>
class QDoubleSpinBox;
class QDialogButtonBox;
class QAbstractButton;
class QPushButton;
class QLabel;
class QFrame;
class CurveCreator_NewPointDlg : public QWidget
{
Q_OBJECT
public:
explicit CurveCreator_NewPointDlg(CurveCreator::Dimension theDim, QWidget *parent = 0);
CurveCreator::Coordinates getCoordinates() const;
void clear();
void setSectionName( const QString& theName );
void setEditMode( bool isEdit );
void setCoordinates( const CurveCreator::Coordinates& theCoords );
void setDimension(CurveCreator::Dimension theDim);
bool isInstantSketchingEnabled() const;
void setInstantSketchingEnabled( const bool theState );
signals:
void addPoint();
void modifyPoint();
void cancelPoint();
public slots:
protected slots:
protected:
void updateTitle();
void initSpinBox(QDoubleSpinBox *theSpinBox);
private:
QFrame* myBtnFrame;
CurveCreator::Dimension myDim;
QDoubleSpinBox* myX;
QDoubleSpinBox* myY;
QDoubleSpinBox* myZ;
QLabel* myZLabel;
QPushButton* myAddBtn;
QPushButton* myCancelBtn;
bool myIsEdit;
QString mySectionName;
bool myIsInstantSketchingEnabled;
};
#endif // CURVECREATOR_NEWPOINTDLG_H

44
src/CurveCreator/CurveCreator_NewSectionDlg.cxx Executable file → Normal file
View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -18,7 +18,7 @@
//
#include "CurveCreator_NewSectionDlg.h"
#include "CurveCreator_Curve.hxx"
//#include "CurveCreator_Curve.hxx"
#include <SUIT_Session.h>
#include <SUIT_ResourceMgr.h>
@ -31,21 +31,27 @@
#include <QDialogButtonBox>
#include <QPushButton>
CurveCreator_NewSectionDlg::CurveCreator_NewSectionDlg( QWidget *parent ) :
QWidget(parent)
CurveCreator_NewSectionDlg::CurveCreator_NewSectionDlg( QWidget *parent, bool enableClosed ) :
QWidget(parent), myIsEnableClosed( enableClosed )
{
QVBoxLayout* aMainLayout = new QVBoxLayout( this );
aMainLayout->setMargin( 0 );
QFrame* aFrame = new QFrame( this );
aMainLayout->addWidget( aFrame );
QVBoxLayout* aLayout = new QVBoxLayout( aFrame );
aLayout->setMargin( 0 );
QFrame* aCoordFrame = new QFrame( aFrame );
QGridLayout* aCoordLayout = new QGridLayout( aCoordFrame );
QLabel* aLbl = new QLabel(tr("NAME"), this);
QLabel* aLbl = new QLabel(tr("SECTION_NAME"), this);
myName = new QLineEdit(this);
aCoordLayout->addWidget(aLbl, 0, 0);
aCoordLayout->addWidget(myName, 0 , 1);
aLbl = new QLabel(tr("LINE_TYPE"));
aLbl = new QLabel(tr("SECTION_LINE_TYPE"));
myLineType = new QComboBox(this);
SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
@ -54,22 +60,26 @@ CurveCreator_NewSectionDlg::CurveCreator_NewSectionDlg( QWidget *parent ) :
// QPixmap aPolylinePixmap = QPixmap(tr(":images/ICON_POLYLINE"));
// QPixmap aSplinePixmap = QPixmap(tr(":images/ICON_SPLINE"));
myLineType->addItem(aPolylinePixmap, tr("POLYLINE_TYPE"));
myLineType->addItem(aSplinePixmap, tr("SPLINE_TYPE"));
myLineType->addItem(aPolylinePixmap, tr("SECTION_POLYLINE_TYPE"));
myLineType->addItem(aSplinePixmap, tr("SECTION_SPLINE_TYPE"));
myLineType->setCurrentIndex(0);
aCoordLayout->addWidget(aLbl, 1, 0);
aCoordLayout->addWidget(myLineType, 1 , 1);
aLbl = new QLabel(tr("LINE_CLOSED"));
aLbl = new QLabel(tr("SECTION_LINE_CLOSED"));
myIsClosed = new QCheckBox(this);
aCoordLayout->addWidget(aLbl, 2, 0);
aCoordLayout->addWidget(myIsClosed, 2, 1);
if ( !myIsEnableClosed ) {
aLbl->hide();
myIsClosed->hide();
}
myBtnFrame = new QFrame( aFrame );
QHBoxLayout* aBtnsLayout = new QHBoxLayout( myBtnFrame );
myAddBtn = new QPushButton( tr( "ADD_BTN" ), myBtnFrame );
myCancelBtn = new QPushButton( tr( "CANCEL" ), myBtnFrame );
myAddBtn = new QPushButton( tr( "SECTION_ADD_BTN" ), myBtnFrame );
myCancelBtn = new QPushButton( tr( "SECTION_CANCEL_BTN" ), myBtnFrame );
connect( myAddBtn, SIGNAL( clicked() ), this, SIGNAL( addSection() ) );
connect( myCancelBtn, SIGNAL( clicked() ), this, SIGNAL( cancelSection() ) );
@ -82,7 +92,7 @@ CurveCreator_NewSectionDlg::CurveCreator_NewSectionDlg( QWidget *parent ) :
aLayout->addWidget( myBtnFrame, 1 );
}
void CurveCreator_NewSectionDlg::setSectionParameters( const QString& theName, bool isClosed, CurveCreator::Type theType )
void CurveCreator_NewSectionDlg::setSectionParameters( const QString& theName, bool isClosed, CurveCreator::SectionType theType )
{
myName->setText(theName);
myIsClosed->setChecked(isClosed);
@ -103,12 +113,12 @@ void CurveCreator_NewSectionDlg::setEditMode( bool isEdit )
{
myIsEdit = isEdit;
if( myIsEdit ){
myAddBtn->setText(tr("OK"));
myAddBtn->setText(tr("SECTION_OK_BTN"));
myAddBtn->disconnect( SIGNAL( clicked() ) );
connect( myAddBtn, SIGNAL( clicked() ), this, SIGNAL( modifySection() ) );
}
else{
myAddBtn->setText(tr("ADD_BTN"));
myAddBtn->setText(tr("SECTION_ADD_BTN"));
myAddBtn->disconnect( SIGNAL( clicked() ) );
connect( myAddBtn, SIGNAL( clicked() ), this, SIGNAL( addSection() ) );
}
@ -125,12 +135,12 @@ bool CurveCreator_NewSectionDlg::isClosed() const
return myIsClosed->isChecked();
}
CurveCreator::Type CurveCreator_NewSectionDlg::getSectionType() const
CurveCreator::SectionType CurveCreator_NewSectionDlg::getSectionType() const
{
if( myLineType->currentIndex() == 0 )
return CurveCreator::Polyline;
else
return CurveCreator::BSpline;
return CurveCreator::Spline;
}
void CurveCreator_NewSectionDlg::updateTitle()

15
src/CurveCreator/CurveCreator_NewSectionDlg.h Executable file → Normal file
View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -21,10 +21,11 @@
#define CURVECREATOR_NEWSECTION_H
#include "CurveCreator.hxx"
#include "CurveCreator_ICurve.hxx"
#include <QDockWidget>
class CurveCreator_Curve;
//class CurveCreator_Curve;
class QLineEdit;
class QComboBox;
@ -38,16 +39,17 @@ class CurveCreator_NewSectionDlg : public QWidget
{
Q_OBJECT
public:
explicit CurveCreator_NewSectionDlg(QWidget *parent = 0);
explicit CurveCreator_NewSectionDlg(QWidget *parent = 0, bool enableClosed = true );
QString getName() const;
bool isClosed() const;
CurveCreator::Type getSectionType() const;
CurveCreator::SectionType getSectionType() const;
void setSectionParameters( const QString& theName, bool isClosed, CurveCreator::Type theType );
void setSectionParameters( const QString& theName, bool isClosed, CurveCreator::SectionType theType );
void setSectionName(const QString& theName );
void clear();
void setEditMode( bool isEdit );
bool isEnableClosed() const { return myIsEnableClosed; }
signals:
void addSection();
@ -63,6 +65,7 @@ private:
QComboBox* myLineType;
QCheckBox* myIsClosed;
bool myIsEdit;
bool myIsEnableClosed;
QPushButton* myAddBtn;
QPushButton* myCancelBtn;
};

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -22,6 +22,7 @@
#include "CurveCreator_Operation.hxx"
#include "CurveCreator_Curve.hxx"
#include "CurveCreator.hxx"
#include <string>
#include <stdlib.h>
@ -46,6 +47,11 @@ CurveCreator_Operation::~CurveCreator_Operation()
clear();
}
bool compId(CurveCreator_PosPoint* p1, CurveCreator_PosPoint* p2)
{
return p1->myID < p2->myID;
}
//=======================================================================
// function: Constructor
// purpose:
@ -54,8 +60,7 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType)
{
bool isOK = false;
if (theType == CurveCreator_Operation::Clear ||
theType == CurveCreator_Operation::Join) {
if (theType == CurveCreator_Operation::Clear) {
clear();
myType = theType;
isOK = true;
@ -113,23 +118,28 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
// function: Constructor
// purpose:
//=======================================================================
bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
const int theIntParam1,
const int theIntParam2,
const int theIntParam3)
bool CurveCreator_Operation::init(const Type theType, const std::list<int> theParamList)
{
bool isOK = false;
if (theType == CurveCreator_Operation::RemovePoints) {
int *pData = (int *)allocate(3*sizeof(int));
if (theType == CurveCreator_Operation::Join)
{
const int aNbPoints = theParamList.size();
const size_t aSize =
sizeof(aNbPoints) +
aNbPoints * (sizeof(int));
int *pIntData = (int *)allocate(aSize);
*pIntData++ = aNbPoints;
std::list<int>::const_iterator anIt = theParamList.begin(), aLast = theParamList.end();
for ( ; anIt != aLast; anIt++ )
*pIntData++ = *anIt;
pData[0] = theIntParam1;
pData[1] = theIntParam2;
pData[2] = theIntParam3;
myType = theType;
isOK = true;
isOK = true;
}
return isOK;
}
@ -166,43 +176,6 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
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: Constructor
// purpose:
@ -234,7 +207,7 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
pIntData = (int*)aStrPtr;
*pIntData++ = aNbCoords;
CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)aStrPtr;
CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)pIntData;
int i = 0;
for (; i < aNbCoords; i++) {
@ -269,6 +242,84 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
return false;
}
bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
const CurveCreator_ICurve::SectionToPointCoordsList &theParamList1)
{
bool isOK = false;
if (theType == CurveCreator_Operation::InsertPoints ||
theType == CurveCreator_Operation::SetCoordinates ) {
const int aNbPoints = theParamList1.size();
CurveCreator_ICurve::SectionToPointCoordsList::const_iterator anIt =
theParamList1.begin();
const int aNbCoords = anIt->second.size();
const size_t aSize =
sizeof(aNbPoints) + sizeof(aNbCoords) +
aNbPoints * (3*sizeof(int) + aNbCoords*sizeof(CurveCreator::TypeCoord));
int *pIntData = (int *)allocate(aSize);
*pIntData++ = aNbPoints;
*pIntData++ = aNbCoords;
int aSectionId, aPointId;
for ( ; anIt != theParamList1.end(); anIt++ ) {
aSectionId = anIt->first.first;
aPointId = anIt->first.second;
*pIntData++ = aSectionId;
*pIntData++ = aPointId;
*pIntData++ = aNbCoords;
const CurveCreator::Coordinates &aCoords = anIt->second;
CurveCreator::TypeCoord *pRealData = (CurveCreator::TypeCoord *)pIntData;
for (int i = 0; i < aNbCoords; i++) {
*pRealData++ = aCoords[i];
}
pIntData = (int *)pRealData;
}
myType = theType;
isOK = true;
}
return isOK;
}
bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
const CurveCreator_ICurve::SectionToPointList &theParamList1)
{
bool isOK = false;
if (theType == CurveCreator_Operation::RemovePoints) {
const int aNbPoints = theParamList1.size();
CurveCreator_ICurve::SectionToPointList::const_iterator anIt =
theParamList1.begin();
const size_t aSize =
sizeof(aNbPoints) +
aNbPoints * (2*sizeof(int));
int *pIntData = (int *)allocate(aSize);
*pIntData++ = aNbPoints;
int aSectionId, aPointId;
for ( ; anIt != theParamList1.end(); anIt++ ) {
aSectionId = anIt->first;
aPointId = anIt->second;
*pIntData++ = aSectionId;
*pIntData++ = aPointId;
}
myType = theType;
isOK = true;
}
return isOK;
}
//=======================================================================
// function: apply
// purpose:
@ -280,58 +331,81 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve)
switch (myType) {
case CurveCreator_Operation::AddPoints:
case CurveCreator_Operation::InsertPoints:
case CurveCreator_Operation::SetCoordinates:
{
int aSectionId, aPointId;
CurveCreator::SectionsMap aSectionsMap;
CurveCreator::PosPointsList aPoints;
CurveCreator::Coordinates aCoords;
getCoords(&pInt[1], aCoords);
theCurve->addPoints(aCoords, pInt[0]);
int nbPoints = pInt[0];
int nbCoords = pInt[1];
int nbParams = 3+nbCoords;
for (int i = 0; i < nbPoints*nbParams; i=i+nbParams) {
aCoords.clear();
aPoints.clear();
getCoords(&pInt[4+i], aCoords);
aSectionId = pInt[2+i];
aPointId = pInt[3+i];
if ( aSectionsMap.find( aSectionId ) != aSectionsMap.end() )
aPoints = aSectionsMap[aSectionId];
CurveCreator_PosPoint* aPosPoint = new CurveCreator_PosPoint( aPointId, aCoords );
aPoints.push_back( aPosPoint );
aPoints.sort(compId);
aSectionsMap[aSectionId] = aPoints;
}
switch (myType) {
case CurveCreator_Operation::AddPoints:
case CurveCreator_Operation::InsertPoints:
theCurve->addPointsInternal( aSectionsMap );
break;
case CurveCreator_Operation::SetCoordinates:
theCurve->setPointInternal( aSectionsMap );
break;
}
}
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]);
CurveCreator_ICurve::SectionToPointList aListOfSectionsToPoints;
int nbPoints = pInt[0];
for (int i = 1; i < nbPoints*2; i=i+2) {
aListOfSectionsToPoints.push_back(std::make_pair(pInt[i], pInt[i+1]));
}
theCurve->removePointsInternal(aListOfSectionsToPoints);
}
break;
case CurveCreator_Operation::SetType:
{
const CurveCreator::Type aType = (CurveCreator::Type) pInt[0];
const CurveCreator::SectionType aType = (CurveCreator::SectionType) pInt[0];
theCurve->setType(aType, pInt[1]);
theCurve->setSectionTypeInternal( pInt[1], aType );
}
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]);
}
theCurve->clearInternal();
break;
case CurveCreator_Operation::SetClosed:
theCurve->setClosed((pInt[0] != 0), pInt[1]);
theCurve->setClosedInternal(pInt[1], (pInt[0] != 0));
break;
case CurveCreator_Operation::MoveSection:
theCurve->moveSection(pInt[0], pInt[1]);
theCurve->moveSectionInternal(pInt[0], pInt[1]);
break;
case CurveCreator_Operation::Join:
if (myPData == NULL) {
theCurve->join();
} else {
theCurve->join(pInt[0], pInt[1]);
if (myPData != NULL)
{
std::list<int> aListOfSections;
int nbSections = pInt[0];
for (int i = 1; i < nbSections+1; i++) {
aListOfSections.push_back(pInt[i]);
}
theCurve->joinInternal(aListOfSections);
}
break;
case CurveCreator_Operation::AddSection:
{
const CurveCreator::Type aType = (CurveCreator::Type) pInt[0];
const CurveCreator::SectionType aType = (CurveCreator::SectionType) pInt[0];
std::string aName = std::string((char*)&pInt[2]);
@ -340,16 +414,16 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve)
char* aPtr = ((char*)&pInt[2]);
aPtr += (aName.length()) + 1;
getCoords((int*)aPtr, aCoords);
theCurve->addSection(aName, aType, (pInt[1] != 0), aCoords);
theCurve->addSectionInternal(aName, aType, (pInt[1] != 0), aCoords);
}
break;
case CurveCreator_Operation::RemoveSection:
theCurve->removeSection(pInt[0]);
theCurve->removeSectionInternal(pInt[0]);
break;
case CurveCreator_Operation::RenameSection:
{
std::string aName = std::string((char*)&pInt[1]);
theCurve->setName(aName, pInt[0]);
theCurve->setSectionNameInternal(pInt[0], aName);
}
break;
default:

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -24,8 +24,11 @@
#define _CurveCreator_Operation_HeaderFile
#include "CurveCreator.hxx"
#include "CurveCreator_ICurve.hxx"
#include "CurveCreator_PosPoint.hxx"
#include <string>
#include <vector>
class CurveCreator_Curve;
@ -74,7 +77,6 @@ public:
* 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.
*/
@ -105,15 +107,26 @@ public:
const int theIntParam2);
/**
* This method initializes the object with an operation with three integer
* This method initializes the object with an operation with two integer
* parameters. It is applicable to the following operations:
* <UL>
* <LI>Join (with a list of int arguments)</LI>
* </UL>
* @return true in case of success; false otherwise.
*/
bool init(const Type theType, const std::list<int> theParamList);
/**
* This method initializes the object with an operation with
* list of pairs of integer parameters.
* 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);
bool init(const Type theType,
const CurveCreator_ICurve::SectionToPointList &theParamList1);
/**
* This method initializes the object with an operation with one
@ -128,18 +141,16 @@ public:
const int theIntParam);
/**
* This method initializes the object with an operation with one
* CurveCreator::Coordinates parameter and two integer parameters.
* This method initializes the object with an operation with
* list of pairs of integer parameters and CurveCreator::Coordinates 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);
bool init(const Type theType,
const CurveCreator_ICurve::SectionToPointCoordsList &theParamList1);
/**
* This method initializes the object with an operation with one

View File

@ -0,0 +1,46 @@
// Copyright (C) 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: CurveCreator_PosPoint.hxx
// Author: Alexander KOVALEV
#ifndef _CurveCreator_PosPoint_HeaderFile
#define _CurveCreator_PosPoint_HeaderFile
#include "CurveCreator.hxx"
struct CurveCreator_PosPoint
{
public:
CurveCreator_PosPoint( int theID, CurveCreator::Coordinates theCoords )
: myID( theID ), myCoords( theCoords )
{ };
////! Overloaded operator to use sorting.
//bool operator < (CurveCreator_PosPoint const & thePosPoint) const
//{
// return myID < thePosPoint.myID;
//}
int myID; // point ID
CurveCreator::Coordinates myCoords; // point coordinates
};
#endif

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -36,7 +36,7 @@ struct CurveCreator_Section
std::string myName; //!< section name
CurveCreator::Coordinates myPoints; //!< points coordinates
CurveCreator::Type myType; //!< type of the section
CurveCreator::SectionType myType; //!< type of the section
bool myIsClosed; //!< closed or not
};

View File

@ -0,0 +1,178 @@
// Copyright (C) 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
//
#include "CurveCreator_TableView.h"
#include "CurveCreator_UtilsICurve.hxx"
#include <gp_Pnt.hxx>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QtxDoubleSpinBox.h>
const double DBL_MINIMUM = -10000000.;
const double DBL_MAXIMUM = 10000000.;
const int SECTION_NAME_COLUMN_WIDTH = 75;
const int POINT_INDEX_COLUMN_WIDTH = 40;
const double LOCAL_SELECTION_TOLERANCE = 0.0001;
CurveCreator_TableItemDelegate::CurveCreator_TableItemDelegate( QObject* theParent )
: QItemDelegate( theParent )
{
}
/**
* Creates an editor for the cell
*/
QWidget* CurveCreator_TableItemDelegate::createEditor( QWidget* theParent,
const QStyleOptionViewItem& theOption,
const QModelIndex& theIndex ) const
{
QWidget* anEditor = 0;
int aColumnId = theIndex.column();
if ( aColumnId == 2 || aColumnId == 3 ) {
QDoubleSpinBox* aSpin = new QtxDoubleSpinBox( theParent );
aSpin->setDecimals( 2 );
aSpin->setRange( DBL_MINIMUM, DBL_MAXIMUM );
anEditor = aSpin;
}
else
anEditor = QItemDelegate::createEditor( theParent, theOption, theIndex );
return anEditor;
}
void CurveCreator_TableItemDelegate::setEditorData( QWidget* theEditor,
const QModelIndex& theIndex ) const
{
int aColumnId = theIndex.column();
if ( aColumnId == 2 || aColumnId == 3 ) {
QDoubleSpinBox* aDblSpin = dynamic_cast<QDoubleSpinBox*>( theEditor );
if ( aDblSpin ) {
double aValue = theIndex.model()->data( theIndex, Qt::EditRole ).toDouble();
aDblSpin->setValue( aValue );
}
}
else
QItemDelegate::setEditorData( theEditor, theIndex );
}
void CurveCreator_TableItemDelegate::setModelData( QWidget* theEditor,
QAbstractItemModel* theModel,
const QModelIndex& theIndex ) const
{
int aColumnId = theIndex.column();
if ( aColumnId == 2 || aColumnId == 3 ) {
QDoubleSpinBox* aDblSpin = dynamic_cast<QDoubleSpinBox*>( theEditor );
if ( aDblSpin ) {
double aValue = aDblSpin->value();
theModel->setData( theIndex, aValue, Qt::UserRole);
}
}
else
QItemDelegate::setModelData( theEditor, theModel, theIndex );
}
CurveCreator_TableView::CurveCreator_TableView( CurveCreator_ICurve* theCurve,
QWidget* theParent,
const QStringList& theCoordTitles )
: QTableWidget( theParent ), myCurve( theCurve )
{
setItemDelegate( new CurveCreator_TableItemDelegate( this ) );
setVisible( false );
setColumnCount( 4 );
setColumnWidth( 0, SECTION_NAME_COLUMN_WIDTH );
setColumnWidth( 1, POINT_INDEX_COLUMN_WIDTH );
QStringList aLabels;
QString aCoord1 = theCoordTitles.size() > 0 ? theCoordTitles[0] : tr( "TABLE_X" ); // tr( "X_POSITION_LBL" )
QString aCoord2 = theCoordTitles.size() > 1 ? theCoordTitles[1] : tr( "TABLE_Y" ); // tr( "Y_POSITION_LBL" )
//aLabels << tr( "SECTION_LABEL" ) << tr( "IDENTIFIER_LABEL" ) << aCoord1 << aCoord2;
aLabels << tr( "TABLE_SECTION" ) << tr("TABLE_INDEX") << aCoord1 << aCoord2;
setHorizontalHeaderLabels( aLabels );
}
void CurveCreator_TableView::setCurve( CurveCreator_ICurve* theCurve )
{
myCurve = theCurve;
}
void CurveCreator_TableView::setLocalPointsToTable(
const CurveCreator_ICurve::SectionToPointList& thePoints )
{
setRowCount( thePoints.size() );
int aRowId = 0;
CurveCreator_ICurve::SectionToPointList::const_iterator anIt = thePoints.begin(),
aLast = thePoints.end();
for ( ; anIt != aLast; anIt++ ) {
CurveCreator_ICurve::SectionToPoint aSPoint = *anIt;
int anISection = aSPoint.first;
int anIPoint = aSPoint.second;
QTableWidgetItem* anItem;
anItem = new QTableWidgetItem( myCurve->getSectionName( anISection ).c_str() );
anItem->setFlags( anItem->flags() & ~Qt::ItemIsEnabled );
anItem->setData( Qt::UserRole, anISection );
setItem( aRowId, 0, anItem );
anItem = new QTableWidgetItem( QString::number( anIPoint + 1 ) );
anItem->setFlags( anItem->flags() & ~Qt::ItemIsEnabled );
anItem->setData( Qt::UserRole, anIPoint );
setItem( aRowId, 1, anItem );
gp_Pnt aPoint;
CurveCreator_UtilsICurve::getPoint( myCurve, anISection, anIPoint, aPoint );
anItem = item( aRowId, 2 );
if ( !anItem ) {
anItem = new QTableWidgetItem();
setItem( aRowId, 2, anItem );
}
anItem->setData( Qt::UserRole, aPoint.X() );
anItem->setData( Qt::DisplayRole, QString::number( aPoint.X(), 'f', 2 ) );
anItem = item( aRowId, 3 );
if ( !anItem ) {
anItem = new QTableWidgetItem();
setItem( aRowId, 3, anItem );
}
anItem->setData( Qt::UserRole, aPoint.Y() );
anItem->setData( Qt::DisplayRole, QString::number( aPoint.Y(), 'f', 2 ) );
aRowId++;
}
}
int CurveCreator_TableView::getSectionId( const int theRowId ) const
{
return item( theRowId, 0 )->data( Qt::UserRole ).toInt();
}
/**
* Returns a point index from the table
* \param theRowId a table row
*/
int CurveCreator_TableView::getPointId( const int theRowId ) const
{
return item( theRowId, 1 )->data( Qt::UserRole ).toInt();
}

View File

@ -0,0 +1,69 @@
// Copyright (C) 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
//
#ifndef CURVECREATOR_TABLEVIEW_H
#define CURVECREATOR_TABLEVIEW_H
#include "CurveCreator_ICurve.hxx"
#include <QItemDelegate>
#include <QTableWidget>
class CurveCreator_TableItemDelegate : public QItemDelegate
{
public:
CurveCreator_TableItemDelegate( QObject* theParent );
~CurveCreator_TableItemDelegate() {}
virtual QWidget* createEditor( QWidget* theParent,
const QStyleOptionViewItem& theOption,
const QModelIndex& theIndex ) const;
virtual void setEditorData( QWidget* theEditor, const QModelIndex& theIndex ) const;
virtual void setModelData( QWidget* theEditor, QAbstractItemModel* theModel,
const QModelIndex& theIndex ) const;
};
class CurveCreator_TableView : public QTableWidget
{
public:
CurveCreator_TableView( CurveCreator_ICurve* theCurve, QWidget* theParent = 0,
const QStringList& theCoordTitles = QStringList() );
~CurveCreator_TableView() {};
void setCurve( CurveCreator_ICurve* theCurve );
void setLocalPointsToTable( const CurveCreator_ICurve::SectionToPointList& thePoints );
/**
* Returns a section index from the table
* \param theRowId a table row
*/
int getSectionId( const int theRowId ) const;
/**
* Returns a point index from the table
* \param theRowId a table row
*/
int getPointId( const int theRowId ) const;
private:
CurveCreator_ICurve* myCurve;
};
#endif // CURVECREATOR_TABLEVIEW_H

80
src/CurveCreator/CurveCreator_TreeView.cxx Executable file → Normal file
View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -18,7 +18,7 @@
//
#include "CurveCreator_TreeView.h"
#include "CurveCreator_Curve.hxx"
#include "CurveCreator_ICurve.hxx"
#include <SUIT_Session.h>
#include <SUIT_ResourceMgr.h>
@ -28,7 +28,7 @@
#define ID_SECTION -1
CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_Curve* theCurve, QObject* parent ) :
CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent ) :
QAbstractItemModel(parent), myCurve(theCurve)
{
SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
@ -86,7 +86,7 @@ QVariant CurveCreator_TreeViewModel::data(const QModelIndex & index, int role )
}
else if( role == Qt::DecorationRole ){
if( aColumn == 0 ){
CurveCreator::Type aSectionType = myCurve->getType(aRow);
CurveCreator::SectionType aSectionType = myCurve->getSectionType(aRow);
if( aSectionType == CurveCreator::Polyline ){
if( myCurve->isClosed(aRow) ){
return myCachedIcons[ICON_CLOSED_POLYLINE];
@ -161,12 +161,12 @@ int CurveCreator_TreeViewModel::rowCount(const QModelIndex & parent ) const
int aRowCnt = 0;
if( myCurve != NULL ){
if( !parent.isValid() ){
//Points level
//Section level
aRowCnt = myCurve->getNbSections();
}
else{
//Section level
if( parent.internalId() == ID_SECTION ){
//Points level
aRowCnt = myCurve->getNbPoints(parent.row());
}
}
@ -210,14 +210,14 @@ int CurveCreator_TreeViewModel::getPoint( const QModelIndex& theIndx ) const
return theIndx.row();
}
void CurveCreator_TreeViewModel::setCurve( CurveCreator_Curve* theCurve )
void CurveCreator_TreeViewModel::setCurve( CurveCreator_ICurve* theCurve )
{
myCurve = theCurve;
reset();
}
/*****************************************************************************************/
CurveCreator_TreeView::CurveCreator_TreeView( CurveCreator_Curve* theCurve, QWidget *parent) :
CurveCreator_TreeView::CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent) :
QTreeView(parent)
{
header()->hide();
@ -249,7 +249,6 @@ QList<int> CurveCreator_TreeView::getSelectedSections() const
aSect << aModel->getSection( anIndxs[i] );
}
}
qSort(aSect.begin(), aSect.end());
return aSect;
}
@ -290,7 +289,11 @@ void CurveCreator_TreeView::sectionAdded( int theSection )
{
CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
if( aModel ){
rowsInserted(QModelIndex(), theSection, theSection );
int nbRows = aModel->rowCount();
int aSection = (theSection == -1 ? (nbRows==0 ? 0 : nbRows-1) : theSection);
rowsInserted(QModelIndex(), aSection, aSection );
QModelIndex aSectIndx = aModel->sectionIndex(aSection);
selectionModel()->select(aSectIndx, QItemSelectionModel::Rows | QItemSelectionModel::ClearAndSelect);
}
}
@ -361,16 +364,6 @@ void CurveCreator_TreeView::sectionsSwapped( int theSection, int theOffset )
}
}
void CurveCreator_TreeView::pointsSwapped( int theSection, int thePointNum, int theOffset )
{
CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
if( aModel ){
QModelIndex aFirstIndex = aModel->pointIndex( theSection, thePointNum );
QModelIndex aSecondIndex = aModel->pointIndex( theSection, thePointNum + theOffset );
swapIndexes( aFirstIndex, aSecondIndex );
}
}
void CurveCreator_TreeView::setSelectedSections( const QList<int>& theList )
{
CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
@ -378,19 +371,7 @@ void CurveCreator_TreeView::setSelectedSections( const QList<int>& theList )
selectionModel()->clearSelection();
for( int i = 0 ; i < theList.size() ; i++ ){
QModelIndex aSectIndx = aModel->sectionIndex(theList[i]);
selectionModel()->select(aSectIndx, QItemSelectionModel::Select );
}
}
}
void CurveCreator_TreeView::setSelectedPoints( const QList< QPair<int, int> >& thePointsList )
{
CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
if( aModel ){
selectionModel()->clearSelection();
for( int i = 0 ; i < thePointsList.size() ; i++ ){
QModelIndex aSectIndx = aModel->pointIndex( thePointsList[i].first, thePointsList[i].second );
selectionModel()->select(aSectIndx, QItemSelectionModel::Select );
selectionModel()->select(aSectIndx, QItemSelectionModel::Select | QItemSelectionModel::Rows );
}
}
}
@ -404,25 +385,6 @@ bool pointLessThan(const QPair<int,int> &s1, const QPair<int,int> &s2)
return s1.second < s2.second;
}
QList< QPair< int, int > > CurveCreator_TreeView::getSelectedPoints() const
{
QList< QPair< int, int > > aPoints;
CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
if( !aModel )
return aPoints;
QModelIndexList anIndxs = selectionModel()->selectedIndexes();
for( int i = 0 ; i < anIndxs.size() ; i++ ){
if( !aModel->isSection( anIndxs[i] ) ){
int aSect = aModel->getSection(anIndxs[i]);
int aPointNum = aModel->getPoint(anIndxs[i]);
QPair< int, int > aPoint = QPair<int,int>( aSect, aPointNum );
aPoints.push_back( aPoint );
}
}
qSort( aPoints.begin(), aPoints.end(), pointLessThan );
return aPoints;
}
CurveCreator_TreeView::SelectionType CurveCreator_TreeView::getSelectionType() const
{
CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
@ -470,16 +432,20 @@ void CurveCreator_TreeView::onActivated( QModelIndex theIndx )
int aSect = aModel->getSection(theIndx);
if( aModel->isSection(theIndx) ){
emit sectionEntered( aSect );
return;
}
int aPointNum = aModel->getPoint( theIndx );
emit pointEntered( aSect, aPointNum );
}
void CurveCreator_TreeView::setCurve( CurveCreator_Curve* theCurve )
void CurveCreator_TreeView::setCurve( CurveCreator_ICurve* theCurve )
{
CurveCreator_TreeViewModel* aModel = dynamic_cast<CurveCreator_TreeViewModel*>(model());
if( aModel )
aModel->setCurve(theCurve);
reset();
}
void CurveCreator_TreeView::reset()
{
QList<int> aSelSections = getSelectedSections();
QTreeView::reset();
setSelectedSections(aSelSections);
}

24
src/CurveCreator/CurveCreator_TreeView.h Executable file → Normal file
View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -23,12 +23,12 @@
#include <QTreeView>
#include <QAbstractItemModel>
class CurveCreator_Curve;
class CurveCreator_ICurve;
class CurveCreator_TreeViewModel : public QAbstractItemModel
{
public:
CurveCreator_TreeViewModel( CurveCreator_Curve* theCurve, QObject* parent );
CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent );
virtual int columnCount(const QModelIndex & parent = QModelIndex()) const;
virtual int rowCount(const QModelIndex & parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
@ -44,12 +44,12 @@ public:
int getSection( const QModelIndex& theIndx ) const;
int getPoint( const QModelIndex& theIndx ) const;
void setCurve( CurveCreator_Curve* theCurve );
void setCurve( CurveCreator_ICurve* theCurve );
private:
enum IconType{ ICON_POLYLINE, ICON_SPLINE, ICON_CLOSED_SPLINE, ICON_CLOSED_POLYLINE, ICON_POINT };
private:
CurveCreator_Curve* myCurve;
CurveCreator_ICurve* myCurve;
QMap<IconType, QPixmap> myCachedIcons;
};
@ -59,15 +59,13 @@ class CurveCreator_TreeView : public QTreeView
public:
enum SelectionType{ ST_NOSEL, ST_POINTS, ST_POINTS_ONE_SECTION, ST_SECTIONS, ST_MIXED };
public:
explicit CurveCreator_TreeView( CurveCreator_Curve* theCurve, QWidget *parent = 0);
explicit CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent = 0);
SelectionType getSelectionType() const;
QList<int> getSelectedSections() const;
QList< QPair< int, int > > getSelectedPoints() const;
void pointsAdded( int theSection, int thePoint, int thePointsCnt=1 );
void pointDataChanged( int theSection, int thePoint );
void pointsRemoved(int theSection, int thePoint, int thePointsCnt=1 );
void pointsSwapped( int theSection, int thePointNum, int theOffset );
void sectionAdded( int theSection );
void sectionChanged(int theSection , int aSectCnt = 1);
@ -75,15 +73,15 @@ public:
void sectionsSwapped( int theSection, int theOffset );
void setSelectedSections( const QList<int>& theList );
void setSelectedPoints( const QList< QPair<int, int> >& thePointsList );
void setCurve( CurveCreator_Curve* theCurve );
void setCurve( CurveCreator_ICurve* theCurve );
void reset();
signals:
void selectionChanged();
void sectionEntered(int);
void pointEntered(int,int);
public slots:
protected slots:
void onActivated( QModelIndex theIndx );
protected:

View File

@ -1,237 +0,0 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_UndoOptsDlg.cxx
// 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();
}

View File

@ -1,73 +0,0 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_UndoOptsDlg.h
// 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

View File

@ -0,0 +1,994 @@
// Copyright (C) 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
//
#include "CurveCreator_Utils.hxx"
#include "CurveCreator.hxx"
#include "CurveCreator_Curve.hxx"
#include "CurveCreator_UtilsICurve.hxx"
#include <GEOMUtils.hxx>
#include <gp_Pln.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Compound.hxx>
#include <AIS_ListOfInteractive.hxx>
#include <AIS_ListIteratorOfListOfInteractive.hxx>
#include <AIS_Shape.hxx>
#include <AIS_Line.hxx>
#include <AIS_Trihedron.hxx>
#include <AIS_LocalContext.hxx>
#include <Geom_Point.hxx>
#include <Geom_BSplineCurve.hxx>
#include <Geom_Line.hxx>
#include <Geom_Curve.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx>
#include <SelectMgr_EntityOwner.hxx>
#include <SelectMgr_Selection.hxx>
#include <Select3D_SensitivePoint.hxx>
#include <BRep_Tool.hxx>
#include <BRep_Builder.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepTools_WireExplorer.hxx>
#include <TColgp_HArray1OfPnt.hxx>
#include <TColStd_HArray1OfBoolean.hxx>
#include <TColStd_Array1OfReal.hxx>
#include <TColgp_Array1OfVec.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <ProjLib.hxx>
#include <ElSLib.hxx>
#include <math.h>
#include "CurveCreator_ICurve.hxx"
const double LOCAL_SELECTION_TOLERANCE = 0.0001;
const int SCENE_PIXEL_PROJECTION_TOLERANCE = 10;
const int SCENE_PIXEL_POINT_TOLERANCE = 5;
#define PLN_FREE 0
#define PLN_ORIGIN 1
#define PLN_OX 2
#define PLN_FIXED 3
/**
* This static function returns the curve of original type from the edge.
*
* \param theEdge the edge
* \return the curve of original type. Can be null handle.
*/
static Handle(Geom_Curve) GetCurve(const TopoDS_Edge &theEdge)
{
Handle(Geom_Curve) aResult;
if (theEdge.IsNull()) {
return aResult;
}
Standard_Real aF;
Standard_Real aL;
aResult = BRep_Tool::Curve(theEdge, aF, aL);
if (aResult.IsNull()) {
return aResult;
}
// Get the curve of original type
Handle(Standard_Type) aType = aResult->DynamicType();
while (aType == STANDARD_TYPE(Geom_TrimmedCurve)) {
Handle(Geom_TrimmedCurve) aTrCurve =
Handle(Geom_TrimmedCurve)::DownCast(aResult);
aResult = aTrCurve->BasisCurve();
aType = aResult->DynamicType();
}
return aResult;
}
//=======================================================================
// function : ConvertClickToPoint()
// purpose : Returns the point clicked in 3D view
//=======================================================================
void CurveCreator_Utils::ConvertPointToClick( const gp_Pnt& thePoint,
Handle(V3d_View) theView,
int& x, int& y )
{
theView->Convert(thePoint.X(), thePoint.Y(), thePoint.Z(), x, y );
}
//=======================================================================
// function : ConvertClickToPoint()
// purpose : Returns the point clicked in 3D view
//=======================================================================
gp_Pnt CurveCreator_Utils::ConvertClickToPoint( int x, int y, Handle(V3d_View) aView )
{
// the 3D point, that is a projection of the pixels to the XYZ view plane
//return GEOMUtils::ConvertClickToPoint( x, y, aView );
// we need the projection to the XOY plane
// 1. find a point in the plane of the eye and the normal to the plane
Standard_Real X, Y, Z;
Quantity_Parameter Vx, Vy, Vz;
aView->ConvertWithProj( x, y, X, Y, Z, Vx, Vy, Vz );
// 2. build a ray from the point by the normal to the XOY plane and intersect it
// The ray equation is the following : p(x,y,z) = p0(x,y,z) + t*V(x,y,z)
// X,Y,Z - defines p0(x,y,z), Vx,Vy,Vz - defines V(x,y,z)
// p(x,y,z) - is a searched point, t - should to be calculated by the condition of XOY plane
// The system of equations is the following:
// p(x) = p0(x)+t*V(x)
// p(y) = p0(y)+t*V(y)
// p(z) = p0(z)+t*V(z)
// p(z) = 0
Standard_Real aXp, aYp, aZp;
//It is not possible to use Precision::Confusion(), because it is e-0.8, but V is sometimes e-6
Standard_Real aPrec = LOCAL_SELECTION_TOLERANCE;
if ( fabs( Vz ) > aPrec ) {
Standard_Real aT = -Z/Vz;
aXp = X + aT*Vx;
aYp = Y + aT*Vy;
aZp = Z + aT*Vz;
}
else { // Vz = 0 - the eyed plane is orthogonal to Z plane - XOZ, or YOZ
aXp = aYp = aZp = 0;
if ( fabs( Vy ) < aPrec ) // Vy = 0 - the YOZ plane
aYp = Y;
else if ( fabs( Vx ) < aPrec ) // Vx = 0 - the XOZ plane
aXp = X;
}
/*std::cout << "ConvertClickToPoint: " << std::endl
<< "XYZ1 = (" << X << ", " << Y << ", " << Z << "); " << std::endl
<< "Vxyz = (" << Vx << ", " << Vy << ", " << Vz << "); " << std::endl
<< "Resp = (" << aXp << ", " << aYp << ", " << aZp << "); " << std::endl;*/
gp_Pnt ResultPoint( aXp, aYp, aZp );
return ResultPoint;
}
void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve,
TopoDS_Shape& theShape )
{
BRep_Builder aBuilder;
TopoDS_Compound aComp;
aBuilder.MakeCompound( aComp );
for( int iSection = 0 ; iSection < theCurve->getNbSections() ; iSection++ )
{
int theISection = iSection;
CurveCreator::SectionType aSectType = theCurve->getSectionType( theISection );
int aPointSize = theCurve->getNbPoints( theISection );
if ( aPointSize == 0 )
continue;
bool aSectIsClosed = theCurve->isClosed( theISection );
bool isPolyline = aSectType == CurveCreator::Polyline;
int iPoint = 0;
gp_Pnt aPrevPoint, aPoint;
// filters the curve points to skip equal points
std::vector<gp_Pnt> aPoints;
CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint );
aPoints.push_back( aPoint );
aPrevPoint = aPoint;
iPoint++;
for( ; iPoint < aPointSize; iPoint++ ) {
CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint );
if ( !isEqualPoints( aPrevPoint, aPoint ) )
aPoints.push_back( aPoint );
aPrevPoint = aPoint;
}
int aNbPoints = aPoints.size();
if ( aNbPoints == 1 ) {
aPoint = aPoints.front();
TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
aBuilder.Add( aComp, aVertex );
}
else if ( aNbPoints > 1 ) {
Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt(1, aNbPoints);
TColgp_Array1OfVec aTangents(1, aNbPoints);
Handle(TColStd_HArray1OfBoolean) aTangentFlags = new TColStd_HArray1OfBoolean(1, aNbPoints);
gp_Vec aNullVec(0, 0, 0);
TopoDS_Edge aPointEdge;
TopoDS_Vertex aVertex;
std::vector<gp_Pnt>::const_iterator aPointIt = aPoints.begin(), aPointLast = aPoints.end();
aPoint = *aPointIt;
int aHIndex = 1;
aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
aBuilder.Add( aComp, aVertex );
if ( !isPolyline ) {
aHCurvePoints->SetValue( aHIndex, aPoint );
aTangents.SetValue( aHIndex, aNullVec );
aTangentFlags->SetValue( aHIndex, Standard_False );
aHIndex++;
}
aPrevPoint = aPoint;
aPointIt++;
for( ; aPointIt != aPointLast; aPointIt++ ) {
aPoint = *aPointIt;
aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
aBuilder.Add( aComp, aVertex );
if ( isPolyline ) {
TopoDS_Edge aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
aBuilder.Add( aComp, aPointEdge );
}
else {
aHCurvePoints->SetValue( aHIndex, aPoint );
aTangents.SetValue( aHIndex, aNullVec );
aTangentFlags->SetValue( aHIndex, Standard_False );
aHIndex++;
}
aPrevPoint = aPoint;
}
if( aSectIsClosed && ( aNbPoints > 2 ) ) {
aPoint = aPoints.front();
aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex();
aBuilder.Add( aComp, aVertex );
if ( isPolyline ) {
aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
aBuilder.Add( aComp, aPointEdge );
}
}
if( !isPolyline ) {
// compute BSpline
Handle(Geom_BSplineCurve) aBSplineCurve;
GeomAPI_Interpolate aGBC(aHCurvePoints, aSectIsClosed, gp::Resolution());
// correct the spline degree to be as 3 for non-periodic spline if number of points
// less than 3. It is need to have a knot in each spline point. This knots are used
// to found a neighbour points when a new point is inserted between two existing.
if (!aSectIsClosed ) {
if (aHCurvePoints->Length() == 3)
aGBC.Load(aTangents, aTangentFlags);
}
aGBC.Perform();
if ( aGBC.IsDone() )
aBSplineCurve = aGBC.Curve();
TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aBSplineCurve ).Edge();
TopoDS_Wire aWire = BRepBuilderAPI_MakeWire( anEdge ).Wire();
aBuilder.Add( aComp, aWire );
}
}
}
theShape = aComp;
}
/**
* This is an intermediate structure for curve construction.
*/
struct Section3D
{
Section3D() : myIsClosed(false), myIsBSpline(false)
{ }
bool myIsClosed;
bool myIsBSpline;
Handle(TColgp_HArray1OfPnt) myPoints;
};
//=======================================================================
// function : constructCurve
// purpose :
//=======================================================================
bool CurveCreator_Utils::constructCurve
(const TopoDS_Shape theShape,
CurveCreator_Curve *theCurve,
gp_Ax3 &theLocalCS)
{
if (theShape.IsNull()) {
return false;
}
// Collect wires or vertices from shape.
TopTools_ListOfShape aWOrV;
TopAbs_ShapeEnum aType = theShape.ShapeType();
if (aType == TopAbs_WIRE || aType == TopAbs_VERTEX) {
aWOrV.Append(theShape);
} else if (aType == TopAbs_COMPOUND) {
TopoDS_Iterator aShIter(theShape);
for (; aShIter.More(); aShIter.Next()) {
const TopoDS_Shape &aSubShape = aShIter.Value();
aType = aSubShape.ShapeType();
if (aType == TopAbs_WIRE || aType == TopAbs_VERTEX) {
aWOrV.Append(aSubShape);
} else {
// Only subshapes of types wire or vertex are supported.
return false;
}
}
} else {
// Only wire (vertex) or compound of wires (vertices) are supported.
return false;
}
// Treat each wire or vertex. Get points, compute the working plane.
gp_Pln aPlane;
Standard_Integer aPlaneStatus = PLN_FREE;
TopTools_ListIteratorOfListOfShape anIter(aWOrV);
std::list<Section3D> aListSec;
for (; anIter.More(); anIter.Next()) {
Section3D aSec3D;
aSec3D.myPoints = CurveCreator_Utils::getPoints
(anIter.Value(), aSec3D.myIsClosed, aSec3D.myIsBSpline);
if (aSec3D.myPoints.IsNull()) {
return false;
}
aListSec.push_back(aSec3D);
if (aPlaneStatus != PLN_FIXED) {
// Compute plane
CurveCreator_Utils::FindPlane(aSec3D.myPoints, aPlane, aPlaneStatus);
}
}
// Check if it is possible to change a computed coordinate system by
// XOY, XOZ or YOZ or parallel to them.
gp_Pnt aO(0., 0., 0.);
gp_Dir aNDir(0., 0., 1.);
gp_Dir aXDir(1., 0., 0.);
gp_Ax3 anAxis;
Standard_Real aTolAng = Precision::Confusion(); // Angular() is too small.
switch (aPlaneStatus) {
case PLN_ORIGIN:
{
// Change the location.
aO.SetZ(aPlane.Location().Z());
anAxis.SetLocation(aO);
aPlane.SetPosition(anAxis);
}
break;
case PLN_OX:
{
// Fixed origin + OX axis
const gp_Dir &aPlnX = aPlane.Position().XDirection();
if (Abs(aPlnX.Z()) <= aTolAng) {
// Make a coordinate system parallel to XOY.
aO.SetZ(aPlane.Location().Z());
anAxis.SetLocation(aO);
aPlane.SetPosition(anAxis);
} else if (Abs(aPlnX.Y()) <= aTolAng) {
// Make a coordinate system parallel to XOZ.
aO.SetY(aPlane.Location().Y());
aNDir.SetCoord(0., 1., 0.);
aXDir.SetCoord(0., 0., 1.);
anAxis = gp_Ax3(aO, aNDir, aXDir);
aPlane.SetPosition(anAxis);
} else if (Abs(aPlnX.X()) <= aTolAng) {
// Make a coordinate system parallel to YOZ.
aO.SetX(aPlane.Location().X());
aNDir.SetCoord(1., 0., 0.);
aXDir.SetCoord(0., 1., 0.);
anAxis = gp_Ax3(aO, aNDir, aXDir);
aPlane.SetPosition(anAxis);
}
}
break;
case PLN_FIXED:
{
const gp_Dir &aPlnN = aPlane.Position().Direction();
gp_Dir aYDir(0., 1., 0.);
if (aPlnN.IsParallel(aNDir, aTolAng)) {
// Make a coordinate system parallel to XOY.
aO.SetZ(aPlane.Location().Z());
anAxis.SetLocation(aO);
aPlane.SetPosition(anAxis);
} else if (aPlnN.IsParallel(aYDir, aTolAng)) {
// Make a coordinate system parallel to XOZ.
aO.SetY(aPlane.Location().Y());
aNDir.SetCoord(0., 1., 0.);
aXDir.SetCoord(0., 0., 1.);
anAxis = gp_Ax3(aO, aNDir, aXDir);
aPlane.SetPosition(anAxis);
} else if (aPlnN.IsParallel(aXDir, aTolAng)) {
// Make a coordinate system parallel to YOZ.
aO.SetX(aPlane.Location().X());
aNDir.SetCoord(1., 0., 0.);
aXDir.SetCoord(0., 1., 0.);
anAxis = gp_Ax3(aO, aNDir, aXDir);
aPlane.SetPosition(anAxis);
}
}
break;
case PLN_FREE:
default:
// Use XOY plane.
aPlane.SetPosition(anAxis);
break;
}
// Compute 2d points.
std::list<Section3D>::const_iterator aSecIt = aListSec.begin();
Standard_Real aTolConf2 =
Precision::Confusion()*Precision::Confusion();
Standard_Real aX;
Standard_Real aY;
for (; aSecIt != aListSec.end(); ++aSecIt) {
Standard_Integer i;
CurveCreator::Coordinates aCoords;
for (i = aSecIt->myPoints->Lower(); i <= aSecIt->myPoints->Upper(); ++i) {
const gp_Pnt &aPnt = aSecIt->myPoints->Value(i);
if (aPlane.SquareDistance(aPnt) > aTolConf2) {
// The point doesn't lie on the plane.
return false;
}
ElSLib::Parameters(aPlane, aPnt, aX, aY);
aCoords.push_back(aX);
aCoords.push_back(aY);
}
// Add a new section to the curve.
const std::string aSecName =
CurveCreator_UtilsICurve::getUniqSectionName(theCurve);
const CurveCreator::SectionType aSecType = aSecIt->myIsBSpline ?
CurveCreator::Spline : CurveCreator::Polyline;
theCurve->addSectionInternal(aSecName, aSecType,
aSecIt->myIsClosed, aCoords);
}
// Set the local coordinate system.
theLocalCS = aPlane.Position();
return true;
}
class CompareSectionToPoint
{
public:
CompareSectionToPoint( const int theISection = -1, const int theIPoint = -1 )
: mySectionId( theISection ), myPointId( theIPoint ) {};
~CompareSectionToPoint() {}
bool operator < ( const CompareSectionToPoint& theOther ) const
{
bool isLess = mySectionId < theOther.mySectionId;
if ( !isLess && mySectionId == theOther.mySectionId )
isLess = myPointId < theOther.myPointId;
return isLess;
}
private:
int mySectionId;
int myPointId;
};
void CurveCreator_Utils::getSelectedPoints( Handle(AIS_InteractiveContext) theContext,
const CurveCreator_ICurve* theCurve,
CurveCreator_ICurve::SectionToPointList& thePoints )
{
thePoints.clear();
std::list<float> aSelectedPoints;
gp_Pnt aPnt;
std::map<CompareSectionToPoint, int> aPointsMap;
CurveCreator_ICurve::SectionToPointList aPoints;
for ( theContext->InitSelected(); theContext->MoreSelected(); theContext->NextSelected() ) {
TopoDS_Vertex aVertex;
TopoDS_Shape aShape = theContext->SelectedShape();
if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX )
aVertex = TopoDS::Vertex( theContext->SelectedShape() );
if ( aVertex.IsNull() )
continue;
aPnt = BRep_Tool::Pnt( aVertex );
CurveCreator_UtilsICurve::findSectionsToPoints( theCurve, aPnt.X(), aPnt.Y(), aPoints );
CurveCreator_ICurve::SectionToPointList::const_iterator anIt = aPoints.begin(),
aLast = aPoints.end();
CompareSectionToPoint aPoint;
for ( ; anIt != aLast; anIt++ ) {
aPoint = CompareSectionToPoint( (*anIt).first, (*anIt).second );
if ( aPointsMap.find( aPoint ) != aPointsMap.end() )
continue;
aPointsMap[aPoint] = 0;
thePoints.push_back( *anIt );
}
}
}
void CurveCreator_Utils::setSelectedPoints( Handle(AIS_InteractiveContext) theContext,
const CurveCreator_ICurve* theCurve,
const CurveCreator_ICurve::SectionToPointList& thePoints )
{
if ( !theCurve )
return;
Handle(AIS_InteractiveObject) anAIS = theCurve->getAISObject();
if ( anAIS.IsNull() )
return;
Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast( anAIS );
if ( anAISShape.IsNull() )
return;
//ASL: we convert list of point indices to list of points coordinates
int aSize = thePoints.size();
std::vector<gp_Pnt> aPntsToSelect( aSize );
CurveCreator_ICurve::SectionToPointList::const_iterator
aPIt = thePoints.begin(), aPLast = thePoints.end();
CurveCreator_ICurve::SectionToPoint aSToPoint;
for( int i=0; aPIt != aPLast; aPIt++, i++ )
{
gp_Pnt aPntToSelect;
CurveCreator_UtilsICurve::getPoint( theCurve, aPIt->first, aPIt->second, aPntToSelect );
aPntsToSelect[i] = aPntToSelect;
}
theContext->ClearSelected( Standard_False );
//ASL: we switch off automatic highlight to improve performance of selection
theContext->SetAutomaticHilight( Standard_False );
Handle_SelectMgr_Selection aSelection = anAISShape->Selection( AIS_Shape::SelectionMode( TopAbs_VERTEX ) );
for( aSelection->Init(); aSelection->More(); aSelection->Next() )
{
Handle_SelectBasics_SensitiveEntity aSenEntity = aSelection->Sensitive();
Handle_Select3D_SensitivePoint aSenPnt = Handle_Select3D_SensitivePoint::DownCast( aSenEntity );
gp_Pnt anOwnerPnt = aSenPnt->Point();
Handle_SelectMgr_EntityOwner anOwner = Handle_SelectMgr_EntityOwner::DownCast( aSenPnt->OwnerId() );
CurveCreator_ICurve::SectionToPointList::const_iterator anIt = thePoints.begin(),
aLast = thePoints.end();
bool isFound = false;
for( int i=0; i<aSize; i++ )
{
bool isIntersect = fabs( aPntsToSelect[i].X() - anOwnerPnt.X() ) < LOCAL_SELECTION_TOLERANCE &&
fabs( aPntsToSelect[i].Y() - anOwnerPnt.Y() ) < LOCAL_SELECTION_TOLERANCE;
if( isIntersect )
{
theContext->AddOrRemoveSelected( anOwner, Standard_False );
break;
}
}
}
//ASL: we switch on again automatic highlight (otherwise selection will not be shown)
// and call HilightPicked to draw selected owners
theContext->SetAutomaticHilight( Standard_True );
theContext->LocalContext()->HilightPicked( Standard_True );
}
//=======================================================================
// function : setLocalPointContext
// purpose : Open/close the viewer local context
//=======================================================================
void CurveCreator_Utils::setLocalPointContext( const CurveCreator_ICurve* theCurve,
Handle(AIS_InteractiveContext) theContext,
const bool theOpen )
{
if ( !theContext )
return;
if ( theOpen ) {
// Open local context if there is no one
if ( !theContext->HasOpenedContext() ) {
theContext->ClearCurrents( false );
theContext->OpenLocalContext( false/*use displayed objects*/, true/*allow shape decomposition*/ );
}
// load the curve AIS object to the local context with the point selection
Handle(AIS_InteractiveObject) anAIS = theCurve->getAISObject();
if ( !anAIS.IsNull() )
{
if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) )
{
theContext->Load( anAIS, -1/*selection mode*/, true/*allow decomposition*/ );
theContext->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)TopAbs_VERTEX ) );
}
}
}
else {
if ( theContext->HasOpenedContext() )
theContext->CloseAllContexts();
}
}
bool CurveCreator_Utils::pointOnObject( Handle(V3d_View) theView,
Handle(AIS_InteractiveObject) theObject,
const int theX, const int theY,
gp_Pnt& thePoint,
gp_Pnt& thePoint1, gp_Pnt& thePoint2 )
{
bool isFullFound = false;
if ( theObject.IsNull() || theView.IsNull() )
return isFullFound;
Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast( theObject );
if ( aShape.IsNull() )
return isFullFound;
const TopoDS_Compound& aCompound = TopoDS::Compound( aShape->Shape() );
if ( aCompound.IsNull() )
return isFullFound;
gp_Pnt aCurPoint, aCurPoint1, aCurPoint2;
gp_Pnt aFoundPoint, aFoundPnt1, aFoundPnt2;
Standard_Real aParameter;
bool isFound = false;
int aDelta, aMinDelta = 2*SCENE_PIXEL_PROJECTION_TOLERANCE*SCENE_PIXEL_PROJECTION_TOLERANCE;
TopExp_Explorer anExp( aCompound, TopAbs_EDGE );
for ( ; anExp.More(); anExp.Next())
{
const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current());
if ( anEdge.IsNull() )
continue;
Standard_Real aFirst, aLast;
Handle(Geom_Curve) aCurve = BRep_Tool::Curve( anEdge, aFirst, aLast );
if ( aCurve->IsKind( STANDARD_TYPE(Geom_BSplineCurve) ) ) {
Handle(Geom_BSplineCurve) aBSplineCurve =
Handle(Geom_BSplineCurve)::DownCast( aCurve );
if ( !aBSplineCurve.IsNull() ) {
isFound = hasProjectPointOnCurve( theView, theX, theY, aBSplineCurve,
aParameter, aDelta );
if ( isFound ) {
aCurPoint = aBSplineCurve->Value( aParameter );
Standard_Integer anI1, anI2;
aBSplineCurve->LocateU( aParameter, LOCAL_SELECTION_TOLERANCE, anI1, anI2 );
aCurPoint1 = aBSplineCurve->Value( aBSplineCurve->Knot( anI1 ) );
aCurPoint2 = aBSplineCurve->Value( aBSplineCurve->Knot( anI2 ) );
}
}
}
else { // a curve built on a polyline edge
Handle(Geom_Line) aGLine = Handle(Geom_Line)::DownCast( aCurve );
if ( aGLine.IsNull() )
continue;
isFound = hasProjectPointOnCurve( theView, theX, theY, aGLine, aParameter,
aDelta );
if ( isFound ) {
aCurPoint = aGLine->Value( aParameter );
TopoDS_Vertex V1, V2;
TopExp::Vertices( anEdge, V1, V2, Standard_True );
if ( V1.IsNull() || V2.IsNull() )
continue;
aCurPoint1 = BRep_Tool::Pnt(V1);
aCurPoint2 = BRep_Tool::Pnt(V2);
// check that the projected point is on the bounded curve
gp_Vec aVec1( aCurPoint1, aCurPoint );
gp_Vec aVec2( aCurPoint2, aCurPoint );
isFound = fabs( aVec1.Angle( aVec2 ) - M_PI ) < LOCAL_SELECTION_TOLERANCE;
}
}
if ( isFound && aMinDelta >= aDelta ) {
aMinDelta = aDelta;
isFullFound = true;
aFoundPnt1 = aCurPoint1;
aFoundPnt2 = aCurPoint2;
aFoundPoint = aCurPoint;
}
}
if ( isFullFound ) {
int aX, anY, aX1, anY1, aX2, anY2;
int aDelta;
CurveCreator_Utils::ConvertPointToClick( aFoundPoint, theView, aX, anY );
CurveCreator_Utils::ConvertPointToClick( aFoundPnt1, theView, aX1, anY1 );
CurveCreator_Utils::ConvertPointToClick( aFoundPnt2, theView, aX2, anY2 );
isFullFound = !isEqualPixels( aX, anY, aX1, anY1, SCENE_PIXEL_POINT_TOLERANCE, aDelta ) &&
!isEqualPixels( aX, anY, aX2, anY2, SCENE_PIXEL_POINT_TOLERANCE, aDelta );
if ( isFullFound ) {
thePoint = aFoundPoint;
thePoint1 = aFoundPnt1;
thePoint2 = aFoundPnt2;
}
}
return isFullFound;
}
bool CurveCreator_Utils::hasProjectPointOnCurve( Handle(V3d_View) theView,
const int theX, const int theY,
const Handle(Geom_Curve)& theCurve,
Standard_Real& theParameter,
int& theDelta )
{
bool isFound = false;
if ( theView.IsNull() )
return isFound;
gp_Pnt aPoint = CurveCreator_Utils::ConvertClickToPoint( theX, theY, theView );
GeomAPI_ProjectPointOnCurve aProj( aPoint, theCurve );
Standard_Integer aNbPoint = aProj.NbPoints();
if (aNbPoint > 0) {
for (Standard_Integer j = 1; j <= aNbPoint && !isFound; j++) {
gp_Pnt aNewPoint = aProj.Point( j );
theParameter = aProj.Parameter( j );
int aX, anY;
CurveCreator_Utils::ConvertPointToClick( aNewPoint, theView, aX, anY );
isFound = isEqualPixels( aX, anY, theX, theY, SCENE_PIXEL_PROJECTION_TOLERANCE, theDelta );
}
}
return isFound;
}
bool CurveCreator_Utils::isEqualPixels( const int theX, const int theY, const int theOtherX,
const int theOtherY, const double theTolerance, int& theDelta )
{
int aXDelta = abs( theX - theOtherX );
int anYDelta = abs( theY - theOtherY );
theDelta = aXDelta*aXDelta + anYDelta*anYDelta;
return aXDelta < theTolerance && anYDelta < theTolerance;
}
bool CurveCreator_Utils::isEqualPoints( const gp_Pnt& thePoint, const gp_Pnt& theOtherPoint )
{
return theOtherPoint.IsEqual( thePoint, LOCAL_SELECTION_TOLERANCE );
}
//=======================================================================
// function : getPoints
// purpose :
//=======================================================================
Handle(TColgp_HArray1OfPnt) CurveCreator_Utils::getPoints
(const TopoDS_Shape &theShape,
bool &IsClosed,
bool &IsBSpline)
{
Handle(TColgp_HArray1OfPnt) aResult;
IsClosed = false;
IsBSpline = false;
if (theShape.IsNull()) {
return aResult;
}
const TopAbs_ShapeEnum aShType = theShape.ShapeType();
if (aShType == TopAbs_VERTEX) {
// There is a single point.
gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(theShape));
aResult = new TColgp_HArray1OfPnt(1, 1, aPnt);
return aResult;
} else if (aShType != TopAbs_WIRE) {
// The shape is neither a vertex nor a wire.
return aResult;
}
// Treat wire.
BRepTools_WireExplorer anExp(TopoDS::Wire(theShape));
if (!anExp.More()) {
// Empty wires are not allowed.
return aResult;
}
// Treat the first edge.
TopoDS_Edge anEdge = anExp.Current();
Handle(Geom_Curve) aCurve = GetCurve(anEdge);
if (aCurve.IsNull()) {
return aResult;
}
// Check the curve type.
Handle(Standard_Type) aType = aCurve->DynamicType();
if (aType == STANDARD_TYPE(Geom_BSplineCurve)) {
IsBSpline = true;
} else if (aType != STANDARD_TYPE(Geom_Line)) {
// The curve is neither a line or a BSpline. It is not valid.
return aResult;
}
// Go to the next edge.
TopoDS_Vertex aFirstVtx = anExp.CurrentVertex();
anExp.Next();
if (IsBSpline) {
// There should be a single BSpline curve in the wire.
if (anExp.More()) {
return aResult;
}
// Construct a section from poles of BSpline.
Handle(Geom_BSplineCurve) aBSplCurve =
Handle(Geom_BSplineCurve)::DownCast(aCurve);
// Check if the edge is valid. It should not be based on trimmed curve.
gp_Pnt aCP[2] = { aBSplCurve->StartPoint(), aBSplCurve->EndPoint() };
TopoDS_Vertex aV[2];
Standard_Integer i;
TopExp::Vertices(anEdge, aV[0], aV[1]);
for (i = 0; i < 2; i++) {
gp_Pnt aPnt = BRep_Tool::Pnt(aV[i]);
Standard_Real aTol = BRep_Tool::Tolerance(aV[i]);
if (!aPnt.IsEqual(aCP[i], aTol)) {
return aResult;
}
}
IsClosed = aV[0].IsSame(aV[1]) ? true : false;
const Standard_Integer aNbPoints = aBSplCurve->NbKnots();
TColStd_Array1OfReal aKnots(1, aNbPoints);
aBSplCurve->Knots(aKnots);
aResult = new TColgp_HArray1OfPnt(1, aBSplCurve->NbKnots());
for (i = aKnots.Lower(); i <= aKnots.Upper(); ++i) {
aResult->SetValue(i, aBSplCurve->Value(aKnots.Value(i)));
}
} else {
// This is a polyline.
TopTools_ListOfShape aVertices;
Standard_Integer aNbVtx = 1;
aVertices.Append(aFirstVtx);
for (; anExp.More(); anExp.Next(), ++aNbVtx) {
anEdge = anExp.Current();
aCurve = GetCurve(anEdge);
if (aCurve.IsNull()) {
return aResult;
}
aType = aCurve->DynamicType();
if (aType != STANDARD_TYPE(Geom_Line)) {
// The curve is not a line. It is not valid.
return aResult;
}
// Add the current vertex to the list.
aVertices.Append(anExp.CurrentVertex());
}
// Check if the section is closed.
TopoDS_Vertex aLastVtx = TopExp::LastVertex(anEdge, Standard_True);
IsClosed = aFirstVtx.IsSame(aLastVtx) ? true : false;
// Fill the array of points.
aResult = new TColgp_HArray1OfPnt(1, aNbVtx);
Standard_Integer i;
TopTools_ListIteratorOfListOfShape aVtxIter(aVertices);
for (i = 1; aVtxIter.More(); aVtxIter.Next(), ++i) {
gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aVtxIter.Value()));
aResult->SetValue(i, aPnt);
}
}
return aResult;
}
//=======================================================================
// function : FindPlane
// purpose :
//=======================================================================
void CurveCreator_Utils::FindPlane
(const Handle_TColgp_HArray1OfPnt &thePoints,
gp_Pln &thePlane,
Standard_Integer &thePlnStatus)
{
if (thePoints.IsNull() || thePlnStatus == PLN_FIXED) {
// The plane can't be defined or is fixed. Nothing to change.
return;
}
Standard_Integer i;
const Standard_Real aTolConf = Precision::Confusion();
for (i = thePoints->Lower(); i <= thePoints->Upper(); ++i) {
const gp_Pnt &aPnt = thePoints->Value(i);
switch (thePlnStatus) {
case PLN_FREE:
// Fix the origin.
thePlane.SetLocation(aPnt);
thePlnStatus = PLN_ORIGIN;
break;
case PLN_ORIGIN:
{
// Fix origin + OX axis
const gp_Pnt &aPlnLoc = thePlane.Location();
if (!aPnt.IsEqual(aPlnLoc, aTolConf)) {
// Set the X axis.
gp_Dir aXDir(aPnt.XYZ().Subtracted(aPlnLoc.XYZ()));
gp_Ax3 aXNorm(aPlnLoc, aXDir);
gp_Ax3 aNewPlnPos(aPlnLoc, aXNorm.XDirection(), aXNorm.Direction());
thePlane.SetPosition(aNewPlnPos);
thePlnStatus = PLN_OX;
}
}
break;
case PLN_OX:
{
// Fix OY axis
gp_Lin aXLin(thePlane.XAxis());
Standard_Real aSqrDist = aXLin.SquareDistance(aPnt);
if (aSqrDist > aTolConf*aTolConf) {
// Compute main axis.
const gp_Pnt &aPlnLoc = thePlane.Location();
gp_Dir aDir(aPnt.XYZ().Subtracted(aPlnLoc.XYZ()));
gp_Ax3 aXNorm(aPlnLoc, aXLin.Direction(), aDir);
gp_Ax3 aNewPlnPos(aPlnLoc, aXNorm.YDirection(),
aXNorm.Direction());
thePlane.SetPosition(aNewPlnPos);
thePlnStatus = PLN_FIXED;
return;
}
}
break;
default:
return;
}
}
}

View File

@ -0,0 +1,211 @@
// Copyright (C) 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
//
#ifndef CURVECREATOR_UTILS_H
#define CURVECREATOR_UTILS_H
#include "CurveCreator_Macro.hxx"
#include "CurveCreator_ICurve.hxx"
#include <AIS_InteractiveContext.hxx>
#include <AIS_InteractiveObject.hxx> // TODO: remove
#include <V3d_View.hxx>
#include <gp_Pnt.hxx>
#include <Geom_Curve.hxx>
#include <TopoDS_Shape.hxx>
#include <TColgp_HArray1OfPnt.hxx>
#include <list>
#include <vector> // TODO: remove
class CurveCreator_Curve;
class CurveCreator_Utils
{
public:
/*!
* \brief Returns the point clicked in 3D view.
*
* \param x The X coordinate in the view.
* \param y The Y coordinate in the view.
* \param theView View where the given point takes place.
* \retval gp_Pnt Returns the point clicked in 3D view
*/
CURVECREATOR_EXPORT static void ConvertPointToClick( const gp_Pnt& thePoint,
Handle(V3d_View) theView,
int& x, int& y );
/*!
* \brief Returns the point clicked in 3D view.
*
* \param x The X coordinate in the view.
* \param y The Y coordinate in the view.
* \param theView View where the given point takes place.
* \retval gp_Pnt Returns the point clicked in 3D view
*/
CURVECREATOR_EXPORT static gp_Pnt ConvertClickToPoint( int x, int y,
Handle(V3d_View) theView );
/**
* Generates shape on the curve
* \param theCurve a curve object, that contains data
* \param theShape a generated shape
*/
CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve,
TopoDS_Shape& theShape );
/**
* Generates a curve from a shape.
* \param theShape a shape to be converted to curve.
* \param theCurve a curve object to be initialized.
* \param theLocalCS the local coordinate system of the curve.
* \return true in case of success; false otherwise. Warning: the curve can
* be modified even if the shape is not valid for curve construction.
*/
CURVECREATOR_EXPORT static bool constructCurve
(const TopoDS_Shape theShape,
CurveCreator_Curve *theCurve,
gp_Ax3 &theLocalCS);
/**
* Find selected points in the context
* \param theContext the viewer context
* \param theCurve a curve object, that contains data
*/
CURVECREATOR_EXPORT static void getSelectedPoints( Handle(AIS_InteractiveContext) theContext,
const CurveCreator_ICurve* theCurve,
CurveCreator_ICurve::SectionToPointList& thePoints );
/**
* Set selected points to the context
* \param theContext the viewer context
* \param theCurve a curve object, that contains data
* \param thePoints the curve point indices to be selected in the context
*/
CURVECREATOR_EXPORT static void setSelectedPoints(
Handle(AIS_InteractiveContext) theContext,
const CurveCreator_ICurve* theCurve,
const CurveCreator_ICurve::SectionToPointList& thePoints =
CurveCreator_ICurve::SectionToPointList() );
/*!
* \brief Sets the local point context for the 3D viewer.
* \param theCurve a curve object, that contains data
* \param theContext the viewer context
* \param theOpen The flag to open or close the local context.
*/
CURVECREATOR_EXPORT static void setLocalPointContext(
const CurveCreator_ICurve* theCurve,
Handle(AIS_InteractiveContext) theContext,
const bool theOpen );
/**
* Checks whether the point belongs to the OCC object
* \param theObject a line or shape with a bspline inside
* \param theX the X coordinate in the view.
* \param theY the Y coordinate in the view.
* \param thePoint the output point to be append to the model curve
* \param thePoint1 the output point to bound the line where a new point should be inserted
* \param thePoint2 the output point to bound the line where a new point should be inserted
*/
CURVECREATOR_EXPORT static bool pointOnObject( Handle(V3d_View) theView,
Handle(AIS_InteractiveObject) theObject,
const int theX, const int theY,
gp_Pnt& thePoint, gp_Pnt& thePoint1,
gp_Pnt& thePoint2 );
protected:
/*
* Returns whether the clicked point belong to the curve or has a very near projection
* \param theX the X coordinate of a point clicked in the OCC viewer
* \param theY the Y coordinate of a point clicked in the OCC viewer
* \param theCurve a geometry curve
* \param theOutPoint a found projected point on the curve
*/
static bool hasProjectPointOnCurve(
Handle(V3d_View) theView,
const int theX, const int theY,
const Handle(Geom_Curve)& theCurve,
Standard_Real& theParameter,
int& theDelta );
/*
* Returns whether the X and Y coordinates is in the pixel tolerance
* \param theX the X coordinate of the first point
* \param theY the Y coordinate of the first point
* \param theOtherX the X coordinate of the second point
* \param theOtherY the Y coordinate of the second point
* \param theTolerance the tolerance to compare
* \param theDelta the sum of the a square of X and a square of Y
* \returns whether the points are provide to the pixel tolerance
*/
static bool isEqualPixels( const int theX, const int theY,
const int theOtherX, const int theOtherY,
const double theTolerance, int& theDelta );
/*
* Returns whether the points are the same
* \param thePoint the first point
* \param theOtherPoint the second point
* \returns whether the points are provide to the pixel tolerance
*/
static bool isEqualPoints( const gp_Pnt& thePoint,
const gp_Pnt& theOtherPoint );
/**
* Returns the array of points of a shape to construct a curve section. The
* shape can be either a wire or a vertex. For vertex a single point in the
* array is returned.
*
* \param theShape the shape. Can be either a wire or a vertex.
* \param IsClosed closed flag. Output parameter.
* \param IsBSpline BSpline flag. Output parameter.
* \return the array of points. Null handle in case of failure.
*/
static Handle_TColgp_HArray1OfPnt getPoints
(const TopoDS_Shape &theShape,
bool &IsClosed,
bool &IsBSpline);
/**
* This method computes a plane using the input points. The plane is defined
* by gp_Pln object and the status. The status can have one of the following
* values:
* - 0 plane is not set.<BR>
* - 1 origin of the plane is fixed. The plane is defined by 1 or several
* coincident points.<BR>
* - 2 origin + OX axis of the plane is fixed. The plane is defined by 2
* or more points that lie on a particular line.<BR>
* - 3 plane is fixed. Plane is defined by 3 not coincident points.<BR>
*
* \param thePoints the points.
* \param thePlane the current plane on input. It can be modified on output.
* \param thePlnStatus the current status on input. It can be modified on
* output.
*/
static void FindPlane(const Handle_TColgp_HArray1OfPnt &thePoints,
gp_Pln &thePlane,
Standard_Integer &thePlnStatus);
};
#endif // CURVECREATOR_UTILS_H

View File

@ -0,0 +1,126 @@
// Copyright (C) 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
//
#include "CurveCreator_UtilsICurve.hxx"
#include "CurveCreator.hxx"
#include <gp_Pnt.hxx>
const double LOCAL_SELECTION_TOLERANCE = 0.0001;
int CurveCreator_UtilsICurve::findLocalPointIndex( const CurveCreator_ICurve* theCurve,
int theSectionId, float theX, float theY )
{
int aPntIndex = -1;
if ( !theCurve )
return aPntIndex;
CurveCreator::Coordinates aCoords;
for ( int i = 0, aNb = theCurve->getNbPoints( theSectionId ); i < aNb && aPntIndex < 0; i++ ) {
aCoords = theCurve->getPoint( theSectionId, i );
if ( aCoords.size() < 2 )
continue;
if ( fabs( aCoords[0] - theX ) < LOCAL_SELECTION_TOLERANCE &&
fabs( aCoords[1] - theY ) < LOCAL_SELECTION_TOLERANCE )
aPntIndex = i;
}
return aPntIndex;
}
void CurveCreator_UtilsICurve::findSectionsToPoints( const CurveCreator_ICurve* theCurve,
const double theX, const double theY,
CurveCreator_ICurve::SectionToPointList& thePoints )
{
thePoints.clear();
int aPointId = -1;
for ( int i = 0, aNb = theCurve->getNbSections(); i < aNb; i++ ) {
aPointId = CurveCreator_UtilsICurve::findLocalPointIndex( theCurve, i, theX, theY );
if ( aPointId < 0 )
continue;
CurveCreator_ICurve::SectionToPoint aPoint = std::make_pair( i, aPointId );
if ( !CurveCreator_UtilsICurve::contains( thePoints, aPoint ) )
thePoints.push_back( aPoint );
}
}
void CurveCreator_UtilsICurve::convert( const CurveCreator_ICurve::SectionToPointList& thePoints,
QMap<int, QList<int> >& theConvPoints )
{
theConvPoints.clear();
CurveCreator_ICurve::SectionToPointList::const_iterator anIt = thePoints.begin(),
aLast = thePoints.end();
QList<int> aPoints;
int aSectionId, aPointId;
for ( ; anIt != aLast; anIt++ ) {
aSectionId = anIt->first;
aPointId = anIt->second;
aPoints.clear();
if ( theConvPoints.contains( aSectionId ) )
aPoints = theConvPoints[aSectionId];
if ( aPoints.contains( aPointId ) )
continue;
aPoints.append( aPointId );
theConvPoints[aSectionId] = aPoints;
}
}
#include "CurveCreator_Curve.hxx" // TODO
void CurveCreator_UtilsICurve::getPoint( const CurveCreator_ICurve* theCurve, const int theISection,
const int theIPoint, gp_Pnt& thePoint )
{
double anX, anY, aZ;
// TODO
const CurveCreator_Curve* aCurve = dynamic_cast<const CurveCreator_Curve*>( theCurve );
if ( aCurve )
aCurve->getCoordinates( theISection, theIPoint, anX, anY, aZ );
thePoint = gp_Pnt( anX, anY, aZ);
}
std::string CurveCreator_UtilsICurve::getUniqSectionName( CurveCreator_ICurve* theCurve )
{
for( int i = 0 ; i < 1000000 ; i++ ){
char aBuffer[255];
sprintf( aBuffer, "Section_%d", i+1 );
std::string aName(aBuffer);
int j;
for( j = 0 ; j < theCurve->getNbSections() ; j++ ){
if( theCurve->getSectionName(j) == aName )
break;
}
if( j == theCurve->getNbSections() )
return aName;
}
return "";
}
bool CurveCreator_UtilsICurve::contains( const CurveCreator_ICurve::SectionToPointList& theList,
const CurveCreator_ICurve::SectionToPoint& theValue )
{
bool isFound = false;
CurveCreator_ICurve::SectionToPointList::const_iterator anIt = theList.begin(),
aLast = theList.end();
for ( ; anIt != aLast && !isFound; anIt++ )
isFound = anIt->first == theValue.first && anIt->second == theValue.second;
return isFound;
}

View File

@ -0,0 +1,69 @@
// Copyright (C) 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
//
#ifndef CURVECREATOR_UTILS_ICURVE_H
#define CURVECREATOR_UTILS_ICURVE_H
#include "CurveCreator_Macro.hxx"
#include "CurveCreator_ICurve.hxx"
#include <gp_Pnt.hxx>
#include <QMap>
#include <QList>
class CurveCreator_UtilsICurve
{
public:
/*!
* Returns a point index in the model curve by the point coordinates in the viewer
* \param theX the X coordinate of the point
* \param theY the Y coordinate of the point
*/
CURVECREATOR_EXPORT static int findLocalPointIndex( const CurveCreator_ICurve* theCurve,
int theSectionId, float theX, float theY );
CURVECREATOR_EXPORT static void findSectionsToPoints( const CurveCreator_ICurve* theCurve,
const double theX, const double theY,
CurveCreator_ICurve::SectionToPointList& thePoints );
CURVECREATOR_EXPORT static void convert( const CurveCreator_ICurve::SectionToPointList& thePoints,
QMap<int, QList<int> >& theConvPoints );
CURVECREATOR_EXPORT static void getPoint( const CurveCreator_ICurve* theCurve, const int theISection,
const int theIPoint, gp_Pnt& thePoint );
/*!
* Returns a unique section name
* \param theCurve a curve interface
*/
CURVECREATOR_EXPORT static std::string getUniqSectionName(
CurveCreator_ICurve* theCurve );
/**
* Returns whethe the container has the value
* \param theList a container of values
* \param theValue a value
*/
CURVECREATOR_EXPORT static bool contains( const CurveCreator_ICurve::SectionToPointList& theList,
const CurveCreator_ICurve::SectionToPoint& theValue );
};
#endif // CURVECREATOR_UTILS_ICURVE_H

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 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, or (at your option) any later version.
// 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
@ -20,101 +20,212 @@
#ifndef CURVECREATOR_WIDGET_H
#define CURVECREATOR_WIDGET_H
#include "CurveCreator_Curve.hxx"
#include "CurveCreator_Macro.hxx"
#include "CurveCreator.hxx"
#include "CurveCreator_ICurve.hxx"
#include <QWidget>
#include <QMap>
#include <OCCViewer_ViewWindow.h>
#include <SUIT_ViewWindow.h>
#include <AIS_InteractiveObject.hxx>
#include <AIS_InteractiveContext.hxx>
#include <Geom_Curve.hxx>
#include <V3d_View.hxx>
#include <gp_Pnt.hxx>
#include <TopoDS_Vertex.hxx> // TODO - remove
class OCCViewer_Viewer;
class OCCViewer_ViewPort3d;
class AIS_ListOfInteractive;
class QAction;
class QPixmap;
class CurveCreator_CurveEditor;
class CurveCreator_TableView;
class CurveCreator_TreeView;
class CurveCreator_NewPointDlg;
class CurveCreator_NewSectionDlg;
class CURVECREATOR_EXPORT CurveCreator_Widget : public QWidget
{
Q_OBJECT
Q_OBJECT
public:
explicit CurveCreator_Widget( QWidget* parent,
CurveCreator_Curve *theCurve,
Qt::WindowFlags fl=0 );
enum ActionFlags {
NoFlags = 0x00000000,
DisableDetectionMode = 0x00000001,
DisableNewSection = 0x00000002,
DisableClosedSection = 0x00000004
};
void setCurve( CurveCreator_Curve* theCurve );
enum ActionMode {
NoneMode,
AdditionMode,
ModificationMode,
DetectionMode
};
QList<int> getSelectedSections();
QList< QPair< int, int > > getSelectedPoints();
public:
explicit CurveCreator_Widget( QWidget* parent,
CurveCreator_ICurve *theCurve,
const int theActionFlags = NoFlags,
const QStringList& theCoordTitles = QStringList(),
Qt::WindowFlags fl=0,
int theLocalPointRowLimit = 20);
bool isInstantSketchingEnabled() const;
void setInstantSketchingEnabled( const bool theState );
// OCC viewer manipulation
void setOCCViewer( OCCViewer_Viewer* theViewer );
Handle(AIS_InteractiveContext) getAISContext();
OCCViewer_ViewPort3d* getViewPort();
int changeInteractionStyle( int theStyle );
void reset();
void setCurve( CurveCreator_ICurve* theCurve );
QList<int> getSelectedSections();
void setSelectedSections( const QList<int>& theSections );
void removeSelected();
bool removeEnabled();
void setActionMode( const ActionMode& theMode );
ActionMode getActionMode() const;
void SetViewer2DMode(const bool To2D);
signals:
void selectionChanged();
void subOperationStarted( QWidget* );
void subOperationFinished( QWidget* );
void selectionChanged();
void subOperationStarted( QWidget*, bool );
void subOperationFinished( QWidget* );
void curveModified();
public slots:
protected slots:
void onAdditionMode(bool checked);
void onModificationMode(bool checked);
void onDetectPoints(bool checked);
void onModeChanged(bool checked);
void onNewSection();
void onSelectionChanged();
void onAddNewPoint(const CurveCreator::Coordinates& theCoords);
void onAddNewSection();
void onEditSection( int theSection );
void onEditPoint( int theSection, int thePoint );
void onModifyPoint();
void onModifySection();
void onCancelPoint();
void onCancelSection();
void onJoin();
void onRemove();
void onMoveUp();
void onMoveDown();
void onClearAll();
void onJoinAll();
void onInsertSectionBefore();
void onInsertSectionAfter();
void onSetSpline();
void onSetPolyline();
void onCloseSections();
void onUncloseSections();
void onInsertPointBefore();
void onInsertPointAfter();
void onUndo();
void onRedo();
void onUndoSettings();
void onContextMenu(QPoint thePoint);
void onGetPointByClick( SUIT_ViewWindow*, QMouseEvent* );
// void onPointSelect( SUIT_ViewWindow*, QMouseEvent* );
void onPointDrag( SUIT_ViewWindow*, QMouseEvent* );
void onAdditionMode(bool checked);
void onModificationMode(bool checked);
void onDetectionMode(bool checked);
void onModeChanged(bool checked);
void onNewSection();
void onSelectionChanged();
void onAddNewSection();
void onEditSection( int theSection );
void onModifySection();
void onCancelSection();
void onJoin();
void onRemove();
void onClearAll();
void onJoinAll();
void onSetSpline();
void onSetPolyline();
void onCloseSections();
void onUncloseSections();
void onUndo();
void onRedo();
void onUndoSettings();
void onContextMenu(QPoint thePoint);
void onMousePress( SUIT_ViewWindow*, QMouseEvent* theEvent );
void onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEvent );
void onMouseMove( SUIT_ViewWindow*, QMouseEvent* theEvent );
void onLastViewClosed( SUIT_ViewManager* theManager );
void onMousePress( QMouseEvent* theEvent );
void onMouseRelease( QMouseEvent* theEvent );
void onMouseMove( QMouseEvent* theEvent );
void onCellChanged( int theRow, int theColumn );
protected:
enum ActionId{ UNDO_ID, REDO_ID, NEW_SECTION_ID, ADDITION_MODE_ID, REMOVE_ID, REMOVE_ALL_ID, JOIN_ID,
JOIN_ALL_ID, UP_ID, DOWN_ID, INSERT_SECTION_BEFORE_ID, INSERT_SECTION_AFTER_ID,
INSERT_POINT_BEFORE_ID, INSERT_POINT_AFTER_ID, CLOSE_SECTIONS_ID, UNCLOSE_SECTIONS_ID,
SET_SECTIONS_POLYLINE_ID, SET_SECTIONS_SPLINE_ID, CLEAR_ALL_ID, SEPARATOR_ID,
MODIFICATION_MODE_ID, DETECTION_MODE_ID };
void addCoordsByClick( QMouseEvent* );
protected:
enum ActionId{ NONE_ID,
UNDO_ID,
REDO_ID,
NEW_SECTION_ID,
ADDITION_MODE_ID,
REMOVE_ID,
REMOVE_ALL_ID,
JOIN_ID,
JOIN_ALL_ID,
CLOSE_SECTIONS_ID,
UNCLOSE_SECTIONS_ID,
SET_SECTIONS_POLYLINE_ID,
SET_SECTIONS_SPLINE_ID,
CLEAR_ALL_ID,
SEPARATOR_ID,
MODIFICATION_MODE_ID,
DETECTION_MODE_ID
};
private:
QAction* createAction( ActionId theId, const QString& theName, const QPixmap& theImage,
const QString& theToolTip, const QKeySequence& theShortcut );
QAction* getAction(ActionId theId);
void updateUndoRedo();
OCCViewer_Viewer* getOCCViewer();
QAction* createAction( ActionId theId, const QString& theName, const QPixmap& theImage,
const QString& theToolTip, const QKeySequence& theShortcut );
QAction* getAction(ActionId theId);
QAction* getAction(ActionMode theMode);
void updateActionsStates();
void updateUndoRedo();
void removeSection();
void removePoint();
void addNewPoint(const CurveCreator::Coordinates& theCoords);
void insertPointToSelectedSegment( const int theXPosition,
const int theYPosition );
void moveSelectedPoints( const int theXPosition, const int theYPosition );
void updateLocalPointView();
void setLocalPointContext( const bool theOpen, const bool isUpdateTable = false );
void setDragStarted( const bool theState, const QPoint& thePoint = QPoint() );
void getSelectedPoints( CurveCreator_ICurve::SectionToPointList& thePoints );
void setSelectedPoints( const CurveCreator_ICurve::SectionToPointList& =
CurveCreator_ICurve::SectionToPointList() );
void stopActionMode();
void startCurveModification( CurveCreator_ICurve::SectionToPointList& thePoints,
const bool theFillPoints = true );
void finishCurveModification( const CurveCreator_ICurve::SectionToPointList& thePoints =
CurveCreator_ICurve::SectionToPointList() );
// curve algorithm
int findLocalPointIndex( int theSectionId, float theX, float theY );
void findSectionsToPoints( const double theX, const double theY,
CurveCreator_ICurve::SectionToPointList& thePoints );
void convert( const CurveCreator_ICurve::SectionToPointList& thePoints,
QMap<int, QList<int> >& theConvPoints );
bool contains( const CurveCreator_ICurve::SectionToPointList& theList,
const CurveCreator_ICurve::SectionToPoint& theValue ) const;
private:
QMap<ActionId, QAction*> myActionMap;
CurveCreator_Curve* myCurve;
CurveCreator_CurveEditor* myEdit;
CurveCreator_TreeView* mySectionView;
CurveCreator_NewPointDlg* myNewPointEditor;
CurveCreator_NewSectionDlg* myNewSectionEditor;
int mySection;
int myPointNum;
QPoint myDragStartPosition;
QMap<ActionId, QAction*> myActionMap;
CurveCreator_ICurve* myCurve;
CurveCreator_TreeView* mySectionView;
CurveCreator_TableView* myLocalPointView;
CurveCreator_ICurve::SectionToPointList myLocalPoints;
CurveCreator_NewSectionDlg* myNewSectionEditor;
OCCViewer_Viewer* myOCCViewer;
int myLocalPointRowLimit;
int mySection;
int myPointNum;
bool myDragStarted;
QPoint myDragStartPosition;
int myDragInteractionStyle;
CurveCreator_ICurve::SectionToPointList myDragPoints;
QMap<CurveCreator_ICurve::SectionToPoint, CurveCreator::Coordinates> myInitialDragPointsCoords;
bool myDragged;
QByteArray myGuiState;
int myPressedX;
int myPressedY;
OCCViewer_ViewWindow::Mode2dType myOld2DMode;
};
#endif // CURVECREATOR_WIDGET_H

View File

@ -40,6 +40,7 @@ INCLUDE_DIRECTORIES(
${PROJECT_SOURCE_DIR}/src/GEOMGUI
${PROJECT_SOURCE_DIR}/src/GEOMBase
${PROJECT_SOURCE_DIR}/src/SKETCHER
${PROJECT_SOURCE_DIR}/src/CurveCreator
${PROJECT_SOURCE_DIR}/src/ShapeRecognition
${PROJECT_SOURCE_DIR}/src/DlgRef
${PROJECT_BINARY_DIR}/src/DlgRef
@ -65,6 +66,7 @@ SET(_link_LIBRARIES
GEOM
DlgRef
GEOMSketcher
CurveCreator
)
# optional sources
@ -103,6 +105,7 @@ SET(EntityGUI_HEADERS
EntityGUI.h
EntityGUI_Widgets.h
EntityGUI_SketcherDlg.h
EntityGUI_PolylineDlg.h
EntityGUI_3DSketcherDlg.h
EntityGUI_IsolineDlg.h
EntityGUI_SubShapeDlg.h
@ -115,6 +118,7 @@ SET(_moc_HEADERS
EntityGUI_Widgets.h
EntityGUI_FieldDlg.h
EntityGUI_SketcherDlg.h
EntityGUI_PolylineDlg.h
EntityGUI_3DSketcherDlg.h
EntityGUI_IsolineDlg.h
EntityGUI_SubShapeDlg.h
@ -135,6 +139,7 @@ SET(EntityGUI_SOURCES
EntityGUI_Widgets.cxx
EntityGUI_FieldDlg.cxx
EntityGUI_SketcherDlg.cxx
EntityGUI_PolylineDlg.cxx
EntityGUI_3DSketcherDlg.cxx
EntityGUI_IsolineDlg.cxx
EntityGUI_SubShapeDlg.cxx

View File

@ -59,6 +59,7 @@
#include "EntityGUI_FeatureDetectorDlg.h" // Feature Detection
#include "EntityGUI_PictureImportDlg.h" // Import Picture in viewer
#include "EntityGUI_FieldDlg.h" // Create/Edit Field
#include "EntityGUI_PolylineDlg.h" // Create/Edit 2d polyline
#include "GEOMImpl_Types.hxx"
@ -188,6 +189,10 @@ bool EntityGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
SUIT_MessageBox::warning(parent, tr("WRN_WARNING"), tr("NO_FIELD"));
break;
}
case GEOMOp::Op2dPolylineEditor: // POLYLINE EDITOR
getGeometryGUI()->ActiveWorkingPlane();
aDlg = new EntityGUI_PolylineDlg( getGeometryGUI(), parent );
break;
default:
app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) );
break;

View File

@ -0,0 +1,670 @@
// 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
//
#include "EntityGUI_PolylineDlg.h"
#include <CurveCreator_Curve.hxx>
#include <CurveCreator_Utils.hxx>
#include <CurveCreator_Widget.h>
#include <DlgRef.h>
#include <GeometryGUI.h>
#include <GEOMBase.h>
#include <OCCViewer_ViewManager.h>
#include <LightApp_SelectionMgr.h>
#include <SalomeApp_Application.h>
#include <SUIT_ResourceMgr.h>
#include <SUIT_Session.h>
#include <BRep_Tool.hxx>
#include <Geom_Surface.hxx>
#include <GeomLib_IsPlanarSurface.hxx>
#include <TopoDS.hxx>
#include <QGroupBox>
#include <QVBoxLayout>
//#define SET_PLANE
//=================================================================================
// function : Constructor
// purpose :
//=================================================================================
EntityGUI_PolylineDlg::EntityGUI_PolylineDlg
(GeometryGUI* theGeometryGUI, QWidget* parent, bool modal, Qt::WindowFlags fl)
: GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl ),
myCurve (0),
myEditorWidget (0),
myAddElementBox (0),
myPlnComboBox (0),
myPlnButton (0),
myPlnSelButton (0),
myWPlaneLineEdit (0),
myPolylineSelButton (0),
myPolylineEdit (0),
myEditCurrentArgument (0)
{
QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_POLYLINE")));
QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
setWindowTitle(tr("POLYLINE_DLG_TITLE"));
/***************************************************************/
mainFrame()->GroupConstructors->setTitle(tr("POLYLINE_TITLE"));
mainFrame()->RadioButton1->setIcon(image0);
mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose );
mainFrame()->RadioButton2->close();
mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
mainFrame()->RadioButton3->close();
QGroupBox *aGroupBox1 = new QGroupBox(tr("GEOM_CS"), this);
QGridLayout *aPlaneLayout = new QGridLayout(aGroupBox1);
aPlaneLayout->setSpacing(6);
aPlaneLayout->setMargin(11);
myPlnComboBox = new QComboBox(aGroupBox1);
aPlaneLayout->addWidget(myPlnComboBox, 0, 0, 1, 3);
myPlnButton = new QPushButton (aGroupBox1);
myPlnButton->setText( tr( "GEOM_SKETCHER_RESTORE" ) );
aPlaneLayout->addWidget(myPlnButton, 0, 3);
#ifdef SET_PLANE
QLabel *aPlaneLbl = new QLabel(tr("GEOM_PLANE"), aGroupBox1);
myPlnSelButton = new QPushButton (aGroupBox1);
myPlnSelButton->setIcon(image1);
myWPlaneLineEdit = new QLineEdit (aGroupBox1);
myWPlaneLineEdit->setReadOnly(true);
#endif
QLabel *aPolylineLbl = new QLabel(tr("POLYLINE_IMPORT"), aGroupBox1);
myPolylineSelButton = new QPushButton (aGroupBox1);
myPolylineSelButton->setIcon(image1);
myPolylineEdit = new QLineEdit (aGroupBox1);
myPolylineEdit->setReadOnly(true);
#ifdef SET_PLANE
aPlaneLayout->addWidget(aPlaneLbl, 1, 0);
aPlaneLayout->addWidget(myPlnSelButton, 1, 1);
aPlaneLayout->addWidget(myWPlaneLineEdit, 1, 2, 1, 2);
#endif
aPlaneLayout->addWidget(aPolylineLbl, 2, 0);
aPlaneLayout->addWidget(myPolylineSelButton, 2, 1);
aPlaneLayout->addWidget(myPolylineEdit, 2, 2, 1, 2);
aPlaneLayout->setColumnStretch(2, 1);
myCurve = new CurveCreator_Curve( CurveCreator::Dim2d );
myEditorWidget = new CurveCreator_Widget (centralWidget(), myCurve);
myAddElementBox = new QGroupBox (tr("POLYLINE_ADD_SECTION"), centralWidget());
QBoxLayout* anAddElementLayout = new QVBoxLayout( myAddElementBox );
anAddElementLayout->setMargin( 0 );
anAddElementLayout->setSpacing( 6 );
QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
layout->setMargin( 0 );
layout->setSpacing( 6 );
layout->addWidget( aGroupBox1 );
layout->addWidget( myEditorWidget );
layout->addWidget( myAddElementBox );
/***************************************************************/
setHelpFileName( "create_polyline_page.html" );
/* Initialisations */
Init();
}
//=================================================================================
// function : Destructor
// purpose :
//=================================================================================
EntityGUI_PolylineDlg::~EntityGUI_PolylineDlg()
{
delete myCurve;
}
//=================================================================================
// function : Init()
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::Init()
{
initName(tr("POLYLINE_NAME"));
SalomeApp_Application *anApp = myGeomGUI->getApp();
OCCViewer_ViewManager *aViewManager = dynamic_cast<OCCViewer_ViewManager*>
(anApp->getViewManager(OCCViewer_Viewer::Type(), true));
LightApp_SelectionMgr *aSelMgr = myGeomGUI->getApp()->selectionMgr();
myEditorWidget->setOCCViewer(aViewManager ? aViewManager->getOCCViewer() : 0);
// Init the list of local coordinate system
gp_Pnt aPnt(0., 0., 0.);
gp_Dir aDirN(0., 0., 1.);
gp_Dir aDirX(1., 0., 0.);
gp_Ax3 aLCS(aPnt, aDirN, aDirX);
//add Global CS
myPlnComboBox->addItem(tr("GEOM_GCS"), false);
myWPlaneList.push_back(GEOM::GeomObjPtr());
myLCSList.push_back(aLCS);
connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
#ifdef SET_PLANE
connect(myPlnSelButton, SIGNAL(clicked()),
this, SLOT(SetEditCurrentArgument()));
#endif
connect(myPolylineSelButton, SIGNAL(clicked()),
this, SLOT(SetEditCurrentArgument()));
connect(aSelMgr, SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
connect(myEditorWidget, SIGNAL(subOperationStarted(QWidget*, bool)),
this, SLOT(processStartedSubOperation(QWidget*, bool)));
connect(myEditorWidget, SIGNAL(subOperationFinished(QWidget*)),
this, SLOT(processFinishedSubOperation(QWidget*)));
connect(myEditorWidget, SIGNAL(curveModified()),
this, SLOT(onUpdatePreview()));
#ifdef SET_PLANE
connect(myPlnComboBox, SIGNAL(activated(int)),
this, SLOT(ActivateLocalCS()));
connect(myPlnButton, SIGNAL(clicked()),
this, SLOT(ActivateLocalCS()));
#endif
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
myAddElementBox->hide();
myPolylineSelButton->click();
SelectionIntoArgument();
}
//=================================================================================
// function : Clear
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::Clear()
{
delete myCurve;
myCurve = new CurveCreator_Curve( CurveCreator::Dim2d );
myEditorWidget->setCurve(myCurve);
}
//=================================================================================
// function : GetCurveParams
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::GetCurveParams(GEOM::ListOfListOfDouble &theCoords,
GEOM::string_array &theNames,
GEOM::short_array &theTypes,
GEOM::ListOfBool &theCloseds)
{
const int aNbSec = myCurve->getNbSections();
int i;
int j;
theCoords.length(aNbSec);
theNames.length(aNbSec);
theTypes.length(aNbSec);
theCloseds.length(aNbSec);
for (i = 0; i < aNbSec; ++i) {
// Set coordinates
CurveCreator::Coordinates aCoords = myCurve->getPoints(i);
const int aNbPoints = aCoords.size();
theCoords[i].length(aNbPoints);
for (j = 0; j < aNbPoints; ++j) {
theCoords[i][j] = aCoords[j];
}
// Set section type
const CurveCreator::SectionType aType = myCurve->getSectionType(i);
switch (aType) {
case CurveCreator::Spline:
theTypes[i] = GEOM::Interpolation;
break;
case CurveCreator::Polyline:
default:
theTypes[i] = GEOM::Polyline;
break;
}
// Set section names and closed flags.
theNames[i] = CORBA::string_dup(myCurve->getSectionName(i).c_str());
theCloseds[i] = myCurve->isClosed(i);
}
}
//=================================================================================
// function : createOperation
// purpose :
//=================================================================================
GEOM::GEOM_IOperations_ptr EntityGUI_PolylineDlg::createOperation()
{
return getGeomEngine()->GetICurvesOperations( getStudyId() );
}
//=================================================================================
// function : isValid
// purpose :
//=================================================================================
bool EntityGUI_PolylineDlg::isValid( QString& msg )
{
return true;
}
//=================================================================================
// function : execute
// purpose :
//=================================================================================
bool EntityGUI_PolylineDlg::execute( ObjectList& objects )
{
GEOM::GEOM_ICurvesOperations_var anOper =
GEOM::GEOM_ICurvesOperations::_narrow(getOperation());
// Get the polyline creation parameters.
GEOM::ListOfListOfDouble aCoords;
GEOM::string_array aNames;
GEOM::short_array aTypes;
GEOM::ListOfBool aCloseds;
GetCurveParams(aCoords, aNames, aTypes, aCloseds);
// Get Working Plane.
int ind = myPlnComboBox->currentIndex();
if (ind != -1) {
bool isPlane = myPlnComboBox->itemData(ind).toBool();
GEOM::GEOM_Object_var anObj;
// Perform operation
if (isPlane) {
anObj = anOper->MakePolyline2DOnPlane
(aCoords, aNames, aTypes, aCloseds, myWPlaneList.at(ind).get());
} else {
gp_Ax3 anAxis = myLCSList.at(ind);
GEOM::ListOfDouble aPlane;
aPlane.length(9);
aPlane[0] = anAxis.Location().X();
aPlane[1] = anAxis.Location().Y();
aPlane[2] = anAxis.Location().Z();
aPlane[3] = anAxis.Direction().X();
aPlane[4] = anAxis.Direction().Y();
aPlane[5] = anAxis.Direction().Z();
aPlane[6] = anAxis.XDirection().X();
aPlane[7] = anAxis.XDirection().Y();
aPlane[8] = anAxis.XDirection().Z();
anObj = anOper->MakePolyline2D
(aCoords, aNames, aTypes, aCloseds, aPlane);
}
if (!anObj->_is_nil()) {
objects.push_back(anObj._retn());
}
}
return true;
}
//=================================================================================
// function : ClickOnOk()
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::ClickOnOk()
{
setIsApplyAndClose( true );
if (ClickOnApply())
ClickOnCancel();
}
//=================================================================================
// function : ClickOnApply()
// purpose :
//=================================================================================
bool EntityGUI_PolylineDlg::ClickOnApply()
{
if (!onAccept())
return false;
initName();
return true;
}
//=================================================================================
// function : ClickOnCancel()
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::ClickOnCancel()
{
myEditorWidget->SetViewer2DMode(false);
GEOMBase_Skeleton::ClickOnCancel();
}
//=================================================================================
// function : processStartedSubOperation
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::processStartedSubOperation( QWidget* theWidget, bool theIsEdit )
{
myEditorWidget->setEnabled( false );
myAddElementBox->setTitle( theIsEdit ? tr( "POLYLINE_EDIT_SECTION" ) : tr( "POLYLINE_ADD_SECTION" ) );
QBoxLayout* anAddElementLayout = dynamic_cast<QBoxLayout*>( myAddElementBox->layout() );
anAddElementLayout->addWidget( theWidget );
theWidget->show();
myAddElementBox->show();
}
//=================================================================================
// function : processFinishedSubOperation
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::processFinishedSubOperation( QWidget* theWidget )
{
myEditorWidget->setEnabled( true );
QBoxLayout* anAddElementLayout = dynamic_cast<QBoxLayout*>( myAddElementBox->layout() );
anAddElementLayout->removeWidget( theWidget );
theWidget->hide();
myAddElementBox->hide();
}
//=================================================================================
// function : deleteSelected
// purpose : Redirect the delete action to editor widget
//=================================================================================
void EntityGUI_PolylineDlg::deleteSelected()
{
myEditorWidget->removeSelected();
}
//=================================================================================
// function : deleteEnabled
// purpose : Checks whether there are some to delete
//=================================================================================
bool EntityGUI_PolylineDlg::deleteEnabled()
{
return myEditorWidget->removeEnabled();
}
//=================================================================================
// function : SelectionIntoArgument
// purpose : Called when selection is changed
//=================================================================================
void EntityGUI_PolylineDlg::SelectionIntoArgument()
{
bool isModified = false;
GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_SHAPE);
TopoDS_Shape aShape;
if (aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) &&
!aShape.IsNull()) {
QString aName = GEOMBase::GetName(aSelectedObject.get());
if (myEditCurrentArgument == myPolylineEdit) {
// Import a curve
CurveCreator_Curve *aNewCurve =
new CurveCreator_Curve(CurveCreator::Dim2d);
gp_Ax3 aLocalCS;
if (CurveCreator_Utils::constructCurve(aShape, aNewCurve, aLocalCS)) {
// Change the current curve be the new one.
myEditorWidget->setCurve(aNewCurve);
delete myCurve;
myCurve = aNewCurve;
isModified = true;
myPolylineEdit->setText(aName);
#ifdef SET_PLANE
AddLocalCS(aSelectedObject.get(), false, aLocalCS);
myWPlaneLineEdit->clear();
myPlnSelButton->setDown(false);
#endif
myPolylineSelButton->setDown(true);
} else {
// Does nothing, just clears selection.
delete aNewCurve;
}
#ifdef SET_PLANE
} else if (myEditCurrentArgument == myWPlaneLineEdit) {
// Import planar face.
if (aShape.ShapeType() == TopAbs_FACE) {
// Check if the face is planar
Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aShape));
GeomLib_IsPlanarSurface aPlanarCheck(aSurf, Precision::Confusion());
if (aPlanarCheck.IsPlanar()) {
myWPlaneLineEdit->setText(aName);
myPolylineEdit->clear();
AddLocalCS(aSelectedObject.get(), true,
WPlaneToLCS(aSelectedObject.get()));
isModified = true;
myPlnSelButton->setDown(true);
myPolylineSelButton->setDown(false);
}
}
if (!isModified) {
myEditCurrentArgument->setText(tr("GEOM_SKETCHER_WPLANE"));
}
#endif
}
}
if (!isModified) {
// Does nothing, just clears selection.
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
myGeomGUI->getApp()->selectionMgr()->clearSelected();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
}
}
//=================================================================================
// function : SetEditCurrentArgument()
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::SetEditCurrentArgument()
{
if (sender() == myPlnSelButton) {
#ifdef SET_PLANE
myEditCurrentArgument = myWPlaneLineEdit;
myEditCurrentArgument->setFocus();
myPlnSelButton->setDown(true);
myPolylineSelButton->setDown(false);
#endif
} else if (sender() == myPolylineSelButton) {
myEditCurrentArgument = myPolylineEdit;
myEditCurrentArgument->setFocus();
#ifdef SET_PLANE
myPlnSelButton->setDown(false);
#endif
myPolylineSelButton->setDown(true);
}
}
//=================================================================================
// function : ActivateThisDialog
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::ActivateThisDialog()
{
GEOMBase_Skeleton::ActivateThisDialog();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
}
//=================================================================================
// function : enterEvent()
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::enterEvent (QEvent*)
{
if (!mainFrame()->GroupConstructors->isEnabled())
ActivateThisDialog();
}
//=================================================================================
// function : onUpdatePreview
// purpose :
//=================================================================================
void EntityGUI_PolylineDlg::onUpdatePreview()
{
displayPreview(true);
}
//=================================================================================
// function : ActivateLocalCS
// purpose : Activate & Fit Working plane
//=================================================================================
void EntityGUI_PolylineDlg::ActivateLocalCS()
{
const int ind = myPlnComboBox->currentIndex();
if (ind == 0) {
// Default plane
#ifdef SET_PLANE
myWPlaneLineEdit->clear();
#endif
myPolylineEdit->clear();
} else if (ind > 0) { // Skip 0 as it is default
// Update text on line edits.
QString aName = GEOMBase::GetName(GetActiveWPlane().get());
bool isPlane = myPlnComboBox->itemData(ind).toBool();
if (isPlane) {
#ifdef SET_PLANE
myWPlaneLineEdit->setText(aName);
#endif
myPolylineEdit->clear();
} else {
myPolylineEdit->setText(aName);
#ifdef SET_PLANE
myWPlaneLineEdit->clear();
#endif
}
}
gp_Ax3 anAxis = GetActiveLocalCS();
myGeomGUI->SetWorkingPlane(anAxis);
myGeomGUI->ActiveWorkingPlane();
}
//=================================================================================
// function : GetActiveLocalCS
// purpose : Get Working plane
//=================================================================================
gp_Ax3 EntityGUI_PolylineDlg::GetActiveLocalCS()
{
const int ind = myPlnComboBox->currentIndex();
return ind >= 0 ? myLCSList.at(ind) : myGeomGUI->GetWorkingPlane();
}
//=================================================================================
// function : GetActiveWPlane
// purpose : Get Working plane
//=================================================================================
GEOM::GeomObjPtr EntityGUI_PolylineDlg::GetActiveWPlane()
{
const int ind = myPlnComboBox->currentIndex();
return ind >= 0 ? myWPlaneList.at(ind) : GEOM::GeomObjPtr();
}
//=================================================================================
// function : AddLocalCS()
// purpose : Add All Coordinates systems in study
//=================================================================================
void EntityGUI_PolylineDlg::AddLocalCS(GEOM::GeomObjPtr theSelectedObject,
const bool IsPlane,
const gp_Ax3 &theLCS)
{
QString aName = GEOMBase::GetName(theSelectedObject.get());
int index = myPlnComboBox->findText(aName, Qt::MatchExactly);
if (index == -1) { // If the working plane hasn't been added yet
myWPlaneList.push_back(theSelectedObject);
myLCSList.push_back(theLCS);
myPlnComboBox->addItem(aName, QVariant(IsPlane));
index = myPlnComboBox->count();
myPlnComboBox->setCurrentIndex(index - 1);
} else {
myPlnComboBox->setCurrentIndex(index);
}
ActivateLocalCS();
}
//=================================================================================
// function : WPlaneToLCS ( aWPlane )
// purpose :
//=================================================================================
gp_Ax3 EntityGUI_PolylineDlg::WPlaneToLCS(GEOM::GeomObjPtr theGeomObj)
{
TopoDS_Shape aShape =
GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), theGeomObj.get());
gp_Ax3 aLCS;
if (theGeomObj || aShape.IsNull()) {
MESSAGE("CORBA::is_nil(theGeomObj) || aShape.IsNull()")
}
aLCS.Transform(aShape.Location().Transformation());
if (aShape.ShapeType() == TopAbs_FACE) {
GEOM::GEOM_IMeasureOperations_ptr aMeasureOp =
myGeomGUI->GetGeomGen()->GetIMeasureOperations(getStudyId());
double Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz;
aMeasureOp->GetPosition(theGeomObj.get(), Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz);
if (aMeasureOp->IsDone()) {
gp_Pnt aPnt (Ox, Oy, Oz);
gp_Dir aDirN (Zx, Zy, Zz);
gp_Dir aDirX (Xx, Xy, Xz);
aLCS = gp_Ax3(aPnt, aDirN, aDirX);
}
}
return aLCS;
}

View File

@ -0,0 +1,152 @@
// 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
//
#ifndef ENTITYGUI_POLYLINEDLG_H
#define ENTITYGUI_POLYLINEDLG_H
#include <GEOMBase_Skeleton.h>
class CurveCreator_Curve;
class CurveCreator_Widget;
class QGroupBox;
class QComboBox;
//=================================================================================
// class : EntityGUI_PolylineDlg
// purpose :
//=================================================================================
class EntityGUI_PolylineDlg : public GEOMBase_Skeleton
{
Q_OBJECT
public:
EntityGUI_PolylineDlg (GeometryGUI*, QWidget* = 0,
bool = false, Qt::WindowFlags = 0);
virtual ~EntityGUI_PolylineDlg();
void deleteSelected();
bool deleteEnabled();
protected:
// redefined from GEOMBase_Helper
virtual GEOM::GEOM_IOperations_ptr createOperation();
virtual bool isValid( QString& );
virtual bool execute( ObjectList& );
private:
void Init();
void Clear();
void enterEvent(QEvent *);
/**
* This method converts the curve into curve parameters required to
* construct an object using the interface
* GEOM_ICurvesOperations::MakePolyline2DOnPlane.
*
* \param theCurve a curve object, that contains data.
* \param theCoordsList the list of coordinates list. theCoordsList[0]
* is the coordinates list of the first section. theCoordsList[1]
* is for the second section etc. Output parameter.
* \param theNamesList the list of names. The order corresponds to
* theCoordsList. Output parameter.
* \param theTypesList the list of curve types. The order corresponds to
* theCoordsList. Output parameter.
* \param theClosedList the list of Closed flags. The order corresponds to
* theCoordsList. Output parameter.
*/
void GetCurveParams(GEOM::ListOfListOfDouble &theCoords,
GEOM::string_array &theNames,
GEOM::short_array &theTypes,
GEOM::ListOfBool &theCloseds);
/**
* This method returns the current local coordinate system.
*
* \return local coordinate system.
*/
gp_Ax3 GetActiveLocalCS();
/**
* This method returns the current working plane. Can be null.
*
* \return the current working plane.
*/
GEOM::GeomObjPtr GetActiveWPlane();
/**
* This method add a local coordinate system of the selected object.
*
* \param theSelectedObject the selected object. It can be a planar face
* or an inported polyline.
* \param IsPlane true for planar face; false for imported polyline.
* \param theLCS the local coordinate system.
*/
void AddLocalCS(GEOM::GeomObjPtr theSelectedObject,
const bool IsPlane,
const gp_Ax3 &theLCS);
/**
* This method converts the working plane object into
* the local coordinate system of the polyline.
*
* \param theGeomObj the working plane
* \return the local coordinate system
*/
gp_Ax3 WPlaneToLCS(GEOM::GeomObjPtr theGeomObj);
protected slots:
void ClickOnOk();
bool ClickOnApply();
void ClickOnCancel();
void processStartedSubOperation( QWidget*, bool );
void processFinishedSubOperation( QWidget* );
void SetEditCurrentArgument();
void SelectionIntoArgument();
void ActivateThisDialog();
void onUpdatePreview();
void ActivateLocalCS();
private:
CurveCreator_Curve *myCurve;
CurveCreator_Widget *myEditorWidget;
QGroupBox *myAddElementBox;
QComboBox *myPlnComboBox;
QPushButton *myPlnButton;
QPushButton *myPlnSelButton;
QPushButton *myPolylineSelButton;
QLineEdit *myWPlaneLineEdit;
QLineEdit *myPolylineEdit;
QLineEdit *myEditCurrentArgument; /* Current LineEdit */
QList<gp_Ax3> myLCSList;
QList<GEOM::GeomObjPtr> myWPlaneList;
};
#endif // ENTITYGUI_POLYLINEDLG_H

View File

@ -36,6 +36,8 @@
#include <TDF_Data.hxx>
#include <TDF_ChildIterator.hxx>
#include <TDF_Reference.hxx>
#include <TDataStd_BooleanArray.hxx>
#include <TDataStd_ByteArray.hxx>
#include <TDataStd_Integer.hxx>
#include <TDataStd_IntegerArray.hxx>
#include <TDataStd_Real.hxx>
@ -474,6 +476,74 @@ Handle(TColStd_HArray1OfInteger) GEOM_Function::GetIntegerArray(int thePosition)
return anIntegerArray->Array();
}
//=============================================================================
/*!
* SetByteArray
*/
//=============================================================================
void GEOM_Function::SetByteArray (int thePosition,
const Handle(TColStd_HArray1OfByte)& theArray)
{
_isDone = false;
if(thePosition <= 0) return;
TDF_Label anArgLabel = ARGUMENT(thePosition);
Handle(TDataStd_ByteArray) anAttr =
TDataStd_ByteArray::Set(anArgLabel, theArray->Lower(), theArray->Upper());
anAttr->ChangeArray(theArray);
_isDone = true;
}
//=============================================================================
/*!
* GetByteArray
*/
//=============================================================================
Handle(TColStd_HArray1OfByte) GEOM_Function::GetByteArray(int thePosition)
{
_isDone = false;
if(thePosition <= 0) return 0;
Handle(TDataStd_ByteArray) aByteArray;
TDF_Label anArgLabel = ARGUMENT(thePosition);
if(!anArgLabel.FindAttribute(TDataStd_ByteArray::GetID(), aByteArray)) return 0;
_isDone = true;
return aByteArray->InternalArray();
}
//=============================================================================
/*!
* SetBooleanArray
*/
//=============================================================================
void GEOM_Function::SetBooleanArray (int thePosition,
const Handle(TColStd_HArray1OfByte)& theArray)
{
_isDone = false;
if(thePosition <= 0) return;
TDF_Label anArgLabel = ARGUMENT(thePosition);
Handle(TDataStd_BooleanArray) anAttr =
TDataStd_BooleanArray::Set(anArgLabel, theArray->Lower(), theArray->Upper());
anAttr->SetInternalArray(theArray);
_isDone = true;
}
//=============================================================================
/*!
* GetBooleanArray
*/
//=============================================================================
Handle(TColStd_HArray1OfByte) GEOM_Function::GetBooleanArray(int thePosition)
{
_isDone = false;
if(thePosition <= 0) return 0;
Handle(TDataStd_BooleanArray) aBooleanArray;
TDF_Label anArgLabel = ARGUMENT(thePosition);
if(!anArgLabel.FindAttribute(TDataStd_BooleanArray::GetID(), aBooleanArray)) return 0;
_isDone = true;
return aBooleanArray->InternalArray();
}
//=============================================================================
/*!
* SetString

View File

@ -32,6 +32,7 @@
#include <TDataStd_ListOfExtendedString.hxx>
#include <TopoDS_Shape.hxx>
class Handle_TColStd_HArray1OfByte;
class Handle_TColStd_HArray1OfReal;
class Handle_TColStd_HArray1OfInteger;
class Handle_TColStd_HSequenceOfTransient;
@ -108,6 +109,18 @@ public:
//Returns an integer array argument at position thePosition
Standard_EXPORT Handle(TColStd_HArray1OfInteger) GetIntegerArray(int thePosition);
//Sets a byte array argument at position thePosition
Standard_EXPORT void SetByteArray(int thePosition, const Handle(TColStd_HArray1OfByte)& theArray);
//Returns a byte array argument at position thePosition
Standard_EXPORT Handle(TColStd_HArray1OfByte) GetByteArray(int thePosition);
//Sets a boolean array argument at position thePosition
Standard_EXPORT void SetBooleanArray(int thePosition, const Handle(TColStd_HArray1OfByte)& theArray);
//Returns a boolean array argument at position thePosition
Standard_EXPORT Handle(TColStd_HArray1OfByte) GetBooleanArray(int thePosition);
//Sets a reference to other function argument at position thePosition
Standard_EXPORT void SetReference(int thePosition, Handle(GEOM_Function) theReference);

View File

@ -1215,6 +1215,10 @@
<source>ICO_SHELL_SEL_ONLY</source>
<translation>build_shell.png</translation>
</message>
<message>
<source>ICO_CURVE_CREATOR</source>
<translation>polyline.png</translation>
</message>
<message>
<source>ICO_SKETCH</source>
<translation>sketch.png</translation>

View File

@ -2366,7 +2366,15 @@ Please, select face, shell or solid and try again</translation>
</message>
<message>
<source>MEN_CURVE_CREATOR</source>
<translation>Curve creator</translation>
<translation>2D Polyline</translation>
</message>
<message>
<source>TOP_CURVE_CREATOR</source>
<translation>Create 2D polyline</translation>
</message>
<message>
<source>STB_CURVE_CREATOR</source>
<translation>Create 2D polyline</translation>
</message>
<message>
<source>MEN_ALL_SEL_ONLY</source>
@ -5163,6 +5171,22 @@ shells and solids on the other hand.</translation>
<source>TOOL_IMPORTEXPORT</source>
<translation>Import / Export XAO</translation>
</message>
<message>
<source>TABLE_SECTION</source>
<translation>Section</translation>
</message>
<message>
<source>TABLE_INDEX</source>
<translation>Index</translation>
</message>
<message>
<source>TABLE_X</source>
<translation>X</translation>
</message>
<message>
<source>TABLE_Y</source>
<translation>Y</translation>
</message>
</context>
<context>
<name>BasicGUI_CurveDlg</name>
@ -5404,74 +5428,39 @@ shells and solids on the other hand.</translation>
<translation>Face 2 V</translation>
</message>
</context>
<context>
<name>CurveCreator_NewPointDlg</name>
<message>
<source>ADD_NEW_POINT</source>
<translation>Add new points</translation>
</message>
<message>
<source>X_COORD</source>
<translation>X</translation>
</message>
<message>
<source>Y_COORD</source>
<translation>Y</translation>
</message>
<message>
<source>Z_COORD</source>
<translation>Z</translation>
</message>
<message>
<source>ADD_BTN</source>
<translation>Add</translation>
</message>
<message>
<source>ADD_CONTINUE_BTN</source>
<translation>Add and continue</translation>
</message>
<message>
<source>ADD_NEW_POINT_TO_%1</source>
<translation>Add new point to %1</translation>
</message>
<message>
<source>SET_POINT_COORDINATES</source>
<translation>Set point coordinates</translation>
</message>
</context>
<context>
<name>CurveCreator_NewSectionDlg</name>
<message>
<source>NAME</source>
<source>SECTION_NAME</source>
<translation>Name</translation>
</message>
<message>
<source>LINE_TYPE</source>
<source>SECTION_LINE_TYPE</source>
<translation>Type</translation>
</message>
<message>
<source>POLYLINE_TYPE</source>
<source>SECTION_POLYLINE_TYPE</source>
<translation>Polyline</translation>
</message>
<message>
<source>SPLINE_TYPE</source>
<source>SECTION_SPLINE_TYPE</source>
<translation>Spline</translation>
</message>
<message>
<source>LINE_CLOSED</source>
<source>SECTION_LINE_CLOSED</source>
<translation>Closed</translation>
</message>
<message>
<source>OK</source>
<translation>Ok</translation>
</message>
<message>
<source>ADD_BTN</source>
<source>SECTION_ADD_BTN</source>
<translation>Add</translation>
</message>
<message>
<source>ADD_CONTINUE_BTN</source>
<translation>Add and continue</translation>
<source>SECTION_OK_BTN</source>
<translation>Ok</translation>
</message>
<message>
<source>SECTION_CANCEL_BTN</source>
<translation>Cancel</translation>
</message>
<message>
<source>ADD_NEW_SECTION</source>
@ -5496,11 +5485,7 @@ shells and solids on the other hand.</translation>
<context>
<name>CurveCreator_Widget</name>
<message>
<source>CURVE_NAME_TLT</source>
<translation>Name</translation>
</message>
<message>
<source>SECTION_GROUP_TLT</source>
<source>SECTION_GROUP_TITLE</source>
<translation>Sections</translation>
</message>
<message>
@ -5527,22 +5512,6 @@ shells and solids on the other hand.</translation>
<source>NEW_SECTION_TLT</source>
<translation>Insert new section</translation>
</message>
<message>
<source>INSERT_SECTION_BEFORE</source>
<translation>Insert section before</translation>
</message>
<message>
<source>INSERT_SECTION_BEFORE_TLT</source>
<translation>Insert section before</translation>
</message>
<message>
<source>INSERT_SECTION_AFTER</source>
<translation>Insert section after</translation>
</message>
<message>
<source>INSERT_SECTION_AFTER_TLT</source>
<translation>Insert section after</translation>
</message>
<message>
<source>ADDITION_MODE</source>
<translation>Addition mode</translation>
@ -5567,18 +5536,6 @@ shells and solids on the other hand.</translation>
<source>DETECTION_MODE_TLT</source>
<translation>Detection mode</translation>
</message>
<message>
<source>INSERT_POINT_BEFORE</source>
<translation>Insert point before</translation>
</message>
<message>
<source>INSERT_POINT_BEFORE_TLT</source>
<translation>Insert point before</translation>
</message>
<message>
<source>INSERT_POINT_AFTER</source>
<translation>Insert point after</translation>
</message>
<message>
<source>CLOSE_SECTIONS</source>
<translation>Set closed</translation>
@ -5627,22 +5584,6 @@ shells and solids on the other hand.</translation>
<source>JOIN_TLT</source>
<translation>Join selected sections</translation>
</message>
<message>
<source>STEP_UP</source>
<translation>Move up</translation>
</message>
<message>
<source>STEP_UP_TLT</source>
<translation>Move selected objects up</translation>
</message>
<message>
<source>STEP_DOWN</source>
<translation>Move down</translation>
</message>
<message>
<source>STEP_DOWN_TLT</source>
<translation>Move selected objects down</translation>
</message>
<message>
<source>CLEAR_ALL</source>
<translation>Clear all</translation>
@ -5660,6 +5601,33 @@ shells and solids on the other hand.</translation>
<translation>Join all sections</translation>
</message>
</context>
<context>
<name>EntityGUI_PolylineDlg</name>
<message>
<source>POLYLINE_DLG_TITLE</source>
<translation>Polyline Construction</translation>
</message>
<message>
<source>POLYLINE_TITLE</source>
<translation>Polyline</translation>
</message>
<message>
<source>POLYLINE_NAME</source>
<translation>Polyline</translation>
</message>
<message>
<source>POLYLINE_IMPORT</source>
<translation>Import polyline</translation>
</message>
<message>
<source>POLYLINE_ADD_SECTION</source>
<translation>Add section</translation>
</message>
<message>
<source>POLYLINE_EDIT_SECTION</source>
<translation>Edit section</translation>
</message>
</context>
<context>
<name>EntityGUI_SketcherDlg</name>
<message>

View File

@ -561,6 +561,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
case GEOMOp::OpCreateField: // MENU FIELD - CREATE FIELD
case GEOMOp::OpEditField: // MENU FIELD - EDIT FIELD
case GEOMOp::OpEditFieldPopup: // POPUP MENU - EDIT FIELD
case GEOMOp::Op2dPolylineEditor: // MENU BASIC - POLYLINE EDITOR
libName = "EntityGUI";
break;
case GEOMOp::OpEdge: // MENU BUILD - EDGE
@ -600,10 +601,6 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
case GEOMOp::OpSharedShapes: // MENU OPERATION - GET SHARED SHAPES
case GEOMOp::OpExtrudedBoss: // MENU OPERATION - EXTRUDED BOSS
case GEOMOp::OpExtrudedCut: // MENU OPERATION - EXTRUDED CUT
#ifdef DEBUG_CURVE_CREATOR
// for debug purposes, to be removed
case GEOMOp::OpCurveCreator: // MENU OPERATION - CURVE CREATOR
#endif
libName = "OperationGUI";
break;
case GEOMOp::OpSewing: // MENU REPAIR - SEWING
@ -941,6 +938,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
#endif
createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
createGeomAction( GEOMOp::Op2dPolylineEditor, "CURVE_CREATOR" );
createGeomAction( GEOMOp::OpEdge, "EDGE" );
createGeomAction( GEOMOp::OpWire, "WIRE" );
@ -973,10 +971,6 @@ void GeometryGUI::initialize( CAM_Application* app )
createGeomAction( GEOMOp::OpSharedShapes, "GET_SHARED_SHAPES" );
createGeomAction( GEOMOp::OpExtrudedCut, "EXTRUDED_CUT" );
createGeomAction( GEOMOp::OpExtrudedBoss, "EXTRUDED_BOSS" );
#ifdef DEBUG_CURVE_CREATOR
// for debug purposes, to be removed
createGeomAction( GEOMOp::OpCurveCreator, "CURVE_CREATOR" );
#endif
createGeomAction( GEOMOp::OpFillet1d, "FILLET_1D" );
createGeomAction( GEOMOp::OpFillet2d, "FILLET_2D" );
@ -1106,19 +1100,20 @@ void GeometryGUI::initialize( CAM_Application* app )
int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
createMenu( GEOMOp::OpPoint, basicId, -1 );
createMenu( GEOMOp::OpLine, basicId, -1 );
createMenu( GEOMOp::OpCircle, basicId, -1 );
createMenu( GEOMOp::OpEllipse, basicId, -1 );
createMenu( GEOMOp::OpArc, basicId, -1 );
createMenu( GEOMOp::OpCurve, basicId, -1 );
createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
createMenu( GEOMOp::OpIsoline, basicId, -1 );
createMenu( separator(), basicId, -1 );
createMenu( GEOMOp::OpVector, basicId, -1 );
createMenu( GEOMOp::OpPlane, basicId, -1 );
createMenu( GEOMOp::OpLCS, basicId, -1 );
createMenu( GEOMOp::OpPoint, basicId, -1 );
createMenu( GEOMOp::OpLine, basicId, -1 );
createMenu( GEOMOp::OpCircle, basicId, -1 );
createMenu( GEOMOp::OpEllipse, basicId, -1 );
createMenu( GEOMOp::OpArc, basicId, -1 );
createMenu( GEOMOp::OpCurve, basicId, -1 );
createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
createMenu( GEOMOp::Op2dPolylineEditor, basicId, -1 );
createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
createMenu( GEOMOp::OpIsoline, basicId, -1 );
createMenu( separator(), basicId, -1 );
createMenu( GEOMOp::OpVector, basicId, -1 );
createMenu( GEOMOp::OpPlane, basicId, -1 );
createMenu( GEOMOp::OpLCS, basicId, -1 );
createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
@ -1224,11 +1219,6 @@ void GeometryGUI::initialize( CAM_Application* app )
createMenu( GEOMOp::OpChamfer, operId, -1 );
createMenu( GEOMOp::OpExtrudedBoss, operId, -1 );
createMenu( GEOMOp::OpExtrudedCut, operId, -1 );
#ifdef DEBUG_CURVE_CREATOR
// for debug purposes, to be removed
createMenu( separator(), operId, -1 );
createMenu( GEOMOp::OpCurveCreator, operId, -1 );
#endif
//createMenu( GEOMOp::OpClipping, operId, -1 );
int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
@ -1319,18 +1309,19 @@ void GeometryGUI::initialize( CAM_Application* app )
// ---- create toolbars --------------------------
int basicTbId = createTool( tr( "TOOL_BASIC" ), QString( "GEOMBasic" ) );
createTool( GEOMOp::OpPoint, basicTbId );
createTool( GEOMOp::OpLine, basicTbId );
createTool( GEOMOp::OpCircle, basicTbId );
createTool( GEOMOp::OpEllipse, basicTbId );
createTool( GEOMOp::OpArc, basicTbId );
createTool( GEOMOp::OpCurve, basicTbId );
createTool( GEOMOp::OpVector, basicTbId );
createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
createTool( GEOMOp::OpIsoline, basicTbId );
createTool( GEOMOp::OpPlane, basicTbId );
createTool( GEOMOp::OpLCS, basicTbId );
createTool( GEOMOp::OpPoint, basicTbId );
createTool( GEOMOp::OpLine, basicTbId );
createTool( GEOMOp::OpCircle, basicTbId );
createTool( GEOMOp::OpEllipse, basicTbId );
createTool( GEOMOp::OpArc, basicTbId );
createTool( GEOMOp::OpCurve, basicTbId );
createTool( GEOMOp::OpVector, basicTbId );
createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
createTool( GEOMOp::Op2dPolylineEditor, basicTbId );
createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
createTool( GEOMOp::OpIsoline, basicTbId );
createTool( GEOMOp::OpPlane, basicTbId );
createTool( GEOMOp::OpLCS, basicTbId );
createTool( GEOMOp::OpOriginAndVectors, basicTbId );
// int sketchTbId = createTool( tr( "TOOL_SKETCH" ), QString( "GEOMSketch" ) );
@ -1390,10 +1381,6 @@ void GeometryGUI::initialize( CAM_Application* app )
createTool( GEOMOp::OpChamfer, featTbId );
createTool( GEOMOp::OpExtrudedBoss, featTbId );
createTool( GEOMOp::OpExtrudedCut, featTbId );
#ifdef DEBUG_CURVE_CREATOR
// for debug purposes, to be removed
createTool( GEOMOp::OpCurveCreator, featTbId );
#endif
int buildTbId = createTool( tr( "TOOL_BUILD" ), QString( "GEOMBuild" ) );
createTool( GEOMOp::OpEdge, buildTbId );

View File

@ -119,6 +119,7 @@ namespace GEOMOp {
OpCreateField = 3305, // MENU FIELD - CREATE FIELD
OpEditField = 3306, // MENU FIELD - EDIT FIELD
OpEditFieldPopup = 3307, // POPUP MENU - EDIT FIELD
Op2dPolylineEditor = 3308, // MENU NEW ENTITY - BASIC - POLYLINE EDITOR
// BuildGUI --------------------//--------------------------------
OpEdge = 3400, // MENU NEW ENTITY - BUILD - EDGE
OpWire = 3401, // MENU NEW ENTITY - BUILD - WIRE
@ -154,10 +155,6 @@ namespace GEOMOp {
OpSharedShapes = 3708, // MENU OPERATION - GET SHARED SHAPES
OpExtrudedBoss = 3709, // MENU OPERATION - ETRUDED BOSS
OpExtrudedCut = 3710, // MENU OPERATION - ETRUDED CUT
#ifdef DEBUG_CURVE_CREATOR
OpCurveCreator = 3799, // MENU OPERATION - CURVE CREATOR
#endif
// for debug purposes, to be removed
// RepairGUI -------------------//--------------------------------
OpSewing = 4000, // MENU REPAIR - SEWING
OpSuppressFaces = 4001, // MENU REPAIR - SUPPRESS FACES

View File

@ -74,6 +74,7 @@ SET(GEOMImpl_HEADERS
GEOMImpl_PointDriver.hxx
GEOMImpl_IPoint.hxx
GEOMImpl_IPolyline.hxx
GEOMImpl_IPolyline2D.hxx
GEOMImpl_ICircle.hxx
GEOMImpl_ISpline.hxx
GEOMImpl_IEllipse.hxx
@ -150,6 +151,7 @@ SET(GEOMImpl_HEADERS
GEOMImpl_Block6Explorer.hxx
GEOMImpl_MeasureDriver.hxx
GEOMImpl_PolylineDriver.hxx
GEOMImpl_PolylineDumper.hxx
GEOMImpl_CircleDriver.hxx
GEOMImpl_EllipseDriver.hxx
GEOMImpl_ArcDriver.hxx
@ -192,6 +194,7 @@ SET(GEOMImpl_SOURCES
GEOMImpl_IGroupOperations.cxx
GEOMImpl_IFieldOperations.cxx
GEOMImpl_IBaseIEOperations.cxx
GEOMImpl_IPolyline2D.cxx
GEOMImpl_Gen.cxx
GEOMImpl_PointDriver.cxx
GEOMImpl_VectorDriver.cxx
@ -221,6 +224,7 @@ SET(GEOMImpl_SOURCES
GEOMImpl_Block6Explorer.cxx
GEOMImpl_MeasureDriver.cxx
GEOMImpl_PolylineDriver.cxx
GEOMImpl_PolylineDumper.cxx
GEOMImpl_CircleDriver.cxx
GEOMImpl_EllipseDriver.cxx
GEOMImpl_ArcDriver.cxx

View File

@ -51,6 +51,7 @@
#include "GEOMImpl_3DSketcherDriver.hxx"
#include "GEOMImpl_IPolyline.hxx"
#include "GEOMImpl_IPolyline2D.hxx"
#include "GEOMImpl_ICircle.hxx"
#include "GEOMImpl_ISpline.hxx"
#include "GEOMImpl_IEllipse.hxx"
@ -59,12 +60,14 @@
#include "GEOMImpl_I3DSketcher.hxx"
#include "GEOMImpl_ICurveParametric.hxx"
#include "GEOMImpl_IIsoline.hxx"
#include "GEOMImpl_PolylineDumper.hxx"
#include <Basics_OCCTVersion.hxx>
#include "utilities.h"
#include <TDF_Tool.hxx>
#include <TColStd_HArray1OfByte.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <Standard_Failure.hxx>
@ -1465,3 +1468,155 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeIsoline
SetErrorCode(OK);
return anIsoline;
}
//=============================================================================
/*!
* MakePolyline2D
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakePolyline2D
(const std::list <std::list <double> > &theCoords,
const Handle(TColStd_HArray1OfExtendedString) &theNames,
const Handle(TColStd_HArray1OfByte) &theTypes,
const Handle(TColStd_HArray1OfByte) &theCloseds,
const Handle(TColStd_HArray1OfReal) &theWorkingPlane)
{
SetErrorCode(KO);
if (theCoords.empty() || theNames.IsNull() || theTypes.IsNull() ||
theCloseds.IsNull() || theWorkingPlane.IsNull()) {
return NULL;
}
// Add a new Polyline object
Handle(GEOM_Object) aResult =
GetEngine()->AddObject(GetDocID(), GEOM_POLYLINE2D);
Handle(GEOM_Function) aFunction = aResult->AddFunction
(GEOMImpl_PolylineDriver::GetID(), POLYLINE2D_PLN_COORDS);
if (aFunction.IsNull()) {
return NULL;
}
// Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_PolylineDriver::GetID()) {
return NULL;
}
GEOMImpl_IPolyline2D aCI(aFunction);
aCI.SetCoords(theCoords);
aCI.SetNames(theNames);
aCI.SetTypes(theTypes);
aCI.SetClosedFlags(theCloseds);
aCI.SetWorkingPlaneDbls(theWorkingPlane);
// Compute the isoline curve
try {
#if OCC_VERSION_LARGE > 0x06010000
OCC_CATCH_SIGNALS;
#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Polyline driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
GEOMImpl_PolylineDumper aDumper(theCoords, theNames, theTypes,
theCloseds, theWorkingPlane);
aDumper.Dump(aResult);
if (aDumper.IsDone() == Standard_False) {
SetErrorCode("Python dump failed");
return NULL;
}
SetErrorCode(OK);
return aResult;
}
//=============================================================================
/*!
* MakePolyline2DOnPlane
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakePolyline2DOnPlane
(const std::list <std::list <double> > &theCoords,
const Handle(TColStd_HArray1OfExtendedString) &theNames,
const Handle(TColStd_HArray1OfByte) &theTypes,
const Handle(TColStd_HArray1OfByte) &theCloseds,
const Handle(GEOM_Object) &theWorkingPlane)
{
SetErrorCode(KO);
if (theCoords.empty() || theNames.IsNull() || theTypes.IsNull() ||
theCloseds.IsNull() || theWorkingPlane.IsNull()) {
return NULL;
}
//Add a new Polyline object
Handle(GEOM_Object) aResult =
GetEngine()->AddObject(GetDocID(), GEOM_POLYLINE2D);
Handle(GEOM_Function) aFunction = aResult->AddFunction
(GEOMImpl_PolylineDriver::GetID(), POLYLINE2D_PLN_OBJECT);
if (aFunction.IsNull()) {
return NULL;
}
//Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_PolylineDriver::GetID()) {
return NULL;
}
Handle(GEOM_Function) aRefPlane = theWorkingPlane->GetLastFunction();
if (aRefPlane.IsNull()) {
return NULL;
}
GEOMImpl_IPolyline2D aCI(aFunction);
aCI.SetCoords(theCoords);
aCI.SetNames(theNames);
aCI.SetTypes(theTypes);
aCI.SetClosedFlags(theCloseds);
aCI.SetWorkingPlane(aRefPlane);
//Compute the isoline curve
try {
#if OCC_VERSION_LARGE > 0x06010000
OCC_CATCH_SIGNALS;
#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Polyline driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
GEOMImpl_PolylineDumper aDumper(theCoords, theNames, theTypes,
theCloseds, theWorkingPlane);
aDumper.Dump(aResult);
if (aDumper.IsDone() == Standard_False) {
SetErrorCode("Python dump failed");
return NULL;
}
SetErrorCode(OK);
return aResult;
}

View File

@ -100,6 +100,19 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations {
const bool IsUIso,
const double theParameter);
Standard_EXPORT Handle(GEOM_Object) MakePolyline2D
(const std::list <std::list <double> > &theCoords,
const Handle(TColStd_HArray1OfExtendedString) &theNames,
const Handle(TColStd_HArray1OfByte) &theTypes,
const Handle(TColStd_HArray1OfByte) &theCloseds,
const Handle(TColStd_HArray1OfReal) &theWorkingPlane);
Standard_EXPORT Handle(GEOM_Object) MakePolyline2DOnPlane
(const std::list <std::list <double> > &theCoords,
const Handle(TColStd_HArray1OfExtendedString) &theNames,
const Handle(TColStd_HArray1OfByte) &theTypes,
const Handle(TColStd_HArray1OfByte) &theCloseds,
const Handle(GEOM_Object) &theWorkingPlane);
};
#endif

View File

@ -0,0 +1,112 @@
// Copyright (C) 2007-2014 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, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include "GEOMImpl_IPolyline2D.hxx"
#include <TColStd_HArray1OfInteger.hxx>
//=============================================================================
/*!
* SetCoords
*/
//=============================================================================
void GEOMImpl_IPolyline2D::SetCoords
(const std::list <std::list <double> > &theValue)
{
const Standard_Integer aNbSec = theValue.size();
if (aNbSec > 0) {
// Compute the total number of points and fill the array of start indices.
Standard_Integer i;
Standard_Integer aNbCoords = 0;
Handle(TColStd_HArray1OfInteger) anIndices =
new TColStd_HArray1OfInteger(1, aNbSec);
Handle(TColStd_HArray1OfReal) aCoords;
std::list <std::list <double> >::const_iterator aSecIter = theValue.begin();
for (i = 1; aSecIter != theValue.end(); ++aSecIter, ++i) {
anIndices->SetValue(i, aNbCoords + 1);
aNbCoords += aSecIter->size();
}
if (aNbCoords > 0) {
// Fill the array of coordinates.
std::list<double>::const_iterator aCIter;
aCoords = new TColStd_HArray1OfReal(1, aNbCoords);
aSecIter = theValue.begin();
for (i = 1; aSecIter != theValue.end(); ++aSecIter) {
for (aCIter = aSecIter->begin(); aCIter != aSecIter->end(); ++aCIter) {
aCoords->SetValue(i++, *aCIter);
}
}
}
// Store the coordinates.
if (aCoords.IsNull() == Standard_False) {
_func->SetRealArray(POLY_ARG_COORDS, aCoords);
}
_func->SetIntegerArray(POLY_ARG_START_INDICES, anIndices);
}
}
//=============================================================================
/*!
* GetCoords
*/
//=============================================================================
void GEOMImpl_IPolyline2D::GetCoords(std::list <std::list <double> > &theValue)
{
theValue.clear();
Handle(TColStd_HArray1OfReal) aCoords =
_func->GetRealArray(POLY_ARG_COORDS);
Handle(TColStd_HArray1OfInteger) anIndices =
_func->GetIntegerArray(POLY_ARG_START_INDICES);
if (anIndices.IsNull() == Standard_False) {
const Standard_Integer aNbSec = anIndices->Length();
// Create an empty sections.
theValue.resize(aNbSec);
if (aCoords.IsNull() == Standard_False) {
Standard_Integer i;
Standard_Integer j;
std::list <std::list <double> >::iterator anIt = theValue.begin();
for (i = anIndices->Lower(); i <= anIndices->Upper(); ++i, ++anIt) {
const Standard_Integer iCoord1 = anIndices->Value(i);
const Standard_Integer iCoord2 = i + 1 > anIndices->Upper() ?
aCoords->Upper() + 1 : anIndices->Value(i + 1);
for (j = iCoord1; j < iCoord2; ++j) {
anIt->push_back(aCoords->Value(j));
}
}
}
}
}

View File

@ -0,0 +1,94 @@
// Copyright (C) 2007-2014 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, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
//NOTE: This is an interface to a function for the Polyline2D creation.
#ifndef _GEOMImpl_IPolyline2D_HXX_
#define _GEOMImpl_IPolyline2D_HXX_
#include <GEOM_GEOMImpl.hxx>
#include <GEOM_Function.hxx>
#include <list>
#include <TColStd_HArray1OfExtendedString.hxx>
#include <TColStd_HArray1OfByte.hxx>
#include <TColStd_HArray1OfReal.hxx>
#define POLY_ARG_NAMES 1
#define POLY_ARG_TYPES 2
#define POLY_ARG_CLOSEDS 3
#define POLY_ARG_COORDS 4
#define POLY_ARG_START_INDICES 5
#define POLY_ARG_WPLANE_DBLS 6
#define POLY_ARG_WPLANE_OBJ 7
class GEOMIMPL_EXPORT GEOMImpl_IPolyline2D
{
public:
GEOMImpl_IPolyline2D(Handle(GEOM_Function) theFunction): _func(theFunction) {}
void SetNames(const Handle_TColStd_HArray1OfExtendedString &theValue)
{ _func->SetStringArray(POLY_ARG_NAMES, theValue); }
Handle_TColStd_HArray1OfExtendedString GetNames()
{ return _func->GetStringArray(POLY_ARG_NAMES); }
void SetTypes(const Handle_TColStd_HArray1OfByte &theValue)
{ _func->SetByteArray(POLY_ARG_TYPES, theValue); }
Handle_TColStd_HArray1OfByte GetTypes()
{ return _func->GetByteArray(POLY_ARG_TYPES); }
void SetClosedFlags(const Handle_TColStd_HArray1OfByte &theValue)
{ _func->SetBooleanArray(POLY_ARG_CLOSEDS, theValue); }
Handle_TColStd_HArray1OfByte GetClosedFlags()
{ return _func->GetBooleanArray(POLY_ARG_CLOSEDS); }
void SetWorkingPlaneDbls(const Handle_TColStd_HArray1OfReal &thePlane)
{ _func->SetRealArray(POLY_ARG_WPLANE_DBLS, thePlane); }
Handle_TColStd_HArray1OfReal GetWorkingPlaneDbls()
{ return _func->GetRealArray(POLY_ARG_WPLANE_DBLS); }
void SetWorkingPlane(const Handle_GEOM_Function &thePlane)
{ _func->SetReference(POLY_ARG_WPLANE_OBJ, thePlane); }
Handle_GEOM_Function GetWorkingPlane()
{ return _func->GetReference(POLY_ARG_WPLANE_OBJ); }
void SetCoords(const std::list <std::list <double> > &theValue);
void GetCoords(std::list <std::list <double> > &theValue);
private:
Handle(GEOM_Function) _func;
};
#endif

View File

@ -23,12 +23,17 @@
#include "GEOMImpl_PolylineDriver.hxx"
#include "GEOMImpl_ICurveParametric.hxx"
#include "GEOMImpl_ICurvesOperations.hxx"
#include "GEOMImpl_IPolyline.hxx"
#include "GEOMImpl_IPolyline2D.hxx"
#include "GEOMImpl_Types.hxx"
#include "GEOM_Function.hxx"
#include <GEOMUtils.hxx>
#include <Sketcher_Utils.hxx>
#include <BRepBuilderAPI_MakePolygon.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <Precision.hxx>
#include <TColgp_Array1OfPnt.hxx>
@ -38,6 +43,7 @@
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
#include <gp_Ax3.hxx>
#include <gp_Pnt.hxx>
//=======================================================================
@ -59,6 +65,125 @@ GEOMImpl_PolylineDriver::GEOMImpl_PolylineDriver()
{
}
//=======================================================================
//function : MakePolyline2D
//purpose :
//=======================================================================
Standard_Integer GEOMImpl_PolylineDriver::MakePolyline2D
(TFunction_Logbook& log) const
{
if (Label().IsNull()) {
return 0;
}
Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
GEOMImpl_IPolyline2D aCI(aFunction);
Standard_Integer aType = aFunction->GetType();
TopoDS_Shape aShape;
// Get data.
Handle(TColStd_HArray1OfExtendedString) aNames = aCI.GetNames();
Handle(TColStd_HArray1OfByte) aTypes = aCI.GetTypes();
Handle(TColStd_HArray1OfByte) aClosedFlags = aCI.GetClosedFlags();
std::list <std::list <double> > aCoords;
gp_Ax3 aWPlane;
aCI.GetCoords(aCoords);
// Check the data validity
if (aNames.IsNull()) {
return 0;
}
Standard_Integer aNbSections = aNames->Length();
if (aTypes.IsNull() || aNbSections != aTypes->Length()) {
return 0;
}
if (aClosedFlags.IsNull() || aNbSections != aClosedFlags->Length()) {
return 0;
}
if (aNbSections != aCoords.size()) {
return 0;
}
if (aType == POLYLINE2D_PLN_COORDS) {
Handle(TColStd_HArray1OfReal) aPlaneCoords = aCI.GetWorkingPlaneDbls();
if (aPlaneCoords.IsNull()) {
return 0;
}
if (aPlaneCoords->Length() != 9) {
return 0;
}
Standard_Integer i = aPlaneCoords->Lower();
gp_Pnt aOrigin(aPlaneCoords->Value(i), aPlaneCoords->Value(i + 1),
aPlaneCoords->Value(i + 2));
gp_Dir aDirZ(aPlaneCoords->Value(i + 3), aPlaneCoords->Value(i + 4),
aPlaneCoords->Value(i + 5));
gp_Dir aDirX(aPlaneCoords->Value(i + 6), aPlaneCoords->Value(i + 7),
aPlaneCoords->Value(i + 8));
aWPlane = gp_Ax3(aOrigin, aDirZ, aDirX);
} else if (aType == POLYLINE2D_PLN_OBJECT) {
Handle(GEOM_Function) aRefFace = aCI.GetWorkingPlane();
TopoDS_Shape aShape = aRefFace->GetValue();
aWPlane = GEOMUtils::GetPosition(aShape);
} else {
return 0;
}
// Construct a shape.
Standard_Integer iN = aNames->Lower();
Standard_Integer iT = aTypes->Lower();
Standard_Integer iC = aClosedFlags->Lower();
std::list <std::list <double> >::const_iterator anIter = aCoords.begin();
BRep_Builder aBuilder;
Standard_Boolean isEmpty = Standard_True;
if (aNbSections > 1) {
aBuilder.MakeCompound(TopoDS::Compound(aShape));
}
for (; anIter != aCoords.end(); ++anIter, ++iN, ++iT, ++iC) {
Standard_Integer aType = aTypes->Value(iT);
TopoDS_Shape aSection;
if (aType == GEOMImpl_ICurvesOperations::Polyline) {
aSection = Sketcher_Utils::MakePolyline
(*anIter, aClosedFlags->Value(iC), aWPlane);
} else if (aType == GEOMImpl_ICurvesOperations::Interpolation) {
aSection = Sketcher_Utils::MakeInterpolation
(*anIter, aClosedFlags->Value(iC), aWPlane);
}
if (aNbSections > 1) {
// There are multiple sections.
if (aSection.IsNull() == Standard_False) {
aBuilder.Add(aShape, aSection);
isEmpty = Standard_False;
}
} else {
// There is only one section.
isEmpty = aSection.IsNull();
aShape = aSection;
}
}
if (isEmpty) {
return 0;
}
aFunction->SetValue(aShape);
log.SetTouched(Label());
return 1;
}
//=======================================================================
//function : Execute
//purpose :
@ -67,9 +192,13 @@ Standard_Integer GEOMImpl_PolylineDriver::Execute(TFunction_Logbook& log) const
{
if (Label().IsNull()) return 0;
Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
Standard_Integer aType = aFunction->GetType();
if (aType == POLYLINE2D_PLN_COORDS || aType == POLYLINE2D_PLN_OBJECT) {
return MakePolyline2D(log);
}
GEOMImpl_IPolyline aCI (aFunction);
Standard_Integer aType = aFunction->GetType();
TopoDS_Shape aShape;
@ -166,10 +295,9 @@ GetCreationInformation(std::string& theOperationName,
GEOMImpl_ICurveParametric aIP( function );
Standard_Integer aType = function->GetType();
theOperationName = "CURVE";
switch ( aType ) {
case POLYLINE_POINTS:
theOperationName = "CURVE";
AddParam( theParams, "Type", "Polyline");
if ( aIP.HasData() )
{
@ -206,6 +334,103 @@ GetCreationInformation(std::string& theOperationName,
AddParam( theParams, "Is closed", aCI.GetIsClosed() );
}
break;
case POLYLINE2D_PLN_COORDS:
case POLYLINE2D_PLN_OBJECT:
{
theOperationName = "SKETCH";
GEOMImpl_IPolyline2D aP2d(function);
Handle(TColStd_HArray1OfExtendedString) aNames = aP2d.GetNames();
if (aNames.IsNull() == Standard_False) {
if (aNames->Length() == 1) {
// This is the single curve. Make its full dump.
AddParam(theParams, "Name", aNames->Value(aNames->Lower()));
Handle(TColStd_HArray1OfByte) aTypes = aP2d.GetTypes();
if (aTypes.IsNull() == Standard_False && aTypes->Length() == 1) {
Standard_Integer aType = aTypes->Value(aTypes->Lower());
if (aType == GEOMImpl_ICurvesOperations::Polyline) {
AddParam(theParams, "Type") << "Polyline";
} else if (aType == GEOMImpl_ICurvesOperations::Interpolation) {
AddParam(theParams, "Type") << "Interpolation";
}
}
Handle(TColStd_HArray1OfByte) aCloseds = aP2d.GetClosedFlags();
if (aCloseds.IsNull() == Standard_False && aCloseds->Length() == 1) {
const char *aYesNo =
aCloseds->Value(aCloseds->Lower()) ? "Yes" : "No";
AddParam(theParams, "Is closed", aYesNo);
}
std::list <std::list <double> > aCoords;
aP2d.GetCoords(aCoords);
if (aCoords.size() == 1) {
AddParam(theParams, "Number of points", aCoords.front().size()/2);
}
} else {
// There are more than 1 curve.
Standard_Integer aNbCurves = aNames->Length();
Standard_Integer i;
std::list <std::list <double> > aCoords;
AddParam(theParams, "Number of curves", aNbCurves);
aP2d.GetCoords(aCoords);
Standard_Integer aNbCoords = aCoords.size();
std::list <std::list <double> >::const_iterator
anIt = aCoords.begin();
for (i = 0; i < aNbCurves; i++) {
TCollection_AsciiString aName("Curve ");
TCollection_ExtendedString
aValue(aNames->Value(aNames->Lower() + i));
aName.AssignCat(i + 1);
if (anIt != aCoords.end()) {
aValue.AssignCat(" (");
aValue.AssignCat(Standard_Integer(anIt->size()));
aValue.AssignCat(" points)");
anIt++;
}
AddParam(theParams, aName.ToCString(), aValue);
}
}
}
if (aType == POLYLINE2D_PLN_COORDS) {
Handle(TColStd_HArray1OfReal) aPln = aP2d.GetWorkingPlaneDbls();
if (aPln.IsNull() == Standard_False && aPln->Length() == 9) {
Standard_Integer i = aPln->Lower();
AddParam( theParams, "Origin")
<< aPln->Value(i) << " "
<< aPln->Value(i + 1) << " "
<< aPln->Value(i + 2);
AddParam( theParams, "OZ")
<< aPln->Value(i + 3) << " "
<< aPln->Value(i + 4) << " "
<< aPln->Value(i + 5);
AddParam( theParams, "OX")
<< aPln->Value(i + 6) << " "
<< aPln->Value(i + 7) << " "
<< aPln->Value(i + 8);
}
} else {
AddParam(theParams, "Working plane", aP2d.GetWorkingPlane(), "XOY");
}
}
break;
default:
return false;
}

View File

@ -80,6 +80,9 @@ Standard_EXPORT ~GEOMImpl_PolylineDriver() {};
Standard_EXPORT virtual
bool GetCreationInformation(std::string& theOperationName,
std::vector<GEOM_Param>& params);
private:
Standard_Integer MakePolyline2D(TFunction_Logbook& log) const;
DEFINE_STANDARD_RTTI( GEOMImpl_PolylineDriver )
};

View File

@ -0,0 +1,251 @@
// Copyright (C) 2007-2014 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, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : GEOMImpl_PolylineDumper.cxx
// Author : Sergey KHROMOV
// Module : GEOM
#include "GEOMImpl_PolylineDumper.hxx"
#include "GEOMImpl_ICurvesOperations.hxx"
#include <GEOM_PythonDump.hxx>
//=======================================================================
// function : Constructor
// purpose :
//=======================================================================
GEOMImpl_PolylineDumper::GEOMImpl_PolylineDumper
(const std::list <std::list <double> > &theCoords,
const Handle(TColStd_HArray1OfExtendedString) &theNames,
const Handle(TColStd_HArray1OfByte) &theTypes,
const Handle(TColStd_HArray1OfByte) &theCloseds,
const Handle(TColStd_HArray1OfReal) &thePlnCoords)
: myCoords (theCoords),
myNames (theNames),
myTypes (theTypes),
myCloseds (theCloseds),
myPlnCoords (thePlnCoords),
myIsDone (Standard_False)
{
init();
}
//=======================================================================
// function : Constructor
// purpose :
//=======================================================================
GEOMImpl_PolylineDumper::GEOMImpl_PolylineDumper
(const std::list <std::list <double> > &theCoords,
const Handle(TColStd_HArray1OfExtendedString) &theNames,
const Handle(TColStd_HArray1OfByte) &theTypes,
const Handle(TColStd_HArray1OfByte) &theCloseds,
const Handle(GEOM_Object) &theWorkingPlane)
: myCoords (theCoords),
myNames (theNames),
myTypes (theTypes),
myCloseds (theCloseds),
myWorkingPlane (theWorkingPlane),
myIsDone (Standard_False)
{
init();
}
//=======================================================================
// function : Dump
// purpose :
//=======================================================================
Standard_Boolean GEOMImpl_PolylineDumper::Dump
(const Handle(GEOM_Object) &theObject)
{
if (theObject.IsNull()) {
return Standard_False;
}
if (myIsDone) {
Handle(GEOM_Function) aFunction = theObject->GetLastFunction();
GEOM::TPythonDump aPD(aFunction);
aPD << myDescr;
aPD << theObject << " = pl.result(";
if (myWorkingPlane.IsNull()) {
// Add coodinates of working plane.
Standard_Integer i;
aPD << "[";
for (i = 0; i < 9; ++i) {
aPD << myPlnCoords->Value(myPlnCoords->Lower() + i);
if (i < 8) {
aPD << ", ";
}
}
aPD << "]";
} else {
aPD << myWorkingPlane;
}
aPD << ")";
}
return myIsDone;
}
//=======================================================================
// function : init
// purpose :
//=======================================================================
void GEOMImpl_PolylineDumper::init()
{
// Check input parameters.
if (myCoords.empty() || myNames.IsNull() ||
myTypes.IsNull() || myCloseds.IsNull()) {
// One or more input parameters are null or empty()
return;
}
const Standard_Integer aNbSec = myCoords.size();
if (aNbSec != myNames->Length() || aNbSec != myTypes->Length() ||
aNbSec != myCloseds->Length()) {
// Inconsistent data.
return;
}
// Check the reference plane
if (myPlnCoords.IsNull()) {
if (myWorkingPlane.IsNull()) {
// Null working plane
return;
}
} else {
if (myWorkingPlane.IsNull() == Standard_False) {
// Ambiguous working plane
return;
}
if (myPlnCoords->Length() != 9) {
// Invalid number of plane coordinates.
return;
}
}
char *aSeparator = "\n\t";
Standard_Integer i;
std::list <std::list <double> >::const_iterator anIt = myCoords.begin();
myDescr += "pl = geompy.Polyline2D()";
// Add sections.
for (i = 0; i < aNbSec && anIt != myCoords.end(); ++i, ++anIt) {
myDescr += aSeparator;
myDescr += "pl.addSection(";
// Add name
myDescr += "\"";
myDescr += myNames->Value(myNames->Lower() + i) + "\", ";
// Add type
const Standard_Integer aType = myTypes->Value(myTypes->Lower() + i);
switch (aType) {
case GEOMImpl_ICurvesOperations::Polyline:
myDescr += "GEOM.Polyline, ";
break;
case GEOMImpl_ICurvesOperations::Interpolation:
myDescr += "GEOM.Interpolation, ";
break;
default:
myDescr.Clear();
return;
break; // NEVERREACHED
}
// Add Closed flag.
if (myCloseds->Value(myCloseds->Lower() + i)) {
myDescr += "True";
} else {
myDescr += "False";
}
// Add points.
const Standard_Integer aNbCoords = anIt->size();
if (aNbCoords > 0) {
if (aNbCoords % 2) {
// Odd number of coordinates.
myDescr.Clear();
return;
}
if (aNbCoords <= 4) {
// Add 2 points to the same command addSection.
myDescr += ", [";
std::list <double>::const_iterator aCIt = anIt->begin();
while (aCIt != anIt->end()) {
myDescr += *aCIt;
if (++aCIt != anIt->end()) {
myDescr += ", ";
}
}
} else {
// Add points to a separate command addPoints.
// Add maximum 4 points in a command.
std::list <double>::const_iterator aCIt = anIt->begin();
Standard_Integer aMaxNbCoord = 8;
Standard_Integer j = 1;
myDescr += ")";
myDescr += aSeparator;
myDescr += "pl.addPoints([";
while (aCIt != anIt->end()) {
myDescr += *aCIt;
if (++aCIt != anIt->end()) {
if (j == aMaxNbCoord) {
// 4 points are added. Add a new command.
myDescr += "])";
myDescr += aSeparator;
myDescr += "pl.addPoints([";
j = 1;
} else {
myDescr += ", ";
j++;
}
}
}
}
myDescr += "]";
}
myDescr += ")";
}
myDescr += aSeparator;
myIsDone = Standard_True;
}

View File

@ -0,0 +1,132 @@
// Copyright (C) 2007-2014 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, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : GEOMImpl_PolylineDumper.h
// Author : Sergey KHROMOV
#ifndef _GEOMImpl_PolylineDumper_HXX_
#define _GEOMImpl_PolylineDumper_HXX_
#include "GEOM_GEOMImpl.hxx"
#include <GEOM_Object.hxx>
#include <TColStd_HArray1OfExtendedString.hxx>
#include <TColStd_HArray1OfByte.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <list>
/**
* This is a helper class to form a dump of a polyline 2d curves creation
* algorithm.
*/
class GEOMIMPL_EXPORT GEOMImpl_PolylineDumper
{
public:
/**
* This construcor initializes the object with 2D polyline creation
* parameters.
*
* \param theCoords the list of coordinates list. theCoordsList[0]
* is the coordinates list of the first section. theCoordsList[1]
* is for the second section etc.
* \param theNames the list of names. The order corresponds to theCoords.
* \param theTypes the list of curve types. The order corresponds to
* theCoords.
* \param theCloseds the list of Closed flags. The order corresponds to
* theCoords.
* \param thePlnCoords 9 double values, defining origin,
* OZ and OX directions of the working plane.
*/
GEOMImpl_PolylineDumper
(const std::list <std::list <double> > &theCoords,
const Handle_TColStd_HArray1OfExtendedString &theNames,
const Handle_TColStd_HArray1OfByte &theTypes,
const Handle_TColStd_HArray1OfByte &theCloseds,
const Handle_TColStd_HArray1OfReal &thePlnCoords);
/**
* This construcor initializes the object with 2D polyline creation
* parameters.
*
* \param theCoords the list of coordinates list. theCoordsList[0]
* is the coordinates list of the first section. theCoordsList[1]
* is for the second section etc.
* \param theNames the list of names. The order corresponds to theCoords.
* \param theTypes the list of curve types. The order corresponds to
* theCoords.
* \param theCloseds the list of Closed flags. The order corresponds to
* theCoords.
* \param theWorkingPlane planar Face or LCS(Marker) of the working plane.
*/
GEOMImpl_PolylineDumper
(const std::list <std::list <double> > &theCoords,
const Handle_TColStd_HArray1OfExtendedString &theNames,
const Handle_TColStd_HArray1OfByte &theTypes,
const Handle_TColStd_HArray1OfByte &theCloseds,
const Handle_GEOM_Object &theWorkingPlane);
/**
* This method returns Standard_True if the dump description is created
* successfully.
*
* \return Standard_True in case of success; Standard_False otherwise.
*/
Standard_Boolean IsDone() const
{ return myIsDone; }
/**
* This method performs dump of the polyline.
*
* \param theObject the newly created object.
* \return Standard_True in case of success; Standard_False otherwise.
*/
Standard_Boolean Dump(const Handle_GEOM_Object &theObject);
protected:
/**
* This method generates the description required for python dump.
* It is called from constructor.
*/
void init();
private:
const std::list <std::list <double> > &myCoords;
Handle_TColStd_HArray1OfExtendedString myNames;
Handle_TColStd_HArray1OfByte myTypes;
Handle_TColStd_HArray1OfByte myCloseds;
Handle_TColStd_HArray1OfReal myPlnCoords;
Handle_GEOM_Object myWorkingPlane;
Standard_Boolean myIsDone;
TCollection_ExtendedString myDescr;
};
#endif

6
src/GEOMImpl/GEOMImpl_Types.hxx Executable file → Normal file
View File

@ -111,6 +111,8 @@
#define GEOM_ISOLINE 55
#define GEOM_POLYLINE2D 56
//GEOM_Function types
#define COPY_WITH_REF 1
@ -250,7 +252,9 @@
#define PARTITION_HALF 2
#define PARTITION_NO_SELF_INTERSECTIONS 3
#define POLYLINE_POINTS 1
#define POLYLINE_POINTS 1
#define POLYLINE2D_PLN_COORDS 2
#define POLYLINE2D_PLN_OBJECT 3
#define SPLINE_BEZIER 1
#define SPLINE_INTERPOLATION 2

View File

@ -30,6 +30,9 @@
#include "GEOM_Engine.hxx"
#include "GEOM_Object.hxx"
#include <TColStd_HArray1OfByte.hxx>
#include <TColStd_HArray1OfReal.hxx>
//=============================================================================
/*!
* constructor:
@ -667,3 +670,189 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher
return GetObject(anObject);
}
//=============================================================================
/*!
* MakePolyline2D
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline2D
(const GEOM::ListOfListOfDouble &theCoordsList,
const GEOM::string_array &theNamesList,
const GEOM::short_array &theTypesList,
const GEOM::ListOfBool &theClosedList,
const GEOM::ListOfDouble &theWorkingPlane)
{
//Set a not done flag
GetOperations()->SetNotDone();
// Convert input data
Handle(TColStd_HArray1OfExtendedString) aNames =
ConvertStringArray(theNamesList);
Handle(TColStd_HArray1OfByte) aTypes =
ConvertEnumArray(theTypesList);
Handle(TColStd_HArray1OfByte) aCloseds =
ConvertBoolArray(theClosedList);
std::list <std::list <double> > aCoords;
ConvertListListDouble(theCoordsList, aCoords);
Handle(TColStd_HArray1OfReal) aWorkingPlane;
const int n = theWorkingPlane.length();
int i;
if (n > 0) {
aWorkingPlane = new TColStd_HArray1OfReal(1, n);
for (i = 0; i < n; i++) {
aWorkingPlane->SetValue(i + 1, theWorkingPlane[i]);
}
}
// Make Polyline
Handle(GEOM_Object) anObject = GetOperations()->MakePolyline2D
(aCoords, aNames, aTypes, aCloseds, aWorkingPlane);
if (!GetOperations()->IsDone() || anObject.IsNull()) {
return GEOM::GEOM_Object::_nil();
}
return GetObject(anObject);
}
//=============================================================================
/*!
* MakePolylineOnPlane
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline2DOnPlane
(const GEOM::ListOfListOfDouble &theCoordsList,
const GEOM::string_array &theNamesList,
const GEOM::short_array &theTypesList,
const GEOM::ListOfBool &theClosedList,
GEOM::GEOM_Object_ptr theWorkingPlane)
{
//Set a not done flag
GetOperations()->SetNotDone();
// Convert input data
Handle(TColStd_HArray1OfExtendedString) aNames =
ConvertStringArray(theNamesList);
Handle(TColStd_HArray1OfByte) aTypes =
ConvertEnumArray(theTypesList);
Handle(TColStd_HArray1OfByte) aCloseds =
ConvertBoolArray(theClosedList);
std::list <std::list <double> > aCoords;
Handle(GEOM_Object) aWorkingPlane =
GetObjectImpl(theWorkingPlane);
ConvertListListDouble(theCoordsList, aCoords);
// Make Polyline
Handle(GEOM_Object) anObject = GetOperations()->MakePolyline2DOnPlane
(aCoords, aNames, aTypes, aCloseds, aWorkingPlane);
if (!GetOperations()->IsDone() || anObject.IsNull()) {
return GEOM::GEOM_Object::_nil();
}
return GetObject(anObject);
}
//=============================================================================
/*!
* ConvertEnumArray
*/
//=============================================================================
Handle(TColStd_HArray1OfByte) GEOM_ICurvesOperations_i::ConvertEnumArray
(const GEOM::short_array &theInArray)
{
Handle(TColStd_HArray1OfByte) anOutArray;
const int n = theInArray.length();
int i;
if (n <= 0) {
return anOutArray;
}
anOutArray = new TColStd_HArray1OfByte(1, n);
for (i = 0; i < n; i++) {
bool isOK = true;
GEOMImpl_ICurvesOperations::CurveType aType;
switch(theInArray[i]) {
case GEOM::Polyline:
aType = GEOMImpl_ICurvesOperations::Polyline;
break;
case GEOM::Bezier:
aType = GEOMImpl_ICurvesOperations::Bezier;
break;
case GEOM::Interpolation:
aType = GEOMImpl_ICurvesOperations::Interpolation;
break;
default:
isOK = false;
break;
}
if (isOK) {
anOutArray->SetValue(i + 1, aType);
} else {
anOutArray.Nullify();
break;
}
}
return anOutArray;
}
//=============================================================================
/*!
* ConvertBoolArray
*/
//=============================================================================
Handle(TColStd_HArray1OfByte) GEOM_ICurvesOperations_i::ConvertBoolArray
(const GEOM::ListOfBool &theInArray)
{
Handle(TColStd_HArray1OfByte) anOutArray;
const int n = theInArray.length();
int i;
if (n <= 0) {
return anOutArray;
}
anOutArray = new TColStd_HArray1OfByte(1, n);
for (i = 0; i < n; i++) {
anOutArray->SetValue(i + 1, theInArray[i]);
}
return anOutArray;
}
//=============================================================================
/*!
* ConvertListListDouble
*/
//=============================================================================
void GEOM_ICurvesOperations_i::ConvertListListDouble
(const GEOM::ListOfListOfDouble &theInList,
std::list <std::list <double> > &theOutList)
{
const int n = theInList.length();
int i;
std::list <double> anEmptyList;
for (i = 0; i < n; i++) {
theOutList.push_back(anEmptyList);
const int m = theInList[i].length();
int j;
for (j = 0; j < m; j++) {
theOutList.back().push_back(theInList[i][j]);
}
}
}

View File

@ -112,8 +112,35 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i :
GEOM::GEOM_Object_ptr Make3DSketcher (const GEOM::ListOfDouble& theCoordinates);
GEOM::GEOM_Object_ptr MakePolyline2D
(const GEOM::ListOfListOfDouble &theCoordsList,
const GEOM::string_array &theNamesList,
const GEOM::short_array &theTypesList,
const GEOM::ListOfBool &theClosedList,
const GEOM::ListOfDouble &theWorkingPlane);
GEOM::GEOM_Object_ptr MakePolyline2DOnPlane
(const GEOM::ListOfListOfDouble &theCoordsList,
const GEOM::string_array &theNamesList,
const GEOM::short_array &theTypesList,
const GEOM::ListOfBool &theClosedList,
GEOM::GEOM_Object_ptr theWorkingPlane);
::GEOMImpl_ICurvesOperations* GetOperations()
{ return (::GEOMImpl_ICurvesOperations*)GetImpl(); }
private:
Handle(TColStd_HArray1OfByte)
ConvertEnumArray(const GEOM::short_array &theInArray);
Handle(TColStd_HArray1OfByte)
ConvertBoolArray(const GEOM::ListOfBool &theInArray);
void ConvertListListDouble
(const GEOM::ListOfListOfDouble &theCoordsList,
std::list <std::list <double> > &theCoords);
};
#endif

View File

@ -78,25 +78,6 @@ Handle(TColStd_HArray1OfInteger) GEOM_IHealingOperations_i::Convert
return anOutArray;
}
//=============================================================================
/*!
* Convert
*/
//=============================================================================
Handle(TColStd_HArray1OfExtendedString) GEOM_IHealingOperations_i::Convert
(const GEOM::string_array& theInArray)
{
Handle(TColStd_HArray1OfExtendedString) anOutArray;
int n = theInArray.length();
if ( n <= 0 )
return anOutArray;
anOutArray = new TColStd_HArray1OfExtendedString( 1, n );
for ( int i = 0; i < n; i++ )
anOutArray->SetValue( i+1, TCollection_ExtendedString( theInArray[i].in() ) );
return anOutArray;
}
//=============================================================================
/*!
* ProcessShape
@ -125,7 +106,8 @@ GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ProcessShape (GEOM::GEOM_Object
// Perform
Handle(GEOM_Object) aNewObject = GetOperations()->ShapeProcess( anObject,
Convert( theOperations ), Convert( theParams ), Convert( theValues ) );
ConvertStringArray( theOperations ), ConvertStringArray( theParams ),
ConvertStringArray( theValues ) );
if ( !GetOperations()->IsDone() || aNewObject.IsNull() )
return aGEOMObject._retn();

View File

@ -33,9 +33,6 @@
#include "GEOMImpl_IHealingOperations.hxx"
#include <TColStd_HArray1OfExtendedString.hxx>
#include <TColStd_HArray1OfInteger.hxx>
class GEOM_I_EXPORT GEOM_IHealingOperations_i :
public virtual POA_GEOM::GEOM_IHealingOperations,
public virtual GEOM_IOperations_i
@ -101,7 +98,6 @@ class GEOM_I_EXPORT GEOM_IHealingOperations_i :
::GEOMImpl_IHealingOperations* GetOperations() { return (::GEOMImpl_IHealingOperations*)GetImpl(); }
private:
Handle(TColStd_HArray1OfExtendedString) Convert( const GEOM::string_array& );
Handle(TColStd_HArray1OfInteger) Convert( const GEOM::short_array& );
};

View File

@ -237,3 +237,28 @@ void GEOM_IOperations_i::UpdateGUIForObject(GEOM::GEOM_Object_ptr theObj)
}
}
}
//=============================================================================
/*!
* ConvertStringArray
*/
//=============================================================================
Handle(TColStd_HArray1OfExtendedString) GEOM_IOperations_i::ConvertStringArray
(const GEOM::string_array &theInArray)
{
Handle(TColStd_HArray1OfExtendedString) anOutArray;
const int n = theInArray.length();
int i;
if (n <= 0) {
return anOutArray;
}
anOutArray = new TColStd_HArray1OfExtendedString( 1, n );
for (i = 0; i < n; i++) {
anOutArray->SetValue(i + 1, TCollection_ExtendedString(theInArray[i].in()));
}
return anOutArray;
}

View File

@ -52,9 +52,6 @@ class GEOM_I_EXPORT GEOM_IOperations_i : public virtual POA_GEOM::GEOM_IOperatio
virtual GEOM::GEOM_Object_ptr GetObject(Handle(GEOM_Object) theObject);
virtual Handle(GEOM_Object) GetObjectImpl(GEOM::GEOM_Object_ptr theObject);
virtual Handle(TColStd_HSequenceOfTransient)
GetListOfObjectsImpl(const GEOM::ListOfGO& theObjects);
virtual void StartOperation();
virtual void FinishOperation();
@ -66,6 +63,14 @@ class GEOM_I_EXPORT GEOM_IOperations_i : public virtual POA_GEOM::GEOM_IOperatio
virtual void UpdateGUIForObject(GEOM::GEOM_Object_ptr theObj);
protected:
Handle(TColStd_HSequenceOfTransient)
GetListOfObjectsImpl(const GEOM::ListOfGO& theObjects);
Handle(TColStd_HArray1OfExtendedString)
ConvertStringArray(const GEOM::string_array &theInArray);
private:
::GEOM_IOperations* _impl;

View File

@ -256,7 +256,7 @@ import math
import os
import functools
from salome.geom.gsketcher import Sketcher3D, Sketcher2D
from salome.geom.gsketcher import Sketcher3D, Sketcher2D, Polyline2D
# service function
def _toListOfNames(_names, _size=-1):
@ -2667,6 +2667,25 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
sk = Sketcher3D (self)
return sk
## Obtain a 2D polyline creation interface
# @return An instance of @ref gsketcher.Polyline2D "Polyline2D" interface
#
# @ref tui_3dsketcher_page "Example"
def Polyline2D (self):
"""
Obtain a 2D polyline creation interface.
Example of usage:
pl = geompy.Polyline2D()
pl.addSection("section 1", GEOM.Polyline, True)
pl.addPoints(0, 0, 10, 0, 10, 10)
pl.addSection("section 2", GEOM.Interpolation, False)
pl.addPoints(20, 0, 30, 0, 30, 10)
resultObj = pl.result(WorkingPlane)
"""
pl = Polyline2D (self)
return pl
# end of l3_sketcher
## @}

View File

@ -1211,3 +1211,145 @@ class Sketcher2D:
self.myCommand = "Sketcher"
self.geompyD._autoPublish(face, theName, "face")
return face
## An interface to build a 2D polyline step-by-step. The polyline can contain
# several sections. Each section represents a list of 2d points. As well it
# has a name, curve type, either polyline or interpolation (BSpline curve) and
# Closed flag.
# Use geompy.Polyline2D() method to obtain an instance of this class.
# @ingroup sketcher
class Polyline2D:
"""
An interface to build a 2D polyline step-by-step. The polyline can contain
several sections. Each section represents a list of 2d points. As well it
has a name, curve type, either polyline or interpolation (BSpline curve) and
Closed flag.
Use geompy.Polyline2D() method to obtain an instance of this class.
Example of usage:
pl = geompy.Polyline2D()
pl.addSection("section 1", GEOM.Polyline, True, [0, 0, 10, 0, 10, 10])
pl.addSection("section 2", GEOM.Interpolation, False)
pl.addPoints([20, 0, 30, 0, 30, 10])
resultObj = pl.result(WorkingPlane)
"""
def __init__(self, geompyD):
self.geompyD = geompyD
self.myNameList = []
self.myTypeList = []
self.myClosedList = []
self.myCoordsList = []
pass
## Add a new section to the polyline.
#
# @param theName the name
# @param theType the type. It can have either CORBA enumeration type
# GEOM.curve_type or a value of type long. Possible input values
# are: GEOM.Polyline(0) and GEOM.Interpolation(2).
# @param theClosed True for closed section; False otherwise
# @param thePoints the list of 2D points coordinates in the form:
# [x1, y1, x2, y2, ..., xN, yN] for N points.
def addSection(self, theName, theType, theClosed, thePoints = None):
"""
Add a new section to the polyline.
Parameters:
theName the name
theType the type. It can have either CORBA enumeration type
GEOM.curve_type or a value of type long. Possible input
values are: GEOM.Polyline(0) and GEOM.Interpolation(2).
theClosed True for closed section; False otherwise
thePoints the list of 2D points coordinates in the form:
[x1, y1, x2, y2, ..., xN, yN] for N points.
Example of usage:
pl = geompy.Polyline2D()
pl.addSection("section 1", GEOM.Polyline, True, [0, 0, 10, 0, 10, 10])
resultObj = pl.result(WorkingPlane)
"""
from salome.geom.geomBuilder import EnumToLong
self.myNameList.append(theName)
self.myTypeList.append(EnumToLong(theType))
self.myClosedList.append(theClosed)
if thePoints is None:
self.myCoordsList.append([])
else:
self.myCoordsList.append(thePoints)
pass
## Add a points to the last added section of the polyline. If there are
# no sections in the polyline it does nothing.
#
# @param thePoints the list of 2D points coordinates in the form:
# [x1, y1, x2, y2, ..., xN, yN] for N points.
def addPoints(self, thePoints):
"""
Add a points to the last added section of the polyline. If there are
no sections in the polyline it does nothing.
Parameters:
thePoints the list of 2D points coordinates in the form:
[x1, y1, x2, y2, ..., xN, yN] for N points.
Example of usage:
pl = geompy.Polyline2D()
pl.addSection("section 1", GEOM.Polyline, True)
pl.addPoints([0, 0, 10, 0, 10, 10])
pl.addPoints([20, 0, 30, 0, 30, 10])
resultObj = pl.result(WorkingPlane)
"""
if self.myNameList:
self.myCoordsList[-1].extend(thePoints)
pass
## Obtain the 2D polyline result as a wire or a compound of wires in case
# of several sections defined.
#
# @param theWorkingPlane - current Working Plane used for this 2D polyline
# @param theName Object name; when specified, this parameter is used
# for result publication in the study. Otherwise, if automatic
# publication is switched on, default value is used for result name.
#
# @return New GEOM_Object, containing the created shape.
def result(self, theWorkingPlane=[0, 0, 0, 0, 0, 1, 1, 0, 0], theName=None):
"""
Obtain the 2D polyline result as a wire or a compound of wires in case
of several sections defined.
Parameters:
theWorkingPlane current Working Plane used for this 2D polyline
theName Object name; when specified, this parameter is used
for result publication in the study. Otherwise, if automatic
publication is switched on, default value is used for result name.
Returns:
New GEOM_Object, containing the created shape.
Example of usage:
pl = geompy.Polyline2D()
pl.addSection("section 1", GEOM.Polyline, True, [0, 0, 10, 0, 10, 10])
pl.addSection("section 2", GEOM.Interpolation, False)
pl.addPoints([20, 0, 30, 0, 30, 10])
resultObj = pl.result(WorkingPlane)
"""
from salome.geom.geomBuilder import RaiseIfFailed
import GEOM
if isinstance(theWorkingPlane, list):
aResult = self.geompyD.CurvesOp.MakePolyline2D(
self.myCoordsList, self.myNameList, self.myTypeList,
self.myClosedList, theWorkingPlane)
if isinstance(theWorkingPlane, GEOM._objref_GEOM_Object):
aResult = self.geompyD.CurvesOp.MakePolyline2DOnPlane(
self.myCoordsList, self.myNameList, self.myTypeList,
self.myClosedList, theWorkingPlane)
self.myNameList = []
self.myTypeList = []
self.myClosedList = []
self.myCoordsList = []
RaiseIfFailed("Polyline2D.result", self.geompyD.CurvesOp)
self.geompyD._autoPublish(aResult, theName, "polyline")
return aResult

View File

@ -45,11 +45,6 @@ INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR}
)
IF(SALOME_GEOM_DEBUG_CC)
# for debug purposes, to be removed
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/CurveCreator)
ENDIF()
# additional preprocessor / compiler flags
ADD_DEFINITIONS(
${CAS_DEFINITIONS}
@ -61,10 +56,6 @@ ADD_DEFINITIONS(
SET(_link_LIBRARIES
GEOMBase
)
IF(SALOME_GEOM_DEBUG_CC)
# for debug purposes, to be removed
LIST(APPEND _link_LIBRARIES CurveCreator)
ENDIF()
# --- resources ---

View File

@ -27,15 +27,8 @@
#include <GeometryGUI.h>
#include "GeometryGUI_Operations.h"
#include <SUIT_Session.h>
#include <SUIT_Desktop.h>
#include <SUIT_ViewManager.h>
#include <SalomeApp_Application.h>
#include <OCCViewer_ViewWindow.h>
#include <TopTools_MapOfShape.hxx>
#include <TopExp_Explorer.hxx>
#include <Precision.hxx>
#include "OperationGUI_PartitionDlg.h" // Method PARTITION
#include "OperationGUI_ArchimedeDlg.h" // Method ARCHIMEDE
@ -47,13 +40,6 @@
#include "OperationGUI_GetSharedShapesDlg.h"
#include "OperationGUI_ExtrudedFeatureDlg.h" // Methods EXTRUDED BOSS / CUT
#ifdef DEBUG_CURVE_CREATOR
// for debug purposes, to be removed
#include "CurveCreator_Widget.h"
#include <QVBoxLayout>
#include <QPushButton>
#endif
//=======================================================================
// function : OperationGUI()
// purpose : Constructor
@ -95,36 +81,6 @@ bool OperationGUI::OnGUIEvent (int theCommandID, SUIT_Desktop* parent)
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 DEBUG_CURVE_CREATOR
// for debug purposes, to be removed
case GEOMOp::OpCurveCreator:
{
static CurveCreator_Curve *aStaticCurve = NULL;
if (aStaticCurve == NULL) {
aStaticCurve = new CurveCreator_Curve(CurveCreator::Dim2d);
}
if (CurveCreator::Dim2d == aStaticCurve->getDimension()) {
OCCViewer_ViewWindow* vw = (OCCViewer_ViewWindow*)getGeometryGUI()->getApp()->activeViewManager()->getActiveView();
vw->onTopView();
}
QDialog *aDialog = new QDialog(parent);
QVBoxLayout *aMainLO = new QVBoxLayout;
QPushButton *aQuitButton = new QPushButton(tr("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));
}

View File

@ -43,13 +43,16 @@ SET(_link_LIBRARIES
# --- headers ---
SET(SKETCHER_HEADERS
Sketcher.hxx
Sketcher_Profile.hxx
Sketcher_Utils.hxx
)
# --- sources ---
SET(SKETCHER_SOURCES
Sketcher_Profile.cxx
Sketcher_Utils.cxx
)
# --- rules ---

View File

@ -1,4 +1,7 @@
// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
// Copyright (C) 2007-2014 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
@ -17,25 +20,20 @@
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#ifndef CURVE_CREATOR_LISTENER_HXX
#define CURVE_CREATOR_LISTENER_HXX
// File : Sketcher.hxx
// Author : Sergey KHROMOV
class CurveCreator_Listener
{
public:
CurveCreator_Listener(void){};
virtual ~CurveCreator_Listener(void){};
#ifndef _SKETCHER_HXX_
#define _SKETCHER_HXX_
virtual void pointChanged( int theSection, int thePoint ){}
virtual void pointRemoved( int theSection, int theFirstPoint, int thePointCnt ){}
virtual void pointInserted( int theSection, int theIndx ){}
#if defined WIN32
# if defined SKETCHER_SALOME_EXPORTS || defined SKETCHER_EXPORTS || defined GEOMSketcher_EXPORTS || defined GEOMSKETCHER_EXPORTS
# define SKETCHER_SALOME_EXPORT _declspec( dllexport )
# else
# define SKETCHER_SALOME_EXPORT _declspec( dllimport )
# endif
#else
# define SKETCHER_SALOME_EXPORT
#endif
virtual void sectionClosed( int theSection, bool isClosed ){}
virtual void sectionAdded( int theSection ){}
virtual void sectionRemoved( int theSection ){}
virtual void sectionTypeChanged( int theSection ){}
virtual void curveChanged(){}
};
#endif
#endif // SKETCHER_HXX

View File

@ -23,16 +23,12 @@
// File : Sketcher_Profile.h
// Author : Damien COQUERET
#if defined WIN32
# if defined SKETCHER_SALOME_EXPORTS || defined SKETCHER_EXPORTS || defined GEOMSketcher_EXPORTS || defined GEOMSKETCHER_EXPORTS
# define SKETCHER_SALOME_EXPORT _declspec( dllexport )
# else
# define SKETCHER_SALOME_EXPORT _declspec( dllimport )
# endif
#else
# define SKETCHER_SALOME_EXPORT
#endif
#ifndef _Sketcher_Profile_HXX_
#define _Sketcher_Profile_HXX_
#include "Sketcher.hxx"
#include <TopoDS_Shape.hxx>
#include <TCollection_AsciiString.hxx>
#include <TColStd_Array1OfAsciiString.hxx>
@ -63,3 +59,5 @@ private:
private:
TCollection_AsciiString myCommand;
};
#endif

View File

@ -0,0 +1,187 @@
// Copyright (C) 2007-2014 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, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : Sketcher_Utils.cxx
// Author : Sergey KHROMOV
// Module : GEOM
#include "Sketcher_Utils.hxx"
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <ElSLib.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <TColgp_HArray1OfPnt.hxx>
#include <TopoDS_Wire.hxx>
const double POINT_CONFUSION_TOLERANCE = 0.0001;
//=======================================================================
// function : MakePolyline
// purpose :
//=======================================================================
TopoDS_Shape Sketcher_Utils::MakePolyline
(const std::list <double> &theCoords2D,
const Standard_Boolean IsClosed,
const gp_Ax3 &thePlane)
{
std::list <gp_Pnt> aPoints;
TopoDS_Shape aResult;
To3D(theCoords2D, thePlane, aPoints);
Standard_Integer aNbPnts = aPoints.size();
if (aNbPnts > 1) {
if (IsClosed &&
aPoints.front().IsEqual(aPoints.back(), POINT_CONFUSION_TOLERANCE)) {
// The polyline should be closed, first and last points are confused.
// Remove the last point.
aPoints.pop_back();
--aNbPnts;
}
}
if (aNbPnts == 1) {
// The result is vertex.
aResult = BRepBuilderAPI_MakeVertex(aPoints.front()).Vertex();
} else if (aNbPnts > 1) {
// There are several points. Make a polyline.
std::list <gp_Pnt>::const_iterator anIter = aPoints.begin();
TopoDS_Vertex aVtxFirst =
BRepBuilderAPI_MakeVertex(*anIter).Vertex();
TopoDS_Vertex aVtx[2];
TopoDS_Edge aSegment;
BRepBuilderAPI_MakeWire aMkWire;
aVtx[0] = aVtxFirst;
for (++anIter; anIter != aPoints.end(); ++anIter) {
aVtx[1] = BRepBuilderAPI_MakeVertex(*anIter).Vertex();
aSegment = BRepBuilderAPI_MakeEdge(aVtx[0], aVtx[1]).Edge();
aMkWire.Add(aSegment);
aVtx[0] = aVtx[1];
}
if (IsClosed) {
// Create a closing segment.
aSegment = BRepBuilderAPI_MakeEdge(aVtx[0], aVtxFirst).Edge();
aMkWire.Add(aSegment);
}
aResult = aMkWire.Wire();
}
return aResult;
}
//=======================================================================
// function : MakeInterpolation
// purpose :
//=======================================================================
TopoDS_Shape Sketcher_Utils::MakeInterpolation
(const std::list <double> &theCoords2D,
const Standard_Boolean IsClosed,
const gp_Ax3 &thePlane)
{
std::list <gp_Pnt> aPoints;
TopoDS_Shape aResult;
To3D(theCoords2D, thePlane, aPoints);
Standard_Integer aNbPnts = aPoints.size();
if (aNbPnts > 1) {
if (IsClosed &&
aPoints.front().IsEqual(aPoints.back(), POINT_CONFUSION_TOLERANCE)) {
// The polyline should be closed, first and last points are confused.
// Remove the last point.
aPoints.pop_back();
--aNbPnts;
}
}
if (aNbPnts == 1) {
// The result is vertex.
aResult = BRepBuilderAPI_MakeVertex(aPoints.front()).Vertex();
} else if (aNbPnts > 1) {
std::list <gp_Pnt>::const_iterator anIter = aPoints.begin();
Handle(TColgp_HArray1OfPnt) aHCurvePoints =
new TColgp_HArray1OfPnt(1, aNbPnts);
Standard_Integer i;
for (i = 1; anIter != aPoints.end(); ++anIter, ++i) {
aHCurvePoints->SetValue(i, *anIter);
}
// Compute BSpline
Standard_Real aTol = Precision::Confusion();
GeomAPI_Interpolate aGBC(aHCurvePoints, IsClosed, aTol);
aGBC.Perform();
if (aGBC.IsDone()) {
TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(aGBC.Curve()).Edge();
aResult = BRepBuilderAPI_MakeWire(anEdge).Wire();
}
}
return aResult;
}
//=======================================================================
// function : To3D
// purpose :
//=======================================================================
void Sketcher_Utils::To3D(const std::list <double> &theCoords2D,
const gp_Ax3 &thePlane,
std::list <gp_Pnt> &thePoints)
{
thePoints.clear();
if (theCoords2D.empty() || theCoords2D.size() % 2 == 1) {
// Odd number of coordinates or empty list. Invalid case.
return;
}
std::list <double>::const_iterator anIter = theCoords2D.begin();
Standard_Real aX = *anIter;
Standard_Real aY = *(++anIter);
gp_Pnt aPLast = ElSLib::PlaneValue (aX, aY, thePlane);
gp_Pnt aPnt;
thePoints.push_back(aPLast);
for (++anIter; anIter != theCoords2D.end(); ++anIter) {
aX = *anIter;
aY = *(++anIter);
aPnt = ElSLib::PlaneValue (aX, aY, thePlane);
if (!aPLast.IsEqual(aPnt, POINT_CONFUSION_TOLERANCE)) {
thePoints.push_back(aPnt);
aPLast = aPnt;
}
}
}

View File

@ -0,0 +1,103 @@
// Copyright (C) 2007-2014 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, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : Sketcher_Utils.h
// Author : Sergey KHROMOV
#ifndef _Sketcher_Utils_HXX_
#define _Sketcher_Utils_HXX_
#include "Sketcher.hxx"
#include <gp_Pnt.hxx>
#include <TopoDS_Shape.hxx>
#include <list>
class gp_Ax3;
/**
* This class represents a set of utils needed to compute sketcher geometry.
*/
class SKETCHER_SALOME_EXPORT Sketcher_Utils
{
public:
/**
* This method makes a shape from the list of 2D coordinates on the working
* plane. The result represents a vertex if there is only one point
* in the contour. If there are more then one points the result is a wire
* consisting of linear segments between points. It is either closed or not
* depending on the flag IsClosed. In case of failure the result is a null
* shape.
*
* \param theCoords2D is the list of coordinates in the form x1, y1, x2, y2,
* ..., xN, yN for N 2D points.
* \param IsClosed if Standard_True the first and last points are connected
* to form the closed contour.
* \param thePlane the working plane coordinate system.
* \return the result polyline.
*/
static TopoDS_Shape MakePolyline(const std::list <double> &theCoords2D,
const Standard_Boolean IsClosed,
const gp_Ax3 &thePlane);
/**
* This method makes a shape from the list of 2D coordinates on the working
* plane. The result represents a vertex if there is only one point
* in the contour. If there are more then one points the result is a wire
* consisting of a points interpolation BSpline curve. It is either closed
* or not depending on the flag IsClosed. In case of failure the result is
* a null shape.
*
* \param theCoords2D is the list of coordinates in the form x1, y1, x2, y2,
* ..., xN, yN for N 2D points.
* \param IsClosed if Standard_True the first and last points are connected
* to form the closed contour.
* \param thePlane the working plane coordinate system.
* \return the result interpolation wire.
*/
static TopoDS_Shape MakeInterpolation(const std::list <double> &theCoords2D,
const Standard_Boolean IsClosed,
const gp_Ax3 &thePlane);
/**
* This method converts the list of 2D point coordinates into 3D points
* basing on the working plane. The result list contains not confused points.
*
* \param theCoords2D is the list of coordinates in the form x1, y1, x2, y2,
* ..., xN, yN for N 2D points.
* \param thePlane the working plane coordinate system.
* \param thePoints the list of 3D points.
*/
static void To3D(const std::list <double> &theCoords2D,
const gp_Ax3 &thePlane,
std::list <gp_Pnt> &thePoints);
};
#endif