19#ifdef DEAL_II_WITH_OPENCASCADE
27# include <IGESControl_Controller.hxx>
28# include <IGESControl_Reader.hxx>
29# include <IGESControl_Writer.hxx>
30# include <STEPControl_Controller.hxx>
31# include <STEPControl_Reader.hxx>
32# include <STEPControl_Writer.hxx>
33# include <TopExp_Explorer.hxx>
35# include <TopoDS_Edge.hxx>
36# include <TopoDS_Face.hxx>
37# include <TopoDS_Shape.hxx>
41# if DEAL_II_OPENCASCADE_VERSION_GTE(7, 0, 0)
42# include <Standard_Transient.hxx>
44# include <Handle_Standard_Transient.hxx>
47# include <BRepAdaptor_Curve.hxx>
48# if DEAL_II_OPENCASCADE_VERSION_GTE(7, 6, 0)
49# include <BRepAlgoAPI_Section.hxx>
51# include <BRepAdaptor_HCompCurve.hxx>
52# include <BRepAdaptor_HCurve.hxx>
53# include <BRepAlgo_Section.hxx>
55# include <BRepAdaptor_Surface.hxx>
56# include <BRepBndLib.hxx>
57# include <BRepBuilderAPI_MakeEdge.hxx>
58# include <BRepBuilderAPI_Sewing.hxx>
59# include <BRepBuilderAPI_Transform.hxx>
60# include <BRepMesh_IncrementalMesh.hxx>
61# include <BRepTools.hxx>
62# include <BRep_Builder.hxx>
63# include <GCPnts_AbscissaPoint.hxx>
64# include <GeomAPI_Interpolate.hxx>
65# include <GeomAPI_ProjectPointOnCurve.hxx>
66# include <GeomAPI_ProjectPointOnSurf.hxx>
67# include <GeomConvert_CompCurveToBSplineCurve.hxx>
68# include <GeomLProp_SLProps.hxx>
69# include <Geom_BoundedCurve.hxx>
70# include <Geom_Plane.hxx>
71# include <IntCurvesFace_ShapeIntersector.hxx>
72# include <Poly_Triangulation.hxx>
73# include <ShapeAnalysis_Surface.hxx>
74# include <StlAPI_Reader.hxx>
75# include <StlAPI_Writer.hxx>
76# include <TColStd_HSequenceOfTransient.hxx>
77# include <TColStd_SequenceOfTransient.hxx>
78# include <TColgp_HArray1OfPnt.hxx>
79# include <TopLoc_Location.hxx>
92 std::tuple<unsigned int, unsigned int, unsigned int>
96 unsigned int n_faces = 0, n_edges = 0, n_vertices = 0;
97 for (exp.Init(shape, TopAbs_FACE); exp.More(); exp.Next(), ++n_faces)
100 for (exp.Init(shape, TopAbs_EDGE); exp.More(); exp.Next(), ++n_edges)
103 for (exp.Init(shape, TopAbs_VERTEX); exp.More(); exp.Next(), ++n_vertices)
106 return std::tuple<unsigned int, unsigned int, unsigned int>(n_faces,
113 std::vector<TopoDS_Face> &faces,
114 std::vector<TopoDS_Edge> &edges,
115 std::vector<TopoDS_Vertex> &vertices)
122 for (exp.Init(shape, TopAbs_FACE); exp.More(); exp.Next())
124 faces.push_back(TopoDS::Face(exp.Current()));
126 for (exp.Init(shape, TopAbs_EDGE); exp.More(); exp.Next())
128 edges.push_back(TopoDS::Edge(exp.Current()));
130 for (exp.Init(shape, TopAbs_VERTEX); exp.More(); exp.Next())
132 vertices.push_back(TopoDS::Vertex(exp.Current()));
139 std::vector<TopoDS_Compound> &compounds,
140 std::vector<TopoDS_CompSolid> &compsolids,
141 std::vector<TopoDS_Solid> &solids,
142 std::vector<TopoDS_Shell> &shells,
143 std::vector<TopoDS_Wire> &wires)
146 compsolids.resize(0);
152 for (exp.Init(shape, TopAbs_COMPOUND); exp.More(); exp.Next())
154 compounds.push_back(TopoDS::Compound(exp.Current()));
156 for (exp.Init(shape, TopAbs_COMPSOLID); exp.More(); exp.Next())
158 compsolids.push_back(TopoDS::CompSolid(exp.Current()));
160 for (exp.Init(shape, TopAbs_SOLID); exp.More(); exp.Next())
162 solids.push_back(TopoDS::Solid(exp.Current()));
164 for (exp.Init(shape, TopAbs_SHELL); exp.More(); exp.Next())
166 shells.push_back(TopoDS::Shell(exp.Current()));
168 for (exp.Init(shape, TopAbs_WIRE); exp.More(); exp.Next())
170 wires.push_back(TopoDS::Wire(exp.Current()));
174 template <
int spacedim>
181 return gp_Pnt(p[0], 0, 0);
183 return gp_Pnt(p[0], p[1], 0);
185 return gp_Pnt(p[0], p[1], p[2]);
191 template <
int spacedim>
193 point(
const gp_Pnt &p,
const double tolerance)
201 "Cannot convert OpenCASCADE point to 1d if p.Y() != 0."));
204 "Cannot convert OpenCASCADE point to 1d if p.Z() != 0."));
209 "Cannot convert OpenCASCADE point to 2d if p.Z() != 0."));
193 point(
const gp_Pnt &p,
const double tolerance) {
…}
223 const double tolerance)
225 const double rel_tol =
227 if (direction.
norm() > 0.0)
228 return (p1 * direction < p2 * direction - rel_tol);
230 for (
int d = dim; d >= 0; --d)
231 if (p1[d] < p2[d] - rel_tol)
233 else if (p2[d] < p1[d] - rel_tol)
243 read_IGES(
const std::string &filename,
const double scale_factor)
245 IGESControl_Reader reader;
246 IFSelect_ReturnStatus stat;
247 stat = reader.ReadFile(filename.c_str());
250 Standard_Boolean failsonly = Standard_False;
251 IFSelect_PrintCount mode = IFSelect_ItemsByEntity;
252 reader.PrintCheckLoad(failsonly, mode);
254 Standard_Integer nRoots = reader.TransferRoots();
263 scale.SetScale(Origin, scale_factor);
265 TopoDS_Shape sh = reader.OneShape();
266 BRepBuilderAPI_Transform trans(sh, scale);
268 return trans.Shape();
243 read_IGES(
const std::string &filename,
const double scale_factor) {
…}
272 write_IGES(
const TopoDS_Shape &shape,
const std::string &filename)
274 IGESControl_Controller::Init();
275 IGESControl_Writer ICW(
"MM", 0);
276 Standard_Boolean ok = ICW.AddShape(shape);
279 Standard_Boolean OK = ICW.Write(filename.c_str());
272 write_IGES(
const TopoDS_Shape &shape,
const std::string &filename) {
…}
287 StlAPI_Reader reader;
289 reader.Read(shape, filename.c_str());
296 const std::string &filename,
297 const double deflection,
298 const bool sew_different_faces,
299 const double sewer_tolerance,
300 const bool is_relative,
301 const double angular_deflection,
302 const bool in_parallel)
305 std::vector<TopoDS_Vertex> vertices;
306 std::vector<TopoDS_Edge> edges;
307 std::vector<TopoDS_Face> faces;
309 const bool mesh_is_present =
310 std::none_of(faces.begin(), faces.end(), [&Loc](
const TopoDS_Face &face) {
311 Handle(Poly_Triangulation) theTriangulation =
312 BRep_Tool::Triangulation(face, Loc);
313 return theTriangulation.IsNull();
315 TopoDS_Shape shape_to_be_written = shape;
316 if (!mesh_is_present)
318 if (sew_different_faces)
320 BRepBuilderAPI_Sewing sewer(sewer_tolerance);
321 sewer.Add(shape_to_be_written);
323 shape_to_be_written = sewer.SewedShape();
326 shape_to_be_written = shape;
330 BRepMesh_IncrementalMesh mesh_im(shape_to_be_written,
337 StlAPI_Writer writer;
339# if DEAL_II_OPENCASCADE_VERSION_GTE(6, 9, 0)
341 const auto error = writer.Write(shape_to_be_written, filename.c_str());
344# if !DEAL_II_OPENCASCADE_VERSION_GTE(7, 2, 0)
355 writer.Write(shape_to_be_written, filename.c_str());
360 read_STEP(
const std::string &filename,
const double scale_factor)
362 STEPControl_Reader reader;
363 IFSelect_ReturnStatus stat;
364 stat = reader.ReadFile(filename.c_str());
367 Standard_Boolean failsonly = Standard_False;
368 IFSelect_PrintCount mode = IFSelect_ItemsByEntity;
369 reader.PrintCheckLoad(failsonly, mode);
371 Standard_Integer nRoots = reader.TransferRoots();
380 scale.SetScale(Origin, scale_factor);
382 TopoDS_Shape sh = reader.OneShape();
383 BRepBuilderAPI_Transform trans(sh, scale);
385 return trans.Shape();
360 read_STEP(
const std::string &filename,
const double scale_factor) {
…}
389 write_STEP(
const TopoDS_Shape &shape,
const std::string &filename)
391 STEPControl_Controller::Init();
392 STEPControl_Writer SCW;
393 IFSelect_ReturnStatus status;
394 status = SCW.Transfer(shape, STEPControl_AsIs);
396 ExcMessage(
"Failed to add shape to STEP controller."));
398 status = SCW.Write(filename.c_str());
401 ExcMessage(
"Failed to write translated shape to STEP file."));
389 write_STEP(
const TopoDS_Shape &shape,
const std::string &filename) {
…}
407 double tolerance = 0.0;
409 std::vector<TopoDS_Face> faces;
410 std::vector<TopoDS_Edge> edges;
411 std::vector<TopoDS_Vertex> vertices;
415 for (
const auto &vertex : vertices)
416 tolerance = std::fmax(tolerance, BRep_Tool::Tolerance(vertex));
418 for (
const auto &edge : edges)
419 tolerance = std::fmax(tolerance, BRep_Tool::Tolerance(edge));
421 for (
const auto &face : faces)
422 tolerance = std::fmax(tolerance, BRep_Tool::Tolerance(face));
436 Handle(Geom_Plane) plane =
new Geom_Plane(c_x, c_y, c_z, c);
437# if DEAL_II_OPENCASCADE_VERSION_GTE(7, 6, 0)
438 BRepAlgoAPI_Section section(in_shape, plane);
440 BRepAlgo_Section section(in_shape, plane);
442 TopoDS_Shape edges = section.Shape();
447 join_edges(
const TopoDS_Shape &in_shape,
const double tolerance)
449 TopoDS_Edge out_shape;
450 const TopoDS_Shape &edges = in_shape;
451 std::vector<Handle_Geom_BoundedCurve> intersections;
455 gp_Pnt PIn(0.0, 0.0, 0.0);
456 gp_Pnt PFin(0.0, 0.0, 0.0);
457 gp_Pnt PMid(0.0, 0.0, 0.0);
458 TopExp_Explorer edgeExplorer(edges, TopAbs_EDGE);
460 while (edgeExplorer.More())
462 edge = TopoDS::Edge(edgeExplorer.Current());
463 Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, L, First, Last);
464 intersections.push_back(Handle(Geom_BoundedCurve)::DownCast(curve));
470 unsigned int numIntersEdges = intersections.size();
473 GeomConvert_CompCurveToBSplineCurve convert_bspline(intersections[0]);
475 bool check =
false, one_added =
true, one_failed =
true;
476 std::vector<bool> added(numIntersEdges,
false);
478 while (one_added ==
true)
482 for (
unsigned int i = 1; i < numIntersEdges; ++i)
483 if (added[i] ==
false)
485 Handle(Geom_Curve) curve = intersections[i];
486 Handle(Geom_BoundedCurve) bcurve =
487 Handle(Geom_BoundedCurve)::DownCast(curve);
488 check = convert_bspline.Add(bcurve, tolerance,
false,
true, 0);
493 Handle(Geom_BoundedCurve) bcurve =
494 Handle(Geom_BoundedCurve)::DownCast(curve);
496 convert_bspline.Add(bcurve, tolerance,
false,
true, 0);
498 one_failed = one_failed || (check ==
false);
499 one_added = one_added || (check ==
true);
504 Assert(one_failed ==
false,
505 ExcMessage(
"Joining some of the Edges failed."));
507 Handle(Geom_Curve) bspline = convert_bspline.BSplineCurve();
509 out_shape = BRepBuilderAPI_MakeEdge(bspline);
447 join_edges(
const TopoDS_Shape &in_shape,
const double tolerance) {
…}
518 const double tolerance)
522 gp_Pnt P0 =
point(origin);
525 dim > 1 ? direction[1] : 0,
526 dim > 2 ? direction[2] : 0));
530 gp_Pnt Pproj(0.0, 0.0, 0.0);
534 IntCurvesFace_ShapeIntersector Inters;
535 Inters.Load(in_shape, tolerance);
539 Inters.Perform(line, -RealLast(), +RealLast());
542 double minDistance = 1e7;
544 for (
int i = 0; i < Inters.NbPnt(); ++i)
546 const double distance =
point(origin).Distance(Inters.Pnt(i + 1));
549 if (distance < minDistance)
551 minDistance = distance;
552 result = point<dim>(Inters.Pnt(i + 1));
564 const double tolerance)
566 unsigned int n_vertices = curve_points.size();
568 if (direction * direction > 0)
570 std::sort(curve_points.begin(),
573 return OpenCASCADE::point_compare(p1,
581 Handle(TColgp_HArray1OfPnt) vertices =
582 new TColgp_HArray1OfPnt(1, n_vertices);
583 for (
unsigned int vertex = 0; vertex < n_vertices; ++vertex)
585 vertices->SetValue(vertex + 1,
point(curve_points[vertex]));
589 GeomAPI_Interpolate bspline_generator(vertices, closed, tolerance);
590 bspline_generator.Perform();
591 Assert((bspline_generator.IsDone()),
592 ExcMessage(
"Interpolated bspline generation failed"));
594 Handle(Geom_BSplineCurve) bspline = bspline_generator.Curve();
595 TopoDS_Edge out_shape = BRepBuilderAPI_MakeEdge(bspline);
596 out_shape.Closed(closed);
602 template <
int spacedim>
603 std::vector<TopoDS_Edge>
611 std::map<unsigned int, std::pair<unsigned int, unsigned int>> vert_to_faces;
612 std::map<unsigned int, std::pair<unsigned int, unsigned int>> face_to_verts;
613 std::map<unsigned int, bool> visited_faces;
614 std::map<unsigned int, Point<spacedim>> vert_to_point;
616 unsigned int face_index;
618 for (
const auto &cell :
triangulation.active_cell_iterators())
620 if (cell->face(f)->at_boundary())
623 face_index = cell->face(f)->index();
624 const unsigned int v0 = cell->face(f)->vertex_index(0);
625 const unsigned int v1 = cell->face(f)->vertex_index(1);
626 face_to_verts[face_index].first =
v0;
627 face_to_verts[face_index].second =
v1;
628 visited_faces[face_index] =
false;
633 f, 0,
true,
false,
false)];
635 f, 1,
true,
false,
false)];
638 if (vert_to_faces.find(
v0) == vert_to_faces.end())
640 vert_to_faces[
v0].first = face_index;
644 vert_to_faces[
v0].second = face_index;
646 if (vert_to_faces.find(
v1) == vert_to_faces.end())
648 vert_to_faces[
v1].first = face_index;
652 vert_to_faces[
v1].second = face_index;
658 std::vector<TopoDS_Edge> interpolation_curves;
659 bool finished = (face_to_verts.empty());
660 face_index = finished ? 0 : face_to_verts.begin()->first;
662 while (finished ==
false)
664 const unsigned int start_point_index = face_to_verts[face_index].first;
665 unsigned int point_index = start_point_index;
668 std::vector<Point<spacedim>> pointlist;
671 visited_faces[face_index] =
true;
672 auto current_point = vert_to_point[point_index];
673 pointlist.push_back(current_point);
676 if (face_to_verts[face_index].
first != point_index)
677 point_index = face_to_verts[face_index].first;
679 point_index = face_to_verts[face_index].second;
682 if (vert_to_faces[point_index].
first != face_index)
683 face_index = vert_to_faces[point_index].first;
685 face_index = vert_to_faces[point_index].second;
687 while (point_index != start_point_index);
689 interpolation_curves.push_back(
693 for (
const auto &f : visited_faces)
694 if (f.second ==
false)
696 face_index = f.first;
701 return interpolation_curves;
706 std::tuple<Point<dim>, TopoDS_Shape, double,
double>
709 const double tolerance)
712 gp_Pnt Pproj =
point(origin);
714 double minDistance = 1e7;
715 gp_Pnt tmp_proj(0.0, 0.0, 0.0);
717 [[maybe_unused]]
unsigned int counter = 0;
718 unsigned int face_counter = 0;
720 TopoDS_Shape out_shape;
724 for (exp.Init(in_shape, TopAbs_FACE); exp.More(); exp.Next())
726 TopoDS_Face face = TopoDS::Face(exp.Current());
730 Handle(Geom_Surface) SurfToProj = BRep_Tool::Surface(face);
732 ShapeAnalysis_Surface projector(SurfToProj);
733 gp_Pnt2d proj_params = projector.ValueOfUV(
point(origin), tolerance);
735 SurfToProj->D0(proj_params.X(), proj_params.Y(), tmp_proj);
737 double distance = point<dim>(tmp_proj).distance(origin);
738 if (distance < minDistance)
740 minDistance = distance;
754 if (face_counter == 0)
755 for (exp.Init(in_shape, TopAbs_EDGE); exp.More(); exp.Next())
757 TopoDS_Edge edge = TopoDS::Edge(exp.Current());
758 if (!BRep_Tool::Degenerated(edge))
766 Handle(Geom_Curve) CurveToProj =
767 BRep_Tool::Curve(edge, L, First, Last);
769 GeomAPI_ProjectPointOnCurve Proj(
point(origin), CurveToProj);
770 unsigned int num_proj_points = Proj.NbPoints();
771 if ((num_proj_points > 0) && (Proj.LowerDistance() < minDistance))
773 minDistance = Proj.LowerDistance();
774 Pproj = Proj.NearestPoint();
776 u = Proj.LowerDistanceParameter();
783 return std::tuple<Point<dim>, TopoDS_Shape, double,
double>(
784 point<dim>(Pproj), out_shape, u, v);
792 const double tolerance)
794 std::tuple<Point<dim>, TopoDS_Shape, double,
double> ref =
796 return std::get<0>(ref);
802 const double tolerance)
805 std::tuple<Point<3>, TopoDS_Shape, double,
double> shape_and_params =
808 TopoDS_Shape &out_shape = std::get<1>(shape_and_params);
809 double &u = std::get<2>(shape_and_params);
810 double &v = std::get<3>(shape_and_params);
814 std::tuple<unsigned int, unsigned int, unsigned int>
numbers =
821 "Could not find normal: the shape containing the closest point has 0 faces."));
825 "Could not find normal: the shape containing the closest point has more than 1 face."));
829 exp.Init(out_shape, TopAbs_FACE);
830 TopoDS_Face face = TopoDS::Face(exp.Current());
836 push_forward(
const TopoDS_Shape &in_shape,
const double u,
const double v)
838 switch (in_shape.ShapeType())
842 BRepAdaptor_Surface surf(TopoDS::Face(in_shape));
843 return point<dim>(surf.Value(u, v));
847 BRepAdaptor_Curve curve(TopoDS::Edge(in_shape));
848 return point<dim>(curve.Value(u));
836 push_forward(
const TopoDS_Shape &in_shape,
const double u,
const double v) {
…}
862 Handle(Geom_Surface) SurfToProj = BRep_Tool::Surface(face);
863 GeomLProp_SLProps props(SurfToProj, u, v, 1, 1e-7);
864 gp_Pnt Value = props.Value();
866 gp_Dir Normal = props.Normal();
867 Assert(props.IsCurvatureDefined(),
868 ExcMessage(
"Curvature is not well defined!"));
869 Standard_Real Min_Curvature = props.MinCurvature();
870 Standard_Real Max_Curvature = props.MaxCurvature();
877 if (face.Orientation() == TopAbs_REVERSED)
884 return std::tuple<Point<3>,
Tensor<1, 3>, double,
double>(point<3>(Value),
892 template <
int spacedim>
897 BRepAdaptor_Surface surf(face);
898 const double u0 = surf.FirstUParameter();
899 const double u1 = surf.LastUParameter();
900 const double v0 = surf.FirstVParameter();
901 const double v1 = surf.LastVParameter();
903 std::vector<CellData<2>> cells;
904 std::vector<Point<spacedim>> vertices;
907 vertices.push_back(point<spacedim>(surf.Value(u0,
v0)));
908 vertices.push_back(point<spacedim>(surf.Value(u1,
v0)));
909 vertices.push_back(point<spacedim>(surf.Value(u0,
v1)));
910 vertices.push_back(point<spacedim>(surf.Value(u1,
v1)));
913 for (
unsigned int i = 0; i < 4; ++i)
916 cells.push_back(cell);
925# include "opencascade/utilities.inst"
Abstract base class for mapping classes.
virtual boost::container::small_vector< Point< spacedim >, ReferenceCells::max_n_vertices< dim >() > get_vertices(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const
numbers::NumberTraits< Number >::real_type norm() const
virtual void create_triangulation(const std::vector< Point< spacedim > > &vertices, const std::vector< CellData< dim > > &cells, const SubCellData &subcelldata)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcUnsupportedShape()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
TopoDS_Edge interpolation_curve(std::vector< Point< dim > > &curve_points, const Tensor< 1, dim > &direction=Tensor< 1, dim >(), const bool closed=false, const double tolerance=1e-7)
std::tuple< Point< 3 >, Tensor< 1, 3 >, double, double > push_forward_and_differential_forms(const TopoDS_Face &face, const double u, const double v, const double tolerance=1e-7)
void extract_compound_shapes(const TopoDS_Shape &shape, std::vector< TopoDS_Compound > &compounds, std::vector< TopoDS_CompSolid > &compsolids, std::vector< TopoDS_Solid > &solids, std::vector< TopoDS_Shell > &shells, std::vector< TopoDS_Wire > &wires)
Point< dim > push_forward(const TopoDS_Shape &in_shape, const double u, const double v)
std::tuple< unsigned int, unsigned int, unsigned int > count_elements(const TopoDS_Shape &shape)
void write_STEP(const TopoDS_Shape &shape, const std::string &filename)
std::tuple< Point< 3 >, Tensor< 1, 3 >, double, double > closest_point_and_differential_forms(const TopoDS_Shape &in_shape, const Point< 3 > &origin, const double tolerance=1e-7)
void extract_geometrical_shapes(const TopoDS_Shape &shape, std::vector< TopoDS_Face > &faces, std::vector< TopoDS_Edge > &edges, std::vector< TopoDS_Vertex > &vertices)
TopoDS_Edge join_edges(const TopoDS_Shape &in_shape, const double tolerance=1e-7)
TopoDS_Shape read_STEP(const std::string &filename, const double scale_factor=1e-3)
bool point_compare(const Point< dim > &p1, const Point< dim > &p2, const Tensor< 1, dim > &direction=Tensor< 1, dim >(), const double tolerance=1e-10)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
Point< dim > closest_point(const TopoDS_Shape &in_shape, const Point< dim > &origin, const double tolerance=1e-7)
std::tuple< Point< dim >, TopoDS_Shape, double, double > project_point_and_pull_back(const TopoDS_Shape &in_shape, const Point< dim > &origin, const double tolerance=1e-7)
Point< dim > line_intersection(const TopoDS_Shape &in_shape, const Point< dim > &origin, const Tensor< 1, dim > &direction, const double tolerance=1e-7)
void write_STL(const TopoDS_Shape &shape, const std::string &filename, const double deflection, const bool sew_different_faces=false, const double sewer_tolerance=1e-6, const bool is_relative=false, const double angular_deflection=0.5, const bool in_parallel=false)
void create_triangulation(const TopoDS_Face &face, Triangulation< 2, spacedim > &tria)
TopoDS_Shape read_STL(const std::string &filename)
TopoDS_Shape intersect_plane(const TopoDS_Shape &in_shape, const double c_x, const double c_y, const double c_z, const double c, const double tolerance=1e-7)
std::vector< TopoDS_Edge > create_curves_from_triangulation_boundary(const Triangulation< 2, spacedim > &triangulation, const Mapping< 2, spacedim > &mapping=StaticMappingQ1< 2, spacedim >::mapping)
double get_shape_tolerance(const TopoDS_Shape &shape)
void write_IGES(const TopoDS_Shape &shape, const std::string &filename)
TopoDS_Shape read_IGES(const std::string &filename, const double scale_factor=1e-3)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation
std::vector< unsigned int > vertices
static unsigned int face_to_cell_vertices(const unsigned int face, const unsigned int vertex, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false)
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()