-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
#define OCCGEOMETRY
#endif
#include <occgeom.hpp>
+
+#ifdef NETGEN_V5
#include <ngexception.hpp>
+#endif
+#ifdef NETGEN_V6
+#include <exception.hpp>
+#endif
+
namespace nglib {
#include <nglib.h>
}
#else
extern int OCCGenerateMesh (OCCGeometry&, Mesh*&, int, int, char*);
#endif
-#if defined(NETGEN_V5) && defined(WIN32)
- DLL_HEADER
-#endif
-extern MeshingParameters mparam;
-#if defined(NETGEN_V5) && defined(WIN32)
- DLL_HEADER
-#endif
+
+ NETGENPLUGIN_DLL_HEADER
+ extern MeshingParameters mparam;
+
+ NETGENPLUGIN_DLL_HEADER
extern volatile multithreadt multithread;
}
using namespace nglib;
int Netgen_triangle[3];
NETGENPlugin_NetgenLibWrapper ngLib;
- Ng_Mesh * Netgen_mesh = ngLib._ngMesh;
+ Ng_Mesh * Netgen_mesh = (Ng_Mesh*)ngLib._ngMesh;
// vector of nodes in which node index == netgen ID
vector< const SMDS_MeshNode* > nodeVec;
const SMESHDS_SubMesh * aSubMeshDSFace = proxyMesh->GetSubMesh( aShapeFace );
if ( !aSubMeshDSFace ) continue;
+
SMDS_ElemIteratorPtr iteratorElem = aSubMeshDSFace->GetElements();
+ if ( _quadraticMesh &&
+ dynamic_cast< const SMESH_ProxyMesh::SubMesh*>( aSubMeshDSFace ))
+ {
+ // add medium nodes of proxy triangles to helper (#16843)
+ while ( iteratorElem->more() )
+ helper.AddTLinks( static_cast< const SMDS_MeshFace* >( iteratorElem->next() ));
+
+ iteratorElem = aSubMeshDSFace->GetElements();
+ }
while ( iteratorElem->more() ) // loop on elements on a geom face
{
// check mesh face
// Generate the volume mesh
// -------------------------
- return ( ngLib._isComputeOk = compute( aMesh, helper, nodeVec, Netgen_mesh));
+ return ( ngLib._isComputeOk = compute( aMesh, helper, nodeVec, ngLib ));
}
// namespace
bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh& aMesh,
SMESH_MesherHelper& helper,
vector< const SMDS_MeshNode* >& nodeVec,
- Ng_Mesh * Netgen_mesh)
+ NETGENPlugin_NetgenLibWrapper& ngLib)
{
netgen::multithread.terminate = 0;
- netgen::Mesh* ngMesh = (netgen::Mesh*)Netgen_mesh;
- int Netgen_NbOfNodes = Ng_GetNP(Netgen_mesh);
+ netgen::Mesh* ngMesh = ngLib._ngMesh;
+ Ng_Mesh* Netgen_mesh = ngLib.ngMesh();
+ int Netgen_NbOfNodes = Ng_GetNP( Netgen_mesh );
-#ifndef NETGEN_V5
- char *optstr = 0;
-#endif
int startWith = netgen::MESHCONST_MESHVOLUME;
int endWith = netgen::MESHCONST_OPTVOLUME;
int err = 1;
{
OCC_CATCH_SIGNALS;
-#ifdef NETGEN_V5
- ngMesh->CalcLocalH(netgen::mparam.grading);
- err = netgen::OCCGenerateMesh(occgeo, ngMesh, netgen::mparam, startWith, endWith);
-#else
- ngMesh->CalcLocalH();
- err = netgen::OCCGenerateMesh(occgeo, ngMesh, startWith, endWith, optstr);
-#endif
+ ngLib.CalcLocalH(ngMesh);
+ err = ngLib.GenerateMesh(occgeo, startWith, endWith);
+
if(netgen::multithread.terminate)
return false;
if ( err )
str << ": " << ex.GetMessageString();
error(str);
}
- catch (netgen::NgException exc)
+ catch (netgen::NgException& exc)
{
SMESH_Comment str("NgException");
if ( strlen( netgen::multithread.task ) > 0 )
int Netgen_triangle[3];
NETGENPlugin_NetgenLibWrapper ngLib;
- Ng_Mesh * Netgen_mesh = ngLib._ngMesh;
+ 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 );
+
+ if ( aHelper->IsQuadraticMesh() )
+ {
+ SMDS_ElemIteratorPtr fIt = proxyMesh->GetFaces();
+ while( fIt->more())
+ aHelper->AddTLinks( static_cast< const SMDS_MeshFace* >( fIt->next() ));
+ }
}
// maps nodes to ng ID
// Generate the volume mesh
// -------------------------
- return ( ngLib._isComputeOk = compute( aMesh, *aHelper, nodeVec, Netgen_mesh));
+ return ( ngLib._isComputeOk = compute( aMesh, *aHelper, nodeVec, ngLib ));
}
void NETGENPlugin_NETGEN_3D::CancelCompute()