-// Copyright (C) 2014-2015 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2014-2016 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include "QtxActionToolMgr.h"
#include "QtxMultiAction.h"
-// KERNEL includes
-#include <Basics_OCCTVersion.hxx>
-
// OCC includes
#include <V3d_View.hxx>
+#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
// QT includes
#include <QImage>
#include <QAction>
+#include <QDialog>
Handle(Image_PixMap) OCCViewer_Utilities::imageToPixmap( const QImage& anImage )
{
const uchar* aImageBytes = anImage.bits();
for ( int aLine = anImage.height() - 1; aLine >= 0; --aLine ) {
-#if OCC_VERSION_LARGE > 0x06070100
// convert pixels from ARGB to renderer-compatible RGBA
for ( int aByte = 0; aByte < anImage.width(); ++aByte ) {
Image_ColorBGRA& aPixmapBytes = aPixmap->ChangeValue<Image_ColorBGRA>(aLine, aByte);
aPixmapBytes.r() = (Standard_Byte) *aImageBytes++;
aPixmapBytes.a() = (Standard_Byte) *aImageBytes++;
}
-#else
- Image_ColorBGRA* aPixmapBytes = aPixmap->EditData<Image_ColorBGRA>().ChangeRow(aLine);
-
- // convert pixels from ARGB to renderer-compatible RGBA
- for ( int aByte = 0; aByte < anImage.width(); ++aByte ) {
- aPixmapBytes->b() = (Standard_Byte) *aImageBytes++;
- aPixmapBytes->g() = (Standard_Byte) *aImageBytes++;
- aPixmapBytes->r() = (Standard_Byte) *aImageBytes++;
- aPixmapBytes->a() = (Standard_Byte) *aImageBytes++;
- aPixmapBytes++;
- }
-#endif
}
}
return aPixmap;
<< OCCViewer_ViewWindow::RightId
<< OCCViewer_ViewWindow::AntiClockWiseId
<< OCCViewer_ViewWindow::ClockWiseId
+ << OCCViewer_ViewWindow::OrthographicId
+ << OCCViewer_ViewWindow::PerspectiveId
<< OCCViewer_ViewWindow::ResetId;
QtxActionToolMgr* aToolMgr = aView->toolMgr();
return anOldMode;
}
+
+bool OCCViewer_Utilities::isDialogOpened( OCCViewer_ViewWindow* theView, const QString& theName )
+{
+ bool isFound = false;
+ OCCViewer_ViewFrame* aViewFrame = dynamic_cast<OCCViewer_ViewFrame*>( theView->parent()->parent() );
+ QList<QDialog*> allDialogs = aViewFrame->findChildren<QDialog*>();
+ foreach ( QDialog* d, allDialogs )
+ if ( d->objectName() == theName )
+ isFound = true;
+ return isFound;
+}
+
+bool OCCViewer_Utilities::computeVisibleBounds( const Handle(V3d_View) theView,
+ double theBounds[6] )
+{
+ bool isAny = false;
+
+ theBounds[0] = theBounds[2] = theBounds[4] = DBL_MAX;
+ theBounds[1] = theBounds[3] = theBounds[5] = -DBL_MAX;
+
+ Graphic3d_MapOfStructure aSetOfStructures;
+ theView->View()->DisplayedStructures( aSetOfStructures );
+ Graphic3d_MapIteratorOfMapOfStructure aStructureIt( aSetOfStructures );
+
+ for( ; aStructureIt.More(); aStructureIt.Next() ) {
+ const Handle(Graphic3d_Structure)& aStructure = aStructureIt.Key();
+ if ( aStructure->IsEmpty() || !aStructure->IsVisible() ||
+ aStructure->IsInfinite() || aStructure->CStructure()->IsForHighlight )
+ continue;
+ double aBounds[6];
+ Bnd_Box aBox = aStructure->MinMaxValues();
+ aBounds[0] = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().X();
+ aBounds[2] = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().Y();
+ aBounds[4] = aBox.IsVoid() ? RealFirst() : aBox.CornerMin().Z();
+ aBounds[1] = aBox.IsVoid() ? RealLast() : aBox.CornerMax().X();
+ aBounds[3] = aBox.IsVoid() ? RealLast() : aBox.CornerMax().Y();
+ aBounds[5] = aBox.IsVoid() ? RealLast() : aBox.CornerMax().Z();
+
+ if ( aBounds[0] > -DBL_MAX && aBounds[1] < DBL_MAX &&
+ aBounds[2] > -DBL_MAX && aBounds[3] < DBL_MAX &&
+ aBounds[4] > -DBL_MAX && aBounds[5] < DBL_MAX )
+ {
+ isAny = true;
+ for ( int i = 0; i < 5; i = i + 2 ) {
+ theBounds[i] = std::min( theBounds[i], aBounds[i] );
+ theBounds[i+1] = std::max( theBounds[i+1], aBounds[i+1] );
+ }
+ }
+ }
+ return isAny;
+}
+
+bool OCCViewer_Utilities::computeVisibleBBCenter( const Handle(V3d_View) theView,
+ double& theX, double& theY, double& theZ )
+{
+ double aBounds[6];
+ if ( !computeVisibleBounds( theView, aBounds ) )
+ {
+ // null bounding box => the center is (0,0,0)
+ theX = 0.0;
+ theY = 0.0;
+ theZ = 0.0;
+ return true;
+ }
+
+ static double aMinDistance = 1.0 / DBL_MAX;
+
+ double aLength = aBounds[1]-aBounds[0];
+ aLength = std::max( ( aBounds[3]-aBounds[2]), aLength );
+ aLength = std::max( ( aBounds[5]-aBounds[4]), aLength );
+
+ if ( aLength < aMinDistance )
+ return false;
+
+ double aWidth = sqrt( ( aBounds[1] - aBounds[0] ) * ( aBounds[1] - aBounds[0] ) +
+ ( aBounds[3] - aBounds[2] ) * ( aBounds[3] - aBounds[2] ) +
+ ( aBounds[5] - aBounds[4] ) * ( aBounds[5] - aBounds[4] ) );
+
+ if(aWidth < aMinDistance)
+ return false;
+
+ theX = (aBounds[0] + aBounds[1])/2.0;
+ theY = (aBounds[2] + aBounds[3])/2.0;
+ theZ = (aBounds[4] + aBounds[5])/2.0;
+
+ return true;
+}