示例#1
0
    def generate(self):
        logger = logging.getLogger("compiler")
        logger.flush()

        self.compiler.clear()
        self.window.scene.clear()
        self.diagram = Diagram()

        code = Code(str(self.window.qsci.text()))
        uml_objects = self.compiler.compile(code)
        self.set_msg_view(logger)
        
        if logger.has("ERROR CRITICAL"):
            return

        for uml_object in uml_objects.values():
            self.diagram.add(uml_object)

        # nodes must be updated before layouting
        for node in self.diagram.nodes.values():
            node.update()

        # needed to layout and draw edges
        self.diagram.set_anchors()
        LayoutFactory.get(str(self.active_layout_action.text())).apply(self.diagram)
        self.__update()
示例#2
0
    def setUp(self):
        self.diagram = Diagram(modules_path="omelette.fromage.test.data")

        self.uml_object = Mock()
        self.uml_object.name = "test"
示例#3
0
class DiagramTest(unittest.TestCase):

    def setUp(self):
        self.diagram = Diagram(modules_path="omelette.fromage.test.data")

        self.uml_object = Mock()
        self.uml_object.name = "test"

    def test_node(self):
        self.uml_object.type = "node"
        self.diagram.add(self.uml_object)

        self.assertTrue("test" in self.diagram.nodes)
        self.assertFalse("test" in self.diagram.edges)

    def test_edge(self):
        self.uml_object.type = "edge"
        self.diagram.add(self.uml_object)

        self.assertTrue("test" in self.diagram.edges)
        self.assertFalse("test" in self.diagram.nodes)

    def test_clear(self):
        self.uml_object.type = "node"
        self.diagram.add(self.uml_object)

        self.uml_object.type = "edge"
        self.diagram.add(self.uml_object)

        self.diagram.clear()

        self.assertFalse("test" in self.diagram.edges)
        self.assertFalse("test" in self.diagram.nodes)

    def test_anchor(self):
        target = Mock()
        target.type = "node"

        source = Mock()
        source.type = "node"

        relation = Mock()
        relation.type = "edge"

        # given two node objects connected by an edge object
        
        target.name = "target"
        source.name = "source"

        properties = {"source-object": "source", "target-object": "target"}

        def getitem(name):
            return properties[name]

        relation.__getitem__ = Mock(side_effect=getitem)
        relation.name = "relation"

        # added to diagram

        self.diagram.add(relation)
        self.diagram.add(target)
        self.diagram.add(source)

        # when anchors are set 

        self.diagram.set_anchors()

        # each DrawableNode object should be referenced by proper DrawableEdge object's anchors
        drawable_relation = self.diagram.edges["relation"]
        drawable_source = self.diagram.nodes["source"]
        drawable_target = self.diagram.nodes["target"]

        self.assertEquals(drawable_source, drawable_relation.source_anchor.slot)
        self.assertEquals(drawable_target, drawable_relation.target_anchor.slot)

        # and each DrawableNode object's anchor should reference the
        # DrawableEdge object
        self.assertEquals(drawable_relation, drawable_source.anchors.pop().connector)
        self.assertEquals(drawable_relation, drawable_target.anchors.pop().connector)
示例#4
0
文件: cli.py 项目: barnaba/omelette
    if(output == ""):
        print "Output file not provided."
        return -1

    if(input == ""):
        input_file = sys.stdin
    else:
        try:
            input_file = open(input, 'r')
        except IOError, err:
            print "IOError: " + str(err)
            return 2
    code = Code(input_file.read())

    diagram = Diagram()
    scene = QGraphicsScene(None)
    compiler = Compiler(Library.load_libraries())

    uml_objects = compiler.compile(code)
    if not logger.has("ERROR CRITICAL"):
        for uml_object in uml_objects.values():
            diagram.add(uml_object)

        # nodes must be updated before layouting
        for node in diagram.nodes.values():
            node.update()

        # needed to layout and draw edges
        diagram.set_anchors()
示例#5
0
class Actions(object):

    def __init__(self, window):
        self.compiler = Compiler(Library.load_libraries())
        self.window = window

        self.filename = QtCore.QString()
        self.window.actionSave.setDisabled(True)
        self.window.actionSaveAs.setDisabled(True)

        self.__export_scene_margins = 50

        self.active_layout_action = QtGui.QAction(QObject())

    def __update(self):
        # edges must be updated after nodes are updated and layouted
        for edge in self.diagram.edges.values():
            edge.update()

        # this actually paints things, so must be invoked when everything is
        # ready
        for drawable in self.diagram.elements():
            self.window.scene.addItem(drawable)
            drawable.resize_scene_rect()

    def generate(self):
        logger = logging.getLogger("compiler")
        logger.flush()

        self.compiler.clear()
        self.window.scene.clear()
        self.diagram = Diagram()

        code = Code(str(self.window.qsci.text()))
        uml_objects = self.compiler.compile(code)
        self.set_msg_view(logger)
        
        if logger.has("ERROR CRITICAL"):
            return

        for uml_object in uml_objects.values():
            self.diagram.add(uml_object)

        # nodes must be updated before layouting
        for node in self.diagram.nodes.values():
            node.update()

        # needed to layout and draw edges
        self.diagram.set_anchors()
        LayoutFactory.get(str(self.active_layout_action.text())).apply(self.diagram)
        self.__update()

    def get_layout_name(self, layout_action):
        self.active_layout_action = layout_action

    def check_layout_item(self, layout_action):
        layouts = self.window.menuLayout.actions()
        layouts.remove(layout_action)
        for layout in layouts:
            layout.setChecked(False)

    def enable_save(self):
        self.window.actionSave.setEnabled(True)
        self.window.actionSaveAs.setEnabled(True)

    def new_file(self):
        self.window.qsci.setText(QtCore.QString(""))
        self.window.actionSave.setDisabled(True)
        self.window.actionSaveAs.setDisabled(True)
        self.window.statusbar.showMessage('Created empty document', 2000)

    def open_file(self):
        fn = QtGui.QFileDialog.getOpenFileName(self.window, "Load file", QtCore.QString(), "UML Files (*.uml)")
        if fn.isEmpty():
            self.window.statusbar.showMessage('Loading aborted', 2000)
            return
        filename = str(fn)
        self.window.qsci.clear()

        try:
            f = open(filename, 'r')
        except:
            return

        for line in f:
            self.window.qsci.append(line)

        f.close()

        self.window.setWindowTitle(filename)
        self.window.statusbar.showMessage('Loaded document %s' % (filename), 2000)

        self.generate()

    def save_file(self):
        if self.filename.isEmpty():
            self.save_file_as()
            return
        try:
            f = open(str(self.filename), 'w+')
        except:
            self.window.statusbar.showMessage('Cannot write to %s' % (self.filename), 2000)
            return

        f.write(str(self.window.qsci.text()))
        f.close()

        self.window.qsci.setModified(0)
        self.window.setWindowTitle(self.filename)
        self.window.statusbar.showMessage('Document %s saved' % (self.filename), 2000)

    def save_file_as(self):
        fn = QtGui.QFileDialog.getSaveFileName(self.window, QtCore.QString(), QtCore.QString())
        if not fn.isEmpty():
            self.filename = fn
            self.save_file()
        else:
            self.window.statusbar.showMessage('Saving aborted', 2000)

    def cut(self):
        self.window.qsci.cut()

    def copy(self):
        self.window.qsci.copy()

    def paste(self):
        self.window.qsci.paste()

    def undo(self):
        self.window.qsci.undo()

    def redo(self):
        self.window.qsci.redo()

    def __adjust_scene_rect(self):
        sceneRect = QRectF(0,0,0,0)

        for node in self.diagram.nodes.values():
            sceneRect = sceneRect.united(node.globalFullBoundingRect())

        esm = self.__export_scene_margins
        sceneRect = sceneRect.adjusted(-esm, -esm, esm, esm)

        self.window.scene.setSceneRect(sceneRect)

    def export(self):
        fn = QtGui.QFileDialog.getSaveFileName(self.window, "Save Image", QtCore.QString(), "Image Files (*.png)");
        if fn.isEmpty():
            self.window.statusbar.showMessage('Saving aborted', 2000)
            return

        self.__adjust_scene_rect()

        img = QImage(self.window.scene.sceneRect().size().toSize(), QImage.Format_ARGB32)
        painter = QPainter(img)

        absoluteRect = QRectF(0, 0, self.window.scene.sceneRect().width(), self.window.scene.sceneRect().height())

        painter.fillRect(absoluteRect, QBrush(QColor(255, 255, 255), Qt.SolidPattern))
        painter.resetMatrix()
        self.window.scene.render(painter)
        painter.end()

        if(img.save(fn) == False):
            self.window.statusbar.showMessage('Saving failed', 2000)
            return

        self.window.statusbar.showMessage('Image %s saved' % (self.filename), 2000)

    def set_msg_view(self, logger):
        msg_view = self.window.msg_view
        events = logger.events

        for row in range(msg_view.rowCount()):
            msg_view.removeRow(row)

        for n, e in enumerate(events):
            descr = QtGui.QTableWidgetItem(str(e.msg))
            level = QtGui.QTableWidgetItem()
            line_nr = QtGui.QTableWidgetItem(str(e.line_number))

            resources_path = os.path.normcase("../../omelette/fromage/resources/")

            if e.level == "INFO":
                level.setIcon(QIcon(QPixmap(resources_path + "info.png")))
            elif e.level == "WARNING":
                level.setIcon(QIcon(QPixmap(resources_path + "warning.png")))
            elif e.level == "ERROR":
                level.setIcon(QIcon(QPixmap(resources_path + "error.png")))
            elif e.level == "CRITICAL":
                level.setIcon(QIcon(QPixmap(resources_path + "critical.png")))

            msg_view.setRowCount(n+1)
            msg_view.setItem(n, 0, level)
            msg_view.setItem(n, 1, line_nr)
            msg_view.setItem(n, 2, descr)

    def jump_to_line(self, row, column):
        line_nr = self.window.msg_view.item(row, 1).text()
        self.window.qsci.setCursorPosition(int(line_nr), 1)