+//=================================================================================
+// 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 ( (MeshCheck->isChecked() && myIDSource->_is_nil()) ||
+ myMesh->_is_nil() ||
+ myPath->_is_nil() )
+ return false;
+
+ if(!MeshCheck->isChecked()) {
+ QStringList aListElementsId = ElementsLineEdit->text().split(" ", QString::SkipEmptyParts);
+ if(aListElementsId.count() <= 0)
+ return false;
+ }
+
+ bool bOk;
+ StartPointLineEdit->text().toLong(&bOk);
+ if (!bOk) {
+ return false;
+ }
+
+ return true;
+}
+
+
+//=================================================================================
+// function : onDisplaySimulation
+// purpose : Show/Hide preview
+//=================================================================================
+void SMESHGUI_ExtrusionAlongPathDlg::onDisplaySimulation( bool toDisplayPreview ) {
+ if (myPreviewCheckBox->isChecked() && toDisplayPreview) {
+ if(isValid() && isValuesValid()) {
+
+ //Get selected elements:
+ SMESH::long_array_var anElementsId = getSelectedElements();
+
+ // 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_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer();
+ bool NeedGroups = false;
+ SMESH::ElementType ElemType = ( GetConstructorId() == 0 ) ? SMESH::EDGE : SMESH::FACE;
+ if( !MeshCheck->isChecked() ) {
+ aMeshEditor->ExtrusionAlongPathX(anElementsId, myPath, aNodeStart, AnglesGrp->isChecked(),
+ anAngles, LinearAnglesCheck->isChecked(),
+ BasePointGrp->isChecked(), aBasePoint,
+ NeedGroups, ElemType, retVal);
+ }
+ else {
+ SMESH::ListOfGroups_var groups =
+ aMeshEditor->ExtrusionAlongPathObjX(myIDSource, myPath, aNodeStart, AnglesGrp->isChecked(),
+ anAngles, LinearAnglesCheck->isChecked(),
+ BasePointGrp->isChecked(), aBasePoint,
+ NeedGroups, ElemType, retVal);
+ }
+
+ if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK ) {
+ SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData();
+ mySimulation->SetData(aMeshPreviewStruct._retn());
+ } else {
+ hidePreview();
+ }
+
+ } catch (...) {
+ hidePreview();
+ }
+ } else {
+ hidePreview();
+ }
+
+ } else {
+ hidePreview();
+ }
+ } else {
+ hidePreview();
+ }
+}
+
+
+//=================================================================================
+// function : getSelectedElements
+// purpose : return list of the selected elements
+//=================================================================================
+SMESH::long_array_var SMESHGUI_ExtrusionAlongPathDlg::getSelectedElements() {
+
+ // If "Select whole mesh, submesh or group" check box is off ->
+ // use only elements of given type selected by user
+ SMESH::long_array_var anElementsId = new SMESH::long_array;
+ if (!MeshCheck->isChecked()) {
+
+ SMDS_Mesh* aMesh;
+ if ( myMeshActor )
+ aMesh = myMeshActor->GetObject()->GetMesh();
+
+ if (aMesh) {
+ QStringList aListElementsId = ElementsLineEdit->text().split(" ", QString::SkipEmptyParts);
+ anElementsId = new SMESH::long_array;
+ anElementsId->length(aListElementsId.count());
+ bool bOk;
+ int j = 0;
+ for (int i = 0; i < aListElementsId.count(); i++) {
+ long ind = aListElementsId[ i ].toLong(&bOk);
+ if (bOk) {
+ const SMDS_MeshElement* e = aMesh->FindElement(ind);
+ if (e) {
+ bool typeMatch = (Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge) ||
+ (Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face);
+ if (typeMatch)
+ anElementsId[ j++ ] = ind;
+ }
+ }
+ }
+ anElementsId->length(j);
+ }
+ }
+ return anElementsId;
+}
+
+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;
+}