graphicsDataExample.py

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

  1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2# This is an EXUDYN example
  3#
  4# Details:  Example for graphicsData
  5#
  6# Author:   Johannes Gerstmayr
  7# Date:     2023-03-26
  8#
  9# 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.
 10#
 11#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 12
 13import exudyn as exu
 14#a local run must not open a plot window when windows are suppressed (#2477)
 15if exu.special.userInterface.suppressPlots: import matplotlib; matplotlib.use('Agg')
 16from exudyn.utilities import * #includes itemInterface and rigidBodyUtilities
 17import exudyn.graphics as graphics
 18
 19SC = exu.SystemContainer()
 20mbs = SC.AddSystem()
 21
 22
 23#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 24#rigid pendulum:
 25# L = 1    #x-dim of pendulum
 26# b = 0.1  #y-dim of pendulum
 27
 28#create list of graphics data for background
 29gList = []
 30
 31gList += [graphics.CheckerBoard(point=[0,0,-2], normal=[0,0,1], size=5, 
 32                                color=graphics.color.lightgrey[0:3]+[graphics.material.indexChrome],
 33                                alternatingColor=graphics.color.lightgrey2[0:3]+[graphics.material.indexChrome] )]
 34gList += [graphics.Arrow(pAxis=[-2,-2,-1], vAxis=[0,0,2], radius=0.04, color=graphics.color.yellow)]
 35gList += [graphics.Basis(origin=[-2,-1,-1], length=0.5)]
 36gList += [graphics.Cylinder(pAxis=[-2,0,-1], vAxis=[0,0,2], radius=0.3, addEdges=4, color=graphics.color.white, nTiles=32)]
 37gList += [graphics.Sphere(point=[-2,1,0], radius=0.5, color=graphics.color.white, nTiles=16,
 38                                        addEdges=6, addFaces=True)]
 39gList += [graphics.Brick(centerPoint=[-2,-3,-1], size=[0.4,0.5,0.6], color=graphics.color.dodgerblue)]
 40
 41#for hollow solid, use closed contour list:
 42contour=[[0,0.],[0,0.1],[0.4,0.1],[0.4,0.2],[0.8,0.3],[1.2,0.]] #if wrong orientation (check normals): contour.reverse()
 43gList += [graphics.SolidOfRevolution(pAxis=[0,-2,-1], vAxis=[0,0,1],
 44        contour=contour, color=[0.8,0.1,0.1,1], nTiles = 40, addEdges=5)]
 45
 46#the next two graphics lists are merged into a single list:
 47contour=[[0,0.1],[0.,0.2],[1.5,0.3],[1.5,0.15],[0,0.1]]
 48#contour.reverse()
 49g1 = graphics.SolidOfRevolution(pAxis=[0,0,-1], vAxis=[0,0,1],
 50        contour=contour, color=[0.8,0.1,0.1,1], nTiles = 6, smoothContour=False, addEdges=6)
 51
 52g2 = graphics.SolidExtrusion(vertices=[[-0.4,-0.4], [0.4,-0.4], [ 0.4,0.4], [0.1,0.4], 
 53                                               [0.1,  0.2], [-0.1,0.2], [-0.1,0.4], [-0.4,0.4]], 
 54                                     segments=[[0,1], [1,2], [2,3], [3,4], [4,5], [5,6], [6,7], [7,0]],
 55                                     pOff = [0,2,-1], height=1.5, 
 56                                     color=graphics.color.steelblue, addEdges=2)
 57g3 = graphics.MergeTriangleLists(g1,g2)
 58#now move and rotate graphicsData:
 59g3 = graphics.Move(g3, pOff=[0.25,0,1], Aoff=RotationMatrixX(0.125*pi))
 60
 61gList+=[g3]
 62
 63for i, gData in enumerate(gList):
 64    exu.Print(f'gData{i}:')
 65    if 'type' in gData:
 66        exu.Print('  graphicsData type=',gData['type'])
 67        if gData['type'] == 'TriangleList' and 'normals' in gData:
 68            nWrong = graphics.InconsistentTriangles(gData)
 69            exu.Print('  inconsistent trigs=',nWrong,'of',len(graphics.Triangles6ToTriangles(gData)['triangles'])) #curved shapes have triangles6
 70        
 71
 72oGround=mbs.AddObject(ObjectGround(referencePosition= [0,0,0], visualization=VObjectGround(graphicsData= gList)))
 73
 74# graphicsCube = graphics.Brick(size= [L,b,b], color= graphics.color.dodgerblue, addEdges=True)
 75# graphicsJoint = graphics.Cylinder(pAxis=[-0.5*L,0,-0.6*b], vAxis= [0,0,1.2*b], radius = 0.55*b, color=graphics.color.darkgrey, addEdges=True)
 76
 77mbs.CreateRigidBody(inertia = InertiaSphere(1, 0.5), 
 78             referencePosition = [1,1,0], 
 79             initialAngularVelocity =[1,0,0],
 80             graphicsDataList = [graphics.Sphere(radius=0.5, color=graphics.color.orange, nTiles=32,
 81                                                    addEdges=4, addFaces=True)])
 82
 83
 84mbs.Assemble()
 85print(mbs)
 86
 87simulationSettings = exu.SimulationSettings() #takes currently set values or default values
 88
 89simulationSettings.timeIntegration.numberOfSteps = 100000
 90simulationSettings.timeIntegration.endTime = 2000
 91simulationSettings.timeIntegration.verboseMode = 1
 92simulationSettings.timeIntegration.realtime.active = True
 93
 94SC.visualizationSettings.openGL.multiSampling = 4
 95SC.visualizationSettings.openGL.lineWidth = 1
 96# SC.visualizationSettings.openGL.drawVertexNormals = True
 97# SC.visualizationSettings.openGL.drawFaceNormals = True
 98SC.visualizationSettings.general.graphicsUpdateInterval = 0.02
 99SC.visualizationSettings.view0.window.renderWindowSize=[1920,1200]
100
101SC.renderer.Start()
102mbs.SolveDynamic(simulationSettings)
103
104SC.renderer.DoIdleTasks()
105
106image = None
107if SC.renderer.IsActive(): #retrieve image into matplotlib
108    image=SC.renderer.RedrawAndGetImage() 
109
110SC.renderer.Stop() #safely close rendering window - before matplotlib shows its window, which macOS needs (#2877)
111
112if image is not None:
113    import matplotlib.pyplot as plt
114    plt.imshow(image) 
115    plt.axis('off') 
116    plt.show()