0031642: Visualization - crash in Graphic3d_Structure::SetVisual() on redisplaying...
[occt.git] / src / GeometryTest / GeometryTest_PolyCommands.cxx
CommitLineData
b311480e 1// Created on: 1995-03-06
2// Created by: Laurent PAINNOT
3// Copyright (c) 1995-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
42cf5bc1 17
18#include <Draw_Appli.hxx>
19#include <DrawTrSurf.hxx>
20#include <DrawTrSurf_Polygon2D.hxx>
21#include <DrawTrSurf_Polygon3D.hxx>
22#include <DrawTrSurf_Triangulation.hxx>
23#include <GeometryTest.hxx>
5fe14d0f 24#include <Poly.hxx>
7fd59977 25#include <Poly_Array1OfTriangle.hxx>
42cf5bc1 26#include <Poly_Polygon2D.hxx>
27#include <Poly_Polygon3D.hxx>
7fd59977 28#include <Poly_Triangle.hxx>
42cf5bc1 29#include <Poly_Triangulation.hxx>
7fd59977 30#include <TColgp_Array1OfPnt.hxx>
31#include <TColgp_Array1OfPnt2d.hxx>
7fd59977 32
57c28b61 33#ifdef _WIN32
7fd59977 34Standard_IMPORT Draw_Viewer dout;
35#endif
36//=======================================================================
37//function : polytr
38//purpose :
39//=======================================================================
40
41static Standard_Integer polytr(Draw_Interpretor& di, Standard_Integer n, const char** a)
42{
43 if (n < 4)
44 return 1;
45
91322f44 46 Standard_Integer nbNodes = Draw::Atoi(a[2]);
47 Standard_Integer nbTri = Draw::Atoi(a[3]);
7fd59977 48
49 // read the nodes
50 Standard_Integer i, j = 4;
51 TColgp_Array1OfPnt Nodes(1, nbNodes);
52
53 for (i = 1; i <= nbNodes; i++) {
54 if (j + 2 >= n) {
55 di << "Not enough nodes";
56 return 1;
57 }
91322f44 58 Nodes(i).SetCoord(Draw::Atof(a[j]),Draw::Atof(a[j+1]),Draw::Atof(a[j+2]));
7fd59977 59 j += 3;
60 }
61
62 // read the triangles
63
64 Poly_Array1OfTriangle Triangles(1, nbTri);
65 for (i = 1; i <= nbTri; i++) {
66 if (j + 2 >= n) {
67 di << "Not enough triangles";
68 return 1;
69 }
91322f44 70 Triangles(i).Set(Draw::Atoi(a[j]),Draw::Atoi(a[j+1]),Draw::Atoi(a[j+2]));
7fd59977 71 j += 3;
72 }
73
74 Handle(Poly_Triangulation) T = new Poly_Triangulation(Nodes,Triangles);
75
76 DrawTrSurf::Set(a[1],T);
77
78 return 0;//wnt
79}
80
81
82//=======================================================================
83//function : polygon3d
84//purpose :
85//=======================================================================
86
87static Standard_Integer polygon3d(Draw_Interpretor& di, Standard_Integer n, const char** a)
88{
89 if (n < 4)
90 return 1;
91
91322f44 92 Standard_Integer nbNodes = Draw::Atoi(a[2]);
7fd59977 93
94 // read the nodes
95 Standard_Integer i, j = 3;
96 TColgp_Array1OfPnt Nodes(1, nbNodes);
97
98 for (i = 1; i <= nbNodes; i++) {
99 if (j + 2 >= n) {
100 di << "Not enough nodes";
101 return 1;
102 }
91322f44 103 Nodes(i).SetCoord(Draw::Atof(a[j]),Draw::Atof(a[j+1]),Draw::Atof(a[j+2]));
7fd59977 104 j += 3;
105 }
106
107 Handle(Poly_Polygon3D) P3d = new Poly_Polygon3D(Nodes);
108
109 DrawTrSurf::Set(a[1], P3d);
110
111 return 0;
112}
113
114//=======================================================================
115//function : polygon2d
116//purpose :
117//=======================================================================
118
119static Standard_Integer polygon2d(Draw_Interpretor& di, Standard_Integer n, const char** a)
120{
121 if (n < 4)
122 return 1;
123
91322f44 124 Standard_Integer nbNodes = Draw::Atoi(a[2]);
7fd59977 125
126 // read the nodes
127 Standard_Integer i, j = 3;
128 TColgp_Array1OfPnt2d Nodes(1, nbNodes);
129
130 for (i = 1; i <= nbNodes; i++) {
131 if (j + 1 >= n) {
132 di << "Not enough nodes";
133 return 1;
134 }
91322f44 135 Nodes(i).SetCoord(Draw::Atof(a[j]),Draw::Atof(a[j+1]));
7fd59977 136 j += 2;
137 }
138
139 Handle(Poly_Polygon2D) P2d = new Poly_Polygon2D(Nodes);
140
141 DrawTrSurf::Set(a[1], P2d);
142
143 return 0;
144}
145
146
147//=======================================================================
148//function : shnodes
149//purpose :
150//=======================================================================
151
152static Standard_Integer shnodes(Draw_Interpretor& , Standard_Integer n, const char** a)
153{
154 if (n != 2) return 1;
155 Handle(DrawTrSurf_Triangulation) T
156 = Handle(DrawTrSurf_Triangulation)::DownCast(Draw::Get(a[1]));
157
158 if (!T.IsNull()) {
159 Standard_Boolean SHOWNODES = T->ShowNodes();
160 T->ShowNodes(!SHOWNODES);
161 }
162
163
164
165 dout.RepaintAll();
166
167 return 0;//wnt
168}
169
170//=======================================================================
171//function : shtriangles
172//purpose :
173//=======================================================================
174
175static Standard_Integer shtriangles(Draw_Interpretor& , Standard_Integer n, const char** a)
176{
177 if (n != 2) return 1;
178
179 Handle(DrawTrSurf_Triangulation) T
180 = Handle(DrawTrSurf_Triangulation)::DownCast(Draw::Get(a[1]));
181 Standard_Boolean SHOWTRIANGLES = T->ShowTriangles();
182 T->ShowTriangles(!SHOWTRIANGLES);
183 dout.RepaintAll();
184 return 0;//wnt
185}
186
187//=======================================================================
5fe14d0f 188//function : AddNode
189//purpose :
190//=======================================================================
191template <typename Poly, typename Point, typename PointArr>
192static inline void AddNode(const Handle(Poly)& thePolygon,
193 const Point& thePnt,
194 PointArr& theNodes)
195{
196 for (Standard_Integer i = thePolygon->Nodes().Lower();
197 i <= thePolygon->Nodes().Upper(); i++)
198 {
199 theNodes[i] = thePolygon->Nodes()[i];
200 }
201
202 theNodes.ChangeLast() = thePnt;
203}
204
205//=======================================================================
206//function : AddNode
207//purpose :
208//=======================================================================
209static Standard_Integer AddNode(Draw_Interpretor& theDI,
210 Standard_Integer theNArg,
211 const char** theArgVal)
212{
213 if (theNArg < 4)
214 {
215 theDI << "Not enough arguments\n";
216 return 1;
217 }
218
219 if (theNArg == 4)
220 {
221 Handle(Poly_Polygon2D) aPoly2d = DrawTrSurf::GetPolygon2D(theArgVal[1]);
222 TColgp_Array1OfPnt2d aNodes(aPoly2d->Nodes().Lower(),
223 aPoly2d->Nodes().Upper() + 1);
224 AddNode(aPoly2d, gp_Pnt2d(Draw::Atof(theArgVal[2]),
225 Draw::Atof(theArgVal[3])), aNodes);
226 aPoly2d.Nullify();
227 aPoly2d = new Poly_Polygon2D(aNodes);
228 DrawTrSurf::Set(theArgVal[1], aPoly2d);
229 }
230 else
231 {
232 Handle(Poly_Polygon3D) aPoly3d = DrawTrSurf::GetPolygon3D(theArgVal[1]);
233 TColgp_Array1OfPnt aNodes(aPoly3d->Nodes().Lower(),
234 aPoly3d->Nodes().Upper() + 1);
235 AddNode(aPoly3d, gp_Pnt(Draw::Atof(theArgVal[2]),
236 Draw::Atof(theArgVal[3]),
237 Draw::Atof(theArgVal[4])), aNodes);
238 aPoly3d.Nullify();
239 aPoly3d = new Poly_Polygon3D(aNodes);
240 DrawTrSurf::Set(theArgVal[1], aPoly3d);
241 }
242
243 return 0;
244}
245
246//=======================================================================
247//function : PolygonProps
248//purpose :
249//=======================================================================
250static Standard_Integer PolygonProps(Draw_Interpretor& theDI,
251 Standard_Integer theNArg,
252 const char** theArgVal)
253{
254 if (theNArg < 2)
255 {
256 theDI << "Use: polygonprops polygon2d [-area val] [-perimeter val]\n";
257 return 1;
258 }
259
260 Handle(Poly_Polygon2D) aPoly2d = DrawTrSurf::GetPolygon2D(theArgVal[1]);
261
262 Standard_Real anArea = 0.0, aPerimeter = 0.0;
263 Poly::PolygonProperties(aPoly2d->Nodes(), anArea, aPerimeter);
264
265 theDI << "Area = " << anArea << "\n";
266 theDI << "Perimeter = " << aPerimeter << "\n";
267
268 for (Standard_Integer i = 2; i < theNArg; i++)
269 {
270 if (!strcmp(theArgVal[i], "-area"))
271 {
272 Draw::Set(theArgVal[++i], anArea);
273 continue;
274 }
275
276 if (!strcmp(theArgVal[i], "-perimeter"))
277 {
278 Draw::Set(theArgVal[++i], aPerimeter);
279 continue;
280 }
281
282 theDI << "Error: Wrong option: \"" << theArgVal[i] << "\"\n";
283 break;
284 }
285
286 return 0;
287}
288
289//=======================================================================
7fd59977 290//function : PolyCommands
291//purpose :
292//=======================================================================
293
294void GeometryTest::PolyCommands(Draw_Interpretor& theCommands)
295{
296
297 const char* g = "Poly Commands";
298
299 theCommands.Add("polytr","polytr name nbnodes nbtri x1 y1 z1 ... n1 n2 n3 ...",__FILE__,polytr,g);
300 theCommands.Add("polygon3d","polygon3d name nbnodes x1 y1 z1 ...",__FILE__,polygon3d,g);
301 theCommands.Add("polygon2d","polygon2d name nbnodes x1 y1 ...",__FILE__,polygon2d,g);
5fe14d0f 302 theCommands.Add("addpolygonnode","addpolygonnode polygon3d(2d) x y [z]",__FILE__, AddNode,g);
303 theCommands.Add("polygonprops","Computes area and perimeter of 2D-polygon. "
304 "Run \"polygonprops\" w/o any arguments to read help.\n",
305 __FILE__, PolygonProps,g);
7fd59977 306 theCommands.Add("shnodes","shnodes name", __FILE__,shnodes, g);
307 theCommands.Add("shtriangles","shtriangles name", __FILE__,shtriangles, g);
308}