diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs index 44382138309730b4e673b608ccf25b5341f35f3a..9df9852598ffaaaa35d924e2bb591c5c5ae171f0 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs @@ -167,9 +167,6 @@ public static bool sendAdd(string path, string body, out string uri) [JsonSubtypes.KnownSubType(typeof(TestFact), "TestFact")] [JsonSubtypes.KnownSubType(typeof(EqualCirclesFact), "EqualCirclesFact")] [JsonSubtypes.KnownSubType(typeof(UnEqualCirclesFact), "UnEqualCirclesFact")] - - - public abstract class Fact { /// <summary> @@ -1411,13 +1408,224 @@ protected override bool EquivalentWrapped(AngleFact f1, AngleFact f2) } } +/// <summary> +/// A RightAngleFact defined by 3 <see cref="PointFact">Pointfact</see> +/// </summary> +public class RightAngleFact : FactWrappedCRTP<RightAngleFact> +{ + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "RightAngleFact"; + + /// <summary> three <see cref="PointFact">Pointfacts</see> defining the right angle </summary> + public string Pid1, Pid2, Pid3; + + /// <summary> \copydoc Fact.Fact </summary> + public RightAngleFact() : base() + { + this.Pid1 = null; + this.Pid2 = null; + this.Pid3 = null; + } + + /// <summary> + /// Copies <paramref name="fact"/> by initiating new MMT %Fact. + /// </summary> + /// <param name="fact">Fact to be copied</param> + /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param> + /// <param name="organizer">sets <see cref="_Facts"/></param> + public RightAngleFact(RightAngleFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer) + { + init(old_to_new[fact.Pid1], old_to_new[fact.Pid2], old_to_new[fact.Pid3]); + } + + /// <summary> + /// Standard Constructor + /// </summary> + /// <param name="pid1">sets <see cref="Pid1"/></param> + /// <param name="pid2">sets <see cref="Pid2"/></param> + /// <param name="pid3">sets <see cref="Pid3"/></param> + /// <param name="organizer">sets <see cref="Fact._Facts"/></param> + public RightAngleFact(string pid1, string pid2, string pid3, FactOrganizer organizer) : base(organizer) + { + init(pid1, pid2, pid3); + } + + /// <summary> + /// Initiates <see cref="Pid1"/>, <see cref="Pid2"/>, <see cref="Pid3"/>, <see cref="is_right_angle"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side + /// </summary> + /// <param name="pid1">sets <see cref="Pid1"/></param> + /// <param name="pid2">sets <see cref="Pid2"/></param> + /// <param name="pid3">sets <see cref="Pid3"/></param> + private void init(string pid1, string pid2, string pid3) + { + this.Pid1 = pid1; + this.Pid2 = pid2; + this.Pid3 = pid3; + + PointFact pf1 = _Facts[pid1] as PointFact; + PointFact pf2 = _Facts[pid2] as PointFact; + PointFact pf3 = _Facts[pid3] as PointFact; + + MMTDeclaration mmtDecl; + string p1URI = pf1.Id; + string p2URI = pf2.Id; + string p3URI = pf3.Id; + + + mmtDecl = generateMMTDeclaration(p1URI, p2URI, p3URI); + + AddFactResponse.sendAdd(mmtDecl, out this._URI); + } + + /// <summary> + /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_. + /// </summary> + /// <param name="Pid1">sets <see cref="Pid1"/></param> + /// <param name="Pid2">sets <see cref="Pid2"/></param> + /// <param name="Pid3">sets <see cref="Pid3"/></param> + /// <param name="backendURI">MMT URI</param> + /// <param name="organizer">sets <see cref="Fact._Facts"/></param> + public RightAngleFact(string Pid1, string Pid2, string Pid3, string backendURI, FactOrganizer organizer) : base(organizer) + { + this.Pid1 = Pid1; + this.Pid2 = Pid2; + this.Pid3 = Pid3; + + this._URI = backendURI; + _ = this.Label; + } + + /// \copydoc Fact.parseFact(Scroll.ScrollFact) + public new static RightAngleFact parseFact(Scroll.ScrollFact fact) + { + OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp; + if (tp == null) + return null; + + string Point1Uri = ""; + string Point2Uri = ""; + string Point3Uri = ""; + + string uri = fact.@ref.uri; + OMA proof_OMA = (OMA)((Scroll.ScrollSymbolFact)fact).tp; // proof DED + OMA rightAngleOMA = (OMA)proof_OMA.arguments[0]; // rightAngle OMA + + if (rightAngleOMA.arguments[0] is OMS) + { + Point1Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri; + Point2Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri; + Point3Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[2]).uri; + } + + if (StageStatic.stage.factState.ContainsKey(Point1Uri) + && StageStatic.stage.factState.ContainsKey(Point2Uri) + && StageStatic.stage.factState.ContainsKey(Point3Uri)) + + return new RightAngleFact(Point1Uri, Point2Uri, Point3Uri, uri, StageStatic.stage.factState); + + else //If dependent facts do not exist return null + return null; + } + + + /// \copydoc Fact.generateLabel + protected override string generateLabel() + { + return _Facts[Pid1].Label + _Facts[Pid2].Label + _Facts[Pid3].Label + "⊥"; + } + + + /// <summary> + /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/> + /// </summary> + /// <param name="p1URI"> Uri for <see cref="Pid1"/></param> + /// <param name="p2URI"> Uri for <see cref="Pid2"/></param> + /// <param name="p3URI"> Uri for <see cref="Pid3"/></param> + /// <returns>struct for <see cref="AddFactResponse"/></returns> + private MMTDeclaration generateMMTDeclaration(string p1URI, string p2URI, string p3URI) + { + List<MMTTerm> innerArguments = new List<MMTTerm> + { + new OMS(p1URI), + new OMS(p2URI), + new OMS(p3URI) + }; + + List<MMTTerm> outerArguments = new List<MMTTerm> + { + new OMA(new OMS(MMTURIs.RightAngle), innerArguments) + }; + MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments); + MMTTerm df = null; + + return new MMTSymbolDeclaration(this.Label, tp, df); + } + + /// \copydoc Fact.hasDependentFacts + public override Boolean hasDependentFacts() + { + return true; + } + + /// \copydoc Fact.getDependentFactIds + public override string[] getDependentFactIds() + { + return new string[] { Pid1, Pid2, Pid3 }; + } + + /// \copydoc Fact.instantiateDisplay(GameObject, Transform) + public override GameObject instantiateDisplay(GameObject prefab, Transform transform) + { + var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform); + obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid1].Label; + obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid2].Label; + obj.transform.GetChild(2).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid3].Label; + + + obj.GetComponent<FactWrapper>().fact = this; + return obj; + } + + /// \copydoc Fact.GetHashCode + /// uhhh is this a problem? + public override int GetHashCode() + { + return this.Pid1.GetHashCode() ^ this.Pid2.GetHashCode() ^ this.Pid3.GetHashCode(); + } + + /// \copydoc Fact.Equivalent(Fact, Fact) + protected override bool EquivalentWrapped(RightAngleFact f1, RightAngleFact f2) + { + if (f1.Pid1 == f2.Pid1 && f1.Pid2 == f2.Pid2 && f1.Pid3 == f2.Pid3) + return true; + + PointFact p1f1 = (PointFact)_Facts[f1.Pid1]; + PointFact p2f1 = (PointFact)_Facts[f1.Pid2]; + PointFact p3f1 = (PointFact)_Facts[f1.Pid3]; + + PointFact p1f2 = (PointFact)_Facts[f2.Pid1]; + PointFact p2f2 = (PointFact)_Facts[f2.Pid2]; + PointFact p3f2 = (PointFact)_Facts[f2.Pid3]; + + + + + return (p1f1.Equivalent(p1f2) && p2f1.Equivalent(p2f2) && p3f1.Equivalent(p3f2)); + + } +} /// <summary> /// Two parallel Lines comprised of two <see cref="LineFact">LineFacts</see> /// </summary> public class ParallelLineFact : FactWrappedCRTP<ParallelLineFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "ParallelLineFact"; + /// @{ <summary> /// One <see cref="Fact.Id">Id</see> of thwo <see cref="LineFact">PointFacts</see> defining Angle [<see cref="Lid1"/>, <see cref="Lid2"/>]. /// </summary> @@ -1619,18 +1827,15 @@ protected override bool EquivalentWrapped(ParallelLineFact f1, ParallelLineFact } } - - - - - - /// <summary> /// A Circle that is made out of a middle point, a plane and a radius /// </summary> public class CircleFact : FactWrappedCRTP<CircleFact> { - + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "CircleFact"; + /// <summary> defining the middle point of the circle </summary> public string Pid1; /// <summary> defining the base point of the circle plane </summary> @@ -1922,12 +2127,15 @@ protected override bool EquivalentWrapped(CircleFact f1, CircleFact f2) } } - /// <summary> /// A <see cref="PointFact"/> on a <see cref="CircleFact"/> /// </summary> public class OnCircleFact : FactWrappedCRTP<OnCircleFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "OnCircleFact"; + /// <summary> the point on the circle </summary> public string Pid; /// <summary> the circle, which the point is on </summary> @@ -2082,13 +2290,15 @@ protected override bool EquivalentWrapped(OnCircleFact c1, OnCircleFact c2) } } - - /// <summary> /// Angle comprised of a line and a circle /// </summary> public class AngleCircleLineFact : FactWrappedCRTP<AngleCircleLineFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "AngleCircleLineFact"; + /// @{ <summary> /// One <see cref="Fact.Id">Id</see> of a <see cref="RayFact">RayFact</see> and a <see cref="CircleFact">CircleFact</see> defining Angle [<see cref="Cid1"/>, <see cref="Rid2"/>]. /// </summary> @@ -2279,12 +2489,15 @@ protected override bool EquivalentWrapped(AngleCircleLineFact f1, AngleCircleLin } } - /// <summary> /// A RadiusFact that corresponds to a <see cref="CircleFact">PointFacts</see> and has a float value (the actual radius). /// </summary> public class RadiusFact : FactWrappedCRTP<RadiusFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "RadiusFact"; + /// <summary> The circle corresponding to the radius </summary> public string Cid1; /// <summary> The radius as a float </summary> @@ -2439,13 +2652,16 @@ protected override bool EquivalentWrapped(RadiusFact f1, RadiusFact f2) } } - /// <summary> /// Area of a <see cref="CircleFact">CircleFact</see> /// </summary> public class AreaCircleFact : FactWrappedCRTP<AreaCircleFact> { - /// <summary> the circle <see cref="CircleFact">CircleFact</see> </summary> + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "AreaCircleFact"; + + /// <summary> the circle <see cref="CircleFact">CircleFact</see> </summary> public string Cid1; /// <summary> the area which is contained by the circle </summary> public float A; @@ -2598,12 +2814,15 @@ protected override bool EquivalentWrapped(AreaCircleFact f1, AreaCircleFact f2) } } - /// <summary> /// The volume of a cone A defined by a base area <see cref="CircleFact">CircleFact</see>, an apex <see cref="PointFact">PointFact</see> and the volume as float /// </summary> public class ConeVolumeFact : FactWrappedCRTP<ConeVolumeFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "ConeVolumeFact"; + /// <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary> public string Cid1; /// <summary> a <see cref="PointFact">PointFact</see> describing the apex point </summary> @@ -2790,12 +3009,15 @@ protected override bool EquivalentWrapped(ConeVolumeFact f1, ConeVolumeFact f2) } } - /// <summary> /// The fact that the plane of a <see cref="CircleFact">CircleFact</see> and the line <see cref="RayFact>RayFact</see> are orthogonal /// </summary> public class OrthogonalCircleLineFact : FactWrappedCRTP<OrthogonalCircleLineFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "OrthogonalCircleLineFact"; + /// <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary> public string Cid1; /// <summary> a <see cref="RayFact">Rayfact</see> describing the line </summary> @@ -2975,6 +3197,10 @@ protected override bool EquivalentWrapped(OrthogonalCircleLineFact f1, Orthogona /// </summary> public class TruncatedConeVolumeFact : FactWrappedCRTP<TruncatedConeVolumeFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "TruncatedConeVolumeFact"; + /// <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary> public string Cid1; /// <summary> a <see cref="CircleFact">CircleFact</see> describing the top area </summary> @@ -3174,222 +3400,15 @@ protected override bool EquivalentWrapped(TruncatedConeVolumeFact f1, TruncatedC } } - -/// <summary> -/// A RightAngleFact defined by 3 <see cref="PointFact">Pointfact</see> -/// </summary> -public class RightAngleFact : FactWrappedCRTP<RightAngleFact> -{ - /// <summary> three <see cref="PointFact">Pointfacts</see> defining the right angle </summary> - public string Pid1, Pid2, Pid3; - - - - /// <summary> \copydoc Fact.Fact </summary> - public RightAngleFact() : base() - { - this.Pid1 = null; - this.Pid2 = null; - this.Pid3 = null; - } - - /// <summary> - /// Copies <paramref name="fact"/> by initiating new MMT %Fact. - /// </summary> - /// <param name="fact">Fact to be copied</param> - /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param> - /// <param name="organizer">sets <see cref="_Facts"/></param> - public RightAngleFact(RightAngleFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer) - { - init(old_to_new[fact.Pid1], old_to_new[fact.Pid2],old_to_new[fact.Pid3]); - } - - /// <summary> - /// Standard Constructor - /// </summary> - /// <param name="pid1">sets <see cref="Pid1"/></param> - /// <param name="pid2">sets <see cref="Pid2"/></param> - /// <param name="pid3">sets <see cref="Pid3"/></param> - /// <param name="organizer">sets <see cref="Fact._Facts"/></param> - public RightAngleFact(string pid1, string pid2, string pid3, FactOrganizer organizer) : base(organizer) - { - init(pid1, pid2, pid3); - } - - /// <summary> - /// Initiates <see cref="Pid1"/>, <see cref="Pid2"/>, <see cref="Pid3"/>, <see cref="is_right_angle"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side - /// </summary> - /// <param name="pid1">sets <see cref="Pid1"/></param> - /// <param name="pid2">sets <see cref="Pid2"/></param> - /// <param name="pid3">sets <see cref="Pid3"/></param> - private void init(string pid1, string pid2, string pid3) - { - this.Pid1 = pid1; - this.Pid2 = pid2; - this.Pid3 = pid3; - - PointFact pf1 = _Facts[pid1] as PointFact; - PointFact pf2 = _Facts[pid2] as PointFact; - PointFact pf3 = _Facts[pid3] as PointFact; - - - MMTDeclaration mmtDecl; - string p1URI = pf1.Id; - string p2URI = pf2.Id; - string p3URI = pf3.Id; - - - mmtDecl = generateMMTDeclaration(p1URI, p2URI, p3URI); - - AddFactResponse.sendAdd(mmtDecl, out this._URI); - } - - /// <summary> - /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_. - /// </summary> - /// <param name="Pid1">sets <see cref="Pid1"/></param> - /// <param name="Pid2">sets <see cref="Pid2"/></param> - /// <param name="Pid3">sets <see cref="Pid3"/></param> - /// <param name="backendURI">MMT URI</param> - /// <param name="organizer">sets <see cref="Fact._Facts"/></param> - public RightAngleFact(string Pid1, string Pid2, string Pid3, string backendURI, FactOrganizer organizer) : base(organizer) - { - this.Pid1 = Pid1; - this.Pid2 = Pid2; - this.Pid3 = Pid3; - - this._URI = backendURI; - _ = this.Label; - } - - /// \copydoc Fact.parseFact(Scroll.ScrollFact) - public new static RightAngleFact parseFact(Scroll.ScrollFact fact) - { - OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp; - if (tp == null) - return null; - - string Point1Uri = ""; - string Point2Uri = ""; - string Point3Uri = ""; - - string uri = fact.@ref.uri; - OMA proof_OMA = (OMA)((Scroll.ScrollSymbolFact)fact).tp; // proof DED - OMA rightAngleOMA = (OMA)proof_OMA.arguments[0]; // rightAngle OMA - - if (rightAngleOMA.arguments[0] is OMS) - { - Point1Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri; - Point2Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri; - Point3Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[2]).uri; - } - - if (StageStatic.stage.factState.ContainsKey(Point1Uri) - && StageStatic.stage.factState.ContainsKey(Point2Uri) - && StageStatic.stage.factState.ContainsKey(Point3Uri)) - - return new RightAngleFact(Point1Uri, Point2Uri, Point3Uri, uri, StageStatic.stage.factState); - - else //If dependent facts do not exist return null - return null; - } - - - /// \copydoc Fact.generateLabel - protected override string generateLabel() - { - return _Facts[Pid1].Label + _Facts[Pid2].Label + _Facts[Pid3].Label + "⊥"; - } - - - /// <summary> - /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/> - /// </summary> - /// <param name="p1URI"> Uri for <see cref="Pid1"/></param> - /// <param name="p2URI"> Uri for <see cref="Pid2"/></param> - /// <param name="p3URI"> Uri for <see cref="Pid3"/></param> - /// <returns>struct for <see cref="AddFactResponse"/></returns> - private MMTDeclaration generateMMTDeclaration(string p1URI, string p2URI, string p3URI) - { - List<MMTTerm> innerArguments = new List<MMTTerm> - { - new OMS(p1URI), - new OMS(p2URI), - new OMS(p3URI) - }; - - List<MMTTerm> outerArguments = new List<MMTTerm> - { - new OMA(new OMS(MMTURIs.RightAngle), innerArguments) - }; - MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments); - MMTTerm df = null; - - return new MMTSymbolDeclaration(this.Label, tp, df); - } - - /// \copydoc Fact.hasDependentFacts - public override Boolean hasDependentFacts() - { - return true; - } - - /// \copydoc Fact.getDependentFactIds - public override string[] getDependentFactIds() - { - return new string[] { Pid1, Pid2, Pid3 }; - } - - /// \copydoc Fact.instantiateDisplay(GameObject, Transform) - public override GameObject instantiateDisplay(GameObject prefab, Transform transform) - { - var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform); - obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid1].Label; - obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid2].Label; - obj.transform.GetChild(2).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid3].Label; - - - obj.GetComponent<FactWrapper>().fact = this; - return obj; - } - - /// \copydoc Fact.GetHashCode - /// uhhh is this a problem? - public override int GetHashCode() - { - return this.Pid1.GetHashCode() ^ this.Pid2.GetHashCode() ^ this.Pid3.GetHashCode(); - } - - /// \copydoc Fact.Equivalent(Fact, Fact) - protected override bool EquivalentWrapped(RightAngleFact f1, RightAngleFact f2) - { - if (f1.Pid1 == f2.Pid1 && f1.Pid2 == f2.Pid2 && f1.Pid3 == f2.Pid3) - return true; - - PointFact p1f1 = (PointFact)_Facts[f1.Pid1]; - PointFact p2f1 = (PointFact)_Facts[f1.Pid2]; - PointFact p3f1 = (PointFact)_Facts[f1.Pid3]; - - PointFact p1f2 = (PointFact)_Facts[f2.Pid1]; - PointFact p2f2 = (PointFact)_Facts[f2.Pid2]; - PointFact p3f2 = (PointFact)_Facts[f2.Pid3]; - - - - - return (p1f1.Equivalent(p1f2) && p2f1.Equivalent(p2f2) && p3f1.Equivalent(p3f2) ); - - } -} - - - - /// <summary> /// The volume of a cylinder defined by a base area <see cref="CircleFact">CircleFact</see>, a top area <see cref="CircleFact">CircleFact</see> and the volume as float /// </summary> public class CylinderVolumeFact : FactWrappedCRTP<CylinderVolumeFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "CylinderVolumeFact"; + /// <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary> public string Cid1; /// <summary> a <see cref="CircleFact">CircleFact</see> describing the top area </summary> @@ -3591,14 +3610,15 @@ protected override bool EquivalentWrapped(CylinderVolumeFact f1, CylinderVolumeF } } - - - /// <summary> /// A fact that describes, that two circles have the same size and is comprised of two <see cref="CircleFact">CircleFacts</see> /// </summary> public class EqualCirclesFact : FactWrappedCRTP<EqualCirclesFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "EqualCirclesFact"; + /// @{ <summary> /// two circles that are meant to be equal in area /// </summary> @@ -3792,12 +3812,15 @@ protected override bool EquivalentWrapped(EqualCirclesFact f1, EqualCirclesFact } } - /// <summary> /// A fact that describes, that two circles have not the same size and is comprised of two <see cref="CircleFact">CircleFacts</see> /// </summary> public class UnEqualCirclesFact : FactWrappedCRTP<UnEqualCirclesFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "UnEqualCirclesFact"; + /// @{ <summary> /// two circles that are meant to be unequal in area /// </summary> @@ -3993,10 +4016,6 @@ protected override bool EquivalentWrapped(UnEqualCirclesFact f1, UnEqualCirclesF } - - - - /// TEST FACT /// use this if you need to test certain implementations of facts. @@ -4005,8 +4024,12 @@ protected override bool EquivalentWrapped(UnEqualCirclesFact f1, UnEqualCirclesF /// </summary> public class TestFact : FactWrappedCRTP<TestFact> { + /// \copydoc Fact.s_type + [JsonProperty] + protected static new string s_type = "TestFact"; + + - /// <summary> \copydoc Fact.Fact </summary> public TestFact() : base() diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs index 6d7a0c49697237ea0496b0c68c1a3fba5ec0b001..dd1f8cfaaca36bfb7ab97fca0c01411776b38fd8 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs @@ -29,11 +29,12 @@ public Fact SpawnFactRepresentation(Fact fact) { Func<Fact, Fact> func = fact switch { - PointFact => SpawnPoint, - LineFact => SpawnLine, - AngleFact => SpawnAngle, - RayFact => SpawnRay, - CircleFact => SpawnRingAndCircle, + PointFact => SpawnPoint, + LineFact => SpawnLine, + RightAngleFact => SpawnAngle, //needed for Hint System + AngleFact => SpawnAngle, + RayFact => SpawnRay, + CircleFact => SpawnRingAndCircle, _ => null, }; @@ -141,11 +142,24 @@ public Fact SpawnRay(Fact fact) //Spawn an angle: point with id = angleFact.Pid2 is the point where the angle gets applied public Fact SpawnAngle(Fact fact) { - AngleFact angleFact = (AngleFact)fact; + Vector3 point1, point2, point3; + + // TODO: just use simple inheritence or similar!! + if (fact is RightAngleFact rightangleFact) + { + point1 = (StageStatic.stage.factState[rightangleFact.Pid1] as PointFact).Point; + point2 = (StageStatic.stage.factState[rightangleFact.Pid2] as PointFact).Point; + point3 = (StageStatic.stage.factState[rightangleFact.Pid3] as PointFact).Point; + } + else if (fact is AngleFact angleFact) + { + point1 = (StageStatic.stage.factState[angleFact.Pid1] as PointFact).Point; + point2 = (StageStatic.stage.factState[angleFact.Pid2] as PointFact).Point; + point3 = (StageStatic.stage.factState[angleFact.Pid3] as PointFact).Point; + } + else + throw new Exception("Invalid Type:" + fact.GetType().ToString()); - Vector3 point1 = (StageStatic.stage.factState[angleFact.Pid1] as PointFact).Point; - Vector3 point2 = (StageStatic.stage.factState[angleFact.Pid2] as PointFact).Point; - Vector3 point3 = (StageStatic.stage.factState[angleFact.Pid3] as PointFact).Point; //Length of the Angle relative to the Length of the shortest of the two lines (point2->point1) and (point2->point3) float lengthFactor = 0.3f; @@ -193,9 +207,9 @@ public Fact SpawnAngle(Fact fact) foreach (CircleSegmentGenerator c in segments) c.setAngle(angleValue); - angle.GetComponentInChildren<FactObject>().URI = angleFact.Id; - angleFact.Representation = angle; - return angleFact; + angle.GetComponentInChildren<FactObject>().URI = fact.Id; + fact.Representation = angle; + return fact; } public Fact SpawnRingAndCircle(Fact fact) diff --git a/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs b/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs index 979685e6c8e803248226438149885cf4e75a6761..e92dc063d667158a804a0df77f916aee4bb1311a 100644 --- a/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs +++ b/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs @@ -70,7 +70,7 @@ public override void _Hit(RaycastHit[] hit) } - private void ResetGadget() + protected override void _ResetGadget() { this.FirstCircleSelected= false; this.FirstCircle = null; diff --git a/Assets/Scripts/InteractionEngine/Gadgets/GadgetBehaviour.cs b/Assets/Scripts/InteractionEngine/Gadgets/GadgetBehaviour.cs index 72a3a3764b2d3e4e7c4a7d49c28c7a49ccb0de3d..edc38dcd42155ed146b496158728d30768acc572 100644 --- a/Assets/Scripts/InteractionEngine/Gadgets/GadgetBehaviour.cs +++ b/Assets/Scripts/InteractionEngine/Gadgets/GadgetBehaviour.cs @@ -22,7 +22,7 @@ public class GadgetBehaviour : MonoBehaviour, ISerializationCallbackReceiver public static GameObject ParentMe; public static Material[] Materials; public static Sprite[] ButtonSprites; - public static String[] ButtonNames; + //public static String[] ButtonNames; public static Dictionary<Gadget.GadgetIDs, DataContainerGadgetInit> DataContainerGadgetDict; @@ -60,7 +60,7 @@ public void OnAfterDeserialize() #pragma warning disable UNT0008 // Null propagation on Unity objects Materials = _DataContainerGadgetDict?.Materials ?? new Material[0]; ButtonSprites = _DataContainerGadgetDict?.ButtonSprites ?? new Sprite[0]; - ButtonNames = _DataContainerGadgetDict?.GadgetNames ?? new string[0]; + //ButtonNames = _DataContainerGadgetDict?.GadgetNames ?? new string[0]; DataContainerGadgetDict = _DataContainerGadgetDict?.DataContainerGadgetDict ?? new(); #pragma warning restore UNT0008 // Null propagation on Unity objects } @@ -181,7 +181,7 @@ public static void ActivateGadget(int gid) ActiveGadgetInd = gid; //buttons[gid].animator.StartPlayback(); buttons[gid].transform.localScale *= ActiveGadgetScaleFactor; - GadgetName.GetComponent<TMP_Text>().text = ButtonNames[gadgets[gid].ButtonIndx]; + GadgetName.GetComponent<TMP_Text>().text = gadgets[gid].UiName; gadgets[gid].Enable(); OnHit = gadgets[gid].Hit; diff --git a/Assets/Scripts/InteractionEngine/ShinyThings.cs b/Assets/Scripts/InteractionEngine/ShinyThings.cs index d8e35ab79d69f9defe146289a61b162e043cea64..e1ba577f03444cfdc2478ed47ee1a05ab0d3e5a8 100644 --- a/Assets/Scripts/InteractionEngine/ShinyThings.cs +++ b/Assets/Scripts/InteractionEngine/ShinyThings.cs @@ -30,7 +30,8 @@ private void Awake() { CommunicationEvents.PushoutFactEvent.AddListener(HighlightFact); CommunicationEvents.PushoutFactFailEvent.AddListener(LetItRain); - CommunicationEvents.AnimateExistingFactEvent.AddListener(HighlightWithFireworks); + CommunicationEvents.AnimateExistingFactEvent.AddListener(HighlightFact); + CommunicationEvents.AnimateExistingAsSolutionEvent.AddListener(HighlightWithFireworks); rain = rain_wait = IEnumeratorExtensions.yield_break; } @@ -95,12 +96,12 @@ public static void HighlightFact(Fact startFact, FactObject.FactMaterials tmp_ma ); } - public void HighlightWithFireworks(Fact fact) + public void HighlightWithFireworks(Fact fact, FactObject.FactMaterials mat) { rain_wait = IEnumeratorExtensions.yield_break; //stop rain StartCoroutine(BlossomAndDie()); - HighlightFact(fact, FactObject.FactMaterials.Solution); + HighlightFact(fact, mat); IEnumerator BlossomAndDie() { @@ -125,7 +126,7 @@ IEnumerator BlossomAndDie() } } - public void LetItRain(Fact startFact) + public void LetItRain(Fact startFact, Scroll.ScrollApplicationInfo _) { // check if couroutine is waiting if (!rain_wait.MoveNext()) {