Imports System.Text Imports System.Xml Imports BLV_Studio.TableInteraction Imports FlexCell Imports Newtonsoft.Json Public Class DrSeverGrid ''' ''' 设备键值对 设备名-设备信息集合 主机=主机名 外设=外设名+播马地址 ''' Public Dic_Devicemodel As Dictionary(Of String, DeviceModel) ''' ''' 设备动作信息 设备名-动作信息集合 ''' Public Dic_ActionConfiguration As List(Of TableRowTag) Public Dic_Dgrid As Grid Public Dic_TimeZone As String Public Dic_Bname As String Public Dic_Cname As String Public G_SceneID As Integer Public ColumnAnothername As Dictionary(Of String, String) Sub New(devlList As Dictionary(Of String, DeviceModel), ActionConfiguration As List(Of TableRowTag), Dgrid As Grid, bname As String, Cname As String) Dic_Devicemodel = devlList Dic_ActionConfiguration = ActionConfiguration Dic_Dgrid = Dgrid Dic_Bname = bname Dic_Cname = Cname ColumnAnothername = New Dictionary(Of String, String) '保存---------- '保存基类名称 '保存设备类对象 '保存动作 '提交----- '下载----- '解析到类对象 '加载设备对象 '加载设备对象约束 '加载动作 End Sub #Region "Save" ''' ''' 保存模型信息至Xml文件 ''' ''' xml完整路径 ''' Public Function Save(OuputFullName As String) As Boolean Dim xws As New XmlWriterSettings Dim xmlpath As String = OuputFullName.Replace(".blv", ".xml") Try With xws .Indent = True .NewLineOnAttributes = False .Encoding = New UTF8Encoding(False) End With IO.Directory.CreateDirectory(xmlpath.Substring(0, xmlpath.LastIndexOf("\"))) Using xw As XmlWriter = XmlWriter.Create(xmlpath, xws) xw.WriteStartDocument() xw.WriteStartElement($"RcuConfig") '创建跟节点 '新建基类文件名节点 xw.WriteStartElement($"BasicClassFilename") '创建表属性节点 xw.WriteString(Dic_Bname) xw.WriteEndElement() '新建条件文件名节点 xw.WriteStartElement($"ConctionFilename") '创建表属性节点 xw.WriteString(Dic_Cname) xw.WriteEndElement() xw.WriteStartElement($"DevNodes") '创建表属性节点 'For Each node In Dic_Devicemodel xw.WriteString($"{JsonConvert.SerializeObject(Dic_Devicemodel)}") 'WriteRowNodeToXml(xw, node.Value) ' Next xw.WriteEndElement() xw.WriteStartElement($"Cols") '创建表属性节点 WriteColNodeToXml(xw) xw.WriteEndElement() xw.WriteStartElement($"Rows") '创建表属性节点 WriteRowNodeToXml(xw) xw.WriteEndElement() xw.WriteEndElement() xw.WriteEndDocument() End Using If IO.File.Exists(OuputFullName) Then IO.File.Delete(OuputFullName) End If Rename(xmlpath, OuputFullName) ' _isCellChanged = False '复位文件修改标记 Return True Catch ex As Exception MsgBox($"保存文件失败,{ex.Message}") Return False End Try End Function Public Sub WriteRowNodeToXml(xw As XmlWriter) Dim row As Integer = 7 Dim li As New List(Of Integer) For Each node In Dic_ActionConfiguration xw.WriteStartElement($"DevName") 'xw.WriteString($"{node.G_DevModeName}") xw.WriteAttributeString("DevName", $"{node.G_DevModeName}") xw.WriteAttributeString("DataType", $"{node.G_DevNodeName}") xw.WriteAttributeString("Name", $"{node.G_DevNodeIndex }") xw.WriteAttributeString("KeyType", $"{JsonConvert.SerializeObject(node.G_KeyType) }") xw.WriteAttributeString("DicRow", $"{JsonConvert.SerializeObject(node.G_DicRow) }") li.Clear() For Each index In node.G_DicRow.Keys If Dic_Dgrid.Cell(row, index).ForeColor = Color.DarkRed Then li.Add(index) End If Next xw.WriteAttributeString("DicRowCheck", $"{JsonConvert.SerializeObject(li) }") xw.WriteAttributeString("Tag", JsonConvert.SerializeObject(Dic_Dgrid.Cell(row, 6).Tag)) row += 1 xw.WriteEndElement() Next End Sub Public Sub WriteColNodeToXml(xw As XmlWriter) Dim fr, lr, fc, lc As Integer For i = 8 To Dic_Dgrid.Cols - 1 With Dic_Dgrid.Range(1, i, 1, i) fr = .FirstRow lr = .LastRow fc = .FirstCol lc = .LastCol If String.IsNullOrEmpty(Dic_Dgrid.Cell(fr, fc).Text) Then i = lc Continue For End If xw.WriteStartElement($"DevName") xw.WriteAttributeString("DevName", $"{Dic_Dgrid.Cell(fr, fc).Text }") i = lc For j = fc To i With Dic_Dgrid.Range(2, j, 2, j) fr = .FirstRow lr = .LastRow fc = .FirstCol lc = .LastCol xw.WriteStartElement($"Function") xw.WriteAttributeString("DataType", $"{Dic_Dgrid.Cell(fr, fc).Text }") xw.WriteAttributeString("Name", $"{Dic_Dgrid.Cell(fr + 1, fc).Text }") For cj = fc To lc xw.WriteStartElement($"ID") xw.WriteAttributeString("Val", $"{Dic_Dgrid.Cell(fr + 2, cj).Text }") xw.WriteAttributeString("Name", $"{Dic_Dgrid.Cell(fr + 3, cj).Text }") xw.WriteAttributeString("LockCol", Dic_Dgrid.Column(cj).Visible) xw.WriteEndElement() Next xw.WriteEndElement() j = lc End With Next End With xw.WriteEndElement() Next End Sub #End Region #Region "LoadFile" Public InsertColumn As Integer Public Function LoadFile(OuputFullName As String) Dim ts As DateTime = Now Dim st As TimeSpan '解析到类对象 Dim xd As New XmlDocument() xd.Load(OuputFullName) InsertColumn = 8 Dim xe, axe, bxe, cxe As XmlElement Dim nodeList As XmlNodeList = xd.SelectSingleNode($"RcuConfig").ChildNodes For Each node As XmlNode In nodeList xe = CType(node, XmlElement) Select Case xe.LocalName Case "TimeZone" Dic_TimeZone = xe.InnerText Dic_Dgrid.Cell(TableRowNumber.FunctionAnotherName, TableColNumber.ServerAttribute).Text = Dic_TimeZone Case "BasicClassFilename" Dic_Bname = xe.InnerText Case "ConctionFilename" Dic_Cname = xe.InnerText Case "DevNodes" Dic_Devicemodel = JsonConvert.DeserializeObject(Of Dictionary(Of String, DeviceModel))(xe.InnerText) Case "Cols" Dim DevName As String = String.Empty Dim DataType As String = String.Empty Dim Name As String = String.Empty ColumnAnothername.Clear() Dim startColumn = 8 For Each Index In xe.ChildNodes axe = CType(Index, XmlElement) DevName = axe.Attributes.GetNamedItem("DevName").InnerText For Each aIndex In axe.ChildNodes bxe = CType(aIndex, XmlElement) DataType = bxe.Attributes.GetNamedItem("DataType").InnerText Name = bxe.Attributes.GetNamedItem("Name").InnerText Dic_Dgrid.InsertCol(InsertColumn, bxe.ChildNodes.Count) Dic_Dgrid.Cell(1, startColumn).Text = DevName With Dic_Dgrid.Range(1, startColumn, 1, InsertColumn + bxe.ChildNodes.Count - 1) .Locked = False .Merge() .Locked = True End With Dic_Dgrid.Cell(3, InsertColumn).Text = Name With Dic_Dgrid.Range(3, InsertColumn, 3, InsertColumn + bxe.ChildNodes.Count - 1) .Locked = False .Merge() .Locked = True End With Dic_Dgrid.Cell(2, InsertColumn).Text = DataType With Dic_Dgrid.Range(2, InsertColumn, 2, InsertColumn + bxe.ChildNodes.Count - 1) .Locked = False .Merge() .Locked = True End With For Each bIndex In bxe.ChildNodes cxe = CType(bIndex, XmlElement) Dic_Dgrid.Column(InsertColumn).Width = 30 With Dic_Dgrid.Range(5, InsertColumn, 6, InsertColumn) .Locked = False .WrapText = True .Merge() End With Dic_Dgrid.Cell(4, InsertColumn).Text = cxe.Attributes.GetNamedItem("Val").InnerText Dic_Dgrid.Cell(5, InsertColumn).Text = cxe.Attributes.GetNamedItem("Name").InnerText Dic_Dgrid.Column(InsertColumn).Visible = cxe.Attributes.GetNamedItem("LockCol").InnerText Dim val As String = $"{DevName }*{Dic_Dgrid.Cell(4, InsertColumn).Text }*{DataType }" Dim key As String = $"{DevName}_{ Dic_Dgrid.Cell(5, InsertColumn).Text}" If ColumnAnothername.ContainsKey(key) Then Else For Each strval In ColumnAnothername If strval.Value.Equals(val) Then ColumnAnothername.Remove(strval.Key) Exit For End If Next ColumnAnothername.Add(key, val) End If InsertColumn += 1 Next Next startColumn = InsertColumn Next Dic_Dgrid.Column(InsertColumn).Width = 0 Dic_Dgrid.Range(1, 8, 5, Dic_Dgrid.Cols - 1).Alignment = AlignmentEnum.CenterCenter '--------------设置列绑定 Case "Rows" Dic_ActionConfiguration.Clear() Dim rowlockli As New List(Of Integer) Dim DicRowCheckli As New List(Of Integer) For Each Index In xe.ChildNodes axe = CType(Index, XmlElement) Dim rowTag As New TableRowTag rowTag.G_DevModeName = axe.Attributes.GetNamedItem("DevName").InnerText rowTag.G_DevNodeName = axe.Attributes.GetNamedItem("DataType").InnerText rowTag.G_DevNodeIndex = axe.Attributes.GetNamedItem("Name").InnerText rowTag.G_KeyType = JsonConvert.DeserializeObject(Of List(Of String))(axe.Attributes.GetNamedItem("KeyType").InnerText) rowTag.G_DicRow = JsonConvert.DeserializeObject(Of Dictionary(Of Integer, String))(axe.Attributes.GetNamedItem("DicRow").InnerText) If axe.Attributes.Count = 7 Then DicRowCheckli = JsonConvert.DeserializeObject(Of List(Of Integer))(axe.Attributes.GetNamedItem("DicRowCheck").InnerText) End If Dic_ActionConfiguration.Add(rowTag) Dic_Dgrid.AddItem("") For Each coltxt In rowTag.G_DicRow If coltxt.Key = 6 Then Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, coltxt.Key).Tag = JsonConvert.DeserializeObject(Of String)(axe.Attributes.GetNamedItem("Tag").InnerText) Dim celltag As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, coltxt.Key).Tag) If Not IsNothing(celltag) AndAlso celltag.ContainsKey("CallRow") AndAlso Not String.IsNullOrEmpty(celltag.Item("CallRow")) Then ' Dic_Dgrid.Row(Dic_Dgrid.Rows - 1) rowlockli.Add(Dic_Dgrid.Rows - 1) End If End If If coltxt.Key = 3 Then Dim maxSceneID = CInt(coltxt.Value) If G_SceneID < maxSceneID Then G_SceneID = maxSceneID End If End If If coltxt.Value.Contains("*") Then Dim g_devname As New CtabRange(Dic_Dgrid, 2, coltxt.Key) Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, coltxt.Key).Text = EstimateFilag(coltxt.Value, g_devname.devname) Else Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, coltxt.Key).Text = coltxt.Value End If Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, coltxt.Key).ForeColor = Color.Black Next Dim rname As String = GetgrdRange(Dic_Dgrid, Dic_Dgrid.Rows - 2, 1, 1) If rowTag.G_DevNodeName.Equals("HOSTSERVICE") Then If rname.Equals(rowTag.G_DevNodeName) Then With Dic_Dgrid.Range(Dic_Dgrid.Rows - 2, 1, Dic_Dgrid.Rows - 1, 1) .WrapText = True .Locked = False .Merge() .Locked = True End With Else Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, 1).Text = "HOSTSERVICE" End If Else If rname.Equals(rowTag.G_DevModeName) Then With Dic_Dgrid.Range(Dic_Dgrid.Rows - 2, 1, Dic_Dgrid.Rows - 1, 1) .WrapText = True .Locked = False Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, 1).Text = rowTag.G_DevModeName .Merge() Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, 1).Text = rowTag.G_DevModeName .Locked = True End With Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, 1).Text = rowTag.G_DevModeName Else Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, 1).Text = rowTag.G_DevModeName End If End If If rowTag.G_DevNodeName.Equals("语音") Then Dic_Dgrid.Row(Dic_Dgrid.Rows - 1).Locked = True End If For Each cIndex In DicRowCheckli Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, cIndex).BackColor = Color.OrangeRed Dic_Dgrid.Cell(Dic_Dgrid.Rows - 1, cIndex).ForeColor = Color.DarkRed Next Next For Each index In rowlockli Dic_Dgrid.Row(index).Locked = True Next Dic_Dgrid.Range(6, 0, Dic_Dgrid.Rows - 1, Dic_Dgrid.Cols - 1).Alignment = AlignmentEnum.CenterCenter Dic_Dgrid.Range(7, 6, Dic_Dgrid.Rows - 1, Dic_Dgrid.Cols - 1).CellType = CellTypeEnum.ComboBox Dic_Dgrid.Range(7, 2, Dic_Dgrid.Rows - 1, 2).CellType = CellTypeEnum.CheckBox G_SceneID = G_SceneID + 1 Case Else Throw New Exception($"LoadXml untreated localName:{xe.LocalName}") End Select Next End Function Public Function EstimateFilag(cellstr As String, nodename As String) As String If String.IsNullOrEmpty(cellstr) OrElse String.IsNullOrEmpty(nodename) Then Return String.Empty Dim tbuf() As String = cellstr.Split(vbLf) Dim cbuf() As String = tbuf(0).Split(",") If cbuf.Length < 2 Then Return String.Empty Dim buf() As String = cbuf(cbuf.Length - 1).Split("*") Dim result As String = String.Empty Select Case nodename Case "CLED_FRESHAIR" 'result = "CLED新风" Case "CLEDFLOORHEAT" 'result = $"{buf(3)}" Case "485FloorHeat", "485FreshAir" If buf.Length > 3 Then cbuf = buf(3).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" End If 'Case 'result = $"{buf(3)}" Case "485MUSIC" result = cellstr 'Case ' result = $"{buf(3)}" Case "INFRARED_FORWARD" If buf.Length = 3 Then cbuf = buf(2).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" ElseIf buf.Length > 3 Then cbuf = buf(2).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" cbuf = buf(3).Split(" ") 'result = $"{cbuf(cbuf.Length - 1)}" result = $"{result}:{cbuf(cbuf.Length - 1)}" End If 'Case Case "RELAY" If buf.Length > 2 Then cbuf = buf(2).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" If result.Equals("开") Then result = Chr(TableColSwitchKeyDate.TurnOn).ToString() ElseIf result.Equals("关") Then result = Chr(TableColSwitchKeyDate.TurnDrown).ToString() End If End If Case "Dimming" If buf.Length > 2 Then cbuf = buf(2).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" If result.Equals("80") Then result = Chr(TableColSwitchKeyDate.TurnOn).ToString() ElseIf result.Equals("0") Then result = Chr(TableColSwitchKeyDate.TurnDrown).ToString() End If End If Case "PB_LINE_CONTROL", "PB_STRIP_DEVICE", "PB_LED_DEVICE" result = cellstr If buf.Length > 3 AndAlso tbuf(0).Contains("PB灯带亮度控制") Then cbuf = buf(3).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" If result.Equals("80") Then result = Chr(TableColSwitchKeyDate.TurnOn).ToString() ElseIf result.Equals("0") Then result = Chr(TableColSwitchKeyDate.TurnDrown).ToString() End If End If Case "DO", "LIGHT", "DRY_CURTAIN", "RS485_Curtain", "CURTAIN" If buf.Length > 2 Then cbuf = buf(2).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" End If Case "MUSIC" result = cellstr 'Case ' result = $"{buf(2)}" 'Case ' result = $"{buf(2)}" Case "Temp" If buf.Length > 5 Then 'cbuf = buf(3).Split(" ") 'result = $"{cbuf(cbuf.Length - 1)}" cbuf = buf(4).Split(" ") result = $"{cbuf(cbuf.Length - 1)}" cbuf = buf(5).Split(" ") result = $"{result}{cbuf(cbuf.Length - 1)}" End If Case Else End Select Return result End Function Public Function GetgrdRange(grd As Grid, r As Integer, c As Integer, selectstr As Integer) As String Dim result As String = String.Empty With grd.Range(r, c, r, c) Select Case selectstr Case 1 result = grd.Cell(.FirstRow, .FirstCol).Text Case 2 result = .FirstCol Case 3 result = .LastCol Case 4 result = .FirstRow Case 5 result = .LastRow End Select Return result End With End Function #End Region End Class