SolidWorks导出到WPF
复杂模型的建模过程
-1、使用C#代码来计算出规则的表面点位置(圆),以及组织面域
利用插件:HelixToolkit建模函数
-利用专业建模工具,比如SolidWorks、3DMax、Blender、UE、Au0CAD等等,建模后导出特定格式,再将这特定格式的模型加载到WPF程序里


1、helix命名空间
xmlns:ht="http://helix-toolkit.org/wpf"
2、屏幕居中,宽高
WindowStartupLocation="CenterScreen"
Title="MainView" Height="550" Width="1100"
3、无边框
<WindowChrome.WindowChrome>
<WindowChrome NonClientFrameEdges="Left" UseAeroCaptionButtons="False"/>
</WindowChrome.WindowChrome>
4、ht:HelixViewport3D,关闭左下角坐标、右下角面
<ht:HelixViewport3D x:Name="hvp" ShowCoordinateSystem="False"
ShowViewCube="False"
5、默认光源
<ht:DefaultLights/>
6、网格线
<ht:GridLinesVisual3D Fill="#2FFF" Width="10000" Length="10000"
Normal="0,1,0"
Thickness="1" MajorDistance="100" MinorDistance="25"/>
7、添加模型

启动,只有网格线
双击中间,出现
但是方向不对需要调整方向
可以调整到自己想要的位置,添加按钮获取当前屏幕相机的Camera属性,再放到窗口中
8、启动的默认状态通过断点调试获取

快速监视

观察口的方向,向上的方向


没灯光会显示黑色
9、网格线不是同一个平面,需要调整

Normal="0,1,0"

10、背景色
镜像渐变
<Grid.Background> <RadialGradientBrush Center="0.3,0" GradientOrigin="0.3,0" RadiusY="0.8" RadiusX="0.8" SpreadMethod="Pad"> <GradientStop Color="#FF7790A5" Offset="0"/> <GradientStop Color="#FF273A50" Offset="1"/> </RadialGradientBrush> </Grid.Background>
11、调整材质
半透明的材质

蓝色是框架默认初始颜色
GeometryModel3D model = group.Children[0] as GeometryModel3D;//必须要转换才能拿到
model.Material =new DiffuseMaterial(Brushes.Orange);

正面材质
还有蓝色块是因为背面颜色
设置半透明颜色,使用MaterialHelper
model.BackMaterial = model.Material =MaterialHelper.CreateMaterial(Colors.Aqua, opacity: 0.3);
12、鼠标互动
点击零件模型改变颜色,点击别处当前恢复

事件添加到模型,但是点击旁边的地方呢?
一般是要把事件加到容器上面

GeometryModel3D _previewModel = null; private void hvp_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { //this.hvp.Viewport初始,FindHits找到命中的位置,取第一个点击的对象 var hit_result = this.hvp.Viewport.FindHits(e.GetPosition(this.hvp)).FirstOrDefault(); if (_previewModel != null) { _previewModel.BackMaterial = _previewModel.Material = MaterialHelper.CreateMaterial(Colors.Aqua, opacity: 0.3); } if (hit_result != null) { if (hit_result.Visual is MyModel3D model3D) { //model3D.DeviceId //model3D.DeviceNam _previewModel = hit_result.Model as GeometryModel3D;//转换 _previewModel.BackMaterial = _previewModel.Material = MaterialHelper.CreateMaterial(Colors.DeepSkyBlue); } } }
前一个模型:GeometryModel3D _previewModel
如果有恢复原来的颜色
13、点击哪一个
ModelUIElement3D和GeometryModel3D都没有可以记录的属性
需要自己扩展一个带数据的对象
不能继承ModelUIElement3D,是密封类型sealed类
ModelUIElement3D是Model是一个Model3D对象
创建一个自己的类,包括Model3D属性
public class MyModel3D : UIElement3D { public string DeviceId { get; set; } public string DeviceName { get; set; } public Model3D Model { get { return this.Visual3DModel; } set { this.Visual3DModel = value; } } }
简陋实现:设备id可以来源文件名
MyModel3D ele = new MyModel3D(); ele.DeviceId = new FileInfo(file).Name.Split("-")[0]; ele.DeviceName = "设备名称"; ele.Model = group; this.hvp.Children.Add(ele);
正常可以来源数据库:包括设备id,name,设备位置,模型位置
数据结构:id name location model_path
判断是model3D进行设备操作
if (hit_result.Visual is MyModel3D model3D)
14、动画
if (file.IndexOf("Assem1 - malzeme-1") > 0)
{
model.BackMaterial = model.Material =
MaterialHelper.CreateMaterial(Colors.Orange);
TranslateTransform3D tt = new TranslateTransform3D(200, 0, 0);
ele.Transform = tt;
DoubleAnimation da = new DoubleAnimation(-800, 0, new TimeSpan(0, 0, 10));
da.RepeatBehavior = RepeatBehavior.Forever;
tt.BeginAnimation(TranslateTransform3D.OffsetXProperty, da);
}
指定的模型,从沿着X轴向下循环移动,10秒执行一次
15、Path指标效果
<Path Data="M0 0C100 100 50 180 10 200L300 200 300 0z" Stretch="UniformToFill" StrokeThickness="2" Grid.Column="1"> <Path.Stroke> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Color="Transparent" Offset="0"/> <GradientStop Color="Gold" Offset="0.3"/> <GradientStop Color="Gold" Offset="0.7"/> <GradientStop Color="Transparent" Offset="1"/> </LinearGradientBrush> </Path.Stroke> <Path.Fill> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Color="#CCF7F9FA" Offset="0"/> <GradientStop Color="#44F7F9FA" Offset="1"/> </LinearGradientBrush> </Path.Fill> </Path>
拉伸填充满 Stretch="UniformToFill",界面变化的时候会跟着一起变
边框颜色,中间偏黄
填充颜色,灰白色底色效果
16、组件

Meter仪表效果,WaterProgress水波纹效果

引入命名空间
xmlns:c="clr-namespace:Zys.DigitalTwin.Components"
<UniformGrid Grid.Column="1" Margin="120,0,20,0" Height="180"> <c:Meter Margin="15,0" Value="45" Unit="件/分钟"/> <c:Meter Margin="15,0" Value="13" Unit="件/分钟"/> </UniformGrid>
17、分类任务统计
<TextBlock Text="任务统计" Foreground="#A000" FontWeight="Bold" FontSize="14" Grid.Row="1" Margin="150,20,0,0" VerticalAlignment="Top"/> <UniformGrid Grid.Row="1" Margin="180,40,10,0" Columns="2"> <Border BorderBrush="#2FFF" BorderThickness="0,0,1,1"> <StackPanel VerticalAlignment="Center" Margin="3,0"> <TextBlock Text="运行时长" Foreground="#5500FFFF"/> <TextBlock Text="1,234.567" Margin="0,5" FontSize="16" FontWeight="Bold" Foreground="Orange"/> <TextBlock Text="+12.00%" Foreground="#999AC7DA" FontSize="10"/> </StackPanel> </Border> <Border BorderBrush="#2FFF" BorderThickness="0,0,0,1"> <StackPanel VerticalAlignment="Center" Margin="3,0"> <TextBlock Text="累计产量" Foreground="#5500FFFF"/> <TextBlock Text="1,234.567" Margin="0,5" FontSize="16" FontWeight="Bold" Foreground="Orange"/> <TextBlock Text="+12.00%" Foreground="#999AC7DA" FontSize="10"/> </StackPanel> </Border> <Border BorderBrush="#2FFF" BorderThickness="0,0,1,1"> <StackPanel VerticalAlignment="Center" Margin="3,0"> <TextBlock Text="故障停机" Foreground="#5500FFFF"/> <TextBlock Text="34.5" Margin="0,5" FontSize="16" FontWeight="Bold" Foreground="Orange"/> <TextBlock Text="-12.00%" Foreground="#999AC7DA" FontSize="10"/> </StackPanel> </Border> <Border BorderBrush="#2FFF" BorderThickness="0,0,0,1"> <StackPanel VerticalAlignment="Center" Margin="3,0"> <TextBlock Text="运行时长" Foreground="#5500FFFF"/> <TextBlock Text="1,234.567" Margin="0,5" FontSize="16" FontWeight="Bold" Foreground="Orange"/> <TextBlock Text="+12.00%" Foreground="#999AC7DA" FontSize="10"/> </StackPanel> </Border> <Border BorderBrush="#2FFF" BorderThickness="0,0,1,0"> <StackPanel VerticalAlignment="Center" Margin="3,0"> <TextBlock Text="故障停机" Foreground="#5500FFFF"/> <TextBlock Text="34.5" Margin="0,5" FontSize="16" FontWeight="Bold" Foreground="Orange"/> <TextBlock Text="-12.00%" Foreground="#999AC7DA" FontSize="10"/> </StackPanel> </Border> <Border BorderBrush="#2FFF" BorderThickness="0"> <StackPanel VerticalAlignment="Center" Margin="3,0"> <TextBlock Text="运行时长" Foreground="#5500FFFF"/> <TextBlock Text="1,234.567" Margin="0,5" FontSize="16" FontWeight="Bold" Foreground="Orange"/> <TextBlock Text="+12.00%" Foreground="#999AC7DA" FontSize="10"/> </StackPanel> </Border> </UniformGrid>
18、产量统计
添加包 LiveCharts.Wpf
有些bug,但是基本使用是可以的

xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
<TextBlock Text="产量统计" Foreground="#A000" FontWeight="Bold" FontSize="14" Grid.Row="2" Margin="150,20,0,0" VerticalAlignment="Top"/> <lvc:CartesianChart Margin="130,20,10,20" Grid.Row="2"> <lvc:CartesianChart.Series> <lvc:LineSeries Values="46,20,30,56,57,33,76,54,74,65,66,24,71,77,58,69,68,50,51,53" PointGeometrySize="0" Stroke="Orange" StrokeThickness="1" Fill="Transparent"> </lvc:LineSeries> </lvc:CartesianChart.Series> <lvc:CartesianChart.AxisX> <lvc:Axis Labels="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"> <lvc:Axis.Separator> <lvc:Separator Step="2" StrokeThickness="0"/> </lvc:Axis.Separator> </lvc:Axis> </lvc:CartesianChart.AxisX> <lvc:CartesianChart.AxisY> <lvc:Axis MinValue="0" MaxValue="100" Foreground="Transparent"> <lvc:Axis.Separator> <lvc:Separator Step="25" Stroke="Transparent"/> </lvc:Axis.Separator> </lvc:Axis> </lvc:CartesianChart.AxisY> </lvc:CartesianChart>
关闭按钮、切换场景
控件模板
浙公网安备 33010602011771号