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

3. Модификация приложения SwCSharpAddin: макрос отрисовки болта

Итак. Обеспечим новую функциональность для нашего добавления. Пусть есть макрос для отрисовки шестигранного болта с фиксированными размерами. Обеспечим изменение размеров в форме, загружающейся до отрисовки болта. Форма будет запрашивать у пользователя три параметра, по которым строится болт: шаг по спирали, высота спирали и радиус стержня с резьбой. Построение детали болта начнётся после нажатия на кнопку Создать болт (макрос) в нашем добавлении.

Для начала организуем в добавлении две новые кнопки. Одна для вышеописанного макроса, вторая же для будущей функциональности. Нарисуем эти кнопки открыв в обозревателе решений файлы ToolbarLarge.bmp и ToolbarSmall.bmp.

В ToolbarLarge.bmp нарисуем:

В ToolbarSmall.bmp нарисуем:

Теперь добавим обработчики для новых кнопок. Откроем файл SwAddin.cs. Найдём:

public const int mainCmdGroupID = 5;

public const int mainItemID1 = 0;

public const int mainItemID2 = 1;

public const int mainItemID3 = 2;

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

public const int mainItemID4 = 3;

public const int mainItemID5 = 4;

Найдём:

int cmdIndex0, cmdIndex1, cmdIndex2;

Изменим на:

int cmdIndex0, cmdIndex1, cmdIndex2, cmdIndex3, cmdIndex4;

Найдём:

int menuToolbarOption = (int)(swCommandItemType_e.swMenuItem | swCommandItemType_e.swToolbarItem);

cmdIndex0 = cmdGroup.AddCommandItem2("CreateCube", -1, "Create a cube", "Create cube", 0, "CreateCube", "", mainItemID1, menuToolbarOption);

cmdIndex1 = cmdGroup.AddCommandItem2("Show PMP", -1, "Display sample property manager", "Show PMP", 1, "ShowPMP", "EnablePMP", mainItemID2, menuToolbarOption);

// Клонируем панель элементов PMP

cmdIndex2 = cmdGroup.AddCommandItem2("Показать ещё одну PMP", -1, "Открыть ещё одну страницу с элементами", "Показать ещё одну PMP", 2, "ShowPMP2", "EnablePMP2", mainItemID3, menuToolbarOption);

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

cmdIndex3 = cmdGroup.AddCommandItem2("UsingMacro", -1, "Создать болт при помощи макроса", "Создать болт (макрос)", 3, "UsingMacro", "", mainItemID4, menuToolbarOption);

cmdIndex4 = cmdGroup.AddCommandItem2("UsingTemp", -1, "Создать болт с использованием шаблона", "Создать болт (шаблон)", 4, "UsingTemp", "", mainItemID5, menuToolbarOption);

Найдём:

int[] knownIDs = new int[3] { mainItemID1, mainItemID2, mainItemID3 };

Изменим на:

int[] knownIDs = new int[5] { mainItemID1, mainItemID2, mainItemID3, mainItemID4, mainItemID5 };

Найдём:

int[] cmdIDs = new int[4];

int[] TextType = new int[4];

cmdIDs[0] = cmdGroup.get_CommandID(cmdIndex0);

TextType[0] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

cmdIDs[1] = cmdGroup.get_CommandID(cmdIndex1);

TextType[1] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

cmdIDs[2] = cmdGroup.ToolbarId;

TextType[2] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal | (int)swCommandTabButtonFlyoutStyle_e.swCommandTabButton_ActionFlyout;

cmdIDs[3] = cmdGroup.get_CommandID(cmdIndex2);

TextType[3] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

bResult = cmdBox.AddCommands(cmdIDs, TextType);

Изменим на:

int[] cmdIDs = new int[6];

int[] TextType = new int[6];

cmdIDs[0] = cmdGroup.get_CommandID(cmdIndex0);

TextType[0] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

cmdIDs[1] = cmdGroup.get_CommandID(cmdIndex1);

TextType[1] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

cmdIDs[2] = cmdGroup.ToolbarId;

TextType[2] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal | (int)swCommandTabButtonFlyoutStyle_e.swCommandTabButton_ActionFlyout;

cmdIDs[3] = cmdGroup.get_CommandID(cmdIndex2);

TextType[3] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

cmdIDs[4] = cmdGroup.get_CommandID(cmdIndex3);

TextType[4] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

cmdIDs[5] = cmdGroup.get_CommandID(cmdIndex4);

TextType[5] = (int)swCommandTabButtonTextDisplay_e.swCommandTabButton_TextHorizontal;

bResult = cmdBox.AddCommands(cmdIDs, TextType);

Найдём:

public void CreateCube()

{

Добавим до:

public void UsingMacro()

{

string partTemplate = iSwApp.GetUserPreferenceStringValue((int)swUserPreferenceStringValue_e.swDefaultTemplatePart);

if ((partTemplate != null) && (partTemplate != ""))

{

IModelDoc2 swDoc = (IModelDoc2)iSwApp.NewDocument(partTemplate, (int)swDwgPaperSizes_e.swDwgPaperA2size, 0.0, 0.0);

// Начало макроса

bool boolstatus = false;

// Спираль: часть 1

double C = 1 / 1000.0;

double Height, Pitch, Radius;

// Загружаем форму LWP07Macro

LWP07Macro Macro = new LWP07Macro();

Macro.Text = "Использование SwCSharpAddin (C#) :: Выбор размеров шестигранного болта (макрос)";

Macro.ShowDialog();

Height = Macro.H * C;

Pitch = Macro.P * C;

Radius = Macro.R * C;

Macro.Dispose();

// Начало первого эскиза. Создаём круг для спирали

boolstatus = swDoc.Extension.SelectByID2("Сверху", "PLANE", 0, 0, 0, false, 0, null, 0);

swDoc.SketchManager.InsertSketch(true);

swDoc.ClearSelection2(true);

SketchSegment skSegment = null;

skSegment = ((SketchSegment)(swDoc.SketchManager.CreateCircleByRadius(0, 0, 0, Radius)));

swDoc.InsertHelix(false, true, false, true, 2, Height, Pitch, 0, 0, (double)Math.PI);

boolstatus = swDoc.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, true, false, "Спираль1");

swDoc.ClearSelection2(true);

boolstatus = swDoc.Extension.SelectByID2("", "SKETCH", 0, 0, -Radius, false, 0, null, 0);

boolstatus = swDoc.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, true, false, "Эскиз1");

swDoc.ClearSelection2(true);

// Спираль: часть 2

// create reference plane

swDoc.ViewRotateplusx(); swDoc.ViewRotateplusx(); swDoc.ViewRotateplusx();

//boolstatus = swDoc.Extension.SelectByID2("", "POINTREF", 0, 0, -Radius, false, 0, null, 0); // Выбираем конечную точку

boolstatus = swDoc.Extension.SelectByID2("Спираль1", "REFERENCECURVES", 0, 0, 0, false, 0, null, 0); // Выбираем всё

boolstatus = swDoc.Extension.SelectByID2("", "POINTREF", 0, 0, -Radius, true, 1, null, 0);

swDoc.ViewRotateminusy();

RefPlane myRefPlane = null;

myRefPlane = ((RefPlane)(swDoc.FeatureManager.InsertRefPlane(2, 0, 4, 1, 0, 0)));

//swDoc.ClearSelection2(true);

boolstatus = swDoc.Extension.SelectByID2("", "PLANE", 0, 0, -Radius, false, 0, null, 0);

boolstatus = swDoc.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, true, false, "Плоскость1"); // Изменяем имя

swDoc.BlankRefGeom(); // Скрываем Плоскость1

swDoc.ShowNamedView2("*Изометрия", -1);

swDoc.ViewZoomtofit2();

// Эскиз2: треугольник/резьба формы

boolstatus = swDoc.Extension.SelectByID2("Справа", "PLANE", 0, 0, 0, false, 0, null, 0);

swDoc.SketchManager.InsertSketch(true);

swDoc.ShowNamedView2("*Normal To", 0);

swDoc.ViewRotateminusx();

swDoc.ViewTranslateminusx();

swDoc.ClearSelection2(true);

double x, y, z, dx, dy;

//x = .049903; y = -.001803; z = 0; // Старые координаты. Те что удалось установить вручную изначально

x = y = z = 0;

dx = dy = Radius / 10.0 + Pitch / 4.0;

skSegment = ((SketchSegment)(swDoc.SketchManager.CreateLine(x, y, z, x, y + dy, z)));

skSegment = ((SketchSegment)(swDoc.SketchManager.CreateLine(x, y + dy, z, x + dx, y + dy, z))); // Горизонталь

skSegment = ((SketchSegment)(swDoc.SketchManager.CreateLine(x + dx, y + dy, z, x, y, z)));

swDoc.ClearSelection2(true);

//boolstatus = swDoc.Extension.SelectByID2("", "SKETCHSEGMENT", x+dx/2.0, y+dy, z, false, 0, null, 0);

//swDoc.SketchAddConstraints("sgHORIZONTAL2D"); // Больше не нужно

//swDoc.ClearSelection2(true);

//swDoc.ViewRotateminusx(); // Тоже не нужно

swDoc.SetPickMode();

boolstatus = swDoc.Extension.SelectByID2("Точка1", "SKETCHPOINT", x, y, z, false, 0, null, 0);

boolstatus = swDoc.Extension.SelectByID2("Спираль1", "REFERENCECURVES", 0, 0, 0, true, 1, null, 0);

swDoc.SketchAddConstraints("sgATPIERCE");

swDoc.ClearSelection2(true);

boolstatus = swDoc.Extension.SelectByID2("Точка1", "SKETCHPOINT", x, y, z, false, 0, null, 0);

swDoc.SketchConstraintsDel(0, "sgCOINCIDENT"); // Автоматически "совпадающие"

swDoc.SketchManager.InsertSketch(true);

// Перемещаем Эскиз2 на Плоскость1

boolstatus = swDoc.Extension.SelectByID2("Эскиз2", "SKETCH", 0, 0, 0, false, 0, null, 0);

boolstatus = swDoc.Extension.SelectByID2("Справа", "PLANE", 0, 0, 0, true, 0, null, 0);

boolstatus = swDoc.DeSelectByID("Справа", "PLANE", 0, 0, 0);

boolstatus = swDoc.Extension.SelectByID2("Эскиз2", "SKETCH", 0, 0, 0, false, 0, null, 0);

boolstatus = swDoc.Extension.SelectByID2("Плоскость1", "PLANE", 0, 0, 0, true, 0, null, 0);

boolstatus = swDoc.ChangeSketchPlane();

boolstatus = swDoc.EditRebuild3();

swDoc.SetPickMode();

swDoc.ClearSelection2(true);

swDoc.ViewZoomtofit2();

// Делаем резьбу; 1: эскиз пути, 2: маршрут спирали, 4: выполняем

//boolstatus = swDoc.Extension.SelectByID2("Эскиз2", "SKETCH", 0.005135831118, -0.0038831893819, 0, true, 1, null, 0);

boolstatus = swDoc.Extension.SelectByID2("Эскиз2", "SKETCH", 0, 0, 0, true, 1, null, 0);

boolstatus = swDoc.Extension.SelectByID2("Спираль1", "REFERENCECURVES", 0, 0, 0, true, 4, null, 0);

Feature myFeature = null;

myFeature = ((Feature)(swDoc.FeatureManager.InsertProtrusionSwept3(false, false, 0, false, false, 0, 0, false, 0, 0, 0, 0, true, true, true, 0, true)));

// Снимаем выделение, скрываем окружность (созданную вначале), меняем положение камеры (вид)

swDoc.ClearSelection2(true);

boolstatus = swDoc.Extension.SelectByID2("Эскиз1", "SKETCH", 0, 0, 0, false, 0, null, 0);

swDoc.BlankSketch();

swDoc.ClearSelection2(true);

swDoc.ShowNamedView2("*Изометрия", -1);

swDoc.ViewZoomtofit2();

// Спираль: часть 3

// Вытягивание

double Height2 = Height + Radius / 4.0 + dx * 1.5;

boolstatus = swDoc.Extension.SelectByID2("Эскиз1", "SKETCH", 0, 0, 0, false, 0, null, 0);

myFeature = ((Feature)(swDoc.FeatureManager.FeatureExtrusion2(true, false, false, 0, 0, Height2, 0.00254, false, false, false, false, 0.01745329251994, 0.01745329251994, false, false, false, false, true, true, true, 0, 0, false)));

swDoc.ISelectionManager.EnableContourSelection = false;

swDoc.ClearSelection2(true);

// Вырезаем вытягивание (наверх)

//boolstatus = swDoc.Extension.SelectByID2("", "FACE", 0, Height2, 0, false, 0, null, 0);

//swDoc.SketchManager.InsertSketch(true);

//swDoc.ClearSelection2(true);

//skSegment = ((SketchSegment)(swDoc.SketchManager.CreateCircleByRadius(0, 0, 0, Radius + c)));

//swDoc.SketchManager.InsertSketch(true);

//swDoc.ClearSelection2(true);

//boolstatus = swDoc.Extension.SelectByID2("Sketch3", "SKETCH", 0, 0, 0, false, 0, null, 0);

//myFeature = ((Feature)(swDoc.FeatureManager.FeatureCut(true, false, true, 0, 0, c, 0.0508, false, false, false, false, 0.01745329251994, 0.01745329251994, false, false, false, false, false, true, true)));

//swDoc.ISelectionManager.EnableContourSelection = false;

//swDoc.ClearSelection2(true);

// Шляпка болта

double extrHeight = Radius + c / 4;

boolstatus = swDoc.Extension.SelectByID2("", "FACE", 0, Height2, 0, false, 0, null, 0);

swDoc.SketchManager.InsertSketch(true);

//skSegment = ((SketchSegment)(swDoc.SketchManager.CreateCircleByRadius(0, 0, 0, Radius*1.5))); // Созданём полигон (6 граней) вместо окружности

Array vSkLines = null;

vSkLines = ((Array)(swDoc.SketchManager.CreatePolygon(0, 0, 0, -Radius * 2, 0, 0, 6, true)));

swDoc.SketchManager.InsertSketch(true);

swDoc.ClearSelection2(true);

boolstatus = swDoc.Extension.SelectByID2("Эскиз3", "SKETCH", 0, Height2, 0, false, 0, null, 0);

myFeature = ((Feature)(swDoc.FeatureManager.FeatureExtrusion2(true, false, false, 0, 0, extrHeight, 0.00254, false, false, false, false, 0.01745329251994, 0.01745329251994, false, false, false, false, true, true, true, 0, 0, false)));

swDoc.ISelectionManager.EnableContourSelection = false;

swDoc.ClearSelection2(true);

// Кромки

boolstatus = swDoc.Extension.SelectByID2("", "FACE", 0, Height2 + extrHeight, 0, false, 0, null, 0);

swDoc.ViewRotateplusx();

swDoc.ViewRotateplusx();

swDoc.ViewRotateplusx();

swDoc.ViewRotateplusx();

boolstatus = swDoc.Extension.SelectByID2("", "FACE", Radius * 1.5, Height2, 0, true, 1, null, 0);

//boolstatus = swDoc.Extension.SelectByID2("", "FACE", 0, 0, 0, true, 2, null, 0);

Array radiiArray3 = null;

double[] radiis3 = new double[1];

Array setBackArray3 = null;

double[] setBacks3 = new double[0];

Array pointArray3 = null;

double[] points3 = new double[0];

radiiArray3 = radiis3;

setBackArray3 = setBacks3;

pointArray3 = points3;

myFeature = ((Feature)(swDoc.FeatureManager.FeatureFillet(195, Radius * 2.0 / 25.0, 0, 0, radiiArray3, setBackArray3, pointArray3)));

swDoc.ClearSelection2(true);

boolstatus = swDoc.Extension.SelectByID2("", "FACE", 0, 0, 0, false, 0, null, 0);

myFeature = ((Feature)(swDoc.FeatureManager.FeatureFillet(195, Radius * 2.0 / 25.0, 0, 0, radiiArray3, setBackArray3, pointArray3)));

// Завершающий вид на деталь

swDoc.ShowNamedView2("*Изометрия", -1);

swDoc.ViewZoomtofit2();

// Конец макроса

}

else

{

System.Windows.Forms.MessageBox.Show("Нет части доступных шаблонов. Пожалуйста, проверьте ваши настройки чтобы убедиться, что часть шаблонов выбрана или недостающие шаблоны.");

}

}

public void UsingTemp()

{

// Пока пусто

}

Добавим недостающую форму для работы кода макроса. Нажмём ПКМ на названии проекта в обозревателе решений, далее в раскрывающемся списке Добавить -> Создать элемент... (Ctrl+Shift+A). Выберем в открывшемся окне Форма Windows Forms. В поле Имя внизу окна вписываем LWP07Macro.cs, далее жмём ОК.

Задаём следующие параметры формы на панели Свойства:

Text:

Использование SwCSharpAddin (C#) :: Ввод размеров болта для макроса

Size:

600; 100

FormBorderStyle:

FixedDialog

MaximizeBox:

False

Рис. 3. 1. Модифицированная форма LWP07Macro

Добавим на нашу форму ToolTip ( ).

Параметры добавленного элемента всплывающей подсказки таковы:

(Name):

Hint

Слева направо установим три TextBox со следующими параметрами:

(Name):

TBHeight

Text:

75

ToolTip на Hint:

Высота спирали

(Name):

TBRadius

Text:

10

ToolTip на Hint:

Радиус стержня

(Name):

TBPitch

Text:

3

ToolTip на Hint:

Шаг спирали

Добавим над каждым TextBox слева направо по элементу Label. Свойства Text каждого текстового элемента будут соответственно H, R и P.

Установим на форме в правом нижнем углу кнопку Button. Параметры кнопки будут следующими:

(Name):

B_OK

Text:

Размер выбран

Size:

100; 23

Рис. 3. 2. Модифицированная форма LWP07Macro

Двойным щелчком по кнопке B_OK создаём событие Click, код такой:

double.TryParse(TBHeight.Text, out H);

double.TryParse(TBRadius.Text, out R);

double.TryParse(TBPitch.Text, out P);

if (H > 0 && R > 0 && P > 0)

Close();

else

{

MessageBox.Show("Ошибка ввода размеров: нужно ввести все неотрицательные числа в поля формы.\n\nРазмеры по умолчанию:\nH: 75 мм.\nR: 10 мм.\nP: 3 мм.", "Использование SwCSharpAddin (C#) :: Ввод размеров болта для макроса");

}

Добавим после строчки:

public partial class LWP07Macro : Form

{

Код:

public double H, R, P;

Компилируем приложение (Debug) и запускаем. Загружаем новую деталь (или непосредственно панель инструментов) и нажимаем на кнопку в нашем добавлении с буквой «М». Результат работы показан ниже (Рис. 3. 3):

Рис. 3. 3. Результат построение шестигранного болта при помощи макроса