Monday, May 9, 2016

Here's the Culprit



 In Visual Python, helix object will generate error if helix.length = some array like the code below. I use dl, an array, for the length value
from visual import *

display(center=(1,0,0),background=(1,1,1), autoscale=False, range=(2,2,2),        
        width=600, height=600,  forward=(-.4,-.3,-1)) #arah kamera

distant_light(direction=(1,1,1), color=color.red)
n       = 1
dt      = 1./8.
dl      = ones(1)

pegas   = []

print dl


for i in arange(n):
    spring  = helix(pos=(0,0,0), axis=(5,0,0), radius=0.2, color=color.red, length=1.)
    pegas.append(spring)

def updatePegas(l):
    pegas[0].length = l
    
    

def proses():
    global dl
    l   = pegas[0].length
    if l>2:
        l   = 2
        dl[0]  *= -1
    elif l<.5:
        l   = .5
        dl[0]  *= -1
    l   += dl[0]
    updatePegas(l)
    
while 1:
    rate (19)
    proses()

    
    
    
    

    

.



And the result is
Traceback (most recent call last):
  File "springList.py", line 40, in 
    proses()
  File "springList.py", line 36, in proses
    updatePegas(l)
  File "springList.py", line 22, in updatePegas
    pegas[0].length = l
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/VPython-6.11-py2.7-macosx-10.6-intel.egg/visual_common/primitives.py", line 850, in set_length
    self.__frame.axis = self.__axis.norm()
AttributeError: 'numpy.ndarray' object has no attribute 'norm'


If we change dl from array to list, like the code below, everything is suddenly OK, :)
from visual import *

display(center=(1,0,0),background=(1,1,1), autoscale=False, range=(2,2,2),        
        width=600, height=600,  forward=(-.4,-.3,-1)) #arah kamera

distant_light(direction=(1,1,1), color=color.red)
n       = 1
dt      = 1./8.
#dl      = ones(1)
dl      = []
dl.append(.1)
pegas   = []

print dl


for i in arange(n):
    spring  = helix(pos=(0,0,0), axis=(5,0,0), radius=0.2, color=color.red, length=1.)
    pegas.append(spring)

def updatePegas(l):
    pegas[0].length = l
    
    

def proses():
    global dl
    l   = pegas[0].length
    if l>2:
        l   = 2
        dl[0]  *= -1
    elif l<.5:
        l   = .5
        dl[0]  *= -1
    l   += dl[0]
    updatePegas(l)
    
while 1:
    rate (19)
    proses()

    
    
    
    

    

.

Gonna rewrite the code.