/// <summary> /// Identifies if the host element can export when exporting parts. /// 1. If host element has non merged parts (>0), it can be export no matter if it has merged parts or not, and return true. /// 2. If host element has merged parts /// - If the merged part is the right category and not export yet, return true. /// - If the merged part is the right category but has been exported by other host, return false. /// - If the merged part is not the right category, should not export and return false. /// </summary> /// <param name="hostElement">The host element having parts.</param> /// <param name="levelId">The level the part would export.</param> /// <Param name="IsSplit">The bool flag identifies if the host element is split by story.</Param> /// <returns>True if the element can export, false otherwise.</returns> public static bool CanExportElementInPartExport(Element hostElement, ElementId levelId, bool IsSplit) { List <ElementId> associatedPartsList = PartUtils.GetAssociatedParts(hostElement.Document, hostElement.Id, false, true).ToList(); foreach (ElementId partId in associatedPartsList) { Part part = hostElement.Document.GetElement(partId) as Part; if (PartUtils.IsMergedPart(part)) { if (part.OriginalCategoryId == hostElement.Category.Id) { if (IsSplit) { if (!ExporterCacheManager.PartExportedCache.HasExported(partId, levelId)) { // has merged split part and not export yet. return(true); } } else if (!ExporterCacheManager.PartExportedCache.HasRegistered(partId)) { // has merged part and not export yet. return(true); } } } else { return(true); } } // has no merged parts or other parts or merged parts have been exported. return(false); }
public void Stream(Type type) { var part = _elem as Part; if (type == typeof(Element) && _elem is Element element) { _data.Add(new MemberSeparatorWithOffset(nameof(PartUtils))); _data.Add(new Bool(nameof(PartUtils.AreElementsValidForCreateParts), PartUtils.AreElementsValidForCreateParts(element.Document, new[] { element.Id }))); _data.Add(new Object(nameof(PartUtils.GetAssociatedPartMaker), PartUtils.GetAssociatedPartMaker(element.Document, element.Id))); _data.Add(new Bool(nameof(PartUtils.HasAssociatedParts), PartUtils.HasAssociatedParts(element.Document, element.Id))); _data.Add(new Bool(nameof(PartUtils.IsValidForCreateParts), PartUtils.IsValidForCreateParts(element.Document, new LinkElementId(element.Id)))); } if (type == typeof(Part) && part != null) { _data.Add(new MemberSeparatorWithOffset(nameof(PartUtils))); _data.Add(new Bool(nameof(PartUtils.ArePartsValidForDivide), PartUtils.ArePartsValidForDivide(part.Document, new[] { part.Id }))); _data.Add(new Bool(nameof(PartUtils.ArePartsValidForMerge), PartUtils.ArePartsValidForMerge(part.Document, new[] { part.Id }))); _data.Add(new Int(nameof(PartUtils.GetChainLengthToOriginal), PartUtils.GetChainLengthToOriginal(part))); var isMergedPart = PartUtils.IsMergedPart(part); _data.Add(new Enumerable(nameof(PartUtils.GetMergedParts), isMergedPart ? PartUtils.GetMergedParts(part) : Array.Empty <ElementId>(), part.Document)); _data.Add(new Bool(nameof(PartUtils.IsMergedPart), isMergedPart)); _data.Add(new Bool(nameof(PartUtils.IsPartDerivedFromLink), PartUtils.IsPartDerivedFromLink(part))); _data.Add(new MemberSeparatorWithOffset(nameof(Part))); _data.Add(new String(nameof(Part.OriginalCategoryId), ((BuiltInCategory)part.OriginalCategoryId.IntegerValue).ToString())); var sourceElementIds = part.GetSourceElementIds().Where(e => e.HostElementId != ElementId.InvalidElementId).Select(e => e.HostElementId).ToList(); _data.Add(new Enumerable(nameof(Part.GetSourceElementIds), sourceElementIds, part.Document)); var sourceCategoryIds = part.GetSourceElementOriginalCategoryIds().Select(e => (BuiltInCategory)e.IntegerValue).ToList(); _data.Add(new EnumerableAsString(nameof(Part.GetSourceElementOriginalCategoryIds), sourceCategoryIds)); } }