Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion bindings/Sofa/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
project(Bindings.Sofa)

set(SOFABINDINGS_MODULE_LIST Core Helper Simulation Types)
set(SOFABINDINGS_MODULE_LIST
Components
Core
Helper
Simulation
Types
)

foreach(sofabindings_module ${SOFABINDINGS_MODULE_LIST})
add_subdirectory(src/SofaPython3/Sofa/${sofabindings_module})
Expand Down
2 changes: 1 addition & 1 deletion bindings/Sofa/package/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
import Sofa.Core
import Sofa.Simulation
import Sofa.Types
# import Sofa.Components
import Sofa.Components
import SofaTypes

from .prefab import *
Expand Down
8 changes: 7 additions & 1 deletion bindings/Sofa/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,13 @@ sofa_auto_set_target_rpath(

add_test(NAME ${PROJECT_NAME} COMMAND ${PROJECT_NAME})

set(DIR_BINDING_LIST Components Core Helper Simulation Types)
set(DIR_BINDING_LIST
Components
Core
Helper
Simulation
Types
)
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
foreach(dir_binding ${DIR_BINDING_LIST})
if (_isMultiConfig) # MSVC
Expand Down
22 changes: 13 additions & 9 deletions bindings/Sofa/tests/Core/Base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
import Sofa
import unittest

def create_scene(rootName="root"):
root = Sofa.Core.Node(rootName)
root.addObject("RequiredPlugin", name="SofaBaseMechanics")
return root

class Test(unittest.TestCase):
def test_data_property(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
c = root.addObject("MechanicalObject", name="t", position=[
[0, 0, 0], [1, 1, 1], [2, 2, 2]])
self.assertTrue(hasattr(c, "__data__"))
Expand All @@ -17,7 +21,7 @@ def test_data_property(self):
self.assertTrue(isinstance(c.__data__, Sofa.Core.DataDict))

def test_loggedMessagesBinding(self):
node = Sofa.Core.Node("a_node")
node = create_scene("a_node")
self.assertEqual(node.getLoggedMessagesAsString(), "")
Sofa.msg_info(node, "This is a new message")
self.assertTrue("This is a new message" in node.getLoggedMessagesAsString())
Expand All @@ -26,7 +30,7 @@ def test_loggedMessagesBinding(self):
self.assertEqual(node.countLoggedMessages(), 0)

def test_addNewData_with_type(self):
node = Sofa.Core.Node("a_node")
node = create_scene("a_node")
obj = node.addObject("MechanicalObject", name="an_object", position=[
[0, 0, 0], [1, 1, 1], [2, 2, 2]])
# Check PSDEObjectFactory to see available types
Expand All @@ -42,13 +46,13 @@ def test_addNewData_with_type(self):
self.assertEqual(obj.myData.value, 42)

def test_addKeywordProtected(self):
node = Sofa.Core.Node("a_node")
node = create_scene("a_node")
self.assertRaises(ValueError, node.addObject, "MechanicalObject", name="children", position=[[0,0,0],[1,1,1],[2,2,2]])
self.assertRaises(ValueError, node.addChild, "parents")
self.assertRaises(ValueError, node.addData, name="links", type="int", value=42)

def test_addNewDataFromParent_linkPaths(self):
root = Sofa.Core.Node('root')
root = create_scene('root')
c1 = root.addObject("MechanicalObject", name="c1")
c1.addData("d", value="coucou", type="string")

Expand Down Expand Up @@ -79,7 +83,7 @@ def test_addNewDataFromParent_linkPaths(self):


def test_addNewDataFromParent(self):
root = Sofa.Core.Node('root')
root = create_scene('root')
c1 = root.addObject("MechanicalObject", name="c1")
c1.addData("d", value="coucou", type="string")
c1.addData("d2", value="@c1.d")
Expand All @@ -97,7 +101,7 @@ def test_addNewDataFromParent(self):


def test_addNewDataFromParent_brokenLink(self):
root = Sofa.Core.Node('root')
root = create_scene('root')
c1 = root.addObject("MechanicalObject", name="c1")

ValueError_ToTest = ["@aBroken/path.value", "@aBroken/path", "@/aBroken/path", "@", "@.", "@/", "@./", "@../"]
Expand All @@ -111,11 +115,11 @@ def test_addNewDataFromParent_brokenLink(self):
self.assertRaises(TypeError, c1.addData, name="d", value=val)

def test_getClassName(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
self.assertEqual(root.getClassName(), "DAGNode")

def test_getTemplateName(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
c = root.addObject("MechanicalObject", name="t")
self.assertEqual(c.getTemplateName(),"Vec3d")

Expand Down
62 changes: 33 additions & 29 deletions bindings/Sofa/tests/Core/BaseData.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,15 @@ def testValue(self, test):
test.assertEqual(repr(self.vector_text_3entries),
repr(["v1", "v2", "v3"]))

def create_scene(rootName="root"):
root = Sofa.Core.Node(rootName)
root.addObject("RequiredPlugin", name="SofaBaseMechanics")
return root

class Test(unittest.TestCase):

def test_getattr(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
c = root.addObject("MechanicalObject", name="c")
self.assertEqual(str(type(c.position)), "<class 'Sofa.Core.DataContainer'>")
c.addData("d1", type="string", value="coucou")
Expand All @@ -108,27 +112,27 @@ def test_getattr(self):
self.assertEqual(str(type(c.bbox)), "<class 'Sofa.Types.BoundingBox'>")

def test_typeName(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
c = root.addObject("MechanicalObject", name="t", position=[
[0, 0, 0], [1, 1, 1], [2, 2, 2]])
self.assertEqual(c.position.typeName(), "vector<Vec3d>")
self.assertEqual(c.showColor.typeName(), "RGBAColor")

# @unittest.skip # no reason needed
def test_ValidDataAccess(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
c = root.addObject("MechanicalObject", name="t", position=[
[0, 0, 0], [1, 1, 1], [2, 2, 2]])
self.assertTrue(c.position is not None)

# @unittest.skip # no reason needed
def test_InvalidDataAccess(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
self.assertRaises(AttributeError, getattr, root, "invalidData")

# @unittest.skip # no reason needed
def test_DataAsArray2D(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
c = root.addObject("MechanicalObject", name="t", position=v)
self.assertEqual(len(c.position.value), 3)
Expand All @@ -139,7 +143,7 @@ def test_DataAsArray2D(self):
# @unittest.skip # no reason needed
def test_DataArray2DSetFromList(self):
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
c = root.addObject("MechanicalObject", name="t", position=v)
c.position = [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4]]
numpy.testing.assert_array_equal(c.position.array(), [[1.0, 1.0, 1.0], [
Expand All @@ -148,7 +152,7 @@ def test_DataArray2DSetFromList(self):
# @unittest.skip # no reason needed
def test_DataArray2DResizeFromArray(self):
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
c = root.addObject("MechanicalObject", name="t", position=v)
zeros = numpy.zeros((100, 3), dtype=numpy.float64)
c.position.value = zeros
Expand All @@ -157,7 +161,7 @@ def test_DataArray2DResizeFromArray(self):
# @unittest.skip # no reason needed
def test_DataArray2DInvalidResizeFromArray(self):
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
c = root.addObject("MechanicalObject", name="t", position=v)
zeros = numpy.zeros((4, 100), dtype=numpy.float64)

Expand All @@ -168,7 +172,7 @@ def d():
# @unittest.skip # no reason needed
def test_DataArray2DSetFromArray(self):
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4]]
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
c = root.addObject("MechanicalObject", name="t", position=v)

zeros = numpy.zeros((500, 3), dtype=numpy.float64)
Expand All @@ -185,15 +189,15 @@ def test_DataArray2DSetFromArray(self):

@unittest.skip # no reason needed
def test_DataArray2DElementWiseOperation(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
m = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]
c = root.addObject("MechanicalObject", name="t", position=v)
c.position.value *= c.position.value

def test_UnknowAttribute(self):
""" Access a non-existing attribute of a data field so this should trigger AttributeError"""
root = Sofa.Core.Node("root") # < Create a new node
root = create_scene("root") # < Create a new node
# < Create a new object
c = root.addObject("MechanicalObject", name="t")
p = c.position.value # < Retrive its position
Expand All @@ -205,7 +209,7 @@ def test_UnknowAttribute(self):
# @unittest.skip # no reason needed

def test_DataArray2DOperation(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
v = numpy.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
c = root.addObject("MechanicalObject", name="t", position=v.tolist())
c2 = c.position.value * 2.0
Expand All @@ -219,7 +223,7 @@ def test_DataArray2DOperation(self):

# @unittest.skip # no reason needed
def test_DataAsArray1D(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
c = root.addObject("MechanicalObject", name="t",
position=v, showColor=[0.42, 0.1, 0.9, 1.0])
Expand All @@ -228,7 +232,7 @@ def test_DataAsArray1D(self):

# @unittest.skip # no reason needed
def test_DataWrapper1D(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
v = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
root.addObject("MechanicalObject", name="obj", position=v)

Expand All @@ -245,7 +249,7 @@ def t(c):
self.assertRaises(ValueError, (lambda c: t(c)), color)

def test_DataAsContainerNumpyArray_(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
v = numpy.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
c = root.addObject("MechanicalObject", name="t", position=v.tolist())
Sofa.Simulation.init(root)
Expand All @@ -258,7 +262,7 @@ def test_DataAsContainerNumpyArray_(self):
numpy.testing.assert_array_equal(c.position.array(), v)

def test_DataAsContainerNumpyArrayRepeat(self):
root = Sofa.Core.Node("rootNode")
root = create_scene("rootNode")
v = numpy.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
c = root.addObject("MechanicalObject", name="t", position=v.tolist())

Expand Down Expand Up @@ -289,13 +293,13 @@ def t(c):
numpy.testing.assert_array_equal(wa, v*4.0)

def test_DataString(self):
n = Sofa.Core.Node("rootNode")
n = create_scene("rootNode")
self.assertTrue(isinstance(n.name, Sofa.Core.DataString))
self.assertEqual(n.name.value, "rootNode")
self.assertEqual(len(n.name), 8)

def test_DataAsContainerNumpyArray(self):
n = Sofa.Core.Node("rootNode")
n = create_scene("rootNode")
c = n.addObject(NpArrayTestController(name="c"))

c.testLen(self)
Expand All @@ -305,37 +309,37 @@ def test_DataAsContainerNumpyArray(self):
c.testValue(self)

def test_name(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
root.addData(name="aField", value=1.0 , help="help message",group="theDataGroup", type="float")
data = root.getData("aField")
self.assertEqual(data.getName(),"aField")
data.setName("aNewField")
self.assertEqual(data.getName(),"aNewField")

def test_getValueString(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
c = root.addObject("MechanicalObject", name="t", position=[[0,1,0]])
self.assertEqual(c.position.getValueString(),"0 1 0")

def test_getValueTypeString(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
c = root.addObject("MechanicalObject", name="t", position=[[0,1,0]])
self.assertEqual(c.position.getValueTypeString(),"vector<Vec3d>")

def test_isRequired(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
self.assertFalse(root.name.isRequired())

def test_Persistent(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
root.addData(name="aField", value=1.0 , help="help message",group="theDataGroup", type="float")
data = root.getData("aField")
self.assertTrue(data.isPersistent())
data.setPersistent(False)
self.assertFalse(data.isPersistent())

def test_Parent(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
root.addData(name="aField", value=1.0 , help="help message",group="theDataGroup", type="float")
root.addData(name="aFieldParent", value=1.0 , help="help message",group="theDataGroup", type="float")
data = root.getData("aField")
Expand All @@ -346,7 +350,7 @@ def test_Parent(self):
self.assertEqual(data.getParent().getName(),"aFieldParent")

def test_getLinkPath(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
root.addData(name="aField", value=1.0 , help="help message",group="theDataGroup", type="float")
root.addData(name="aFieldParent", value=1.0 , help="help message",group="theDataGroup", type="float")
data = root.getData("aField")
Expand All @@ -356,7 +360,7 @@ def test_getLinkPath(self):
self.assertEqual(dataParent.getLinkPath(),"@/.aFieldParent")

def test_read(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
root.addData(name="aField", value=1.0 , help="help message",group="theDataGroup", type="float")
data = root.getData("aField")
self.assertEqual(data.value,1.0)
Expand All @@ -365,7 +369,7 @@ def test_read(self):
self.assertFalse(data.read("test"))

def test_Dirty(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
root.addData(name="aField", value=1.0 , help="help message",group="theDataGroup", type="float")
root.addData(name="aFieldParent", value=1.0 , help="help message",group="theDataGroup", type="float")
data = root.getData("aField")
Expand All @@ -378,15 +382,15 @@ def test_Dirty(self):
self.assertFalse(data.isDirty())

def test_readOnly(self):
root = Sofa.Core.Node("root")
root = create_scene("root")
root.addData(name="aField", value=1.0 , help="help message",group="theDataGroup", type="float")
data = root.getData("aField")
self.assertFalse(data.isReadOnly())
data.setReadOnly(True)
self.assertTrue(data.isReadOnly())

def test_DownCast(self):
root = Sofa.Core.Node('root')
root = create_scene('root')
self.assertEqual(type(root.name), Sofa.Core.DataString)
self.assertEqual(type(root.gravity), Sofa.Core.DataContainer)
self.assertEqual(type(root.dt), Sofa.Core.Data)
Loading