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();
235 aDrawer->addObject( (*oit) );
237 int aPriority = aDrawer->getPriority();
239 if( anActiveDrawers.findIndex( aDrawer ) != -1 )
242 QValueList<GLViewer_Drawer*>::Iterator aDIt = anActiveDrawers.begin();
243 QValueList<GLViewer_Drawer*>::Iterator aDEndIt = anActiveDrawers.end();
244 for( ; aDIt != aDEndIt; ++aDIt )
245 if( (*aDIt)->getPriority() > aPriority )
248 anActiveDrawers.insert( aDIt, aDrawer );
251 QValueList<GLViewer_Drawer*>::Iterator aDIt = anActiveDrawers.begin();
252 QValueList<GLViewer_Drawer*>::Iterator aDEndIt = anActiveDrawers.end();
254 QPtrVector<SUIT_ViewWindow> views = getViewManager()->getViews();
255 for ( int i = 0, n = views.count(); i < n; i++ )
257 float xScale, yScale;
258 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort();
259 vp->getScale( xScale, yScale );
260 vp->getGLWidget()->makeCurrent();
262 for( ; aDIt != aDEndIt; aDIt++ )
264 GLViewer_Drawer* aDrawer = *aDIt;
266 aDrawer->create( xScale, yScale, onlyUpdate );
270 GLViewer_Rect* border = ( ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)views[i])->getViewPort() )->getBorder();
271 (*aDIt)->drawRectangle( border, Qt::blue );
273 QString coords = QString::number( border->left() ) + " " + QString::number( border->right() ) + " " +
274 QString::number( border->bottom() ) + " " + QString::number( border->top() );
275 (*aDIt)->drawText( "Border : " + coords, border->left(), border->top() + 10 / yScale,
276 Qt::blue, &QFont( "Courier", 8, QFont::Normal ), 2 );
279 vp->getGLWidget()->swapBuffers();
282 ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() )->getGLWidget()->makeCurrent();
285 void GLViewer_Viewer2d::activateDrawer( GLViewer_Object* theObject, bool onlyUpdate, GLboolean swap )
288 aList.append( theObject );
289 activateDrawers( aList, onlyUpdate, swap );
292 void GLViewer_Viewer2d::activateAllDrawers( bool onlyUpdate, GLboolean swap )
294 if ( !getActiveView() )
297 ObjList anActiveObjs;
298 const ObjList& objs = myGLContext->getObjects();
299 for( ObjList::const_iterator it = objs.begin(); it != objs.end(); ++it )
301 GLViewer_Object* obj = (GLViewer_Object*)(*it);
302 if( obj->getVisible() )
303 anActiveObjs.append( obj );
306 activateDrawers( anActiveObjs, onlyUpdate, swap );
309 void GLViewer_Viewer2d::onCreateGLMarkers( int theMarkersNum, int theMarkersRad )
311 if ( !getActiveView() )
314 GLViewer_MarkerSet* aMarkerSet = new GLViewer_MarkerSet( theMarkersNum, theMarkersRad );
315 getGLContext()->insertObject( aMarkerSet );
317 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
318 int vpWidth = vp->getWidth();
319 int vpHeight = vp->getHeight();
321 float* aXCoord = new float[ theMarkersNum ];
322 float* anYCoord = new float[ theMarkersNum ];
325 for ( long i = 0; i < theMarkersNum; i++ )
327 aXCoord[i] = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpWidth / 2.);
328 anYCoord[i] = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpHeight / 2.);
331 aMarkerSet->setXCoord( aXCoord, theMarkersNum );
332 aMarkerSet->setYCoord( anYCoord, theMarkersNum );
333 aMarkerSet->compute();
335 updateBorders( aMarkerSet->getRect() );
337 activateAllDrawers( false );
338 activateTransform( GLViewer_Viewer::FitAll );
344 void GLViewer_Viewer2d::onCreateGLPolyline( int theAnglesNum, int theRadius, int thePolylineNumber )
346 if ( !getActiveView() )
349 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
350 int vpWidth = vp->getWidth();
351 int vpHeight = vp->getHeight();
353 float* aXCoord = new float[ theAnglesNum ];
354 float* anYCoord = new float[ theAnglesNum ];
356 //srand( ( unsigned )time( NULL ) );
358 for( int j = 0; j < thePolylineNumber; j++)
360 GLViewer_Polyline* aPolyline = new GLViewer_Polyline( theAnglesNum, theRadius );
361 getGLContext()->insertObject( aPolyline );
363 float aXOffset = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpWidth / 2.);
364 float anYOffset = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpHeight / 2.);
365 for( int i = 0; i < theAnglesNum; i++ )
367 aXCoord[i] = cos( 2. * PI * i / theAnglesNum ) * theRadius + aXOffset;
368 anYCoord[i] = sin( 2. * PI * i / theAnglesNum ) * theRadius + anYOffset;
371 aPolyline->setHighSelAll( true );
372 aPolyline->setClosed( true );
373 aPolyline->setXCoord( aXCoord, theAnglesNum );
374 aPolyline->setYCoord( anYCoord, theAnglesNum );
375 aPolyline->compute();
377 updateBorders( aPolyline->getRect() );
380 activateAllDrawers( false );
381 activateTransform( GLViewer_Viewer::FitAll );
387 void GLViewer_Viewer2d::onCreateGLText( QString theStr, int theTextNumber )
389 if ( !getActiveView() )
392 if( theTextNumber <= 0 )
395 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
396 int vpWidth = vp->getWidth();
397 int vpHeight = vp->getHeight();
399 //srand( ( unsigned )time( NULL ) );
401 for( int j = 0; j < theTextNumber; j++)
403 float aXPos = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpWidth / 2.);
404 float anYPos = cos( PI * (rand() / (GLfloat)RAND_MAX) ) * ((GLfloat)vpHeight / 2.);
405 QColor aColor( 255, 0, 255 );
407 GLViewer_TextObject* aText = new GLViewer_TextObject( theStr, aXPos, anYPos, aColor );
409 getGLContext()->insertObject( aText );
411 updateBorders( aText->getRect() );
414 activateAllDrawers( false );
417 void GLViewer_Viewer2d::transPoint( GLfloat& x, GLfloat& y )
419 if ( !getActiveView() )
422 GLfloat xScale, yScale;
425 GLViewer_ViewPort2d* curvp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
427 curvp->getScale( xScale, yScale );
428 curvp->getPan( xPan, yPan );
430 GLfloat a = curvp->getGLWidget()->getRotationAngle() * PI / 180.;
432 x = ( x - ( GLfloat )curvp->getWidth() / 2 ) / xScale;
433 y = ( -y + ( GLfloat )curvp->getHeight() / 2 ) / yScale;
438 x = x1 * cos(a) + y1 * sin(a);
439 y = -x1 * sin(a) + y1 * cos(a);
445 QRect* GLViewer_Viewer2d::getWinObjectRect( GLViewer_Object* theObject )
447 if ( !getActiveView() )
450 GLfloat xScale, yScale;
453 GLViewer_ViewPort2d* curvp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
454 GLfloat aWidth = curvp->getWidth();
455 GLfloat aHeight = curvp->getHeight();
458 curvp->getScale( xScale, yScale );
459 curvp->getPan( xPan, yPan );
461 QRect aObjRect = theObject->getRect()->toQRect();
462 float aLeft = aObjRect.left() + xPan, aRight = aObjRect.right() + xPan;
463 float aTop = aObjRect.top() + yPan, aBot = aObjRect.bottom() + yPan;
465 GLfloat anAngle = curvp->getGLWidget()->getRotationAngle() * PI / 180.;
467 QPointArray aPointArray(4);
468 aPointArray[0] = QPoint( (int)(aLeft*cos(anAngle) - aTop*sin(anAngle)),
469 (int)(aLeft*sin(anAngle) + aTop*cos(anAngle)) );
470 aPointArray[1] = QPoint( (int)(aRight*cos(anAngle) - aTop*sin(anAngle)),
471 (int)(aRight*sin(anAngle) + aTop*cos(anAngle)) );
472 aPointArray[2] = QPoint( (int)(aRight*cos(anAngle) - aBot*sin(anAngle)),
473 (int)(aRight*sin(anAngle) + aBot*cos(anAngle)) );
474 aPointArray[3] = QPoint( (int)(aLeft*cos(anAngle) - aBot*sin(anAngle)),
475 (int)(aLeft*sin(anAngle) + aBot*cos(anAngle)) );
477 int aMinLeft = aPointArray[0].x(), aMaxRight = aPointArray[0].x(),
478 aMinTop = aPointArray[0].y(), aMaxBottom = aPointArray[0].y();
479 for( int i = 1; i < 4; i++ )
481 int x = aPointArray[i].x();
482 int y = aPointArray[i].y();
483 aMinLeft = QMIN( aMinLeft,x );
484 aMaxRight = QMAX( aMaxRight, x );
485 aMinTop = QMIN( aMinTop, y );
486 aMaxBottom = QMAX( aMaxBottom, y );
489 aLeft = (aMinLeft/* + xPan*/)*xScale + aWidth / 2;
490 aRight = (aMaxRight/* + xPan*/)*xScale + aWidth / 2;
492 aTop = -( (aMaxBottom/* + yPan*/)*yScale - aHeight / 2 );
493 aBot = -( (aMinTop/* + yPan*/)*yScale - aHeight / 2 );
495 QRect* newRect = new QRect( (int)aLeft, (int)aTop, (int)(aRight-aLeft), (int)(aBot-aTop) );
500 GLViewer_Rect GLViewer_Viewer2d::getGLVRect( const QRect& theRect ) const
502 if ( !getActiveView() )
503 return GLViewer_Rect();
505 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
508 return GLViewer_Rect();
510 return vp->win2GLV( theRect );
513 QRect GLViewer_Viewer2d::getQRect( const GLViewer_Rect& theRect ) const
515 if ( !getActiveView() )
518 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort();
523 return vp->GLV2win( theRect );
526 GLViewer_Selector* GLViewer_Viewer2d::createSelector()
528 return new GLViewer_Selector2d( this, getGLContext() );
531 GLViewer_ViewTransformer* GLViewer_Viewer2d::createTransformer( int type )
533 return new GLViewer_View2dTransformer( this, type );
536 GLViewer_Sketcher* GLViewer_Viewer2d::createGLSketcher( int type )
538 return new GLViewer_Sketcher( this, type );
541 void GLViewer_Viewer2d::activateGLSketching( int type )
543 GLViewer_ViewPort2d* vp = 0;
544 if ( !getActiveView() || !( vp = ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() ) )
547 // Finish current sketching
550 if ( myGLSketcher->getType() != None )
552 myGLSketcher->setType( None );
556 // Activate new sketching
559 activateGLSketching( None ); // concurrency not supported
560 myGLSketcher->setType( type );
565 void GLViewer_Viewer2d::startSketching()
567 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort();
568 avp->setCursor( *avp->getSketchCursor() );
569 //avp->enablePopup( false );
570 myGLSketcher->startSketching();
573 void GLViewer_Viewer2d::finishSketching()
575 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort();
576 avp->setCursor( *avp->getDefaultCursor() );
577 //avp->enablePopup( true );
578 myGLSketcher->finishSketching();
581 bool GLViewer_Viewer2d::isSketchingActive()
583 return myGLSketcher->getType() != None;
586 int GLViewer_Viewer2d::getSketchingType()
588 return myGLSketcher->getType();
591 void GLViewer_Viewer2d::onSketchDelObject()
593 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)getActiveView()->getViewPort();
594 avp->setCursor( *avp->getDefaultCursor() );
595 myGLSketcher->finishSketching( true );
598 void GLViewer_Viewer2d::onSketchUndoLast()
603 void GLViewer_Viewer2d::onSketchFinish()
608 void GLViewer_Viewer2d::onMouseEvent( SUIT_ViewWindow*, QMouseEvent* e )
610 if ( !getActiveView() )
613 //if ( testRotation( e ) )
618 case QEvent::MouseButtonPress :
619 case QEvent::MouseMove :
620 case QEvent::MouseButtonRelease :
621 //if( myGLSketcher->getType() != None )
622 // myGLSketcher->sketch( e );
626 GLViewer_Viewer::onMouseEvent( 0, e );
629 bool GLViewer_Viewer2d::testRotation( QMouseEvent* e )
631 if ( ( e->button() == GLViewer_View2dTransformer::rotateButton() ) &&
632 ( e->type() == QEvent::MouseButtonPress ) &&
633 ( e->state() & GLViewer_ViewTransformer::accelKey() ) )
635 activateTransform( GLViewer_Viewer::Rotate );
642 void GLViewer_Viewer2d::insertHeader( VectorFileType aType, QFile& hFile )
644 if( aType == POST_SCRIPT )
646 QString header = "%!PS-Adobe-3.0\n";
647 header += "%%Creator: OpenCascade 2004\n";
648 header += "%%Title: Our document\n";
649 header += "%%PageOrder: Ascend\n";
650 header += "%%Orientation: Portrait\n";
651 header += "%%LanguageLevel: 2\n";
653 header += "%%Pages: 1\n";
654 header += "%%Page: 1\n\n";
656 hFile.writeBlock( header.ascii(), header.length() );
658 else if( aType == HPGL )
660 QString header = "[Esc].(;\n";
661 header += "[Esc].I81;;17:\n";
662 header += "[Esc].N;19:\n";
670 hFile.writeBlock( header.ascii(), header.length() );
674 void GLViewer_Viewer2d::insertEnding( VectorFileType aType, QFile& hFile )
676 if( aType == POST_SCRIPT )
678 QString ending = "showpage\n\n%%EOF";
679 hFile.writeBlock( ending.ascii(), ending.length() );
681 else if( aType == HPGL )
683 QString ending = "PU;PA0,0;SP;EC;PG1;EC1;OE\n";
684 hFile.writeBlock( ending.ascii(), ending.length() );
688 inline void mm2custom( GLViewer_Viewer2d::VectorFileType aType, double& value )
690 if( aType==GLViewer_Viewer2d::POST_SCRIPT )
691 value*=2.8346; //mm to pt
693 else if( aType==GLViewer_Viewer2d::HPGL )
694 value*=40; //mm to plu (there are 40 plues in mm)
696 else if( aType==GLViewer_Viewer2d::ENH_METAFILE )
697 value*=100; //this unit is 1/100 mm
701 bool GLViewer_Viewer2d::translateTo( VectorFileType aType, QString FileName, PaperType aPType,
702 double mmLeft, double mmRight, double mmTop, double mmBottom )
704 if ( !getActiveView() )
707 QFile hFile( FileName.ascii() );
713 GLViewer_ViewPort2d* aCurVP = (GLViewer_ViewPort2d*) getActiveView()->getViewPort();
716 aCurVP->getPan( xPan, yPan );
717 GLfloat aRotation = aCurVP->getGLWidget()->getRotationAngle() * 3.14159265 / 180.0;
719 GLViewer_CoordSystem aViewerCS( GLViewer_CoordSystem::Cartesian, xPan, yPan, 1.0, 1.0, aRotation );
721 double AW = Sizes[2*int(aPType)],
722 AH = Sizes[2*int(aPType)+1]; //size of Axx paper in mm
724 mm2custom( aType, mmLeft ); //we translate mm to custom units
725 mm2custom( aType, mmRight );
726 mm2custom( aType, mmTop );
727 mm2custom( aType, mmBottom );
728 mm2custom( aType, AW );
729 mm2custom( aType, AH );
731 float xScale, yScale;
732 aCurVP->getScale( xScale, yScale );
734 double VPWidth = aCurVP->getWidth()/xScale, //the width in reference units
735 VPHeight = aCurVP->getHeight()/yScale;
737 double k1 = ( AW-mmLeft-mmRight ) / VPWidth,
738 k2 = ( AH-mmTop-mmBottom ) / VPHeight;
741 k1 = k2; //We select the minimum
743 double hdelta = ( AW-mmLeft-mmRight - VPWidth * k1 )/2.0, //addition in horizontal
744 vdelta = ( AH-mmTop-mmBottom - VPHeight * k1 )/2.0; //addition in vertical
746 mmLeft += hdelta; //The real free space on the left and right borders
751 GLViewer_CoordSystem aPaperCS( GLViewer_CoordSystem::Cartesian,
752 -(mmLeft/k1+VPWidth/2.0), -(mmBottom/k1+VPHeight/2.0), 1/k1, 1/k1 );
754 if( aType==POST_SCRIPT || aType==HPGL )
756 hFile.open( IO_ReadWrite | IO_Truncate );
758 insertHeader( aType, hFile );
761 else if( aType==ENH_METAFILE )
764 r.left = 0; r.right = AW;
765 r.top = 0; r.bottom = AH;
766 HDC screen_dc = GetDC( 0 ); //The screen device context
767 HDC bitDC = CreateCompatibleDC ( screen_dc ); //The context compatible with screen
769 hMetaFileDC = CreateEnhMetaFile( bitDC, FileName.ascii(), &r, "" );
770 SetMapMode( hMetaFileDC, MM_HIMETRIC );
771 SetWindowOrgEx( hMetaFileDC, 0, r.bottom, NULL );
772 HRGN ClipRgn = CreateRectRgn( 0, 0, AW, AH );
773 SelectClipRgn( hMetaFileDC, ClipRgn );
776 aBrushData.lbColor = RGB( 255, 255, 255 );
777 aBrushData.lbStyle = BS_SOLID;
779 FillRect( hMetaFileDC, &r, CreateBrushIndirect( &aBrushData ) );
781 ReleaseDC( 0, screen_dc );
784 aCurVP->getGLWidget()->translateBackgroundToEMF( hMetaFileDC, &aViewerCS, &aPaperCS );
788 if( aType==POST_SCRIPT )
790 QString temp = "%1 %2 %3 %4 rectclip\n\n",
791 aBuffer = temp.arg( mmLeft ).arg( mmBottom ).
792 arg( AW-mmLeft-mmRight ).arg( AH-mmBottom-mmTop );
793 //It is set clipping path
795 hFile.writeBlock( aBuffer.ascii(), aBuffer.length() );
797 aCurVP->getGLWidget()->translateBackgroundToPS( hFile, &aViewerCS, &aPaperCS );
801 for( int i=0, n=myDrawers.count(); i<n; i++ )
802 if( aType==POST_SCRIPT )
803 result &= myDrawers[ i ]->translateToPS( hFile, &aViewerCS, &aPaperCS );
804 else if( aType==HPGL )
805 result &= myDrawers[ i ]->translateToHPGL( hFile, &aViewerCS, &aPaperCS );
807 else if( aType==ENH_METAFILE )
808 result &= myDrawers[ i ]->translateToEMF( hMetaFileDC, &aViewerCS, &aPaperCS );
811 if( aType==POST_SCRIPT || aType==HPGL )
813 insertEnding( aType, hFile);
817 else if( aType==ENH_METAFILE )
818 DeleteEnhMetaFile( CloseEnhMetaFile( hMetaFileDC ) );
825 void GLViewer_Viewer2d::repaintView( GLViewer_ViewFrame* theView, bool makeCurrent )
827 GLViewer_ViewFrame* aCurView;
829 aCurView = (GLViewer_ViewFrame*)getActiveView();
836 ObjList anActiveObjs;
837 const ObjList& objs = myGLContext->getObjects();
838 for( ObjList::const_iterator it = objs.begin(); it != objs.end(); ++it )
840 GLViewer_Object* obj = (GLViewer_Object*)(*it);
841 if( obj->getVisible() )
842 anActiveObjs.append( obj );
848 QValueList<GLViewer_Drawer*>::Iterator anIt = myDrawers.begin();
849 QValueList<GLViewer_Drawer*>::Iterator endDIt = myDrawers.end();
850 for( ; anIt != endDIt; anIt++ )
853 QValueList<GLViewer_Drawer*> anActiveDrawers;
854 QValueList<GLViewer_Object*>::Iterator endOIt = anActiveObjs.end();
856 for( QValueList<GLViewer_Object*>::Iterator oit = anActiveObjs.begin(); oit != endOIt; ++oit )
858 GLViewer_Drawer* aDrawer = (*oit)->getDrawer();
861 anIt = myDrawers.begin();
863 for( ; anIt != endDIt; anIt++ )
864 if( (*anIt)->getObjectType() == (*oit)->getObjectType() )
866 (*oit)->setDrawer( *anIt );
871 if( !aDrawer ) //are not exists
873 myDrawers.append( (*oit)->createDrawer() );
874 aDrawer = (*oit)->getDrawer();
877 aDrawer->addObject( (*oit) );
878 if( anActiveDrawers.findIndex( aDrawer ) == -1 )
879 anActiveDrawers.append( aDrawer );
882 QValueList<GLViewer_Drawer*>::Iterator aDIt = anActiveDrawers.begin();
883 QValueList<GLViewer_Drawer*>::Iterator aDEndIt = anActiveDrawers.end();
885 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )aCurView->getViewPort();
886 vp->getScale( xScale, yScale );
889 vp->getGLWidget()->makeCurrent();
891 for( ; aDIt != aDEndIt; aDIt++ )
892 (*aDIt)->create( xScale, yScale, false );
895 vp->getGLWidget()->swapBuffers();
897 // ( ( GLViewer_ViewPort2d* )getActiveView()->getViewPort() )->getGLWidget()->makeCurrent();
900 void GLViewer_Viewer2d::startOperations( QMouseEvent* e )
902 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort();
904 float x = e->pos().x();
905 float y = e->pos().y();
907 GLViewer_Pnt point( x, y );
909 if( e->button() == Qt::LeftButton && !myGLContext->getCurrentObject() && vp->startPulling( point ) )
912 if( e->button() == Qt::LeftButton && !(vp->currentBlock() & BS_Selection) && !myGLContext->getCurrentObject() )
913 vp->startSelectByRect( e->x(), e->y() );
916 bool GLViewer_Viewer2d::updateOperations( QMouseEvent* e )
918 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort();
920 if( vp->isPulling() )
922 float x = e->pos().x();
923 float y = e->pos().y();
926 vp->drawPulling( GLViewer_Pnt( x, y ) );
931 if( !myGLContext->getCurrentObject() )
933 vp->drawSelectByRect( e->x(), e->y() );
939 void GLViewer_Viewer2d::finishOperations( QMouseEvent* e )
941 GLViewer_ViewPort2d* vp = ( GLViewer_ViewPort2d* )((GLViewer_ViewFrame*)getActiveView())->getViewPort();
943 if( vp->isPulling() )
950 if( !myGLContext->getCurrentObject() )
952 QRect aSelRect = vp->selectionRect();
953 vp->finishSelectByRect();
954 if ( getSelector() && !aSelRect.isNull() )
956 bool append = bool ( e->state() & GLViewer_Selector::appendKey() );
957 getSelector()->select( aSelRect, append );
962 void GLViewer_Viewer2d::startOperations( QWheelEvent* e )
964 bool zoomIn = e->delta() > 0;
966 for( myGLContext->InitSelected(); myGLContext->MoreSelected(); myGLContext->NextSelected() )
968 GLViewer_Object* anObject = myGLContext->SelectedObject();
969 update = anObject->updateZoom( zoomIn ) || update;
977 /****************************************************************
978 ** Class: GLViewer_View2dTransformer
980 *****************************************************************/
982 int GLViewer_View2dTransformer::rotateBtn = RightButton;
984 GLViewer_View2dTransformer::GLViewer_View2dTransformer( GLViewer_Viewer* viewer, int typ )
985 : GLViewer_ViewTransformer( viewer, typ )
987 if ( type() == GLViewer_Viewer::Rotate )
988 initTransform( true );
991 GLViewer_View2dTransformer::~GLViewer_View2dTransformer()
993 if ( type() == GLViewer_Viewer::Rotate )
994 initTransform( false );
998 Redefined to provide specific 3D transfomations. [ virtual public ]
1000 void GLViewer_View2dTransformer::exec()
1002 if ( !myViewer->getActiveView() )
1005 /* additional transforms */
1006 GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
1007 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)vp;
1010 case GLViewer_Viewer::Rotate:
1011 myMajorBtn = rotateButton();
1012 avp->setCursor( *avp->getRotCursor() );
1015 GLViewer_ViewTransformer::exec();
1020 Handles rotation. [ protected virtual ]
1022 void GLViewer_View2dTransformer::onTransform( TransformState state )
1024 if ( !myViewer->getActiveView() )
1027 GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
1028 GLViewer_ViewPort2d* avp = (GLViewer_ViewPort2d*)vp;
1029 if ( type() == GLViewer_Viewer::Rotate )
1034 if ( myButtonState & myMajorBtn )
1035 avp->startRotation( myStart.x(), myStart.y() );
1038 if ( myButtonState & myMajorBtn )
1039 avp->rotate( myCurr.x(), myCurr.y() );
1047 GLViewer_ViewTransformer::onTransform( state );