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

Вопросы По Программирования Под Солид


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

Здравствуйте!

Простите, если что, за глупый вопрос!

//запускаю приложение солида. процесс солида появляется в диспетчере задач
SldWorks.SldWorks swApp = new SldWorks.SldWorks();
//пытаюсь открыть документ
swDoc = ((ModelDoc2)(swApp.OpenDoc6(open_dialog.FileName, 1, 0, "", ref longstatus, ref longwarnings)));//вот здесь происходит иногда зависание
//по идее закрытие приложения солида
swApp.ExitApp();

Проблема в том, что из процессов солид не удаляется, а иногда, по непонятным мне причинам, возникает ошибка: "Cannot evaluate expression because a native frame is on top of the call stack." и программа моя зависает. причем эту ошибку можно увидеть только во время пошаговой отладки программы, никаких сообщений об ошибке само не генерируется, даже в если вышеуказанный код поместить в try/catch.

Что я делаю неправильно?

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


Что я делаю неправильно?

Да вроде все правильно. У меня, бывало, зависание происходило, когда было запущено два процесса SLDWORKS.EXE. И я стал убивать лишний, оставляя только один. Потом с exe ушел в dll и проблема отпала сама собой. И может поможет:

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;



using System.Diagnostics;



using SolidWorks.Interop.sldworks;

using SolidWorks.Interop.swconst;



namespace OpenDoc

{

	class Program

	{

		static void Main(string[] args)

		{

			Process[] processSW = Process.GetProcessesByName("SLDWORKS");

			int countProcess = processSW.Length;

			if (countProcess > 1) // если более одного процесса, то их убиваем

			{

				for (int i = 1; i < processSW.Length; i++)

				{

					Process process = processSW[i];

					process.Kill();

				}

			}



			SldWorks swApp = new SldWorks();

			if (swApp == null)

				return;



			swApp.Visible = true;

			int iErrors = -1, iWarnings = -1;

			string pathFile = @"d:\БТП 1651-4003__013_Хвостовик.SLDPRT";

			IModelDoc2 swModel = swApp.OpenDoc6(pathFile, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent,

												string.Empty, ref iErrors, ref iWarnings);

			if (iErrors != 0)

			{

				string message = "Ошибка при открытии документа!";

				MessageBox.Show(message, "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);

			}

			if (swModel != null)

				swApp.CloseDoc(pathFile);



			//swApp.ExitApp(); // c этой функцией тоже работает и проблем не было



		}

	}

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

Shvg, спасибо за код. Делаю всё примерно так же. А что скажите по поводу странной ошибки "Cannot evaluate expression because a native frame is on top of the call stack."?

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

А что скажите по поводу странной ошибки "Cannot evaluate expression because a native frame is on top of the call stack."?

Может Антивирус

"убить"?

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

Может Антивирус

"убить"?

ИМХО надо бы посмотреть справку (или справочные материалы) по данному языку программирования - где-то ведь должен быть перечень ошибок и чем они вызываются..
Ссылка на сообщение
Поделиться на других сайтах

Shvg, спасибо за код. Делаю всё примерно так же. А что скажите по поводу странной ошибки "Cannot evaluate expression because a native frame is on top of the call stack."?

Это Вы спрашиваете как перевести или смысл данной ошибки?

Посмотрите здесь например:

<noindex>http://yandex.ru/yandsearch?text=Cannot%20...0stack&lr=7</noindex>

<noindex>http://forum.sources.ru/index.php?showtopic=199722</noindex>

<noindex>http://www.west-wind.com/Weblog/posts/6931.aspx</noindex>

И вообще, ширше надо бы поиском пользоваться...

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

.... А что скажите по поводу странной ошибки "Cannot evaluate expression because a native frame is on top of the call stack."?

Не встречал такую, вроде. Так что ничего полезного пока сказать не могу....
Ссылка на сообщение
Поделиться на других сайтах

Все это конечно хорошо, но если файл чертежа имеет тоже имя, но не лежит там же, где и деталь, то поиск может оказаться очень длиннным :)

Вообщем что нить придумаем

Можно написать макрос который будет сохранять чертеж и автоматом записывать в свойства модели полный путь к чертежу. И сохранять чертежи только через этот макрос, тогда в свойствах детали будет ссылка на чертеж, с которой можно будет работать.

Ссылка на сообщение
Поделиться на других сайтах
  • 4 месяца спустя...

У меня, бывало, зависание происходило, когда было запущено два процесса SLDWORKS.EXE.

вот случай - запущен солид (процесс назову "SW user"). пользователь работает в нем. далее в какой-то момент запускает мою прогу "proga" (которая каким-то образом взаимодействует с солидом и что-то там делает инвизибл). proga использует уже существующий экземпляр солида SW user. работа proga продолжается до тех пор, пока юзер не вырубит солид (процесс SW user изначально запущенный для работы с SW, а не для proga). proga сигнализирует, что солида больше нет и выдает кучу ошибок. что делать? не выдавать же пользователю сообщение типа "не закрывайте солид до тех пор, пока не закончите работу с proga".
Ссылка на сообщение
Поделиться на других сайтах

что делать? не выдавать же пользователю сообщение типа "не закрывайте солид до тех пор, пока не закончите работу с proga".

А почему, собсссно нет???

Многие progi выдают подобные сообщения (при работе с разными приложениями), конечно если эта proga т.с. "официально" работает с Солидом (из Вашего сообщения не понятно - proga рассчитана на работу с Солидом или это побочный глюк)....

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

одним из требований к ПО компа, где будет использоваться моя proga будет наличие установленного солида. потому с солидом работа ведется официально.

ну а что по поводу ошибок, если солид пользователь закроет и progе не с чем будет работать?

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

одним из требований к ПО компа, где будет использоваться моя proga будет наличие установленного солида. потому с солидом работа ведется официально.

ну а что по поводу ошибок, если солид пользователь закроет и progе не с чем будет работать?

Какие-то странные вопросы!

Вариант 1) если пытаться закрыть файл, к которому хочет получить доступ другая прога, то будет или ошибка или возникнет некоторое "время ожидания", пока эта прога не удовлетворит свои желания. В любом случае, всем этим "заведует" ОС т.е. Windows;

Вариант 2) написать свою прогу так, чтобы она на 1 момент получила доступ к нужному файлу, считала его и освободила доступ к файлу. Тогда SW спокойно и почти как обычно сможет закрыть этот файл;

Вариант 3) сделать копию нужного файла и делать с ним что-хошь...

ИМХО...

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

Господа программисты! Напишите, пожалуйста, программку, которая запускает солид и по завершении работы с ним (не важно что именно, можно этот момент и опустить) закрывает солид.

у меня вот это не работает (процесс солида висит в диспетчере задач):

       protected override void Dispose(bool disposing)
       {
           if (disposing && (components != null))
           {
               components.Dispose();
           }
           base.Dispose(disposing);
           swApp.ExitApp();
           sw_starting.Abort();
       }

       public void sw_start()
       {
           swApp = new SldWorks.SldWorks();
       }

       private void Form1_Load(object sender, EventArgs e)
       {
           try
           {
               sw_starting = new Thread(new ThreadStart(sw_start));
               sw_starting.Start();
           }
           catch { }
       }

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

Господа программисты! Напишите, пожалуйста, программку, которая ...

...

К сожалению у меня сейчас SW2007 установлен, но принцип один (see more help API SW) :

(тут много разных вариантов)

------

SolidWorks Visible or Background Example (VB)

These examples shows several situations for running or attaching to SolidWorks session through the API.

SolidWorks not running: Launch invisibly and end SolidWorks session

Sub Macro1()

Dim swApp As Object

Dim Part As Object

Set swApp = CreateObject("SldWorks.Application")

Set swApp = Nothing

' Close the SolidWorks application. If you do not perform this step, SolidWorks

' continues to run. If SolidWorks is running in the background,the user is

' unaware that SolidWorks is running and consuming their system resources.

swApp.ExitApp

End Sub

SolidWorks running: Attach to existing SolidWorks session and end SolidWorks session

Sub Macro2()

Dim swApp As Object

Dim Part As Object

Set swApp = CreateObject("SldWorks.Application")

Set swApp = Nothing

swApp.ExitApp

End Sub

SolidWorks not running: Launch invisibly, become visible, and end SolidWorks session

Sub Macro3()

Dim swApp As Object

Dim Part As Object

Set swApp = CreateObject("SldWorks.Application")

swApp.Visible = True

Set swApp = Nothing

swApp.ExitApp

End Sub

SolidWorks not running: Launch invisibly, become visible, and leave SolidWorks running

Sub Macro4()

Dim swApp As Object

Dim Part As Object

Set swApp = CreateObject("SldWorks.Application")

swApp.Visible = True

swApp.UserControl = True

' Give control to the user which will leave SolidWorks running

Set swApp = Nothing

End Sub

SolidWorks not running: Launch invisibly, create part invisibly, close part, and end SolidWorks session

Sub Macro5()

Dim swApp As Object

Dim Part As Object

' This must be explicitly defined for ActivateDoc2

Dim errors As Long

Set swApp = CreateObject("SldWorks.Application")

Set Part = swApp.NewPart

Set Part = swApp.ActivateDoc2("Part1",True,errors)

Set Part = Nothing

swApp.CloseDoc "Part1"

Set swApp = Nothing

swApp.ExitApp

End Sub

SolidWorks not running: Launch invisibly, create part invisibly, make the part and SolidWorks visible, and leave SolidWorks running

Sub Macro6()

Dim swApp As Object

Dim Part As Object

Set swApp = CreateObject("SldWorks.Application")

Set Part = swApp.NewPart

Set Part = swApp.ActivateDoc("Part1")

Part.Visible = True

' Make the part and SolidWorks visible

swApp.UserControl = True

' Give control to the user which will leave SolidWorks running

Set Part = Nothing

swApp.CloseDoc "Part1"

Set swApp = Nothing

End Sub

------

читайте внимательно пояснения перед `Sub` !

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

Господа программисты! Напишите, пожалуйста, программку, которая запускает солид и по завершении работы с ним (не важно что именно, можно этот момент и опустить) закрывает солид.

Вот так не было с закрытием никаких проблем.

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using SolidWorks.Interop.sldworks;using SolidWorks.Interop.swconst;namespace Anka_1{    public partial class Form1 : Form    {        SldWorks swApp = null;        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            swApp = new SldWorks();            if (swApp == null)                return;            swApp.Visible = true;        }        private void cmdCancel_Click(object sender, EventArgs e)        {            swApp.ExitApp();            swApp = null;            this.Close();        }    }}

А зачем вы создаете новый поток? Он очень вам нужен?

private void Form1_Load(object sender, EventArgs e)

		{

			try

			{

				sw_starting = new Thread(new ThreadStart(sw_start));

				sw_starting.Start();

			}

			catch { }

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

а не могли бы Вы прикрепить файлик с проектом?

Да там ничего такого и нет. Просто форма. Проект создавался в VS2005, WinXPx32, SW2011.

Anka_1.rar

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

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

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

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

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

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

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

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

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

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

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



×
×
  • Создать...