Esempio n. 1
0
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
Esempio n. 2
0
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