| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Globalization;
- using System.Linq;
- using System.Text.RegularExpressions;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Input;
- using System.Windows.Media;
- using SAGA.Models;
- namespace SAGA.GplotDrawData
- {
- /// <summary>
- /// WinDrawWaterNode.xaml 的交互逻辑
- /// </summary>
- public partial class WinDrawWaterNode {
- public WinDrawWaterNode() {
- InitializeComponent();
- Vertex.SetRadius(6, 6);
- this.Loaded += WinDrawWaterNode_Loaded;
- }
- private bool IsRead = true;
- private LogicNode m_data;
- public WinDrawWaterNode(LogicNode node) : this() {
- m_data = node;
- IsRead = false;
- }
- private void WinDrawWaterNode_Loaded(object sender, RoutedEventArgs e) {
- if (!IsRead) goto Run;
- var node = DbHelper.FindOneByFile<LogicNode>();
- m_data = node;
- if (m_data == null)
- {
- return;
- }
- Run:
- LogicNode root = new LogicNode { Name = m_data.Name };
- m_data.Nodes.ForEach(t => root.Nodes.Add(new LogicNode() { Name = t.Name }));
- this.rootNode.ItemsSource = new ObservableCollection<LogicNode> { root };
- var ln = m_data.Nodes.FirstOrDefault();
- Draw(ln);
- }
- private void Draw(LogicNode ln) {
- if (ln == null) return;
- this.panel.Children.Clear();
- #region 夏冻冬冷需要增加楼层节点
- //夏冻冬冷需要增加楼层节点
- if (Regex.IsMatch(ln.Name, "夏-冷冻水|冬-冷却水")) {
- //取出所有的冷冻水
- var water = DrawDataServer.GetWaterData();
- var floorNames = water.FloorDatas.Select(t => t.Name).ToList();
- LogicNode floorLogicNode = new LogicNode
- {
- RelationType = ChildrenRelationType.ParallelCon
- };
- floorNames.ForEach(name => floorLogicNode.Nodes.Add(new LogicNode() { Elements = new List<SgElement>() { new SgElement("", name) } }));
- if (ln.Nodes.Count == 2)//只有两个节点
- {
- var sameRealNode = ln.Nodes[1].RealNodes.FirstOrDefault(rn =>
- ln.Nodes[0].RealNodes[0].ToString() == rn.ToString()
- || ln.Nodes[0].RealNodes[1].ToString() == rn.ToString());
- if (sameRealNode != null) {
- floorLogicNode.RealNodes.Add(ln.Nodes[0].RealNodes.FirstOrDefault(rn => rn != sameRealNode));
- floorLogicNode.RealNodes.Add(ln.Nodes[1].RealNodes.FirstOrDefault(rn => rn != sameRealNode));
- ln.Nodes.Add(floorLogicNode);
- }
- }
- }
- #endregion
- var n = 3;
- var top = perHeight * (n - 1) / 2.0d;
- var start = new Point(30, this.panel.Width / 4.0d);
- var end = start;
- //起点
- this.panel.Children.Add(Vertex.GetHollow(start));
- //数据整理,去掉外挂
- // ln.Nodes.RemoveAll(t => t.RelationType == ChildrenRelationType.AddOnSystem);
- end = DrawNode(ln, end, top);
- //if (Regex.IsMatch(ln.Name, "夏-冷冻水|冬-冷却水")) {
- // end = end.AddX(width);
- // //连接终点与起点
- // var temp1 = start.AddY(perHeight * 4);
- // var temp2 = end.AddY(perHeight * 4);
- // this.panel.Children.Add(new SgLine(start.AddY(6), temp1));
- // this.panel.Children.Add(new SgLine(temp2.AddX(-6), temp1));
- // this.panel.Children.Add(new SgLine(end.AddX(-6), end.AddX(-width + 6)));
- // //终点
- // this.panel.Children.Add(Vertex.GetHollow(end.AddX(-width)));
- // this.panel.Children.Add(Vertex.GetHollow(end));
- // this.panel.Children.Add(Vertex.GetHollow(temp2));
- //}
- //else
- { //连接终点与起点
- var temp1 = start.AddY(perHeight * 4);
- var temp2 = end.AddY(perHeight * 4);
- this.panel.Children.Add(new SgLine(start.AddY(+6), temp1));
- this.panel.Children.Add(new SgLine(temp2, temp1));
- this.panel.Children.Add(new SgLine(end.AddY(+6), temp2));
- //终点
- this.panel.Children.Add(Vertex.GetHollow(end));
- }
- this.panel.Width = end.X + 500;
- }
- double width = 160;
- double perHeight = 60;
- private Point DrawNode(LogicNode ln1, Point end, double top) {
- if (ln1 == null) return end;
- //避免移除数据对原始数据造成影响
- var ln = new LogicNode { Name = ln1.Name };
- ln1.Nodes.ForEach(ln.Nodes.Add);
- if (ln.Nodes.Count == 0) return end;
- var node = ln.Nodes[0];
- for (int i = 0; i < ln.Nodes.Count; i++) {
- bool isAddLine = false;
- //当前节点为子节点
- if (node.Nodes.Count == 0) {
- continue;
- }
- //当前节点的子节点也包含子节点
- if (node.Nodes.Any(t => t.Nodes.Count > 0)) {
- end = DrawNode(node, end, top);
- continue;
- }
- var m = node.Nodes.Count;
- // "地源热泵|供冷冷却水泵|供冷冷冻水泵|地埋管|流量传感器|压力传感器|温度传感器";
- var regStr = @"^(CCWH|CCOP|CCCP|CCGHBP|SEFL|SEPS|SETP)-\w+";
- var names = node.Nodes.Select(t1 => {
- var elment = t1.Elements.FirstOrDefault(t => Regex.IsMatch(t.FamilyName ?? "", regStr));
- if (elment != null) return elment.Sno + ":" + elment.Name;
- return "";
- }).ToList();
- if (node.RelationType == ChildrenRelationType.ParallelCon) {
- top = perHeight * (m - 1) / 2.0d;
- //找出最长子节点
- var maxLen = node.Nodes.Max(t1 =>
- t1.Elements.Count(t => Regex.IsMatch(t.FamilyName ?? "", regStr))
- );
- var length = Math.Max(0, width * (maxLen - 1));//楼层为maxLen为0
- //设备并联
- for (int j = 0; j < m; j++) {
- var nodeNames = node.Nodes[j].Elements.Where(t => Regex.IsMatch(t.FamilyName ?? "", regStr))
- .Select(t => t.Sno + ":" + t.Name).ToList();
- //加入楼层
- var floorNames = node.Nodes[j].Elements.Where(t => t.Id == "")
- .Select(t => t.Name).ToList();
- nodeNames.AddRange(floorNames);
- var point = end.AddX(width).AddY(-top + perHeight * j);
- // ShowText(point, names[j]);
- //连线
- this.panel.Children.Add(new SgLine(end.AddX(6), point));
- // this.panel.Children.Add(new Vertex(point));//增加传感器串联20171225
- var curWidth = nodeNames.Count <= 1 ? 0 : length / (nodeNames.Count - 1);
- DrawSeriesCon(point, nodeNames, curWidth);
- this.panel.Children.Add(new SgLine(end.AddX(-6 + length + 2 * width), point.AddX(length)));
- }
- end = end.AddX(length + 2 * width);
- isAddLine = true;
- }
- else if (node.RelationType == ChildrenRelationType.SeriesCon) {
- //设备串联
- DrawSeriesCon(end.AddX(width), names, width);
- end = end.AddX(width * (m + 1));
- //补一个连接线
- this.panel.Children.Add(new SgLine(end.AddX(6 - width), end));
- }
-
- //增加终点
- this.panel.Children.Add(Vertex.GetHollow(end));
- //移除当前元素,避免查找污染
- ln.Nodes.Remove(node);
- i--;
- node = ln.Nodes.FirstOrDefault(t => IsConnector(t, node));
- //if (node != null &&
- // node.RelationType == ChildrenRelationType.ParallelCon &&
- // isAddLine) {
- end = end.AddX(width);
- //增加终点连接线
- this.panel.Children.Add(new SgLine(end.AddX(6 - width), end.AddX(-6)));
- //增加下一组的起点
- this.panel.Children.Add(Vertex.GetHollow(end));
- //}
- if (node == null) break;
- }
- return end;
- }
- private void DrawSeriesCon(Point end, List<string> names, double nodeWidth) {
- var m = names.Count;
- for (int j = 0; j < m; j++) {
- var point = end.AddX(nodeWidth * j);
- ShowText(point, names[j]);
- //连线
- if (j < m - 1)//最后一条线不连
- {
- this.panel.Children.Add(new SgLine(point.AddX(6 + nodeWidth), point));
- }
- var v = new Vertex(point) {
- ShowAction = (eid) => {
- if (string.IsNullOrEmpty(eid))//只有楼层Eid为空
- {
- WinDrawEndPoint winDraw = new WinDrawEndPoint();
- winDraw.ShowDialog();
- }
- }
- };
- this.panel.Children.Add(v);
- // this.panel.Children.Add(new SgLine(end.AddX(-6), point));
- }
- }
- private void ShowText(Point end, double top, string name) {
- TextBlock tb = new TextBlock() {
- Width = 100,
- TextAlignment = TextAlignment.Center,
- Text = name
- };
- Canvas.SetTop(tb, end.Y - top - 20);
- Canvas.SetLeft(tb, end.X + width - tb.Width / 2.0d);
- this.panel.Children.Add(tb);
- }
- private void ShowText(Point end, string name) {
- TextBlock tb = new TextBlock() {
- Width = 100,
- Height = 20,
- TextAlignment = TextAlignment.Center,
- Text = name
- };
- Canvas.SetTop(tb, end.Y - 15 - tb.Height);
- Canvas.SetLeft(tb, end.X - tb.Width / 2.0d);
- this.panel.Children.Add(tb);
- }
- public bool IsConnector(LogicNode node1, LogicNode node2) {
- if (node1 == null || node2 == null) return false;
- if (node1 == node2) return false;
- return node1.RealNodes.Any(n => node2.RealNodes.
- Any(n1 => n.ToString() == n1.ToString()));
- }
- private double scaleValue = 1;
- private void Canvas_OnMouseWheel(object sender, MouseWheelEventArgs e) {
- //TODO:影响文字的位置
- //if (scaleValue < 0.3 && scaleValue < 0.3 && e.Delta < 0) {
- // return;
- //}
- //double val = (double)e.Delta / 2000; //描述鼠标滑轮滚动
- //scaleValue += val;
- //MoveElement(panel, x, y, scaleValue);
- }
-
- private void RootNode_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) {
- if (rootNode.SelectedItem is LogicNode ln) {
- var data = m_data.Nodes.FirstOrDefault(m => m.Name == ln.Name);
- Draw(data);
- }
- }
- private bool isMouseLeftButtonDown = false;
- Point previousMousePoint = new Point(0, 0);
- private void panel_MouseDown(object sender, MouseButtonEventArgs e) {
- if (e.LeftButton == MouseButtonState.Pressed) {
- isMouseLeftButtonDown = true;
- previousMousePoint = e.GetPosition(panel);
- }
- this.Cursor = Cursors.Hand;
- }
- private double x = 0;
- private double y = 0;
- private void panel_MouseUp(object sender, MouseButtonEventArgs e) {
- if (isMouseLeftButtonDown) {
- Point position = e.GetPosition(panel);
- x += position.X - this.previousMousePoint.X;
- y += position.Y - this.previousMousePoint.Y;
- }
- isMouseLeftButtonDown = false;
- this.Cursor = Cursors.Arrow;
- }
- private void panel_MouseMove(object sender, MouseEventArgs e) {
- if (e.LeftButton == MouseButtonState.Pressed) {
- Point position = e.GetPosition(panel);
- var tempx = position.X - this.previousMousePoint.X;
- var tempy = position.Y - this.previousMousePoint.Y;
- var x0 = x + tempx;
- var y0 = y + tempy;
- MoveElement(panel, x0, y0, scaleValue);
- }
- }
- /// <summary>
- /// 双击滚轮,缩放匹配
- /// </summary>
- /// <param name="e"></param>
- protected override void OnMouseDown(MouseButtonEventArgs e) {
- base.OnMouseDown(e);
- if (e.ChangedButton == MouseButton.Middle) {
- if (panel.InputHitTest(e.GetPosition(panel)) is Canvas && e.ClickCount == 2) {
- scaleValue = 1;
- x = 0;
- y = 0;
- MoveElement(panel, x, y, scaleValue);
- }
- }
- }
- /// <summary>
- /// 平移Canvas中的元素,
- /// 由于TranslateTransform是平移画布,所有采用平移元素的方式
- /// </summary>
- /// <param name="canvas"></param>
- /// <param name="dx"></param>
- /// <param name="dy"></param>
- private void MoveElement(Canvas canvas, double dx, double dy, double scale) {
- foreach (UIElement s in canvas.Children) {
- TransformGroup transformGroup = new TransformGroup();
- TranslateTransform translateTransform = new TranslateTransform {
- X = dx,
- Y = dy
- };
- transformGroup.Children.Add(translateTransform);
- ScaleTransform scaleTransform = new ScaleTransform {
- ScaleX = scale,
- ScaleY = scale
- };
- transformGroup.Children.Add(scaleTransform);
- s.RenderTransform = transformGroup;
- }
- }
- private void win_SizeChanged(object sender, SizeChangedEventArgs e) {
- this.panel.Width = e.NewSize.Width - 150;
- this.panel.Height = e.NewSize.Height - 20;
- }
- }
- public static class ExtertMethods {
- public static Point AddX(this Point point, double x) {
- return new Point(point.X + x, point.Y);
- }
- public static Point AddY(this Point point, double y) {
- return new Point(point.X, point.Y + y);
- }
- public static Point Add(this Point point, Point point1) {
- return new Point(point.X + point.X, point.Y + point1.Y);
- }
- public static Point Mult(this Point point, Point point1) {
- return new Point(point.X - point1.X, point.Y - point1.Y);
- }
- }
- public class NameVisibility : IValueConverter {
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
- if (value == null) {
- return System.Windows.Visibility.Collapsed;
- }
- else {
- return System.Windows.Visibility.Visible;
- }
- }
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
- throw new NotImplementedException();
- }
- }
- }
|