QuoteDiagramControl.xaml.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Input;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Imaging;
  11. using Comal.Classes;
  12. using InABox.Clients;
  13. using InABox.Core;
  14. using InABox.DynamicGrid;
  15. using InABox.WPF;
  16. using Syncfusion.UI.Xaml.Diagram;
  17. using Syncfusion.UI.Xaml.Diagram.Stencil;
  18. namespace PRSDesktop
  19. {
  20. public class CustomDiagram : SfDiagram
  21. {
  22. public Selector SFSelector = new();
  23. // Customising the grab handles for nodes added to the diagram
  24. public CustomDiagram()
  25. {
  26. SFSelector.Style = Application.Current.MainWindow.Resources["CustomSelectorStyle"] as Style;
  27. }
  28. protected override Selector GetSelectorForItemOverride(object item)
  29. {
  30. return SFSelector;
  31. }
  32. // Preventing Auto Connector creation when dragging from a port
  33. protected override void SetTool(SetToolArgs args)
  34. {
  35. if (args.Source is IPort)
  36. args.Action = ActiveTool.None;
  37. else
  38. base.SetTool(args);
  39. }
  40. }
  41. /// <summary>
  42. /// Interaction logic for QuoteDiagram.xaml
  43. /// </summary>
  44. public partial class QuoteDiagramControl : UserControl
  45. {
  46. private QuoteDiagram _diagram;
  47. private bool _disablesave;
  48. private BitmapImage _image;
  49. public QuoteDiagramControl()
  50. {
  51. InitializeComponent();
  52. (diagram.PageSettings.Unit as LengthUnit).Unit = LengthUnits.Centimeters;
  53. }
  54. public QuoteDiagram Diagram
  55. {
  56. get => _diagram;
  57. set
  58. {
  59. _diagram = value;
  60. areas.SymbolSource = QuoteDiagramSymbolCache.Areas;
  61. symbols.SymbolSource = QuoteDiagramSymbolCache.Symbols;
  62. connectors.SymbolSource = QuoteDiagramSymbolCache.Connectors;
  63. diagram.Nodes = new NodeCollection();
  64. diagram.Connectors = new ConnectorCollection();
  65. //diagram.Page.Background = new SolidColorBrush(Colors.Yellow);
  66. diagram.SelectedItems = new SelectorViewModel
  67. {
  68. SelectorConstraints = SelectorConstraints.Resizer | SelectorConstraints.Rotator
  69. };
  70. LoadDiagram();
  71. }
  72. }
  73. public BitmapImage Image
  74. {
  75. get => _image;
  76. set
  77. {
  78. _image = value;
  79. diagram.PageSettings.PageHeight = _image != null ? _image.Height / LengthUnit.Centimeters : 29.7;
  80. diagram.PageSettings.PageWidth = _image != null ? _image.Width / LengthUnit.Centimeters : 21.0;
  81. diagram.PageSettings.PageBackground = new ImageBrush(value);
  82. }
  83. }
  84. private static void LoadAreaContent(QuoteDiagramAreaModel area, string id)
  85. {
  86. var cache = QuoteDiagramSymbolCache.Areas.FirstOrDefault(x => Equals(x.ID, area.Key));
  87. if (cache != null)
  88. {
  89. area.Key = cache.ID;
  90. area.ContentTemplate = cache.ContentTemplate;
  91. }
  92. }
  93. private static void LoadSymbolContent(QuoteDiagramSymbolModel symbol, string id)
  94. {
  95. var cache = QuoteDiagramSymbolCache.Symbols.FirstOrDefault(x => Equals(x.ID, symbol.Key));
  96. if (symbol != null)
  97. {
  98. symbol.Key = cache.ID;
  99. symbol.ContentTemplate = cache.ContentTemplate;
  100. }
  101. }
  102. private static void LoadConnectorContent(QuoteDiagramConnectorModel connector, string id)
  103. {
  104. var cache = QuoteDiagramSymbolCache.Connectors.FirstOrDefault(x => Equals(id, x.ID));
  105. if (cache != null)
  106. {
  107. connector.Key = cache.ID;
  108. connector.ConnectorGeometryStyle = cache.ConnectorGeometryStyle;
  109. connector.CornerRadius = cache.CornerRadius;
  110. }
  111. }
  112. private void SaveDiagram()
  113. {
  114. if (_disablesave)
  115. return;
  116. using (var ms = new MemoryStream())
  117. {
  118. var background = diagram.PageSettings.PageBackground;
  119. diagram.PageSettings.PageBackground = new SolidColorBrush(Colors.White);
  120. (diagram.Info as IGraphInfo).Save(ms);
  121. diagram.PageSettings.PageBackground = background;
  122. Diagram.Data = Encoding.UTF8.GetString(ms.ToArray());
  123. new Client<QuoteDiagram>().Save(Diagram, "", (d, err) => { });
  124. }
  125. }
  126. private void DoLoadDiagram()
  127. {
  128. var connectors = diagram.Connectors as ConnectorCollection;
  129. connectors.Clear();
  130. var nodes = diagram.Nodes as NodeCollection;
  131. nodes.Clear();
  132. if (Diagram != null && !string.IsNullOrWhiteSpace(Diagram.Data))
  133. {
  134. var bytes = Encoding.UTF8.GetBytes(Diagram.Data);
  135. try
  136. {
  137. using (var ms = new MemoryStream(bytes))
  138. {
  139. (diagram.Info as IGraphInfo).Load(ms);
  140. }
  141. foreach (var node in nodes)
  142. if (node is QuoteDiagramSymbolModel)
  143. LoadSymbolContent(node as QuoteDiagramSymbolModel, node.Key.ToString());
  144. else if (node is QuoteDiagramAreaModel)
  145. LoadAreaContent(node as QuoteDiagramAreaModel, node.Key.ToString());
  146. }
  147. catch (Exception e)
  148. {
  149. MessageBox.Show("Error Loading Diagram");
  150. }
  151. }
  152. }
  153. private void LoadDiagram()
  154. {
  155. (diagram.Info as IGraphInfo).ItemAdded -= ItemAddedEvent;
  156. (diagram.Info as IGraphInfo).ItemTappedEvent -= Diagram_ItemTappedEvent;
  157. (diagram.Info as IGraphInfo).ConnectorSourceChangedEvent -= QuoteDiagramControl_ConnectorSourceChangedEvent;
  158. (diagram.Info as IGraphInfo).ConnectorTargetChangedEvent -= QuoteDiagramControl_ConnectorTargetChangedEvent;
  159. (diagram.Info as IGraphInfo).ItemSelectedEvent -= QuoteDiagramControl_ItemSelectedEvent;
  160. (diagram.Info as IGraphInfo).ItemUnSelectedEvent -= QuoteDiagramControl_ItemUnSelectedEvent;
  161. (diagram.Info as IGraphInfo).HistoryChangedEvent -= Diagram_HistoryChangedEvent;
  162. diagram.Constraints = GraphConstraints.Default;
  163. DoLoadDiagram();
  164. CheckScalers();
  165. (diagram.Info as IGraphInfo).ItemAdded += ItemAddedEvent;
  166. (diagram.Info as IGraphInfo).ItemTappedEvent += Diagram_ItemTappedEvent;
  167. (diagram.Info as IGraphInfo).HistoryChangedEvent += Diagram_HistoryChangedEvent;
  168. (diagram.Info as IGraphInfo).ConnectorSourceChangedEvent += QuoteDiagramControl_ConnectorSourceChangedEvent;
  169. (diagram.Info as IGraphInfo).ConnectorTargetChangedEvent += QuoteDiagramControl_ConnectorTargetChangedEvent;
  170. (diagram.Info as IGraphInfo).ItemSelectedEvent += QuoteDiagramControl_ItemSelectedEvent;
  171. (diagram.Info as IGraphInfo).ItemUnSelectedEvent += QuoteDiagramControl_ItemUnSelectedEvent;
  172. (diagram.Info as IGraphInfo).AnnotationChanged += QuoteDiagramControl_AnnotationChanged;
  173. diagram.Constraints = GraphConstraints.Default | (GraphConstraints.Undoable & ~GraphConstraints.DrawingTool);
  174. (diagram.Info as IGraphInfo).Commands.Zoom.Execute(new ZoomPositionParameter
  175. {
  176. ZoomCommand = ZoomCommand.Zoom,
  177. ZoomTo = 1
  178. });
  179. }
  180. private void QuoteDiagramControl_AnnotationChanged(object sender, ChangeEventArgs<object, AnnotationChangedEventArgs> args)
  181. {
  182. CheckScalers();
  183. SaveDiagram();
  184. }
  185. private double GetDiagramScale()
  186. {
  187. double result = 100.0F;
  188. var scaler = (diagram.Nodes as NodeCollection).OfType<QuoteDiagramScalerModel>().FirstOrDefault();
  189. if (scaler != null)
  190. {
  191. var pixelwidth = scaler.UnitWidth;
  192. var sText = (scaler.Annotations as AnnotationCollection).FirstOrDefault()?.Content as string;
  193. if (double.TryParse(sText, out var measured))
  194. result = Math.Round(measured / (scaler.UnitWidth * 10.0F));
  195. }
  196. return result;
  197. }
  198. private void CheckScalers()
  199. {
  200. ScaleBox.Text = string.Format("1:{0:F2}", GetDiagramScale());
  201. ScaleButton.IsEnabled = !(diagram.Nodes as NodeCollection).OfType<QuoteDiagramScalerModel>().Any();
  202. }
  203. private void ScaleButton_Click(object sender, RoutedEventArgs e)
  204. {
  205. var scaler = QuoteDiagramSymbolCache.CreateScaler();
  206. scaler.OffsetX = 100;
  207. scaler.OffsetY = 100;
  208. (diagram.Nodes as NodeCollection).Add(scaler);
  209. CheckScalers();
  210. }
  211. private void QuoteDiagramControl_ItemUnSelectedEvent(object sender, DiagramEventArgs args)
  212. {
  213. Logger.Send(LogType.Information, "", "ItemUnSelected");
  214. CheckScalers();
  215. }
  216. private void QuoteDiagramControl_ItemSelectedEvent(object sender, DiagramEventArgs args)
  217. {
  218. Logger.Send(LogType.Information, "", "ItemSelected");
  219. CheckScalers();
  220. }
  221. private void QuoteDiagramControl_ConnectorTargetChangedEvent(object sender, ChangeEventArgs<object, ConnectorChangedEventArgs> args)
  222. {
  223. Logger.Send(LogType.Information, "", "ConnectorTargetChanged");
  224. CheckScalers();
  225. }
  226. private void QuoteDiagramControl_ConnectorSourceChangedEvent(object sender, ChangeEventArgs<object, ConnectorChangedEventArgs> args)
  227. {
  228. Logger.Send(LogType.Information, "", "ConnectorSourceChanged");
  229. CheckScalers();
  230. }
  231. private void ItemAddedEvent(object sender, ItemAddedEventArgs args)
  232. {
  233. try
  234. {
  235. _disablesave = true;
  236. var node = args.Item as NodeViewModel;
  237. if (node != null)
  238. {
  239. if (node is QuoteDiagramScalerModel)
  240. {
  241. node.ContentTemplate = QuoteDiagramSymbolCache.Scalers.FirstOrDefault()?.ContentTemplate;
  242. }
  243. else
  244. {
  245. node.Key = (args.OriginalSource as NodeViewModel).ID;
  246. node.Content = (args.OriginalSource as NodeViewModel).Content;
  247. node.ContentTemplate = (args.OriginalSource as NodeViewModel).ContentTemplate;
  248. }
  249. // LoadSymbolContent(node, x => String.Equals((args.OriginalSource as NodeViewModel).ID.ToString(), x.ID));
  250. node.UnitHeight = node.UnitHeight * LengthUnit.Centimeters / 10.0F; // / double.Parse(ScaleBox.Text);
  251. node.UnitWidth = node.UnitWidth * LengthUnit.Centimeters / 10.0F; // / double.Parse(ScaleBox.Text);
  252. }
  253. else
  254. {
  255. var conn = args.Item as QuoteDiagramConnectorModel;
  256. if (conn != null) LoadConnectorContent(conn, (args.OriginalSource as ConnectorViewModel)?.ID?.ToString());
  257. }
  258. }
  259. finally
  260. {
  261. _disablesave = false;
  262. }
  263. }
  264. private void Diagram_HistoryChangedEvent(object sender, HistoryChangedEventArgs args)
  265. {
  266. Logger.Send(LogType.Information, "", string.Format("HistoryChanged {0}", args.Item.Mode));
  267. CheckScalers();
  268. SaveDiagram();
  269. }
  270. private void Diagram_ItemTappedEvent(object sender, DiagramEventArgs args)
  271. {
  272. if (args.Item is IConnector)
  273. {
  274. //Getting the mouse point while tap on the connector
  275. var pp = ((args as ItemTappedEventArgs).MouseEventArgs as MouseEventArgs).GetPosition(diagram.Page);
  276. //Specify the editing point, editing type and hit padding value
  277. var addremoveargs = new AddRemoveStraightSegmentArgs
  278. {
  279. Point = pp,
  280. SegmentEditing = SegmentEditing.Add,
  281. HitPadding = 5
  282. };
  283. //Method to add or remove the segment
  284. ((args.Item as IConnector).Info as IConnectorInfo).EditSegment(addremoveargs);
  285. }
  286. }
  287. private void Select_Click(object sender, RoutedEventArgs e)
  288. {
  289. if (Diagram == null)
  290. return;
  291. }
  292. private void TakeOff_Click(object sender, RoutedEventArgs e)
  293. {
  294. using (new WaitCursor())
  295. {
  296. var scale = GetDiagramScale();
  297. var updates = new List<QuoteTakeoff>();
  298. var takeoffs = new Client<QuoteTakeoff>().Query(new Filter<QuoteTakeoff>(x => x.Diagram.ID).IsEqualTo(Diagram.ID));
  299. var nodes = diagram.Nodes as NodeCollection;
  300. foreach (var area in nodes.Where(x => x is QuoteDiagramAreaModel))
  301. {
  302. QuoteTakeoff update = null;
  303. var id = (Guid)CoreUtils.GetPropertyValue(area.Info, "InternalID");
  304. var row = takeoffs.Rows.FirstOrDefault(r => Equals(r.Get<QuoteTakeoff, string>(x => x.DiagramObject), id));
  305. if (row != null)
  306. {
  307. update = row.ToObject<QuoteTakeoff>();
  308. takeoffs.Rows.Remove(row);
  309. }
  310. else
  311. {
  312. update = new QuoteTakeoff();
  313. update.Quote.ID = Diagram.Quote.ID;
  314. update.Diagram.ID = Diagram.ID;
  315. update.DiagramObject = id.ToString();
  316. }
  317. update.Description = (area.Annotations as AnnotationCollection).FirstOrDefault()?.Content?.ToString();
  318. update.Dimensions.Set(
  319. new QuoteTakeOffUnit()
  320. {
  321. HasLength = true,
  322. HasWidth = true,
  323. Formula = "[x] * [y]",
  324. Format = "[x] * [y]"
  325. },
  326. 0F,
  327. Math.Round(area.UnitHeight * scale * 10.0F),
  328. Math.Round(area.UnitWidth * scale * 10.0F),
  329. 0F,
  330. 0F
  331. );
  332. updates.Add(update);
  333. }
  334. if (updates.Any())
  335. new Client<QuoteTakeoff>().Save(updates, "");
  336. updates.Clear();
  337. foreach (var row in takeoffs.Rows)
  338. updates.Add(new QuoteTakeoff { ID = row.Get<QuoteTakeoff, Guid>(x => x.ID) });
  339. if (updates.Any())
  340. new Client<QuoteTakeoff>().Delete(updates, "");
  341. }
  342. MessageBox.Show("Done");
  343. }
  344. private void Zoom_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  345. {
  346. if (diagram == null)
  347. return;
  348. var graphinfo = diagram.Info as IGraphInfo;
  349. graphinfo.Commands.Zoom.Execute(new ZoomPositionParameter
  350. {
  351. ZoomCommand = ZoomCommand.Zoom,
  352. ZoomTo = e.NewValue / 100
  353. });
  354. Logger.Send(LogType.Information, "", string.Format("Zoomed to {0:F4}", e.NewValue / 100));
  355. }
  356. private void EditStencil_Click(object sender, RoutedEventArgs e)
  357. {
  358. var stencil = (Stencils.SelectedItem as DynamicTabItem).Content as Stencil;
  359. var list = stencil == areas
  360. ? new MasterList(typeof(QuoteDiagramArea))
  361. : stencil == symbols
  362. ? new MasterList(typeof(QuoteDiagramSymbol))
  363. : new MasterList(typeof(QuoteDiagramConnector));
  364. if (list.ShowDialog() == true)
  365. {
  366. QuoteDiagramSymbolCache.Refresh();
  367. areas.SymbolSource = QuoteDiagramSymbolCache.Areas;
  368. symbols.SymbolSource = QuoteDiagramSymbolCache.Symbols;
  369. connectors.SymbolSource = QuoteDiagramSymbolCache.Connectors;
  370. }
  371. }
  372. #region CustomSave
  373. //private String PointToString(Point? point)
  374. //{
  375. // return String.Format("{0},{1}", point.HasValue ? point.Value.X.ToString() : "", point.HasValue ? point.Value.Y.ToString() : "");
  376. //}
  377. //private Point? StringToPoint(String x, String y)
  378. //{
  379. // if (!String.IsNullOrWhiteSpace(x) && !String.IsNullOrWhiteSpace(y))
  380. // return new Point(double.Parse(x), double.Parse(y));
  381. // return null;
  382. //}
  383. //private String VectorToString(Vector? vector)
  384. //{
  385. // return String.Format("{0},{1}", vector.HasValue ? vector.Value.X.ToString() : "", vector.HasValue ? vector.Value.Y.ToString() : "");
  386. //}
  387. //private Vector? StringToVector(String x, String y)
  388. //{
  389. // if (!String.IsNullOrWhiteSpace(x) && !String.IsNullOrWhiteSpace(y))
  390. // return new Vector(double.Parse(x), double.Parse(y));
  391. // return null;
  392. //}
  393. //private String StraightSegmentToString(StraightSegment segment)
  394. //{
  395. // String result = String.Format("S,{0}",PointToString(segment.Point));
  396. // return result;
  397. //}
  398. //private StraightSegment StringToStraightSegment(String segment)
  399. //{
  400. // String[] comps = segment.Split(',');
  401. // StraightSegment result = new StraightSegment();
  402. // result.Point = StringToPoint(comps[1], comps[2]);
  403. // return result;
  404. //}
  405. //private String OrthogonalSegmentToString(OrthogonalSegment segment)
  406. //{
  407. // String result = String.Format("O,{0},{1},{2},{3}",
  408. // segment.Length.Min<= double.MinValue ? "" :segment.Length.Min.ToString(),
  409. // segment.Length.Max >= double.MaxValue ? "" : segment.Length.Max.ToString(),
  410. // double.IsNaN(segment.Length.Value) ? "" : segment.Length.Value.ToString(),
  411. // segment.Direction.ToString());
  412. // return result;
  413. //}
  414. //private OrthogonalSegment StringToOrthogonalSegment(String segment)
  415. //{
  416. // String[] comps = segment.Split(',');
  417. // OrthogonalSegment result = new OrthogonalSegment();
  418. // try
  419. // {
  420. // result.Length = new DoubleExt(
  421. // String.IsNullOrWhiteSpace(comps[1]) ? double.MinValue : double.Parse(comps[1]),
  422. // String.IsNullOrWhiteSpace(comps[2]) ? double.MaxValue : double.Parse(comps[2]),
  423. // String.IsNullOrWhiteSpace(comps[2]) ? double.NaN : double.Parse(comps[3])
  424. // );
  425. // }
  426. // catch (Exception e)
  427. // {
  428. // result.Length = new DoubleExt();
  429. // }
  430. // result.Direction = (OrthogonalDirection)Enum.Parse(typeof(OrthogonalDirection), comps[4]);
  431. // return result;
  432. //}
  433. //private String CubicSegmentToString(CubicCurveSegment segment)
  434. //{
  435. // String result = String.Format("C,{0},{1},{2},{3},{4}",
  436. // PointToString(segment.Point1),
  437. // PointToString(segment.Point2),
  438. // PointToString(segment.Point3),
  439. // VectorToString(segment.Vector1),
  440. // VectorToString(segment.Vector2)
  441. // );
  442. // return result;
  443. //}
  444. //private CubicCurveSegment StringToCubicSegment(String segment)
  445. //{
  446. // String[] comps = segment.Split(',');
  447. // CubicCurveSegment result = new CubicCurveSegment();
  448. // result.Point1 = StringToPoint(comps[1], comps[2]);
  449. // result.Point2 = StringToPoint(comps[3], comps[4]);
  450. // result.Point3 = StringToPoint(comps[5], comps[6]);
  451. // result.Vector1 = StringToVector(comps[7], comps[8]);
  452. // result.Vector2 = StringToVector(comps[9], comps[10]);
  453. // return result;
  454. //}
  455. //private String QuadraticSegmentToString(QuadraticCurveSegment segment)
  456. //{
  457. // String result = String.Format("Q,{0},{1}",
  458. // PointToString(segment.Point1),
  459. // PointToString(segment.Point2)
  460. // );
  461. // return result;
  462. //}
  463. //private QuadraticCurveSegment StringToQuadraticSegment(String segment)
  464. //{
  465. // String[] comps = segment.Split(',');
  466. // QuadraticCurveSegment result = new QuadraticCurveSegment();
  467. // result.Point1 = StringToPoint(comps[1], comps[2]);
  468. // result.Point2 = StringToPoint(comps[3], comps[4]);
  469. // return result;
  470. //}
  471. //private String SegmentToString(IConnectorSegment segment)
  472. //{
  473. // if (segment is StraightSegment)
  474. // return StraightSegmentToString(segment as StraightSegment);
  475. // if (segment is OrthogonalSegment)
  476. // return OrthogonalSegmentToString(segment as OrthogonalSegment);
  477. // if (segment is CubicCurveSegment)
  478. // return CubicSegmentToString(segment as CubicCurveSegment);
  479. // if (segment is QuadraticCurveSegment)
  480. // return QuadraticSegmentToString(segment as QuadraticCurveSegment);
  481. // throw new Exception(segment.GetType().ToString());
  482. //}
  483. //private IConnectorSegment StringToSegment(String segment)
  484. //{
  485. // if (segment.StartsWith("S"))
  486. // return StringToStraightSegment(segment);
  487. // else if (segment.StartsWith("O"))
  488. // return StringToOrthogonalSegment(segment);
  489. // else if (segment.StartsWith("C"))
  490. // return StringToCubicSegment(segment);
  491. // else if (segment.StartsWith("Q"))
  492. // return StringToQuadraticSegment(segment);
  493. // throw new Exception(segment);
  494. //}
  495. //private ObservableCollection<IConnectorSegment> StringToSegments(String data)
  496. //{
  497. // ObservableCollection<IConnectorSegment> result = new ObservableCollection<IConnectorSegment>();
  498. // String[] segments = data.Split(';');
  499. // foreach (var segment in segments)
  500. // result.Add(StringToSegment(segment));
  501. // return result;
  502. //}
  503. //private void CustomSaveDiagram()
  504. //{
  505. // List<String> data = new List<String>();
  506. // NodeCollection nodes = diagram.Nodes as NodeCollection;
  507. // foreach (var node in nodes)
  508. // data.Add(String.Format("N {0} {1} {2} {3} {4} {5} {6} {7}", node.ID, node.Key, node.Name, node.OffsetX, node.OffsetY, node.UnitWidth, node.UnitHeight, node.RotateAngle));
  509. // ConnectorCollection connectors = diagram.Connectors as ConnectorCollection;
  510. // foreach (var connector in connectors)
  511. // {
  512. // List<String> encoded = new List<String>();
  513. // var segments = connector.Segments as ObservableCollection<IConnectorSegment>;
  514. // foreach (var segment in segments)
  515. // encoded.Add(SegmentToString(segment));
  516. // data.Add(String.Format("C {0} {1} {2} {3} {4} {5} {6} {7} {8} {9}",
  517. // connector.ID,
  518. // connector.Key,
  519. // connector.Name,
  520. // connector.SourcePoint.X,
  521. // connector.SourcePoint.Y,
  522. // connector.SourceNode != null ? (connector.SourceNode as NodeViewModel).ID : "",
  523. // connector.TargetPoint.X,
  524. // connector.TargetPoint.Y,
  525. // connector.TargetNode != null ? (connector.TargetNode as NodeViewModel).ID : "",
  526. // String.Join(";", encoded))
  527. // );
  528. // }
  529. // Diagram.Data = String.Join("\n", data);
  530. // new Client<QuoteDiagram>().Save(Diagram, "", (d, err) => { });
  531. //}
  532. //private void DoCustomLoadDiagram()
  533. //{
  534. // ConnectorCollection connectors = diagram.Connectors as ConnectorCollection;
  535. // connectors.Clear();
  536. // NodeCollection nodes = diagram.Nodes as NodeCollection;
  537. // nodes.Clear();
  538. // if ((Diagram != null) && (!String.IsNullOrWhiteSpace(Diagram.Data)))
  539. // {
  540. // String[] lines = Diagram.Data.Split('\n');
  541. // foreach (var line in lines.Where(x => x.StartsWith("N ")))
  542. // {
  543. // String[] comps = line.Split(' ');
  544. // if (comps.Length == 9)
  545. // {
  546. // NodeViewModel node = new NodeViewModel();
  547. // node.ID = comps[1];
  548. // node.Key = comps[2];
  549. // node.Name = comps[3];
  550. // node.OffsetX = double.Parse(comps[4]);
  551. // node.OffsetY = double.Parse(comps[5]);
  552. // node.UnitWidth = double.Parse(comps[6]);
  553. // node.UnitHeight = double.Parse(comps[7]);
  554. // node.RotateAngle = double.Parse(comps[8]);
  555. // LoadSymbolContent(node);
  556. // nodes.Add(node);
  557. // }
  558. // }
  559. // foreach (var line in lines.Where(x => x.StartsWith("C ")))
  560. // {
  561. // String[] comps = line.Split(' ');
  562. // if (comps.Length == 11)
  563. // {
  564. // ConnectorViewModel conn = new ConnectorViewModel();
  565. // conn.ID = comps[1];
  566. // conn.Key = comps[2];
  567. // conn.Name = comps[3];
  568. // conn.SourcePoint = StringToPoint(comps[4], comps[5]).Value;
  569. // conn.SourceNode = nodes.FirstOrDefault(x => String.Equals(x.ID, comps[6]));
  570. // conn.TargetPoint = StringToPoint(comps[7], comps[8]).Value;
  571. // conn.TargetNode = nodes.FirstOrDefault(x => String.Equals(x.ID, comps[9]));
  572. // conn.Segments = StringToSegments(comps[10]);
  573. // LoadConnectorContent(conn);
  574. // connectors.Add(conn);
  575. // }
  576. // }
  577. // }
  578. //}
  579. #endregion
  580. }
  581. }