[PD-dev] pyext users?

B. Bogart ben at ekran.org
Thu Jul 21 21:01:25 CEST 2005


Funny you mention that Frank,

I'm currently hacking away at a py/numarray external storing control
points for a Gem object.

All is great until I try and make multiple instances of the py object,
things get funny. All of a sudden some methods are no longer accepted: I
get an "unhandled" message, while others work fine.

Anyhow for the python hackers out there here is my current code:

(obviously some things are inefficient but I'd like to get it to work
before I worry about elegance! Why might this not work when I create a
second instance?)

import pyext
import sys
from numarray import *

class array(pyext._class):

   # number of inlets and outlets
   _inlets=1
   _outlets=1

   # Vars
   width = 0
   height = 0
   points = array()

   print "curve3d scripts init"

   # Definitions
   def send_array(self):

     for i in xrange(self.width):
       for j in xrange(self.height):
         self._outlet(1,"set",(i,j)+tuple(self.points[i,j]))

   # Generates Array of Control points
   def generate_array(self,w,h,w_lower,w_upper,h_lower,h_upper):

     # Set values

     self.width = w
     self.height = h

     # Create Array
     self.points=zeros((w,h,3),Float32)

     # Calculate Size
     w_range = w_upper-w_lower
     h_range = h_upper-h_lower

     z=0

     for i in xrange(w):
       for j in xrange(h):
         x=i*(w_range/(w-1.0))+w_lower
         y=j*(h_range/(h-1.0))+h_lower
         self.points[i,j] = [x,y,z]

   # if the point matches then subtract 0.1
   def change_(self,n,*args):
     if len(args) == 5:
       x = args[0]
       y = args[1]
       test_width = args[2]
       test_height = args[3]
       z = args[4]
       for i in xrange(self.width):
         for j in xrange(self.height):
           if x < self.points[i,j,0]+test_width:
             if x > self.points[i,j,0]-test_width:
               if y < self.points[i,j,1]+test_height:
                 if y > self.points[i,j,1]-test_height:
                   # Note multiple matches are possible here
                   self.points[i,j,2] -= z
                   #print "X: "+str(x)+" Y: "+str(y)+" Z:
"+str(points[i,j,2])+" I: "+str(i)+" J: "+str(j)
                   self.send_array()
     else:
       print "Change requires 5 arguments: 'change <X> <Y> <test-width>
<test-height> <z>'"

   # methods for first inlet
   def generate_(self,n,*args):
     if len(args) == 6:

       self.generate_array(*args)
       self.send_array()

     else:
       print "generate_array requires 6 arguments: <width> <height>
<width lower> <width upper> <height lower> <height upper>"

Thanks all.

b>

Frank Barknecht wrote:
> Hallo,
> Georg Holzmann hat gesagt: // Georg Holzmann wrote:
>
>
>>I guess the iem matrix objects count from 1 because matlab/octave also
>>counts from 1 :)
>
>
> Well, there's always numarray. ;)
>
> Ciao
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 256 bytes
Desc: OpenPGP digital signature
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20050721/509f100f/attachment.pgp>


More information about the Pd-dev mailing list