Exemplo n.º 1
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            //string path = "";
            FlexParams param = new FlexParams();

            if (!isDefaultFile)
            {
                DA.GetData(0, ref path);
            }
            else
            {
                isDefaultFile = false;
            }

            XmlDocument doc    = new XmlDocument();
            string      folder = "";

            if (path == "")
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Input parameter 'path' failed to collect data.");
                return;
            }

            if (!path.Contains("/") && !path.Contains(@"\"))
            {
                folder = this.OnPingDocument().FilePath;
                path   = folder.Substring(0, folder.LastIndexOf(@"\") + 1) + path;
            }
            doc.Load(path);

            foreach (XmlNode node in doc.DocumentElement.ChildNodes)
            {
                #region get param
                if (node.Name == "Adhesion")
                {
                    param.Adhesion = float.Parse(node.InnerText);
                }

                else if (node.Name == "AnisotropyMax")
                {
                    param.AnisotropyMax = float.Parse(node.InnerText);
                }

                else if (node.Name == "AnisotropyMin")
                {
                    param.AnisotropyMin = float.Parse(node.InnerText);
                }

                else if (node.Name == "AnisotropyScale")
                {
                    param.AnisotropyScale = float.Parse(node.InnerText);
                }

                else if (node.Name == "Buoyancy")
                {
                    param.Buoyancy = float.Parse(node.InnerText);
                }

                else if (node.Name == "Cohesion")
                {
                    param.Cohesion = float.Parse(node.InnerText);
                }

                else if (node.Name == "CollisionDistance")
                {
                    param.CollisionDistance = float.Parse(node.InnerText);
                }

                else if (node.Name == "Damping")
                {
                    param.Damping = float.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseBallistic")
                {
                    param.DiffuseBallistic = int.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseBuoyancy")
                {
                    param.DiffuseBuoyancy = float.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseDrag")
                {
                    param.DiffuseDrag = float.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseLifetime")
                {
                    param.DiffuseLifetime = float.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseSortAxisX")
                {
                    param.DiffuseSortAxisX = float.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseSortAxisY")
                {
                    param.DiffuseSortAxisY = float.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseSortAxisZ")
                {
                    param.DiffuseSortAxisZ = float.Parse(node.InnerText);
                }

                else if (node.Name == "DiffuseThreshold")
                {
                    param.DiffuseThreshold = float.Parse(node.InnerText);
                }

                else if (node.Name == "Dissipation")
                {
                    param.Dissipation = float.Parse(node.InnerText);
                }

                else if (node.Name == "Drag")
                {
                    param.Drag = float.Parse(node.InnerText);
                }

                else if (node.Name == "DynamicFriction")
                {
                    param.DynamicFriction = float.Parse(node.InnerText);
                }

                else if (node.Name == "Fluid")
                {
                    param.Fluid = bool.Parse(node.InnerText);
                }

                else if (node.Name == "FluidRestDistance")
                {
                    param.FluidRestDistance = float.Parse(node.InnerText);
                }

                else if (node.Name == "FreeSurfaceDrag")
                {
                    param.FreeSurfaceDrag = float.Parse(node.InnerText);
                }

                else if (node.Name == "GravityX")
                {
                    param.GravityX = float.Parse(node.InnerText);
                }

                else if (node.Name == "GravityY")
                {
                    param.GravityY = float.Parse(node.InnerText);
                }

                else if (node.Name == "GravityZ")
                {
                    param.GravityZ = float.Parse(node.InnerText);
                }

                else if (node.Name == "Lift")
                {
                    param.Lift = float.Parse(node.InnerText);
                }

                else if (node.Name == "MaxAcceleration")
                {
                    param.MaxAcceleration = float.Parse(node.InnerText);
                }

                else if (node.Name == "MaxSpeed")
                {
                    param.MaxSpeed = float.Parse(node.InnerText);
                }

                else if (node.Name == "NumIterations")
                {
                    param.NumIterations = int.Parse(node.InnerText);
                }

                else if (node.Name == "NumPlanes")
                {
                    param.NumPlanes = int.Parse(node.InnerText);
                }

                else if (node.Name == "ParticleCollisionMargin")
                {
                    param.ParticleCollisionMargin = float.Parse(node.InnerText);
                }

                else if (node.Name == "ParticleFriction")
                {
                    param.ParticleFriction = float.Parse(node.InnerText);
                }

                else if (node.Name == "PlasticCreep")
                {
                    param.PlasticCreep = float.Parse(node.InnerText);
                }

                else if (node.Name == "PlasticThreshold")
                {
                    param.PlasticThreshold = float.Parse(node.InnerText);
                }

                else if (node.Name == "Radius")
                {
                    param.Radius = float.Parse(node.InnerText);
                }

                else if (node.Name == "RelaxationFactor")
                {
                    param.RelaxationFactor = float.Parse(node.InnerText);
                }

                else if (node.Name == "RelaxationMode")
                {
                    param.RelaxationMode = int.Parse(node.InnerText);
                }

                else if (node.Name == "Restitution")
                {
                    param.Restitution = float.Parse(node.InnerText);
                }

                else if (node.Name == "ShapeCollisionMargin")
                {
                    param.ShapeCollisionMargin = float.Parse(node.InnerText);
                }

                else if (node.Name == "ShockPropagation")
                {
                    param.ShockPropagation = float.Parse(node.InnerText);
                }

                else if (node.Name == "SleepThreshold")
                {
                    param.SleepThreshold = float.Parse(node.InnerText);
                }

                else if (node.Name == "Smoothing")
                {
                    param.Smoothing = float.Parse(node.InnerText);
                }

                else if (node.Name == "SolidPressure")
                {
                    param.SolidPressure = float.Parse(node.InnerText);
                }

                else if (node.Name == "SolidRestDistance")
                {
                    param.SolidRestDistance = float.Parse(node.InnerText);
                }

                else if (node.Name == "StaticFriction")
                {
                    param.StaticFriction = float.Parse(node.InnerText);
                }

                else if (node.Name == "SurfaceTension")
                {
                    param.SurfaceTension = float.Parse(node.InnerText);
                }

                else if (node.Name == "Viscosity")
                {
                    param.Viscosity = float.Parse(node.InnerText);
                }

                else if (node.Name == "VorticityConfinement")
                {
                    param.VorticityConfinement = float.Parse(node.InnerText);
                }

                else if (node.Name == "WindX")
                {
                    param.WindX = float.Parse(node.InnerText);
                }

                else if (node.Name == "WindY")
                {
                    param.WindY = float.Parse(node.InnerText);
                }

                else if (node.Name == "WindZ")
                {
                    param.WindZ = float.Parse(node.InnerText);
                }

                else
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Param couldn't be identified: " + node.Name);
                }

                #endregion
            }

            DA.SetData(0, param);
        }
Exemplo n.º 2
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            //CONTINUE HERE!!!!
            UpdateTask = new Task <int>(() => Update());

            FlexParams              param       = new FlexParams();
            FlexCollisionGeometry   geom        = new FlexCollisionGeometry();
            List <FlexForceField>   forceFields = new List <FlexForceField>();
            List <FlexScene>        scenes      = new List <FlexScene>();
            List <ConstraintSystem> constraints = new List <ConstraintSystem>();
            FlexSolverOptions       options     = new FlexSolverOptions();
            bool reset = false;

            bool go = false;

            DA.GetData(6, ref reset);
            DA.GetData(7, ref go);

            if (reset)
            {
                //reset everything related to time tracking
                counter           = 0;
                totalTimeMs       = 0;
                totalUpdateTimeMs = 0;
                sw.Stop();
                sw.Reset();

                outInfo = new List <string>();

                //retrieve relevant data
                DA.GetData(0, ref param);
                DA.GetData(1, ref geom);
                DA.GetDataList(2, forceFields);
                DA.GetDataList(3, scenes);
                DA.GetDataList(4, constraints);
                DA.GetData(5, ref options);

                sceneTimeStamps      = new List <int>();
                forceFieldTimeStamps = new List <int>();

                //destroy old Flex instance
                if (flex != null)
                {
                    flex.Destroy();
                }

                //Create new instance and assign everything
                flex = new Flex();

                flex.SetParams(param);
                flex.SetCollisionGeometry(geom);
                flex.SetForceFields(forceFields);
                foreach (FlexForceField f in forceFields)
                {
                    forceFieldTimeStamps.Add(f.TimeStamp);
                }
                FlexScene scene = new FlexScene();
                foreach (FlexScene s in scenes)
                {
                    scene.AppendScene(s);
                    sceneTimeStamps.Add(s.TimeStamp);
                }
                foreach (ConstraintSystem c in constraints)
                {
                    scene.RegisterCustomConstraints(c.AnchorIndices, c.ShapeMatchingIndices, c.ShapeStiffness, c.SpringPairIndices, c.SpringStiffnesses, c.SpringTargetLengths, c.TriangleIndices, c.TriangleNormals);
                    constraintTimeStamps.Add(c.TimeStamp);
                }
                flex.SetScene(scene);
                flex.SetSolverOptions(options);
            }
            else if (go && flex != null && flex.IsReady())
            {
                DA.GetData(5, ref options);
                if (options.TimeStamp != optionsTimeStamp)
                {
                    flex.SetSolverOptions(options);
                }

                if (options.SceneMode == 0 || options.SceneMode == 1)
                {
                    //update params if timestamp expired
                    DA.GetData(0, ref param);
                    if (param.TimeStamp != paramsTimeStamp)
                    {
                        flex.SetParams(param);
                        paramsTimeStamp = param.TimeStamp;
                    }

                    //update geom if timestamp expired
                    if (DA.GetData(1, ref geom))
                    {
                        if (geom.TimeStamp != geomTimeStamp)
                        {
                            flex.SetCollisionGeometry(geom);
                            geomTimeStamp = geom.TimeStamp;
                        }
                    }
                    else if (geom != null)
                    {
                        flex.SetCollisionGeometry(new FlexCollisionGeometry());
                    }

                    //update forcefields where timestamp expired
                    DA.GetDataList(2, forceFields);
                    bool needsUpdate = false;
                    for (int i = forceFieldTimeStamps.Count; i < forceFields.Count; i++)
                    {
                        forceFieldTimeStamps.Add(forceFields[i].TimeStamp);
                        needsUpdate = true;
                    }
                    for (int i = 0; i < forceFields.Count; i++)
                    {
                        if (forceFields[i].TimeStamp != forceFieldTimeStamps[i])
                        {
                            needsUpdate             = true;
                            forceFieldTimeStamps[i] = forceFields[i].TimeStamp;
                        }
                    }
                    if (needsUpdate)
                    {
                        flex.SetForceFields(forceFields);
                    }

                    //update scenes where timestamp expired
                    DA.GetDataList(3, scenes);
                    for (int i = sceneTimeStamps.Count; i < scenes.Count; i++)
                    {
                        sceneTimeStamps.Add(scenes[i].TimeStamp);
                    }
                    for (int i = 0; i < scenes.Count; i++)
                    {
                        if (scenes[i].TimeStamp != sceneTimeStamps[i])
                        {
                            if (options.SceneMode == 0)
                            {
                                flex.SetScene(flex.Scene.AlterScene(scenes[i], false));
                            }
                            else
                            {
                                flex.SetScene(flex.Scene.AppendScene(scenes[i]));
                            }
                            sceneTimeStamps[i] = scenes[i].TimeStamp;
                        }
                    }

                    DA.GetDataList(4, constraints);
                    for (int i = constraintTimeStamps.Count; i < constraints.Count; i++)
                    {
                        constraintTimeStamps.Add(constraints[i].TimeStamp);
                    }
                    for (int i = 0; i < constraints.Count; i++)
                    {
                        ConstraintSystem c = constraints[i];
                        if (c.TimeStamp != constraintTimeStamps[i])
                        {
                            if (!flex.Scene.RegisterCustomConstraints(c.AnchorIndices, c.ShapeMatchingIndices, c.ShapeStiffness, c.SpringPairIndices, c.SpringStiffnesses, c.SpringTargetLengths, c.TriangleIndices, c.TriangleNormals))
                            {
                                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Custom constraint indices exceeded particle count. No constraints applied!");
                            }
                            flex.SetScene(flex.Scene);
                            constraintTimeStamps[i] = constraints[i].TimeStamp;
                        }
                    }
                }

                //Add timing info
                outInfo = new List <string>();
                counter++;
                outInfo.Add(counter.ToString());
                long currentTickTimeMs = sw.ElapsedMilliseconds;
                sw.Restart();
                totalTimeMs += currentTickTimeMs;
                outInfo.Add(totalTimeMs.ToString());
                outInfo.Add(currentTickTimeMs.ToString());
                float avTotalTickTime = ((float)totalTimeMs / (float)counter);
                outInfo.Add(avTotalTickTime.ToString());

                //start update
                UpdateTask.Start();

                //Add solver timing info
                int tickTimeSolver = UpdateTask.Result;
                totalUpdateTimeMs += tickTimeSolver;
                float ratUpdateTime = ((float)totalUpdateTimeMs / (float)counter);
                outInfo.Add(tickTimeSolver.ToString());
                outInfo.Add(ratUpdateTime.ToString());
            }

            if (go && options.FixedTotalIterations < 1)
            {
                ExpireSolution(true);
            }

            else if (flex != null && UpdateTask.Status == TaskStatus.Running)
            {
                UpdateTask.Dispose();
            }

            if (flex != null)
            {
                DA.SetData(0, flex);
            }
            DA.SetDataList(1, outInfo);
        }
Exemplo n.º 3
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            param = new FlexParams();

            Vector3d gra  = new Vector3d(0.0, 0.0, -9.81);
            double   rad  = 0.15;
            double   srd  = 0.075;
            double   frd  = 0.075;
            double   cod  = 0.0;
            double   pcm  = 0.0;
            double   scm  = 0.0;
            double   mxs  = 0.0;
            double   mxa  = 0.0;
            double   dyf  = 0.0;
            double   stf  = 0.0;
            double   paf  = 0.0;
            double   res  = 0.0;
            double   adh  = 0.0;
            double   slt  = 0.0;
            double   shp  = 0.0;
            double   dis  = 0.0;
            double   dam  = 0.0;
            bool     flu  = true;
            double   vis  = 0.0;
            double   coh  = 0.0;
            double   suf  = 0.0;
            double   sop  = 0.0;
            double   frs  = 0.0;
            double   buo  = 0.0;
            double   plt  = 0.0;
            double   plc  = 0.0;
            Vector3d wind = new Vector3d(0.0, 0.0, 0.0);
            double   dra  = 0.0;
            double   lif  = 0.0;
            bool     rem  = true;
            double   rfa  = 1.0;

            DA.GetData("Gravity", ref gra);
            DA.GetData("Radius", ref rad);
            DA.GetData("Solid Rest Distance", ref srd);
            DA.GetData("Fluid Rest Distance", ref frd);
            DA.GetData("Collision Distance", ref cod);
            DA.GetData("Particle Collision Margin", ref pcm);
            DA.GetData("Shape Collision Margin", ref scm);
            DA.GetData("Max Speed", ref mxs);
            DA.GetData("Max Acceleration", ref mxa);
            DA.GetData("Dynamic Friction", ref dyf);
            DA.GetData("Static Friction", ref stf);
            DA.GetData("Particle Friction", ref paf);
            DA.GetData("Restitution", ref res);
            DA.GetData("Adhesion", ref adh);
            DA.GetData("Sleep Threshold", ref slt);
            DA.GetData("Shock Propagation", ref shp);
            DA.GetData("Dissipation", ref dis);
            DA.GetData("Damping", ref dam);
            DA.GetData("Fluid", ref flu);
            DA.GetData("Viscosity", ref vis);
            DA.GetData("Cohesion", ref coh);
            DA.GetData("Surface Tension", ref suf);
            DA.GetData("Solid Pressure", ref sop);
            DA.GetData("Free Surface Drag", ref frs);
            DA.GetData("Buoyancy", ref buo);
            DA.GetData("Plastic Threshold", ref plt);
            DA.GetData("Plastic Creep", ref plc);
            DA.GetData("Wind", ref wind);
            DA.GetData("Drag", ref dra);
            DA.GetData("Lift", ref lif);
            DA.GetData("Relaxation Mode", ref rem);
            DA.GetData("Relaxation Factor", ref rfa);

            if (srd > rad)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Solid rest distance should be smaller or equal to radius.");
            }

            param.GravityX                = (float)gra.X;
            param.GravityY                = (float)gra.Y;
            param.GravityZ                = (float)gra.Z;
            param.Radius                  = (float)rad;
            param.SolidRestDistance       = (float)srd;
            param.FluidRestDistance       = (float)frd;
            param.CollisionDistance       = (float)cod;
            param.ParticleCollisionMargin = (float)pcm;
            param.ShapeCollisionMargin    = (float)scm;
            param.MaxSpeed                = (float)mxs;
            param.MaxAcceleration         = (float)mxa;
            param.DynamicFriction         = (float)dyf;
            param.StaticFriction          = (float)stf;
            param.ParticleFriction        = (float)paf;
            param.Restitution             = (float)res;
            param.Adhesion                = (float)adh;
            param.SleepThreshold          = (float)slt;
            param.ShockPropagation        = (float)shp;
            param.Dissipation             = (float)dis;
            param.Damping                 = (float)dam;
            param.Fluid            = flu;
            param.Viscosity        = (float)vis;
            param.Cohesion         = (float)coh;
            param.SurfaceTension   = (float)suf;
            param.SolidPressure    = (float)sop;
            param.FreeSurfaceDrag  = (float)frs;
            param.Buoyancy         = (float)buo;
            param.PlasticThreshold = (float)plt;
            param.PlasticCreep     = (float)plc;
            param.WindX            = (float)wind.X;
            param.WindY            = (float)wind.Y;
            param.WindZ            = (float)wind.Z;
            param.Drag             = (float)dra;
            param.Lift             = (float)lif;
            if (!rem)
            {
                param.RelaxationMode = 0;
            }
            else
            {
                param.RelaxationMode = 1;
            }
            param.RelaxationFactor = (float)rfa;

            DA.SetData(0, param);
        }