public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Application app = commandData.Application.Application; UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; Reference pickedReference = null; try { pickedReference = uidoc.Selection.PickObject(ObjectType.Element, new RebarSelectFilter() , "Pick a Rebar"); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { return Result.Cancelled; } Rebar rebar = doc.GetElement(pickedReference) as Rebar; if (!rebar.IsRebarShapeDriven() || rebar.LayoutRule == RebarLayoutRule.Single) { message = "Singe rebar and non-shape driven rebars are not supported."; return Result.Failed; } double rebarDiameter = rebar.GetBendData().BarDiameter; RebarBarType barType = doc.GetElement(rebar.GetTypeId()) as RebarBarType; IList<Curve> transformedCurvesFirst = Utils.GetTransformedCenterLineCurvesAtPostition(rebar, 0); IList<Curve> transformedCurvesLast = Utils.GetTransformedCenterLineCurvesAtPostition(rebar, rebar.NumberOfBarPositions-1); XYZ direction = transformedCurvesFirst.OfType<Line>().First().Direction; List<XYZ> rebarInBendFirstPoints = GetPointInArc(transformedCurvesFirst, rebarDiameter); List<XYZ> rebarInBendLastPoints = GetPointInArc(transformedCurvesLast, rebarDiameter); using (Transaction t1 = new Transaction(doc, "Add rebar in bend")) { t1.Start(); for (int i = 0; i < rebarInBendFirstPoints.Count; i++) { Line newRebarCenterline = Line.CreateBound(rebarInBendFirstPoints[i], rebarInBendLastPoints[i]); IList<Curve> rebarCurve = new List<Curve>(); rebarCurve.Add(newRebarCenterline); Rebar.CreateFromCurves(doc, RebarStyle.Standard, barType, null, null, doc.GetElement(rebar.GetHostId()), direction, rebarCurve, RebarHookOrientation.Left, RebarHookOrientation.Left, true, false); } doc.Regenerate(); t1.Commit(); } return Result.Succeeded; }
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); }
private void Stream( ArrayList data, Rebar rebar ) { data.Add( new Snoop.Data.ClassSeparator( typeof( Rebar ) ) ); data.Add( new Snoop.Data.ElementId( "Bar type", rebar.GetTypeId(), rebar.Document ) ); data.Add( new Snoop.Data.ElementId( "Rebar shape", rebar.RebarShapeId, rebar.Document ) ); data.Add( new Snoop.Data.ElementId( "Host", rebar.GetHostId(), rebar.Document ) ); data.Add( new Snoop.Data.Object( "Distribution path", rebar.GetDistributionPath() ) ); data.Add( new Snoop.Data.Enumerable( "GetCenterlineCurves(false, false, false)", rebar.GetCenterlineCurves( false, false, false, MultiplanarOption.IncludeOnlyPlanarCurves, 0 ) ) ); data.Add( new Snoop.Data.String( "LayoutRule", rebar.LayoutRule.ToString() ) ); if( rebar.LayoutRule != RebarLayoutRule.Single ) { data.Add( new Snoop.Data.Double( "Distribution path length", rebar.ArrayLength ) ); data.Add( new Snoop.Data.Int( "Quantity", rebar.Quantity ) ); data.Add( new Snoop.Data.Int( "NumberOfBarPositions", rebar.NumberOfBarPositions ) ); data.Add( new Snoop.Data.Double( "MaxSpacing", rebar.MaxSpacing ) ); data.Add( new Snoop.Data.Bool( "BarsOnNormalSide", rebar.BarsOnNormalSide ) ); } data.Add( new Snoop.Data.String( "ScheduleMark", rebar.ScheduleMark ) ); data.Add( new Snoop.Data.Double( "Volume", rebar.Volume ) ); data.Add( new Snoop.Data.Double( "TotalLength", rebar.TotalLength ) ); data.Add( new Snoop.Data.Object( "Normal", rebar.Normal ) ); //TF data.Add( new Snoop.Data.Object( "ConstraintsManager", rebar.GetRebarConstraintsManager() ) ); //TFEND // Bending data data.Add( new Snoop.Data.Object( "Bending Data", rebar.GetBendData() ) ); // Hook information addHookInformation2Rebar( data, rebar, 0 ); addHookInformation2Rebar( data, rebar, 1 ); }