File indexing completed on 2026-09-11 09:18:58
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef _RWMesh_FaceIterator_HeaderFile
0015 #define _RWMesh_FaceIterator_HeaderFile
0016
0017 #include <RWMesh_ShapeIterator.hxx>
0018
0019 #include <BRepLProp_SLProps.hxx>
0020 #include <Poly_Triangulation.hxx>
0021 #include <TopoDS_Face.hxx>
0022
0023 #include <algorithm>
0024
0025 class TDF_Label;
0026
0027
0028
0029
0030
0031
0032 class RWMesh_FaceIterator : public RWMesh_ShapeIterator
0033 {
0034 public:
0035
0036
0037
0038
0039
0040 Standard_EXPORT RWMesh_FaceIterator(const TDF_Label& theLabel,
0041 const TopLoc_Location& theLocation,
0042 const bool theToMapColors = false,
0043 const XCAFPrs_Style& theStyle = XCAFPrs_Style());
0044
0045
0046
0047
0048 Standard_EXPORT RWMesh_FaceIterator(const TopoDS_Shape& theShape,
0049 const XCAFPrs_Style& theStyle = XCAFPrs_Style());
0050
0051
0052 bool More() const override { return !myPolyTriang.IsNull(); }
0053
0054
0055 Standard_EXPORT void Next() override;
0056
0057
0058 const TopoDS_Face& Face() const { return myFace; }
0059
0060
0061 const TopoDS_Shape& Shape() const override { return myFace; }
0062
0063
0064 const occ::handle<Poly_Triangulation>& Triangulation() const { return myPolyTriang; }
0065
0066
0067 bool IsEmptyMesh() const { return IsEmpty(); }
0068
0069
0070 bool IsEmpty() const override
0071 {
0072 return myPolyTriang.IsNull()
0073 || (myPolyTriang->NbNodes() < 1 && myPolyTriang->NbTriangles() < 1);
0074 }
0075
0076 public:
0077
0078 const XCAFPrs_Style& FaceStyle() const { return myStyle; }
0079
0080
0081 bool HasFaceColor() const { return myHasColor; }
0082
0083
0084 const Quantity_ColorRGBA& FaceColor() const { return myColor; }
0085
0086 public:
0087
0088 int NbTriangles() const { return myPolyTriang->NbTriangles(); }
0089
0090
0091 int ElemLower() const override { return 1; }
0092
0093
0094 int ElemUpper() const override { return myPolyTriang->NbTriangles(); }
0095
0096
0097 Poly_Triangle TriangleOriented(int theElemIndex) const
0098 {
0099 Poly_Triangle aTri = triangle(theElemIndex);
0100 if ((myFace.Orientation() == TopAbs_REVERSED) ^ myIsMirrored)
0101 {
0102 return Poly_Triangle(aTri.Value(1), aTri.Value(3), aTri.Value(2));
0103 }
0104 return aTri;
0105 }
0106
0107 public:
0108
0109 bool HasNormals() const { return myHasNormals; }
0110
0111
0112 bool HasTexCoords() const { return !myPolyTriang.IsNull() && myPolyTriang->HasUVNodes(); }
0113
0114
0115
0116 gp_Dir NormalTransformed(int theNode) const
0117 {
0118 gp_Dir aNorm = normal(theNode);
0119 if (myTrsf.Form() != gp_Identity)
0120 {
0121 aNorm.Transform(myTrsf);
0122 }
0123 if (myFace.Orientation() == TopAbs_REVERSED)
0124 {
0125 aNorm.Reverse();
0126 }
0127 return aNorm;
0128 }
0129
0130
0131 int NbNodes() const override { return !myPolyTriang.IsNull() ? myPolyTriang->NbNodes() : 0; }
0132
0133
0134 int NodeLower() const override { return 1; }
0135
0136
0137 int NodeUpper() const override { return myPolyTriang->NbNodes(); }
0138
0139
0140 gp_Pnt2d NodeTexCoord(const int theNode) const
0141 {
0142 return myPolyTriang->HasUVNodes() ? myPolyTriang->UVNode(theNode) : gp_Pnt2d();
0143 }
0144
0145 public:
0146
0147 gp_Pnt node(const int theNode) const override { return myPolyTriang->Node(theNode); }
0148
0149
0150 Standard_EXPORT gp_Dir normal(int theNode) const;
0151
0152
0153 Poly_Triangle triangle(int theElemIndex) const { return myPolyTriang->Triangle(theElemIndex); }
0154
0155 private:
0156
0157 void resetFace()
0158 {
0159 myPolyTriang.Nullify();
0160 myFace.Nullify();
0161 myHasNormals = false;
0162 resetShape();
0163 }
0164
0165
0166 void initFace();
0167
0168 private:
0169
0170 TopoDS_Face myFace;
0171 occ::handle<Poly_Triangulation> myPolyTriang;
0172 mutable BRepLProp_SLProps mySLTool;
0173 BRepAdaptor_Surface myFaceAdaptor;
0174 bool myHasNormals;
0175 bool myIsMirrored;
0176
0177 };
0178
0179 #endif