Анимация кривошипно-шатунного механизма с присоединенной кулисой
Федеральное
агентство по образованию
МОСКОВСКИЙ
ГОСУДАРСТВЕННЫЙ МАШИНОСТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ
Факультет:
машиностроительный
Кафедра:
САПР
КУРСОВАЯ
РАБОТА
ДИСЦИПЛИНА:
“Лингвистическое и программное обеспечение
САПР”
ТЕМА РАБОТЫ:
“Анимация кривошипно-шатунного механизма с
присоединенной
кулисой”
Вариант №3-9
Выполнил:
Студент
группы М27-4к
Копылов О.В.
Москва -
2013
Содержание
Задание
к курсовой работе
Содержание
Введение
.
Этапы выполнения курсовой работы
.
Этапы разработки программы
.1
Блок-схема работы программы
.2
Создание проекта «Kopylov_Mechanics»
в MS Visual C#
.3
Создаем меню
.4
Описание использованных в программе функций
.5
Принцип работы Движущихся элементов
.6
Void Picture
Заключение
Листинг
программы
Main.cs
Options.cs
Задание к курсовой работе
по дисциплине «Программное обеспечение САПР»
ДАНО
1. Кинематическая схема плоского рычажного
механизма согласно номеру задания.
. Ведущее звено АВ совершает полный оборот
относительно начала системы координат XY (кинематическая пара А на схеме
механизма).
. Некоторые размеры рычажного механизма согласно
варианту задания.
ЗАДАНИЕ
Разработать многооконное программное
обеспечение. Главное окно должно иметь стандартную панель падающих меню, панель
инструментов и клиентскую область.
Программное обеспечение должно обеспечивать:
. Ввод незаданных исходных данных, выполненный в
виде отдельного диалогового окна:
.1 скорости вращения ведущего звена в
зависимости от времени;
.2 размеров и длин звеньев механизма в мм;
.3 координат размещения кинематических пар,
связанных с неподвижным основанием, в мм;
.4 число положений механизма;
.5 масштаб отображения кинематической схемы
механизма.
. Вывод в клиентской области исходных данных
механизма.
. Проверку условий проворачиваемости механизма.
. Графическое построение в клиентской области
минимум 12 положений механизма в зависимости от угла поворота ведущего звена
АВ, выполненных в мм согласно выбранному масштабу.
. Анимацию движения механизма, построенному в мм
согласно выбранному масштабу, в зависимости от величины угловой скорости
ведущего звена АВ.
. Сохранение и восстановление заданных исходных
данных в пункте 1.
. Сохранение и восстановление графического
отображения механизма и заданных исходных данных в клиентской области.
Длина звена АВ = 150 мм
Т. D-Lx
= -270
Т. D-Ly
= -40
Т.D-Le
= 150
Введение
Данная курсовая работа посвящена разработке
программы, которая выводит на экран заданный механизм. Механизм анимирован,
пользователь может изменять длины звеньев, не нарушая при этом целостность
механизма, так же в программе предусмотрена возможность изменения скорости
вращения входного звена. Есть возможность изменения масштаба.
Предусмотрена возможность сохранения и
считывания входных данных из файла.
1. Этапы выполнения курсовой работы
• Анализ задания
• Проверка механизма
• Аналитический расчет механизма
• Создание программы на языке C#
2. Этапы разработки программы
.1 Блок-схема работы программы
.2 Создание проекта «Kopylov_Mechanics»
в MS Visual C#
. Запускаем Visual
С#. Нажимаем Файл -> Создать -> Проект
В графе имя вводим название проекта, в графе
Расположение выбираем путь где будет хранится исходные файлы программы.
3. Нажимаем ОК чтобы создать проект
.3 Создаем меню
Для меню нам понадобятся:
Открываем «Панель инструментов» на форме
размещаем 5(Старт, Стоп, Параметры, Save,
Load) кнопок , 1 NumericUpDown
(для контроливания скорости вращения) и PictureBox
Далее расположим все элементы на форме должным
образом
.4 Описание использованных в программе функций
.cs:
.1 Создание точек на экране вывода (шарниры)
void
Hinge
.2 Создание «треугоников» для шарниров
void
Pillar
.3 Маштабирование:
void
NewSizes
.4 Создание Прямоугольников:
void
Plunger
.5 Создание плоскости, которая ограничивает
движение «точки» E :
void
Base
.6 Расчет и построение точек и дальнейшее
построение по ним необходимым линий для окна вывода:
void
Picture()
.7 Действия происходящие после нажатия на кнопку
«Старт»:
private
void pysk_Click
.8 Таймер для контролирования выполнений
операций за опр. Кол-во времени(скорость движения)(осуществляется после того
как мы изменили данные в NumericUpDown
с Name DgUD)
:
private
void DgUD_ValueChanged
.9 Вызов второго окна для изменения данных:
private void btPrm_Click.cs:
1.10 Выполняется при первом отображении формы:
private
void PrmForm_Shown
.11 Выполняется при закрытии формы:
private void PrmForm_FormClosing
.12 Выполняется
при
изменении
TextBox с
name “mash”:void mash_TextChanged
.13 Выполняется
по
нажатию
кнопки
ОК:void
ok_Click
.14 Выполняется
по
нажатию
кнопки
cancel void
cancel_Click
Для создания второй формы необходимо:
Кликнуть правой клавишей мыши на наименование
проекта в «обозревателе решений». Далее кнопка «добавить», а после «Форма Windows…».
И у нас создастся новая форма с именем «FormN.cs»
где N порядковый номер
формы (если не менять её название)
.5 Принцип работы движущихся элементов
Для осуществления передвижения всех необходимых
элементов используем следующие формулы:
.1 точка B
Находим угол:
Ang = Math.Acos(CyA / AB) + Math.PI
/ 2;
Находим точку B
по 2 осям x и y:
Bx = Ax + AB * Scl *
(float)Math.Cos(Ang);= Ay - AB * Scl * (float)Math.Sin(Ang);
1.2 точка D
Находим угол:
a = Math.Atan2(Cy
- By, Bx
- Cx)
Находим точку D
по 2 осям x и y:
Dx = Cx + CD * (float)Math.Cos(a) *
Scl;= Cy - CD * (float)Math.Sin(a) * Scl;
1.3 Точка
E
Находим угол:
a = Math.Asin((Dx - Ex) / DE / Scl);
Находим точку E
по
2 осям x и y:
Ey = Dy + DE * (float)Math.Cos(a) *
Scl;
- нам дана по условию
.6 Viod
Picture именно в нем
происходят расчеты тотрисовка всех элементов на pirtureBox
void Picture()
{(Graphics Gr =
Graphics.FromImage(PB.Image))
{.SmoothingMode =
SmoothingMode.HighQuality;.Clear(Color.White);Fn = new Font("Bodoni
MT", 10, FontStyle.Bold);.DrawString("AB = " + AB.ToString() +
" mm", Fn, Brushes.Black, 0, 0);.DrawString("CD = " +
CD.ToString() + " mm", Fn, Brushes.Black, 0, 20);.DrawString("DE
= " + DE.ToString() + " mm", Fn, Brushes.Black, 0,
40);.DrawString("CyA = " + CyA.ToString() + " mm", Fn,
Brushes.Black, 0, 60);.DrawString("Масштаб
= " + Scl.ToString() + " pix/mm", Fn, Brushes.Black, 0, 80);(Gr,
Ax, Ay, "A");(Gr);= Ax + AB * Scl * (float)Math.Cos(Ang);= Ay - AB *
Scl * (float)Math.Sin(Ang);.DrawLine(Pens.Black, Bx, By, Ax, Ay);a =
Math.Atan2(Cy - By, Bx - Cx);= Cx + CD * (float)Math.Cos(a) * Scl ;= Cy - CD *
(float)Math.Sin(a) * Scl;.DrawLine(Pens.Black, Dx, Dy, Cx, Cy);(Gr, Ax, Ay,
"A");(Gr, Cx, Cy, "C");(Gr, Bx, By, a, "B");=
Math.Asin((Dx - Ex) / DE / Scl);= Dy + DE * (float)Math.Cos(a) *
Scl;.DrawLine(Pens.Black, Dx, Dy, Ex, Ey);(Gr, Dx, Dy, "D");(Gr, Ex,
Ey, Math.PI / 2, "E");
PB.Refresh();
}
}
механизм программа visual файл
Заключение
В ходе выполнения данной курсовой работы были
освоены основные приемы создания приложений и распространенные функции для
работы с графикой в среде разработки MS Visual C#.
Листинг программы
Main.cs:System;System.Collections.Generic;System.Drawing;System.Drawing.Drawing2D;System.Text;System.IO;System.Windows.Forms;Kopylov_Mechanics
{Ax = 400;Ay = 200;float AB =
80;float CD = 450 + 40; // Cx ->float DE = 200;float DxEx = -130; //dfloat
CyA = 0;float CyB = 130;AxD;CAx;Ang, dAng;Bx, By, Cx, Cy, Dx, Dy, Ex, Ey;float
Scl = 1;int Clockwise = -1;bool PrmClose;bExit, bStop;lPause;MyForm()
{();(false);
}
void MyForm_Resize(object sender,
EventArgs e)
{(PB.Width > 0 &&
PB.Height > 0)
{(PB.Image != null)
PB.Image.Dispose();.Image = new Bitmap(PB.Width, PB.Height);();
}
}Hinge(Graphics Gr, float x,float
y,string ch)
{.FillEllipse(Brushes.Gray, x - 5, y
- 5, 10, 10);.DrawEllipse(Pens.Black, x - 5, y - 5, 10, 10);.DrawString(ch, new
Font("Bodoni MT", 10, FontStyle.Bold), Brushes.Black, x + 5, y - 20);
}Pillar(Graphics Gr,float x, float
y,string ch)
{[] Tr = { new PointF(0, 0), new
PointF(10, 20), new PointF(-10, 20 ) };(int i = 0; i < 3; i++)
{[i].X += x;[i].Y += y;
}.DrawPolygon(Pens.Black, Tr);(Gr,
x, y,ch);Pnt1=PointF.Add(Tr[2], new SizeF(-7, 0));Pnt2=PointF.Add(Tr[1], new
SizeF( 7, 0));.FillRectangle(new HatchBrush(HatchStyle.BackwardDiagonal,
Color.Black, Color.White),
new RectangleF(Pnt1, new
SizeF(Pnt2.X - Pnt1.X, 10)));.DrawLine(Pens.Black, Pnt1, Pnt2);
}NewSizes(bool bNewPrm)
{
{= (CD - 130) / 2;= CD - AxD
;(!bStop && !bNewPrm) Ang = Math.Acos(CyA / AB) + Math.PI / 2;= 50* Scl
; // CxAC = (float)Math.Sqrt((Ax - Cx) * (Ax - Cx) + CyA * Scl * CyA * Scl);(Cx
>= 30)
{
Cy = Ay - CyA * Scl ;
Ex = 670 * Scl ;
DgUD_ValueChanged(DgUD, new
EventArgs());
}Ax += 31 - Cx;(Cy < 130) Ay +=
131 - Cy;a = Math.Asin(AB * Scl / AC);-= Math.Asin(CyA * Scl / AC);= Ay - CyA *
Scl - CD * Scl * (float)Math.Sin(a);(Dy < 30) Ay += 31 - Dy;
} while (Cx < 30 || Cy < 130
|| Dy < 30);
}Plunger(Graphics Gr, float x, float
y, double a,string ch)
{HalfW = 15;HalfH = 8;an =
Math.Atan(HalfH / HalfW);HalfD = HalfW / (float)Math.Cos(an);[] Rc = new
PointF[4];[0] = new PointF(x + HalfD * (float)Math.Cos(a + an), y - HalfD *
(float)Math.Sin(a + an));[1] = new PointF(x + HalfD * (float)Math.Cos(a - an),
y - HalfD * (float)Math.Sin(a - an));aa = a + Math.PI + an;[2] = new PointF(x +
HalfD * (float)Math.Cos(aa), y - HalfD * (float)Math.Sin(aa));= a + Math.PI -
an;[3] = new PointF(x + HalfD * (float)Math.Cos(aa), y - HalfD *
(float)Math.Sin(aa));.FillPolygon(Brushes.White, Rc);.DrawPolygon(Pens.Black,
Rc);(Gr, x, y, ch);
}Base(Graphics Gr)
{.FillRectangle(new
HatchBrush(HatchStyle.BackwardDiagonal, Color.Black, Color.White),- 20, Ay, 10,
DE * 2 * Scl);.DrawLine(Pens.Black, Ex - 10, Ay, Ex - 10, Ay + DE * 2 * Scl);
}Way()
{(Graphics Gr =
Graphics.FromImage(PB.Image))
{.Drawing.Drawing2D.GraphicsPath
path = new System.Drawing.Drawing2D.GraphicsPath();
}
}Picture()
{(Graphics Gr =
Graphics.FromImage(PB.Image))
{.SmoothingMode =
SmoothingMode.HighQuality;.Clear(Color.White);Fn = new Font("Bodoni
MT", 10, FontStyle.Bold);.DrawString("AB = " + AB.ToString() +
" mm", Fn, Brushes.Black, 0, 0);.DrawString("CD = " +
CD.ToString() + " mm", Fn, Brushes.Black, 0, 20);.DrawString("DE
= " + DE.ToString() + " mm", Fn, Brushes.Black, 0,
40);.DrawString("CyA = " + CyA.ToString() + " mm", Fn,
Brushes.Black, 0, 60);.DrawString("Масштаб
= " + Scl.ToString() + " pix/mm", Fn, Brushes.Black, 0, 80);(Gr,
Ax, Ay, "A");(Gr);= Ax + AB * Scl * (float)Math.Cos(Ang);= Ay - AB *
Scl * (float)Math.Sin(Ang);.DrawLine(Pens.Black, Bx, By, Ax, Ay);a =
Math.Atan2(Cy - By, Bx - Cx);= Cx + CD * (float)Math.Cos(a) * Scl ;= Cy - CD *
(float)Math.Sin(a) * Scl;.DrawLine(Pens.Black, Dx, Dy, Cx, Cy);(Gr, Ax, Ay,
"A");(Gr, Cx, Cy, "C");(Gr, Bx, By, a, "B");=
Math.Asin((Dx - Ex) / DE / Scl);= Dy + DE * (float)Math.Cos(a) *
Scl;.DrawLine(Pens.Black, Dx, Dy, Ex, Ey);(Gr, Dx, Dy, "D");(Gr, Ex,
Ey, Math.PI / 2, "E");.Refresh();
}
}void pysk_Click(object sender,
EventArgs e)
{(true);Pi2 = Math.PI * 2;= false;=
false;lOldTicks;.Focus();
{= DateTime.Now.Ticks;();();(!bStop)
{
Ang += dAng;
if (Ang >= Pi2) Ang -= Pi2;
else if (Ang <= -Pi2) Ang += Pi2;
}
{
Application.DoEvents();
} while (DateTime.Now.Ticks -
lOldTicks < lPause);
} while (!bExit);
}void DgUD_ValueChanged(object
sender, EventArgs e)
{= 625000; //1/16=
(double)DgUD.Value / 180 * Math.PI * Clockwise / (10000000 / lPause);.Focus();
}void MyForm_FormClosing(object
sender, FormClosingEventArgs e)
{= true;
}void btStop_Click(object sender,
EventArgs e)
{= true;
}void btPrm_Click(object sender,
EventArgs e)
{Prm = new
Options(this);.ShowDialog();(true);();
}void btSave_Click(object sender,
EventArgs e)
{
}fRead(StreamReader SR, out float
fres)
{str =
SR.ReadLine().Replace(".", ",");[] arr =
str.Split('=');float.TryParse(arr[1], out fres);
}iRead(StreamReader SR, out int
ires)
{str = SR.ReadLine();[] arr =
str.Split('=');int.TryParse(arr[1], out ires);
}void btLoad_Click(object sender,
EventArgs e)
{
}void btSave_Click_1(object sender,
EventArgs e)
{.InitialDirectory =
Application.StartupPath;(SD.ShowDialog() == DialogResult.OK)
{SW = new
StreamWriter(SD.FileName);(int i = 0; i < 8; i++)
{
switch (i)
{
case 0: SW.WriteLine("AB="
+ AB.ToString()); break;
case 2: SW.WriteLine("DE="
+ DE.ToString()); break;
case 3:
SW.WriteLine("CyA=" + CyA.ToString()); break;
case 4: SW.WriteLine("Масштаб="
+ Scl.ToString()); break;
case 5: SW.WriteLine("Угол="
+ Ang.ToString()); break;
case 6:
SW.WriteLine("Clockwise=" + Clockwise.ToString()); break;
default: SW.WriteLine("w="
+ DgUD.Value.ToString()); break;
}
}.Close();
}
}void btLoad_Click_1(object sender,
EventArgs e)
{.InitialDirectory =
Application.StartupPath;(OD.ShowDialog() == DialogResult.OK)
{ires;fres;SR = new
StreamReader(OD.FileName);(int i = 0; SR.Peek() >= 0; i++)
{
switch (i)
{
case 0: if (fRead(SR, out fres)) AB
= fres; break;
case 1: if (fRead(SR, out fres)) CD
= fres; break;
case 2: if (fRead(SR, out fres)) DE
= fres; break;
case 3: if (fRead(SR, out fres)) CyA
= fres; break;
case 4: if (fRead(SR, out fres)) Scl
= fres; break;
case 5: if (fRead(SR, out fres)) Ang
= fres; break;
case 6: if (iRead(SR, out ires))
Clockwise = ires; break;
default: if (iRead(SR, out ires))
DgUD.Value = ires; break; ;
}
}.Close();= true;_Click(param, new
EventArgs());= false;
}
}void CBChange_CheckedChanged(object
sender, EventArgs e)
{
}
}
}.cs:System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;Kopylov_Mechanics
{partial class Options : Form
{MF;Scl;bSave;Options(MyForm Owner)
{();= Owner;
}void PrmForm_Shown(object sender,
EventArgs e)
{.Value = (decimal)MF.AB;.Value =
(decimal)MF.CD;.Value = (decimal)MF.DE;.Value = (decimal)MF.CyA;= MF.Scl;.Text
= Scl.ToString();(MF.Clockwise == -1) RB1.Checked = true;RB2.Checked =
true;(MF.PrmClose) ok_Click(ok, new EventArgs());
}void PrmForm_FormClosing(object
sender, FormClosingEventArgs e)
{(bSave)
{.AB = (float)AB.Value;.CD =
(float)CD.Value;.DE = (float)DE.Value;.CyA = (float)CyA.Value;.Scl =
Scl;.Clockwise = RB1.Checked ? -1 : 1;
}
}void mash_TextChanged(object
sender, EventArgs e)
{res;.Text =
Mash.Text.Replace(".", ",");(float.TryParse(Mash.Text, out
res)) Scl = res;Mash.Text = Scl.ToString();
}void ok_Click(object sender,
EventArgs e)
{(AB.Value < CyA.Value)
MessageBox.Show("Звено
AB меньше
расстояния
CyA!");
{AxD = ((float)CD.Value - 150) /
2;CAx = (float)CD.Value - AxD;CA = (float)Math.Sqrt(CAx * CAx +
(float)CyA.Value * (float)CyA.Value);((float)AB.Value > CA)
MessageBox.Show("Звено
AB больше
расстояния
CA !");
{
float AD = (float)CD.Value - CA;
if (AD < (float)AB.Value)
MessageBox.Show("Расстояние
AD может
быть
меньше
звена
AB !");
else
{
float CE = (float)CD.Value -
MF.DxEx;
float cos = CE / (float)(CD.Value -
DE.Value);
if (cos < 1) MessageBox.Show("Звена DE
может быть не достаточно для достижения опорной поверхности !");
else bSave = true;
}
}
}(bSave) Close();
}void cancel_Click(object sender,
EventArgs e)
{();
}
}
}