База знаний по трехмерному проектированию в Pro/Engineer, Creo, Solidworks, электронике на STM32
Обучение Solidworks 2013. API. Открытие картинки предпросмотра файла Solidworks с помощью NPOI
Solidworks при сохранении файла модели также сохраняет в файле текущее изображение модели из графического окна. Любой файл Solidworks можно открыть любым современным архиватором и посмотреть его структуру. В этом архиве файл картинки предпросмотра называется PreviewPNG. Попробуем его открыть с помощью имеющихся бесплатных библиотек.
Как это будет выглядеть.
Ниже представлен способ получения изображения предпросмотра из файла модели/чертежа 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 за идею.
Теги
Поделиться ссылкой на статью
Engio.ru - лучший инженерный опыт, бесплатные уроки и обучение Solidworks, Creo, Pro/Engineer, STM32