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); }
/// <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); } }
/// <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); }
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); }