X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGLViewer%2FGLViewer_Viewer2d.cxx;h=b55eea2be320d4e07be17b64e733ba52d39e1515;hb=e48ad14d83e10195986d829b9e9b663e81f07032;hp=d13de15e70b1e9661fab6db4e539287d99546f4f;hpb=0191641222d5e776a92bb6a4577e30c8223c396d;p=modules%2Fgui.git diff --git a/src/GLViewer/GLViewer_Viewer2d.cxx b/src/GLViewer/GLViewer_Viewer2d.cxx index d13de15e7..b55eea2be 100644 --- a/src/GLViewer/GLViewer_Viewer2d.cxx +++ b/src/GLViewer/GLViewer_Viewer2d.cxx @@ -1,224 +1,231 @@ +// Copyright (C) 2007-2024 CEA, EDF, 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 +// + +// Author : OPEN CASCADE // File: GLViewer_Viewer2d.cxx // Created: November, 2004 -// Author: OCC team -// Copyright (C) CEA 2004 - -/*************************************************************************** -** Class: GLViewer_Viewer2d -** Descr: OpenGL Viewer 2D -** Module: GLViewer -** Created: UI team, 04.09.02 -****************************************************************************/ - +//#include +// #include "GLViewer_Viewer2d.h" - #include "GLViewer_Object.h" +#include "GLViewer_ViewFrame.h" +#include "GLViewer_BaseObjects.h" +#include "GLViewer_CoordSystem.h" #include "GLViewer_Context.h" #include "GLViewer_Drawer.h" #include "GLViewer_Selector2d.h" -//#include "GLViewer_Sketcher.h" #include "GLViewer_ViewPort2d.h" #include "SUIT_Desktop.h" #include "SUIT_ViewWindow.h" +#include "SUIT_ViewManager.h" -#include -#include - -#include -#include -#include +#include +#include +#include +#include +#include +#include +/*! + Constructor + \param title - viewer title +*/ GLViewer_Viewer2d::GLViewer_Viewer2d( const QString& title) : GLViewer_Viewer( title ) { - myGLContext = new GLViewer_Context( this ); - //myGLSketcher = new GLViewer_Sketcher( this ); - mySelMode = GLViewer_Viewer::Multiple; - createSelector(); - myDrawers.clear(); + myGLContext = new GLViewer_Context( this ); + + createSelector(); + + mySelMode = GLViewer_Viewer::Multiple; + + myDrawers.clear(); } +/*! + Destructor +*/ GLViewer_Viewer2d::~GLViewer_Viewer2d() { //myGLSketcher = 0; //delete myGLSketcher; + + qDeleteAll(myDrawers); + myDrawers.clear(); + + delete myGLContext; + myGLContext = nullptr; + + GLViewer_TexFont::clearTextBases(); } +/*!Create new instance of view window on desktop \a theDesktop. + *\retval SUIT_ViewWindow* - created view window pointer. + */ SUIT_ViewWindow* GLViewer_Viewer2d::createView( SUIT_Desktop* theDesktop ) { return new GLViewer_ViewFrame( theDesktop, this ); } -void GLViewer_Viewer2d::contextMenuPopup( QPopupMenu* thePopup ) +/*! + Adds item for change background color + \param thePopup - menu +*/ +void GLViewer_Viewer2d::addPopupItems( QMenu* thePopup ) { - // "Change background color" menu item is available if there are no selected objects + // CTH8434. "Change background color" menu item is available if there are no selected objects if ( getSelector() == 0 || getSelector()->numSelected() == 0 ) { - if( thePopup->count() > 0 ) - thePopup->insertSeparator(); - thePopup->insertItem( tr( "MNU_DUMP_VIEW" ), this, SLOT( onDumpView() ) ); - thePopup->insertItem( tr( "CHANGE_BGCOLOR" ), this, SLOT( onChangeBgColor() ) ); + if( thePopup->actions().count() > 0 ) + thePopup->addSeparator(); + thePopup->addAction( tr( "CHANGE_BGCOLOR" ), this, SLOT( onChangeBgColor() ) ); } } +/*! + Changes background color +*/ void GLViewer_Viewer2d::onChangeBgColor() { if( !getActiveView() ) return; GLViewer_ViewPort2d* vp = ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() ); - QColor selColor = QColorDialog::getColor( vp->backgroundColor(), vp ); + QColor selColor = QColorDialog::getColor( vp->backgroundColor(), vp ); if ( selColor.isValid() ) { vp->setBackgroundColor( selColor ); } } -void GLViewer_Viewer2d::updateColors( QColor colorH, QColor colorS ) -{ -// cout << "GLViewer_Viewer2d::updateColors" << endl; - -/* - for ( DrawerMap::Iterator it = myDrawers.begin(); it != myDrawers.end(); ++it ) - { - it.key()->setHColor( colorH ); - it.key()->setSColor( colorS ); - } +/*! + Updates colors for all drawers (does not work) */ - ObjectMap anObjects = myGLContext->getObjects(); - ObjectMap::Iterator beginIt = anObjects.begin(); - ObjectMap::Iterator endIt = anObjects.end(); - for ( ObjectMap::Iterator it = beginIt; it != endIt; ++it ) - { - //GLViewer_Drawer* aDrawer = it.key()->getDrawer(); - //aDrawer->setHColor( colorH ); - //aDrawer->setSColor( colorS ); - } - - - activateAllDrawers( TRUE ); +void GLViewer_Viewer2d::updateColors( QColor /*colorH*/, QColor /*colorS*/ ) +{ + activateAllDrawers( true ); } -void GLViewer_Viewer2d::updateBorders( const QRect& rect ) +/*! + Updates rect of global scene by adding new rectangle + \param theRect - rectangle +*/ +void GLViewer_Viewer2d::updateBorders( GLViewer_Rect* theRect ) { - float xa = rect.left(); - float xb = rect.right(); - float ya = rect.top(); - float yb = rect.bottom(); - - QPtrVector views = getViewManager()->getViews(); + QVector views = getViewManager()->getViews(); for ( int i = 0, n = views.count(); i < n; i++ ) { - QRect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder(); + GLViewer_Rect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder(); - if ( xa < border->left() ) border->setLeft( (int)xa ); - if ( xb > border->right() ) border->setRight( (int)xb ); - if ( ya < border->top() ) border->setTop( (int)ya ); - if ( yb > border->bottom() ) border->setBottom( (int)yb ); + border->setLeft( qMin( border->left(), theRect->left() ) ); + border->setRight( qMax( border->right(), theRect->right() ) ); + border->setBottom( qMin( border->bottom(), theRect->bottom() ) ); + border->setTop( qMax( border->top(), theRect->top() ) ); } } +/*! + Recomputes global scene rect +*/ void GLViewer_Viewer2d::updateBorders() { - QPtrVector views = getViewManager()->getViews(); + QVector views = getViewManager()->getViews(); - ObjectMap anObjects = myGLContext->getObjects(); - ObjectMap::Iterator beginIt = anObjects.begin(); - ObjectMap::Iterator endIt = anObjects.end(); + ObjList anObjects = myGLContext->getObjects(); + ObjList::Iterator beginIt = anObjects.begin(); + ObjList::Iterator endIt = anObjects.end(); for ( int i = 0, n = views.count(); i < n; i++ ) { - QRect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder(); - border->setRect( 0, 0, 0, 0 ); - for ( ObjectMap::Iterator it = beginIt; it != endIt; ++it ) + GLViewer_Rect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder(); + if ( !border ) + continue; + border->setIsEmpty( true ); + // initialise border by default values to avoid old values + border->setCoords( 0, 0, 0, 0 ); + for ( ObjList::Iterator it = beginIt; it != endIt; ++it ) { - QRect* aRect = it.key()->getRect()->toQRect(); - if( !it.key()->getVisible() || aRect->isNull() ) + GLViewer_Object* anObject = *it; + GLViewer_Rect* aRect = anObject->getRect(); + if( !anObject->isSelectable() || !anObject->getVisible() ) continue; - if( border->isNull() ) - border->setRect( aRect->left(), aRect->top(), aRect->width(), aRect->height() ); + if( border->isEmpty() ) + { + border->setIsEmpty( false ); + border->setCoords( aRect->left(), aRect->right(), aRect->bottom(), aRect->top() ); + } else - { - border->setLeft( QMIN( border->left(), aRect->left() ) ); - border->setRight( QMAX( border->right(), aRect->right() ) ); - border->setTop( QMIN( border->top(), aRect->top() ) ); - border->setBottom( QMAX( border->bottom(), aRect->bottom() ) ); - } + { + border->setLeft( qMin( border->left(), aRect->left() ) ); + border->setRight( qMax( border->right(), aRect->right() ) ); + border->setBottom( qMin( border->bottom(), aRect->bottom() ) ); + border->setTop( qMax( border->top(), aRect->top() ) ); + } } - /* - float gap = QMAX( border->width(), border->height() ) / 20; - border->setLeft( border->left() - gap ); - border->setRight( border->right() + gap ); - border->setTop( border->top() - gap ); - border->setBottom( border->bottom() + gap ); - */ } } +/*! + Redraws all active objects by updating all drawers in all views +*/ void GLViewer_Viewer2d::updateAll() { if ( !getActiveView() ) return; - QPtrVector views = getViewManager()->getViews(); + QVector views = getViewManager()->getViews(); for ( int i = 0, n = views.count(); i < n; i++ ) ( ( GLViewer_ViewPort2d* )( ( GLViewer_ViewFrame* )views[i] )->getViewPort() )->getGLWidget()->updateGL(); } -void GLViewer_Viewer2d::updateDrawers( GLboolean update, GLfloat scX, GLfloat scY ) +/*! + \param onlyUpdate is passed to method activateAllDrawers drawers +*/ +void GLViewer_Viewer2d::updateDrawers( GLboolean update, GLfloat /*scX*/, GLfloat /*scY*/ ) { -// cout << "GLViewer_Viewer2d::updateDrawers" << endl; - - //myGLContext->updateScales( scX, scY ); - //myGLSketcher->drawContour(); activateAllDrawers( update ); } -void GLViewer_Viewer2d::activateDrawers( TColStd_SequenceOfInteger& sequence, bool onlyUpdate, GLboolean swap ) -{ -// cout << "GLViewer_Viewer2d::activateDrawers" << endl; -// if( onlyUpdate ) -// cout << "Only update" << endl; -// else -// cout << "Not only update" << endl; - - TColStd_MapOfInteger aMap; - for ( int i = 1, n = sequence.Length(); i <= n; i++) - if ( !aMap.Contains( sequence( i ) ) ) - aMap.Add( sequence( i ) ); - - const ObjectMap& anObjects = myGLContext->getObjects(); - const ObjList& objList = myGLContext->getObjList(); - ObjList anActiveObjects; - for( ObjList::const_iterator it = objList.begin(); it != objList.end(); ++it ) - { - if ( (*it)->getVisible() && aMap.Contains( anObjects[*it] ) ) - anActiveObjects.append( *it ); - } - - activateDrawers( anActiveObjects, onlyUpdate, swap ); -} - -void GLViewer_Viewer2d::activateDrawers( QValueList& theObjects, bool onlyUpdate, GLboolean swap ) +/*! + Activates drawers for objects from list \param theObjects only +*/ +void GLViewer_Viewer2d::activateDrawers( QList& theObjects, bool onlyUpdate, GLboolean swap ) { //cout << "GLViewer_Viewer2d::activateDrawers " << (int)onlyUpdate << " " << (int)swap << endl; - float xScale; - float yScale; - - QValueList::Iterator anIt = myDrawers.begin(); - QValueList::Iterator endDIt = myDrawers.end(); + QList::Iterator anIt = myDrawers.begin(); + QList::Iterator endDIt = myDrawers.end(); for( ; anIt != endDIt; anIt++ ) - (*anIt)->clear(); + (*anIt)->clear(); - QValueList anActiveDrawers; - QValueList::Iterator endOIt = theObjects.end(); + QList anActiveDrawers; + QList::Iterator endOIt = theObjects.end(); - for( QValueList::Iterator oit = theObjects.begin(); oit != endOIt; ++oit ) + for( QList::Iterator oit = theObjects.begin(); oit != endOIt; ++oit ) { GLViewer_Drawer* aDrawer = (*oit)->getDrawer(); if( !aDrawer ) { - anIt = myDrawers.begin(); + anIt = myDrawers.begin(); + endDIt = myDrawers.end(); for( ; anIt != endDIt; anIt++ ) if( (*anIt)->getObjectType() == (*oit)->getObjectType() ) @@ -228,56 +235,57 @@ void GLViewer_Viewer2d::activateDrawers( QValueList& theObject break; } - if( !aDrawer ) //are not exists + if( !aDrawer ) { myDrawers.append( (*oit)->createDrawer() ); aDrawer = (*oit)->getDrawer(); } } + if ( !aDrawer ) + continue; aDrawer->addObject( (*oit) ); - if( anActiveDrawers.findIndex( aDrawer ) == -1 ) - anActiveDrawers.append( aDrawer ); + + int aPriority = aDrawer->getPriority(); + + if( anActiveDrawers.indexOf( aDrawer ) != -1 ) + continue; + + QList::Iterator aDIt = anActiveDrawers.begin(); + QList::Iterator aDEndIt = anActiveDrawers.end(); + for( ; aDIt != aDEndIt; ++aDIt ) + if( (*aDIt)->getPriority() > aPriority ) + break; + + anActiveDrawers.insert( aDIt, aDrawer ); } - QValueList::Iterator aDIt = anActiveDrawers.begin(); - QValueList::Iterator aDEndIt = anActiveDrawers.end(); + QList::Iterator aDIt = anActiveDrawers.begin(); + QList::Iterator aDEndIt = anActiveDrawers.end(); - QPtrVector views = getViewManager()->getViews(); + QVector views = getViewManager()->getViews(); for ( int i = 0, n = views.count(); i < n; i++ ) { + float xScale, yScale; GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort(); vp->getScale( xScale, yScale ); vp->getGLWidget()->makeCurrent(); - for( ; aDIt != aDEndIt; aDIt++ ) - (*aDIt)->create( xScale, yScale, onlyUpdate ); - - // tmp - /* - QRect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder(); - float x1 = border->left(); - float x2 = border->right(); - float y1 = border->bottom(); - float y2 = border->top(); - - QColor color = Qt::blue; - glColor3f( ( GLfloat )color.red() / 255, - ( GLfloat )color.green() / 255, - ( GLfloat )color.blue() / 255 ); - glLineWidth( 1.0 ); - - glBegin( GL_LINE_LOOP ); - glVertex2f( x1, y1 ); - glVertex2f( x1, y2 ); - glVertex2f( x2, y2 ); - glVertex2f( x2, y1 ); - glEnd(); + { + GLViewer_Drawer* aDrawer = *aDIt; + if( aDrawer ) + aDrawer->create( xScale, yScale, onlyUpdate ); + } +/* + // draw border + GLViewer_Rect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder(); + (*aDIt)->drawRectangle( border, Qt::blue ); QString coords = QString::number( border->left() ) + " " + QString::number( border->right() ) + " " + - QString::number( border->top() ) + " " + QString::number( border->bottom() ); - (*aDIt)->drawText( "Border : " + coords, x1, y1+10/yScale, Qt::blue, &QFont( "Courier", 8, QFont::Normal ), 2 ); - */ + QString::number( border->bottom() ) + " " + QString::number( border->top() ); + (*aDIt)->drawText( "Border : " + coords, border->left(), border->top() + 10 / yScale, + Qt::blue, &QFont( "Courier", 8, QFont::Normal ), 2 ); +*/ if ( swap ) vp->getGLWidget()->swapBuffers(); } @@ -285,21 +293,9 @@ void GLViewer_Viewer2d::activateDrawers( QValueList& theObject ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() )->getGLWidget()->makeCurrent(); } -void GLViewer_Viewer2d::activateDrawer( int index, bool onlyUpdate, GLboolean swap ) -{ - GLViewer_Object* anObj = 0; - const ObjectMap& anObjects = myGLContext->getObjects(); - for ( ObjectMap::const_iterator it = anObjects.begin(); it != anObjects.end(); ++it ) - if ( it.data() == index ) - { - anObj = (GLViewer_Object*)it.key(); - break; - } - - if ( anObj ) - activateDrawer( anObj, onlyUpdate, swap ); -} - +/*! + Activates drawer for \param theObject +*/ void GLViewer_Viewer2d::activateDrawer( GLViewer_Object* theObject, bool onlyUpdate, GLboolean swap ) { ObjList aList; @@ -307,13 +303,16 @@ void GLViewer_Viewer2d::activateDrawer( GLViewer_Object* theObject, bool onlyUpd activateDrawers( aList, onlyUpdate, swap ); } +/*! + \param onlyUpdate is passed to drawers +*/ void GLViewer_Viewer2d::activateAllDrawers( bool onlyUpdate, GLboolean swap ) { if ( !getActiveView() ) return; ObjList anActiveObjs; - const ObjList& objs = myGLContext->getObjList(); + const ObjList& objs = myGLContext->getObjects(); for( ObjList::const_iterator it = objs.begin(); it != objs.end(); ++it ) { GLViewer_Object* obj = (GLViewer_Object*)(*it); @@ -324,6 +323,11 @@ void GLViewer_Viewer2d::activateAllDrawers( bool onlyUpdate, GLboolean swap ) activateDrawers( anActiveObjs, onlyUpdate, swap ); } +/*! + Creates set of marker + \param theMarkersNum - number of markers + \param theMarkersRad - radius of markers +*/ void GLViewer_Viewer2d::onCreateGLMarkers( int theMarkersNum, int theMarkersRad ) { if ( !getActiveView() ) @@ -350,8 +354,7 @@ void GLViewer_Viewer2d::onCreateGLMarkers( int theMarkersNum, int theMarkersRad aMarkerSet->setYCoord( anYCoord, theMarkersNum ); aMarkerSet->compute(); - QRect* rect = aMarkerSet->getRect()->toQRect(); - updateBorders( *rect ); + updateBorders( aMarkerSet->getRect() ); activateAllDrawers( false ); activateTransform( GLViewer_Viewer::FitAll ); @@ -360,6 +363,12 @@ void GLViewer_Viewer2d::onCreateGLMarkers( int theMarkersNum, int theMarkersRad delete[] anYCoord; } +/*! + Creates GL polyline + \param theAnglesNum - number of angles + \param theRadius - radius + \param thePolylineNumber - number +*/ void GLViewer_Viewer2d::onCreateGLPolyline( int theAnglesNum, int theRadius, int thePolylineNumber ) { if ( !getActiveView() ) @@ -393,8 +402,7 @@ void GLViewer_Viewer2d::onCreateGLPolyline( int theAnglesNum, int theRadius, int aPolyline->setYCoord( anYCoord, theAnglesNum ); aPolyline->compute(); - QRect* rect = aPolyline->getRect()->toQRect(); - updateBorders( *rect ); + updateBorders( aPolyline->getRect() ); } activateAllDrawers( false ); @@ -404,6 +412,11 @@ void GLViewer_Viewer2d::onCreateGLPolyline( int theAnglesNum, int theRadius, int delete[] anYCoord; } +/*! + Creates text + \param theStr - text string + \param theTextNumber - number +*/ void GLViewer_Viewer2d::onCreateGLText( QString theStr, int theTextNumber ) { if ( !getActiveView() ) @@ -428,13 +441,16 @@ void GLViewer_Viewer2d::onCreateGLText( QString theStr, int theTextNumber ) aText->compute(); getGLContext()->insertObject( aText ); - QRect* rect = aText->getRect()->toQRect(); - updateBorders( *rect ); + updateBorders( aText->getRect() ); } activateAllDrawers( false ); } +/*! + Translates point from global CS to curreent viewer CS + \param x, y - co-ordinates to be translated +*/ void GLViewer_Viewer2d::transPoint( GLfloat& x, GLfloat& y ) { if ( !getActiveView() ) @@ -463,6 +479,10 @@ void GLViewer_Viewer2d::transPoint( GLfloat& x, GLfloat& y ) y -= yPan; } +/*! + \return object rect in window CS + \param theObject - object +*/ QRect* GLViewer_Viewer2d::getWinObjectRect( GLViewer_Object* theObject ) { if ( !getActiveView() ) @@ -479,21 +499,21 @@ QRect* GLViewer_Viewer2d::getWinObjectRect( GLViewer_Object* theObject ) curvp->getScale( xScale, yScale ); curvp->getPan( xPan, yPan ); - QRect* aObjRect = theObject->getRect()->toQRect(); - float aLeft = aObjRect->left() + xPan, aRight = aObjRect->right() + xPan; - float aTop = aObjRect->top() + yPan, aBot = aObjRect->bottom() + yPan; + QRect aObjRect = theObject->getRect()->toQRect(); + float aLeft = aObjRect.left() + xPan, aRight = aObjRect.right() + xPan; + float aTop = aObjRect.top() + yPan, aBot = aObjRect.bottom() + yPan; GLfloat anAngle = curvp->getGLWidget()->getRotationAngle() * PI / 180.; - QPointArray aPointArray(4); - int ls = (int)(aLeft*sin(anAngle)), lc = (int)(aLeft*cos(anAngle)), - rs = (int)(aRight*sin(anAngle)), rc = (int)(aRight*cos(anAngle)), - ts = (int)(aTop*sin(anAngle)), tc = (int)(aTop*cos(anAngle)), - bs = (int)(aBot*sin(anAngle)), bc = (int)(aBot*cos(anAngle)); - aPointArray[0] = QPoint( lc - ts, ls + tc ); - aPointArray[1] = QPoint( rc - ts, rs + tc ); - aPointArray[2] = QPoint( rc - bs, rs + bc ); - aPointArray[3] = QPoint( lc - bs, ls + bc ); + QPolygon aPointArray(4); + aPointArray[0] = QPoint( (int)(aLeft*cos(anAngle) - aTop*sin(anAngle)), + (int)(aLeft*sin(anAngle) + aTop*cos(anAngle)) ); + aPointArray[1] = QPoint( (int)(aRight*cos(anAngle) - aTop*sin(anAngle)), + (int)(aRight*sin(anAngle) + aTop*cos(anAngle)) ); + aPointArray[2] = QPoint( (int)(aRight*cos(anAngle) - aBot*sin(anAngle)), + (int)(aRight*sin(anAngle) + aBot*cos(anAngle)) ); + aPointArray[3] = QPoint( (int)(aLeft*cos(anAngle) - aBot*sin(anAngle)), + (int)(aLeft*sin(anAngle) + aBot*cos(anAngle)) ); int aMinLeft = aPointArray[0].x(), aMaxRight = aPointArray[0].x(), aMinTop = aPointArray[0].y(), aMaxBottom = aPointArray[0].y(); @@ -501,10 +521,10 @@ QRect* GLViewer_Viewer2d::getWinObjectRect( GLViewer_Object* theObject ) { int x = aPointArray[i].x(); int y = aPointArray[i].y(); - aMinLeft = QMIN( aMinLeft,x ); - aMaxRight = QMAX( aMaxRight, x ); - aMinTop = QMIN( aMinTop, y ); - aMaxBottom = QMAX( aMaxBottom, y ); + aMinLeft = qMin( aMinLeft,x ); + aMaxRight = qMax( aMaxRight, x ); + aMinTop = qMin( aMinTop, y ); + aMaxBottom = qMax( aMaxBottom, y ); } aLeft = (aMinLeft/* + xPan*/)*xScale + aWidth / 2; @@ -518,6 +538,11 @@ QRect* GLViewer_Viewer2d::getWinObjectRect( GLViewer_Object* theObject ) return newRect; } +/*! + Translates rect in window CS to rect in global CS + \param theRect - rectangle to be translated + \return transformed rect +*/ GLViewer_Rect GLViewer_Viewer2d::getGLVRect( const QRect& theRect ) const { if ( !getActiveView() ) @@ -531,6 +556,11 @@ GLViewer_Rect GLViewer_Viewer2d::getGLVRect( const QRect& theRect ) const return vp->win2GLV( theRect ); } +/*! + Translates rect in global CS to rect in window CS + \param theRect - rectangle to be translated + \return transformed rect +*/ QRect GLViewer_Viewer2d::getQRect( const GLViewer_Rect& theRect ) const { if ( !getActiveView() ) @@ -544,87 +574,25 @@ QRect GLViewer_Viewer2d::getQRect( const GLViewer_Rect& theRect ) const return vp->GLV2win( theRect ); } +/*! + \return new selector +*/ GLViewer_Selector* GLViewer_Viewer2d::createSelector() { return new GLViewer_Selector2d( this, getGLContext() ); } +/*! + \return new Transformer + \param type - type of new transformer +*/ GLViewer_ViewTransformer* GLViewer_Viewer2d::createTransformer( int type ) { return new GLViewer_View2dTransformer( this, type ); } -/* -GLViewer_Sketcher* GLViewer_Viewer2d::createGLSketcher( int type ) -{ - return new GLViewer_Sketcher( this, type ); -} - -void GLViewer_Viewer2d::activateGLSketching( int type ) -{ - GLViewer_ViewPort2d* vp = 0; - if ( !getActiveView() || !( vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() ) ) - return; - - // Finish current sketching - if ( type == None ) - { - if ( myGLSketcher->getType() != None ) - { - myGLSketcher->setType( None ); - finishSketching(); - } - } - // Activate new sketching - else - { - activateGLSketching( None ); // concurrency not supported - myGLSketcher->setType( type ); - startSketching(); - } -} - -void GLViewer_Viewer2d::startSketching() -{ - GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort(); - avp->setCursor( *avp->getSketchCursor() ); - //avp->enablePopup( false ); - myGLSketcher->startSketching(); -} - -void GLViewer_Viewer2d::finishSketching() -{ - GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort(); - avp->setCursor( *avp->getDefaultCursor() ); - //avp->enablePopup( true ); - myGLSketcher->finishSketching(); -} - -bool GLViewer_Viewer2d::isSketchingActive() -{ - return myGLSketcher->getType() != None; -} - -int GLViewer_Viewer2d::getSketchingType() -{ - return myGLSketcher->getType(); -} - -void GLViewer_Viewer2d::onSketchDelObject() -{ - GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort(); - avp->setCursor( *avp->getDefaultCursor() ); - myGLSketcher->finishSketching( true ); -} -void GLViewer_Viewer2d::onSketchUndoLast() -{ - -} - -void GLViewer_Viewer2d::onSketchFinish() -{ - finishSketching(); -} +/*! + Custom mouse event handler */ void GLViewer_Viewer2d::onMouseEvent( SUIT_ViewWindow*, QMouseEvent* e ) { @@ -647,11 +615,14 @@ void GLViewer_Viewer2d::onMouseEvent( SUIT_ViewWindow*, QMouseEvent* e ) GLViewer_Viewer::onMouseEvent( 0, e ); } +/*! + Rotation transformation +*/ bool GLViewer_Viewer2d::testRotation( QMouseEvent* e ) { - if ( ( e->button() == GLViewer_View2dTransformer::rotateButton() ) && + if ( ( (int)e->button() == GLViewer_View2dTransformer::rotateButton() ) && // todo Qt::MouseButton is unsigned int: comparison of int with uint ( e->type() == QEvent::MouseButtonPress ) && - ( e->state() & GLViewer_ViewTransformer::accelKey() ) ) + ( e->modifiers() & GLViewer_ViewTransformer::accelKey() ) ) { activateTransform( GLViewer_Viewer::Rotate ); return true; @@ -659,7 +630,11 @@ bool GLViewer_Viewer2d::testRotation( QMouseEvent* e ) return false; } - +/*! + Inserts text lines as header for file + \param aType - file type + \param hFile - file instance +*/ void GLViewer_Viewer2d::insertHeader( VectorFileType aType, QFile& hFile ) { if( aType == POST_SCRIPT ) @@ -674,7 +649,7 @@ void GLViewer_Viewer2d::insertHeader( VectorFileType aType, QFile& hFile ) header += "%%Pages: 1\n"; header += "%%Page: 1\n\n"; - hFile.writeBlock( header.ascii(), header.length() ); + hFile.write( header.toLatin1() ); } else if( aType == HPGL ) { @@ -688,21 +663,26 @@ void GLViewer_Viewer2d::insertHeader( VectorFileType aType, QFile& hFile ) header += "LT;\n"; header += "VS36;\n"; - hFile.writeBlock( header.ascii(), header.length() ); + hFile.write( header.toLatin1() ); } } +/*! + Inserts text lines as ending for file + \param aType - file type + \param hFile - file instance +*/ void GLViewer_Viewer2d::insertEnding( VectorFileType aType, QFile& hFile ) { if( aType == POST_SCRIPT ) { QString ending = "showpage\n\n%%EOF"; - hFile.writeBlock( ending.ascii(), ending.length() ); + hFile.write( ending.toLatin1() ); } else if( aType == HPGL ) { QString ending = "PU;PA0,0;SP;EC;PG1;EC1;OE\n"; - hFile.writeBlock( ending.ascii(), ending.length() ); + hFile.write( ending.toLatin1() ); } } @@ -719,13 +699,20 @@ inline void mm2custom( GLViewer_Viewer2d::VectorFileType aType, double& value ) #endif } +/*! + Translates current view content to vector file + \param aType - type of file + \param FileName - name of file, + \param aPType - paper size type + \param mmLeft, mmRight, mmTop, mmBottom - margins +*/ bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, PaperType aPType, double mmLeft, double mmRight, double mmTop, double mmBottom ) { if ( !getActiveView() ) return false; - QFile hFile( FileName.ascii() ); + QFile hFile( FileName.toUtf8() ); #ifdef WIN32 HDC hMetaFileDC; @@ -774,8 +761,8 @@ bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, Pap if( aType==POST_SCRIPT || aType==HPGL ) { - hFile.open( IO_ReadWrite | IO_Truncate ); - hFile.at( 0 ); + hFile.open( QIODevice::ReadWrite | QIODevice::Truncate ); + hFile.seek( 0 ); insertHeader( aType, hFile ); } #ifdef WIN32 @@ -787,7 +774,20 @@ bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, Pap HDC screen_dc = GetDC( 0 ); //The screen device context HDC bitDC = CreateCompatibleDC ( screen_dc ); //The context compatible with screen - hMetaFileDC = CreateEnhMetaFile( bitDC, FileName.ascii(), &r, "" ); +#ifdef UNICODE + LPTSTR str = new TCHAR[FileName.length() + 1]; + str[FileName.toWCharArray(str)] = '\0'; + LPTSTR empty = L""; +#else + QByteArray arr = FileName.toLatin1(); + LPTSTR str = arr.constData(); + LPTSTR empty = ""; +#endif + + hMetaFileDC = CreateEnhMetaFile( bitDC, str, &r, empty ); +#ifdef UNICODE + delete str; +#endif SetMapMode( hMetaFileDC, MM_HIMETRIC ); SetWindowOrgEx( hMetaFileDC, 0, r.bottom, NULL ); HRGN ClipRgn = CreateRectRgn( 0, 0, AW, AH ); @@ -802,7 +802,7 @@ bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, Pap ReleaseDC( 0, screen_dc ); DeleteDC( bitDC ); - aCurVP->getGLWidget()->translateBackgroundToEMF( hMetaFileDC, &aViewerCS, &aPaperCS ); + aCurVP->getGLWidget()->translateBackgroundToEMF( hMetaFileDC, &aViewerCS, &aPaperCS ); } #endif @@ -813,7 +813,7 @@ bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, Pap arg( AW-mmLeft-mmRight ).arg( AH-mmBottom-mmTop ); //It is set clipping path - hFile.writeBlock( aBuffer.ascii(), aBuffer.length() ); + hFile.write( aBuffer.toLatin1() ); aCurVP->getGLWidget()->translateBackgroundToPS( hFile, &aViewerCS, &aPaperCS ); } @@ -842,7 +842,10 @@ bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, Pap return true; } - +/*! + Repaints view + \param theView - view to be repainted. If it is NULL then all views will be repainted +*/ void GLViewer_Viewer2d::repaintView( GLViewer_ViewFrame* theView, bool makeCurrent ) { GLViewer_ViewFrame* aCurView; @@ -855,7 +858,7 @@ void GLViewer_Viewer2d::repaintView( GLViewer_ViewFrame* theView, bool makeCurre return; ObjList anActiveObjs; - const ObjList& objs = myGLContext->getObjList(); + const ObjList& objs = myGLContext->getObjects(); for( ObjList::const_iterator it = objs.begin(); it != objs.end(); ++it ) { GLViewer_Object* obj = (GLViewer_Object*)(*it); @@ -866,15 +869,15 @@ void GLViewer_Viewer2d::repaintView( GLViewer_ViewFrame* theView, bool makeCurre float xScale; float yScale; - QValueList::Iterator anIt = myDrawers.begin(); - QValueList::Iterator endDIt = myDrawers.end(); + QList::Iterator anIt = myDrawers.begin(); + QList::Iterator endDIt = myDrawers.end(); for( ; anIt != endDIt; anIt++ ) (*anIt)->clear(); - QValueList anActiveDrawers; - QValueList::Iterator endOIt = anActiveObjs.end(); + QList anActiveDrawers; + QList::Iterator endOIt = anActiveObjs.end(); - for( QValueList::Iterator oit = anActiveObjs.begin(); oit != endOIt; ++oit ) + for( QList::Iterator oit = anActiveObjs.begin(); oit != endOIt; ++oit ) { GLViewer_Drawer* aDrawer = (*oit)->getDrawer(); if( !aDrawer ) @@ -896,12 +899,12 @@ void GLViewer_Viewer2d::repaintView( GLViewer_ViewFrame* theView, bool makeCurre } } aDrawer->addObject( (*oit) ); - if( anActiveDrawers.findIndex( aDrawer ) == -1 ) + if( anActiveDrawers.indexOf( aDrawer ) == -1 ) anActiveDrawers.append( aDrawer ); } - QValueList::Iterator aDIt = anActiveDrawers.begin(); - QValueList::Iterator aDEndIt = anActiveDrawers.end(); + QList::Iterator aDIt = anActiveDrawers.begin(); + QList::Iterator aDEndIt = anActiveDrawers.end(); GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )aCurView->getViewPort(); vp->getScale( xScale, yScale ); @@ -918,6 +921,9 @@ void GLViewer_Viewer2d::repaintView( GLViewer_ViewFrame* theView, bool makeCurre // ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() )->getGLWidget()->makeCurrent(); } +/*! + Starts some operation on mouse event +*/ void GLViewer_Viewer2d::startOperations( QMouseEvent* e ) { GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort(); @@ -934,6 +940,9 @@ void GLViewer_Viewer2d::startOperations( QMouseEvent* e ) vp->startSelectByRect( e->x(), e->y() ); } +/*! + Updates started operation on mouse event +*/ bool GLViewer_Viewer2d::updateOperations( QMouseEvent* e ) { GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort(); @@ -957,6 +966,9 @@ bool GLViewer_Viewer2d::updateOperations( QMouseEvent* e ) return false; } +/*! + Completes started operation on mouse event +*/ void GLViewer_Viewer2d::finishOperations( QMouseEvent* e ) { GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort(); @@ -974,12 +986,15 @@ void GLViewer_Viewer2d::finishOperations( QMouseEvent* e ) vp->finishSelectByRect(); if ( getSelector() && !aSelRect.isNull() ) { - bool append = bool ( e->state() & GLViewer_Selector::appendKey() ); + bool append = bool ( e->modifiers() & GLViewer_Selector::appendKey() ); getSelector()->select( aSelRect, append ); } } } +/*! + Starts some operation on mouse wheel event +*/ void GLViewer_Viewer2d::startOperations( QWheelEvent* e ) { bool zoomIn = e->delta() > 0; @@ -990,26 +1005,18 @@ void GLViewer_Viewer2d::startOperations( QWheelEvent* e ) update = anObject->updateZoom( zoomIn ) || update; } + emit wheelZoomChange( zoomIn ); + if( update ) updateAll(); } -/*! - Processes "Dump view..." context popup menu command -*/ -void GLViewer_Viewer2d::onDumpView() -{ - if ( getActiveView() ) - getActiveView()->onDumpView(); -} - -/**************************************************************** -** Class: GLViewer_View2dTransformer -** -*****************************************************************/ -int GLViewer_View2dTransformer::rotateBtn = RightButton; +int GLViewer_View2dTransformer::rotateBtn = Qt::RightButton; +/*! + Constructor +*/ GLViewer_View2dTransformer::GLViewer_View2dTransformer( GLViewer_Viewer* viewer, int typ ) : GLViewer_ViewTransformer( viewer, typ ) { @@ -1017,6 +1024,9 @@ GLViewer_View2dTransformer::GLViewer_View2dTransformer( GLViewer_Viewer* viewer, initTransform( true ); } +/*! + Destructor +*/ GLViewer_View2dTransformer::~GLViewer_View2dTransformer() { if ( type() == GLViewer_Viewer::Rotate ) @@ -1033,7 +1043,6 @@ void GLViewer_View2dTransformer::exec() /* additional transforms */ GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort(); - //QAD_ASSERT( vp->inherits( "QAD_ViewPort3d" ) ); GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)vp; switch ( myType ) { @@ -1055,7 +1064,6 @@ void GLViewer_View2dTransformer::onTransform( TransformState state ) return; GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort(); - //QAD_ASSERT( vp->inherits( "QAD_ViewPort3d" ) ); GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)vp; if ( type() == GLViewer_Viewer::Rotate ) { @@ -1077,4 +1085,3 @@ void GLViewer_View2dTransformer::onTransform( TransformState state ) } GLViewer_ViewTransformer::onTransform( state ); } -