123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Drawing.Imaging;
- using System.IO;
- using System.Linq;
- using System.Windows;
- using System.Windows.Media;
- using System.Windows.Shapes;
- using Comal.Classes;
- using InABox.Clients;
- using InABox.Core;
- using InABox.WPF;
- using Syncfusion.UI.Xaml.Diagram;
- using Color = System.Drawing.Color;
- using Image = System.Windows.Controls.Image;
- using Path = System.Windows.Shapes.Path;
- namespace PRSDesktop
- {
- public class QuoteDiagramSymbolModel : NodeViewModel
- {
- }
- public class QuoteDiagramAreaModel : NodeViewModel
- {
- }
- public class QuoteDiagramConnectorModel : ConnectorViewModel
- {
- }
- public class QuoteDiagramScalerModel : NodeViewModel
- {
- }
- public static class QuoteDiagramSymbolCache
- {
- private static MultiQuery _data;
- private static CoreTable _documents;
- private static ObservableCollection<GroupableViewModel> _symbols;
- private static ResourceDictionary _resources;
- public static ResourceDictionary Resources => GetResources();
- public static IEnumerable<QuoteDiagramSymbolModel> Symbols
- {
- get
- {
- CheckCache();
- return _symbols.OfType<QuoteDiagramSymbolModel>();
- }
- }
- public static IEnumerable<QuoteDiagramAreaModel> Areas
- {
- get
- {
- CheckCache();
- return _symbols.OfType<QuoteDiagramAreaModel>();
- }
- }
- public static IEnumerable<QuoteDiagramConnectorModel> Connectors
- {
- get
- {
- CheckCache();
- return _symbols.OfType<QuoteDiagramConnectorModel>();
- }
- }
- public static IEnumerable<QuoteDiagramScalerModel> Scalers
- {
- get
- {
- CheckCache();
- return _symbols.OfType<QuoteDiagramScalerModel>();
- }
- }
- private static ResourceDictionary GetResources()
- {
- if (_resources == null)
- {
- _resources = new ResourceDictionary();
- _resources.Source = new Uri("/Syncfusion.SfDiagram.Wpf;component/Resources/BasicShapes.xaml", UriKind.RelativeOrAbsolute);
- }
- return _resources;
- }
- private static TModel CreateModel<TModel, TEntity>(CoreRow row)
- where TModel : GroupableViewModel, new()
- where TEntity : QuoteDiagramEntity
- {
- var result = new TModel();
- result.ID = row.Get<TEntity, Guid>(x => x.ID).ToString();
- result.Key = row.Get<TEntity, string>(x => x.Group);
- result.Name = row.Get<TEntity, string>(x => x.Caption);
- return result;
- }
- private static QuoteDiagramSymbolModel CreateSymbol(CoreRow row)
- {
- var result = CreateModel<QuoteDiagramSymbolModel, QuoteDiagramSymbol>(row);
- result.UnitHeight = row.Get<QuoteDiagramSymbol, int>(x => x.Length) / 100F;
- result.UnitWidth = row.Get<QuoteDiagramSymbol, int>(x => x.Width) / 100F;
- result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
- {
- var symbolid = row.EntityLinkID<QuoteDiagramSymbol, VectorDocumentLink>(x => x.Symbol) ?? Guid.Empty;
- if (symbolid != Guid.Empty)
- {
- var Image = new Image();
- var docrow = _documents.Rows.FirstOrDefault(r => r.Get<Document, Guid>(c => c.ID).Equals(symbolid));
- if (docrow != null)
- {
- var data = docrow.Get<Document, byte[]>(x => x.Data);
- if (data != null && data.Length != 0)
- using (var ms = new MemoryStream(data))
- {
- var emf = new Metafile(ms);
- //Image.Source = emf.AsBitmapSource((int)(node.UnitWidth * 100.0F), (int)(node.UnitHeight * 100.0F), System.Drawing.Color.Red);
- Image.Source = emf.AsBitmapSource((int)(result.UnitWidth * 10.0F), (int)(result.UnitHeight * 10.0F),
- Color.Transparent);
- }
- }
- return Image;
- }
- return null;
- //else
- //{
- // var svg = new System.Windows.Shapes.Path();
- // String geometry = row.Get<QuoteDiagramSymbol, String>(x => x.Geometry);
- // if (String.IsNullOrWhiteSpace(geometry))
- // svg.Data = new RectangleGeometry(new Rect(0, 0, row.Get<QuoteDiagramSymbol, int>(x => x.Width), row.Get<QuoteDiagramSymbol, int>(x => x.Length)));
- // else
- // svg.Data = Geometry.Parse(geometry);
- // svg.Stretch = Stretch.Fill;
- // svg.Fill = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramSymbol, String>(x => x.FillColor)));
- // svg.Stroke = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramSymbol, String>(x => x.LineColor)));
- // svg.StrokeThickness = 1.0F;
- // return svg;
- //}
- });
- if (row.Get<QuoteDiagramSymbol, bool>(x => x.ShowCaption))
- result.Annotations = new AnnotationCollection
- {
- new AnnotationEditorViewModel
- {
- Content = row.Get<QuoteDiagramSymbol, string>(x => x.Caption)
- }
- };
- var json = row.Get<QuoteDiagramSymbol, string>(x => x.Ports);
- var ports = string.IsNullOrWhiteSpace(json)
- ? new QuoteDiagramSymbolPort[] { }
- : Serialization.Deserialize<QuoteDiagramSymbolPort[]>(json);
- if (ports.Any())
- {
- (result.Ports as PortCollection).Clear();
- foreach (var port in ports)
- {
- var model = new NodePortViewModel { NodeOffsetX = port.X / 100.0F, NodeOffsetY = port.Y / 100.0F };
- (result.Ports as PortCollection).Add(model);
- }
- }
- return result;
- }
- private static QuoteDiagramAreaModel CreateArea(CoreRow row)
- {
- var result = CreateModel<QuoteDiagramAreaModel, QuoteDiagramArea>(row);
- result.UnitHeight = row.Get<QuoteDiagramArea, int>(x => x.Length) / 100F;
- result.UnitWidth = row.Get<QuoteDiagramArea, int>(x => x.Width) / 100F;
- result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
- {
- var svg = new Path();
- svg.Data = new RectangleGeometry(new Rect(0, 0, result.UnitWidth, result.UnitHeight));
- svg.Stretch = Stretch.Fill;
- svg.Fill = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramArea, string>(x => x.FillColor))) { Opacity = 0.5f };
- svg.Stroke = new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramArea, string>(x => x.LineColor)));
- svg.StrokeThickness = 1.0F;
- return svg;
- });
- result.Constraints = NodeConstraints.Default & ~NodeConstraints.Connectable;
- result.Annotations = new AnnotationCollection
- {
- new AnnotationEditorViewModel
- {
- Content = row.Get<QuoteDiagramArea, string>(x => x.Caption)
- }
- };
- return result;
- }
- private static QuoteDiagramConnectorModel CreateConnector(CoreRow row)
- {
- var result = CreateModel<QuoteDiagramConnectorModel, QuoteDiagramConnector>(row);
- var width = (double)row.Get<QuoteDiagramConnector, int>(x => x.Width) / 100F;
- var length = (double)row.Get<QuoteDiagramConnector, int>(x => x.Length) / 100F;
- if (length == 0.0F)
- length = 100F;
- length = length * length;
- var side = length / 2.0F;
- side = Math.Sqrt(side);
- result.SourcePoint = new Point(width, width);
- result.TargetPoint = new Point(side + width, side + width);
- var connectorstyle = new Style(typeof(Path));
- connectorstyle.Setters.Add(new Setter(Shape.StrokeProperty,
- new SolidColorBrush(ImageUtils.StringToMediaColor(row.Get<QuoteDiagramConnector, string>(x => x.Color)))));
- connectorstyle.Setters.Add(new Setter(Shape.StrokeThicknessProperty, width));
- result.ConnectorGeometryStyle = connectorstyle;
- IConnectorSegment segment = null;
- if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.StraightLine)
- segment = new StraightSegment();
- else if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.OrthogonalLine)
- segment = new OrthogonalSegment();
- else if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.CubicBezier)
- segment = new CubicCurveSegment();
- else if (row.Get<QuoteDiagramConnector, QuoteDiagramConnectorType>(x => x.Type) == QuoteDiagramConnectorType.QuadraticBezier)
- segment = new QuadraticCurveSegment();
- if (segment is StraightSegment || segment is OrthogonalSegment)
- result.CornerRadius = width;
- result.Segments = new ObservableCollection<IConnectorSegment> { segment };
- return result;
- }
- public static QuoteDiagramScalerModel CreateScaler()
- {
- var result = new QuoteDiagramScalerModel();
- result.ID = CoreUtils.FullGuid.ToString();
- result.Key = "";
- result.Name = "";
- result.UnitHeight = 10F;
- result.UnitWidth = 100F;
- result.ContentTemplate = TemplateGenerator.CreateDataTemplate(() =>
- {
- var svg = new Path();
- svg.Data = svg.Data =
- Geometry.Parse(
- "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");
- svg.Stretch = Stretch.Fill;
- svg.Stroke = new SolidColorBrush(Colors.Firebrick);
- svg.StrokeThickness = 1.0F;
- return svg;
- });
- result.Constraints = NodeConstraints.AllowDrop | NodeConstraints.ResizeWest | NodeConstraints.ResizeEast | NodeConstraints.Draggable |
- NodeConstraints.Selectable | NodeConstraints.Rotatable | NodeConstraints.Delete;
- result.Annotations = new AnnotationCollection
- {
- new AnnotationEditorViewModel
- {
- Content = "1000"
- }
- };
- return result;
- }
- private static void CheckCache()
- {
- if (_symbols == null)
- {
- var bLoading = true;
- _symbols = new ObservableCollection<GroupableViewModel>();
- _data = new MultiQuery();
- _data.Add(new Filter<QuoteDiagramSymbol>(x => x.Active).IsEqualTo(true));
- _data.Add(new Filter<QuoteDiagramConnector>(x => x.Active).IsEqualTo(true));
- _data.Add(new Filter<QuoteDiagramArea>(x => x.Active).IsEqualTo(true));
- _data.Query();
- var symbols = _data.Get<QuoteDiagramSymbol>();
- var docids = symbols.ExtractValues<QuoteDiagramSymbol, Guid>(x => x.Symbol.ID).Where(x => x != Guid.Empty).ToArray();
- _documents = new Client<Document>().Query(new Filter<Document>(x => x.ID).InList(docids));
- foreach (var row in symbols.Rows)
- _symbols.Add(CreateSymbol(row));
- var areas = _data.Get<QuoteDiagramArea>();
- foreach (var row in areas.Rows)
- _symbols.Add(CreateArea(row));
- var connectors = _data.Get<QuoteDiagramConnector>();
- foreach (var row in connectors.Rows)
- _symbols.Add(CreateConnector(row));
- _symbols.Add(CreateScaler());
- bLoading = false;
- }
- }
- public static void Refresh()
- {
- _data = null;
- _documents = null;
- _symbols = null;
- _resources = null;
- }
- }
- }
|