/// <summary> /// Convert Polygons to a list of curveloops /// </summary> public CurveLoops PolygonsToCurveLoops(Polygons polygons) { CurveLoops curveLoops = new CurveLoops(); foreach (Polygon polygon in polygons) { ProcessPolygon processedPolygon = new ProcessPolygon(this.Polygon2XYZList(polygon, 0.0, this.Exponent), true); processedPolygon.RemoveIdenticalPoints(); processedPolygon.RemoveClosePoints(.5); processedPolygon.ForceToFixList(); processedPolygon.RemoveCollinearity(4 * Math.PI / 180); if (processedPolygon.ProcessedPolygon.Count > 2) { curveLoops.Add(processedPolygon.Get_CurveLoop()); } } return(curveLoops); }
public DataToBuilding(Document doc, List <Building> buildings, ElementId topographyID, string documentFileAddress = "") { this.DocumentFileAddress = documentFileAddress; this.opt.OverwriteExistingFile = true; List <double> bldgHeight = new List <double>(); _doc = doc; this.TopographyID = topographyID; using (Transaction createBuildingPadType = new Transaction(_doc)) { createBuildingPadType.Start("Create Building Pad Type"); this.buildingPadType = BuildingPadType.CreateDefault(_doc); createBuildingPadType.Commit(); } this.FailedAttemptsToCreateBuildingPads = 0; this.FailedAttemptsToCreateBuildings = 0; #region pre-process the contour lines List <ProcessPolygon> ProcessedFootPrints = new List <ProcessPolygon>(); this.RayTracerView = this.createView3d(); foreach (Building building in buildings) { ProcessPolygon processedContour = new ProcessPolygon(building.vertices); processedContour.Flatten(); processedContour.RemoveIdenticalPoints(); processedContour.RemoveClosePoints(.5); processedContour.RemoveCollinearity(); processedContour.ForceToFixList(); bldgHeight.Add(building.height); ProcessedFootPrints.Add(processedContour); } this.BuildingFootPrints = ProcessedFootPrints; #endregion #region Create building Masses ad independent families this.FamilyTemplateAddress = this.familyTemplateAddress(); List <double> elevations = new List <double>(); for (int i = 0; i < this.BuildingFootPrints.Count; i++) { elevations.Add(this.FindBuildingElevation(this.BuildingFootPrints[i])); } //Finding a folder to save the buildings FolderBrowserDialog folderBrowser = new FolderBrowserDialog(); DialogResult result = folderBrowser.ShowDialog(); string folder = ""; if (result == DialogResult.OK) { folder = folderBrowser.SelectedPath; } //creating extrusions and saving them List <XYZ> translations = new List <XYZ>(); List <FamilySymbol> symbols = new List <FamilySymbol>(); List <int> footPrintIndices = new List <int>(); for (int i = 0; i < 5; i++) { if (elevations[i] != double.NaN && elevations[i] != -1) { string path = folder + @"\" + i.ToString() + ".rfa"; XYZ translation = XYZ.Zero; foreach (XYZ item in this.BuildingFootPrints[i].ProcessedPolygon) { translation += item; } translation /= this.BuildingFootPrints[i].ProcessedPolygon.Count; bool formCreated = CreateFamilyFile(this.BuildingFootPrints[i], bldgHeight[i], path, translation); if (formCreated) { using (Transaction placeFamily = new Transaction(_doc)) { FailureHandlingOptions failOpt = placeFamily.GetFailureHandlingOptions(); failOpt.SetFailuresPreprocessor(new WarningSwallower()); placeFamily.SetFailureHandlingOptions(failOpt); placeFamily.Start("Place a Mass"); Family family = null; _doc.LoadFamily(path, out family); FamilySymbol symbol = null; //foreach( FamilySymbol s in family.Symbols ) // 2014 foreach (ElementId id in family.GetFamilySymbolIds()) // 2015 { symbol = _doc.GetElement(id) as FamilySymbol; break; } symbols.Add(symbol); XYZ displacement = new XYZ(translation.X, translation.Y, elevations[i]); translations.Add(displacement); footPrintIndices.Add(i); placeFamily.Commit(); } } else { this.BuildingFootPrints[i].Visualize(_doc); } } } #endregion #region inserting a mass file for (int i = 0; i < translations.Count; i++) { using (Transaction placeMass = new Transaction(_doc)) { FailureHandlingOptions failOpt = placeMass.GetFailureHandlingOptions(); failOpt.SetFailuresPreprocessor(new WarningSwallower()); placeMass.SetFailureHandlingOptions(failOpt); placeMass.Start("Insert Mass"); try { FamilyInstance building = _doc.Create.NewFamilyInstance(XYZ.Zero, symbols[i], StructuralType.NonStructural); ElementTransformUtils.MoveElement(_doc, building.Id, translations[i]); this.BuildingMasses.Add(building); } catch (Exception) { this.FailedAttemptsToCreateBuildings++; } placeMass.Commit(); } } #endregion if (this.DocumentFileAddress != "") { _doc.SaveAs(this.DocumentFileAddress, this.opt); } #region creating building pads //for (int i = 0; i < footPrintIndices.Count; i++) //{ // Transaction CreatePads = new Transaction(_doc, "Create Building Pad"); // FailureHandlingOptions failOpt = CreatePads.GetFailureHandlingOptions(); // failOpt.SetFailuresPreprocessor(new WarningSwallower()); // CreatePads.SetFailureHandlingOptions(failOpt); // CreatePads.Start(); // try // { // Autodesk.Revit.DB.Architecture.BuildingPad pad = this.CreateBuildingPad(this.BuildingFootPrints[footPrintIndices[i]], elevations[footPrintIndices[i]]); // this.BuildingPads.Add(pad); // if (this.DocumentFileAddress != "") // { // _doc.SaveAs(this.DocumentFileAddress, this.opt); // } // } // catch (Exception) // { // this.FailedAttemptsToCreateBuildingPads++; // } // CreatePads.Commit(); //} #endregion }