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); }
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); }
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); }