1 // Copyright (C) 2005 OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
19 // Author : OPEN CASCADE
22 // File: GLViewer_Viewer2d.cxx
23 // Created: November, 2004
25 /***************************************************************************
26 ** Class: GLViewer_Viewer2d
27 ** Descr: OpenGL Viewer 2D
29 ** Created: UI team, 04.09.02
30 ****************************************************************************/
32 //#include <GLViewerAfx.h>
33 #include "GLViewer_Viewer2d.h"
34 #include "GLViewer_Object.h"
35 #include "GLViewer_BaseObjects.h"
36 #include "GLViewer_CoordSystem.h"
37 #include "GLViewer_Context.h"
38 #include "GLViewer_Drawer.h"
39 #include "GLViewer_Selector2d.h"
40 //#include "GLViewer_Sketcher.h"
41 #include "GLViewer_ViewPort2d.h"
43 #include "SUIT_Desktop.h"
44 #include "SUIT_ViewWindow.h"
46 #include "OSD_Timer.hxx"
47 #include <TColStd_MapOfInteger.hxx>
49 #include <qpopupmenu.h>
50 #include <qpointarray.h>
51 #include <qcolordialog.h>
53 GLViewer_Viewer2d::GLViewer_Viewer2d( const QString& title) :
54 GLViewer_Viewer( title )
56 myGLContext = new GLViewer_Context( this );
58 //myGLSketcher = new GLViewer_Sketcher( this );
62 mySelMode = GLViewer_Viewer::Multiple;
67 GLViewer_Viewer2d::~GLViewer_Viewer2d()
70 //delete myGLSketcher;
71 GLViewer_TexFont::clearTextBases();
74 SUIT_ViewWindow* GLViewer_Viewer2d::createView( SUIT_Desktop* theDesktop )
76 return new GLViewer_ViewFrame( theDesktop, this );
79 void GLViewer_Viewer2d::addPopupItems( QPopupMenu* thePopup )
81 // CTH8434. "Change background color" menu item is available if there are no selected objects
82 if ( getSelector() == 0 || getSelector()->numSelected() == 0 )
84 if( thePopup->count() > 0 )
85 thePopup->insertSeparator();
86 thePopup->insertItem( tr( "CHANGE_BGCOLOR" ), this, SLOT( onChangeBgColor() ) );
90 void GLViewer_Viewer2d::onChangeBgColor()
92 if( !getActiveView() )
94 GLViewer_ViewPort2d* vp = ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() );
96 QColor selColor = QColorDialog::getColor( vp->backgroundColor(), vp );
97 if ( selColor.isValid() ) {
98 vp->setBackgroundColor( selColor );
102 void GLViewer_Viewer2d::updateColors( QColor colorH, QColor colorS )
104 // cout << "GLViewer_Viewer2d::updateColors" << endl;
107 for ( DrawerMap::Iterator it = myDrawers.begin(); it != myDrawers.end(); ++it )
109 it.key()->setHColor( colorH );
110 it.key()->setSColor( colorS );
114 ObjList anObjects = myGLContext->getObjects();
115 ObjList::Iterator beginIt = anObjects.begin();
116 ObjList::Iterator endIt = anObjects.end();
117 for ( ObjList::Iterator it = beginIt; it != endIt; ++it )
119 //GLViewer_Drawer* aDrawer = (*it)->getDrawer();
120 //aDrawer->setHColor( colorH );
121 //aDrawer->setSColor( colorS );
126 activateAllDrawers( TRUE );
129 void GLViewer_Viewer2d::updateBorders( GLViewer_Rect* theRect )
131 QPtrVector<SUIT_ViewWindow> views = getViewManager()->getViews();
132 for ( int i = 0, n = views.count(); i < n; i++ )
134 GLViewer_Rect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder();
136 border->setLeft( QMIN( border->left(), theRect->left() ) );
137 border->setRight( QMAX( border->right(), theRect->right() ) );
138 border->setBottom( QMIN( border->bottom(), theRect->bottom() ) );
139 border->setTop( QMAX( border->top(), theRect->top() ) );
143 void GLViewer_Viewer2d::updateBorders()
145 QPtrVector<SUIT_ViewWindow> views = getViewManager()->getViews();
147 ObjList anObjects = myGLContext->getObjects();
148 ObjList::Iterator beginIt = anObjects.begin();
149 ObjList::Iterator endIt = anObjects.end();
150 for ( int i = 0, n = views.count(); i < n; i++ )
152 GLViewer_Rect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder();
155 border->setIsEmpty( true );
156 // initialise border by default values to avoid old values
157 border->setCoords( 0, 0, 0, 0 );
158 for ( ObjList::Iterator it = beginIt; it != endIt; ++it )
160 GLViewer_Object* anObject = *it;
161 GLViewer_Rect* aRect = anObject->getRect();
162 if( !anObject->isSelectable() || !anObject->getVisible() )
165 if( border->isEmpty() )
167 border->setIsEmpty( false );
168 border->setCoords( aRect->left(), aRect->right(), aRect->bottom(), aRect->top() );
172 border->setLeft( QMIN( border->left(), aRect->left() ) );
173 border->setRight( QMAX( border->right(), aRect->right() ) );
174 border->setBottom( QMIN( border->bottom(), aRect->bottom() ) );
175 border->setTop( QMAX( border->top(), aRect->top() ) );
181 void GLViewer_Viewer2d::updateAll()
183 if ( !getActiveView() )
186 QPtrVector<SUIT_ViewWindow> views = getViewManager()->getViews();
187 for ( int i = 0, n = views.count(); i < n; i++ )
188 ( ( GLViewer_ViewPort2d* )( ( GLViewer_ViewFrame* )views[i] )->getViewPort() )->getGLWidget()->updateGL();
191 void GLViewer_Viewer2d::updateDrawers( GLboolean update, GLfloat scX, GLfloat scY )
193 // cout << "GLViewer_Viewer2d::updateDrawers" << endl;
195 //myGLContext->updateScales( scX, scY );
196 //myGLSketcher->drawContour();
197 activateAllDrawers( update );
200 void GLViewer_Viewer2d::activateDrawers( QValueList<GLViewer_Object*>& theObjects, bool onlyUpdate, GLboolean swap )
202 //cout << "GLViewer_Viewer2d::activateDrawers " << (int)onlyUpdate << " " << (int)swap << endl;
203 QValueList<GLViewer_Drawer*>::Iterator anIt = myDrawers.begin();
204 QValueList<GLViewer_Drawer*>::Iterator endDIt = myDrawers.end();
205 for( ; anIt != endDIt; anIt++ )
208 QValueList<GLViewer_Drawer*> anActiveDrawers;
209 QValueList<GLViewer_Object*>::Iterator endOIt = theObjects.end();
211 for( QValueList<GLViewer_Object*>::Iterator oit = theObjects.begin(); oit != endOIt; ++oit )
213 GLViewer_Drawer* aDrawer = (*oit)->getDrawer();
216 anIt = myDrawers.begin();
217 endDIt = myDrawers.end();
219 for( ; anIt != endDIt; anIt++ )
220 if( (*anIt)->getObjectType() == (*oit)->getObjectType() )
222 (*oit)->setDrawer( *anIt );
229 myDrawers.append( (*oit)->createDrawer() );
230 aDrawer = (*oit)->getDrawer();
233 aDrawer->addObject( (*oit) );
235 int aPriority = aDrawer->getPriority();
237 if( anActiveDrawers.findIndex( aDrawer ) != -1 )
240 QValueList<GLViewer_Drawer*>::Iterator aDIt = anActiveDrawers.begin();
241 QValueList<GLViewer_Drawer*>::Iterator aDEndIt = anActiveDrawers.end();
242 for( ; aDIt != aDEndIt; ++aDIt )
243 if( (*aDIt)->getPriority() > aPriority )
246 anActiveDrawers.insert( aDIt, aDrawer );
249 QValueList<GLViewer_Drawer*>::Iterator aDIt = anActiveDrawers.begin();
250 QValueList<GLViewer_Drawer*>::Iterator aDEndIt = anActiveDrawers.end();
252 QPtrVector<SUIT_ViewWindow> views = getViewManager()->getViews();
253 for ( int i = 0, n = views.count(); i < n; i++ )
255 float xScale, yScale;
256 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort();
257 vp->getScale( xScale, yScale );
258 vp->getGLWidget()->makeCurrent();
260 for( ; aDIt != aDEndIt; aDIt++ )
262 GLViewer_Drawer* aDrawer = *aDIt;
264 aDrawer->create( xScale, yScale, onlyUpdate );
268 GLViewer_Rect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder();
269 (*aDIt)->drawRectangle( border, Qt::blue );
271 QString coords = QString::number( border->left() ) + " " + QString::number( border->right() ) + " " +
272 QString::number( border->bottom() ) + " " + QString::number( border->top() );
273 (*aDIt)->drawText( "Border : " + coords, border->left(), border->top() + 10 / yScale,
274 Qt::blue, &QFont( "Courier", 8, QFont::Normal ), 2 );
277 vp->getGLWidget()->swapBuffers();
280 ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() )->getGLWidget()->makeCurrent();
283 void GLViewer_Viewer2d::activateDrawer( GLViewer_Object* theObject, bool onlyUpdate, GLboolean swap )
286 aList.append( theObject );
287 activateDrawers( aList, onlyUpdate, swap );
290 void GLViewer_Viewer2d::activateAllDrawers( bool onlyUpdate, GLboolean swap )
292 if ( !getActiveView() )
295 ObjList anActiveObjs;
296 const ObjList& objs = myGLContext->getObjects();
297 for( ObjList::const_iterator it = objs.begin(); it != objs.end(); ++it )
299 GLViewer_Object* obj = (GLViewer_Object*)(*it);
300 if( obj->getVisible() )
301 anActiveObjs.append( obj );
304 activateDrawers( anActiveObjs, onlyUpdate, swap );
307 void GLViewer_Viewer2d::onCreateGLMarkers( int theMarkersNum, int theMarkersRad )
309 if ( !getActiveView() )
312 GLViewer_MarkerSet* aMarkerSet = new GLViewer_MarkerSet( theMarkersNum, theMarkersRad );
313 getGLContext()->insertObject( aMarkerSet );
315 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
316 int vpWidth = vp->getWidth();
317 int vpHeight = vp->getHeight();
319 float* aXCoord = new float[ theMarkersNum ];
320 float* anYCoord = new float[ theMarkersNum ];
323 for ( long i = 0; i < theMarkersNum; i++ )
325 aXCoord[i] = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpWidth / 2.);
326 anYCoord[i] = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpHeight / 2.);
329 aMarkerSet->setXCoord( aXCoord, theMarkersNum );
330 aMarkerSet->setYCoord( anYCoord, theMarkersNum );
331 aMarkerSet->compute();
333 updateBorders( aMarkerSet->getRect() );
335 activateAllDrawers( false );
336 activateTransform( GLViewer_Viewer::FitAll );
342 void GLViewer_Viewer2d::onCreateGLPolyline( int theAnglesNum, int theRadius, int thePolylineNumber )
344 if ( !getActiveView() )
347 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
348 int vpWidth = vp->getWidth();
349 int vpHeight = vp->getHeight();
351 float* aXCoord = new float[ theAnglesNum ];
352 float* anYCoord = new float[ theAnglesNum ];
354 //srand( ( unsigned )time( NULL ) );
356 for( int j = 0; j < thePolylineNumber; j++)
358 GLViewer_Polyline* aPolyline = new GLViewer_Polyline( theAnglesNum, theRadius );
359 getGLContext()->insertObject( aPolyline );
361 float aXOffset = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpWidth / 2.);
362 float anYOffset = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpHeight / 2.);
363 for( int i = 0; i < theAnglesNum; i++ )
365 aXCoord[i] = cos( 2. * PI * i / theAnglesNum ) * theRadius + aXOffset;
366 anYCoord[i] = sin( 2. * PI * i / theAnglesNum ) * theRadius + anYOffset;
369 aPolyline->setHighSelAll( true );
370 aPolyline->setClosed( true );
371 aPolyline->setXCoord( aXCoord, theAnglesNum );
372 aPolyline->setYCoord( anYCoord, theAnglesNum );
373 aPolyline->compute();
375 updateBorders( aPolyline->getRect() );
378 activateAllDrawers( false );
379 activateTransform( GLViewer_Viewer::FitAll );
385 void GLViewer_Viewer2d::onCreateGLText( QString theStr, int theTextNumber )
387 if ( !getActiveView() )
390 if( theTextNumber <= 0 )
393 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
394 int vpWidth = vp->getWidth();
395 int vpHeight = vp->getHeight();
397 //srand( ( unsigned )time( NULL ) );
399 for( int j = 0; j < theTextNumber; j++)
401 float aXPos = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpWidth / 2.);
402 float anYPos = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpHeight / 2.);
403 QColor aColor( 255, 0, 255 );
405 GLViewer_TextObject* aText = new GLViewer_TextObject( theStr, aXPos, anYPos, aColor );
407 getGLContext()->insertObject( aText );
409 updateBorders( aText->getRect() );
412 activateAllDrawers( false );
415 void GLViewer_Viewer2d::transPoint( GLfloat& x, GLfloat& y )
417 if ( !getActiveView() )
420 GLfloat xScale, yScale;
423 GLViewer_ViewPort2d* curvp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
425 curvp->getScale( xScale, yScale );
426 curvp->getPan( xPan, yPan );
428 GLfloat a = curvp->getGLWidget()->getRotationAngle() * PI / 180.;
430 x = ( x - ( GLfloat )curvp->getWidth() / 2 ) / xScale;
431 y = ( -y + ( GLfloat )curvp->getHeight() / 2 ) / yScale;
436 x = x1 * cos(a) + y1 * sin(a);
437 y = -x1 * sin(a) + y1 * cos(a);
443 QRect* GLViewer_Viewer2d::getWinObjectRect( GLViewer_Object* theObject )
445 if ( !getActiveView() )
448 GLfloat xScale, yScale;
451 GLViewer_ViewPort2d* curvp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
452 GLfloat aWidth = curvp->getWidth();
453 GLfloat aHeight = curvp->getHeight();
456 curvp->getScale( xScale, yScale );
457 curvp->getPan( xPan, yPan );
459 QRect aObjRect = theObject->getRect()->toQRect();
460 float aLeft = aObjRect.left() + xPan, aRight = aObjRect.right() + xPan;
461 float aTop = aObjRect.top() + yPan, aBot = aObjRect.bottom() + yPan;
463 GLfloat anAngle = curvp->getGLWidget()->getRotationAngle() * PI / 180.;
465 QPointArray aPointArray(4);
466 aPointArray[0] = QPoint( (int)(aLeft*cos(anAngle) - aTop*sin(anAngle)),
467 (int)(aLeft*sin(anAngle) + aTop*cos(anAngle)) );
468 aPointArray[1] = QPoint( (int)(aRight*cos(anAngle) - aTop*sin(anAngle)),
469 (int)(aRight*sin(anAngle) + aTop*cos(anAngle)) );
470 aPointArray[2] = QPoint( (int)(aRight*cos(anAngle) - aBot*sin(anAngle)),
471 (int)(aRight*sin(anAngle) + aBot*cos(anAngle)) );
472 aPointArray[3] = QPoint( (int)(aLeft*cos(anAngle) - aBot*sin(anAngle)),
473 (int)(aLeft*sin(anAngle) + aBot*cos(anAngle)) );
475 int aMinLeft = aPointArray[0].x(), aMaxRight = aPointArray[0].x(),
476 aMinTop = aPointArray[0].y(), aMaxBottom = aPointArray[0].y();
477 for( int i = 1; i < 4; i++ )
479 int x = aPointArray[i].x();
480 int y = aPointArray[i].y();
481 aMinLeft = QMIN( aMinLeft,x );
482 aMaxRight = QMAX( aMaxRight, x );
483 aMinTop = QMIN( aMinTop, y );
484 aMaxBottom = QMAX( aMaxBottom, y );
487 aLeft = (aMinLeft/* + xPan*/)*xScale + aWidth / 2;
488 aRight = (aMaxRight/* + xPan*/)*xScale + aWidth / 2;
490 aTop = -( (aMaxBottom/* + yPan*/)*yScale - aHeight / 2 );
491 aBot = -( (aMinTop/* + yPan*/)*yScale - aHeight / 2 );
493 QRect* newRect = new QRect( (int)aLeft, (int)aTop, (int)(aRight-aLeft), (int)(aBot-aTop) );
498 GLViewer_Rect GLViewer_Viewer2d::getGLVRect( const QRect& theRect ) const
500 if ( !getActiveView() )
501 return GLViewer_Rect();
503 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
506 return GLViewer_Rect();
508 return vp->win2GLV( theRect );
511 QRect GLViewer_Viewer2d::getQRect( const GLViewer_Rect& theRect ) const
513 if ( !getActiveView() )
516 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
521 return vp->GLV2win( theRect );
524 GLViewer_Selector* GLViewer_Viewer2d::createSelector()
526 return new GLViewer_Selector2d( this, getGLContext() );
529 GLViewer_ViewTransformer* GLViewer_Viewer2d::createTransformer( int type )
531 return new GLViewer_View2dTransformer( this, type );
534 GLViewer_Sketcher* GLViewer_Viewer2d::createGLSketcher( int type )
536 return new GLViewer_Sketcher( this, type );
539 void GLViewer_Viewer2d::activateGLSketching( int type )
541 GLViewer_ViewPort2d* vp = 0;
542 if ( !getActiveView() || !( vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() ) )
545 // Finish current sketching
548 if ( myGLSketcher->getType() != None )
550 myGLSketcher->setType( None );
554 // Activate new sketching
557 activateGLSketching( None ); // concurrency not supported
558 myGLSketcher->setType( type );
563 void GLViewer_Viewer2d::startSketching()
565 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort();
566 avp->setCursor( *avp->getSketchCursor() );
567 //avp->enablePopup( false );
568 myGLSketcher->startSketching();
571 void GLViewer_Viewer2d::finishSketching()
573 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort();
574 avp->setCursor( *avp->getDefaultCursor() );
575 //avp->enablePopup( true );
576 myGLSketcher->finishSketching();
579 bool GLViewer_Viewer2d::isSketchingActive()
581 return myGLSketcher->getType() != None;
584 int GLViewer_Viewer2d::getSketchingType()
586 return myGLSketcher->getType();
589 void GLViewer_Viewer2d::onSketchDelObject()
591 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort();
592 avp->setCursor( *avp->getDefaultCursor() );
593 myGLSketcher->finishSketching( true );
596 void GLViewer_Viewer2d::onSketchUndoLast()
601 void GLViewer_Viewer2d::onSketchFinish()
606 void GLViewer_Viewer2d::onMouseEvent( SUIT_ViewWindow*, QMouseEvent* e )
608 if ( !getActiveView() )
611 //if ( testRotation( e ) )
616 case QEvent::MouseButtonPress :
617 case QEvent::MouseMove :
618 case QEvent::MouseButtonRelease :
619 //if( myGLSketcher->getType() != None )
620 // myGLSketcher->sketch( e );
624 GLViewer_Viewer::onMouseEvent( 0, e );
627 bool GLViewer_Viewer2d::testRotation( QMouseEvent* e )
629 if ( ( e->button() == GLViewer_View2dTransformer::rotateButton() ) &&
630 ( e->type() == QEvent::MouseButtonPress ) &&
631 ( e->state() & GLViewer_ViewTransformer::accelKey() ) )
633 activateTransform( GLViewer_Viewer::Rotate );
640 void GLViewer_Viewer2d::insertHeader( VectorFileType aType, QFile& hFile )
642 if( aType == POST_SCRIPT )
644 QString header = "%!PS-Adobe-3.0\n";
645 header += "%%Creator: OpenCascade 2004\n";
646 header += "%%Title: Our document\n";
647 header += "%%PageOrder: Ascend\n";
648 header += "%%Orientation: Portrait\n";
649 header += "%%LanguageLevel: 2\n";
651 header += "%%Pages: 1\n";
652 header += "%%Page: 1\n\n";
654 hFile.writeBlock( header.ascii(), header.length() );
656 else if( aType == HPGL )
658 QString header = "[Esc].(;\n";
659 header += "[Esc].I81;;17:\n";
660 header += "[Esc].N;19:\n";
668 hFile.writeBlock( header.ascii(), header.length() );
672 void GLViewer_Viewer2d::insertEnding( VectorFileType aType, QFile& hFile )
674 if( aType == POST_SCRIPT )
676 QString ending = "showpage\n\n%%EOF";
677 hFile.writeBlock( ending.ascii(), ending.length() );
679 else if( aType == HPGL )
681 QString ending = "PU;PA0,0;SP;EC;PG1;EC1;OE\n";
682 hFile.writeBlock( ending.ascii(), ending.length() );
686 inline void mm2custom( GLViewer_Viewer2d::VectorFileType aType, double& value )
688 if( aType==GLViewer_Viewer2d::POST_SCRIPT )
689 value*=2.8346; //mm to pt
691 else if( aType==GLViewer_Viewer2d::HPGL )
692 value*=40; //mm to plu (there are 40 plues in mm)
694 else if( aType==GLViewer_Viewer2d::ENH_METAFILE )
695 value*=100; //this unit is 1/100 mm
699 bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, PaperType aPType,
700 double mmLeft, double mmRight, double mmTop, double mmBottom )
702 if ( !getActiveView() )
705 QFile hFile( FileName.ascii() );
711 GLViewer_ViewPort2d* aCurVP = (GLViewer_ViewPort2d*) getActiveView()->getViewPort();
714 aCurVP->getPan( xPan, yPan );
715 GLfloat aRotation = aCurVP->getGLWidget()->getRotationAngle() * 3.14159265 / 180.0;
717 GLViewer_CoordSystem aViewerCS( GLViewer_CoordSystem::Cartesian, xPan, yPan, 1.0, 1.0, aRotation );
719 double AW = Sizes[2*int(aPType)],
720 AH = Sizes[2*int(aPType)+1]; //size of Axx paper in mm
722 mm2custom( aType, mmLeft ); //we translate mm to custom units
723 mm2custom( aType, mmRight );
724 mm2custom( aType, mmTop );
725 mm2custom( aType, mmBottom );
726 mm2custom( aType, AW );
727 mm2custom( aType, AH );
729 float xScale, yScale;
730 aCurVP->getScale( xScale, yScale );
732 double VPWidth = aCurVP->getWidth()/xScale, //the width in reference units
733 VPHeight = aCurVP->getHeight()/yScale;
735 double k1 = ( AW-mmLeft-mmRight ) / VPWidth,
736 k2 = ( AH-mmTop-mmBottom ) / VPHeight;
739 k1 = k2; //We select the minimum
741 double hdelta = ( AW-mmLeft-mmRight - VPWidth * k1 )/2.0, //addition in horizontal
742 vdelta = ( AH-mmTop-mmBottom - VPHeight * k1 )/2.0; //addition in vertical
744 mmLeft += hdelta; //The real free space on the left and right borders
749 GLViewer_CoordSystem aPaperCS( GLViewer_CoordSystem::Cartesian,
750 -(mmLeft/k1+VPWidth/2.0), -(mmBottom/k1+VPHeight/2.0), 1/k1, 1/k1 );
752 if( aType==POST_SCRIPT || aType==HPGL )
754 hFile.open( IO_ReadWrite | IO_Truncate );
756 insertHeader( aType, hFile );
759 else if( aType==ENH_METAFILE )
762 r.left = 0; r.right = AW;
763 r.top = 0; r.bottom = AH;
764 HDC screen_dc = GetDC( 0 ); //The screen device context
765 HDC bitDC = CreateCompatibleDC ( screen_dc ); //The context compatible with screen
767 hMetaFileDC = CreateEnhMetaFile( bitDC, FileName.ascii(), &r, "" );
768 SetMapMode( hMetaFileDC, MM_HIMETRIC );
769 SetWindowOrgEx( hMetaFileDC, 0, r.bottom, NULL );
770 HRGN ClipRgn = CreateRectRgn( 0, 0, AW, AH );
771 SelectClipRgn( hMetaFileDC, ClipRgn );
774 aBrushData.lbColor = RGB( 255, 255, 255 );
775 aBrushData.lbStyle = BS_SOLID;
777 FillRect( hMetaFileDC, &r, CreateBrushIndirect( &aBrushData ) );
779 ReleaseDC( 0, screen_dc );
782 aCurVP->getGLWidget()->translateBackgroundToEMF( hMetaFileDC, &aViewerCS, &aPaperCS );
786 if( aType==POST_SCRIPT )
788 QString temp = "%1 %2 %3 %4 rectclip\n\n",
789 aBuffer = temp.arg( mmLeft ).arg( mmBottom ).
790 arg( AW-mmLeft-mmRight ).arg( AH-mmBottom-mmTop );
791 //It is set clipping path
793 hFile.writeBlock( aBuffer.ascii(), aBuffer.length() );
795 aCurVP->getGLWidget()->translateBackgroundToPS( hFile, &aViewerCS, &aPaperCS );
799 for( int i=0, n=myDrawers.count(); i<n; i++ )
800 if( aType==POST_SCRIPT )
801 result &= myDrawers[ i ]->translateToPS( hFile, &aViewerCS, &aPaperCS );
802 else if( aType==HPGL )
803 result &= myDrawers[ i ]->translateToHPGL( hFile, &aViewerCS, &aPaperCS );
805 else if( aType==ENH_METAFILE )
806 result &= myDrawers[ i ]->translateToEMF( hMetaFileDC, &aViewerCS, &aPaperCS );
809 if( aType==POST_SCRIPT || aType==HPGL )
811 insertEnding( aType, hFile);
815 else if( aType==ENH_METAFILE )
816 DeleteEnhMetaFile( CloseEnhMetaFile( hMetaFileDC ) );
823 void GLViewer_Viewer2d::repaintView( GLViewer_ViewFrame* theView, bool makeCurrent )
825 GLViewer_ViewFrame* aCurView;
827 aCurView = (GLViewer_ViewFrame*)getActiveView();
834 ObjList anActiveObjs;
835 const ObjList& objs = myGLContext->getObjects();
836 for( ObjList::const_iterator it = objs.begin(); it != objs.end(); ++it )
838 GLViewer_Object* obj = (GLViewer_Object*)(*it);
839 if( obj->getVisible() )
840 anActiveObjs.append( obj );
846 QValueList<GLViewer_Drawer*>::Iterator anIt = myDrawers.begin();
847 QValueList<GLViewer_Drawer*>::Iterator endDIt = myDrawers.end();
848 for( ; anIt != endDIt; anIt++ )
851 QValueList<GLViewer_Drawer*> anActiveDrawers;
852 QValueList<GLViewer_Object*>::Iterator endOIt = anActiveObjs.end();
854 for( QValueList<GLViewer_Object*>::Iterator oit = anActiveObjs.begin(); oit != endOIt; ++oit )
856 GLViewer_Drawer* aDrawer = (*oit)->getDrawer();
859 anIt = myDrawers.begin();
861 for( ; anIt != endDIt; anIt++ )
862 if( (*anIt)->getObjectType() == (*oit)->getObjectType() )
864 (*oit)->setDrawer( *anIt );
869 if( !aDrawer ) //are not exists
871 myDrawers.append( (*oit)->createDrawer() );
872 aDrawer = (*oit)->getDrawer();
875 aDrawer->addObject( (*oit) );
876 if( anActiveDrawers.findIndex( aDrawer ) == -1 )
877 anActiveDrawers.append( aDrawer );
880 QValueList<GLViewer_Drawer*>::Iterator aDIt = anActiveDrawers.begin();
881 QValueList<GLViewer_Drawer*>::Iterator aDEndIt = anActiveDrawers.end();
883 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )aCurView->getViewPort();
884 vp->getScale( xScale, yScale );
887 vp->getGLWidget()->makeCurrent();
889 for( ; aDIt != aDEndIt; aDIt++ )
890 (*aDIt)->create( xScale, yScale, false );
893 vp->getGLWidget()->swapBuffers();
895 // ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() )->getGLWidget()->makeCurrent();
898 void GLViewer_Viewer2d::startOperations( QMouseEvent* e )
900 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort();
902 float x = e->pos().x();
903 float y = e->pos().y();
905 GLViewer_Pnt point( x, y );
907 if( e->button() == Qt::LeftButton && !myGLContext->getCurrentObject() && vp->startPulling( point ) )
910 if( e->button() == Qt::LeftButton && !(vp->currentBlock() & BS_Selection) && !myGLContext->getCurrentObject() )
911 vp->startSelectByRect( e->x(), e->y() );
914 bool GLViewer_Viewer2d::updateOperations( QMouseEvent* e )
916 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort();
918 if( vp->isPulling() )
920 float x = e->pos().x();
921 float y = e->pos().y();
924 vp->drawPulling( GLViewer_Pnt( x, y ) );
929 if( !myGLContext->getCurrentObject() )
931 vp->drawSelectByRect( e->x(), e->y() );
937 void GLViewer_Viewer2d::finishOperations( QMouseEvent* e )
939 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort();
941 if( vp->isPulling() )
948 if( !myGLContext->getCurrentObject() )
950 QRect aSelRect = vp->selectionRect();
951 vp->finishSelectByRect();
952 if ( getSelector() && !aSelRect.isNull() )
954 bool append = bool ( e->state() & GLViewer_Selector::appendKey() );
955 getSelector()->select( aSelRect, append );
960 void GLViewer_Viewer2d::startOperations( QWheelEvent* e )
962 bool zoomIn = e->delta() > 0;
964 for( myGLContext->InitSelected(); myGLContext->MoreSelected(); myGLContext->NextSelected() )
966 GLViewer_Object* anObject = myGLContext->SelectedObject();
967 update = anObject->updateZoom( zoomIn ) || update;
975 /****************************************************************
976 ** Class: GLViewer_View2dTransformer
978 *****************************************************************/
980 int GLViewer_View2dTransformer::rotateBtn = RightButton;
982 GLViewer_View2dTransformer::GLViewer_View2dTransformer( GLViewer_Viewer* viewer, int typ )
983 : GLViewer_ViewTransformer( viewer, typ )
985 if ( type() == GLViewer_Viewer::Rotate )
986 initTransform( true );
989 GLViewer_View2dTransformer::~GLViewer_View2dTransformer()
991 if ( type() == GLViewer_Viewer::Rotate )
992 initTransform( false );
996 Redefined to provide specific 3D transfomations. [ virtual public ]
998 void GLViewer_View2dTransformer::exec()
1000 if ( !myViewer->getActiveView() )
1003 /* additional transforms */
1004 GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
1005 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)vp;
1008 case GLViewer_Viewer::Rotate:
1009 myMajorBtn = rotateButton();
1010 avp->setCursor( *avp->getRotCursor() );
1013 GLViewer_ViewTransformer::exec();
1018 Handles rotation. [ protected virtual ]
1020 void GLViewer_View2dTransformer::onTransform( TransformState state )
1022 if ( !myViewer->getActiveView() )
1025 GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
1026 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)vp;
1027 if ( type() == GLViewer_Viewer::Rotate )
1032 if ( myButtonState & myMajorBtn )
1033 avp->startRotation( myStart.x(), myStart.y() );
1036 if ( myButtonState & myMajorBtn )
1037 avp->rotate( myCurr.x(), myCurr.y() );
1045 GLViewer_ViewTransformer::onTransform( state );