Beispiel #1
0
 /// <summary>
 /// Выбор детализации модели по текущим координатам и размерам модели.
 /// </summary>
 /// <param name="detailedModelIndex">Получаемый индекс выбираемой модели</param>
 /// <param name="K">Коэффициент перспективы (масштабный коэффициент)</param>
 /// <returns></returns>
 public int SelectDetalizationIndex(ref int detailedModelIndex, float K)
 {
     try
     {
         if (Engine3D.ValuePresentationConversion(PositionPoint.Z, SourceSize, ref presentationSize, K) != 0)
         {
             throw new Exception(ErrorLog.GetLastError());
         }
         detailedModelIndex = 0;
         for (int i = 1; i < modelDetalizationCollection.Length; i++)
         {
             if (presentationSize < modelDetalizationCollection[i].MinSize)
             {
                 detailedModelIndex = i - 1;
                 return(0);
             }
         }
         detailedModelIndex = modelDetalizationCollection.Length - 1;
         return(0);
     }
     catch (Exception er)
     {
         ErrorLog.AddErrorMessage("ModelDetalizationSelector", "SelectDetalizationIndex", er.Message, -1);
         return(-1);
     }
 }
Beispiel #2
0
 /// <summary>
 /// Вращение расчетного центра модели вокруг осей
 /// </summary>
 /// <param name="angle">Угол вращения</param>
 /// <param name="axis">Ось вращения</param>
 /// <returns></returns>
 public int Rotate(float angle, Axis3D axis)
 {
     try
     {
         return(Engine3D.RotatePoint3D(angle, axis, PositionPoint));
     }
     catch (Exception er)
     {
         Graph3DLibrary.ErrorLog.AddErrorMessage("ModelDetalizationSelector", "Rotate", er.Message, -1);
         return(-1);
     }
 }
Beispiel #3
0
 /// <summary>
 /// Перемещение расчетного центра модели в указанную точку
 /// </summary>
 /// <param name="X">X-координата</param>
 /// <param name="Y">Y-координата</param>
 /// <param name="Z">Z-координата</param>
 public int MoveTo(float X, float Y, float Z)
 {
     try
     {
         X -= PositionPoint.X;
         Y -= PositionPoint.Y;
         Z -= PositionPoint.Z;
         return(Engine3D.MovePoint3D(X, Y, Z, PositionPoint));
     }
     catch (Exception er)
     {
         ErrorLog.AddErrorMessage("ModelDetalizationSelector", "MoveTo", er.Message, -1);
         return(-1);
     }
 }
Beispiel #4
0
        private void btnOK_Click(object sender, EventArgs e)
        {
            try
            {
                int side = ColorSide == PolygonSides.FrontSide?0:1;

                switch (tabSelector.SelectedIndex)
                {
                case 0:
                    #region Сферический градиент
                {
                    float   dist   = 0;
                    float   sphR   = (float)(this.NudR.Value);
                    float   sphInR = (float)(this.NudRin.Value);
                    float   delta  = 0;
                    Point3D sphC   = new Point3D((float)this.NudX.Value, (float)this.NudY.Value, (float)this.NudZ.Value);
                    if ((sphR < 1) | (sphInR < 0) | (sphInR >= sphR))
                    {
                        break;
                    }
                    for (int i = 0; i < PaintModel.Polygon.Length; i++)
                    {
                        dist = Engine3D.GetDistance(sphC, PaintModel.Polygon[i].Center);

                        if (dist > sphR)
                        {
                            if (!checkOutColor.Checked)
                            {
                                continue;
                            }
                            delta = 1;
                        }
                        else if (dist < sphInR)
                        {
                            if (!checkInColor.Checked)
                            {
                                continue;
                            }
                            delta = 0;
                        }
                        else
                        {
                            delta = (dist - sphInR) / (sphR - sphInR);
                        }

                        if (PaintModel.SetColor(Color.FromArgb((int)Math.Round(PaintModel.Polygon[i].color[side].A * (1 - (float)this.trackTotalOpacity.Value / 100) + ((float)this.trackTotalOpacity.Value / 100) * 2.55 * (this.trackOpacityIn.Value + (this.trackOpacityOut.Value - this.trackOpacityIn.Value) * delta)),
                                                               (int)Math.Round(PaintModel.Polygon[i].color[side].R * (1 - (float)this.trackTotalOpacity.Value / 100) + ((float)this.trackTotalOpacity.Value / 100) * (this.panelColorIn.BackColor.R + (this.panelColorOut.BackColor.R - this.panelColorIn.BackColor.R) * delta)),
                                                               (int)Math.Round(PaintModel.Polygon[i].color[side].G * (1 - (float)this.trackTotalOpacity.Value / 100) + ((float)this.trackTotalOpacity.Value / 100) * (this.panelColorIn.BackColor.G + (this.panelColorOut.BackColor.G - this.panelColorIn.BackColor.G) * delta)),
                                                               (int)Math.Round(PaintModel.Polygon[i].color[side].B * (1 - (float)this.trackTotalOpacity.Value / 100) + ((float)this.trackTotalOpacity.Value / 100) * (this.panelColorIn.BackColor.B + (this.panelColorOut.BackColor.B - this.panelColorIn.BackColor.B) * delta))), i, i, ColorSide) != 0)
                        {
                            throw new Exception(ErrorLog.GetLastError());
                        }
                    }
                }
                    #endregion
                    break;

                case 1:
                    #region Уровневый градиент
                {
                    float dist    = 0;
                    float bottomY = (float)nudLevelBottom.Value;
                    float topY    = (float)nudLevelTop.Value;
                    float delta   = 0;
                    float dY      = topY - bottomY;
                    if (dY <= 0)
                    {
                        break;
                    }
                    for (int i = 0; i < PaintModel.Polygon.Length; i++)
                    {
                        dist = PaintModel.Polygon[i].Center.Y - bottomY;

                        if (dist > dY)
                        {
                            if (!checkLevelTop.Checked)
                            {
                                continue;
                            }
                            delta = 1;
                        }
                        else if (dist < 0)
                        {
                            if (!checkLevelBottom.Checked)
                            {
                                continue;
                            }
                            delta = 0;
                        }
                        else
                        {
                            delta = dist / dY;
                        }

                        if (PaintModel.SetColor(Color.FromArgb((int)Math.Round(PaintModel.Polygon[i].color[side].A * (1 - (float)this.trackLevelTotal.Value / 100) + ((float)this.trackLevelTotal.Value / 100) * 2.55 * (this.trackLevelBottom.Value + (this.trackLevelTop.Value - this.trackLevelBottom.Value) * delta)),
                                                               (int)Math.Round(PaintModel.Polygon[i].color[side].R * (1 - (float)this.trackLevelTotal.Value / 100) + ((float)this.trackLevelTotal.Value / 100) * (this.panelLevelBottom.BackColor.R + (this.panelLevelTop.BackColor.R - this.panelLevelBottom.BackColor.R) * delta)),
                                                               (int)Math.Round(PaintModel.Polygon[i].color[side].G * (1 - (float)this.trackLevelTotal.Value / 100) + ((float)this.trackLevelTotal.Value / 100) * (this.panelLevelBottom.BackColor.G + (this.panelLevelTop.BackColor.G - this.panelLevelBottom.BackColor.G) * delta)),
                                                               (int)Math.Round(PaintModel.Polygon[i].color[side].B * (1 - (float)this.trackLevelTotal.Value / 100) + ((float)this.trackLevelTotal.Value / 100) * (this.panelLevelBottom.BackColor.B + (this.panelLevelTop.BackColor.B - this.panelLevelBottom.BackColor.B) * delta))), i, i, ColorSide) != 0)
                        {
                            throw new Exception(ErrorLog.GetLastError());
                        }
                    }
                }
                    #endregion
                    break;

                case 2:
                    #region Смещение цвета
                {
                    Color tmpColor = new Color();
                    for (int i = 0; i < PaintModel.Polygon.Length; i++)
                    {
                        tmpColor = Color.FromArgb(PaintModel.Polygon[i].color[side].ToArgb());
                        PaintModel.Polygon[i].color[side] = Color.FromArgb(tmpColor.A,
                                                                           Math.Min(255, (int)Math.Round((tmpColor.R * nudRR.Value + tmpColor.G * nudRG.Value + tmpColor.B * nudRB.Value) / 100)),
                                                                           Math.Min(255, (int)Math.Round((tmpColor.R * nudGR.Value + tmpColor.G * nudGG.Value + tmpColor.B * nudGB.Value) / 100)),
                                                                           Math.Min(255, (int)Math.Round((tmpColor.R * nudBR.Value + tmpColor.G * nudBG.Value + tmpColor.B * nudBB.Value) / 100)));
                    }
                }
                    #endregion
                    break;
                }
                dlgResult = DialogResult.OK;
                this.Close();
            }
            catch (Exception er)
            {
                MessageBox.Show("btnOK_Click\nОшибка: " + er.Message);
                dlgResult = DialogResult.Abort;
            }
        }
Beispiel #5
0
        /// <summary>
        /// Отрисовка модели
        /// </summary>
        /// <param name="drawSurface"></param>
        /// <param name="drawingSide"></param>
        /// <returns></returns>
        public int ShowModel(IDrawingSurface surface, PolygonSides drawingSide = PolygonSides.AllSides)
        {
            try
            {
                if (collection.Length == 1)
                {
                    if (collection[0] != null)
                    {
                        if (collection[0].ShowModel(surface, drawingSide) != 0)
                        {
                            throw new Exception(ErrorLog.GetLastError());
                        }
                    }
                }
                else
                {
                    if (drawingSide == PolygonSides.Auto)
                    {
                        if (ShowModel(surface, PolygonSides.RearSide) != 0)
                        {
                            throw new Exception(Graph3DLibrary.ErrorLog.GetLastError());
                        }
                        if (ShowModel(surface, PolygonSides.FrontSide) != 0)
                        {
                            throw new Exception(Graph3DLibrary.ErrorLog.GetLastError());
                        }
                    }
                    else
                    {
                        int PolygonPartSize = ActivePolygonCount / surface.BufferCount;
                        Parallel.For(0, surface.BufferCount, (int partIndex) =>
                        {
                            int sideIdx;
                            Pen pen          = new Pen(Color.White);
                            SolidBrush brush = new SolidBrush(Color.White);

                            PointF[] poly = new PointF[3] {
                                new PointF(), new PointF(), new PointF()
                            };

                            for (int i = partIndex * PolygonPartSize; (i < ActivePolygonCount) && (i < (partIndex + 1) * PolygonPartSize); i++)
                            {
                                if (collection[ActivePolygon[i].ModelIndex] != null)
                                {
                                    sideIdx = (collection[ActivePolygon[i].ModelIndex].Polygon[ActivePolygon[i].PolygonIndex].NormalZ <= 0) ? 0 : 1;

                                    if (drawingSide != PolygonSides.AllSides)
                                    {
                                        if ((drawingSide == PolygonSides.FrontSide) & (sideIdx == 1))
                                        {
                                            continue;
                                        }
                                        if ((drawingSide == PolygonSides.RearSide) & (sideIdx == 0))
                                        {
                                            continue;
                                        }
                                    }

                                    if (Engine3D.BuiltStaticPolygon(ref collection[ActivePolygon[i].ModelIndex].ScreenVertex3D, ref collection[ActivePolygon[i].ModelIndex].Polygon[ActivePolygon[i].PolygonIndex], ref poly) != 0)
                                    {
                                        throw new Exception(Graph3DLibrary.ErrorLog.GetLastError());
                                    }

                                    switch (collection[ActivePolygon[i].ModelIndex].Polygon[ActivePolygon[i].PolygonIndex].FillType)
                                    {
                                    case PolygonFillType.Solid:
                                        brush.Color = collection[ActivePolygon[i].ModelIndex].Polygon[ActivePolygon[i].PolygonIndex].LightingColor[sideIdx];
                                        surface.FillPolygon(brush, poly, partIndex);
                                        break;

                                    case PolygonFillType.Wide:
                                        pen.Color = collection[ActivePolygon[i].ModelIndex].Polygon[ActivePolygon[i].PolygonIndex].LightingColor[sideIdx];
                                        surface.DrawPolygon(pen, poly, partIndex);
                                        break;
                                    }
                                }
                            }
                            pen.Dispose();
                        });
                    }
                }
                return(0);
            }
            catch (Exception er)
            {
                Graph3DLibrary.ErrorLog.AddErrorMessage("ModelCollectionController", "ShowModel", er.Message, -1);
                return(-1);
            }
        }