41 namespace NekMeshUtils
45 "oce", CADSurfOCE::create,
"CADSurfOCE");
47 void CADSurfOCE::Initialise(
int i, TopoDS_Shape in)
49 m_s = BRep_Tool::Surface(TopoDS::Face(in));
51 if (in.Orientation() == 1)
59 BRepTools::UVBounds(TopoDS::Face(in), m_bounds[0], m_bounds[1], m_bounds[2],
61 m_sas =
new ShapeAnalysis_Surface(m_s);
62 m_sas->SetDomain(m_bounds[0], m_bounds[1], m_bounds[2], m_bounds[3]);
66 m_2Dclass =
new BRepTopAdaptor_FClass2d(TopoDS::Face(m_shape), 1e-4);
83 bool CADSurfOCE::IsPlanar()
85 if (m_sas->Adaptor3d()->GetType() == GeomAbs_Plane)
95 BRepMesh_IncrementalMesh brmsh(m_shape, 0.005);
99 NekDouble e = sqrt(B.SquareExtent()) * 0.01;
103 B.Get(ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]);
116 gp_Pnt
loc(p[0] * 1000.0, p[1] * 1000.0, p[2] * 1000.0);
119 gp_Pnt2d p2 = m_sas->ValueOfUV(loc, Precision::Confusion());
121 TopAbs_State s = m_2Dclass->Perform(p2);
125 BRepBuilderAPI_MakeVertex v(loc);
126 BRepExtrema_DistShapeShape dss(
127 BRepTools::OuterWire(TopoDS::Face(m_shape)), v.Shape());
129 gp_Pnt np = dss.PointOnShape1(1);
130 p2 = m_sas->ValueOfUV(np, Precision::Confusion());
135 gp_Pnt p3 = m_sas->Value(p2);
137 dist = p3.Distance(loc) / 1000.0;
144 #if defined(NEKTAR_DEBUG) 148 GeomLProp_SLProps d(m_s, 2, Precision::Confusion());
149 d.SetParameters(uv[0], uv[1]);
151 return d.MaxCurvature() * 1000.0;
156 #if defined(NEKTAR_DEBUG) 160 gp_Pnt
loc = m_s->Value(uv[0], uv[1]);
162 location[0] = loc.X() / 1000.0;
163 location[1] = loc.Y() / 1000.0;
164 location[2] = loc.Z() / 1000.0;
171 #if defined(NEKTAR_DEBUG) 175 gp_Pnt
loc = m_s->Value(uv[0], uv[1]);
176 x = loc.X() / 1000.0;
177 y = loc.Y() / 1000.0;
178 z = loc.Z() / 1000.0;
183 #if defined(NEKTAR_DEBUG) 187 GeomLProp_SLProps d(m_s, 2, Precision::Confusion());
188 d.SetParameters(uv[0], uv[1]);
192 if (!d.IsNormalDefined())
198 gp_Dir n = d.Normal();
214 #if defined(NEKTAR_DEBUG) 221 m_s->D1(uv[0], uv[1], Loc, D1U, D1V);
223 r[0] = Loc.X() / 1000.0;
224 r[1] = Loc.Y() / 1000.0;
225 r[2] = Loc.Z() / 1000.0;
226 r[3] = D1U.X() / 1000.0;
227 r[4] = D1U.Y() / 1000.0;
228 r[5] = D1U.Z() / 1000.0;
229 r[6] = D1V.X() / 1000.0;
230 r[7] = D1V.Y() / 1000.0;
231 r[8] = D1V.Z() / 1000.0;
238 #if defined(NEKTAR_DEBUG) 244 gp_Vec D1U, D1V, D2U, D2V, D2UV;
245 m_s->D2(uv[0], uv[1], Loc, D1U, D1V, D2U, D2V, D2UV);
247 r[0] = Loc.X() / 1000.0;
248 r[1] = Loc.Y() / 1000.0;
249 r[2] = Loc.Z() / 1000.0;
250 r[3] = D1U.X() / 1000.0;
251 r[4] = D1U.Y() / 1000.0;
252 r[5] = D1U.Z() / 1000.0;
253 r[6] = D1V.X() / 1000.0;
254 r[7] = D1V.Y() / 1000.0;
255 r[8] = D1V.Z() / 1000.0;
256 r[9] = D2U.X() / 1000.0;
257 r[10] = D2U.Y() / 1000.0;
258 r[11] = D2U.Z() / 1000.0;
259 r[12] = D2V.X() / 1000.0;
260 r[13] = D2V.Y() / 1000.0;
261 r[14] = D2V.Z() / 1000.0;
262 r[15] = D2UV.X() / 1000.0;
263 r[16] = D2UV.Y() / 1000.0;
264 r[17] = D2UV.Z() / 1000.0;
273 error <<
"Point not within parameter plane: ";
277 if (uv[0] < m_bounds[0])
279 if (fabs(uv[0] - m_bounds[0]) > 1E-6)
281 error <<
"U(" << uv[0] <<
") is less than Umin(" << m_bounds[0]
286 else if (uv[0] > m_bounds[1])
288 if (fabs(uv[0] - m_bounds[1]) > 1E-6)
290 error <<
"U(" << uv[0] <<
") is greater than Umax(" << m_bounds[1]
295 else if (uv[1] < m_bounds[2])
297 if (fabs(uv[1] - m_bounds[2]) > 1E-6)
299 error <<
"V(" << uv[1] <<
") is less than Vmin(" << m_bounds[2]
304 else if (uv[1] > m_bounds[3])
306 if (fabs(uv[1] - m_bounds[3]) > 1E-6)
308 error <<
"V(" << uv[1] <<
") is greater than Vmax(" << m_bounds[3]
314 error <<
" On Surface: " << GetId();
315 ASSERTL1(passed,
"Warning: " + error.str());
CADSurfFactory & GetCADSurfFactory()
DNekMat void Add(NekMatrix< DataType, StandardMatrixTag > &result, const NekMatrix< LhsDataType, LhsMatrixType > &lhs, const NekMatrix< RhsDataType, RhsMatrixType > &rhs)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...