我有一个简单的方法,应该使用任何视图特定元素将视图从一个模型复制到另一个模型。方法如下:
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 不在第二次传输(视图特定元素的)中,所以我不确定为什么会这样出现两次。
我也认为视图特定元素可能会引入视图,但事实并非如此,因为该调用需要已经创建视图。
知道我做错了什么吗?
编辑 这是在单个事务中完成的,但我也尝试将视图副本和元素副本包装在单独的事务中,并用子事务包装其中一个,两者都具有相同的结果。
好吧,经过更多的实验,我认为这是一些非常令人困惑的文档的情况。如果它可以帮助别人,这就是我所做的:
所以最后,这似乎就是答案,只需使用文档来记录超载即可。更新后的方法就是:
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.
虽然这并没有具体说明它可以在另一个文档中,但这意味着文档之间很好,甚至可能作为主要用途。这就是为什么我从我所做的地方开始。如上所述,这可行,但似乎只是从给定视图中获取文档并忽略视图本身,因此目标视图除了告诉它要定位哪个文档之外没有真正的功能。
如果有人有更好的答案或解释,我会接受作为答案。