0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / Prs3d / Prs3d_ShapeTool.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 84b355e..96feda1
@@ -1,26 +1,18 @@
 // Created on: 1995-08-07
 // Created by: Modelistation
 // Copyright (c) 1995-1999 Matra Datavision
-// Copyright (c) 1999-2012 OPEN CASCADE SAS
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
 //
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
+// This file is part of Open CASCADE Technology software library.
 //
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
 //
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
-
-
-#define OCC215           //SAV: 01/04/02 vertex exploring is done for all types of shape.
-#define OCC598          //SAV: 22/10/02 searching for internal vertices. 
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 #include <Prs3d_ShapeTool.ixx>
 
 //purpose  : 
 //=======================================================================
 
-Prs3d_ShapeTool::Prs3d_ShapeTool(const TopoDS_Shape& TheShape):
-                                 myShape (TheShape) 
+Prs3d_ShapeTool::Prs3d_ShapeTool (const TopoDS_Shape& theShape,
+                                  const Standard_Boolean theAllVertices)
+: myShape (theShape)
 {
   myEdgeMap.Clear();
   myVertexMap.Clear();
-  TopExp::MapShapesAndAncestors(TheShape,TopAbs_EDGE,TopAbs_FACE,myEdgeMap);
-
-#ifndef OCC215
-  // find vertices not under ancestors.
-  TopAbs_ShapeEnum E = TheShape.ShapeType();
+  TopExp::MapShapesAndAncestors (theShape,TopAbs_EDGE,TopAbs_FACE, myEdgeMap);
 
-
-  // this check were done to reduce the number of selectable objects
-  // in a local context. By now, there's no noticeable performance improvement.
-  if (E != TopAbs_SOLID && E != TopAbs_SHELL)
-#endif
+  TopExp_Explorer anExpl;
+  if (theAllVertices)
+  {
+    for (anExpl.Init (theShape, TopAbs_VERTEX); anExpl.More(); anExpl.Next())
     {
-      TopExp_Explorer ex(TheShape,TopAbs_VERTEX, TopAbs_EDGE);
-      while (ex.More()) {
-       const TopoDS_Shape& aV=ex.Current();
-       myVertexMap.Add(aV);
-       ex.Next();
-      }
+      myVertexMap.Add (anExpl.Current());
     }
-#ifdef OCC598
-  TopExp_Explorer edges( TheShape, TopAbs_EDGE );
-  while( edges.More() ) {
-    //xf
-    const TopoDS_Shape& aE= edges.Current();
-    TopoDS_Iterator aIt(aE, Standard_False, Standard_True);
-    while( aIt.More() ) {
-      const TopoDS_Shape& aV=aIt.Value();
-      if (aV.Orientation()==TopAbs_INTERNAL) {
-       myVertexMap.Add(aV);
-      }
-      aIt.Next();
+  }
+  else
+  {
+    // Extracting isolated vertices
+    for (anExpl.Init (theShape, TopAbs_VERTEX, TopAbs_EDGE); anExpl.More(); anExpl.Next())
+    {
+      myVertexMap.Add (anExpl.Current());
     }
-    /*
-    TopExp_Explorer vertices( edges.Current(), TopAbs_VERTEX );
-    while( vertices.More() ) {
-      TopoDS_Vertex current = TopoDS::Vertex( vertices.Current() );
-      if ( current.Orientation() == TopAbs_INTERNAL )
-       myVertexMap.Add( current );
-      vertices.Next();
+
+    // Extracting internal vertices
+    for (anExpl.Init (theShape, TopAbs_EDGE); anExpl.More(); anExpl.Next())
+    {
+      TopoDS_Iterator aIt (anExpl.Current(), Standard_False, Standard_True);
+      for (; aIt.More(); aIt.Next())
+      {
+        const TopoDS_Shape& aV = aIt.Value();
+        if (aV.Orientation() == TopAbs_INTERNAL)
+        {
+          myVertexMap.Add (aV);
+        }
+      }
     }
-    */
-    //xt
-    edges.Next();
   }
-#endif
 }
 
 //=======================================================================
@@ -166,7 +146,7 @@ Standard_Boolean Prs3d_ShapeTool::IsPlanarFace() const
 
   if (TheType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
     Handle(Geom_RectangularTrimmedSurface) 
-       RTS = *((Handle(Geom_RectangularTrimmedSurface)*)&S);
+       RTS = Handle(Geom_RectangularTrimmedSurface)::DownCast (S);
     TheType = RTS->BasisSurface()->DynamicType();
   }
   return (TheType == STANDARD_TYPE(Geom_Plane));