Old development made for salome Hydro:

To allow to move points on spline curve
curveCreator :: allow selection of points of selected polyline(s) only
This commit is contained in:
YOANN AUDOUIN 2021-02-05 10:17:39 +01:00
parent 4048b73d92
commit 656de216bc
22 changed files with 626 additions and 122 deletions

View File

@ -267,6 +267,7 @@ SET( _res_files
propagate.png propagate.png
redo.png redo.png
undo.png undo.png
setcolor.png
glue2.png glue2.png
remove_webs.png remove_webs.png
remove_extra_edges.png remove_extra_edges.png

BIN
resources/setcolor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

View File

@ -26,7 +26,7 @@ ENDIF(SALOME_BUILD_GUI)
# additional include directories # additional include directories
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
${PTHREAD_INCLUDE_DIR} ${PTHREAD_INCLUDE_DIR}
${OpenCASCADE_INCLUDE_DIR} ${CAS_INCLUDE_DIR}
${KERNEL_INCLUDE_DIRS} ${KERNEL_INCLUDE_DIRS}
${GUI_INCLUDE_DIRS} ${GUI_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}/src/GEOMUtils ${PROJECT_SOURCE_DIR}/src/GEOMUtils
@ -34,12 +34,15 @@ INCLUDE_DIRECTORIES(
# additional preprocessor / compiler flags # additional preprocessor / compiler flags
ADD_DEFINITIONS( ADD_DEFINITIONS(
${CAS_DEFINITIONS}
${OpenCASCADE_DEFINITIONS} ${OpenCASCADE_DEFINITIONS}
${QT_DEFINITIONS} ${QT_DEFINITIONS}
) )
# libraries to link to # libraries to link to
SET(_link_LIBRARIES SET(_link_LIBRARIES
${CAS_KERNEL}
${CAS_TKernel}
GEOMUtils GEOMUtils
) )
IF(SALOME_BUILD_GUI) IF(SALOME_BUILD_GUI)
@ -66,6 +69,7 @@ ENDIF(SALOME_BUILD_GUI)
SET(_other_HEADERS SET(_other_HEADERS
CurveCreator.hxx CurveCreator.hxx
CurveCreator_Curve.hxx CurveCreator_Curve.hxx
CurveCreator_ShapeFilter.hxx
CurveCreator_Diff.hxx CurveCreator_Diff.hxx
CurveCreator_Displayer.hxx CurveCreator_Displayer.hxx
CurveCreator_ICurve.hxx CurveCreator_ICurve.hxx
@ -92,6 +96,7 @@ SET(_other_SOURCES
CurveCreator_Curve.cxx CurveCreator_Curve.cxx
CurveCreator_Diff.cxx CurveCreator_Diff.cxx
CurveCreator_Displayer.cxx CurveCreator_Displayer.cxx
CurveCreator_ShapeFilter.cxx
CurveCreator_Operation.cxx CurveCreator_Operation.cxx
CurveCreator_Section.cxx CurveCreator_Section.cxx
CurveCreator_Utils.cxx CurveCreator_Utils.cxx

View File

@ -31,11 +31,14 @@
#include <AIS_Shape.hxx> #include <AIS_Shape.hxx>
#include <AIS_InteractiveObject.hxx> #include <AIS_InteractiveObject.hxx>
#include <Geom_CartesianPoint.hxx> #include <Geom_CartesianPoint.hxx>
#include <TopoDS_Iterator.hxx>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <gp_Lin.hxx> #include <gp_Lin.hxx>
#include <TopoDS_Edge.hxx> #include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx> #include <TopoDS_Face.hxx>
#include <TopoDS_Wire.hxx> #include <TopoDS_Wire.hxx>
#include <TopoDS_Shape.hxx>
#include <AIS_ColoredShape.hxx>
#include <Prs3d_PointAspect.hxx> #include <Prs3d_PointAspect.hxx>
#include <iostream> #include <iostream>
@ -53,7 +56,7 @@ CurveCreator_Curve::CurveCreator_Curve( const CurveCreator::Dimension theDimensi
myDimension (theDimension), myDimension (theDimension),
myDisplayer (NULL), myDisplayer (NULL),
myPointAspectColor (Quantity_NOC_ROYALBLUE4), myPointAspectColor (Quantity_NOC_ROYALBLUE4),
myCurveColor (Quantity_NOC_RED), //myCurveColor (Quantity_NOC_RED),
myLineWidth (1), myLineWidth (1),
myNbUndos (0), myNbUndos (0),
myNbRedos (0), myNbRedos (0),
@ -480,7 +483,8 @@ int CurveCreator_Curve::getNbSections() const
//! For internal use only! Undo/Redo are not used here. //! For internal use only! Undo/Redo are not used here.
int CurveCreator_Curve::addSectionInternal int CurveCreator_Curve::addSectionInternal
(const std::string& theName, const CurveCreator::SectionType theType, (const std::string& theName, const CurveCreator::SectionType theType,
const bool theIsClosed, const CurveCreator::Coordinates &thePoints) const bool theIsClosed, const CurveCreator::Coordinates &thePoints,
const Quantity_Color& aColor)
{ {
CurveCreator_Section *aSection = new CurveCreator_Section; CurveCreator_Section *aSection = new CurveCreator_Section;
@ -492,6 +496,7 @@ int CurveCreator_Curve::addSectionInternal
aSection->myType = theType; aSection->myType = theType;
aSection->myIsClosed = theIsClosed; aSection->myIsClosed = theIsClosed;
aSection->myPoints = thePoints; aSection->myPoints = thePoints;
aSection->myColor = aColor;//getRandColor(); //TODO temp
mySections.push_back(aSection); mySections.push_back(aSection);
redisplayCurve(false); redisplayCurve(false);
return mySections.size()-1; return mySections.size()-1;
@ -514,7 +519,9 @@ int CurveCreator_Curve::addSection
theName, aCoords, theType, theIsClosed); theName, aCoords, theType, theIsClosed);
} }
resISection = addSectionInternal(theName, theType, theIsClosed, aCoords); Quantity_Color aRColor = CurveCreator_Utils::getRandColor();
resISection = addSectionInternal(theName, theType, theIsClosed, aCoords, aRColor);
finishOperation(); finishOperation();
return resISection; return resISection;
@ -535,7 +542,7 @@ int CurveCreator_Curve::addSection
theName, thePoints, theType, theIsClosed); theName, thePoints, theType, theIsClosed);
} }
resISection = addSectionInternal(theName, theType, theIsClosed, thePoints); resISection = addSectionInternal(theName, theType, theIsClosed, thePoints, Quantity_NOC_YELLOW);
finishOperation(); finishOperation();
return resISection; return resISection;
@ -545,11 +552,14 @@ int CurveCreator_Curve::addSection
bool CurveCreator_Curve::removeSectionInternal( const int theISection ) bool CurveCreator_Curve::removeSectionInternal( const int theISection )
{ {
if (theISection == -1) { if (theISection == -1) {
myRemColors.push_back(mySections.back()->myColor);
delete mySections.back(); delete mySections.back();
mySections.pop_back(); mySections.pop_back();
} else { } else {
CurveCreator::Sections::iterator anIterRm = mySections.begin() + theISection; CurveCreator::Sections::iterator anIterRm = mySections.begin() + theISection;
myRemColors.push_back((*anIterRm)->myColor);
delete *anIterRm; delete *anIterRm;
mySections.erase(anIterRm); mySections.erase(anIterRm);
} }
@ -572,6 +582,49 @@ bool CurveCreator_Curve::removeSection( const int theISection )
return res; return res;
} }
bool CurveCreator_Curve::setColorSection( int SectInd, Quantity_Color theNewColor )
{
bool res = false;
// Set the difference.
startOperation();
int ColorParam[3] = { (int)( theNewColor.Red() * 255 ),
(int)( theNewColor.Green() * 255 ),
(int)( theNewColor.Blue() * 255 ) };
if (addEmptyDiff())
myListDiffs.back().init(this, CurveCreator_Operation::SetColorSection, SectInd, ColorParam);
setColorSectionInternal(SectInd, theNewColor);
finishOperation();
return res;
}
void CurveCreator_Curve::setColorSectionInternal( int SectInd, Quantity_Color theNewColor )
{
CurveCreator_Section* aSec = (CurveCreator_Section*)(getSection(SectInd));
aSec->myColor = theNewColor;
redisplayCurve(false);
}
Quantity_Color CurveCreator_Curve::getColorSection( int SectInd ) const
{
CurveCreator_Section* aSec = (CurveCreator_Section*)(getSection(SectInd));
return aSec->myColor;
}
Quantity_Color CurveCreator_Curve::getLastRemovedColor() const
{
return myRemColors.empty() ? Quantity_NOC_BLACK : myRemColors.back();
}
void CurveCreator_Curve::popLastRemovedColor()
{
myRemColors.pop_back();
}
/** /**
* Get number of points in specified section or (the total number of points * Get number of points in specified section or (the total number of points
* in Curve if theISection is equal to -1). * in Curve if theISection is equal to -1).
@ -1016,9 +1069,28 @@ void CurveCreator_Curve::constructAISObject()
{ {
//DEBTRACE("constructAISObject"); //DEBTRACE("constructAISObject");
TopoDS_Shape aShape; TopoDS_Shape aShape;
CurveCreator_Utils::constructShape( this, aShape ); mySect2Shape.Clear();
myAISShape = new AIS_Shape( aShape ); CurveCreator_Utils::constructShape( this, aShape, &mySect2Shape );
myAISShape->SetColor( myCurveColor ); myAISShape = new AIS_ColoredShape( aShape );
AIS_ColoredShape* AISColoredShape = dynamic_cast<AIS_ColoredShape*>(myAISShape);
std::map<int, TopoDS_Shape>::iterator it;
//for ( it = mySect2Shape.begin(); it != mySect2Shape.end(); it++ )
for (int i = 1; i <= mySect2Shape.Extent(); i++ )
{
CurveCreator_Section* aSect = (CurveCreator_Section*)getSection(mySect2Shape.FindKey(i));
Quantity_Color aColor = aSect->myColor;
const TopoDS_Shape& aShape = mySect2Shape.FindFromIndex(i); //should contain: one wire + vertices
TopoDS_Iterator it(aShape);
for (;it.More();it.Next())
{
if (it.Value().ShapeType() == TopAbs_WIRE)
AISColoredShape->SetCustomColor(it.Value(), aColor);
}
}
// myAISShape->SetColor( myCurveColor );
myAISShape->SetWidth( myLineWidth ); myAISShape->SetWidth( myLineWidth );
Handle(Prs3d_PointAspect) anAspect = myAISShape->Attributes()->PointAspect(); Handle(Prs3d_PointAspect) anAspect = myAISShape->Attributes()->PointAspect();
anAspect->SetScale( 3.0 ); anAspect->SetScale( 3.0 );

View File

@ -31,12 +31,14 @@
#include <list> #include <list>
#include <map> #include <map>
#include <NCollection_IndexedDataMap.hxx>
struct CurveCreator_Section; struct CurveCreator_Section;
class CurveCreator_Displayer; class CurveCreator_Displayer;
class AIS_Shape; class AIS_Shape;
class AIS_InteractiveObject; class AIS_InteractiveObject;
class Quantity_Color; class Quantity_Color;
class TopoDS_Shape;
/** /**
* The CurveCreator_Curve object is represented as one or more sets of * The CurveCreator_Curve object is represented as one or more sets of
@ -108,7 +110,7 @@ protected:
public: // TODO: remove public public: // TODO: remove public
void getCoordinates( int theISection, int theIPoint, double& theX, double& theY, double& theZ ) const; void getCoordinates( int theISection, int theIPoint, double& theX, double& theY, double& theZ ) const;
protected: // TODO: remove public protected: // TODO
void redisplayCurve(bool preEraseAllObjects = true); void redisplayCurve(bool preEraseAllObjects = true);
public: public:
@ -162,7 +164,8 @@ public:
virtual int addSectionInternal( const std::string &theName, virtual int addSectionInternal( const std::string &theName,
const CurveCreator::SectionType theType, const CurveCreator::SectionType theType,
const bool theIsClosed, const bool theIsClosed,
const CurveCreator::Coordinates &thePoints); const CurveCreator::Coordinates &thePoints,
const Quantity_Color& aColor);
//! Add a new section. //! Add a new section.
virtual int addSection( const std::string &theName, virtual int addSection( const std::string &theName,
const CurveCreator::SectionType theType, const CurveCreator::SectionType theType,
@ -191,6 +194,19 @@ public:
virtual bool setClosed( const int theISection, virtual bool setClosed( const int theISection,
const bool theIsClosed ); const bool theIsClosed );
//! Sets color of section by index
virtual bool setColorSection( int SectInd, Quantity_Color theNewColor );
//! For internal use only! Undo/Redo are not used here.
virtual void setColorSectionInternal( int SectInd, Quantity_Color theNewColor );
virtual Quantity_Color getLastRemovedColor() const;
virtual void popLastRemovedColor();
//! Gets color of section by index
virtual Quantity_Color getColorSection( int SectInd ) const;
//! Returns specifyed section name //! Returns specifyed section name
virtual std::string getSectionName( const int theISection ) const; virtual std::string getSectionName( const int theISection ) const;
@ -327,6 +343,7 @@ protected:
protected: protected:
bool mySkipSorting; bool mySkipSorting;
AIS_Shape* myAISShape; //!< AIS shape
public: public:
bool myIsLocked; bool myIsLocked;
@ -334,8 +351,10 @@ public:
CurveCreator::Dimension myDimension; //!< curve dimension CurveCreator::Dimension myDimension; //!< curve dimension
CurveCreator_Displayer* myDisplayer; //!< curve displayer CurveCreator_Displayer* myDisplayer; //!< curve displayer
Quantity_Color myPointAspectColor; Quantity_Color myPointAspectColor;
Quantity_Color myCurveColor; //Quantity_Color myCurveColor;
double myLineWidth; double myLineWidth;
NCollection_IndexedDataMap<int, TopoDS_Shape> mySect2Shape;
std::vector<int> myCurSectInd;
private: private:
@ -345,8 +364,8 @@ private:
ListDiff myListDiffs; ListDiff myListDiffs;
int myUndoDepth; int myUndoDepth;
int myOpLevel; int myOpLevel;
AIS_Shape* myAISShape; //!< AIS shape
bool myEraseAll; bool myEraseAll;
std::vector<Quantity_Color> myRemColors;
}; };
#endif #endif

View File

@ -22,6 +22,8 @@
#include "CurveCreator_Diff.hxx" #include "CurveCreator_Diff.hxx"
#include "CurveCreator_Curve.hxx" #include "CurveCreator_Curve.hxx"
#include "CurveCreator_Section.hxx"
#include "CurveCreator_Utils.hxx"
#include <list> #include <list>
@ -171,6 +173,36 @@ bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
return isOK; return isOK;
} }
bool CurveCreator_Diff::init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType,
const int theIntParam1,
const int theIntParam2[3])
{
bool isOK = false;
if (theCurve != NULL)
{
clear();
myPRedo = new CurveCreator_Operation;
if (myPRedo->init(theType, theIntParam1, theIntParam2))
{
Quantity_Color aColor = theCurve->getColorSection(theIntParam1);
setNbUndos(1);
QColor aQColor = CurveCreator_Utils::colorConv(aColor);
int colorArr[3] = {aQColor.red(),aQColor.green(), aQColor.blue()};
isOK = myPUndo[0].init(theType, theIntParam1, colorArr);
}
if (!isOK)
clear();
}
return isOK;
}
//======================================================================= //=======================================================================
// function: init // function: init
// purpose: // purpose:

View File

@ -157,6 +157,20 @@ public:
bool init(const CurveCreator_Curve *theCurve, bool init(const CurveCreator_Curve *theCurve,
const CurveCreator_ICurve::SectionToPointCoordsList &theOldParamList); const CurveCreator_ICurve::SectionToPointCoordsList &theOldParamList);
/**
* This method initializes the difference with an operation with one
* integer and one array of integer[3] parameters.
* It is applicable to the following operations:
* <UL>
* <LI>ColorSection</LI>
* </UL>
*/
bool init(const CurveCreator_Curve *theCurve,
const CurveCreator_Operation::Type theType,
const int theIntParam1,
const int theIntParam2[3]);
/** /**
* This method applies undo operation to theCurve. * This method applies undo operation to theCurve.
*/ */

View File

@ -40,6 +40,12 @@ public:
void eraseAll( bool isUpdate ); void eraseAll( bool isUpdate );
void erase( const Handle(AIS_InteractiveObject)& theObject, bool isUpdate ); void erase( const Handle(AIS_InteractiveObject)& theObject, bool isUpdate );
void Update(); void Update();
Handle(AIS_InteractiveContext) getContext()
{
return myContext;
}
//void highlight( const AISObjectsList& theObjects, bool isHL ); //void highlight( const AISObjectsList& theObjects, bool isHL );
protected: protected:

View File

@ -23,6 +23,9 @@
#include "CurveCreator_Operation.hxx" #include "CurveCreator_Operation.hxx"
#include "CurveCreator_Curve.hxx" #include "CurveCreator_Curve.hxx"
#include "CurveCreator.hxx" #include "CurveCreator.hxx"
#include "CurveCreator_Section.hxx"
#include "CurveCreator_Utils.hxx"
#include <QColor>
#include <string> #include <string>
#include <stdlib.h> #include <stdlib.h>
@ -114,6 +117,28 @@ bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
return isOK; return isOK;
} }
bool CurveCreator_Operation::init(const CurveCreator_Operation::Type theType,
const int theIntParam1,
const int theIntParam2[3])
{
bool isOK = false;
if (theType == CurveCreator_Operation::SetColorSection)
{
int *pData = (int *)allocate(4*sizeof(int));
pData[0] = theIntParam1;
pData[1] = theIntParam2[0];
pData[2] = theIntParam2[1];
pData[3] = theIntParam2[2];
myType = theType;
isOK = true;
}
return isOK;
}
//======================================================================= //=======================================================================
// function: Constructor // function: Constructor
// purpose: // purpose:
@ -416,7 +441,9 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve)
char* aPtr = ((char*)&pInt[2]); char* aPtr = ((char*)&pInt[2]);
aPtr += (aName.length()) + 1; aPtr += (aName.length()) + 1;
getCoords((int*)aPtr, aCoords); getCoords((int*)aPtr, aCoords);
theCurve->addSectionInternal(aName, aType, (pInt[1] != 0), aCoords); Quantity_Color aLastColor = theCurve->getLastRemovedColor();
theCurve->popLastRemovedColor();
theCurve->addSectionInternal(aName, aType, (pInt[1] != 0), aCoords, aLastColor);
} }
break; break;
case CurveCreator_Operation::RemoveSection: case CurveCreator_Operation::RemoveSection:
@ -428,6 +455,13 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve)
theCurve->setSectionNameInternal(pInt[0], aName); theCurve->setSectionNameInternal(pInt[0], aName);
} }
break; break;
case CurveCreator_Operation::SetColorSection:
{
Quantity_Color aColor = CurveCreator_Utils::colorConv(QColor(pInt[1], pInt[2], pInt[3]));
theCurve->setColorSectionInternal(pInt[0], aColor);
//theCurve->redisplayCurve(false);
}
break;
default: default:
break; break;
} }

View File

@ -59,7 +59,8 @@ public:
Join, //!< Method CurveCreator_Curve::join Join, //!< Method CurveCreator_Curve::join
AddSection, //!< Method CurveCreator_Curve::addSection AddSection, //!< Method CurveCreator_Curve::addSection
RemoveSection, //!< Method CurveCreator_Curve::removeSection RemoveSection, //!< Method CurveCreator_Curve::removeSection
RenameSection //!< Method CurveCreator_Curve::renameSection RenameSection, //!< Method CurveCreator_Curve::renameSection
SetColorSection //!< Method CurveCreator_Curve::setColorSection
}; };
/** /**
@ -106,6 +107,14 @@ public:
bool init(const Type theType, const int theIntParam1, bool init(const Type theType, const int theIntParam1,
const int theIntParam2); const int theIntParam2);
/**
* This method initializes the object with an operation with 4 integer
* parameter (1 as first param + 3 as interger array)
*/
bool init(const Type theType, const int theIntParam1,
const int theIntParam2[3]);
/** /**
* This method initializes the object with an operation with two integer * This method initializes the object with an operation with two integer
* parameters. It is applicable to the following operations: * parameters. It is applicable to the following operations:

View File

@ -33,13 +33,15 @@ struct CURVECREATOR_EXPORT CurveCreator_Section :
public CurveCreator_ISection public CurveCreator_ISection
{ {
//! Constructor. Initializes object with default values. //! Constructor. Initializes object with default values.
CurveCreator_Section() : myName("Section"),myType(CurveCreator::Polyline), myIsClosed(false) CurveCreator_Section() : myName("Section"),myType(CurveCreator::Polyline),
myIsClosed(false), myColor (Quantity_NOC_RED)
{ } { }
std::string myName; //!< section name std::string myName; //!< section name
CurveCreator::Coordinates myPoints; //!< points coordinates CurveCreator::Coordinates myPoints; //!< points coordinates
CurveCreator::SectionType myType; //!< type of the section CurveCreator::SectionType myType; //!< type of the section
bool myIsClosed; //!< closed or not bool myIsClosed; //!< closed or not
Quantity_Color myColor; //!< color of section
//! A virtual method. //! A virtual method.
Handle(TColgp_HArray1OfPnt) GetDifferentPoints( int theDimension ) const; Handle(TColgp_HArray1OfPnt) GetDifferentPoints( int theDimension ) const;

View File

@ -0,0 +1,74 @@
// Copyright (C) 2013-2019 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_ShapeFilter.cxx
// Author: Ilya Shchekin
#include "CurveCreator_ShapeFilter.hxx"
#include <SelectMgr_EntityOwner.hxx>
#include <StdSelect_BRepOwner.hxx>
#include <TopoDS_Vertex.hxx>
IMPLEMENT_STANDARD_RTTIEXT(CurveCreator_ShapeFilter,SelectMgr_Filter)
CurveCreator_ShapeFilter::CurveCreator_ShapeFilter()
: SelectMgr_Filter()
{
}
CurveCreator_ShapeFilter::~CurveCreator_ShapeFilter()
{
}
Standard_Boolean CurveCreator_ShapeFilter::ActsOn(const TopAbs_ShapeEnum aType) const
{
return (aType == TopAbs_VERTEX);
}
Standard_Boolean CurveCreator_ShapeFilter::IsOk(const Handle(SelectMgr_EntityOwner)& EO) const
{
Handle(StdSelect_BRepOwner) aBO = Handle(StdSelect_BRepOwner)::DownCast(EO);
if (aBO.IsNull())
return Standard_False;
const TopoDS_Shape& aShape = aBO->Shape();
if(aShape.ShapeType()!= TopAbs_VERTEX)
return Standard_False;
return myShapes.Contains(aShape);
}
void CurveCreator_ShapeFilter::AddShape(const TopoDS_Shape& aShape)
{
myShapes.Add(aShape);
}
void CurveCreator_ShapeFilter::RemoveShape(const TopoDS_Shape& aShape)
{
myShapes.Remove(aShape);
}
void CurveCreator_ShapeFilter::ClearShapes()
{
myShapes.Clear();
}

View File

@ -0,0 +1,73 @@
// Copyright (C) 2013-2019 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: CurveCreator_ShapeFilter.hxx
// Author: Ilya Shchekin
#ifndef _CurveCreator_ShapeFilter_HeaderFile
#define _CurveCreator_ShapeFilter_HeaderFile
#include <Standard.hxx>
#include <Standard_Type.hxx>
#include <Basics_OCCTVersion.hxx>
#include <Standard_DefineHandle.hxx>
#include <SelectMgr_Filter.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <TopTools_MapOfShape.hxx>
class SelectMgr_EntityOwner;
class TopoDS_Shape;
class CurveCreator_ShapeFilter : public SelectMgr_Filter
{
public:
Standard_EXPORT CurveCreator_ShapeFilter();
Standard_EXPORT ~CurveCreator_ShapeFilter();
Standard_EXPORT virtual Standard_Boolean ActsOn (const TopAbs_ShapeEnum aType) const Standard_OVERRIDE;
Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& EO) const Standard_OVERRIDE;
Standard_EXPORT void AddShape (const TopoDS_Shape& aShape);
Standard_EXPORT void RemoveShape (const TopoDS_Shape& aShape);
Standard_EXPORT void ClearShapes ();
private:
TopTools_MapOfShape myShapes;
public:
DEFINE_STANDARD_RTTIEXT(CurveCreator_ShapeFilter,SelectMgr_Filter)
};
DEFINE_STANDARD_HANDLE(CurveCreator_ShapeFilter, SelectMgr_Filter)
#endif

View File

@ -19,6 +19,8 @@
#include "CurveCreator_TreeView.h" #include "CurveCreator_TreeView.h"
#include "CurveCreator_ICurve.hxx" #include "CurveCreator_ICurve.hxx"
#include "CurveCreator_Curve.hxx"
#include "CurveCreator_Utils.hxx"
#include <SUIT_Session.h> #include <SUIT_Session.h>
#include <SUIT_ResourceMgr.h> #include <SUIT_ResourceMgr.h>
@ -28,8 +30,8 @@
#define ID_SECTION -1 #define ID_SECTION -1
CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent ) : CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent, bool toDrawColorIcon ) :
QAbstractItemModel(parent), myCurve(theCurve) QAbstractItemModel(parent), myCurve(theCurve), myDrawColorIcon(toDrawColorIcon)
{ {
SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
QPixmap aSplineIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_SPLINE"))); QPixmap aSplineIcon(aResMgr->loadPixmap("GEOM", tr("ICON_CC_SPLINE")));
@ -65,8 +67,8 @@ CurveCreator_TreeViewModel::CurveCreator_TreeViewModel( CurveCreator_ICurve* the
int CurveCreator_TreeViewModel::columnCount(const QModelIndex & parent ) const int CurveCreator_TreeViewModel::columnCount(const QModelIndex & parent ) const
{ {
if( parent.internalId() == (quintptr)ID_SECTION ) if( myDrawColorIcon )
return 2; return 3;
else else
return 2; return 2;
} }
@ -104,6 +106,13 @@ QVariant CurveCreator_TreeViewModel::data(const QModelIndex & index, int role )
} }
} }
} }
else if (myDrawColorIcon && aColumn == 2)
{
Quantity_Color color = ((CurveCreator_Curve*)myCurve)->getColorSection(aRow);
QPixmap pixmap(16,16);
pixmap.fill( CurveCreator_Utils::colorConv(color));
return pixmap;
}
} }
} }
/* else{ /* else{
@ -218,14 +227,14 @@ void CurveCreator_TreeViewModel::setCurve( CurveCreator_ICurve* theCurve )
} }
/*****************************************************************************************/ /*****************************************************************************************/
CurveCreator_TreeView::CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent) : CurveCreator_TreeView::CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent, bool toDrawColorIcon) :
QTreeView(parent) QTreeView(parent)
{ {
header()->hide(); header()->hide();
header()->setSectionResizeMode(QHeaderView::ResizeToContents); header()->setSectionResizeMode(QHeaderView::ResizeToContents);
setUniformRowHeights(true); setUniformRowHeights(true);
setContextMenuPolicy( Qt::CustomContextMenu ); setContextMenuPolicy( Qt::CustomContextMenu );
CurveCreator_TreeViewModel* aModel = new CurveCreator_TreeViewModel(theCurve, this); CurveCreator_TreeViewModel* aModel = new CurveCreator_TreeViewModel(theCurve, this, toDrawColorIcon);
setModel(aModel); setModel(aModel);
setSelectionBehavior(SelectRows); setSelectionBehavior(SelectRows);
setSelectionMode(SingleSelection); setSelectionMode(SingleSelection);

View File

@ -28,7 +28,7 @@ class CurveCreator_ICurve;
class CurveCreator_TreeViewModel : public QAbstractItemModel class CurveCreator_TreeViewModel : public QAbstractItemModel
{ {
public: public:
CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent ); CurveCreator_TreeViewModel( CurveCreator_ICurve* theCurve, QObject* parent, bool toDrawColorIcon );
virtual int columnCount(const QModelIndex & parent = QModelIndex()) const; virtual int columnCount(const QModelIndex & parent = QModelIndex()) const;
virtual int rowCount(const QModelIndex & parent = QModelIndex()) const; virtual int rowCount(const QModelIndex & parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
@ -50,6 +50,7 @@ private:
enum IconType{ ICON_POLYLINE, ICON_SPLINE, ICON_CLOSED_SPLINE, ICON_CLOSED_POLYLINE, ICON_POINT }; enum IconType{ ICON_POLYLINE, ICON_SPLINE, ICON_CLOSED_SPLINE, ICON_CLOSED_POLYLINE, ICON_POINT };
private: private:
CurveCreator_ICurve* myCurve; CurveCreator_ICurve* myCurve;
bool myDrawColorIcon;
QMap<IconType, QPixmap> myCachedIcons; QMap<IconType, QPixmap> myCachedIcons;
}; };
@ -59,7 +60,7 @@ class CurveCreator_TreeView : public QTreeView
public: public:
enum SelectionType{ ST_NOSEL, ST_POINTS, ST_POINTS_ONE_SECTION, ST_SECTIONS, ST_MIXED }; enum SelectionType{ ST_NOSEL, ST_POINTS, ST_POINTS_ONE_SECTION, ST_SECTIONS, ST_MIXED };
public: public:
explicit CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent = 0); explicit CurveCreator_TreeView( CurveCreator_ICurve* theCurve, QWidget *parent = 0, bool toDrawColorIcon = true);
SelectionType getSelectionType() const; SelectionType getSelectionType() const;
QList<int> getSelectedSections() const; QList<int> getSelectedSections() const;

View File

@ -295,11 +295,13 @@ TopoDS_Wire CurveCreator_Utils::ConstructWire(
// purpose : // purpose :
//======================================================================= //=======================================================================
void CurveCreator_Utils::constructShape( void CurveCreator_Utils::constructShape(
const CurveCreator_ICurve* theCurve, TopoDS_Shape& theShape) const CurveCreator_ICurve* theCurve, TopoDS_Shape& theShape,
NCollection_IndexedDataMap<int, TopoDS_Shape>* theSect2Shape )
{ {
BRep_Builder aBuilder; BRep_Builder aBuilder;
TopoDS_Compound aShape; TopoDS_Compound aShape;
aBuilder.MakeCompound(aShape); aBuilder.MakeCompound(aShape);
const int aSectionCount = theCurve->getNbSections(); const int aSectionCount = theCurve->getNbSections();
for (int aSectionI = 0; aSectionI < aSectionCount; ++aSectionI) for (int aSectionI = 0; aSectionI < aSectionCount; ++aSectionI)
{ {
@ -314,10 +316,18 @@ void CurveCreator_Utils::constructShape(
const int aPointCount = aPoints->Length(); const int aPointCount = aPoints->Length();
const bool isClosed = theCurve->isClosed(aSectionI); const bool isClosed = theCurve->isClosed(aSectionI);
TopoDS_Compound ShapeWireWithV;
if (theSect2Shape)
aBuilder.MakeCompound(ShapeWireWithV);
// Add the vertices to the shape. // Add the vertices to the shape.
for (Standard_Integer aPN = 1; aPN <= aPointCount; ++aPN) for (Standard_Integer aPN = 1; aPN <= aPointCount; ++aPN)
{ {
aBuilder.Add(aShape, BRepBuilderAPI_MakeVertex(aPoints->Value(aPN))); TopoDS_Vertex V;
aBuilder.MakeVertex(V,aPoints->Value(aPN),Precision::Confusion());
aBuilder.Add(aShape, V);
if (theSect2Shape)
aBuilder.Add(ShapeWireWithV, V);
} }
// Add the wire to the shape. // Add the wire to the shape.
@ -327,6 +337,11 @@ void CurveCreator_Utils::constructShape(
if (!aWire.IsNull()) if (!aWire.IsNull())
{ {
aBuilder.Add(aShape, aWire); aBuilder.Add(aShape, aWire);
if (theSect2Shape)
{
aBuilder.Add(ShapeWireWithV, aWire);
(*theSect2Shape).Add(aSectionI, ShapeWireWithV);
}
} }
} }
theShape = aShape; theShape = aShape;
@ -345,6 +360,33 @@ struct Section3D
Handle(TColgp_HArray1OfPnt) myPoints; Handle(TColgp_HArray1OfPnt) myPoints;
}; };
Quantity_Color CurveCreator_Utils::getRandColor()
{
float aHue = ( rand()%1000 ) * 0.001f;
QColor aColor;
aColor.setHsl( (int)(aHue*255.), 200, 128 );
int r = aColor.red();
int g = aColor.green();
int b = aColor.blue();
double r1 = r / 255.0;
double g1 = g / 255.0;
double b1 = b / 255.0;
return Quantity_Color( r1, g1, b1, Quantity_TOC_RGB );
}
Quantity_Color CurveCreator_Utils::colorConv(QColor color)
{
return Quantity_Color( color.red() / 255.,
color.green() / 255., color.blue() / 255., Quantity_TOC_RGB );
}
QColor CurveCreator_Utils::colorConv(Quantity_Color color)
{
return QColor( (int)( color.Red() * 255 ), (int)( color.Green() * 255 ), (int)( color.Blue() * 255 ) );
}
//======================================================================= //=======================================================================
// function : constructCurve // function : constructCurve
// purpose : // purpose :
@ -517,7 +559,7 @@ bool CurveCreator_Utils::constructCurve
CurveCreator::Spline : CurveCreator::Polyline; CurveCreator::Spline : CurveCreator::Polyline;
theCurve->addSectionInternal(aSecName, aSecType, theCurve->addSectionInternal(aSecName, aSecType,
aSecIt->myIsClosed, aCoords); aSecIt->myIsClosed, aCoords, Quantity_NOC_RED);
} }
// Set the local coordinate system. // Set the local coordinate system.

View File

@ -32,9 +32,11 @@
#include <TopoDS_Wire.hxx> #include <TopoDS_Wire.hxx>
#include <TColgp_HArray1OfPnt.hxx> #include <TColgp_HArray1OfPnt.hxx>
#include <Geom_BSplineCurve.hxx> #include <Geom_BSplineCurve.hxx>
#include <QColor>
#include <list> #include <list>
#include <vector> // TODO: remove #include <vector> // TODO: remove
#include <NCollection_IndexedDataMap.hxx>
class CurveCreator_Curve; class CurveCreator_Curve;
@ -55,6 +57,21 @@ public:
Handle(V3d_View) theView, Handle(V3d_View) theView,
int& x, int& y ); int& x, int& y );
/**
* Generates a random color
*/
CURVECREATOR_EXPORT static Quantity_Color getRandColor();
/**
* Convert QColor to Quantity_Color
*/
CURVECREATOR_EXPORT static Quantity_Color colorConv(QColor color);
/**
* Convert Quantity_Color to QColor
*/
CURVECREATOR_EXPORT static QColor colorConv(Quantity_Color color);
/*! /*!
* \brief Returns the point clicked in 3D view. * \brief Returns the point clicked in 3D view.
* *
@ -70,9 +87,11 @@ public:
* Generates shape on the curve * Generates shape on the curve
* \param theCurve a curve object, that contains data * \param theCurve a curve object, that contains data
* \param theShape a generated shape * \param theShape a generated shape
* \param Sect2Shape optional out map: section to constructed shape (wire+vertices)
*/ */
CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve, CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve,
TopoDS_Shape& theShape ); TopoDS_Shape& theShape,
NCollection_IndexedDataMap<int, TopoDS_Shape>* Sect2Shape = NULL);
/** /**
* Generates a curve from a shape. * Generates a curve from a shape.

View File

@ -21,6 +21,7 @@
#include "CurveCreator.hxx" #include "CurveCreator.hxx"
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <TopoDS_Shape.hxx>
const double LOCAL_SELECTION_TOLERANCE = 0.0001; const double LOCAL_SELECTION_TOLERANCE = 0.0001;

View File

@ -26,11 +26,18 @@
#include "CurveCreator_UtilsICurve.hxx" #include "CurveCreator_UtilsICurve.hxx"
#include "CurveCreator_TableView.h" #include "CurveCreator_TableView.h"
#include "CurveCreator_Curve.hxx"
#include "CurveCreator_Section.hxx"
#include <QColorDialog>
#include <SUIT_Session.h> #include <SUIT_Session.h>
#include <SUIT_Desktop.h> #include <SUIT_Desktop.h>
#include <SUIT_ResourceMgr.h> #include <SUIT_ResourceMgr.h>
#include <SUIT_ViewManager.h> #include <SUIT_ViewManager.h>
#include <TopExp_Explorer.hxx>
#include "CurveCreator_ShapeFilter.hxx"
#include <OCCViewer_ViewManager.h> #include <OCCViewer_ViewManager.h>
#include <OCCViewer_ViewPort3d.h> #include <OCCViewer_ViewPort3d.h>
#include <OCCViewer_Utilities.h> #include <OCCViewer_Utilities.h>
@ -97,7 +104,10 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
QGroupBox* aSectionGroup = new QGroupBox(tr("SECTION_GROUP_TITLE"),this); QGroupBox* aSectionGroup = new QGroupBox(tr("SECTION_GROUP_TITLE"),this);
mySectionView = new CurveCreator_TreeView(myCurve, aSectionGroup);
bool toDrawSectColor = !(theActionFlags & DisableSetColor);
mySectionView = new CurveCreator_TreeView(myCurve, aSectionGroup, toDrawSectColor);
mySectionView->setSelectionMode( QTreeView::ExtendedSelection ); mySectionView->setSelectionMode( QTreeView::ExtendedSelection );
connect( mySectionView, SIGNAL(selectionChanged()), this, SLOT( onSelectionChanged() ) ); connect( mySectionView, SIGNAL(selectionChanged()), this, SLOT( onSelectionChanged() ) );
connect( mySectionView, SIGNAL(sectionEntered(int)), this, SLOT(onEditSection(int)) ); connect( mySectionView, SIGNAL(sectionEntered(int)), this, SLOT(onEditSection(int)) );
@ -124,6 +134,7 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
QPixmap aBringTogetherPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_BRING_TOGETHER"))); QPixmap aBringTogetherPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_BRING_TOGETHER")));
QPixmap aStepUpPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_UP"))); QPixmap aStepUpPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_UP")));
QPixmap aStepDownPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_DOWN"))); QPixmap aStepDownPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_ARROW_DOWN")));
QPixmap aSetColorPixmap(aResMgr->loadPixmap("GEOM", tr("ICON_CC_SETCOLOR")));
QAction* anAct = createAction( UNDO_ID, tr("UNDO"), anUndoPixmap, tr("UNDO_TLT"), QAction* anAct = createAction( UNDO_ID, tr("UNDO"), anUndoPixmap, tr("UNDO_TLT"),
QKeySequence(Qt::ControlModifier|Qt::Key_Z) ); QKeySequence(Qt::ControlModifier|Qt::Key_Z) );
@ -192,6 +203,13 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
connect(anAct, SIGNAL(triggered()), this, SLOT(onRemove()) ); connect(anAct, SIGNAL(triggered()), this, SLOT(onRemove()) );
aTB->addAction(anAct); aTB->addAction(anAct);
anAct = createAction( SETCOLOR_ID, tr("SETCOLOR"), aSetColorPixmap, tr("SETCOLOR_TLT"),
QKeySequence(Qt::ControlModifier|Qt::Key_C ) );
connect(anAct, SIGNAL(triggered()), this, SLOT(onSetColor()) );
if ( !(theActionFlags & DisableSetColor) )
aTB->addAction(anAct);
anAct = createAction( JOIN_ID, tr("JOIN"), aJoinPixmap, tr("JOIN_TLT"), anAct = createAction( JOIN_ID, tr("JOIN"), aJoinPixmap, tr("JOIN_TLT"),
QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) ); QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) );
connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) ); connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) );
@ -349,6 +367,11 @@ void CurveCreator_Widget::onSelectionChanged()
updateActionsStates(); updateActionsStates();
updateUndoRedo(); updateUndoRedo();
emit selectionChanged(); emit selectionChanged();
QList<int> selectedSections = mySectionView->getSelectedSections();
CurveCreator_Curve* Curve = ((CurveCreator_Curve*)myCurve);
Curve->myCurSectInd.clear();
foreach (int sectInd, selectedSections)
Curve->myCurSectInd.push_back(sectInd);
} }
void CurveCreator_Widget::updateActionsStates() void CurveCreator_Widget::updateActionsStates()
@ -359,6 +382,8 @@ void CurveCreator_Widget::updateActionsStates()
if ( removeEnabled() ) if ( removeEnabled() )
anEnabledAct << REMOVE_ID; anEnabledAct << REMOVE_ID;
QList<int> aSelSections = mySectionView->getSelectedSections(); QList<int> aSelSections = mySectionView->getSelectedSections();
if (aSelSections.size() == 1)
anEnabledAct << SETCOLOR_ID;
CurveCreator_TreeView::SelectionType aSelType = mySectionView->getSelectionType(); CurveCreator_TreeView::SelectionType aSelType = mySectionView->getSelectionType();
switch( aSelType ){ switch( aSelType ){
case CurveCreator_TreeView::ST_NOSEL:{ case CurveCreator_TreeView::ST_NOSEL:{
@ -689,6 +714,31 @@ void CurveCreator_Widget::onRemove()
} }
} }
void CurveCreator_Widget::onSetColor()
{
if( !myCurve )
return;
QList<int> aSections = mySectionView->getSelectedSections();
if (aSections.size() != 1)
return;
int aSectNum = aSections[0];
Quantity_Color aColor = ((CurveCreator_Curve*)myCurve)->getColorSection( aSectNum );;
QColor aQColor = CurveCreator_Utils::colorConv(aColor);
QColor aNewQColor = QColorDialog::getColor( aQColor, this );
if( !aNewQColor.isValid() )
return;
Quantity_Color aNewColor = CurveCreator_Utils::colorConv(aNewQColor);
((CurveCreator_Curve*)myCurve)->setColorSection( aSectNum, aNewColor);
updateUndoRedo();
}
void CurveCreator_Widget::onClearAll() void CurveCreator_Widget::onClearAll()
{ {
if( !myCurve ) if( !myCurve )
@ -1122,6 +1172,32 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEven
Handle(V3d_View) aView3d = aView->getViewPort()->getView(); Handle(V3d_View) aView3d = aView->getViewPort()->getView();
if ( !aView3d.IsNull() ) if ( !aView3d.IsNull() )
{ {
CurveCreator_Curve* Curve = ((CurveCreator_Curve*)myCurve);
//if (!Curve->myCurSectInd.empty())
//{
aCtx->RemoveFilters();
Handle(CurveCreator_ShapeFilter) filter = new CurveCreator_ShapeFilter();
for (int i=0; i<Curve->myCurSectInd.size(); i++)
{
int sectInd = Curve->myCurSectInd[i];
const TopoDS_Shape& W = Curve->mySect2Shape(sectInd+1);
TopExp_Explorer exp(W, TopAbs_VERTEX);
for (;exp.More();exp.Next())
filter->AddShape(exp.Current());
}
aCtx->AddFilter(filter);
#if OCC_VERSION_LARGE <= 0x07030000
if (aCtx->HasOpenedContext())
{
Handle(AIS_LocalContext) aLctx = aCtx->LocalContext();
aLctx->Filter()->Clear();
aLctx->AddFilter(filter);
}
#else
// TODO: check if something required
#endif
//}
// Initialize the single selection if start and end points are equal, // Initialize the single selection if start and end points are equal,
// otherwise a rectangular selection. // otherwise a rectangular selection.
if ( myStartPoint == myEndPoint ) if ( myStartPoint == myEndPoint )

View File

@ -56,7 +56,8 @@ public:
NoFlags = 0x00000000, NoFlags = 0x00000000,
DisableDetectionMode = 0x00000001, DisableDetectionMode = 0x00000001,
DisableNewSection = 0x00000002, DisableNewSection = 0x00000002,
DisableClosedSection = 0x00000004 DisableClosedSection = 0x00000004,
DisableSetColor = 0x00000008
}; };
enum ActionMode { enum ActionMode {
@ -119,6 +120,7 @@ public slots:
void onJoin(); void onJoin();
void onBringTogether(); void onBringTogether();
void onRemove(); void onRemove();
void onSetColor();
void onClearAll(); void onClearAll();
void onJoinAll(); void onJoinAll();
void onSetSpline(); void onSetSpline();
@ -162,7 +164,8 @@ protected:
SEPARATOR_ID, SEPARATOR_ID,
MODIFICATION_MODE_ID, MODIFICATION_MODE_ID,
DETECTION_MODE_ID, DETECTION_MODE_ID,
BRING_TOGETHER_ID BRING_TOGETHER_ID,
SETCOLOR_ID
}; };
public: public:

View File

@ -63,6 +63,10 @@
<source>ICON_CC_UNDO</source> <source>ICON_CC_UNDO</source>
<translation>undo.png</translation> <translation>undo.png</translation>
</message> </message>
<message>
<source>ICON_CC_SETCOLOR</source>
<translation>setcolor.png</translation>
</message>
<message> <message>
<source>ICON_FOLDER</source> <source>ICON_FOLDER</source>
<translation>folder.png</translation> <translation>folder.png</translation>

View File

@ -6103,6 +6103,14 @@ shells and solids on the other hand.</translation>
<source>SET_SECTIONS_SPLINE_TLT</source> <source>SET_SECTIONS_SPLINE_TLT</source>
<translation>Set selected section type to spline</translation> <translation>Set selected section type to spline</translation>
</message> </message>
<message>
<source>SETCOLOR</source>
<translation>Set color</translation>
</message>
<message>
<source>SETCOLOR_TLT</source>
<translation>Set color</translation>
</message>
<message> <message>
<source>REMOVE</source> <source>REMOVE</source>
<translation>Remove</translation> <translation>Remove</translation>