75f7ad88f8f665c2c75ce79b9208ccfb10e5642f
[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 <Bnd_Box.hxx>
30 #include <BRepBndLib.hxx>
31
32 IMPLEMENT_STANDARD_HANDLE (MeshTest_DrawableMesh, Draw_Drawable3D)
33 IMPLEMENT_STANDARD_RTTIEXT(MeshTest_DrawableMesh, Draw_Drawable3D)
34
35 //=======================================================================
36 //function : MeshTest_DrawableMesh
37 //purpose  : 
38 //=======================================================================
39
40 MeshTest_DrawableMesh::MeshTest_DrawableMesh() :
41 myDeflection(1.), myinshape(Standard_False)
42 {
43 }
44
45 //=======================================================================
46 //function : MeshTest_DrawableMesh
47 //purpose  : 
48 //=======================================================================
49
50 MeshTest_DrawableMesh::MeshTest_DrawableMesh(const TopoDS_Shape&    S,
51                                              const Standard_Real    Deflect,
52                                              const Standard_Boolean Partage,
53                                              const Standard_Boolean inshape) :
54 myDeflection(Deflect), myinshape(inshape)
55 {
56   Bnd_Box B;
57   BRepBndLib::Add(S, B);
58
59   myMesh = new BRepMesh_FastDiscret(S, Deflect, 0.5, B, Partage, inshape);
60 }
61
62
63 //=======================================================================
64 //function : MeshTest_DrawableMesh
65 //purpose  : 
66 //=======================================================================
67
68 MeshTest_DrawableMesh::MeshTest_DrawableMesh(const Handle(BRepMesh_FastDiscret)& Tr):
69 myDeflection(1.0)
70 {
71   myMesh = Tr;
72 }
73
74
75 //=======================================================================
76 //function : MeshTest_DrawableMesh
77 //purpose  : 
78 //=======================================================================
79
80 void MeshTest_DrawableMesh::Add(const TopoDS_Shape& S)
81 {
82   Bnd_Box B;
83   BRepBndLib::Add(S, B);
84
85   if (myMesh.IsNull())
86     myMesh=new BRepMesh_FastDiscret(S, myDeflection, 0.5, B, myinshape);
87   else
88     myMesh->Perform(S);
89 }
90
91 //=======================================================================
92 //function : AddInShape
93 //purpose  : 
94 //=======================================================================
95
96 void MeshTest_DrawableMesh::AddInShape(const Standard_Boolean inshape) 
97 {
98   myinshape = inshape;
99 }
100
101 //=======================================================================
102 //function : DrawOn
103 //purpose  : 
104 //=======================================================================
105
106 void MeshTest_DrawableMesh::DrawOn(Draw_Display& /*D*/) const 
107 {
108   // should be reimplemented!!
109   /*  Handle(BRepMesh_DataStructureOfDelaun) struc = myMesh->Result();
110   Standard_Integer nbc;
111   D.SetColor(Draw_vert);
112
113   for (Standard_Integer iLi=1; iLi<=myMesh->NbEdges(); iLi++) {
114   const BRepMesh_Edge& ed=myMesh->Edge(iLi);
115   if (ed.Movability()!=BRepMesh_Deleted) {
116   nbc=struc->ElemConnectedTo(iLi).Extent();
117   if (nbc<=0) D.SetColor(Draw_bleu);
118   else if (nbc==1) D.SetColor(Draw_jaune);
119   else if (nbc==2) D.SetColor(Draw_vert);
120   else D.SetColor(Draw_corail);
121   D.MoveTo(myMesh->Pnt(ed.FirstNode()));
122   D.DrawTo(myMesh->Pnt(ed.LastNode()));
123   }
124   }
125
126
127   // highlighted triangles
128   D.SetColor(Draw_blanc);
129   Standard_Integer e1, e2, e3, i;
130   Standard_Boolean o1, o2, o3;
131
132   for (i = 1; i <= myTriangles.Length(); i++) {
133   const BRepMesh_Triangle& tri=struc->GetElement(myTriangles(i));
134   tri.Edges(e1, e2, e3, o1, o2, o3); 
135   const BRepMesh_Edge& ed1=myMesh->Edge(e1);
136   if (ed1.Movability()!=BRepMesh_Deleted) {
137   D.MoveTo(myMesh->Pnt(ed1.FirstNode()));
138   D.DrawTo(myMesh->Pnt(ed1.LastNode()));
139   }
140   const BRepMesh_Edge& ed2=myMesh->Edge(e2);
141   if (ed2.Movability()!=BRepMesh_Deleted) {
142   D.MoveTo(myMesh->Pnt(ed2.FirstNode()));
143   D.DrawTo(myMesh->Pnt(ed2.LastNode()));
144   }
145   const BRepMesh_Edge& ed3=myMesh->Edge(e3);
146   if (ed3.Movability()!=BRepMesh_Deleted) {
147   D.MoveTo(myMesh->Pnt(ed3.FirstNode()));
148   D.DrawTo(myMesh->Pnt(ed3.LastNode()));
149   }
150   }
151
152   // highlighted edges
153   D.SetColor(Draw_rouge);
154   for (i = 1; i <= myEdges.Length(); i++) {
155   const BRepMesh_Edge& ed=myMesh->Edge(myEdges(i));
156   if (ed.Movability()!=BRepMesh_Deleted) {
157   D.MoveTo(myMesh->Pnt(ed.FirstNode()));
158   D.DrawTo(myMesh->Pnt(ed.LastNode()));
159   }
160   }
161
162   // highlighted vertices
163   for (i = 1; i <= myVertices.Length(); i++) {
164   D.DrawMarker(myMesh->Pnt(myVertices(i)),Draw_Losange);
165   }
166
167   */
168
169 }
170
171 //=======================================================================
172 //function : Copy
173 //purpose  : 
174 //=======================================================================
175
176 Handle(Draw_Drawable3D) MeshTest_DrawableMesh::Copy() const 
177 {
178   Handle(MeshTest_DrawableMesh) D = new MeshTest_DrawableMesh();
179   return  D;
180 }
181
182 //=======================================================================
183 //function : Dump
184 //purpose  : 
185 //=======================================================================
186
187 void MeshTest_DrawableMesh::Dump(Standard_OStream&) const 
188 {
189   // Should be reimplemented
190
191   /*Handle(BRepMesh_DataStructureOfDelaun) struc=myMesh->Result();
192   Standard_Integer e1, e2, e3;
193   Standard_Boolean o1, o2, o3;
194   Standard_Integer in, il, ie;
195   Standard_Integer nbn=struc->NbNodes();
196   Standard_Integer nbl=struc->NbLinks();
197   Standard_Integer nbe=struc->NbElements();
198
199   for (in=1; in<=nbn; in++) {
200   BRepMesh_Vertex nod=struc->GetNode(in);
201   S<<"(node "<<in<<" (uv "<<nod.Coord().X()<<" "
202   <<nod.Coord().Y()<<") (3d "
203   <<nod.Location3d()<<") ";
204   printdegree(nod.Movability());
205   S<<" (edgeconex";
206   BRepMesh_ListOfInteger::Iterator tati(struc->LinkNeighboursOf(in));
207   for (; tati.More(); tati.Next()) S<<" "<<tati.Value();
208   S << "))\n";
209   }
210   S <<endl;
211   for (il=1; il<=nbl; il++) {
212   BRepMesh_Edge edg=struc->GetLink(il);
213   S << "(edge "<<il<<" ("<<edg.FirstNode()<<" "<<edg.LastNode()
214   <<" ";
215   printdegree(edg.Movability());
216   S<<") (triconex";
217   const BRepMesh_PairOfIndex& pair = struc->ElemConnectedTo(il);
218   for (Standard_Integer j = 1, jn = pair.Extent(); j <= jn; j++)
219   S<<" "<<pair.Index(j);
220   S << "))\n";
221   }
222   S <<endl;
223   for (ie=1; ie<=nbe; ie++) {
224   BRepMesh_Triangle tri=struc->GetElement(ie);
225   tri.Edges(e1, e2, e3, o1, o2, o3); 
226   if (!o1) e1=-e1;
227   if (!o2) e2=-e2;
228   if (!o3) e3=-e3;
229   S<<" (maille "<<ie<<" (links "<<e1<<" "
230   <<e2<<" "<<e3<<")";
231   printdegree(tri.Movability());
232   S<<")\n";
233   }
234   S << endl;
235   */
236 }
237
238 //=======================================================================
239 //function : Whatis
240 //purpose  : 
241 //=======================================================================
242
243 void MeshTest_DrawableMesh::Whatis(Draw_Interpretor& S) const 
244 {
245   S << " 3d mesh\n";
246   S << "    - Triangles : " << myMesh->NbTriangles() << "\n";
247   S << "    - Edges     : " << myMesh->NbEdges()     << "\n";
248   S << "    - Vertices  : " << myMesh->NbVertices()  << "\n";
249   S << "    - Point3d   : " << myMesh->NbPoint3d()   << "\n";
250 }
251
252 //=======================================================================
253 //function : Mesh
254 //purpose  : 
255 //=======================================================================
256
257 Handle(BRepMesh_FastDiscret) MeshTest_DrawableMesh::Mesh() const 
258 {
259   return myMesh;
260 }
261
262
263 //=======================================================================
264 //function : Edges
265 //purpose  : 
266 //=======================================================================
267
268 TColStd_SequenceOfInteger& MeshTest_DrawableMesh::Edges()
269 {
270   return myEdges;
271 }
272
273
274 //=======================================================================
275 //function : Vertices
276 //purpose  : 
277 //=======================================================================
278
279 TColStd_SequenceOfInteger& MeshTest_DrawableMesh::Vertices()
280 {
281   return myVertices;
282 }
283
284 //=======================================================================
285 //function : Triangles
286 //purpose  : 
287 //=======================================================================
288
289 TColStd_SequenceOfInteger& MeshTest_DrawableMesh::Triangles()
290 {
291   return myTriangles;
292 }
293