Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы API Solid Edge Часть 1.doc
Скачиваний:
24
Добавлен:
22.11.2019
Размер:
1.89 Mб
Скачать

Лабораторная работа №1 Введение в параметрическое моделирование в Solid Edge с использование api

Цель работы: получить практические навыки интеграции прикладных подпрограмм и Solid Edge; научиться создавать простейшие программы и запускать их на выполнение в Solid Edge.

1. Теоретическая часть

Для разработки прикладных пользовательских программ для Solid Edge коллектив авторов предлагает использовать среду разработку Microsoft Visual Studio 2010.

Создание проекта для Solid Edge

  1. Создаем проект в Visual Studio. Выбираем в установленных шаблонах Visual C# – Приложение Windows Form. Указываем имя проекта:

Рисунок 7 – Создание проекта

  1. Для начала работы с Solid Edge необходимо добавить ссылки на типы библиотек, которые он использует. Для этого выбираем Проект/Добавить ссылку:

Рисунок 8 – Добавление ссылки

У нас появится диалоговое окно, в котором нужно выбрать вкладку COM. Находим библиотеки Solid Edge Type Libraries и добавляем:

Рисунок 9 – Необходимые библиотеки

  1. Добавим на форму кнопку, двойным нажатием по которой создадим метод:

private void button1_Click(object sender, EventArgs e)

{

}

  1. Начинаем изменять код программы. Для начала добавим следующие строки в раздел using:

Рисунок 10 – добавление строк в using

  1. Для соединения и начала работы в Solid Edge в метод button1_Click добавим:

// Объявление переменных

SolidEdgeFramework.Application application = null;

SolidEdgeFramework.Documents documents = null;

SolidEdgePart.PartDocument part = null;

Type type = null;

try

{

//получаем тип от Solid Edge ProgID

type = Type.GetTypeFromProgID("SolidEdge.Application");

// начало в Solid Edge

application = (SolidEdgeFramework.Application)

Activator.CreateInstance(type);

// делаем Solid Edge видимым

application.Visible = true;

// отключение отображение сварных деталей

application.DisplayAlerts = false;

// создание ссылки для документов

documents = application.Documents;

// создание документа "Деталь"

part = (SolidEdgePart.PartDocument)documents.Add("SolidEdge.PartDocument");

}

catch (System.Exception ex)

{

MessageBox.Show(ex.Message);

}

finally

{

if (part != null)

{

Marshal.ReleaseComObject(part);

part = null;

}

if (documents != null)

{

Marshal.ReleaseComObject(documents);

documents = null;

}

if (application != null)

{

Marshal.ReleaseComObject(application);

application = null;

}

}

  1. При интеграции с Solid Edge могут возникнуть ошибки. Класс OleMessageFilter необходим для их обработки:

class OleMessageFilter : IOleMessageFilter

{

public static void Register()

{

IOleMessageFilter newFilter = new OleMessageFilter();

IOleMessageFilter oldFilter = null;

if (Thread.CurrentThread.GetApartmentState() ==

ApartmentState.STA)

{

CoRegisterMessageFilter(newFilter, out oldFilter);

}

else

{

throw new COMException("Unable to register message filter because the current thread apartment state is not STA.");

}

}

public static void Revoke()

{

IOleMessageFilter oldFilter = null;

CoRegisterMessageFilter(null, out oldFilter);

}

int IOleMessageFilter.HandleInComingCall(

int dwCallType,

System.IntPtr hTaskCaller,

int dwTickCount,

System.IntPtr lpInterfaceInfo)

{

return (int)SERVERCALL.SERVERCALL_ISHANDLED;

}

int IOleMessageFilter.RetryRejectedCall(

System.IntPtr hTaskCallee,

int dwTickCount,

int dwRejectType)

{

if (dwRejectType == (int)SERVERCALL.SERVERCALL_RETRYLATER)

{

return 99;

}

return -1;

}

int IOleMessageFilter.MessagePending(

System.IntPtr hTaskCallee,

int dwTickCount,

int dwPendingType)

{

return (int)PENDINGMSG.PENDINGMSG_WAITDEFPROCESS;

}

[DllImport("Ole32.dll")]

private static extern int CoRegisterMessageFilter(

IOleMessageFilter newFilter,

out IOleMessageFilter oldFilter);

}

enum SERVERCALL

{

SERVERCALL_ISHANDLED = 0,

SERVERCALL_REJECTED = 1,

SERVERCALL_RETRYLATER = 2

}

enum PENDINGMSG

{

PENDINGMSG_CANCELCALL = 0,

PENDINGMSG_WAITNOPROCESS = 1,

PENDINGMSG_WAITDEFPROCESS = 2

}

[ComImport(), Guid("00000016-0000-0000-C000-000000000046"),

InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]

interface IOleMessageFilter

{

[PreserveSig]

int HandleInComingCall(

int dwCallType,

IntPtr hTaskCaller,

int dwTickCount,

IntPtr lpInterfaceInfo);

[PreserveSig]

int RetryRejectedCall(

IntPtr hTaskCallee,

int dwTickCount,

int dwRejectType);

[PreserveSig]

int MessagePending(

IntPtr hTaskCallee,

int dwTickCount,

int dwPendingType);

}

}

  1. В предыдущем пункте был добавлен только новый класс. Для его работы необходимо исправить метод button1_Click:

  • Добавить строку OleMessageFilter.Register() после try;

  • Изменить код в finally на OleMessageFilter.Revoke().

  1. Выбираем в меню Visual Studio Построение/Построить решение и Отладка/Запуск без отладки. Появляется созданная нами форма с единственной кнопкой. При ее нажатии откроется Solid Edge.

Рисунок 11 – Создание «Обычной детали» в Solid Edge