示例#1
0
        private Base RebarToSpeckle(DB.Structure.Rebar revitRebar)
        {
            // get rebar centerline curves using transform
            var bars   = revitRebar.GetCenterlineCurves(true, true, true, MultiplanarOption.IncludeOnlyPlanarCurves, revitRebar.NumberOfBarPositions - 1);
            var curves = new List <ICurve>();

            RebarShapeDrivenAccessor accessor = null;

            if (revitRebar.IsRebarShapeDriven())
            {
                accessor = revitRebar.GetShapeDrivenAccessor();
            }

            for (int i = 0; i < bars.Count; i++)
            {
                var bar = (accessor != null) ? bars[i].CreateTransformed(accessor.GetBarPositionTransform(i)) : bars[i];
                curves.Add(CurveToSpeckle(bar));
            }

            var speckleRebar = new RevitRebar();

            speckleRebar.host   = revitRebar.GetHostId().ToString();
            speckleRebar.type   = Doc.GetElement(revitRebar.GetTypeId()).Name;
            speckleRebar.curves = curves;
            speckleRebar.shapes = revitRebar.GetAllRebarShapeIds().Select(o => o.ToString()).ToList(); // freeform rebar with bent workshop has multiple shapes
            speckleRebar.volume = revitRebar.Volume;

            GetAllRevitParamsAndIds(speckleRebar, revitRebar);

            return(speckleRebar);
        }
示例#2
0
        /// <summary>
        /// Move and Scale the  created Rebar to specified box.
        /// </summary>
        private void LayoutRebar()
        {
            List <Autodesk.Revit.DB.XYZ> profilePoints = m_geometryData.OffsetPoints(0.1);

            Autodesk.Revit.DB.XYZ origin = profilePoints[0];
            Autodesk.Revit.DB.XYZ yVec   = profilePoints[1] - origin;
            Autodesk.Revit.DB.XYZ xVec   = profilePoints[3] - origin;

            RebarShapeDefinitionByArc arcDef =
                (m_createdRebar.Document.GetElement(m_createdRebar.GetShapeId()) as RebarShape).GetRebarShapeDefinition() as RebarShapeDefinitionByArc;

            RebarShapeDrivenAccessor rebarShapeDrivenAccessor = m_createdRebar.GetShapeDrivenAccessor();

            if (arcDef != null && arcDef.Type == RebarShapeDefinitionByArcType.Spiral)
            {
                rebarShapeDrivenAccessor.ScaleToBoxFor3D(origin, xVec, yVec, 10.0);
                rebarShapeDrivenAccessor.Height             = m_geometryData.DrivingLength - 0.1;
                rebarShapeDrivenAccessor.Pitch              = 0.1;
                rebarShapeDrivenAccessor.BaseFinishingTurns = 3;
                rebarShapeDrivenAccessor.TopFinishingTurns  = 3;
            }
            else
            {
                rebarShapeDrivenAccessor.ScaleToBox(origin, xVec, yVec);
                double barSpacing = 0.1;
                int    barNum     = (int)(m_geometryData.DrivingLength / barSpacing);
                rebarShapeDrivenAccessor.SetLayoutAsNumberWithSpacing(
                    barNum, barSpacing, true, true, true);
            }
        }
示例#3
0
 /// <summary>
 /// Get Transformed Centerline curves at position.
 /// This method extracts the centerlinecurves for a rebar set at a given index and transforms them to the correct position.
 /// </summary>
 /// <param name="rebar"></param>
 /// <param name="barPosIndex"></param>
 /// <returns></returns>
 public static IList<Curve> GetTransformedCenterLineCurvesAtPostition(Rebar rebar, int barPosIndex)
 {
     RebarShapeDrivenAccessor sda = rebar.GetShapeDrivenAccessor();
     Transform transform = sda.GetBarPositionTransform(barPosIndex);
     IList<Curve> curves = rebar.GetCenterlineCurves(false, false, false, MultiplanarOption.IncludeOnlyPlanarCurves, barPosIndex);
     IList<Curve> transformedCurves = new List<Curve>();
     foreach (Curve curve in curves)
     {
         transformedCurves.Add(curve.CreateTransformed(transform));
     }
     return transformedCurves;
 }
        // Token: 0x060001E5 RID: 485 RVA: 0x0000D668 File Offset: 0x0000B868
        protected override ItGeVector3d GetRebarElementNormal()
        {
            RebarShapeDrivenAccessor rebarShapeDrivenAccessor = null;
            bool         flag = !this.Rebar.Element.GetShapeAccessor(out rebarShapeDrivenAccessor);
            ItGeVector3d result;

            if (flag)
            {
                result = ItGeVector3d.kOrigin;
            }
            else
            {
                ItGeVector3d itGeVector3d = rebarShapeDrivenAccessor.Normal.asVector();
                itGeVector3d.transformBy(base.MatWcsToPalette);
                result = itGeVector3d;
            }
            return(result);
        }
        // Token: 0x060001EE RID: 494 RVA: 0x0000DA50 File Offset: 0x0000BC50
        private static List <Curve> GetCenterLineCurvesForVolumeCalculation(RevitElement <Rebar> rebar, int i)
        {
            List <Curve>             list = rebar.Element.GetCenterlineCurves(true, false, false, 0, i).ToList <Curve>();
            RebarShapeDrivenAccessor rebarShapeDrivenAccessor = null;
            bool         flag = !rebar.Element.GetShapeAccessor(out rebarShapeDrivenAccessor);
            List <Curve> result;

            if (flag)
            {
                result = list;
            }
            else
            {
                bool flag2 = i > 0;
                if (flag2)
                {
                    Transform transform = rebarShapeDrivenAccessor.GetBarPositionTransform(i);
                    list = (from c in list
                            select c.CreateTransformed(transform)).ToList <Curve>();
                }
                result = list;
            }
            return(result);
        }
        // Token: 0x060001EA RID: 490 RVA: 0x0000D7E4 File Offset: 0x0000B9E4
        protected double GetActualSpacingForUnitechnik(RevitElement <Rebar> rebar, short angle)
        {
            RebarShapeDrivenAccessor rebarShapeDrivenAccessor = null;
            bool   flag = !rebar.Element.GetShapeAccessor(out rebarShapeDrivenAccessor);
            double result;

            if (flag)
            {
                result = 0.0;
            }
            else
            {
                int  numberOfBarPositions = rebar.Element.NumberOfBarPositions;
                bool flag2 = numberOfBarPositions < 2;
                if (flag2)
                {
                    result = 0.0;
                }
                else
                {
                    bool flag3 = rebar.Element.DoesBarExistAtPosition(0);
                    bool flag4 = !flag3 && (numberOfBarPositions < 3 || !rebar.Element.DoesBarExistAtPosition(2));
                    if (flag4)
                    {
                        result = 0.0;
                    }
                    else
                    {
                        Transform barPositionTransform  = rebarShapeDrivenAccessor.GetBarPositionTransform(flag3 ? 0 : 1);
                        Transform barPositionTransform2 = rebarShapeDrivenAccessor.GetBarPositionTransform(flag3 ? 1 : 2);
                        result = base.GetActualSpacingForUnitechnik(barPositionTransform, barPositionTransform2, angle);
                    }
                }
            }
            return(result);
        }
        // Token: 0x060001E2 RID: 482 RVA: 0x0000D568 File Offset: 0x0000B768
        private static bool IsMultiplanar(RevitElement <Rebar> rebar)
        {
            bool result;

            try
            {
                RebarShapeDrivenAccessor rebarShapeDrivenAccessor = null;
                bool flag = !rebar.Element.GetShapeAccessor(out rebarShapeDrivenAccessor);
                if (flag)
                {
                    result = false;
                }
                else
                {
                    double multiplanarDepth = rebarShapeDrivenAccessor.MultiplanarDepth;
                    result = multiplanarDepth.Ne(0.0, -1.0);
                }
            }
            catch
            {
                result = false;
            }
            return(result);
        }
        // Token: 0x060001DC RID: 476 RVA: 0x0000CDC8 File Offset: 0x0000AFC8
        private bool HasZDistribution()
        {
            bool result = false;
            bool flag   = this.Rebar.Element.LayoutRule > 0;

            if (flag)
            {
                RebarShapeDrivenAccessor rebarShapeDrivenAccessor = null;
                bool flag2 = !this.Rebar.Element.GetShapeAccessor(out rebarShapeDrivenAccessor);
                if (flag2)
                {
                    return(result);
                }
                ItGeVector3d itGeVector3d = rebarShapeDrivenAccessor.GetDistributionPath().Direction.asVector();
                itGeVector3d.transformBy(base.MatWcsToPalette);
                double dX    = itGeVector3d.dotProduct(ItGeVector3d.kZAxis);
                bool   flag3 = dX.Ne(0.0, -1.0);
                if (flag3)
                {
                    result = true;
                }
            }
            return(result);
        }
        static IList <Curve> GetRebarCurves(Document doc)
        {
            // I’m using a filter which gives me all rebar
            // elements. For each rebar, we calculate for each
            // bar in set it’s curves using Rebar.GetCenterlineCurves.
            // In case of shape driven, we also move the curves for
            // the bar at position `i` to their real position.

            IList <Curve> curves = new List <Curve>();

            FilteredElementCollector rebars
                = new FilteredElementCollector(doc)
                  .OfClass(typeof(Rebar));

            int n, nElements = 0, nCurves = 0;

            foreach (Rebar rebar in rebars)
            {
                ++nElements;

                n = rebar.NumberOfBarPositions;

                nCurves += n;

                for (int i = 0; i < n; ++i)
                {
                    // Retrieve the curves of i'th bar in the set.
                    // In case of shape driven rebar, they will be
                    // positioned at the location of the first bar
                    // in set.

                    IList <Curve> centerlineCurves
                        = rebar.GetCenterlineCurves(
                              true, false, false,
                              MultiplanarOption.IncludeAllMultiplanarCurves,
                              i);

                    // Move the curves to their position.

                    if (rebar.IsRebarShapeDriven())
                    {
                        RebarShapeDrivenAccessor accessor
                            = rebar.GetShapeDrivenAccessor();

                        Transform trf = accessor
                                        .GetBarPositionTransform(i);

                        foreach (Curve c in centerlineCurves)
                        {
                            curves.Add(c.CreateTransformed(trf));
                        }
                    }
                    else
                    {
                        // This is a Free Form Rebar

                        foreach (Curve c in centerlineCurves)
                        {
                            curves.Add(c);
                        }
                    }
                }
            }

            n = curves.Count;

            Debug.Print("Processed {0} rebar element{1} "
                        + "with {2} bar position{3}, extracted {4} "
                        + "curve{5}",
                        nElements, Util.PluralSuffix(nElements),
                        nCurves, Util.PluralSuffix(nCurves),
                        n, Util.PluralSuffix(n));

            return(curves);
        }
示例#10
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document  doc = commandData.Application.ActiveUIDocument.Document;
            Selection sel = commandData.Application.ActiveUIDocument.Selection;

            if (sel.GetElementIds().Count == 0)
            {
                message = "Выберите арматурные стержни";
                return(Result.Failed);
            }

            Rebar bar = doc.GetElement(sel.GetElementIds().First()) as Rebar;

            if (bar == null)
            {
                message = "Выберите арматурные стержни";
                return(Result.Failed);
            }
#if R2017
            XYZ normal = bar.Normal;
#else
            RebarShapeDrivenAccessor acc = bar.GetShapeDrivenAccessor();
            XYZ normal = acc.Normal;
#endif
            RebarBarType barType = doc.GetElement(bar.GetTypeId()) as RebarBarType;

            int        rebarStyleNumber = bar.get_Parameter(BuiltInParameter.REBAR_ELEM_HOOK_STYLE).AsInteger();
            RebarStyle rebarStyle       = (RebarStyle)rebarStyleNumber;

            RebarHookType hookTypeStart   = null;
            ElementId     hookStartTypeId = bar.get_Parameter(BuiltInParameter.REBAR_ELEM_HOOK_START_TYPE).AsElementId();
            if (hookStartTypeId != null)
            {
                hookTypeStart = doc.GetElement(hookStartTypeId) as RebarHookType;
            }

            RebarHookType hookTypeEnd   = null;
            ElementId     hookEndTypeId = bar.get_Parameter(BuiltInParameter.REBAR_ELEM_HOOK_END_TYPE).AsElementId();
            if (hookEndTypeId != null)
            {
                hookTypeEnd = doc.GetElement(hookEndTypeId) as RebarHookType;
            }


            RebarBendData        rbd         = bar.GetBendData();
            RebarHookOrientation hookOrient0 = rbd.HookOrient0;
            RebarHookOrientation hookOrient1 = rbd.HookOrient1;

            Element host = doc.GetElement(bar.GetHostId());

            List <Curve> curves    = bar.GetCenterlineCurves(false, true, true, MultiplanarOption.IncludeOnlyPlanarCurves, 0).ToList();
            int          barsCount = bar.NumberOfBarPositions;

            List <ElementId> newRebarIds = new List <ElementId>();
            using (Transaction tr = new Transaction(doc))
            {
                tr.Start("Explode rebar set");
                for (int i = 0; i < barsCount; i++)
                {
#if R2017
                    Transform barOffset = bar.GetBarPositionTransform(i);
#else
                    Transform barOffset = acc.GetBarPositionTransform(i);
#endif
                    XYZ offset = barOffset.Origin;

                    Rebar newRebar = Rebar.CreateFromCurves(doc, rebarStyle, barType, hookTypeStart, hookTypeEnd, host, normal, curves,
                                                            hookOrient0, hookOrient1, true, false);
                    doc.Regenerate();
                    ElementTransformUtils.MoveElement(doc, newRebar.Id, offset);
                    newRebarIds.Add(newRebar.Id);
                }

                doc.Delete(bar.Id);

                tr.Commit();
            }

            sel.SetElementIds(newRebarIds);

            return(Result.Succeeded);
        }