Материал: Разработка и реализация программного модуля для трехмерной и двухмерной визуализации геометрических сборок для ПК BRAND

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

&GEOZ NZ1=37, NPINZN=3, IPOV=+1,-13,+35, MAT=1 /

* Steel 10-mm tube v waxte

* 3 kontejnera v waxte ( number 13, 12 and 11 )

&GEOZ NZ1=38, NPINZN=4, IPOV=-1,-9,-10,+36, MAT=1 /

&GEOZ NZ1=39, NPINZN=3, IPOV=+1,-10,-37, MAT=1 /

&GEOZ NZ1=40, NPINZN=4, IPOV=+1,-9,-31,+37, MAT=3 /

&GEOZ NZ1=41, NPINZN=3, IPOV=+31,+37,-38, MAT=3 /

&GEOZ NZ1=42, NPINZN=3, IPOV=+31,+39,-40, MAT=3 /

&GEOZ NZ1=43, NPINZN=3, IPOV=+31,+41,-42, MAT=3 /

&GEOZ NZ1=44, NPINZN=3, IPOV=+31,+43,-44, MAT=3 /

&GEOZ NZ1=45, NPINZN=3, IPOV=+31,+44,-9, MAT=5 /

* 9 sfer v 13-th kontejnere ( Xbot = -390. )

&GEOZ NZ1=46, NPINZN=12, IPOV=+31,+38,-39,-45,-46,-47,-48,-49,-50,-51,-52,-53, MAT=1 /

&GEOZ NZ1=47, NPINZN=1, IPOV=+45, MAT=4 /

&GEOZ NZ1=48, NPINZN=1, IPOV=+46, MAT=4 /

&GEOZ NZ1=49, NPINZN=1, IPOV=+47, MAT=4 /

&GEOZ NZ1=50, NPINZN=1, IPOV=+48, MAT=4 /

&GEOZ NZ1=51, NPINZN=1, IPOV=+49, MAT=4 /

&GEOZ NZ1=52, NPINZN=1, IPOV=+50, MAT=4 /

&GEOZ NZ1=53, NPINZN=1, IPOV=+51, MAT=4 /

&GEOZ NZ1=54, NPINZN=1, IPOV=+52, MAT=4 /

&GEOZ NZ1=55, NPINZN=1, IPOV=+53, MAT=4 /

* 9 sfer v 12-th kontejnere ( Xbot = -467.5 )

&GEOZ NZ1=56, NPINZN=12, IPOV=+31,+40,-41,-54,-55,-56,-57,-58,-59,-60,-61,-62, MAT=1 /

&GEOZ NZ1=57, NPINZN=1, IPOV=+54, MAT=4 /

&GEOZ NZ1=58, NPINZN=1, IPOV=+55, MAT=4 /

&GEOZ NZ1=59, NPINZN=1, IPOV=+56, MAT=4 /

&GEOZ NZ1=60, NPINZN=1, IPOV=+57, MAT=4 /

&GEOZ NZ1=61, NPINZN=1, IPOV=+58, MAT=4 /

&GEOZ NZ1=62, NPINZN=1, IPOV=+59, MAT=4 /

&GEOZ NZ1=63, NPINZN=1, IPOV=+60, MAT=4 /

&GEOZ NZ1=64, NPINZN=1, IPOV=+61, MAT=4 /

&GEOZ NZ1=65, NPINZN=1, IPOV=+62, MAT=4 /

* 9 sfer v 11-th kontejnere ( Xbot = -545. )

&GEOZ NZ1=66, NPINZN=12, IPOV=+31,+42,-43,-63,-64,-65,-66,-67,-68,-69,-70,-71, MAT=1 /

&GEOZ NZ1=67, NPINZN=1, IPOV=+63, MAT=4 /

&GEOZ NZ1=68, NPINZN=1, IPOV=+64, MAT=4 /

&GEOZ NZ1=69, NPINZN=1, IPOV=+65, MAT=4 /

&GEOZ NZ1=70, NPINZN=1, IPOV=+66, MAT=4 /

&GEOZ NZ1=71, NPINZN=1, IPOV=+67, MAT=4 /

&GEOZ NZ1=72, NPINZN=1, IPOV=+68, MAT=4 /

&GEOZ NZ1=73, NPINZN=1, IPOV=+69, MAT=4 /

&GEOZ NZ1=74, NPINZN=1, IPOV=+70, MAT=4 /

&GEOZ NZ1=75, NPINZN=1, IPOV=+71, MAT=4 /

&DETG NDETG=1,TIPDET='LOK' /

&DGLOK NDD=4,=27,=0.01,0.05,.1,.15,.2,.25,.3,.35,.4,.45,

.5,.55,.6,.65,.7,.75,.8,.85,.9,.95,

.,1.05,1.1,1.15,1.2,1.25,1.3,1.35,73*,=27*1.,73*,=400.,300.,200.,100.,46*,=2*124.6,2*157.1,46*=4*0.,46*,=4*0.,46*

/

&CONG CnstGamName='cnst_gam.b6',=18,NZONE=5,MPECH=0,=' 01h',' 06c',' 07n',' 08o',' 18ar0',' 11na0',' 12mg0',' 13al0',

' 14si0',' 17cl0',' 19k0',' 20ca0',' 24cr0',' 25mn0',' 26fe0',

' 28ni0',' 29cu0',' 82pb0',17*,

RO=0.,0.00692470,3*0.,

.00000001,0.00025054,0.00079230,0.00005289,0.00001457,

.00003913,4*0.,

.00001051,0.04322342,3*0.,

.00000026,4*0.,

.,0.00060922,3*0.,

.,0.00030912,3*0.,

.,0.00194868,3*0.,

.,0.01311095,0.00045742,0.00022620,0.00006231,

.,0.00012528,3*0.,

.,0.00040161,3*0.,

.,0.00364656,3*0.,

.,0.,0.00022878,0.00274913,0.00075725,

.,0.00000695,0.00043305,0.00028910,0.00007963,

.,0.00014853,0.08364946,0.00978606,0.00269556,

.,0.,0.00024314,0.00135264,0.00037258,

.,0.,0.00022463,0.00003749,0.00001033,

0.,0.00001289,3*0.,

2.         Обеспечение диалогового режима для открытия файла с необходимой геометрией

private void openToolStripMenuItem1_Click(object sender, EventArgs e)

{

{

// открываем диалоговое окно для выбора открывающегося файла

if (this.openFileDialog1.ShowDialog() == DialogResult.OK)

{

// запоминаем имя файла= openFileDialog1.FileName;[] str = new char[1024];

// если файл существует(FileName == null)= "zzz.nam";

// копируем его в строковую переменную

FileName.CopyTo(0, str, 0, FileName.Length);

// загружаем бъект.isgeom(str, ref NZON, NZN);

// открываем формуChild = new Draw();.MdiParent = this;.Show();

}

}(Exception ex)

{.Show("Невозможно открыть файл " + openFileDialog1.FileName + "\n" + ex.Message);

}

3.         Реализация первой прорисовки в плоскости YOZ в 2D режиме.

void PrepareArray(double X1, double Y1, Rectangle rect, ref double max, int cluster)

{

/* double start_posX = X+dx*rect.Width;start_posY = Y+dy*rect.Height;*/

double ZZ = -2000;

double UU = 0.0;VV = 0.0;WW = 0.0;height = rect.Height / cluster;width = rect.Width / cluster;= new double[(height+1)*(width+1)];= new int[(height+1)*(width+1)];= new Point_description[(height + 1) * (width + 1)];(int i = 0, i1=0; i < rect.Width; i+=cluster, i1++)

{XX = X1 + dx * i;(int j = 0, j1=0; j < rect.Height; j+=cluster, j1++)

{YY = Y1 + dy * j;(NumPln)

{0:

{= 1;.vlet(ref ZZ, ref XX, ref YY, ref UU, ref VV, ref WW, ref ISTOP, ref KGEOM, ref AT);(ISTOP != 1)

{[i1 * height + j1] = AT;[i1 * height + j1] = KGEOM;[i1 * height + j1].AT = AT;[i1 * height + j1].KGeom = KGEOM;.geom(ref KGEOM, ref ZZ, ref XX, ref YY, ref UU, ref VV, ref WW, ref KMAX, MS, AMR);[i1 * height + j1].Zones = new int[KMAX];[i1 * height + j1].Distances = new double[KMAX];(int ii = 0; ii < KMAX; ii++)

{[i1 * height + j1].Distances[ii] = AMR[ii];[i1 * height + j1].Zones[ii] = MS[ii];

}

}

{[i1 * height + j1] = -1;[i1 * height + j1].KGeom = -1;

}= -2000.0;;

}1:

{= 1.0;.vlet(ref XX, ref ZZ, ref YY, ref UU, ref VV, ref WW, ref ISTOP, ref KGEOM, ref AT);(ISTOP != 1)

{[i1 * height + j1] = AT;[i1 * height + j1] = KGEOM;[i1 * height + j1].AT = AT;[i1 * height + j1].KGeom = KGEOM;.geom(ref KGEOM, ref XX, ref ZZ, ref YY, ref UU, ref VV, ref WW, ref KMAX, MS, AMR);[i1 * height + j1].Zones = new int[KMAX];[i1 * height + j1].Distances = new double[KMAX];(int ii = 0; ii < KMAX; ii++)

{[i1 * height + j1].Distances[ii] = AMR[ii];[i1 * height + j1].Zones[ii] = MS[ii];

}

}

{[i1 * height + j1] = -1;[i1 * height + j1].KGeom = -1;

}= -2000;;

}2:

{= 1.0;.vlet(ref XX, ref YY, ref ZZ, ref UU, ref VV, ref WW, ref ISTOP, ref KGEOM, ref AT);(ISTOP != 1)

{[i1 * height + j1] = AT;[i1 * height + j1] = KGEOM;[i1 * height + j1].AT = AT;[i1 * height + j1].KGeom = KGEOM;.geom(ref KGEOM, ref XX, ref YY, ref ZZ, ref UU, ref VV, ref WW, ref KMAX, MS, AMR);[i1 * height + j1].Zones = new int[KMAX];[i1 * height + j1].Distances = new double[KMAX];(int ii = 0; ii < KMAX; ii++)

{[i1 * height + j1].Distances[ii] = AMR[ii];[i1 * height + j1].Zones[ii] = MS[ii];

}

{[i1 * height + j1] = -1;[i1 * height + j1].KGeom = -1;

}= -2000;;

}

}

}

}(ScreenArray,ref max);(mas, ref max);(mas,ref shownZones);

}

4.         Реализация приближения/удаления фигуры по оси OZ при помощи клавиш «W» & «S» для 3D режима.

protected override bool ProcessDialogKey(Keys keyData)

{(keyData)

{Keys.Down:-;;Keys.Up:++;;

}.Invalidate();.Update();base.ProcessDialogKey(keyData);

}

5.         Реализация функций увеличения/уменьшения фигуры для 2D режима.

private void toolStripButton8_Click(object sender, EventArgs e)

{

//увеличениеChild = (Draw)this.ActiveMdiChild;R = Child.drawSurf1.R /= 2;.drawSurf1.ifNewLoaded = false;(Child.drawSurf1.NumPln)

{0:

{.drawSurf1.Y += R /2;.drawSurf1.Z += R /2;;

}1:

{.drawSurf1.X += R / 2;.drawSurf1.Z += R / 2;;

}2:

{.drawSurf1.X += R / 2;.drawSurf1.Y += R / 2;;

}

}.drawSurf1.Invalidate();

}void toolStripButton9_Click(object sender, EventArgs e)

{

//уменьшениеChild = (Draw)this.ActiveMdiChild;.drawSurf1.ifNewLoaded = false;R = Child.drawSurf1.R *= 2;(Child.drawSurf1.NumPln)

{0:

{.drawSurf1.Y -= R / 4;.drawSurf1.Z -= R / 4;;

}1:

{.drawSurf1.X -= R / 4;.drawSurf1.Z -= R / 4;;

}2:

{.drawSurf1.X -= R / 4;.drawSurf1.Y -= R / 4;;

}

}.drawSurf1.Invalidate();

}

6.         Реализация поворота объекта по/против часовой стрелки при помощи колесика мышки.

public void Ant_MouseWheel(object sender, MouseEventArgs e)

{(e.Delta > 0)

{++;.Invalidate();

}if (e.Delta < 0)

{-;.Invalidate();

}

}

7.         Реализация динамического управления фигурой с помощью различных клавиш

protected override bool ProcessDialogKey(Keys keyData)

{(keyData)

{

// case Keys.Down:Keys.W:-= 20;;Keys.S:+= 20;;Keys.A:-= 20;;Keys.D:+= 20;;Keys.X:-= 20;;Keys.C:+= 20;;Keys.I:= 2;+=Xangle;;Keys.K:= 2;=Xangle;;Keys.J:= 2;+=Xangle;;Keys.L:= 2;=Xangle;;

}.Invalidate();.Update();base.ProcessDialogKey(keyData);

}

8.         Функция отрисовки трехмерного объекта.

public void Ant_Paint(object sender, PaintEventArgs e)

{(isdraw)

{.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);.glLoadIdentity();= true;

//освещение-------------------------------------------

// Gl.glClearColor(0.2f, 0.2f, 0.2f, 0.9f);[] ambient = new float [4] {0.5f, 0.5f, 1.0f, 1.0f};//очищаем экран в цвет, установленый параметрами r,g,b,a

Gl.glEnable(Gl.GL_LIGHTING); //тут мы включаем расчет освещения.glLightModelf(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_TRUE);//делаем так, чтобы освещались обе стороны полигона

Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, ambient);//интенсивность всей сцены

Gl.glEnable(Gl.GL_NORMALIZE);//делам нормали одинаковой величины во избежание артефактов[] light0_position = { 1.0f, 7.0f, 1.0f, 1.0f };//Положение источника света (x,y,z,w)4-й параметр указывает, будет ли использоваться бесконечно удаленный свет или точечный. Если значение w = 0, то источник света бесконечно удаленный (что-то вроде солнца). Если w = 1, то этот источник света точечный (что то вроде лампочки).

Gl.glEnable(Gl.GL_LIGHT0);.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light0_position);.glTranslated(x, y, z);//передвигаем

Gl.glRotated(angle, 0, 2, 0);//поворачиваем по углу

Gl.glColor3ub(39, 170, 220);(mwheel)

{luch = new Luch(new Point3D(0,-500,-8), new Point3D(0,1,0));at = 0.9;kgeom = 0;istop=0 ;kmax = 0;dx = 1; double dz = 1;.Vlet(ref luch, ref istop, ref kgeom, ref at);

//Список цветов для материалов объектов

Color[] Col=new Color[10];[0] = new Color(0, 0, 128);[1] = new Color(0, 255, 0);[2] = new Color(255, 255, 0);[3] = new Color(205, 133, 63);[4] = new Color(255, 69, 0);[5] = new Color(199, 21, 133);[6] = new Color(148, 0, 211);[7] = new Color(0, 191, 255);[8] = new Color(84, 255, 159);[9] = new Color(255, 193, 37);(istop != 1)

{<Rectangle> list = new List<Rectangle>();//список парал-дов.Geom(ref kgeom, ref luch, ref kmax, MS, AMR);.Zones = new int[kmax];.Distances = new double[kmax];(int j = 0; j < kmax; j++)

{.Distances[j] = AMR[j];.Zones[j] = MS[j];.Add(new Rectangle(new Point3D(luch.position.x, (luch.position.y + at) / 50, luch.position.z),Point3D(luch.position.x + dx, (luch.position.y + at + AMR[j]) / 50, luch.position.z + dz), Col[MS[j]%10]));//ne popadaet+= AMR[j];

}(int i = 0; i < list.Count; ++i)

{[i].DrawRec();

}

}

}.glPopMatrix();.glFlush();

}

}