/***************************************************/ 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); }
/***************************************************/ /**** 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); }
/***************************************************/ /**** 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); } }