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_IBlocksOperations_i.hh"
27 #include "utilities.h"
29 #include "Utils_ExceptHandlers.hxx"
31 #include "GEOM_Engine.hxx"
32 #include "GEOM_Object.hxx"
34 #include <TColStd_HSequenceOfTransient.hxx>
35 #include <TColStd_HArray1OfInteger.hxx>
37 //=============================================================================
41 //=============================================================================
42 GEOM_IBlocksOperations_i::GEOM_IBlocksOperations_i (PortableServer::POA_ptr thePOA,
43 GEOM::GEOM_Gen_ptr theEngine,
44 ::GEOMImpl_IBlocksOperations* theImpl)
45 :GEOM_IOperations_i(thePOA, theEngine, theImpl)
47 MESSAGE("GEOM_IBlocksOperations_i::GEOM_IBlocksOperations_i");
50 //=============================================================================
54 //=============================================================================
55 GEOM_IBlocksOperations_i::~GEOM_IBlocksOperations_i()
57 MESSAGE("GEOM_IBlocksOperations_i::~GEOM_IBlocksOperations_i");
61 //=============================================================================
65 //=============================================================================
66 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeQuad
67 (GEOM::GEOM_Object_ptr theEdge1, GEOM::GEOM_Object_ptr theEdge2,
68 GEOM::GEOM_Object_ptr theEdge3, GEOM::GEOM_Object_ptr theEdge4)
70 GEOM::GEOM_Object_var aGEOMObject;
73 GetOperations()->SetNotDone();
75 //Get the reference edges
76 Handle(GEOM_Object) anEdge1 = GetObjectImpl(theEdge1);
77 Handle(GEOM_Object) anEdge2 = GetObjectImpl(theEdge2);
78 Handle(GEOM_Object) anEdge3 = GetObjectImpl(theEdge3);
79 Handle(GEOM_Object) anEdge4 = GetObjectImpl(theEdge4);
81 if (anEdge1.IsNull() || anEdge2.IsNull() ||
82 anEdge3.IsNull() || anEdge4.IsNull()) return aGEOMObject._retn();
85 Handle(GEOM_Object) anObject =
86 GetOperations()->MakeQuad(anEdge1, anEdge2, anEdge3, anEdge4);
87 if (!GetOperations()->IsDone() || anObject.IsNull())
88 return aGEOMObject._retn();
90 return GetObject(anObject);
93 //=============================================================================
97 //=============================================================================
98 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeQuad2Edges
99 (GEOM::GEOM_Object_ptr theEdge1, GEOM::GEOM_Object_ptr theEdge2)
101 GEOM::GEOM_Object_var aGEOMObject;
103 //Set a not done flag
104 GetOperations()->SetNotDone();
106 //Get the reference edges
107 Handle(GEOM_Object) anEdge1 = GetObjectImpl(theEdge1);
108 Handle(GEOM_Object) anEdge2 = GetObjectImpl(theEdge2);
110 if (anEdge1.IsNull() || anEdge2.IsNull()) return aGEOMObject._retn();
113 Handle(GEOM_Object) anObject =
114 GetOperations()->MakeQuad2Edges(anEdge1, anEdge2);
115 if (!GetOperations()->IsDone() || anObject.IsNull())
116 return aGEOMObject._retn();
118 return GetObject(anObject);
121 //=============================================================================
125 //=============================================================================
126 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeQuad4Vertices
127 (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2,
128 GEOM::GEOM_Object_ptr thePnt3, GEOM::GEOM_Object_ptr thePnt4)
130 GEOM::GEOM_Object_var aGEOMObject;
132 //Set a not done flag
133 GetOperations()->SetNotDone();
135 //Get the reference points
136 Handle(GEOM_Object) aPnt1 = GetObjectImpl(thePnt1);
137 Handle(GEOM_Object) aPnt2 = GetObjectImpl(thePnt2);
138 Handle(GEOM_Object) aPnt3 = GetObjectImpl(thePnt3);
139 Handle(GEOM_Object) aPnt4 = GetObjectImpl(thePnt4);
141 if (aPnt1.IsNull() || aPnt2.IsNull() ||
142 aPnt3.IsNull() || aPnt4.IsNull()) return aGEOMObject._retn();
145 Handle(GEOM_Object) anObject =
146 GetOperations()->MakeQuad4Vertices(aPnt1, aPnt2, aPnt3, aPnt4);
147 if (!GetOperations()->IsDone() || anObject.IsNull())
148 return aGEOMObject._retn();
150 return GetObject(anObject);
153 //=============================================================================
157 //=============================================================================
158 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeHexa
159 (GEOM::GEOM_Object_ptr theFace1, GEOM::GEOM_Object_ptr theFace2,
160 GEOM::GEOM_Object_ptr theFace3, GEOM::GEOM_Object_ptr theFace4,
161 GEOM::GEOM_Object_ptr theFace5, GEOM::GEOM_Object_ptr theFace6)
163 GEOM::GEOM_Object_var aGEOMObject;
165 //Set a not done flag
166 GetOperations()->SetNotDone();
168 //Get the reference Faces
169 Handle(GEOM_Object) anFace1 = GetObjectImpl(theFace1);
170 Handle(GEOM_Object) anFace2 = GetObjectImpl(theFace2);
171 Handle(GEOM_Object) anFace3 = GetObjectImpl(theFace3);
172 Handle(GEOM_Object) anFace4 = GetObjectImpl(theFace4);
173 Handle(GEOM_Object) anFace5 = GetObjectImpl(theFace5);
174 Handle(GEOM_Object) anFace6 = GetObjectImpl(theFace6);
176 if (anFace1.IsNull() || anFace2.IsNull() ||
177 anFace3.IsNull() || anFace4.IsNull() ||
178 anFace5.IsNull() || anFace6.IsNull()) return aGEOMObject._retn();
181 Handle(GEOM_Object) anObject = GetOperations()->MakeHexa
182 (anFace1, anFace2, anFace3, anFace4, anFace5, anFace6);
183 if (!GetOperations()->IsDone() || anObject.IsNull())
184 return aGEOMObject._retn();
186 return GetObject(anObject);
189 //=============================================================================
193 //=============================================================================
194 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeHexa2Faces
195 (GEOM::GEOM_Object_ptr theFace1, GEOM::GEOM_Object_ptr theFace2)
197 GEOM::GEOM_Object_var aGEOMObject;
199 //Set a not done flag
200 GetOperations()->SetNotDone();
202 //Get the reference Faces
203 Handle(GEOM_Object) anFace1 = GetObjectImpl(theFace1);
204 Handle(GEOM_Object) anFace2 = GetObjectImpl(theFace2);
206 if (anFace1.IsNull() || anFace2.IsNull()) return aGEOMObject._retn();
209 Handle(GEOM_Object) anObject =
210 GetOperations()->MakeHexa2Faces(anFace1, anFace2);
211 if (!GetOperations()->IsDone() || anObject.IsNull())
212 return aGEOMObject._retn();
214 return GetObject(anObject);
217 //=============================================================================
221 //=============================================================================
222 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeBlockCompound
223 (GEOM::GEOM_Object_ptr theCompound)
225 GEOM::GEOM_Object_var aGEOMObject;
227 //Set a not done flag
228 GetOperations()->SetNotDone();
230 //Get the reference Compound
231 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
232 if (aCompound.IsNull()) return aGEOMObject._retn();
234 //Create the Blocks Compound
235 Handle(GEOM_Object) anObject =
236 GetOperations()->MakeBlockCompound(aCompound);
237 if (!GetOperations()->IsDone() || anObject.IsNull())
238 return aGEOMObject._retn();
240 return GetObject(anObject);
243 //=============================================================================
247 //=============================================================================
248 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetPoint (GEOM::GEOM_Object_ptr theShape,
249 const CORBA::Double theX,
250 const CORBA::Double theY,
251 const CORBA::Double theZ,
252 const CORBA::Double theEpsilon)
254 GEOM::GEOM_Object_var aGEOMObject;
256 //Set a not done flag
257 GetOperations()->SetNotDone();
259 //Get the reference Objects
260 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
261 if (aShape.IsNull()) return aGEOMObject._retn();
264 Handle(GEOM_Object) anObject =
265 GetOperations()->GetPoint(aShape, theX, theY, theZ, theEpsilon);
266 if (!GetOperations()->IsDone() || anObject.IsNull())
267 return aGEOMObject._retn();
269 return GetObject(anObject);
272 //=============================================================================
276 //=============================================================================
277 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetVertexNearPoint
278 (GEOM::GEOM_Object_ptr theShape,
279 GEOM::GEOM_Object_ptr thePoint)
281 GEOM::GEOM_Object_var aGEOMObject;
283 // Set a not done flag
284 GetOperations()->SetNotDone();
286 // Get the reference Objects
287 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
288 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
289 if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn();
292 Handle(GEOM_Object) anObject =
293 GetOperations()->GetVertexNearPoint(aShape, aPoint);
294 if (!GetOperations()->IsDone() || anObject.IsNull())
295 return aGEOMObject._retn();
297 return GetObject(anObject);
300 //=============================================================================
304 //=============================================================================
305 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetEdge (GEOM::GEOM_Object_ptr theShape,
306 GEOM::GEOM_Object_ptr thePoint1,
307 GEOM::GEOM_Object_ptr thePoint2)
309 GEOM::GEOM_Object_var aGEOMObject;
311 //Set a not done flag
312 GetOperations()->SetNotDone();
314 //Get the reference Objects
315 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
316 Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
317 Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
319 if (aShape.IsNull() ||
320 aPoint1.IsNull() || aPoint2.IsNull()) return aGEOMObject._retn();
323 Handle(GEOM_Object) anObject =
324 GetOperations()->GetEdge(aShape, aPoint1, aPoint2);
325 if (!GetOperations()->IsDone() || anObject.IsNull())
326 return aGEOMObject._retn();
328 return GetObject(anObject);
331 //=============================================================================
335 //=============================================================================
336 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetEdgeNearPoint (GEOM::GEOM_Object_ptr theShape,
337 GEOM::GEOM_Object_ptr thePoint)
339 GEOM::GEOM_Object_var aGEOMObject;
341 //Set a not done flag
342 GetOperations()->SetNotDone();
344 //Get the reference Objects
345 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
346 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
348 if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn();
351 Handle(GEOM_Object) anObject =
352 GetOperations()->GetEdgeNearPoint(aShape, aPoint);
353 if (!GetOperations()->IsDone() || anObject.IsNull())
354 return aGEOMObject._retn();
356 return GetObject(anObject);
359 //=============================================================================
363 //=============================================================================
364 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceByPoints
365 (GEOM::GEOM_Object_ptr theShape,
366 GEOM::GEOM_Object_ptr thePoint1,
367 GEOM::GEOM_Object_ptr thePoint2,
368 GEOM::GEOM_Object_ptr thePoint3,
369 GEOM::GEOM_Object_ptr thePoint4)
371 GEOM::GEOM_Object_var aGEOMObject;
373 //Set a not done flag
374 GetOperations()->SetNotDone();
376 //Get the reference Objects
377 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
378 Handle(GEOM_Object) aPoint1 = GetObjectImpl(thePoint1);
379 Handle(GEOM_Object) aPoint2 = GetObjectImpl(thePoint2);
380 Handle(GEOM_Object) aPoint3 = GetObjectImpl(thePoint3);
381 Handle(GEOM_Object) aPoint4 = GetObjectImpl(thePoint4);
383 if (aShape.IsNull() ||
384 aPoint1.IsNull() || aPoint2.IsNull() ||
385 aPoint3.IsNull() || aPoint4.IsNull()) return aGEOMObject._retn();
388 Handle(GEOM_Object) anObject =
389 GetOperations()->GetFaceByPoints(aShape, aPoint1, aPoint2, aPoint3, aPoint4);
390 if (!GetOperations()->IsDone() || anObject.IsNull())
391 return aGEOMObject._retn();
393 return GetObject(anObject);
396 //=============================================================================
400 //=============================================================================
401 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceByEdges
402 (GEOM::GEOM_Object_ptr theShape,
403 GEOM::GEOM_Object_ptr theEdge1,
404 GEOM::GEOM_Object_ptr theEdge2)
406 GEOM::GEOM_Object_var aGEOMObject;
408 //Set a not done flag
409 GetOperations()->SetNotDone();
411 //Get the reference Objects
412 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
413 Handle(GEOM_Object) anEdge1 = GetObjectImpl(theEdge1);
414 Handle(GEOM_Object) anEdge2 = GetObjectImpl(theEdge2);
416 if (aShape.IsNull() ||
417 anEdge1.IsNull() || anEdge2.IsNull()) return aGEOMObject._retn();
420 Handle(GEOM_Object) anObject =
421 GetOperations()->GetFaceByEdges(aShape, anEdge1, anEdge2);
422 if (!GetOperations()->IsDone() || anObject.IsNull())
423 return aGEOMObject._retn();
425 return GetObject(anObject);
428 //=============================================================================
432 //=============================================================================
433 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetOppositeFace (GEOM::GEOM_Object_ptr theShape,
434 GEOM::GEOM_Object_ptr theFace)
436 GEOM::GEOM_Object_var aGEOMObject;
438 //Set a not done flag
439 GetOperations()->SetNotDone();
441 //Get the reference Objects
442 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
443 Handle(GEOM_Object) aFace = GetObjectImpl(theFace);
445 if (aShape.IsNull() || aFace.IsNull()) return aGEOMObject._retn();
448 Handle(GEOM_Object) anObject =
449 GetOperations()->GetOppositeFace(aShape, aFace);
450 if (!GetOperations()->IsDone() || anObject.IsNull())
451 return aGEOMObject._retn();
453 return GetObject(anObject);
456 //=============================================================================
460 //=============================================================================
461 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceNearPoint (GEOM::GEOM_Object_ptr theShape,
462 GEOM::GEOM_Object_ptr thePoint)
464 GEOM::GEOM_Object_var aGEOMObject;
466 //Set a not done flag
467 GetOperations()->SetNotDone();
469 //Get the reference Objects
470 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
471 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
473 if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn();
476 Handle(GEOM_Object) anObject =
477 GetOperations()->GetFaceNearPoint(aShape, aPoint);
478 if (!GetOperations()->IsDone() || anObject.IsNull())
479 return aGEOMObject._retn();
481 return GetObject(anObject);
484 //=============================================================================
488 //=============================================================================
489 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceByNormale (GEOM::GEOM_Object_ptr theShape,
490 GEOM::GEOM_Object_ptr theVector)
492 GEOM::GEOM_Object_var aGEOMObject;
494 //Set a not done flag
495 GetOperations()->SetNotDone();
497 //Get the reference Objects
498 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
499 Handle(GEOM_Object) aVector = GetObjectImpl(theVector);
501 if (aShape.IsNull() || aVector.IsNull()) return aGEOMObject._retn();
504 Handle(GEOM_Object) anObject =
505 GetOperations()->GetFaceByNormale(aShape, aVector);
506 if (!GetOperations()->IsDone() || anObject.IsNull())
507 return aGEOMObject._retn();
509 return GetObject(anObject);
512 //=============================================================================
516 //=============================================================================
517 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetShapesNearPoint
518 (GEOM::GEOM_Object_ptr theShape,
519 GEOM::GEOM_Object_ptr thePoint,
520 CORBA::Long theShapeType,
521 CORBA::Double theTolerance)
523 GEOM::GEOM_Object_var aGEOMObject;
525 // Set a not done flag
526 GetOperations()->SetNotDone();
528 // Get the reference Objects
529 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
530 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
532 if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn();
535 Handle(GEOM_Object) anObject =
536 GetOperations()->GetShapesNearPoint(aShape, aPoint, theShapeType, theTolerance);
537 if (!GetOperations()->IsDone() || anObject.IsNull())
538 return aGEOMObject._retn();
540 return GetObject(anObject);
543 //=============================================================================
545 * ExplodeCompoundOfBlocks
547 //=============================================================================
548 GEOM::ListOfGO* GEOM_IBlocksOperations_i::ExplodeCompoundOfBlocks
549 (GEOM::GEOM_Object_ptr theCompound,
550 const CORBA::Long theMinNbFaces,
551 const CORBA::Long theMaxNbFaces)
553 GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
555 //Set a not done flag
556 GetOperations()->SetNotDone();
558 //Get the reference Compound
559 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
560 if (aCompound.IsNull()) return aSeq._retn();
563 Handle(TColStd_HSequenceOfTransient) aHSeq =
564 GetOperations()->ExplodeCompoundOfBlocks(aCompound, theMinNbFaces, theMaxNbFaces);
565 if (!GetOperations()->IsDone() || aHSeq.IsNull())
568 Standard_Integer aLength = aHSeq->Length();
569 aSeq->length(aLength);
570 for (Standard_Integer i = 1; i <= aLength; i++)
571 aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i)));
576 //=============================================================================
580 //=============================================================================
581 CORBA::Boolean GEOM_IBlocksOperations_i::IsCompoundOfBlocks
582 (GEOM::GEOM_Object_ptr theCompound,
583 const CORBA::Long theMinNbFaces,
584 const CORBA::Long theMaxNbFaces,
585 CORBA::Long& theNbBlocks)
588 CORBA::Boolean isComp = false;
590 //Set a not done flag
591 GetOperations()->SetNotDone();
593 //Get the reference Compound
594 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
595 if (aCompound.IsNull()) return isComp;
598 Standard_Integer nbBlocks = 0;
599 isComp = GetOperations()->IsCompoundOfBlocks(aCompound,
603 if (!GetOperations()->IsDone())
606 theNbBlocks = nbBlocks;
610 //=============================================================================
612 * CheckCompoundOfBlocks
614 //=============================================================================
615 CORBA::Boolean GEOM_IBlocksOperations_i::CheckCompoundOfBlocks
616 (GEOM::GEOM_Object_ptr theCompound,
617 GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors)
619 CORBA::Boolean isComp = false;
621 //Set a not done flag
622 GetOperations()->SetNotDone();
624 //Get the reference Compound
625 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
626 if (aCompound.IsNull()) return isComp;
629 std::list<GEOMImpl_IBlocksOperations::BCError> errList;
630 isComp = GetOperations()->CheckCompoundOfBlocks(aCompound, errList);
631 if (!GetOperations()->IsDone())
634 const int nbErr = errList.size();
635 GEOM::GEOM_IBlocksOperations::BCErrors_var anErrArray =
636 new GEOM::GEOM_IBlocksOperations::BCErrors();
637 anErrArray->length(nbErr);
639 // fill the local CORBA array with values from lists
640 std::list<GEOMImpl_IBlocksOperations::BCError>::iterator errIt = errList.begin();
642 for (; errIt != errList.end(); i++, errIt++) {
643 GEOM::GEOM_IBlocksOperations::BCError_var anError =
644 new GEOM::GEOM_IBlocksOperations::BCError();
646 GEOMImpl_IBlocksOperations::BCError errStruct = *errIt;
648 switch (errStruct.error) {
649 case GEOMImpl_IBlocksOperations::NOT_BLOCK:
650 anError->error = GEOM::GEOM_IBlocksOperations::NOT_BLOCK;
652 case GEOMImpl_IBlocksOperations::EXTRA_EDGE:
653 anError->error = GEOM::GEOM_IBlocksOperations::EXTRA_EDGE;
655 case GEOMImpl_IBlocksOperations::INVALID_CONNECTION:
656 anError->error = GEOM::GEOM_IBlocksOperations::INVALID_CONNECTION;
658 case GEOMImpl_IBlocksOperations::NOT_CONNECTED:
659 anError->error = GEOM::GEOM_IBlocksOperations::NOT_CONNECTED;
661 case GEOMImpl_IBlocksOperations::NOT_GLUED:
662 anError->error = GEOM::GEOM_IBlocksOperations::NOT_GLUED;
668 std::list<int> sshList = errStruct.incriminated;
669 GEOM::ListOfLong_var anIncrims = new GEOM::ListOfLong();
670 anIncrims->length(sshList.size());
672 std::list<int>::iterator sshIt = sshList.begin();
674 for (; sshIt != sshList.end(); jj++, sshIt++) {
675 anIncrims[jj] = *sshIt;
678 anError->incriminated = anIncrims;
680 anErrArray[i] = anError;
683 // initialize out-parameter with local array
684 theErrors = anErrArray._retn();
689 //=============================================================================
693 //=============================================================================
694 char* GEOM_IBlocksOperations_i::PrintBCErrors
695 (GEOM::GEOM_Object_ptr theCompound,
696 const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors)
698 //Get the reference Compound
699 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
700 if (aCompound.IsNull()) return NULL;
702 // Convert the errors sequence
703 std::list<GEOMImpl_IBlocksOperations::BCError> anErrors;
704 int nbErr = theErrors.length();
706 for (; ie < nbErr; ie++) {
707 const GEOM::GEOM_IBlocksOperations::BCError err = theErrors[ie];
708 const GEOM::GEOM_IBlocksOperations::BCErrorType typ = err.error;
709 const GEOM::ListOfLong incrims = err.incriminated;
711 GEOMImpl_IBlocksOperations::BCError errStruct;
713 case GEOM::GEOM_IBlocksOperations::NOT_BLOCK:
714 errStruct.error = GEOMImpl_IBlocksOperations::NOT_BLOCK;
716 case GEOM::GEOM_IBlocksOperations::EXTRA_EDGE:
717 errStruct.error = GEOMImpl_IBlocksOperations::EXTRA_EDGE;
719 case GEOM::GEOM_IBlocksOperations::INVALID_CONNECTION:
720 errStruct.error = GEOMImpl_IBlocksOperations::INVALID_CONNECTION;
722 case GEOM::GEOM_IBlocksOperations::NOT_CONNECTED:
723 errStruct.error = GEOMImpl_IBlocksOperations::NOT_CONNECTED;
725 case GEOM::GEOM_IBlocksOperations::NOT_GLUED:
726 errStruct.error = GEOMImpl_IBlocksOperations::NOT_GLUED;
733 int aLen = incrims.length();
734 for (; ii < aLen; ii++) {
735 errStruct.incriminated.push_back(incrims[ii]);
738 anErrors.push_back(errStruct);
741 TCollection_AsciiString aDescr = GetOperations()->PrintBCErrors(aCompound, anErrors);
742 return CORBA::string_dup(aDescr.ToCString());
745 //=============================================================================
749 //=============================================================================
750 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges
751 (GEOM::GEOM_Object_ptr theShape,
752 CORBA::Long theOptimumNbFaces)
754 GEOM::GEOM_Object_var aGEOMObject;
756 //Set a not done flag
757 GetOperations()->SetNotDone();
759 //Get the reference Objects
760 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
761 if (aShape.IsNull()) return aGEOMObject._retn();
764 Handle(GEOM_Object) anObject = GetOperations()->RemoveExtraEdges(aShape, theOptimumNbFaces);
765 if (!GetOperations()->IsDone() || anObject.IsNull())
766 return aGEOMObject._retn();
768 return GetObject(anObject);
771 //=============================================================================
775 //=============================================================================
776 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::CheckAndImprove (GEOM::GEOM_Object_ptr theCompound)
778 GEOM::GEOM_Object_var aGEOMObject;
780 //Set a not done flag
781 GetOperations()->SetNotDone();
783 //Get the reference Objects
784 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
785 if (aCompound.IsNull()) return aGEOMObject._retn();
788 Handle(GEOM_Object) anObject =
789 GetOperations()->CheckAndImprove(aCompound);
790 if (!GetOperations()->IsDone() || anObject.IsNull())
791 return aGEOMObject._retn();
793 return GetObject(anObject);
796 //=============================================================================
800 //=============================================================================
801 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetBlockNearPoint (GEOM::GEOM_Object_ptr theCompound,
802 GEOM::GEOM_Object_ptr thePoint)
804 GEOM::GEOM_Object_var aGEOMObject;
806 //Set a not done flag
807 GetOperations()->SetNotDone();
809 //Get the reference Objects
810 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
811 Handle(GEOM_Object) aPoint = GetObjectImpl(thePoint);
813 if (aCompound.IsNull() || aPoint.IsNull()) return aGEOMObject._retn();
816 Handle(GEOM_Object) anObject =
817 GetOperations()->GetBlockNearPoint(aCompound, aPoint);
818 if (!GetOperations()->IsDone() || anObject.IsNull())
819 return aGEOMObject._retn();
821 return GetObject(anObject);
824 //=============================================================================
828 //=============================================================================
829 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetBlockByParts (GEOM::GEOM_Object_ptr theCompound,
830 const GEOM::ListOfGO& theParts)
832 GEOM::GEOM_Object_var aGEOMObject;
834 //Set a not done flag
835 GetOperations()->SetNotDone();
837 //Get the reference Compound
838 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
839 if (aCompound.IsNull()) return aGEOMObject._retn();
843 Handle(TColStd_HSequenceOfTransient) aParts = new TColStd_HSequenceOfTransient;
845 aLen = theParts.length();
846 for (ind = 0; ind < aLen; ind++) {
847 Handle(GEOM_Object) aSh = GetObjectImpl(theParts[ind]);
848 if (aSh.IsNull()) return aGEOMObject._retn();
853 Handle(GEOM_Object) anObject =
854 GetOperations()->GetBlockByParts(aCompound, aParts);
855 if (!GetOperations()->IsDone() || anObject.IsNull())
856 return aGEOMObject._retn();
858 return GetObject(anObject);
861 //=============================================================================
865 //=============================================================================
866 GEOM::ListOfGO* GEOM_IBlocksOperations_i::GetBlocksByParts (GEOM::GEOM_Object_ptr theCompound,
867 const GEOM::ListOfGO& theParts)
869 GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
871 //Set a not done flag
872 GetOperations()->SetNotDone();
874 //Get the reference Compound
875 Handle(GEOM_Object) aCompound = GetObjectImpl(theCompound);
876 if (aCompound.IsNull()) return aSeq._retn();
880 Handle(TColStd_HSequenceOfTransient) aParts = new TColStd_HSequenceOfTransient;
882 aLen = theParts.length();
883 for (ind = 0; ind < aLen; ind++) {
884 Handle(GEOM_Object) aSh = GetObjectImpl(theParts[ind]);
885 if (aSh.IsNull()) return aSeq._retn();
890 Handle(TColStd_HSequenceOfTransient) aHSeq =
891 GetOperations()->GetBlocksByParts(aCompound, aParts);
892 if (!GetOperations()->IsDone() || aHSeq.IsNull())
895 Standard_Integer aLength = aHSeq->Length();
896 aSeq->length(aLength);
897 for (Standard_Integer i = 1; i <= aLength; i++)
898 aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i)));
903 //=============================================================================
905 * MakeMultiTransformation1D
907 //=============================================================================
908 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeMultiTransformation1D
909 (GEOM::GEOM_Object_ptr theBlock,
910 const CORBA::Long theDirFace1,
911 const CORBA::Long theDirFace2,
912 const CORBA::Long theNbTimes)
914 GEOM::GEOM_Object_var aGEOMObject;
916 //Set a not done flag
917 GetOperations()->SetNotDone();
919 //Get the object itself and the vector of translation
920 Handle(GEOM_Object) aBasicObject = GetObjectImpl(theBlock);
921 if (aBasicObject.IsNull()) return aGEOMObject._retn();
923 //Perform the transformation
924 Handle(GEOM_Object) anObject = GetOperations()->MakeMultiTransformation1D
925 (aBasicObject, theDirFace1, theDirFace2, theNbTimes);
926 if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
928 return GetObject(anObject);
931 //=============================================================================
933 * MakeMultiTransformation2D
935 //=============================================================================
936 GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeMultiTransformation2D
937 (GEOM::GEOM_Object_ptr theBlock,
938 const CORBA::Long theDirFace1U,
939 const CORBA::Long theDirFace2U,
940 const CORBA::Long theNbTimesU,
941 const CORBA::Long theDirFace1V,
942 const CORBA::Long theDirFace2V,
943 const CORBA::Long theNbTimesV)
945 GEOM::GEOM_Object_var aGEOMObject;
947 //Set a not done flag
948 GetOperations()->SetNotDone();
950 //Get the object itself
951 Handle(GEOM_Object) aBasicObject = GetObjectImpl(theBlock);
952 if (aBasicObject.IsNull()) return aGEOMObject._retn();
954 //Perform the transformation
955 Handle(GEOM_Object) anObject = GetOperations()->MakeMultiTransformation2D
957 theDirFace1U, theDirFace2U, theNbTimesU,
958 theDirFace1V, theDirFace2V, theNbTimesV);
959 if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn();
961 return GetObject(anObject);
964 //=============================================================================
968 //=============================================================================
969 GEOM::ListOfGO* GEOM_IBlocksOperations_i::Propagate (GEOM::GEOM_Object_ptr theShape)
971 GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
973 //Set a not done flag
974 GetOperations()->SetNotDone();
976 //Get the reference Shape
977 Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
978 if (aShape.IsNull()) return aSeq._retn();
980 //Get the Propagation chains
981 Handle(TColStd_HSequenceOfTransient) aHSeq =
982 GetOperations()->Propagate(aShape);
983 if (!GetOperations()->IsDone() || aHSeq.IsNull())
986 Standard_Integer aLength = aHSeq->Length();
987 aSeq->length(aLength);
988 for (Standard_Integer i = 1; i <= aLength; i++)
989 aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i)));