Revisão | 3016648fdde2f0f283edeeed01e34fe0b02c536d (tree) |
---|---|
Hora | 2013-03-19 14:26:24 |
Autor | bijoux |
Commiter | bijoux |
create Recipe from CollaborationMap
@@ -17,6 +17,7 @@ | ||
17 | 17 | import tkext |
18 | 18 | import vtkext |
19 | 19 | import data |
20 | +import tkFileDialog | |
20 | 21 | from ingredient import rule,event,Logic,Port |
21 | 22 | |
22 | 23 | def editable(logic): |
@@ -84,8 +85,8 @@ | ||
84 | 85 | xdoc = minidom.parseString(xml) |
85 | 86 | elif self.XML is not None: # もし XML が与えられていたら XML から |
86 | 87 | 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) | |
89 | 90 | for k,v in xdoc.__dict__.iteritems(): setattr(self,k,v) # minidomとして必要な属性を追加する |
90 | 91 | @property |
91 | 92 | def netlist(self): |
@@ -209,7 +210,7 @@ | ||
209 | 210 | Tkinter.Menu.__init__(self,master,cnf,**kw) |
210 | 211 | self.add_command(label='remove',command=obj.remove_logic) |
211 | 212 | def __init__(self,canvas,widget,tag=None,loc=None): |
212 | - #canvas._items.append(self) | |
213 | + canvas.items.append(self) | |
213 | 214 | self._canvas = weakref.ref(canvas) |
214 | 215 | self._widget = weakref.ref(widget) |
215 | 216 | self._start = None |
@@ -271,9 +272,9 @@ | ||
271 | 272 | self.event = None |
272 | 273 | for sequence,id in self._tkevent_id.iteritems(): |
273 | 274 | self.canvas.tag_unbind(self.tag,sequence,id) |
275 | + self.canvas.items.remove(self) | |
274 | 276 | # if self in self.canvas._items: # CanvasLinkの廃棄処理が完了する前にもう一度呼び出されてしまうバグへの応急処置 |
275 | 277 | # self.canvas._items.remove(self) |
276 | -# | |
277 | 278 | def erase(self): |
278 | 279 | for id in self._items: |
279 | 280 | self.canvas.delete(id) |
@@ -859,6 +860,8 @@ | ||
859 | 860 | def __init__(self,master=None,obj=None,cnf={},**kw): |
860 | 861 | Tkinter.Menu.__init__(self,master,cnf,**kw) |
861 | 862 | self.add_command(label='place',command=obj.place) |
863 | + self.add_separator() | |
864 | + self.add_command(label='save',command=obj.save) | |
862 | 865 | def __init__(self,master=None,root=None,cnf={},**kw): |
863 | 866 | Tkinter.Canvas.__init__(self,master,cnf,**kw) |
864 | 867 | if root: |
@@ -950,6 +953,105 @@ | ||
950 | 953 | elif self.children.has_key(owner): |
951 | 954 | ports.append(laf.port(self.children[owner],name)) |
952 | 955 | 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 | |
953 | 1055 | |
954 | 1056 | def isancestor(cls,ancestor): |
955 | 1057 | for c in inspect.getmro(cls): |