Exemplo n.º 1
0
        /***************************************************/

        private static bool IsValidToOrganize(this IRequest request)
        {
            if (request is LogicalNotRequest)
            {
                IRequest subRequest = ((LogicalNotRequest)request).Request;
                if (subRequest == null)
                {
                    return(false);
                }

                if (subRequest.GetType() == typeof(FilterByLink))
                {
                    BH.Engine.Reflection.Compute.RecordError($"It is not allowed to wrap IRequests of type {nameof(FilterByLink)} into a {nameof(LogicalNotRequest)} request.");
                    return(false);
                }
                else if (subRequest.AllRequestsOfType(typeof(LogicalNotRequest)).Count != 0)
                {
                    BH.Engine.Reflection.Compute.RecordError($"A chain of nested {nameof(LogicalNotRequest)}s has been detected, which is not allowed.");
                    return(false);
                }
                else if (subRequest.AllRequestsOfType(typeof(FilterByLink)).Count != 0)
                {
                    BH.Engine.Reflection.Compute.RecordError($"A {nameof(FilterByLink)} nested in {nameof(LogicalNotRequest)} has been detected, which is not allowed.");
                    return(false);
                }
                else
                {
                    return(subRequest.IsValidToOrganize());
                }
            }
            else if (request is ILogicalRequest)
            {
                List <IRequest> subRequests = ((ILogicalRequest)request).IRequests();
                if (subRequests.Any(x => x.GetType() == typeof(FilterByLink)) &&
                    (request is LogicalOrRequest || (request is LogicalAndRequest && subRequests.Count == 1)))
                {
                    BH.Engine.Reflection.Compute.RecordError($"It is not allowed to pull from links without any filtering (IRequest of type {nameof(FilterByLink)} needs to be wrapped into a {nameof(LogicalAndRequest)}).");
                    return(false);
                }

                return(subRequests.All(x => x.IsValidToOrganize()));
            }

            return(true);
        }
Exemplo n.º 2
0
        /***************************************************/
        /****              Private Methods              ****/
        /***************************************************/

        private static bool TryOrganizeByLink(this IRequest request, Document document, Dictionary <Document, IRequest> requestsByLinks)
        {
            if (request == null)
            {
                return(false);
            }

            if (request is FilterByLink)
            {
                BH.Engine.Reflection.Compute.RecordError($"It is not allowed to pull from links without any filtering (IRequest of type {nameof(FilterByLink)} needs to be wrapped into a {nameof(LogicalAndRequest)} with at least one more request).");
                return(false);
            }
            else if (!request.IsValidToOrganize())
            {
                return(false);
            }

            List <IRequest> linkRequests = request.AllRequestsOfType(typeof(FilterByLink));

            if (linkRequests.Count == 0)
            {
                requestsByLinks.AddRequestByLink(request, document);
                return(true);
            }
            else if (linkRequests.Count == 1)
            {
                FilterByLink     linkRequest     = (FilterByLink)linkRequests[0];
                List <ElementId> linkInstanceIds = document.ElementIdsOfLinkInstances(linkRequest.LinkName, linkRequest.CaseSensitive);

                if (linkInstanceIds.Count == 1)
                {
                    request.RemoveSubRequest(linkRequest);
                    request = request.SimplifyRequestTree();
                    requestsByLinks.AddRequestByLink(request, ((RevitLinkInstance)document.GetElement(linkInstanceIds[0])).GetLinkDocument());
                    return(true);
                }
                else if (linkInstanceIds.Count == 0)
                {
                    BH.Engine.Reflection.Compute.RecordError($"Active Revit document does not contain links with neither name nor path nor ElementId equal to {linkRequest.LinkName}.");
                }
                else
                {
                    BH.Engine.Reflection.Compute.RecordError($"There is more than one link document named {linkRequest.LinkName} - please use full link path or its ElementId instead of link name to pull.");
                }
            }

            return(false);
        }
Exemplo n.º 3
0
        /***************************************************/
        /****             Protected methods             ****/
        /***************************************************/

        protected override int Delete(IRequest request, ActionConfig actionConfig = null)
        {
            if (request == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Deletion could not be executed because provided IRequest is null.");
                return(0);
            }

            if (request.AllRequestsOfType(typeof(FilterByLink)).Count != 0)
            {
                BH.Engine.Reflection.Compute.RecordError($"It is not allowed to remove objects from Revit links - please remove the requests of type {nameof(FilterByLink)} from the request.");
                return(0);
            }

            Document          document     = this.Document;
            RevitRemoveConfig removeConfig = actionConfig as RevitRemoveConfig;

            IEnumerable <ElementId> worksetPrefilter = null;

            if (!removeConfig.IncludeClosedWorksets)
            {
                worksetPrefilter = document.ElementIdsByWorksets(document.OpenWorksetIds().Union(document.SystemWorksetIds()).ToList());
            }

            IEnumerable <ElementId> elementIds = request.IElementIds(document, worksetPrefilter).RemoveGridSegmentIds(document);

            List <ElementId> deletedIds = Delete(elementIds, document, removeConfig.RemovePinned);

            if (deletedIds == null)
            {
                return(0);
            }
            else
            {
                return(deletedIds.Count);
            }
        }