1#!/usr/local/bin/python3.8
2from gi.repository import v_sim
3
4# Load the file to test.
5data = v_sim.Data.new()
6data.addFile("collisions.ascii",0,None)
7v_sim.visuBasicLoad_dataFromFile(data,None,0)
8
9# Parse the configuration files.
10v_sim.visuBasicParse_configFiles()
11# Or read only the given file.
12#v_sim.visuConfigFileLoad(v_sim.CONFIGFILE_RESOURCE, "v_sim.res", data)
13
14
15# Example of loop to create a dictionnary associating element name and radius.
16rad = {}
17dataIter = data.iterNew()
18data.iterStart(dataIter)
19while (dataIter.element != None):
20  rad[dataIter.element.name] = v_sim.renderingAtomicGet_radius(dataIter.element)
21  data.iterNextElement(dataIter)
22
23# Example with integrated iterators (still an issue with the
24# stop criterion)
25try:
26  for it in data.__iterElements__():
27    rad[it.element.name] = v_sim.renderingAtomicGet_radius(it.element)
28except RuntimeError:
29  pass
30print "Radii: ", rad
31
32
33def hit(c1, r1, c2, r2):
34  return ( (c1.x-c2.x)**2 + (c1.y-c2.y)**2 + (c1.z-c2.z)**2 < (r1 + r2) ** 2 )
35
36# With Python iterators.
37##collision = []
38##try:
39##  for it1 in data:
40##    try:
41##      for it2 in data:
42##        if it1.node.number > it2.node.number and \
43##	     hit(data.getNodeCoordinates(it1.node), rad[it1.element.name], \
44##		 data.getNodeCoordinates(it2.node), rad[it2.element.name]):
45##	  collision.append((int(it1.node.number), int(it2.node.number)))
46##    except RuntimeError:
47##      pass
48##except RuntimeError:
49##  pass
50##print collision
51
52# With V_Sim iterators
53print "Collision detection..."
54collision = []
55it1 = data.iterNew()
56it2 = data.iterNew()
57data.iterStart(it1)
58while (it1.node is not None):
59  data.iterStart(it2)
60  while (it2.node is not None):
61    if it1.node.number > it2.node.number and \
62	 hit(data.getNodeCoordinates(it1.node), rad[it1.element.name], \
63	     data.getNodeCoordinates(it2.node), rad[it2.element.name]):
64      collision.append((int(it1.node.number), int(it2.node.number)))
65    data.iterNext(it2)
66  data.iterNext(it1)
67print collision
68