Corrections

This commit is contained in:
akl 2015-04-24 10:45:59 +04:00
parent 2c3b693211
commit db82e55631
11 changed files with 155 additions and 65 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

View File

@ -0,0 +1,28 @@
/*!
\page shape_statistics_operation_page Shape Statistics
This operation allows plotting a distribution histogram for the numerical parameters and creating the corresponding geometrical groups of the given shape.
To call <b>Shape Statistics</b> dialog box, in the <b>Main Menu</b> select <b>Inspection - > Shape Statistics</b>.
\image html shape_statistics.png
In this dialog:
- "Selected objects" standard selection box allows selecting one or more geometrical objects.
- "Type" combo-box with the following items: "Edges length", "Faces area", "Solids volume".
\note "Type" combo-box includes only parameters applied to the currently selected shape (e.g. "Solids volume" will not be available for face or shell being selected); multiple selection is processed correspondingly (i.e. only types applicable for all selected shapes will be available).
- "Number of intervals" spin box is used to specify number of distribution histogram ranges.
- "Scalar range" checkable group box that, when switched ON, allows specifying custom values range used for plotting and creating groups.
\note By default, "Scalar range" controls is empty; pressing "Compute" button allows automatic computing initial range of the chosen parameter. This is needed as computation of the parameters range can be time-consuming for large or complex models. In case of multiple selection, scalar range is computed as common from all selected shapes.
- "Plot" button opens or uses an opened Plot2d viewer and plots the distribution histogram for the selected shape(s).
- "Create groups" button allows creating a groups according to the currently specified parameters. The groups names will include numerical values of the range, e.g. "Edges_length_0-20", "Edges_length_20-40", etc. Empty groups are not created.
- Close dialog box, by pressing <b>Close</b> button.
*/

View File

@ -19,6 +19,7 @@
<li>\subpage managing_dimensions_page "Dimensions"</li> <li>\subpage managing_dimensions_page "Dimensions"</li>
<li>\subpage whatis_page "WhatIs"</li> <li>\subpage whatis_page "WhatIs"</li>
<li>\subpage inspect_object_operation_page "Inspect Object"</li> <li>\subpage inspect_object_operation_page "Inspect Object"</li>
<li>\subpage shape_statistics_operation_page "Shape Statistics"</li>
</ul> </ul>
\n To check their integrity: \n To check their integrity:

View File

@ -24,7 +24,7 @@ This functionality is available in OCC viewer only.
To create a group of sub-shapes of a geometrical object in the main To create a group of sub-shapes of a geometrical object in the main
menu select <b>New entity > Group > Create</b> menu select <b>New entity > Group > Create</b>
\n The following menu will appear: \n The following dialog box will appear:
\image html geomcreategroup.png \image html geomcreategroup.png
@ -101,6 +101,11 @@ In order to filter out some entities:
The entities which satisfy entered filtering parameters will be automatically highlighted The entities which satisfy entered filtering parameters will be automatically highlighted
in the 3D viewer. in the 3D viewer.
\b Plot button into "Filter" group box provides an access
to the \ref shape_statistics_operation_page "Shape Statistics" functionality with simplified look-n-feel:
\image html shape_statistics_simple.png
\n <b>TUI Command:</b> <em>geompy.CreateGroup(MainShape, \n <b>TUI Command:</b> <em>geompy.CreateGroup(MainShape,
ShapeType),</em> where MainShape is a shape for which the group is ShapeType),</em> where MainShape is a shape for which the group is
created, ShapeType is a type of shapes in the created group. created, ShapeType is a type of shapes in the created group.

View File

@ -47,14 +47,15 @@ namespace GEOMUtils
std::list<TopoDS_Shape>::const_iterator it; std::list<TopoDS_Shape>::const_iterator it;
for ( it = shapes.begin(); it != shapes.end(); ++it ) { for ( it = shapes.begin(); it != shapes.end(); ++it ) {
double aMeasure; double aMeasure;
TopTools_IndexedMapOfShape aSubShapesMap;
TopExp::MapShapes(*it, aSubShapesMap); // map of all global indices
TopTools_IndexedMapOfShape aMx; TopTools_IndexedMapOfShape aMx;
TopExp::MapShapes( *it, entity, aMx ); TopExp::MapShapes( *it, entity, aMx ); // map of current type sub-shape indices
int aNbS = aMx.Extent(); int aNbS = aMx.Extent();
int index = -1; int index = -1;
for ( int i = 1; i <= aNbS; ++i ) { for ( int i = 1; i <= aNbS; ++i ) {
aMeasure = 0.0; aMeasure = 0.0;
const TopoDS_Shape& aSubShape = aMx( i ); const TopoDS_Shape& aSubShape = aMx( i );
index = aMx.FindIndex( aSubShape );
//Get the measure: length, area or volume //Get the measure: length, area or volume
GProp_GProps LProps, SProps, VProps; GProp_GProps LProps, SProps, VProps;
if ( entity == TopAbs_EDGE ) { if ( entity == TopAbs_EDGE ) {
@ -76,6 +77,8 @@ namespace GEOMUtils
if ( aMeasure < range.min ) range.min = aMeasure; if ( aMeasure < range.min ) range.min = aMeasure;
if ( aMeasure > range.max ) range.max = aMeasure; if ( aMeasure > range.max ) range.max = aMeasure;
} }
// get global index of sub-shape
index = aSubShapesMap.FindIndex( aSubShape );
// keep measures to distribute it // keep measures to distribute it
measures[index] = aMeasure; measures[index] = aMeasure;
} }
@ -139,16 +142,4 @@ Distribution ComputeDistribution( std::list<TopoDS_Shape> shapes,
return aDistr; return aDistr;
} }
//=================================================================================
// function : FilterSubShapes()
// purpose : gets list of sub-shapes IDs according to the specified range data (needed for groups creation function)
//=================================================================================
std::list<long> FilterSubShapes( TopoDS_Shape shape,
TopAbs_ShapeEnum entity,
Range range)
{
std::list<long> idList;
return idList;
}
} //namespace GEOMUtils } //namespace GEOMUtils

View File

@ -56,12 +56,6 @@ namespace GEOMUtils
int intervals, int intervals,
Range range ); Range range );
// function to get list of sub-shapes IDs according to the specified range data (needed for groups creation function).
Standard_EXPORT std::list<long> FilterSubShapes(
TopoDS_Shape shape,
TopAbs_ShapeEnum entity,
Range range );
} }
#endif // _GEOMUtils_ShapeStatistics_HXX_ #endif // _GEOMUtils_ShapeStatistics_HXX_

View File

@ -40,6 +40,7 @@
#include <LightApp_SelectionMgr.h> #include <LightApp_SelectionMgr.h>
#include <SalomeApp_Application.h> #include <SalomeApp_Application.h>
#include <SalomeApp_Study.h>
#include <Plot2d_Histogram.h> #include <Plot2d_Histogram.h>
#include <Plot2d_ViewFrame.h> #include <Plot2d_ViewFrame.h>
@ -58,6 +59,8 @@
// OCC includes // OCC includes
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
#include <GEOMImpl_Types.hxx>
//=========================================================================== //===========================================================================
// class : MeasureGUI_ShapeStatisticsDlg() // class : MeasureGUI_ShapeStatisticsDlg()
//=========================================================================== //===========================================================================
@ -67,7 +70,6 @@ MeasureGUI_ShapeStatisticsDlg::MeasureGUI_ShapeStatisticsDlg( QWidget* parent, T
myHistogram ( 0 ) myHistogram ( 0 )
{ {
myShapes.push_back( aShape ); myShapes.push_back( aShape );
myMainObj = GEOM::GEOM_Object::_nil();
QIcon iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); QIcon iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
@ -75,7 +77,6 @@ MeasureGUI_ShapeStatisticsDlg::MeasureGUI_ShapeStatisticsDlg( QWidget* parent, T
setAttribute( Qt::WA_DeleteOnClose ); setAttribute( Qt::WA_DeleteOnClose );
myApp = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); myApp = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
//myViewWindow = myApp->desktop()->activeWindow();
QVBoxLayout* topLayout = new QVBoxLayout( this ); QVBoxLayout* topLayout = new QVBoxLayout( this );
@ -154,6 +155,7 @@ MeasureGUI_ShapeStatisticsDlg::MeasureGUI_ShapeStatisticsDlg( QWidget* parent, T
/********************** Buttons **********************/ /********************** Buttons **********************/
myButtonPlot = new QPushButton( tr( "GEOM_PLOT_DISTRIBUTION" ), this ); myButtonPlot = new QPushButton( tr( "GEOM_PLOT_DISTRIBUTION" ), this );
myButtonPlot->setDefault( true );
myButtonCreateGr = new QPushButton( tr( "GEOM_SHAPE_STATISTICS_CREATE_GROUPS" ), this ); myButtonCreateGr = new QPushButton( tr( "GEOM_SHAPE_STATISTICS_CREATE_GROUPS" ), this );
QPushButton* buttonClose = new QPushButton( tr( "GEOM_BUT_CLOSE" ), this ); QPushButton* buttonClose = new QPushButton( tr( "GEOM_BUT_CLOSE" ), this );
QPushButton* buttonHelp = new QPushButton( tr( "GEOM_BUT_HELP" ), this ); QPushButton* buttonHelp = new QPushButton( tr( "GEOM_BUT_HELP" ), this );
@ -198,6 +200,48 @@ MeasureGUI_ShapeStatisticsDlg::~MeasureGUI_ShapeStatisticsDlg()
{ {
} }
//=================================================================================
// function : createOperation
// purpose :
//=================================================================================
GEOM::GEOM_IOperations_ptr MeasureGUI_ShapeStatisticsDlg::createOperation()
{
return getGeomEngine()->GetIGroupOperations(getStudyId());
}
#define RETURN_WITH_MSG(a, b) \
if (!(a)) { \
theMessage += (b); \
return false; \
}
//================================================================
// Function : getFather
// Purpose : Get father object for object to be added in study
// (called with addInStudy method)
//================================================================
GEOM::GEOM_Object_ptr MeasureGUI_ShapeStatisticsDlg::getFather(GEOM::GEOM_Object_ptr theObj)
{
GEOM::GEOM_Object_var aFatherObj;
if (theObj->GetType() == GEOM_GROUP) {
GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation());
aFatherObj = anOper->GetMainShape(theObj);
}
return aFatherObj._retn();
}
//=================================================================================
// function : getSourceObjects
// purpose : virtual method to get source objects
//=================================================================================
QList<GEOM::GeomObjPtr> MeasureGUI_ShapeStatisticsDlg::getSourceObjects()
{
QList<GEOM::GeomObjPtr> res;
GEOM::GeomObjPtr aGeomObjPtr1(myMainObj);
res << aGeomObjPtr1;
return res;
}
//================================================================================= //=================================================================================
// function : onEditMainShape() // function : onEditMainShape()
// purpose : called when selection button was clicked // purpose : called when selection button was clicked
@ -216,8 +260,8 @@ void MeasureGUI_ShapeStatisticsDlg::onEditMainShape()
if ( !selShapes.isEmpty() ) { if ( !selShapes.isEmpty() ) {
if ( selShapes.count() == 1 ) if ( selShapes.count() == 1 )
myMainObj = selShapes[0].get(); myMainObj = selShapes[0];
QString aName = selShapes.count() > 1 ? QString( "%1_objects").arg( selShapes.count() ) : GEOMBase::GetName( myMainObj ); QString aName = selShapes.count() > 1 ? QString( "%1_objects").arg( selShapes.count() ) : GEOMBase::GetName( myMainObj.get() );
myEditMainShape->setText( aName ); myEditMainShape->setText( aName );
} }
@ -304,19 +348,12 @@ TopAbs_ShapeEnum MeasureGUI_ShapeStatisticsDlg::currentType()
// function : clickOnPlot() // function : clickOnPlot()
// purpose : called when Plot button was clicked // purpose : called when Plot button was clicked
//================================================================================= //=================================================================================
bool MeasureGUI_ShapeStatisticsDlg::checkInput() bool MeasureGUI_ShapeStatisticsDlg::isValid(QString& theMessage)
{ {
if ( myMin->text().isEmpty() ) { if ( myScalarRangeBox->isChecked() ) {
showError( tr("GEOM_SHAPE_STATISTICS_MIN_ERROR") ); RETURN_WITH_MSG( !myMin->text().isEmpty(), tr("GEOM_SHAPE_STATISTICS_MIN_ERROR") )
return false; RETURN_WITH_MSG( !myMax->text().isEmpty(), tr("GEOM_SHAPE_STATISTICS_MAX_ERROR") )
} RETURN_WITH_MSG( myMin->text().toDouble() <= myMax->text().toDouble(), tr("GEOM_SHAPE_STATISTICS_MIN_MAX_ERROR") )
if ( myMax->text().isEmpty() ) {
showError( tr("GEOM_SHAPE_STATISTICS_MAX_ERROR" ) );
return false;
}
if (myMin->text().toDouble() > myMax->text().toDouble()) {
showError( tr("GEOM_SHAPE_STATISTICS_MIN_MAX_ERROR" ) );
return false;
} }
return true; return true;
} }
@ -328,8 +365,11 @@ void MeasureGUI_ShapeStatisticsDlg::clickOnPlot()
{ {
GEOMUtils::Range aRange; GEOMUtils::Range aRange;
if ( myScalarRangeBox->isChecked() ) { if ( myScalarRangeBox->isChecked() ) {
if ( !checkInput() ) QString msg;
if ( !isValid( msg ) ) {
showError( msg );
return; return;
}
aRange.min = myMin->text().toDouble(); aRange.min = myMin->text().toDouble();
aRange.max = myMax->text().toDouble(); aRange.max = myMax->text().toDouble();
} else { } else {
@ -361,13 +401,10 @@ void MeasureGUI_ShapeStatisticsDlg::clickOnPlot()
SUIT_ViewManager* aViewManager = myApp->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary SUIT_ViewManager* aViewManager = myApp->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
if( !aViewManager ) if( !aViewManager )
return; return;
Plot2d_Viewer* aView = dynamic_cast<Plot2d_Viewer*>(aViewManager->getViewModel()); aViewManager->getActiveView()->setFocus();
if ( !aView )
return;
Plot2d_ViewWindow* aViewWnd = dynamic_cast<Plot2d_ViewWindow*>(aViewManager->getActiveView()); Plot2d_ViewWindow* aViewWnd = dynamic_cast<Plot2d_ViewWindow*>(aViewManager->getActiveView());
if( !aViewWnd ) if( !aViewWnd )
return; return;
aViewWnd->setFocus();
Plot2d_ViewFrame* aPlot = aViewWnd->getViewFrame(); Plot2d_ViewFrame* aPlot = aViewWnd->getViewFrame();
if ( !aPlot ) if ( !aPlot )
return; return;
@ -419,18 +456,37 @@ void MeasureGUI_ShapeStatisticsDlg::clickOnCompute()
//================================================================================= //=================================================================================
void MeasureGUI_ShapeStatisticsDlg::clickOnCreateGroups() void MeasureGUI_ShapeStatisticsDlg::clickOnCreateGroups()
{ {
GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation()); onAccept(false, false, false);
}
//=================================================================================
// function : execute(ObjectList& objects)
// purpose :
//=================================================================================
bool MeasureGUI_ShapeStatisticsDlg::execute(ObjectList& objects)
{
if ( myMainObj.isNull() )
return false;
GEOM::GroupOpPtr anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation());
GEOMUtils::Range aRange; GEOMUtils::Range aRange;
if ( myScalarRangeBox->isChecked() ) { if ( myScalarRangeBox->isChecked() ) {
if ( !checkInput() ) QString msg;
return; if ( !isValid( msg ) ) {
showError( msg );
return false;
}
aRange.min = myMin->text().toDouble(); aRange.min = myMin->text().toDouble();
aRange.max = myMax->text().toDouble(); aRange.max = myMax->text().toDouble();
} else { } else {
aRange.min = -1.0; // flag that range is empty aRange.min = -1.0; // flag that range is empty
} }
SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 );
QString aTypePrefix = myCBTypes->currentText().replace(' ', '_');
QString objIOR, aMin, aMax, aGroupName;
SalomeApp_Study* study = getStudy();
GEOMUtils::Distribution aShapesDistr = GEOMUtils::Distribution aShapesDistr =
GEOMUtils::ComputeDistribution( myShapes, currentType(), myNbIntervals->value(), aRange ); GEOMUtils::ComputeDistribution( myShapes, currentType(), myNbIntervals->value(), aRange );
@ -448,31 +504,40 @@ void MeasureGUI_ShapeStatisticsDlg::clickOnCreateGroups()
ii++; ii++;
} }
if (CORBA::is_nil(myMainObj)) // Create an empty group
return;
GEOM::GEOM_Object_var aGroup; GEOM::GEOM_Object_var aGroup;
aGroup = anOper->CreateGroup( myMainObj, currentType() ); aGroup = anOper->CreateGroup( myMainObj.get(), currentType() );
if (CORBA::is_nil(aGroup) || !anOper->IsDone()) if (CORBA::is_nil(aGroup) || !anOper->IsDone())
return; return false;
GEOM::ListOfLong_var aCurrList = anOper->GetObjects(aGroup);
if (!anOper->IsDone())
return;
if (aCurrList->length() > 0)
{
anOper->DifferenceIDs(aGroup, aCurrList);
if (!anOper->IsDone())
return;
}
// Add sub-shapes into group
anOper->UnionIDs(aGroup, aNewList); anOper->UnionIDs(aGroup, aNewList);
if (!anOper->IsDone()) if (!anOper->IsDone())
return; return false;
GEOMBase::PublishSubObject( aGroup );
// Set a correct group name
if (study) {
objIOR = GEOMBase::GetIORFromObject(aGroup);
if (objIOR != "") {
_PTR(SObject) SO (study->studyDS()->FindObjectIOR(objIOR.toLatin1().constData()));
if (SO) {
aMin = DlgRef::PrintDoubleValue( (*it).min, aPrecision );
aMax = DlgRef::PrintDoubleValue( (*it).max, aPrecision );
aGroupName = aTypePrefix + "_" + aMin + "_" + aMax;
_PTR(StudyBuilder) aBuilder (study->studyDS()->NewBuilder());
aBuilder->SetName(SO, aGroupName.toLatin1().constData());
}
}
}
// add group to be published
objects.push_back(aGroup._retn());
} }
} }
return true;
} }
//================================================================================= //=================================================================================

View File

@ -53,6 +53,14 @@ public:
MeasureGUI_ShapeStatisticsDlg( QWidget*, TopoDS_Shape aShape = TopoDS_Shape(), TopAbs_ShapeEnum aSubShapeType = TopAbs_SHAPE ); MeasureGUI_ShapeStatisticsDlg( QWidget*, TopoDS_Shape aShape = TopoDS_Shape(), TopAbs_ShapeEnum aSubShapeType = TopAbs_SHAPE );
~MeasureGUI_ShapeStatisticsDlg(); ~MeasureGUI_ShapeStatisticsDlg();
protected:
// redefined from GEOMBase_Helper
virtual GEOM::GEOM_IOperations_ptr createOperation();
virtual bool isValid (QString&);
virtual bool execute (ObjectList&);
virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr);
virtual QList<GEOM::GeomObjPtr> getSourceObjects();
private slots: private slots:
void onEditMainShape(); void onEditMainShape();
void clickOnCompute(); void clickOnCompute();
@ -64,15 +72,13 @@ private:
void fillTypes( bool, bool, bool ); void fillTypes( bool, bool, bool );
void updateTypes( QList<GEOM::GeomObjPtr> theShapes ); void updateTypes( QList<GEOM::GeomObjPtr> theShapes );
TopAbs_ShapeEnum currentType(); TopAbs_ShapeEnum currentType();
bool checkInput();
private: private:
SalomeApp_Application* myApp; SalomeApp_Application* myApp;
QPointer<SUIT_ViewWindow> myViewWindow;
QLineEdit* myEditMainShape; QLineEdit* myEditMainShape;
QtxComboBox* myCBTypes; QtxComboBox* myCBTypes;
std::list<TopoDS_Shape> myShapes; std::list<TopoDS_Shape> myShapes;
GEOM::GEOM_Object_var myMainObj; GEOM::GeomObjPtr myMainObj;
QtxIntSpinBox* myNbIntervals; QtxIntSpinBox* myNbIntervals;
QGroupBox* myScalarRangeBox; QGroupBox* myScalarRangeBox;
QLineEdit* myMin; QLineEdit* myMin;