/// <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); } }
/// <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); } }
/// <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); } }
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; } }
/// <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); } }