Skip to content

Commit b3d664a

Browse files
committed
[scene] New scene to demonstrate insertion on layers
1 parent ebd68b8 commit b3d664a

File tree

1 file changed

+206
-0
lines changed

1 file changed

+206
-0
lines changed

scenes/NeedleInsertionLayers.py

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
import Sofa
2+
3+
g_needleLength=0.100 #(m)
4+
g_needleNumberOfElems=20 #(# of edges)
5+
g_needleBaseOffset=[0.04,0.04,0]
6+
g_needleRadius = 0.001 #(m)
7+
g_needleMechanicalParameters = {
8+
"radius":g_needleRadius,
9+
"youngModulus":1e11,
10+
"poissonRatio":0.3
11+
}
12+
g_needleTotalMass=0.01
13+
14+
g_gelRegularGridParameters = [
15+
{
16+
"n":[12, 4, 6],
17+
"min":[-0.350, -0.050, -0.350],
18+
"max":[0.350, 0.050, -0.100]
19+
},
20+
{
21+
"n":[12, 4, 6],
22+
"min":[-0.350, 0.050, -0.350],
23+
"max":[0.350, 0.150, -0.100]
24+
}
25+
] #Again all in mm
26+
g_gelMechanicalParameters = {
27+
"youngModulus":8e5,
28+
"poissonRatio":0.45,
29+
"method":"large"
30+
}
31+
g_gelTotalMass = 1
32+
g_cubeColor=[[0.8, 0.34, 0.34, 0.3],[0.6, 0.6, 0, 0.3]]
33+
g_wireColor=[[0.8, 0.34, 0.34, 1],[0.6, 0.6, 0, 1]]
34+
g_gelFixedBoxROI=[[-0.355, -0.055, -0.355, -0.345, 0.155, -0.095 ], [0.355, -0.055, -0.355, 0.345, 0.155, -0.095 ]]
35+
36+
# Function called when the scene graph is being created
37+
def createScene(root):
38+
root.gravity=[0,0,0]
39+
root.dt = 0.01
40+
41+
root.addObject("RequiredPlugin",pluginName=['Sofa.Component.AnimationLoop',
42+
'Sofa.Component.Constraint.Lagrangian.Solver',
43+
'Sofa.Component.ODESolver.Backward',
44+
'Sofa.Component.Visual',
45+
'Sofa.Component.Constraint.Lagrangian.Correction',
46+
'Sofa.Component.Constraint.Lagrangian.Model',
47+
'Sofa.Component.LinearSolver.Direct',
48+
'Sofa.Component.Mapping.Linear',
49+
'Sofa.Component.Mass',
50+
'Sofa.Component.SolidMechanics.FEM.Elastic',
51+
'Sofa.Component.StateContainer',
52+
'Sofa.Component.Topology.Container.Dynamic',
53+
'Sofa.Component.Topology.Mapping',
54+
'Sofa.Component.Mapping.NonLinear',
55+
'Sofa.Component.Topology.Container.Grid',
56+
'Sofa.Component.Constraint.Projective',
57+
'Sofa.Component.SolidMechanics.Spring',
58+
'Sofa.GL.Component.Rendering3D',
59+
'Sofa.GUI.Component',
60+
'Sofa.Component.Engine.Select',
61+
'MultiThreading',
62+
'CollisionAlgorithm',
63+
'ConstraintGeometry'
64+
])
65+
66+
67+
root.addObject("ConstraintAttachButtonSetting")
68+
root.addObject("VisualStyle", displayFlags="showVisualModels hideBehaviorModels hideCollisionModels hideMappings hideForceFields hideWireframe showInteractionForceFields" )
69+
root.addObject("FreeMotionAnimationLoop")
70+
root.addObject("GenericConstraintSolver", tolerance=0.00001, maxIt=5000)
71+
root.addObject("CollisionLoop")
72+
73+
#needleBaseMaster = root.addChild("NeedleBaseMaster")
74+
#needleBaseMaster.addObject("MechanicalObject", name="mstate_baseMaster", position=[0.04, 0.04, 0, 0, 0, 0, 1], template="Rigid3d", showObjectScale=0.002, showObject=False, drawMode=1)
75+
#needleBaseMaster.addObject("LinearMovementProjectiveConstraint",indices=[0], keyTimes=[0,1,7,9],movements=
76+
# [ [0.04, 0.04,0,0,0,0]
77+
# , [0.04, 0.04,0.05,0,3.14/2,0]
78+
# , [0.04, 0.04,-0.07,0,3.14/2,0]
79+
# , [0.05, 0.04,-0.07,0,3.14/2 + 3.14/16,0]
80+
#],relativeMovements=False)
81+
82+
83+
84+
#needle = root.addChild("Needle")
85+
#needle.addObject("EulerImplicitSolver", firstOrder=True)
86+
#needle.addObject("EigenSparseLU", name="LinearSolver", template="CompressedRowSparseMatrixd")
87+
#needle.addObject("EdgeSetTopologyContainer", name="Container", position=[[i * g_needleLength/(g_needleNumberOfElems) + g_needleBaseOffset[0], g_needleBaseOffset[1], g_needleBaseOffset[2]] for i in range(g_needleNumberOfElems + 1)]
88+
# , edges=[[i, i+1] for i in range(g_needleNumberOfElems)])
89+
90+
#needle.addObject("EdgeSetTopologyModifier", name="modifier")
91+
#needle.addObject("PointSetTopologyModifier", name="modifier2")
92+
93+
#needle.addObject("MechanicalObject", name="mstate", template="Rigid3d", showObjectScale=0.0002, showObject=False, drawMode=1)
94+
95+
#needle.addObject("UniformMass", totalMass=g_needleTotalMass)
96+
#needle.addObject("BeamFEMForceField", name="FEM", **g_needleMechanicalParameters)
97+
#needle.addObject("LinearSolverConstraintCorrection", printLog=False, linearSolver="@LinearSolver")
98+
99+
#needleBase = needle.addChild("needleBase")
100+
#needleBase.addObject("PointSetTopologyContainer", name="Container_base", position=[0, 0, 0])
101+
#needleBase.addObject("MechanicalObject",name="mstate_base", template="Rigid3d",)
102+
#needleBase.addObject("RestShapeSpringsForceField",points=[0],stiffness=1e8, angularStiffness=1e8,external_points=[0],external_rest_shape="@/NeedleBaseMaster/mstate_baseMaster")
103+
104+
#needleBase.addObject("SubsetMapping", indices="0")
105+
106+
#needleBodyCollision = needle.addChild("bodyCollision")
107+
#needleBodyCollision.addObject("EdgeSetTopologyContainer", name="Container_body", src="@../Container")
108+
#needleBodyCollision.addObject("MechanicalObject",name="mstate_body", template="Vec3d",)
109+
#needleBodyCollision.addObject("EdgeGeometry",name="geom_body",mstate="@mstate_body", topology="@Container_body")
110+
#needleBodyCollision.addObject("EdgeNormalHandler", name="NeedleBeams", geometry="@geom_body")
111+
112+
#needleBodyCollision.addObject("IdentityMapping")
113+
114+
115+
#needleTipCollision = needle.addChild("tipCollision")
116+
#needleTipCollision.addObject("MechanicalObject",name="mstate_tip",position=[g_needleLength+g_needleBaseOffset[0], g_needleBaseOffset[1], g_needleBaseOffset[2]],template="Vec3d",)
117+
#needleTipCollision.addObject("PointGeometry",name="geom_tip",mstate="@mstate_tip")
118+
#needleTipCollision.addObject("RigidMapping",globalToLocalCoords=True,index=g_needleNumberOfElems)
119+
120+
121+
#needleVisual = needle.addChild("visual")
122+
#needleVisual.addObject("QuadSetTopologyContainer", name="Container_visu")
123+
#needleVisual.addObject("QuadSetTopologyModifier", name="Modifier")
124+
#needleVisual.addObject("Edge2QuadTopologicalMapping", nbPointsOnEachCircle=8, radius=g_needleRadius, input="@../Container", output="@Container_visu")
125+
126+
#needleVisual.addObject("MechanicalObject", name="mstate_visu", showObjectScale=0.0002, showObject=True, drawMode=1)
127+
128+
#needleVisual.addObject("TubularMapping", nbPointsOnEachCircle=8, radius=g_needleRadius, input="@../mstate", output="@mstate_visu")
129+
130+
#needleOGL = needleVisual.addChild("OGL")
131+
#needleOGL.addObject("OglModel", position="@../Container_visu.position",
132+
# vertices="@../Container_visu.position",
133+
# quads="@../Container_visu.quads",
134+
# color=[0.4, 0.34, 0.34],
135+
# material="texture Ambient 1 0.4 0.34 0.34 1.0 Diffuse 0 0.4 0.34 0.34 1.0 Specular 1 0.4 0.34 0.34 0.1 Emissive 1 0.5 0.54 0.54 .01 Shininess 1 20",
136+
# name="visualOgl")
137+
#needleOGL.addObject("IdentityMapping")
138+
139+
140+
141+
for i in range(2):
142+
gelGridTopoName = "GelGridTopo" + str(i)
143+
gelTopo = root.addChild(gelGridTopoName)
144+
gelTopo.addObject("RegularGridTopology", name="HexaTop", **g_gelRegularGridParameters[i])
145+
146+
volume = root.addChild("Layer"+str(i))
147+
volume.addObject("EulerImplicitSolver")
148+
volume.addObject("EigenSimplicialLDLT", name="LinearSolver", template='CompressedRowSparseMatrixMat3x3d')
149+
volume.addObject("TetrahedronSetTopologyContainer", name="TetraContainer", position="@../"+gelGridTopoName+"/HexaTop.position")
150+
volume.addObject("TetrahedronSetTopologyModifier", name="TetraModifier")
151+
volume.addObject("Hexa2TetraTopologicalMapping", input="@../"+gelGridTopoName+"/HexaTop", output="@TetraContainer", swapping=False)
152+
153+
volume.addObject("MechanicalObject", name="mstate_gel", template="Vec3d")
154+
volume.addObject("TetrahedronGeometry", name="geom_tetra", mstate="@mstate_gel", topology="@TetraContainer", draw=False)
155+
volume.addObject("AABBBroadPhase",name="AABBTetra",geometry="@geom_tetra",nbox=[3,3,3],thread=1)
156+
volume.addObject("TetrahedronFEMForceField", name="FF",**g_gelMechanicalParameters)
157+
volume.addObject("MeshMatrixMass", name="Mass",totalMass=g_gelTotalMass)
158+
159+
volume.addObject("BoxROI",name="BoxROI",box=g_gelFixedBoxROI)
160+
volume.addObject("RestShapeSpringsForceField", stiffness=1e6,points="@BoxROI.indices" )
161+
162+
volume.addObject("LinearSolverConstraintCorrection", printLog=False, linearSolver="@LinearSolver")
163+
164+
volumeCollision = volume.addChild("collision")
165+
volumeCollision.addObject("TriangleSetTopologyContainer", name="TriContainer")
166+
volumeCollision.addObject("TriangleSetTopologyModifier", name="TriModifier")
167+
volumeCollision.addObject("Tetra2TriangleTopologicalMapping", name="mapping", input="@../TetraContainer", output="@TriContainer", flipNormals=False)
168+
volumeCollision.addObject("MechanicalObject", name="mstate_gelColi",position="@../TetraContainer.position")
169+
volumeCollision.addObject("TriangleGeometry", name="geom_tri", mstate="@mstate_gelColi", topology="@TriContainer",draw=False)
170+
volumeCollision.addObject("PhongTriangleNormalHandler", name="SurfaceTriangles", geometry="@geom_tri")
171+
volumeCollision.addObject("AABBBroadPhase",name="AABBTriangles",thread=1,nbox=[2,2,3])
172+
173+
volumeCollision.addObject("IdentityMapping", name="identityMappingToCollision", input="@../mstate_gel", output="@mstate_gelColi", isMechanical=True)
174+
175+
volumeVisu = volumeCollision.addChild("visu")
176+
volumeVisu.addObject("OglModel", position="@../TriContainer.position",
177+
vertices="@../TriContainer.position",
178+
triangles="@../TriContainer.triangles",
179+
color=g_cubeColor[i],name="volume_visu",template="Vec3d")
180+
volumeVisu.addObject("IdentityMapping")
181+
182+
volumeVisuWire = volume.addChild("visu_wire")
183+
volumeVisuWire.addObject("VisualStyle", displayFlags="showWireframe")
184+
volumeVisuWire.addObject("OglModel", position="@../TetraContainer.position",
185+
vertices="@../TetraContainer.position",
186+
triangles="@../TetraContainer.triangles",
187+
color=g_wireColor[i],name="volume_visu",template="Vec3d")
188+
volumeVisuWire.addObject("IdentityMapping")
189+
190+
191+
#root.addObject("InsertionAlgorithm", name="InsertionAlgo",
192+
# tipGeom="@Needle/tipCollision/geom_tip",
193+
# surfGeom="@Volume/collision/geom_tri",
194+
# shaftGeom="@Needle/bodyCollision/geom_body",
195+
# volGeom="@Volume/geom_tetra",
196+
# punctureForceThreshold=2.,
197+
# tipDistThreshold=0.003,
198+
# drawcollision=True,
199+
# drawPointsScale=0.0001
200+
#)
201+
#root.addObject("DistanceFilter",algo="@InsertionAlgo",distance=0.01)
202+
#root.addObject("SecondDirection",name="punctureDirection",handler="@Volume/collision/SurfaceTriangles")
203+
#root.addObject("ConstraintUnilateral",input="@InsertionAlgo.collisionOutput",directions="@punctureDirection",draw_scale=0.001)
204+
205+
#root.addObject("FirstDirection",name="bindDirection", handler="@Needle/bodyCollision/NeedleBeams")
206+
#root.addObject("ConstraintInsertion",input="@InsertionAlgo.insertionOutput", directions="@bindDirection",draw_scale=0.002, frictionCoeff=0.05)

0 commit comments

Comments
 (0)