Модификация приложения 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. В поле Имя внизу окна вписываем LWP 07 Macro . cs, далее жмём ОК.

 

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

 

Text: Использование SwCSharpAddin (C#) :: Ввод размеров болта для макроса
Size: 600; 100
FormBorderStyle: FixedDialog
MaximizeBox: False

 

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

 

Добавим на нашу форму 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. Модифицированная форма LWP 07 Macro

 

Двойным щелчком по кнопке 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. Результат построение шестигранного болта при помощи макроса

 


Дата добавления: 2019-09-13; просмотров: 188; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!