二.搭建一个Taskpane的SolidWorks插件

二.搭建一个Taskpane的SolidWorks插件

SolidWorks插件-将SolidWorks文件转换为gltf格式

 虽然可以在另存为选项中扩展gltf功能,但为了在SolidWorks界面上显而易见,我选择了添加一个TaskPane界面。


TaskPane.png

2.新建一个带TaskPane的SolidWork插件

 使用SolidWors自带SwCSharpAddin模板建立一个SolidWorks插件,关于如何找到这个模板可以在看我的另一篇文章。

2.1 新建一个名未DuSwToglTF的插件
2.2 去掉和按钮有关的代码
2.3 添加一个名为Convert.xaml的WPF用户控件.注意添加关于WPF的类库引用

System.xaml;WindowsBase;WindowsFormsIntegration;PresentationCore;PresentionFramework;

  • 将UI Methods区域代码删除,并添加AddTaskPanel()方法
        #region UI Methods
        private void AddTaskPanel()
        {
            try
            {
                //DuSwToglTF.ConvertPanel.PreloadDlls();
                ITaskpaneView pTaskPanView;
                pTaskPanView = iSwApp.CreateTaskpaneView2((ConvertPanel.RootPath+"\\"+ "gltf.bmp"), "将Solidworks文件转换为glTF");
                if (TaskPanelControl == null)
                {
                    SwAddin.TaskPanelControl = new ConvertPanel(SwApp);
                    eleHost.Child = TaskPanelControl;
                }
                pTaskPanView.DisplayWindowFromHandlex64(eleHost.Handle.ToInt64());
            }
            catch (Exception ex)
            {
                SwApp.SendMsgToUser(ex.ToString());
            }
        }
        #endregion

这段代码首先定义了一个TaskpaneView对象,然后通过ISldworks创建了一个TaskpaneView对象。紧接着实例化了一个WPF的用户控件,
此处使用的一个ElementHost来作为WPF界面的容器。此方面的介绍可以查看Winform与WPF的互操作性。最后调用DisplayWindowFromHandlex64方法显示了这个WPF控件,ToInt64()方法传递了一个指针给SolidWorks以便SolidWorks显示。

2.4 在ConnectToSW方法中调用AddTaskPanel()
        public bool ConnectToSW(object ThisSW, int cookie)
        {
            iSwApp = (ISldWorks)ThisSW;
            addinID = cookie;

            //Setup callbacks
            iSwApp.SetAddinCallbackInfo(0, this, addinID);

            #region 添加Taskpane
            AddTaskPanel();
            #endregion

            #region Setup the Event Handlers
            SwEventPtr = (SolidWorks.Interop.sldworks.SldWorks)iSwApp;
            openDocs = new Hashtable();
            AttachEventHandlers();
            #endregion

            return true;
        }

3.使用WPF做一个转换界面

接下来我们需要设计一下UI来实现我们的功能

3.1 安装必要nuget库
  • MVVMLight来实现MVVM模式
  • HandyControl 来美化UI

使用HandyControl注意在xaml文件中引用命名空间

             xmlns:hc="https://handyorg.github.io/handycontrol"

并添加资源字典

<UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
3.2 添加类 ConvertPanelViewModel.cs
namespace DuSwToglTF
{
    public class ConvertPanelViewModel:GalaSoft.MvvmLight.ViewModelBase
    {

    }
}
3.3 设计界面--完整的xaml文件如下
<UserControl x:Class="DuSwToglTF.ConvertPanel"
             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:local="clr-namespace:DuSwToglTF"
             mc:Ignorable="d"              
            
             xmlns:hc="https://handyorg.github.io/handycontrol"
            TextElement.FontWeight="Medium"
            TextElement.FontSize="10"
            FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto"             
          d:DesignHeight="600" d:DesignWidth="300">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <TabControl>
        <TabItem>
            <TabItem.Header>
                <Image Source="pack://application:,,,/DuSwToglTF;component/Resources/Main.png" Width="16" Height="16"></Image>
            </TabItem.Header>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="340"/>
                    <RowDefinition Height="16"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Margin="0,0,-0.4,0">
                    <StackPanel Grid.Row="0" Margin="0" Grid.RowSpan="2">
                        <GroupBox Margin="0,10"  ToolTip="Save Path">
                            <GroupBox.Header >
                                <Label>保存路径</Label>
                            </GroupBox.Header>
                            <Grid  Margin="0,10">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="43*"/>
                                    <RowDefinition Height="50"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="79*"/>
                                    <ColumnDefinition Width="21*"/>
                                </Grid.ColumnDefinitions>
                                <TextBox Text="{Binding FileName}"></TextBox>
                                <Label Grid.Row="0" Grid.Column="1" ToolTip="FileName">文件名</Label>
                                <TextBox Text="{Binding FilePath}" Grid.Column="0" Margin="2,10"  Grid.Row="1"/>
                                <Button Grid.Column="1" Command="{Binding ChoosePathCommand}" Content="..." Margin="0,10" Height="30" ToolTip="选择保存路径" Grid.Row="1"/>
                            </Grid>
                        </GroupBox>
                        <Button Margin="10,2" Command="{Binding SaveCommand}"   Click="Button_Click">
                           保存(Save)
                        </Button>
                        <!--<StackPanel Orientation="Horizontal">
                            <ProgressBar HorizontalAlignment="Stretch" Width="295"></ProgressBar>
                        </StackPanel>-->
                        <Grid  Margin="2">
                            <hc:Card Header="选项">
                                <StackPanel>
                                    <StackPanel Margin="0,5" Orientation="Horizontal">

                                        <CheckBox HorizontalAlignment="Left" Margin="10,0"  IsChecked="{Binding IsOpenFile}"
                                  ToolTip="保存完成后打开文件(Open gltf file after saved)">
                                        保存完打开
                                        </CheckBox>
                                        <CheckBox HorizontalAlignment="Left" Margin="10,0"  IsChecked="{Binding IsOpenFolder}"
                                  ToolTip="保存完成后打开文件夹(Open folder after saved)">
                                            保存完成后打开文件夹
                                        </CheckBox>
                                    </StackPanel>
                                    <Slider Margin="0,10" VerticalAlignment="Center"
  Minimum="0"
  Maximum="100"
  
  ToolTip="网格精度(待实现)"
  Value="50"
  />
                                </StackPanel>
                            </hc:Card>
                        </Grid>
                        <GroupBox Header="批量转换" Visibility="Collapsed">
                        </GroupBox>
                    </StackPanel>
                </ScrollViewer>
                <GridSplitter Grid.Row="1" Background="AliceBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Stretch" Margin="0,7,-0.4,7"  />
                <Grid Grid.Row="2" Margin="0,0,-0.4,0">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="14*"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <!--<materialDesign:Card>
                        <GroupBox Header="批量转换(开发中)" Margin="5,10">
                            <StackPanel>

                            </StackPanel>
                        </GroupBox>
                    </materialDesign:Card>-->
                </Grid>
            </Grid>
        </TabItem>
        <TabItem>
            <TabItem.Header>
                <Image Source="pack://application:,,,/DuSwToglTF;component/Resources/About.png" Width="16" Height="16"></Image>
            </TabItem.Header>
            <StackPanel>
                <Grid Margin="5">
                    <GroupBox >
                        <GroupBox.Header>
                            <Label ToolTip="Info">信息</Label>
                        </GroupBox.Header>
                        <StackPanel>
                            <TextBlock HorizontalAlignment="Center" FontSize="15" Margin="5">
                    DuSwToglTF V0.0.1 Preview
                            </TextBlock>
                            <TextBlock Margin="4">1.支持格式:sldprt,sldasm转换为glTF文件</TextBlock>
                            <TextBlock Margin="4" TextWrapping="Wrap">2.对多实体零件或者装配体的输出未进行测试,可能产生错误</TextBlock>
                            <TextBlock Margin="4">2.包含几何信息和颜色信息,单一面的颜色信息暂未考虑</TextBlock>
                            <TextBlock Margin="4">3.暂未支持光照度,场景,动画等功能</TextBlock>
                        </StackPanel>
                    </GroupBox>
                </Grid>


                <Grid Margin="5" >
                    <Expander Header="NuGet">
                        <!--<Expander.Header >
                            <Label  ToolTip="使用的库或框架">使用的库或框架
                            </Label>
                        </Expander.Header>-->
                        <StackPanel>
                            <Label>1.HandyControl</Label>
                            <Label>2.MVVM-MVVMLight</Label>
                            <Label>2.glTF-sharpglTF</Label>
                        </StackPanel>
                    </Expander>
                </Grid>
                <Grid Margin="5" >
                    <GroupBox Header="项目信息">
                        <StackPanel>
                            <TextBlock>
                                <Hyperlink></Hyperlink>
                            </TextBlock>
                            <TextBlock Margin="5">Code by DuDuDu</TextBlock>
                            <TextBlock Margin="5">Contact me:1831197727@qq.com</TextBlock>
                            <StackPanel Orientation="Horizontal">
                                <Label>Project:</Label>
                                <TextBlock VerticalAlignment="Center">
                                <Hyperlink>https://github.com/weianweigan/DuSwToglTF</Hyperlink>
                                </TextBlock>
                            </StackPanel>
                        </StackPanel>
                    </GroupBox>
                </Grid>
            </StackPanel>
        </TabItem>
    </TabControl>
</UserControl>
3.4将相应属性绑定到viewmodel上

详细的代码可以去GitHub查看

3.5 关于实时获取当前打开的文档,以便自动填写文件路径和名字。

为了在打开零件或者装配体时自动填写文件名和当前打开的文件路径,我们需要监听切换文档的事件。

  • 在SwAddin.cs类的OnDocChange()方法中设置文档名字和路径
 public int OnDocChange()
        {
            TaskPanelControl.viewmodel.SetModelDoc();
            return 0;
        }
3.6 实现ConvertPanelViewModel中的SaveClick()方法
  /// <summary>
        /// 保存按钮执行的动作
        /// </summary>
        private  void  SaveClick()
        {
            List<string> files = null;
            Controller.Convertor.ErrorType errors = Controller.Convertor.ErrorType.NoErros;
            IsInProgress = true;

            if (!System.IO.Directory.Exists(FilePath))
            {
                swApp.SendMsgToUser("当前路径不存在:" + FilePath);
                return;
            }
            if (FilePath.Contains("-") || FileName.Contains("-"))
            {
                swApp.SendMsgToUser("-为非法字符,路径或者文件民包含-字符,请修改路径或者文件名后重新保存");
                return;
            }
            try
            {
                //会堵塞UI;TODO:异步方式实现转换
                var model =  Controller.Convertor.DuConvertor.ConvertToglTFModel(swModel, out errors);
                if (model != null)
                {
                    files =  Controller.Convertor.DuConvertor.SaveAs(model, FilePath, FileName);
                }
                swApp.SendMsgToUser("保存完成");
                if (files != null && IsOpenFile && files.Count >= 3)
                {
                    System.Diagnostics.Process.Start( files[2]);
                }
                if (IsOpenFolder)
                {
                    System.Diagnostics.Process.Start("explorer.exe", FilePath);
                }
                IsInProgress = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
           
            // System.Diagnostics.Process.Start("ExpLore", "C:\\window");
        }

*下面将介绍对SolidWorks模型处理和保存。

 var model =  Controller.Convertor.DuConvertor.ConvertToglTFModel(swModel, out errors);
                if (model != null)
                {
                    files =  Controller.Convertor.DuConvertor.SaveAs(model, FilePath, FileName);
                }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 目录 什么是WPF? WPF的历史? 为什么要用WPF及WPF作用 WPF与winForm区别? 什么是WPF? ...
    灬52赫兹灬阅读 5,777评论 2 11
  • 2.1 新建WPF项目 ### 略 2.2 剖析最简单的XAML代码 XAML是XML派生的 为了表示同类标签中的...
    北风知我意阅读 3,155评论 0 0
  • 一、WPF简介 WPF:WPF即Windows Presentation Foundation,翻译为中文“Win...
    UnicornChen阅读 13,622评论 0 3
  • 今天可谓是轻松的一天,学生已经放假,剩下琐碎的任务也完成了七七八八,我决定今天什么都不做,让自己过一个轻松愉...
    蜗居女士阅读 273评论 0 2
  • 老农为啥一夜之间瓜田尽失?他该如何东山再起?又是如何成为历下首富也?且听本回猫说江湖事外传之老农卖瓜 老农泪下,坐...
    自来诗阅读 1,294评论 19 34