3 #include "GEOMImpl_IShapesOperations.hxx"
5 #include "GEOMImpl_Types.hxx"
7 #include "GEOMImpl_VectorDriver.hxx"
8 #include "GEOMImpl_ShapeDriver.hxx"
9 #include "GEOMImpl_CopyDriver.hxx"
10 #include "GEOMImpl_GlueDriver.hxx"
12 #include "GEOMImpl_IVector.hxx"
13 #include "GEOMImpl_IShapes.hxx"
14 #include "GEOMImpl_IGlue.hxx"
16 #include "GEOMImpl_Block6Explorer.hxx"
18 #include "GEOM_Function.hxx"
20 #include "GEOMAlgo_FinderShapeOn.hxx"
22 #include "utilities.h"
24 #include "Utils_ExceptHandlers.hxx"
26 #include <TFunction_DriverTable.hxx>
27 #include <TFunction_Driver.hxx>
28 #include <TFunction_Logbook.hxx>
29 #include <TDataStd_Integer.hxx>
30 #include <TDataStd_IntegerArray.hxx>
31 #include <TDF_Tool.hxx>
33 #include <BRepExtrema_ExtCF.hxx>
35 #include <BRep_Tool.hxx>
36 #include <BRepGProp.hxx>
37 #include <BRepAdaptor_Curve.hxx>
38 #include <BRepBuilderAPI_MakeFace.hxx>
43 #include <TopoDS_Shape.hxx>
44 #include <TopoDS_Face.hxx>
45 #include <TopoDS_Edge.hxx>
46 #include <TopoDS_Vertex.hxx>
47 #include <TopoDS_Iterator.hxx>
48 #include <TopExp_Explorer.hxx>
49 #include <TopLoc_Location.hxx>
50 #include <TopTools_MapOfShape.hxx>
51 #include <TopTools_Array1OfShape.hxx>
52 #include <TopTools_ListIteratorOfListOfShape.hxx>
53 #include <TopTools_IndexedMapOfShape.hxx>
55 #include <Geom_Surface.hxx>
56 #include <Geom_Plane.hxx>
57 #include <Geom_SphericalSurface.hxx>
58 #include <Geom_CylindricalSurface.hxx>
59 #include <GeomAdaptor_Surface.hxx>
61 #include <Geom2d_Curve.hxx>
63 #include <GProp_GProps.hxx>
66 #include <TColStd_Array1OfReal.hxx>
67 #include <TColStd_HArray1OfInteger.hxx>
68 #include <TColStd_ListOfInteger.hxx>
69 #include <TColStd_ListIteratorOfListOfInteger.hxx>
71 //#include <OSD_Timer.hxx>
73 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
75 //=============================================================================
79 //=============================================================================
80 GEOMImpl_IShapesOperations::GEOMImpl_IShapesOperations (GEOM_Engine* theEngine, int theDocID)
81 : GEOM_IOperations(theEngine, theDocID)
83 MESSAGE("GEOMImpl_IShapesOperations::GEOMImpl_IShapesOperations");
86 //=============================================================================
90 //=============================================================================
91 GEOMImpl_IShapesOperations::~GEOMImpl_IShapesOperations()
93 MESSAGE("GEOMImpl_IShapesOperations::~GEOMImpl_IShapesOperations");
97 //=============================================================================
101 //=============================================================================
102 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeEdge
103 (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2)
107 if (thePnt1.IsNull() || thePnt2.IsNull()) return NULL;
109 //Add a new Edge object
110 Handle(GEOM_Object) anEdge = GetEngine()->AddObject(GetDocID(), GEOM_EDGE);
112 //Add a new Vector function
113 Handle(GEOM_Function) aFunction =
114 anEdge->AddFunction(GEOMImpl_VectorDriver::GetID(), VECTOR_TWO_PNT);
116 //Check if the function is set correctly
117 if (aFunction->GetDriverGUID() != GEOMImpl_VectorDriver::GetID()) return NULL;
119 GEOMImpl_IVector aPI (aFunction);
121 Handle(GEOM_Function) aRef1 = thePnt1->GetLastFunction();
122 Handle(GEOM_Function) aRef2 = thePnt2->GetLastFunction();
123 if (aRef1.IsNull() || aRef2.IsNull()) return NULL;
125 aPI.SetPoint1(aRef1);
126 aPI.SetPoint2(aRef2);
128 //Compute the Edge value
130 if (!GetSolver()->ComputeFunction(aFunction)) {
131 SetErrorCode("Vector driver failed");
135 catch (Standard_Failure) {
136 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
137 SetErrorCode(aFail->GetMessageString());
141 //Make a Python command
142 TCollection_AsciiString anEntry, aDescr;
143 TDF_Tool::Entry(anEdge->GetEntry(), anEntry);
144 aDescr += (anEntry+" = geompy.MakeEdge(");
145 TDF_Tool::Entry(thePnt1->GetEntry(), anEntry);
146 aDescr += (anEntry+", ");
147 TDF_Tool::Entry(thePnt2->GetEntry(), anEntry);
148 aDescr += (anEntry+")");
150 aFunction->SetDescription(aDescr);
156 //=============================================================================
160 //=============================================================================
161 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeWire
162 (list<Handle(GEOM_Object)> theShapes)
164 return MakeShape(theShapes, GEOM_WIRE, WIRE_EDGES, "MakeWire");
167 //=============================================================================
171 //=============================================================================
172 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFace (Handle(GEOM_Object) theWire,
173 const bool isPlanarWanted)
177 if (theWire.IsNull()) return NULL;
179 //Add a new Face object
180 Handle(GEOM_Object) aFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE);
182 //Add a new Shape function for creation of a face from a wire
183 Handle(GEOM_Function) aFunction =
184 aFace->AddFunction(GEOMImpl_ShapeDriver::GetID(), FACE_WIRE);
185 if (aFunction.IsNull()) return NULL;
187 //Check if the function is set correctly
188 if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL;
190 GEOMImpl_IShapes aCI (aFunction);
192 Handle(GEOM_Function) aRefWire = theWire->GetLastFunction();
194 if (aRefWire.IsNull()) return NULL;
196 aCI.SetBase(aRefWire);
197 aCI.SetIsPlanar(isPlanarWanted);
199 //Compute the Face value
201 if (!GetSolver()->ComputeFunction(aFunction)) {
202 SetErrorCode("Shape driver failed to compute a face");
206 catch (Standard_Failure) {
207 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
208 SetErrorCode(aFail->GetMessageString());
212 //Make a Python command
213 TCollection_AsciiString anEntry, aDescr;
214 TDF_Tool::Entry(aFace->GetEntry(), anEntry);
216 aDescr += " = geompy.MakeFace(";
217 TDF_Tool::Entry(theWire->GetEntry(), anEntry);
224 aFunction->SetDescription(aDescr);
230 //=============================================================================
234 //=============================================================================
235 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFaceWires
236 (list<Handle(GEOM_Object)> theShapes,
237 const bool isPlanarWanted)
242 Handle(GEOM_Object) aShape = GetEngine()->AddObject(GetDocID(), GEOM_FACE);
245 Handle(GEOM_Function) aFunction =
246 aShape->AddFunction(GEOMImpl_ShapeDriver::GetID(), FACE_WIRES);
247 if (aFunction.IsNull()) return NULL;
249 //Check if the function is set correctly
250 if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL;
252 GEOMImpl_IShapes aCI (aFunction);
254 Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient;
257 list<Handle(GEOM_Object)>::iterator it = theShapes.begin();
258 for (; it != theShapes.end(); it++) {
259 Handle(GEOM_Function) aRefSh = (*it)->GetLastFunction();
260 if (aRefSh.IsNull()) {
261 SetErrorCode("NULL argument shape for the face construction");
264 aShapesSeq->Append(aRefSh);
266 aCI.SetShapes(aShapesSeq);
268 aCI.SetIsPlanar(isPlanarWanted);
272 if (!GetSolver()->ComputeFunction(aFunction)) {
273 SetErrorCode("Shape driver failed");
277 catch (Standard_Failure) {
278 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
279 SetErrorCode(aFail->GetMessageString());
283 //Make a Python command
284 TCollection_AsciiString anEntry, aDescr;
285 TDF_Tool::Entry(aShape->GetEntry(), anEntry);
286 aDescr += (anEntry + " = geompy.MakeFaceWires([");
288 it = theShapes.begin();
289 if (it != theShapes.end()) {
290 TDF_Tool::Entry((*it)->GetEntry(), anEntry);
293 for (; it != theShapes.end(); it++) {
295 TDF_Tool::Entry((*it)->GetEntry(), anEntry);
305 aFunction->SetDescription(aDescr);
311 //=============================================================================
315 //=============================================================================
316 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeShell
317 (list<Handle(GEOM_Object)> theShapes)
319 return MakeShape(theShapes, GEOM_SHELL, SHELL_FACES, "MakeShell");
322 //=============================================================================
326 //=============================================================================
327 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeSolidShells
328 (list<Handle(GEOM_Object)> theShapes)
330 return MakeShape(theShapes, GEOM_SOLID, SOLID_SHELLS, "MakeSolid");
333 //=============================================================================
337 //=============================================================================
338 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeSolidShell (Handle(GEOM_Object) theShell)
342 if (theShell.IsNull()) return NULL;
344 //Add a new Solid object
345 Handle(GEOM_Object) aSolid = GetEngine()->AddObject(GetDocID(), GEOM_SOLID);
347 //Add a new Solid function for creation of a solid from a shell
348 Handle(GEOM_Function) aFunction =
349 aSolid->AddFunction(GEOMImpl_ShapeDriver::GetID(), SOLID_SHELL);
350 if (aFunction.IsNull()) return NULL;
352 //Check if the function is set correctly
353 if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL;
355 GEOMImpl_IShapes aCI (aFunction);
357 Handle(GEOM_Function) aRefShell = theShell->GetLastFunction();
359 if (aRefShell.IsNull()) return NULL;
361 aCI.SetBase(aRefShell);
363 //Compute the Solid value
365 if (!GetSolver()->ComputeFunction(aFunction)) {
366 SetErrorCode("Solid driver failed");
370 catch (Standard_Failure) {
371 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
372 SetErrorCode(aFail->GetMessageString());
376 //Make a Python command
377 TCollection_AsciiString anEntry, aDescr("");
378 TDF_Tool::Entry(aSolid->GetEntry(), anEntry);
380 aDescr += " = geompy.MakeSolid(";
381 TDF_Tool::Entry(theShell->GetEntry(), anEntry);
382 aDescr += (anEntry+")");
384 aFunction->SetDescription(aDescr);
390 //=============================================================================
394 //=============================================================================
395 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeCompound
396 (list<Handle(GEOM_Object)> theShapes)
398 return MakeShape(theShapes, GEOM_COMPOUND, COMPOUND_SHAPES, "MakeCompound");
401 //=============================================================================
405 //=============================================================================
406 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeShape
407 (list<Handle(GEOM_Object)> theShapes,
408 const Standard_Integer theObjectType,
409 const Standard_Integer theFunctionType,
410 const TCollection_AsciiString theMethodName)
415 Handle(GEOM_Object) aShape = GetEngine()->AddObject(GetDocID(), theObjectType);
418 Handle(GEOM_Function) aFunction =
419 aShape->AddFunction(GEOMImpl_ShapeDriver::GetID(), theFunctionType);
420 if (aFunction.IsNull()) return NULL;
422 //Check if the function is set correctly
423 if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL;
425 GEOMImpl_IShapes aCI (aFunction);
427 Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient;
430 list<Handle(GEOM_Object)>::iterator it = theShapes.begin();
431 for (; it != theShapes.end(); it++) {
432 Handle(GEOM_Function) aRefSh = (*it)->GetLastFunction();
433 if (aRefSh.IsNull()) {
434 SetErrorCode("NULL argument shape for the shape construction");
437 aShapesSeq->Append(aRefSh);
439 aCI.SetShapes(aShapesSeq);
443 if (!GetSolver()->ComputeFunction(aFunction)) {
444 SetErrorCode("Shape driver failed");
448 catch (Standard_Failure) {
449 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
450 SetErrorCode(aFail->GetMessageString());
454 //Make a Python command
455 TCollection_AsciiString anEntry, aDescr("");
456 TDF_Tool::Entry(aShape->GetEntry(), anEntry);
457 aDescr += (anEntry + " = geompy.");
458 aDescr += (theMethodName + "([");
460 it = theShapes.begin();
461 if (it != theShapes.end()) {
462 TDF_Tool::Entry((*it)->GetEntry(), anEntry);
465 for (; it != theShapes.end(); it++) {
467 TDF_Tool::Entry((*it)->GetEntry(), anEntry);
473 aFunction->SetDescription(aDescr);
479 //=============================================================================
483 //=============================================================================
484 Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeGlueFaces
485 (Handle(GEOM_Object) theShape,
486 const Standard_Real theTolerance)
490 if (theShape.IsNull()) return NULL;
492 //Add a new Glued object
493 Handle(GEOM_Object) aGlued = GetEngine()->AddObject(GetDocID(), GEOM_GLUED);
495 //Add a new Glue function
496 Handle(GEOM_Function) aFunction;
497 aFunction = aGlued->AddFunction(GEOMImpl_GlueDriver::GetID(), GLUE_FACES);
498 if (aFunction.IsNull()) return NULL;
500 //Check if the function is set correctly
501 if (aFunction->GetDriverGUID() != GEOMImpl_GlueDriver::GetID()) return NULL;
503 GEOMImpl_IGlue aCI (aFunction);
505 Handle(GEOM_Function) aRefShape = theShape->GetLastFunction();
506 if (aRefShape.IsNull()) return NULL;
508 aCI.SetBase(aRefShape);
509 aCI.SetTolerance(theTolerance);
511 //Compute the sub-shape value
512 Standard_Boolean isWarning = Standard_False;
514 if (!GetSolver()->ComputeFunction(aFunction)) {
515 SetErrorCode("Shape driver failed to glue faces");
519 catch (Standard_Failure) {
520 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
521 SetErrorCode(aFail->GetMessageString());
522 // to provide warning
523 if (!aFunction->GetValue().IsNull()) {
524 isWarning = Standard_True;
530 //Make a Python command
531 TCollection_AsciiString anEntry, aDescr;
532 TDF_Tool::Entry(aGlued->GetEntry(), anEntry);
534 aDescr += " = geompy.MakeGlueFaces(";
535 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
536 aDescr += anEntry + ", ";
537 aDescr += TCollection_AsciiString(theTolerance) + ")";
539 aFunction->SetDescription(aDescr);
541 // to provide warning
542 if (!isWarning) SetErrorCode(OK);
546 //=============================================================================
550 //=============================================================================
551 Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode
552 (Handle(GEOM_Object) theShape,
553 const Standard_Integer theShapeType,
554 const Standard_Boolean isSorted)
556 // OSD_Timer timer1, timer2, timer3, timer4;
561 if (theShape.IsNull()) return NULL;
562 TopoDS_Shape aShape = theShape->GetValue();
563 if (aShape.IsNull()) return NULL;
565 Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient;
566 Handle(GEOM_Object) anObj;
567 Handle(GEOM_Function) aFunction;
568 TopTools_MapOfShape mapShape;
569 TopTools_ListOfShape listShape;
571 if (aShape.ShapeType() == TopAbs_COMPOUND &&
572 (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
573 TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID ||
574 TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND)) {
575 TopoDS_Iterator It (aShape, Standard_True, Standard_True);
576 for (; It.More(); It.Next()) {
577 if (mapShape.Add(It.Value())) {
578 if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
579 TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) {
580 listShape.Append(It.Value());
585 TopExp_Explorer exp (aShape, TopAbs_ShapeEnum(theShapeType));
586 for (; exp.More(); exp.Next())
587 if (mapShape.Add(exp.Current()))
588 listShape.Append(exp.Current());
591 if (listShape.IsEmpty()) {
592 SetErrorCode("The given shape has no sub-shapes of the requested type");
600 SortShapes(listShape);
605 TopTools_IndexedMapOfShape anIndices;
606 TopExp::MapShapes(aShape, anIndices);
607 Handle(TColStd_HArray1OfInteger) anArray;
609 TopTools_ListIteratorOfListOfShape itSub (listShape);
610 TCollection_AsciiString anAsciiList = "[", anEntry;
611 for (int index = 1; itSub.More(); itSub.Next(), ++index) {
612 TopoDS_Shape aValue = itSub.Value();
613 anArray = new TColStd_HArray1OfInteger(1,1);
614 anArray->SetValue(1, anIndices.FindIndex(aValue));
615 anObj = GetEngine()->AddSubShape(theShape, anArray);
618 TDF_Tool::Entry(anObj->GetEntry(), anEntry);
619 anAsciiList += anEntry;
626 anAsciiList.Trunc(anAsciiList.Length() - 1);
629 anAsciiList = TCollection_AsciiString("\n\t") + anAsciiList;
631 //The explode doesn't change object so no new function is requiered.
632 aFunction = theShape->GetLastFunction();
634 //Make a Python command
635 TCollection_AsciiString aDescr(anAsciiList);
636 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
638 aDescr += " = geompy.SubShapeAllSorted( ";
640 aDescr += " = geompy.SubShapeAll( ";
641 aDescr += (anEntry + ", ");
642 aDescr += theShapeType;
645 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
646 anOldDescr = anOldDescr + aDescr;
647 aFunction->SetDescription(anOldDescr);
653 // cout << "Explosure takes:" << endl;
655 // cout << "Sorting takes:" << endl;
657 // cout << "Sub-shapes addition takes:" << endl;
659 // cout << "Update Description takes:" << endl;
665 //=============================================================================
669 //=============================================================================
670 Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::SubShapeAllIDs
671 (Handle(GEOM_Object) theShape,
672 const Standard_Integer theShapeType,
673 const Standard_Boolean isSorted)
677 if (theShape.IsNull()) return NULL;
678 TopoDS_Shape aShape = theShape->GetValue();
679 if (aShape.IsNull()) return NULL;
681 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
682 TopTools_MapOfShape mapShape;
683 TopTools_ListOfShape listShape;
685 if (aShape.ShapeType() == TopAbs_COMPOUND &&
686 (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
687 TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID ||
688 TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND)) {
689 TopoDS_Iterator It (aShape, Standard_True, Standard_True);
690 for (; It.More(); It.Next()) {
691 if (mapShape.Add(It.Value())) {
692 if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
693 TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) {
694 listShape.Append(It.Value());
699 TopExp_Explorer exp (aShape, TopAbs_ShapeEnum(theShapeType));
700 for (; exp.More(); exp.Next())
701 if (mapShape.Add(exp.Current()))
702 listShape.Append(exp.Current());
705 if (listShape.IsEmpty()) {
706 SetErrorCode("The given shape has no sub-shapes of the requested type");
711 SortShapes(listShape);
713 TopTools_IndexedMapOfShape anIndices;
714 TopExp::MapShapes(aShape, anIndices);
715 Handle(TColStd_HArray1OfInteger) anArray;
717 TopTools_ListIteratorOfListOfShape itSub (listShape);
718 for (int index = 1; itSub.More(); itSub.Next(), ++index) {
719 TopoDS_Shape aValue = itSub.Value();
720 aSeq->Append(anIndices.FindIndex(aValue));
723 //The explode doesn't change object so no new function is required.
724 Handle(GEOM_Function) aFunction = theShape->GetLastFunction();
726 //Make a Python command
727 TCollection_AsciiString aDescr
728 ("\n\tlistSubShapeAllIDs = geompy.SubShapeAllIDs(");
729 TCollection_AsciiString anEntry;
730 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
731 aDescr += (anEntry + ",");
733 aDescr += (TCollection_AsciiString(theShapeType) + ", 1)");
735 aDescr += (TCollection_AsciiString(theShapeType) + ", 0)");
737 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
738 anOldDescr = anOldDescr + aDescr;
739 aFunction->SetDescription(anOldDescr);
745 //=============================================================================
749 //=============================================================================
750 Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetSubShape
751 (Handle(GEOM_Object) theMainShape,
752 const Standard_Integer theID)
756 if (theMainShape.IsNull()) return NULL;
758 Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1);
759 anArray->SetValue(1, theID);
760 Handle(GEOM_Object) anObj = GetEngine()->AddSubShape(theMainShape, anArray,true);
761 if (anObj.IsNull()) {
762 SetErrorCode("Can not get a sub-shape with the given ID");
766 //The GetSubShape() doesn't change object so no new function is requiered.
767 Handle(GEOM_Function) aFunction = theMainShape->GetLastFunction();
769 //Make a Python command
770 TCollection_AsciiString aDescr ("\n\t");
771 TCollection_AsciiString anEntry;
772 TDF_Tool::Entry(anObj->GetEntry(), anEntry);
773 aDescr += anEntry + " = geompy.GetSubShape(";
774 TDF_Tool::Entry(theMainShape->GetEntry(), anEntry);
775 aDescr += anEntry + ", [" + theID + "])";
777 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
778 anOldDescr = anOldDescr + aDescr;
779 aFunction->SetDescription(anOldDescr);
786 //=============================================================================
790 //=============================================================================
791 Standard_Integer GEOMImpl_IShapesOperations::NumberOfFaces (Handle(GEOM_Object) theShape)
795 Standard_Integer nb = 0;
797 if (theShape.IsNull()) return -1;
798 TopoDS_Shape aShape = theShape->GetValue();
799 if (aShape.IsNull()) return -1;
801 TopTools_MapOfShape mapShape;
803 TopExp_Explorer exp (aShape, TopAbs_FACE);
804 for (; exp.More(); exp.Next())
805 if (mapShape.Add(exp.Current()))
812 //=============================================================================
816 //=============================================================================
817 Standard_Integer GEOMImpl_IShapesOperations::NumberOfEdges (Handle(GEOM_Object) theShape)
821 Standard_Integer nb = 0;
823 if (theShape.IsNull()) return -1;
824 TopoDS_Shape aShape = theShape->GetValue();
825 if (aShape.IsNull()) return -1;
827 TopTools_MapOfShape mapShape;
829 TopExp_Explorer exp (aShape, TopAbs_EDGE);
830 for (; exp.More(); exp.Next())
831 if (mapShape.Add(exp.Current()))
838 //=============================================================================
842 //=============================================================================
843 Handle(GEOM_Object) GEOMImpl_IShapesOperations::ReverseShape(Handle(GEOM_Object) theShape)
847 if (theShape.IsNull()) return NULL;
849 //Add a new reversed object
850 Handle(GEOM_Object) aReversed = GetEngine()->AddObject(GetDocID(), theShape->GetType());
852 //Add a new Revese function
853 Handle(GEOM_Function) aFunction;
854 aFunction = aReversed->AddFunction(GEOMImpl_ShapeDriver::GetID(), REVERSE_ORIENTATION);
855 if (aFunction.IsNull()) return NULL;
857 //Check if the function is set correctly
858 if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL;
860 GEOMImpl_IShapes aSI (aFunction);
862 Handle(GEOM_Function) aRefShape = theShape->GetLastFunction();
863 if (aRefShape.IsNull()) return NULL;
865 aSI.SetBase(aRefShape);
867 //Compute the sub-shape value
869 if (!GetSolver()->ComputeFunction(aFunction)) {
870 SetErrorCode("Shape driver failed to reverse shape");
874 catch (Standard_Failure) {
875 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
876 SetErrorCode(aFail->GetMessageString());
880 //Make a Python command
881 TCollection_AsciiString anEntry, aDescr;
882 TDF_Tool::Entry(aReversed->GetEntry(), anEntry);
884 aDescr += " = geompy.ChangeOrientation(";
885 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
886 aDescr += anEntry + ")";
888 aFunction->SetDescription(aDescr);
894 //=============================================================================
898 //=============================================================================
899 Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::GetFreeFacesIDs
900 (Handle(GEOM_Object) theShape)
904 if (theShape.IsNull()) return NULL;
905 TopoDS_Shape aShape = theShape->GetValue();
906 if (aShape.IsNull()) return NULL;
908 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
910 TopTools_IndexedDataMapOfShapeListOfShape mapFaceBlocks;
911 GEOMImpl_Block6Explorer::MapShapesAndAncestors
912 (aShape, TopAbs_FACE, TopAbs_SOLID, mapFaceBlocks);
914 Standard_Integer ind = 1, nbFaces = mapFaceBlocks.Extent();
917 SetErrorCode("The given shape has no faces");
921 TopTools_IndexedMapOfShape anIndices;
922 TopExp::MapShapes(aShape, anIndices);
925 for (; ind <= nbFaces; ind++) {
926 if (mapFaceBlocks.FindFromIndex(ind).Extent() != 2) {
927 id = anIndices.FindIndex(mapFaceBlocks.FindKey(ind));
932 //The explode doesn't change object so no new function is required.
933 Handle(GEOM_Function) aFunction = theShape->GetLastFunction();
935 //Make a Python command
936 TCollection_AsciiString aDescr ("\n\tlistFreeFacesIDs = geompy.GetFreeFacesIDs(");
937 TCollection_AsciiString anEntry;
938 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
939 aDescr += (anEntry + ")");
941 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
942 anOldDescr = anOldDescr + aDescr;
943 aFunction->SetDescription(anOldDescr);
949 //=============================================================================
953 //=============================================================================
954 Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetSharedShapes
955 (Handle(GEOM_Object) theShape1,
956 Handle(GEOM_Object) theShape2,
957 const Standard_Integer theShapeType)
961 if (theShape1.IsNull() || theShape2.IsNull()) return NULL;
963 TopoDS_Shape aShape1 = theShape1->GetValue();
964 TopoDS_Shape aShape2 = theShape2->GetValue();
966 if (aShape1.IsNull() || aShape2.IsNull()) return NULL;
968 TopTools_IndexedMapOfShape anIndices;
969 TopExp::MapShapes(aShape1, anIndices);
970 Handle(TColStd_HArray1OfInteger) anArray;
972 TopTools_IndexedMapOfShape mapShape1;
973 TopExp::MapShapes(aShape1, TopAbs_ShapeEnum(theShapeType), mapShape1);
975 Handle(GEOM_Object) anObj;
976 Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient;
978 TopTools_MapOfShape mapShape2;
979 TopExp_Explorer exp (aShape2, TopAbs_ShapeEnum(theShapeType));
980 for (; exp.More(); exp.Next()) {
981 TopoDS_Shape aSS = exp.Current();
982 if (mapShape2.Add(aSS) && mapShape1.Contains(aSS)) {
983 anArray = new TColStd_HArray1OfInteger(1,1);
984 anArray->SetValue(1, anIndices.FindIndex(aSS));
985 anObj = GetEngine()->AddSubShape(theShape1, anArray);
990 if (aSeq->IsEmpty()) {
991 SetErrorCode("The given shapes have no shared sub-shapes of the requested type");
995 //The explode doesn't change object so no new function is required.
996 Handle(GEOM_Function) aFunction = theShape1->GetLastFunction();
998 //Make a Python command
999 TCollection_AsciiString aDescr
1000 ("\n\tlistSharedShapes = geompy.GetSharedShapes(");
1001 TCollection_AsciiString anEntry;
1002 TDF_Tool::Entry(theShape1->GetEntry(), anEntry);
1003 aDescr += (anEntry + ",");
1004 TDF_Tool::Entry(theShape2->GetEntry(), anEntry);
1005 aDescr += (anEntry + ",");
1006 aDescr += TCollection_AsciiString(theShapeType) + ")";
1008 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
1009 anOldDescr = anOldDescr + aDescr;
1010 aFunction->SetDescription(anOldDescr);
1016 //=============================================================================
1020 //=============================================================================
1021 Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetShapesOnPlane
1022 (const Handle(GEOM_Object)& theShape,
1023 const Standard_Integer theShapeType,
1024 const Handle(GEOM_Object)& theAx1,
1025 const GEOMAlgo_State theState)
1029 if (theShape.IsNull() || theAx1.IsNull()) return NULL;
1031 TopoDS_Shape aShape = theShape->GetValue();
1032 TopoDS_Shape anAx1 = theAx1->GetValue();
1034 if (aShape.IsNull() || anAx1.IsNull()) return NULL;
1036 TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType);
1037 if (aShapeType != TopAbs_VERTEX &&
1038 aShapeType != TopAbs_EDGE &&
1039 aShapeType != TopAbs_FACE &&
1040 aShapeType != TopAbs_SOLID) {
1041 SetErrorCode("Only solids, vertices, edges or faces can be found by this method");
1046 if (anAx1.ShapeType() != TopAbs_EDGE) return NULL;
1047 TopoDS_Edge anEdge = TopoDS::Edge(anAx1);
1048 TopoDS_Vertex V1, V2;
1049 TopExp::Vertices(anEdge, V1, V2, Standard_True);
1050 if (V1.IsNull() || V2.IsNull()) {
1051 SetErrorCode("Bad edge given for the plane normal vector");
1054 gp_Pnt aLoc = BRep_Tool::Pnt(V1);
1055 gp_Vec aVec (aLoc, BRep_Tool::Pnt(V2));
1056 if (aVec.Magnitude() < Precision::Confusion()) {
1057 SetErrorCode("Vector with null magnitude given");
1061 Handle(Geom_Plane) aPlane = new Geom_Plane(aLoc, aVec);
1064 GEOMAlgo_FinderShapeOn aFinder;
1065 Standard_Real aTol = 0.0001; // default value
1067 aFinder.SetShape(aShape);
1068 aFinder.SetTolerance(aTol);
1069 aFinder.SetSurface(aPlane);
1070 aFinder.SetShapeType(aShapeType);
1071 aFinder.SetState(theState);
1075 // Interprete results
1076 Standard_Integer iErr = aFinder.ErrorStatus();
1077 // the detailed description of error codes is in GEOMAlgo_FinderShapeOn.cxx
1079 MESSAGE(" iErr : " << iErr);
1080 TCollection_AsciiString aMsg (" iErr : ");
1081 aMsg += TCollection_AsciiString(iErr);
1085 Standard_Integer iWrn = aFinder.WarningStatus();
1086 // the detailed description of warning codes is in GEOMAlgo_FinderShapeOn.cxx
1088 MESSAGE(" *** iWrn : " << iWrn);
1091 const TopTools_ListOfShape& listSS = aFinder.Shapes(); // the result
1093 if (listSS.Extent() < 1) {
1094 SetErrorCode("Not a single sub-shape of the requested type found on the given plane");
1098 // Fill sequence of objects
1099 TopTools_IndexedMapOfShape anIndices;
1100 TopExp::MapShapes(aShape, anIndices);
1102 Handle(GEOM_Object) anObj;
1103 Handle(TColStd_HArray1OfInteger) anArray;
1104 Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient;
1106 TopTools_ListIteratorOfListOfShape itSub (listSS);
1107 for (int index = 1; itSub.More(); itSub.Next(), ++index) {
1108 int id = anIndices.FindIndex(itSub.Value());
1109 anArray = new TColStd_HArray1OfInteger(1,1);
1110 anArray->SetValue(1, id);
1111 anObj = GetEngine()->AddSubShape(theShape, anArray);
1112 aSeq->Append(anObj);
1115 // The GetShapesOnPlane() doesn't change object so no new function is required.
1116 Handle(GEOM_Function) aFunction = theShape->GetLastFunction();
1118 // Make a Python command
1119 TCollection_AsciiString anEntry, aDescr
1120 ("\n\tlistShapesOnPlane = geompy.GetShapesOnPlane(");
1121 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
1122 aDescr += anEntry + TCollection_AsciiString(theShapeType) + ",";
1123 TDF_Tool::Entry(theAx1->GetEntry(), anEntry);
1124 aDescr += anEntry + ",";
1125 aDescr += TCollection_AsciiString(theState) + ")";
1127 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
1128 anOldDescr += aDescr;
1129 aFunction->SetDescription(anOldDescr);
1135 //=============================================================================
1137 * GetShapesOnCylinder
1139 //=============================================================================
1140 Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetShapesOnCylinder
1141 (const Handle(GEOM_Object)& theShape,
1142 const Standard_Integer theShapeType,
1143 const Handle(GEOM_Object)& theAxis,
1144 const Standard_Real theRadius,
1145 const GEOMAlgo_State theState)
1149 if (theShape.IsNull() || theAxis.IsNull()) return NULL;
1151 TopoDS_Shape aShape = theShape->GetValue();
1152 TopoDS_Shape anAxis = theAxis->GetValue();
1154 if (aShape.IsNull() || anAxis.IsNull()) return NULL;
1156 TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType);
1157 if (aShapeType != TopAbs_VERTEX &&
1158 aShapeType != TopAbs_EDGE &&
1159 aShapeType != TopAbs_FACE &&
1160 aShapeType != TopAbs_SOLID) {
1161 SetErrorCode("Only solids, vertices, edges or faces can be found by this method");
1165 //Axis of the cylinder
1166 if (anAxis.ShapeType() != TopAbs_EDGE) {
1167 SetErrorCode("Not an edge given for the axis");
1170 TopoDS_Edge anEdge = TopoDS::Edge(anAxis);
1171 TopoDS_Vertex V1, V2;
1172 TopExp::Vertices(anEdge, V1, V2, Standard_True);
1173 if (V1.IsNull() || V2.IsNull()) {
1174 SetErrorCode("Bad edge given for the axis");
1177 gp_Pnt aLoc = BRep_Tool::Pnt(V1);
1178 gp_Vec aVec (aLoc, BRep_Tool::Pnt(V2));
1179 if (aVec.Magnitude() < Precision::Confusion()) {
1180 SetErrorCode("Vector with null magnitude given");
1184 gp_Ax3 anAx3 (aLoc, aVec);
1185 Handle(Geom_CylindricalSurface) aCylinder =
1186 new Geom_CylindricalSurface(anAx3, theRadius);
1189 GEOMAlgo_FinderShapeOn aFinder;
1190 Standard_Real aTol = 0.0001; // default value
1192 aFinder.SetShape(aShape);
1193 aFinder.SetTolerance(aTol);
1194 aFinder.SetSurface(aCylinder);
1195 aFinder.SetShapeType(aShapeType);
1196 aFinder.SetState(theState);
1200 // Interprete results
1201 Standard_Integer iErr = aFinder.ErrorStatus();
1202 // the detailed description of error codes is in GEOMAlgo_FinderShapeOn.cxx
1204 MESSAGE(" iErr : " << iErr);
1205 TCollection_AsciiString aMsg (" iErr : ");
1206 aMsg += TCollection_AsciiString(iErr);
1210 Standard_Integer iWrn = aFinder.WarningStatus();
1211 // the detailed description of warning codes is in GEOMAlgo_FinderShapeOn.cxx
1213 MESSAGE(" *** iWrn : " << iWrn);
1216 const TopTools_ListOfShape& listSS = aFinder.Shapes(); // the result
1218 if (listSS.Extent() < 1) {
1219 SetErrorCode("Not a single sub-shape of the requested type found on the given cylinder");
1223 // Fill sequence of objects
1224 TopTools_IndexedMapOfShape anIndices;
1225 TopExp::MapShapes(aShape, anIndices);
1227 Handle(GEOM_Object) anObj;
1228 Handle(TColStd_HArray1OfInteger) anArray;
1229 Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient;
1231 TopTools_ListIteratorOfListOfShape itSub (listSS);
1232 for (int index = 1; itSub.More(); itSub.Next(), ++index) {
1233 int id = anIndices.FindIndex(itSub.Value());
1234 anArray = new TColStd_HArray1OfInteger(1,1);
1235 anArray->SetValue(1, id);
1236 anObj = GetEngine()->AddSubShape(theShape, anArray);
1237 aSeq->Append(anObj);
1240 // The GetShapesOnCylinder() doesn't change object so no new function is required.
1241 Handle(GEOM_Function) aFunction = theShape->GetLastFunction();
1243 // Make a Python command
1244 TCollection_AsciiString anEntry, aDescr
1245 ("\n\tlistShapesOnCylinder = geompy.GetShapesOnCylinder(");
1246 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
1247 aDescr += anEntry + TCollection_AsciiString(theShapeType) + ",";
1248 TDF_Tool::Entry(theAxis->GetEntry(), anEntry);
1249 aDescr += anEntry + ",";
1250 aDescr += TCollection_AsciiString(theRadius) + ",";
1251 aDescr += TCollection_AsciiString(theState) + ")";
1253 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
1254 anOldDescr += aDescr;
1255 aFunction->SetDescription(anOldDescr);
1261 //=============================================================================
1265 //=============================================================================
1266 Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetShapesOnSphere
1267 (const Handle(GEOM_Object)& theShape,
1268 const Standard_Integer theShapeType,
1269 const Handle(GEOM_Object)& theCenter,
1270 const Standard_Real theRadius,
1271 const GEOMAlgo_State theState)
1275 if (theShape.IsNull() || theCenter.IsNull()) return NULL;
1277 TopoDS_Shape aShape = theShape->GetValue();
1278 TopoDS_Shape aCenter = theCenter->GetValue();
1280 if (aShape.IsNull() || aCenter.IsNull()) return NULL;
1282 TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType);
1283 if (aShapeType != TopAbs_VERTEX &&
1284 aShapeType != TopAbs_EDGE &&
1285 aShapeType != TopAbs_FACE &&
1286 aShapeType != TopAbs_SOLID) {
1287 SetErrorCode("Only solids, vertices, edges or faces can be found by this method");
1291 // Center of the sphere
1292 if (aCenter.ShapeType() != TopAbs_VERTEX) return NULL;
1293 gp_Pnt aLoc = BRep_Tool::Pnt(TopoDS::Vertex(aCenter));
1295 gp_Ax3 anAx3 (aLoc, gp::DZ());
1296 Handle(Geom_SphericalSurface) aSphere =
1297 new Geom_SphericalSurface(anAx3, theRadius);
1300 GEOMAlgo_FinderShapeOn aFinder;
1301 Standard_Real aTol = 0.0001; // default value
1303 aFinder.SetShape(aShape);
1304 aFinder.SetTolerance(aTol);
1305 aFinder.SetSurface(aSphere);
1306 aFinder.SetShapeType(aShapeType);
1307 aFinder.SetState(theState);
1311 // Interprete results
1312 Standard_Integer iErr = aFinder.ErrorStatus();
1313 // the detailed description of error codes is in GEOMAlgo_FinderShapeOn.cxx
1315 MESSAGE(" iErr : " << iErr);
1316 TCollection_AsciiString aMsg (" iErr : ");
1317 aMsg += TCollection_AsciiString(iErr);
1321 Standard_Integer iWrn = aFinder.WarningStatus();
1322 // the detailed description of warning codes is in GEOMAlgo_FinderShapeOn.cxx
1324 MESSAGE(" *** iWrn : " << iWrn);
1327 const TopTools_ListOfShape& listSS = aFinder.Shapes(); // the result
1329 if (listSS.Extent() < 1) {
1330 SetErrorCode("Not a single sub-shape of the requested type found on the given sphere");
1334 // Fill sequence of objects
1335 TopTools_IndexedMapOfShape anIndices;
1336 TopExp::MapShapes(aShape, anIndices);
1338 Handle(GEOM_Object) anObj;
1339 Handle(TColStd_HArray1OfInteger) anArray;
1340 Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient;
1342 TopTools_ListIteratorOfListOfShape itSub (listSS);
1343 for (int index = 1; itSub.More(); itSub.Next(), ++index) {
1344 int id = anIndices.FindIndex(itSub.Value());
1345 anArray = new TColStd_HArray1OfInteger(1,1);
1346 anArray->SetValue(1, id);
1347 anObj = GetEngine()->AddSubShape(theShape, anArray);
1348 aSeq->Append(anObj);
1351 // The GetShapesOnSphere() doesn't change object so no new function is required.
1352 Handle(GEOM_Function) aFunction = theShape->GetLastFunction();
1354 // Make a Python command
1355 TCollection_AsciiString anEntry, aDescr
1356 ("\n\tlistShapesOnSphere = geompy.GetShapesOnSphere(");
1357 TDF_Tool::Entry(theShape->GetEntry(), anEntry);
1358 aDescr += anEntry + TCollection_AsciiString(theShapeType) + ",";
1359 TDF_Tool::Entry(theCenter->GetEntry(), anEntry);
1360 aDescr += anEntry + ",";
1361 aDescr += TCollection_AsciiString(theRadius) + ",";
1362 aDescr += TCollection_AsciiString(theState) + ")";
1364 TCollection_AsciiString anOldDescr = aFunction->GetDescription();
1365 anOldDescr += aDescr;
1366 aFunction->SetDescription(anOldDescr);
1372 //=============================================================================
1376 //=============================================================================
1377 Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace
1378 (Handle(GEOM_Object) theShapeWhere,
1379 Handle(GEOM_Object) theShapeWhat)
1383 if (theShapeWhere.IsNull() || theShapeWhat.IsNull()) return NULL;
1385 TopoDS_Shape aWhere = theShapeWhere->GetValue();
1386 TopoDS_Shape aWhat = theShapeWhat->GetValue();
1388 if (aWhere.IsNull() || aWhat.IsNull()) return NULL;
1390 //Fill array of indices
1391 Handle(TColStd_HArray1OfInteger) aModifiedArray;
1393 Handle(GEOM_Function) aWhereFunction = theShapeWhere->GetLastFunction();
1395 TopTools_IndexedMapOfShape aWhereIndices;
1396 TopExp::MapShapes(aWhere, aWhereIndices);
1398 if (aWhereIndices.Contains(aWhat)) {
1400 // entity was not changed by the operation
1401 Standard_Integer aWhatIndex = aWhereIndices.FindIndex(aWhat);
1402 aModifiedArray = new TColStd_HArray1OfInteger(1,1);
1403 aModifiedArray->SetValue(1, aWhatIndex);
1407 TDF_Label aHistoryLabel = aWhereFunction->GetHistoryEntry(Standard_False);
1408 if (aHistoryLabel.IsNull()) {
1409 SetErrorCode("Modifications history does not exist for the shape under consideration.");
1413 // search in history for all argument shapes
1414 Standard_Boolean isFound = Standard_False;
1416 TDF_LabelSequence aLabelSeq;
1417 aWhereFunction->GetDependency(aLabelSeq);
1418 Standard_Integer nbArg = aLabelSeq.Length();
1420 for (Standard_Integer iarg = 1; iarg <= nbArg && !isFound; iarg++) {
1422 TDF_Label anArgumentRefLabel = aLabelSeq.Value(iarg);
1424 Handle(GEOM_Object) anArgumentObject = GEOM_Object::GetReferencedObject(anArgumentRefLabel);
1425 TopoDS_Shape anArgumentShape = anArgumentObject->GetValue();
1427 TopTools_IndexedMapOfShape anArgumentIndices;
1428 TopExp::MapShapes(anArgumentShape, anArgumentIndices);
1430 if (anArgumentIndices.Contains(aWhat)) {
1431 isFound = Standard_True;
1432 Standard_Integer aWhatIndex = anArgumentIndices.FindIndex(aWhat);
1434 // Find corresponding label in history
1435 TDF_Label anArgumentHistoryLabel =
1436 aWhereFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_False);
1437 if (anArgumentHistoryLabel.IsNull()) {
1438 // Lost History of operation argument. Possibly, all its entities was removed.
1443 TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(aWhatIndex, Standard_False);
1444 if (aWhatHistoryLabel.IsNull()) {
1450 Handle(TDataStd_IntegerArray) anIntegerArray;
1451 if (!aWhatHistoryLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anIntegerArray)) {
1452 SetErrorCode("Error: Empty modifications history for the sought shape.");
1456 aModifiedArray = anIntegerArray->Array();
1457 if (aModifiedArray->Length() == 0) {
1458 SetErrorCode("Error: Empty modifications history for the sought shape.");
1465 SetErrorCode("The sought shape does not belong to any operation argument.");
1471 Handle(GEOM_Object) aResult = GetEngine()->AddSubShape(theShapeWhere, aModifiedArray);
1473 if (aModifiedArray->Length() > 1) {
1475 aResult->SetType(GEOM_GROUP);
1477 //Set a sub shape type
1478 TDF_Label aFreeLabel = aResult->GetFreeLabel();
1479 TopAbs_ShapeEnum aShapeType = aWhat.ShapeType();
1480 TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aShapeType);
1483 //Make a Python command
1484 TCollection_AsciiString anEntry, aDescr;
1485 TDF_Tool::Entry(aResult->GetEntry(), anEntry);
1487 aDescr += " = geompy.GetInPlace(";
1488 TDF_Tool::Entry(theShapeWhere->GetEntry(), anEntry);
1489 aDescr += anEntry + ",";
1490 TDF_Tool::Entry(theShapeWhat->GetEntry(), anEntry);
1491 aDescr += anEntry + ")";
1493 Handle(GEOM_Function) aFunction = aResult->GetFunction(1);
1494 aFunction->SetDescription(aDescr);
1500 //=======================================================================
1501 //function : SortShapes
1503 //=======================================================================
1504 void GEOMImpl_IShapesOperations::SortShapes(TopTools_ListOfShape& SL)
1506 Standard_Integer MaxShapes = SL.Extent();
1507 TopTools_Array1OfShape aShapes (1,MaxShapes);
1508 TColStd_Array1OfInteger OrderInd(1,MaxShapes);
1509 TColStd_Array1OfReal MidXYZ (1,MaxShapes); //X,Y,Z;
1510 TColStd_Array1OfReal Length (1,MaxShapes); //X,Y,Z;
1512 // Computing of CentreOfMass
1513 Standard_Integer Index;
1516 TopTools_ListIteratorOfListOfShape it(SL);
1517 for (Index=1; it.More(); Index++)
1519 TopoDS_Shape S = it.Value();
1520 SL.Remove( it ); // == it.Next()
1522 OrderInd.SetValue (Index, Index);
1523 if (S.ShapeType() == TopAbs_VERTEX)
1525 GPoint = BRep_Tool::Pnt( TopoDS::Vertex( S ));
1526 Length.SetValue( Index, (Standard_Real) S.Orientation());
1530 BRepGProp::LinearProperties (S, GPr);
1531 GPoint = GPr.CentreOfMass();
1532 Length.SetValue( Index, GPr.Mass() );
1534 MidXYZ.SetValue(Index,
1535 GPoint.X()*999 + GPoint.Y()*99 + GPoint.Z()*0.9);
1538 Standard_Integer aTemp;
1539 Standard_Boolean exchange, Sort = Standard_True;
1542 Sort = Standard_False;
1543 for (Index=1; Index < MaxShapes; Index++)
1545 if (MidXYZ(OrderInd(Index)) > MidXYZ(OrderInd(Index+1)))
1546 exchange = Standard_True;
1547 else if (MidXYZ(OrderInd(Index)) == MidXYZ(OrderInd(Index+1)) &&
1548 Length(OrderInd(Index)) > Length(OrderInd(Index+1)) )
1549 exchange = Standard_True;
1551 exchange = Standard_False;
1554 aTemp = OrderInd(Index);
1555 OrderInd(Index) = OrderInd(Index+1);
1556 OrderInd(Index+1) = aTemp;
1557 Sort = Standard_True;
1561 for (Index=1; Index <= MaxShapes; Index++)
1562 SL.Append( aShapes( OrderInd(Index) ));