Перейти к публикации

Вопрос по API


fomenko

Рекомендованные сообщения

Помогите разобраться с работой функции SldWorks.PreviewDoc ( hWnd, fullname) на С#

В окне pictureBox нужно отобразить картинку модели.

При запуске выходит ошибка "System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

private void button9_Click_2(object sender, EventArgs e)

{

int Hwnd = (int)this.pictureBox2.Handle;

swApp.PreviewDoc(ref Hwnd, "c:\\part.sldprt");

}

Подскажите пожалуйста что неправильно сделал ?

Изменено пользователем fomenko
Ссылка на сообщение
Поделиться на других сайтах


Подскажите пожалуйста что неправильно сделал ?

В окне pictureBox нужно отобразить картинку модели.

При запуске выходит ошибка "System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

private void button9_Click_2(object sender, EventArgs e)

{

int Hwnd = (int)this.pictureBox2.Handle;

swApp.PreviewDoc(ref Hwnd, "c:\\part.sldprt");

}

Ссылка на сообщение
Поделиться на других сайтах

А если Handle формы взять? Вобще-то я в этом языке не силён.

Ссылка на сообщение
Поделиться на других сайтах

Помогите разобраться с работой функции SldWorks.PreviewDoc ( hWnd, fullname) на С#

А почему именно ее? Я пользуюсь previewBitmap = SldWorks.GetPreviewBitmap ( filePathName, configName ). Все равно обе эти функции вытягивают bitmap с последнего сохранения файла, а GetPreviewBitmap еще и bitmap конфигураций.

Примерно так:

//надо добавить Reference на библиотеку c:\WINDOWS\system\stdole.tlb

		public void LoadPicture(string strNameFile)

		{

			stdole.StdPicture picture = (stdole.StdPicture)swApp.GetPreviewBitmap(strNameFile, strConfig); // вытаскиваем из файла картинку данной конфигурации

			Image img = (Image)ImageConvert.PictureToImage(picture); // конвертируем



			double dres1 = Convert.ToDouble(img.Height) / Convert.ToDouble(img.Width); // получаем отношение высоты к ширине вытянутого image

			double dres2 = Convert.ToDouble(picBox.Height) / Convert.ToDouble(picBox.Width); // получаем отношение высоты к ширине вашего PictureBox



			Size size = new Size();



			picBox.SuspendLayout();

			// Дальше корректируем размеры PictureBox-a, чтобы картинка не искажалась.

			if (dres2 > dres1)

			{

				size.Width = picBox.Width;

				size.Height = Convert.ToInt32(Convert.ToDouble(picBox.Width) * dres1);

				picBox.Location = new Point(0, (picBox.Height - size.Height) / 2);

			}

			else

			{

				size.Height = picBox.Height;

				size.Width = Convert.ToInt32(Convert.ToDouble(picBox.Height) / dres1);

				picBox.Location = new Point((picBox.Width - size.Width) / 2, 0);

			}

			picBox.ResumeLayout();

			// грузим рисунок в PictureBox

			Bitmap bmp = new Bitmap(img, size);

			picBox.Image = (Image)bmp;

		}



// добавить в проект класс

	sealed public class ImageConvert : System.Windows.Forms.AxHost

	{

		private ImageConvert() : base(null) { }



		public static System.Drawing.Image PictureToImage(stdole.StdPicture picture)

		{

			return System.Windows.Forms.AxHost.GetPictureFromIPicture(picture);

		}

	}
Ссылка на сообщение
Поделиться на других сайтах

Спасибо за подсказку. Все получилось.

Только модели в картинках маленькие. В 2007 Солиде в диалоговом окне открытия файлов в окне предварительнго просмотра картинке намного лучше.

Подскажите как можно отобразить такие Preview.

Ссылка на сообщение
Поделиться на других сайтах

Может чего здесь найдётся:

<noindex>http://www.solidworks.com/pages/services/A...ds.html?PID=121</noindex>

<noindex>http://www.solidworks.com/pages/services/C...es.html?PID=121</noindex>

Вот этот например (только там используется прилагаемая DLL), Extract preview bitmaps ( C++ and VB) Updated: 7/17/2002 Size: 0.044 MB: <noindex>http://www.solidworks.com/downloads/API/Do...tractBitmap.zip</noindex> (чтобы можно было попробовать прилагаемый исполняемый файл в архиве, необходимо создать следующию папку "C:\Possum")

Ссылка на сообщение
Поделиться на других сайтах

Только модели в картинках маленькие. В 2007 Солиде в диалоговом окне открытия файлов в окне предварительнго просмотра картинке намного лучше.

Подскажите как можно отобразить такие Preview.

Вообще-то какой PictureBox такая и картинка. Я у себя подписался на событие Resize формы для масштабирования PictureBox, так она может быть хоть во весь экран. Хотя у Вас может задача совершенно другая, чем у меня.

Ну а на счет красоты , то средствами API SW, на мой взгляд, вряд-ли вы получите такую картинку. Все функции, которые вытягивают эти самые картинки из SW довольно старые, и они показывают изображение, которое было при последнем сохранении файла. Единственный совет, наверное, смотреть в сторону Win32 API. Но там код довольно-таки сложный. Хотя могу и ошибаться, такой задачи у меня не стояло, особенно на C#(хотя попробуйте покопать классы System.IO.Stream, System.IO.File...) Тут на форуме была тема про plugin для TC, так там вроде была ссылка не него, и там есть открытый код для извлечения картинки, правда на С++. Эта библиотека аналогична той на которую указал Kelny.

Изменено пользователем Shvg
Ссылка на сообщение
Поделиться на других сайтах

Возможно ли воспользоваться функцией ModelDoc2.SaveBMP ( filenameIn, widthIn, heightIn ) не открывая деталь в SolidWorks ?

Ссылка на сообщение
Поделиться на других сайтах

Возможно ли воспользоваться функцией ModelDoc2.SaveBMP ( filenameIn, widthIn, heightIn ) не открывая деталь в SolidWorks ?

А если не секрет, чем она лучше метода преведённый ранее?:

Dim extractBmpObject As New SW_EXTRACTBITMAPLib.SolidWorks_ExtractBitmap

	Dim iPicture As IPictureDisp



extractBmpObject.ExtractBitmapByNameToIPicture filename.Text, previewList.Text, Width, Height, iPicture

previewBox.Picture = iPicture
Ссылка на сообщение
Поделиться на других сайтах

Возможно ли воспользоваться функцией ModelDoc2.SaveBMP ( filenameIn, widthIn, heightIn ) не открывая деталь в SolidWorks ?

Если вы получите указатель на документ SolidWorks-а, то, наверное, можно. Хотя его получают, обычно, исползьзуя функции

status = SldWorks->get_IActiveDoc2 ( &retval ) или

status = SldWorks->OpenDoc6 ( filename, type, options, configuration, &Errors, &Warnings, &retval ),

т.е когда он открыт и активен.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

  • Сообщения

    • Udav817
      задача построить то, что будет разворачиваться.  а вот ты внимательно читать не научился) ветерок в голове, да и только.
    • bubl leg
      Всем доброго, друзья! Может кто умного чего подскажет: надо в солиде сделать комплект из пары моделей и потом вывести так - чтобы они, при вставке в слайсер Cura (это я для FDM 3d печати заморачиваюсь) - вывелись строго в том же пространственном положении (например, как бутерброд, лежащие друг на друге, в том же положении, как и в солиде). Я как то так делал - но забыл...:-)   Зачем это надо: печатаю нижнюю модель, печать заканчивается. меняю цвет прутка, удаляю нижнюю деталь, загружаю верхнюю и печатаю её. У меня как то давно так получалось вывести, что модель можно было разгруппировать и удалить ненужное. Сейчас в .stl всегда экспортирую под печать - там не работает такое. Итак? ;-) Любым идеям буду рад!
    • Maik812
      чем открыл/сохронил? сделай сохранить копию.
    • gudstartup
    • Guhl
      Журнал "Огонёк" брать надо, у него бумага хорошая, плотная.
    • Viktor2004
      ну да. Поезд попался не реставрированный. Даже без биотуалета. До последнего момента думал что поеду один в купе. В последнюю секунду вбегает мужик с глазами как у рака. Бросил сумку и давай метаться от туалета к туалету. Но нет. Санитарная зона. А ему очень плохо. Говорю ему, Ладно. Давай этот журнал раскладывай на полу, закрывай дверь и делай свое дело. Потом свернешь в окно выкинешь. Его аж трясет бедного. Закрыли дверь, он расположился, я отвернулся, отошел к окну, открыл его и закурил. Вдруг слышу сзади грозный упрек "Вообще-то в купе не курят!"  
    • gudstartup
      @Viktor2004 согласен. но человек сам хочет попробовать фанук на зуб.. с фирмой или китайцами всегда успеет связаться
    • Viktor2004
      ему надо искать фирму которая продаст FROM модуль к его станку. И ехать покупать вместе с ЧПУ что бы на месте проверить
    • gudstartup
      @Viktor2004 у автора по от 35i работает на 32i а собственный модуль фром неисправен и в м\сх флэш небольшая каша в данных так что ему придется искать другой фром модуль от 32i чтобы считать  рабочий   образ с нормальными данными.  
    • Viktor2004
      Я пробовал считывать так. Выпаял микросхему памяти из модуля, затем купил CF карту с таким же контроллером. Выпаял оттуда микросхему на 128Mb она была на месте "0" и впаял вместо нее микросхему с модуля. https://market.yandex.ru/product--karta-pamiati-cfg8b51mkazws-zaveb-tdk-512-mb/109304488?sku=102980643607&uniqueId=45170721&do-waremd5=G3-wTXG-Bm2zCvteY2KyaA&resale_goods=resale_resale&resale_goods_condition=resale_excellent Так как контроллеры совпадают, GBDriver RA8 программой WINHEX я снял образ с карты. Там уже все блоки были на своих местах. Только вряд ли вам это поможет. На 31i-A такое бы еще прокатило, а на 31i-B в системе появился файл SYS CNTL. Он генерится как на основе загружаемого софта, так и на основе ID-номера контроллера GBDriver. Так что побитно скопированная микросхема у меня работать не стала.
×
×
  • Создать...