Revit API 复制元素重复视图

问题描述 投票:0回答:1

我有一个简单的方法,应该使用任何视图特定元素将视图从一个模型复制到另一个模型。方法如下:

void HandleViewTransfer(View view, Document sourceDoc, Document targetDoc)
{

    var newViewId = ElementTransformUtils
        .CopyElements(sourceDoc, new[] { view.Id }, targetDoc, null, new CopyPasteOptions()).First();
    var newView = targetDoc.GetElement(newViewId) as View;

    var viewElements = new FilteredElementCollector(sourceDoc).OwnedByView(view.Id).ToElementIds();
    ElementTransformUtils.CopyElements(view, viewElements, newView, null, new CopyPasteOptions());
}

当我运行它时,它起作用了......有点。我有一个带有名为“DraftingViewTransferSource”的绘图视图的示例模型,我正在测试将其传输到新文件。当我运行此命令时,我在目标文档“DraftingViewTransferSource”和“DraftingViewTransferSource1”中获得 2 个绘图视图。第一个是空的,第二个看起来与我想要的一模一样(其中包含所有视图特定元素)。

这对我来说意味着它正在尝试将视图本身传输两次,第二次正在重命名。但是,我查看了调试,它只被调用一次,视图 ID 在传输本身中是正确的,并且视图 ID 不在第二次传输(视图特定元素的)中,所以我不确定为什么会这样出现两次。

我也认为视图特定元素可能会引入视图,但事实并非如此,因为该调用需要已经创建视图。

知道我做错了什么吗?

编辑 这是在单个事务中完成的,但我也尝试将视图副本和元素副本包装在单独的事务中,并用子事务包装其中一个,两者都具有相同的结果。

revit-api
1个回答
0
投票

好吧,经过更多的实验,我认为这是一些非常令人困惑的文档的情况。如果它可以帮助别人,这就是我所做的:

  • 我尝试注释掉复制视图本身的部分,并只执行复制视图中元素的部分(我手动创建了目标视图并通过名称找到了它)。我在这里犯了一个幸运的错误,弄乱了视图名称,所以它不一样。运行这个程序时,它仍然引入了所有内容,但是使用了源文档中的视图名称,将我弄乱的那个留在那里并为空。
  • 从上面看来,至少在从一个模型复制到另一个模型时,目标视图并不重要。为了测试这一点,我刚刚找到了目标项目中的一楼平面图,并将其选为目标视图。运行此命令会得到完全相同的结果,视图及其所有内容都被复制到具有正确名称的目标模型中,等等。我可以看到的目标视图没有发生任何变化。
  • 在此之后,我决定尝试使用从一个文档复制到另一个文档的其他重载来复制元素和视图,尽管文档听起来这不适用于视图特定元素。有效!同样的,我传递了视图的 id 和其中的元素,所有内容都按照我想要的方式复制。

所以最后,这似乎就是答案,只需使用文档来记录超载即可。更新后的方法就是:

void HandleViewTransfer(View view, Document sourceDoc, Document targetDoc)
{
    var viewElements = new FilteredElementCollector(sourceDoc)
        .OwnedByView(view.Id)
        .ToElementIds();
    ElementTransformUtils.CopyElements(sourceDoc, viewElements.Concat(view.Id).ToList(), targetDoc, null, new CopyPasteOptions());
}

这是可行的,但是此方法的文档特别指出:

This method can be used for copying non-view specific elements only. For copying view-specific elements, use the view-specific form of the CopyElements method.
对我来说,这意味着您不应该使用它来复制视图内容,您应该使用采用源视图和目标视图的方法。该方法的文档指出
The destination view can be in the same document as the source view.
虽然这并没有具体说明它可以在另一个文档中,但这意味着文档之间很好,甚至可能作为主要用途。这就是为什么我从我所做的地方开始。如上所述,这可行,但似乎只是从给定视图中获取文档并忽略视图本身,因此目标视图除了告诉它要定位哪个文档之外没有真正的功能。

如果有人有更好的答案或解释,我会接受作为答案。

© www.soinside.com 2019 - 2024. All rights reserved.