mouseInteractionExample.py

You can view and download this file on Github: mouseInteractionExample.py

  1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2# This is an EXUDYN example
  3#
  4# Details: This is the first interactive mouse motion example;
  5#          use your mouse to drag the end of the chain;
  6#          models a chain of 3D rigid bodies connected with revolute joints;
  7#          may require RESTART of python kernel to work properly!
  8#
  9# Author:   Johannes Gerstmayr
 10# Date:     2020-12-06
 11#
 12# Copyright:This file is part of Exudyn. Exudyn is free software. You can redistribute it and/or modify it under the terms of the Exudyn license. See 'LICENSE.txt' for more details.
 13#
 14#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 15
 16import exudyn as exu
 17from exudyn.itemInterface import *
 18from exudyn.utilities import *
 19from exudyn.graphicsDataUtilities import *
 20
 21from math import sin, cos, pi
 22
 23SC = exu.SystemContainer()
 24mbs = SC.AddSystem()
 25
 26activateWithKeyPress = True #activate mouse drag with keypress 'D'
 27
 28nBodies = 2
 29color = [0.1,0.1,0.8,1]
 30
 31sx = 0.25
 32sy = 0.1
 33sz = 0.1
 34
 35nBodies = 16
 36
 37Ltot = nBodies*sx
 38sc = 4 #size of coordinate system
 39coordSys0 = GraphicsDataCylinder([0,0,0], [sz,0,0], 0.01, color=color4red)
 40coordSys1 = GraphicsDataCylinder([0,0,0], [0,sz,0], 0.01, color=color4green)
 41coordSys2 = GraphicsDataCylinder([0,0,0], [0,0,sz], 0.01, color=color4blue)
 42oGround=mbs.AddObject(ObjectGround(referencePosition= [0,0,0],
 43                                   visualization=VObjectGround(graphicsData= [coordSys0, coordSys1, coordSys2])))
 44
 45m=1 #mass
 46density = 2000
 47
 48nodeList=[]
 49objectList=[]
 50
 51nRB=-1
 52com=[0,0,0]
 53
 54RBinertia = InertiaCuboid(density=density, sideLengths=[sx,sy,sz])
 55
 56mPosGround = mbs.AddMarker(MarkerBodyRigid(bodyNumber = oGround,
 57                                            localPosition=[0,0,0]))
 58mPosLast  = mPosGround
 59
 60deltaAngleZ = 0.05*pi/nBodies
 61p0 = np.array([0,0,0])
 62
 63#create a chain of bodies:
 64for i in range(nBodies):
 65
 66    A = RotationMatrixZ(i*deltaAngleZ)
 67    deltaRot2 = RotationMatrixZ(0.5*deltaAngleZ)
 68    p0 = p0 + A@[0.5*sx,0,0]
 69
 70    omega0 = [0,0,0] #arbitrary initial angular velocity
 71    v0 = [0.,0.,0.] #initial translational velocity
 72
 73    color=[1,0.1,0.1,1]
 74
 75    oGraphics = GraphicsDataOrthoCube(-sx*0.5,-sy*0.5,-sz*0.5, sx*0.5, sy*0.5, sz*0.5, color)
 76
 77    [nRB, oRB] = AddRigidBody(mainSys=mbs, inertia=RBinertia,
 78                              #nodeType=exu.NodeType.RotationRxyz,
 79                              nodeType=exu.NodeType.RotationEulerParameters,
 80                              position=p0, velocity=v0,
 81                              rotationParameters=RotationMatrix2EulerParameters(A),
 82                              angularVelocity=omega0,
 83                              gravity=[0.,0.,-9.81],
 84                              graphicsDataList=[oGraphics])
 85
 86    nodeList += [nRB]
 87    objectList += [oRB]
 88    mPos = mbs.AddMarker(MarkerBodyRigid(bodyNumber = oRB, localPosition = [-0.5*sx,0,0]))
 89    lastDeltaRot2 = deltaRot2
 90    if i == 0:
 91         lastDeltaRot2 = RotationMatrixZ(0)
 92
 93    mbs.AddObject(GenericJoint(markerNumbers = [mPos, mPosLast],
 94                               constrainedAxes=[1,1,1, 1,0,1],
 95                               rotationMarker0=lastDeltaRot2.T,
 96                               rotationMarker1=lastDeltaRot2,
 97                               visualization=VGenericJoint(axesRadius = 0.5*sy, axesLength=1.1*sz)))
 98
 99    #marker for next chain body
100    mPosLast = mbs.AddMarker(MarkerBodyRigid(bodyNumber = oRB, localPosition = [0.5*sx,0,0]))
101
102    #add damping to bodies:
103    mbs.AddObject(ObjectConnectorCartesianSpringDamper(markerNumbers = [mPosGround, mPosLast],
104                                                       damping = [40]*3,
105                                                       visualization=VCartesianSpringDamper(show=False)))
106
107    p0 = p0 + A@[0.5*sx,0,0]
108    # mbs.AddSensor(SensorNode(nodeNumber=nRB, fileName="solution/sensorPos.txt",
109    #                          outputVariableType=exu.OutputVariableType.Coordinates))
110
111#activate by keypress 'D':
112mbs.variables['activateMouseDrag'] = True
113if activateWithKeyPress:
114    mbs.variables['activateMouseDrag'] = False
115
116def UFmouseDrag0(mbs, t, itemIndex, u, v, k, d, offset): #changed 2023-01-21:, mu, muPropZone):
117    if not mbs.variables['activateMouseDrag'] == True:
118        return 0
119    p = SC.GetCurrentMouseCoordinates(True)
120    p = SC.GetRenderState()['openGLcoordinates']
121    #print("u=",u)
122    return k*(Ltot-0.5*sx+u-p[0]) + d*v
123
124def UFmouseDrag1(mbs, t, itemIndex, u, v, k, d, offset): #changed 2023-01-21:, mu, muPropZone):
125    if not mbs.variables['activateMouseDrag'] == True:
126        return 0
127    p = SC.GetCurrentMouseCoordinates(True)
128    return k*(u-p[1]) + d*v
129
130def UFmouseDrag2(mbs, t, itemIndex, u, v, k, d, offset): #changed 2023-01-21:, mu, muPropZone):
131    if not mbs.variables['activateMouseDrag'] == True:
132        return 0
133    p = SC.GetCurrentMouseCoordinates(True)
134    return k*(u-p[1]) + d*v
135
136if True:
137    nGround = mbs.AddNode(NodePointGround())
138    mGroundCoordinate = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nGround, coordinate = 0))
139    k=5.*1e4
140    mCoord0 = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nodeList[-1], coordinate = 0))
141    mCoord1 = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nodeList[-1], coordinate = 1))
142    mCoord2 = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nodeList[-1], coordinate = 2))
143
144    mbs.AddObject(CoordinateSpringDamper(markerNumbers=[mGroundCoordinate, mCoord0],
145                                         stiffness=k, damping=0.01*k,
146                                         springForceUserFunction=UFmouseDrag0,
147                                         visualization=VCoordinateSpringDamper(show=False),
148                                        ))
149    mbs.AddObject(CoordinateSpringDamper(markerNumbers=[mGroundCoordinate, mCoord2],
150                                         stiffness=k, damping=0.01*k,
151                                         springForceUserFunction=UFmouseDrag2,
152                                         visualization=VCoordinateSpringDamper(show=False),
153                                        ))
154
155mbs.Assemble()
156#exu.Print(mbs)
157
158simulationSettings = exu.SimulationSettings() #takes currently set values or default values
159
160tEnd = 10000
161h = 0.001
162simulationSettings.timeIntegration.numberOfSteps = int(tEnd/h)
163simulationSettings.timeIntegration.endTime = tEnd
164simulationSettings.solutionSettings.writeSolutionToFile = False
165simulationSettings.solutionSettings.solutionWritePeriod = simulationSettings.timeIntegration.endTime/1000
166simulationSettings.timeIntegration.verboseMode = 1
167
168#good for interactive examples, as it is independent of CPU power ...
169simulationSettings.timeIntegration.simulateInRealtime = True
170simulationSettings.linearSolverType = exu.LinearSolverType.EigenSparse
171
172simulationSettings.timeIntegration.newton.absoluteTolerance = 1e2 #if no force acts
173simulationSettings.timeIntegration.newton.useModifiedNewton = True
174simulationSettings.timeIntegration.generalizedAlpha.spectralRadius = 0.5 #0.6 works well
175
176simulationSettings.solutionSettings.solutionInformation = "mouse interaction example: press 'D' to (de-)activate mouse drag"
177
178#+++++++++++++++++++++++++++++++++++
179#these options are not necessary:
180SC.visualizationSettings.nodes.defaultSize = 0.025
181SC.visualizationSettings.nodes.drawNodesAsPoint = False
182SC.visualizationSettings.nodes.showBasis = False
183
184SC.visualizationSettings.openGL.light0position = [0.2,0.2,10,0]
185
186SC.visualizationSettings.openGL.light1position = [1,1,-10,0]
187SC.visualizationSettings.openGL.light1ambient= 0. #0.25
188SC.visualizationSettings.openGL.light1diffuse= 0.5 #0.4
189SC.visualizationSettings.openGL.light1specular= 0.6 #0.4
190SC.visualizationSettings.openGL.enableLight1 = True
191
192SC.visualizationSettings.openGL.lightModelTwoSide= True
193
194SC.visualizationSettings.general.drawWorldBasis= True
195
196SC.visualizationSettings.openGL.multiSampling = 4
197SC.visualizationSettings.openGL.lineWidth = 2
198
199SC.visualizationSettings.general.useMultiThreadedRendering = True
200
201useGraphics = True
202if useGraphics:
203    exu.StartRenderer()
204    if 'renderState' in exu.sys:
205        SC.SetRenderState(exu.sys['renderState'])
206    else:
207        renderState = {'centerPoint': [-0.33064934611320496,
208                         -0.5762133598327637,
209                         0.41875001788139343],
210                        'maxSceneSize': 1.75,
211                        'zoom': 4.042552471160889,
212                        'currentWindowSize': [1024, 768],
213                        'modelRotation': [[1.0, 0.0, 0.0],
214                         [0.0, -4.371138828673793e-08, -1.0],
215                         [0.0, 1.0, -4.371138828673793e-08]],
216                        'mouseCoordinates': [713.0, 379.0],
217                        'openGLcoordinates': [1.7853742130100727, -0.5235759578645229]}
218        SC.SetRenderState(renderState)
219        SC.SetRenderState(renderState)
220    mbs.WaitForUserToContinue()
221
222#+++++++++++++++++++++++++++++++++++
223#react on key press, in development state:
224#causes crash at termination of python code ...
225def UFkeyPress(key, action, mods):
226    if chr(key) == 'D' and action == 1: #use capital letters for comparison!!! action 1 == press
227        mbs.variables['activateMouseDrag'] = not mbs.variables['activateMouseDrag']
228
229if activateWithKeyPress:
230    SC.visualizationSettings.window.keyPressUserFunction = UFkeyPress
231
232
233mbs.SolveDynamic(simulationSettings)
234SC.visualizationSettings.window.ResetKeyPressUserFunction()
235
236if useGraphics:
237#     SC.WaitForRenderEngineStopFlag()
238    exu.StopRenderer() #safely close rendering window!