1 // Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include <Standard_Stream.hxx>
25 #include "GEOM_IMeasureOperations_i.hh"
27 #include "utilities.h"
30 #include "GEOM_Engine.hxx"
31 #include "GEOM_Object.hxx"
33 //=============================================================================
37 //=============================================================================
38 GEOM_IMeasureOperations_i::GEOM_IMeasureOperations_i (PortableServer::POA_ptr thePOA,
39 GEOM::GEOM_Gen_ptr theEngine,
40 ::GEOMImpl_IMeasureOperations* theImpl)
41 :GEOM_IOperations_i(thePOA, theEngine, theImpl)
43 MESSAGE("GEOM_IMeasureOperations_i::GEOM_IMeasureOperations_i");
46 //=============================================================================
50 //=============================================================================
51 GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i()
53 MESSAGE("GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i");
56 //=============================================================================
60 //=============================================================================
61 GEOM::GEOM_IKindOfShape::shape_kind GEOM_IMeasureOperations_i::KindOfShape
62 (GEOM::GEOM_Object_ptr theShape,
63 GEOM::ListOfLong_out theIntegers,
64 GEOM::ListOfDouble_out theDoubles)
66 GEOMImpl_IMeasureOperations::ShapeKind aKind = GEOMImpl_IMeasureOperations::SK_NO_SHAPE;
68 // allocate the CORBA arrays
69 GEOM::ListOfLong_var anIntegersArray = new GEOM::ListOfLong();
70 GEOM::ListOfDouble_var aDoublesArray = new GEOM::ListOfDouble();
72 //Get the reference shape
73 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
75 if (!aShape.IsNull()) {
76 Handle(TColStd_HSequenceOfInteger) anIntegers = new TColStd_HSequenceOfInteger;
77 Handle(TColStd_HSequenceOfReal) aDoubles = new TColStd_HSequenceOfReal;
79 // Detect kind of shape and parameters
80 aKind = GetOperations()->KindOfShape(aShape, anIntegers, aDoubles);
82 int nbInts = anIntegers->Length();
83 int nbDbls = aDoubles->Length();
85 anIntegersArray->length(nbInts);
86 aDoublesArray->length(nbDbls);
88 for (int ii = 0; ii < nbInts; ii++) {
89 anIntegersArray[ii] = anIntegers->Value(ii + 1);
91 for (int id = 0; id < nbDbls; id++) {
92 aDoublesArray[id] = aDoubles->Value(id + 1);
96 // initialize out-parameters with local arrays
97 theIntegers = anIntegersArray._retn();
98 theDoubles = aDoublesArray._retn();
99 return (GEOM::GEOM_IKindOfShape::shape_kind)aKind;
102 //=============================================================================
106 //=============================================================================
107 void GEOM_IMeasureOperations_i::GetPosition
108 (GEOM::GEOM_Object_ptr theShape,
109 CORBA::Double& Ox, CORBA::Double& Oy, CORBA::Double& Oz,
110 CORBA::Double& Zx, CORBA::Double& Zy, CORBA::Double& Zz,
111 CORBA::Double& Xx, CORBA::Double& Xy, CORBA::Double& Xz)
113 //Set a not done flag
114 GetOperations()->SetNotDone();
116 //Set default values: global CS
117 Ox = Oy = Oz = Zx = Zy = Xy = Xz = 0.;
120 //Get the reference shape
121 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
122 if (aShape.IsNull()) return;
124 // Get shape parameters
125 GetOperations()->GetPosition(aShape, Ox,Oy,Oz, Zx,Zy,Zz, Xx,Xy,Xz);
128 //=============================================================================
132 //=============================================================================
133 GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetCentreOfMass
134 (GEOM::GEOM_Object_ptr theShape)
136 GEOM::GEOM_Object_var aGEOMObject;
138 //Set a not done flag
139 GetOperations()->SetNotDone();
141 //Get the reference shape
142 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
143 if (aShape.IsNull()) return aGEOMObject._retn();
145 // Make Point - centre of mass of theShape
146 Handle(GEOM_Object) anObject = GetOperations()->GetCentreOfMass(aShape);
147 if (!GetOperations()->IsDone() || anObject.IsNull())
148 return aGEOMObject._retn();
150 return GetObject(anObject);
153 //=============================================================================
157 //=============================================================================
158 GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetVertexByIndex
159 (GEOM::GEOM_Object_ptr theShape, CORBA::Long theIndex)
161 GEOM::GEOM_Object_var aGEOMObject;
163 //Set a not done flag
164 GetOperations()->SetNotDone();
166 //Get the reference shape
167 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
168 if ( aShape.IsNull() ) return aGEOMObject._retn();
170 // Get vertex by index
171 Handle(GEOM_Object) anObject = GetOperations()->GetVertexByIndex(aShape, theIndex);
172 if (!GetOperations()->IsDone() || anObject.IsNull())
173 return aGEOMObject._retn();
175 return GetObject(anObject);
178 //=============================================================================
182 //=============================================================================
183 GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetNormal
184 (GEOM::GEOM_Object_ptr theFace,
185 GEOM::GEOM_Object_ptr theOptionalPoint)
187 GEOM::GEOM_Object_var aGEOMObject;
189 //Set a not done flag
190 GetOperations()->SetNotDone();
192 //Get the reference shape
193 Handle(GEOM_Object) aFace = GetObjectImpl(theFace);
194 if (aFace.IsNull()) return aGEOMObject._retn();
196 // Get the OptionalPoint (can be not defined)
197 Handle(GEOM_Object) anOptionalPoint = GetObjectImpl(theOptionalPoint);
199 // Make Vector - normal to theFace (in point theOptionalPoint if the face is not planar)
200 Handle(GEOM_Object) anObject = GetOperations()->GetNormal(aFace, anOptionalPoint);
201 if (!GetOperations()->IsDone() || anObject.IsNull())
202 return aGEOMObject._retn();
204 return GetObject(anObject);
207 //=============================================================================
211 //=============================================================================
212 void GEOM_IMeasureOperations_i::GetBasicProperties (GEOM::GEOM_Object_ptr theShape,
213 CORBA::Double& theLength,
214 CORBA::Double& theSurfArea,
215 CORBA::Double& theVolume)
217 //Set a not done flag
218 GetOperations()->SetNotDone();
220 //Get the reference shape
221 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
222 if (aShape.IsNull()) return;
224 // Get shape parameters
225 GetOperations()->GetBasicProperties(aShape, theLength, theSurfArea, theVolume);
228 //=============================================================================
232 //=============================================================================
233 void GEOM_IMeasureOperations_i::GetInertia
234 (GEOM::GEOM_Object_ptr theShape,
235 CORBA::Double& I11, CORBA::Double& I12, CORBA::Double& I13,
236 CORBA::Double& I21, CORBA::Double& I22, CORBA::Double& I23,
237 CORBA::Double& I31, CORBA::Double& I32, CORBA::Double& I33,
238 CORBA::Double& Ix , CORBA::Double& Iy , CORBA::Double& Iz)
240 //Set a not done flag
241 GetOperations()->SetNotDone();
243 //Get the reference shape
244 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
245 if (aShape.IsNull()) return;
247 // Get shape parameters
248 GetOperations()->GetInertia(aShape,
255 //=============================================================================
259 //=============================================================================
260 void GEOM_IMeasureOperations_i::GetBoundingBox (GEOM::GEOM_Object_ptr theShape,
261 CORBA::Double& Xmin, CORBA::Double& Xmax,
262 CORBA::Double& Ymin, CORBA::Double& Ymax,
263 CORBA::Double& Zmin, CORBA::Double& Zmax)
265 //Set a not done flag
266 GetOperations()->SetNotDone();
268 //Get the reference shape
269 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
270 if (aShape.IsNull()) return;
272 // Get shape parameters
273 GetOperations()->GetBoundingBox(aShape, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
276 //=============================================================================
280 //=============================================================================
281 void GEOM_IMeasureOperations_i::GetTolerance
282 (GEOM::GEOM_Object_ptr theShape,
283 CORBA::Double& FaceMin, CORBA::Double& FaceMax,
284 CORBA::Double& EdgeMin, CORBA::Double& EdgeMax,
285 CORBA::Double& VertMin, CORBA::Double& VertMax)
287 //Set a not done flag
288 GetOperations()->SetNotDone();
290 //Get the reference shape
291 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
292 if (aShape.IsNull()) return;
294 // Get shape parameters
295 GetOperations()->GetTolerance(aShape,
301 //=============================================================================
305 //=============================================================================
306 CORBA::Boolean GEOM_IMeasureOperations_i::CheckShape (GEOM::GEOM_Object_ptr theShape,
307 CORBA::String_out theDescription)
309 //Set a not done flag
310 GetOperations()->SetNotDone();
312 if (CORBA::is_nil(theShape))
314 theDescription = CORBA::string_dup("null");
318 //Get the reference shape
319 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
323 theDescription = CORBA::string_dup("null2");
327 // Get shape parameters
328 TCollection_AsciiString aDump;
329 if (GetOperations()->CheckShape(aShape, /*check_geom = */false, aDump))
331 theDescription = CORBA::string_dup("OK");
334 theDescription = CORBA::string_dup(aDump.ToCString());
338 CORBA::Boolean GEOM_IMeasureOperations_i::CheckShapeWithGeometry (GEOM::GEOM_Object_ptr theShape,
339 CORBA::String_out theDescription)
341 //Set a not done flag
342 GetOperations()->SetNotDone();
344 if (CORBA::is_nil(theShape))
346 theDescription = CORBA::string_dup("null");
350 //Get the reference shape
351 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
355 theDescription = CORBA::string_dup("null2");
359 // Get shape parameters
360 TCollection_AsciiString aDump;
361 if (GetOperations()->CheckShape(aShape, /*check_geom = */true, aDump))
363 theDescription = CORBA::string_dup("OK");
366 theDescription = CORBA::string_dup(aDump.ToCString());
370 //=============================================================================
374 //=============================================================================
375 char* GEOM_IMeasureOperations_i::WhatIs (GEOM::GEOM_Object_ptr theShape)
377 //Set a not done flag
378 GetOperations()->SetNotDone();
380 //Get the reference shape
381 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
382 if (aShape.IsNull()) return NULL;
384 // Get shape parameters
385 TCollection_AsciiString aDescription = GetOperations()->WhatIs(aShape);
386 return CORBA::string_dup(aDescription.ToCString());
389 //=============================================================================
393 //=============================================================================
394 GEOM::ListOfBool* GEOM_IMeasureOperations_i::AreCoordsInside (GEOM::GEOM_Object_ptr theShape,
395 const GEOM::ListOfDouble& theCoords,
396 CORBA::Double tolerance)
398 //Set a not done flag
399 GetOperations()->SetNotDone();
401 unsigned int nb_points = theCoords.length()/3;
403 GEOM::ListOfBool_var aResults = new GEOM::ListOfBool;
404 aResults->length(nb_points);
406 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
408 std::vector<double> tmp(3*nb_points);
409 for (int i = 0; i < 3*nb_points; i++)
410 tmp[i] = theCoords[i];
411 std::vector<bool> res = GetOperations()->AreCoordsInside(aShape, tmp, tolerance);
412 for (int i = 0; i < nb_points; i++)
413 aResults[i] = i < res.size() ? res[i] : false;
414 return aResults._retn();
417 //=============================================================================
421 //=============================================================================
422 CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance
423 (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2,
424 CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1,
425 CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2)
427 //Set a not done flag
428 GetOperations()->SetNotDone();
430 //Get the reference shape
431 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
432 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
433 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
435 // Get shape parameters
436 return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
439 //=============================================================================
443 //=============================================================================
444 void GEOM_IMeasureOperations_i::PointCoordinates (GEOM::GEOM_Object_ptr theShape,
445 CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z)
448 //Set a not done flag
449 GetOperations()->SetNotDone();
451 //Get the reference shape
452 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
456 // Get shape parameters
457 GetOperations()->PointCoordinates( aShape, X, Y, Z );
460 //=============================================================================
464 //=============================================================================
465 CORBA::Double GEOM_IMeasureOperations_i::GetAngle (GEOM::GEOM_Object_ptr theShape1,
466 GEOM::GEOM_Object_ptr theShape2)
468 //Set a not done flag
469 GetOperations()->SetNotDone();
471 //Get the reference shapes
472 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
473 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
474 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
477 return GetOperations()->GetAngle(aShape1, aShape2);
481 //=============================================================================
483 * CurveCurvatureByParam
485 //=============================================================================
486 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByParam
487 (GEOM::GEOM_Object_ptr theCurve, CORBA::Double theParam)
489 //Set a not done flag
490 GetOperations()->SetNotDone();
492 //Get the reference shape
493 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
494 if(aShape.IsNull()) return -1.0;
496 return GetOperations()->CurveCurvatureByParam(aShape,theParam);
499 //=============================================================================
501 * CurveCurvatureByPoint
503 //=============================================================================
504 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByPoint
505 (GEOM::GEOM_Object_ptr theCurve, GEOM::GEOM_Object_ptr thePoint)
507 //Set a not done flag
508 GetOperations()->SetNotDone();
510 //Get the reference shape
511 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
512 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
513 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
515 return GetOperations()->CurveCurvatureByPoint(aShape,aPoint);
519 //=============================================================================
521 * MaxSurfaceCurvatureByParam
523 //=============================================================================
524 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByParam
525 (GEOM::GEOM_Object_ptr theSurf,
526 CORBA::Double theUParam,
527 CORBA::Double theVParam)
529 //Set a not done flag
530 GetOperations()->SetNotDone();
532 //Get the reference shape
533 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
534 if(aShape.IsNull()) return -1.0;
536 return GetOperations()->MaxSurfaceCurvatureByParam(aShape,theUParam,theVParam);
539 //=============================================================================
541 * MaxSurfaceCurvatureByPoint
543 //=============================================================================
544 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByPoint
545 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
547 //Set a not done flag
548 GetOperations()->SetNotDone();
550 //Get the reference shape
551 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
552 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
553 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
555 return GetOperations()->MaxSurfaceCurvatureByPoint(aShape,aPoint);
558 //=============================================================================
560 * MinSurfaceCurvatureByParam
562 //=============================================================================
563 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByParam
564 (GEOM::GEOM_Object_ptr theSurf,
565 CORBA::Double theUParam,
566 CORBA::Double theVParam)
568 //Set a not done flag
569 GetOperations()->SetNotDone();
571 //Get the reference shape
572 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
573 if (aShape.IsNull()) return -1.0;
575 return GetOperations()->MinSurfaceCurvatureByParam(aShape,theUParam,theVParam);
578 //=============================================================================
580 * MinSurfaceCurvatureByPoint
582 //=============================================================================
583 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByPoint
584 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
586 //Set a not done flag
587 GetOperations()->SetNotDone();
589 //Get the reference shape
590 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
591 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
592 if (aShape.IsNull() || aPoint.IsNull()) return -1.0;
594 return GetOperations()->MinSurfaceCurvatureByPoint(aShape,aPoint);