Exemple #1
0
        /// <summary>
        /// Calculates net volume.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            double volumeEps = MathUtil.Eps() * MathUtil.Eps() * MathUtil.Eps();

            if ((ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Volume) != null) ||
                (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Volume) != null) ||
                (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "IfcQtyNetVolume", out m_Volume) != null))
            {
                m_Volume = UnitUtil.ScaleVolume(m_Volume);
                if (m_Volume > volumeEps)
                {
                    return(true);
                }
            }

            double vol = 0;
            SolidMeshGeometryInfo geomInfo = GeometryUtil.GetSolidMeshGeometry(element);

            if (geomInfo.SolidsCount() > 0)
            {
                for (int ii = 0; ii < geomInfo.SolidsCount(); ++ii)
                {
                    vol += geomInfo.GetSolids()[ii].Volume;
                }
            }

            if (geomInfo.MeshesCount() > 0)
            {
                for (int jj = 0; jj < geomInfo.MeshesCount(); ++jj)
                {
                    Mesh geomMesh      = geomInfo.GetMeshes()[jj];
                    XYZ  arbitraryOrig = geomMesh.Vertices[0];
                    for (int i = 0; i < geomMesh.NumTriangles; ++i)
                    {
                        MeshTriangle meshTri = geomMesh.get_Triangle(i);
                        XYZ          v1      = meshTri.get_Vertex(0) - arbitraryOrig;
                        XYZ          v2      = meshTri.get_Vertex(1) - arbitraryOrig;
                        XYZ          v3      = meshTri.get_Vertex(2) - arbitraryOrig;
                        vol += v1.DotProduct(v2.CrossProduct(v3)) / 6.0f;
                    }
                }
            }

            m_Volume = UnitUtil.ScaleVolume(vol);
            return(m_Volume > volumeEps);
        }
        /// <summary>
        /// Calculates the reference.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (ParameterUtil.GetStringValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_FireRating) == null)
            {
                if (ParameterUtil.GetStringValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_FireRating) == null)
                {
                    ParameterUtil.GetStringValueFromElementOrSymbol(element, "Fire Rating", out m_FireRating);
                }
            }
            if (!string.IsNullOrEmpty(m_FireRating))
            {
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Calculates the shape for a provision for void.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (extrusionCreationData == null)
            {
                return(false);
            }

            IFCAnyHandle provisionForVoidHnd = ExporterCacheManager.ElementToHandleCache.Find(element.Id);

            if (IFCAnyHandleUtil.IsNullOrHasNoValue(provisionForVoidHnd))
            {
                return(false);
            }

            IFCAnyHandle prodRepHnd = IFCAnyHandleUtil.GetInstanceAttribute(provisionForVoidHnd, "Representation");

            if (IFCAnyHandleUtil.IsNullOrHasNoValue(prodRepHnd))
            {
                return(false);
            }

            IList <IFCAnyHandle> repHnds = IFCAnyHandleUtil.GetRepresentations(prodRepHnd);

            foreach (IFCAnyHandle repHnd in repHnds)
            {
                string repId = IFCAnyHandleUtil.GetStringAttribute(repHnd, "RepresentationIdentifier");
                if (String.Compare(repId, "Body", true) != 0)
                {
                    continue;
                }

                string repType = IFCAnyHandleUtil.GetStringAttribute(repHnd, "RepresentationType");
                if (String.Compare(repType, "SweptSolid", true) != 0)
                {
                    return(false);
                }

                HashSet <IFCAnyHandle> repItemSet = IFCAnyHandleUtil.GetAggregateInstanceAttribute <HashSet <IFCAnyHandle> >(repHnd, "Items");
                int numRepItems = repItemSet.Count;
                if (numRepItems == 0)
                {
                    return(false);
                }

                if (numRepItems == 1)
                {
                    IFCAnyHandle repItemHnd = repItemSet.ElementAt(0);
                    if (!IFCAnyHandleUtil.IsSubTypeOf(repItemHnd, IFCEntityType.IfcExtrudedAreaSolid))
                    {
                        return(false);
                    }

                    IFCAnyHandle sweptAreaHnd = IFCAnyHandleUtil.GetInstanceAttribute(repItemHnd, "SweptArea");
                    if (IFCAnyHandleUtil.IsNullOrHasNoValue(sweptAreaHnd))
                    {
                        return(false);
                    }

                    m_CurrentProfileHandle = sweptAreaHnd;
                    if (IFCAnyHandleUtil.IsTypeOf(m_CurrentProfileHandle, IFCEntityType.IfcRectangleProfileDef))
                    {
                        m_Shape = IFCProvisionForVoidShapeType.Rectangle.ToString();
                    }
                    else if (IFCAnyHandleUtil.IsTypeOf(m_CurrentProfileHandle, IFCEntityType.IfcCircleProfileDef))
                    {
                        m_Shape = IFCProvisionForVoidShapeType.Round.ToString();
                    }
                }

                if (m_Shape == null)
                {
                    m_Shape = IFCProvisionForVoidShapeType.Undefined.ToString();
                    m_CurrentProfileHandle = null;
                }

                m_CurrentElement = element;
                return(true);
            }

            return(false);
        }
Exemple #4
0
        /// <summary>
        /// Calculates concealed value for a space.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>True if the operation succeed, false otherwise.</returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            int?concealedCeiling = ParameterUtil.GetIntValueFromElementOrSymbol(element, entryMap.RevitParameterName);

            if (!concealedCeiling.HasValue)
            {
                concealedCeiling = ParameterUtil.GetIntValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName);
            }
            if (!concealedCeiling.HasValue)
            {
                return(false);
            }

            Concealed = concealedCeiling.GetValueOrDefault(0) != 0;
            return(true);
        }
        /// <summary>
        /// Calculates external value for an element.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>True if the operation succeed, false otherwise.</returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            FabricParams fabricParams = null;

            if (!ExporterCacheManager.FabricParamsCache.TryGetValue(element?.Id, out fabricParams))
            {
                return(false);
            }

            LongitudinalBarSpacing = fabricParams.LongitudinalBarSpacing;
            return(true);
        }
        /// <summary>
        /// Calculates total area for a roof
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Area) == null)
            {
                ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Area);
            }
            if (m_Area > MathUtil.Eps() * MathUtil.Eps())
            {
                return(true);
            }

            m_Area = UnitUtil.ScaleArea(ExporterIFCUtils.ComputeRoofProjectedArea(element));
            return(m_Area > MathUtil.Eps() * MathUtil.Eps());
        }
        /// <summary>
        /// Calculates number of risers for a stair.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            bool valid = true;

            // Get override from parameter
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_WaistThickness) != null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_WaistThickness) != null)
                {
                    m_WaistThickness = UnitUtil.ScaleArea(m_WaistThickness);
                }
            }

            return(valid);
        }
Exemple #8
0
        /// <summary>
        /// Calculates the diameter of a provision for void.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Diameter) == null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Diameter) == null)
                {
                    ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "IfcQtyDiameter", out m_Diameter);
                }
            }
            m_Diameter = UnitUtil.ScaleLength(m_Diameter);
            if (m_Diameter > MathUtil.Eps() * MathUtil.Eps())
            {
                return(true);
            }

            if (extrusionCreationData == null)
            {
                return(false);
            }

            // For ProvisionForVoid
            ShapeCalculator shapeCalculator = ShapeCalculator.Instance;

            if (shapeCalculator != null && shapeCalculator.GetCurrentElement() == element)
            {
                if (String.Compare(shapeCalculator.GetStringValue(), IFCProvisionForVoidShapeType.Round.ToString()) == 0)
                {
                    m_Diameter = extrusionCreationData.ScaledOuterPerimeter / Math.PI;
                    if (m_Diameter > MathUtil.Eps())
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// Calculates number of risers for a stair.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>True if the operation succeed, false otherwise.</returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            bool valid = true;

            if (StairsExporter.IsLegacyStairs(element))
            {
                double riserHeight, treadLength, treadLengthAtInnerSide, nosingLength, waistThickness = 0;
                int    numberOfTreads;

                ExporterIFCUtils.GetLegacyStairsProperties(exporterIFC, element,
                                                           out m_NumberOfRisers, out numberOfTreads,
                                                           out riserHeight, out treadLength, out treadLengthAtInnerSide,
                                                           out nosingLength, out waistThickness);
            }
            else if (element is Stairs)
            {
                Stairs stairs = element as Stairs;
                m_NumberOfRisers = stairs.ActualRisersNumber;
            }
            else if (element is StairsRun)
            {
                StairsRun     stairsRun     = element as StairsRun;
                StairsRunType stairsRunType = stairsRun.Document.GetElement(stairsRun.GetTypeId()) as StairsRunType;
                m_NumberOfRisers = stairsRun.ActualRisersNumber;
            }
            else
            {
                valid = false;
            }

            // Get override from parameter
            int?noRiserOverride = ParameterUtil.GetIntValueFromElementOrSymbol(element, entryMap.RevitParameterName);

            if (!noRiserOverride.HasValue)
            {
                noRiserOverride = ParameterUtil.GetIntValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName);
            }

            if (noRiserOverride.HasValue)
            {
                m_NumberOfRisers = noRiserOverride.Value;
                valid            = true;
            }

            return(valid);
        }
Exemple #10
0
        /// <summary>
        /// Calculates span value for a beam.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            // Check the override first from "IfcSpan" parameter, if not overriden use the geometry data from extrusion
            double spanVal;

            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out spanVal) == null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out spanVal) == null)
                {
                    return(false);
                }
            }

            spanVal = UnitUtil.ScaleLength(spanVal);
            if (spanVal > MathUtil.Eps())
            {
                m_Span = spanVal;
                return(true);
            }

            if (extrusionCreationData == null || MathUtil.IsAlmostZero(extrusionCreationData.ScaledLength))
            {
                return(false);
            }
            m_Span = extrusionCreationData.ScaledLength;

            // No support, do nothing. Leave the Span to be the length of the entire beam
            return(true);
        }
Exemple #11
0
        /// <summary>
        /// Calculates Roll value (Rotation angle) for a beam, column and member
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            Parameter rollPar = element.get_Parameter(BuiltInParameter.STRUCTURAL_BEND_DIR_ANGLE);

            if (rollPar != null)
            {
                double?roll = rollPar.AsDouble();
                if (roll != null && roll.HasValue)
                {
                    m_Roll = UnitUtil.ScaleAngle(roll.Value);
                    return(true);
                }
            }

            // For other elements with ExtrusionData. Parameter will take precedence (override)
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Roll) == null)
            {
                ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Roll);
            }
            m_Roll = UnitUtil.ScaleAngle(m_Roll);
            if (m_Roll > MathUtil.Eps())
            {
                return(true);
            }

            return(false);
        }
Exemple #12
0
 public void TestEntryMap()
 {
     Serializer serializer = new Persister();
     EntryMap   example    = serializer.read(EntryMap.class, ENTRY_MAP);
        /// <summary>
        /// Calculates shape parameter B for a rebar.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (element is Rebar)
            {
                Rebar rebar = element as Rebar;
                if (rebar.CanBeMatchedWithMultipleShapes())
                {
                    return(false); // In case of the Bent free form the parameter should be obtain from subelement. (It can have value for another bar in set and we don't want that value).
                }
            }

            bool ret = ParameterUtil.GetDoubleValueFromElement(element, BuiltInParameterGroup.PG_GEOMETRY, "B", out m_ShapeParameterB) != null;

            if (ret)
            {
                m_ShapeParameterB = UnitUtil.ScaleLength(m_ShapeParameterB);
            }
            return(ret);
        }
 /// <summary>
 /// Calculates external value for an element.
 /// </summary>
 /// <param name="exporterIFC">The ExporterIFC object.</param>
 /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
 /// <param name="element">The element to calculate the value.</param>
 /// <param name="elementType">The element type.</param>
 /// <returns>True if the operation succeed, false otherwise.</returns>
 public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
 {
     IsExternal = CategoryUtil.IsElementExternal(element);
     return(true);
 }
Exemple #15
0
        /// <summary>
        /// Calculates number of risers for a stair.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            bool valid = true;

            if (StairsExporter.IsLegacyStairs(element))
            {
                double riserHeight, treadLengthAtInnerSide, nosingLength, waistThickness = 0;
                int    numberOfRisers, numberOfTreads = 0;
                ExporterIFCUtils.GetLegacyStairsProperties(exporterIFC, element,
                                                           out numberOfRisers, out numberOfTreads,
                                                           out riserHeight, out m_TreadLength, out treadLengthAtInnerSide,
                                                           out nosingLength, out waistThickness);
            }
            else if (element is Stairs)
            {
                Stairs stairs = element as Stairs;
                m_TreadLength = UnitUtil.ScaleLength(stairs.ActualTreadDepth);
            }
            else if (element is StairsRun)
            {
                StairsRun     stairsRun     = element as StairsRun;
                StairsRunType stairsRunType = stairsRun.Document.GetElement(stairsRun.GetTypeId()) as StairsRunType;
                Stairs        stairs        = stairsRun.GetStairs();

                m_TreadLength = UnitUtil.ScaleLength(stairs.ActualTreadDepth);
            }
            else
            {
                valid = false;
            }

            // Get override from parameter
            double treadLengthOverride = 0.0;

            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out treadLengthOverride) != null ||
                ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out treadLengthOverride) != null)
            {
                m_TreadLength = UnitUtil.ScaleArea(treadLengthOverride);
            }

            return(valid);
        }
        /// <summary>
        /// Calculates cross area.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Area) == null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Area) == null)
                {
                    ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "IfcQtyGrossArea", out m_Area);
                }
            }
            m_Area = UnitUtil.ScaleArea(m_Area);
            if (m_Area > MathUtil.Eps() * MathUtil.Eps())
            {
                return(true);
            }

            if (extrusionCreationData == null)
            {
                return(false);
            }

            m_Area = extrusionCreationData.ScaledArea;

            if (m_Area > MathUtil.Eps() * MathUtil.Eps())
            {
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Calculates specific zones for a space.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>True if the operation succeed, false otherwise.</returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            string basePropSpecZoneString = "Project Specific Zone";
            int    val = 0;

            while (++val < 1000) // prevent infinite loop.
            {
                string propSpecZoneString;
                if (val == 1)
                {
                    propSpecZoneString = basePropSpecZoneString;
                }
                else
                {
                    propSpecZoneString = basePropSpecZoneString + " " + val;
                }

                string value;
                if ((ParameterUtil.GetStringValueFromElementOrSymbol(element, propSpecZoneString, out value) == null) ||
                    string.IsNullOrEmpty(value))
                {
                    break;
                }

                m_SpecificZones.Add(value);
            }

            return(m_SpecificZones.Count > 0);
        }
Exemple #18
0
        /// <summary>
        /// Calculates perimeter for a space.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Perimeter) == null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Perimeter) == null)
                {
                    ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "IfcQtyPerimeter", out m_Perimeter);
                }
            }

            if (m_Perimeter > MathUtil.Eps())
            {
                return(true);
            }

            if (extrusionCreationData == null)
            {
                return(false);
            }

            m_Perimeter = extrusionCreationData.ScaledOuterPerimeter;
            return(m_Perimeter > MathUtil.Eps());
        }
Exemple #19
0
        /// <summary>
        /// Calculates cross area.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            double lengthFromParam = 0;

            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out lengthFromParam) == null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out lengthFromParam) == null)
                {
                    ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "IfcQtyLength", out lengthFromParam);
                }
            }
            m_Length = UnitUtil.ScaleLength(lengthFromParam);

            // Check for Stair Run - Do special computation for the length
            if (element is StairsRun)
            {
                StairsRun flight    = element as StairsRun;
                double    flightLen = flight.GetStairsPath().GetExactLength();
                flightLen = UnitUtil.ScaleLength(flightLen);
                if (flightLen > MathUtil.Eps())
                {
                    m_Length = flightLen;
                    return(true);
                }
                // consider override as specified in a parameter
                else if (m_Length > MathUtil.Eps())
                {
                    return(true);
                }
                // exit when none for StairsRun
                else
                {
                    return(false);
                }
            }

            // For others
            if (m_Length > MathUtil.Eps())
            {
                return(true);
            }

            if (extrusionCreationData == null)
            {
                if (ParameterUtil.GetDoubleValueFromElement(element, BuiltInParameter.EXTRUSION_LENGTH, out m_Length) != null)
                {
                    m_Length = UnitUtil.ScaleLength(m_Length);
                }
            }
            else
            {
                // For Slab, length is the major edge of the rectangle area profile (get it from ScaledWidth)
                // Also for Stair support
                IFCAnyHandle hnd = ExporterCacheManager.ElementToHandleCache.Find(element.Id);
                if (IFCAnyHandleUtil.IsSubTypeOf(hnd, IFCEntityType.IfcSlab) || element.Category.BuiltInCategory == BuiltInCategory.OST_StairsStringerCarriage)
                {
                    m_Length = extrusionCreationData.ScaledWidth;
                }
                else
                {
                    m_Length = extrusionCreationData.ScaledLength;
                }
            }

            if (m_Length > MathUtil.Eps())
            {
                return(true);
            }

            return(false);
        }
 public IEnumerable <string> EnumerateFiles() => EntryMap.Select(x => x.Key);
        /// <summary>
        /// Calculates temperature value for a space.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>True if the operation succeed, false otherwise.</returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_SpaceTemperatureSummer) != null ||
                ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_SpaceTemperatureSummer) != null)
            {
                return(true);
            }

            double maxValue = 0, minValue = 0;

            if ((ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName + "Max", out maxValue) != null) &&
                (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName + "Min", out minValue) != null) ||
                (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName + "Max", out maxValue) != null) &&
                (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName + "Min", out minValue) != null))
            {
                m_SpaceTemperatureSummer = (maxValue + minValue) / 2.0;
                return(true);
            }

            return(false);
        }
Exemple #22
0
        /// <summary>
        /// Calculates height for a railing
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            if (element == null)
            {
                return(false);
            }

            // For Railing
            RailingType railingType = element.Document.GetElement(element.GetTypeId()) as RailingType;

            if (railingType != null)
            {
                m_Height = UnitUtil.ScaleLength(railingType.TopRailHeight);
                return(true);
            }

            // For ProvisionForVoid
            ShapeCalculator shapeCalculator = ShapeCalculator.Instance;

            if (shapeCalculator != null && shapeCalculator.GetCurrentElement() == element)
            {
                if (String.Compare(shapeCalculator.GetStringValue(), IFCProvisionForVoidShapeType.Rectangle.ToString()) == 0)
                {
                    IFCAnyHandle rectProfile = shapeCalculator.GetCurrentProfileHandle();
                    if (!IFCAnyHandleUtil.IsNullOrHasNoValue(rectProfile))
                    {
                        // This is already scaled.
                        double?height = IFCAnyHandleUtil.GetDoubleAttribute(rectProfile, "YDim");
                        m_Height = height.HasValue ? height.Value : 0.0;
                        if (m_Height > MathUtil.Eps())
                        {
                            return(true);
                        }
                    }
                }
            }

            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Height) == null)
            {
                ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Height);
            }

            m_Height = UnitUtil.ScaleLength(m_Height);
            if (m_Height > MathUtil.Eps())
            {
                return(true);
            }

            // For other elements
            if (extrusionCreationData == null)
            {
                return(false);
            }

            m_Height = extrusionCreationData.ScaledHeight;
            return(m_Height > MathUtil.Eps());
        }
Exemple #23
0
        /// <summary>
        /// Calculates external value for an element.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>True if the operation succeed, false otherwise.</returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            FabricParams fabricParams = null;

            if (!ExporterCacheManager.FabricParamsCache.TryGetValue(element?.Id, out fabricParams))
            {
                return(false);
            }

            TransverseBarNominalDiameter = fabricParams.TransverseBarNominalDiameter;
            return(true);
        }
        /// <summary>
        /// Calculates width for a slab.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            ShapeCalculator shapeCalculator = ShapeCalculator.Instance;

            if (shapeCalculator != null && shapeCalculator.GetCurrentElement() == element)
            {
                if (String.Compare(shapeCalculator.GetStringValue(), IFCProvisionForVoidShapeType.Rectangle.ToString()) == 0)
                {
                    IFCAnyHandle rectProfile = shapeCalculator.GetCurrentProfileHandle();
                    if (!IFCAnyHandleUtil.IsNullOrHasNoValue(rectProfile))
                    {
                        // This is already scaled.
                        double?width = IFCAnyHandleUtil.GetDoubleAttribute(rectProfile, "XDim");
                        m_Width = width.HasValue ? width.Value : 0.0;
                        if (m_Width > MathUtil.Eps())
                        {
                            return(true);
                        }
                    }
                }
            }

            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out m_Width) == null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out m_Width) == null)
                {
                    ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "IfcQtyWidth", out m_Width);
                }
            }

            m_Width = UnitUtil.ScaleLength(m_Width);
            if (m_Width > MathUtil.Eps())
            {
                return(true);
            }

            if (extrusionCreationData == null)
            {
                return(false);
            }

            // For Slab width is the lesser edge of the rectangle area profile (get it from ScaledHeight)
            IFCAnyHandle hnd = ExporterCacheManager.ElementToHandleCache.Find(element.Id);

            if (IFCAnyHandleUtil.IsSubTypeOf(hnd, IFCEntityType.IfcSlab))
            {
                m_Width = extrusionCreationData.ScaledHeight;
            }
            else
            {
                m_Width = extrusionCreationData.ScaledWidth;
            }

            return(m_Width > MathUtil.Eps());
        }
Exemple #25
0
        /// <summary>
        /// Calculates slope value.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="extrusionCreationData">The IFCExtrusionCreationData.</param>
        /// <param name="element">The element to calculate the value.</param>
        /// <param name="elementType">The element type.</param>
        /// <returns>True if the operation succeed, false otherwise.</returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            double slope = double.NaN;

            // We may have an extrusionCreationData that doesn't have anything set.  We will check this by seeing if there is a valid length set.
            // This works for Beam
            if (extrusionCreationData == null || MathUtil.IsAlmostZero(extrusionCreationData.ScaledLength))
            {
                // Try looking for parameters that we can calculate slope from.
                double startParamHeight = 0.0;
                double endParamHeight   = 0.0;
                double length           = 0.0;

                if ((ParameterUtil.GetDoubleValueFromElement(element, BuiltInParameter.STRUCTURAL_BEAM_END0_ELEVATION, out startParamHeight) != null) &&
                    (ParameterUtil.GetDoubleValueFromElement(element, BuiltInParameter.STRUCTURAL_BEAM_END1_ELEVATION, out endParamHeight) != null) &&
                    (ParameterUtil.GetDoubleValueFromElement(element, BuiltInParameter.INSTANCE_LENGTH_PARAM, out length) != null))
                {
                    if (!MathUtil.IsAlmostZero(length))
                    {
                        double factor = Math.Abs(endParamHeight - startParamHeight) / length;
                        slope = UnitUtil.ScaleAngle(MathUtil.SafeAsin(factor));
                        if (!double.IsNaN(slope))
                        {
                            m_Slope = slope;
                            return(true);
                        }
                    }
                }
            }

            // This works for Ramp/RampFlight
            if (ParameterUtil.GetDoubleValueFromElement(element, BuiltInParameter.RAMP_ATTR_MIN_INV_SLOPE, out slope) != null)
            {
                m_Slope = UnitUtil.ScaleAngle(Math.Atan(slope));
                return(true);
            }

            // For other elements with ExtrusionData. Parameter will take precedence (override)
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "Slope", out slope) != null)
            {
                m_Slope = UnitUtil.ScaleAngle(Math.Atan(slope));
                return(true);
            }

            if (extrusionCreationData != null)
            {
                if (extrusionCreationData.Slope > MathUtil.Eps())
                {
                    m_Slope = extrusionCreationData.Slope;
                    return(true);
                }
                else
                {
                    // For any element that has axis, the slope will be computed based on the angle of the line vector
                    if (element.Location != null && element.Location is LocationCurve)
                    {
                        LocationCurve axis = element.Location as LocationCurve;
                        if (axis.Curve is Line)
                        {
                            Line axisCurve      = axis.Curve as Line;
                            XYZ  vectorProjOnXY = new XYZ(axisCurve.Direction.X, axisCurve.Direction.Y, 0.0).Normalize(); //Project the vector to XY plane
                            if (axisCurve.Direction.GetLength() > 0.0 && vectorProjOnXY.GetLength() > 0.0)
                            {
                                slope = UnitUtil.ScaleAngle(MathUtil.SafeAcos(axisCurve.Direction.DotProduct(vectorProjOnXY) / (axisCurve.Direction.GetLength() * vectorProjOnXY.GetLength())));
                            }

                            if (!double.IsNaN(slope))
                            {
                                m_Slope = slope;
                                return(true);
                            }
                        }
                    }
                }
            }

            // The last attempt to compute the slope angle is to get the slope of the largest top facing face of the geometry
            GeometryElement geomElem       = element.get_Geometry(GeometryUtil.GetIFCExportGeometryOptions());
            Face            largestTopFace = null;

            if (geomElem == null)
            {
                return(false);
            }

            foreach (GeometryObject geomObj in geomElem)
            {
                largestTopFace = GeometryUtil.GetLargestFaceInSolid(geomObj, new XYZ(0, 0, 1));
            }

            if (largestTopFace != null)
            {
                XYZ faceNormal            = largestTopFace.ComputeNormal(new UV());
                XYZ faceNormalProjXYPlane = new XYZ(faceNormal.X, faceNormal.Y, 0.0).Normalize();
                slope = GeometryUtil.GetAngleOfFace(largestTopFace, faceNormalProjXYPlane);
                if (!double.IsNaN(slope))
                {
                    m_Slope = slope;
                    return(true);
                }
            }

            return(false);
        }
Exemple #26
0
        /// <summary>
        /// Calculates cross area.
        /// </summary>
        /// <param name="exporterIFC">
        /// The ExporterIFC object.
        /// </param>
        /// <param name="extrusionCreationData">
        /// The IFCExtrusionCreationData.
        /// </param>
        /// <param name="element">
        /// The element to calculate the value.
        /// </param>
        /// <param name="elementType">
        /// The element type.
        /// </param>
        /// <returns>
        /// True if the operation succeed, false otherwise.
        /// </returns>
        public override bool Calculate(ExporterIFC exporterIFC, IFCExtrusionCreationData extrusionCreationData, Element element, ElementType elementType, EntryMap entryMap)
        {
            double crossSectionArea = 0;

            // 1. Check override parameter
            if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.RevitParameterName, out crossSectionArea) == null)
            {
                if (ParameterUtil.GetDoubleValueFromElementOrSymbol(element, entryMap.CompatibleRevitParameterName, out crossSectionArea) == null)
                {
                    ParameterUtil.GetDoubleValueFromElementOrSymbol(element, "IfcQtyNetCrossSectionArea", out crossSectionArea);
                }
            }
            m_Area = UnitUtil.ScaleArea(crossSectionArea);
            if (m_Area > MathUtil.Eps() * MathUtil.Eps())
            {
                return(true);
            }

            // 2. try using extrusion data
            if (extrusionCreationData == null)
            {
                return(false);
            }

            m_Area = extrusionCreationData.ScaledArea;
            return(m_Area > MathUtil.Eps() * MathUtil.Eps());
        }