コード例 #1
0
        /// <summary>
        /// Get geometry of the pathReinforcement
        /// </summary>
        /// <param name="pathRein">pathReinforcement created</param>
        private List <List <XYZ> > GetGeometry(PathReinforcement pathRein)
        {
            Options options = m_profile.CommandData.Application.Application.Create.NewGeometryOptions();

            options.DetailLevel       = ViewDetailLevel.Medium;
            options.ComputeReferences = true;
            Autodesk.Revit.DB.GeometryElement geoElem = pathRein.get_Geometry(options);
            List <Curve> curvesList = new List <Curve>();
            //GeometryObjectArray gObjects = geoElem.Objects;
            IEnumerator <GeometryObject> Objects = geoElem.GetEnumerator();

            //foreach (GeometryObject geo in gObjects)
            while (Objects.MoveNext())
            {
                GeometryObject geo = Objects.Current;

                Curve curve = geo as Curve;
                curvesList.Add(curve);
            }
            List <List <XYZ> > pointsPreview = new List <List <XYZ> >();

            foreach (Curve curve in curvesList)
            {
                pointsPreview.Add(curve.Tessellate() as List <XYZ>);
            }
            return(pointsPreview);
        }
コード例 #2
0
        /// <summary>
        /// draw all the curves of PathReinforcement when click "Preview" Button
        /// </summary>
        /// <param name="sender">object who sent this event</param>
        /// <param name="e">event args</param>
        private void ButtonPreview_Click(object sender, EventArgs e)
        {
            m_previewMode   = true;
            m_tool.Finished = true;
            //get points to create PathReinforcement
            List <Point> points = m_tool.GetPoints();

            if (points.Count <= 1)
            {
                TaskDialog.Show("Revit", "Please draw Path of Reinforcement before create!");
                return;
            }
            List <Vector4> ps3D = Transform2DTo3D(points.ToArray());

            //begin Transaction, so action here can be aborted.
            Transaction transaction = new Transaction(m_profile.CommandData.Application.ActiveUIDocument.Document, "CreatePathReinforcement");

            transaction.Start();

            PathReinforcement pathRein = m_profile.CreatePathReinforcement(ps3D, this.flipCheckBox.Checked);

            m_pointsPreview = GetGeometry(pathRein);

            //Abort Transaction here, cancel what RevitAPI do after begin Transaction
            transaction.RollBack();

            this.pictureBox.Refresh();
        }
コード例 #3
0
        /// <summary>
        /// Exports a Rebar, AreaReinforcement or PathReinforcement to IFC ReinforcingBar.
        /// </summary>
        /// <param name="exporterIFC">The exporter.</param>
        /// <param name="element">The element.</param>
        /// <param name="productWrapper">The product wrapper.</param>
        public static void Export(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper)
        {
            ISet <IFCAnyHandle> createdRebars = null;

            if (element is Rebar)
            {
                ExportRebar(exporterIFC, element, productWrapper);
            }
            else if (element is AreaReinforcement)
            {
                AreaReinforcement areaReinforcement = element as AreaReinforcement;
                IList <ElementId> rebarIds          = areaReinforcement.GetRebarInSystemIds();

                Document doc = areaReinforcement.Document;
                foreach (ElementId id in rebarIds)
                {
                    Element rebarInSystem = doc.GetElement(id);
                    createdRebars = ExportRebar(exporterIFC, rebarInSystem, productWrapper);
                }
            }
            else if (element is PathReinforcement)
            {
                PathReinforcement pathReinforcement = element as PathReinforcement;
                IList <ElementId> rebarIds          = pathReinforcement.GetRebarInSystemIds();

                Document doc = pathReinforcement.Document;
                foreach (ElementId id in rebarIds)
                {
                    Element rebarInSystem = doc.GetElement(id);
                    createdRebars = ExportRebar(exporterIFC, rebarInSystem, productWrapper);
                }
            }

            if (createdRebars != null && createdRebars.Count > 1)
            {
                IFCFile file = exporterIFC.GetFile();
                using (IFCTransaction tr = new IFCTransaction(file))
                {
                    string       guid            = GUIDUtil.CreateGUID(element);
                    IFCAnyHandle ownerHistory    = exporterIFC.GetOwnerHistoryHandle();
                    string       revitObjectType = exporterIFC.GetFamilyName();
                    string       name            = NamingUtil.GetNameOverride(element, revitObjectType);
                    string       description     = NamingUtil.GetDescriptionOverride(element, null);
                    string       objectType      = NamingUtil.GetObjectTypeOverride(element, revitObjectType);

                    IFCAnyHandle rebarGroup = IFCInstanceExporter.CreateGroup(file, guid,
                                                                              ownerHistory, name, description, objectType);

                    productWrapper.AddElement(element, rebarGroup);

                    IFCInstanceExporter.CreateRelAssignsToGroup(file, GUIDUtil.CreateGUID(), ownerHistory,
                                                                null, null, createdRebars, null, rebarGroup);

                    tr.Commit();
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Create PathReinforcement on floor
        /// </summary>
        /// <param name="points">points used to create PathReinforcement</param>
        /// <param name="flip">used to specify whether new PathReinforcement is Filp</param>
        /// <returns>new created PathReinforcement</returns>
        public override PathReinforcement CreatePathReinforcement(List <Vector4> points, bool flip)
        {
            Autodesk.Revit.DB.XYZ p1, p2; Line curve;
            IList <Curve>         curves = new List <Curve>();

            for (int i = 0; i < points.Count - 1; i++)
            {
                p1    = new Autodesk.Revit.DB.XYZ(points[i].X, points[i].Y, points[i].Z);
                p2    = new Autodesk.Revit.DB.XYZ(points[i + 1].X, points[i + 1].Y, points[i + 1].Z);
                curve = Line.CreateBound(p1, p2);
                curves.Add(curve);
            }
            return(PathReinforcement.Create(m_document, m_data, curves, flip));
        }
コード例 #5
0
        /// <summary>
        /// Create PathReinforcement on floor
        /// </summary>
        /// <param name="points">points used to create PathReinforcement</param>
        /// <param name="flip">used to specify whether new PathReinforcement is Filp</param>
        /// <returns>new created PathReinforcement</returns>
        public override PathReinforcement CreatePathReinforcement(List <Vector4> points, bool flip)
        {
            Autodesk.Revit.DB.XYZ p1, p2; Line curve;
            IList <Curve>         curves = new List <Curve>();

            for (int i = 0; i < points.Count - 1; i++)
            {
                p1    = new Autodesk.Revit.DB.XYZ(points[i].X, points[i].Y, points[i].Z);
                p2    = new Autodesk.Revit.DB.XYZ(points[i + 1].X, points[i + 1].Y, points[i + 1].Z);
                curve = Line.CreateBound(p1, p2);
                curves.Add(curve);
            }
            ElementId pathReinforcementTypeId = PathReinforcementType.CreateDefaultPathReinforcementType(m_document);
            ElementId rebarBarTypeId          = RebarBarType.CreateDefaultRebarBarType(m_document);
            ElementId rebarHookTypeId         = RebarHookType.CreateDefaultRebarHookType(m_document);

            return(PathReinforcement.Create(m_document, m_data, curves, flip, pathReinforcementTypeId, rebarBarTypeId, rebarHookTypeId, rebarHookTypeId));
        }
コード例 #6
0
        PathReinforcement createPathReinforcementWithHook(Document doc, Wall wall, XYZ point1, XYZ point2, ElementId hookId, bool face)
        {
            List <Curve> curves = new List <Curve>();

            curves.Add(Line.CreateBound(point1, point2));

            ElementId defaultRebarBarTypeId          = doc.GetDefaultElementTypeId(ElementTypeGroup.RebarBarType);
            ElementId defaultPathReinforcementTypeId = doc.GetDefaultElementTypeId(ElementTypeGroup.PathReinforcementType);
            ElementId defaultHookTypeId = hookId;

            // Begin to create the path reinforcement
            PathReinforcement rein = PathReinforcement.Create(doc, wall, curves, true, defaultPathReinforcementTypeId, defaultRebarBarTypeId, defaultHookTypeId, defaultHookTypeId);

            if (null == rein)
            {
                throw new Exception("Create path reinforcement failed.");
            }

            IList <Parameter> pars = rein.GetOrderedParameters();

            foreach (Parameter par in pars)
            {
                if (par.Id.ToString() == "-1018307")
                {
                    par.SetValueString("500");
                }
                if (par.Id.ToString() == "-1018301" & face)
                {
                    par.Set(1);
                }
                if (par.Id.ToString() == "-1018302")
                {
                    double var1 = Convert.ToDouble(Shared.hSpacing);
                    double var2 = var1 + getThisValueInMeters(deltaInAxis, kA);
                    par.SetValueString("400");
                }
            }

            return(rein);
        }
コード例 #7
0
        PathReinforcement creatPathReinforcement(Document document, Wall wall, XYZ point1, XYZ point2, ElementId hookId, bool horizontal, bool last, double lastSpacing, bool face, double additionalSpaceForVerticalBars, double concreteSpace)
        {
            if (Shared.hSpacing == null)
            {
                Shared.hSpacing = "400";
            }

            if (Shared.vSpacing == null)
            {
                Shared.vSpacing = "400";
            }

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

            curves.Add(Line.CreateBound(point1, point2));

            ElementId defaultRebarBarTypeId          = document.GetDefaultElementTypeId(ElementTypeGroup.RebarBarType);
            ElementId defaultPathReinforcementTypeId = document.GetDefaultElementTypeId(ElementTypeGroup.PathReinforcementType);
            ElementId defaultHookTypeId = ElementId.InvalidElementId;

            if (hookId != null)
            {
                defaultHookTypeId = hookId;
            }

            PathReinforcement rein = PathReinforcement.Create(document, wall, curves, true, defaultPathReinforcementTypeId, defaultRebarBarTypeId, defaultHookTypeId, defaultHookTypeId);

            if (null == rein)
            {
                throw new Exception("Create path reinforcement failed.");
            }

            IList <Parameter> parameters = rein.GetOrderedParameters();

            foreach (Parameter par in parameters)
            {
                if (par.Id.ToString() == "-1018301" & face)
                {
                    par.Set(1);
                }
                if (par.Id.ToString() == "-1018302")
                {
                    if (!last && horizontal)
                    {
                        par.SetValueString(Shared.hSpacing);
                    }
                    else if (!last && !horizontal)
                    {
                        par.SetValueString(Shared.vSpacing);
                    }
                    else
                    {
                        par.SetValueString(lastSpacing.ToString());
                    }
                }
                if (horizontal)
                {
                    if (par.Id.ToString() == "-1018307")
                    {
                        par.SetValueString((getLengthOf(wall) - getThisValueInMeters(deltaInAxis * 2, kA)).ToString());
                    }
                }
                else
                {
                    if (par.Id.ToString() == "-1018307")
                    {
                        par.SetValueString((getHeightOf(wall) + additionalSpaceForVerticalBars).ToString());
                    }
                }
                if (concreteSpace != 0)
                {
                    if (par.Id.ToString() == "-1018307")
                    {
                        par.SetValueString(concreteSpace.ToString());
                    }
                }
                if (par.Id.ToString() == "-1018322")
                {
                    par.SetValueString(Convert.ToString(getThisValueInMeters(deltaInAxis, kA)) + "mm");
                }
            }

            return(rein);
        }
コード例 #8
0
        /// <summary>
        /// Exports a Rebar, AreaReinforcement or PathReinforcement to IFC ReinforcingBar.
        /// </summary>
        /// <param name="exporterIFC">The exporter.</param>
        /// <param name="element">The element.</param>
        /// <param name="productWrapper">The product wrapper.</param>
        public static void Export(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper)
        {
            ISet <DelayedProductWrapper> createdRebars = new HashSet <DelayedProductWrapper>();

            if (element is Rebar)
            {
                createdRebars = ExportRebar(exporterIFC, element, productWrapper);
            }
            else if (element is AreaReinforcement)
            {
                AreaReinforcement areaReinforcement = element as AreaReinforcement;
                IList <ElementId> rebarIds          = areaReinforcement.GetRebarInSystemIds();

                Document doc = areaReinforcement.Document;
                foreach (ElementId id in rebarIds)
                {
                    Element rebarInSystem = doc.GetElement(id);
                    ISet <DelayedProductWrapper> newlyCreatedRebars = ExportRebar(exporterIFC, rebarInSystem, productWrapper);
                    if (newlyCreatedRebars != null)
                    {
                        createdRebars.UnionWith(newlyCreatedRebars);
                    }
                }
            }
            else if (element is PathReinforcement)
            {
                PathReinforcement pathReinforcement = element as PathReinforcement;
                IList <ElementId> rebarIds          = pathReinforcement.GetRebarInSystemIds();

                Document doc = pathReinforcement.Document;
                foreach (ElementId id in rebarIds)
                {
                    Element rebarInSystem = doc.GetElement(id);
                    ISet <DelayedProductWrapper> newlyCreatedRebars = ExportRebar(exporterIFC, rebarInSystem, productWrapper);
                    if (newlyCreatedRebars != null)
                    {
                        createdRebars.UnionWith(newlyCreatedRebars);
                    }
                }
            }
            else if (element is RebarContainer)
            {
                int            itemIndex      = 1;
                RebarContainer rebarContainer = element as RebarContainer;
                foreach (RebarContainerItem rebarContainerItem in rebarContainer)
                {
                    ISet <DelayedProductWrapper> newlyCreatedRebars = ExportRebar(exporterIFC, rebarContainerItem, rebarContainer, itemIndex, productWrapper);
                    if (newlyCreatedRebars != null)
                    {
                        itemIndex += createdRebars.Count;
                        createdRebars.UnionWith(newlyCreatedRebars);
                    }
                }
            }

            if (createdRebars != null && createdRebars.Count != 0)
            {
                string guid = GUIDUtil.CreateGUID(element);

                // Create a group to hold all of the created IFC entities, if the rebars aren't already in an assembly or a group.
                // We want to avoid nested groups of groups of rebars.
                bool relateToLevel     = true;
                bool groupRebarHandles = (createdRebars.Count != 1);
                foreach (DelayedProductWrapper delayedProductWrapper in createdRebars)
                {
                    if (ElementIsContainedInAssembly(delayedProductWrapper.RebarElement))
                    {
                        groupRebarHandles = false;
                        relateToLevel     = false;
                        break;
                    }
                }

                ISet <IFCAnyHandle> createdRebarHandles = new HashSet <IFCAnyHandle>();
                foreach (DelayedProductWrapper delayedProductWrapper in createdRebars)
                {
                    IFCAnyHandle currentRebarHandle = delayedProductWrapper.ElementHandle;
                    productWrapper.AddElement(delayedProductWrapper.RebarElement, currentRebarHandle, delayedProductWrapper.LevelInfo, null, relateToLevel);
                    createdRebarHandles.Add(currentRebarHandle);
                }

                if (createdRebars.Count > 1)
                {
                    if (groupRebarHandles)
                    {
                        // Check the intended IFC entity or type name is in the exclude list specified in the UI
                        Common.Enums.IFCEntityType elementClassTypeEnum;
                        if (Enum.TryParse <Common.Enums.IFCEntityType>("IfcGroup", out elementClassTypeEnum))
                        {
                            if (!ExporterCacheManager.ExportOptionsCache.IsElementInExcludeList(elementClassTypeEnum))
                            {
                                IFCFile file = exporterIFC.GetFile();
                                using (IFCTransaction tr = new IFCTransaction(file))
                                {
                                    IFCAnyHandle ownerHistory    = ExporterCacheManager.OwnerHistoryHandle;
                                    string       revitObjectType = exporterIFC.GetFamilyName();
                                    string       name            = NamingUtil.GetNameOverride(element, revitObjectType);
                                    string       description     = NamingUtil.GetDescriptionOverride(element, null);
                                    string       objectType      = NamingUtil.GetObjectTypeOverride(element, revitObjectType);

                                    IFCAnyHandle rebarGroup = IFCInstanceExporter.CreateGroup(file, guid,
                                                                                              ownerHistory, name, description, objectType);

                                    productWrapper.AddElement(element, rebarGroup);

                                    IFCInstanceExporter.CreateRelAssignsToGroup(file, GUIDUtil.CreateGUID(), ownerHistory,
                                                                                null, null, createdRebarHandles, null, rebarGroup);

                                    tr.Commit();
                                }
                            }
                        }
                    }
                }
                else
                {
                    // We will update the GUID of the one created IfcReinforcingElement to be the element GUID.
                    // This will allow the IfcGUID parameter to be use/set if appropriate.
                    ExporterUtil.SetGlobalId(createdRebarHandles.ElementAt(0), guid);
                }
            }
        }
コード例 #9
0
        private void Stream( ArrayList data, PathReinforcement pathReinf )
        {
            data.Add( new Snoop.Data.ClassSeparator( typeof( PathReinforcement ) ) );

              data.Add( new Snoop.Data.Object( "Path reinforcement type", pathReinf.PathReinforcementType ) );
              data.Add( new Snoop.Data.Enumerable( "Curves", pathReinf.GetCurveElementIds(), pathReinf.Document ) );

              data.Add( new Snoop.Data.CategorySeparator( "Bar Descriptions" ) );
              System.Collections.Generic.IList<ElementId> rebarIds = pathReinf.GetRebarInSystemIds();
              data.Add( new Snoop.Data.Int( "Number of RebarInSystem", rebarIds.Count ) );
              for( int i = 0; i < rebarIds.Count; i++ )
              {
            data.Add( new Snoop.Data.Object( string.Format( "RebarInSystem [{0:d}]", i ), pathReinf.Document.GetElement( rebarIds[i] ) ) );
              }
        }
コード例 #10
0
ファイル: RebarExporter.cs プロジェクト: lfcastel/revit-ifc
        /// <summary>
        /// Exports a Rebar, AreaReinforcement or PathReinforcement to IFC ReinforcingBar.
        /// </summary>
        /// <param name="exporterIFC">The exporter.</param>
        /// <param name="element">The element.</param>
        /// <param name="productWrapper">The product wrapper.</param>
        public static void Export(ExporterIFC exporterIFC, Element element, ProductWrapper productWrapper)
        {
            ISet <DelayedProductWrapper> createdRebars = new HashSet <DelayedProductWrapper>();

            // First, we will create individual rebars based on the Revit element.
            if (element is Rebar)
            {
                createdRebars = ExportRebar(exporterIFC, element, productWrapper);
            }
            else if (element is AreaReinforcement)
            {
                AreaReinforcement areaReinforcement = element as AreaReinforcement;
                IList <ElementId> rebarIds          = areaReinforcement.GetRebarInSystemIds();

                Document doc = areaReinforcement.Document;
                foreach (ElementId id in rebarIds)
                {
                    Element rebarInSystem = doc.GetElement(id);
                    ISet <DelayedProductWrapper> newlyCreatedRebars = ExportRebar(exporterIFC, rebarInSystem, productWrapper);
                    if (newlyCreatedRebars != null)
                    {
                        createdRebars.UnionWith(newlyCreatedRebars);
                    }
                }
            }
            else if (element is PathReinforcement)
            {
                PathReinforcement pathReinforcement = element as PathReinforcement;
                IList <ElementId> rebarIds          = pathReinforcement.GetRebarInSystemIds();

                Document doc = pathReinforcement.Document;
                foreach (ElementId id in rebarIds)
                {
                    Element rebarInSystem = doc.GetElement(id);
                    ISet <DelayedProductWrapper> newlyCreatedRebars = ExportRebar(exporterIFC, rebarInSystem, productWrapper);
                    if (newlyCreatedRebars != null)
                    {
                        createdRebars.UnionWith(newlyCreatedRebars);
                    }
                }
            }
            else if (element is RebarContainer)
            {
                int            itemIndex      = 1;
                RebarContainer rebarContainer = element as RebarContainer;
                foreach (RebarContainerItem rebarContainerItem in rebarContainer)
                {
                    ISet <DelayedProductWrapper> newlyCreatedRebars = ExportRebar(exporterIFC, rebarContainerItem, rebarContainer, itemIndex, productWrapper);
                    if (newlyCreatedRebars != null)
                    {
                        itemIndex += createdRebars.Count;
                        createdRebars.UnionWith(newlyCreatedRebars);
                    }
                }
            }

            // If we've created any rebar, we will group them below into three conceptual groups:
            // 1. One rebar that shouldn't be grouped or be in an assembly,
            //    but be directly contained in a building story.
            // 2. Rebar that are in assemblies, where the assembly is contained in a building story.
            // 3. Multiple rebar that aren't in assembles, which should both be in a group and
            //    directly contained in a building story.
            //
            // The reason for the cases above:
            // 1. Nested groups/assemblies aren't allow in IFC.  So we can only have one level.
            // 2. IfcGroups don't have level assignment.  So the individual components inside have
            //    to be directly contained in a building story.
            // 3. IfcAssemblies do have level assignment, so individual components can't be directly
            //    contained in a building story.   This does mean that rebars in assemblies may
            //    be associated with the wrong level, but that is an IFC limitation.
            if (createdRebars != null && createdRebars.Count != 0)
            {
                // Only one created element can have the consistent GUID of the main element.
                // This will be either the first created assembly or the first rebar element.
                string guid = GUIDUtil.CreateGUID(element);

                // While it seems likely that all of the rebar would have the same assembly id,
                // there's no need to assume this.  Make a map of assembly id to created rebar.
                IDictionary <ElementId, ISet <DelayedProductWrapper> > relatedRebar =
                    new Dictionary <ElementId, ISet <DelayedProductWrapper> >();
                relatedRebar[ElementId.InvalidElementId] = new HashSet <DelayedProductWrapper>();

                // Go through the created rebar and sort into buckets by assembly id.
                foreach (DelayedProductWrapper delayedProductWrapper in createdRebars)
                {
                    Element rebarElement = delayedProductWrapper.RebarElement;
                    if (rebarElement == null)
                    {
                        continue;
                    }

                    ElementId rebarAssemblyInstanceId            = rebarElement.AssemblyInstanceId;
                    ISet <DelayedProductWrapper> currentRebarSet = null;
                    if (!relatedRebar.TryGetValue(rebarAssemblyInstanceId, out currentRebarSet))
                    {
                        currentRebarSet = new HashSet <DelayedProductWrapper>();
                        relatedRebar[rebarAssemblyInstanceId] = currentRebarSet;
                    }
                    currentRebarSet.Add(delayedProductWrapper);
                }

                foreach (KeyValuePair <ElementId, ISet <DelayedProductWrapper> > relatedToAssembly in relatedRebar)
                {
                    // Ignore buckets with no items in them.
                    if (relatedToAssembly.Value.Count == 0)
                    {
                        continue;
                    }

                    // We will attach rebar to an assembly for rebar belonging to an assembly;
                    // otherwise we will create a group, assuming there are at least 2 rebar to group.
                    ElementId assemblyId    = relatedToAssembly.Key;
                    bool      hasAssemblyId = (assemblyId != ElementId.InvalidElementId);
                    bool      attachToLevel = !hasAssemblyId;

                    ISet <IFCAnyHandle> createdRebarHandles = new HashSet <IFCAnyHandle>();
                    foreach (DelayedProductWrapper delayedProductWrapper in relatedToAssembly.Value)
                    {
                        IFCAnyHandle currentRebarHandle = delayedProductWrapper.ElementHandle;
                        productWrapper.AddElement(delayedProductWrapper.RebarElement, currentRebarHandle,
                                                  delayedProductWrapper.LevelInfo, null, attachToLevel, delayedProductWrapper.ExportInfo);
                        createdRebarHandles.Add(currentRebarHandle);
                    }

                    if (hasAssemblyId)
                    {
                        ExporterCacheManager.AssemblyInstanceCache.RegisterElements(assemblyId, productWrapper);
                    }
                    else if (createdRebarHandles.Count > 1)
                    {
                        // Check the intended IFC entity or type name is in the exclude list specified in the UI
                        string rebarGUID = (guid != null) ? guid : GUIDUtil.CreateGUID();
                        CreateRebarGroup(exporterIFC, element, rebarGUID, productWrapper, createdRebarHandles);
                        guid = null;
                    }
                }

                // We will update the GUID of the one created IfcReinforcingElement to be the element GUID.
                // This will allow the IfcGUID parameter to be use/set if appropriate.
                if (createdRebars.Count == 1 && guid != null)
                {
                    ExporterUtil.SetGlobalId(createdRebars.ElementAt(0).ElementHandle, guid);
                }
            }
        }
コード例 #11
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Debug.Listeners.Clear();
            Debug.Listeners.Add(new RbsLogger.Logger("SelectHost"));

            UIDocument       uiDoc  = commandData.Application.ActiveUIDocument;
            Document         doc    = uiDoc.Document;
            Selection        sel    = uiDoc.Selection;
            List <ElementId> selIds = sel.GetElementIds().ToList();

            if (selIds.Count != 1)
            {
                message = "Выберите элемент, для которого нужно найти основу.";
                return(Result.Failed);
            }
            Element selElem = doc.GetElement(selIds.First());

            Debug.WriteLine("Selected elem id: " + selElem.Id.IntegerValue.ToString());
            ElementId hostId = null;


            if (selElem is AreaReinforcement)
            {
                AreaReinforcement el = selElem as AreaReinforcement;
                hostId = el.GetHostId();
                Debug.WriteLine("It is area reinforcement");
            }
            if (selElem is PathReinforcement)
            {
                PathReinforcement el = selElem as PathReinforcement;
                hostId = el.GetHostId();
                Debug.WriteLine("It is path reinforcement");
            }
            if (selElem is Rebar)
            {
                Rebar el = selElem as Rebar;
                hostId = el.GetHostId();
                Debug.WriteLine("It is rebar");
            }
            if (selElem is RebarInSystem)
            {
                RebarInSystem el = selElem as RebarInSystem;
                hostId = el.SystemId;
                Debug.WriteLine("It is rebar in system");
            }

            if (selElem is FamilyInstance)
            {
                FamilyInstance el   = selElem as FamilyInstance;
                Element        host = el.Host;
                if (host != null)
                {
                    hostId = host.Id;
                    Debug.WriteLine("It is family instance with host");
                }
                else
                {
                    Element parentFamily = el.SuperComponent;
                    if (parentFamily != null)
                    {
                        Debug.WriteLine("It is family instance with parent family");
                        hostId = parentFamily.Id;
                    }
                }
            }


            if (hostId == null)
            {
                message = "Не удалось получить родительский элемент.";
                Debug.WriteLine("Host not found");
                return(Result.Failed);
            }
            else
            {
                sel.SetElementIds(new List <ElementId> {
                    hostId
                });
                Debug.WriteLine("Host id: " + hostId.IntegerValue.ToString());
                return(Result.Succeeded);
            }
        }
コード例 #12
0
 /// <summary>
 /// Get geometry of the pathReinforcement
 /// </summary>
 /// <param name="pathRein">pathReinforcement created</param>
 private List<List<XYZ>> GetGeometry(PathReinforcement pathRein)
 {
     Options options = m_profile.CommandData.Application.Application.Create.NewGeometryOptions();
     options.DetailLevel = DetailLevels.Medium;
     options.ComputeReferences = true;
     Autodesk.Revit.DB.GeometryElement geoElem = pathRein.get_Geometry(options);
     List<Curve> curvesList = new List<Curve>();
     GeometryObjectArray gObjects = geoElem.Objects;
     foreach (GeometryObject geo in gObjects)
     {
         Curve curve = geo as Curve;
         curvesList.Add(curve);
     }
     List<List<XYZ>> pointsPreview = new List<List<XYZ>>();
     foreach (Curve curve in curvesList)
     {
         pointsPreview.Add(curve.Tessellate() as List<XYZ>);
     }
     return pointsPreview;
 }
コード例 #13
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Debug.Listeners.Clear();
            Debug.Listeners.Add(new RbsLogger.Logger("AreeRebarMark"));
            Debug.WriteLine("Start area rebar mark");
            double offset = 0; //мм

            //собираю все элементы армирования по площади и траектории
            Document doc = commandData.Application.ActiveUIDocument.Document;
            FilteredElementCollector areas = new FilteredElementCollector(doc)
                                             .OfClass(typeof(Autodesk.Revit.DB.Structure.AreaReinforcement))
                                             .WhereElementIsNotElementType();
            FilteredElementCollector paths = new FilteredElementCollector(doc)
                                             .OfClass(typeof(Autodesk.Revit.DB.Structure.PathReinforcement))
                                             .WhereElementIsNotElementType();
            List <Element> col   = areas.Concat(paths).ToList();
            int            count = 0;

            using (Transaction t = new Transaction(doc))
            {
                t.Start("Area rebar mark");
                //и Path, и Area попытаюсь обрабатываю в одном цикле, чтобы компактнее было
                foreach (Element rebarAreaPath in col)
                {
                    //благодаря hashset можно собрать только уникальный марки стержней
                    HashSet <string> marks           = new HashSet <string>();
                    string           rebarSystemMark = "";

                    List <ElementId> rebarIds = null;
                    List <ElementId> curveIds = null;

                    double maxZ = 0;
                    double minZ = 0;

                    if (rebarAreaPath is AreaReinforcement)
                    {
                        AreaReinforcement ar = rebarAreaPath as AreaReinforcement;
                        rebarIds = ar.GetRebarInSystemIds().ToList();
                        curveIds = ar.GetBoundaryCurveIds().ToList();

                        //определяю нижнюю и верзнюю точку зоны
                        List <double> zs = new List <double>();
                        foreach (ElementId curveId in curveIds)
                        {
                            AreaReinforcementCurve curve =
                                doc.GetElement(curveId) as AreaReinforcementCurve;

                            XYZ    start = curve.Curve.GetEndPoint(0);
                            double z1    = start.Z;
                            zs.Add(z1);

                            XYZ    end = curve.Curve.GetEndPoint(1);
                            double z2  = end.Z;
                            zs.Add(z2);
                        }

                        maxZ  = zs.Max();
                        maxZ += offset / 304.8;
                        minZ  = zs.Min();
                        minZ += offset / 304.8;
                    }

                    if (rebarAreaPath is PathReinforcement)
                    {
                        PathReinforcement pr = rebarAreaPath as PathReinforcement;
                        rebarIds = pr.GetRebarInSystemIds().ToList();

                        maxZ = pr.get_BoundingBox(doc.ActiveView).Max.Z;
                        minZ = pr.get_BoundingBox(doc.ActiveView).Min.Z;
                    }

                    //получаю общие параметры, в которые буду записывать отметку верха и низа, они должны быть заранее добавлены
                    Parameter topelev = rebarAreaPath.LookupParameter("АрмПлощ.ОтмВерха");
                    Parameter botelev = rebarAreaPath.LookupParameter("АрмПлощ.ОтмНиза");

                    if (topelev == null)
                    {
                        topelev = rebarAreaPath.LookupParameter("Рзм.ОтмВерха");
                    }
                    if (botelev == null)
                    {
                        botelev = rebarAreaPath.LookupParameter("Рзм.ОтмНиза");
                    }

                    if (topelev != null && botelev != null)
                    {
                        topelev.Set(maxZ);
                        botelev.Set(minZ);
                    }

                    //еще хочу записать в зону длину самого длинного арматурного стержня в ней
                    double length = 0;

                    //обрабатываю арматурные стержни в составе зоны
                    foreach (ElementId rebarId in rebarIds)
                    {
                        Element rebar     = doc.GetElement(rebarId);
                        string  rebarMark = rebar.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).AsString();
                        marks.Add(rebarMark);
                        double tempLength = rebar.get_Parameter(BuiltInParameter.REBAR_ELEM_LENGTH).AsDouble();
                        if (tempLength > length)
                        {
                            length = tempLength;
                        }
                    }

                    //сортирую марки и записываю через запятую
                    List <string> marksList = marks.ToList();
                    marksList.Sort();
                    for (int i = 0; i < marks.Count; i++)
                    {
                        rebarSystemMark += marksList[i];
                        if (i < marks.Count - 1)
                        {
                            rebarSystemMark += ", ";
                        }
                    }
                    rebarAreaPath.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Set(rebarSystemMark);

                    //записываю длину арматуры а зону
                    Parameter lengthParam = rebarAreaPath.LookupParameter("Рзм.Длина");
                    if (lengthParam != null)
                    {
                        lengthParam.Set(length);
                    }

                    count++;
                }
                t.Commit();
            }

            BalloonTip.Show("Успешно!", "Обработано зон: " + count.ToString());
            Debug.WriteLine("Success, elements: " + count.ToString());

            return(Result.Succeeded);
        }