Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Retrieving weights of a rational BSpline surface causes crashing #137

Open
GabrielJMS opened this issue Feb 1, 2024 · 1 comment
Open

Comments

@GabrielJMS
Copy link

The code crashes when we try to access Weigths() method from Geom_BSplineSurface twice or more times.

Searching in the internet I found that they had the same behavior in pyOCCT.

see: trelau/pyOCCT#80
https://github.com/trelau/pyOCCT/pull/84/files#diff-7206418f088df5bcafb72d1a2ef6c5c4773fdd0f0c7bb14be7f5dbfcd4d606e1

from OCP.Geom import Geom_BSplineSurface, Geom_RectangularTrimmedSurface, Geom_SphericalSurface
from OCP.GeomConvert import GeomConvert
from OCP.TColStd import TColStd_Array2OfReal
from OCP.gp import gp_Ax3

# Prepare some geometry to initialize a rational BSpline surface.
spherical_surface = Geom_SphericalSurface(gp_Ax3(), 1.)
surface = Geom_RectangularTrimmedSurface(spherical_surface, 0., 1., 0., 1.)

# Second loop won't be executed due to the crash.
reproduce = True
for k in range(2):
    bspline_surface = GeomConvert.SurfaceToBSplineSurface_s(surface)
    if reproduce:  # causes crashing
        weights = bspline_surface.Weights()
    else:  # workaround
        bspline_surface.Weights(weights := TColStd_Array2OfReal(1, bspline_surface.NbUPoles(), 1, bspline_surface.NbVPoles()))
    values = [[weights.Value(i, j) for j in range(1, 1 + weights.NbColumns())] for i in range(1, 1 + weights.NbRows())] # not essential
    print(k)

I don't know if it's a bug or it's an expected behavior.

@whophil
Copy link

whophil commented Feb 1, 2024

I can reproduce, and I have encountered this before. Yet another workaround is to use bspline_surface.Weight(i, j) directly, e.g.

        values = [[bspline_surface.Weight(i, j) for j in range(1, 1 + bspline_surface.NbUPoles())] for i in range(1, 1 + bspline_surface.NbVPoles())]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants