Пример #1
0
    private static void FactOrganizerFromPublic(ref FactOrganizer set, PublicFactOrganizer exposed, bool invoke, out Dictionary<string, string> old_to_new)
    {
        // TODO: other strategy needed when MMT save/load supported
        // map old URIs to new ones
        old_to_new = new Dictionary<string, string>();
        // combine T:Fact to Fact
        Dictionary<string, Fact> old_FactDict = new Dictionary<string, Fact>();

        /*
        FieldInfo[] finfos = typeof(PublicFactOrganizer).GetFields();
        foreach(string type in PublicFactOrganizer.WatchedFacts)
            AddListToDict(
                finfos.First(x => x.Name.Remove(x.Name.Length-1) == type)
                .GetValue(exposed)
                as List<Fact>);
        */
        
        AddListToDict(exposed.PointFacts);
        AddListToDict(exposed.LineFacts);
        AddListToDict(exposed.RayFacts);
        AddListToDict(exposed.AngleFacts);
        AddListToDict(exposed.OnLineFacts);


        // initiate
        set.invoke = invoke;
        set.MaxLabelId = exposed.MaxLabelId;
        set.UnusedLabelIds = exposed.UnusedLabelIds;
        set.FactDict = new Dictionary<string, Fact>();

        // work Workflow
        foreach (var sn in exposed.Workflow)
        {
            if (sn.creation)
            // Add
            {
                Fact add;
                if (old_to_new.ContainsKey(sn.Id))
                    add = set.FactDict[old_to_new[sn.Id]];
                else
                {
                    Fact old_Fact = old_FactDict[sn.Id];

                    add = old_Fact.GetType()
                        .GetConstructor(new Type[] { old_Fact.GetType(), old_to_new.GetType(), typeof(FactOrganizer) })
                        .Invoke(new object[] { old_Fact, old_to_new, set })
                        as Fact;

                    old_to_new.Add(sn.Id, add.Id);
                }

                set.Add(add, out _, sn.samestep);
            }
            else if(old_to_new.ContainsKey(sn.Id))
            // Remove
            {
                Fact remove = set.FactDict[old_to_new[sn.Id]];
                set.Remove(remove, sn.samestep);
            }
        }

        // set un-redo state
        while (set.backlog < exposed.backlog)
            set.undo();

        set.soft_resetted = exposed.soft_resetted;


        // === local functions ===

        void AddListToDict<T>(List<T> list) where T:Fact
        {
            foreach (T ft in list)
                old_FactDict.Add(ft.Id, ft);
        }
    }