68cd1914e8f8d800ade4dc59abead95b40a1b611
[occt.git] / src / MeshTest / MeshTest_DrawableMesh.cxx
1 // Created on: 1994-08-03
2 // Created by: Modeling
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <MeshTest_DrawableMesh.hxx>
18 #include <TopoDS.hxx>
19 #include <Draw.hxx>
20 #include <Draw_ColorKind.hxx>
21 #include <Draw_Color.hxx>
22 #include <TColStd_ListIteratorOfListOfInteger.hxx>
23 #include <Standard_RangeError.hxx>
24 #include <BRepMesh_DegreeOfFreedom.hxx>
25 #include <BRepMesh_Edge.hxx>
26 #include <BRepMesh_Vertex.hxx>
27 #include <BRepMesh_Triangle.hxx>
28 #include <BRepMesh_DataStructureOfDelaun.hxx>
29 #include <TopExp_Explorer.hxx>
30
31 IMPLEMENT_STANDARD_HANDLE (MeshTest_DrawableMesh, Draw_Drawable3D)
32 IMPLEMENT_STANDARD_RTTIEXT(MeshTest_DrawableMesh, Draw_Drawable3D)
33
34 //=======================================================================
35 //function : MeshTest_DrawableMesh
36 //purpose  : 
37 //=======================================================================
38 MeshTest_DrawableMesh::MeshTest_DrawableMesh()
39   : myDeflection(1.)
40 {
41 }
42
43 //=======================================================================
44 //function : MeshTest_DrawableMesh
45 //purpose  : 
46 //=======================================================================
47 MeshTest_DrawableMesh::MeshTest_DrawableMesh(const TopoDS_Shape& theShape,
48                                              const Standard_Real theDeflection)
49   : myDeflection(theDeflection)
50 {
51   Add(theShape);
52 }
53
54 //=======================================================================
55 //function : MeshTest_DrawableMesh
56 //purpose  : 
57 //=======================================================================
58 MeshTest_DrawableMesh::MeshTest_DrawableMesh(
59   const Handle(BRepMesh_IncrementalMesh)& theMesher)
60   : myDeflection(1.)
61 {
62   myMesher = theMesher;
63   if (!myMesher.IsNull())
64     myDeflection = myMesher->Deflection();
65 }
66
67 //=======================================================================
68 //function : MeshTest_DrawableMesh
69 //purpose  : 
70 //=======================================================================
71 void MeshTest_DrawableMesh::Add(const TopoDS_Shape& theShape)
72 {
73   if (myMesher.IsNull())
74   {
75     myMesher = new BRepMesh_IncrementalMesh;
76     myMesher->SetDeflection(myDeflection);
77     myMesher->SetAngle(0.5);
78   }
79   
80   myMesher->SetShape(theShape);
81   myMesher->Perform();
82 }
83
84 //=======================================================================
85 //function : DrawOn
86 //purpose  : 
87 //=======================================================================
88
89 void MeshTest_DrawableMesh::DrawOn(Draw_Display& /*D*/) const 
90 {
91   // should be reimplemented!!
92   /*  Handle(BRepMesh_DataStructureOfDelaun) struc = myMesh->Result();
93   Standard_Integer nbc;
94   D.SetColor(Draw_vert);
95
96   for (Standard_Integer iLi=1; iLi<=myMesh->NbEdges(); iLi++) {
97   const BRepMesh_Edge& ed=myMesh->Edge(iLi);
98   if (ed.Movability()!=BRepMesh_Deleted) {
99   nbc=struc->ElemConnectedTo(iLi).Extent();
100   if (nbc<=0) D.SetColor(Draw_bleu);
101   else if (nbc==1) D.SetColor(Draw_jaune);
102   else if (nbc==2) D.SetColor(Draw_vert);
103   else D.SetColor(Draw_corail);
104   D.MoveTo(myMesh->Pnt(ed.FirstNode()));
105   D.DrawTo(myMesh->Pnt(ed.LastNode()));
106   }
107   }
108
109
110   // highlighted triangles
111   D.SetColor(Draw_blanc);
112   Standard_Integer e1, e2, e3, i;
113   Standard_Boolean o1, o2, o3;
114
115   for (i = 1; i <= myTriangles.Length(); i++) {
116   const BRepMesh_Triangle& tri=struc->GetElement(myTriangles(i));
117   tri.Edges(e1, e2, e3, o1, o2, o3); 
118   const BRepMesh_Edge& ed1=myMesh->Edge(e1);
119   if (ed1.Movability()!=BRepMesh_Deleted) {
120   D.MoveTo(myMesh->Pnt(ed1.FirstNode()));
121   D.DrawTo(myMesh->Pnt(ed1.LastNode()));
122   }
123   const BRepMesh_Edge& ed2=myMesh->Edge(e2);
124   if (ed2.Movability()!=BRepMesh_Deleted) {
125   D.MoveTo(myMesh->Pnt(ed2.FirstNode()));
126   D.DrawTo(myMesh->Pnt(ed2.LastNode()));
127   }
128   const BRepMesh_Edge& ed3=myMesh->Edge(e3);
129   if (ed3.Movability()!=BRepMesh_Deleted) {
130   D.MoveTo(myMesh->Pnt(ed3.FirstNode()));
131   D.DrawTo(myMesh->Pnt(ed3.LastNode()));
132   }
133   }
134
135   // highlighted edges
136   D.SetColor(Draw_rouge);
137   for (i = 1; i <= myEdges.Length(); i++) {
138   const BRepMesh_Edge& ed=myMesh->Edge(myEdges(i));
139   if (ed.Movability()!=BRepMesh_Deleted) {
140   D.MoveTo(myMesh->Pnt(ed.FirstNode()));
141   D.DrawTo(myMesh->Pnt(ed.LastNode()));
142   }
143   }
144
145   // highlighted vertices
146   for (i = 1; i <= myVertices.Length(); i++) {
147   D.DrawMarker(myMesh->Pnt(myVertices(i)),Draw_Losange);
148   }
149
150   */
151
152 }
153
154 //=======================================================================
155 //function : Copy
156 //purpose  : 
157 //=======================================================================
158 Handle(Draw_Drawable3D) MeshTest_DrawableMesh::Copy() const 
159 {
160   return new MeshTest_DrawableMesh(myMesher);
161 }
162
163 //=======================================================================
164 //function : Dump
165 //purpose  : 
166 //=======================================================================
167 void MeshTest_DrawableMesh::Dump(Standard_OStream&) const 
168 {
169   // Should be reimplemented
170
171   /*Handle(BRepMesh_DataStructureOfDelaun) struc=myMesh->Result();
172   Standard_Integer e1, e2, e3;
173   Standard_Boolean o1, o2, o3;
174   Standard_Integer in, il, ie;
175   Standard_Integer nbn=struc->NbNodes();
176   Standard_Integer nbl=struc->NbLinks();
177   Standard_Integer nbe=struc->NbElements();
178
179   for (in=1; in<=nbn; in++) {
180   BRepMesh_Vertex nod=struc->GetNode(in);
181   S<<"(node "<<in<<" (uv "<<nod.Coord().X()<<" "
182   <<nod.Coord().Y()<<") (3d "
183   <<nod.Location3d()<<") ";
184   printdegree(nod.Movability());
185   S<<" (edgeconex";
186   BRepMesh_ListOfInteger::Iterator tati(struc->LinkNeighboursOf(in));
187   for (; tati.More(); tati.Next()) S<<" "<<tati.Value();
188   S << "))\n";
189   }
190   S <<endl;
191   for (il=1; il<=nbl; il++) {
192   BRepMesh_Edge edg=struc->GetLink(il);
193   S << "(edge "<<il<<" ("<<edg.FirstNode()<<" "<<edg.LastNode()
194   <<" ";
195   printdegree(edg.Movability());
196   S<<") (triconex";
197   const BRepMesh_PairOfIndex& pair = struc->ElemConnectedTo(il);
198   for (Standard_Integer j = 1, jn = pair.Extent(); j <= jn; j++)
199   S<<" "<<pair.Index(j);
200   S << "))\n";
201   }
202   S <<endl;
203   for (ie=1; ie<=nbe; ie++) {
204   BRepMesh_Triangle tri=struc->GetElement(ie);
205   tri.Edges(e1, e2, e3, o1, o2, o3); 
206   if (!o1) e1=-e1;
207   if (!o2) e2=-e2;
208   if (!o3) e3=-e3;
209   S<<" (maille "<<ie<<" (links "<<e1<<" "
210   <<e2<<" "<<e3<<")";
211   printdegree(tri.Movability());
212   S<<")\n";
213   }
214   S << endl;
215   */
216 }
217
218 //=======================================================================
219 //function : Whatis
220 //purpose  : 
221 //=======================================================================
222 void MeshTest_DrawableMesh::Whatis(Draw_Interpretor& theStream) const 
223 {
224   const Handle(BRepMesh_FastDiscret)& aMesh = myMesher->Mesh();
225   Standard_Integer aPointsNb    = aMesh->NbBoundaryPoints();
226   Standard_Integer aTrianglesNb = 0;
227   Standard_Integer aEdgesNb     = 0;
228
229   const TopoDS_Shape& aShape = myMesher->Shape();
230   TopExp_Explorer aFaceIt(aShape, TopAbs_FACE);
231   for (; aFaceIt.More(); aFaceIt.Next())
232   {
233     const TopoDS_Face& aFace = TopoDS::Face(aFaceIt.Current());
234
235     Handle(BRepMesh_FaceAttribute) aAtrribure;
236     if (!aMesh->GetFaceAttribute(aFace, aAtrribure) || !aAtrribure->IsValid())
237       continue;
238
239     aPointsNb   += aAtrribure->ChangeSurfacePoints()->Extent();
240
241     Handle(BRepMesh_DataStructureOfDelaun)& aStructure =
242       aAtrribure->ChangeStructure();
243
244     aTrianglesNb += aStructure->ElementsOfDomain().Extent();
245     aEdgesNb     += aStructure->LinksOfDomain().Extent();
246   }
247
248   theStream << " 3d mesh\n";
249   theStream << "    - Triangles : " << aTrianglesNb << "\n";
250   theStream << "    - Edges     : " << aEdgesNb     << "\n";
251   theStream << "    - Point3d   : " << aPointsNb    << "\n";
252 }
253
254 //=======================================================================
255 //function : Mesher
256 //purpose  : 
257 //=======================================================================
258 const Handle(BRepMesh_IncrementalMesh)& MeshTest_DrawableMesh::Mesher() const 
259 {
260   return myMesher;
261 }
262
263
264 //=======================================================================
265 //function : Edges
266 //purpose  : 
267 //=======================================================================
268 TColStd_SequenceOfInteger& MeshTest_DrawableMesh::Edges()
269 {
270   return myEdges;
271 }
272
273
274 //=======================================================================
275 //function : Vertices
276 //purpose  : 
277 //=======================================================================
278 TColStd_SequenceOfInteger& MeshTest_DrawableMesh::Vertices()
279 {
280   return myVertices;
281 }
282
283 //=======================================================================
284 //function : Triangles
285 //purpose  : 
286 //=======================================================================
287 TColStd_SequenceOfInteger& MeshTest_DrawableMesh::Triangles()
288 {
289   return myTriangles;
290 }
291