0

我有两个 revit 项目,MainProject.rvt 和 ProjectToLink.rvt。MainProject.rvt 包含指向 ProjectToLink.rvt 的链接。在 MainProject.rvt 文档中使用下面的代码,我可以访问链接本身:

FilteredElementCollector linkedModelCollector = new FilteredElementCollector(document);
linkedModelCollector.OfCategory(BuiltInCategory.OST_RvtLinks);

foreach (Element linkedModel in linkedModelCollector)
{
   //Do something
}

如何从 MainProject.rvt 访问链接模型 ProjectToLink.rvt 内的元素?我可以像上面的代码一样使用链接元素本身还是有其他机制?

PS - 我需要这个才能为 Revit 2011 工作

4

1 回答 1

3

在 Revit 2012 中,我使用以下功能:

public IEnumerable<ExternalFileReference> GetLinkedFileReferences()
        {
            //ElementFilter categoryFilter = new ElementCategoryFilter(BuiltInCategory.OST_RvtLinks);
            //ElementFilter typeFilter = new ElementClassFilter(typeof(Instance));
            //ElementFilter logicalFilter = new LogicalAndFilter(categoryFilter, typeFilter);

            var collector = new FilteredElementCollector(_document);
            var linkedElements = collector
                .OfClass(typeof (RevitLinkType))
                //.OfCategory(BuiltInCategory.OST_RvtLinks)
                //.WherePasses(logicalFilter)
                .Select(x => x.GetExternalFileReference())
                .ToList();

            return linkedElements;                       
        }

public IEnumerable<Document> GetLinkedDocuments()
        {
            var linkedfiles = GetLinkedFileReferences();
            //List<String> linkedFileName = new List<string>(linkedfiles.Count);            

            var linkedFileNames = linkedfiles                
                .Select(x => ModelPathUtils.ConvertModelPathToUserVisiblePath(x.GetAbsolutePath()))                
                .ToList();

            //linkedFileName.AddRange
            //    (from linkedfile in linkedfiles 
            //     select linkedfile.GetTypeId() into typeId 
            //     where typeId != null 
            //     select document.get_Element(typeId).Name);

            return _document.Application.Documents
                .Cast<Document>()
                .Where(doc => linkedFileNames
                    .Any(fileName => doc.PathName.Equals(fileName)));
        }

第一个获取链接文件的链接(如在您的代码中),第二个获取代表链接文件的文档。因此,当您拥有一个 Document 时,您可以通过 FilteredElementCollector 从中获取任何元素。但请记住,您不能更改链接文件中的元素。

尝试在 Revit 2011 API 中找到类似的功能。并阅读这篇文章

于 2011-12-06T02:59:31.977 回答