mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-26 01:10:36 +05:00
213 lines
7.1 KiB
Python
213 lines
7.1 KiB
Python
# Test XYZtoUV and UVtoXYZ methods
|
|
|
|
import salome
|
|
salome.salome_init_without_session()
|
|
import GEOM
|
|
from salome.geom import geomBuilder
|
|
geompy = geomBuilder.New()
|
|
import math
|
|
import numpy as np
|
|
|
|
toler = 1e-04
|
|
|
|
# Create "Horse saddle"
|
|
OX = geompy.MakeVectorDXDYDZ(1, 0, 0, 'OX')
|
|
OY = geompy.MakeVectorDXDYDZ(0, 1, 0, 'OY')
|
|
Sphere_1 = geompy.MakeSphereR(100, 'Sphere_1')
|
|
[Edge_1,Edge_2,Edge_3] = geompy.ExtractShapes(Sphere_1, geompy.ShapeType["EDGE"], True)
|
|
geompy.addToStudyInFather( Sphere_1, Edge_1, 'Edge_1' )
|
|
geompy.addToStudyInFather( Sphere_1, Edge_2, 'Edge_2' )
|
|
geompy.addToStudyInFather( Sphere_1, Edge_3, 'Edge_3' )
|
|
|
|
Rotation_1 = geompy.MakeRotation(Edge_3, OX, 90*math.pi/180.0, 'Rotation_1')
|
|
Rotation_2 = geompy.MakeRotation(Rotation_1, OY, 180*math.pi/180.0, 'Rotation_2')
|
|
Translation_1 = geompy.MakeTranslation(Rotation_2, 200, 0, 0, 'Translation_1')
|
|
Translation_2 = geompy.MakeTranslation(Edge_3, 100, 100, 0, 'Translation_2')
|
|
Translation_3 = geompy.MakeTranslation(Translation_2, 0, -200, 0, 'Translation_3')
|
|
|
|
Filling_1 = geompy.MakeFilling([Translation_2, Edge_3, Translation_3])
|
|
geompy.addToStudy(Filling_1, 'Filling_1')
|
|
|
|
HorseSaddle = geompy.LimitTolerance(Filling_1, toler, 'HorseSaddle')
|
|
|
|
# Get 100 equidistant points on the "Horse saddle"
|
|
CompoundOfVertices = geompy.MakeVertexInsideFace(HorseSaddle, 100, "CompoundOfVertices")
|
|
assert(geompy.NumberOfSubShapes(CompoundOfVertices, geompy.ShapeType["VERTEX"]) == 100)
|
|
|
|
# Extract the vertices
|
|
listOfVertices = geompy.ExtractShapes(CompoundOfVertices, geompy.ShapeType["VERTEX"], True)
|
|
|
|
# Get list of coordinates of all 100 vertices
|
|
listOfCoords = []
|
|
for aV in listOfVertices:
|
|
listOfCoords += geompy.PointCoordinates(aV)
|
|
pass
|
|
|
|
# Test 1: with normalization of parameters
|
|
|
|
# Convert XYZ to UV
|
|
listOfParams_norm = geompy.XYZtoUV(HorseSaddle, listOfCoords, True)
|
|
assert(len(listOfParams_norm) == 200)
|
|
|
|
# Convert UV to XYZ
|
|
listOfCoords_new1 = geompy.UVtoXYZ(HorseSaddle, listOfParams_norm, True)
|
|
assert(len(listOfCoords_new1) == 300)
|
|
|
|
# Compare listOfCoords_new with listOfCoords
|
|
for (c1, c2) in zip(listOfCoords, listOfCoords_new1):
|
|
assert(abs(c1 - c2) < toler)
|
|
pass
|
|
|
|
# Test 2: without normalization of parameters
|
|
|
|
# Convert XYZ to UV
|
|
listOfParams = geompy.XYZtoUV(HorseSaddle, listOfCoords, False)
|
|
assert(len(listOfParams) == 200)
|
|
|
|
# Convert UV to XYZ
|
|
listOfCoords_new2 = geompy.UVtoXYZ(HorseSaddle, listOfParams, False)
|
|
assert(len(listOfCoords_new2) == 300)
|
|
|
|
# Compare listOfCoords_new with listOfCoords
|
|
for (c1, c2) in zip(listOfCoords, listOfCoords_new2):
|
|
assert(abs(c1 - c2) < toler)
|
|
pass
|
|
|
|
# Test 3: Check exceptions throwing if point (XYZ or UV) is out of face
|
|
listXYZ_3 = listOfCoords[:3]
|
|
listXYZ_3[2] = listXYZ_3[2] + 1.0 # move along OZ
|
|
try:
|
|
geompy.XYZtoUV(HorseSaddle, listXYZ_3, True)
|
|
except RuntimeError:
|
|
print(geompy.MeasuOp.GetErrorCode(), ", it's OK")
|
|
pass
|
|
except Exception:
|
|
assert False, 'Unexpected exception raised'
|
|
else:
|
|
assert False, 'XYZtoUV should raise an exception if input point is out of face'
|
|
|
|
listUV_2 = [2, 2] # each parameter value should be in [0,1] range (for normalized case)
|
|
try:
|
|
geompy.UVtoXYZ(HorseSaddle, listUV_2, True)
|
|
except RuntimeError:
|
|
print(geompy.MeasuOp.GetErrorCode(), ", it's OK")
|
|
pass
|
|
except Exception:
|
|
assert False, 'Unexpected exception raised'
|
|
else:
|
|
assert False, 'UVtoXYZ should raise an exception if input parameters are out of face'
|
|
|
|
# parameter U should be in [4.71239, 7.85398] range (on this face, for not normalized case)
|
|
# parameter V should be in [0, 1] range (on this face, for not normalized case)
|
|
listUV_2 = [10, 10]
|
|
try:
|
|
geompy.UVtoXYZ(HorseSaddle, listUV_2, True)
|
|
except RuntimeError:
|
|
print(geompy.MeasuOp.GetErrorCode(), ", it's OK")
|
|
pass
|
|
except Exception:
|
|
assert False, 'Unexpected exception raised'
|
|
else:
|
|
assert False, 'UVtoXYZ should raise an exception if input parameters are out of face'
|
|
|
|
# Test 4: Check exceptions in case of invalid data type (wrong length of array or type of elements)
|
|
|
|
# 1. Length of input array is not divisible by 3 (for XYZtoUV) or by 2 (for UVtoXYZ)
|
|
listXYZ_4 = listOfCoords[:4]
|
|
assert(len(listXYZ_4) == 4)
|
|
try:
|
|
geompy.XYZtoUV(HorseSaddle, listXYZ_4, True)
|
|
except RuntimeError:
|
|
print(geompy.MeasuOp.GetErrorCode(), ", it's OK")
|
|
pass
|
|
except Exception:
|
|
assert False, 'Unexpected exception raised'
|
|
else:
|
|
assert False, 'XYZtoUV should raise an exception if input list length is not divisible by 3'
|
|
|
|
listUV_3 = listOfParams[:3]
|
|
assert(len(listUV_3) == 3)
|
|
try:
|
|
geompy.UVtoXYZ(HorseSaddle, listUV_3, True)
|
|
except RuntimeError:
|
|
print(geompy.MeasuOp.GetErrorCode(), ", it's OK")
|
|
pass
|
|
except Exception:
|
|
assert False, 'Unexpected exception raised'
|
|
else:
|
|
assert False, 'UVtoXYZ should raise an exception if input list length is not divisible by 2'
|
|
|
|
# 2. Input array contains data of wrong type
|
|
listXYZ_w = ['a', 'b', 'c']
|
|
try:
|
|
geompy.XYZtoUV(HorseSaddle, listXYZ_w, True)
|
|
except Exception:
|
|
pass
|
|
else:
|
|
assert False, 'XYZtoUV should raise TypeError if input list contains not numerical data'
|
|
|
|
listXYZ_w = [10.0, '10.0', 10.0]
|
|
try:
|
|
geompy.XYZtoUV(HorseSaddle, listXYZ_w, True)
|
|
except Exception:
|
|
pass
|
|
else:
|
|
assert False, 'XYZtoUV should raise TypeError if input list contains not numerical data'
|
|
|
|
listUV_w = ['a', 'b']
|
|
try:
|
|
geompy.UVtoXYZ(HorseSaddle, listUV_w, True)
|
|
except Exception:
|
|
pass
|
|
else:
|
|
assert False, 'UVtoXYZ should raise TypeError if input list contains not numerical data'
|
|
|
|
listUV_w = [10.0, '10.0']
|
|
try:
|
|
geompy.UVtoXYZ(HorseSaddle, listUV_w, True)
|
|
except Exception:
|
|
pass
|
|
else:
|
|
assert False, 'UVtoXYZ should raise TypeError if input list contains not numerical data'
|
|
|
|
# Test 5: a. Translate each of the 100 points by toler*2.0 along the face normal
|
|
# and check that the XYZtoUV method fails by raising an exception.
|
|
# b. Translate each of the 100 points by toler*0.7 along the face normal
|
|
# and check that we obtain a result.
|
|
for ii in range(100):
|
|
# cc - coordinates of point #ii
|
|
cc = listOfCoords[ii*3 : ii*3 + 3]
|
|
|
|
pnt = geompy.MakeVertex(cc[0], cc[1], cc[2])
|
|
normal = geompy.GetNormal(HorseSaddle, pnt)
|
|
vv = geompy.VectorCoordinates(normal)
|
|
norm = np.linalg.norm(vv)
|
|
if norm > toler:
|
|
vec = vv / norm
|
|
# a. Move cc by toler*2.0 (XYZtoUV should fail)
|
|
pp_2tol = [cc[0] + vec[0]*toler*2.0,
|
|
cc[1] + vec[1]*toler*2.0,
|
|
cc[2] + vec[2]*toler*2.0]
|
|
try:
|
|
geompy.XYZtoUV(HorseSaddle, pp_2tol)
|
|
except RuntimeError:
|
|
pass
|
|
except Exception:
|
|
assert False, 'Unexpected exception raised'
|
|
else:
|
|
assert False, 'XYZtoUV should raise an exception if input point is out of face'
|
|
pass
|
|
|
|
# b. Move cc by toler*0.7 (XYZtoUV should not fail)
|
|
pp_07tol = [cc[0] + vec[0]*toler*0.7,
|
|
cc[1] + vec[1]*toler*0.7,
|
|
cc[2] + vec[2]*toler*0.7]
|
|
UV_pp = geompy.XYZtoUV(HorseSaddle, pp_07tol, False)
|
|
# compare with value from listOfParams (computed above)
|
|
UV_cc = listOfParams[ii*2 : ii*2 + 2]
|
|
for (c1, c2) in zip(UV_pp, UV_cc):
|
|
assert(abs(c1 - c2) < toler)
|
|
pass
|
|
pass
|
|
pass
|