Esempio n. 1
0
        public void Update(int delta)
        {
            if (!IsRunning)
            {
                return;
            }

            _pausedCoroutines.Lock();
            foreach (Coroutine coroutine in _pausedCoroutines)
            {
                if (coroutine.IsRunning)   // checks if a coroutine it's running again
                {
                    _pausedCoroutines.Remove(coroutine);
                    _runningCoroutines.Add(coroutine);
                }
            }
            _pausedCoroutines.Unlock();

            _runningCoroutines.Lock();
            foreach (Coroutine coroutine in _runningCoroutines)
            {
                coroutine.Update(delta);

                if (coroutine.HasEnded)   // remove ended coroutine
                {
                    _runningCoroutines.Remove(coroutine);
                }
                else if (!coroutine.IsRunning)     // move paused coroutine to the proper list
                {
                    _runningCoroutines.Remove(coroutine);
                    _pausedCoroutines.Add(coroutine);
                }
            }
            _runningCoroutines.Unlock();
        }
Esempio n. 2
0
        /// <summary>
        /// Adds an IUpdatable, IRenderable or ISceneObject to Scene.
        /// Type can implements one or more of them.
        /// </summary>
        /// <typeparam name="T">Class based on IUpdatable, IRenderable and/or ISceneObject.</typeparam>
        /// <param name="obj">Object to add.</param>
        /// <returns>Reference to the object.</returns>
        public T Add <T>(T obj)
        {
            if (obj == null)
            {
                throw new System.ArgumentNullException(nameof(obj));
            }

            if (obj is Entity entity)
            {
                return((T)(ISceneObject)AddEntity(entity));
            }
            else if (obj is Graphic graphic)
            {
                return((T)(IRenderable)AddGraphic(graphic));
            }

            bool added = false;

            if (obj is IUpdatable updatable)
            {
                AddUpdatable(updatable);
                added = true;
            }

            if (obj is IRenderable renderable)
            {
                _renderables.Add(renderable);
                added = true;
            }

            if (obj is ISceneObject sceneObject)
            {
                _sceneObjects.Add(sceneObject);
                added = true;

                sceneObject.SceneAdded(this);
                if (HasStarted && !sceneObject.HasStarted)
                {
                    sceneObject.Start();
                }
            }

            if (!added)
            {
                throw new System.ArgumentException("Object must be an ISceneObject, IUpdatable or IRenderable.");
            }

            return(obj);
        }
Esempio n. 3
0
        private void AddUpdatable(IUpdatable updatable)
        {
            _updatables.Add(updatable);

            if (IsControlGroupPaused(updatable.ControlGroup))
            {
                updatable.Active = false;
            }
        }
Esempio n. 4
0
        public override void OnStart()
        {
            Locker.Add(LockerKeys.ROOM_SETTINGS, new RoomSettingsModel()
            {
                UseWholeNumbers    = true,
                UseNumericKeyboard = true,
            });

            Locker.Add(LockerKeys.ROOM_EVENT_SERVICE, new EventService());
        }
Esempio n. 5
0
//        public string SubmitWorkflow(SubmitInfo_DTO submitInfo)
//        {
//            if (submitInfo == null)
//                return "提交信息不能为空!";

//            if (!string.IsNullOrEmpty(_iSubmitValidation.ValidateMsg(submitInfo.SubmitResult)))
//                return _iSubmitValidation.ValidateMsg(submitInfo.SubmitResult);

//            if (!Locker.Add(submitInfo.NodeId))
//                return "请不要重复提交!";

//            // 读取模板
//            TemplateRepository tr = new TemplateRepository(Context);
//            InstanceInfoRepository iir = new InstanceInfoRepository(Context);
//            NodeInfoRepository nir = new NodeInfoRepository(Context);
//            HashSet<Guid> newActivities = new HashSet<Guid>();
//            var node = nir.Get(submitInfo.NodeId);

//            if (node != null)
//            {
//                node.SubmitResult = submitInfo.SubmitResult;
//                var instance = iir.Get(node.InstanceId);
//                if (instance != null)
//                {
//                    var templateInfo = tr.Get(instance.TemplateId);

//                    // 解析
//                    XElement doc = XElement.Parse(templateInfo.TemplateText);

//                    // 结束并发
//                    if (submitInfo.SubmitResult.StartsWith(SubmitTypeEnum._SP.ToString()))
//                    {

//                        // 停止并发
//                        TransRouting.StopParallel(doc, instance.TaskId, node, Context, node.NodeId);
//                    }
//                    // 驳回
//                    else if (submitInfo.SubmitResult.StartsWith(SubmitTypeEnum._BK.ToString()))
//                    {
//                        // 找到要驳回的点的名称
//                        string backNodeName = submitInfo.SubmitResult.Substring(4);

//                        // 在模板上找到的对应的点
//                        XElement templateXml = XElement.Parse(templateInfo.TemplateText);
//                        var nodeInfos = from c in templateXml.Elements("DesignerItems").Elements("DesignerItem")
//                                        where c.Element("Name").Value == backNodeName
//                                        select c;
//                        if (nodeInfos.Count() == 0)
//                            throw new Exception("驳回的点不存在!");
//                        // 结束该点下的所有点

//#warning 上一节点,下一个节点
//                        HashSet<Guid> stopAllNodes = new HashSet<Guid>();
//                        HashSet<Guid> hasAlreadyFinds = new HashSet<Guid>();
//                        TransRouting.FindAllNext(templateXml, nodeInfos.First(), node.TaskId, node.InstanceId, Context, stopAllNodes, hasAlreadyFinds);
//                        stopAllNodes.Add(node.NodeId);
//                        var stopNodeInfos = Context.NSNodeInfos.Where(p => p.InstanceId == node.InstanceId && p.RunState == RUNNING && stopAllNodes.Contains(p.NodeId));
//                        foreach (var nodeInfo in stopNodeInfos)
//                        {
//                            nodeInfo.RunState = RunStateEnum.end.ToString();
//                        }
//                        TransRouting.Routing(doc, nodeInfos.First(), node, Context, newActivities);
//                    }
//                    else
//                    {
//                        ///  查找驳回点并生成新的节点
//                        var custsExc = from c in doc.Elements("Connections").First().Elements("Connection")
//                                       where c.Element("SourceID").Value == node.NodeId.ToString()
//                                       select c.Element("SinkID").Value;

//                        // 结束当前的点
//                        node.RunState = RunStateEnum.end.ToString();
//                        nir.Modify(node);

//                        foreach (var item in custsExc)
//                        {
//                            // 获取节点名称
//                            var nodeInfos = from c in doc.Elements("DesignerItems").Elements("DesignerItem")
//                                            where c.Element("ID").Value == item
//                                            select c;
//                            foreach (var nodeInfo in nodeInfos)
//                            {
//                                TransRouting.Routing(doc, nodeInfo, node, Context, newActivities);
//                            }
//                        }
//                    }


//                    // 回到父流程节点
//                    var finisheds = TransRoutingHelper.InstanceFinished(newActivities, node.TaskId, node.InstanceId, Context);
//                    // 新生成的节点
//                    foreach (var item in finisheds)
//                    {

//                        // 首先获取模板上面的ID
//                        var parentNode = nir.Get(item);

//                        if (parentNode != null)
//                        {
//                            var instnace = iir.Get(parentNode.InstanceId);
//                            XElement parentDoc =XElement.Parse(tr.Get(instance.TemplateId).TemplateText);
//                            // 获取节点名称
//                            var nodeInfos = from c in parentDoc.Elements("DesignerItems").Elements("DesignerItem")
//                                            where c.Element("ID").Value == parentNode.NodeId.ToString()
//                                            select c;
//                            foreach (var nodeInfo in nodeInfos)
//                            {
//                                TransRouting.Routing(doc, nodeInfo, parentNode, Context, newActivities);
//                            }
//                        }
//                    }
//                }
//            }

//            try
//            {
//                Context.SaveChanges();
//            }
//            catch (DbEntityValidationException e)
//            {
//                StringBuilder sb = new StringBuilder();
//                foreach (var eve in e.EntityValidationErrors)
//                {
//                    sb.Append(string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
//                        eve.Entry.Entity.GetType().Name, eve.Entry.State));
//                    foreach (var ve in eve.ValidationErrors)
//                    {
//                        sb.Append(string.Format("- Property: \"{0}\", Error: \"{1}\"",
//                            ve.PropertyName, ve.ErrorMessage));
//                    }
//                }
//                return sb.Append("持久化失败!").ToString();
//            }
//            catch (Exception ex)
//            {

//                return "提交失败";
//            }

//            return "提交成功!";
//        }

        public string SubmitWorkflow(SubmitInfo_DTO submitInfo)
        {
            StringBuilder result = new StringBuilder();

            try
            {
                #region 验证
                if (submitInfo == null)
                {
                    return("提交信息不能为空!");
                }

                if (!Locker.Add(submitInfo.NodeId))
                {
                    return("请不要重复提交!");
                }
                #endregion (验证)

                #region 获取节点信息
                TransInfoDto transInfoDto = new TransInfoDto();
                transInfoDto.Persistence  = DBFactory.GetPersistencePlugIn();
                transInfoDto.Context      = transInfoDto.Persistence.Context;
                transInfoDto.GroupCounter = submitInfo.ExpandDatas == null ? 0 : submitInfo.ExpandDatas.Count();
                var activity = transInfoDto.Persistence.GetActivityByID(submitInfo.NodeId);
                if (activity == null)
                {
                    return("要办理的节点已经不存在!");
                }
                #endregion (获取节点信息)

                #region 获取模板信息
                var instance = transInfoDto.Persistence.GetInsanceInfo(activity.InstanceId);
                var template = transInfoDto.Persistence.GetTemplateInfo(instance.TemplateId);
                #endregion (获取模板信息)


                #region 生成DTO信息
                transInfoDto.TaskId         = activity.TaskId;
                transInfoDto.InstanceId     = activity.InstanceId;
                transInfoDto.InstanceNodeId = activity.NodeId;
                transInfoDto.TemplateXml    = template.TemplateText;
                transInfoDto.ActivityType   = ActivityTypeEnum.Process;
                transInfoDto.Condition      = submitInfo.Condition;
                transInfoDto.SubmitType     = EnumHelper.GetEnumByString <SubmitTypeEnum>(submitInfo.SubmitResult);
                #endregion (生成DTO信息)

                var currentActivity = XmlHelper.GetActivitiesByName(template.TemplateText, activity.NodeName).First();
                transInfoDto.Activity = currentActivity;
                if (!string.IsNullOrEmpty(_iSubmitValidation.ValidateMsg(submitInfo.SubmitResult, transInfoDto)))
                {
                    Locker.Remove(submitInfo.NodeId);
                    return(_iSubmitValidation.ValidateMsg(submitInfo.SubmitResult, transInfoDto));
                }

                #region 提交
                new RoutingHost().EndRouing(transInfoDto);
                #endregion (提交)

                transInfoDto.Persistence.Context.SaveChanges();
            }
            catch (WFRoutingException rex)
            {
                LogHelper.WriteLog(rex.Message + rex.ToString());
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(ex.ToString());
            }

            return(result.ToString());
        }
Esempio n. 6
0
        /// <summary>
        /// Adds a Transform as a child.
        /// A transform can already be a child from another parent, in that case the parent will be properly changed without side-effects (ie. triggering unwanted events from the same scene).
        /// </summary>
        /// <param name="transform">A transform to be added as a new child.</param>
        /// <param name="changeScene">Signalizes that transform.Entity.Scene can be changed to match parent Scene.</param>
        /// <param name="force">Indicates that scene change can be forced if necessary. When adding a child that already belongs to a Scene and the intention is to match the parent Scene.</param>
        public void AddChild(Transform transform, bool changeScene = true, bool force = false)
        {
            if (transform == this ||
                IsDetached || Entity.IsWiped ||
                transform.IsDetached || transform.Entity.IsWiped ||
                _children.Contains(transform))
            {
                return;
            }

            if (changeScene)
            {
                if (transform.Parent != null)
                {
                    if (transform.Entity.IsSceneFromTransformAncestor)
                    {
                        if (transform.Scene != Scene && transform.Scene != null)
                        {
                            transform.Entity.SceneRemoved(allowWipe: false);
                            transform.Entity.IsSceneFromTransformAncestor = false;
                        }
                    }
                    else if (force)
                    {
                        if (transform.Scene != Scene && transform.Scene != null)
                        {
                            transform.Scene.RemoveEntity(transform.Entity, wipe: false);
                        }
                    }

                    transform.OnParentRemoved();

                    transform.Parent._children.Remove(transform);
                    transform.Parent.OnChildRemoved(transform);
                }

                if (transform.Scene == null)
                {
                    if (Scene != null)
                    {
                        transform.Entity.SceneAdded(Scene);

                        if (Scene.HasStarted && !transform.Entity.HasStarted)
                        {
                            transform.Entity.Start();
                        }
                    }

                    transform.Entity.IsSceneFromTransformAncestor = true;
                }
                else if (force)
                {
                    if (transform.Scene != Scene)
                    {
                        transform.Scene.RemoveEntity(transform.Entity, wipe: false);

                        if (Scene != null)
                        {
                            transform.Entity.SceneAdded(Scene);

                            if (Scene.HasStarted && !transform.Entity.HasStarted)
                            {
                                transform.Entity.Start();
                            }
                        }
                    }

                    transform.Entity.IsSceneFromTransformAncestor = true;
                }
            }
            else
            {
                if (transform.Parent != null)
                {
                    transform.OnParentRemoved();

                    transform.Parent._children.Remove(transform);
                    transform.Parent.OnChildRemoved(transform);
                }

                if (transform.Entity.IsSceneFromTransformAncestor)
                {
                    transform.Entity.IsSceneFromTransformAncestor = false;
                }
            }

            transform._parent = this;
            transform.OnParentAdded();

            _children.Add(transform);
            OnChildAdded(transform);
        }
Esempio n. 7
0
 public Coroutine RegisterCoroutine(Coroutine coroutine)
 {
     _coroutines.Add(coroutine);
     return(coroutine);
 }