/// <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); } }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //Pegar uidoc e doc UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; try { //Filtro para pegar apenas vergalhões ISelectionFilter selectionFilter = new vergalhaoSelectionFilter(); //Pegar elemento Reference pickedObj = uidoc.Selection.PickObject(ObjectType.Element, selectionFilter, "Selecione uma vergalhão"); ElementId eleId = pickedObj.ElementId; Element ele = doc.GetElement(eleId); Rebar rebar = ele as Rebar; //Pega o elemento selecionado como um vergalhão //Pegar o o ospedeiro do elemento ElementId hostId = rebar.GetHostId(); Element hostEle = doc.GetElement(hostId); //Pegar a vista ativa e criar um plano com base em sua origem e direção View view = doc.ActiveView; ViewType viewType = view.ViewType; XYZ origem = view.Origin; XYZ direcao = view.ViewDirection; Plane plano = Plane.CreateByNormalAndOrigin(direcao, origem); //Forma do vergalhão ElementId shapeId = rebar.GetShapeId(); ElementType shape = doc.GetElement(shapeId) as ElementType; //Cria o nome da família do item de detalhe, "Detalhe vergalhão 01", "Detalhe vergalhão 22", etc String shapeName = "Detalhe vergalhão " + shape.Name; //Dimensões do vergalhão, adicionar outras conforme for evoluindo, servirão para alterar a família de item de detalhe Double dA = ele.LookupParameter("A").AsDouble(); Double dB = ele.LookupParameter("B").AsDouble(); using (Transaction trans = new Transaction(doc, "Criar elemento")) { trans.Start(); //Variável para guardar o sketchplane SketchPlane sketchPlane; //Pegar o SketchPlane de acordo com o tipo de vista, se for elevação ou corte o SketchPlane será a partir do plano criado anteriormente if (viewType == ViewType.Elevation || viewType == ViewType.Section) { sketchPlane = SketchPlane.Create(doc, plano); } else { sketchPlane = view.SketchPlane; } //Define o SketchPlane da vista view.SketchPlane = sketchPlane; //Procura a família de item de detalhe com base no nome e ativa o mesmo FilteredElementCollector collector = new FilteredElementCollector(doc); IList <Element> symbols = collector.OfClass(typeof(FamilySymbol)).WhereElementIsElementType().ToElements(); FamilySymbol symbol = null; foreach (Element elem in symbols) { if (elem.Name == shapeName) { symbol = elem as FamilySymbol; break; } } if (!symbol.IsActive) { symbol.Activate(); } //Pega o ponto selecionado XYZ pickedPoint = uidoc.Selection.PickPoint(); //Cria o item de detalhe no ponto e define seus parâmetros FamilyInstance familyInstance = doc.Create.NewFamilyInstance(pickedPoint, symbol, view); familyInstance.LookupParameter("A").Set(dA); familyInstance.LookupParameter("B").Set(dB); trans.Commit(); } return(Result.Succeeded); } catch (Exception e) { message = e.Message; return(Result.Failed); } }