1 // Copyright (C) 2007-2012 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 //=============================================================================
372 * CheckSelfIntersections
374 //=============================================================================
375 CORBA::Boolean GEOM_IMeasureOperations_i::CheckSelfIntersections (GEOM::GEOM_Object_ptr theShape,
376 GEOM::ListOfLong_out theIntersections)
378 // Set a not done flag
379 GetOperations()->SetNotDone();
383 // Allocate the CORBA arrays
384 GEOM::ListOfLong_var anIntegersArray = new GEOM::ListOfLong();
386 // Get the reference shape
387 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
389 if (!aShape.IsNull()) {
390 Handle(TColStd_HSequenceOfInteger) anIntegers = new TColStd_HSequenceOfInteger;
392 // Detect self-intersections
393 isGood = GetOperations()->CheckSelfIntersections(aShape, anIntegers);
395 int nbInts = anIntegers->Length();
397 anIntegersArray->length(nbInts);
399 for (int ii = 0; ii < nbInts; ii++) {
400 anIntegersArray[ii] = anIntegers->Value(ii + 1);
404 // Initialize out-parameters with local arrays
405 theIntersections = anIntegersArray._retn();
409 //=============================================================================
413 //=============================================================================
414 char* GEOM_IMeasureOperations_i::IsGoodForSolid (GEOM::GEOM_Object_ptr theShape)
416 //Set a not done flag
417 GetOperations()->SetNotDone();
419 //Get the reference shape
420 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
421 if (aShape.IsNull()) return CORBA::string_dup("WRN_NULL_OBJECT_OR_SHAPE");
423 // Get shape parameters
424 TCollection_AsciiString aDescription = GetOperations()->IsGoodForSolid(aShape);
425 return CORBA::string_dup(aDescription.ToCString());
428 //=============================================================================
432 //=============================================================================
433 char* GEOM_IMeasureOperations_i::WhatIs (GEOM::GEOM_Object_ptr theShape)
435 //Set a not done flag
436 GetOperations()->SetNotDone();
438 //Get the reference shape
439 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
440 if (aShape.IsNull()) return NULL;
442 // Get shape parameters
443 TCollection_AsciiString aDescription = GetOperations()->WhatIs(aShape);
444 return CORBA::string_dup(aDescription.ToCString());
447 //=============================================================================
451 //=============================================================================
452 GEOM::ListOfBool* GEOM_IMeasureOperations_i::AreCoordsInside (GEOM::GEOM_Object_ptr theShape,
453 const GEOM::ListOfDouble& theCoords,
454 CORBA::Double tolerance)
456 //Set a not done flag
457 GetOperations()->SetNotDone();
459 unsigned int nb_points = theCoords.length()/3;
461 GEOM::ListOfBool_var aResults = new GEOM::ListOfBool;
462 aResults->length(nb_points);
464 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
466 std::vector<double> tmp(3*nb_points);
467 for (int i = 0; i < 3*nb_points; i++)
468 tmp[i] = theCoords[i];
469 std::vector<bool> res = GetOperations()->AreCoordsInside(aShape, tmp, tolerance);
470 for (int i = 0; i < nb_points; i++)
471 aResults[i] = i < res.size() ? res[i] : false;
472 return aResults._retn();
475 //=============================================================================
479 //=============================================================================
480 CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance
481 (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2,
482 CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1,
483 CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2)
485 //Set a not done flag
486 GetOperations()->SetNotDone();
488 //Get the reference shape
489 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
490 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
491 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
493 // Get shape parameters
494 return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
497 //=============================================================================
501 //=============================================================================
502 void GEOM_IMeasureOperations_i::PointCoordinates (GEOM::GEOM_Object_ptr theShape,
503 CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z)
506 //Set a not done flag
507 GetOperations()->SetNotDone();
509 //Get the reference shape
510 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
514 // Get shape parameters
515 GetOperations()->PointCoordinates( aShape, X, Y, Z );
518 //=============================================================================
522 //=============================================================================
523 CORBA::Double GEOM_IMeasureOperations_i::GetAngle (GEOM::GEOM_Object_ptr theShape1,
524 GEOM::GEOM_Object_ptr theShape2)
526 //Set a not done flag
527 GetOperations()->SetNotDone();
529 //Get the reference shapes
530 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
531 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
532 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
535 return GetOperations()->GetAngle(aShape1, aShape2);
538 //=============================================================================
542 //=============================================================================
543 CORBA::Double GEOM_IMeasureOperations_i::GetAngleBtwVectors (GEOM::GEOM_Object_ptr theShape1,
544 GEOM::GEOM_Object_ptr theShape2)
546 //Set a not done flag
547 GetOperations()->SetNotDone();
549 //Get the reference shapes
550 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
551 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
552 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
555 return GetOperations()->GetAngleBtwVectors(aShape1, aShape2);
559 //=============================================================================
561 * CurveCurvatureByParam
563 //=============================================================================
564 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByParam
565 (GEOM::GEOM_Object_ptr theCurve, CORBA::Double theParam)
567 //Set a not done flag
568 GetOperations()->SetNotDone();
570 //Get the reference shape
571 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
572 if(aShape.IsNull()) return -1.0;
574 return GetOperations()->CurveCurvatureByParam(aShape,theParam);
577 //=============================================================================
579 * CurveCurvatureByPoint
581 //=============================================================================
582 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByPoint
583 (GEOM::GEOM_Object_ptr theCurve, GEOM::GEOM_Object_ptr thePoint)
585 //Set a not done flag
586 GetOperations()->SetNotDone();
588 //Get the reference shape
589 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
590 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
591 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
593 return GetOperations()->CurveCurvatureByPoint(aShape,aPoint);
597 //=============================================================================
599 * MaxSurfaceCurvatureByParam
601 //=============================================================================
602 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByParam
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()->MaxSurfaceCurvatureByParam(aShape,theUParam,theVParam);
617 //=============================================================================
619 * MaxSurfaceCurvatureByPoint
621 //=============================================================================
622 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByPoint
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()->MaxSurfaceCurvatureByPoint(aShape,aPoint);
636 //=============================================================================
638 * MinSurfaceCurvatureByParam
640 //=============================================================================
641 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByParam
642 (GEOM::GEOM_Object_ptr theSurf,
643 CORBA::Double theUParam,
644 CORBA::Double theVParam)
646 //Set a not done flag
647 GetOperations()->SetNotDone();
649 //Get the reference shape
650 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
651 if (aShape.IsNull()) return -1.0;
653 return GetOperations()->MinSurfaceCurvatureByParam(aShape,theUParam,theVParam);
656 //=============================================================================
658 * MinSurfaceCurvatureByPoint
660 //=============================================================================
661 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByPoint
662 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
664 //Set a not done flag
665 GetOperations()->SetNotDone();
667 //Get the reference shape
668 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
669 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
670 if (aShape.IsNull() || aPoint.IsNull()) return -1.0;
672 return GetOperations()->MinSurfaceCurvatureByPoint(aShape,aPoint);