+
+//=================================================================================
+// function : keyPressEvent()
+// purpose :
+//=================================================================================
+void SMESHGUI_ExtrusionAlongPathDlg::keyPressEvent( QKeyEvent* e )
+{
+ QDialog::keyPressEvent( e );
+ if ( e->isAccepted() )
+ return;
+
+ if ( e->key() == Qt::Key_F1 ) {
+ e->accept();
+ ClickOnHelp();
+ }
+}
+
+//=================================================================================
+// function : isValid
+// purpose :
+//=================================================================================
+bool SMESHGUI_ExtrusionAlongPathDlg::isValid()
+{
+ QString msg;
+ bool ok = true;
+ ok = XSpin->isValid( msg, true ) && ok;
+ ok = YSpin->isValid( msg, true ) && ok;
+ ok = ZSpin->isValid( msg, true ) && ok;
+
+ if( !ok ) {
+ QString str( tr( "SMESH_INCORRECT_INPUT" ) );
+ if ( !msg.isEmpty() )
+ str += "\n" + msg;
+ SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
+ return false;
+ }
+ return true;
+}
+
+//=================================================================================
+// function : updateLinearAngles
+// purpose :
+//=================================================================================
+void SMESHGUI_ExtrusionAlongPathDlg::updateLinearAngles()
+{
+ bool enableLinear = true;
+ for( int row = 0, nbRows = AnglesList->count(); row < nbRows; row++ ) {
+ if( QListWidgetItem* anItem = AnglesList->item( row ) ) {
+ enableLinear = false;
+ anItem->text().toDouble(&enableLinear);
+ if( !enableLinear )
+ break;
+ }
+ }
+ if( !enableLinear )
+ LinearAnglesCheck->setChecked( false );
+ LinearAnglesCheck->setEnabled( enableLinear );
+}
+
+//=================================================================================
+// function : isValuesValid()
+// purpose : Return true in case if values entered into dialog are valid
+//=================================================================================
+
+bool SMESHGUI_ExtrusionAlongPathDlg::isValuesValid()
+{
+ if ( myPath->_is_nil() )
+ return false;
+
+ bool bOk;
+ long aNodeStart = StartPointLineEdit->text().toLong(&bOk);
+ if ( !bOk || aNodeStart < 1 )
+ return false;
+
+ SMESH::SMESH_Mesh_var mesh = myPath->GetMesh();
+ if ( mesh->_is_nil() )
+ return false;
+
+ SMESH::ElementType type = mesh->GetElementType( aNodeStart, false );
+ if ( type != SMESH::NODE )
+ return false;
+
+ if ( mesh->HasShapeToMesh() )
+ {
+ SMESH::NodePosition_var pos = mesh->GetNodePosition( aNodeStart );
+ if ( pos->shapeType != GEOM::VERTEX )
+ return false;
+ }
+ else
+ {
+ SMESH::long_array_var elems = mesh->GetNodeInverseElements( aNodeStart );
+ if ( elems->length() != 1 ||
+ mesh->GetElementType( elems[0], true ) != SMESH::EDGE )
+ return false;
+ }
+ return true;
+}
+
+//=================================================================================
+// function : onDisplaySimulation
+// purpose : Show/Hide preview
+//=================================================================================
+
+void SMESHGUI_ExtrusionAlongPathDlg::onDisplaySimulation( bool toDisplayPreview )
+{
+ if ( myPreviewCheckBox->isChecked() && toDisplayPreview ) {
+ if ( SelectorWdg->IsAnythingSelected() && isValid() && isValuesValid())
+ {
+ // get angles
+ SMESH::double_array_var anAngles = getAngles();
+
+ // get base point
+ SMESH::PointStruct aBasePoint;
+ if (BasePointGrp->isChecked()) {
+ aBasePoint.x = XSpin->GetValue();
+ aBasePoint.y = YSpin->GetValue();
+ aBasePoint.z = ZSpin->GetValue();
+ }
+ bool bOk;
+ long aNodeStart = StartPointLineEdit->text().toLong(&bOk);
+ if (bOk) {
+
+ try {
+ SUIT_OverrideCursor wc;
+
+ SMESH::SMESH_MeshEditor::Extrusion_Error retVal;
+ SMESH::SMESH_Mesh_var mesh = SelectorWdg->GetMesh();
+ SMESH::SMESH_MeshEditor_var meshEditor = mesh->GetMeshEditPreviewer();
+
+ SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources();
+ SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources();
+ SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources();
+ SelectorWdg->GetSelected( nodes, edges, faces );
+ const bool makeGroups = false;
+
+ SMESH::ListOfGroups_var groups =
+ meshEditor->ExtrusionAlongPathObjects( nodes, edges, faces, myPath,
+ GEOM::GEOM_Object::_nil(),
+ aNodeStart, AnglesGrp->isChecked(),
+ anAngles, LinearAnglesCheck->isChecked(),
+ BasePointGrp->isChecked(), aBasePoint,
+ makeGroups, retVal );
+
+ if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK )
+ {
+ SMESH::MeshPreviewStruct_var aMeshPreviewStruct = meshEditor->GetPreviewData();
+ mySimulation->SetData( aMeshPreviewStruct._retn() );
+ }
+ else {
+ hidePreview();
+ }
+
+ } catch (...) {
+ hidePreview();
+ }
+ } else {
+ hidePreview();
+ }
+
+ } else {
+ hidePreview();
+ }
+ } else {
+ hidePreview();
+ }
+}
+
+SMESH::double_array_var SMESHGUI_ExtrusionAlongPathDlg::getAngles()
+{
+ SMESH::double_array_var anAngles = new SMESH::double_array;
+ if (AnglesGrp->isChecked())
+ {
+ anAngles->length(myAnglesList.count());
+ int j = 0;
+ for (int i = 0; i < myAnglesList.count(); i++) {
+ double angle = myAnglesList[i];
+ anAngles[ j++ ] = angle*M_PI/180.;
+ }
+ anAngles->length(j);
+ }
+ return anAngles;
+}