예제 #1
0
        /// <summary>
        /// Обновить сигналы КП элементов групп, начиная с заданного узла дерева
        /// </summary>
        private void UpdateSignals(TreeNode startGrNode)
        {
            // проверка корректности заданного узла дерева
            if (!(startGrNode.Tag is ElemGroup))
            {
                return;
            }

            // определение начального индекса тегов КП
            TreeNode  prevGrNode    = startGrNode.PrevNode;
            ElemGroup prevElemGroup = prevGrNode == null ? null : prevGrNode.Tag as ElemGroup;
            int       tagInd        = prevElemGroup == null ? 0 : prevElemGroup.StartKPTagInd + prevElemGroup.Elems.Count;

            // обновление групп и их элементов
            int grNodeCnt = grsNode.Nodes.Count;

            for (int i = startGrNode.Index; i < grNodeCnt; i++)
            {
                TreeNode  grNode    = grsNode.Nodes[i];
                ElemGroup elemGroup = grNode.Tag as ElemGroup;
                int       elemSig   = tagInd + 1;
                elemGroup.StartKPTagInd = tagInd;
                tagInd += elemGroup.Elems.Count;

                foreach (TreeNode elemNode in grNode.Nodes)
                {
                    ElemInfo elem = elemNode.Tag as ElemInfo;
                    elem.Signal = elemSig++;
                }
            }
        }
예제 #2
0
 /// <summary>
 /// Отобразить свойства элемента
 /// </summary>
 private void ShowElemProps(ElemInfo elemInfo)
 {
     ctrlElemGroup.Visible = false;
     ctrlElem.Visible      = true;
     ctrlElem.ElemInfo     = elemInfo;
     ctrlCmd.Visible       = false;
 }
예제 #3
0
        /// <summary>
        /// Создать узел группы элементов
        /// </summary>
        private TreeNode NewElemGroupNode(ElemGroup elemGroup)
        {
            string   name   = elemGroup.Name == "" ? KpPhrases.DefGrName : elemGroup.Name;
            TreeNode grNode = new TreeNode(name + " (" + ModbusUtils.GetTableTypeName(elemGroup.TableType) + ")");

            grNode.ImageKey = grNode.SelectedImageKey = elemGroup.Active ? "group.png" : "group_inactive.png";
            grNode.Tag      = elemGroup;

            ushort elemAddr = elemGroup.Address;
            int    elemSig  = elemGroup.StartKPTagInd + 1;

            foreach (Elem elem in elemGroup.Elems)
            {
                ElemInfo elemInfo = new ElemInfo()
                {
                    Elem      = elem,
                    ElemGroup = elemGroup,
                    Settings  = template.Sett,
                    Address   = elemAddr,
                    Signal    = elemSig++
                };

                grNode.Nodes.Add(NewElemNode(elemInfo));
                elemAddr += (ushort)elem.Quantity;
            }

            return(grNode);
        }
예제 #4
0
        /// <summary>
        /// Обновить узлы элементов выбранной группы
        /// </summary>
        private void UpdateElemNodes(TreeNode grNode = null)
        {
            treeView.BeginUpdate();

            if (grNode == null)
            {
                grNode = selNode;
            }

            if (grNode.Tag is ElemGroup elemGroup)
            {
                ushort elemAddr = elemGroup.Address;
                int    elemSig  = elemGroup.StartKPTagInd + 1;

                foreach (TreeNode elemNode in grNode.Nodes)
                {
                    ElemInfo elemInfo = elemNode.Tag as ElemInfo;
                    elemInfo.Address = elemAddr;
                    elemInfo.Signal  = elemSig++;
                    elemNode.Text    = elemInfo.Caption;
                    elemAddr        += (ushort)elemInfo.Elem.Quantity;
                }
            }

            treeView.EndUpdate();
        }
예제 #5
0
        /// <summary>
        /// Создать узел элемента группы
        /// </summary>
        private TreeNode NewElemNode(ElemInfo elemInfo)
        {
            TreeNode elemNode = new TreeNode(elemInfo.Caption);

            elemNode.ImageKey = elemNode.SelectedImageKey = "elem.png";
            elemNode.Tag      = elemInfo;
            return(elemNode);
        }
예제 #6
0
        private void btnMoveDown_Click(object sender, EventArgs e)
        {
            // перемещение объекта вниз
            TreeNode nextNode = selNode.NextNode;
            int      nextInd  = nextNode.Index;

            if (selElemGroup != null)
            {
                // перемещение группы элементов вниз
                ElemGroup nextElemGroup = nextNode.Tag as ElemGroup;

                template.ElemGroups.RemoveAt(nextInd);
                template.ElemGroups.Insert(nextInd - 1, nextElemGroup);

                grsNode.Nodes.RemoveAt(nextInd);
                grsNode.Nodes.Insert(nextInd - 1, nextNode);

                UpdateSignals(nextNode);
            }
            else if (selElemInfo != null)
            {
                // перемещение элемента вниз
                ElemInfo nextElemInfo = nextNode.Tag as ElemInfo;

                selElemInfo.ElemGroup.Elems.RemoveAt(nextInd);
                selElemInfo.ElemGroup.Elems.Insert(nextInd - 1, nextElemInfo.Elem);

                TreeNode grNode = selNode.Parent;
                grNode.Nodes.RemoveAt(nextInd);
                grNode.Nodes.Insert(nextInd - 1, nextNode);

                UpdateElemNodes(grNode);
                ShowElemProps(selElemInfo);
            }
            else if (selCmd != null)
            {
                // перемещение команды вниз
                ModbusCmd nextCmd = nextNode.Tag as ModbusCmd;

                template.Cmds.RemoveAt(nextInd);
                template.Cmds.Insert(nextInd - 1, nextCmd);

                cmdsNode.Nodes.RemoveAt(nextInd);
                cmdsNode.Nodes.Insert(nextInd - 1, nextNode);
            }

            // установка доступности кнопок
            btnMoveUp.Enabled   = selNode.PrevNode != null;
            btnMoveDown.Enabled = selNode.NextNode != null;

            // установка признака изменения
            Modified = true;
        }
예제 #7
0
        private TreeNode cmdsNode;               // узел дерева "Команды"


        /// <summary>
        /// Конструктор, ограничивающий создание формы без параметров
        /// </summary>
        private FrmDevTemplate()
        {
            InitializeComponent();

            appDirs         = null;
            initialFileName = "";
            fileName        = "";
            saveOnly        = false;

            template     = null;
            modified     = false;
            selElemGroup = null;
            selElemInfo  = null;
            selCmd       = null;
            selNode      = null;
            grsNode      = treeView.Nodes["grsNode"];
            cmdsNode     = treeView.Nodes["cmdsNode"];
        }
예제 #8
0
        private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
            // отображение выбранного объекта и его свойств
            selNode = e.Node;
            object tag = selNode.Tag;

            selElemGroup = tag as ElemGroup;
            selElemInfo  = tag as ElemInfo;
            selCmd       = tag as ModbusCmd;

            if (selElemGroup != null)
            {
                ShowElemGroupProps(selElemGroup);
            }
            else if (selElemInfo != null)
            {
                ShowElemProps(selElemInfo);
            }
            else if (selCmd != null)
            {
                ShowCmdProps(selCmd);
            }
            else if (selNode == grsNode)
            {
                ShowElemGroupProps(null);
            }
            else if (selNode == cmdsNode)
            {
                ShowCmdProps(null);
            }
            else // не выполняется
            {
                DisableProps();
            }

            // установка доступности кнопок
            btnAddElem.Enabled = selElemGroup != null || selElemInfo != null;
            bool nodeIsOk = selElemGroup != null || selCmd != null ||
                            selElemInfo != null && selElemInfo.ElemGroup.Elems.Count > 1 /*последний не удалять*/;

            btnMoveUp.Enabled   = nodeIsOk && selNode.PrevNode != null;
            btnMoveDown.Enabled = nodeIsOk && selNode.NextNode != null;
            btnDelete.Enabled   = nodeIsOk;
        }
예제 #9
0
        private void btnAddElem_Click(object sender, EventArgs e)
        {
            // создание элемента и добавление в шаблон устройства
            ElemGroup elemGroup  = selElemGroup == null ? selElemInfo.ElemGroup : selElemGroup;
            int       maxElemCnt = DataUnit.GetMaxElemCnt(elemGroup.TableType);

            if (elemGroup.Elems.Count >= maxElemCnt)
            {
                MessageBox.Show(string.Format(KpPhrases.ElemCntExceeded, maxElemCnt),
                                CommonPhrases.WarningCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            ElemInfo elemInfo = new ElemInfo();

            elemInfo.Elem = new Elem()
            {
                ElemType = elemGroup.DefElemType
            };
            elemInfo.ElemGroup = elemGroup;
            elemInfo.Settings  = template.Sett;
            int ind = selNode.Tag is ElemInfo ? selNode.Index + 1 : elemGroup.Elems.Count;

            elemGroup.Elems.Insert(ind, elemInfo.Elem);

            // создание узла дерева элемента
            TreeNode elemNode = NewElemNode(elemInfo);
            TreeNode grNode   = selNode.Tag is ElemInfo ? selNode.Parent : selNode;

            grNode.Nodes.Insert(ind, elemNode);
            UpdateElemNodes(grNode);
            UpdateSignals(grNode);
            treeView.SelectedNode = elemNode;
            ctrlElem.SetFocus();

            // установка признака изменения
            Modified = true;
        }
예제 #10
0
        /// <summary>
        /// Заполнить дерево в соответствии с шаблоном устройства
        /// </summary>
        private void FillTree()
        {
            // обнуление выбранных объектов и снятие признака изменения
            selElemGroup = null;
            selElemInfo  = null;
            selCmd       = null;
            selNode      = null;
            ShowElemGroupProps(null);
            Modified = false;

            // приостановка отрисовки дерева
            treeView.BeginUpdate();

            // очистка дерева
            grsNode.Nodes.Clear();
            cmdsNode.Nodes.Clear();
            treeView.SelectedNode = grsNode;

            // заполнение узла групп элементов
            foreach (ElemGroup elemGroup in template.ElemGroups)
            {
                grsNode.Nodes.Add(NewElemGroupNode(elemGroup));
            }

            // заполнение узла команд
            foreach (ModbusCmd modbusCmd in template.Cmds)
            {
                cmdsNode.Nodes.Add(NewCmdNode(modbusCmd));
            }

            // раскрытие основных узлов дерева
            grsNode.Expand();
            cmdsNode.Expand();

            // возобновление отрисовки дерева
            treeView.EndUpdate();
        }
예제 #11
0
        private void ctrlElemGroup_ObjectChanged(object sender, ObjectChangedEventArgs e)
        {
            // установка признака изменения конфигурации
            Modified = true;

            // отображение изменений группы элементов в дереве
            TreeUpdateTypes treeUpdateTypes = (TreeUpdateTypes)e.ChangeArgument;

            if (treeUpdateTypes.HasFlag(TreeUpdateTypes.CurrentNode))
            {
                UpdateElemGroupNode();
            }

            if (treeUpdateTypes.HasFlag(TreeUpdateTypes.ChildNodes))
            {
                UpdateElemNodes();
            }

            if (treeUpdateTypes.HasFlag(TreeUpdateTypes.UpdateSignals))
            {
                treeView.BeginUpdate();
                int oldElemCnt = selNode.Nodes.Count;
                int newElemCnt = selElemGroup.Elems.Count;

                if (oldElemCnt < newElemCnt)
                {
                    // добавление узлов дерева для новых элементов
                    ushort elemAddr = selElemGroup.Address;

                    for (int elemInd = 0; elemInd < newElemCnt; elemInd++)
                    {
                        Elem elem = selElemGroup.Elems[elemInd];

                        if (elemInd >= oldElemCnt)
                        {
                            ElemInfo elemInfo = new ElemInfo()
                            {
                                Elem      = elem,
                                ElemGroup = selElemGroup,
                                Settings  = template.Sett,
                                Address   = elemAddr
                            };

                            selNode.Nodes.Add(NewElemNode(elemInfo));
                        }

                        elemAddr += (ushort)elem.Quantity;
                    }
                }
                else if (oldElemCnt > newElemCnt)
                {
                    // удаление лишних узлов дерева
                    for (int i = newElemCnt; i < oldElemCnt; i++)
                    {
                        selNode.Nodes.RemoveAt(newElemCnt);
                    }
                }

                UpdateSignals(selNode);
                treeView.EndUpdate();
            }
        }
예제 #12
0
        /// <summary>
        /// Отобразить свойства элемента
        /// </summary>
        private void ShowElemProps(ElemInfo elemInfo)
        {
            if (elemInfo == null)
            {
                txtElemName.Text      = "";
                txtElemAddress.Text   = "";
                txtElemSignal.Text    = "";
                rbBool.Checked        = true;
                txtElemByteOrder.Text = "";
                gbElem.Enabled        = false;
            }
            else
            {
                txtElemName.Text    = elemInfo.Elem.Name;
                txtElemAddress.Text = elemInfo.AddressRange;
                txtElemSignal.Text  = elemInfo.Signal.ToString();
                ElemType elemType = elemInfo.Elem.ElemType;

                if (elemType == ElemType.Bool)
                {
                    rbUShort.Enabled         = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled =
                        rbULong.Enabled      = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = false;
                    rbBool.Enabled           = true;
                    txtElemByteOrder.Text    = "";
                    txtElemByteOrder.Enabled = false;
                }
                else
                {
                    rbUShort.Enabled         = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled =
                        rbULong.Enabled      = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = true;
                    rbBool.Enabled           = false;
                    txtElemByteOrder.Text    = elemInfo.Elem.ByteOrderStr;
                    txtElemByteOrder.Enabled = true;
                }

                switch (elemType)
                {
                case ElemType.UShort:
                    rbUShort.Checked = true;
                    break;

                case ElemType.Short:
                    rbShort.Checked = true;
                    break;

                case ElemType.UInt:
                    rbUInt.Checked = true;
                    break;

                case ElemType.Int:
                    rbInt.Checked = true;
                    break;

                case ElemType.ULong:
                    rbULong.Checked = true;
                    break;

                case ElemType.Long:
                    rbLong.Checked = true;
                    break;

                case ElemType.Float:
                    rbFloat.Checked = true;
                    break;

                case ElemType.Double:
                    rbDouble.Checked = true;
                    break;

                default:
                    rbBool.Checked = true;
                    break;
                }

                gbElem.Enabled = true;
            }
        }
예제 #13
0
 /// <summary>
 /// Конструктор
 /// </summary>
 public CtrlElem()
 {
     InitializeComponent();
     elemInfo = null;
 }