Example #1
0
		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;
		}
Example #2
0
		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;
		}
Example #3
0
		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;
		}
Example #4
0
		/// <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;
		}
Example #5
0
		/// <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;
		}
Example #6
0
		/// <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;
		}
Example #7
0
		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;
		}
Example #8
0
		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;
		}
Example #9
0
		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;
		}
Example #10
0
		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;
		}