/// <summary>
        /// Some families eg columns, need offsets to be set in a specific way. This tries to cover that.
        /// </summary>
        /// <param name="speckleElement"></param>
        /// <param name="familyInstance"></param>
        private void SetOffsets(DB.FamilyInstance familyInstance, RevitColumn speckleRevitColumn)
        {
            var topOffsetParam  = familyInstance.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM);
            var baseOffsetParam = familyInstance.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM);
            var baseLevelParam  = familyInstance.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_PARAM);
            var topLevelParam   = familyInstance.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM);

            if (topLevelParam == null || baseLevelParam == null || baseOffsetParam == null || topOffsetParam == null)
            {
                return;
            }

            var baseOffset = ScaleToNative(speckleRevitColumn.baseOffset, speckleRevitColumn.units);
            var topOffset  = ScaleToNative(speckleRevitColumn.topOffset, speckleRevitColumn.units);

            //these have been set previously
            //DB.Level level = Doc.GetElement(baseLevelParam.AsElementId()) as DB.Level;
            //DB.Level topLevel = Doc.GetElement(topLevelParam.AsElementId()) as DB.Level;

            //checking if BASE offset needs to be set before or after TOP offset
            //      if ((topLevel != null && level.Elevation + baseOffset == topLevel.Elevation) ||
            //       (topLevel!=null && topLevel.Elevation == level.Elevation && baseOffset > 0)) //edge case
            //    {
            baseOffsetParam.Set(baseOffset);
            topOffsetParam.Set(topOffset);
            //    }
            //    else
            //    {
            //       topOffsetParam.Set(topOffset);
            //      baseOffsetParam.Set(baseOffset);
            //    }
        }
Exemple #2
0
        public List <ApplicationPlaceholderObject> AnalyticalStickToNative(Element1D speckleStick)
        {
            List <ApplicationPlaceholderObject> placeholderObjects = new List <ApplicationPlaceholderObject> {
            };
            XYZ offset1 = VectorToNative(speckleStick.end1Offset);
            XYZ offset2 = VectorToNative(speckleStick.end2Offset);
            List <ApplicationPlaceholderObject> placeholders = new List <ApplicationPlaceholderObject> {
            };

            switch (speckleStick.type)
            {
            case ElementType1D.Beam:
                RevitBeam revitBeam = new RevitBeam();
                //This only works for CSIC sections now for sure. Need to test on other sections
                revitBeam.type     = speckleStick.property.name.Replace('X', 'x');
                revitBeam.baseLine = speckleStick.baseLine;
                //Beam beam = new Beam(speckleStick.baseLine);
                placeholders = BeamToNative(revitBeam);
                DB.FamilyInstance    nativeRevitBeam = (DB.FamilyInstance)placeholders[0].NativeObject;
                AnalyticalModelStick analyticalModel = (AnalyticalModelStick)nativeRevitBeam.GetAnalyticalModel();
                analyticalModel.SetReleases(true, Convert.ToBoolean(speckleStick.end1Releases.stiffnessX), Convert.ToBoolean(speckleStick.end1Releases.stiffnessY), Convert.ToBoolean(speckleStick.end1Releases.stiffnessZ), Convert.ToBoolean(speckleStick.end1Releases.stiffnessXX), Convert.ToBoolean(speckleStick.end1Releases.stiffnessYY), Convert.ToBoolean(speckleStick.end1Releases.stiffnessZZ));
                analyticalModel.SetReleases(false, Convert.ToBoolean(speckleStick.end2Releases.stiffnessX), Convert.ToBoolean(speckleStick.end2Releases.stiffnessY), Convert.ToBoolean(speckleStick.end2Releases.stiffnessZ), Convert.ToBoolean(speckleStick.end2Releases.stiffnessXX), Convert.ToBoolean(speckleStick.end2Releases.stiffnessYY), Convert.ToBoolean(speckleStick.end2Releases.stiffnessZZ));
                analyticalModel.SetOffset(AnalyticalElementSelector.StartOrBase, offset1);
                analyticalModel.SetOffset(AnalyticalElementSelector.EndOrTop, offset2);
//analyticalModel.
                return(placeholders);

            case ElementType1D.Brace:
                RevitBrace revitBrace = new RevitBrace();
                revitBrace.type     = speckleStick.property.name.Replace('X', 'x');
                revitBrace.baseLine = speckleStick.baseLine;
                //Brace brace = new Brace(speckleStick.baseLine);
                placeholders = BraceToNative(revitBrace);
                DB.FamilyInstance nativeRevitBrace = (DB.FamilyInstance)placeholders[0].NativeObject;
                analyticalModel = (AnalyticalModelStick)nativeRevitBrace.GetAnalyticalModel();
                analyticalModel.SetReleases(true, Convert.ToBoolean(speckleStick.end1Releases.stiffnessX), Convert.ToBoolean(speckleStick.end1Releases.stiffnessY), Convert.ToBoolean(speckleStick.end1Releases.stiffnessZ), Convert.ToBoolean(speckleStick.end1Releases.stiffnessXX), Convert.ToBoolean(speckleStick.end1Releases.stiffnessYY), Convert.ToBoolean(speckleStick.end1Releases.stiffnessZZ));
                analyticalModel.SetReleases(false, Convert.ToBoolean(speckleStick.end2Releases.stiffnessX), Convert.ToBoolean(speckleStick.end2Releases.stiffnessY), Convert.ToBoolean(speckleStick.end2Releases.stiffnessZ), Convert.ToBoolean(speckleStick.end2Releases.stiffnessXX), Convert.ToBoolean(speckleStick.end2Releases.stiffnessYY), Convert.ToBoolean(speckleStick.end2Releases.stiffnessZZ));
                analyticalModel.SetOffset(AnalyticalElementSelector.StartOrBase, offset1);
                analyticalModel.SetOffset(AnalyticalElementSelector.EndOrTop, offset2);
                return(placeholders);

            case ElementType1D.Column:
                RevitColumn revitColumn = new RevitColumn();
                revitColumn.type     = speckleStick.property.name.Replace('X', 'x');
                revitColumn.baseLine = speckleStick.baseLine;
                placeholders         = ColumnToNative(revitColumn);
                DB.FamilyInstance     nativeRevitColumn  = (DB.FamilyInstance)placeholders[0].NativeObject;
                AnalyticalModelColumn analyticalModelCol = (AnalyticalModelColumn)nativeRevitColumn.GetAnalyticalModel();
                analyticalModelCol.SetReleases(true, Convert.ToBoolean(speckleStick.end1Releases.stiffnessX), Convert.ToBoolean(speckleStick.end1Releases.stiffnessY), Convert.ToBoolean(speckleStick.end1Releases.stiffnessZ), Convert.ToBoolean(speckleStick.end1Releases.stiffnessXX), Convert.ToBoolean(speckleStick.end1Releases.stiffnessYY), Convert.ToBoolean(speckleStick.end1Releases.stiffnessZZ));
                analyticalModelCol.SetReleases(false, Convert.ToBoolean(speckleStick.end2Releases.stiffnessX), Convert.ToBoolean(speckleStick.end2Releases.stiffnessY), Convert.ToBoolean(speckleStick.end2Releases.stiffnessZ), Convert.ToBoolean(speckleStick.end2Releases.stiffnessXX), Convert.ToBoolean(speckleStick.end2Releases.stiffnessYY), Convert.ToBoolean(speckleStick.end2Releases.stiffnessZZ));
                analyticalModelCol.SetOffset(AnalyticalElementSelector.StartOrBase, offset1);
                analyticalModelCol.SetOffset(AnalyticalElementSelector.EndOrTop, offset2);
                return(placeholders);

                //Column column = new Column(speckleStick.baseLine);
                return(ColumnToNative(revitColumn));
            }
            return(placeholderObjects);
        }
        public Base ColumnToSpeckle(DB.FamilyInstance revitColumn)
        {
            var symbol = Doc.GetElement(revitColumn.GetTypeId()) as FamilySymbol;

            var speckleColumn = new RevitColumn();

            speckleColumn.family        = symbol.FamilyName;
            speckleColumn.type          = Doc.GetElement(revitColumn.GetTypeId()).Name;
            speckleColumn.level         = ConvertAndCacheLevel(revitColumn, BuiltInParameter.FAMILY_BASE_LEVEL_PARAM);
            speckleColumn.topLevel      = ConvertAndCacheLevel(revitColumn, BuiltInParameter.FAMILY_TOP_LEVEL_PARAM);
            speckleColumn.baseOffset    = GetParamValue <double>(revitColumn, BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM);
            speckleColumn.topOffset     = GetParamValue <double>(revitColumn, BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM);
            speckleColumn.facingFlipped = revitColumn.FacingFlipped;
            speckleColumn.handFlipped   = revitColumn.HandFlipped;
            speckleColumn.isSlanted     = revitColumn.IsSlantedColumn;
            //speckleColumn.structural = revitColumn.StructuralType == StructuralType.Column;

            //geometry
            var baseGeometry = LocationToSpeckle(revitColumn);
            var baseLine     = baseGeometry as ICurve;

            //make line from point and height
            if (baseLine == null && baseGeometry is Point basePoint)
            {
                var elevation = ConvertAndCacheLevel(revitColumn, BuiltInParameter.FAMILY_TOP_LEVEL_PARAM).elevation;
                baseLine = new Line(basePoint, new Point(basePoint.x, basePoint.y, elevation + speckleColumn.topOffset, ModelUnits), ModelUnits);
            }

            if (baseLine == null)
            {
                return(RevitElementToSpeckle(revitColumn));
            }

            speckleColumn.baseLine = baseLine; //all speckle columns should be line based

            GetAllRevitParamsAndIds(speckleColumn, revitColumn,
                                    new List <string> {
                "FAMILY_BASE_LEVEL_PARAM", "FAMILY_TOP_LEVEL_PARAM", "FAMILY_BASE_LEVEL_OFFSET_PARAM", "FAMILY_TOP_LEVEL_OFFSET_PARAM", "SCHEDULE_BASE_LEVEL_OFFSET_PARAM", "SCHEDULE_TOP_LEVEL_OFFSET_PARAM"
            });

            if (revitColumn.Location is LocationPoint)
            {
                speckleColumn.rotation = ((LocationPoint)revitColumn.Location).Rotation;
            }

            speckleColumn.displayMesh = GetElementMesh(revitColumn);

            return(speckleColumn);
        }
        public RevitColumn ColumnToSpeckle(DB.FamilyInstance revitColumn)
        {
            var speckleColumn = new RevitColumn();

            speckleColumn.type          = Doc.GetElement(revitColumn.GetTypeId()).Name;
            speckleColumn.level         = ConvertAndCacheLevel(revitColumn, BuiltInParameter.FAMILY_BASE_LEVEL_PARAM);
            speckleColumn.topLevel      = ConvertAndCacheLevel(revitColumn, BuiltInParameter.FAMILY_TOP_LEVEL_PARAM);
            speckleColumn.baseOffset    = GetParamValue <double>(revitColumn, BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM);
            speckleColumn.topOffset     = GetParamValue <double>(revitColumn, BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM);
            speckleColumn.facingFlipped = revitColumn.FacingFlipped;
            speckleColumn.handFlipped   = revitColumn.HandFlipped;
            speckleColumn.isSlanted     = revitColumn.IsSlantedColumn;
            speckleColumn.structural    = revitColumn.StructuralType == StructuralType.Column;

            //geometry
            var baseGeometry = LocationToSpeckle(revitColumn);
            var baseLine     = baseGeometry as ICurve;

            //make line from point and height
            if (baseLine == null && baseGeometry is Point basePoint)
            {
                var topLevelParam = revitColumn.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM);
                var elevation     = (double)((RevitLevel)ParameterToSpeckle(topLevelParam).value).elevation;
                baseLine = new Line(basePoint, new Point(basePoint.x, basePoint.y, elevation + speckleColumn.topOffset, ModelUnits), ModelUnits);
            }

            if (baseLine == null)
            {
                throw new Speckle.Core.Logging.SpeckleException("Only line based Columns are currently supported.");
            }

            speckleColumn.baseLine = baseLine; //all speckle columns should be line based

            GetAllRevitParamsAndIds(speckleColumn, revitColumn,
                                    new List <string> {
                "FAMILY_BASE_LEVEL_PARAM", "FAMILY_TOP_LEVEL_PARAM", "FAMILY_BASE_LEVEL_OFFSET_PARAM", "FAMILY_TOP_LEVEL_OFFSET_PARAM"
            });

            if (revitColumn.Location is LocationPoint)
            {
                speckleColumn.rotation = ((LocationPoint)revitColumn.Location).Rotation;
            }

            speckleColumn["@displayMesh"] = GetElementMesh(revitColumn);

            return(speckleColumn);
        }