示例#1
0
        private List <Room> HandleSync()
        {
            using (ProgressDialog pd = new ProgressDialog("Sync", 6))
            {
                pd.Show();
                List <Room> syncedRooms = new List <Room>();

                // get current revit rooms
                pd.StartTask("Collecting Revit rooms");
                IList <Element> collectedRooms = RevitMethods.GetElements(
                    _doc,
                    BuiltInCategory.OST_Rooms);
                if (collectedRooms == null)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // get items from SP list
                pd.StartTask("Fetching Sharepoint data");
                SP.ListItemCollection allSpRooms = GetItemsFromSharepointList(
                    SharepointConstants.Links.spReadList,
                    SharepointConstants.Views.allItems);
                if (allSpRooms == null)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // filter by current project
                pd.StartTask("Retrieving rooms from current project");
                IEnumerable <SP.ListItem> spRooms = SharepointMethods.GetItems(
                    allSpRooms,
                    SharepointConstants.ColumnHeaders.project_id,
                    _project[SharepointConstants.ColumnHeaders.ID].ToString());
                if (spRooms == null)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // get the latest phase
                pd.StartTask("Getting latest Revit phase");
                Phase latestPhase = RevitMethods.GetLatestPhase(_doc);
                if (latestPhase == null)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // check if room parameters exist
                pd.StartTask("Checking Revit parameters");
                bool roomParamsExist = RevitMethods.CheckParametersExist(
                    collectedRooms,
                    SharepointConstants.Dictionaries.newRevitRoomParameters);
                pd.Increment();

                // if they don't exist
                if (!roomParamsExist)
                {
                    // make new parameters
                    Dictionary <string, ExternalDefinition> roomParametersCreated = RevitMethods.CreateSharedParameters(
                        _doc,
                        _app,
                        SharepointConstants.Dictionaries.newRevitRoomParameters,
                        BuiltInCategory.OST_Rooms,
                        BuiltInParameterGroup.PG_REFERENCE);
                    if (roomParametersCreated == null)
                    {
                        pd.Close();
                        return(null);
                    }

                    // generate the rooms
                    pd.StartTask("Creating revit rooms");
                    syncedRooms = RevitMethods.CreateRooms(
                        _doc,
                        latestPhase,
                        spRooms,
                        roomParametersCreated);
                    pd.Increment();
                }
                else
                {
                    // sync the existing rooms
                    pd.StartTask("Syncing revit rooms");
                    syncedRooms = RevitMethods.UpdateRooms(
                        _doc,
                        latestPhase,
                        collectedRooms,
                        spRooms,
                        SharepointConstants.Dictionaries.newRevitRoomParameters);
                    pd.Increment();
                }
                return(syncedRooms);
            }
        }
示例#2
0
        private List <Dictionary <string, string> > HandleUpload()
        {
            using (ProgressDialog pd = new ProgressDialog("Upload", 5))
            {
                pd.Show();
                // collect rooms from the model, return false if there are none
                pd.StartTask("Collecting placed rooms");
                IList <SpatialElement> placedRooms = RevitMethods.GetPlacedRooms(_doc);
                if (placedRooms == null)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // check if the custom room parameters exist
                pd.StartTask("Checking room parameters");
                bool roomParametersCheck = RevitMethods.CheckParametersExist(
                    placedRooms,
                    SharepointConstants.Dictionaries.newRevitRoomParameters);
                if (roomParametersCheck == false)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // collect the room info for writing to sharepoint
                pd.StartTask("Parsing room data");
                List <Dictionary <string, string> > placedRoomsData = RevitMethods.ParseRoomData(
                    placedRooms,
                    SharepointConstants.Dictionaries.newRevitRoomParameters);
                if (placedRoomsData == null)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // retrieve write list from sharepoint
                pd.StartTask("Connecting to Sharepoint");
                SP.List SPWriteList = SharepointMethods.GetListFromWeb(
                    _context,
                    SharepointConstants.Links.spWriteList);
                if (SPWriteList == null)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // write the room data to the write list
                pd.StartTask("Writing data to Sharepoint");
                bool roomsUploaded = SharepointMethods.AddItemsToList(
                    _context,
                    SPWriteList,
                    placedRoomsData);
                if (roomsUploaded == false)
                {
                    pd.Close();
                    return(null);
                }
                pd.Increment();

                // if we get to the end then return the written data
                return(placedRoomsData);
            }
        }
示例#3
0
        /// <summary>
        /// Collects model metrics and returns a dictionary
        /// </summary>
        /// <param name="doc">The active document</param>
        /// <returns>Dictionary</returns>
        public Dictionary <string, object> CollectModelData(Document doc, Application app)
        {
            /*
             * the basic strategy is to use filtered element collectors to collect the relevant data.
             * some helper functions are defined in order to collect more complicated metrics that require the use of several element collectors.
             * examples: unused elements and redundant elements require helper functions
             */

            IList <FailureMessage> warnings  = doc.GetWarnings();
            IList <Element>        linkedRVT = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_RvtLinks).WhereElementIsNotElementType().ToList();
            Dictionary <string, IList <Element> > nonRvtLinks = RevitMethods.NonRVTLinkCollector(doc);
            IList <Element>        linkedCAD            = nonRvtLinks[RevitConstants.Strings.linkedCAD];
            IList <Element>        importedCAD          = nonRvtLinks[RevitConstants.Strings.importedCAD];
            IList <Element>        importedSKP          = nonRvtLinks[RevitConstants.Strings.importedSKP];
            IList <Element>        raster               = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_RasterImages).WhereElementIsNotElementType().ToList();
            IList <Element>        sheets               = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Sheets).WhereElementIsNotElementType().ToList();
            IList <View>           views                = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Views).Cast <View>().Where(v => !v.IsTemplate).ToList();
            IList <View>           unplacedViews        = RevitMethods.UnplacedViewCollector(doc, sheets);
            IList <Element>        modelGroups          = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_IOSModelGroups).WhereElementIsNotElementType().ToList();
            IList <Element>        detailGroups         = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_IOSDetailGroups).WhereElementIsNotElementType().ToList();
            IList <Family>         inPlaceFamilies      = new FilteredElementCollector(doc).OfClass(typeof(Family)).Cast <Family>().Where(f => f.IsInPlace).ToList();
            IList <Element>        designOptionElements = new FilteredElementCollector(doc).WhereElementIsNotElementType().Where(e => e.DesignOption != null).ToList();
            IList <Workset>        worksets             = new FilteredWorksetCollector(doc).OfKind(WorksetKind.UserWorkset).ToList();
            IList <Element>        rooms                = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).WhereElementIsNotElementType().ToList();
            IList <SpatialElement> unplacedRooms        = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).WhereElementIsNotElementType().Cast <SpatialElement>().Where(r => r.Area == 0 && r.Location == null).ToList();
            IList <SpatialElement> redundantRooms       = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).WhereElementIsNotElementType().Cast <SpatialElement>().Where(r => r.Area == 0 && r.Location != null).ToList();
            IList <Element>        redundantElements    = RevitMethods.RedundantElementsCollector(warnings, doc);
            int unusedElements = unplacedViews.Count + unplacedRooms.Count + RevitMethods.UnusedFamiliesCollector(doc).Count;

            // collect model specific information
            (string writeDate, string writeTime) = UtilityMethods.FormatDateTime();
            (string modelPath, string modelName, string modelSize) = RevitMethods.GetModelInfo(doc);
            string versionBuild = app.VersionBuild;

            // save collected data in a dictionary
            Dictionary <string, object> modelMetrics = new Dictionary <string, object>()
            {
                { "Model Name", modelName },
                { "Model Path", modelPath },
                { "Model Size", modelSize },
                { "Warnings", warnings },
                { "Linked RVT Files", linkedRVT },
                { "Linked CAD Files", linkedCAD },
                { "Imported CAD Files", importedCAD },
                { "Imported SKP Files", importedSKP },
                { "Raster Images", raster },
                { "Sheets", sheets },
                { "Views", views },
                { "Unplaced Views", unplacedViews },
                { "Model Groups", modelGroups },
                { "Detail Groups", detailGroups },
                { "In-place Families", inPlaceFamilies },
                { "Elements in Design Options", designOptionElements },
                { "Worksets", worksets },
                { "Rooms", rooms },
                { "Unplaced Rooms", unplacedRooms },
                { "Redundant and Unenclosed Rooms", redundantRooms },
                { "Redundant Elements", redundantElements },
                { "Unused Elements", unusedElements },
                { "Write Date", writeDate },
                { "Write Time", writeTime },
                { "Version Build", versionBuild },
            };

            return(modelMetrics);
        }