Обучение Solidworks 2013. API. Открытие картинки предпросмотра файла Solidworks с помощью NPOI

Сайт CAD.Life будет закрыт в начале весны 2018 года. Статьи сохранятся на другом сайте, следите за объявлениями.

Solidworks при сохранении файла модели также сохраняет в файле текущее изображение модели из графического окна. Любой файл Solidworks можно открыть любым современным архиватором и посмотреть его структуру. В этом архиве файл картинки предпросмотра называется PreviewPNG. Попробуем его открыть с помощью имеющихся бесплатных бибилиотек.

Как это будет выглядеть.

Рис.1. Открытие картинки предпросмотра файла Solidworks Ниже представлен способ получения изображения предпросмотра из файла модели/чертежа Solidworks. Для этого нам понадобятся SharhDevelop и библиотека NPOI. В SharhDevelop подключем библиотеку NPOI и в Дизайнере вставляем компоненты openFileDialog1, Button1, listBox1, pictureBox1. Установим для pictureBox1 свойство SizeMode=AutoSize. В listBox1 будем выводить структуру файла модели/чертежа Solidworks (на всякий случай).

После нажатия на Button1 нужно выбрать файл Solidworks и в pictureBox1  загрузится превьюшка.

 

using NPOI.POIFS.FileSystem;

......

void Button1Click(object sender, EventArgs e)
		{
			if (openFileDialog1.ShowDialog() == DialogResult.OK)
			{
				string cpath = openFileDialog1.FileName;
			if (File.Exists(cpath))
			{
				listBox1.Items.Clear();
				listBox1.Items.Add(cpath);

				FileInfo fi=new FileInfo(cpath);
 
				try {
 

	FileStream stream = new FileStream(cpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
//эти параметры позволяют просматривать открытые в Solidworks файлы

 
				POIFSFileSystem poifs = new POIFSFileSystem(stream);								
				var entries = poifs.Root.Entries;
				listBox1.Items.Add(poifs.Root.Name);	
				pictureBox1.Image = null;
				while (entries.MoveNext()) // переберем всю структуру файла Solidworks
					{
					listBox1.Items.Add(entries.Current.Name);
					if (entries.Current.IsDirectoryEntry) 
					continue;
 
					DocumentNode entry = entries.Current as DocumentNode;
	DocumentInputStream dr = poifs.CreateDocumentInputStream(entry.Name);		
 
 
					if (entry.Name == "PreviewPNG")
					{
					byte[] buffer = new byte[dr.Length];
					dr.Read(buffer);
					int startpos = 0;
					dr.Close();
 
					MemoryStream memoryStream1 = new MemoryStream();
	memoryStream1.Write(buffer, startpos, buffer.Length - startpos);
	System.Drawing.Image image1 = System.Drawing.Image.FromStream(memoryStream1);
 // это чтобы не создавать на диске файл предпросмотра
 

					pictureBox1.Image = (System.Drawing.Image)image1;
					pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
					memoryStream1.Dispose();
					}
 
					}
 
				stream.Close();
 
				} catch (Exception ex) {
 
					MessageBox.Show("Нет доступа :" + ex.Message);
				}
			}
			}
		}

 

 Благодарствуем Vav1lon и далее по ссылке Streamdown за идею.

Поделиться ссылкой на статью

CADLife - лучший инженерный опыт, бесплатные уроки и обучение Solidworks, Creo, Pro/Engineer, STM32

Комментарии к статье