//create building pads public Autodesk.Revit.DB.Architecture.BuildingPad CreateBuildingPad(ProcessPolygon polygon, double elevation) { Level level = _doc.Create.NewLevel(elevation); List <CurveLoop> listOfCurveLoops = new List <CurveLoop>(); listOfCurveLoops.Add(polygon.Get_CurveLoop()); return(Autodesk.Revit.DB.Architecture.BuildingPad.Create(_doc, this.buildingPadType.Id, level.Id, listOfCurveLoops)); }
public List <ElementId> Visualize(Document doc, Polygon polygon, double elevation, int exponent) { List <XYZ> points = new List <XYZ>(); points = this.Polygon2XYZList(polygon, elevation, exponent); ProcessPolygon processedContour = new ProcessPolygon(points, true); processedContour.LoadEdgeLengths(); //MessageBox.Show(string.Format("Minimum distance is {0} \n Maximum distance is {1}", processedContour.MinimumEdgeLength.ToString(), processedContour.MaximumEdgeLength.ToString())); return(processedContour.Visualize(doc)); }
/// <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 DataToTopography(Document document, List <List <XYZ> > contours, double interpolationLength = 10, double proximityTolerance = 5) { Dictionary <string, XYZ> dict = new Dictionary <string, XYZ>(); int counter = 0; foreach (List <XYZ> cntr in contours) { ProcessPolygon processedContour = new ProcessPolygon(cntr); processedContour.LoadEdgeLengths(); processedContour.RemoveClosePoints(proximityTolerance); processedContour.Interpolate(interpolationLength); processedContour.LoadEdgeLengths(); foreach (XYZ item in processedContour.ProcessedPolygon) { string key = item.X.ToString() + item.Y.ToString(); try { dict.Add(key, item); } catch (Exception) { //MessageBox.Show(er.Message); counter++; } } } this.NumberOfFailedPoints = counter; List <XYZ> pnts = new List <XYZ>(); foreach (var item in dict.Keys) { XYZ pn; if (dict.TryGetValue(item, out pn)) { pnts.Add(pn); } } using (Transaction createTopography = new Transaction(document)) { createTopography.Start("Create Topography"); this.Topography = TopographySurface.Create(document, pnts); createTopography.Commit(); } }
// finding building elevation public double FindBuildingElevation(ProcessPolygon polygon) { List <XYZ> heights = new List <XYZ>(); ReferenceIntersector refIntersector = new ReferenceIntersector(this.TopographyID, FindReferenceTarget.Mesh, this.RayTracerView); int counter = 0; double h = 0; foreach (XYZ item in polygon.ProcessedPolygon) { ReferenceWithContext referenceWithContext = refIntersector.FindNearest(item, XYZ.BasisZ); if (referenceWithContext != null) { counter++; h += referenceWithContext.Proximity; } else { return(-1); } } return(h / counter); }
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 }
//Create family for each building //http://thebuildingcoder.typepad.com/blog/2011/06/creating-and-inserting-an-extrusion-family.html private bool CreateFamilyFile(ProcessPolygon polygon, double height, string familyFileName, XYZ translation) { bool success = true; Document FamDoc = null; Autodesk.Revit.DB.Form form = null; using (Transaction CreateFamily = new Transaction(_doc)) { CreateFamily.Start("Create a new Family"); FamDoc = _doc.Application.NewFamilyDocument(this.FamilyTemplateAddress); CreateFamily.Commit(); } ReferenceArray refAr = polygon.Get_ReferenceArray(FamDoc, translation); using (Transaction CreateExtrusion = new Transaction(FamDoc)) { FailureHandlingOptions failOpt = CreateExtrusion.GetFailureHandlingOptions(); failOpt.SetFailuresPreprocessor(new WarningSwallower()); CreateExtrusion.SetFailureHandlingOptions(failOpt); CreateExtrusion.Start("Create Extrusion"); /*Mohammad took this out of try */ try { form = FamDoc.FamilyCreate.NewExtrusionForm(true, refAr, height * XYZ.BasisZ); } catch (Exception) { this.FailedAttemptsToCreateBuildings++; success = false; } CreateExtrusion.Commit(); } //Added by Mohammad using (Transaction AddParamTrans = new Transaction(FamDoc)) { AddParamTrans.Start("Add Parameter"); Autodesk.Revit.ApplicationServices.Application app = FamDoc.Application; View3D view3d = createView3d(); Dimension windowInsetDimension = null; FaceArray faces = new FaceArray(); if (form.IsSolid) { Options options = new Options(); options.ComputeReferences = true; //options.View = new Autodesk.Revit.DB.View(); //GeometryObjectArray geoArr = extrusion.get_Geometry(options).Objects; IEnumerator <GeometryObject> Objects = form.get_Geometry(options).GetEnumerator(); //foreach (GeometryObject geoObj in geoArr) while (Objects.MoveNext()) { GeometryObject geoObj = Objects.Current; if (geoObj is Solid) { Solid s = geoObj as Solid; foreach (Face fc in s.Faces) { //MessageBox.Show(fc.ComputeNormal(new UV(0, 0)).X.ToString() + "/n" + fc.ComputeNormal(new UV(0, 0)).Y.ToString() + "/n" + fc.ComputeNormal(new UV(0, 0)).Z.ToString()); if (Math.Round((fc.ComputeNormal(new UV(0, 0))).Z) == 1 || Math.Round((fc.ComputeNormal(new UV(0, 0))).Z) == -1) { faces.Append(fc); } } //************************************************************************************************************** //****************************Here is the Error ********************************************************************** //************************************************************************************************************************ //windowInsetDimension = AddDimension( FamDoc, view3d, faces.get_Item( 0 ), faces.get_Item( 1 ) ); View viewElevation = new FilteredElementCollector(FamDoc).OfClass(typeof(View)).Cast <View>().Where <View>(v => ViewType.Elevation == v.ViewType).FirstOrDefault <View>(); windowInsetDimension = AddDimension(FamDoc, viewElevation, faces.get_Item(0), faces.get_Item(1)); } } } //Test for creating dimension #region two lines creating dimenstion //// first create two lines //XYZ pt1 = new XYZ(5, 0, 5); //XYZ pt2 = new XYZ(5, 0, 10); //Line line = Line.CreateBound(pt1, pt2); //Plane plane = app.Create.NewPlane(pt1.CrossProduct(pt2), pt2); //SketchPlane skplane = SketchPlane.Create(FamDoc, plane); //ModelCurve modelcurve1 = FamDoc.FamilyCreate.NewModelCurve(line, skplane); //pt1 = new XYZ(10, 0, 5); //pt2 = new XYZ(10, 0, 10); //line = Line.CreateBound(pt1, pt2); //plane = app.Create.NewPlane(pt1.CrossProduct(pt2), pt2); //skplane = SketchPlane.Create(FamDoc, plane); //ModelCurve modelcurve2 = FamDoc.FamilyCreate.NewModelCurve(line, skplane); //// now create a linear dimension between them //ReferenceArray ra = new ReferenceArray(); //ra.Append(modelcurve1.GeometryCurve.Reference); //ra.Append(modelcurve2.GeometryCurve.Reference); //pt1 = new XYZ(5, 0, 10); //pt2 = new XYZ(10, 0, 10); //line = Line.CreateBound(pt1, pt2); //Dimension dim = FamDoc.FamilyCreate.NewLinearDimension(view3d, line, ra); #endregion //creates a prameter named index for each family. BuiltInParameterGroup paramGroup = (BuiltInParameterGroup)Enum.Parse(typeof(BuiltInParameterGroup), "PG_GENERAL"); ParameterType paramType = (ParameterType)Enum.Parse(typeof(ParameterType), "Length"); FamilyManager m_manager = FamDoc.FamilyManager; FamilyParameter famParam = m_manager.AddParameter("Height", paramGroup, paramType, true); //Set the value for the parameter if (m_manager.Types.Size == 0) { m_manager.NewType("Type 1"); } m_manager.Set(famParam, height); //connects dimension to lable called with //windowInsetDimension.FamilyLabel = famParam; AddParamTrans.Commit(); } SaveAsOptions opt = new SaveAsOptions(); opt.OverwriteExistingFile = true; FamDoc.SaveAs(familyFileName, opt); FamDoc.Close(false); return(success); }