+ SMESH_MesherHelper::MType MeshType = aHelper->IsQuadraticMesh();
+ if ( MeshType == SMESH_MesherHelper::COMP )
+ return error( COMPERR_BAD_INPUT_MESH,
+ SMESH_Comment("Mesh with linear and quadratic elements given"));
+
+ aHelper->SetIsQuadratic( MeshType == SMESH_MesherHelper::QUADRATIC );
+
+ // ---------------------------------
+ // Feed the Netgen with surface mesh
+ // ---------------------------------
+
+ int Netgen_NbOfNodes = 0;
+ int Netgen_param2ndOrder = 0;
+ double Netgen_paramFine = 1.;
+ double Netgen_paramSize = pow( 72, 1/6. ) * pow( _maxElementVolume, 1/3. );
+
+ double Netgen_point[3];
+ int Netgen_triangle[3];
+ int Netgen_tetrahedron[4];
+
+ NETGENPlugin_NetgenLibWrapper ngLib;
+ Ng_Mesh * Netgen_mesh = ngLib._ngMesh;
+
+ SMESH_ProxyMesh::Ptr proxyMesh( new SMESH_ProxyMesh( aMesh ));
+ if ( aMesh.NbQuadrangles() > 0 )
+ {
+ StdMeshers_QuadToTriaAdaptor* Adaptor = new StdMeshers_QuadToTriaAdaptor;
+ Adaptor->Compute(aMesh);
+ proxyMesh.reset( Adaptor );
+ }
+
+ // maps nodes to ng ID
+ typedef map< const SMDS_MeshNode*, int, TIDCompare > TNodeToIDMap;
+ typedef TNodeToIDMap::value_type TN2ID;
+ TNodeToIDMap nodeToNetgenID;
+
+ SMDS_ElemIteratorPtr fIt = proxyMesh->GetFaces();
+ while( fIt->more())
+ {
+ // check element
+ const SMDS_MeshElement* elem = fIt->next();
+ if ( !elem )
+ return error( COMPERR_BAD_INPUT_MESH, "Null element encounters");
+ if ( elem->NbCornerNodes() != 3 )
+ return error( COMPERR_BAD_INPUT_MESH, "Not triangle element encounters");
+
+ // add three nodes of triangle
+ for ( int iN = 0; iN < 3; ++iN )
+ {
+ const SMDS_MeshNode* node = elem->GetNode( iN );
+ int& ngID = nodeToNetgenID.insert(TN2ID( node, invalid_ID )).first->second;
+ if ( ngID == invalid_ID )
+ {
+ ngID = ++Netgen_NbOfNodes;
+ Netgen_point [ 0 ] = node->X();
+ Netgen_point [ 1 ] = node->Y();
+ Netgen_point [ 2 ] = node->Z();
+ Ng_AddPoint(Netgen_mesh, Netgen_point);
+ }
+ Netgen_triangle[ iN ] = ngID;
+ }
+ Ng_AddSurfaceElement(Netgen_mesh, NG_TRIG, Netgen_triangle);
+ }
+ proxyMesh.reset(); // delete tmp faces
+
+ // vector of nodes in which node index == netgen ID
+ vector< const SMDS_MeshNode* > nodeVec ( nodeToNetgenID.size() + 1 );
+ // insert old nodes into nodeVec
+ TNodeToIDMap::iterator n_id = nodeToNetgenID.begin();
+ for ( ; n_id != nodeToNetgenID.end(); ++n_id )
+ nodeVec.at( n_id->second ) = n_id->first;
+ nodeToNetgenID.clear();
+
+ // -------------------------
+ // Generate the volume mesh
+ // -------------------------
+
+ return ( ngLib._isComputeOk = compute( aMesh, *aHelper, nodeVec, Netgen_mesh));
+}
+
+void NETGENPlugin_NETGEN_3D::CancelCompute()