コード例 #1
0
ファイル: scg_modes.py プロジェクト: Okne/ymapostis
 def _createVisualMenu(self):
     """Creates visual menu
     """
     self.vis_menu = VisualMenu()
     
     # identificator changing
     self.mi_idtf = VisualMenuItem()
     self.mi_idtf.callback = self._handlerChangeIdtf
     self.mi_idtf.setText("Change identifier")
     self.vis_menu.appendItem(self.mi_idtf)
     
     # type changing
     self.mi_type = VisualMenuItem()
     self.mi_type.callback = self._handlerChangeType
     self.mi_type.setText("Change type")
     self.vis_menu.appendItem(self.mi_type)
     
     # content changing
     self.mi_contentChange = VisualMenuItem()
     self.mi_contentChange.callback = self._handlerChangeContent
     self.mi_contentChange.setText("Change content")
     self.vis_menu.appendItem(self.mi_contentChange)
     
     # content showing
     self.mi_content_show = VisualMenuItem()
     self.mi_content_show.callback = self._handlerContentShow
     self.mi_content_show.setText("Show content")
     self.vis_menu.appendItem(self.mi_content_show)
     
     # content hiding
     self.mi_content_hide = VisualMenuItem()
     self.mi_content_hide.callback = self._handlerContentHide
     self.mi_content_hide.setText("Hide content")
     self.vis_menu.appendItem(self.mi_content_hide)
コード例 #2
0
    def _createVisualMenu(self):
        """Creates visual menu
        """
        self.vis_menu = VisualMenu()

        # identificator changing
        self.mi_idtf = VisualMenuItem()
        self.mi_idtf.callback = self._handlerChangeIdtf
        self.mi_idtf.setText("Change identifier")
        self.vis_menu.appendItem(self.mi_idtf)

        # type changing
        self.mi_type = VisualMenuItem()
        self.mi_type.callback = self._handlerChangeType
        self.mi_type.setText("Change type")
        self.vis_menu.appendItem(self.mi_type)

        # content changing
        self.mi_contentChange = VisualMenuItem()
        self.mi_contentChange.callback = self._handlerChangeContent
        self.mi_contentChange.setText("Change content")
        self.vis_menu.appendItem(self.mi_contentChange)

        # content showing
        self.mi_content_show = VisualMenuItem()
        self.mi_content_show.callback = self._handlerContentShow
        self.mi_content_show.setText("Show content")
        self.vis_menu.appendItem(self.mi_content_show)

        # content hiding
        self.mi_content_hide = VisualMenuItem()
        self.mi_content_hide.callback = self._handlerContentHide
        self.mi_content_hide.setText("Hide content")
        self.vis_menu.appendItem(self.mi_content_hide)
コード例 #3
0
ファイル: scg_modes.py プロジェクト: Okne/ymapostis
class SCgEditMode(BaseEditMode):
    """Mode that allows user to edit scg-constructions
    
    """
    # states
    ES_Move         = BaseEditMode.ES_Count     # object movement state
    ES_LineCreate   = ES_Move + 1               # line creation mode
    ES_TypeChange   = ES_LineCreate + 1         # type changing mode
    ES_ContType     = ES_TypeChange + 1         # content type changing
    ES_Translate    = ES_ContType + 1           # translate camera position
    ES_ContourCreate= ES_Translate + 1          # contour creation
    ES_Count        = ES_ContourCreate + 1      # count of all states
    
    EM_Select   =   0
    EM_Pair     =   1
    EM_Bus      =   2
    EM_Contour  =   3
    EM_Count    =   4
    
    def __init__(self, _logic):
        BaseEditMode.__init__(self, _logic, "Edit mode")
        
        # mouse objects for line creation mode
        self.line_mode_beg = None
        self.line_mode_obj = scg_alphabet.createSCgNode('mnode')
        self.line_mode_obj.setScale(ogre.Vector3(0.1, 0.1, 0.1))
        self.line_mode_obj.setPosition(ogre.Vector3(0, 0, 0))
        self.line_mode_line = scg_alphabet.createSCgPair('mpair')
        self.line_mode_line.setEnd(self.line_mode_obj)
        self.line_mode_line.setState(objects.Object.OS_Normal)
        # highlighted object
        self.highlighted_obj = None
        
        # widgets
        self.type_combo = None
        self.content_combo = None
        
        # object we worked on in current state
        self.object_active = None
        # current editor state
        self.state = SCgEditMode.ES_None
        # current mouse position
        self.mouse_pos = (0, 0)
        
        # visual menu
#        self.vis_menu = None
#        self._createVisualMenu()
        
        # 3d navigation mode
        self.rotX = 0.0 
        self.rotY = 0.0
        self.move = ogre.Vector3(0.0, 0.0, 0.0)
        self.moveSpeed = 5.0
        self.moveScale = 5.0
        
        self.animationState = None
        
        # tool bar
#        self.toolbar = ToolBar()
#        self.toolbar.setVisible(False)
#        self.toolbar.setEnabled(True)
#        for idx in xrange(self.EM_Count):
#            button = self.toolbar.appendButton("", "scg_toolbar_icons.png", idx, (32, 32), (0, 0, 256, 32))
#            button.setCheckable(True)
#            button.setUserData(idx)
#            button.eventPush = self._onToolBarButtonPush
#            
#        self.toolbar.setButtonSize(38)
            
        
    def __del__(self):
        BaseEditMode.__del__(self)
        
        
    def delete(self):
        """Deletion message
        """
        BaseEditMode.delete(self)
        
#        self.vis_menu.delete()
        
        self.line_mode_beg = None
        
        self.line_mode_line.delete()
        self.line_mode_line = None
        self.line_mode_obj.delete()
        self.line_mode_obj = None
        
        self.object_active = None
        
        
    def activate(self):
        """Activation message
        """
        BaseEditMode.activate(self)
#        self._updateVisualMenu()
        
    def deactivate(self):
        """Deactivation message
        """
        BaseEditMode.deactivate(self)
#        self._updateVisualMenu()
        
    def _update(self, timeSinceLastFrame):
        """Updates mode
        """
#        if self.vis_menu.isShow():
        sel_objects = self._logic._getSheet().getSelected()
        n = len(sel_objects)
#        if n == 1:
#            obj = sel_objects[0]
#            self.vis_menu.move(render_engine.pos3dTo2dWindow(sel_objects[0].getPosition()))
#        self.vis_menu._update(timeSinceLastFrame)
        
        if not self._ctrl and self.state is SCgEditMode.ES_Translate:
            if self._logic._getSheet().isRoot and render_engine.viewMode is render_engine.Mode_Perspective:
                # processing keyboard input
                if  render_engine._oisKeyboard.isKeyDown(ois.KC_A):
                    self.move.x = -self.moveScale    # Move camera left
        
                if  render_engine._oisKeyboard.isKeyDown(ois.KC_D):
                    self.move.x = self.moveScale    # Move camera RIGHT
        
                if  render_engine._oisKeyboard.isKeyDown(ois.KC_W):
                    self.move.z = -self.moveScale  # Move camera forward
        
                if  render_engine._oisKeyboard.isKeyDown(ois.KC_S):
                    self.move.z = self.moveScale    # Move camera backward
                    
                if  render_engine._oisKeyboard.isKeyDown(ois.KC_Q):
                    self.move.y = self.moveScale  # Move camera up
        
                if  render_engine._oisKeyboard.isKeyDown(ois.KC_E):
                    self.move.y = -self.moveScale    # Move camera down
            
                # updating camera position
                camera = render_engine._ogreCamera
                cameraNode = render_engine._ogreCameraNode
                cameraNode.translate(camera.getOrientation() * self.move * timeSinceLastFrame)
                camera.yaw(self.rotX)
                camera.pitch(self.rotY)
                self.move = ogre.Vector3(0, 0, 0)
                self.rotX = 0
                self.rotY = 0
                
        needMove = False
        offset = ogre.Vector3(0, 0, 0)
        dv = 1 * timeSinceLastFrame
        
#        if render_engine._oisKeyboard.isKeyDown(ois.KC_LEFT):
#            offset.x = -dv 
#            needMove = True
#        if render_engine._oisKeyboard.isKeyDown(ois.KC_RIGHT):
#            offset.x = dv
#            needMove = True
#        if render_engine._oisKeyboard.isKeyDown(ois.KC_UP):
#            offset.y = dv
#            needMove = True
#        if render_engine._oisKeyboard.isKeyDown(ois.KC_DOWN):
#            offset.y = -dv
#            needMove = True
#        if render_engine._oisKeyboard.isKeyDown(ois.KC_Z):
#            offset.z = dv
#            needMove = True
#        if render_engine._oisKeyboard.isKeyDown(ois.KC_X):
#            offset.z = -dv
#            needMove = True
#            
#        if needMove:
#            for obj in self._logic._getSheet().getSelected():
#                obj.setPosition(obj.getPosition() + render_engine._ogreCamera.getOrientation() * offset)
        
        if self.animationState is not None:
            self.animationState.addTime(timeSinceLastFrame)
        
        
    def _highlight(self):
        """Highlighting object under mouse
        """
        mobjects = self._logic._getSheet()._getObjectsUnderMouse(self.mouse_pos)
        obj = None
        if len(mobjects) > 0:
            obj = mobjects[0][1]
        
        if (obj is None) and (self.highlighted_obj is None):    return 
        if (obj is self.highlighted_obj):   return
        
        # change highlight
        if self.highlighted_obj is not None:
            self.highlighted_obj.resetState()
#            if self.highlighted_obj._getSelected():
#                self.highlighted_obj.setState(objects.Object.OS_Selected)
#            else:
#                self.highlighted_obj.setState(objects.Object.OS_Normal)
        self.highlighted_obj = obj
        if self.highlighted_obj:    self.highlighted_obj.setState(objects.Object.OS_Highlighted)
        
    def _onMouseMoved(self, _evt):
        """Mouse moved event
        """
        mstate = _evt.get_state()
        prev_pos = self.mouse_pos
        self.mouse_pos = (mstate.X.abs, mstate.Y.abs)
        
        
        # move object
        if self.state is SCgEditMode.ES_Move:
            pos = self.move_obj.getPosition()
            #self.move_obj.setPosition((pos[0] + dpos[0], pos[1] + dpos[1]))
            if render_engine.viewMode is render_engine.Mode_Isometric:
                self.move_obj.setPosition(render_engine.pos2dTo3dIsoPos(self.mouse_pos))
            else:
                self.move_obj.setPosition(render_engine.pos2dToViewPortRay(self.mouse_pos).getPoint(25.0))
#            if self.vis_menu.isShow():  self.vis_menu.move(self.mouse_pos)
            return True
                
        elif self.state is SCgEditMode.ES_LineCreate:
            pos = render_engine.pos2dTo3dIsoPos(self.mouse_pos)
            self.line_mode_obj.setPosition(pos)
            self._updateLineCreationObjects()
            self._highlight()
            return True
        
        elif self.state is SCgEditMode.ES_Translate:
            if render_engine.viewMode is render_engine.Mode_Isometric:
                render_engine._ogreCameraNode.translate(-mstate.X.rel / float(render_engine.scale2d),
                                                         mstate.Y.rel / float(render_engine.scale2d),
                                                         0.0)
                self._logic._getSheet()._updateChildTexts()
            else:
                self.rotX = ogre.Degree(-mstate.X.rel * 0.13)
                self.rotY = ogre.Degree(-mstate.Y.rel * 0.13)
            #FIXME:    add perspective mode
        
        # scaling
        if self._ctrl and mstate.Z.rel != 0 and render_engine.viewMode == render_engine.Mode_Isometric:
            sc = 1.0 + mstate.Z.rel / 1200.0            
            sheet = self._logic._getSheet()
            sheet.setScale(sheet.getScale() * sc)
        
        self._highlight()
        
        return False
    
    def _onMousePressed(self, _evt, _id):
        """Mouse button pressed event
        """
        mstate = _evt.get_state()
#        self._createNode((mstate.X.abs, mstate.Y.abs))

        # getting objects under mouse
        mobjects = self._logic._getSheet()._getObjectsUnderMouse(True)
        
        
        # * if pressed left button and there is any object under mouse, then
        # start move it
        if _id == ois.MB_Left:
            # check objects under mouse
            if self.state is SCgEditMode.ES_None:
                
                if self._ctrl:
                    sheet = comutils._getFirstObjectTypeFromList(mobjects, [objects.ObjectSheet])
                    if sheet is not None:
                        addr = sheet._getScAddr()
                        kernel = core.Kernel.getSingleton()
                        if sheet is not None and addr is not None and not kernel.haveOutputWindow(addr):
                            kernel.addOutputWindow(sheet._getScAddr())
                else:
                    if len(mobjects) is not 0:
                        self.move_obj = comutils._getFirstObjectTypeFromList(mobjects, [scg_objects.SCgNode, 
                                                                                        objects.ObjectSheet, 
                                                                                        scg_objects.SCgContour])
                        if self.move_obj is not None:
                            self.state = SCgEditMode.ES_Move
                            render_engine._gui_ignore_input_proc_result = True
                            # selecting movable object                       
                            self._selectObject(self.move_obj)
                            return True
                    
                        # selecting first object under mouse
                        self._selectObject(mobjects[0][1])
                        
                        return True
                   
        
        # * if pressed left button and there are no objects under mouse, then
        # creating new scg-node            
        elif _id == ois.MB_Right:
            # check objects under mouse
            if self.state is SCgEditMode.ES_None:
                if len(mobjects) is 0:
                    self._logic._createNode((mstate.X.abs, mstate.Y.abs))
                    self.state = SCgEditMode.ES_None
                    return True
                else:
                    if self.line_mode_beg is None:
                        self.state = SCgEditMode.ES_LineCreate
                        # setting begin object
                        self.line_mode_beg = mobjects[0][1]
                        self.line_mode_line.setBegin(self.line_mode_beg)
                        self.line_mode_obj.setPosition(render_engine.pos2dTo3dIsoPos((mstate.X.abs, mstate.Y.abs)))
                        # adding to scene
                        sheet = self._logic._getSheet() 
                        render_engine.SceneNode.addChild(sheet.sceneNodeChilds, self.line_mode_line.sceneNode)
                        
                        self._updateLineCreationObjects()
                        
                        return True
                    
            # line creation state
            elif (self.state is SCgEditMode.ES_LineCreate) and (self.line_mode_beg is not None):
                # check if is there 
                if len(mobjects) is not 0:
                    self._logic._createPair(self.line_mode_beg, mobjects[0][1])
                    
                sheet = self._logic._getSheet()
                render_engine.SceneNode.removeChild(sheet.sceneNodeChilds, self.line_mode_line.sceneNode)
                self.line_mode_line.setBegin(None)
                self.line_mode_beg = None
                self.state = SCgEditMode.ES_None
                    
                return True
        elif _id == ois.MB_Middle:
            if self.state == SCgEditMode.ES_None:
                self.state = SCgEditMode.ES_Translate
                render_engine.Gui.setPointer("hand")
                return True
        
        if self._logic._getSheet().haveSelected() and self.state is SCgEditMode.ES_None:
            # removing selection from all nodes
            self._logic._getSheet().unselectAll()
            return True
        
            
        return False
    
    def _onMouseReleased(self, _evt, _id):
        """Mouse button released event
        """
        # getting objects under mouse
        mobjects = self._logic._getSheet()._getObjectsUnderMouse(True)
        
        # * if released left button and node moving, then
        # stopping movement 
        if _id == ois.MB_Left:
            
            # check state
            if self.state is SCgEditMode.ES_Move:
                self.state = SCgEditMode.ES_None
                render_engine._gui_ignore_input_proc_result = False
                del self.move_obj
                return True
            
                
        elif _id == ois.MB_Right:
            pass
        
        elif _id == ois.MB_Middle:
            # translation
            if self.state is SCgEditMode.ES_Translate:
                self.state = SCgEditMode.ES_None
                render_engine.Gui.setPointer("arrow")
                return True
        
        return False
    
    def _onKeyPressed(self, _evt):
        """Key pressed event
        """
        BaseEditMode._onKeyPressed(self, _evt)
        
        key = _evt.key
        
        if key == ois.KC_LSHIFT:
            self._shift = True
                    
        elif key == ois.KC_T:
            self._handlerChangeType()
            
        elif key == ois.KC_C:
            self._handlerChangeContent()
            
        elif key == ois.KC_H:
            self._handlerContentToogle()
           
        elif key == ois.KC_SPACE:
            layout_group = self._logic._getSheet().getLayoutGroup()
            if layout_group is not None:
                if layout_group.isPlaying():
                    layout_group.stop()
                else:
                    layout_group.play()
                    
        elif _evt.key == ois.KC_F9:
            if render_engine.viewMode is render_engine.Mode_Isometric:
                self._logic._getSheet().changeMode(render_engine.Mode_Perspective)
            else:
                self._logic._getSheet().changeMode(render_engine.Mode_Isometric)
            self.line_mode_line._needModeUpdate()
            
        # test code
        elif _evt.key == ois.KC_F3:# and 0:
            
            self._logic._getSheet().setLayoutGroup(None)
            
            elements = []
            node_center = scg_alphabet.createSCgNode("node/const/binary")
            node_center.setText(u"центр*")
            elements.append(node_center)
            
            node_tchk_O = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_O.setText(u"Тчк О")
            elements.append(node_tchk_O)
            
            node_tchk_A = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_A.setText(u"Тчк А")
            elements.append(node_tchk_A)
            
            node_tchk_B = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_B.setText(u"Тчк B")
            elements.append(node_tchk_B)
            
            node_tchk_C = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_C.setText(u"Тчк C")
            elements.append(node_tchk_C)
            
            node_tchk_A1 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_A1.setText(u"Тчк А1")
            elements.append(node_tchk_A1)
            
            node_tchk_B1 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_B1.setText(u"Тчк B1")
            elements.append(node_tchk_B1)
            
            node_tchk_C1 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_C1.setText(u"Тчк C1")
            elements.append(node_tchk_C1)
            
            node_tchk_A2 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_A2.setText(u"Тчк А2")
            elements.append(node_tchk_A2)
            
            node_tchk_B2 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_B2.setText(u"Тчк B2")
            elements.append(node_tchk_B2)
            
            node_tchk_C2 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_C2.setText(u"Тчк C2")
            elements.append(node_tchk_C2)
            
            node_okr_OA2 = scg_alphabet.createSCgNode("node/const/struct")
            node_okr_OA2.setText(u"Окр(ТчкO;ТчкA2)")
            elements.append(node_okr_OA2)
            
            node_okr = scg_alphabet.createSCgNode("node/const/term")
            node_okr.setText(u"окружность")
            elements.append(node_okr)
            
            node_otr = scg_alphabet.createSCgNode("node/const/term")
            node_otr.setText(u"отрезок")
            elements.append(node_otr)
            
            node_otr_AA1 = scg_alphabet.createSCgNode("node/const/struct")
            node_otr_AA1.setText(u"Отр(ТчкА;ТчкА1)")
            elements.append(node_otr_AA1)
            
            node_otr_BB1 = scg_alphabet.createSCgNode("node/const/struct")
            node_otr_BB1.setText(u"Отр(ТчкB;ТчкB1)")
            elements.append(node_otr_BB1)
            
            node_otr_CC1 = scg_alphabet.createSCgNode("node/const/struct")
            node_otr_CC1.setText(u"Отр(ТчкC;ТчкC1)")
            elements.append(node_otr_CC1)
            
            node_biss = scg_alphabet.createSCgNode("node/const/binary")
            node_biss.setText(u"биссектриса*")
            elements.append(node_biss)
            
            node_trian = scg_alphabet.createSCgNode("node/const/term")
            node_trian.setText(u"треугольник")
            elements.append(node_trian) 
            
            node_trian_ABC = scg_alphabet.createSCgNode("node/const/struct")
            node_trian_ABC.setText(u"Треугк(ТчкА;ТчкB;ТчкC)")
            elements.append(node_trian_ABC)
            
            node_vpis = scg_alphabet.createSCgNode("node/const/binary")
            node_vpis.setText(u"быть вписанным*")
            elements.append(node_vpis)
            
            node_versh_ = scg_alphabet.createSCgNode("node/const/role")
            node_versh_.setText(u"вершина_")
            elements.append(node_versh_)
            
            node_point = scg_alphabet.createSCgNode("node/const/term")
            node_point.setText(u"точка")
            elements.append(node_point)
            
            # link nodes
            points = [node_tchk_O, node_tchk_A, node_tchk_B, node_tchk_C, 
                      node_tchk_A1, node_tchk_B1, node_tchk_C1,
                      node_tchk_A2, node_tchk_B2, node_tchk_C2]
            for pt in points:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_point)
                arc.setEnd(pt)
                elements.append(arc)
                
            otrs = [node_otr_AA1, node_otr_BB1, node_otr_CC1]
            for otr in otrs:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_otr)
                arc.setEnd(otr)
                
                arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc2.setBegin(otr)
                arc2.setEnd(node_tchk_O)
                
                arc3 = scg_alphabet.createSCgPair("pair/-/-/orient/const")
                arc3.setBegin(node_trian_ABC)
                arc3.setEnd(otr)
                
                arc4 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc4.setBegin(node_biss)
                arc4.setEnd(arc3)
                
                elements.append(arc)
                elements.append(arc2)
                elements.append(arc3)
                elements.append(arc4)
                
            vershs = [node_tchk_A, node_tchk_B, node_tchk_C]
            for ver in vershs:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_trian_ABC)
                arc.setEnd(ver)
                
                arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc2.setBegin(node_versh_)
                arc2.setEnd(arc)
                
                elements.append(arc)
                elements.append(arc2)
                
            points = [node_tchk_A2, node_tchk_B2, node_tchk_C2]
            for pt in points:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_okr_OA2)
                arc.setEnd(pt)
                
                elements.append(arc)
                
            arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc.setBegin(node_trian)
            arc.setEnd(node_trian_ABC)
            elements.append(arc)
            
            arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc.setBegin(node_okr)
            arc.setEnd(node_okr_OA2)
            elements.append(arc)
            
            arc = scg_alphabet.createSCgPair("pair/-/-/orient/const")
            arc.setBegin(node_trian_ABC)
            arc.setEnd(node_okr_OA2)
            elements.append(arc)
            
            arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc2.setBegin(node_vpis)
            arc2.setEnd(arc)
            elements.append(arc2)
            
            arc = scg_alphabet.createSCgPair("pair/-/-/orient/const")
            arc.setBegin(node_okr_OA2)
            arc.setEnd(node_tchk_O)
            elements.append(arc)
            
            arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc2.setBegin(node_center)
            arc2.setEnd(arc)
            elements.append(arc2)
            
            
            self._logic._getSheet().addChildList(elements)
            
            # go to 3d mode
            if render_engine.viewMode is render_engine.Mode_Isometric:
                self._logic._getSheet().changeMode(render_engine.Mode_Perspective)
            
            # disable layout
#            layout_group = self._logic._getSheet().getLayoutGroup()
#            layout_group.stop()
            
            # setup node positions manualy
            node_trian.setPosition(ogre.Vector3(0.0, 0.0, 3.0))
            
            node_otr_AA1.setPosition(ogre.Vector3(-5.0, 0.0, 2.0))
            node_otr_BB1.setPosition(ogre.Vector3(-5.0, 0.0, 0.0))
            node_otr_CC1.setPosition(ogre.Vector3(-5.0, 0.0, -2.0))
            node_otr.setPosition(ogre.Vector3(-8.0, 0.0, -2.0))
            node_biss.setPosition(ogre.Vector3(-1.0, 0.0, -2.0))
            
            node_tchk_O.setPosition(ogre.Vector3(-10.0, 0.0, 0.0))
            
            node_okr_OA2.setPosition(ogre.Vector3(-5, 3.0, 0.0))
            node_okr.setPosition(ogre.Vector3(-5, 6.0, 0.0))
            node_center.setPosition(ogre.Vector3(-8.0, 3.0, 0.0))
            node_vpis.setPosition(ogre.Vector3(-2.0, 3.0, 0.0))
            
            node_point.setPosition(ogre.Vector3(3.0, 2.0, -7.0))
            
            node_tchk_A.setPosition(ogre.Vector3(5.0, 3.0, 0.0))
            node_tchk_B.setPosition(ogre.Vector3(5.0, 0.0, 0.0))
            node_tchk_C.setPosition(ogre.Vector3(5.0, -3.0, 0.0))
            
            node_versh_.setPosition(ogre.Vector3(5.0, 2.0, 3.0))
            
            node_tchk_A2.setPosition(ogre.Vector3(1.0, 3.0, -8.0))
            node_tchk_B2.setPosition(ogre.Vector3(1.0, 0.0, -8.0))
            node_tchk_C2.setPosition(ogre.Vector3(1.0, -3.0, -8.0))
            
            node_tchk_A1.setPosition(ogre.Vector3(5.0, 3.0, -4.0))
            node_tchk_B1.setPosition(ogre.Vector3(5.0, 0.0, -4.0))
            node_tchk_C1.setPosition(ogre.Vector3(5.0, -3.0, -4.0))
            
            # configure camera
            camera = render_engine._ogreCamera
            cameraNode = render_engine._ogreCameraNode
            sceneManager = render_engine._ogreSceneManager
            
             # set up spline animation of node
            animation = sceneManager.createAnimation('CameraTrack', 23)
            animation.interpolationMode = ogre.Animation.IM_SPLINE
            
            animationTrack = animation.createNodeTrack(0, cameraNode)
            
            key = animationTrack.createNodeKeyFrame(0)
            key.setTranslate((0.441312, -0.0484183, 15.4575))
            key.setRotation((0.999381, 1.45161e-009, 0.0351611, 0.0))
            
            key = animationTrack.createNodeKeyFrame(3)
            key.setTranslate((-3.84972, -9.9938, 1.59091))
            key.setRotation((0.731662, 0.669154, 0.0960006, -0.0877989))
            
            key = animationTrack.createNodeKeyFrame(7)
            key.setTranslate((-3.84972, -9.9938, 1.59091))
            key.setRotation((0.731662, 0.669154, 0.0960006, -0.0877989))
            
            key = animationTrack.createNodeKeyFrame(10)
            key.setTranslate((-4.48132, 4.00986, 9.80443))
            key.setRotation((0.997827, -0.0657508, -0.00452801, -0.00029836))
            
            key = animationTrack.createNodeKeyFrame(14)
            key.setTranslate((-4.48132, 4.00986, 9.80443))
            key.setRotation((0.997827, -0.0657508, -0.00452801, -0.00029836))
            
            key = animationTrack.createNodeKeyFrame(17)
            key.setTranslate((-0.88816, 1.8146, 6.93933))
            key.setRotation((0.929973, -0.102752, -0.350851, -0.0387652))
            
            key = animationTrack.createNodeKeyFrame(20)
            key.setTranslate((-0.88816, 1.8146, 6.93933))
            key.setRotation((0.929973, -0.102752, -0.350851, -0.0387652))
            
            self.animationState = sceneManager.createAnimationState('CameraTrack')
            self.animationState.setEnabled (True)
            
        #test           
         
        elif key == ois.KC_F:
            # make selected sheet as root
            if self.state == SCgEditMode.ES_None:
                sheet = self._logic._getSheet()
                objs = sheet.getSelected()
                # getting object for making root
                if len(objs) == 1:
                    obj = objs[0]
                    if type(obj) == objects.ObjectSheet:
                        render_engine._kernel.setRootSheet(obj)
        
        elif key == ois.KC_ESCAPE:
            # revert state to default
            self.revertState()
            
        elif key == ois.KC_1:
            import suit.core.layout.LayoutGroupForceDirected as layout
            self._logic._getSheet().setLayoutGroup(layout.LayoutGroupForceSimple())
        elif key == ois.KC_2:
            import suit.core.layout.LayoutGroupForceDirected2 as layout
            self._logic._getSheet().setLayoutGroup(layout.LayoutGroupForceSimple())
            
#        elif key == ois.KC_K:
#            self._logic._createContour([ogre.Vector3(-3, -2, 0),
#                                        ogre.Vector3(0, -3, 0),
#                                        ogre.Vector3(3, -1, 0),
#                                        ogre.Vector3(-3, 2, 0)
#                                        ])
        return False
    
    def _onKeyReleased(self, _evt):
        """Key released event
        """
        BaseEditMode._onKeyReleased(self, _evt)
        
        key = _evt.key
        
        if key == ois.KC_LSHIFT:
            self._shift = False
               
        return False
    
    def _updateLineCreationObjects(self):
        """Call updates for objects that draws in line creation mode
        """
        self.line_mode_obj.needUpdate = True
        self.line_mode_obj._update(0)
        self.line_mode_line.needUpdate = True
        self.line_mode_line._update(0)
        
    def revertState(self):
        
        if self.state == SCgEditMode.ES_LineCreate:
            sheet = self._logic._getSheet()
            render_engine.SceneNode.removeChild(sheet.sceneNodeChilds, self.line_mode_line.sceneNode)
            self.line_mode_line.setBegin(None)
            self.line_mode_beg = None
        
        
        self.state = SCgEditMode.ES_None
            
    def _onToolBarButtonPush(self, button):
        
        data = button.getUserData()
        for idx in xrange(self.EM_Count):
            if idx == data:
                self.toolbar[idx].setChecked(True)
            else:
                self.toolbar[idx].setChecked(False)
        
    ################
    ### handlers ###
    ################
    def _handlerChangeType(self):
        """Handler for change type event
        """
        # change type of selected element
        if self.state == SCgEditMode.ES_None:
            sheet = self._logic._getSheet()
            objs = sheet.getSelected()
            # get object for type changing 
            if len(objs) == 1:
                self._changeType(objs[0])
                
    def _handlerChangeIdtf(self):
        """Handler for change idtf event
        """
        self._setIdtf()
      
    def _handlerSelChanged(self):
        """Handler for selection changed event
        """
#        self._updateVisualMenu()
        pass
        
    def _handlerChangeContent(self):
        """Handler for changing content
        """
        if self.state == SCgEditMode.ES_None:
            sheet = self._logic._getSheet()
            objs = sheet.getSelected()
            if len(objs) == 1 and type(objs[0]) is scg_objects.SCgNode:
                self._changeContent(objs[0])
                
    def _handlerContentToogle(self):
        if self.state == SCgEditMode.ES_None:
            sheet = self._logic._getSheet()
            objs = sheet.getSelected()
            
            for obj in objs:
                if isinstance(obj, objects.ObjectSheet):
                    if obj.isContentShowing():
                        obj.hideContent()
                    else:
                        obj.showContent()
    
    def _dialog_del_callback(self):
        self.state = SCgEditMode.ES_None
        self.dialog = None
        
    #############
    ### Types ###
    #############
    def _changeType(self, _obj):
        """Creates control to change object type
        
        @param _obj: object to change type
        @type _obj: objects.ObjectDepth  
        """
        self.state = SCgEditMode.ES_TypeChange
        self.dialog = scg_controls.TypeChanger(_obj, self._dialog_del_callback)
        self.dialog.run()
           
        #self.state = SCgEditMode.ES_None
        
    ################
    ### Contents ###
    ################
    def _changeContent(self, _node):
        """Changes content type for a specified node
        @param _node:    node to change content type
        @type _node:    SCgNode
        """
        self.state = SCgEditMode.ES_ContType
        self.dialog = scg_controls.ContentChanger(_node, self._dialog_del_callback)
        self.dialog.run()
#        self._create_content_combo()
#        pos = render_engine.pos3dTo2dWindow(_node.getPosition() + _node.getScale() / 2)
#        
#        if pos is not None:
#            self.content_combo.setPosition(pos[0], pos[1])
#            self.object_active = _node
#            self.content_combo.subscribeEventAccept(self, "_contentAccept")
#            
#            # getting available for editing formats
#            session = render_engine._kernel.session()
#            self.fmts = render_engine._kernel.getRegisteredEditorFormats()
#            for fmt in self.fmts:
#                self.content_combo.addItem(unicode("#ffffff%s" % (session.get_idtf(fmt))))
#            
#        else:
#            self._destroy_content_combo()
        
    def _contentAccept(self, _widget, _v):
        """Handler for content combo accept
        """
        fmt = self.fmts[_v]
        
        assert type(self.object_active) is scg_objects.SCgNode
        window = scg_utils.createWindowFromNode(self.object_active, fmt)
        
        self._logic._getSheet().unselectAll()
        self._logic._getSheet().select(window)
    
        self._destroy_content_combo()
        self.state = SCgEditMode.ES_None
        self.object_active = None        
        del self.fmts
    
    
    ###################
    ### Visual menu ###
    ###################
    def _createVisualMenu(self):
        """Creates visual menu
        """
        self.vis_menu = VisualMenu()
        
        # identificator changing
        self.mi_idtf = VisualMenuItem()
        self.mi_idtf.callback = self._handlerChangeIdtf
        self.mi_idtf.setText("Change identifier")
        self.vis_menu.appendItem(self.mi_idtf)
        
        # type changing
        self.mi_type = VisualMenuItem()
        self.mi_type.callback = self._handlerChangeType
        self.mi_type.setText("Change type")
        self.vis_menu.appendItem(self.mi_type)
        
        # content changing
        self.mi_contentChange = VisualMenuItem()
        self.mi_contentChange.callback = self._handlerChangeContent
        self.mi_contentChange.setText("Change content")
        self.vis_menu.appendItem(self.mi_contentChange)
        
        # content showing
        self.mi_content_show = VisualMenuItem()
        self.mi_content_show.callback = self._handlerContentShow
        self.mi_content_show.setText("Show content")
        self.vis_menu.appendItem(self.mi_content_show)
        
        # content hiding
        self.mi_content_hide = VisualMenuItem()
        self.mi_content_hide.callback = self._handlerContentHide
        self.mi_content_hide.setText("Hide content")
        self.vis_menu.appendItem(self.mi_content_hide)
        
    def _updateVisualMenu(self):
        """Updates visual menu depending on selection
        """
        if self._logic is None or self._logic._getSheet() is None:
            return
        
        import types
        sel_objects = [] + self._logic._getSheet().getSelected()
        
        if self.vis_menu.isShow():
            self.vis_menu.hide()
        
        if not self.active: return
        
        n = len(sel_objects)
        if n == 1:
            obj = sel_objects[0]
            
            # check types
            isNode = isinstance(obj, scg_objects.SCgNode)
            isPair = isinstance(obj, scg_objects.SCgPair)
            isContent = isinstance(obj, objects.ObjectSheet) 
            
            # change type
            self.mi_type.setEnabled(isNode or isPair)
            # content
            self.mi_contentChange.setEnabled(isNode)
            # idtf
            self.mi_idtf.setEnabled(obj._getScAddr() is None)
            
            cs = ch = False
            if isContent:
                cs = not obj.isContentShow
                ch = obj.isContentShow
                
            self.mi_content_show.setEnabled(cs)
            self.mi_content_hide.setEnabled(ch)
        else:
            self.mi_type.setEnabled(False)
            self.mi_contentChange.setEnabled(False)
            self.mi_idtf.setEnabled(False)
            self.mi_content_show.setEnabled(False)
            self.mi_content_hide.setEnabled(False)
            
        if n > 0:   self.vis_menu.show(render_engine.pos3dTo2dWindow(sel_objects[0].getPosition()))
コード例 #4
0
class SCgEditMode(BaseEditMode):
    """Mode that allows user to edit scg-constructions
    
    """
    # states
    ES_Move = BaseEditMode.ES_Count  # object movement state
    ES_LineCreate = ES_Move + 1  # line creation mode
    ES_TypeChange = ES_LineCreate + 1  # type changing mode
    ES_ContType = ES_TypeChange + 1  # content type changing
    ES_Translate = ES_ContType + 1  # translate camera position
    ES_ContourCreate = ES_Translate + 1  # contour creation
    ES_Count = ES_ContourCreate + 1  # count of all states

    EM_Select = 0
    EM_Pair = 1
    EM_Bus = 2
    EM_Contour = 3
    EM_Count = 4

    def __init__(self, _logic):
        BaseEditMode.__init__(self, _logic, "Edit mode")

        # mouse objects for line creation mode
        self.line_mode_beg = None
        self.line_mode_obj = scg_alphabet.createSCgNode('mnode')
        self.line_mode_obj.setScale(ogre.Vector3(0.1, 0.1, 0.1))
        self.line_mode_obj.setPosition(ogre.Vector3(0, 0, 0))
        self.line_mode_line = scg_alphabet.createSCgPair('mpair')
        self.line_mode_line.setEnd(self.line_mode_obj)
        self.line_mode_line.setState(objects.Object.OS_Normal)
        # highlighted object
        self.highlighted_obj = None

        # widgets
        self.type_combo = None
        self.content_combo = None

        # object we worked on in current state
        self.object_active = None
        # current editor state
        self.state = SCgEditMode.ES_None
        # current mouse position
        self.mouse_pos = (0, 0)

        # visual menu
        self.vis_menu = None
        self._createVisualMenu()

        # 3d navigation mode
        self.rotX = 0.0
        self.rotY = 0.0
        self.move = ogre.Vector3(0.0, 0.0, 0.0)
        self.moveSpeed = 5.0
        self.moveScale = 5.0

        self.animationState = None

        # tool bar
#        self.toolbar = ToolBar()
#        self.toolbar.setVisible(False)
#        self.toolbar.setEnabled(True)
#        for idx in xrange(self.EM_Count):
#            button = self.toolbar.appendButton("", "scg_toolbar_icons.png", idx, (32, 32), (0, 0, 256, 32))
#            button.setCheckable(True)
#            button.setUserData(idx)
#            button.eventPush = self._onToolBarButtonPush
#
#        self.toolbar.setButtonSize(38)

    def __del__(self):
        BaseEditMode.__del__(self)

    def delete(self):
        """Deletion message
        """
        BaseEditMode.delete(self)

        self.vis_menu.delete()

        self.line_mode_beg = None

        self.line_mode_line.delete()
        self.line_mode_line = None
        self.line_mode_obj.delete()
        self.line_mode_obj = None

        self.object_active = None

    def activate(self):
        """Activation message
        """
        BaseEditMode.activate(self)
        self._updateVisualMenu()

    def deactivate(self):
        """Deactivation message
        """
        BaseEditMode.deactivate(self)
        self._updateVisualMenu()

    def _update(self, timeSinceLastFrame):
        """Updates mode
        """
        #        if self.vis_menu.isShow():
        sel_objects = self._logic._getSheet().getSelected()
        n = len(sel_objects)
        if n == 1:
            obj = sel_objects[0]
            self.vis_menu.move(
                render_engine.pos3dTo2dWindow(sel_objects[0].getPosition()))
        self.vis_menu._update(timeSinceLastFrame)

        if not self._ctrl and self.state is SCgEditMode.ES_Translate:
            if self._logic._getSheet(
            ).isRoot and render_engine.viewMode is render_engine.Mode_Perspective:
                # processing keyboard input
                if render_engine._oisKeyboard.isKeyDown(ois.KC_A):
                    self.move.x = -self.moveScale  # Move camera left

                if render_engine._oisKeyboard.isKeyDown(ois.KC_D):
                    self.move.x = self.moveScale  # Move camera RIGHT

                if render_engine._oisKeyboard.isKeyDown(ois.KC_W):
                    self.move.z = -self.moveScale  # Move camera forward

                if render_engine._oisKeyboard.isKeyDown(ois.KC_S):
                    self.move.z = self.moveScale  # Move camera backward

                if render_engine._oisKeyboard.isKeyDown(ois.KC_Q):
                    self.move.y = self.moveScale  # Move camera up

                if render_engine._oisKeyboard.isKeyDown(ois.KC_E):
                    self.move.y = -self.moveScale  # Move camera down

                # updating camera position
                camera = render_engine._ogreCamera
                cameraNode = render_engine._ogreCameraNode
                cameraNode.translate(camera.getOrientation() * self.move *
                                     timeSinceLastFrame)
                camera.yaw(self.rotX)
                camera.pitch(self.rotY)
                self.move = ogre.Vector3(0, 0, 0)
                self.rotX = 0
                self.rotY = 0

        needMove = False
        offset = ogre.Vector3(0, 0, 0)
        dv = 1 * timeSinceLastFrame

        if render_engine._oisKeyboard.isKeyDown(ois.KC_LEFT):
            offset.x = -dv
            needMove = True
        if render_engine._oisKeyboard.isKeyDown(ois.KC_RIGHT):
            offset.x = dv
            needMove = True
        if render_engine._oisKeyboard.isKeyDown(ois.KC_UP):
            offset.y = dv
            needMove = True
        if render_engine._oisKeyboard.isKeyDown(ois.KC_DOWN):
            offset.y = -dv
            needMove = True
        if render_engine._oisKeyboard.isKeyDown(ois.KC_Z):
            offset.z = dv
            needMove = True
        if render_engine._oisKeyboard.isKeyDown(ois.KC_X):
            offset.z = -dv
            needMove = True

        if needMove:
            for obj in self._logic._getSheet().getSelected():
                obj.setPosition(obj.getPosition() +
                                render_engine._ogreCamera.getOrientation() *
                                offset)

        if self.animationState is not None:
            self.animationState.addTime(timeSinceLastFrame)

    def _highlight(self):
        """Highlighting object under mouse
        """
        mobjects = self._logic._getSheet()._getObjectsUnderMouse(
            self.mouse_pos)
        obj = None
        if len(mobjects) > 0:
            obj = mobjects[0][1]

        if (obj is None) and (self.highlighted_obj is None): return
        if (obj is self.highlighted_obj): return

        # change highlight
        if self.highlighted_obj is not None:
            self.highlighted_obj.resetState()
#            if self.highlighted_obj._getSelected():
#                self.highlighted_obj.setState(objects.Object.OS_Selected)
#            else:
#                self.highlighted_obj.setState(objects.Object.OS_Normal)
        self.highlighted_obj = obj
        if self.highlighted_obj:
            self.highlighted_obj.setState(objects.Object.OS_Highlighted)

    def _onMouseMoved(self, _evt):
        """Mouse moved event
        """
        mstate = _evt.get_state()
        prev_pos = self.mouse_pos
        self.mouse_pos = (mstate.X.abs, mstate.Y.abs)

        # move object
        if self.state is SCgEditMode.ES_Move:
            pos = self.move_obj.getPosition()
            #self.move_obj.setPosition((pos[0] + dpos[0], pos[1] + dpos[1]))
            if render_engine.viewMode is render_engine.Mode_Isometric:
                self.move_obj.setPosition(
                    render_engine.pos2dTo3dIsoPos(self.mouse_pos))
            else:
                self.move_obj.setPosition(
                    render_engine.pos2dToViewPortRay(
                        self.mouse_pos).getPoint(25.0))
            if self.vis_menu.isShow(): self.vis_menu.move(self.mouse_pos)
            return True

        elif self.state is SCgEditMode.ES_LineCreate:
            pos = render_engine.pos2dTo3dIsoPos(self.mouse_pos)
            self.line_mode_obj.setPosition(pos)
            self._updateLineCreationObjects()
            self._highlight()
            return True

        elif self.state is SCgEditMode.ES_Translate:
            if render_engine.viewMode is render_engine.Mode_Isometric:
                render_engine._ogreCameraNode.translate(
                    -mstate.X.rel / float(render_engine.scale2d),
                    mstate.Y.rel / float(render_engine.scale2d), 0.0)
                self._logic._getSheet()._updateChildTexts()
            else:
                self.rotX = ogre.Degree(-mstate.X.rel * 0.13)
                self.rotY = ogre.Degree(-mstate.Y.rel * 0.13)
            #FIXME:    add perspective mode

        # scaling
        if self._ctrl and mstate.Z.rel != 0 and render_engine.viewMode == render_engine.Mode_Isometric:
            sc = 1.0 + mstate.Z.rel / 1200.0
            sheet = self._logic._getSheet()
            sheet.setScale(sheet.getScale() * sc)

        self._highlight()

        return False

    def _onMousePressed(self, _evt, _id):
        """Mouse button pressed event
        """
        mstate = _evt.get_state()
        #        self._createNode((mstate.X.abs, mstate.Y.abs))

        # getting objects under mouse
        mobjects = self._logic._getSheet()._getObjectsUnderMouse(True)

        # * if pressed left button and there is any object under mouse, then
        # start move it
        if _id == ois.MB_Left:
            # check objects under mouse
            if self.state is SCgEditMode.ES_None:
                if len(mobjects) is not 0:
                    self.move_obj = comutils._getFirstObjectTypeFromList(
                        mobjects, [
                            scg_objects.SCgNode, objects.ObjectSheet,
                            scg_objects.SCgContour
                        ])
                    if self.move_obj is not None:
                        self.state = SCgEditMode.ES_Move
                        render_engine._gui_ignore_input_proc_result = True
                        # selecting movable object
                        self._selectObject(self.move_obj)
                        return True

                    # selecting first object under mouse
                    self._selectObject(mobjects[0][1])

                    return True

        # * if pressed left button and there are no objects under mouse, then
        # creating new scg-node
        elif _id == ois.MB_Right:
            # check objects under mouse
            if self.state is SCgEditMode.ES_None:
                if len(mobjects) is 0:
                    self._logic._createNode((mstate.X.abs, mstate.Y.abs))
                    self.state = SCgEditMode.ES_None
                    return True
                else:
                    if self.line_mode_beg is None:
                        self.state = SCgEditMode.ES_LineCreate
                        # setting begin object
                        self.line_mode_beg = mobjects[0][1]
                        self.line_mode_line.setBegin(self.line_mode_beg)
                        self.line_mode_obj.setPosition(
                            render_engine.pos2dTo3dIsoPos(
                                (mstate.X.abs, mstate.Y.abs)))
                        # adding to scene
                        sheet = self._logic._getSheet()
                        render_engine.SceneNode.addChild(
                            sheet.sceneNodeChilds,
                            self.line_mode_line.sceneNode)

                        self._updateLineCreationObjects()

                        return True

            # line creation state
            elif (self.state is SCgEditMode.ES_LineCreate) and (
                    self.line_mode_beg is not None):
                # check if is there
                if len(mobjects) is not 0:
                    self._logic._createPair(self.line_mode_beg, mobjects[0][1])

                sheet = self._logic._getSheet()
                render_engine.SceneNode.removeChild(
                    sheet.sceneNodeChilds, self.line_mode_line.sceneNode)
                self.line_mode_line.setBegin(None)
                self.line_mode_beg = None
                self.state = SCgEditMode.ES_None

                return True
        elif _id == ois.MB_Middle:
            if self.state == SCgEditMode.ES_None:
                self.state = SCgEditMode.ES_Translate
                render_engine.Gui.setPointer("hand")
                return True

        if self._logic._getSheet().haveSelected(
        ) and self.state is SCgEditMode.ES_None:
            # removing selection from all nodes
            self._logic._getSheet().unselectAll()
            return True

        return False

    def _onMouseReleased(self, _evt, _id):
        """Mouse button released event
        """
        # getting objects under mouse
        mobjects = self._logic._getSheet()._getObjectsUnderMouse(True)

        # * if released left button and node moving, then
        # stopping movement
        if _id == ois.MB_Left:

            # check state
            if self.state is SCgEditMode.ES_Move:
                self.state = SCgEditMode.ES_None
                render_engine._gui_ignore_input_proc_result = False
                del self.move_obj
                return True

        elif _id == ois.MB_Right:
            pass

        elif _id == ois.MB_Middle:
            # translation
            if self.state is SCgEditMode.ES_Translate:
                self.state = SCgEditMode.ES_None
                render_engine.Gui.setPointer("arrow")
                return True

        return False

    def _onKeyPressed(self, _evt):
        """Key pressed event
        """
        BaseEditMode._onKeyPressed(self, _evt)

        key = _evt.key

        if key == ois.KC_LSHIFT:
            self._shift = True

        elif key == ois.KC_T:
            self._handlerChangeType()

        elif key == ois.KC_SPACE:
            layout_group = self._logic._getSheet().getLayoutGroup()
            if layout_group is not None:
                if layout_group.isPlaying():
                    layout_group.stop()
                else:
                    layout_group.play()

        elif _evt.key == ois.KC_F9:
            if render_engine.viewMode is render_engine.Mode_Isometric:
                self._logic._getSheet().changeMode(
                    render_engine.Mode_Perspective)
            else:
                self._logic._getSheet().changeMode(
                    render_engine.Mode_Isometric)
            self.line_mode_line._needModeUpdate()

        # test code
        elif _evt.key == ois.KC_F3 and 0:

            self._logic._getSheet().setLayoutGroup(None)

            elements = []
            node_center = scg_alphabet.createSCgNode("node/const/binary")
            node_center.setText(u"центр*")
            elements.append(node_center)

            node_tchk_O = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_O.setText(u"Тчк О")
            elements.append(node_tchk_O)

            node_tchk_A = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_A.setText(u"Тчк А")
            elements.append(node_tchk_A)

            node_tchk_B = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_B.setText(u"Тчк B")
            elements.append(node_tchk_B)

            node_tchk_C = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_C.setText(u"Тчк C")
            elements.append(node_tchk_C)

            node_tchk_A1 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_A1.setText(u"Тчк А1")
            elements.append(node_tchk_A1)

            node_tchk_B1 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_B1.setText(u"Тчк B1")
            elements.append(node_tchk_B1)

            node_tchk_C1 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_C1.setText(u"Тчк C1")
            elements.append(node_tchk_C1)

            node_tchk_A2 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_A2.setText(u"Тчк А2")
            elements.append(node_tchk_A2)

            node_tchk_B2 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_B2.setText(u"Тчк B2")
            elements.append(node_tchk_B2)

            node_tchk_C2 = scg_alphabet.createSCgNode("node/const/real")
            node_tchk_C2.setText(u"Тчк C2")
            elements.append(node_tchk_C2)

            node_okr_OA2 = scg_alphabet.createSCgNode("node/const/struct")
            node_okr_OA2.setText(u"Окр(ТчкO;ТчкA2)")
            elements.append(node_okr_OA2)

            node_okr = scg_alphabet.createSCgNode("node/const/term")
            node_okr.setText(u"окружность")
            elements.append(node_okr)

            node_otr = scg_alphabet.createSCgNode("node/const/term")
            node_otr.setText(u"отрезок")
            elements.append(node_otr)

            node_otr_AA1 = scg_alphabet.createSCgNode("node/const/struct")
            node_otr_AA1.setText(u"Отр(ТчкА;ТчкА1)")
            elements.append(node_otr_AA1)

            node_otr_BB1 = scg_alphabet.createSCgNode("node/const/struct")
            node_otr_BB1.setText(u"Отр(ТчкB;ТчкB1)")
            elements.append(node_otr_BB1)

            node_otr_CC1 = scg_alphabet.createSCgNode("node/const/struct")
            node_otr_CC1.setText(u"Отр(ТчкC;ТчкC1)")
            elements.append(node_otr_CC1)

            node_biss = scg_alphabet.createSCgNode("node/const/binary")
            node_biss.setText(u"биссектриса*")
            elements.append(node_biss)

            node_trian = scg_alphabet.createSCgNode("node/const/term")
            node_trian.setText(u"треугольник")
            elements.append(node_trian)

            node_trian_ABC = scg_alphabet.createSCgNode("node/const/struct")
            node_trian_ABC.setText(u"Треугк(ТчкА;ТчкB;ТчкC)")
            elements.append(node_trian_ABC)

            node_vpis = scg_alphabet.createSCgNode("node/const/binary")
            node_vpis.setText(u"быть вписанным*")
            elements.append(node_vpis)

            node_versh_ = scg_alphabet.createSCgNode("node/const/role")
            node_versh_.setText(u"вершина_")
            elements.append(node_versh_)

            node_point = scg_alphabet.createSCgNode("node/const/term")
            node_point.setText(u"точка")
            elements.append(node_point)

            # link nodes
            points = [
                node_tchk_O, node_tchk_A, node_tchk_B, node_tchk_C,
                node_tchk_A1, node_tchk_B1, node_tchk_C1, node_tchk_A2,
                node_tchk_B2, node_tchk_C2
            ]
            for pt in points:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_point)
                arc.setEnd(pt)
                elements.append(arc)

            otrs = [node_otr_AA1, node_otr_BB1, node_otr_CC1]
            for otr in otrs:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_otr)
                arc.setEnd(otr)

                arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc2.setBegin(otr)
                arc2.setEnd(node_tchk_O)

                arc3 = scg_alphabet.createSCgPair("pair/-/-/orient/const")
                arc3.setBegin(node_trian_ABC)
                arc3.setEnd(otr)

                arc4 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc4.setBegin(node_biss)
                arc4.setEnd(arc3)

                elements.append(arc)
                elements.append(arc2)
                elements.append(arc3)
                elements.append(arc4)

            vershs = [node_tchk_A, node_tchk_B, node_tchk_C]
            for ver in vershs:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_trian_ABC)
                arc.setEnd(ver)

                arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc2.setBegin(node_versh_)
                arc2.setEnd(arc)

                elements.append(arc)
                elements.append(arc2)

            points = [node_tchk_A2, node_tchk_B2, node_tchk_C2]
            for pt in points:
                arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
                arc.setBegin(node_okr_OA2)
                arc.setEnd(pt)

                elements.append(arc)

            arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc.setBegin(node_trian)
            arc.setEnd(node_trian_ABC)
            elements.append(arc)

            arc = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc.setBegin(node_okr)
            arc.setEnd(node_okr_OA2)
            elements.append(arc)

            arc = scg_alphabet.createSCgPair("pair/-/-/orient/const")
            arc.setBegin(node_trian_ABC)
            arc.setEnd(node_okr_OA2)
            elements.append(arc)

            arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc2.setBegin(node_vpis)
            arc2.setEnd(arc)
            elements.append(arc2)

            arc = scg_alphabet.createSCgPair("pair/-/-/orient/const")
            arc.setBegin(node_okr_OA2)
            arc.setEnd(node_tchk_O)
            elements.append(arc)

            arc2 = scg_alphabet.createSCgPair("pair/pos/-/orient/const")
            arc2.setBegin(node_center)
            arc2.setEnd(arc)
            elements.append(arc2)

            self._logic._getSheet().addChildList(elements)

            # go to 3d mode
            if render_engine.viewMode is render_engine.Mode_Isometric:
                self._logic._getSheet().changeMode(
                    render_engine.Mode_Perspective)

            # disable layout
#            layout_group = self._logic._getSheet().getLayoutGroup()
#            layout_group.stop()

# setup node positions manualy
            node_trian.setPosition(ogre.Vector3(0.0, 0.0, 3.0))

            node_otr_AA1.setPosition(ogre.Vector3(-5.0, 0.0, 2.0))
            node_otr_BB1.setPosition(ogre.Vector3(-5.0, 0.0, 0.0))
            node_otr_CC1.setPosition(ogre.Vector3(-5.0, 0.0, -2.0))
            node_otr.setPosition(ogre.Vector3(-8.0, 0.0, -2.0))
            node_biss.setPosition(ogre.Vector3(-1.0, 0.0, -2.0))

            node_tchk_O.setPosition(ogre.Vector3(-10.0, 0.0, 0.0))

            node_okr_OA2.setPosition(ogre.Vector3(-5, 3.0, 0.0))
            node_okr.setPosition(ogre.Vector3(-5, 6.0, 0.0))
            node_center.setPosition(ogre.Vector3(-8.0, 3.0, 0.0))
            node_vpis.setPosition(ogre.Vector3(-2.0, 3.0, 0.0))

            node_point.setPosition(ogre.Vector3(3.0, 2.0, -7.0))

            node_tchk_A.setPosition(ogre.Vector3(5.0, 3.0, 0.0))
            node_tchk_B.setPosition(ogre.Vector3(5.0, 0.0, 0.0))
            node_tchk_C.setPosition(ogre.Vector3(5.0, -3.0, 0.0))

            node_versh_.setPosition(ogre.Vector3(5.0, 2.0, 3.0))

            node_tchk_A2.setPosition(ogre.Vector3(1.0, 3.0, -8.0))
            node_tchk_B2.setPosition(ogre.Vector3(1.0, 0.0, -8.0))
            node_tchk_C2.setPosition(ogre.Vector3(1.0, -3.0, -8.0))

            node_tchk_A1.setPosition(ogre.Vector3(5.0, 3.0, -4.0))
            node_tchk_B1.setPosition(ogre.Vector3(5.0, 0.0, -4.0))
            node_tchk_C1.setPosition(ogre.Vector3(5.0, -3.0, -4.0))

            # configure camera
            camera = render_engine._ogreCamera
            cameraNode = render_engine._ogreCameraNode
            sceneManager = render_engine._ogreSceneManager

            # set up spline animation of node
            animation = sceneManager.createAnimation('CameraTrack', 23)
            animation.interpolationMode = ogre.Animation.IM_SPLINE

            animationTrack = animation.createNodeTrack(0, cameraNode)

            key = animationTrack.createNodeKeyFrame(0)
            key.setTranslate((0.441312, -0.0484183, 15.4575))
            key.setRotation((0.999381, 1.45161e-009, 0.0351611, 0.0))

            key = animationTrack.createNodeKeyFrame(3)
            key.setTranslate((-3.84972, -9.9938, 1.59091))
            key.setRotation((0.731662, 0.669154, 0.0960006, -0.0877989))

            key = animationTrack.createNodeKeyFrame(7)
            key.setTranslate((-3.84972, -9.9938, 1.59091))
            key.setRotation((0.731662, 0.669154, 0.0960006, -0.0877989))

            key = animationTrack.createNodeKeyFrame(10)
            key.setTranslate((-4.48132, 4.00986, 9.80443))
            key.setRotation((0.997827, -0.0657508, -0.00452801, -0.00029836))

            key = animationTrack.createNodeKeyFrame(14)
            key.setTranslate((-4.48132, 4.00986, 9.80443))
            key.setRotation((0.997827, -0.0657508, -0.00452801, -0.00029836))

            key = animationTrack.createNodeKeyFrame(17)
            key.setTranslate((-0.88816, 1.8146, 6.93933))
            key.setRotation((0.929973, -0.102752, -0.350851, -0.0387652))

            key = animationTrack.createNodeKeyFrame(20)
            key.setTranslate((-0.88816, 1.8146, 6.93933))
            key.setRotation((0.929973, -0.102752, -0.350851, -0.0387652))

            self.animationState = sceneManager.createAnimationState(
                'CameraTrack')
            self.animationState.setEnabled(True)

        #test

        elif key == ois.KC_F:
            # make selected sheet as root
            if self.state == SCgEditMode.ES_None:
                sheet = self._logic._getSheet()
                objs = sheet.getSelected()
                # getting object for making root
                if len(objs) == 1:
                    obj = objs[0]
                    if type(obj) == objects.ObjectSheet:
                        render_engine._kernel.setRootSheet(obj)
        elif key == ois.KC_ESCAPE:
            # revert state to default
            self.revertState()

        elif key == ois.KC_K:
            self._logic._createContour([
                ogre.Vector3(-3, -2, 0),
                ogre.Vector3(0, -3, 0),
                ogre.Vector3(3, -1, 0),
                ogre.Vector3(-3, 2, 0)
            ])
        return False

    def _onKeyReleased(self, _evt):
        """Key released event
        """
        BaseEditMode._onKeyReleased(self, _evt)

        key = _evt.key

        if key == ois.KC_LSHIFT:
            self._shift = False

        return False

    def _updateLineCreationObjects(self):
        """Call updates for objects that draws in line creation mode
        """
        self.line_mode_obj.needUpdate = True
        self.line_mode_obj._update(0)
        self.line_mode_line.needUpdate = True
        self.line_mode_line._update(0)

    def revertState(self):

        if self.state == SCgEditMode.ES_LineCreate:
            sheet = self._logic._getSheet()
            render_engine.SceneNode.removeChild(sheet.sceneNodeChilds,
                                                self.line_mode_line.sceneNode)
            self.line_mode_line.setBegin(None)
            self.line_mode_beg = None

        self.state = SCgEditMode.ES_None

    def _onToolBarButtonPush(self, button):

        data = button.getUserData()
        for idx in xrange(self.EM_Count):
            if idx == data:
                self.toolbar[idx].setChecked(True)
            else:
                self.toolbar[idx].setChecked(False)

    ################
    ### handlers ###
    ################
    def _handlerChangeType(self, _item=None):
        """Handler for change type event
        """
        # change type of selected element
        if self.state == SCgEditMode.ES_None:
            sheet = self._logic._getSheet()
            objs = sheet.getSelected()
            # get object for type changing
            if len(objs) == 1:
                self._changeType(objs[0])

    def _handlerChangeIdtf(self, _item=None):
        """Handler for change idtf event
        """
        self._setIdtf()

    def _handlerSelChanged(self):
        """Handler for selection changed event
        """
        self._updateVisualMenu()

    def _handlerChangeContent(self, _item=None):
        """Handler for changing content
        """
        if self.state == SCgEditMode.ES_None:
            sheet = self._logic._getSheet()
            objs = sheet.getSelected()
            if len(objs) == 1 and type(objs[0]) is scg_objects.SCgNode:
                self._changeContent(objs[0])

    def _handlerContentShow(self, _item=None):
        if self.state == SCgEditMode.ES_None:
            sheet = self._logic._getSheet()
            objs = sheet.getSelected()
            if len(objs) == 1 and isinstance(objs[0], objects.ObjectSheet):
                objs[0].showContent()
                self._updateVisualMenu()

    def _handlerContentHide(self, _item=None):
        if self.state == SCgEditMode.ES_None:
            sheet = self._logic._getSheet()
            objs = sheet.getSelected()
            if len(objs) == 1 and isinstance(objs[0], objects.ObjectSheet):
                objs[0].hideContent()
                self._updateVisualMenu()

    def _dialog_del_callback(self):
        self.state = SCgEditMode.ES_None
        self.dialog = None

    #############
    ### Types ###
    #############
    def _changeType(self, _obj):
        """Creates control to change object type
        
        @param _obj: object to change type
        @type _obj: objects.ObjectDepth  
        """
        self.state = SCgEditMode.ES_TypeChange
        self.dialog = scg_controls.TypeChanger(_obj, self._dialog_del_callback)
        self.dialog.run()

        #self.state = SCgEditMode.ES_None

    ################
    ### Contents ###
    ################
    def _changeContent(self, _node):
        """Changes content type for a specified node
        @param _node:    node to change content type
        @type _node:    SCgNode
        """
        self.state = SCgEditMode.ES_ContType
        self.dialog = scg_controls.ContentChanger(_node,
                                                  self._dialog_del_callback)
        self.dialog.run()
#        self._create_content_combo()
#        pos = render_engine.pos3dTo2dWindow(_node.getPosition() + _node.getScale() / 2)
#
#        if pos is not None:
#            self.content_combo.setPosition(pos[0], pos[1])
#            self.object_active = _node
#            self.content_combo.subscribeEventAccept(self, "_contentAccept")
#
#            # getting available for editing formats
#            session = render_engine._kernel.session()
#            self.fmts = render_engine._kernel.getRegisteredEditorFormats()
#            for fmt in self.fmts:
#                self.content_combo.addItem(unicode("#ffffff%s" % (session.get_idtf(fmt))))
#
#        else:
#            self._destroy_content_combo()

    def _contentAccept(self, _widget, _v):
        """Handler for content combo accept
        """
        fmt = self.fmts[_v]

        assert type(self.object_active) is scg_objects.SCgNode
        window = scg_utils.createWindowFromNode(self.object_active, fmt)

        self._logic._getSheet().unselectAll()
        self._logic._getSheet().select(window)

        self._destroy_content_combo()
        self.state = SCgEditMode.ES_None
        self.object_active = None
        del self.fmts

    ###################
    ### Visual menu ###
    ###################
    def _createVisualMenu(self):
        """Creates visual menu
        """
        self.vis_menu = VisualMenu()

        # identificator changing
        self.mi_idtf = VisualMenuItem()
        self.mi_idtf.callback = self._handlerChangeIdtf
        self.mi_idtf.setText("Change identifier")
        self.vis_menu.appendItem(self.mi_idtf)

        # type changing
        self.mi_type = VisualMenuItem()
        self.mi_type.callback = self._handlerChangeType
        self.mi_type.setText("Change type")
        self.vis_menu.appendItem(self.mi_type)

        # content changing
        self.mi_contentChange = VisualMenuItem()
        self.mi_contentChange.callback = self._handlerChangeContent
        self.mi_contentChange.setText("Change content")
        self.vis_menu.appendItem(self.mi_contentChange)

        # content showing
        self.mi_content_show = VisualMenuItem()
        self.mi_content_show.callback = self._handlerContentShow
        self.mi_content_show.setText("Show content")
        self.vis_menu.appendItem(self.mi_content_show)

        # content hiding
        self.mi_content_hide = VisualMenuItem()
        self.mi_content_hide.callback = self._handlerContentHide
        self.mi_content_hide.setText("Hide content")
        self.vis_menu.appendItem(self.mi_content_hide)

    def _updateVisualMenu(self):
        """Updates visual menu depending on selection
        """
        if self._logic is None or self._logic._getSheet() is None:
            return

        import types
        sel_objects = [] + self._logic._getSheet().getSelected()

        if self.vis_menu.isShow():
            self.vis_menu.hide()

        if not self.active: return

        n = len(sel_objects)
        if n == 1:
            obj = sel_objects[0]

            # check types
            isNode = isinstance(obj, scg_objects.SCgNode)
            isPair = isinstance(obj, scg_objects.SCgPair)
            isContent = isinstance(obj, objects.ObjectSheet)

            # change type
            self.mi_type.setEnabled(isNode or isPair)
            # content
            self.mi_contentChange.setEnabled(isNode)
            # idtf
            self.mi_idtf.setEnabled(obj._getScAddr() is None)

            cs = ch = False
            if isContent:
                cs = not obj.isContentShow
                ch = obj.isContentShow

            self.mi_content_show.setEnabled(cs)
            self.mi_content_hide.setEnabled(ch)
        else:
            self.mi_type.setEnabled(False)
            self.mi_contentChange.setEnabled(False)
            self.mi_idtf.setEnabled(False)
            self.mi_content_show.setEnabled(False)
            self.mi_content_hide.setEnabled(False)

        if n > 0:
            self.vis_menu.show(
                render_engine.pos3dTo2dWindow(sel_objects[0].getPosition()))