Ejemplo n.º 1
0
        /// <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
        }