1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
#!/usr/bin/env python
from gi.repository import v_sim
import cProfile
render = v_sim.uiMainClass_getDefaultRendering()
data = render.getVisuData()
# Example with integrated iterators (still an issue with the
# stop criterion)
rad = {}
for it in data.__iterElements__():
rad[it.element.name] = v_sim.renderingAtomic_getRadius(it.element)
#print "Radii: ", rad
def hit((x1,y1,z1), r1, (x2,y2,z2), r2):
return ( (x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2 < (r1 + r2)**2 )
# With Python iterators.
collision = set()
def byPairs(data, collision):
for (it1, it2) in data.__iterByPairs__():
if hit(data.getNodeCoordinates(it1.node), rad[it1.element.name], \
data.getNodeCoordinates(it2.node), rad[it2.element.name]):
collision.add(int(it1.node.number))
collision.add(int(it2.node.number))
def doubleLoop(data, collision):
for it1 in data:
for it2 in data:
if it1.node.number > it2.node.number and \
hit(data.getNodeCoordinates(it1.node), rad[it1.element.name], \
data.getNodeCoordinates(it2.node), rad[it2.element.name]):
collision.add(int(it1.node.number))
collision.add(int(it2.node.number))
def byCopy(data, collision):
nodes = data.getAllNodePositions()
for (c1, i1, e1) in nodes:
for (c2, i2, e2) in nodes:
if i1 > i2 and hit(c1, rad[e1], c2, rad[e2]):
collision.add(int(i1))
collision.add(int(i2))
cProfile.run('doubleLoop(data, collision)')
cProfile.run('byPairs(data, collision)')
cProfile.run('byCopy(data, collision)')
marks = render.getMarks()
if marks.setHighlightedList(tuple(collision), v_sim.MarksStatus.SET):
v_sim.object_redraw(None)
v_sim.uiMainClass_getCurrentPanel().quit(True)
|