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>

关闭按钮、切换场景

控件模板

 

posted on 2025-04-07 17:01  张彦山  阅读(223)  评论(0)    收藏  举报