示例#1
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);
            }
        }
示例#2
0
        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);
            }
        }