Skip to content

Commit

Permalink
Merge pull request #5 from mishaelnuh/dev
Browse files Browse the repository at this point in the history
Fixes and sequencer logic update
  • Loading branch information
mishaelnuh authored Dec 25, 2019
2 parents ad90341 + 4cce43a commit be38bdd
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 38 deletions.
22 changes: 12 additions & 10 deletions RodSteward/Generator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
using Grasshopper.GUI.Canvas;
using Rhino.Geometry;
using GH_IO.Serialization;
using Grasshopper.Kernel.Parameters;
using Grasshopper.Kernel.Types;

namespace RodSteward
{
Expand Down Expand Up @@ -43,11 +45,11 @@ protected override void RegisterInputParams(GH_InputParamManager pManager)
pManager.AddNumberParameter("Joint Length", "JL", "Thickness of Joint", GH_ParamAccess.item);
pManager.AddNumberParameter("Tolerance", "e", "Tolerance", GH_ParamAccess.item);

pManager[2].Optional = true;
pManager[3].Optional = true;
pManager[4].Optional = true;
pManager[5].Optional = true;
pManager[6].Optional = true;
((Param_Number)pManager[2]).PersistentData.Append(new GH_Number(50));
((Param_Number)pManager[3]).PersistentData.Append(new GH_Number(6.35));
((Param_Number)pManager[4]).PersistentData.Append(new GH_Number(3));
((Param_Number)pManager[5]).PersistentData.Append(new GH_Number(38));
((Param_Number)pManager[6]).PersistentData.Append(new GH_Number(0.1));
}

protected override void RegisterOutputParams(GH_OutputParamManager pManager)
Expand Down Expand Up @@ -164,11 +166,11 @@ protected override void SolveInstance(IGH_DataAccess DA)

if (!DA.GetDataList(0, edges)) { return; }
if (!DA.GetDataList(1, vertices)) { return; }
if (!DA.GetData(2, ref sides)) { sides = 50; }
if (!DA.GetData(3, ref radius)) { radius = 6.35; }
if (!DA.GetData(4, ref jointThickness)) { jointThickness = 3.0; }
if (!DA.GetData(5, ref jointLength)) { jointLength = 38; }
if (!DA.GetData(6, ref tolerance)) { tolerance = 0.1; }
if (!DA.GetData(2, ref sides)) { return; }
if (!DA.GetData(3, ref radius)) { return; }
if (!DA.GetData(4, ref jointThickness)) { return; }
if (!DA.GetData(5, ref jointLength)) { return; }
if (!DA.GetData(6, ref tolerance)) { return; }

if (edges == null || vertices == null) { return; }
if (radius <= 0 || sides <= 2 || jointThickness < 0 || jointLength < 0 || tolerance < 0) { throw new Exception("Invalid input."); }
Expand Down
10 changes: 5 additions & 5 deletions RodSteward/Model.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ namespace RodSteward
{
public class Model
{
public int Sides { get; set; } = 50;
public double Radius { get; set; } = 6.35;
public double JointThickness { get; set; } = 3.0;
public double JointLength { get; set; } = 38;
public double Tolerance { get; set; } = 0.1;
public int Sides { get; set; }
public double Radius { get; set; }
public double JointThickness { get; set; }
public double JointLength { get; set; }
public double Tolerance { get; set; }

public double InnerWallRadius { get { return Radius + Tolerance; } }
public double OuterWallRadius { get { return Radius + JointThickness + Tolerance; } }
Expand Down
76 changes: 53 additions & 23 deletions RodSteward/Sequencer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
using Grasshopper.GUI;
using Grasshopper.GUI.Canvas;
using GH_IO.Serialization;
using Grasshopper.Kernel.Parameters;
using Grasshopper.Kernel.Types;
using System.Text.RegularExpressions;

namespace RodSteward
{
Expand All @@ -15,7 +18,7 @@ public class Sequencer : GH_Component
private List<Tuple<char, int>> orderedParts = new List<Tuple<char, int>>();
private List<int> traversedEdges = new List<int>();
private List<int> traversedVertices = new List<int>();
private Queue<int> vertexQueue = new Queue<int>();
private List<int> vertexQueue = new List<int>();

public bool AnnotateRods = true;
public bool AnnotateJoints = true;
Expand All @@ -39,6 +42,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager)
pManager.AddGenericParameter("Model", "M", "Model object", GH_ParamAccess.item);
pManager.AddNumberParameter("Starting Joint", "SJ", "First joint to add", GH_ParamAccess.item);
pManager.AddNumberParameter("Part Number", "PN", "Part number to add", GH_ParamAccess.item);

((Param_Number)pManager[1]).PersistentData.Append(new GH_Number(-1));
}

protected override void RegisterOutputParams(GH_OutputParamManager pManager)
Expand Down Expand Up @@ -124,10 +129,11 @@ public override void DrawViewportWires(IGH_PreviewArgs args)

if (AnnotateJoints)
args.Display.Draw2dText(lastPart.Item2.ToString(), System.Drawing.Color.Orange, v, false, 20, "Lucida Console");

if (AnnotateJointArms)
{
var armLabels = model.JointArmLabel.Where(j => j.Key.StartsWith(lastPart.Item2.ToString()));
var armLabels = model.JointArmLabel
.Where(j => Regex.IsMatch(j.Key, "^" + lastPart.Item2.ToString() + "[A-Z]", RegexOptions.IgnoreCase));

foreach (var kvp in armLabels)
{
Expand Down Expand Up @@ -156,26 +162,25 @@ protected override void SolveInstance(IGH_DataAccess DA)
traversedVertices.Clear();
vertexQueue.Clear();

if (startFloored < 0 || startFloored >= model.Vertices.Count()) { return; }
if (numFloored < 0) { return; }

if (numFloored >= 0)
if (startFloored < 0 || startFloored >= model.Vertices.Count())
{
orderedParts.Add(Tuple.Create('V', startFloored));
traversedVertices.Add(startFloored);
SearchFromVertex(startFloored, numFloored);
var minZ = model.Vertices.Min(v => v.Z);
startFloored = model.Vertices.FindIndex(v => v.Z == minZ);
}

if (orderedParts.Count() > 0)
numFloored = Math.Max(0, numFloored);

orderedParts.Add(Tuple.Create('V', startFloored));
traversedVertices.Add(startFloored);
SearchFromVertex(startFloored, numFloored);

if (orderedParts.Last().Item1 == 'E')
{
if (orderedParts.Last().Item1 == 'E')
{
DA.SetData(0, "Rod: " + String.Format("{0:F2}", model.RodCentrelines[model.Edges[orderedParts.Last().Item2]].GetLength()));
}
else
{
DA.SetData(0, "Joint: " + orderedParts.Last().Item2.ToString());
}
DA.SetData(0, "Rod: " + String.Format("{0:F2}", model.RodCentrelines[model.Edges[orderedParts.Last().Item2]].GetLength()));
}
else
{
DA.SetData(0, "Joint: " + orderedParts.Last().Item2.ToString());
}
}

Expand All @@ -196,18 +201,23 @@ private void SearchFromVertex(int vertex, int target)
.Where(e => e.Item1 == vertex || e.Item2 == vertex)
.Select(e => model.Edges.IndexOf(e))
.Where(i => !traversedEdges.Contains(i))
.OrderBy(i =>
{
var nextVertex = model.Edges[i].Item1 == vertex ? model.Edges[i].Item2 : model.Edges[i].Item1;
return model.Vertices[nextVertex].Z;
})
.ToList();

foreach(var e in nextEdgeIndices)
{
var nextVertex = model.Edges[e].Item1 == vertex ? model.Edges[e].Item2 : model.Edges[e].Item1;

orderedParts.Add(Tuple.Create('E', e));
traversedEdges.Add(e);

if (orderedParts.Count() > target)
return;

var nextVertex = model.Edges[e].Item1 == vertex ? model.Edges[e].Item2 : model.Edges[e].Item1;

if (!traversedVertices.Contains(nextVertex))
{
orderedParts.Add(Tuple.Create('V', nextVertex));
Expand All @@ -216,12 +226,32 @@ private void SearchFromVertex(int vertex, int target)
if (orderedParts.Count() > target)
return;

vertexQueue.Enqueue(nextVertex);
var immediateConnectEdges = model.Edges
.Where(ei => traversedVertices.Contains(ei.Item1) && traversedVertices.Contains(ei.Item2))
.Select(ei => model.Edges.IndexOf(ei))
.Where(i => !traversedEdges.Contains(i))
.ToList();

foreach (var ei in immediateConnectEdges)
{
orderedParts.Add(Tuple.Create('E', ei));
traversedEdges.Add(ei);

if (orderedParts.Count() > target)
return;
}

vertexQueue.Add(nextVertex);
}
}

if (vertexQueue.Count() > 0)
SearchFromVertex(vertexQueue.Dequeue(), target);
{
vertexQueue = vertexQueue.OrderBy(v => model.Vertices[v].Z).ToList();
var next = vertexQueue.First();
vertexQueue.RemoveAt(0);
SearchFromVertex(next, target);
}
}
}

Expand Down
Binary file modified examples/Demo.gh
Binary file not shown.

0 comments on commit be38bdd

Please sign in to comment.