X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_PatternWidget.cxx;fp=src%2FSMESHGUI%2FSMESHGUI_PatternWidget.cxx;h=80614980c442c934e3e7d53b14751914cde60d12;hb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f;hp=0000000000000000000000000000000000000000;hpb=51569f091c2d18be76ea9bd3e68ca0247cc731c3;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_PatternWidget.cxx b/src/SMESHGUI/SMESHGUI_PatternWidget.cxx new file mode 100644 index 000000000..80614980c --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_PatternWidget.cxx @@ -0,0 +1,171 @@ +// SMESH SMESHGUI : GUI for SMESH component +// +// Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : SMESHGUI_PatternWidget.cxx +// Author : Michael ZORIN +// Module : SMESH +// $Header: + +#include "SMESHGUI_PatternWidget.h" + +//Qt includes +#include +#include + + +//================================================================================= +// class : SMESHGUI_PatternWidget() +// purpose : +//================================================================================= +SMESHGUI_PatternWidget::SMESHGUI_PatternWidget( QWidget* parent, const char* name, WFlags fl ) + : QFrame( parent, name, WStyle_Customize) +{ + myMinU = myMinV = myMaxU = myMaxV = 0; + setMinimumHeight(150); + repaint(); +} + + + +//================================================================================= +// function : ~SMESHGUI_PatternWidget() +// purpose : +//================================================================================= +SMESHGUI_PatternWidget::~SMESHGUI_PatternWidget() +{ +} + + +//================================================================================= +// function : SMESHGUI_PatternWidget::SetPoints +// purpose : +//================================================================================= +void SMESHGUI_PatternWidget::SetPoints( PointVector thePoints, QValueVector theKeys, ConnectivityVector theConnections ) +{ + myPoints = thePoints; + myKeys = theKeys; + myConnections = theConnections; + + if (!thePoints.size()) + return; + + myMinU = myMaxU = (thePoints[0]).x; + myMinV = myMaxV = (thePoints[0]).y; + double x, y; + + for (int i = 1; i < thePoints.size(); i++) + { + x = (thePoints[i]).x; + y = (thePoints[i]).y; + + if ( myMinU > x ) + myMinU = x; + if ( myMaxU < x) + myMaxU = x; + if ( myMinV > y ) + myMinV = y; + if ( myMaxV < y) + myMaxV = y; + } + + repaint(); +} + +static const int Shift = 4; // shift of the point number from point +static const int Border = 20; + +//================================================================================= +// function : SMESHGUI_PatternWidget::paintEvent +// purpose : +//================================================================================= +void SMESHGUI_PatternWidget::paintEvent( QPaintEvent * ) +{ + QPainter paint( this ); + paint.setBrush (Qt::SolidPattern ); + + //Draw points + const int aRadius = 3; // radius of a point + + for (int i = 0; i < myKeys.size() && i < myPoints.size(); i++) + { + SMESH::PointStruct aPoint = myPoints[ myKeys[i] ]; + QPoint aQPnt = MapCoords( aPoint.x, aPoint.y); + + paint.drawPie( aQPnt.x() - aRadius, aQPnt.y() - aRadius, aRadius*2, aRadius*2, 5760, 5760 ); + paint.drawText( aQPnt.x() + Shift, aQPnt.y() - Shift, QString::number( i+1 ) ); + } + + //Draw lines + for (int i = 0; i < myConnections.size(); i++) + { + QValueVector aCVector = myConnections[i]; + + if ( aCVector.size() == 0 ) + continue; + + SMESH::PointStruct aPoint = myPoints[ aCVector[0] ]; + const QPoint aBeginPnt = MapCoords( aPoint.x, aPoint.y); + QPoint aFirstPnt = aBeginPnt, aSecondPnt; + + for (int j = 1; j < aCVector.size(); j++) + { + aPoint = myPoints[ aCVector[j] ]; + aSecondPnt = MapCoords( aPoint.x, aPoint.y); + paint.drawLine(aFirstPnt, aSecondPnt); + aFirstPnt = aSecondPnt; + } + + paint.drawLine(aBeginPnt, aSecondPnt); + } +} + + +//================================================================================= +// function : SMESHGUI_PatternWidget::MapCoords +// purpose : +//================================================================================= +QPoint SMESHGUI_PatternWidget::MapCoords( const double u, const double v ) +{ + int aWidth = width() - 2*Border; + int aHeight = height() - 2*Border; + + double aUBound = myMaxU - myMinU; + double aVBound = myMaxV - myMinV; + + double aUScale = aWidth/aUBound; + double aVScale = aHeight/aVBound; + + double aScale; + aUScale <= aVScale ? aScale = aUScale : aScale = aVScale; + + double aUMiddle = ( myMaxU + myMinU )/2; + double aVMiddle = ( myMaxV + myMinV )/2; + + int x = int( aWidth/2 + (u - aUMiddle)*aScale + Border - Shift); + + int y = int( aHeight/2 + (aVMiddle - v)*aScale + Border + Shift); + + QPoint aPoint = QPoint(x, y); + + return aPoint; +}