基于.NET开发STEP三维模型浏览器
本教程介绍使用AnyCAD .NET SDK开发一个功能完整的STEP文件浏览器程序。通过这个教程,您将学会创建一个具有3D模型显示和树形结构浏览功能的WPF应用程序。
1. 功能特性
- 加载和显示STEP格式的3D模型文件
- 树形结构展示模型的层次关系
- 支持通过复选框控制模型部件的可见性
- 支持双击树节点高亮对应的3D模型
- 支持鼠标选择3D模型并在树形结构中定位
2. 环境要求
- Windows 10 或更高版本
- Visual Studio 2022 或更高版本
- .NET 4.x/6.0/8.0 SDK
- AnyCAD .NET SDK (通过NuGet包管理器安装)
3. 创建过程
3.1 创建WPF项目
- 打开Visual Studio,创建新的"WPF App (.NET Core)"项目
- 将项目命名为"StepBrowser"
- 设置目标框架为".NET 8.0"(推荐)
3.2 安装AnyCAD NuGet包
- 在解决方案资源管理器中右键点击项目
- 选择"管理NuGet程序包"
- 在浏览选项卡中搜索"AnyCAD.Rapid.NET"
- 安装最新版本的AnyCAD .NET SDK
或者通过包管理器控制台执行:
Install-Package AnyCAD.Rapid.NET
3.3 配置项目属性
在项目文件(.csproj)中添加以下属性:
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
<ApplicationIcon>app.ico</ApplicationIcon>
</PropertyGroup>
3.4 初始化AnyCAD
在App.xaml.cs中初始化AnyCAD SDK:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
AnyCAD.Foundation.GlobalInstance.Initialize();
}
private void Application_Exit(object sender, ExitEventArgs e)
{
AnyCAD.Foundation.GlobalInstance.Destroy();
}
}
3.5 设计主界面
在MainWindow.xaml中创建左右布局的界面:
<Window x:Class="StepBrowser.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:anycad="clr-namespace:AnyCAD.WPF;assembly=AnyCAD.WPF.NET8"
Title="STEP浏览器" Height="450" Width="800">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250" MinWidth="100"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" MinWidth="200"/>
</Grid.ColumnDefinitions>
<!-- 左侧区域 -->
<Grid Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 工具栏 -->
<ToolBar Grid.Row="0" Height="30">
<Button Name="OpenFileButton" Content="打开" Click="OpenFileButton_Click"/>
<Button Name="ZoomAl" Content="适合" Click="ZoomAl_Click"/>
</ToolBar>
<!-- 树形控件 -->
<TreeView Grid.Row="1" Name="FileTree" ItemsSource="{Binding TreeNodes}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource BoolToVis}}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}" VerticalAlignment="Center" Margin="0,0,5,0" Checked="TreeNode_Checked" Unchecked="TreeNode_Checked"/>
<Image Source="{Binding Icon}" Width="16" Height="16" Margin="0,0,5,0"/>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
<!-- 分割条 -->
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="LightGray"/>
<!-- 右侧三维显示窗口 -->
<anycad:RenderControl Grid.Column="2" x:Name="mViewer" Margin="0,0,0,0" ViewerReady="mViewer_ViewerReady">
</anycad:RenderControl>
</Grid>
</Window>
3.6 创建数据模型
创建TreeNodeViewModel类用于绑定TreeView的数据:
public class TreeNodeViewModel : INotifyPropertyChanged
{
private string _name = string.Empty;
private bool _isVisible = true;
private bool _isSelected;
private bool _isExpanded;
private bool _isChecked = true;
private ObservableCollection<TreeNodeViewModel> _children = new();
private ImageSource? _icon;
private uint _tag;
// 属性实现...
public string Name { get; set; }
public bool IsVisible { get; set; }
public bool IsSelected { get; set; }
public bool IsExpanded { get; set; }
public bool IsChecked { get; set; }
public ObservableCollection<TreeNodeViewModel> Children { get; set; }
public ImageSource? Icon { get; set; }
public uint Tag { get; set; }
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
3.7 实现主要功能
在MainWindow.xaml.cs中实现主要功能:
3.7.1 初始化和加载STEP文件
private void mViewer_ViewerReady(object sender, EventArgs e)
{
// 初始化场景
mViewer.Scene.Clear();
mViewer.RequestDraw();
}
private void OpenFileButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "STEP Files (*.step;*.stp)|*.step;*.stp|All Files (*.*)|*.*"
};
if (openFileDialog.ShowDialog() == true)
{
LoadStepFile(openFileDialog.FileName);
}
}
3.7.2 解析STEP文件并构建树形结构
private void LoadStepFile(string filePath)
{
// 清空现有场景
mViewer.Scene.Clear();
_treeNodes.Clear();
// 加载STEP文件
var doc = new XdeDocumentI();
if (!doc.Open(filePath))
{
MessageBox.Show("加载文件失败");
return;
}
// 构建树形结构
for (int ii = 0; ii < doc.GetShapeCount(); ii++)
{
var node = doc.GetShapeNode(ii);
if (node == null)
continue;
var name = node.GetName();
if (name.Length < 1)
name = "<未知>";
TreeNodeViewModel item = new TreeNodeViewModel(name);
ParseChildren(doc, node, item);
_treeNodes.Add(item);
}
// 显示模型
mViewer.Scene.AddNode(doc.GetRootNode());
mViewer.RequestDraw(EnumUpdateFlags.ZoomToFit);
}
4. XdeDocumentI详解
XdeDocumentI是AnyCAD SDK中用于处理STEP文件的核心类。它提供了读取和解析STEP文件的功能,可以访问文件中的几何数据和结构信息。
4.1 主要功能
-
文件加载:
XdeDocumentI doc = new XdeDocumentI(); bool success = doc.Open("path/to/file.step"); -
访问模型结构:
GetShapeCount(): 获取模型中形状的数量GetShapeNode(index): 获取指定索引的形状节点GetRootNode(): 获取模型的根节点
-
节点信息获取:
GetName(): 获取节点名称HasChild(): 检查节点是否有子节点GetShapeType(): 获取节点的形状类型
-
几何数据处理:
GetShape(node): 获取节点的几何形状GetColor(node, defaultColor): 获取节点的颜色信息
4.2 使用示例
// 创建XdeDocumentI实例
XdeDocumentI doc = new XdeDocumentI();
// 打开STEP文件
if (doc.Open("sample.step"))
{
// 遍历所有形状
for (int i = 0; i < doc.GetShapeCount(); i++)
{
XdeNode node = doc.GetShapeNode(i);
if (node != null)
{
// 获取节点名称
string name = node.GetName();
// 获取节点类型
EnumXdeShapeType type = doc.GetShapeType(node);
// 根据类型处理节点
switch (type)
{
case EnumXdeShapeType.Assembly:
// 处理装配体
break;
case EnumXdeShapeType.Simple:
// 处理简单形状
break;
}
}
}
}
4.3 节点遍历
使用XdeNodeIterator遍历子节点:
void ParseChildren(XdeDocumentI doc, XdeNode parentNode)
{
// 检查是否有子节点
if (!parentNode.HasChild())
return;
// 遍历所有子节点
for(var itr = new XdeNodeIterator(parentNode); itr.More(); itr.Next())
{
var childNode = itr.Value();
// 处理子节点
string childName = childNode.GetName();
// 递归处理子节点的子节点
ParseChildren(doc, childNode);
}
}
4.4 与3D场景集成
将STEP文件数据转换为3D场景节点:
// 获取节点的几何形状
var shape = doc.GetShape(node);
// 创建场景节点
var sceneNode = BrepSceneNode.Create(shape, 0, true);
// 设置颜色
var color = doc.GetColor(node, DefaultColor);
sceneNode.SetColor(color);
// 添加到场景中
mViewer.Scene.AddNode(sceneNode);
5. 完整代码下载
码云: https://gitee.com/anycad/step-browser
或
直接Clone
git clone https://gitee.com/anycad/step-browser.git
6. 结语
通过本教程,您已经学会了如何使用AnyCAD .NET SDK创建一个功能完整的STEP浏览器程序。您可以基于此项目进一步扩展功能,开发更复杂的3D应用。

1. 加载和显示STEP格式的3D模型文件
2. 树形结构展示模型的层次关系
3. 支持通过复选框控制模型部件的可见性
4. 支持双击树节点高亮对应的3D模型
5. 支持鼠标选择3D模型并在树形结构中定位
浙公网安备 33010602011771号