Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
74
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

4. Модификация приложения Windows Forms: создание новых документов

Следующая часть данной работы объясняет, как создать новый документ (например, обычную деталь, тип файла Обычный.ipt) и получить общее число открытых документов в открытом приложении Inventor. Строго говоря, работы с COM-Сервером Inventor очень похожа и мало чем отличается от работы с COM-сервером SolidWorks (классы приложения, документа, эскиза и т.п.). Поэтому основы работы такие же. Необходимо лишь хорошо знать структуру применяемых классов COM-сервера и документа для успешного применения этих навыков.

Единственно «но». Популярность разработки приложений на C# «под и для» Inventor достаточно невысокая по сравнению с тем же «родным» для корпорации Autodesk Inventor Visual Basic for Application и Visual Basic .NET.. Но найти необходимую документацию всё же можно.

И так, размещаем вторую группу элементов на форме следующим образом:

Рис. 4. 1. Расстановка элементов управления второй группы элементов

И код для единственной кнопки B_Create (событие Click):

private void B_Create_Click(object sender, EventArgs e)

{

Inventor.Application oApp2;

oApp2 = (Inventor.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application");

Inventor.PartDocument oPart2;

oPart2 = (Inventor.PartDocument)oApp2.Documents.Add(Inventor.DocumentTypeEnum.kPartDocumentObject);

// Получае число открытых документов экземпляра приложения Inventor

int number_int = oApp2.Documents.Count;

string number_string = Convert.ToString(number_int);

MessageBox.Show("Текущее число открытых документов: " + number_string, "Работа с Inventor (C#) :: Получение числа открытых страниц в Inventor");

}

Подкорректируем код LWP20Main():

public LWP20Main()

{

InitializeComponent();

B_Close.Enabled = false;

B_Create.Enabled = false;

}

Найдём:

// Запускаем экземпляр приложения Inventor

Process InventorProcess = System.Diagnostics.Process.Start("C:\\Program Files\\Autodesk\\Inventor 2012\\Bin\\Inventor.exe");

B_Close.Enabled = true;

B_Open.Enabled = false;

Добавим после:

B_Create.Enabled = true;

И изменим событие нажатия кнопки B_Close:

private void B_Close_Click(object sender, EventArgs e)

{

CloseInventor();

B_Close.Enabled = false;

B_Open.Enabled = true;

B_Create.Enabled = false;

}

Компилируем приложение (Debug) и запускаем. Запускаем Inventor основной кнопкой, и жмём несколько раз на Создать и посчитать (Рис. 4. 2):

Рис. 4. 2. Создание двух документов деталей в Inventor и отображение получения общего числа открытых документов

5. Модификация приложения Windows Forms: доступ к элементам документов Inventor

Допустим, есть документ сборка (тип файла Обычный.iam) с двумя простенькими деталями:

Рис. 5. 1. Сборка1.iam в среде Inventor

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

Размести элементы третьей группы следующим образом:

Рис. 5. 2. Расстановка элементов управления третьей группы элементов

Где три кнопки и одно текстовое поле TextBox по порядку:

(Name):

B_Start

Text:

Инициализировать сборку

Size:

155; 23

(Name):

B_Hide

Text:

Скрыть

Size:

100; 23

(Name):

B_Show

Text:

Показать

Size:

100; 23

(Name):

TB_Name

Text:

Имя элемента

Size:

100; 23

Также добавим на форму элемент OpenFileDialog со свойствами:

(Name):

OFD_Name

Filter:

Сборка *.iam|*.iam

И один Label (по первой кнопкой группы).

Найдём в файле LWP20Main.cs строчки:

private Inventor.Application oApp1;

Добавим после:

// Делаем это ещё раз для другой части нашего приложения

private Inventor.Application oApp3;

// Объявляем экземпляр переменную oAsmDoc3, чтобы получить возможности в работы в этом классе

private Inventor.AssemblyDocument oAsmDoc3;

Событие Click кнопки B_Start:

private void B_Start_Click(object sender, EventArgs e)

{

OFD_Name.ShowDialog();

oApp3 = (Inventor.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application");

// Открываем файл сборки

oAsmDoc3 = (Inventor._AssemblyDocument)oApp3.Documents.Open(OFD_Name.FileName, true);

// Проверяем, что хотя бы один документ был открыт

if (oApp3.Documents.Count == 0)

{

MessageBox.Show("Должен быть открыт хотя бы один документ в данный момент");

}

// Проверяем что хотя бы один документ Сборка (*.iam) был активным

if (oApp3.ActiveDocument.DocumentType != Inventor.DocumentTypeEnum.kAssemblyDocumentObject)

{

MessageBox.Show("Должна быть открыт хотя бы одна сборка (документ: \"Сборка\", тип файла: *.iam) в данный момент");

}

// Переопределяем тип активного документа ActiveDocument в AssemblyDocument (документ сборки)

// Устанавливаем ссылку на активный документ

oAsmDoc3 = (Inventor.AssemblyDocument)oApp3.ActiveDocument;

B_Show.Enabled = true;

B_Hide.Enabled = true;

}

Событие MouseClick текстового поля TB_Name:

private void TB_Name_MouseClick(object sender, MouseEventArgs e)

{

TB_Name.Text = "";

}

Изменим метод LWP20Main():

public LWP20Main()

{

InitializeComponent();

B_Close.Enabled = false;

B_Create.Enabled = false;

B_Start.Enabled = false;

B_Show.Enabled = false;

B_Hide.Enabled = false;

}

И код закрытия Кнопки для приложения Inventor:

private void B_Close_Click(object sender, EventArgs e)

{

CloseInventor();

B_Close.Enabled = false;

B_Open.Enabled = true;

B_Create.Enabled = false;

B_Start.Enabled = false;

B_Show.Enabled = false;

B_Hide.Enabled = false;

}

Найдём:

Thread.Sleep(20000);

Добавим до:

B_Start.Enabled = true;

Последним штрихом инициализируем события кнопок Скрыть и Показать, а также методу, выполняющему изменения статуса видимости объекта:

private void B_Hide_Click(object sender, EventArgs e)

{

// Вызываем функция, которая работает со сборкой и устанавливает видимость объектов

SetVisibility(oAsmDoc3.ComponentDefinition.Occurrences, TB_Name.Text, false);

// Обновляем вид

oApp3.ActiveView.Update();

}

private void B_Show_Click(object sender, EventArgs e)

{

// Вызываем функция, которая работает со сборкой и устанавливает видимость объектов

SetVisibility(oAsmDoc3.ComponentDefinition.Occurrences, TB_Name.Text, true);

// Обновляем вид

oApp3.ActiveView.Update();

}

private static void SetVisibility(Inventor.ComponentOccurrences Occurences, string SearchName, bool VisibilityOn)

{

// Итерация по каждому из "упоминаний" в коллекции условий

foreach (Inventor.ComponentOccurrence oOccurence in Occurences)

{ // Проверяем, если имя "упоминания" совпадает с введённым на форме именем

// Все символы строки делаем строчными чтобы избежать чувствительности к регистру

if (oOccurence.Name.ToLower().Contains(SearchName.ToLower()))

{ // Проверяем, если параметр "Видимость" отличает от введённого при нажатии на кнопки формы

if (oOccurence.Visible != VisibilityOn)

{ // Устанавливаем видимость для "упоминания" (например, детали)

oOccurence.Visible = VisibilityOn;

}

}

}

}

Готово. Можно компилировать и проверять работоспособность.