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 CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance
395 (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2,
396 CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1,
397 CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2)
399 //Set a not done flag
400 GetOperations()->SetNotDone();
402 //Get the reference shape
403 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
404 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
405 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
407 // Get shape parameters
408 return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2);
411 //=============================================================================
415 //=============================================================================
416 void GEOM_IMeasureOperations_i::PointCoordinates (GEOM::GEOM_Object_ptr theShape,
417 CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z)
420 //Set a not done flag
421 GetOperations()->SetNotDone();
423 //Get the reference shape
424 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
428 // Get shape parameters
429 GetOperations()->PointCoordinates( aShape, X, Y, Z );
432 //=============================================================================
436 //=============================================================================
437 CORBA::Double GEOM_IMeasureOperations_i::GetAngle (GEOM::GEOM_Object_ptr theShape1,
438 GEOM::GEOM_Object_ptr theShape2)
440 //Set a not done flag
441 GetOperations()->SetNotDone();
443 //Get the reference shapes
444 Handle(GEOM_Object) aShape1 = GetObjectImpl(theShape1);
445 Handle(GEOM_Object) aShape2 = GetObjectImpl(theShape2);
446 if (aShape1.IsNull() || aShape2.IsNull()) return -1.0;
449 return GetOperations()->GetAngle(aShape1, aShape2);
453 //=============================================================================
455 * CurveCurvatureByParam
457 //=============================================================================
458 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByParam
459 (GEOM::GEOM_Object_ptr theCurve, CORBA::Double theParam)
461 //Set a not done flag
462 GetOperations()->SetNotDone();
464 //Get the reference shape
465 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
466 if(aShape.IsNull()) return -1.0;
468 return GetOperations()->CurveCurvatureByParam(aShape,theParam);
471 //=============================================================================
473 * CurveCurvatureByPoint
475 //=============================================================================
476 CORBA::Double GEOM_IMeasureOperations_i::CurveCurvatureByPoint
477 (GEOM::GEOM_Object_ptr theCurve, GEOM::GEOM_Object_ptr thePoint)
479 //Set a not done flag
480 GetOperations()->SetNotDone();
482 //Get the reference shape
483 Handle(GEOM_Object) aShape = GetObjectImpl(theCurve);
484 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
485 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
487 return GetOperations()->CurveCurvatureByPoint(aShape,aPoint);
491 //=============================================================================
493 * MaxSurfaceCurvatureByParam
495 //=============================================================================
496 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByParam
497 (GEOM::GEOM_Object_ptr theSurf,
498 CORBA::Double theUParam,
499 CORBA::Double theVParam)
501 //Set a not done flag
502 GetOperations()->SetNotDone();
504 //Get the reference shape
505 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
506 if(aShape.IsNull()) return -1.0;
508 return GetOperations()->MaxSurfaceCurvatureByParam(aShape,theUParam,theVParam);
511 //=============================================================================
513 * MaxSurfaceCurvatureByPoint
515 //=============================================================================
516 CORBA::Double GEOM_IMeasureOperations_i::MaxSurfaceCurvatureByPoint
517 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
519 //Set a not done flag
520 GetOperations()->SetNotDone();
522 //Get the reference shape
523 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
524 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
525 if( aShape.IsNull() || aPoint.IsNull() ) return -1.0;
527 return GetOperations()->MaxSurfaceCurvatureByPoint(aShape,aPoint);
530 //=============================================================================
532 * MinSurfaceCurvatureByParam
534 //=============================================================================
535 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByParam
536 (GEOM::GEOM_Object_ptr theSurf,
537 CORBA::Double theUParam,
538 CORBA::Double theVParam)
540 //Set a not done flag
541 GetOperations()->SetNotDone();
543 //Get the reference shape
544 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
545 if (aShape.IsNull()) return -1.0;
547 return GetOperations()->MinSurfaceCurvatureByParam(aShape,theUParam,theVParam);
550 //=============================================================================
552 * MinSurfaceCurvatureByPoint
554 //=============================================================================
555 CORBA::Double GEOM_IMeasureOperations_i::MinSurfaceCurvatureByPoint
556 (GEOM::GEOM_Object_ptr theSurf, GEOM::GEOM_Object_ptr thePoint)
558 //Set a not done flag
559 GetOperations()->SetNotDone();
561 //Get the reference shape
562 Handle(GEOM_Object) aShape = GetObjectImpl(theSurf);
563 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
564 if (aShape.IsNull() || aPoint.IsNull()) return -1.0;
566 return GetOperations()->MinSurfaceCurvatureByPoint(aShape,aPoint);