public void AddConnection(ConnectableBase source, ConnectableBase destination, int value, string description)
        {
            Connection updateOldConnection = null;

            if (ArrowManagement.CountConnectionsInArrowManagement(source, destination) == 1)
            {
                updateOldConnection = PnmlNet.PetriNet.Objects
                                      .GetAllConnectionsBetween2Connectables(source, destination).First();
                ArrowManagement.Remove(source, destination);
            }

            Connection newConnection = new Connection(PnmlNet.PetriNet.CreateId(), source.Id, destination.Id, value, description);

            PnmlNet.PetriNet.InitDependency(newConnection);
            PnmlNet.PetriNet.Objects.Add(newConnection);
            PnmlNet.PetriNet.InitDependency(source);
            PnmlNet.PetriNet.InitDependency(destination);
            if (source is Transition trans)
            {
                trans.CalcIsExecutable();
            }
            if (destination is Transition transd)
            {
                transd.CalcIsExecutable();
            }
            newConnection.CalcIsExecutable();

            if (updateOldConnection != null)
            {
                updateOldConnection.UpdateArrows();
            }

            newConnection.UpdateArrows();
        }
        void IDropTarget.Drop(IDropInfo dropInfo)
        {
            double size       = ConnectableBase.SIZE;
            var    sourceItem = dropInfo.Data;

            if (sourceItem is ConnectableBase item)
            {
                item.Position.X = dropInfo.DropPosition.X - size / 2;
                item.Position.Y = dropInfo.DropPosition.Y - size / 2;


                foreach (var connection in item.Output)
                {
                    ArrowManagement.Remove(connection.Source, connection.Destination);
                }
                foreach (var connection in item.Input)
                {
                    ArrowManagement.Remove(connection.Source, connection.Destination);
                }

                foreach (var connection in item.Output)
                {
                    connection.UpdateArrows();
                }
                foreach (var connection in item.Input)
                {
                    connection.UpdateArrows();
                }
            }
        }
Ejemplo n.º 3
0
        public void UpdateArrows()
        {
            Position.X = Source.Position.X;
            Position.Y = Source.Position.Y;
            double size = ConnectableBase.SIZE;

            if (ArrowManagement.CountAllConnections(Source, Destination) == 1)
            {
                var _x = 0 + size * 0.5;
                var _y = 0 + size * 0.5;

                SourcePosition.X      = _x;
                SourcePosition.Y      = _y;
                DestinationPosition.X = DestX + size * 0.5;
                DestinationPosition.Y = DestY + size * 0.5;


                ArrowManagement.Add(Source, Destination, 0.5);
            }
            else
            {
                var containsOne = ArrowManagement.AlreadyContainsConnection(Source, Destination);
                if (containsOne == null)
                {
                    var _x = 0 + size * 0.25;
                    var _y = 0 + size * 0.25;

                    SourcePosition.X      = _x;
                    SourcePosition.Y      = _y;
                    DestinationPosition.X = DestX + size * 0.25;
                    DestinationPosition.Y = DestY + size * 0.25;

                    ArrowManagement.Add(Source, Destination, 0.25);
                }
                else
                {
                    var _x = 0 + size * 0.75;
                    var _y = 0 + size * 0.75;

                    SourcePosition.X      = _x;
                    SourcePosition.Y      = _y;
                    DestinationPosition.X = DestX + size * 0.75;
                    DestinationPosition.Y = DestY + size * 0.75;
                }
            }

            RaisePropertyChanged("X");
            RaisePropertyChanged("Y");
        }
 /// <summary>
 /// if the position of a connectable base item changed, all the arrows from
 /// the input and the output have to be updated to the right position
 /// </summary>
 /// <param name="sender">s</param>
 /// <param name="e">e</param>
 internal void PositionChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
 {
     foreach (var connection in Output)
     {
         ArrowManagement.Remove(connection.Source, connection.Destination);
     }
     foreach (var connection in Input)
     {
         ArrowManagement.Remove(connection.Source, connection.Destination);
     }
     foreach (var connection in Output)
     {
         connection.UpdateArrows();
     }
     foreach (var connection in Input)
     {
         connection.UpdateArrows();
     }
 }
        public void DeleteComponent(UIPlaceable component)
        {
            PnmlNet.PetriNet.Objects.Remove(component);
            if (component is Connection conn)
            {
                var related = PnmlNet.PetriNet.Objects.GetConnectables().Where(o => o.Id == conn.SourceId || o.Id == conn.DestinationId);
                foreach (var rel in related)
                {
                    PnmlNet.PetriNet.InitDependency(rel);
                }

                ArrowManagement.Remove(conn.Source, conn.Destination);
                var otherConnectionsBetweenRemoved =
                    PnmlNet.PetriNet.Objects.GetAllConnectionsBetween2Connectables(conn.Source, conn.Destination);
                foreach (var c in otherConnectionsBetweenRemoved)
                {
                    c.UpdateArrows();
                }

                conn.Source.Output.Remove(conn);
                conn.Destination.Input.Remove(conn);
                if (conn.Destination is Transition trans)
                {
                    trans.CalcIsExecutable();
                }
            }
            if (component is ConnectableBase connectable)
            {
                //foreach(var outputConn in connectable.Output)
                while (connectable.Output.Count > 0)
                {
                    DeleteComponent(connectable.Output[0]);
                }
                //foreach (var inputConn in connectable.Input)
                while (connectable.Input.Count > 0)
                {
                    DeleteComponent(connectable.Input[0]);
                }
            }
        }
Ejemplo n.º 6
0
 public void InitArrowManagement()
 {
     ArrowManagement.Clear();
     ArrowManagement.ObjectList = PetriNet.Objects;
 }