Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» icon

Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки»



НазваниеПояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки»
Дата17.10.2016
Размер
ТипПояснительная записка

Министерство образования Республики Беларусь

Белорусский национальный технический университет

Факультет информационных технологий и робототехники

Кафедра «Системы автоматизированного проектирования»


ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

по дисциплине «Основы автоматизации конструирования»


Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки»


Исполнитель: студентка факультета ИТР, 5 курса, группы 107519

Щёголева Мария Алексеевна


Руководитель: старший преподаватель Кункевич Дмитрий Петрович


Минск 2012


Министерство образования Республики Беларусь

Белорусский национальный технический университет

Факультет информационных технологий и робототехники

Кафедра «Системы автоматизированного проектирования»


^ КУРСОВАЯ РАБОТА

по дисциплине «Основы автоматизации конструирования»


Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки»


Исполнитель: студентка факультета ИТР, 5 курса, группы 107519

Щёголева Мария Алексеевна


Руководитель: старший преподаватель Кункевич Дмитрий Петрович


Минск 2012


Оглавление

Код вставки и позиционирования КЭ: 21

Код вставки и позиционирования плиты 28



Введение

Технологическая оснастка является совокупностью приспособлений машиностроительного оборудования, необходимых для выполнения им соответствующих технологических операций. Так, например, для прессов технологической оснасткой будут штампы, для литейных машин – пресс-формы, для металлообрабатывающих станков – металлорежущий инструмент и станочные приспособления.

Жизненный цикл любых изделий начинается с разработки технологической оснастки, от того насколько точно и квалифицированно она будет произведена напрямую зависят как сроки и качество оснастки, так и получаемых в итоге деталей. Так, например, использование САЕ систем позволяет анализировать процесс изготовления детали и осуществлять всесторонний анализ конструкции оснастки в процессе проектирования и разрабатывать программы для станков ЧПУ, существенно сокращая сроки и повышая качество.

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

Оснастка бывает двух видов: универсальная и специальная технологическая оснастка. Специальная оснастка необходима в тех случаях, когда использование универсальной невозможно, для изготовления определенной детали или выполнения отдельных операций техпроцесса.

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

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

Конструирование оснастки любой степени сложности должно осуществляться опытными специалистами предприятия с применением CAD/CAM/CAE систем. Как только технологическая оснастка будет спроектирована, квалифицированными специалистами производится симуляция процесса формообразования детали с помощью CAE систем и анализируется технологический процесс изготовления детали. Это позволяет еще на этапе проектирования осуществлять всесторонний анализ конструкции и работоспособность оснастки до воплощения в металле, а также разрабатывать управляющие программы на станки с ЧПУ - в итоге значительно сокращаются сроки изготовления оснастки, и повышается качество.


  1. Обзор проблемной области

Схема установки – совокупность типов конструктивных элементов, применимых для реализации определенной схемы базирования. Схема установки определяется схемой базирования (в основном).

Схема базирования   совокупность базовых поверхностей. Характеристики этой совокупности – основные факторы, которыми следует руководствоваться при выборе конструктивных элементов.

Основная характеристика поверхности – ее вид: плоскость, цилиндр, конус и т.д. Тип установочного элемента должен соответствовать виду базовой поверхности. Для плоской базы следует использовать какой-то плоский элемент (например, как пластину), для внутренней цилиндрической поверхности – элемент типа «палец». Также может использоваться и элемент типа «уголок» для позиционирования по двум плоским базам.

Затем необходимо определить функции каждой базы, а именно какая из них будет ограничивать вращательные степени свободы, а какая – поступательные.

Для ограничения поступательной степени свободы достаточно точки. Физически это значит, что против базы необходимо разместить только точечный упор. Такую базу, ограничивающую только одну поступательную степень свободы, называют опорной. Если база цилиндрическая, она может ограничивать две поступательные степени свободы по двум взаимно перпендикулярным направления соответственно. Такая база называется двойной опорной. Точечный упор можно разместить на минимальной поверхности. Поэтому опорная (двойная опорная) база – это база наименее развитая, имеющая меньшие по сравнению с другими размеры.

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

Наиболее развитая база ограничивает две вращательные степени свободы. Такая база только одна (из трех).

Если наиболее развита плоская база – это установочная база. Кроме двух вращательных степеней свободы, установочная база ограничивает одну поступательную степень.

Если наиболее развита цилиндрическая база – это двойная направляющая база. Кроме двух вращательных степеней свободы, двойная направляющая ограничивает две поступательные степени.

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

Математически степени свободы ограничиваются опорными точками. Опорные точки, в свою очередь, материализуются физически конструктивными элементами.

Конструктивный элемент – это деталь или узел. Одной из важнейших характеристик его является технологичность. Эта технологичность проявляется как при изготовлении, так и при эксплуатации. Как известно, чем меньше площадь контакта, тем выше давление, напряжение и, соответственно, деформации. Поэтому элементы, реализующие точечный контакт, применяются достаточно редко. Плоскости устанавливаются или на пластины, или на опоры с плоскими головками. Что касается поверхностей цилиндрических, то устанавливать их на точечные опоры вообще крайне неудобно. Для этого традиционно используются такие же цилиндрические элементы (пальцы, оправки, втулки и т.п.) или призматические элементы. Т.е. форма и размеры конструктивных элементов соответствуют тем опорным точкам, которые они реализуют, но не соответствуют им буквально.


  1. Постановка задачи

В курсовом проекте необходимо:

  • создать макрос для вставки конструктивных элементов (КЭ) оснастки;

  • КЕ оснастки должны правильно позиционироваться;

  • КЕ оснастки должны быть параметрическими;

  • создать макрос для вставки плиты под привалочные плоскости КЭ;

  • плита должны быть параметрической;

  • плита должна правильно позиционироваться.

Схема установки включает в себя следующие элементы:

  • установочный цилиндрический палец с буртиком;

  • цилиндрический срезанный палец с буртиком;

  • опорная пластина.

Изменяемые параметры:

  • диаметры обычного пальца и обрезанного пальца;

  • диаметры буртиков;

  • отверстия под пальцы;

  • параметры плиты.

Исходные данные:

  • схема установки (установка производится на плоскость и два параллельных отверстия).

Схема установки представлена на рисунке 1:



Рисунок 1 – Схема установки


  1. Выбор схемы установки

В схеме установки, представленной на рисунке 1, предполагается, что наиболее развитой базой является плоскость. Эта плоскость – установочная база. Одно из отверстий будет двойной опорной базой, а второе – опорной. Двойная опорная база – это две опорные точки, опорная база – одна опорная точка.

Т.к. форма установочного элемента должна соответствовать форме базы, то для обоих отверстий следует использовать установочные пальцы: для двойной опорной – полноценный цилиндрический, а для опорной – срезанный. Срезанный палец должен располагаться так, чтобы плоскость среза была перпендикулярна прямой, проходящей через центры пальцев (рисунок 2). После установки на полноценный палец деталь может вращаться вокруг него. Второй палец ограничит эту возможность. Его следует ориентировать относительно первого пальца так, чтобы плоскость среза была касательной к дуге с центром в точке привязки первого пальца и радиусом, равным расстоянию между пальцами. Срез необходим для того, чтобы погрешности межцентровых расстояний – и между пальцами, и между отверстиями – не могли воспрепятствовать установке.

На плоскости – установочной базе должны располагаться три опорные точки




Рисунок 2 – Расположение уголка

  1. Библиотека конструктивных элементов

Библиотека конструктивных элементов (КЭ) представлена теми КЭ, которые необходимы для реализации указанной схемы установки. Т.е. это установочный цилиндрический палец с буртиком, цилиндрический срезанный палец с буртиком и опорная пластина.

Все КЭ были выполнены в программе SolidWorks.

Этапы создания установочного цилиндрического пальца с буртиком:

  1. создать окружность и сделать вытянутый вырез (это будет двойная опорная база);

  2. создать окружность и сделать вытянутый вырез в направлении, противоположном направлению из пункта 1 (создание буртика);

  3. в разделе «Уравнения» создать глобальную переменную FirstFingerDiameter и присвоить ей любое значение;

  4. выбрать эскиз первой бобышки;

  5. для выбранного эскиза сделать автонанесение размера для окружности и привязать значение диаметра окружности к глобальной переменной FirstFingerDiameter;

  6. выбрать эскиз второй бобышки;

  7. для выбранного эскиза сделать автонанесение размера для окружности и привязать значение диаметра окружности к значению FirstFingerDiameter+10 (это необходимо для того, чтобы диаметр буртика всегда был на 10 мм больше диаметра цилиндра, выполняющего роль двойной опорной базы);

  8. сохранить элемент.

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

Установочный цилиндрический палец с буртиком представлен на рисунке 3:



Рисунок 3 – Установочный цилиндрический палец с буртиком

Этапы создания цилиндрического срезанного пальца с буртиком:

  1. создать окружность и сделать вытянутый вырез (это будет двойная опорная база);

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

  3. создать окружность и сделать вытянутый вырез в направлении, противоположном направлению из пункта 1 (создание буртика);

  4. создать глобальную переменную SecondFingerDiameter и присвоить ей любое значение;

  5. выбрать эскиз первой бобышки;

  6. для выбранного эскиза сделать автонанесение размера для окружности и привязать значение диаметра окружности к глобальной переменной SecondFingerDiameter;

  7. выбрать эскиз второй бобышки;

  8. для выбранного эскиза сделать автонанесение размера для окружности и привязать значение диаметра окружности к значению SecondFingerDiameter+10;

  9. сохранить элемент.

Цилиндрический срезанный палец с буртиком представлен на рисунке 4:




Рисунок 4 – Цилиндрический срезанный палец с буртиком


Этапы создания опорной пластины:

  1. создать прямоугольник и сделать вытянутый вырез;

  2. создать глобальную переменную PlastinaWidth и присвоить ей любое значение;

  3. выбрать эскиз бобышки;

  4. один из размеров связать с PlastinaWidth, а другой – с PlastinaWidth/4;

  5. сохранить элемент.


Опорная пластина представлена на рисунке 5:



Рисунок 5 – Опорная пластина


Примечание: высота буртиков пальцев и высота пластины должны быть одинаковыми.

Этапы создания плиты:

  1. создать прямоугольник и сделать вытянутый вырез;

  2. создать глобальные переменные PlateWidth и PlateHeight и присвоить им любые значения;

  3. выбрать эскиз бобышки;

  4. один из размеров связать с PlateWidth, а другой – с PlateHeight;

  5. сохранить элемент.


Плита представлена на рисунке 6:



Рисунок 6 – Плита

  1. Вставка конструктивных элементов

Вставка конструктивных элементов в сборку для всех элементов проходит по одному и тому же сценарию:

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

  2. сохраняется ссылка на текущий активный документ;

  3. открывается документ с типом swDocPART по пути, указанному в пункте 1;

  4. открытый элемент добавляется в текущую сборку;

  5. окно с открытым элементом закрывается.

В качестве примера ниже приведен код для вставки цилиндрического пальца с буртиком:

string AdPrtName = @"D:\Учёба\5 курс\ОАКТС\9 семестр\Курсач\курсач солид\палец.SLDPRT";

bool boolstatus = false;

int longstatus = 0;

swDoc = ((ModelDoc2)(swApp.ActiveDoc));

object Preop;

Preop = swApp.OpenDoc6(AdPrtName, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref longstatus, ref longwarnings);

Component2 Np;

Np = swAssembly.AddComponent5(AdPrtName, (int)swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig, "", false, "", 0, 0, 0);

swApp.CloseDoc(AdPrtName);


  1. Позиционирование конструктивных элементов

Для позиционирования конструктивных элементов необходимо на детали выбрать 3 грани: 2 цилиндрические и 1 плоскую.

Этапы позиционирования установочного цилиндрического пальца с буртиком:

  1. выбранная плоская грань сопрягается с поверхностью «Сверху» пальца, т. к. она является основанием буртика (тип сопряжения - swMateCOINCIDENT);

  2. первая выбранная на детали цилиндрическая грань сопрягается с цилиндрической гранью пальца, имеющей минимальный диаметр (тип сопряжения - swMateCONCENTRIC);

  3. определить диаметр первого выбранного цилиндра и это значение присвоить параметру FirstFingerDiameter.

Этапы позиционирование цилиндрического срезанного пальца с буртиком:

  1. выбранная плоская грань сопрягается с поверхностью «Сверху» пальца, т. к. она является основанием буртика (тип сопряжения - swMateCOINCIDENT);

  2. вторая выбранная на детали цилиндрическая грань сопрягается с цилиндрической гранью пальца, имеющей минимальный диаметр (тип сопряжения - swMateCONCENTRIC);

  3. определить диаметр второго выбранного цилиндра и это значение присвоить параметру SecondFingerDiameter.

Чтобы плоскость среза второго пальца была перпендикулярна прямой, проходящей через центры обоих пальцев, необходимо добавить еще одно сопряжения. Для этого у обоих пальцев нужно выбрать плоскости «Справа» и указать для сопряжения тип swMateCOINCIDENT.

Этапы позиционирование опорной пластины:

  1. выбранная плоская грань сопрягается с поверхностью «Сверху» пластины (тип сопряжения - swMateCOINCIDENT);

  2. у установочного цилиндрического пальца и у пластины выбираются плоскости «Справа» тип сопряжения - swMateCOINCIDENT). Это необходимо для того, чтобы пластина была параллельна прямой, проходящей через центры пальцев;

  3. параметру PlastinaWidth присваивается значение 1.5*сумму диаметров выбранных цилиндров.




  1. Позиционирование корпусной плиты

  1. Для позиционирования корпусной плиты необходимо в сборке выбрать 3 плоские грани, причем все грани лежат на одной плоскости.

  2. Этапы позиционирования плиты:

  3. первая выбранная плоская грань сопрягается с поверхностью «Сверху» плиты (тип сопряжения - swMateCOINCIDENT);

  4. у выбранных граней определить минимальные и максимальные значения координат X, Y, Z в системах координат соответствующего конструктивного элемента;

  5. для каждого КЭ получить свою матрицу преобразования локальных координат в глобальные;

  6. перевести все координаты, полученные в пункте 1, в глобальную систему координат;

  7. определить, какая координата является постоянной, после чего перевести координаты из трехмерной системы(X,Y,Z) в двумерную (X,Y);

  8. определить минимальные и максимальные координаты по X и по Y;

  9. найти необходимую ширину (Xmax - Xmin) и длину (Ymax - Ymin) для плиты;

  10. переменной PlateWidth присвоить значение Xmax - Xmin, а PlateHeight – а Ymax - Ymin;

  11. в зависимости от того, какая координата постоянная, у сборки выбирается определенная плоскость (если X=const, то выбирается плоскости «Спереди», Y – «Справа», Z – «Справа») и сопрягается с плоскостью «Спереди» плиты (тип сопряжения – swMatePARALLEL).



  1. Руководство пользователя

Необходимо создать новую сборку и добавить в нее необходимую деталь (рисунок 7):




Рисунок 7 – Деталь в сборке


После этого необходимо выбрать 3 грани: 2 цилиндрические и 1 плоскую

(рисунок 8).



Рисунок 8 – Выбор граней для сопряжения

Затем нужно запустить макрос для вставки конструктивных элементов. Для этого нужно нажать на кнопку, выбрать необходимый макрос и нажать кнопку для его запуска. Результат работы макроса представлен на рисунке 9.



Рисунок 9 – Результат работы макроса


У пользователя есть возможность перемещать пальцы в интерактивном режиме (рисунок 10).




Рисунок 10 – Перемещение пластины и уголка

Чтобы вставить плиту, необходимо в сборке выбрать 3 плоские грани (привалочные грани), все грани должны лежать на одной плоскости (рисунок 11) и запустить макрос.



Рисунок 11 – Выделение привалочных граней


Результат работы макроса представлен на рисунке 12:




Рисунок 12 – Результат работы макроса

У пользователя есть возможность перемещать плиту в интерактивном режиме (рисунок 13).




Рисунок 13 – Перемещение плиты


Заключение

В ходе выполнения курсовой работы были разработаны две процедуры: одна – для вставки элементов схемы установки, другая – для вставки плиты под эти элементы. Действия процедур не привязаны к какой-то определенной детали. Следовательно, они могут быть применены для закрепления различных заготовок, деталей. Это позволит делать предварительные расчеты для создания готовых изделий, проверки их на прочность, жесткость и др. на компьютере вместо разработки реальной оснастки и заготовки или детали, что в свою очередь экономит материальные и временные затраты.


Приложения
^

Код вставки и позиционирования КЭ:


using SolidWorks.Interop.sldworks;

using SolidWorks.Interop.swconst;

using System.Runtime.InteropServices;

using System;

using System.Windows.Forms;

using System.Collections.Generic;


namespace Macro1.csproj

{

public partial class SolidWorksMacro

{


public void Main()

{


ModelDoc2 swDoc = ((ModelDoc2)(swApp.ActiveDoc));

AssemblyDoc swAssembly = ((AssemblyDoc)(swDoc));

int longwarnings = 0;


IModelDoc2 Part = (IModelDoc2)swApp.ActiveDoc;

ISelectionMgr SelectionManager = (ISelectionMgr)Part.SelectionManager;

int selectedObjectCount = SelectionManager.GetSelectedObjectCount();

if (selectedObjectCount != 3) MessageBox.Show("Неверное количество поверхностей");

else

{

List se = new List();

bool isFace2 = false;

for (int i = 0; i < selectedObjectCount; i++)

{

se.Add(SelectionManager.GetSelectedObject6(i + 1, -1));

if (se[i] is IFace2)

{

isFace2 = true;

}

}


if (!isFace2)

{

MessageBox.Show("Выбранные элементы не являются поверхностями");

}

else

{

List faces = new List();

List surfaces = new List();

List faces1 = new List();

List surfaces1 = new List();

for (int i = 0; i < selectedObjectCount; i++)

{

faces.Add((Face2)se[i]);

surfaces.Add((Surface)faces[i].GetSurface());

}

for (int i = 0; i < selectedObjectCount; i++)

{

faces1.Add((Face2)se[i]);

surfaces1.Add((Surface)faces1[i].GetSurface());

}


//////////////////////////////////////////////

//вставка первого пальца

string AdPrtName = @"C:\Users\FASOLKA\Desktop\АТП\Kursach\Locator1.SLDPRT";

bool boolstatus = false;

int longstatus = 0;

swDoc = ((ModelDoc2)(swApp.ActiveDoc));

object Preop;

Preop = swApp.OpenDoc6(AdPrtName, (int)swDocumentTypes_e.swDocPART,

(int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref longstatus, ref longwarnings);

Component2 Np;

Np = swAssembly.AddComponent5(AdPrtName,

(int)swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig, "", false, "", 0, 0, 0);

swApp.CloseDoc(AdPrtName);


//сопряжение поверхностей

string feName = "Спереди"; //Спереди

Feature rfPlane = Np.FeatureByName(feName);


//отменить выделение всех поверхностей

DeselectAllSurfaces(SelectionManager);


//выбор первого выбранного цилиндра

double cylinderDiameter = 0;

Entity faceToSelect = GetFirstSelectedCylinder(faces, surfaces, ref cylinderDiameter);

//выбор цилиндра с минимальным диаметром - палец

GetCylinderWithMinDiameterInFirstFinger(Np);

IMate2 planeMate = swAssembly.AddMate3((int)swMateType_e.swMateCONCENTRIC, -1, false, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, false, out longwarnings);

DeselectAllSurfaces(SelectionManager);

swDoc.Rebuild(1);


EquationMgr equationManager = (EquationMgr)(((IModelDoc2)Np.GetModelDoc()).GetEquationMgr());

string findSubstring = "FirstFingerDiameter";

ChooseDiameterInFinger(cylinderDiameter, equationManager, findSubstring);

swDoc.Rebuild(1);

MovingComponent(Np, new double[] { 0, 0, 0.045 });


////////////////////////////////////////////////

//вставка второго пальца

AdPrtName = @"C:\Users\FASOLKA\Desktop\АТП\Kursach\Locator2.SLDPRT";

boolstatus = false;

longstatus = 0;

swDoc = ((ModelDoc2)(swApp.ActiveDoc));

Preop = swApp.OpenDoc6(AdPrtName, (int)swDocumentTypes_e.swDocPART,

(int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref longstatus, ref longwarnings);

Np = swAssembly.AddComponent5(AdPrtName,

(int)swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig, "", false, "", 0, 0, 0);

swApp.CloseDoc(AdPrtName);


//сопряжение поверхностей

feName = "Спереди"; //Спереди

rfPlane = Np.FeatureByName(feName);

rfPlane.Select(true);


//отменить выделение всех поверхностей

DeselectAllSurfaces(SelectionManager);


//выбор второго выбранного цилиндра

cylinderDiameter = 0;

faceToSelect = GetSecondSelectedCylinder(faces, surfaces, ref cylinderDiameter);

//выбор цилиндра с минимальным диаметром - палец

GetCylinderWithMinDiameterInFirstFinger(Np);

planeMate = swAssembly.AddMate3((int)swMateType_e.swMateCONCENTRIC, -1, false, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, false, out longwarnings);

DeselectAllSurfaces(SelectionManager);

swDoc.Rebuild(1);


equationManager = (EquationMgr)(((IModelDoc2)Np.GetModelDoc()).GetEquationMgr());

findSubstring = "FirstFingerDiameter";

ChooseDiameterInFinger(cylinderDiameter, equationManager, findSubstring);

swDoc.Rebuild(1);

MovingComponent(Np, new double[] { 0, 0, 0.1 });


////////////////////////////////////////////Вставка пластины1

string AdPrtName3 = @"C:\Users\FASOLKA\Desktop\АТП\Kursach\Locator7.SLDPRT";

object Preop3;

swDoc = ((ModelDoc2)(swApp.ActiveDoc));

Preop3 = swApp.OpenDoc6(AdPrtName3, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref longstatus, ref longwarnings);

Component2 Np1;

Np1 = swAssembly.AddComponent5(AdPrtName3, (int)swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig, "", false, "", 0, 0, 0);

swApp.CloseDoc(AdPrtName3);

MovingComponent(Np1, new double[] { 0.095, 0.095, 0 });


feName = "Сверху";

rfPlane = Np1.FeatureByName(feName);

rfPlane.Select(true);

faceToSelect = SelectPlaneSurface(faces, surfaces);

faceToSelect.Select(true);

planeMate = swAssembly.AddMate3((int)swMateType_e.swMateCOINCIDENT, -1, false, 0, 0, 0, 0, 0, 0, 0, 0, false, out longwarnings);


DeselectAllSurfaces(SelectionManager);

swDoc.Rebuild(1);


////////////////////////////////////////////Вставка пластины2

AdPrtName3 = @"C:\Users\FASOLKA\Desktop\АТП\Kursach\Locator7.SLDPRT";

swDoc = ((ModelDoc2)(swApp.ActiveDoc));

Preop3 = swApp.OpenDoc6(AdPrtName3, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref longstatus, ref longwarnings);

Component2 Np2 = swAssembly.AddComponent5(AdPrtName3, (int)swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig, "", false, "", 0, 0, 0);

swApp.CloseDoc(AdPrtName3);

MovingComponent(Np2, new double[] { -0.095, 0.095, 0 });


feName = "Сверху";

rfPlane = Np2.FeatureByName(feName);

rfPlane.Select(true);

faceToSelect = SelectPlaneSurface(faces, surfaces);

faceToSelect.Select(true);

planeMate = swAssembly.AddMate3((int)swMateType_e.swMateCOINCIDENT, -1, false, 0, 0, 0, 0, 0, 0, 0, 0, false, out longwarnings);


DeselectAllSurfaces(SelectionManager);

swDoc.Rebuild(1);


////////////////////////////////////////////Вставка пластины3

AdPrtName3 = @"C:\Users\FASOLKA\Desktop\АТП\Kursach\Locator7.SLDPRT";

swDoc = ((ModelDoc2)(swApp.ActiveDoc));

Preop3 = swApp.OpenDoc6(AdPrtName3, (int)swDocumentTypes_e.swDocPART,

(int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref longstatus, ref longwarnings);

Component2 Np3 = swAssembly.AddComponent5(AdPrtName3,

(int)swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig, "", false, "", 0, 0, 0);

swApp.CloseDoc(AdPrtName3);

MovingComponent(Np3, new double[] { 0, -0.134, 0 });


feName = "Сверху";

rfPlane = Np3.FeatureByName(feName);

rfPlane.Select(true);

faceToSelect = SelectPlaneSurface(faces, surfaces);

faceToSelect.Select(true);

planeMate = swAssembly.AddMate3((int)swMateType_e.swMateCOINCIDENT, -1, false, 0, 0, 0, 0, 0, 0, 0, 0, false, out longwarnings);


DeselectAllSurfaces(SelectionManager);

swDoc.Rebuild(1);

}

}

}


private Entity GetSecondSelectedCylinder(List faces, List surfaces, ref double cylinderDiameter)

{

Entity faceToSelect = null;

for (int i = 0; i < surfaces.Count; i++)

{

if (surfaces[i].IsCylinder())

{

faceToSelect = (Entity)faces[i];

double[] param = (double[])((Surface)faces[i].GetSurface()).CylinderParams;

cylinderDiameter = param[6] * 1000;

}

}

faceToSelect.Select(true);

return faceToSelect;

}


private void ChooseDiameterInFinger(double cylinderDiameter, EquationMgr equationManager, string findSubstring)

{

int equationCount = equationManager.GetCount();

string equation = string.Empty;

int index = 0;

for (int i = 0; i < equationCount; i++)

{

equation = equationManager.get_Equation(index);

if (equation.Contains(findSubstring))

{

break;

}

else

{

index++;

}

}


string[] substringArray = equation.Split('=');

string[] parameterArray = cylinderDiameter.ToString().Split(',');

substringArray[1] = parameterArray[0];

if (parameterArray.Length == 2) substringArray[1] += "." + parameterArray[1];

equation = substringArray[0] + "=" + substringArray[1];

equationManager.set_Equation(index, equation);

equationManager.EvaluateAll();

}


private void GetCylinderWithMinDiameterInFirstFinger(Component2 Np)

{

Body body = (Body)Np.GetBody();

int count = body.GetFaceCount();

Face2 faceToSelect2 = (Face2)body.GetFirstFace();

Face2 buffFace = (Face2)body.GetFirstFace();

if (!((Surface)faceToSelect2.GetSurface()).IsCylinder())

{

while (count > 1)

{

faceToSelect2 = (Face2)faceToSelect2.GetNextFace();

if (((Surface)faceToSelect2.GetSurface()).IsCylinder())

{

if (((Surface)buffFace.GetSurface()).IsCylinder())

{

double[] param1 = (double[])((Surface)buffFace.GetSurface()).CylinderParams;

double[] param2 = (double[])((Surface)faceToSelect2.GetSurface()).CylinderParams;

if (param1[6] > param2[6])

{

buffFace = faceToSelect2;

}

}

else

{

buffFace = faceToSelect2;

}

}

count--;

}

}


((Entity)buffFace).Select(true);

}


private Entity GetFirstSelectedCylinder(List faces, List surfaces, ref double cylinderDiameter)

{

Entity faceToSelect = null;

for (int i = 0; i < surfaces.Count; i++)

{

if (surfaces[i].IsCylinder())

{

faceToSelect = (Entity)faces[i];

double[] param = (double[])((Surface)faces[i].GetSurface()).CylinderParams;

cylinderDiameter = param[6] * 2000;

break;

}

}

faceToSelect.Select(true);

return faceToSelect;

}


private void DeselectAllSurfaces(ISelectionMgr SelectionManager)

{

int selectedObjectCount = SelectionManager.GetSelectedObjectCount();

for (int i = 0; i < selectedObjectCount; i++)

{

SelectionManager.DeSelect(1);

}

}


public Entity SelectPlaneSurface(List faces, List surfaces)

{

Entity faceToSelect = null;

for (int i = 0; i < surfaces.Count; i++)

{

if (surfaces[i].IsPlane())

{

faceToSelect = (Entity)faces[i];

break;

}

}

return faceToSelect;

}


public Entity SelectPlaneSurface1(List faces1, List surfaces1)

{

Entity faceToSelect1 = null;

for (int i = 0; i < surfaces1.Count; i++)

{

if (surfaces1[i].IsPlane())

{

faceToSelect1 = (Entity)faces1[i + 1];

break;

}

}

return faceToSelect1;

}


private void MovingComponent(Component2 component, double[] Point)

{

MathTransform Tnew = (MathTransform)((MathUtility)swApp.GetMathUtility()).CreateTransform(component.Transform.ArrayData);

object X = new object();

object Y = new object();

object Z = new object();

object P = new object();

double S = 0;

component.Transform.GetData2(ref X, ref Y, ref Z, ref P, ref S);

//double[] _mass = (double[])((MathVector)_P).ArrayData;

((MathVector)P).ArrayData = Point;

Tnew.SetData(X, Y, Z, P, S);

component.Transform = Tnew;

((ModelDoc2)swApp.ActiveDoc).EditRebuild3();

}


///

/// The SldWorks swApp variable is pre-assigned for you.

///


public SldWorks swApp;

}

}
^

Код вставки и позиционирования плиты



using SolidWorks.Interop.sldworks;

using SolidWorks.Interop.swconst;

using System.Collections.Generic;

using System.Windows.Forms;

using System;

using System.Runtime.InteropServices;


namespace Macro2.csproj

{

public class Coordinate

{

private double x;

public double X

{

get { return x; }

set { x = value; }

}

private double y;

public double Y

{

get { return y; }

set { y = value; }

}

public Coordinate(double x1, double y1)

{

this.X = x1;

this.Y = y1;

}

}

public class Functions

{

public double[,] GetPositionMatrix(Component2 component)

{

double[] buffArray = (double[])component.Transform.ArrayData;

double[,] matrix = new double[4, 4];

matrix[0, 0] = buffArray[0];

matrix[0, 1] = buffArray[1];

matrix[0, 2] = buffArray[2];

matrix[0, 3] = buffArray[9] * 1000;

matrix[1, 0] = buffArray[3];

matrix[1, 1] = buffArray[4];

matrix[1, 2] = buffArray[5];

matrix[1, 3] = buffArray[10] * 1000;

matrix[2, 0] = buffArray[6];

matrix[2, 1] = buffArray[7];

matrix[2, 2] = buffArray[8];

matrix[2, 3] = buffArray[11] * 1000;

matrix[3, 0] = buffArray[15];

matrix[3, 1] = buffArray[14];

matrix[3, 2] = buffArray[13];

matrix[3, 3] = buffArray[12];

return matrix;

}

public Vertex GetVertexInGlobalCoordSystem(Vertex local, double[,] matrix)

{

Vertex global = new Vertex();

if (matrix.GetLength(0) == 4 && matrix.GetLength(1) == 4)

{

for (int i = 0; i < 4; i++)

{

global.X = local.X * matrix[0, 0] + local.Y * matrix[0, 1] + local.Z * matrix[0, 2] + 1 * matrix[0, 3];

global.Y = local.X * matrix[1, 0] + local.Y * matrix[1, 1] + local.Z * matrix[1, 2] + 1 * matrix[1, 3];

global.Z = local.X * matrix[2, 0] + local.Y * matrix[2, 1] + local.Z * matrix[2, 2] + 1 * matrix[2, 3];

}

}

return global;

}

public List GetCoordinateFromVertex(Vertex firstVertex, Vertex secondVertex)

{

List result = new List();

if (firstVertex.X == secondVertex.X)

{

result.Add(new Coordinate(firstVertex.Y, firstVertex.Z));

result.Add(new Coordinate(secondVertex.Y, secondVertex.Z));

}

else

{

if (firstVertex.Y == secondVertex.Y)

{

result.Add(new Coordinate(firstVertex.X, firstVertex.Z));

result.Add(new Coordinate(secondVertex.X, secondVertex.Z));

}

else

{

if (firstVertex.Z == secondVertex.Z)

{

result.Add(new Coordinate(firstVertex.X, firstVertex.Y));

result.Add(new Coordinate(secondVertex.X, secondVertex.Y));

}

}

}

return result;

}

public void GetPlateSize(List coords, ref double width, ref double height)

{

double minX = int.MaxValue;

double maxX = int.MinValue;

double minY = int.MaxValue;

double maxY = int.MinValue;

foreach (Coordinate item in coords)

{

if (minX > item.X) minX = item.X;

if (maxX < item.X) maxX = item.X;

if (minY > item.Y) minY = item.Y;

if (maxY < item.Y) maxY = item.Y;

}

width = maxX - minX;

height = maxY - minY;

}

public string GetSurfaceNameForMate(Component2 component)

{

double[,] matrix = new double[4, 4];

matrix = GetPositionMatrix(component);

string feName = "Сверху"; //Спереди

Feature rfPlane = component.FeatureByName(feName);

object boxObject = null;

rfPlane.GetBox(ref boxObject);

double[] box = (double[])boxObject;

List boxCoordinate = new List();

boxCoordinate.Add(new Vertex(box[0], box[1], box[2]));

boxCoordinate.Add(new Vertex(box[3], box[4], box[5]));

List globalCoordinate = new List();

for (int i = 0; i < boxCoordinate.Count; i++)

{

globalCoordinate.Add(GetVertexInGlobalCoordSystem(boxCoordinate[i], matrix));

}

if (boxCoordinate[0].X == boxCoordinate[1].X) return "Спереди";

if (boxCoordinate[0].Y == boxCoordinate[1].Y) return "Справа";

if (boxCoordinate[0].Z == boxCoordinate[1].Z) return "Сверху";

return null;

}

}


public class Vertex

{

private double x;

public double X

{

get { return x; }

set { x = value; }

}

private double y;

public double Y

{

get { return y; }

set { y = value; }

}

private double z;

public double Z

{

get { return z; }

set { z = value; }

}

public Vertex()

{

this.X = 0; this.Y = 0; this.Z = 0;

}


public Vertex(double x1, double y1, double z1)

{

this.X = x1;

this.Y = y1;

this.Z = z1;

}

}

public partial class SolidWorksMacro

{

public void Main()

{

ModelDoc2 swDoc = ((ModelDoc2)(swApp.ActiveDoc));

AssemblyDoc swAssembly = ((AssemblyDoc)(swDoc));

int longwarnings = 0;

IModelDoc2 Part = (IModelDoc2)swApp.ActiveDoc;

ISelectionMgr SelectionManager = (ISelectionMgr)Part.SelectionManager;

int selectedObjectCount = SelectionManager.GetSelectedObjectCount();

if (selectedObjectCount != 3) MessageBox.Show("Неверное количество поверхностей");

else

{

List selectedElements = new List();

bool isFace2 = false;

for (int i = 0; i < selectedObjectCount; i++)

{

selectedElements.Add(SelectionManager.GetSelectedObject6(i + 1, -1));

if (selectedElements[i] is IFace2)

{

isFace2 = true;

}

}

if (!isFace2)

{

MessageBox.Show("Выбранные элементы не являются поверхностями");

}

else

{

Functions function = new Functions();

List faces = new List();

List surfaces = new List();

List matrix = new List();

for (int i = 0; i < selectedObjectCount; i++)

{

faces.Add((Face2)selectedElements[i]);

surfaces.Add((Surface)faces[i].GetSurface()); matrix.Add(function.GetPositionMatrix((Component2)SelectionManager.GetSelectedObjectsComponent(i + 1)));

}

if (!(surfaces[0].IsPlane() && surfaces[1].IsPlane() && surfaces[2].IsPlane()))

{

MessageBox.Show("Не все выбранные элементы не являются типом Plane");

}

else

{

List boxCoordinate = new List();

for (int i = 0; i < selectedObjectCount; i++)

{

double[] bufferArray = (double[])faces[i].GetBox();//(double[])swAssembly.GetBox(2);

for (int index = 0; index < bufferArray.Length; index++)

{

bufferArray[index] = bufferArray[index] * 1000;

}

boxCoordinate.Add(new Vertex(bufferArray[0], bufferArray[1], bufferArray[2]));

boxCoordinate.Add(new Vertex(bufferArray[3], bufferArray[4], bufferArray[5]));

}

List globalCoordinate = new List();

int j = 0;

for (int i = 0; i < selectedObjectCount * 2; i += 2)

{

globalCoordinate.Add(function.GetVertexInGlobalCoordSystem(boxCoordinate[i], matrix[j]));

globalCoordinate.Add(function.GetVertexInGlobalCoordSystem(boxCoordinate[i + 1], matrix[j]));

j++;

}

matrix = null;

boxCoordinate = null;

List coord = new List();

for (int i = 0; i < selectedObjectCount * 2; i += 2)

{

coord.AddRange(function.GetCoordinateFromVertex(globalCoordinate[i], globalCoordinate[i + 1]));

}

double width = 0, height = 0;

function.GetPlateSize(coord, ref width, ref height);

string partName = @"C:\Users\FASOLKA\Desktop\АТП\Kursach\Plate.SLDPRT";

int longstatus = 0;

swDoc = ((ModelDoc2)(swApp.ActiveDoc));

object preDefinition = swApp.OpenDoc6(partName, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref longstatus, ref longwarnings);

Component2 part = swAssembly.AddComponent5(partName, (int)swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig, "", false, "", 0, 0, 0);

swApp.CloseDoc(partName);

string feName = "Сверху";

Feature rfPlane = part.FeatureByName(feName);

rfPlane.Select(true);

Entity faceToSelect = SelectPlaneSurface(faces, surfaces);

faceToSelect.Select(true);

IMate2 planeMate = swAssembly.AddMate3((int)swMateType_e.swMateCOINCIDENT, (int)swMateAlign_e.swMateAlignANTI_ALIGNED, false, 0, 0, 0, 0, 0, 0, 0, 0, false, out longwarnings);

EquationMgr equationManager = (EquationMgr)(((IModelDoc2)part.GetModelDoc()).GetEquationMgr());

//string findSubstring = "PlateWidth";

//equationManager.set_Equation(1, findSubstring);

////ChangeParameterSize(width, equationManager, findSubstring);

//findSubstring = "PlateHeight";

////ChangeParameterSize(height, equationManager, findSubstring);

//equationManager.set_Equation(1, findSubstring);

double B = width;

double L = height;

ModelDoc2 plate_modelDoc = (ModelDoc2)part.GetModelDoc2();

EquationMgr eqMgr_pl = plate_modelDoc.GetEquationMgr();


for (int i = 0; i < eqMgr_pl.GetCount(); i++)

{

if (eqMgr_pl.get_Equation(i).Contains("\"B\"="))

{

string str_eqB = eqMgr_pl.get_Equation(i);

str_eqB = str_eqB.Substring(0, str_eqB.LastIndexOf('=') + 1) + B.ToString();

eqMgr_pl.set_Equation(i, str_eqB);

}

if (eqMgr_pl.get_Equation(i).Contains("\"L\"="))

{

string str_eqL = eqMgr_pl.get_Equation(i);

str_eqL = str_eqL.Substring(0, str_eqL.LastIndexOf('=') + 1) + L.ToString();

eqMgr_pl.set_Equation(i, str_eqL);

}

}

eqMgr_pl.EvaluateAll();

plate_modelDoc.EditRebuild3();

DeselectAllSurfaces(SelectionManager);

swDoc.Rebuild(1);

feName = function.GetSurfaceNameForMate(part);//"Справа";

rfPlane = (Feature)swAssembly.FeatureByName(feName);

rfPlane.Select(true);

feName = "Спереди";

rfPlane = part.FeatureByName(feName);

rfPlane.Select(true);

planeMate = swAssembly.AddMate3((int)swMateType_e.swMatePARALLEL, (int)swMateAlign_e.swAlignNONE, false, 0, 0, 0, 0, 0, 0, 0, 0, false, out longwarnings);

DeselectAllSurfaces(SelectionManager);

}


}

}


}


public Entity SelectPlaneSurface(List faces, List surfaces)

{

Entity faceToSelect = null;

for (int i = 0; i < surfaces.Count; i++)

{

if (surfaces[i].IsPlane())

{

faceToSelect = (Entity)faces[i];

break;

}

}

return faceToSelect;

}


private void DeselectAllSurfaces(ISelectionMgr SelectionManager)

{

int selectedObjectCount = SelectionManager.GetSelectedObjectCount();

for (int i = 0; i < selectedObjectCount; i++)

{

SelectionManager.DeSelect(1);

}

}


///

/// The SldWorks swApp variable is pre-assigned for you.

///


public SldWorks swApp;


}

}




Похожие:

Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconЭволюционные алгоритмы для автоматизации проектирования распределенных систем обработки информации и управления
В работе описывается поход к автоматизации моделирования распределенных систем с помощью Марковских процессов и выбора эффективных...
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconПояснительная записка По дисциплине : Теория и методология архитектурно- дизайнерского проектирования Тема : «Организация безбарьерной среды в Октябрьском районе»

Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconРабота со специальными прайс-листами с помощью ис «Лекарственные средства»
С помощью информационной системы «Лекарственные средства» (ИС) оптовые компании и их клиенты получают возможность автоматизации процедуры...
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconТехническое задание на семестровую работу по системному анализу «Cистема проектирования по, основанная на принципах Scrum» Руководитель разработки
Кафедра «Системы автоматизированного проектирования и поискового конструирования»
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconПротокол № от
Специальность: 05. 02. 07 Технологии и оборудование механической и физико-технической обработки
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconМетодическое пособие по дисциплине «Основы рекламы» Проектные задания для самостоятельной работы к модулям I iv
Составьте досье с рассмотрением достоинств и недостатков Интернета, как средства распространения рекламы
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconПояснительная записка к курсовому проекту по дисциплине «экспертные системы» на тему : «Экспертная система на базе vp-expert»
Пояснительная записка к курсовому проекту по дисциплине «экспертные системы» на тему
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconТема: «Технологическая карта механической обработки зубчатого колеса»
Электрической эрозии подвержены контакты реле, выключателей, рубильников и других подобных устройств. Много исследований было посвящено...
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconТехническое задание «Система управления проектами»
Кафедра «Системы автоматизированного проектирования и поискового конструирования»
Пояснительная записка по дисциплине «Основы автоматизации конструирования» Тема «Разработка программно-методического средства проектирования приспособлений для механической обработки» iconТехническое задание «Система управления проектами»
Кафедра «Системы автоматизированного проектирования и поискового конструирования»
Разместите ссылку на наш сайт:
Справочники, творчество


База данных защищена авторским правом ©dmee.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
контакты