0031687: Draw Harness, ViewerTest - extend command vrenderparams with option updating...
[occt.git] / src / XSDRAWSTLVRML / XSDRAWSTLVRML_DataSource.cxx
CommitLineData
b311480e 1// Created on: 2004-06-10
2// Created by: Alexander SOLOVYOV
973c2be1 3// Copyright (c) 2004-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 7// This library is free software; you can redistribute it and/or modify it under
8// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
4178b353 16#include <XSDRAWSTLVRML_DataSource.hxx>
7fd59977 17
4178b353 18#include <Precision.hxx>
42cf5bc1 19#include <Standard_Type.hxx>
7fd59977 20#include <TColgp_SequenceOfXYZ.hxx>
7fd59977 21#include <TColStd_DataMapOfIntegerInteger.hxx>
42cf5bc1 22#include <TColStd_DataMapOfIntegerReal.hxx>
7fd59977 23
92efcf78 24IMPLEMENT_STANDARD_RTTIEXT(XSDRAWSTLVRML_DataSource,MeshVS_DataSource)
25
7fd59977 26//================================================================
27// Function : Constructor
28// Purpose :
29//================================================================
4178b353 30XSDRAWSTLVRML_DataSource::XSDRAWSTLVRML_DataSource (const Handle(Poly_Triangulation)& aMesh)
7fd59977 31{
32 myMesh = aMesh;
33
34 if( !myMesh.IsNull() )
35 {
4178b353 36 const TColgp_Array1OfPnt& aCoords = myMesh->Nodes();
7fd59977 37 Standard_Integer len = aCoords.Length(), i, j;
38 myNodeCoords = new TColStd_HArray2OfReal(1, len, 1, 3);
04232180 39 std::cout << "Nodes : " << len << std::endl;
7fd59977 40
41 gp_XYZ xyz;
42
43 for( i = 1; i <= len; i++ )
44 {
45 myNodes.Add( i );
4178b353 46 xyz = aCoords(i).XYZ();
7fd59977 47
48 myNodeCoords->SetValue(i, 1, xyz.X());
49 myNodeCoords->SetValue(i, 2, xyz.Y());
50 myNodeCoords->SetValue(i, 3, xyz.Z());
51 }
52
4178b353 53 const Poly_Array1OfTriangle& aSeq = myMesh->Triangles();
7fd59977 54 len = aSeq.Length();
55 myElemNormals = new TColStd_HArray2OfReal(1, len, 1, 3);
56 myElemNodes = new TColStd_HArray2OfInteger(1, len, 1, 3);
57
04232180 58 std::cout << "Elements : " << len << std::endl;
7fd59977 59
60 for( i = 1; i <= len; i++ )
61 {
62 myElements.Add( i );
7fd59977 63
4178b353 64 const Poly_Triangle& aTri = aSeq(i);
65
66 Standard_Integer V[3];
67 aTri.Get (V[0], V[1], V[2]);
68
69 const gp_Pnt aP1 = aCoords (V[0]);
70 const gp_Pnt aP2 = aCoords (V[1]);
71 const gp_Pnt aP3 = aCoords (V[2]);
72
73 gp_Vec aV1(aP1, aP2);
74 gp_Vec aV2(aP2, aP3);
75
76 gp_Vec aN = aV1.Crossed(aV2);
77 if (aN.SquareMagnitude() > Precision::SquareConfusion())
78 aN.Normalize();
79 else
80 aN.SetCoord(0.0, 0.0, 0.0);
7fd59977 81
82 for( j = 0; j < 3; j++ )
83 {
84 myElemNodes->SetValue(i, j+1, V[j]);
85 }
86
4178b353 87 myElemNormals->SetValue (i, 1, aN.X());
88 myElemNormals->SetValue (i, 2, aN.Y());
89 myElemNormals->SetValue (i, 3, aN.Z());
7fd59977 90 }
91 }
04232180 92 std::cout << "Construction is finished" << std::endl;
7fd59977 93}
94
95//================================================================
96// Function : GetGeom
97// Purpose :
98//================================================================
99Standard_Boolean XSDRAWSTLVRML_DataSource::GetGeom
100( const Standard_Integer ID, const Standard_Boolean IsElement,
101 TColStd_Array1OfReal& Coords, Standard_Integer& NbNodes,
102 MeshVS_EntityType& Type ) const
103{
104 if( myMesh.IsNull() )
105 return Standard_False;
106
107 if( IsElement )
108 {
109 if( ID>=1 && ID<=myElements.Extent() )
110 {
111 Type = MeshVS_ET_Face;
112 NbNodes = 3;
113
114 for( Standard_Integer i = 1, k = 1; i <= 3; i++ )
115 {
116 Standard_Integer IdxNode = myElemNodes->Value(ID, i);
117 for(Standard_Integer j = 1; j <= 3; j++, k++ )
118 Coords(k) = myNodeCoords->Value(IdxNode, j);
119 }
120
121 return Standard_True;
122 }
123 else
124 return Standard_False;
125 }
126 else
127 if( ID>=1 && ID<=myNodes.Extent() )
128 {
129 Type = MeshVS_ET_Node;
130 NbNodes = 1;
131
132 Coords( 1 ) = myNodeCoords->Value(ID, 1);
133 Coords( 2 ) = myNodeCoords->Value(ID, 2);
134 Coords( 3 ) = myNodeCoords->Value(ID, 3);
135 return Standard_True;
136 }
137 else
138 return Standard_False;
139}
140
141//================================================================
142// Function : GetGeomType
143// Purpose :
144//================================================================
145Standard_Boolean XSDRAWSTLVRML_DataSource::GetGeomType
146( const Standard_Integer,
147 const Standard_Boolean IsElement,
148 MeshVS_EntityType& Type ) const
149{
150 if( IsElement )
151 {
152 Type = MeshVS_ET_Face;
153 return Standard_True;
154 }
155 else
156 {
157 Type = MeshVS_ET_Node;
158 return Standard_True;
159 }
160}
161
162//================================================================
163// Function : GetAddr
164// Purpose :
165//================================================================
166Standard_Address XSDRAWSTLVRML_DataSource::GetAddr
167( const Standard_Integer, const Standard_Boolean ) const
168{
169 return NULL;
170}
171
172//================================================================
173// Function : GetNodesByElement
174// Purpose :
175//================================================================
176Standard_Boolean XSDRAWSTLVRML_DataSource::GetNodesByElement
177( const Standard_Integer ID,
178 TColStd_Array1OfInteger& theNodeIDs,
35e08fe8 179 Standard_Integer& /*theNbNodes*/ ) const
7fd59977 180{
181 if( myMesh.IsNull() )
182 return Standard_False;
183
184 if( ID>=1 && ID<=myElements.Extent() && theNodeIDs.Length() >= 3 )
185 {
186 Standard_Integer aLow = theNodeIDs.Lower();
187 theNodeIDs (aLow) = myElemNodes->Value(ID, 1 );
188 theNodeIDs (aLow + 1) = myElemNodes->Value(ID, 2 );
189 theNodeIDs (aLow + 2) = myElemNodes->Value(ID, 3 );
190 return Standard_True;
191 }
192 return Standard_False;
193}
194
195//================================================================
196// Function : GetAllNodes
197// Purpose :
198//================================================================
199const TColStd_PackedMapOfInteger& XSDRAWSTLVRML_DataSource::GetAllNodes() const
200{
201 return myNodes;
202}
203
204//================================================================
205// Function : GetAllElements
206// Purpose :
207//================================================================
208const TColStd_PackedMapOfInteger& XSDRAWSTLVRML_DataSource::GetAllElements() const
209{
210 return myElements;
211}
212
213//================================================================
214// Function : GetNormal
215// Purpose :
216//================================================================
217Standard_Boolean XSDRAWSTLVRML_DataSource::GetNormal
218( const Standard_Integer Id, const Standard_Integer Max,
219 Standard_Real& nx, Standard_Real& ny,Standard_Real& nz ) const
220{
221 if( myMesh.IsNull() )
222 return Standard_False;
223
224 if( Id>=1 && Id<=myElements.Extent() && Max>=3 )
225 {
226 nx = myElemNormals->Value(Id, 1);
227 ny = myElemNormals->Value(Id, 2);
228 nz = myElemNormals->Value(Id, 3);
229 return Standard_True;
230 }
231 else
232 return Standard_False;
233}
234