/// <summary> /// Конструктор. /// </summary> public SchemeDocument() { schemeView = null; CnlFilter = new List <int>(); Images = new Dictionary <string, Image>(); SetToDefault(); }
public static async Task Load(SchemeView scheme) { StorageFolder folder = ApplicationData.Current.LocalFolder; scheme.Recreate(); //serialization of gates StorageFile gateFile = await folder.GetFileAsync(gatePath); if (gateFile == null) { await folder.CreateFileAsync(gatePath); } var gates = JsonConvert.DeserializeObject <List <GateDto> >(await FileIO.ReadTextAsync(gateFile)); var gatesToAdd = new List <GateView>(gates.Select(g => new GateView(g.Type, g.Location, g.Inputs, g.Outputs))); gatesToAdd.ForEach(g => scheme.AddToView(g)); //serialization of wires StorageFile lineFile = await folder.GetFileAsync(linePath); if (lineFile == null) { await folder.CreateFileAsync(linePath); } var wires = JsonConvert.DeserializeObject <List <WireDto> >(await FileIO.ReadTextAsync(lineFile)); var wiresToAdd = new List <WireView>(wires.Select(w => new WireView(w.Connection))); wiresToAdd.ForEach(w => scheme.AddToView(w)); }
/// <summary> /// Записать схему в файл /// </summary> public bool SaveSchemeToFile(string fileName, out string errMsg) { FileName = fileName; if (SchemeView == null) { errMsg = ""; return(true); } else { bool saveOK; lock (SchemeView.SyncRoot) { saveOK = SchemeView.SaveToFile(fileName, out errMsg); } if (saveOK) { Modified = false; } else { log.WriteError(errMsg); } return(saveOK); } }
/// <summary> /// Инициализировать схему, создав новую или загрузив из файла /// </summary> private bool InitScheme(string fileName, out string errMsg) { ClearChanges(); ClearSelComponents(); SchemeView = new SchemeView(); bool loadOK; if (string.IsNullOrEmpty(fileName)) { loadOK = true; errMsg = ""; } else { lock (SchemeView.SyncRoot) { loadOK = SchemeView.LoadFromFile(fileName, out errMsg); } if (!loadOK) { log.WriteError(errMsg); } } FileName = fileName; Modified = false; History.Clear(); PointerMode = PointerMode.Select; SubscribeToSchemeChanges(); OnSelectionChanged(); return(loadOK); }
public string GetLoadErrors(int viewID, long viewStamp) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); SchemeView schemeView = GetSchemeView(viewID, userRights); SchemeDTO dto = new SchemeDTO(); dto.ViewStamp = schemeView.Stamp; if (SchemeUtils.ViewStampsMatched(viewStamp, schemeView.Stamp)) { dto.Data = schemeView.LoadErrors.ToArray(); } return(JsSerializer.Serialize(dto)); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении ошибок при загрузке схемы с ид.={0}" : "Error getting loading errors of the scheme with ID={0}", viewID); return(GetErrorDtoJs(ex)); } }
public string GetComponents(int viewID, long viewStamp, int startIndex, int count) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); SchemeView schemeView = GetSchemeView(viewID, userRights); ComponentsDTO dto = new ComponentsDTO(count); dto.ViewStamp = schemeView.Stamp; if (SchemeUtils.ViewStampsMatched(viewStamp, schemeView.Stamp)) { dto.CopyComponents(schemeView.Components.Values, startIndex, count); } return(JsSerializer.Serialize(dto)); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении компонентов схемы с ид.={0}" : "Error getting components of the scheme with ID={0}", viewID); return(GetErrorDtoJs(ex)); } }
public string GetImages(int viewID, long viewStamp, int startIndex, int totalDataSize) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); SchemeView schemeView = GetSchemeView(viewID, userRights); ImagesDTO dto = new ImagesDTO(); dto.ViewStamp = schemeView.Stamp; if (SchemeUtils.ViewStampsMatched(viewStamp, schemeView.Stamp)) { dto.CopyImages(schemeView.SchemeDoc.Images.Values, startIndex, totalDataSize); } return(JsSerializer.Serialize(dto)); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении изображений схемы с ид.={0}" : "Error getting images of the scheme with ID={0}", viewID); return(GetErrorDtoJs(ex)); } }
public static WorkAlgorithmResult Visualize(SchemeView scheme) { TransferFromExternalInputsToWires(scheme); bool traced = true; while (scheme.Gates.Any(g => !g.AreOutputsReady) && traced) { traced = false; // transfer from wires to gates, then make gates work traced = TransferFromWiresToGates(scheme); // transfer from gates that are ready to wires traced = TransferFromGatesToWires(scheme); // handle scheme errors if (!traced) { return(WorkAlgorithmResult.BadScheme); } } // transfer from wires to output ports TransferFromWiresToExternalOutputs(scheme); return(WorkAlgorithmResult.Correct); }
public string GetSchemeDoc(int viewID, long viewStamp) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); SchemeView schemeView = GetSchemeView(viewID, userRights); SchemeDocDTO dto = new SchemeDocDTO(); dto.ViewStamp = schemeView.Stamp; if (SchemeUtils.ViewStampsMatched(viewStamp, schemeView.Stamp)) { dto.SchemeDoc = schemeView.SchemeDoc; } return(JsSerializer.Serialize(dto)); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении свойств документа схемы с ид.={0}" : "Error getting document properties of the scheme with ID={0}", viewID); return(GetErrorDtoJs(ex)); } }
public string GetElements(int viewID, long viewStamp, int startIndex, int count) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); SchemeView schemeView = GetSchemeView(viewID, userRights); ElementsDTO dto = new ElementsDTO(count); dto.ViewStamp = schemeView.Stamp; if (viewStamp == 0 || viewStamp == dto.ViewStamp) { List <SchemeView.Element> srcElems = schemeView.ElementList; int srcCnt = srcElems.Count; dto.EndOfElements = startIndex + count >= srcCnt; for (int i = startIndex, j = 0; i < srcCnt && j < count; i++, j++) { dto.Elements.Add(srcElems[i]); } } return(JsSerializer.Serialize(dto)); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении элементов схемы с ид.={0}" : "Error getting the elements of the scheme with ID={0}", viewID); return(GetErrorDtoJs(ex)); } }
public static bool ValidateAsync(SchemeView scheme) { if (!scheme.ExternalInputs.Any()) { new Message(Messages.NoExternalInputs).ShowAsync(); return(false); } if (!scheme.ExternalOutputs.Any()) { new Message(Messages.NoExternalOutputs).ShowAsync(); return(false); } if (!ExternalInputsInited(scheme)) { new Message(Messages.ExternalInputsNotInited).ShowAsync(); return(false); } if (!scheme.Wires.Any()) { new Message(Messages.NoWires).ShowAsync(); return(false); } return(true); }
/// <summary> /// Initializes a new instance of the class. /// </summary> public DocumentPacket(SchemeView schemeView) { ArgumentNullException.ThrowIfNull(schemeView, nameof(schemeView)); ViewStamp = schemeView.ViewStamp.ToString(); SchemeDoc = schemeView.SchemeDoc; LoadErrors = schemeView.LoadErrors; CnlProps = new List <CnlProps>(); }
public Tracer(SchemeView scheme) { service = new HistoryService(); externalPorts = scheme.ExternalPorts; gates = scheme.Gates; wires = scheme.Wires; }
public Aligner(SchemeView scheme) { this.scheme = scheme; processed = new HashSet <ISchemeComponent>(); inputsAligner = new ExternalInputsAligner(scheme); outputsAligner = new ExternalOutputsAligner(scheme); gatesAligner = new GatesAligner(scheme); }
public void Test16(SchemeView scheme) { builder = new ComponentBuilder(scheme); var input = builder.BuildInput(); var gate = builder.BuildGate(); var gate1 = builder.BuildGate(); var gate2 = builder.BuildGate(); var gate3 = builder.BuildGate(); var gate4 = builder.BuildGate(); var gate5 = builder.BuildGate(); var gate6 = builder.BuildGate(); var gate7 = builder.BuildGate(); var gate8 = builder.BuildGate(); var gate9 = builder.BuildGate(); var gate10 = builder.BuildGate(); var gate11 = builder.BuildGate(GateEnum.And, 4); var gate12 = builder.BuildGate(GateEnum.And, 3); var gate13 = builder.BuildGate(GateEnum.And, 3); var gate14 = builder.BuildGate(GateEnum.And, 3); var output = builder.BuildOutput(); scheme.Connect(input, gate); scheme.Connect(input, gate1); scheme.Connect(input, gate2); scheme.Connect(input, gate3); scheme.Connect(input, gate4); scheme.Connect(input, gate5); scheme.Connect(input, gate6); scheme.Connect(input, gate7); scheme.Connect(input, gate8); scheme.Connect(input, gate9); scheme.Connect(gate, gate11, 0, 0); scheme.Connect(gate2, gate11, 0, 1); scheme.Connect(gate3, gate11, 0, 2); scheme.Connect(gate4, gate11, 0, 3); scheme.Connect(gate5, gate12, 0, 0); scheme.Connect(gate6, gate12, 0, 1); scheme.Connect(gate7, gate12, 0, 2); scheme.Connect(gate8, gate13, 0, 0); scheme.Connect(gate9, gate13, 0, 1); scheme.Connect(gate10, gate13, 0, 2); scheme.Connect(gate11, gate14, 0, 0); scheme.Connect(gate12, gate14, 0, 1); scheme.Connect(gate13, gate14, 0, 2); scheme.Connect(gate14, output); Debug.Assert(scheme.Wires.Count() == 24); }
public static void Connect(this SchemeView scheme, ExternalPortView source, ExternalPortView destination) { source.Tap(); destination.Tap(); var lastWire = scheme.Wires.Last(); Debug.Assert(source.WireStartConnects(lastWire)); Debug.Assert(destination.WireEndConnects(lastWire)); }
public ComponentBuilder(SchemeView scheme) { this.scheme = scheme; portBuilder = new PortBuilder(); gateBuilder = new GateBuilder(); occupiedPlaces = new HashSet <Vector2>(); random = new Random(); }
public void Test1(SchemeView scheme) { builder = new ComponentBuilder(scheme); var input = builder.BuildInput(); var output = builder.BuildOutput(); scheme.Connect(input, output); Debug.Assert(scheme.Wires.Count() == 1); }
public static ISchemeComponent GetDestination(SchemeView scheme, WireView wire) { var port = scheme.ExternalOutputs.FirstOrDefault(e => e.WireEndConnects(wire)); var gate = scheme.Gates.FirstOrDefault(g => g.WireEndConnects(wire)); // only one could be retrieved Debug.Assert(port == null ^ gate == null); Debug.Assert(port != null ^ gate != null); return(gate == null ? port : gate); }
public string SendCommand(int ctrlCnlNum, double cmdVal, int viewID, int componentID) { try { AppData.UserMonitor.CheckLoggedOn(out UserShot userShot); if (!(userShot.WebSettings.CmdEnabled && userShot.UserRights.GetUiObjRights(viewID).ControlRight)) { throw new ScadaException(CommonPhrases.NoRights); } CtrlCnlProps ctrlCnlProps = AppData.DataAccess.GetCtrlCnlProps(ctrlCnlNum); SchemeView schemeView = AppData.ViewCache.GetView <SchemeView>(viewID, true); bool sendOK = false; bool result = false; if (ctrlCnlProps != null && schemeView.Components.TryGetValue(componentID, out BaseComponent component) && component is IDynamicComponent dynamicComponent && dynamicComponent.Action == Actions.SendCommandNow && dynamicComponent.CtrlCnlNum == ctrlCnlNum) { int userID = userShot.UserProps.UserID; switch (ctrlCnlProps.CmdTypeID) { case BaseValues.CmdTypes.Standard: sendOK = AppData.ServerComm.SendStandardCommand( userID, ctrlCnlNum, cmdVal, out result); break; case BaseValues.CmdTypes.Binary: sendOK = AppData.ServerComm.SendBinaryCommand( userID, ctrlCnlNum, BitConverter.GetBytes(cmdVal), out result); break; case BaseValues.CmdTypes.Request: sendOK = AppData.ServerComm.SendRequestCommand( userID, ctrlCnlNum, ctrlCnlProps.KPNum, out result); break; } } return(JsSerializer.Serialize(new DataTransferObject(sendOK && result))); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при отправке команды ТУ со схемы с ид.={0}" : "Error sending telecommand from the scheme with ID={0}", viewID); return(GetErrorDtoJs(ex)); } }
public static IEnumerable <WireView> ConnectedWires(SchemeView scheme, ExternalPortView port) { var wires = scheme.Wires; if (port.Type == PortType.Input) { return(wires.Where(w => port.WireStartConnects(w))); } else { return(wires.Where(w => port.WireEndConnects(w))); } }
private static void TransferFromExternalInputsToWires(SchemeView scheme) { var externalInputs = scheme.ExternalInputs; foreach (ExternalPortView port in externalInputs) { var connectedWires = scheme.Wires.Where(w => port.WireStartConnects(w)); foreach (WireView wire in connectedWires) { wire.Value = port.Value; } } }
private static void TransferFromWiresToExternalOutputs(SchemeView scheme) { var externalOutputs = scheme.ExternalPorts.Where(p => p.Type == PortType.Output); foreach (ExternalPortView port in externalOutputs) { var connectedWires = scheme.Wires.Where(w => w.Connection.MatrixEnd == port.MatrixLocation); foreach (WireView wire in connectedWires) { port.Value = wire.Value; } } }
public static void Connect(this SchemeView scheme, GateView source, ExternalPortView destination, int index = 0) { var sourcePort = source.Outputs.ElementAt(index); sourcePort.Tap(); destination.Tap(); var lastWire = scheme.Wires.Last(); Debug.Assert(source.WireStartConnects(lastWire)); Debug.Assert(destination.WireEndConnects(lastWire)); Debug.Assert(lastWire.Connection.StartPort == index); }
/// <summary> /// Подписаться на изменения схемы /// </summary> private void SubscribeToSchemeChanges() { SchemeView schemeView = editor.SchemeView; if (schemeView != null) { schemeView.SchemeDoc.ItemChanged += Scheme_ItemChanged; foreach (BaseComponent component in schemeView.Components.Values) { component.ItemChanged += Scheme_ItemChanged; } } }
/// <summary> /// Вставить компоненты схемы из буфера обмена /// </summary> public bool PasteFromClipboard(int x, int y) { try { if (SchemeView == null) { throw new ScadaException(Localization.UseRussian ? "Схема не загружена." : "Scheme is not loaded."); } lock (SchemeView.SyncRoot) lock (clipboard) lock (selComponents) { selComponents.Clear(); History.BeginPoint(); foreach (BaseComponent srcComponent in clipboard) { BaseComponent newComponent = srcComponent.Clone(); newComponent.ID = SchemeView.GetNextComponentID(); newComponent.Location = new Point(newComponent.Location.X + x, newComponent.Location.Y + y); SchemeView.Components[newComponent.ID] = newComponent; SchemeView.SchemeDoc.OnItemChanged(SchemeChangeTypes.ComponentAdded, newComponent); selComponents.Add(newComponent); } History.EndPoint(); } OnSelectionChanged(); PointerMode = PointerModes.Select; return(true); } catch (ScadaException ex) { log.WriteError(string.Format(Localization.UseRussian ? "Ошибка при вставке компонентов схемы из буфера обмена: {0}" : "Error pasting scheme components from clipboard: {0}", ex.Message)); return(false); } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при вставке компонентов схемы из буфера обмена" : "Error pasting scheme components from clipboard"); return(false); } }
public string GetImages(int viewID, long viewStamp, int startIndex, int totalDataSize) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); SchemeView schemeView = GetSchemeView(viewID, userRights); ImagesDTO dto = new ImagesDTO(); dto.ViewStamp = schemeView.Stamp; if (viewStamp == 0 || viewStamp == dto.ViewStamp) { Dictionary <string, SchemeView.Image> .ValueCollection images = schemeView.ImageDict.Values; int i = 0; int size = 0; foreach (SchemeView.Image image in images) { if (i >= startIndex) { dto.Images.Add(new Image(image)); if (image.Data != null) { size += image.Data.Length; } } if (size >= totalDataSize) { break; } i++; } dto.EndOfImages = i == images.Count; } return(JsSerializer.Serialize(dto)); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении изображений схемы с ид.={0}" : "Error getting the images of the scheme with ID={0}", viewID); return(GetErrorDtoJs(ex)); } }
/// <summary> /// Конструктор /// </summary> public ComponentBase() { schemeView = null; serBinder = null; BackColor = ""; BorderColor = ""; BorderWidth = 0; ToolTip = ""; ID = 0; Name = ""; Location = Point.Default; Size = Size.Default; ZIndex = 0; }
private bool AllGatesPortsHaveConnectedWires(SchemeView scheme) { var gates = scheme.Gates; return(gates.All(g => { var connectedInWires = NavigationHelper.ConnectedInputWires(scheme, g).Count(); var connectedOutWires = NavigationHelper.ConnectedOutputWires(scheme, g).Count(); var inputsCount = g.Inputs.Count(); var outputsCount = g.Outputs.Count(); return connectedInWires == inputsCount && connectedOutWires >= outputsCount; })); }
public static async Task Save(SchemeView scheme) { StorageFolder folder = ApplicationData.Current.LocalFolder; var serialized = scheme.PrepareForSerialization(); //serialization of gates StorageFile gateFile = await folder.CreateFileAsync(gatePath, CreationCollisionOption.OpenIfExists); await FileIO.WriteTextAsync(gateFile, JsonConvert.SerializeObject(serialized.Item1)); //serialization of wires StorageFile lineFile = await folder.CreateFileAsync(linePath, CreationCollisionOption.OpenIfExists); await FileIO.WriteTextAsync(lineFile, JsonConvert.SerializeObject(serialized.Item2)); }