class WorkGroup(wx.Frame): def __init__(self, parent, empty=False): self.parent = parent self._preferences = Preferences(self) self.list_geo = [] self.list_space = [] self.list_field = [] self.stockUndo = [] self.stockRedo = [] self.createInspector() self.createViewer() # self.createFields() self.initialize(empty=empty) self.directAct = directActions(self) # needed when saving the workgroup self.filename = None # needed for temporary save t = localtime() tmp_file = "session-"\ +str(t.tm_year)+"-"+str(t.tm_mon)+"-"+str(t.tm_mday)\ +"_"+str(t.tm_hour)+"h"+str(t.tm_min)+"min"\ +".wkl" self.tmp_filename = tmp_file # auto save is activated by default self.auto_save = True self._macroRecording = False self._macro_script = scripture(self) self._pythonEditor = PythonEditor(self.parent, -1, '') self._pythonEditor.Show(False) @property def pythonEditor(self): return self._pythonEditor def set_pythonEditor(self, edt): self._pythonEditor = edt @property def preferences(self): return self._preferences def set_macroRecording(self, value): self._macroRecording = value @property def macroRecording(self): return self._macroRecording @property def macro_script(self): return self._macro_script def initialize(self, empty=False): """ create an empty geometry object """ if not empty: from geometry import geometry geo = geometry() self.add_geometry(geo) def createViewer(self): from viewer import Viewer self.viewer = Viewer(self, self.parent \ , pos=(500,50) \ , size=wx.Size(700,700)) self.viewer.Show(True) def createInspector(self): from inspector import Inspector self.inspector = Inspector(self, self.parent, -1, 'Inspector' \ , pos=(500,50) \ , size=wx.Size(450,550)) self.inspector.Show(True) def createSpaces(self): from spaces import Inspector self.spaces = Inspector(self, self.parent, -1, 'Spaces' \ , pos=(500,300) \ , size=wx.Size(450,550)) self.spaces.Show(True) def createFields(self): from fields import Inspector self.fields = Inspector(self, self.parent, -1, 'Fields' \ , pos=(500,300) \ , size=wx.Size(450,550)) self.fields.Show(True) def appendAction(self, undo): self.stockUndo.append(undo) if self.stockRedo: try: del self.stockRedo[:] except: print("problem occurs while deleting stockRedo") def add_geometry(self, geo, activeUndo=True): self.list_geo.append(geo) geoItem = self.inspector.add_geometry(geo) geo.set_treeItem(geoItem) # undo action if activeUndo: undo = UndoAddGeometry(self, geoItem, geo) self.appendAction(undo) self.Refresh() return geoItem def add_patch(self, geoItem, geo, patch, activeUndo=True): geo.append(patch) patchItem = self.inspector.add_patch(geoItem, geo, patch) # undo action if activeUndo: undo = UndoAddPatch(self, patchItem, patch, geo, geoItem) self.appendAction(undo) self.Refresh() return patchItem def add_space(self, geo, testcase=None): # create the Frame if list_space is empty if len(self.list_space) == 0: self.createSpaces() from pigasus.fem.basicPDE import basicPDE if testcase is None: testcase = {} testcase['AllDirichlet'] = True PDE = basicPDE(geometry=geo, testcase=testcase) V = PDE.space self.list_space.append(V) self.spaces.add_space(V) self.Refresh() def add_field(self, field): if len(self.list_field) == 0: self.createFields() self.list_field.append(field) self.fields.Show(True) self.fields.add_field(field) self.Refresh() def remove_geometry(self, geoItem, geo, activeUndo=True): # undo action if activeUndo: undo = UndoRemoveGeometry(self, geoItem, geo) self.appendAction(undo) # remove geo from the dictionary self.list_geo.remove(geo) # delete the corresponding item from the inspector self.inspector.remove_geometry(geoItem) self.inspector.reset_currentAll() # refresh the viewer self.Refresh() def remove_patch(self, patchItem, patch, geo=None, activeUndo=True): # remove patch from the dictionary if geo is None: geo = self.get_geometry_from_patch(patch) # undo action if activeUndo: geoItem = self.inspector.tree.GetItemParent(patchItem) undo = UndoRemovePatch(self, patchItem, patch, geo, geoItem) self.appendAction(undo) geo.remove_patch(patch) print("%") # delete the corresponding item from the inspector self.inspector.remove_patch(patchItem) print("%%") self.inspector.reset_currentAll() print("%%%") # refresh the viewer self.Refresh() def remove_field(self, fieldItem, field): # remove geo from the dictionary self.list_field.remove(field) # delete the corresponding item from the inspector self.fields.remove_field(fieldItem) self.fields.reset_currentAll() # refresh the viewer self.Refresh() def get_geometry_from_patch(self, patch): # remove patch from the dictionary print(("looking for patch ", id(patch))) for geo in self.list_geo: for nrb in geo: print((id(nrb))) if id(nrb) == id(patch): print("found.") return geo print("Not found.") def Refresh(self, inspector=False): if inspector: self.inspector.Refresh() # save in temp file if self.auto_save: self.save(filename=self.tmp_filename) self.viewer.drawWorld() self.viewer.Refresh() def message(self, txt): self.viewer.statusbar.SetStatusText(txt) def save(self, filename=None): if filename is None: filename = self.filename # this means that self.filename is also None if filename is None: # Create a save file dialog from global_vars import CAIDWorkGroupwildcard dialog = wx.FileDialog ( None\ , style = wx.SAVE | wx.OVERWRITE_PROMPT\ , wildcard=CAIDWorkGroupwildcard) # Show the dialog and get user input if dialog.ShowModal() == wx.ID_OK: filename = dialog.GetPath() self.filename = filename # The user did not select anything else: print('Nothing was selected.') # Destroy the dialog dialog.Destroy() # ... create xml doc from xml.dom.minidom import Document # Create the minidom document doc = Document() # Create the <theme> base element rootElt = self.viewer.theme.save(doc=doc) # Create the <caid> base element rootElt = doc.createElement("caid") # set camera attributs eye = self.viewer.lookAt.GetEye() rootElt.setAttribute("eye", str(eye)) center = self.viewer.lookAt.GetCenter() rootElt.setAttribute("center", str(center)) up = self.viewer.lookAt.GetUp() rootElt.setAttribute("up", str(up)) doc.appendChild(rootElt) # ... # ... themeElt, doc = self.viewer.theme.save(doc=doc) rootElt.appendChild(themeElt) # ... # ... from caid.io import XML io = XML() for geo in self.list_geo: geo.save_attributs() geoElt = doc.createElement("geometry") doc = io.geotoxml(geo, doc, geoElt) rootElt.appendChild(geoElt) # ... if filename is not None: with open(filename, 'w') as f: f.write(doc.toprettyxml()) else: print("No file was specified") def open(self, filename=None): if filename is not None: self.filename = filename else: from global_vars import CAIDWorkGroupwildcard # Create an open file dialog dialog = wx.FileDialog(None\ , style = wx.OPEN\ , wildcard=CAIDWorkGroupwildcard) # Show the dialog and get user input if dialog.ShowModal() == wx.ID_OK: self.filename = dialog.GetPath() # The user did not select anything else: print('Nothing was selected.') # Destroy the dialog dialog.Destroy() from caid.cad_geometry import cad_geometry from caid.io import XML from geometry import geometry io = XML() from xml.dom.minidom import parse doc = parse(self.filename) rootElt = doc.documentElement # read attributs # get camera attributs eye = strtoArray(rootElt.getAttribute("eye")) self.viewer.lookAt.SetEye(eye) center = strtoArray(rootElt.getAttribute("center")) self.viewer.lookAt.SetCenter(center) up = strtoArray(rootElt.getAttribute("up")) self.viewer.lookAt.SetUp(up) # get colors attributs # ... try: self.viewer.theme.load(rootElt=rootElt) except: print("Theme can not be loaded. Dark theme will be used.") self.viewer.theme.set_theme("dark") # ... for geoElt in rootElt.getElementsByTagName("geometry"): geo = cad_geometry() io.xmltogeo(geo, doc, geoElt) _geo = geometry(geo) _geo.load_attributs() self.add_geometry(_geo) self.Refresh() # sets the temporary file for auto-save tmp = self.filename.split('/')[-1] basedir = self.filename.split(tmp)[0] self.tmp_filename = basedir + "~" + tmp
class WorkGroup(wx.Frame): def __init__(self, parent, empty=False): self.parent = parent self._preferences = Preferences(self) self.list_geo = [] self.list_space = [] self.list_field = [] self.stockUndo = [] self.stockRedo = [] self.createInspector() self.createViewer() # self.createFields() self.initialize(empty=empty) self.directAct = directActions(self) # needed when saving the workgroup self.filename = None # needed for temporary save t = localtime() tmp_file = "session-"\ +str(t.tm_year)+"-"+str(t.tm_mon)+"-"+str(t.tm_mday)\ +"_"+str(t.tm_hour)+"h"+str(t.tm_min)+"min"\ +".wkl" self.tmp_filename = tmp_file # auto save is activated by default self.auto_save = True self._macroRecording = False self._macro_script = scripture(self) self._pythonEditor = PythonEditor(self.parent, -1, '') self._pythonEditor.Show(False) @property def pythonEditor(self): return self._pythonEditor def set_pythonEditor(self, edt): self._pythonEditor = edt @property def preferences(self): return self._preferences def set_macroRecording(self, value): self._macroRecording = value @property def macroRecording(self): return self._macroRecording @property def macro_script(self): return self._macro_script def initialize(self, empty=False): """ create an empty geometry object """ if not empty: from geometry import geometry geo = geometry() self.add_geometry(geo) def createViewer(self): from viewer import Viewer self.viewer = Viewer(self, self.parent \ , pos=(500,50) \ , size=wx.Size(700,700)) self.viewer.Show(True) def createInspector(self): from inspector import Inspector self.inspector = Inspector(self, self.parent, -1, 'Inspector' \ , pos=(500,50) \ , size=wx.Size(450,550)) self.inspector.Show(True) def createSpaces(self): from spaces import Inspector self.spaces = Inspector(self, self.parent, -1, 'Spaces' \ , pos=(500,300) \ , size=wx.Size(450,550)) self.spaces.Show(True) def createFields(self): from fields import Inspector self.fields = Inspector(self, self.parent, -1, 'Fields' \ , pos=(500,300) \ , size=wx.Size(450,550)) self.fields.Show(True) def appendAction(self, undo): self.stockUndo.append( undo ) if self.stockRedo: try: del self.stockRedo[:] except: print("problem occurs while deleting stockRedo") def add_geometry(self, geo, activeUndo=True): self.list_geo.append(geo) geoItem = self.inspector.add_geometry(geo) geo.set_treeItem(geoItem) # undo action if activeUndo: undo = UndoAddGeometry(self, geoItem, geo) self.appendAction(undo) self.Refresh() return geoItem def add_patch(self, geoItem, geo, patch, activeUndo=True): geo.append(patch) patchItem = self.inspector.add_patch(geoItem, geo, patch) # undo action if activeUndo: undo = UndoAddPatch(self, patchItem, patch, geo, geoItem) self.appendAction(undo) self.Refresh() return patchItem def add_space(self, geo, testcase=None): # create the Frame if list_space is empty if len(self.list_space) == 0: self.createSpaces() from pigasus.fem.basicPDE import basicPDE if testcase is None: testcase = {} testcase['AllDirichlet'] = True PDE = basicPDE(geometry=geo, testcase=testcase) V = PDE.space self.list_space.append(V) self.spaces.add_space(V) self.Refresh() def add_field(self, field): if len(self.list_field) == 0: self.createFields() self.list_field.append(field) self.fields.Show(True) self.fields.add_field(field) self.Refresh() def remove_geometry(self, geoItem, geo, activeUndo=True): # undo action if activeUndo: undo = UndoRemoveGeometry(self, geoItem, geo) self.appendAction(undo) # remove geo from the dictionary self.list_geo.remove(geo) # delete the corresponding item from the inspector self.inspector.remove_geometry(geoItem) self.inspector.reset_currentAll() # refresh the viewer self.Refresh() def remove_patch(self, patchItem, patch, geo=None, activeUndo=True): # remove patch from the dictionary if geo is None: geo = self.get_geometry_from_patch(patch) # undo action if activeUndo: geoItem = self.inspector.tree.GetItemParent(patchItem) undo = UndoRemovePatch(self, patchItem, patch, geo, geoItem) self.appendAction(undo) geo.remove_patch(patch) print("%") # delete the corresponding item from the inspector self.inspector.remove_patch(patchItem) print("%%") self.inspector.reset_currentAll() print("%%%") # refresh the viewer self.Refresh() def remove_field(self, fieldItem, field): # remove geo from the dictionary self.list_field.remove(field) # delete the corresponding item from the inspector self.fields.remove_field(fieldItem) self.fields.reset_currentAll() # refresh the viewer self.Refresh() def get_geometry_from_patch(self, patch): # remove patch from the dictionary print(("looking for patch ", id(patch))) for geo in self.list_geo: for nrb in geo: print((id(nrb))) if id(nrb) == id(patch): print("found.") return geo print("Not found.") def Refresh(self, inspector=False): if inspector: self.inspector.Refresh() # save in temp file if self.auto_save: self.save(filename=self.tmp_filename) self.viewer.drawWorld() self.viewer.Refresh() def message(self, txt): self.viewer.statusbar.SetStatusText(txt) def save(self, filename=None): if filename is None: filename = self.filename # this means that self.filename is also None if filename is None: # Create a save file dialog from global_vars import CAIDWorkGroupwildcard dialog = wx.FileDialog ( None\ , style = wx.SAVE | wx.OVERWRITE_PROMPT\ , wildcard=CAIDWorkGroupwildcard) # Show the dialog and get user input if dialog.ShowModal() == wx.ID_OK: filename = dialog.GetPath() self.filename = filename # The user did not select anything else: print('Nothing was selected.') # Destroy the dialog dialog.Destroy() # ... create xml doc from xml.dom.minidom import Document # Create the minidom document doc = Document() # Create the <theme> base element rootElt = self.viewer.theme.save(doc=doc) # Create the <caid> base element rootElt = doc.createElement("caid") # set camera attributs eye = self.viewer.lookAt.GetEye() rootElt.setAttribute("eye", str(eye)) center = self.viewer.lookAt.GetCenter() rootElt.setAttribute("center", str(center)) up = self.viewer.lookAt.GetUp() rootElt.setAttribute("up", str(up)) doc.appendChild(rootElt) # ... # ... themeElt, doc = self.viewer.theme.save(doc=doc) rootElt.appendChild(themeElt) # ... # ... from caid.io import XML io = XML() for geo in self.list_geo: geo.save_attributs() geoElt = doc.createElement("geometry") doc = io.geotoxml(geo, doc, geoElt) rootElt.appendChild(geoElt) # ... if filename is not None: f = open(filename, 'wr') s = doc.toprettyxml() f.write(s) f.close() else: print("No file was specified") def open(self, filename=None): if filename is not None: self.filename = filename else: from global_vars import CAIDWorkGroupwildcard # Create an open file dialog dialog = wx.FileDialog(None\ , style = wx.OPEN\ , wildcard=CAIDWorkGroupwildcard) # Show the dialog and get user input if dialog.ShowModal() == wx.ID_OK: self.filename = dialog.GetPath() # The user did not select anything else: print('Nothing was selected.') # Destroy the dialog dialog.Destroy() from caid.cad_geometry import cad_geometry from caid.io import XML from geometry import geometry io = XML() from xml.dom.minidom import parse doc = parse(self.filename) rootElt = doc.documentElement # read attributs # get camera attributs eye = strtoArray(rootElt.getAttribute("eye")) self.viewer.lookAt.SetEye(eye) center = strtoArray(rootElt.getAttribute("center")) self.viewer.lookAt.SetCenter(center) up = strtoArray(rootElt.getAttribute("up")) self.viewer.lookAt.SetUp(up) # get colors attributs # ... try: self.viewer.theme.load(rootElt=rootElt) except: print("Theme can not be loaded. Dark theme will be used.") self.viewer.theme.set_theme("dark") # ... for geoElt in rootElt.getElementsByTagName("geometry"): geo = cad_geometry() io.xmltogeo(geo, doc, geoElt) _geo = geometry(geo) _geo.load_attributs() self.add_geometry(_geo) self.Refresh() # sets the temporary file for auto-save tmp = self.filename.split('/')[-1] basedir = self.filename.split(tmp)[0] self.tmp_filename = basedir+"~"+tmp