Example #1
0
        public override string ToString()
        {
            string s = string.Empty;
            IStringConvertibleMatrix matrix = ConstrainedValue;

            if (matrix != null && matrix.ColumnNames.Count() != 0)
            {
                s += constraintColumn + " ";
            }
            else
            {
                return("ComparisonConstraint");
            }

            if (ConstraintOperation != null)
            {
                s += ConstraintOperation.ToString() + " ";
            }

            if (ConstraintData != null)
            {
                s += ConstraintData.GetValue();
            }
            else
            {
                s += "null";
            }

            return(s);
        }
Example #2
0
        public void WriteToStream(Stream stream)
        {
            var writer = new BinaryWriter(stream);

            writer.Write(Type);
            writer.Write(Size);
            writer.Write(NameHash);

            writer.Write((uint)ConstraintType);
            writer.Write(NameUnused);

            writer.Write(BodyANameUnused);
            writer.Write(BodyAIndex);
            writer.Write(BodyAOrient);
            writer.Write(BodyAPos);

            writer.Write(BodyBNameUnused);
            writer.Write(BodyBIndex);
            writer.Write(BodyBOrient);
            writer.Write(BodyBPos);

            writer.Write(Threshold);

            ConstraintData.WriteToStream(stream);
        }
        protected override bool Check(object constrainedMember)
        {
            if (constrainedMember == null)
            {
                return(false);
            }

            Type constrainedMemberType = constrainedMember.GetType();
            bool compareValue          = ConstraintData.IsAssignableFrom(constrainedMemberType);
            bool result;

            if (ConstraintOperation == ConstraintOperation.IsTypeCompatible)
            {
                result = compareValue;
            }
            else if (ConstraintOperation == ConstraintOperation.IsTypeNotCompatible)
            {
                result = !compareValue;
            }
            else
            {
                throw new InvalidOperationException("Constraint operation " + this.ConstraintOperation + " is not defined for TypeCompatibilityConstraint.");
            }

            return(result);
        }
            private static bool RandomRecursion(Board work, ConstraintData data, List <int> Digits, int Index)
            {
                if (Index == 81)
                {
                    return(true);
                }

                var loc = new Location(Index);

                if (work[loc] > 0)
                {
                    return(RandomRecursion(work, data, Digits, Index + 1));
                }

                foreach (int test in Digits)
                {
                    if (!data.DigitInRow[test, loc.Row] && !data.DigitInColumn[test, loc.Column] && !data.DigitInZone[test, loc.Zone])
                    {
                        work[loc] = test;
                        data.DigitInRow[test, loc.Row] = data.DigitInColumn[test, loc.Column] = data.DigitInZone[test, loc.Zone] = true;
                        if (RandomRecursion(work, data, Digits, Index + 1))
                        {
                            return(true);
                        }
                        data.DigitInRow[test, loc.Row] = data.DigitInColumn[test, loc.Column] = data.DigitInZone[test, loc.Zone] = false;
                    }
                }

                work[loc] = 0;
                return(false);
            }
            private static bool BruteForceRecursion(Board work, ConstraintData data, int Index)
            {
                if (Index == 81)
                    return true;

                if (work[Index] > 0)
                    return BruteForceRecursion(work, data, Index + 1);

                var loc = new Location(Index);

                for (int i = 1; i < 10; i++)
                {
                    if (!data.DigitInRow[i, loc.Row] && !data.DigitInColumn[i, loc.Column] && !data.DigitInZone[i, loc.Zone])
                    {
                        work[loc] = i;
                        data.DigitInRow[i, loc.Row] = data.DigitInColumn[i, loc.Column] = data.DigitInZone[i, loc.Zone] = true;
                        if (BruteForceRecursion(work, data, Index + 1))
                            return true;
                        data.DigitInRow[i, loc.Row] = data.DigitInColumn[i, loc.Column] = data.DigitInZone[i, loc.Zone] = false;
                    }
                }

                work[Index] = 0;
                return false;
            }
Example #6
0
        public override string ToString()
        {
            string s = string.Empty;

            if (ConstrainedValue != null)
            {
                s += ConstrainedValue.GetVariableName(ConstraintColumn) + " ";
            }

            if (ConstraintOperation != null)
            {
                s += ConstraintOperation.ToString() + " ";
            }

            if (ConstraintData != null)
            {
                s += ConstraintData.ToString();
            }
            else
            {
                s += "null";
            }

            s += ".";
            return(s);
        }
Example #7
0
        public XElement WriteToXml()
        {
            var propertyRoot = new XElement("Property");

            PropertyManager.WritePropertyInfoToXml(propertyRoot, Type, Size, NameHash, "template", "constraint template");

            var data = new XElement("Data");

            data.Add(new XElement("ConstraintType", (uint)ConstraintType));
            data.Add(new XElement("NameUnused", NameUnused));

            data.Add(new XElement("BodyANameUnused", BodyANameUnused));
            data.Add(new XElement("BodyAIndex", BodyAIndex));
            data.Add(BodyAOrient.ToXElement("BodyAOrient"));
            data.Add(BodyAPos.ToXElement("BodyAPos"));

            data.Add(new XElement("BodyBNameUnused", BodyBNameUnused));
            data.Add(new XElement("BodyBIndex", BodyBIndex));
            data.Add(BodyBOrient.ToXElement("BodyBOrient"));
            data.Add(BodyBPos.ToXElement("BodyBPos"));

            data.Add(new XElement("Threshold", Threshold));
            if (ConstraintData != null)
            {
                data.Add(ConstraintData.WriteToXml());
            }
            else
            {
                data.Add(new XElement("ConstraintData", "null"));
            }
            propertyRoot.Add(data);

            return(propertyRoot);
        }
            private static bool RandomRecursion(Board work, ConstraintData data, List<int> Digits, int Index)
            {
                if (Index == 81)
                    return true;

                var loc = new Location(Index);

                if (work[loc] > 0)
                    return RandomRecursion(work, data, Digits, Index + 1);

                foreach (int test in Digits)
                {
                    if (!data.DigitInRow[test, loc.Row] && !data.DigitInColumn[test, loc.Column] && !data.DigitInZone[test, loc.Zone])
                    {
                        work[loc] = test;
                        data.DigitInRow[test, loc.Row] = data.DigitInColumn[test, loc.Column] = data.DigitInZone[test, loc.Zone] = true;
                        if (RandomRecursion(work, data, Digits, Index + 1))
                            return true;
                        data.DigitInRow[test, loc.Row] = data.DigitInColumn[test, loc.Column] = data.DigitInZone[test, loc.Zone] = false;
                    }
                }

                work[loc] = 0;
                return false;
            }
            /// <summary>
            /// Attempts to fill the calling <see cref="Board"/> instance with numbers.
            /// The original instance remains unchanged
            /// </summary>
            /// <returns>Either a new instance of <see cref="Board"/> or, if unsuccessful, null</returns>
            public Board Sequential()
            {
                var work = new Board(_parent);

                ConstraintData data = new ConstraintData(work);

                if (BruteForceRecursion(work, data, 0))
                    return work;

                return null;
            }
            /// <summary>
            /// Attempts to fill the calling <see cref="Board"/> instance with numbers.
            /// The original instance remains unchanged
            /// </summary>
            /// <param name="Stream">If you already have a <see cref="Random"/> stream, you may provide it here</param>
            /// <returns>Either a new instance of <see cref="Board"/> or, if unsuccessful, null</returns>
            public Board Randomized(Random Stream)
            {
                var result = new Board(_parent);
                ConstraintData data = new ConstraintData(result);

                var digits = new List<int>();
                for (int i = 1; i < 10; i++)
                    digits.Insert(Stream.Next(digits.Count), i);

                if (RandomRecursion(result, data, digits, 0))
                    return result;

                return null;
            }
        private void Start()
        {
            m_clothParticleObjects = GetComponentsInChildren <ClothParticleObject>();

            ClothParticleConstraints[] clothParticleConstraints = GetComponentsInChildren <ClothParticleConstraints>();
            ParticleClothSettings      particleSettings         = new ParticleClothSettings();

            ParticleData[]         particleDatas   = new ParticleData[m_clothParticleObjects.Length];
            Stack <ConstraintData> constraintDatas = new Stack <ConstraintData>();

            for (int i = 0; i < m_clothParticleObjects.Length; i++)
            {
                ClothParticleObject obj = m_clothParticleObjects[i];
                obj.Index        = i;
                particleDatas[i] = obj.ToParticleData();
            }

            for (int i = 0; i < clothParticleConstraints.Length; i++)
            {
                ClothParticleConstraints obj = clothParticleConstraints[i];

                int indexA = obj.GetComponent <ClothParticleObject>().Index;
                for (int j = 0; j < obj.OtherClothParticles.Length; j++)
                {
                    if (obj.ValidConnection(j))
                    {
                        ClothParticleObject other          = obj.OtherClothParticles[j];
                        ConstraintData      constraintData = new ConstraintData();
                        constraintData.ParticleAIndex = indexA;
                        constraintData.ParticleBIndex = other.Index;
                        constraintData.Length         = Vector3.Distance(obj.transform.position, other.transform.position);
                        constraintDatas.Push(constraintData);
                    }
                }
            }
            particleSettings.SetGravity(m_gravity.x, m_gravity.y, m_gravity.z);
            particleSettings.SetParticles(particleDatas, constraintDatas.ToArray());

            //gather collision Objects
            ICollisionIntegrator[] collisions       = GetComponentsInChildren <ICollisionIntegrator>();
            ICollisionObject[]     collisionObjects = new ICollisionObject[collisions.Length];
            for (int i = 0; i < collisions.Length; i++)
            {
                collisionObjects[i] = collisions[i].CollisionObject();
            }
            particleSettings.SetCollisions(collisionObjects);

            m_clothParticleSystem = new ClothParticleSystem(particleSettings);
        }
Example #12
0
            /// <summary>
            /// Attempts to fill the calling <see cref="Board"/> instance with numbers.
            /// The original instance remains unchanged
            /// </summary>
            /// <param name="Stream">If you already have a <see cref="Random"/> stream, you may provide it here</param>
            /// <returns>Either a new instance of <see cref="Board"/> or, if unsuccessful, null</returns>
            public Board Randomized(Random Stream)
            {
                var            result = new Board(_parent);
                ConstraintData data   = new ConstraintData(result);

                var digits = new List <int>();

                for (int i = 1; i < 10; i++)
                {
                    digits.Insert(Stream.Next(digits.Count), i);
                }

                if (RandomRecursion(result, data, digits, 0))
                {
                    return(result);
                }

                return(null);
            }
Example #13
0
        private List <ConstraintData> LoadConstraintData(string filename)
        {
            List <ConstraintData> data = new List <ConstraintData>();

            string[] fields;

            try
            {
                var reader = new StreamReader(File.OpenRead(filename));
                while (!reader.EndOfStream)
                {
                    ConstraintData tempConstraint = new ConstraintData();
                    fields = reader.ReadLine().Split(',');
                    tempConstraint.OrganName = fields[0];
                    tempConstraint.Bilateral = fields[1].Equals("1");
                    fields = reader.ReadLine().Split(',');
                    while (fields[0] != "end")
                    {
                        tempConstraint.ConstraintList.Add(fields[0]);
                        tempConstraint.ConstraintComparators.Add(fields[1]);
                        tempConstraint.ConstraintValues.Add(Convert.ToDouble(fields[2]));
                        tempConstraint.ConstraintUnits.Add(fields[3]);
                        tempConstraint.ConstraintComplications.Add(fields[4]);
                        fields = reader.ReadLine().Split(',');
                    }
                    data.Add(tempConstraint);
                }
                reader.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            return(data);
        }
Example #14
0
        public   Constraint( Expression expr, RelationalOperator op, double strength = Strength.reqq)  
 {
     m_data= new ConstraintData(expr, op, strength);
 }
Example #15
0
        private void UpdatePosition(bool forceUpdate = false)
        {
            if (SafeConstraint == null)
            {
                return;
            }
            if (!IsWorking && !forceUpdate)
            {
                return;
            }
            //if (!forceUpdate && !CubeGrid.SyncObject.ResponsibleForUpdate(Sync.Clients.LocalClient))
            //return;

            bool changed = false;

            float compensatedDelta = Velocity / 60 * Sync.RelativeSimulationRatio;

            ProfilerShort.Begin("PosAndHandlers");
            if (!forceUpdate)
            {
                if (compensatedDelta < 0)
                {
                    if (m_currentPos > MinLimit)
                    {
                        m_currentPos += compensatedDelta;
                        m_currentPos  = Math.Max(m_currentPos, MinLimit);
                        changed       = true;
                        if (m_currentPos == MinLimit)
                        {
                            var handle = LimitReached;
                            if (handle != null)
                            {
                                handle(false);
                            }
                        }
                    }
                }
                else if (m_currentPos < MaxLimit)
                {
                    m_currentPos += compensatedDelta;
                    m_currentPos  = Math.Min(m_currentPos, MaxLimit);
                    changed       = true;
                    if (m_currentPos == MaxLimit)
                    {
                        var handle = LimitReached;
                        if (handle != null)
                        {
                            handle(true);
                        }
                    }
                }
            }
            ProfilerShort.End();

            if (changed || forceUpdate)
            {
                ProfilerShort.Begin("UpdateText");
                UpdateText();
                ProfilerShort.End();

                ProfilerShort.Begin("UpdateAnimation");
                UpdateAnimation();
                ProfilerShort.End();

                ProfilerShort.Begin("Calculations");
                m_posChanged = true;
                if (CubeGrid == null)
                {
                    MySandboxGame.Log.WriteLine("CubeGrid is null");
                }
                if (m_topGrid == null)
                {
                    MySandboxGame.Log.WriteLine("TopGrid is null");
                }
                if (Subpart3 == null)
                {
                    MySandboxGame.Log.WriteLine("Subpart is null");
                }
                if (CubeGrid.Physics != null)
                {
                    CubeGrid.Physics.RigidBody.Activate();
                }
                if (m_topGrid != null && m_topGrid.Physics != null)
                {
                    m_topGrid.Physics.RigidBody.Activate();
                }
                var matAD = MatrixD.CreateWorld(Vector3D.Transform(Vector3D.Transform(m_constraintBasePos, Subpart3.WorldMatrix), CubeGrid.PositionComp.WorldMatrixNormalizedInv), PositionComp.LocalMatrix.Forward, PositionComp.LocalMatrix.Up);
                var matA  = (Matrix)matAD;
                var matB  = Matrix.CreateWorld(m_topBlock.Position * m_topBlock.CubeGrid.GridSize /*- m_topBlock.LocalMatrix.Up * m_currentPos*/, m_topBlock.PositionComp.LocalMatrix.Forward, m_topBlock.PositionComp.LocalMatrix.Up);
                ProfilerShort.End();

                ProfilerShort.Begin("SetInBodySpace");
                ConstraintData.SetInBodySpace(ref matA, ref matB);
                ProfilerShort.End();

                ProfilerShort.Begin("UpdateSubpartFixedData");
                UpdateSubpartFixedData();
                ProfilerShort.End();
            }
        }
Example #16
0
 public Constraint( Constraint other, double strength) 
 {
     m_data=new ConstraintData(other, strength);
 }
Example #17
0
        //--------------------------------------------------------------------------------------------------

        ConstraintData CreateConstraintData(SketchConstraint constraint, bool swapOrientation)
        {
            var data = new ConstraintData
            {
                Constraint = constraint,
                Info       = ""
            };

            if ((constraint.Points != null) && constraint.Points.Any())
            {
                data.Info += (constraint.Points.Length == 1 ? "Point " : "Points ") + string.Join(", ", constraint.Points);
                if ((constraint.Segments != null) && constraint.Segments.Any())
                {
                    data.Info += " ";
                }
            }
            if ((constraint.Segments != null) && constraint.Segments.Any())
            {
                data.Info += (constraint.Segments.Length == 1 ? "Segment " : "Segments ") + string.Join(", ", constraint.Segments);
            }

            switch (constraint)
            {
            case SketchConstraintPerpendicular _:
                data.Type = "Perpendicular";
                break;

            case SketchConstraintHorizontal _:
                data.Type = swapOrientation ? "Vertical" : "Horizontal";
                break;

            case SketchConstraintVertical _:
                data.Type = swapOrientation ? "Horizontal" : "Vertical";
                break;

            case SketchConstraintParallel _:
                data.Type = "Parallel";
                break;

            case SketchConstraintConcentric _:
                data.Type = "Concentric";
                break;

            case SketchConstraintPointOnSegment _:
                data.Type = "Point on Segment";
                break;

            case SketchConstraintPointOnMidpoint _:
                data.Type = "Point on Midpoint";
                break;

            case SketchConstraintFixed fixedConstraint:
                switch (fixedConstraint.Target)
                {
                case SketchConstraintFixed.TargetType.Point:
                    data.Type = "Fix Point";
                    break;

                case SketchConstraintFixed.TargetType.Segment:
                    data.Type = "Fix Segment";
                    break;
                }
                break;

            case SketchConstraintEqual _:
                data.Type = "Equal";
                break;

            case SketchConstraintAngle _:
                data.Type          = "Inner Angle";
                data.ParameterName = "Angle";
                data.Parameter     = constraint.Parameter;
                data.Units         = ValueUnits.Degree;
                break;

            case SketchConstraintHorizontalDistance _:
                data.Type          = swapOrientation ? "Horiz. Distance" : "Vert. Distance";
                data.ParameterName = "Distance";
                data.Parameter     = constraint.Parameter;
                data.Units         = ValueUnits.Length;
                break;

            case SketchConstraintVerticalDistance _:
                data.Type          = swapOrientation ? "Vert. Distance" : "Horiz. Distance";
                data.ParameterName = "Distance";
                data.Parameter     = constraint.Parameter;
                data.Units         = ValueUnits.Length;
                break;

            case SketchConstraintLength _:
                data.Type          = "Length";
                data.ParameterName = "Length";
                data.Parameter     = constraint.Parameter;
                data.Units         = ValueUnits.Length;
                break;

            case SketchConstraintRadius _:
                data.Type          = "Radius";
                data.ParameterName = "Radius";
                data.Parameter     = constraint.Parameter;
                data.Units         = ValueUnits.Length;
                break;

            case SketchConstraintTangent _:
                data.Type = "Tangent";
                break;

            default:
                data.Type = "Unknown";
                break;
            }
            return(data);
        }
Example #18
0
 public override string ToString()
 {
     return(ConstraintData.ToString());
 }
Example #19
0
public     Constraint()  {
    m_data=null;
}