/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { GH_Mesh CMesh = new GH_Mesh(); CrowNetP Net = new CrowNetP(); if (!DA.GetData <CrowNetP>(0, ref Net)) { return; } int H = Net.layerHeight; int W = Net.layerWidth; Mesh RhinoMesh = new Mesh(); for (int i = 0; i < W; i++) { for (int j = 0; j < H; j++) { if (!Net.latticeTopology) { RhinoMesh.Vertices.Add(new Point3d(Net.columnX[i][j], Net.columnY[i][j], Net.columnZ[i][j])); } else { RhinoMesh.Vertices.Add(new Point3d(Net.hexagonalX[i][j], Net.hexagonalY[i][j], Net.hexagonalZ[i][j])); } } } int pointCount = H * W; if (!Net.latticeTopology) // quad mesh { #region quad mesh if (!Net.isCircularRows && !Net.isCircularColumns) // no circular rows or columns { for (int i = 0; i < pointCount; i++) { if (i % H != H - 1 && !(i > pointCount - H - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1, i + H); } } } if (!Net.isCircularRows && Net.isCircularColumns) // circular columns but no circular rows { for (int i = 0; i < pointCount; i++) { if (i % H != H - 1 && !(i > pointCount - H - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1, i + H); } else { if (!(i > pointCount - H - 1)) { RhinoMesh.Faces.AddFace(i, i - (H - 1), i + 1, i + H); } } } } if (Net.isCircularRows && !Net.isCircularColumns) // no circular columns but circular rows { for (int i = 0; i < pointCount; i++) { if (i % H != H - 1 && !(i > pointCount - H - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1, i + H); } else { if (i > (pointCount - H - 1) && !(i == pointCount - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, (i + 1) - (H * (W - 1)), i - (H * (W - 1))); } } } } if (Net.isCircularRows && Net.isCircularColumns) // circular rows and circular columns { for (int i = 0; i < pointCount; i++) { if (i % H != H - 1 && !(i > pointCount - H - 1)) // if is not in upper or left side { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1, i + H); } else { if (!(i > pointCount - H - 1)) { RhinoMesh.Faces.AddFace(i, i - (H - 1), i + 1, i + H); } //if is in upper corner if (i > (pointCount - H - 1) && !(i == pointCount - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, (i + 1) - (H * (W - 1)), i - (H * (W - 1))); } // if is in left side if (i == pointCount - 1) { RhinoMesh.Faces.AddFace(i, i - H + 1, 0, H - 1); } } } } #endregion } else // tri mesh { #region tri mesh //int o = 1; //flip orientation with 0 and 1 if (!Net.isCircularRows && !Net.isCircularColumns) // no circular rows or columns { for (int i = 0; i < pointCount; i++) { if (i % H != H - 1 && !(i > pointCount - 2 * H - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1, i + H); } } } if (!Net.isCircularRows && Net.isCircularColumns) // circular columns but no circular rows { for (int w = 0; w < W; w++) { for (int h = 0; h < H; h++) { int i = w * H + h; if (i < pointCount - 2 * H - 1) { if (h % 2 == 0) { if (h != H - 1) { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1); RhinoMesh.Faces.AddFace(i, i + H + 1, i + H); } else { RhinoMesh.Faces.AddFace(i, i + 1, i + H); RhinoMesh.Faces.AddFace(i + 1, i + H + 1, i + H); } } else { RhinoMesh.Faces.AddFace(i, i + 1, i + H); RhinoMesh.Faces.AddFace(i + 1, i + H + 1, i + H); } } } } } if (Net.isCircularRows && !Net.isCircularColumns) // no circular columns but circular rows { for (int i = 0; i < pointCount; i++) { if (i % H != H - 1 && !(i > pointCount - H - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1, i + H); } else { if (i > (pointCount - H - 1) && !(i == pointCount - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, (i + 1) - (H * (W - 1)), i - (H * (W - 1))); } } } } if (Net.isCircularRows && Net.isCircularColumns) // circular rows and circular columns { for (int i = 0; i < pointCount; i++) { if (i % H != H - 1 && !(i > pointCount - H - 1)) // if is not in upper or left side { RhinoMesh.Faces.AddFace(i, i + 1, i + H + 1, i + H); } else { if (!(i > pointCount - H - 1)) { RhinoMesh.Faces.AddFace(i, i - (H - 1), i + 1, i + H); } //if is in upper corner if (i > (pointCount - H - 1) && !(i == pointCount - 1)) { RhinoMesh.Faces.AddFace(i, i + 1, (i + 1) - (H * (W - 1)), i - (H * (W - 1))); } // if is in left side if (i == pointCount - 1) { RhinoMesh.Faces.AddFace(i, i - H + 1, 0, H - 1); } } } } #endregion } CMesh.CastFrom(RhinoMesh); DA.SetData(0, CMesh); }