public static PlanElement FromRectangle(ElementBaseRectangle elem) { if (elem is ElementEllipse) { return null; } var showState = false; if (HasProperty(elem, "ShowState")) { showState = (bool)GetProperty(elem, "ShowState"); } if (elem is ElementRectangleGKMPT) { showState = true; } Guid zoneUID = Guid.Empty; if (HasProperty(elem, "ZoneUID")) { zoneUID = (Guid)GetProperty(elem, "ZoneUID"); } if (!showState) { if (elem is ElementRectangle) { return FromRectangleSimple(elem, false); } return FromRectangleSimple(elem, true); } // Получаем прямоугольник, в который вписан текст // Получаем элемент текста var textElement = new ElementTextBlock { FontBold = true, FontFamilyName = "Arial", FontItalic = true, Text = "Неизвестно", FontSize = 18, ForegroundColor = RubezhAPI.Colors.Black, WordWrap = false, BorderThickness = 1, Stretch = true, TextAlignment = 1, VerticalAlignment = 1, PresentationName = elem.PresentationName, UID = zoneUID == Guid.Empty ? elem.UID : zoneUID, Height = elem.Height, Width = elem.Width }; var planElementText = FromTextElement( textElement, new System.Windows.Size(elem.Width, elem.Height), elem.Left, elem.Top, false); // Получаем элемент прямоугольника, в который вписан текст var planElementRect = FromRectangleSimple(elem, false); // Очищаем элементы от групповой информации planElementText.Hint = null; planElementText.HasOverlay = false; planElementText.Id = Guid.Empty.ToString(); planElementRect.Hint = null; planElementRect.HasOverlay = false; planElementRect.Id = Guid.Empty.ToString(); // Задаем групповой элемент var planElement = new PlanElement { ChildElements = new[] { planElementRect, planElementText }, Id = zoneUID == Guid.Empty ? "pe" + elem.UID : "pe" + zoneUID, Hint = GetElementHint(elem), GkObject = GetGkObject(elem), Type = ShapeTypes.Group.ToString(), Name = elem.PresentationName, Width = elem.Width, Height = elem.Height, HasOverlay = true, BorderMouseOver = InternalConverter.ConvertColor(Colors.Orange), X = elem.Left, Y = elem.Top }; return planElement; }
public static PlanElement FromGkDoor(ElementGKDoor item) { var strings = EmbeddedResourceLoader.LoadResource("GKWebService.Content.SvgIcons.GKDoor.txt") .Split(new[] { "\r\n", "\n" }, StringSplitOptions.None); var result = Dispatcher.CurrentDispatcher.Invoke( () => { Debug.WriteLine( "App thread is {0}, with appartment = {1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.GetApartmentState()); return item.GetRectangle(); }); var rect = result; var geometry = Geometry.Parse(strings[0]); var flatten = geometry.GetFlattenedPathGeometry(); flatten.Transform = new TranslateTransform(rect.TopLeft.X, rect.TopRight.Y); KnownColor color1; Enum.TryParse(strings[1], true, out color1); KnownColor color2; Enum.TryParse(strings[2], true, out color2); var shape1 = new PlanElement { Path = flatten.GetFlattenedPathGeometry().ToString(CultureInfo.InvariantCulture), Border = System.Drawing.Color.FromKnownColor(color1), Fill = System.Drawing.Color.FromKnownColor(color2), BorderMouseOver = InternalConverter.ConvertColor(Colors.Transparent), FillMouseOver = InternalConverter.ConvertColor(Colors.Transparent), Name = item.PresentationName, BorderThickness = item.BorderThickness, Type = ShapeTypes.Path.ToString(), HasOverlay = false }; geometry = Geometry.Parse(strings[3]); flatten = geometry.GetFlattenedPathGeometry(); flatten.Transform = new TranslateTransform(rect.TopLeft.X, rect.TopRight.Y); Enum.TryParse(strings[4], true, out color1); Enum.TryParse(strings[5], true, out color2); var shape2 = new PlanElement { Path = flatten.GetFlattenedPathGeometry().ToString(CultureInfo.InvariantCulture), Border = System.Drawing.Color.FromKnownColor(color1), Fill = System.Drawing.Color.FromKnownColor(color2), BorderMouseOver = InternalConverter.ConvertColor(Colors.Transparent), FillMouseOver = InternalConverter.ConvertColor(Colors.Transparent), Name = item.PresentationName, BorderThickness = item.BorderThickness, Type = ShapeTypes.Path.ToString(), HasOverlay = false }; var planElement = new PlanElement { ChildElements = new[] { shape1, shape2 }, Id = "pe" + item.UID, Hint = GetElementHint(item), Type = ShapeTypes.Group.ToString(), Width = 30, Height = 30, Name = item.PresentationName, HasOverlay = true, BorderMouseOver = InternalConverter.ConvertColor(Colors.Orange), X = rect.Left, Y = rect.Top }; return planElement; }
public static PlanElement FromDevice(ElementGKDevice item) { // Находим девайс и набор его состояний var device = GKManager.Devices.FirstOrDefault(d => d.UID == item.DeviceUID); if (device == null) { return null; } // Создаем элемент плана var shape = new PlanElement { Id = "pe" + device.UID, SubElementId = device.UID.ToString(), Name = device.PresentationName, Image = GetDeviceStatePic(device, device.State), X = item.Left - 7, Y = item.Top - 7, Height = 30, Width = 30, Type = ShapeTypes.GkDevice.ToString(), HasOverlay = false }; // Добавляем рамку хинта var planElement = new PlanElement { ChildElements = new[] { shape }, Id = "pe" + device.UID, SubElementId = device.UID + "GroupElement", Hint = GetElementHint(item), Type = ShapeTypes.Group.ToString(), Width = 30, Height = 30, HasOverlay = true, Name = device.PresentationName, Device = new Device(device), GkObject = new Device(device), BorderMouseOver = InternalConverter.ConvertColor(Colors.Orange), X = item.Left - 7, Y = item.Top - 7 }; return planElement; }
/// <summary> /// Создает SVG-группу из ElementProcedure /// </summary> /// <param name="elem">ElementProcedure</param> /// <returns></returns> public static PlanElement FromProcedure(ElementProcedure elem) { // Получаем элемент текста var planElementText = FromTextElement( elem, new System.Windows.Size(elem.Width, elem.Height), elem.Left, elem.Top, true); // Получаем элемент прямоугольника, в который вписан текст var planElementRect = FromRectangleSimple(elem, false); // Очищаем элементы от групповой информации planElementText.Hint = null; planElementText.HasOverlay = false; planElementRect.Hint = null; planElementRect.HasOverlay = false; // Задаем групповой элемент var planElement = new PlanElement { ChildElements = new[] { planElementRect, planElementText }, Id = planElementText.Id, Hint = GetElementHint(elem), Type = ShapeTypes.Group.ToString(), Width = elem.Width, Height = elem.Height, Name = elem.PresentationName, HasOverlay = true, BorderMouseOver = InternalConverter.ConvertColor(Colors.Orange), X = elem.Left, Y = elem.Top }; return planElement; }
/// <summary> /// Рендерит IElementTextBlock /// </summary> /// <param name="item">Элемент</param> /// <param name="size">Размеры контейнера</param> /// <param name="left">Координата X</param> /// <param name="top">Координата Y</param> /// <param name="showHint">Показывать всплывающую подсказку.</param> /// <returns></returns> private static PlanElement FromTextElement(IElementTextBlock item, System.Windows.Size size, double left, double top, bool showHint) { if (string.IsNullOrWhiteSpace(item.Text)) { return null; } var fontFamily = new System.Windows.Media.FontFamily(item.FontFamilyName); var fontStyle = item.FontItalic ? FontStyles.Italic : FontStyles.Normal; var fontWeight = item.FontBold ? FontWeights.Bold : FontWeights.Normal; var text = new FormattedText( item.Text, CultureInfo.InvariantCulture, FlowDirection.LeftToRight, new Typeface(fontFamily, fontStyle, fontWeight, FontStretches.Normal), item.FontSize, new SolidColorBrush(item.ForegroundColor.ToWindowsColor())) { Trimming = TextTrimming.WordEllipsis, MaxLineCount = item.WordWrap ? int.MaxValue : 1 }; // Делаем первый рендер без трансформаций var pathGeometry = text.BuildGeometry(new Point(left + item.BorderThickness, top + item.BorderThickness)); // Добавляем Scale-трансформацию, если включен Stretch, либо Translate-трансформацию if (item.Stretch) { var scaleFactorX = (size.Width - item.BorderThickness * 2) / text.Width; var scaleFactorY = (size.Height - item.BorderThickness * 2) / text.Height; pathGeometry = Geometry.Combine(Geometry.Empty, pathGeometry, GeometryCombineMode.Union, new ScaleTransform( scaleFactorX, scaleFactorY, left + item.BorderThickness, top + item.BorderThickness)); } else { double offsetX = 0; double offsetY = 0; switch (item.TextAlignment) { case 1: { offsetX = size.Width - item.BorderThickness * 2 - text.Width; break; } case 2: { offsetX = (size.Width - item.BorderThickness * 2 - text.Width) / 2; break; } } switch (item.VerticalAlignment) { case 1: { offsetY = (size.Height - item.BorderThickness * 2 - text.Height) / 2; break; } case 2: { offsetY = size.Height - item.BorderThickness * 2 - text.Height; break; } } pathGeometry = Geometry.Combine(Geometry.Empty, pathGeometry, GeometryCombineMode.Union, new TranslateTransform(offsetX, offsetY)); } // Делаем финальный рендер var path = pathGeometry.GetFlattenedPathGeometry().ToString(CultureInfo.InvariantCulture).Substring(2); var shape = new PlanElement { Path = path, Border = InternalConverter.ConvertColor(Colors.Transparent), Fill = InternalConverter.ConvertColor(item.ForegroundColor.ToWindowsColor()), Name = item.PresentationName, Id = "pe" + item.UID, Hint = (item as ElementBase) != null && showHint ? GetElementHint((ElementBase)item) : null, BorderThickness = 0, Type = ShapeTypes.Path.ToString(), HasOverlay = false }; return shape; }
/// <summary> /// Создает SVG-группу из ElementTextBlock /// </summary> /// <param name="elem">ElementTextBlock</param> /// <returns>групповой PlanElement</returns> public static PlanElement FromTextBlock(ElementTextBlock elem) { // Получаем прямоугольник, в который вписан текст // Получаем элемент текста var planElementText = FromTextElement( elem, new System.Windows.Size(elem.Width, elem.Height), elem.Left, elem.Top, elem.ShowTooltip); // Получаем элемент прямоугольника, в который вписан текст var planElementRect = FromRectangleSimple(elem, false); // Очищаем элементы от групповой информации planElementText.Hint = null; planElementText.HasOverlay = false; planElementText.Id = Guid.Empty.ToString(); planElementRect.Hint = null; planElementRect.HasOverlay = false; planElementRect.Id = Guid.Empty.ToString(); // Задаем групповой элемент var planElement = new PlanElement { ChildElements = new[] { planElementRect, planElementText }, Id = planElementText.Id, Hint = GetElementHint(elem), Type = ShapeTypes.Group.ToString(), Width = elem.Width, Height = elem.Height, HasOverlay = false, X = elem.Left, Y = elem.Top }; return planElement; }
public static PlanElement FromPolyline(ElementPolyline elem) { var shape = new PlanElement { Path = InternalConverter.PointsToPath(elem.Points.ToWindowsPointCollection(), PathKind.Line), Border = InternalConverter.ConvertColor(elem.BorderColor.ToWindowsColor()), Fill = System.Drawing.Color.Transparent, BorderMouseOver = InternalConverter.ConvertColor(elem.BorderColor.ToWindowsColor()), FillMouseOver = InternalConverter.ConvertColor(elem.BackgroundColor.ToWindowsColor()), Name = elem.PresentationName, Id = "pe" + elem.UID, Hint = elem.ShowTooltip ? GetElementHint(elem) : null, BorderThickness = elem.BorderThickness, Type = ShapeTypes.Path.ToString(), HasOverlay = false }; return shape; }
public static PlanElement FromPolygonSimple(ElementBasePolygon item, bool mouseOver) { var showHint = true; if (HasProperty(item, "ShowTooltip")) { showHint = (bool)GetProperty(item, "ShowTooltip"); } Guid zoneUID = Guid.Empty; if (HasProperty(item, "ZoneUID")) { zoneUID = (Guid)GetProperty(item, "ZoneUID"); } var shape = new PlanElement { Path = InternalConverter.PointsToPath(item.Points.ToWindowsPointCollection(), PathKind.ClosedLine), Border = InternalConverter.ConvertColor(item.BorderColor.ToWindowsColor()), BorderMouseOver = InternalConverter.ConvertColor(Colors.Orange), Name = item.PresentationName, Id = zoneUID == Guid.Empty ? "pe" + item.UID : "pe" + zoneUID, GkObject = GetGkObject(item), BorderThickness = item.BorderThickness, Hint = showHint ? GetElementHint(item) : null, Type = ShapeTypes.Path.ToString(), HasOverlay = mouseOver }; var asZone = item as IElementZone; if (asZone == null) return shape; var zone = GKManager.Zones.FirstOrDefault(z => z.UID == asZone.ZoneUID); if (zone != null) { var converter = new XStateClassToColorConverter2(); var background = ((SolidColorBrush)converter.Convert(zone.State.StateClass, typeof(SolidColorBrush), null, CultureInfo.InvariantCulture)).Color; shape.Fill = InternalConverter.ConvertColor(background); return shape; } var zoneSkd = GKManager.SKDZones.FirstOrDefault(z => z.UID == asZone.ZoneUID); if (zoneSkd != null) { var converter = new XStateClassToColorConverter2(); var background = ((SolidColorBrush)converter.Convert(zoneSkd.State.StateClass, typeof(SolidColorBrush), null, CultureInfo.InvariantCulture)).Color; shape.Fill = InternalConverter.ConvertColor(background); return shape; } var zoneSec = GKManager.GuardZones.FirstOrDefault(z => z.UID == asZone.ZoneUID); if (zoneSec != null) { var converter = new XStateClassToColorConverter2(); var background = ((SolidColorBrush)converter.Convert(zoneSec.State.StateClass, typeof(SolidColorBrush), null, CultureInfo.InvariantCulture)).Color; shape.Fill = InternalConverter.ConvertColor(background); } return shape; }
public static PlanElement FromEllipse(ElementEllipse item) { var result = Dispatcher.CurrentDispatcher.Invoke( () => { Debug.WriteLine( "App thread is {0}, with appartment = {1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.GetApartmentState()); return item.GetRectangle(); }); var rect = result; var pt = new PointCollection { rect.TopLeft, rect.TopRight, rect.BottomRight, rect.BottomLeft }; var shape = new PlanElement { Path = InternalConverter.PointsToPath(pt.ToWindowsPointCollection(), PathKind.Ellipse), Border = InternalConverter.ConvertColor(item.BorderColor.ToWindowsColor()), Fill = InternalConverter.ConvertColor(item.BackgroundColor.ToWindowsColor()), BorderMouseOver = InternalConverter.ConvertColor(item.BorderColor.ToWindowsColor()), FillMouseOver = InternalConverter.ConvertColor(item.BackgroundColor.ToWindowsColor()), Name = item.PresentationName, Id = "pe" + item.UID, Hint = item.ShowTooltip ? GetElementHint(item) : null, BorderThickness = item.BorderThickness, Type = ShapeTypes.Path.ToString(), HasOverlay = false }; return shape; }
private static PlanElement FromRectangleSimple(ElementBaseRectangle elem, bool mouseOver) { var rect = elem.GetRectangle(); var pt = new PointCollection { rect.TopLeft, rect.TopRight, rect.BottomRight, rect.BottomLeft }; var showHint = true; if (HasProperty(elem, "ShowTooltip")) { showHint = (bool)GetProperty(elem, "ShowTooltip"); } Guid zoneUID = Guid.Empty; if (HasProperty(elem, "ZoneUID")) { zoneUID = (Guid)GetProperty(elem, "ZoneUID"); } var backgroundImage = GetBackgroundContent(elem.BackgroundImageSource, elem.ImageType, elem.Width, elem.Height); var shape = new PlanElement { Path = InternalConverter.PointsToPath(pt.ToWindowsPointCollection(), PathKind.ClosedLine), Border = InternalConverter.ConvertColor(elem.BorderColor.ToWindowsColor()), BorderMouseOver = InternalConverter.ConvertColor(Colors.Orange), Name = elem.PresentationName, Id = zoneUID == Guid.Empty ? "pe" + elem.UID : "pe" + zoneUID, Image = backgroundImage, X = elem.Left, Y = elem.Top, Hint = showHint ? GetElementHint(elem) : null, GkObject = GetGkObject(elem), BorderThickness = elem.BorderThickness, Type = ShapeTypes.Path.ToString(), HasOverlay = mouseOver, Width = elem.Width, Height = elem.Height }; var asZone = elem as IElementZone; if (asZone == null) return shape; var zone = GKManager.Zones.FirstOrDefault(z => z.UID == asZone.ZoneUID); if (zone != null) { var background = GetGKZoneStateColor(zone.State.StateClass); shape.Fill = InternalConverter.ConvertColor(background); return shape; } var zoneSkd = GKManager.SKDZones.FirstOrDefault(z => z.UID == asZone.ZoneUID); if (zoneSkd != null) { var background = GetGKSKDZoneStateColor(zoneSkd.State.StateClass); shape.Fill = InternalConverter.ConvertColor(background); return shape; } var zoneSec = GKManager.GuardZones.FirstOrDefault(z => z.UID == asZone.ZoneUID); if (zoneSec != null) { var background = GetGKGuardZoneStateColor(zoneSec.State.StateClass); shape.Fill = InternalConverter.ConvertColor(background); } return shape; }