[PYTHON] 3D ou D dans Py Thon de ~ Spines r Fase ~

Créez une surface spline avec pyhonocc-core (Open CASCADE). Puis crachez-le en STEP.

Code de génération de surface

Le code est this.

La surface rouge et la surface bleue ont la même forme, mais l'emplacement est modifié à l'aide de gp_Ax3.

qiita_002-1.png

Seule la partie importante est extraite.

def spl_face(px, py, pz, axs=gp_Ax3()):
    nx, ny = px.shape
    pnt_2d = TColgp_Array2OfPnt(1, nx, 1, ny)
    for row in range(pnt_2d.LowerRow(), pnt_2d.UpperRow() + 1):
        for col in range(pnt_2d.LowerCol(), pnt_2d.UpperCol() + 1):
            i, j = row - 1, col - 1
            pnt = gp_Pnt(px[i, j], py[i, j], pz[i, j])
            pnt_2d.SetValue(row, col, pnt)
            #print (i, j, px[i, j], py[i, j], pz[i, j])

    api = GeomAPI_PointsToBSplineSurface(pnt_2d, 3, 8, GeomAbs_G2, 0.001)
    api.Interpolate(pnt_2d)
    face = BRepBuilderAPI_MakeFace(api.Surface(), 1e-6).Face()
    face.Location(set_loc(gp_Ax3(), axs))
    return face

Pour px, py, pz, np.array of (n x n) est généré par np.meshgrid, et les données de grille d'une surface courbe appropriée sont entrées comme pz.

Après cela, assignez-le au tableau bidimensionnel de gp_Pnt d'OpenCASCADE appelé TColgp_Array2OfPnt (pour la partie boucle) et alimentez-le dans GeomAPI_PointsToBSplineSurface.

GeomAPI_PointsToBSplineSurface est une fonction qui génère en fait une surface spline, mais pour plus de détails, voir [ici](https://www.opencascade.com/doc/occt-7.4.0/refman/html/class_geom_a_p_i___points_to_b_spline_surface.html#a1b_spline_surface.html#a1b_spline_surface9345123 S'il vous plaît.

Les deux nombres (3,8) après TColgp_Array2OfPnt sont les ordres minimum et maximum du polynôme approximatif qui produit la spline. GeomAbs_G2 définit la douceur. Il existe également GeomAbs_C0, GeomAbs_C1, GeomAbs_C2, GeomAbs_G1 et ainsi de suite. G2 est différenciable de second ordre. Le 0,001 final est l'erreur maximale dans l'approximation, et la surface est générée de sorte que l'erreur entre les points d'entrée et la surface soit inférieure à cette valeur.

Essayez de saisir une valeur anormale pour un seul point

Il n'est pas intéressant de mettre des données de groupe de points propres, alors mettons une valeur anormale dans les données générées.

Le code est ici.

Seule la partie de génération de données est extraite.

px = np.linspace(-1, 1, 100) * 100 + 50
py = np.linspace(-1, 1, 200) * 100 - 50
mesh = np.meshgrid(px, py)
data = mesh[0]**2 / 1000 + mesh[1]**2 / 2000
data[100, 50] = 100.0

Faites du tableau 2D (200 x 100) une forme saillante avec (100,50) à peu près au milieu comme 100,0.

qiita_002-2.png

La forme est anormalement élevée autour du centre. Tant que vous utilisez Spline, la forme de la zone environnante est déformée en étant tirée par la partie saillante. C'est aussi la force d'OpenCAS CADE que même une forme aussi anormale puisse être générée (qu'elle soit correcte ou non).

Recommended Posts

3D ou D dans Py Thon de ~ Spines r Fase ~
3D ou D avec Py