SolidWorks_PDM软件开发的技术纪要(1)
SolidWorks_PDM软件开发的技术纪要(1)
本次主要针对已完成的和部分完成的功能进行一次总结。
语言:C#,接口SW API,WINDOWS API
包括:
- 新建功能
- 红绿灯实时刷新
- 搜索功能
- 文件属性中信息提取
1.新建功能
要求:
- 点击“新建”按钮后,跳出选择窗口,可分别点选part、assmbly和两个对应的工程图文档,工程图新建要求为若当前激活存在零件或装配体,根据模板直接生成其对应的工程图,若无存在的零件或装配体,按模板创建xin'd。
- 新建的工程图应该对应零件模型,检测是否链接上模型;可以实现Sw中的参考替换功能
实现原理及代码:
- 添加二级窗口,窗口内实现新建功能的具体需求。
新建零件
//新建零件代码示例 private void NewPart_Click(object sender, EventArgs e) { //零件体模板路径 string Modelpath1 = @"C:\ProgramData\SOLIDWORKS\SOLIDWORKS 2019\templates\li_part.PRTDOT"; //NewDocument():(模板路径及名称,纸张尺寸,纸张的宽,高)[后两参数仅在纸张尺寸为自定义时设定,其余为0] ModelDoc2 SwPartDoc = swApp.NewDocument(Modelpath1, 0, 0, 0); SwPartDoc.Visible = true; MessageBox.Show("新建文档成功,当前文档名为:" + SwPartDoc.GetTitle()); }
从零件生成工程图
private void NewPrtDrw_Click(object sender, EventArgs e) { int IntError = -1; int IntWarning = -1; object Nothing = ""; string Modelpath1 = @"C:\ProgramData\SOLIDWORKS\SOLIDWORKS 2019\templates\li_part.DRWDOT"; ModelDoc2 swDoc = swApp.ActiveDoc; if (swDoc != null) { //当前文件的名称 string filepath = swDoc.GetPathName(); //获取新newfilepath string NewFileath = filepath.Substring(0, filepath.LastIndexOf(@"."))+".SLDDRW"; MessageBox.Show(NewFileath); //打开模板并保存 //NewDocument():(模板路径及名称,纸张尺寸,纸张的宽,高)[后两参数仅在纸张尺寸为自定义时设定,其余为0] ModelDoc2 SwPartDrwDoc = swApp.NewDocument(Modelpath1, 0, 0, 0); SwPartDrwDoc.Extension.SaveAs(NewFileath, 0, 1, Nothing, ref IntError, ref IntWarning); ModelDoc2 SwDrwDoc=swApp.OpenDoc6(NewFileath, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_LoadModel, "", ref IntError, ref IntWarning); Sheet swSheet = ((DrawingDoc)SwDrwDoc).GetCurrentSheet(); MessageBox.Show("预定义" + swSheet.GetName()); //InsertModelInPredefinedView() 在当前激活的sheet下的预定义的视图插入模型*** bool status = ((DrawingDoc)SwDrwDoc).InsertModelInPredefinedView(filepath); MessageBox.Show("从零件体到工程图"+status.ToString()); } else { MessageBox.Show("无打开的Part文档!"); //NewDocument():(模板路径及名称,纸张尺寸,纸张的宽,高)[后两参数仅在纸张尺寸为自定义时设定,其余为0] ModelDoc2 SwPartDrwDoc = swApp.NewDocument(Modelpath1, 0, 0, 0); SwPartDrwDoc.Visible = true; MessageBox.Show("新建文档成功,当前文档名为:" + SwPartDrwDoc.GetTitle()); } }
工程图的参考替换
//工程图---文档参考源替换测试,需要查找,需修改的工程图,原参考的零件/装配体文档,现参考的零件/装配体文档 //沟通更改参考方式2020/6/3 private void ReplaceRefTest_Click(object sender, EventArgs e) { int IntError = -1; int IntWarning = -1; string ReferencingDoc = ScanFile(); Referencing.Text = ReferencingDoc; Referencing.Enabled = false; //string ReferencingDoc = @"D:\Csharp_study\RectanglePlug\PlugBottomBox.SLDDRW"; ModelDoc2 SwDrwDoc = swApp.OpenDoc6(ReferencingDoc, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_LoadModel, "", ref IntError, ref IntWarning); MessageBox.Show("目标文档" + ReferencingDoc); swApp.CloseDoc(ReferencingDoc); //string ReferencedDoc = @"D:\Csharp_study\RectanglePlug\PlugBottomBox.SLDPRT"; //string NewReference = @"D:\Csharp_study\RectanglePlug\PlugTopBox.SLDPRT"; //ReferencedDoc,原参考的文档 string ReferencedDoc = ScanFile(); Referenced.Text = ReferencedDoc; Referenced.Enabled = false; //NewReference,新参考的文档 string NewReference = ScanFile(); NewReferenced.Text = NewReference; NewReferenced.Enabled = false; swApp.ReplaceReferencedDocument(ReferencingDoc, ReferencedDoc, NewReference); //swApp.ReplaceReferencedDocument(ReferencingDoc, NewReference, ReferencedDoc); SwDrwDoc = swApp.OpenDoc6(ReferencingDoc, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_LoadModel, "", ref IntError, ref IntWarning); MessageBox.Show("参考文档" + SwDrwDoc.GetPathName()); } //浏览 方法 private string ScanFile() { OpenFileDialog dialog = new OpenFileDialog(); DialogResult dr = dialog.ShowDialog();//是调用openFileDialog实例 dialog.Title = "选择文件";//选择框名称 dialog.Filter = "所有文件 (*.*)|*.*";//选择文件的类型专为Xls表格 if (dr == DialogResult.OK)//是判断对话框返回结果 { MessageBox.Show(dialog.FileName);//弹出选择文件名信息 } return dialog.FileName; }
2.红绿灯实时刷新
要求:
如果有SW程序正在运行,显示绿灯(常亮);没有则显示红灯(常亮)。无需点击按钮监测。且实现每1s自动刷新检测是否存在,以更新按LED指示灯。C#中使用了Button更改背景色代表LED指示灯。
实现原理:
检测SW进程方法,调用此方法以改变LED指示灯颜色,并将此事件加入定时器控件中,设置定时器刷新频率1s。
红绿灯
//红绿灯按钮 private void LED_Button_Click(object sender, EventArgs e) { bool Exist = ProcessExited(); if (Exist == true) { LED_Button.BackColor = System.Drawing.Color.Green; LED_Button.Text = "Open"; } else { LED_Button.BackColor = System.Drawing.Color.Red; LED_Button.Text = "Close"; } } //是否有进程 private static bool ProcessExited() { Process[] processes = Process.GetProcessesByName("SLDWORKS"); foreach (Process process in processes) { if (process.ProcessName == "SLDWORKS") { return true; } } return false; }
定时器
//红绿灯定时刷新的定时器 private void timer_LED_Tick(object sender, EventArgs e) { LED_Button_Click(sender, e); }
3. 搜索功能
要求:
- 两个listview,一个为使用当前文档的其他文档,一个为当前文档使用的其他文档(未完成)
- 如何在win环境下找到文件相关的其他文件;例如:如何找到当前指定文件夹下使用M6螺栓的文档(未完成)
- 同一个框搜索不同类型属性,根据前方的下拉栏选择搜索类型(完成)
- 单机listview里显示缩略图(完成)
- 完成单一根据属性信息搜索(部分完成,各文件下对应的system.name不一样)
实现原理及代码:
选择路径,根据类型和关键字搜索,类型底层采用字典结构,下拉栏为combbox控件。
属性搜索需要调用windows api中shell的库类。但需注意,不同类型文件调用接口显示的system信息不同。
搜索功能关键代码,以file类搜索示例
//搜索路径的选择,将路径存放在SearFolderPath.Text文本框 private void SearchPath_Click(object sender, EventArgs e) { DialogResult dr = folderBrowserDialog1.ShowDialog(); //是调用文件浏览器控件; if (dr == DialogResult.OK)//是判断文件浏览器控件是否返回ok,即用户是否确定选择。如果确定选择,则弹出用户在文件浏览器中选择的路径: { SearFolderPath.Text = folderBrowserDialog1.SelectedPath; MessageBox.Show(SearFolderPath.Text); } } //private enum Types {名称, 路径, 日期}; //根据类型选择在指定文件夹下搜索,文件,并以预定义格式显示出来 private void Search_Click(object sender, EventArgs e) { //每次搜索前移除之前所有 SearchList.Items.Clear(); //获得类型和搜索关键字 string Searchtype = SearchcomboBox.SelectedItem.ToString(); string Keyword = SearchCon.Text; MessageBox.Show("搜索类型:" + Searchtype + "\r\n" + "搜索关键字:" + Keyword); //通过类型选择,调用不同函数 //string PublicPara = ""; 此处采用每个都调用一次不同函数,其实应整合一起,此处使用的PublicPara便是为了存储,但未实现*** switch(Searchtype) { case "名称": SearchByName(Keyword); break; case "路径": SearchByPath(Keyword); break; case "日期": SearchByDate(Keyword); break; }//switch(Searchtype) } #region 通过类型选择,调用不同的具体方法实现 private void SearchByName(string Keyword) { DirectoryInfo dir = new DirectoryInfo(SearFolderPath.Text); //实例化DirectoryInfo SearchList.View = System.Windows.Forms.View.Details;//定义列表显示的方式 //先遍历出的是子文件夹 GetDirectories() foreach (DirectoryInfo d in dir.GetDirectories()) { if (d.Name.Contains(Keyword)) { //获取名称并添加到SearchList中 SearchList.Items.Add(d.Name); //获取路径 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( d.FullName); //获取创建时间 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( d.CreationTime.ToShortDateString()); } else continue; } //后遍历文件 GetFiles("*.SLDPRT") //文件类型 FileInfo[] files = dir.GetFiles("*.*"); foreach (FileInfo f in files) { if (f.Name.Contains(Keyword)) { //获取名称并添加到SearchList中 SearchList.Items.Add(f.Name); //获取路径 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( f.FullName); //获取创建时间 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( f.CreationTime.ToShortDateString()); } else continue; } }//private void SearchByName(string Keyword) //根据路径搜索 private void SearchByPath(string Keyword) { DirectoryInfo dir = new DirectoryInfo(SearFolderPath.Text); //实例化DirectoryInfo SearchList.View = System.Windows.Forms.View.Details;//定义列表显示的方式 //先遍历出的是子文件夹 GetDirectories() foreach (DirectoryInfo d in dir.GetDirectories()) { if (d.FullName.Contains(Keyword)) { //获取名称并添加到SearchList中 SearchList.Items.Add(d.Name); //获取路径 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( d.FullName); //获取创建时间 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( d.CreationTime.ToShortDateString()); } else continue; } //后遍历文件 GetFiles("*.SLDPRT") //文件类型 FileInfo[] files = dir.GetFiles("*.*"); foreach (FileInfo f in files) { if (f.FullName.Contains(Keyword)) { //获取名称并添加到SearchList中 SearchList.Items.Add(f.Name); //获取路径 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( f.FullName); //获取创建时间 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( f.CreationTime.ToShortDateString()); } else continue; } }//private void SearchByPath(string Keyword) //根据日期搜索 private void SearchByDate(string Keyword) { DirectoryInfo dir = new DirectoryInfo(SearFolderPath.Text); //实例化DirectoryInfo SearchList.View = System.Windows.Forms.View.Details;//定义列表显示的方式 //先遍历出的是子文件夹 GetDirectories() foreach (DirectoryInfo d in dir.GetDirectories()) { if (d.CreationTime.ToShortDateString().Contains(Keyword)) { //获取名称并添加到SearchList中 SearchList.Items.Add(d.Name); //获取路径 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( d.FullName); //获取创建时间 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( d.CreationTime.ToShortDateString()); } else continue; } //后遍历文件 GetFiles("*.SLDPRT") //文件类型 FileInfo[] files = dir.GetFiles("*.*"); foreach (FileInfo f in files) { if (f.CreationTime.ToShortDateString().Contains(Keyword)) { //获取名称并添加到SearchList中 SearchList.Items.Add(f.Name); //获取路径 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( f.FullName); //获取创建时间 SearchList.Items[SearchList.Items.Count - 1].SubItems.Add( f.CreationTime.ToShortDateString()); } else continue; } }//根据日期搜索private void SearchByDate(string Keyword) #endregion
缩略图相关代码
#region 缩略图相关代码 //单击选中后显示缩略图方法 private void SearchList_SelectedIndexChanged(object sender, EventArgs e) { if (SearchList.SelectedItems != null && SearchList.SelectedItems.Count > 0) { //获取文件的完整路径fullname string File = SearchList.SelectedItems[0].ToString(); MessageBox.Show(File); string subfile = File.Substring(File.LastIndexOf("{") + 1, File.Length - 1 - (File.LastIndexOf("{") + 1)); string TempPath = SearFolderPath.Text + @"\" + subfile; MessageBox.Show(TempPath); //调用子方法,显示缩略图 ThumbnailPic(TempPath); } } //单击打显示缩略图测试代码 private void pictureBox1_Click(object sender, EventArgs e) { ShellFile shellFile = ShellFile.FromFilePath(@"D:\Csharp_study\视频缓存区\5月工资明细.avi"); Bitmap shellThumb = shellFile.Thumbnail.ExtraLargeBitmap; pictureBox1.Image = shellThumb; //GetShellThumbnailImage /* int pic_size = 256; string path = @"D:\Csharp_study\视频缓存区\5月工资明细.avi"; Bitmap bm = WindowsThumbnailProvider.GetThumbnail(path, pic_size, pic_size, ThumbnailOptions.None); pictureBox1.Image = bm; */ } //pictureBox1中显示缩略图子方法, private void ThumbnailPic(string filename) { //仅可为文件file的缩略图,不显示文件夹缩略图,因此依然采用原方法 if (Directory.Exists(filename)) { ShellObject shellObject = ShellFolder.FromParsingName(filename); Bitmap shellThumb = shellObject.Thumbnail.ExtraLargeBitmap; pictureBox1.Image = shellThumb; } else if (File.Exists(filename)) { ShellFile shellFile = ShellFile.FromFilePath(filename); Bitmap shellThumb = shellFile.Thumbnail.ExtraLargeBitmap; pictureBox1.Image = shellThumb; } else return; /* //已导入shell包,不再使用此法 int pic_size = 256; Bitmap bm = WindowsThumbnailProvider.GetThumbnail(filename, pic_size, pic_size, ThumbnailOptions.None); pictureBox1.Image = bm; */ } #endregion
4. 文件属性中信息提取
要求:
提取文件右键属性中的详细信息具体内容。包括标题,作者,备注,说明等具体信息。
实现原理及代码:
采用windows api接口,调用shell库实现
部分属性提取代码测试(.jpg文件示例)
private void PropertyInfo_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(""); //更换路径,读取不同文件的属性信息 foreach (var prop in new ShellPropertyCollection(@"D:\Csharp_study\RectanglePlug\M\100001-101000\100014.SLDASM")) { string Value = string.Empty; Value = prop.ValueAsObject == null ? "" : prop.FormatForDisplay( PropertyDescriptionFormatOptions.None); sb.Append(prop.CanonicalName + "=" + Value + "\r\n"); } MessageBox.Show(sb.ToString()); //GetPropertyInfo(@"D:\Csharp_study\视频缓存区\5月工资明细.avi"); } //测试提取属性信息 private void TestButton_Click(object sender, EventArgs e) { ShellPropertyCollection props = new ShellPropertyCollection(@"D:\Csharp_study\RectanglePlug\_TestFile.jpg"); string TypeName = props.Where(prop => prop.CanonicalName == "System.Title").First().FormatForDisplay(PropertyDescriptionFormatOptions.None); MessageBox.Show(TypeName); }