/// <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++; } } }
/// <summary> /// Отобразить свойства элемента /// </summary> private void ShowElemProps(ElemInfo elemInfo) { ctrlElemGroup.Visible = false; ctrlElem.Visible = true; ctrlElem.ElemInfo = elemInfo; ctrlCmd.Visible = false; }
/// <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); }
/// <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(); }
/// <summary> /// Создать узел элемента группы /// </summary> private TreeNode NewElemNode(ElemInfo elemInfo) { TreeNode elemNode = new TreeNode(elemInfo.Caption); elemNode.ImageKey = elemNode.SelectedImageKey = "elem.png"; elemNode.Tag = elemInfo; return(elemNode); }
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; }
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"]; }
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; }
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; }
/// <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(); }
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(); } }
/// <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; } }
/// <summary> /// Конструктор /// </summary> public CtrlElem() { InitializeComponent(); elemInfo = null; }