# Test KindOfShape method for Edges import math import salome from inspect import getfile from os.path import abspath, dirname, join salome.salome_init_without_session() import GEOM from salome.geom import geomBuilder geompy = geomBuilder.New() def isEqual(v1, v2, tol=1.e-5): return abs(v1 - v2) < tol def isEqualPoint(p1, p2, tol=1.e-5): return isEqual(p1[0], p2[0], tol) and isEqual(p1[1], p2[1], tol) and isEqual(p1[2], p2[2], tol) def assertEqualType(props, t): assert (props[0]==t), f"Expected type {t}, but was {props[0]}" def checkSegment(props, p1, p2): assertEqualType(props, geompy.kind.SEGMENT) p = props[1:4] assert isEqualPoint(p, p1), f"Expected SEGMENT start point ({p1[0]:.4f}, {p1[1]:.4f}, {p1[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[4:7] assert isEqualPoint(p, p2), f"Expected SEGMENT end point ({p2[0]:.4f}, {p2[1]:.4f}, {p2[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" def checkCircle(props, c, d, r): assertEqualType(props, geompy.kind.CIRCLE) p = props[1:4] assert isEqualPoint(p, c), f"Expected CIRCLE center point ({c[0]:.4f}, {c[1]:.4f}, {c[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[4:7] assert isEqualPoint(p, d), f"Expected CIRCLE direction ({d[0]:.4f}, {d[1]:.4f}, {d[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" assert isEqual(props[7], r), f"Expected CIRCLE radius {r:.4f}, but was {props[7]:.4f}" def checkArcCircle(props, c, d, r, p1, p2): assertEqualType(props, geompy.kind.ARC_CIRCLE) p = props[1:4] assert isEqualPoint(p, c), f"Expected ARC_CIRCLE center point ({c[0]:.4f}, {c[1]:.4f}, {c[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[4:7] assert isEqualPoint(p, d), f"Expected ARC_CIRCLE direction ({d[0]:.4f}, {d[1]:.4f}, {d[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" assert isEqual(props[7], r), f"Expected ARC_CIRCLE radius {r:.4f}, but was {props[7]:.4f}" p = props[8:11] assert isEqualPoint(p, p1), f"Expected ARC_CIRCLE start point ({p1[0]:.4f}, {p1[1]:.4f}, {p1[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[11:14] assert isEqualPoint(p, p2), f"Expected ARC_CIRCLE end point ({p2[0]:.4f}, {p2[1]:.4f}, {p2[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" def checkEllipse(props, c, d, r1, r2, vx, vy): assertEqualType(props, geompy.kind.ELLIPSE) p = props[1:4] assert isEqualPoint(p, c), f"Expected ELLIPSE center point ({c[0]:.4f}, {c[1]:.4f}, {c[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[4:7] assert isEqualPoint(p, d), f"Expected ELLIPSE direction ({d[0]:.4f}, {d[1]:.4f}, {d[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" assert isEqual(props[7], r1), f"Expected ELLIPSE major radius {r1:.4f}, but was {props[7]:.4f}" assert isEqual(props[8], r2), f"Expected ELLIPSE minor radius {r2:.4f}, but was {props[8]:.4f}" p = props[9:12] assert isEqualPoint(p, vx), f"Expected ELLIPSE x-direction ({vx[0]:.4f}, {vx[1]:.4f}, {vx[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[12:15] assert isEqualPoint(p, vy), f"Expected ELLIPSE y-direction ({vy[0]:.4f}, {vy[1]:.4f}, {vy[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" def checkArcEllipse(props, c, d, r1, r2, p1, p2, vx, vy): assertEqualType(props, geompy.kind.ARC_ELLIPSE) p = props[1:4] assert isEqualPoint(p, c), f"Expected ARC_ELLIPSE center point ({c[0]:.4f}, {c[1]:.4f}, {c[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[4:7] assert isEqualPoint(props[4:7], d), f"Expected ARC_ELLIPSE direction ({d[0]:.4f}, {d[1]:.4f}, {d[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" assert isEqual(props[7], r1), f"Expected ARC_ELLIPSE major radius {r1:.4f}, but was {props[7]:.4f}" assert isEqual(props[8], r2), f"Expected ARC_ELLIPSE minor radius {r2:.4f}, but was {props[8]:.4f}" p = props[9:12] assert isEqualPoint(props[9:12], p1), f"Expected ARC_ELLIPSE start point ({p1[0]:.4f}, {p1[1]:.4f}, {p1[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[12:15] assert isEqualPoint(props[12:15], p2), f"Expected ARC_ELLIPSE end point ({p2[0]:.4f}, {p2[1]:.4f}, {p2[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[15:18] assert isEqualPoint(props[15:18], vx), f"Expected ARC_ELLIPSE x-direction ({vx[0]:.4f}, {vx[1]:.4f}, {vx[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[18:21] assert isEqualPoint(props[18:21], vy), f"Expected ARC_ELLIPSE y-direction ({vy[0]:.4f}, {vy[1]:.4f}, {vy[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" def checkHyperbola(props, c, d, r1, r2, vx, vy): assertEqualType(props, geompy.kind.HYPERBOLA) p = props[1:4] assert isEqualPoint(p, c), f"Expected HYPERBOLA center point ({c[0]:.4f}, {c[1]:.4f}, {c[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[4:7] assert isEqualPoint(p, d), f"Expected HYPERBOLA direction ({d[0]:.4f}, {d[1]:.4f}, {d[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" assert isEqual(props[7], r1), f"Expected HYPERBOLA major radius {r1:.4f}, but was {props[7]:.4f}" assert isEqual(props[8], r2), f"Expected HYPERBOLA minor radius {r2:.4f}, but was {props[8]:.4f}" p = props[9:12] assert isEqualPoint(p, vx), f"Expected HYPERBOLA x-direction ({vx[0]:.4f}, {vx[1]:.4f}, {vx[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[12:15] assert isEqualPoint(p, vy), f"Expected HYPERBOLA y-direction ({vy[0]:.4f}, {vy[1]:.4f}, {vy[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" def checkParabola(props, c, d, f, vx, vy): assertEqualType(props, geompy.kind.PARABOLA) p = props[1:4] assert isEqualPoint(p, c), f"Expected PARABOLA center point ({c[0]:.4f}, {c[1]:.4f}, {c[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[4:7] assert isEqualPoint(p, d), f"Expected PARABOLA direction ({d[0]:.4f}, {d[1]:.4f}, {d[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" assert isEqual(props[7], f), f"Expected PARABOLA focal length {f:.4f}, but was {props[7]:.4f}" p = props[8:11] assert isEqualPoint(p, vx), f"Expected PARABOLA x-direction ({vx[0]:.4f}, {vx[1]:.4f}, {vx[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" p = props[11:14] assert isEqualPoint(p, vy), f"Expected PARABOLA y-direction ({vy[0]:.4f}, {vy[1]:.4f}, {vy[2]:.4f}), but was ({p[0]:.4f}, {p[1]:.4f}, {p[2]:.4f})" def assertPoles(props, np, pfirst, poles): n = len(poles) assert (n<=np), f"Too much poles given ({n}), but should not be more than {np}" for i in range(0,n-1): p1 = poles[i] p2 = props[pfirst+i*3:pfirst+(i+1)*3] assert isEqualPoint(p1, p2), f"Expected pole #{i+1} ({p1[0]:.4f}, {p1[1]:.4f}, {p1[2]:.4f}), but was ({p2[0]:.4f}, {p2[1]:.4f}, {p2[2]:.4f})" def assertKnots(props, nk, kfirst, knots): n = len(knots) assert (n<=nk), f"Too much knots given ({n}), but should not be more than {nk}" try: for i in range(0,n-1): assert isEqual(knots[i], props[kfirst+i]), f"Expected knot #{i+1} {knots[i]:.4f}, but was {props[kfirst+i]:.4f}" except: assert("Number of knots does not match expected number") def assertWeights(props, nw, wfirst, weights): n = len(weights) assert (n<=nw), f"Too much weights given ({n}), but should not be more than {nw}" try: for i in range(0,n-1): assert isEqual(weights[i], props[wfirst+i]), f"Expected weight #{i+1} {weights[i]:.4f}, but was {props[wfirst+i]:.4f}" except: assert("Number of weights does not match expected number") def assertMultiplicities(props, nm, mfirst, multis): n = len(multis) assert (n<=nm), f"Too much multiplicities given ({n}), but should not be more than {nm}" try: for i in range(0,n-1): assert isEqual(multis[i], props[mfirst+i]), f"Expected multiplicity #{i+1} {multis[i]:.4f}, but was {props[mfirst+i]:.4f}" except: assert("Number of multiplicities does not match expected number") def checkBSpline(props, period, deg, np, nk, nw, nm, poles=[], knots=[], weights=[], multis=[]): assertEqualType(props, geompy.kind.CRV_BSPLINE) assert (period==props[1]), f"Expected CRV_BSPLINE periodicity ({period}), but was ({props[1]})" assert (deg==props[2]), f"Expected CRV_BSPLINE degree ({deg}), but was ({props[2]})" assert (np==props[3]), f"Expected CRV_BSPLINE number of poles ({np}), but was ({props[3]})" assert (nk==props[4]), f"Expected CRV_BSPLINE number of knots ({nk}), but was ({props[4]})" assert (nw==props[5]), f"Expected CRV_BSPLINE number of weights ({nw}), but was ({props[5]})" assert (nm==props[6]), f"Expected CRV_BSPLINE number of multiplicities ({nm}), but was ({props[6]})" if poles and len(poles): assertPoles(props, np, 7, poles) if knots and len(knots): assertKnots(props, nk, 7+3*np, knots) if weights and len(weights): assertWeights(props, nw, 7+3*np+nk, weights) def checkBezier(props, np, nw, poles=[]): assertEqualType(props, geompy.kind.CRV_BEZIER) assert (np==props[1]), f"Expected CRV_BEZIER number of poles ({np}), but was ({props[1]})" assert (nw==props[2]), f"Expected CRV_BEZIER number of weights ({nw}), but was ({props[2]})" if poles and len(poles): assertPoles(props, np, 3, poles) data_dir = abspath(join(dirname(getfile(lambda: None)), 'data')) O = geompy.MakeVertex(0, 0, 0) OX = geompy.MakeVectorDXDYDZ(1, 0, 0) OY = geompy.MakeVectorDXDYDZ(0, 1, 0) OZ = geompy.MakeVectorDXDYDZ(0, 0, 1) Vertex_1 = geompy.MakeVertex(0, 0, 0) Vertex_2 = geompy.MakeVertex(50, 100, 0) Vertex_3 = geompy.MakeVertex(-10, 60, 0) Vertex_4 = geompy.MakeVertex(0, 100, 0) Vertex_5 = geompy.MakeVertex(-100, 100, 0) Vertex_6 = geompy.MakeVertex(-100, 0, 0) Vertex_7 = geompy.MakeVertex(-200, 0, 0) Vertex_8 = geompy.MakeVertex(-200, 100, 0) # create or import some curves Line_1 = geompy.MakeLineTwoPnt(Vertex_1, Vertex_2) Circle_1 = geompy.MakeCircle(Vertex_2, OZ, 50) Ellipse_1 = geompy.MakeEllipse(Vertex_1, OZ, 200, 100, Line_1) Arc_1 = geompy.MakeArc(Vertex_2, Vertex_3, Vertex_1) Curve_1 = geompy.MakeCurveParametric("t", "50*sin(t)", "0", 0, 360, 30, GEOM.Interpolation, True) Curve_2 = geompy.MakeCurveParametric("-t", "50*cos(t)", "t", 0, 360, 14, GEOM.Bezier, True) Curve_3 = geompy.ImportBREP(join(data_dir, "KindOfShape_Curve3.brep")) Curve_4 = geompy.ImportBREP(join(data_dir, "KindOfShape_Curve4.brep")) Curve_5 = geompy.MakeInterpol([Vertex_1, Vertex_4, Vertex_5, Vertex_6, Vertex_7, Vertex_8], False, False) Curve_6 = geompy.ImportBREP(join(data_dir, "KindOfShape_Curve6.brep")) Curve_7 = geompy.MakeBezier([Vertex_5, Vertex_6, Vertex_7, Vertex_8], True) Curve_8 = geompy.MakeBezier([Vertex_5, Vertex_6, Vertex_1, Vertex_4], False) Curve_9 = geompy.ImportBREP(join(data_dir, "KindOfShape_Curve9.brep")) Curve_10 = geompy.ImportBREP(join(data_dir, "KindOfShape_Curve10.brep")) # check all curves props = geompy.KindOfShape(Line_1) # [SEGMENT, 0.,0.,0., 50.,100.,0.] checkSegment(props, [0,0,0], [50,100,0]) props = geompy.KindOfShape(Circle_1) # [CIRCLE, 50.,100.,0., 0.,0.,1., 50.] checkCircle(props, [50,100,0], [0,0,1], 50) props = geompy.KindOfShape(Ellipse_1) # [ELLIPSE, 0.,0.,0., 0.,0.,1., 200., 100., 0.44721,0.89443,0., 0.44721,0.89443,0.] checkEllipse(props, [0,0,0], [0,0,1], 200, 100, [0.4472136,0.8944272,0], [-0.8944272,0.4472136,0]) props = geompy.KindOfShape(Arc_1) # [ARC_CIRCLE, 47.5,38.75,0., 0.,0.,1., 61.301, 50.,100.,0., 0.,0.,0.] checkArcCircle(props, [47.5,38.75,0], [0,0,1], 61.301, [50,100,0], [0,0,0]) props = geompy.KindOfShape(Curve_1) # [CRV_BSPLINE, 0, 3, 33, 31, 0, 31, 0.,0.,0.,..., 4,1,...,1,4] checkBSpline(props, 0, 3, 33, 31, 0, 31, [[0,0,0],[5.246092,-6.374961,0],[10.613646,-25.338811,0],[19.662636,-44.299221,0]], [0,29.39007,51.399444,64.149986], [], [4,1,1,1,1]) props = geompy.KindOfShape(Curve_2) # [CRV_BEZIER, 15, 0, 0.,50.,0.,...,-360.,-14.18455,360.] checkBezier(props, 15, 0, [[0,50,0],[-25.714286,41.780762,25.714286],[-51.428571,19.825283,51.428571],[-77.142857,-8.648146,77.142857]]) props = geompy.KindOfShape(Curve_3) # [CRV_BSPLINE, 1, 3, 8, 9, 0, 0, -100.,0.,0.,..., 0.,1.,2.,3.,4.,5.,6.,7.,8.] checkBSpline(props, 1, 3, 8, 9, 0, 0, [[-100,0,0],[-200,200,0],[0,100,0],[200,200,0],[100,0,0],[200,-200,0],[0,-100,0],[-200,-200,0]], [0,1,2,3,4,5,6,7,8]) props = geompy.KindOfShape(Curve_4) # [CRV_BSPLINE, 1, 2, 3, 4, 3, 0, 0.,0.,0., 100.,200.,0., 200.,0.,0., 0,1,2,3, 200.,100.,100.] checkBSpline(props, 1, 2, 3, 4, 3, 0, [[0,0,0],[100,200,0],[200,0,0]], [0,1,2,3], [200,100,100]) props = geompy.KindOfShape(Curve_5) # [CRV_BSPLINE, 0, 3, 8, 6, 0, 6, 0.,0.,0.,..., 100.,0.,0.,100.,200.,300.,400.,500., 4,1,1,1,1,4] checkBSpline(props, 0, 3, 8, 6, 0, 6, [[0,0,0],[38.888889,50,0],[23.684211,113.157895,0]], [0,100,200,300,400,500], [], [4,1,1,1,1,4]) props = geompy.KindOfShape(Curve_6) # [ARC_ELLIPSE, -18.46154,0.,64.61538, 0.57668,0.,-0.81697, 96.03993, 76.25867, 50.,-37.25439,112.94118, 50.,37.25439,112.94118, -0.81697,0.,-0.57668, 0.,1.,0.] checkArcEllipse(props, [-18.46154,0,64.61538], [0.57668,0,-0.81697], 96.03993, 76.25867, [50,-37.25439,112.94118], [50,37.25439,112.94118], [-0.81697,0,-0.57668], [0,1,0]) props = geompy.KindOfShape(Curve_7) # [CRV_BEZIER, 5, 0, -100.,100.,0., -100.,0.,0., -200.,0.,0., -200.,100.,0., -100.,100.,0.] checkBezier(props, 5, 0, [[-100,100,0],[-100,0,0],[-200,0,0],[-200,100,0],[-100,100,0]]) props = geompy.KindOfShape(Curve_8) # [CRV_BEZIER, 4, 0, -100.,100.,0., -100.,0.,0., 0.,0.,0., 0.,100.,0.] checkBezier(props, 4, 0, [[-100,100,0],[-100,0,0],[0,0,0],[0,100,0]]) props = geompy.KindOfShape(Curve_9) # [HYPERBOLA, -50., 0., 300., 1., 0., 0., 75., 50., 0., 0., -1., 0., 1., 0.] checkHyperbola(props, [-50,0,300], [1,0,0], 75, 50, [0,0,-1], [0,1,0]) props = geompy.KindOfShape(Curve_10) # [PARABOLA, -25.,0.,262.5, -0.83205,0.,-0.5547, 13.8675, 0.5547,0.,-0.83205, 0.,-1.,0.] checkParabola(props, [-25,0,262.5], [-0.83205,0,-0.5547], 13.867505, [0.5547,0,-0.83205], [0,-1,0])