1 // Copyright (C) 2007-2008 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
22 #include <Standard_Stream.hxx>
24 #include "GEOM_IMeasureOperations_i.hh"
26 #include "utilities.h"
29 #include "GEOM_Engine.hxx"
30 #include "GEOM_Object.hxx"
32 //=============================================================================
36 //=============================================================================
37 GEOM_IMeasureOperations_i::GEOM_IMeasureOperations_i (PortableServer::POA_ptr thePOA,
38 GEOM::GEOM_Gen_ptr theEngine,
39 ::GEOMImpl_IMeasureOperations* theImpl)
40 :GEOM_IOperations_i(thePOA, theEngine, theImpl)
42 MESSAGE("GEOM_IMeasureOperations_i::GEOM_IMeasureOperations_i");
45 //=============================================================================
49 //=============================================================================
50 GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i()
52 MESSAGE("GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i");
55 //=============================================================================
59 //=============================================================================
60 GEOM::GEOM_IKindOfShape::shape_kind GEOM_IMeasureOperations_i::KindOfShape
61 (GEOM::GEOM_Object_ptr theShape,
62 GEOM::ListOfLong_out theIntegers,
63 GEOM::ListOfDouble_out theDoubles)
65 GEOMImpl_IMeasureOperations::ShapeKind aKind = GEOMImpl_IMeasureOperations::SK_NO_SHAPE;
67 // allocate the CORBA arrays
68 GEOM::ListOfLong_var anIntegersArray = new GEOM::ListOfLong();
69 GEOM::ListOfDouble_var aDoublesArray = new GEOM::ListOfDouble();
71 //Get the reference shape
72 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
74 if (!aShape.IsNull()) {
75 Handle(TColStd_HSequenceOfInteger) anIntegers = new TColStd_HSequenceOfInteger;
76 Handle(TColStd_HSequenceOfReal) aDoubles = new TColStd_HSequenceOfReal;
78 // Detect kind of shape and parameters
79 aKind = GetOperations()->KindOfShape(aShape, anIntegers, aDoubles);
81 int nbInts = anIntegers->Length();
82 int nbDbls = aDoubles->Length();
84 anIntegersArray->length(nbInts);
85 aDoublesArray->length(nbDbls);
87 for (int ii = 0; ii < nbInts; ii++) {
88 anIntegersArray[ii] = anIntegers->Value(ii + 1);
90 for (int id = 0; id < nbDbls; id++) {
91 aDoublesArray[id] = aDoubles->Value(id + 1);
95 // initialize out-parameters with local arrays
96 theIntegers = anIntegersArray._retn();
97 theDoubles = aDoublesArray._retn();
98 return (GEOM::GEOM_IKindOfShape::shape_kind)aKind;
101 //=============================================================================
105 //=============================================================================
106 void GEOM_IMeasureOperations_i::GetPosition
107 (GEOM::GEOM_Object_ptr theShape,
108 CORBA::Double& Ox, CORBA::Double& Oy, CORBA::Double& Oz,
109 CORBA::Double& Zx, CORBA::Double& Zy, CORBA::Double& Zz,
110 CORBA::Double& Xx, CORBA::Double& Xy, CORBA::Double& Xz)
112 //Set a not done flag
113 GetOperations()->SetNotDone();
115 //Set default values: global CS
116 Ox = Oy = Oz = Zx = Zy = Xy = Xz = 0.;
119 //Get the reference shape
120 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
121 if (aShape.IsNull()) return;
123 // Get shape parameters
124 GetOperations()->GetPosition(aShape, Ox,Oy,Oz, Zx,Zy,Zz, Xx,Xy,Xz);
127 //=============================================================================
131 //=============================================================================
132 GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetCentreOfMass
133 (GEOM::GEOM_Object_ptr theShape)
135 GEOM::GEOM_Object_var aGEOMObject;
137 //Set a not done flag
138 GetOperations()->SetNotDone();
140 //Get the reference shape
141 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
142 if (aShape.IsNull()) return aGEOMObject._retn();
144 // Make Point - centre of mass of theShape
145 Handle(GEOM_Object) anObject = GetOperations()->GetCentreOfMass(aShape);
146 if (!GetOperations()->IsDone() || anObject.IsNull())
147 return aGEOMObject._retn();
149 return GetObject(anObject);
152 //=============================================================================
156 //=============================================================================
157 GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetVertexByIndex
158 (GEOM::GEOM_Object_ptr theShape, CORBA::Long theIndex)
160 GEOM::GEOM_Object_var aGEOMObject;
162 //Set a not done flag
163 GetOperations()->SetNotDone();
165 //Get the reference shape
166 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
167 if ( aShape.IsNull() ) return aGEOMObject._retn();
169 // Get vertex by index
170 Handle(GEOM_Object) anObject = GetOperations()->GetVertexByIndex(aShape, theIndex);
171 if (!GetOperations()->IsDone() || anObject.IsNull())
172 return aGEOMObject._retn();
174 return GetObject(anObject);
177 //=============================================================================
181 //=============================================================================
182 GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetNormal
183 (GEOM::GEOM_Object_ptr theFace,
184 GEOM::GEOM_Object_ptr theOptionalPoint)
186 GEOM::GEOM_Object_var aGEOMObject;
188 //Set a not done flag
189 GetOperations()->SetNotDone();
191 //Get the reference shape
192 Handle(GEOM_Object) aFace = GetObjectImpl(theFace);
193 if (aFace.IsNull()) return aGEOMObject._retn();
195 // Get the OptionalPoint (can be not defined)
196 Handle(GEOM_Object) anOptionalPoint = GetObjectImpl(theOptionalPoint);
198 // Make Vector - normal to theFace (in point theOptionalPoint if the face is not planar)
199 Handle(GEOM_Object) anObject = GetOperations()->GetNormal(aFace, anOptionalPoint);
200 if (!GetOperations()->IsDone() || anObject.IsNull())
201 return aGEOMObject._retn();
203 return GetObject(anObject);
206 //=============================================================================
210 //=============================================================================
211 void GEOM_IMeasureOperations_i::GetBasicProperties (GEOM::GEOM_Object_ptr theShape,
212 CORBA::Double& theLength,
213 CORBA::Double& theSurfArea,
214 CORBA::Double& theVolume)
216 //Set a not done flag
217 GetOperations()->SetNotDone();
219 //Get the reference shape
220 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
221 if (aShape.IsNull()) return;
223 // Get shape parameters
224 GetOperations()->GetBasicProperties(aShape, theLength, theSurfArea, theVolume);
227 //=============================================================================
231 //=============================================================================
232 void GEOM_IMeasureOperations_i::GetInertia
233 (GEOM::GEOM_Object_ptr theShape,
234 CORBA::Double& I11, CORBA::Double& I12, CORBA::Double& I13,
235 CORBA::Double& I21, CORBA::Double& I22, CORBA::Double& I23,
236 CORBA::Double& I31, CORBA::Double& I32, CORBA::Double& I33,
237 CORBA::Double& Ix , CORBA::Double& Iy , CORBA::Double& Iz)
239 //Set a not done flag
240 GetOperations()->SetNotDone();
242 //Get the reference shape
243 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
244 if (aShape.IsNull()) return;
246 // Get shape parameters
247 GetOperations()->GetInertia(aShape,
254 //=============================================================================
258 //=============================================================================
259 void GEOM_IMeasureOperations_i::GetBoundingBox (GEOM::GEOM_Object_ptr theShape,
260 CORBA::Double& Xmin, CORBA::Double& Xmax,
261 CORBA::Double& Ymin, CORBA::Double& Ymax,
262 CORBA::Double& Zmin, CORBA::Double& Zmax)
264 //Set a not done flag
265 GetOperations()->SetNotDone();
267 //Get the reference shape
268 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
269 if (aShape.IsNull()) return;
271 // Get shape parameters
272 GetOperations()->GetBoundingBox(aShape, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax);
275 //=============================================================================
279 //=============================================================================
280 void GEOM_IMeasureOperations_i::GetTolerance
281 (GEOM::GEOM_Object_ptr theShape,
282 CORBA::Double& FaceMin, CORBA::Double& FaceMax,
283 CORBA::Double& EdgeMin, CORBA::Double& EdgeMax,
284 CORBA::Double& VertMin, CORBA::Double& VertMax)
286 //Set a not done flag
287 GetOperations()->SetNotDone();
289 //Get the reference shape
290 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
291 if (aShape.IsNull()) return;
293 // Get shape parameters
294 GetOperations()->GetTolerance(aShape,
300 //=============================================================================
304 //=============================================================================
305 CORBA::Boolean GEOM_IMeasureOperations_i::CheckShape (GEOM::GEOM_Object_ptr theShape,
306 CORBA::String_out theDescription)
308 //Set a not done flag
309 GetOperations()->SetNotDone();
311 if (CORBA::is_nil(theShape))
313 theDescription = CORBA::string_dup("null");
317 //Get the reference shape
318 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
322 theDescription = CORBA::string_dup("null2");
326 // Get shape parameters
327 TCollection_AsciiString aDump;
328 if (GetOperations()->CheckShape(aShape, /*check_geom = */false, aDump))
330 theDescription = CORBA::string_dup("OK");
333 theDescription = CORBA::string_dup(aDump.ToCString());
337 CORBA::Boolean GEOM_IMeasureOperations_i::CheckShapeWithGeometry (GEOM::GEOM_Object_ptr theShape,
338 CORBA::String_out theDescription)
340 //Set a not done flag
341 GetOperations()->SetNotDone();
343 if (CORBA::is_nil(theShape))
345 theDescription = CORBA::string_dup("null");
349 //Get the reference shape
350 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
354 theDescription = CORBA::string_dup("null2");
358 // Get shape parameters
359 TCollection_AsciiString aDump;
360 if (GetOperations()->CheckShape(aShape, /*check_geom = */true, aDump))
362 theDescription = CORBA::string_dup("OK");
365 theDescription = CORBA::string_dup(aDump.ToCString());
369 //=============================================================================
373 //=============================================================================
374 char* GEOM_IMeasureOperations_i::WhatIs (GEOM::GEOM_Object_ptr theShape)
376 //Set a not done flag
377 GetOperations()->SetNotDone();
379 //Get the reference shape
380 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
381 if (aShape.IsNull()) return NULL;
383 // Get shape parameters
384 TCollection_AsciiString aDescription = GetOperations()->WhatIs(aShape);
385 return CORBA::string_dup(aDescription.ToCString());
388 //=============================================================================
392 //=============================================================================
393 CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance
394 (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2,
395 CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1,
396 CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2)
398 //Set a not done flag
399 GetOperations()->SetNotDone();
401 //Get the reference shape
402 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
403 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
404 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
406 // Get shape parameters
407 return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
410 //=============================================================================
414 //=============================================================================
415 void GEOM_IMeasureOperations_i::PointCoordinates (GEOM::GEOM_Object_ptr theShape,
416 CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z)
419 //Set a not done flag
420 GetOperations()->SetNotDone();
422 //Get the reference shape
423 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
427 // Get shape parameters
428 GetOperations()->PointCoordinates( aShape, X, Y, Z );
431 //=============================================================================
435 //=============================================================================
436 CORBA::Double GEOM_IMeasureOperations_i::GetAngle (GEOM::GEOM_Object_ptr theShape1,
437 GEOM::GEOM_Object_ptr theShape2)
439 //Set a not done flag
440 GetOperations()->SetNotDone();
442 //Get the reference shapes
443 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
444 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
445 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
448 return GetOperations()->GetAngle(aShape1, aShape2);
452 //=============================================================================
454 * CurveCurvatureByParam
456 //=============================================================================
457 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByParam
458 (GEOM::GEOM_Object_ptr theCurve, CORBA::Double theParam)
460 //Set a not done flag
461 GetOperations()->SetNotDone();
463 //Get the reference shape
464 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
465 if(aShape.IsNull()) return -1.0;
467 return GetOperations()->CurveCurvatureByParam(aShape,theParam);
470 //=============================================================================
472 * CurveCurvatureByPoint
474 //=============================================================================
475 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByPoint
476 (GEOM::GEOM_Object_ptr theCurve, GEOM::GEOM_Object_ptr thePoint)
478 //Set a not done flag
479 GetOperations()->SetNotDone();
481 //Get the reference shape
482 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
483 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
484 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
486 return GetOperations()->CurveCurvatureByPoint(aShape,aPoint);
490 //=============================================================================
492 * MaxSurfaceCurvatureByParam
494 //=============================================================================
495 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByParam
496 (GEOM::GEOM_Object_ptr theSurf,
497 CORBA::Double theUParam,
498 CORBA::Double theVParam)
500 //Set a not done flag
501 GetOperations()->SetNotDone();
503 //Get the reference shape
504 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
505 if(aShape.IsNull()) return -1.0;
507 return GetOperations()->MaxSurfaceCurvatureByParam(aShape,theUParam,theVParam);
510 //=============================================================================
512 * MaxSurfaceCurvatureByPoint
514 //=============================================================================
515 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByPoint
516 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
518 //Set a not done flag
519 GetOperations()->SetNotDone();
521 //Get the reference shape
522 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
523 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
524 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
526 return GetOperations()->MaxSurfaceCurvatureByPoint(aShape,aPoint);
529 //=============================================================================
531 * MinSurfaceCurvatureByParam
533 //=============================================================================
534 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByParam
535 (GEOM::GEOM_Object_ptr theSurf,
536 CORBA::Double theUParam,
537 CORBA::Double theVParam)
539 //Set a not done flag
540 GetOperations()->SetNotDone();
542 //Get the reference shape
543 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
544 if (aShape.IsNull()) return -1.0;
546 return GetOperations()->MinSurfaceCurvatureByParam(aShape,theUParam,theVParam);
549 //=============================================================================
551 * MinSurfaceCurvatureByPoint
553 //=============================================================================
554 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByPoint
555 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
557 //Set a not done flag
558 GetOperations()->SetNotDone();
560 //Get the reference shape
561 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
562 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
563 if (aShape.IsNull() || aPoint.IsNull()) return -1.0;
565 return GetOperations()->MinSurfaceCurvatureByPoint(aShape,aPoint);