예제 #1
0
        /// <summary>
        /// Fill sheet rows for Component sheet
        /// </summary>
        /// <returns>COBieSheet</returns>
        public override COBieSheet <COBieComponentRow> Fill()
        {
#if DEBUG
            Stopwatch timer = new Stopwatch();
            timer.Start();
#endif
            ProgressIndicator.ReportMessage("Starting Components...");
            //Create new sheet
            COBieSheet <COBieComponentRow> components = new COBieSheet <COBieComponentRow>(Constants.WORKSHEET_COMPONENT);



            IEnumerable <IfcRelAggregates> relAggregates = Model.FederatedInstances.OfType <IfcRelAggregates>();
            IEnumerable <IfcRelContainedInSpatialStructure> relSpatial = Model.FederatedInstances.OfType <IfcRelContainedInSpatialStructure>();

            IEnumerable <IfcObject> ifcElements = ((from x in relAggregates
                                                    from y in x.RelatedObjects
                                                    where !Context.Exclude.ObjectType.Component.Contains(y.GetType())
                                                    select y).Union(from x in relSpatial
                                                                    from y in x.RelatedElements
                                                                    where !Context.Exclude.ObjectType.Component.Contains(y.GetType())
                                                                    select y)).OfType <IfcObject>(); //.GroupBy(el => el.Name).Select(g => g.First())//.Distinct().ToList();

            COBieDataPropertySetValues allPropertyValues = new COBieDataPropertySetValues();         //properties helper class
            COBieDataAttributeBuilder  attributeBuilder  = new COBieDataAttributeBuilder(Context, allPropertyValues);
            attributeBuilder.InitialiseAttributes(ref _attributes);
            //set up filters on COBieDataPropertySetValues for the SetAttributes only
            attributeBuilder.ExcludeAttributePropertyNames.AddRange(Context.Exclude.Component.AttributesEqualTo);         //we do not want listed properties for the attribute sheet so filter them out
            attributeBuilder.ExcludeAttributePropertyNamesWildcard.AddRange(Context.Exclude.Component.AttributesContain); //we do not want listed properties for the attribute sheet so filter them out
            attributeBuilder.RowParameters["Sheet"] = "Component";


            ProgressIndicator.Initialise("Creating Components", ifcElements.Count());

            foreach (var obj in ifcElements)
            {
                ProgressIndicator.IncrementAndUpdate();

                COBieComponentRow component = new COBieComponentRow(components);

                IfcElement el = obj as IfcElement;
                if (el == null)
                {
                    continue;
                }
                string name = el.Name.ToString();
                if (string.IsNullOrEmpty(name))
                {
                    name = "Name Unknown " + UnknownCount.ToString();
                    UnknownCount++;
                }
                //set allPropertyValues to this element
                allPropertyValues.SetAllPropertyValues(el); //set the internal filtered IfcPropertySingleValues List in allPropertyValues
                component.Name = name;

                string createBy = allPropertyValues.GetPropertySingleValueValue("COBieCreatedBy", false);  //support for COBie Toolkit for Autodesk Revit
                component.CreatedBy = ValidateString(createBy) ? createBy : GetTelecomEmailAddress(el.OwnerHistory);
                string createdOn = allPropertyValues.GetPropertySingleValueValue("COBieCreatedOn", false); //support for COBie Toolkit for Autodesk Revit
                component.CreatedOn = ValidateString(createdOn) ?  createdOn : GetCreatedOnDateAsFmtString(el.OwnerHistory);

                component.TypeName = GetTypeName(el);
                component.Space    = COBieHelpers.GetComponentRelatedSpace(el, Model, SpaceBoundingBoxInfo, Context);
                string description = allPropertyValues.GetPropertySingleValueValue("COBieDescription", false); //support for COBie Toolkit for Autodesk Revit
                component.Description = ValidateString(description) ? description : GetComponentDescription(el);
                string extSystem = allPropertyValues.GetPropertySingleValueValue("COBieExtSystem", false);     //support for COBie Toolkit for Autodesk Revit
                component.ExtSystem     = ValidateString(extSystem) ? extSystem : GetExternalSystem(el);
                component.ExtObject     = el.GetType().Name;
                component.ExtIdentifier = el.GlobalId;

                //set from PropertySingleValues filtered via candidateProperties
                //set the internal filtered IfcPropertySingleValues List in allPropertyValues to this element set above
                component.SerialNumber      = allPropertyValues.GetPropertySingleValueValue("SerialNumber", false);
                component.InstallationDate  = GetDateFromProperty(allPropertyValues, "InstallationDate");
                component.WarrantyStartDate = GetDateFromProperty(allPropertyValues, "WarrantyStartDate");
                component.TagNumber         = allPropertyValues.GetPropertySingleValueValue("TagNumber", false);
                component.BarCode           = allPropertyValues.GetPropertySingleValueValue("BarCode", false);
                component.AssetIdentifier   = allPropertyValues.GetPropertySingleValueValue("AssetIdentifier", false);

                components.AddRow(component);

                //fill in the attribute information
                attributeBuilder.RowParameters["Name"]      = component.Name;
                attributeBuilder.RowParameters["CreatedBy"] = component.CreatedBy;
                attributeBuilder.RowParameters["CreatedOn"] = component.CreatedOn;
                attributeBuilder.RowParameters["ExtSystem"] = component.ExtSystem;
                attributeBuilder.PopulateAttributesRows(el); //fill attribute sheet rows
            }

            components.OrderBy(s => s.Name);

            ProgressIndicator.Finalise();
#if DEBUG
            timer.Stop();
            Console.WriteLine("Time to generate Component data = {0} seconds", timer.Elapsed.TotalSeconds.ToString("F3"));
#endif


            return(components);
        }
예제 #2
0
        /// <summary>
        /// Fill sheet rows for Issue sheet
        /// </summary>
        /// <returns>COBieSheet</returns>
        public override COBieSheet <COBieIssueRow> Fill()
        {
            ProgressIndicator.ReportMessage("Starting Issues...");
            var ifcProject = Model.Instances.FirstOrDefault <IIfcProject>();

            Debug.Assert(ifcProject != null);

            //create new sheet
            var issues = new COBieSheet <COBieIssueRow>(Constants.WORKSHEET_ISSUE);

            //IEnumerable<IfcPropertySet> ifcProperties = Model.FederatedInstances.OfType<IfcPropertySet>().Where(ps => ps.Name.ToString() == "Pset_Risk");

            #region IFcApproval
            // get all IfcApproval objects from IFC file
            IEnumerable <IfcApproval> ifcApprovals = Model.FederatedInstances.OfType <IfcApproval>();
            ProgressIndicator.Initialise("Creating Issues (from IfcApprovals)", ifcApprovals.Count());

            List <IfcRelAssociatesApproval> ifcRelAssociatesApprovals = Model.FederatedInstances.OfType <IfcRelAssociatesApproval>().ToList();

            foreach (IfcApproval ifcApproval in ifcApprovals)
            {
                ProgressIndicator.IncrementAndUpdate();
                COBieIssueRow issue = new COBieIssueRow(issues);
                //get the associated property setIfcPropertySet
                var ifcPropertySet = ifcRelAssociatesApprovals
                                     .Where(ral => ral.RelatingApproval == ifcApproval)
                                     .SelectMany(ral => ral.RelatedObjects.OfType <IfcPropertySet>())
                                     .Where(ps => ps.Name == "Pset_Risk")
                                     .FirstOrDefault();

                List <IfcSimpleProperty> propertyList = new List <IfcSimpleProperty>();
                if (ifcPropertySet != null)
                {
                    propertyList = ifcPropertySet.HasProperties.OfType <IfcSimpleProperty>().ToList();
                }

                issue.Name = (string.IsNullOrEmpty(ifcApproval.Name)) ? DEFAULT_STRING : ifcApproval.Name.ToString();

                //lets default the creator to that user who created the project for now, no direct link to OwnerHistory on IfcApproval
                if (ifcPropertySet != null)
                {
                    //use "Pset_Risk" Property Set as source for this
                    issue.CreatedBy = GetTelecomEmailAddress(ifcPropertySet.OwnerHistory);
                    issue.CreatedOn = GetCreatedOnDateAsFmtString(ifcPropertySet.OwnerHistory);
                }
                else
                {
                    //if property set is null use project defaults
                    issue.CreatedBy = GetTelecomEmailAddress(ifcProject.OwnerHistory);
                    issue.CreatedOn = GetCreatedOnDateAsFmtString(ifcProject.OwnerHistory);
                }
                Interval propValues = GetPropertyEnumValue(propertyList, "RiskType");
                issue.Type = propValues.Value;

                propValues = GetPropertyEnumValue(propertyList, "RiskRating");
                issue.Risk = propValues.Value;

                propValues   = GetPropertyEnumValue(propertyList, "AssessmentOfRisk");
                issue.Chance = propValues.Value;

                propValues   = GetPropertyEnumValue(propertyList, "RiskConsequence");
                issue.Impact = propValues.Value;
                //GetIt(typeof(IfcApproval));
                //Risk assessment has to be on a task so we should have one
                List <IfcRoot> IfcRoots = GetIfcObjects(ifcApproval);
                issue.SheetName1 = (IfcRoots.Count > 0) ? GetSheetByObjectType(IfcRoots[0].GetType()) : DEFAULT_STRING;
                issue.RowName1   = (IfcRoots.Count > 0) ? IfcRoots[0].Name.ToString() : DEFAULT_STRING;

                //assuming that this row is a person associated with the ifcApproval, but might be a task
                string email = GetContact(ifcApproval);
                if (email == DEFAULT_STRING) //if no email, see if we have another ifcobject
                {
                    issue.SheetName2 = (IfcRoots.Count > 1) ? GetSheetByObjectType(IfcRoots[1].GetType()) : DEFAULT_STRING;
                    issue.RowName2   = (IfcRoots.Count > 1) ? IfcRoots[1].Name.ToString() : DEFAULT_STRING;
                }
                else
                {
                    issue.SheetName2 = (email != DEFAULT_STRING) ? Constants.WORKSHEET_CONTACT : DEFAULT_STRING;
                    issue.RowName2   = (email != DEFAULT_STRING) ? email : DEFAULT_STRING;
                }

                issue.Description = (string.IsNullOrEmpty(ifcApproval.Description.ToString())) ? DEFAULT_STRING : ifcApproval.Description.ToString();

                propValues  = GetPropertyEnumValue(propertyList, "RiskOwner");
                issue.Owner = propValues.Value;

                propValues       = GetPropertyValue(propertyList, "PreventiveMeasures");
                issue.Mitigation = propValues.Value;

                issue.ExtSystem     = (ifcPropertySet != null) ? GetExternalSystem(ifcPropertySet) : DEFAULT_STRING;
                issue.ExtObject     = ifcApproval.GetType().Name;
                issue.ExtIdentifier = ifcApproval.Identifier.ToString();

                issues.AddRow(issue);
            }
            ProgressIndicator.Finalise();
            #endregion

            #region HS_Risk_UK
            // get all HS_Risk_UK Issues
            IEnumerable <IfcPropertySet> ifcProperties = Model.FederatedInstances.OfType <IfcPropertySet>().Where(ps => ps.Name.ToString() == "HS_Risk_UK");

            ProgressIndicator.Initialise("Creating Issues (from HS_Risk_UK psets)", ifcProperties.Count());

            foreach (IfcPropertySet propSet in ifcProperties)
            {
                ProgressIndicator.IncrementAndUpdate();

                COBieIssueRow            issue          = new COBieIssueRow(issues);
                List <IfcSimpleProperty> HSpropertyList = propSet.HasProperties.OfType <IfcSimpleProperty>().ToList();

                Interval propValues = GetPropertyValue(HSpropertyList, "RiskName");
                issue.Name = (propValues.Value == DEFAULT_STRING) ? propSet.Name.ToString() : propValues.Value.ToString();

                //
                //lets default the creator to that user who created the project for now, no direct link to OwnerHistory on IfcApproval
                if (propSet != null)
                {
                    //use "Pset_Risk" Property Set as source for this
                    issue.CreatedBy = GetTelecomEmailAddress(propSet.OwnerHistory);
                    issue.CreatedOn = GetCreatedOnDateAsFmtString(propSet.OwnerHistory);
                }
                else
                {
                    //if property set is null use project defaults
                    issue.CreatedBy = GetTelecomEmailAddress(ifcProject.OwnerHistory);
                    issue.CreatedOn = GetCreatedOnDateAsFmtString(ifcProject.OwnerHistory);
                }

                propValues = GetPropertyValue(HSpropertyList, "RiskCategory");
                issue.Type = propValues.Value;

                propValues = GetPropertyValue(HSpropertyList, "LevelOfRisk");
                issue.Risk = propValues.Value;

                propValues   = GetPropertyValue(HSpropertyList, "RiskLikelihood");
                issue.Chance = propValues.Value;

                propValues   = GetPropertyValue(HSpropertyList, "RiskConsequence");
                issue.Impact = propValues.Value;


                //TODO: We need to extend the functionality here as right now we make some assumptions:
                //1. The Issue SheetName1/RowName1 refers to a Component attached to the property set (it could be something else)
                //2. The component has an associated space, which makes up Sheetname2/Rowname2
                IfcRoot ifcRoot = GetAssociatedObject(propSet);
                issue.SheetName1 = GetSheetByObjectType(ifcRoot.GetType());
                issue.RowName1   = (!string.IsNullOrEmpty(ifcRoot.Name.ToString())) ? ifcRoot.Name.ToString() : DEFAULT_STRING;

                var SpaceBoundingBoxInfo = new List <SpaceInfo>();
                issue.RowName2   = COBieHelpers.GetComponentRelatedSpace(ifcRoot as IfcElement, Model, SpaceBoundingBoxInfo, Context);
                issue.SheetName2 = "Space";
                //End TODO

                propValues        = GetPropertyValue(HSpropertyList, "RiskDescription");
                issue.Description = (propValues.Value == DEFAULT_STRING) ? propSet.Name.ToString() : propValues.Value.ToString();

                propValues  = GetPropertyValue(HSpropertyList, "OwnerDiscipline");
                issue.Owner = propValues.Value;

                propValues       = GetPropertyValue(HSpropertyList, "AgreedMitigation");
                issue.Mitigation = propValues.Value;

                issue.ExtSystem     = (propSet != null) ? GetExternalSystem(propSet) : DEFAULT_STRING;
                issue.ExtObject     = "HS_Risk_UK";
                issue.ExtIdentifier = propSet.GlobalId.ToString();//ifcApproval.Identifier.ToString();
                //

                issues.AddRow(issue);
            }

            issues.OrderBy(s => s.Name);

            ProgressIndicator.Finalise();
            #endregion

            #region PSet_Risk
            // get all PSet_Risk issues
            ifcProperties = Model.FederatedInstances.OfType <IfcPropertySet>().Where(ps => ps.Name.ToString() == "PSet_Risk");

            ProgressIndicator.Initialise("Creating Issues (from PSet_Risk)", ifcProperties.Count());

            foreach (IfcPropertySet propSet in ifcProperties)
            {
                ProgressIndicator.IncrementAndUpdate();

                COBieIssueRow            issue            = new COBieIssueRow(issues);
                List <IfcSimpleProperty> RiskpropertyList = propSet.HasProperties.OfType <IfcSimpleProperty>().ToList();

                Interval propValues = GetPropertyValue(RiskpropertyList, "RiskName");
                issue.Name = (propValues.Value == DEFAULT_STRING) ? propSet.Name.ToString() : propValues.Value.ToString();

                //TODO: Fill in the rest of these properties

                issues.AddRow(issue);
            }
            ProgressIndicator.Finalise();
            #endregion

            issues.OrderBy(s => s.Name);
            return(issues);
        }