protected override void TrySolveInstance(IGH_DataAccess dataAccess) { int index = -1; Document document = RhinoInside.Revit.Revit.ActiveDBDocument; if (document == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } Core.SAMObject sAMObject = null; index = Params.IndexOfInputParam("_analytical"); if (index == -1 || !dataAccess.GetData(index, ref sAMObject)) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } List <Panel> panels = null; if (sAMObject is Panel) { panels = new List <Panel>() { (Panel)sAMObject }; } else if (sAMObject is AdjacencyCluster) { panels = ((AdjacencyCluster)sAMObject).GetPanels(); } else if (sAMObject is AnalyticalModel) { panels = ((AnalyticalModel)sAMObject).GetPanels(); } if (panels == null || panels.Count == 0) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Invalid data"); return; } StartTransaction(document); List <ElementType> elementTypes = new List <ElementType>(); for (int i = 0; i < panels.Count; i++) { Panel panel = panels[i]; if (panel == null) { continue; } Geometry.Spatial.Vector3D normal = panel.Normal; PanelType panelType = panel.PanelType; if (panelType == PanelType.Air || panelType == PanelType.Undefined) { panels[i] = Create.Panel(panel); ElementType elementType = Analytical.Revit.Convert.ToRevit_HostObjAttributes(panel, document, new Core.Revit.ConvertSettings(false, true, false)); if (elementType != null && elementTypes.Find(x => x.Id == elementType.Id) == null) { elementTypes.Add(elementType); } continue; } PanelType panelType_Normal = Analytical.Revit.Query.PanelType(normal); if (panelType_Normal == PanelType.Undefined || panelType.PanelGroup() == panelType_Normal.PanelGroup()) { panels[i] = Create.Panel(panel); ElementType elementType = Analytical.Revit.Convert.ToRevit_HostObjAttributes(panel, document, new Core.Revit.ConvertSettings(false, true, false)); if (elementType != null && elementTypes.Find(x => x.Id == elementType.Id) == null) { elementTypes.Add(elementType); } continue; } if (panelType.PanelGroup() == PanelGroup.Floor || panelType.PanelGroup() == PanelGroup.Roof) { double value = normal.Unit.DotProduct(Geometry.Spatial.Vector3D.WorldY); if (Math.Abs(value) <= Core.Revit.Tolerance.Tilt) { panels[i] = Create.Panel(panel); ElementType elementType = Analytical.Revit.Convert.ToRevit_HostObjAttributes(panel, document, new Core.Revit.ConvertSettings(false, true, false)); if (elementType != null && elementTypes.Find(x => x.Id == elementType.Id) == null) { elementTypes.Add(elementType); } continue; } } HostObjAttributes hostObjAttributes = Analytical.Revit.Modify.DuplicateByType(document, panelType_Normal, panel.Construction) as HostObjAttributes; if (hostObjAttributes == null) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, string.Format("Skipped - Could not duplicate construction for {0} panel (Guid: {1}).", panel.Name, panel.Guid)); continue; } panels[i] = Create.Panel(panel, panelType_Normal); if (elementTypes.Find(x => x.Id == hostObjAttributes.Id) == null) { elementTypes.Add(hostObjAttributes); } } int index_Analytical = Params.IndexOfOutputParam("analytical"); if (index_Analytical != -1) { if (sAMObject is Panel) { dataAccess.SetData(index_Analytical, panels?.FirstOrDefault()); } else if (sAMObject is AnalyticalModel) { AnalyticalModel analyticalModel = new AnalyticalModel((AnalyticalModel)sAMObject); panels.ForEach(x => analyticalModel.AddPanel(x)); dataAccess.SetData(index_Analytical, analyticalModel); } else if (sAMObject is AdjacencyCluster) { AdjacencyCluster adjacencyCluster = new AdjacencyCluster((AdjacencyCluster)sAMObject); panels.ForEach(x => adjacencyCluster.AddObject(x)); dataAccess.SetData(index_Analytical, adjacencyCluster); } } int index_ElementType = Params.IndexOfOutputParam("elementType"); if (index_ElementType != -1) { dataAccess.SetDataList(index_ElementType, elementTypes); } }