11import Sofa
22
3- g_needleLength = 0.100 #(m)
4- g_needleNumberOfElems = 20 #(# of edges)
5- g_needleBaseOffset = [0.04 ,0.04 , 0 ]
3+ g_needleLength = 0.400 #(m)
4+ g_needleNumberOfElems = 40 #(# of edges)
5+ g_needleBaseOffset = [0.04 ,0.25 , - 0.2 ]
66g_needleRadius = 0.001 #(m)
77g_needleMechanicalParameters = {
88 "radius" :g_needleRadius ,
9- "youngModulus" :1e11 ,
9+ "youngModulus" :4e12 ,
1010 "poissonRatio" :0.3
1111}
12- g_needleTotalMass = 0.01
12+ g_needleTotalMass = 0.04
1313
1414g_gelRegularGridParameters = [
1515{
1616 "n" :[6 , 4 , 4 ],
17- "min" :[- 0.350 , - 0.050 , - 0.350 ],
18- "max" :[0.350 , 0.0499 , - 0.100 ]
17+ "min" :[- 0.150 , - 0.050 , - 0.250 ],
18+ "max" :[0.150 , 0.0499 , - 0.100 ]
1919},
2020{
2121 "n" :[6 , 4 , 4 ],
22- "min" :[- 0.350 , 0.0501 , - 0.350 ],
23- "max" :[0.350 , 0.150 , - 0.100 ]
22+ "min" :[- 0.150 , 0.0501 , - 0.250 ],
23+ "max" :[0.150 , 0.150 , - 0.100 ]
2424}
2525] #Again all in mm
2626g_gelMechanicalParameters = {
27- "youngModulus" :8e7 ,
27+ "youngModulus" :8e5 ,
2828 "poissonRatio" :0.45 ,
2929 "method" :"large"
3030}
3131g_gelTotalMass = 1
3232g_cubeColor = [[0.8 , 0.34 , 0.34 , 0.3 ],[0.6 , 0.6 , 0 , 0.3 ]]
3333g_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 ]]
34+ g_gelFixedBoxROI = [[- 0.155 , - 0.055 , - 0.255 , - 0.145 , 0.155 , - 0.095 ], [0.155 , - 0.055 , - 0.255 , 0.145 , 0.155 , - 0.095 ]]
3535
3636# Function called when the scene graph is being created
3737def createScene (root ):
@@ -65,9 +65,9 @@ def createScene(root):
6565
6666
6767 root .addObject ("ConstraintAttachButtonSetting" )
68- root .addObject ("VisualStyle" , displayFlags = "showVisualModels hideBehaviorModels hideCollisionModels hideMappings hideForceFields hideWireframe hideInteractionForceFields " )
68+ root .addObject ("VisualStyle" , displayFlags = "showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields showWireframe showInteractionForceFields " )
6969 root .addObject ("FreeMotionAnimationLoop" )
70- root .addObject ("GenericConstraintSolver" , tolerance = 0.00001 , maxIt = 5000 )
70+ root .addObject ("GenericConstraintSolver" , tolerance = 0.00001 , maxIt = 5000 , regularizationTerm = 0.001 )
7171 root .addObject ("CollisionLoop" )
7272
7373 root .addObject ("CollisionPipeline" , name = "pipeline" , depth = 6 , verbose = 0 )
@@ -76,75 +76,76 @@ def createScene(root):
7676 root .addObject ("CollisionResponse" , response = "FrictionContact" )
7777 root .addObject ("LocalMinDistance" , name = "proximity" , alarmDistance = 0.002 , contactDistance = 0.0005 )
7878
79- #needleBaseMaster = root.addChild("NeedleBaseMaster")
80- #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)
81- #needleBaseMaster.addObject("LinearMovementProjectiveConstraint",indices=[0], keyTimes=[0,1,7,9],movements=
82- # [ [0.04, 0.04,0,0,0,0]
83- # , [0.04, 0.04,0.05,0,3.14/2,0]
84- # , [0.04, 0.04,-0.07,0,3.14/2,0]
85- # , [0.05, 0.04,-0.07,0,3.14/2 + 3.14/16,0]
86- #],relativeMovements=False)
79+ needleBaseMaster = root .addChild ("NeedleBaseMaster" )
80+ needleBaseMaster .addObject ("MechanicalObject" , name = "mstate_baseMaster" , position = [0.04 ,0.25 ,- 0.2 , 0 , 0 , 0 , 1 ], template = "Rigid3d" , showObjectScale = 0.002 , showObject = False , drawMode = 1 )
81+ needleBaseMaster .addObject ("LinearMovementProjectiveConstraint" ,indices = [0 ], keyTimes = [0 ,0.5 ,1 ,7 ,12 ],movements =
82+ [ [0.04 , 0.25 ,- 0.2 ,0 ,0 ,0 ]
83+ , [0.04 , 0.60 ,- 0.2 ,0 ,0 ,0 ]
84+ , [0.04 , 0.60 ,- 0.2 ,0 ,0 ,- 3.14 / 2 ]
85+ , [0.04 , 0.40 ,- 0.2 ,0 ,0 ,- 3.14 / 2 ]
86+ , [0.05 , 0.40 ,- 0.2 ,0 ,0 ,- 3.14 / 2 + 3.14 / 16 ]
87+ ],relativeMovements = False )
8788
8889
8990
90- # needle = root.addChild("Needle")
91- # needle.addObject("EulerImplicitSolver", firstOrder=True)
92- # needle.addObject("EigenSparseLU", name="LinearSolver", template="CompressedRowSparseMatrixd")
93- # 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)]
94- # , edges=[[i, i+1] for i in range(g_needleNumberOfElems)])
91+ needle = root .addChild ("Needle" )
92+ needle .addObject ("EulerImplicitSolver" , firstOrder = True )
93+ needle .addObject ("EigenSparseLU" , name = "LinearSolver" , template = "CompressedRowSparseMatrixd" )
94+ 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 )]
95+ , edges = [[i , i + 1 ] for i in range (g_needleNumberOfElems )])
9596
96- # needle.addObject("EdgeSetTopologyModifier", name="modifier")
97- # needle.addObject("PointSetTopologyModifier", name="modifier2")
97+ needle .addObject ("EdgeSetTopologyModifier" , name = "modifier" )
98+ needle .addObject ("PointSetTopologyModifier" , name = "modifier2" )
9899
99- # needle.addObject("MechanicalObject", name="mstate", template="Rigid3d", showObjectScale=0.0002, showObject=False, drawMode=1)
100+ needle .addObject ("MechanicalObject" , name = "mstate" , template = "Rigid3d" , showObjectScale = 0.0002 , showObject = False , drawMode = 1 )
100101
101- # needle.addObject("UniformMass", totalMass=g_needleTotalMass)
102- # needle.addObject("BeamFEMForceField", name="FEM", **g_needleMechanicalParameters)
103- # needle.addObject("LinearSolverConstraintCorrection", printLog=False, linearSolver="@LinearSolver")
102+ needle .addObject ("UniformMass" , totalMass = g_needleTotalMass )
103+ needle .addObject ("BeamFEMForceField" , name = "FEM" , ** g_needleMechanicalParameters )
104+ needle .addObject ("LinearSolverConstraintCorrection" , printLog = False , linearSolver = "@LinearSolver" )
104105
105- # needleBase = needle.addChild("needleBase")
106- # needleBase.addObject("PointSetTopologyContainer", name="Container_base", position=[0, 0, 0])
107- # needleBase.addObject("MechanicalObject",name="mstate_base", template="Rigid3d",)
108- # needleBase.addObject("RestShapeSpringsForceField",points=[0],stiffness=1e8, angularStiffness=1e8,external_points=[0],external_rest_shape="@/NeedleBaseMaster/mstate_baseMaster")
106+ needleBase = needle .addChild ("needleBase" )
107+ needleBase .addObject ("PointSetTopologyContainer" , name = "Container_base" , position = [0 , 0 , 0 ])
108+ needleBase .addObject ("MechanicalObject" ,name = "mstate_base" , template = "Rigid3d" ,)
109+ needleBase .addObject ("RestShapeSpringsForceField" ,points = [0 ],stiffness = 1e8 , angularStiffness = 1e8 ,external_points = [0 ],external_rest_shape = "@/NeedleBaseMaster/mstate_baseMaster" )
109110
110- # needleBase.addObject("SubsetMapping", indices="0")
111+ needleBase .addObject ("SubsetMapping" , indices = "0" )
111112
112- # needleBodyCollision = needle.addChild("bodyCollision")
113- # needleBodyCollision.addObject("EdgeSetTopologyContainer", name="Container_body", src="@../Container")
114- # needleBodyCollision.addObject("MechanicalObject",name="mstate_body", template="Vec3d",)
115- # needleBodyCollision.addObject("EdgeGeometry",name="geom_body",mstate="@mstate_body", topology="@Container_body")
116- # needleBodyCollision.addObject("EdgeNormalHandler", name="NeedleBeams", geometry="@geom_body")
113+ needleBodyCollision = needle .addChild ("bodyCollision" )
114+ needleBodyCollision .addObject ("EdgeSetTopologyContainer" , name = "Container_body" , src = "@../Container" )
115+ needleBodyCollision .addObject ("MechanicalObject" ,name = "mstate_body" , template = "Vec3d" ,)
116+ needleBodyCollision .addObject ("EdgeGeometry" ,name = "geom_body" ,mstate = "@mstate_body" , topology = "@Container_body" )
117+ needleBodyCollision .addObject ("EdgeNormalHandler" , name = "NeedleBeams" , geometry = "@geom_body" )
117118
118- # needleBodyCollision.addObject("IdentityMapping")
119+ needleBodyCollision .addObject ("IdentityMapping" )
119120
120121
121- # needleTipCollision = needle.addChild("tipCollision")
122- # needleTipCollision.addObject("MechanicalObject",name="mstate_tip",position=[g_needleLength+g_needleBaseOffset[0], g_needleBaseOffset[1], g_needleBaseOffset[2]],template="Vec3d",)
123- # needleTipCollision.addObject("PointGeometry",name="geom_tip",mstate="@mstate_tip")
124- # needleTipCollision.addObject("RigidMapping",globalToLocalCoords=True,index=g_needleNumberOfElems)
122+ needleTipCollision = needle .addChild ("tipCollision" )
123+ needleTipCollision .addObject ("MechanicalObject" ,name = "mstate_tip" ,position = [g_needleLength + g_needleBaseOffset [0 ], g_needleBaseOffset [1 ], g_needleBaseOffset [2 ]],template = "Vec3d" ,)
124+ needleTipCollision .addObject ("PointGeometry" ,name = "geom_tip" ,mstate = "@mstate_tip" )
125+ needleTipCollision .addObject ("RigidMapping" ,globalToLocalCoords = True ,index = g_needleNumberOfElems )
125126
126127
127- # needleVisual = needle.addChild("visual")
128- # needleVisual.addObject("QuadSetTopologyContainer", name="Container_visu")
129- # needleVisual.addObject("QuadSetTopologyModifier", name="Modifier")
130- # needleVisual.addObject("Edge2QuadTopologicalMapping", nbPointsOnEachCircle=8, radius=g_needleRadius, input="@../Container", output="@Container_visu")
128+ needleVisual = needle .addChild ("visual" )
129+ needleVisual .addObject ("QuadSetTopologyContainer" , name = "Container_visu" )
130+ needleVisual .addObject ("QuadSetTopologyModifier" , name = "Modifier" )
131+ needleVisual .addObject ("Edge2QuadTopologicalMapping" , nbPointsOnEachCircle = 8 , radius = g_needleRadius , input = "@../Container" , output = "@Container_visu" )
131132
132- # needleVisual.addObject("MechanicalObject", name="mstate_visu", showObjectScale=0.0002, showObject=True, drawMode=1)
133+ needleVisual .addObject ("MechanicalObject" , name = "mstate_visu" , showObjectScale = 0.0002 , showObject = True , drawMode = 1 )
133134
134- # needleVisual.addObject("TubularMapping", nbPointsOnEachCircle=8, radius=g_needleRadius, input="@../mstate", output="@mstate_visu")
135+ needleVisual .addObject ("TubularMapping" , nbPointsOnEachCircle = 8 , radius = g_needleRadius , input = "@../mstate" , output = "@mstate_visu" )
135136
136- # needleOGL = needleVisual.addChild("OGL")
137- # needleOGL.addObject("OglModel", position="@../Container_visu.position",
138- # vertices="@../Container_visu.position",
139- # quads="@../Container_visu.quads",
140- # color=[0.4, 0.34, 0.34],
141- # 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",
142- # name="visualOgl")
143- # needleOGL.addObject("IdentityMapping")
137+ needleOGL = needleVisual .addChild ("OGL" )
138+ needleOGL .addObject ("OglModel" , position = "@../Container_visu.position" ,
139+ vertices = "@../Container_visu.position" ,
140+ quads = "@../Container_visu.quads" ,
141+ color = [0.4 , 0.34 , 0.34 ],
142+ 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" ,
143+ name = "visualOgl" )
144+ needleOGL .addObject ("IdentityMapping" )
144145
145146
146147
147- for i in range (2 ):
148+ for i in range (1 , 2 ):
148149 gelGridTopoName = "GelGridTopo" + str (i )
149150 gelTopo = root .addChild (gelGridTopoName )
150151 gelTopo .addObject ("RegularGridTopology" , name = "HexaTop" , ** g_gelRegularGridParameters [i ])
@@ -177,9 +178,9 @@ def createScene(root):
177178 volumeCollision .addObject ("PhongTriangleNormalHandler" , name = "SurfaceTriangles" , geometry = "@geom_tri" )
178179 volumeCollision .addObject ("AABBBroadPhase" ,name = "AABBTriangles" ,thread = 1 ,nbox = [2 ,2 ,3 ])
179180
180- volumeCollision .addObject ("TriangleCollisionModel" , name = "colli_tri" , group = i )
181- volumeCollision .addObject ("LineCollisionModel" , name = "colli_line" , group = i )
182- volumeCollision .addObject ("PointCollisionModel" , name = "colli_point" , group = i )
181+ # volumeCollision.addObject("TriangleCollisionModel", name="colli_tri", group=i)
182+ # volumeCollision.addObject("LineCollisionModel", name="colli_line", group=i)
183+ # volumeCollision.addObject("PointCollisionModel", name="colli_point", group=i)
183184
184185 volumeCollision .addObject ("IdentityMapping" , name = "identityMappingToCollision" , input = "@../mstate_gel" , output = "@mstate_gelColi" , isMechanical = True )
185186
@@ -198,26 +199,26 @@ def createScene(root):
198199 color = g_wireColor [i ],name = "volume_visu" ,template = "Vec3d" )
199200 volumeVisuWire .addObject ("IdentityMapping" )
200201
201- root .addObject ("NearestPointROI" , template = "Vec3d" , name = "attachROI" , radius = 0.0025 ,
202- object1 = "@Layer0/mstate_gel" , object2 = "@Layer1/mstate_gel" )
203- root .addObject ("BilateralLagrangianConstraint" , name = "layerAttachment" ,
204- first_point = "@attachROI.indices1" , second_point = "@attachROI.indices2" ,
205- object1 = "@Layer0/mstate_gel" , object2 = "@Layer1/mstate_gel" )
206-
207-
208- # root.addObject("InsertionAlgorithm", name="InsertionAlgo",
209- # tipGeom="@Needle/tipCollision/geom_tip",
210- # surfGeom="@Volume /collision/geom_tri",
211- # shaftGeom="@Needle/bodyCollision/geom_body",
212- # volGeom="@Volume /geom_tetra",
213- # punctureForceThreshold=2. ,
214- # tipDistThreshold=0.003 ,
215- # drawcollision=True,
216- # drawPointsScale=0.0001
217- # )
218- # root.addObject("DistanceFilter",algo="@InsertionAlgo",distance=0.01)
219- # root.addObject("SecondDirection",name="punctureDirection",handler="@Volume /collision/SurfaceTriangles")
220- # root.addObject("ConstraintUnilateral",input="@InsertionAlgo.collisionOutput",directions="@punctureDirection",draw_scale=0.001)
221-
222- # root.addObject("FirstDirection",name="bindDirection", handler="@Needle/bodyCollision/NeedleBeams")
223- # root.addObject("ConstraintInsertion",input="@InsertionAlgo.insertionOutput", directions="@bindDirection",draw_scale=0.002, frictionCoeff=0.05 )
202+ # root.addObject("NearestPointROI", template="Vec3d", name="attachROI", radius=0.0025,
203+ # object1="@Layer0/mstate_gel", object2="@Layer1/mstate_gel")
204+ # root.addObject("BilateralLagrangianConstraint", name="layerAttachment",
205+ # first_point="@attachROI.indices1", second_point="@attachROI.indices2",
206+ # object1="@Layer0/mstate_gel", object2="@Layer1/mstate_gel")
207+
208+
209+ root .addObject ("InsertionAlgorithm" , name = "InsertionAlgo" ,
210+ tipGeom = "@Needle/tipCollision/geom_tip" ,
211+ surfGeom = "@Layer1 /collision/geom_tri" ,
212+ shaftGeom = "@Needle/bodyCollision/geom_body" ,
213+ volGeom = "@Layer1 /geom_tetra" ,
214+ punctureForceThreshold = 0.8 ,
215+ tipDistThreshold = 0.005 ,
216+ drawcollision = True ,
217+ drawPointsScale = 0.0001
218+ )
219+ root .addObject ("DistanceFilter" ,algo = "@InsertionAlgo" ,distance = 0.01 )
220+ root .addObject ("SecondDirection" ,name = "punctureDirection" ,handler = "@Layer1 /collision/SurfaceTriangles" )
221+ root .addObject ("ConstraintUnilateral" ,input = "@InsertionAlgo.collisionOutput" ,directions = "@punctureDirection" ,draw_scale = 0.001 )
222+
223+ root .addObject ("FirstDirection" ,name = "bindDirection" , handler = "@Needle/bodyCollision/NeedleBeams" )
224+ root .addObject ("ConstraintInsertion" ,input = "@InsertionAlgo.insertionOutput" , directions = "@bindDirection" ,draw_scale = 0.002 , frictionCoeff = 0.00 )
0 commit comments