545 else: |
545 else: |
546 no_modifier.Check(True) |
546 no_modifier.Check(True) |
547 |
547 |
548 # Add Alignment Menu items to the given menu |
548 # Add Alignment Menu items to the given menu |
549 def AddAlignmentMenuItems(self, menu): |
549 def AddAlignmentMenuItems(self, menu): |
550 self.AppendItem(menu, _(u'Left'), self.OnAlignLeftMenu) |
550 self.AppendItem(menu, _('Left'), self.OnAlignLeftMenu) |
551 self.AppendItem(menu, _(u'Center'), self.OnAlignCenterMenu) |
551 self.AppendItem(menu, _('Center'), self.OnAlignCenterMenu) |
552 self.AppendItem(menu, _(u'Right'), self.OnAlignRightMenu) |
552 self.AppendItem(menu, _('Right'), self.OnAlignRightMenu) |
553 menu.AppendSeparator() |
553 menu.AppendSeparator() |
554 self.AppendItem(menu, _(u'Top'), self.OnAlignTopMenu) |
554 self.AppendItem(menu, _('Top'), self.OnAlignTopMenu) |
555 self.AppendItem(menu, _(u'Middle'), self.OnAlignMiddleMenu) |
555 self.AppendItem(menu, _('Middle'), self.OnAlignMiddleMenu) |
556 self.AppendItem(menu, _(u'Bottom'), self.OnAlignBottomMenu) |
556 self.AppendItem(menu, _('Bottom'), self.OnAlignBottomMenu) |
557 |
557 |
558 # Add Wire Menu items to the given menu |
558 # Add Wire Menu items to the given menu |
559 def AddWireMenuItems(self, menu, delete=False, replace=False): |
559 def AddWireMenuItems(self, menu, delete=False, replace=False): |
560 self.AppendItem(menu, _(u'Add Wire Segment'), self.OnAddSegmentMenu) |
560 self.AppendItem(menu, _('Add Wire Segment'), self.OnAddSegmentMenu) |
561 delete_segment = self.AppendItem(menu, _(u'Delete Wire Segment'), |
561 delete_segment = self.AppendItem(menu, _('Delete Wire Segment'), |
562 self.OnDeleteSegmentMenu) |
562 self.OnDeleteSegmentMenu) |
563 replace_wire = self.AppendItem(menu, _(u'Replace Wire by connections'), |
563 replace_wire = self.AppendItem(menu, _('Replace Wire by connections'), |
564 self.OnReplaceWireMenu) |
564 self.OnReplaceWireMenu) |
565 |
565 |
566 delete_segment.Enable(delete) |
566 delete_segment.Enable(delete) |
567 replace_wire.Enable(replace) |
567 replace_wire.Enable(replace) |
568 |
568 |
569 # Add Divergence Menu items to the given menu |
569 # Add Divergence Menu items to the given menu |
570 def AddDivergenceMenuItems(self, menu, delete=False): |
570 def AddDivergenceMenuItems(self, menu, delete=False): |
571 self.AppendItem(menu, _(u'Add Divergence Branch'), |
571 self.AppendItem(menu, _('Add Divergence Branch'), |
572 self.OnAddBranchMenu) |
572 self.OnAddBranchMenu) |
573 delete_branch = self.AppendItem(menu, _(u'Delete Divergence Branch'), |
573 delete_branch = self.AppendItem(menu, _('Delete Divergence Branch'), |
574 self.OnDeleteBranchMenu) |
574 self.OnDeleteBranchMenu) |
575 |
575 |
576 delete_branch.Enable(delete) |
576 delete_branch.Enable(delete) |
577 |
577 |
578 # Add Add Menu items to the given menu |
578 # Add Add Menu items to the given menu |
579 def AddAddMenuItems(self, menu): |
579 def AddAddMenuItems(self, menu): |
580 self.AppendItem(menu, _(u'Block'), |
580 self.AppendItem(menu, _('Block'), |
581 self.GetAddMenuCallBack(self.AddNewBlock)) |
581 self.GetAddMenuCallBack(self.AddNewBlock)) |
582 self.AppendItem(menu, _(u'Variable'), |
582 self.AppendItem(menu, _('Variable'), |
583 self.GetAddMenuCallBack(self.AddNewVariable)) |
583 self.GetAddMenuCallBack(self.AddNewVariable)) |
584 self.AppendItem(menu, _(u'Connection'), |
584 self.AppendItem(menu, _('Connection'), |
585 self.GetAddMenuCallBack(self.AddNewConnection)) |
585 self.GetAddMenuCallBack(self.AddNewConnection)) |
586 menu.AppendSeparator() |
586 menu.AppendSeparator() |
587 |
587 |
588 if self.CurrentLanguage != "FBD": |
588 if self.CurrentLanguage != "FBD": |
589 self.AppendItem(menu, _(u'Power Rail'), |
589 self.AppendItem(menu, _('Power Rail'), |
590 self.GetAddMenuCallBack(self.AddNewPowerRail)) |
590 self.GetAddMenuCallBack(self.AddNewPowerRail)) |
591 self.AppendItem(menu, _(u'Contact'), |
591 self.AppendItem(menu, _('Contact'), |
592 self.GetAddMenuCallBack(self.AddNewContact)) |
592 self.GetAddMenuCallBack(self.AddNewContact)) |
593 |
593 |
594 if self.CurrentLanguage != "SFC": |
594 if self.CurrentLanguage != "SFC": |
595 self.AppendItem(menu, _(u'Coil'), |
595 self.AppendItem(menu, _('Coil'), |
596 self.GetAddMenuCallBack(self.AddNewCoil)) |
596 self.GetAddMenuCallBack(self.AddNewCoil)) |
597 |
597 |
598 menu.AppendSeparator() |
598 menu.AppendSeparator() |
599 |
599 |
600 if self.CurrentLanguage == "SFC": |
600 if self.CurrentLanguage == "SFC": |
601 self.AppendItem(menu, _(u'Initial Step'), |
601 self.AppendItem(menu, _('Initial Step'), |
602 self.GetAddMenuCallBack(self.AddNewStep, True)) |
602 self.GetAddMenuCallBack(self.AddNewStep, True)) |
603 self.AppendItem(menu, (u'Step'), |
603 self.AppendItem(menu, ('Step'), |
604 self.GetAddMenuCallBack(self.AddNewStep)) |
604 self.GetAddMenuCallBack(self.AddNewStep)) |
605 self.AppendItem(menu, (u'Transition'), |
605 self.AppendItem(menu, ('Transition'), |
606 self.GetAddMenuCallBack(self.AddNewTransition)) |
606 self.GetAddMenuCallBack(self.AddNewTransition)) |
607 self.AppendItem(menu, (u'Action Block'), |
607 self.AppendItem(menu, ('Action Block'), |
608 self.GetAddMenuCallBack(self.AddNewActionBlock)) |
608 self.GetAddMenuCallBack(self.AddNewActionBlock)) |
609 self.AppendItem(menu, (u'Divergence'), |
609 self.AppendItem(menu, ('Divergence'), |
610 self.GetAddMenuCallBack(self.AddNewDivergence)) |
610 self.GetAddMenuCallBack(self.AddNewDivergence)) |
611 self.AppendItem(menu, (u'Jump'), |
611 self.AppendItem(menu, ('Jump'), |
612 self.GetAddMenuCallBack(self.AddNewJump)) |
612 self.GetAddMenuCallBack(self.AddNewJump)) |
613 menu.AppendSeparator() |
613 menu.AppendSeparator() |
614 |
614 |
615 self.AppendItem(menu, _(u'Comment'), |
615 self.AppendItem(menu, _('Comment'), |
616 self.GetAddMenuCallBack(self.AddNewComment)) |
616 self.GetAddMenuCallBack(self.AddNewComment)) |
617 |
617 |
618 # Add Default Menu items to the given menu |
618 # Add Default Menu items to the given menu |
619 def AddDefaultMenuItems(self, menu, edit=False, block=False): |
619 def AddDefaultMenuItems(self, menu, edit=False, block=False): |
620 if block: |
620 if block: |
621 edit_block = self.AppendItem(menu, _(u'Edit Block'), |
621 edit_block = self.AppendItem(menu, _('Edit Block'), |
622 self.OnEditBlockMenu) |
622 self.OnEditBlockMenu) |
623 self.AppendItem(menu, _(u'Adjust Block Size'), |
623 self.AppendItem(menu, _('Adjust Block Size'), |
624 self.OnAdjustBlockSizeMenu) |
624 self.OnAdjustBlockSizeMenu) |
625 self.AppendItem(menu, _(u'Delete'), self.OnDeleteMenu) |
625 self.AppendItem(menu, _('Delete'), self.OnDeleteMenu) |
626 |
626 |
627 edit_block.Enable(edit) |
627 edit_block.Enable(edit) |
628 |
628 |
629 else: |
629 else: |
630 if self.CurrentLanguage == 'FBD': |
630 if self.CurrentLanguage == 'FBD': |
631 self.AppendItem(menu, _(u'Clear Execution Order'), |
631 self.AppendItem(menu, _('Clear Execution Order'), |
632 self.OnClearExecutionOrderMenu) |
632 self.OnClearExecutionOrderMenu) |
633 self.AppendItem(menu, _(u'Reset Execution Order'), |
633 self.AppendItem(menu, _('Reset Execution Order'), |
634 self.OnResetExecutionOrderMenu) |
634 self.OnResetExecutionOrderMenu) |
635 menu.AppendSeparator() |
635 menu.AppendSeparator() |
636 |
636 |
637 add_menu = wx.Menu(title='') |
637 add_menu = wx.Menu(title='') |
638 self.AddAddMenuItems(add_menu) |
638 self.AddAddMenuItems(add_menu) |
639 menu.AppendMenu(-1, _(u'Add'), add_menu) |
639 menu.AppendMenu(-1, _('Add'), add_menu) |
640 |
640 |
641 menu.AppendSeparator() |
641 menu.AppendSeparator() |
642 |
642 |
643 cut = self.AppendItem(menu, _(u'Cut'), self.GetClipboardCallBack(self.Cut)) |
643 cut = self.AppendItem(menu, _('Cut'), self.GetClipboardCallBack(self.Cut)) |
644 copy = self.AppendItem(menu, _(u'Copy'), self.GetClipboardCallBack(self.Copy)) |
644 copy = self.AppendItem(menu, _('Copy'), self.GetClipboardCallBack(self.Copy)) |
645 paste = self.AppendItem(menu, _(u'Paste'), self.GetAddMenuCallBack(self.Paste)) |
645 paste = self.AppendItem(menu, _('Paste'), self.GetAddMenuCallBack(self.Paste)) |
646 |
646 |
647 cut.Enable(block) |
647 cut.Enable(block) |
648 copy.Enable(block) |
648 copy.Enable(block) |
649 paste.Enable(self.ParentWindow.GetCopyBuffer() is not None) |
649 paste.Enable(self.ParentWindow.GetCopyBuffer() is not None) |
650 |
650 |
918 |
918 |
919 def RemoveComment(self, comment): |
919 def RemoveComment(self, comment): |
920 self.Comments.pop(comment.GetId()) |
920 self.Comments.pop(comment.GetId()) |
921 |
921 |
922 def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False): |
922 def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False): |
923 blocks = self.Blocks.values() |
923 blocks = list(self.Blocks.values()) |
924 wires = self.Wires.keys() |
924 wires = list(self.Wires.keys()) |
925 comments = self.Comments.values() |
925 comments = list(self.Comments.values()) |
926 if sort_blocks: |
926 if sort_blocks: |
927 blocks.sort(lambda x, y: cmp(x.GetId(), y.GetId())) |
927 blocks.sort(lambda x, y: cmp(x.GetId(), y.GetId())) |
928 if sort_wires: |
928 if sort_wires: |
929 wires.sort(lambda x, y: cmp(self.Wires[x], self.Wires[y])) |
929 wires.sort(lambda x, y: cmp(self.Wires[x], self.Wires[y])) |
930 if sort_comments: |
930 if sort_comments: |
931 comments.sort(lambda x, y: cmp(x.GetId(), y.GetId())) |
931 comments.sort(lambda x, y: cmp(x.GetId(), y.GetId())) |
932 return blocks + wires + comments |
932 return blocks + wires + comments |
933 |
933 |
934 def GetContinuationByName(self, name): |
934 def GetContinuationByName(self, name): |
935 blocks = [] |
935 blocks = [] |
936 for block in self.Blocks.itervalues(): |
936 for block in self.Blocks.values(): |
937 if isinstance(block, FBD_Connector) and\ |
937 if isinstance(block, FBD_Connector) and\ |
938 block.GetType() == CONTINUATION and\ |
938 block.GetType() == CONTINUATION and\ |
939 block.GetName() == name: |
939 block.GetName() == name: |
940 blocks.append(block) |
940 blocks.append(block) |
941 return blocks |
941 return blocks |
942 |
942 |
943 def GetConnectorByName(self, name): |
943 def GetConnectorByName(self, name): |
944 for block in self.Blocks.itervalues(): |
944 for block in self.Blocks.values(): |
945 if isinstance(block, FBD_Connector) and\ |
945 if isinstance(block, FBD_Connector) and\ |
946 block.GetType() == CONNECTOR and\ |
946 block.GetType() == CONNECTOR and\ |
947 block.GetName() == name: |
947 block.GetName() == name: |
948 return block |
948 return block |
949 return None |
949 return None |
2370 if isinstance(startblock, SFC_Objects): |
2370 if isinstance(startblock, SFC_Objects): |
2371 startblockname = self.GetBlockName(startblock) |
2371 startblockname = self.GetBlockName(startblock) |
2372 poss_div_types = [] |
2372 poss_div_types = [] |
2373 |
2373 |
2374 SFC_WireMenu_Buttons = { |
2374 SFC_WireMenu_Buttons = { |
2375 'SFC_Step': (_(u'Step'), self.GetAddToWireMenuCallBack(self.AddNewStep, False)), |
2375 'SFC_Step': (_('Step'), self.GetAddToWireMenuCallBack(self.AddNewStep, False)), |
2376 'SFC_Jump': (_(u'Jump'), self.GetAddToWireMenuCallBack(self.AddNewJump)), |
2376 'SFC_Jump': (_('Jump'), self.GetAddToWireMenuCallBack(self.AddNewJump)), |
2377 'SFC_Transition': (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, False)), |
2377 'SFC_Transition': (_('Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, False)), |
2378 'SFC_ActionBlock': (_(u'Action Block'), self.GetAddToWireMenuCallBack(self.AddNewActionBlock))} |
2378 'SFC_ActionBlock': (_('Action Block'), self.GetAddToWireMenuCallBack(self.AddNewActionBlock))} |
2379 |
2379 |
2380 for endblock in self.SFC_StandardRules.get(startblockname): |
2380 for endblock in self.SFC_StandardRules.get(startblockname): |
2381 if start_direction in endblock: |
2381 if start_direction in endblock: |
2382 if endblock[0] in divergence_types: |
2382 if endblock[0] in divergence_types: |
2383 poss_div_types.append(endblock[0]) |
2383 poss_div_types.append(endblock[0]) |
2384 else: |
2384 else: |
2385 items.append(SFC_WireMenu_Buttons[endblock[0]]) |
2385 items.append(SFC_WireMenu_Buttons[endblock[0]]) |
2386 if len(poss_div_types) > 0: |
2386 if len(poss_div_types) > 0: |
2387 items.append((_(u'Divergence'), self.GetAddToWireMenuCallBack(self.AddNewDivergence, |
2387 items.append((_('Divergence'), self.GetAddToWireMenuCallBack(self.AddNewDivergence, |
2388 poss_div_types))) |
2388 poss_div_types))) |
2389 elif start_direction == EAST: |
2389 elif start_direction == EAST: |
2390 items.extend([ |
2390 items.extend([ |
2391 (_(u'Block'), self.GetAddToWireMenuCallBack(self.AddNewBlock)), |
2391 (_('Block'), self.GetAddToWireMenuCallBack(self.AddNewBlock)), |
2392 (_(u'Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection))]) |
2392 (_('Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection))]) |
2393 |
2393 |
2394 if self.CurrentLanguage != "FBD": |
2394 if self.CurrentLanguage != "FBD": |
2395 items.append((_(u'Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact))) |
2395 items.append((_('Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact))) |
2396 |
2396 |
2397 if self.CurrentLanguage == "LD": |
2397 if self.CurrentLanguage == "LD": |
2398 items.extend([ |
2398 items.extend([ |
2399 (_(u'Coil'), self.GetAddToWireMenuCallBack(self.AddNewCoil)), |
2399 (_('Coil'), self.GetAddToWireMenuCallBack(self.AddNewCoil)), |
2400 (_(u'Power Rail'), self.GetAddToWireMenuCallBack(self.AddNewPowerRail))]) |
2400 (_('Power Rail'), self.GetAddToWireMenuCallBack(self.AddNewPowerRail))]) |
2401 |
2401 |
2402 if self.CurrentLanguage == "SFC": |
2402 if self.CurrentLanguage == "SFC": |
2403 items.append( |
2403 items.append( |
2404 (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True))) |
2404 (_('Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True))) |
2405 else: |
2405 else: |
2406 items.append( |
2406 items.append( |
2407 (_(u'Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True))) |
2407 (_('Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True))) |
2408 return items |
2408 return items |
2409 |
2409 |
2410 # ------------------------------------------------------------------------------- |
2410 # ------------------------------------------------------------------------------- |
2411 # Keyboard event functions |
2411 # Keyboard event functions |
2412 # ------------------------------------------------------------------------------- |
2412 # ------------------------------------------------------------------------------- |
3656 if self.PageSize is not None and not printing: |
3656 if self.PageSize is not None and not printing: |
3657 dc.SetPen(self.PagePen) |
3657 dc.SetPen(self.PagePen) |
3658 xstart, ystart = self.GetViewStart() |
3658 xstart, ystart = self.GetViewStart() |
3659 window_size = self.Editor.GetClientSize() |
3659 window_size = self.Editor.GetClientSize() |
3660 if self.PageSize[0] != 0: |
3660 if self.PageSize[0] != 0: |
3661 for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]): |
3661 for x in range(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]): |
3662 dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), |
3662 dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), |
3663 xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0])) |
3663 xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0])) |
3664 if self.PageSize[1] != 0: |
3664 if self.PageSize[1] != 0: |
3665 for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]): |
3665 for y in range(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]): |
3666 dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, |
3666 dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, |
3667 int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1) |
3667 int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1) |
3668 |
3668 |
3669 # Draw all elements |
3669 # Draw all elements |
3670 for comment in self.Comments.itervalues(): |
3670 for comment in self.Comments.values(): |
3671 if comment != self.SelectedElement and (comment.IsVisible() or printing): |
3671 if comment != self.SelectedElement and (comment.IsVisible() or printing): |
3672 comment.Draw(dc) |
3672 comment.Draw(dc) |
3673 for wire in self.Wires.iterkeys(): |
3673 for wire in self.Wires.keys(): |
3674 if wire != self.SelectedElement and (wire.IsVisible() or printing): |
3674 if wire != self.SelectedElement and (wire.IsVisible() or printing): |
3675 if not self.Debug or not wire.GetValue(): |
3675 if not self.Debug or not wire.GetValue(): |
3676 wire.Draw(dc) |
3676 wire.Draw(dc) |
3677 if self.Debug: |
3677 if self.Debug: |
3678 for wire in self.Wires.iterkeys(): |
3678 for wire in self.Wires.keys(): |
3679 if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue(): |
3679 if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue(): |
3680 wire.Draw(dc) |
3680 wire.Draw(dc) |
3681 for block in self.Blocks.itervalues(): |
3681 for block in self.Blocks.values(): |
3682 if block != self.SelectedElement and (block.IsVisible() or printing): |
3682 if block != self.SelectedElement and (block.IsVisible() or printing): |
3683 block.Draw(dc) |
3683 block.Draw(dc) |
3684 |
3684 |
3685 if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing): |
3685 if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing): |
3686 self.SelectedElement.Draw(dc) |
3686 self.SelectedElement.Draw(dc) |