|
| 1 | +from stlib.geometries.plane import PlaneParameters |
| 2 | +from stlib.geometries.file import FileParameters |
| 3 | +from stlib.geometries.extract import ExtractParameters |
| 4 | +from stlib.materials.deformable import DeformableBehaviorParameters |
| 5 | +from stlib.collision import Collision, CollisionParameters |
| 6 | +from stlib.entities import Entity, EntityParameters |
| 7 | +from stlib.visual import Visual, VisualParameters |
| 8 | +from splib.core.enum_types import CollisionPrimitive, ElementType, ConstitutiveLaw |
| 9 | +from splib.simulation.headers import setupLagrangianHeader, setupDefaultHeader |
| 10 | +from splib.simulation.ode_solvers import addImplicitODE |
| 11 | +from splib.simulation.linear_solvers import addLinearSolver |
| 12 | +import dataclasses |
| 13 | +import numpy as np |
| 14 | + |
| 15 | + |
| 16 | +from stlib.node_modifiers import NodeModifier |
| 17 | +from stlib.node_modifiers.footers import SimulationSolversParameters, SimulationSettingsParameters |
| 18 | +from stlib.node_modifiers.attachments import FixConstraintParameters, AttachmentConstraintParameters |
| 19 | + |
| 20 | +def createScene(root): |
| 21 | + root.gravity=[0,0,9.81] |
| 22 | + root.dt=0.01 |
| 23 | + |
| 24 | + ##Environement |
| 25 | + plane1_collisionParams = CollisionParameters() |
| 26 | + plane1_collisionParams.name = "UP" |
| 27 | + plane1_collisionParams.primitives = [CollisionPrimitive.TRIANGLES] |
| 28 | + plane1_collisionParams.kwargs = {"TriangleCollision" : {"moving" : False, "simulated" : False}} |
| 29 | + plane1_collisionParams.geometry = PlaneParameters(center=np.array([15,0,5]), |
| 30 | + normal=np.array([0,0,-1]), |
| 31 | + lengthNormal=np.array([0, 1, 0]), |
| 32 | + lengthNbEdge=1, |
| 33 | + widthNbEdge=2, |
| 34 | + lengthSize=30, |
| 35 | + widthSize=70) |
| 36 | + plane1 = root.add(Collision, parameters = plane1_collisionParams) |
| 37 | + # TODO being able to reuse already loaded geometry of current prefab to add any new sub prefab |
| 38 | + # We need to enable to directly pass a link to an already existing prefab in place of a prefab parameter object |
| 39 | + plane1_visu = plane1.addChild("Visu") |
| 40 | + plane1_visu.addObject("OglModel", name="VisualModel", src="@../Geometry/container") |
| 41 | + |
| 42 | + |
| 43 | + ### Logo |
| 44 | + ModelsNode = root.addChild("ModelsNode") |
| 45 | + |
| 46 | + LogoParams = EntityParameters(name = "Logo1", |
| 47 | + geometry = FileParameters(filename="mesh/SofaScene/Logo.vtk"), |
| 48 | + material = DeformableBehaviorParameters(), |
| 49 | + collision = CollisionParameters(geometry = FileParameters(filename="mesh/SofaScene/LogoColli.sph")), |
| 50 | + visual = VisualParameters(geometry = FileParameters(filename="mesh/SofaScene/LogoVisu.obj"))) |
| 51 | + |
| 52 | + LogoParams.geometry.elementType = ElementType.TETRAHEDRA |
| 53 | + LogoParams.material.constitutiveLawType = ConstitutiveLaw.ELASTIC |
| 54 | + LogoParams.material.parameters = [200, 0.4] |
| 55 | + LogoParams.material.massDensity = 0.003261 |
| 56 | + LogoParams.collision.primitives = [CollisionPrimitive.SPHERES] |
| 57 | + #TODO make this flawless with spheres. Here collisions elements are not in the topology and a link is to be made between the loader and the collision object |
| 58 | + LogoParams.collision.kwargs = {"SphereCollision" : {"radius" : "@Geometry/loader.listRadius"}} |
| 59 | + LogoParams.visual.color = [0.7, .35, 0, 0.8] |
| 60 | + |
| 61 | + Logo = ModelsNode.add(Entity, parameters = LogoParams) |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | + ### S |
| 66 | + SParams = EntityParameters() |
| 67 | + SParams.name = "S" |
| 68 | + SParams.geometry = FileParameters(filename="mesh/SofaScene/S.vtk") |
| 69 | + SParams.geometry.elementType = ElementType.TETRAHEDRA |
| 70 | + SParams.material = DeformableBehaviorParameters() |
| 71 | + SParams.material.constitutiveLawType = ConstitutiveLaw.ELASTIC |
| 72 | + SParams.material.parameters = [200, 0.45] |
| 73 | + SParams.material.massDensity = 0.011021 |
| 74 | + SParams.collision = CollisionParameters() |
| 75 | + SParams.collision.primitives = [CollisionPrimitive.TRIANGLES] |
| 76 | + # # #TODO: to fix link issues for extracted geometry, it might be better to give source geometry relative link + parameters |
| 77 | + ## TODO: not working with static container because the init order is always wrong so that the triangle vector is always empty when initializing the container |
| 78 | + SParams.collision.geometry = ExtractParameters(destinationType=ElementType.TRIANGLES, sourceParameters=SParams.geometry) |
| 79 | + SParams.visual = VisualParameters() |
| 80 | + SParams.visual.geometry = FileParameters(filename="mesh/SofaScene/SVisu.obj") |
| 81 | + SParams.visual.color = [0.7, .7, 0.7, 0.8] |
| 82 | + |
| 83 | + S = ModelsNode.add(Entity, parameters = SParams) |
| 84 | + |
| 85 | + #TODO make the name automatically match the modifier type if none is given |
| 86 | + root.add(NodeModifier, on = [ModelsNode], parameters = SimulationSolversParameters(constantSparsity=False)) |
| 87 | + |
| 88 | + root.add(NodeModifier, on = [root], parameters = SimulationSettingsParameters(displayFlags = ["showVisualModels", "showInteractionForceFields"], |
| 89 | + enableCollisionDetection = True, |
| 90 | + useLagrangian = True, |
| 91 | + parallelComputing = False, |
| 92 | + alarmDistance=0.3, contactDistance=0.02, |
| 93 | + frictionCoef=0.5, tolerance=1.0e-4, maxIterations=20)) |
| 94 | + |
| 95 | + Logo.add(NodeModifier, on = [Logo], parameters = FixConstraintParameters( boxROIs=[[-1, -2, -13, 3, 2, -7]])) |
| 96 | + Logo.add(NodeModifier, on = [Logo], parameters = FixConstraintParameters( boxROIs=[[-100, -2, -13, -300, 2, -7]])) |
| 97 | + ModelsNode.add(NodeModifier, on = [S, Logo], parameters = AttachmentConstraintParameters(name = "AttachmentConstraintParameters", indices1=[26,20,119,121], indices2=[722,732,574,573], stiffness=0.5, damping=0.0, |
| 98 | + length=[((9.43-9.35)**2 + (-.44-0.48)**2 + (-6.01+6.56)**2)**(0.5) ])) |
| 99 | + |
0 commit comments