Beispiel #1
0
 /// <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));
        }
Beispiel #3
0
        /// <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);
            }
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        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));
            }
        }
Beispiel #6
0
        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));
            }
        }
Beispiel #7
0
        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));
            }
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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));
            }
        }
Beispiel #10
0
        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);
        }
Beispiel #12
0
 /// <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>();
 }
Beispiel #13
0
        public Tracer(SchemeView scheme)
        {
            service = new HistoryService();

            externalPorts = scheme.ExternalPorts;
            gates         = scheme.Gates;
            wires         = scheme.Wires;
        }
Beispiel #14
0
 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);
        }
Beispiel #16
0
        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);
        }
Beispiel #19
0
        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);
        }
Beispiel #20
0
        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));
            }
        }
Beispiel #21
0
        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)));
            }
        }
Beispiel #22
0
        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;
                }
            }
        }
Beispiel #23
0
        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;
                }
            }
        }
Beispiel #24
0
        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);
        }
Beispiel #25
0
        /// <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;
                }
            }
        }
Beispiel #26
0
        /// <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);
            }
        }
Beispiel #27
0
        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));
            }
        }
Beispiel #28
0
        /// <summary>
        /// Конструктор
        /// </summary>
        public ComponentBase()
        {
            schemeView = null;
            serBinder  = null;

            BackColor   = "";
            BorderColor = "";
            BorderWidth = 0;
            ToolTip     = "";
            ID          = 0;
            Name        = "";
            Location    = Point.Default;
            Size        = Size.Default;
            ZIndex      = 0;
        }
Beispiel #29
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;
            }));
        }
Beispiel #30
0
        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));
        }