private void LoadWorkspace() { _workspace = new UserControl { Content = new Workspace(this) }; ControlsCollection.Add(_workspace); Canvas.SetZIndex(_workspace, -20); }
public void ReorganizeGrid(bool isShowGrid) { _isShowGrid = isShowGrid; while (_controlsCollection.Any(x => x.GetType() == typeof(CoorGrid))) { ControlsCollection.Remove(_controlsCollection.First(x => x.GetType() == typeof(CoorGrid))); } if (isShowGrid) { ControlsCollection.Add(new CoorGrid(_currentGridScale / Constants.MainScale, _areaWidth, _areaHeight)); Canvas.SetZIndex((UIElement)ControlsCollection.Last(), -10); } }
public void CreateSubstation(SubstationData subBlock) { if (subBlock == null) { return; } while (ControlsCollection.Any(x => x.GetType() == typeof(SubstationBlock))) { ControlsCollection.Remove(ControlsCollection.First(x => x.GetType() == typeof(SubstationBlock))); } ControlsCollection.Add(new SubstationBlock(this, subBlock)); ReDrawSubstation(); }
public void SetMainData(MainData mainData) { var rowNum = 0; foreach (var rowData in mainData.RowDataList) { rowNum++; var rowBlock = new RowBlock(this); var rowBlockViewModel = (VMRowBlock)rowBlock.DataContext; rowBlockViewModel.SetParams(this, rowData); rowBlockViewModel.PropertyChanged += RowViewModel_PropertyChanged; rowBlockViewModel.CreateCells(_cellDataList.Where(x => x.RowNum == rowNum)?.ToList()); rowBlockViewModel.UpdateFacade(); rowBlockViewModel.UpdateDirection(); //rowBlockViewModel.UpdateDoorDirection(); rowBlockViewModel.UpdateBusPositions(); rowBlockViewModel.UpdateCellPanel(); RowViewModelList.Add(rowBlockViewModel); ControlsCollection.Add(rowBlock); } LinkDataList = mainData.LinkDataList ?? new List <LinkData>(); _isCellsStandalone = mainData.IsCellsStandalone; if (_isCellsStandalone) { ReorganizeCells(true); } AreaWidth = mainData.Width; AreaHeight = mainData.Height; UpdateAll(); StageSave(); }
/// <summary> /// Derived class can set some it's controls as always read only, and they won't be editable in edit mode. /// Overrides previous setting for this control /// </summary> /// <param name="c">reference to control</param> protected void SetAlwaysReadOnly(Control c) { controls.Add(c, ControlCondition.AlwaysReadOnly, null); }
/// <summary> /// Пересоздание ConnectRow's, исходя из смещений RowBlock'ов /// </summary> public void UpdateRowConnects() { var connectRowList = new List <ConnectRow>(); VMRowBlock lastRowBlockViewModel = null; VMConnectRow lastConnectRowViewModel = null; var lastXOffset = 0; var lastYOffset = 0; //while (_controlsCollection.Any(x => x.GetType() == typeof(ConnectRow)) && ((ConnectRowViewModel)((ConnectRow)_controlsCollection.First(x => x.GetType() == typeof(ConnectRow))).DataContext).CabBlock == null) //{ // ControlsCollection.Remove(_controlsCollection.First(x => x.GetType() == typeof(ConnectRow) && ((ConnectRowViewModel)((ConnectRow)x).DataContext).CabBlock == null)); //} //foreach (var control in _controlsCollection) //{ // if (control is ConnectRow) // { // var cr = (ConnectRow)control; // var crvm = (ConnectRowViewModel)cr.DataContext; // if (crvm.CabBlock == null) ControlsCollection.Remove(cr); // } //} //if (_isHideConnects) return; foreach (var control in _controlsCollection) { if (control is RowBlock rowBlock) { var rowBlockViewModel = (VMRowBlock)rowBlock.DataContext; var connectLeft = new ConnectRow(); var connectRight = new ConnectRow(); var connectTop = new ConnectRow(); var connectLeftViewModel = (VMConnectRow)connectLeft.DataContext; var connectRightViewModel = (VMConnectRow)connectRight.DataContext; var connectTopViewModel = (VMConnectRow)connectTop.DataContext; connectLeftViewModel.IsInvisible = _isHideConnects; connectLeftViewModel.X = 0; connectLeftViewModel.Y = rowBlockViewModel.DirectY + (rowBlockViewModel.GetHeight() / 2); connectLeftViewModel.Size = rowBlockViewModel.DirectX * Constants.MainScale; connectRightViewModel.IsInvisible = _isHideConnects; connectRightViewModel.X = rowBlockViewModel.DirectX + rowBlockViewModel.GetWidth(); connectRightViewModel.Y = rowBlockViewModel.DirectY + (rowBlockViewModel.GetHeight() / 2); connectRightViewModel.Size = (_areaWidth - (rowBlockViewModel.DirectX + rowBlockViewModel.GetWidth())) * Constants.MainScale; var xOffsetFix = rowBlockViewModel.DirectX + (rowBlockViewModel.GetWidth() / 2); //if (lastRowBlockViewModel != null && !CheckRowConnectOffset(rowBlockViewModel) // && lastRowBlockViewModel.XOffset + (lastRowBlockViewModel.GetWidth() / 2) // < rowBlockViewModel.XOffset + (rowBlockViewModel.GetWidth() / 2)) // xOffsetFix = lastRowBlockViewModel.XOffset + (lastRowBlockViewModel.GetWidth() / 2); if ((rowBlockViewModel.Facade == Facade.Down || rowBlockViewModel.Facade == Facade.Up) && lastRowBlockViewModel?.DirectX + (lastRowBlockViewModel?.GetWidth() / 2) < rowBlockViewModel.DirectX + (rowBlockViewModel.GetWidth() / 2)) { xOffsetFix = lastRowBlockViewModel.DirectX + (lastRowBlockViewModel.GetWidth() / 2); } var yOffsetFix = CheckRowConnectOffset(rowBlockViewModel) ? 0 : lastYOffset; connectTopViewModel.IsInvisible = _isHideConnects; connectTopViewModel.X = xOffsetFix; connectTopViewModel.Y = yOffsetFix; connectTopViewModel.Size = (rowBlockViewModel.DirectY - yOffsetFix) * Constants.MainScale; connectLeftViewModel.MainBlockViewModel = this; connectLeftViewModel.RowBlockVM = rowBlockViewModel; connectLeftViewModel.ConnectSide = ConnectSide.Left; connectRightViewModel.MainBlockViewModel = this; connectRightViewModel.RowBlockVM = rowBlockViewModel; connectRightViewModel.ConnectSide = ConnectSide.Right; connectTopViewModel.MainBlockViewModel = this; connectTopViewModel.RowBlockVM = rowBlockViewModel; connectTopViewModel.LastRowBlockVM = lastRowBlockViewModel; connectTopViewModel.ConnectSide = ConnectSide.Top; connectRowList.Add(connectLeft); connectRowList.Add(connectRight); connectRowList.Add(connectTop); Panel.SetZIndex(connectLeft, 5); Panel.SetZIndex(connectRight, 5); Panel.SetZIndex(connectTop, 5); if (_controlsCollection.Any(x => x.GetType() == typeof(RowBlock)) && control == _controlsCollection.Last(x => x.GetType() == typeof(RowBlock))) { var connectBottom = new ConnectRow(); var connectBottomViewModel = (VMConnectRow)connectBottom.DataContext; connectBottomViewModel.IsInvisible = _isHideConnects; connectBottomViewModel.X = rowBlockViewModel.DirectX + (rowBlockViewModel.GetWidth() / 2); connectBottomViewModel.Y = rowBlockViewModel.DirectY + rowBlockViewModel.GetHeight(); connectBottomViewModel.Size = (_areaHeight - (rowBlockViewModel.DirectY + rowBlockViewModel.GetHeight())) * Constants.MainScale; var minBottomSize = (rowBlockViewModel.Facade == Facade.Down ? RowMinFacadeSize : RowMinVerticalSize); if (connectBottomViewModel.Size < minBottomSize) { connectBottomViewModel.Size = minBottomSize; } connectBottomViewModel.MainBlockViewModel = this; connectBottomViewModel.RowBlockVM = rowBlockViewModel; connectBottomViewModel.LastRowBlockVM = lastRowBlockViewModel; connectBottomViewModel.ConnectSide = ConnectSide.Bottom; connectRowList.Add(connectBottom); Panel.SetZIndex(connectBottom, 5); } if (lastConnectRowViewModel != null) { lastConnectRowViewModel.RowBlockVM2 = rowBlockViewModel; } lastConnectRowViewModel = connectTopViewModel; lastRowBlockViewModel = rowBlockViewModel; lastXOffset = rowBlockViewModel.DirectX + rowBlockViewModel.GetWidth(); lastYOffset = rowBlockViewModel.DirectY + rowBlockViewModel.GetHeight(); } } foreach (var connect in connectRowList) { ControlsCollection.Add(connect); } }
/// <summary> /// Пересоздание шинных вводов /// </summary> public void UpdateBusInputs() { //while (_controlsCollection.Any(x => x.GetType() == typeof(BusBridge))) //{ // ControlsCollection.Remove(_controlsCollection.First(x => x.GetType() == typeof(BusBridge))); //} if (_isHideConnects) { return; } foreach (var rowVM in _rowViewModelList) { foreach (var cellBlock in rowVM.CellsCollection) { if (cellBlock.SizeBorder.Visibility == Visibility.Collapsed) { cellBlock.UpdateVisibility(); } } } foreach (var linkData in _linkDataList.Where(x => x.LinkType == LinkType.InputBus)) { var cellData = _cellDataList.Find(x => x.IndexNum == linkData.FromCellIndex); if (cellData == null) { continue; } var cellXOffset = 0; var cellYOffset = 0; foreach (var rowVM in _rowViewModelList) { if (rowVM.GetXOffset(cellData) != 0) { cellXOffset = rowVM.GetXOffset(cellData); } if (rowVM.GetYOffset(cellData) != 0) { cellYOffset = rowVM.GetYOffset(cellData); } } switch (linkData.BusDirection) { case Facade.Up: ControlsCollection.Add(new BusBridge(linkData, /*Groups.LINE_ALL_TYPES.Contains(cellData.CellType)*/ false) { X = cellXOffset, Y = 0, BusWidth = (cellData.Width / Constants.MainScale), BusHeight = cellYOffset, }); break; case Facade.Down: ControlsCollection.Add(new BusBridge(linkData, /*Groups.LINE_ALL_TYPES.Contains(cellData.CellType)*/ false) { X = cellXOffset, Y = cellYOffset + (cellData.Depth / Constants.MainScale), BusWidth = (cellData.Width / Constants.MainScale), BusHeight = _areaHeight - (cellYOffset + (cellData.Depth / Constants.MainScale)), }); break; case Facade.Left: ControlsCollection.Add(new BusBridge(linkData, /*Groups.LINE_ALL_TYPES.Contains(cellData.CellType)*/ false) { X = 0, Y = cellYOffset, BusWidth = cellYOffset, BusHeight = (cellData.Width / Constants.MainScale), }); break; case Facade.Right: ControlsCollection.Add(new BusBridge(linkData, /*Groups.LINE_ALL_TYPES.Contains(cellData.CellType)*/ false) { X = cellXOffset + (cellData.Depth / Constants.MainScale), Y = cellYOffset, BusWidth = _areaWidth - (cellXOffset + (cellData.Depth / Constants.MainScale)), BusHeight = (cellData.Width / Constants.MainScale), }); break; } Canvas.SetZIndex((UIElement)_controlsCollection.Last(), -5); var bus = (BusBridge)_controlsCollection.Last(); foreach (var rowVM in _rowViewModelList) { if (linkData.BusDirection == Facade.Down || linkData.BusDirection == Facade.Up) { var hContains = rowVM.X <= bus.X && rowVM.X + rowVM.GetWidth() >= bus.X + bus.Width; var vContains = rowVM.Y >= bus.Y && rowVM.Y + rowVM.GetHeight() <= bus.Y + bus.Height; if (hContains && vContains) { foreach (var cellBlock in rowVM.CellsCollection) { var x = rowVM.GetXOffset(cellBlock.CellData); var y = rowVM.GetYOffset(cellBlock.CellData); var width = cellBlock.CellWidth / Constants.MainScale; var height = cellBlock.CellHeight / Constants.MainScale; if (x == bus.X && x + width == bus.X + bus.Width) { cellBlock.HideBlock(); } else { cellBlock.UpdateVisibility(); } } } } } } //UpdateBusBoxCells(); }
/// <summary> /// Пересоздание шинных мостов /// </summary> public void UpdateBusBridges() { List <double> brokenBridges = new List <double>(); while (_controlsCollection.Any(x => x.GetType() == typeof(BusBridge))) { ControlsCollection.Remove(_controlsCollection.First(x => x.GetType() == typeof(BusBridge))); } if (_isHideConnects) { return; } foreach (var linkData in _linkDataList.Where(x => x.LinkType == LinkType.Bus)) { var fromCellData = _cellDataList.Find(x => x.IndexNum == linkData.FromCellIndex); var toCellData = _cellDataList.Find(x => x.IndexNum == linkData.ToCellIndex); if (fromCellData == null || toCellData == null) { continue; } if (fromCellData.Facade == Facade.Left || fromCellData.Facade == Facade.Right || toCellData.Facade == Facade.Left || toCellData.Facade == Facade.Right) { brokenBridges.Add(linkData.FromCellIndex); _iToastNotifications?.ShowInformation($"Шинный мост { fromCellData.UserNum } { fromCellData.UserName } - { toCellData.UserNum } { toCellData.UserName } удален: размещение невозможно при боковом фасаде камер"); continue; } var fromCellXOffset = 0; var fromCellYOffset = 0; var toCellXOffset = 0; var toCellYOffset = 0; foreach (var rowVM in _rowViewModelList) { if (rowVM.GetXOffset(fromCellData) != 0) { fromCellXOffset = rowVM.GetXOffset(fromCellData); } if (rowVM.GetYOffset(fromCellData) != 0) { fromCellYOffset = rowVM.GetYOffset(fromCellData); } if (rowVM.GetXOffset(toCellData) != 0) { toCellXOffset = rowVM.GetXOffset(toCellData); } if (rowVM.GetYOffset(toCellData) != 0) { toCellYOffset = rowVM.GetYOffset(toCellData); } } if (Math.Abs((fromCellXOffset - toCellXOffset)) > Constants.SectionCellMaxOffset / Constants.MainScale) { brokenBridges.Add(linkData.FromCellIndex); _iToastNotifications?.ShowInformation($"Шинный мост { fromCellData.UserNum } { fromCellData.UserName } - { toCellData.UserNum } { toCellData.UserName } удален: смещение более { Constants.SectionCellMaxOffset } мм"); continue; } ControlsCollection.Add(new BusBridge() { X = fromCellXOffset, Y = fromCellYOffset + (fromCellData.Depth / Constants.MainScale), BusWidth = (fromCellData.Width / Constants.MainScale), BusHeight = toCellYOffset - fromCellYOffset - (fromCellData.Depth / Constants.MainScale), }); Canvas.SetZIndex((UIElement)_controlsCollection.Last(), -5); } foreach (var cellIndex in brokenBridges) { _linkDataList.Remove(_linkDataList.Find(x => x.LinkType == LinkType.Bus && x.FromCellIndex == cellIndex)); } //UpdateBusBoxCells(); }
public void AddRow() { if ((RowViewModelList.Count != 0 && !_secondsRow) || (RowViewModelList.Count == 2)) { return; } DeselectBlocks(); var rowData = new RowData(); var rowBlock = new RowBlock(this); var rowBlockViewModel = (VMRowBlock)rowBlock.DataContext; rowBlockViewModel.SetParams(this, rowData); rowBlockViewModel.PropertyChanged += RowViewModel_PropertyChanged; var facade = Facade.Down; var direction = Direction.LeftToRight; var doorDirection = DoorDirection.Left; if (RowViewModelList.Count == 0) { foreach (var cell in _cellDataList) { cell.RowNum = 1; } rowBlockViewModel.CreateCells(_cellDataList); } else { var lastCells = RowViewModelList.Last(); List <CellData> cellDatas = new List <CellData>(); int count = _cellDataList.Count; for (int i = 0; i < count; i++) { CellData cellData = new CellData(_cellDataList[i]); cellData.SystemNum = cellData.SystemNum + count; cellData.IndexNum = cellData.IndexNum + count + 1; cellData.RowNum = cellData.RowNum + 1; cellData.UserNum = cellData.IndexNum.ToString(); cellDatas.Add(cellData); _cellDataList.Add(cellData); } rowBlockViewModel.CreateCells(cellDatas); rowBlockViewModel.DirectY = AreaHeight - cellDatas.Max(x => x.Depth) / Constants.MainScale; if (RowViewModelList.Last().Facade == Facade.Down) { facade = Facade.Up; } if (RowViewModelList.Last().Direction == Direction.LeftToRight) { direction = Direction.RightToLeft; } if (RowViewModelList.Last().DoorDirection == DoorDirection.Left) { doorDirection = DoorDirection.Right; } RowViewModelList.Last().UpdateCellPanel(); } rowBlockViewModel.UpdateFacade(facade); rowBlockViewModel.UpdateDirection(direction); rowBlockViewModel.UpdateDoorDirection(doorDirection); rowBlockViewModel.UpdateBusPositions(); rowBlockViewModel.UpdateCellPanel(); RowViewModelList.Add(rowBlockViewModel); ControlsCollection.Add(rowBlock); UpdateRowPosition(RowViewModelList.Count > 1 ? RowViewModelList[RowViewModelList.Count - 2] : null, rowBlockViewModel); UpdateAll(); StageSave(); }