C# 如何将视口中的三维对象保存到文件中并在稍后打开?

C# 如何将视口中的三维对象保存到文件中并在稍后打开?,c#,wpf,helix-3d-toolkit,C#,Wpf,Helix 3d Toolkit,我在HelixViewport3D中添加了不同类型的3D对象。我的问题是如何将三维对象/模型保存在文件中,然后像典型的CAD应用程序一样晚些打开 HelixViewport3D是用户在控件UserControl.xaml中定义的 UserControl定义如下: <UserControl x:Class="SubWindows.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/present

我在HelixViewport3D中添加了不同类型的3D对象。我的问题是如何将三维对象/模型保存在文件中,然后像典型的CAD应用程序一样晚些打开

HelixViewport3D是用户在控件UserControl.xaml中定义的

UserControl定义如下:

<UserControl x:Class="SubWindows.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:HelixToolkit="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf"
         Height="350" Width="525" MouseRightButtonDown="OnMouseRightButtonDown" TabIndex="0" MouseMove="UserControl_MouseMove" Opacity="1">
<Grid>
<HelixToolkit:HelixViewport3D x:Name="ViewPort" ZoomExtentsWhenLoaded="True" ItemsSource="{Binding}">
        <HelixToolkit:SunLight Brightness="0.4" Ambient="0.1" />
        <ModelVisual3D Content="{Binding Model}"/>
        <ModelVisual3D x:Name="SolidModels"/>
        <ModelVisual3D x:Name="ScreenLineModels"/>
        <ModelVisual3D x:Name="DimLinesModels"/>
        <ModelVisual3D x:Name="TagsModels"/>
    </HelixToolkit:HelixViewport3D>
    <Canvas Name="TagsOverlay" IsHitTestVisible="False" ClipToBounds="False"/>
    <Canvas Name="DimsOverlay" IsHitTestVisible="False" ClipToBounds="False" />
</Grid>
“us”是UserControl1的一个实例,定义为UserControl1 uc=new UserControl1();当我保存ToolStripMenuItem\u单击以保存文件时,出现如下快照所示的错误

但视口的一部分是以xaml格式保存的


任何解决问题的意见都将不胜感激。

首先,您需要使用Helix Vieport3D的export()[例如viewport.export(/sample.xaml)方法导出viewport3D,该方法将为您提供一个带有键值的xaml文件(如果您将模型导出为.xaml), 稍后将导出的XAML文件添加到项目目录中,并使用以下代码

UserConrol.xaml文件的代码

   <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="<Path towards your exported xaml file>\sample.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</UserControl.Resources>

用于导入XAML文件的代码

  HelixViewport3D viewport;   //Extra viewport to store the childrens
        viewport= (HelixViewport3D)FindResource("Model");
         // "Model" is the key value of my exported XAML file

        List<Visual3D> items = new List<Visual3D>();    // List is use to store the childrens of ResourceDirectories xaml. 

        //Adds the children inside List
        for (int i=(viewport.Children.Count - 1);i>=0;i--)
        {
            items.Add(viewport.Children[i]);
            viewport.Children.RemoveAt(i);
        }

        //viewport3D.Children.Clear();

        foreach(Visual3D item in items)
        {
            viewport3D.Children.Add(item);
        }
HelixViewport3D视口;//存储孩子的额外视口
视口=(HelixViewport3D)FindResource(“模型”);
//“Model”是我导出的XAML文件的键值
List items=new List();//List用于存储ResourceDirectory xaml的子目录。
//将子项添加到列表中
对于(int i=(viewport.Children.Count-1);i>=0;i--)
{
items.Add(viewport.Children[i]);
viewport.Children.RemoveAt(i);
}
//viewport3D.Children.Clear();
foreach(项目中的Visual3D项目)
{
viewport3D.Children.Add(项);
}
  HelixViewport3D viewport;   //Extra viewport to store the childrens
        viewport= (HelixViewport3D)FindResource("Model");
         // "Model" is the key value of my exported XAML file

        List<Visual3D> items = new List<Visual3D>();    // List is use to store the childrens of ResourceDirectories xaml. 

        //Adds the children inside List
        for (int i=(viewport.Children.Count - 1);i>=0;i--)
        {
            items.Add(viewport.Children[i]);
            viewport.Children.RemoveAt(i);
        }

        //viewport3D.Children.Clear();

        foreach(Visual3D item in items)
        {
            viewport3D.Children.Add(item);
        }