pythonocc-core icon indicating copy to clipboard operation
pythonocc-core copied to clipboard

RuntimeError: Standard_TypeMismatchTopoDS::Face raised from method TopoDS::Face of class TopoDS

Open sandeshchand87 opened this issue 3 years ago • 1 comments

I am running the script of core_geometry_face_recognition_from_stepfile.py . I am getting the error from future import print_function

import os import os.path import sys

from OCC.Core.STEPControl import STEPControl_Reader from OCC.Core.IFSelect import IFSelect_RetDone, IFSelect_ItemsByEntity from OCC.Core.GeomAbs import GeomAbs_Plane, GeomAbs_Cylinder from OCC.Core.TopoDS import topods_Face from OCC.Core.BRepAdaptor import BRepAdaptor_Surface from OCC.Display.SimpleGui import init_display

from OCC.Extend.TopologyUtils import TopologyExplorer

def read_step_file(filename): """read the STEP file and returns a compound""" step_reader = STEPControl_Reader() status = step_reader.ReadFile(filename)

if status == IFSelect_RetDone:  # check status
    failsonly = False
    step_reader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity)
    step_reader.PrintCheckTransfer(failsonly, IFSelect_ItemsByEntity)
    step_reader.TransferRoot(1)
    a_shape = step_reader.Shape(1)
else:
    print("Error: can't read file.")
    sys.exit(0)
return a_shape

def recognize_face(a_face): """Takes a TopoDS shape and tries to identify its nature whether it is a plane a cylinder a torus etc. if a plane, returns the normal if a cylinder, returns the radius """ surf = BRepAdaptor_Surface(a_face, True) surf_type = surf.GetType() if surf_type == GeomAbs_Plane: print("--> plane") # look for the properties of the plane # first get the related gp_Pln gp_pln = surf.Plane() location = gp_pln.Location() # a point of the plane normal = gp_pln.Axis().Direction() # the plane normal # then export location and normal to the console output print( "--> Location (global coordinates)", location.X(), location.Y(), location.Z(), ) print("--> Normal (global coordinates)", normal.X(), normal.Y(), normal.Z()) elif surf_type == GeomAbs_Cylinder: print("--> cylinder") # look for the properties of the cylinder # first get the related gp_Cyl gp_cyl = surf.Cylinder() location = gp_cyl.Location() # a point of the axis axis = gp_cyl.Axis().Direction() # the cylinder axis # then export location and normal to the console output print( "--> Location (global coordinates)", location.X(), location.Y(), location.Z(), ) print("--> Axis (global coordinates)", axis.X(), axis.Y(), axis.Z()) else: # TODO there are plenty other type that can be checked # see documentation for the BRepAdaptor class # https://www.opencascade.com/doc/occt-6.9.1/refman/html/class_b_rep_adaptor___surface.html print("not implemented")

def recognize_clicked(shp, *kwargs): """This is the function called every time a face is clicked in the 3d view """ for shape in shp: # this should be a TopoDS_Face TODO check it is print("Face selected: ", shape) recognize_face(topods_Face(shape))

def recognize_batch(event=None): """Menu item : process all the faces of a single shape""" # then traverse the topology using the Topo class t = TopologyExplorer(shp) # loop over faces only for f in t.faces(): # call the recognition function recognize_face(f)

def exit(event=None): sys.exit()

if name == "main": display, start_display, add_menu, add_function_to_menu = init_display() display.SetSelectionModeFace() # switch to Face selection mode display.register_select_callback(recognize_clicked) # first loads the STEP file and display file=r"C:\Start.stp" shp = read_step_file( file ) display.DisplayShape(shp, update=True) add_menu("recognition") add_function_to_menu("recognition", recognize_batch) start_display()

RuntimeError: Standard_TypeMismatchTopoDS::Face raised from method TopoDS::Face of class TopoDS

Please help me to solve the issue. Thanks

sandeshchand87 avatar Apr 27 '22 14:04 sandeshchand87

The problem is in your callback function recognize_clicked.

for shape in shp: # this should be a TopoDS_Face TODO check it is
  print("Face selected: ", shape)
  recognize_face(topods_Face(shape))

shape can be any shape topology, e.g. a TopoDS_Solid. When you call topods_Face(shape), you are trying to convert a shape into a topods_face, which will not work, if the shape is not a face.

Instead, use a topexp_explorer and iterate over the faces first.

rainman110 avatar Apr 27 '22 14:04 rainman110