1 // Copyright (C) 2007-2011 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::IsGoodForSolid (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 CORBA::string_dup("WRN_NULL_OBJECT_OR_SHAPE");
384 // Get shape parameters
385 TCollection_AsciiString aDescription = GetOperations()->IsGoodForSolid(aShape);
386 return CORBA::string_dup(aDescription.ToCString());
389 //=============================================================================
393 //=============================================================================
394 char* GEOM_IMeasureOperations_i::WhatIs (GEOM::GEOM_Object_ptr theShape)
396 //Set a not done flag
397 GetOperations()->SetNotDone();
399 //Get the reference shape
400 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
401 if (aShape.IsNull()) return NULL;
403 // Get shape parameters
404 TCollection_AsciiString aDescription = GetOperations()->WhatIs(aShape);
405 return CORBA::string_dup(aDescription.ToCString());
408 //=============================================================================
412 //=============================================================================
413 GEOM::ListOfBool* GEOM_IMeasureOperations_i::AreCoordsInside (GEOM::GEOM_Object_ptr theShape,
414 const GEOM::ListOfDouble& theCoords,
415 CORBA::Double tolerance)
417 //Set a not done flag
418 GetOperations()->SetNotDone();
420 unsigned int nb_points = theCoords.length()/3;
422 GEOM::ListOfBool_var aResults = new GEOM::ListOfBool;
423 aResults->length(nb_points);
425 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
427 std::vector<double> tmp(3*nb_points);
428 for (int i = 0; i < 3*nb_points; i++)
429 tmp[i] = theCoords[i];
430 std::vector<bool> res = GetOperations()->AreCoordsInside(aShape, tmp, tolerance);
431 for (int i = 0; i < nb_points; i++)
432 aResults[i] = i < res.size() ? res[i] : false;
433 return aResults._retn();
436 //=============================================================================
440 //=============================================================================
441 CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance
442 (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2,
443 CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1,
444 CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2)
446 //Set a not done flag
447 GetOperations()->SetNotDone();
449 //Get the reference shape
450 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
451 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
452 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
454 // Get shape parameters
455 return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
458 //=============================================================================
462 //=============================================================================
463 void GEOM_IMeasureOperations_i::PointCoordinates (GEOM::GEOM_Object_ptr theShape,
464 CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z)
467 //Set a not done flag
468 GetOperations()->SetNotDone();
470 //Get the reference shape
471 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
475 // Get shape parameters
476 GetOperations()->PointCoordinates( aShape, X, Y, Z );
479 //=============================================================================
483 //=============================================================================
484 CORBA::Double GEOM_IMeasureOperations_i::GetAngle (GEOM::GEOM_Object_ptr theShape1,
485 GEOM::GEOM_Object_ptr theShape2)
487 //Set a not done flag
488 GetOperations()->SetNotDone();
490 //Get the reference shapes
491 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
492 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
493 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
496 return GetOperations()->GetAngle(aShape1, aShape2);
499 //=============================================================================
503 //=============================================================================
504 CORBA::Double GEOM_IMeasureOperations_i::GetAngleBtwVectors (GEOM::GEOM_Object_ptr theShape1,
505 GEOM::GEOM_Object_ptr theShape2)
507 //Set a not done flag
508 GetOperations()->SetNotDone();
510 //Get the reference shapes
511 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
512 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
513 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
516 return GetOperations()->GetAngleBtwVectors(aShape1, aShape2);
520 //=============================================================================
522 * CurveCurvatureByParam
524 //=============================================================================
525 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByParam
526 (GEOM::GEOM_Object_ptr theCurve, CORBA::Double theParam)
528 //Set a not done flag
529 GetOperations()->SetNotDone();
531 //Get the reference shape
532 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
533 if(aShape.IsNull()) return -1.0;
535 return GetOperations()->CurveCurvatureByParam(aShape,theParam);
538 //=============================================================================
540 * CurveCurvatureByPoint
542 //=============================================================================
543 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByPoint
544 (GEOM::GEOM_Object_ptr theCurve, GEOM::GEOM_Object_ptr thePoint)
546 //Set a not done flag
547 GetOperations()->SetNotDone();
549 //Get the reference shape
550 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
551 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
552 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
554 return GetOperations()->CurveCurvatureByPoint(aShape,aPoint);
558 //=============================================================================
560 * MaxSurfaceCurvatureByParam
562 //=============================================================================
563 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByParam
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()->MaxSurfaceCurvatureByParam(aShape,theUParam,theVParam);
578 //=============================================================================
580 * MaxSurfaceCurvatureByPoint
582 //=============================================================================
583 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByPoint
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()->MaxSurfaceCurvatureByPoint(aShape,aPoint);
597 //=============================================================================
599 * MinSurfaceCurvatureByParam
601 //=============================================================================
602 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByParam
603 (GEOM::GEOM_Object_ptr theSurf,
604 CORBA::Double theUParam,
605 CORBA::Double theVParam)
607 //Set a not done flag
608 GetOperations()->SetNotDone();
610 //Get the reference shape
611 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
612 if (aShape.IsNull()) return -1.0;
614 return GetOperations()->MinSurfaceCurvatureByParam(aShape,theUParam,theVParam);
617 //=============================================================================
619 * MinSurfaceCurvatureByPoint
621 //=============================================================================
622 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByPoint
623 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
625 //Set a not done flag
626 GetOperations()->SetNotDone();
628 //Get the reference shape
629 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
630 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
631 if (aShape.IsNull() || aPoint.IsNull()) return -1.0;
633 return GetOperations()->MinSurfaceCurvatureByPoint(aShape,aPoint);