resources/occ_view_ray_tracing.png
resources/occ_view_env_texture.png
resources/occ_view_light_source.png
+ resources/occ_view_circle_style.png
+ resources/occ_view_rect_style.png
)
# --- sources ---
myToler ( 5, 5 ),
//mypPoints ( 0L ),
myAddButton ( 0 ),
- myDelButton ( 0 )
+ myDelButton ( 0 ),
+ myMode ( Poligone )
{
mySketchButton = Qt::RightButton;
if ( vw )
- {
- OCCViewer_ViewPort3d* avp = mypViewWindow->getViewPort();
- mypPolyRB = new QtxPolyRubberBand( avp );
- }
+ {
+ OCCViewer_ViewPort3d* avp = mypViewWindow->getViewPort();
+ mypPolyRB = new QtxPolyRubberBand( avp );
+ mypCircleRB = new QtxCircleRubberBand( avp );
+ }
+ mypData = new QPolygon( 0 );
}
OCCViewer_PolygonSketcher::~OCCViewer_PolygonSketcher()
void OCCViewer_PolygonSketcher::onActivate()
{
myDbl = false;
- mypData = new QPolygon( 0 );
//mypPoints = new QPolygon( 0 );
switch ( sketchButton() )
void OCCViewer_PolygonSketcher::onDeactivate()
{
- //delete mypPoints;
- //mypPoints = 0;
- delete (QPolygon*)mypData;
- mypData = 0;
-
if ( mypPolyRB )
mypPolyRB->clearGeometry();
+ if (mypCircleRB)
+ mypCircleRB->clearGeometry();
+ ((QPolygon*)mypData)->clear();
}
bool OCCViewer_PolygonSketcher::onKey( QKeyEvent* e )
void OCCViewer_PolygonSketcher::onSketch( SketchState state )
{
- //OCCViewer_ViewPort3d* avp = mypViewWindow->getViewPort();
-
QPolygon* points = (QPolygon*)data();
- /*QPainter p( avp );
- p.setPen( Qt::white );
- p.setCompositionMode( QPainter::CompositionMode_Xor );
- if ( state != Debut )
- p.drawPolyline( *mypPoints );
-
- if ( points->count() )
- {
- mypPoints->resize( points->count() + 1 );
- for ( uint i = 0; i < points->count(); i++ )
- mypPoints->setPoint( i, points->point( i ) );
- mypPoints->setPoint( points->count(), myCurr );
- if ( state != Fin )
- p.drawPolyline( *mypPoints );
- }*/
- if ( mypPolyRB ) {
- if ( state == Fin ) {
- mypPolyRB->clearGeometry();
- mypPolyRB->hide();
- mypViewWindow->activateSketching( OCCViewer_ViewWindow::NoSketching );
- } else {
- mypPolyRB->setUpdatesEnabled ( false );
- if ( !mypPolyRB->isVisible() )
- mypPolyRB->show();
- //if ( state != Debut )
- // mypPolyRB->repaint();
-
- if ( state != Fin && points->count() )
- mypPolyRB->initGeometry( QPolygon(*points) << myCurr );
- //mypPolyRB->addNode( myCurr );
-
- //if ( state != Fin )
- // mypPolyRB->repaint();
- mypPolyRB->setUpdatesEnabled ( true );
- //mypPolyRB->repaint();
+ switch (myMode) {
+ case Poligone:
+ if (mypPolyRB) {
+ if (state == Fin) {
+ mypPolyRB->clearGeometry();
+ mypPolyRB->hide();
+ mypViewWindow->activateSketching(OCCViewer_ViewWindow::NoSketching);
+ }
+ else {
+ mypPolyRB->setUpdatesEnabled(false);
+ if (!mypPolyRB->isVisible())
+ mypPolyRB->show();
+
+ if (state != Fin && points->count())
+ mypPolyRB->initGeometry(QPolygon(*points) << myCurr);
+ mypPolyRB->setUpdatesEnabled(true);
+ }
}
+ break;
+ case Circle:
+ if (mypCircleRB) {
+ if (state == Fin) {
+ mypCircleRB->getPoligon(points);
+ mypCircleRB->clearGeometry();
+ mypCircleRB->hide();
+ if (points->size() == CIRCLE_NB_POINTS)
+ myResult = Accept;
+ mypViewWindow->activateSketching(OCCViewer_ViewWindow::NoSketching);
+ }
+ else {
+ mypCircleRB->setUpdatesEnabled(false);
+
+ if (state != Fin) {
+ if (mypCircleRB->isCenterDefined()) {
+ mypCircleRB->setRadius(myCurr);
+ if ((mypCircleRB->radius() > MIN_RADIUS) && (!mypCircleRB->isVisible()))
+ mypCircleRB->show();
+ }
+ else {
+ mypCircleRB->initGeometry(myCurr);
+ }
+ }
+ mypCircleRB->setUpdatesEnabled(true);
+ }
+ }
+ break;
}
}
}
+void OCCViewer_PolygonSketcher::setSketcherMode(int theMode)
+{
+ myMode = (SketchMode)theMode;
+}
class QtxRectRubberBand;
class QtxPolyRubberBand;
+class QtxCircleRubberBand;
#ifdef WIN32
#pragma warning ( disable:4251 )
virtual bool isDefault() const;
virtual bool eventFilter( QObject*, QEvent* );
+ virtual void setSketcherMode(int theMode) {}
+
private slots:
void onDrawViewPort();
class OCCVIEWER_EXPORT OCCViewer_PolygonSketcher : public OCCViewer_ViewSketcher
{
public:
+ enum SketchMode { Poligone, Circle };
+
OCCViewer_PolygonSketcher( OCCViewer_ViewWindow*, int );
virtual ~OCCViewer_PolygonSketcher();
+ virtual void setSketcherMode(int theMode);
+
protected:
virtual bool onKey( QKeyEvent* );
virtual void onMouse( QMouseEvent* );
int myDelButton;
QtxPolyRubberBand* mypPolyRB;
+ QtxCircleRubberBand* mypCircleRB;
+
+ SketchMode myMode;
};
#ifdef WIN32
emit keyPressed(this, (QKeyEvent*) e);
return true;
+ case QEvent::KeyRelease:
+ emit keyReleased(this, (QKeyEvent*) e);
+ return true;
+
default:
break;
}
connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool)));
toolMgr()->registerAction( aAction, SwitchZoomingStyleId );
+ // Switch advanced selection style (poligone/circle)
+ aAction = new QtxAction(tr("MNU_SELECTION_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_RECT_STYLE" ) ),
+ tr( "MNU_SELECTION_STYLE_SWITCH" ), 0, this);
+ aAction->setStatusTip(tr("DSC_SELECTION_STYLE_SWITCH"));
+ aAction->setCheckable(true);
+ connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchSelectionStyle(bool)));
+ toolMgr()->registerAction( aAction, SwitchSelectionStyleId);
+
// Maximized view
aAction = new QtxAction(tr("MNU_MINIMIZE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MINIMIZE" ) ),
tr( "MNU_MINIMIZE_VIEW" ), 0, this );
toolMgr()->append( SwitchZoomingStyleId, tid );
toolMgr()->append( SwitchPreselectionId, tid );
toolMgr()->append( SwitchSelectionId, tid );
+ toolMgr()->append(SwitchSelectionStyleId, tid );
if( myModel->trihedronActivated() )
toolMgr()->append( TrihedronShowId, tid );
}
}
+void OCCViewer_ViewWindow::onSwitchSelectionStyle(bool on)
+{
+ // selection
+ QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action(SwitchSelectionStyleId) );
+ if (a) {
+ if (a->isChecked() != on) {
+ a->setChecked(on);
+ }
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+ QPixmap aIcon = on ? aResMgr->loadPixmap("OCCViewer", tr("ICON_OCCVIEWER_CIRCLE_STYLE")) :
+ aResMgr->loadPixmap("OCCViewer", tr("ICON_OCCVIEWER_RECT_STYLE"));
+ a->setIcon(aIcon);
+ }
+ OCCViewer_ViewSketcher* aSkecher = getSketcher(Polygon);
+ if (aSkecher) {
+ aSkecher->setSketcherMode(on ? OCCViewer_PolygonSketcher::Circle :
+ OCCViewer_PolygonSketcher::Poligone);
+ }
+}
+
/*!
\brief Switches "keyboard free" interaction style on/off
*/
SwitchPreselectionId, SwitchSelectionId,
MaximizedId, SynchronizeId, ReturnTo3dViewId,
OrthographicId, PerspectiveId, StereoId, RayTracingId, EnvTextureId, LightSourceId,
+ SwitchSelectionStyleId,
UserId };
enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE,
virtual void onSwitchZoomingStyle( bool on );
virtual void onSwitchPreselection( bool on );
virtual void onSwitchSelection( bool on );
+ virtual void onSwitchSelectionStyle( bool on );
virtual void onRayTracing();
virtual void onEnvTexture();
virtual void onLightSource();
<source>ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH</source>
<translation>occ_view_zooming_style_switch.png</translation>
</message>
+ <message>
+ <source>ICON_OCCVIEWER_RECT_STYLE</source>
+ <translation>occ_view_rect_style.png</translation>
+ </message>
+ <message>
+ <source>ICON_OCCVIEWER_CIRCLE_STYLE</source>
+ <translation>occ_view_circle_style.png</translation>
+ </message>
<message>
<source>ICON_OCCVIEWER_MAXIMIZE</source>
<translation>occ_view_maximized.png</translation>
<source>MNU_ZOOMING_STYLE_SWITCH</source>
<translation>Zooming style switch</translation>
</message>
+ <message>
+ <source>MNU_SELECTION_STYLE_SWITCH</source>
+ <translation>Advanced selection style switch</translation>
+ </message>
<message>
<source>DSC_ZOOMING_STYLE_SWITCH</source>
<translation>Zooming style switch</translation>
</message>
+ <message>
+ <source>DSC_SELECTION_STYLE_SWITCH</source>
+ <translation>Advanced selection style switch</translation>
+ </message>
<message>
<source>MNU_ENABLE_PRESELECTION</source>
<translation>Enable/disable preselection</translation>
<source>MNU_ZOOMING_STYLE_SWITCH</source>
<translation>Changer le style de zoom</translation>
</message>
+ <message>
+ <source>MNU_SELECTION_STYLE_SWITCH</source>
+ <translation>Advanced selection style switch</translation>
+ </message>
<message>
<source>DSC_ZOOMING_STYLE_SWITCH</source>
<translation>Changer le style de zoom</translation>
</message>
+ <message>
+ <source>DSC_SELECTION_STYLE_SWITCH</source>
+ <translation>Advanced selection style switch</translation>
+ </message>
<message>
<source>MNU_ENABLE_PRESELECTION</source>
<translation>Activer/Désactiver préselection</translation>
<source>MNU_ZOOMING_STYLE_SWITCH</source>
<translation>ズームのスタイルを変更します。</translation>
</message>
+ <message>
+ <source>MNU_SELECTION_STYLE_SWITCH</source>
+ <translation>Advanced selection style switch</translation>
+ </message>
<message>
<source>DSC_ZOOMING_STYLE_SWITCH</source>
<translation>ズームのスタイルを変更します。</translation>
</message>
+ <message>
+ <source>DSC_SELECTION_STYLE_SWITCH</source>
+ <translation>Advanced selection style switch</translation>
+ </message>
<message>
<source>MNU_ENABLE_PRESELECTION</source>
<translation>予選の有効/無効にします。</translation>
#include <QShowEvent>
#include <QVectorIterator>
+#include <math.h>
+
/*!
\class QtxAbstractRubberBand
\brief Analog of class QRubberBand with possibility of creation non-rectangular contour for selection.
QPainter aPainter( this );
aPainter.setRenderHint( QPainter::Antialiasing );
QRect r = myPoints.boundingRect();
- aPainter.setClipRegion( r.normalized().adjusted( -1, -1, 2, 2 ) );
+ //aPainter.setClipRegion( r.normalized().adjusted( -1, -1, 2, 2 ) );
aPainter.drawTiledPixmap( 0, 0, width(), height(), tiledPixmap);
aPainter.end();
updateMask();
}
}
+
+QtxCircleRubberBand::QtxCircleRubberBand(QWidget* parent)
+ :QtxAbstractRubberBand(parent), myHasCenter(false)
+{
+ myPoints.resize(2);
+ myIsClosed = true;
+}
+
+QtxCircleRubberBand::~QtxCircleRubberBand()
+{
+}
+
+void QtxCircleRubberBand::initGeometry(const QPoint& thePoint)
+{
+ myIsClosed = false;
+ myHasCenter = true;
+ myPoints.clear();
+ myPoints << thePoint;
+ updateMask();
+}
+
+void QtxCircleRubberBand::setRadius(const QPoint& thePoint)
+{
+ if (myPoints.size() == 1)
+ myPoints << thePoint;
+ else
+ myPoints.setPoint(1, thePoint);
+ myIsClosed = true;
+ updateMask();
+}
+
+void QtxCircleRubberBand::updateMask()
+{
+ int aLen = radius();
+ if (aLen > MIN_RADIUS) {
+ QRegion aReg1(myPoints[0].x() - aLen,
+ myPoints[0].y() - aLen, aLen * 2, aLen * 2, QRegion::Ellipse);
+ QRegion aReg2(myPoints[0].x() - aLen + 2,
+ myPoints[0].y() - aLen + 2, aLen * 2 - 4, aLen * 2 - 4, QRegion::Ellipse);
+ setMask(aReg1 - aReg2);
+ }
+}
+
+bool QtxCircleRubberBand::isCenterDefined() const
+{
+ return myHasCenter;
+}
+
+void QtxCircleRubberBand::clearGeometry()
+{
+ QtxAbstractRubberBand::clearGeometry();
+ myHasCenter = false;
+ myIsClosed = false;
+}
+
+QPoint rotatePoint(const QPoint& theStart, const QPoint& theCenter, double theAngle)
+{
+ double cosTheta = cos(theAngle);
+ double sinTheta = sin(theAngle);
+ int aX = (int)(cosTheta * (theStart.x() - theCenter.x()) -
+ sinTheta * (theStart.y() - theCenter.y()) + theCenter.x());
+ int aY = (int)(sinTheta * (theStart.x() - theCenter.x()) +
+ cosTheta * (theStart.y() - theCenter.y()) + theCenter.y());
+ return QPoint(aX, aY);
+}
+
+static double m_pi = 4 * atan(1);
+static double angle_deg = 360. / CIRCLE_NB_POINTS;
+static double angle_rad = angle_deg * (m_pi / 180.);
+
+
+void QtxCircleRubberBand::getPoligon(QPolygon* thePoints) const
+{
+ int aLen = radius();
+ if (aLen > MIN_RADIUS) {
+ thePoints->clear();
+ QPoint aCenter = myPoints[0];
+ QPoint aStart = myPoints[1];
+ for (int i = 0; i < CIRCLE_NB_POINTS; i++) {
+ thePoints->append(aStart);
+ aStart = rotatePoint(aStart, aCenter, angle_rad);
+ }
+ }
+}
+
+int QtxCircleRubberBand::radius() const
+{
+ if (myPoints.size() < 2)
+ return -1;
+ QPoint aDist = myPoints[1] - myPoints[0];
+ return (int)std::sqrt(std::pow(aDist.x(), 2) + std::pow(aDist.y(), 2));
+}
\ No newline at end of file
void setClosed( bool );
};
+
+#define CIRCLE_NB_POINTS 30
+#define MIN_RADIUS 5
+
+class QTX_EXPORT QtxCircleRubberBand : public QtxAbstractRubberBand
+{
+ Q_OBJECT
+
+public:
+ QtxCircleRubberBand(QWidget*);
+ virtual ~QtxCircleRubberBand();
+
+ void initGeometry(const QPoint&);
+
+ void setRadius(const QPoint&);
+
+ bool isCenterDefined() const;
+
+ virtual void clearGeometry();
+
+ void getPoligon(QPolygon* thePoints) const;
+
+ int radius() const;
+
+protected:
+ virtual void updateMask();
+ bool myHasCenter;
+};
+
#endif //QTXRUBBERBAND_H