QuoteDiagramSymbolCache.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Drawing.Imaging;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Windows;
  8. using System.Windows.Media;
  9. using System.Windows.Shapes;
  10. using Comal.Classes;
  11. using InABox.Clients;
  12. using InABox.Core;
  13. using InABox.WPF;
  14. using Syncfusion.UI.Xaml.Diagram;
  15. using Color = System.Drawing.Color;
  16. using Image = System.Windows.Controls.Image;
  17. using Path = System.Windows.Shapes.Path;
  18. namespace PRSDesktop
  19. {
  20. public class QuoteDiagramSymbolModel : NodeViewModel
  21. {
  22. }
  23. public class QuoteDiagramAreaModel : NodeViewModel
  24. {
  25. }
  26. public class QuoteDiagramConnectorModel : ConnectorViewModel
  27. {
  28. }
  29. public class QuoteDiagramScalerModel : NodeViewModel
  30. {
  31. }
  32. public static class QuoteDiagramSymbolCache
  33. {
  34. private static MultiQuery _data;
  35. private static CoreTable _documents;
  36. private static ObservableCollection<GroupableViewModel> _symbols;
  37. private static ResourceDictionary _resources;
  38. public static ResourceDictionary Resources => GetResources();
  39. public static IEnumerable<QuoteDiagramSymbolModel> Symbols
  40. {
  41. get
  42. {
  43. CheckCache();
  44. return _symbols.OfType<QuoteDiagramSymbolModel>();
  45. }
  46. }
  47. public static IEnumerable<QuoteDiagramAreaModel> Areas
  48. {
  49. get
  50. {
  51. CheckCache();
  52. return _symbols.OfType<QuoteDiagramAreaModel>();
  53. }
  54. }
  55. public static IEnumerable<QuoteDiagramConnectorModel> Connectors
  56. {
  57. get
  58. {
  59. CheckCache();
  60. return _symbols.OfType<QuoteDiagramConnectorModel>();
  61. }
  62. }
  63. public static IEnumerable<QuoteDiagramScalerModel> Scalers
  64. {
  65. get
  66. {
  67. CheckCache();
  68. return _symbols.OfType<QuoteDiagramScalerModel>();
  69. }
  70. }
  71. private static ResourceDictionary GetResources()
  72. {
  73. if (_resources == null)
  74. {
  75. _resources = new ResourceDictionary();
  76. _resources.Source = new Uri("/Syncfusion.SfDiagram.Wpf;component/Resources/BasicShapes.xaml", UriKind.RelativeOrAbsolute);
  77. }
  78. return _resources;
  79. }
  80. private static TModel CreateModel<TModel, TEntity>(CoreRow row)
  81. where TModel : GroupableViewModel, new()
  82. where TEntity : QuoteDiagramEntity
  83. {
  84. var result = new TModel();
  85. result.ID = row.Get<TEntity, Guid>(x => x.ID).ToString();
  86. result.Key = row.Get<TEntity, string>(x => x.Group);
  87. result.Name = row.Get<TEntity, string>(x => x.Caption);
  88. return result;
  89. }
  90. private static QuoteDiagramSymbolModel CreateSymbol(CoreRow row)
  91. {
  92. var result = CreateModel<QuoteDiagramSymbolModel, QuoteDiagramSymbol>(row);
  93. result.UnitHeight = row.Get<QuoteDiagramSymbol, int>(x => x.Length) / 100F;
  94. result.UnitWidth = row.Get<QuoteDiagramSymbol, int>(x => x.Width) / 100F;
  95. result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
  96. {
  97. var symbolid = row.EntityLinkID<QuoteDiagramSymbol, VectorDocumentLink>(x => x.Symbol) ?? Guid.Empty;
  98. if (symbolid != Guid.Empty)
  99. {
  100. var Image = new Image();
  101. var docrow = _documents.Rows.FirstOrDefault(r => r.Get<Document, Guid>(c => c.ID).Equals(symbolid));
  102. if (docrow != null)
  103. {
  104. var data = docrow.Get<Document, byte[]>(x => x.Data);
  105. if (data != null && data.Length != 0)
  106. using (var ms = new MemoryStream(data))
  107. {
  108. var emf = new Metafile(ms);
  109. //Image.Source = emf.AsBitmapSource((int)(node.UnitWidth * 100.0F), (int)(node.UnitHeight * 100.0F), System.Drawing.Color.Red);
  110. Image.Source = emf.AsBitmapSource((int)(result.UnitWidth * 10.0F), (int)(result.UnitHeight * 10.0F),
  111. Color.Transparent);
  112. }
  113. }
  114. return Image;
  115. }
  116. return null;
  117. //else
  118. //{
  119. // var svg = new System.Windows.Shapes.Path();
  120. // String geometry = row.Get<QuoteDiagramSymbol, String>(x => x.Geometry);
  121. // if (String.IsNullOrWhiteSpace(geometry))
  122. // svg.Data = new RectangleGeometry(new Rect(0, 0, row.Get<QuoteDiagramSymbol, int>(x => x.Width), row.Get<QuoteDiagramSymbol, int>(x => x.Length)));
  123. // else
  124. // svg.Data = Geometry.Parse(geometry);
  125. // svg.Stretch = Stretch.Fill;
  126. // svg.Fill = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramSymbol, String>(x => x.FillColor)));
  127. // svg.Stroke = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramSymbol, String>(x => x.LineColor)));
  128. // svg.StrokeThickness = 1.0F;
  129. // return svg;
  130. //}
  131. });
  132. if (row.Get<QuoteDiagramSymbol, bool>(x => x.ShowCaption))
  133. result.Annotations = new AnnotationCollection
  134. {
  135. new AnnotationEditorViewModel
  136. {
  137. Content = row.Get<QuoteDiagramSymbol, string>(x => x.Caption)
  138. }
  139. };
  140. var json = row.Get<QuoteDiagramSymbol, string>(x => x.Ports);
  141. var ports = string.IsNullOrWhiteSpace(json)
  142. ? new QuoteDiagramSymbolPort[] { }
  143. : Serialization.Deserialize<QuoteDiagramSymbolPort[]>(json);
  144. if (ports.Any())
  145. {
  146. (result.Ports as PortCollection).Clear();
  147. foreach (var port in ports)
  148. {
  149. var model = new NodePortViewModel { NodeOffsetX = port.X / 100.0F, NodeOffsetY = port.Y / 100.0F };
  150. (result.Ports as PortCollection).Add(model);
  151. }
  152. }
  153. return result;
  154. }
  155. private static QuoteDiagramAreaModel CreateArea(CoreRow row)
  156. {
  157. var result = CreateModel<QuoteDiagramAreaModel, QuoteDiagramArea>(row);
  158. result.UnitHeight = row.Get<QuoteDiagramArea, int>(x => x.Length) / 100F;
  159. result.UnitWidth = row.Get<QuoteDiagramArea, int>(x => x.Width) / 100F;
  160. result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
  161. {
  162. var svg = new Path();
  163. svg.Data = new RectangleGeometry(new Rect(0, 0, result.UnitWidth, result.UnitHeight));
  164. svg.Stretch = Stretch.Fill;
  165. svg.Fill = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramArea, string>(x => x.FillColor))) { Opacity = 0.5f };
  166. svg.Stroke = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramArea, string>(x => x.LineColor)));
  167. svg.StrokeThickness = 1.0F;
  168. return svg;
  169. });
  170. result.Constraints = NodeConstraints.Default & ~NodeConstraints.Connectable;
  171. result.Annotations = new AnnotationCollection
  172. {
  173. new AnnotationEditorViewModel
  174. {
  175. Content = row.Get<QuoteDiagramArea, string>(x => x.Caption)
  176. }
  177. };
  178. return result;
  179. }
  180. private static QuoteDiagramConnectorModel CreateConnector(CoreRow row)
  181. {
  182. var result = CreateModel<QuoteDiagramConnectorModel, QuoteDiagramConnector>(row);
  183. var width = (double)row.Get<QuoteDiagramConnector, int>(x => x.Width) / 100F;
  184. var length = (double)row.Get<QuoteDiagramConnector, int>(x => x.Length) / 100F;
  185. if (length == 0.0F)
  186. length = 100F;
  187. length = length * length;
  188. var side = length / 2.0F;
  189. side = Math.Sqrt(side);
  190. result.SourcePoint = new Point(width, width);
  191. result.TargetPoint = new Point(side + width, side + width);
  192. var connectorstyle = new Style(typeof(Path));
  193. connectorstyle.Setters.Add(new Setter(Shape.StrokeProperty,
  194. new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramConnector, string>(x => x.Color)))));
  195. connectorstyle.Setters.Add(new Setter(Shape.StrokeThicknessProperty, width));
  196. result.ConnectorGeometryStyle = connectorstyle;
  197. IConnectorSegment segment = null;
  198. if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.StraightLine)
  199. segment = new StraightSegment();
  200. else if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.OrthogonalLine)
  201. segment = new OrthogonalSegment();
  202. else if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.CubicBezier)
  203. segment = new CubicCurveSegment();
  204. else if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.QuadraticBezier)
  205. segment = new QuadraticCurveSegment();
  206. if (segment is StraightSegment || segment is OrthogonalSegment)
  207. result.CornerRadius = width;
  208. result.Segments = new ObservableCollection<IConnectorSegment> { segment };
  209. return result;
  210. }
  211. public static QuoteDiagramScalerModel CreateScaler()
  212. {
  213. var result = new QuoteDiagramScalerModel();
  214. result.ID = CoreUtils.FullGuid.ToString();
  215. result.Key = "";
  216. result.Name = "";
  217. result.UnitHeight = 10F;
  218. result.UnitWidth = 100F;
  219. result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
  220. {
  221. var svg = new Path();
  222. svg.Data = svg.Data =
  223. Geometry.Parse(
  224. "M 000 000 L 000 100 M 050 025 L 000 050 L 050 075 M 000 050 L 400 050 L 400 075 L 600 075 L 600 025 L 400 025 L 400 050 M 600 050 L 1000 050 M 1000 000 L 1000 100 M 950 25 L 1000 050 L 950 075");
  225. svg.Stretch = Stretch.Fill;
  226. svg.Stroke = new SolidColorBrush(Colors.Firebrick);
  227. svg.StrokeThickness = 1.0F;
  228. return svg;
  229. });
  230. result.Constraints = NodeConstraints.AllowDrop | NodeConstraints.ResizeWest | NodeConstraints.ResizeEast | NodeConstraints.Draggable |
  231. NodeConstraints.Selectable | NodeConstraints.Rotatable | NodeConstraints.Delete;
  232. result.Annotations = new AnnotationCollection
  233. {
  234. new AnnotationEditorViewModel
  235. {
  236. Content = "1000"
  237. }
  238. };
  239. return result;
  240. }
  241. private static void CheckCache()
  242. {
  243. if (_symbols == null)
  244. {
  245. var bLoading = true;
  246. _symbols = new ObservableCollection<GroupableViewModel>();
  247. _data = new MultiQuery();
  248. _data.Add(new Filter<QuoteDiagramSymbol>(x => x.Active).IsEqualTo(true));
  249. _data.Add(new Filter<QuoteDiagramConnector>(x => x.Active).IsEqualTo(true));
  250. _data.Add(new Filter<QuoteDiagramArea>(x => x.Active).IsEqualTo(true));
  251. _data.Query();
  252. var symbols = _data.Get<QuoteDiagramSymbol>();
  253. var docids = symbols.ExtractValues<QuoteDiagramSymbol, Guid>(x => x.Symbol.ID).Where(x => x != Guid.Empty).ToArray();
  254. _documents = new Client<Document>().Query(new Filter<Document>(x => x.ID).InList(docids));
  255. foreach (var row in symbols.Rows)
  256. _symbols.Add(CreateSymbol(row));
  257. var areas = _data.Get<QuoteDiagramArea>();
  258. foreach (var row in areas.Rows)
  259. _symbols.Add(CreateArea(row));
  260. var connectors = _data.Get<QuoteDiagramConnector>();
  261. foreach (var row in connectors.Rows)
  262. _symbols.Add(CreateConnector(row));
  263. _symbols.Add(CreateScaler());
  264. bLoading = false;
  265. }
  266. }
  267. public static void Refresh()
  268. {
  269. _data = null;
  270. _documents = null;
  271. _symbols = null;
  272. _resources = null;
  273. }
  274. }
  275. }