subnivean
subnivean

Reputation: 1152

Getting (t, c, k) values from OpenCascade surfaces

I've created a library for creating and using b-spline surfaces in Python, utilizing parallel scipy.interpolate.RectBivariateSpline() instances to hold the knot vectors, (X, Y, Z) control point mesh, and degrees in u and v (the (t, c, k) tuple against which surface evaluation is performed). I also wrote a STEP parser to read surface data exported from CAD packages; I take the (t, c, k) values from the b_spline_surface_with_knots entities in the file and stuff them into my own objects. The surface library works pretty well for me, but the STEP parser is a pain and fails in various ways almost every time I use it. So I've tried using a 'real' STEP parser, like this:

from OCC.STEPControl import STEPControl_Reader
from OCC.IFSelect import IFSelect_RetDone, IFSelect_ItemsByEntity

step_reader = STEPControl_Reader()
status = step_reader.ReadFile('c:/LPT/nomdata/lpt3.stp')

if status == IFSelect_RetDone:  # check status
    failsonly = False
    step_reader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity)
    step_reader.PrintCheckTransfer(failsonly, IFSelect_ItemsByEntity)

    ok = step_reader.TransferRoot(1)
    _nbs = step_reader.NbShapes()
    aResShape = step_reader.Shape(1)
else:
    print("Error: can't read file.")
    sys.exit(0)

Now I have this aResShape object, but no amount of poking and prodding it in IPython (nor googling) reveals how to get at the (t, c, k) values that define the surface.

Can someone please point me to the method that will reveal these values? Or is there possibly another Python-based STEP parser that's a little less opaque?

Upvotes: 4

Views: 1339

Answers (1)

Fernando
Fernando

Reputation: 535

The question is a bit old, but just in case anybody else hits here with a similar problem...

The result of step_reader.Shape() is a TopoDS_Shape, which is a topological entity which can be divided into the following component topologies:

  • Vertex – a zero-dimensional shape corresponding to a point in geometry;
  • Edge – a shape corresponding to a curve, and bound by a vertex at each extremity;
  • Wire – a sequence of edges connected by their vertices;
  • Face – part of a plane (in 2D geometry) or a surface (in 3D geometry) bounded by a closed wire;
  • Shell – a collection of faces connected by some edges of their wire boundaries;
  • Solid – a part of 3D space bound by a shell;
  • Compound solid – a collection of solids.

Tipically, you'd query it with the method TopoDS_Shape::ShapeType() in order know what is that shape (vertex? edge?, ...).

If the model is formed by a single b-spline surface, the shape then should be a TopoDS_Face, that you can get by calling:

face = aResShape.Face();

Once you have the TopoDS_Face at hand, you can get the underlying geometry (Geom_Surface) like this:

surface = BRepAdaptor_Surface(face).Surface().BSpline();

Now that you have had access to the underlying geometry, you can call this object's methods and they will provide you with the information you need.

They are documented here:

OpenCASCADE documentation may seem confusing, but I think you might be interested on this topic:

Hope it helps.

Upvotes: 2

Related Questions