public ElementViewModel(Element model) { Model = model; InitialElementViewModel = new InitialElementViewModel(model.InitialElement); ElementPropertiesViewModel = new ElementPropertiesViewModel(model.ElementProperties); Connectors = new ObservableCollection<ConnectorViewModel>(); }
protected override void OnDrop(DragEventArgs e) { base.OnDrop(e); var dragObject = e.Data.GetData(typeof (DragObject)) as DragObject; if (dragObject != null) // && !String.IsNullOrEmpty(dragObject.Xaml)) { DesignerItem newItem = null; //Object content = XamlReader.Load(XmlReader.Create(new StringReader(dragObject.Xaml))); var content = ""; if (content != null) { var vm = DataContext as EditorWindowViewModel; if (vm == null) { throw new ArgumentException("DataContext as ConstructorViewModel"); return; } var visualProperties = new VisualProperties(); //visualProperties.Size = var elementProperties = new ElementProperties(visualProperties, new DomainProperties()); var initialElement = dragObject.InitialElementViewModel.InitialElement; var model = new Element(initialElement, elementProperties); var elementViewModel = new ElementViewModel(model); elementViewModel.ElementPropertiesViewModel.Name = string.Format("{0} {1}", initialElement.Name, count++); newItem = new DesignerItem(elementViewModel); newItem.SizeChanged += (sender, args) => { var newSize = args.NewSize; elementViewModel.ElementPropertiesViewModel.ElementVisualPropertiesViewModel.Size = new ElementSize(newSize.Height, newSize.Width); }; var button = new Ellipse { //Width = 100, //Height = 100, Fill = Brushes.Aqua }; newItem.Content = ResourceUtil.GetResourceByName(dragObject.InitialElementViewModel.StyleName) ?? button; var position = e.GetPosition(this); if (dragObject.DesiredSize.HasValue) { var desiredSize = dragObject.DesiredSize.Value; newItem.Width = desiredSize.Width; newItem.Height = desiredSize.Height; SetLeft(newItem, Math.Max(0, position.X - newItem.Width/2)); SetTop(newItem, Math.Max(0, position.Y - newItem.Height/2)); } else { SetLeft(newItem, Math.Max(0, position.X)); SetTop(newItem, Math.Max(0, position.Y)); } newItem.SetCoords(); SetZIndex(newItem, Children.Count); Children.Add(newItem); SetConnectorDecoratorTemplate(newItem); //update selection SelectionService.SelectItem(newItem); newItem.Focus(); vm.Add(newItem.ElementViewModel); } e.Handled = true; } }
private static bool TryCalculatTee12Element( Element element, HashSet<ConnectorModel> calculatedConnectors, HashSet<ConnectorModel> remainedConnectors, bool forceElementInnerModel) { if (element.Connectors.Count != 3) return false; var socket = element.Connectors.FirstOrDefault(x => x.ConnectorType == ConnectorElementType.PipeInput); var jacks = element.Connectors.Where(x => x.ConnectorType == ConnectorElementType.PipeOutput).ToList(); if ((socket == null) || (jacks.Count != 2)) { return false; } var jack1 = jacks[0]; var jack2 = jacks[1]; var socketIsAccepted = socket.ConnectorProperties.IsSet || calculatedConnectors.Contains(socket); var jack1IsAccepted = jack1.ConnectorProperties.IsSet || calculatedConnectors.Contains(jack1); var jack2IsAccepted = jack2.ConnectorProperties.IsSet || calculatedConnectors.Contains(jack2); var socketProperties = socket.ConnectorProperties.DomainProperties as PipeConnectorDomainProperties; var jack1Properties = jack1.ConnectorProperties.DomainProperties as PipeConnectorDomainProperties; var jack2Properties = jack2.ConnectorProperties.DomainProperties as PipeConnectorDomainProperties; if (socketIsAccepted && jack1IsAccepted && jack2IsAccepted) { return (jack1Properties.Pressure + jack2Properties.Pressure == socketProperties.Pressure) && (jack1Properties.Temperature + jack2Properties.Pressure == socketProperties.Temperature); } else { if (!forceElementInnerModel) { if (socketIsAccepted && jack1IsAccepted && !jack2IsAccepted) { var pressure = socketProperties.Pressure - jack1Properties.Pressure; var temperature = socketProperties.Temperature - jack1Properties.Temperature; if (pressure < 0) { return false; } jack2Properties.Pressure = pressure; jack2Properties.Temperature = temperature; calculatedConnectors.Add(jack2); remainedConnectors.Remove(jack2); return true; } else if(socketIsAccepted && !jack1IsAccepted && jack2IsAccepted) { var pressure = socketProperties.Pressure - jack2Properties.Pressure; var temperature = socketProperties.Temperature - jack2Properties.Temperature; if (pressure < 0) { return false; } jack1Properties.Pressure = pressure; jack1Properties.Temperature = temperature; calculatedConnectors.Add(jack1); remainedConnectors.Remove(jack1); return true; } else if(!socketIsAccepted && jack1IsAccepted && jack2IsAccepted) { var pressure = jack1Properties.Pressure + jack2Properties.Pressure; var temperature = jack1Properties.Temperature + jack2Properties.Temperature; socketProperties.Pressure = pressure; socketProperties.Temperature = temperature; calculatedConnectors.Add(socket); remainedConnectors.Remove(socket); return true; } } else { if(socketIsAccepted && !jack1IsAccepted && !jack2IsAccepted) { var pressure = socketProperties.Pressure/2; var temperature = socketProperties.Temperature/2; jack1Properties.Pressure = pressure; jack1Properties.Temperature = temperature; jack2Properties.Pressure = pressure; jack2Properties.Temperature = temperature; calculatedConnectors.Add(jack1); calculatedConnectors.Add(jack2); remainedConnectors.Remove(jack1); remainedConnectors.Remove(jack2); return true; } } } return false; }
private static bool TryCalculateBiConnectorElement(Element element, HashSet<ConnectorModel> calculatedConnectors, HashSet<ConnectorModel> remainedConnectors) { if (element.Connectors.Count != 2) return false; var socket = element.Connectors.FirstOrDefault(x => x.ConnectorType == ConnectorElementType.PipeInput); var jack = element.Connectors.FirstOrDefault(x => x.ConnectorType == ConnectorElementType.PipeOutput); if ((socket == null) || (jack == null)) { return false; } var socketIsAccepted = socket.ConnectorProperties.IsSet || calculatedConnectors.Contains(socket); var jackIsAccepted = jack.ConnectorProperties.IsSet || calculatedConnectors.Contains(jack); var jackProperties = jack.ConnectorProperties.DomainProperties as PipeConnectorDomainProperties; var socketProperties = socket.ConnectorProperties.DomainProperties as PipeConnectorDomainProperties; var coef = 0.9; if (socketIsAccepted && jackIsAccepted) { return (jackProperties.Pressure == socketProperties.Pressure * coef) && (jackProperties.Temperature == socketProperties.Temperature * coef); } else if (socketIsAccepted && !jackIsAccepted) { jackProperties.Pressure = socketProperties.Pressure * coef; jackProperties.Temperature = socketProperties.Temperature * coef; calculatedConnectors.Add(jack); remainedConnectors.Remove(jack); return true; } else if (!socketIsAccepted && jackIsAccepted) { socketProperties.Pressure = jackProperties.Pressure / coef; socketProperties.Temperature = jackProperties.Temperature / coef; calculatedConnectors.Add(socket); remainedConnectors.Remove(socket); return true; } return false; }
private static bool TryCalculate(Element element, HashSet<ConnectorModel> calculatedConnectors, HashSet<ConnectorModel> remainedConnectors, bool forceElementInnerModel) { var input = element.InitialElement as Input; if (input != null) { return true; } var output = element.InitialElement as Output; if (output != null) { return true; } var pipe = element.InitialElement as Pipe; if (pipe != null) { return TryCalculateBiConnectorElement(element, calculatedConnectors, remainedConnectors); } var tap = element.InitialElement as Tap; if (tap != null) { return TryCalculateBiConnectorElement(element, calculatedConnectors, remainedConnectors); } var tee12 = element.InitialElement as Tee12; if (tee12 != null) { return TryCalculatTee12Element(element, calculatedConnectors, remainedConnectors, forceElementInnerModel); } var flange = element.InitialElement as Flange; if (flange != null) { return TryCalculateBiConnectorElement(element, calculatedConnectors, remainedConnectors); } var fittings = element.InitialElement as Fittings; if (fittings != null) { return TryCalculateBiConnectorElement(element, calculatedConnectors, remainedConnectors); } return false; }