Commit MetaInfo

Revisão6dc5985e8a75b4dc7d3977c7e722dc3a188aadbb (tree)
Hora2013-03-04 01:50:45
Autorbijoux
Commiterbijoux

Mensagem de Log

new dynamic port arrangement

Mudança Sumário

Diff

diff -r 0e3caa1cfa5f -r 6dc5985e8a75 src/experiment/vtk_tree_pylafiii.py
--- a/src/experiment/vtk_tree_pylafiii.py Sun Mar 03 21:46:22 2013 +0900
+++ b/src/experiment/vtk_tree_pylafiii.py Mon Mar 04 01:50:45 2013 +0900
@@ -1,7 +1,5 @@
11 # coding: utf-8
22
3-#TODO: タプルパラメータパネルの追加
4-#TODO: 動的なターミナル表示とリンクの修正
53 #TODO: キャンバスウィジェット
64 #TODO: マップの保存とリストア
75 #TODO: パラメータの保存
@@ -64,10 +62,11 @@
6462 laf.link(laf.port(rt.children['renderer'],'vtkobj'),laf.port(w,'renderer'))
6563 #
6664 #FIXME: タプルブリッジの試験用
67- # laf.port(rt.children['actor1'],'vtkobj').unlink()
68- # o = laf.data.TupleBridge()
69- # laf.link(laf.port(rt.children['spheresource'],'center'),laf.port(o,'value'))
70- # del o
65+ laf.port(rt.children['actor1'],'vtkobj').unlink()
66+ o = laf.data.TupleBridge()
67+ laf.link(laf.port(rt.children['spheresource'],'center'),laf.port(o,'value'))
68+ del o
69+ # --
7170 #
7271 Tkinter.mainloop()
7372
\ No newline at end of file
diff -r 0e3caa1cfa5f -r 6dc5985e8a75 src/pylafiii/chef.py
--- a/src/pylafiii/chef.py Sun Mar 03 21:46:22 2013 +0900
+++ b/src/pylafiii/chef.py Mon Mar 04 01:50:45 2013 +0900
@@ -226,9 +226,9 @@
226226 del canvas._location_buffer[logic]
227227 CanvasItem.__init__(self,canvas,tag,loc)
228228 self._logic = weakref.ref(logic)
229- self.myports = laf.WeakValueList()
229+ self.myports = weakref.WeakValueDictionary()
230230 self.draw(self.shape)
231- self.generate_myports()
231+ #self.generate_myports()
232232 self.bind('<Button1-Motion>',self.leftdrag)
233233 self.bind('<Button1-ButtonRelease>',self.leftrelease)
234234 self.bind('<Double-Button-1>',self.popup_equipment)
@@ -250,6 +250,8 @@
250250 def check_model(self,e): # <<CheckModel>>
251251 if not self.logic:
252252 self.destroy()
253+ return
254+ self.populate_ports()
253255 def leftdrag(self,e):
254256 try:
255257 self._start
@@ -263,7 +265,7 @@
263265 self._start = [e.x,e.y]
264266 self.move(dx,dy)
265267 # 配下のポートも同時に動かす
266- for item in self.myports.tolist():
268+ for item in [v for v in self.myports.itervalues()]:
267269 item.move(dx,dy)
268270 def leftrelease(self,e):
269271 try:
@@ -272,30 +274,92 @@
272274 return
273275 if self._start is not None:
274276 self._start = None
275- def generate_myports(self):
276- # ポートアイテムを生成する
277+ def populate_ports(self):
278+ # ポートアイテムを居住させる
279+ # 現在、ロジックが保持しているが未居住の実ポートを居住させる
280+ # すでに居住しているが、ロジックから廃棄されたポートアイテムを退去させる
277281 def generate(ports,xoffset=0,yoffset=0,direction=Tkinter.LEFT):
278- yoffset = -16 * (len(ports) - 1) / 2
282+ # ポートを生成する
283+ # 生成したポートは self.myports に格納する
284+ #FIXME: 単純化のために最初のポートの位置を中心に合わせたのを直しておくように
285+ #yoffset = -16 * (len(ports) - 1) / 2
286+ yoffset = 0
287+ #
279288 keys = ports.keys()
280289 keys.sort() # ターミナルの配置を英数降順で
281290 for key in keys:
282- actprt = ports[key].actualport(self.logic)
291+ actprt = ports[key]
283292 myport = CanvasPort(self.canvas,actprt,direction=direction,tag=self.tag,loc=(x+xoffset,y+yoffset),name=key)
284- #FIXME: remove this line
285- # self.canvas.following_terminals[attr] = weakref.ref(myport)
286- self.myports.append(myport)
293+ self.myports[key] = myport
287294 yoffset += 16
288295 x,y = self.loc
289296 lports,rports = {},{}
290- #FIXME: current status
291- for name,port in laf.getproxports(self.logic).iteritems():
297+ #FIXME: ユーザが任意に左右を振り分けられるようにする
298+ myports = [o.substance for o in self.myports.itervalues()] # すでに居住している実ポートのリストを収集する
299+ for name,port in laf.getports(self.logic).iteritems():
300+ if port in myports:
301+ # すでに居住しているポートであればなにもしない
302+ continue
292303 # 右に表示するか左に表示するか振り分け
293- if isinstance(port,laf.Rule):
304+ if isinstance(port,laf.ActualRule):
294305 rports[name] = port
295306 else:
296307 lports[name] = port
308+ # ポートアイテムを生成する
297309 generate(lports,-50,direction=Tkinter.LEFT)
298310 generate(rports,50,direction=Tkinter.RIGHT)
311+ # ポートアイテムの表示位置を調整する
312+ # 左右配置されているポートアイテムを収集する
313+ lpis,rpis = {},{}
314+ for key,item in self.myports.iteritems():
315+ if item.loc[0] < x:
316+ lpis[key] = item
317+ else:
318+ rpis[key] = item
319+ # 左配置されているポートの位置を計算する
320+ yoffset = -16 * (len(lpis) - 1) / 2
321+ keys = lpis.keys()
322+ keys.sort() # ターミナルの配置を英数降順で
323+ for key in keys:
324+ o = lpis[key]
325+ px,py = o.loc
326+ o.move(0,y+yoffset-py)
327+ yoffset +=16
328+ # 右は位置されているポートの位置を計算する
329+ yoffset = -16 * (len(rpis) - 1) / 2
330+ keys = rpis.keys()
331+ keys.sort() # ターミナルの配置を英数降順で
332+ for key in keys:
333+ o = rpis[key]
334+ px,py = o.loc
335+ o.move(0,y+yoffset-py)
336+ yoffset +=16
337+#
338+
339+# def generate_myports(self):
340+# # ポートアイテムを生成する
341+# def generate(ports,xoffset=0,yoffset=0,direction=Tkinter.LEFT):
342+# yoffset = -16 * (len(ports) - 1) / 2
343+# keys = ports.keys()
344+# keys.sort() # ターミナルの配置を英数降順で
345+# for key in keys:
346+# actprt = ports[key].actualport(self.logic)
347+# myport = CanvasPort(self.canvas,actprt,direction=direction,tag=self.tag,loc=(x+xoffset,y+yoffset),name=key)
348+# #FIXME: remove this line
349+# # self.canvas.following_terminals[attr] = weakref.ref(myport)
350+# self.myports.append(myport)
351+# yoffset += 16
352+# x,y = self.loc
353+# lports,rports = {},{}
354+# #FIXME: current status
355+# for name,port in laf.getproxports(self.logic).iteritems():
356+# # 右に表示するか左に表示するか振り分け
357+# if isinstance(port,laf.Rule):
358+# rports[name] = port
359+# else:
360+# lports[name] = port
361+# generate(lports,-50,direction=Tkinter.LEFT)
362+# generate(rports,50,direction=Tkinter.RIGHT)
299363 def popup_equipment(self,e): # for Tk Event
300364 logic = self.logic
301365 module = inspect.getmodule(logic)
@@ -719,13 +783,15 @@
719783 (.5*(self.sx+self.ex),self.ey),
720784 (self.ex,self.ey)),{'width':1,'smooth':True,'splinesteps':10})]
721785 def check_model(self,e):
722- '''
723- 追跡しているノードが削除されるかノードとポートが監視するコンテナが異なっていれば自身を削除する
724- '''
725786 # --
726- # 追跡していたノードアイテムが削除されるか、
727- # たらゴミ箱に入る
787+ # 追跡していたポートアイテムが削除されてしまったか、
788+ # ノードが削除されるか、ノードとポートが監視するコンテナが異なっていればゴミ箱に入る
728789 # --
790+ try:
791+ self.portitem.substance
792+ except AttributeError:
793+ self.canvas.scrap.append(self)
794+ return
729795 if self.nodeitem == None or not self.portitem.substance.container == self.nodeitem.substance:
730796 self.canvas.scrap.append(self)
731797 return
diff -r 0e3caa1cfa5f -r 6dc5985e8a75 src/pylafiii/data.py
--- a/src/pylafiii/data.py Sun Mar 03 21:46:22 2013 +0900
+++ b/src/pylafiii/data.py Mon Mar 04 01:50:45 2013 +0900
@@ -1,25 +1,9 @@
11 # coding: utf-8
22
3-from ingredient import Logic,ActualEvent,event,getports,port
4-
5-#class SpecificTuple(tuple,object):
6-# keys = None
7-# def __new__(self,*args):
8-# if len(args) == 1 and isinstance(args[0],tuple):
9-# return tuple(args[0])
10-# else:
11-# return tuple(args)
12-# def __init__(self,*args):
13-# tuple.__init__(self,args)
3+from ingredient import Logic,ActualEvent,event
144
155 class SpecificTuple(tuple,object):
166 keys = None
17-#FIXME: 以下のコードだとタプルが返されてしまうので注意!
18-# def __new__(self,*args):
19-# if len(args) == 1 and isinstance(args[0],tuple):
20-# return tuple(args[0])
21-# else:
22-# return tuple(args)
237
248 class Point(SpecificTuple):
259 keys = ('x','y','z')
@@ -39,7 +23,7 @@
3923 value = self.value
4024 self._block = None
4125 for i,k in enumerate(self.keys):
42- getattr(self,k).set(self.value[i])
26+ getattr(self,k).set(value[i])
4327 del self._block
4428 def _link_value(self):
4529 self.keys = self.value.keys
@@ -51,36 +35,8 @@
5135 def _unlink_value(self):
5236 for k in self.keys:
5337 delattr(self,k)
54- self.keys = None
38+ # value をクリアする
39+ self.keys = () # value をクリアする際に keys のイテレータが要求されるので
5540 self.value = None
56-
57-#class SpecificData(object): pass
58-#
59-#class Point(SpecificData):
60-# keys = ('x','y','z')
61-# #FIXME: 相互同期メカニズム
62-# def __init__(self,x=0,y=0,z=0):
63-# self.x = x
64-# self.y = y
65-# self.z = z
66-# @event
67-# def data(self):
68-# self._block = None
69-# self.x = self.data[0]
70-# self.y = self.data[1]
71-# self.z = self.data[2]
72-# del self._block
73-# @event
74-# def x(self): self.update()
75-# @event
76-# def y(self): self.update()
77-# @event
78-# def z(self): self.update()
79-# def update(self):
80-# try:
81-# self._block
82-# except:
83-# self.data = (self.x,self.y,self.z)
84-
85-#class PositionWidget:
86-
41+ # keys をクリアする
42+ self.keys = None
diff -r 0e3caa1cfa5f -r 6dc5985e8a75 src/pylafiii/vtkext/base.py
--- a/src/pylafiii/vtkext/base.py Sun Mar 03 21:46:22 2013 +0900
+++ b/src/pylafiii/vtkext/base.py Mon Mar 04 01:50:45 2013 +0900
@@ -10,8 +10,8 @@
1010 Logic.__init__(self,*args,**kw)
1111 self._vtkobj = self.vtkClass()
1212 self.initialize()
13- # FIXME:これを実行しないとルールが生成されないのでリンク時にエラーとなることがある?うそ?
14- # self.vtkobj
13+ # これを実行しないと実ポートが生成されないのでマップへのオブジェクト追加時にリンク前に実ポートが生成されないことがある
14+ self.vtkobj
1515 def initialize(self): pass
1616 @rule
1717 def vtkobj(self): return self._vtkobj
Show on old repository browser