コード例 #1
0
        //internal override ProgramPhase GetOperationProgram(Operazione operazione)
        //{
        //    /*
        //     * il richiamo degli utensili magari farlo e delle operazioni comuni magari farlo in astratto più a monte
        //     *
        //     */

        //    /*
        //     *
        //     * su spianatura tradizionale se rimane ultima passata piccola lo togle con il centro della fresa.
        //     */
        //    var program = new ProgramPhase(SicurezzaZ);

        //    // cambio utensile // se
        //    var toolChange = new ChangeToolAction(program, operazione);

        //    program.ActiveAsseC(true);

        //    var parametro = operazione.GetParametro<ParametroFresaSpianare>();

        //    if (parametro == null)
        //        throw new NullReferenceException();

        //    var larghezzaPassata = parametro.GetLarghezzaPassata();

        //    var profPassata = parametro.GetProfonditaPassata();

        //    var diaFresa = parametro.DiametroMinimoFresa;

        //    diaFresa -= parametro.GetRaggioInserto() * 2;

        //    var diaIngombroFresa = parametro.DiametroIngombroFresa;

        //    var secureFeed = 1;

        //    var extraCorsa = 1;

        //    var feed = parametro.GetFeed(FeedType.ASync);

        //    var sovraMetallo = Sovrametallo - SovrametalloPerFinitura;


        //    var ottimizza = false; // per ora non lo lascio modificare da utente

        //    var passataMinimaPercentuale = 20.0d; // -- ,, valori sballati potrebbero causare bug non previsti



        //    if (feed <= 0)
        //        return null;

        //    var feedDictionary = new Dictionary<MoveType, double>
        //                             {
        //                                 {MoveType.Rapid, 10000},

        //                                 {MoveType.SecureRapidFeed, secureFeed},
        //                                 {MoveType.Work, feed},
        //                                 {MoveType.Cw, feed},
        //                                 {MoveType.Ccw, feed},
        //                                 {MoveType.PlungeFeed, feed /2}
        //                             };

        //    program.SetFeedDictionary(feedDictionary);

        //    var moveCollection = new MoveActionCollection();

        //    var centerPoint = GetCenterPoint();


        //    switch ((LavorazioniEnumOperazioni)operazione.OperationType)
        //    {
        //        case LavorazioniEnumOperazioni.FresaturaSpianaturaSgrossatura:
        //            {
        //                var zLavoro = LivelloZ + SovrametalloPerFinitura;

        //                switch (ModoSgrossatura)
        //                {
        //                    case SpiantaturaMetodologia.Tradizionale:
        //                        {
        //                            OneDirectionFaceMilling(moveCollection, centerPoint.X, centerPoint.Y, Larghezza, Altezza, larghezzaPassata, diaFresa, diaIngombroFresa, sovraMetallo, profPassata, zLavoro, SicurezzaZ, extraCorsa);
        //                        } break;

        //                    case SpiantaturaMetodologia.Spirale:
        //                        {
        //                            SpiralFaceMillingV2(moveCollection, centerPoint.X, centerPoint.Y, Larghezza, Altezza, larghezzaPassata, diaFresa, diaIngombroFresa, sovraMetallo, profPassata, zLavoro, SicurezzaZ, extraCorsa, ottimizza, passataMinimaPercentuale);
        //                        } break;
        //                }

        //            } break;

        //        case LavorazioniEnumOperazioni.FresaturaSpianaturaFinitura:
        //            {
        //                switch (ModoFinitura)
        //                {
        //                    case SpiantaturaMetodologia.Tradizionale:
        //                        {
        //                            OneDirectionFaceMilling(moveCollection,
        //                                centerPoint.X, centerPoint.Y,
        //                                Larghezza, Altezza, larghezzaPassata,
        //                                diaFresa,
        //                                diaIngombroFresa,
        //                                SovrametalloPerFinitura,
        //                                profPassata,
        //                                LivelloZ,
        //                                SicurezzaZ,
        //                                extraCorsa
        //                                );

        //                        } break;

        //                    case SpiantaturaMetodologia.Spirale:
        //                        {
        //                            // richiamo stesso procedimento , metto solo profondita == sovrametallo
        //                            // magari fare spiarale singolo in un metodo e richiamarla con sgrossatura più volte
        //                            SpiralFaceMillingV2(moveCollection,
        //                                centerPoint.X, centerPoint.Y,
        //                                Larghezza, Altezza,
        //                                larghezzaPassata,
        //                                diaFresa,
        //                                diaIngombroFresa,
        //                                SovrametalloPerFinitura,
        //                                profPassata,
        //                                LivelloZ, SicurezzaZ, extraCorsa,
        //                                ottimizza,
        //                                passataMinimaPercentuale);

        //                        } break;
        //                }

        //            } break;

        //    }

        //    var mm = base.GetFinalProgram(moveCollection);

        //    foreach (var variable in mm)
        //    {
        //        program.AddMoveAction(variable);
        //    }

        //    program.ActiveAsseC(false);

        //    return program;
        //}

        private static void OneDirectionFaceMilling(MoveActionCollection programPhase,
                                                    double offsetX, double offsetY,
                                                    double larghezza, double altezza,
                                                    double larghPassata, double diaFresa, double diaIngombroFresa,
                                                    double sovraMetallo, double profPassata,
                                                    double zFinale, double zSicurezza,
                                                    double extraCorsaSicurezza)
        {
            if (CheckValueHelper.GreatherOrEqualZero(new[] { sovraMetallo, extraCorsaSicurezza }) ||
                CheckValueHelper.GreatherThanZero(new[] { larghezza, altezza, larghPassata, diaFresa, diaIngombroFresa, profPassata, }) ||
                CheckValueHelper.GreatherThan(new[]
            {
                new KeyValuePair <double, double>(zSicurezza, zFinale + sovraMetallo),
                new KeyValuePair <double, double>(diaFresa, larghPassata),
            })
                )
            {
                return;
            }



            var zCurrent = zFinale + sovraMetallo;

            var xIni = offsetX - larghezza / 2;
            var xFin = offsetX + larghezza / 2;

            var yIni = offsetY + altezza / 2 + diaFresa / 2;
            var yFin = offsetY - altezza / 2;

            xIni -= (diaIngombroFresa / 2) + extraCorsaSicurezza;
            xFin += (diaIngombroFresa / 2) + extraCorsaSicurezza;

            // Itero per tutte le passate in Z
            while (zCurrent > zFinale)
            {
                zCurrent -= profPassata;

                if (zCurrent < zFinale)
                {
                    zCurrent = zFinale;
                }
                {
                    OneDirectionHorizontal(programPhase, zCurrent, zSicurezza, xIni, xFin, yIni, yFin, larghPassata);
                }
            }

            /*
             * Pensare a come riutilizzarla per direzione orizzontale e verticale
             */
        }
コード例 #2
0
        /// <summary>
        /// Calcola percorso di spianatura a spirale
        /// </summary>
        /// <param name="programPhase"></param>
        /// <param name="offsetX"></param>
        /// <param name="offsetY"></param>
        /// <param name="larghezza"></param>
        /// <param name="altezza"></param>
        /// <param name="larghPassata"></param>
        /// <param name="diaFresaEffettivo">Diametro Effettivo Fresa</param>
        /// <param name="diaFresaIngombro">Diametro Ingombro Fressa</param>
        /// <param name="sovraMetallo"></param>
        /// <param name="profPassata"></param>
        /// <param name="zFinale"></param>
        /// <param name="zSicurezza">Z Sicurezza</param>
        /// <param name="extraCorsaSicurezza"></param>
        /// <param name="ottimizzaPassate">Con true calcolo nuova larghezza di passata minima</param>
        /// <param name="passataMinimaPercentuale">Passata Minima Percentuale</param>
        private static void SpiralFaceMillingV2(MoveActionCollection programPhase,
                                                double offsetX, double offsetY,
                                                double larghezza, double altezza,
                                                double larghPassata, double diaFresaEffettivo,
                                                double diaFresaIngombro,
                                                double sovraMetallo, double profPassata,
                                                double zFinale, double zSicurezza,
                                                double extraCorsaSicurezza, bool ottimizzaPassate, double passataMinimaPercentuale)
        {
            /*
             * todo : considerare anche raggio inserto--
             */
            /*
             * é meglio se avanzamenti li registro qui..
             */


            if (CheckValueHelper.GreatherOrEqualZero(new[] { sovraMetallo, extraCorsaSicurezza }) ||
                CheckValueHelper.GreatherThanZero(new[] { larghezza, altezza, larghPassata, diaFresaEffettivo, profPassata, diaFresaIngombro }) ||
                CheckValueHelper.GreatherThan(new[]
            {
                new KeyValuePair <double, double>(zSicurezza, zFinale + sovraMetallo),
                new KeyValuePair <double, double>(diaFresaEffettivo, larghPassata),
            })
                )
            {
                return;
            }


            /*
             * Per creare spianatura divido l'area di lavoro in griglia a quadrati con lato == larghezzaPassata
             */

            var larghezzaPassataX = larghPassata;

            var larghezzaPassataY = larghPassata;

            var nColonneTeoriche = larghezza / larghPassata;

            var nRigheTeoriche = altezza / larghPassata;

            var nColonne = (int)Math.Floor(nColonneTeoriche);

            var nRighe = (int)Math.Floor(nRigheTeoriche);

            /*
             * devo per forza cambiare larghPassata, mantenendo il valore compreso fra un min e max.
             *
             * una volta che ho questo valore , proseguo per il mio ciclo come solito..
             *
             */
            if (ottimizzaPassate)
            {
                var passataMin = (larghPassata * passataMinimaPercentuale) / 100;

                var restoX = larghezza % larghezzaPassataX;
                var restoY = altezza % larghezzaPassataY;

                if (restoX < passataMin)
                {
                    // modifico larghezza passata X
                    larghezzaPassataX = larghezza / nColonne;

                    nColonne--;
                }

                if (restoY < passataMin)
                {
                    // modifico larghezza passata Y
                    larghezzaPassataY = altezza / nRighe;

                    // dimuisco numero di righe,
                    nRighe--;
                }
            }


            /*
             * Raggio della fresa, sara il raggio che usero durante gli angoli nella spianatura
             */

            var raggioEffettivoFresa = diaFresaEffettivo / 2;

            /*
             * todo: gestire anche diversi direzioni lavorazione e quindi punti entrata
             */

            var sx   = offsetX - larghezza / 2;
            var dx   = offsetX + larghezza / 2;
            var down = offsetY - altezza / 2;
            var up   = offsetY + altezza / 2;

            /*
             * in pratica per trovare punto arrivo moltiplico la larghezza di Passata per le celle delle griglia rimaste..
             */

            var zCurrent = zFinale + sovraMetallo;

            // Itero per tutte le passate in Z
            while (zCurrent > zFinale)
            {
                zCurrent -= profPassata;
                if (zCurrent < zFinale)
                {
                    zCurrent = zFinale;
                }



                // rimuovere
                var minElement = (int)Math.Min(nColonne, nRighe);


                /*
                 *  1.1 ) Punto attacco XY
                 *
                 *  Il punto di inizio in alto a dx , tiene presente dell'ingombro massimo fresa e diametro effettivo di lavorazione + extraCorsaSicurezza
                 */
                var raggioIngombro = diaFresaIngombro / 2;

                var puntoInizio = new Point2D
                {
                    X = sx + (nColonne) * larghezzaPassataX,
                    Y = up + raggioIngombro + extraCorsaSicurezza
                };

                programPhase.AddLinearMove(MoveType.Rapid, AxisAbilited.Xy, puntoInizio.X, puntoInizio.Y, null);

                programPhase.AddLinearMove(MoveType.Rapid, AxisAbilited.Z, null, null, zSicurezza);


                //  1.2 ) Andare a z Corrent

                programPhase.AddLinearMove(MoveType.SecureRapidFeed, AxisAbilited.Z, null, null, zCurrent);

                // 1.3 ) Punto avvicinamento diametro effettivo fresa

                var puntoAvvi = new Point2D
                {
                    X = puntoInizio.X,
                    Y = up + raggioEffettivoFresa
                };

                programPhase.AddLinearMove(MoveType.PlungeFeed, AxisAbilited.Xy, puntoAvvi.X, puntoAvvi.Y, null);

                // 1.4) Interpolazione per fare entrata

                var puntoFinaleArcoEntrata = new Point2D
                {
                    X = sx + (nColonne * larghezzaPassataX) + raggioEffettivoFresa,
                    Y = up,
                };

                programPhase.AddArcMove(AxisAbilited.Xy, puntoFinaleArcoEntrata.X, puntoFinaleArcoEntrata.Y, null, raggioEffettivoFresa, true, new Point2D(puntoAvvi.X, up));


                /*
                 *  Ora magari vorrei cercare di cambiare ciclo in qualcosa di più chiaro e gestibile..
                 *
                 * qui a posso usare metodi aux..
                 *
                 * poso
                 */

                // 1.5) Lavorazione fino a termine materiale

                var continueCycle = true;

                var moveEnum = SpiralMoveEnum.ToDown;

                var startMove = moveEnum;

                var tempX = puntoFinaleArcoEntrata.X;

                var tempY = puntoFinaleArcoEntrata.Y;

                // cambiare se cambia senso direzione
                // counterCelleY++;

                var tempConterColonne = nColonne;
                var tempCounterRighe  = nRighe;



                while (continueCycle)
                {
                    continueCycle = SpiralMovementV2(programPhase, ref moveEnum, ref tempX, ref tempY, up, down, sx, dx, larghezzaPassataX, larghezzaPassataY, ref tempConterColonne, ref tempCounterRighe, nRighe, nColonne, minElement, raggioEffettivoFresa);

                    // anche questo va cambiato se si decide di fare scegliere punto attacco
                    //if (moveEnum == SpiralMoveEnum.ToDown)
                    //{
                    //    tempConterColonne--;
                    //    tempCounterRighe--;
                    //}
                }

                // 1.6) Porto fresa a Z Sicurezza
                programPhase.AddLinearMove(MoveType.Rapid, AxisAbilited.Z, null, null, zSicurezza);
            }
        }