Commit MetaInfo

Revisão3016648fdde2f0f283edeeed01e34fe0b02c536d (tree)
Hora2013-03-19 14:26:24
Autorbijoux
Commiterbijoux

Mensagem de Log

create Recipe from CollaborationMap

Mudança Sumário

Diff

diff -r 4539fffc0091 -r 3016648fdde2 src/pylafiii/chef.py
--- a/src/pylafiii/chef.py Tue Mar 19 14:25:46 2013 +0900
+++ b/src/pylafiii/chef.py Tue Mar 19 14:26:24 2013 +0900
@@ -17,6 +17,7 @@
1717 import tkext
1818 import vtkext
1919 import data
20+import tkFileDialog
2021 from ingredient import rule,event,Logic,Port
2122
2223 def editable(logic):
@@ -84,8 +85,8 @@
8485 xdoc = minidom.parseString(xml)
8586 elif self.XML is not None: # もし XML が与えられていたら XML から
8687 xdoc = minidom.parseString(self.XML)
87- else: # そうでなければ 'netlist' アイテムのみ生成する
88- xdoc = impl.createDocument(None,'netlist',None)
88+ else: # そうでなければ 'recipe' アイテムのみ生成する
89+ xdoc = impl.createDocument(None,'recipe',None)
8990 for k,v in xdoc.__dict__.iteritems(): setattr(self,k,v) # minidomとして必要な属性を追加する
9091 @property
9192 def netlist(self):
@@ -209,7 +210,7 @@
209210 Tkinter.Menu.__init__(self,master,cnf,**kw)
210211 self.add_command(label='remove',command=obj.remove_logic)
211212 def __init__(self,canvas,widget,tag=None,loc=None):
212- #canvas._items.append(self)
213+ canvas.items.append(self)
213214 self._canvas = weakref.ref(canvas)
214215 self._widget = weakref.ref(widget)
215216 self._start = None
@@ -271,9 +272,9 @@
271272 self.event = None
272273 for sequence,id in self._tkevent_id.iteritems():
273274 self.canvas.tag_unbind(self.tag,sequence,id)
275+ self.canvas.items.remove(self)
274276 # if self in self.canvas._items: # CanvasLinkの廃棄処理が完了する前にもう一度呼び出されてしまうバグへの応急処置
275277 # self.canvas._items.remove(self)
276-#
277278 def erase(self):
278279 for id in self._items:
279280 self.canvas.delete(id)
@@ -859,6 +860,8 @@
859860 def __init__(self,master=None,obj=None,cnf={},**kw):
860861 Tkinter.Menu.__init__(self,master,cnf,**kw)
861862 self.add_command(label='place',command=obj.place)
863+ self.add_separator()
864+ self.add_command(label='save',command=obj.save)
862865 def __init__(self,master=None,root=None,cnf={},**kw):
863866 Tkinter.Canvas.__init__(self,master,cnf,**kw)
864867 if root:
@@ -950,6 +953,105 @@
950953 elif self.children.has_key(owner):
951954 ports.append(laf.port(self.children[owner],name))
952955 laf.link(*ports)
956+ def save(self):
957+ recipe = self.recipe
958+ filename = tkFileDialog.asksaveasfilename()
959+ file = open(filename,'w')
960+ file.write(recipe.toxml())
961+ #print recipe.toprettyxml()
962+ @property
963+ def recipe(self):
964+ impl = minidom.getDOMImplementation()
965+ xdoc = impl.createDocument(None, 'recipe', None)
966+ netlist = xdoc.createElement('netlist')
967+ collabomap = xdoc.createElement('collabomap')
968+ recipe = xdoc.documentElement
969+ recipe.appendChild(netlist)
970+ recipe.appendChild(collabomap)
971+ #
972+ logics = list(self.logicfollower.substances.iterkeys())
973+ for logic in logics:
974+ hollow = self.logicfollower.gethollow(logic)
975+ name = logic.name
976+ e = xdoc.createElement('logic')
977+ e.setAttribute('name',name)
978+ e.setAttribute('module',inspect.getmodule(logic).__name__)
979+ e.setAttribute('cls',logic.__class__.__name__)
980+ netlist.appendChild(e)
981+ e = xdoc.createElement('item')
982+ e.setAttribute('name',name)
983+ e.setAttribute('locx','%d' % hollow.loc[0])
984+ e.setAttribute('locy','%d' % hollow.loc[1])
985+ collabomap.appendChild(e)
986+ #
987+ widgetitems = []
988+ for item in self.items:
989+ if isinstance(item,CanvasWidget):
990+ widgetitems.append(item)
991+ for widgetitem in widgetitems:
992+ widget = widgetitem.widget
993+ name = widget.winfo_name()
994+ e = xdoc.createElement('widget')
995+ e.setAttribute('name',name)
996+ e.setAttribute('module',inspect.getmodule(widget).__name__)
997+ e.setAttribute('cls',widget.__class__.__name__)
998+ e.setAttribute('locx','%d' % widgetitem.loc[0])
999+ e.setAttribute('locy','%d' % widgetitem.loc[1])
1000+ collabomap.appendChild(e)
1001+ #
1002+ def portitem(name,owner_name):
1003+ e = xdoc.createElement('port')
1004+ e.setAttribute('name',name)
1005+ e.setAttribute('owner',owner_name)
1006+ return e
1007+ nodes = list(self.nodefollower.substances.iterkeys())
1008+ for node in nodes:
1009+ # ノードに接続されているポートは接続された順番に記録されているからこれを極力保存する
1010+ # Logic - Logic / Logic - Widget / Widget - Logic / Widget - Widget のパターンを考慮する必要あり
1011+ fornetlist = xdoc.createElement('link')
1012+ forcollabomap = xdoc.createElement('link')
1013+ # プライマリオブジェクトとその他を分割する
1014+ observers = node.observers
1015+ for observer in observers: # プライマリオブジェクトを抽出する
1016+ if isinstance(observer.owner,Tkinter.Widget):
1017+ if observer.owner.winfo_name() in self.children: # 配下でない優先ウィジェットは無視する
1018+ prime = observer
1019+ break
1020+ else:
1021+ continue
1022+ elif isinstance(observer.owner,laf.Logic):
1023+ prime = observer
1024+ break
1025+ else:
1026+ continue
1027+ others = observers[(observers.index(prime) + 1):]
1028+ if not others: # もしその他のオブジェクトがひとつもなければスキップする
1029+ continue
1030+ # プライマリオブジェクトを処理する
1031+ if isinstance(prime.owner,laf.Logic):
1032+ # Logic で始まっていれば netlist, collabomap へプライマリを登録する
1033+ name,owner = prime.name, prime.owner
1034+ fornetlist.appendChild(portitem(name,owner.name))
1035+ forcollabomap.appendChild(portitem(name,owner.name))
1036+ elif isinstance(prime.owner,Tkinter.Widget):
1037+ # ウィジェットならば collabomap のみへプライマリを登録する
1038+ name,owner = prime.name, prime.owner
1039+ forcollabomap.appendChild(portitem(name,owner.name))
1040+ # その他のオブジェクトを処理する
1041+ for observer in others:
1042+ name,owner = observer.name, observer.owner
1043+ if isinstance(owner,laf.Logic):
1044+ fornetlist.appendChild(portitem(name,owner.name))
1045+ elif isinstance(owner,Tkinter.Widget):
1046+ wname = owner.winfo_name()
1047+ if wname in self.children: # 自身の配下にないウィジェットは無視する
1048+ forcollabomap.appendChild(portitem(name,wname))
1049+ if len(fornetlist.childNodes) > 1: # プライムノードだけの場合は追加しない
1050+ netlist.appendChild(fornetlist)
1051+ if len(forcollabomap.childNodes) > 1: # プライムノードだけの場合は追加しない
1052+ collabomap.appendChild(forcollabomap)
1053+ #
1054+ return xdoc
9531055
9541056 def isancestor(cls,ancestor):
9551057 for c in inspect.getmro(cls):
Show on old repository browser