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
14from exudyn.utilities import * #includes itemInterface and rigidBodyUtilities
15import exudyn.graphics as graphics #only import if it does not conflict
16
17SC = exu.SystemContainer()
18mbs = SC.AddSystem()
19
20
21#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22#rigid pendulum:
23# L = 1 #x-dim of pendulum
24# b = 0.1 #y-dim of pendulum
25
26#create list of graphics data for background
27gList = []
28
29gList += [graphics.CheckerBoard(point=[0,0,-2], normal=[0,0,1], size=5,
30 color=graphics.color.lightgrey[0:3]+[graphics.material.indexChrome],
31 alternatingColor=graphics.color.lightgrey2[0:3]+[graphics.material.indexChrome] )]
32gList += [graphics.Arrow(pAxis=[-2,-2,-1], vAxis=[0,0,2], radius=0.04, color=graphics.color.yellow)]
33gList += [graphics.Basis(origin=[-2,-1,-1], length=0.5)]
34gList += [graphics.Cylinder(pAxis=[-2,0,-1], vAxis=[0,0,2], radius=0.3, addEdges=4, color=graphics.color.white, nTiles=32)]
35gList += [graphics.Sphere(point=[-2,1,0], radius=0.5, color=graphics.color.white, nTiles=16,
36 addEdges=6, addFaces=True)]
37gList += [graphics.Brick(centerPoint=[-2,-3,-1], size=[0.4,0.5,0.6], color=graphics.color.dodgerblue)]
38
39#for hollow solid, use closed contour list:
40contour=[[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()
41gList += [graphics.SolidOfRevolution(pAxis=[0,-2,-1], vAxis=[0,0,1],
42 contour=contour, color=[0.8,0.1,0.1,1], nTiles = 40, addEdges=5)]
43
44#the next two graphics lists are merged into a single list:
45contour=[[0,0.1],[0.,0.2],[1.5,0.3],[1.5,0.15],[0,0.1]]
46#contour.reverse()
47g1 = graphics.SolidOfRevolution(pAxis=[0,0,-1], vAxis=[0,0,1],
48 contour=contour, color=[0.8,0.1,0.1,1], nTiles = 6, smoothContour=False, addEdges=6)
49
50g2 = graphics.SolidExtrusion(vertices=[[-0.4,-0.4], [0.4,-0.4], [ 0.4,0.4], [0.1,0.4],
51 [0.1, 0.2], [-0.1,0.2], [-0.1,0.4], [-0.4,0.4]],
52 segments=[[0,1], [1,2], [2,3], [3,4], [4,5], [5,6], [6,7], [7,0]],
53 pOff = [0,2,-1], height=1.5,
54 color=graphics.color.steelblue, addEdges=2)
55g3 = graphics.MergeTriangleLists(g1,g2)
56#now move and rotate graphicsData:
57g3 = graphics.Move(g3, pOff=[0.25,0,1], Aoff=RotationMatrixX(0.125*pi))
58
59gList+=[g3]
60
61for i, gData in enumerate(gList):
62 exu.Print(f'gData{i}:')
63 if 'type' in gData:
64 exu.Print(' graphicsData type=',gData['type'])
65 if gData['type'] == 'TriangleList' and 'normals' in gData:
66 nWrong = graphics.InconsistentTriangles(gData)
67 exu.Print(' inconsistent trigs=',nWrong,'of',len(gData['triangles']//3))
68
69
70oGround=mbs.AddObject(ObjectGround(referencePosition= [0,0,0], visualization=VObjectGround(graphicsData= gList)))
71
72# graphicsCube = graphics.Brick(size= [L,b,b], color= graphics.color.dodgerblue, addEdges=True)
73# 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)
74
75mbs.CreateRigidBody(inertia = InertiaSphere(1, 0.5),
76 referencePosition = [1,1,0],
77 initialAngularVelocity =[1,0,0],
78 graphicsDataList = [graphics.Sphere(radius=0.5, color=graphics.color.orange, nTiles=32,
79 addEdges=4, addFaces=True)])
80
81
82mbs.Assemble()
83print(mbs)
84
85simulationSettings = exu.SimulationSettings() #takes currently set values or default values
86
87simulationSettings.timeIntegration.numberOfSteps = 100000
88simulationSettings.timeIntegration.endTime = 2000
89simulationSettings.timeIntegration.verboseMode = 1
90simulationSettings.timeIntegration.simulateInRealtime = True
91
92SC.visualizationSettings.openGL.multiSampling = 4
93SC.visualizationSettings.openGL.lineWidth = 1
94# SC.visualizationSettings.openGL.drawVertexNormals = True
95# SC.visualizationSettings.openGL.drawFaceNormals = True
96SC.visualizationSettings.general.graphicsUpdateInterval = 0.02
97SC.visualizationSettings.window.renderWindowSize=[1920,1200]
98
99SC.renderer.Start()
100mbs.SolveDynamic(simulationSettings)
101
102SC.renderer.DoIdleTasks()
103SC.renderer.Stop() #safely close rendering window!