aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/py/scripts/sendrecv.py
blob: 9d873baefe709e6f4a55af86117936bcbb2da624 (plain)
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# py/pyext - python script objects for PD and MaxMSP
#
# Copyright (c) 2002-2005 Thomas Grill (gr@grrrr.org)
# For information on usage and redistribution, and for a DISCLAIMER OF ALL
# WARRANTIES, see the file, "license.txt," in this distribution.  
#

"""This is an example script for the py/pyext object's send/receive functionality.

You can:
- bind


There are several classes exposing py/pyext features:
- ex1: A class receiving messages and sending them out again
- ex2: A class receiving messages and putting them out to an outlet
- ex3: Do some PD scripting

"""

try:
	import pyext
except:
	print "ERROR: This script must be loaded by the PD/Max pyext external"


from time import sleep

#################################################################

def recv_gl(arg):
	"""This is a global receive function, it has no access to class members."""
	print "GLOBAL",arg

class ex1(pyext._class):
	"""Example of a class which receives and sends messages

	It has two creation arguments: a receiver and a sender name.
	There are no inlets and outlets.
	Python functions (one global function, one class method) are bound to PD's or Max/MSP's receive symbols.
	The class method sends the received messages out again.
	"""


	# no inlets and outlets
	_inlets=1
	_outlets=0

	recvname=""   
	sendname=""

	def recv(self,*arg):
		"""This is a class-local receive function, which has access to class members."""

		# print some stuff
		print "CLASS",self.recvname,arg

		# send data to specified send address
		self._send(self.sendname,arg)


	def __init__(self,*args):
		"""Class constructor"""

		# store sender/receiver names
		if len(args) >= 1: self.recvname = args[0]
		if len(args) >= 2: self.sendname = args[1]

                self.bind_1()

        def bind_1(self):
		# bind functions to receiver names
		# both are called upon message 
		self._bind(self.recvname,self.recv)
		self._bind(self.recvname,recv_gl)
            
        def unbind_1(self):
		self._unbind(self.recvname,self.recv)
		self._unbind(self.recvname,recv_gl)

	def __del__(self):
		"""Class destructor"""

		# unbinding is automatically done at destruction
		pass


#################################################################

class ex2(pyext._class):
	"""Example of a class which receives a message and forwards it to an outlet

	It has one creation argument: the receiver name.
	"""


	# define inlets and outlets
	_inlets=0
	_outlets=1

	recvname=""   

	def recv(self,*arg):
		"""This is a class-local receive function"""

		# send received data to outlet
		self._outlet(1,arg)


	def __init__(self,rname):
		"""Class constructor"""

		# store receiver names
		self.recvname = rname

		# bind function to receiver name
		self._bind(self.recvname,self.recv)


#################################################################

from math import pi
from cmath import exp
from random import random,randint

class ex3(pyext._class):
	"""Example of a class which does some object manipulation by scripting"""


	# define inlets and outlets
	_inlets=1
	_outlets=0

	def __init__(self):
		"""Class constructor"""

		# called scripting method should run on its own thread
		if self._isthreaded:
		    print "Threading is on"
		    self._detach(1)  

	def bang_1(self):
		"""Do some scripting - PD only!"""

		num = 12				# number of objects
		ori = complex(150,180)  # origin
		rad = 100				# radius
		l = range(num)			# initialize list

		# make flower
		self._tocanvas("obj",ori.real,ori.imag,"bng",20,250,50,0,"empty","yeah","empty",0,-6,64,8,-24198,-1,-1)
		for i in xrange(num):
			l[i] = ori+rad*exp(complex(0,i*2*pi/num))
			self._tocanvas("obj",l[i].real,l[i].imag,"bng",15,250,50,0,"empty","yeah"+str(i),"empty",0,-6,64,8,0,-1,-1)
			self._tocanvas("connect",6,0,7+i,0)

		# blink
		for i in range(10):
			self._send("yeah","bang")
			sleep(1./(i+1))

		# move objects around
		for i in xrange(200):
			ix	= randint(0,num-1)
			l[ix] = ori+rad*complex(2*random()-1,2*random()-1)
			self._send("yeah"+str(ix),"pos",l[ix].real,l[ix].imag)
			sleep(0.02)

		# now delete
		# this is not well-done... from time to time an object remains
		self._tocanvas("editmode",1)
		for i in xrange(num):
			self._tocanvas("mouse",l[i].real,l[i].imag,0,0)
			self._tocanvas("cut")

		self._tocanvas("mouse",ori.real+1,ori.imag+1,0,0)
		self._tocanvas("cut")

		self._tocanvas("editmode",0)