Esempio n. 1
0
        internal static void Calculate(STLModel3D model, DAL.Materials.Material selectedMaterial, Vector3Class modelTranslation,
                                       float maxBuildSizeX, float maxBuildSizeY,
                                       float sideABHeight, float sideBDHeight, float sideBCAngleOffset, float sideABAngleOffset,
                                       double sideABAngle, double sideBCAngle,
                                       float sideB,
                                       float calibrationModelSizeX, float calibrationModelSizeY)
        {
            model.UpdateBoundries();
            var moveYFactor = -(maxBuildSizeY / 2);

            for (var arrayIndex = 0; arrayIndex < model.Triangles.Count; arrayIndex++)
            {
                for (var triangleIndex = 0; triangleIndex < model.Triangles[arrayIndex].Count; triangleIndex++)
                {
                    model.Triangles[arrayIndex][triangleIndex].Vectors[0].Position += new Vector3Class(0, moveYFactor, 0);
                    model.Triangles[arrayIndex][triangleIndex].Vectors[1].Position += new Vector3Class(0, moveYFactor, 0);
                    model.Triangles[arrayIndex][triangleIndex].Vectors[2].Position += new Vector3Class(0, moveYFactor, 0);
                }
            }

            model.UpdateBoundries();

            float sideDHeightDifference = (float)(sideABHeight - sideBDHeight);

            if (sideDHeightDifference < 0)
            {
                sideDHeightDifference = -sideDHeightDifference;
            }
            //change model vectors

            if (float.IsNaN(sideABAngleOffset))
            {
                sideABAngleOffset = 0;
            }
            if (float.IsNaN(sideBCAngleOffset))
            {
                sideBCAngleOffset = 0;
            }

            var leftSideMaxCorrection  = new Vector3((sideABAngleOffset), sideDHeightDifference, 0);
            var rightSideMaxCorrection = new Vector3((sideBCAngleOffset), 0, 0);

            if (sideABHeight >= sideBDHeight)                                        //highest point at right side
            {
                leftSideMaxCorrection  = new Vector3(leftSideMaxCorrection.X, 0, 0); //NO Y correction
                rightSideMaxCorrection = new Vector3(rightSideMaxCorrection.X, sideDHeightDifference, 0);
            }

            for (var arrayIndex = 0; arrayIndex < model.Triangles.Count; arrayIndex++)
            {
                for (var triangleIndex = 0; triangleIndex < model.Triangles[arrayIndex].Count; triangleIndex++)
                {
                    for (var vectorIndex = 0; vectorIndex < 3; vectorIndex++)
                    {
                        var correctionVector = new Vector3Class();

                        var orgPoint = model.Triangles[arrayIndex][triangleIndex].Vectors[vectorIndex].Position;

                        var vectorOffSetPercentageABY = orgPoint.Y / (float)sideABHeight;
                        var vectorOffSetPercentageBDY = orgPoint.Y / (float)sideBDHeight;

                        var horizontalABOffsetPercentage = ((calibrationModelSizeX / 2) + orgPoint.X) / calibrationModelSizeX;
                        var horizontalBCOffsetPercentage = (1 - (orgPoint.X / (calibrationModelSizeX / 2))) / 2;

                        if (orgPoint.X < 0)
                        {
                            horizontalABOffsetPercentage = 1 - (0.5f / (calibrationModelSizeX / 2)) * ((calibrationModelSizeX / 2) - orgPoint.X);
                            horizontalBCOffsetPercentage = (-orgPoint.X + (calibrationModelSizeX / 2)) / calibrationModelSizeX;
                        }

                        var verticalOffsetPercentage = vectorOffSetPercentageABY * (1 - horizontalABOffsetPercentage);

                        if (sideABHeight < sideBDHeight)
                        {
                            verticalOffsetPercentage = vectorOffSetPercentageBDY * (1 - horizontalBCOffsetPercentage);
                        }

                        if (sideABAngle <= 90)    //angle A forward /
                        {
                            correctionVector = new Vector3Class(-vectorOffSetPercentageABY * rightSideMaxCorrection.X * horizontalABOffsetPercentage, 0, 0);
                        }
                        else if (sideABAngle > 90)    //angle A backward
                        {
                            correctionVector = new Vector3Class(vectorOffSetPercentageABY * leftSideMaxCorrection.X * horizontalABOffsetPercentage, 0, 0);
                        }

                        if (sideBCAngle <= 90)    //angle C forward \
                        {
                            correctionVector += new Vector3Class(-vectorOffSetPercentageBDY * leftSideMaxCorrection.X * horizontalBCOffsetPercentage, 0, 0);
                        }
                        else if (sideBCAngle > 90)    //angle C backward /
                        {
                            correctionVector += new Vector3Class(vectorOffSetPercentageBDY * rightSideMaxCorrection.X * horizontalBCOffsetPercentage, 0, 0);
                        }

                        //Y correction
                        if (sideABHeight < sideBDHeight && sideDHeightDifference != 0)
                        {
                            correctionVector += new Vector3Class(0, verticalOffsetPercentage * sideDHeightDifference, 0);
                        }
                        else if (sideDHeightDifference != 0)
                        {
                            correctionVector += new Vector3Class(0, verticalOffsetPercentage * sideDHeightDifference, 0);
                        }

                        model.Triangles[arrayIndex][triangleIndex].Vectors[vectorIndex].Position += correctionVector;
                    }
                }
            }

            //move model back to normal position
            moveYFactor = (maxBuildSizeY / 2);
            for (var arrayIndex = 0; arrayIndex < model.Triangles.Count; arrayIndex++)
            {
                for (var triangleIndex = 0; triangleIndex < model.Triangles[arrayIndex].Count; triangleIndex++)
                {
                    model.Triangles[arrayIndex][triangleIndex].Vectors[0].Position += new Vector3Class(0, moveYFactor, 0);
                    model.Triangles[arrayIndex][triangleIndex].Vectors[1].Position += new Vector3Class(0, moveYFactor, 0);
                    model.Triangles[arrayIndex][triangleIndex].Vectors[2].Position += new Vector3Class(0, moveYFactor, 0);
                }
            }

            //find highest vector and calc the scaling factor with original factor
            var scaleFactorY = maxBuildSizeY / sideABHeight;

            if (sideBDHeight > sideABHeight)
            {
                scaleFactorY = maxBuildSizeY / sideBDHeight;
            }

            var resolutionScalingFactor = maxBuildSizeX / 192f;

            var modelScaleFactorX = ((maxBuildSizeX / sideB) / BasicCorrectionModel.ModelDefaultCorrectionFactorX) / resolutionScalingFactor * (float)selectedMaterial.ShrinkFactor * model.ScaleFactorX;
            var modelScaleFactorY = ((scaleFactorY / BasicCorrectionModel.ModelDefaultCorrectionFactorY) / resolutionScalingFactor) * (float)selectedMaterial.ShrinkFactor * model.ScaleFactorY;

            model.Scale(modelScaleFactorX, 1, 1, Events.ScaleEventArgs.TypeAxis.X, false);
            model.Scale(1, modelScaleFactorY, 1, Events.ScaleEventArgs.TypeAxis.Y, false);
            model.Scale(1, 1, model.ScaleFactorZ * (float)selectedMaterial.ShrinkFactor, Events.ScaleEventArgs.TypeAxis.Z, false);

            //combine movetranslation with scaled vector
            if (model is SupportCone)
            {
                model.MoveTranslation += modelTranslation;
            }

            model.UpdateBoundries();

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            //update triangle normals
            foreach (var triangleArray in model.Triangles)
            {
                foreach (var triangle in triangleArray)
                {
                    triangle.CalcNormal();
                }
            }

            if (!(model is SupportCone))
            {
                if (model.SupportStructure != null)
                {
                    foreach (var supportCone in model.TotalObjectSupportCones)
                    {
                        Calculate(supportCone, selectedMaterial, new Vector3Class(), maxBuildSizeX, maxBuildSizeY, sideABHeight, sideBDHeight, sideBCAngleOffset, sideABAngleOffset, sideABAngle, sideBCAngle, sideB, calibrationModelSizeX, calibrationModelSizeY);
                    }
                }
            }

            if (model.SupportBasementStructure != null)
            {
                Calculate(model.SupportBasementStructure, selectedMaterial, modelTranslation, maxBuildSizeX, maxBuildSizeY, sideABHeight, sideBDHeight, sideBCAngleOffset, sideABAngleOffset, sideABAngle, sideBCAngle, sideB, calibrationModelSizeX, calibrationModelSizeY);
            }
        }
Esempio n. 2
0
        internal static void Calculate(STLModel3D model, DAL.Materials.Material selectedMaterial, Vector3Class modelTranslation)
        {
            model.UpdateBoundries();

            //properties of right part of trapezoid
            var sideA = PrintJobManager.SelectedPrinter.TrapeziumCorrectionInputA;
            var sideB = PrintJobManager.SelectedPrinter.TrapeziumCorrectionInputB;
            var sideC = PrintJobManager.SelectedPrinter.TrapeziumCorrectionInputC;
            var sideD = PrintJobManager.SelectedPrinter.TrapeziumCorrectionInputD;
            var sideE = PrintJobManager.SelectedPrinter.TrapeziumCorrectionInputE;
            var sideF = PrintJobManager.SelectedPrinter.TrapeziumCorrectionInputF;

            var sideBCAngleOffset = 0f;
            var sideBCAngle       = 90d;

            var maxBuildSizeX = PrintJobManager.SelectedPrinter.MaxBuildSizeX;
            var maxBuildSizeY = PrintJobManager.SelectedPrinter.MaxBuildSizeY;

            var calibrationModelSizeX = BasicCorrectionModel.ModelSizeX;
            var calibrationModelSizeY = BasicCorrectionModel.ModelSizeY;

            var triangleBArea = Math.Sqrt(((sideC + sideB + sideF) / 2)
                                          * (((sideC + sideB + sideF) / 2) - sideC)
                                          * (((sideC + sideB + sideF) / 2) - sideB)
                                          * (((sideC + sideB + sideF) / 2) - sideF));

            var sideBDHeight = ((float)(triangleBArea * 2) / sideB);

            if (sideA != calibrationModelSizeY || sideB != calibrationModelSizeX ||
                sideC != calibrationModelSizeY || sideD != calibrationModelSizeX ||
                sideE != sideF)
            {
                sideBCAngle       = MathHelper.RadiansToDegrees(Math.Acos((Math.Pow(sideC, 2) + Math.Pow(sideB, 2) - Math.Pow(sideF, 2)) / (2 * sideC * sideB)));
                sideBCAngleOffset = (float)Math.Sqrt(Math.Pow(sideC, 2) - Math.Pow(sideBDHeight, 2));

                if (sideBCAngle > 90)
                {
                    sideBCAngleOffset = -sideBCAngleOffset;
                }
            }

            //properties of left part of trapezoid
            var sideABAngleOffset = 0f;
            var sideABAngle       = 90d;

            var triangleAArea = Math.Sqrt(((sideA + sideB + sideE) / 2)
                                          * (((sideA + sideB + sideE) / 2) - sideA)
                                          * (((sideA + sideB + sideE) / 2) - sideB)
                                          * (((sideA + sideB + sideE) / 2) - sideE));

            var sideABHeight = ((float)(triangleAArea * 2) / sideB);

            if (sideA != calibrationModelSizeY || sideB != calibrationModelSizeX ||
                sideC != calibrationModelSizeY || sideD != calibrationModelSizeX ||
                sideE != sideF)
            {
                sideABAngleOffset = (float)Math.Sqrt(Math.Pow(sideA, 2) - Math.Pow(sideABHeight, 2));
                sideABAngle       = MathHelper.RadiansToDegrees(Math.Acos((Math.Pow(sideA, 2) + Math.Pow(sideB, 2) - Math.Pow(sideE, 2)) / (2 * sideA * sideB)));
                if (sideABAngle < 90)
                {
                    sideABAngleOffset = -sideABAngleOffset;
                }
            }

            Calculate(model, selectedMaterial, modelTranslation, maxBuildSizeX, maxBuildSizeY, sideABHeight, sideBDHeight, sideBCAngleOffset,
                      sideABAngleOffset, sideABAngle, sideBCAngle, sideB, calibrationModelSizeX, calibrationModelSizeY);
        }