void provinatore_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            Fotografia foto = (Fotografia)e.UserState;

            bool esistevaRisultante = foto.imgRisultante != null;


            // Rilascio memoria
            AiutanteFoto.disposeImmagini(foto, IdrataTarget.Tutte);

            AiutanteFoto.creaProvinoFoto(foto);

            // Le due foto grandi le rilascio per non intasare la memoria qualora questo metodo è chiamato più volte
            AiutanteFoto.disposeImmagini(foto, IdrataTarget.Originale);
            AiutanteFoto.disposeImmagini(foto, IdrataTarget.Risultante);


            bool esisteRisultante = foto.imgRisultante != null;

            // Siccome è molto probabile che venga idratata l'immagine risultante e siccome sono in un loop,
            // non posso tenere in memoria tanta roba, altrimenti esplode
            if (esisteRisultante && !esistevaRisultante)
            {
                // Significa che l'ho idratata io in questo momento
                AiutanteFoto.disposeImmagini(foto, IdrataTarget.Risultante);
            }


            // Avviso tutti che questa foto è cambiata
            FotoModificateMsg msg = new FotoModificateMsg(this, foto);

            pubblicaMessaggio(msg);
        }
        /// <summary>
        /// Elimina tutte le Correzioni da una foto e quindi ricrea il provino
        /// </summary>
        public void tornaOriginale(Fotografia fotografia, bool salvare)
        {
            fotografia.correzioniXml = null;

            // Rimuovo anche eventuale file su disco
            string nomeFileRis = PathUtil.nomeCompletoRisultante(fotografia);

            if (File.Exists(nomeFileRis))
            {
                File.Delete(nomeFileRis);
            }

            // Rilascio memoria
            AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Tutte);

            AiutanteFoto.creaProvinoFoto(fotografia);

            // Le due foto grandi le rilascio per non intasare la memoria qualora questo metodo è chiamato più volte
            AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Originale);
            AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Risultante);

            if (salvare)
            {
                Fotografia f = fotografia;
                fotografieRepositorySrv.update(ref f, true);
                fotografieRepositorySrv.saveChanges();                  // Persisto nel db le modifiche

                // Devo informate tutti che questa foto è cambiata
                FotoModificateMsg msg = new FotoModificateMsg(this, fotografia);
                pubblicaMessaggio(msg);
            }
        }
        public void addLogo(Fotografia fotografia, Logo logo, bool salvare)
        {
            if (logo == null)
            {
                // Rimuovo il logo dalle correzioni
                // Deserializzo la stringa con le eventuali correzioni attuali
                if (fotografia.correzioniXml != null)
                {
                    CorrezioniList correzioni = SerializzaUtil.stringToObject <CorrezioniList>(fotografia.correzioniXml);
                    foreach (Correzione c in correzioni)
                    {
                        if (c is Logo)
                        {
                            correzioni.Remove(c);
                            break;
                        }
                    }
                    // Ora serializzo di nuovo
                    fotografia.correzioniXml = SerializzaUtil.objectToString(correzioni);
                }
            }
            else
            {
                // Siccome ho reso il logo sommabile, questa operazione in realtà non aggiunge ma sostituisce.
                addCorrezione(fotografia, logo, salvare);
            }

            // Ricalcolo il provino giusto per poterlo visualizzare
            AiutanteFoto.creaProvinoFoto(fotografia);
        }
Exemple #4
0
        public void creaProvinoANastro()
        {
            Fotografia f = cercaUnaFotoQuasiasi();

            for (int ii = 0; ii < 100; ii++)
            {
                AiutanteFoto.creaProvinoFoto(f);
            }
        }
        public void removeCorrezione(Fotografia foto, Type quale)
        {
            // Se non ho correzioni è impossibile che ne voglio rimuovere una
            if (foto.correzioniXml == null)
            {
                return;
            }

            // Deserializzo la stringa con le eventuali correzioni attuali
            CorrezioniList correzioni = SerializzaUtil.stringToObject <CorrezioniList>(foto.correzioniXml);

            bool rimossa = false;

            foreach (Correzione cor in correzioni)
            {
                if (cor.GetType().Equals(quale))
                {
                    correzioni.Remove(cor);
                    rimossa = true;
                    break;
                }
            }

            if (!rimossa)
            {
                return;
            }

            // Ora serializzo di nuovo in stringa tutte le correzioni
            if (correzioni.Count > 0)
            {
                foto.correzioniXml = SerializzaUtil.objectToString(correzioni);
            }
            else
            {
                foto.correzioniXml = null;
            }

            AiutanteFoto.creaProvinoFoto(foto);
        }
        /// <summary>
        /// Faccio qualche controllo preventivo.
        /// </summary>
        /// <param name="fotografia"></param>
        /// <param name="ruota"></param>
        public void autoRuotaSuOriginale(Fotografia fotografia, Ruota ruota)
        {
            if (fotografia.correzioniXml != null)
            {
                throw new LumenException("Sulla foto " + fotografia.numero + " esistono correzioni.\nImpossibile ruotare sull'originale.\nRimuovere prima le correzioni (torna originale)");
            }

            if (!ruota.isAngoloRetto)
            {
                throw new ArgumentException("La rotazione sull'originale funziona solo con angoli retti");
            }

            string nomeFileOrig = PathUtil.nomeCompletoOrig(fotografia);
            string estensione   = Path.GetExtension(nomeFileOrig);

            if (fotografia.imgOrig == null)
            {
                AiutanteFoto.idrataImmaginiFoto(fotografia, IdrataTarget.Originale);
            }

            IImmagine imgRuotata = applicaCorrezione(fotografia.imgOrig, ruota);

            string nomeFileBackup = Path.ChangeExtension(nomeFileOrig, "BACKUP" + estensione);

            if (!File.Exists(nomeFileBackup))
            {
                // Salvo per sicurezza il file originale
                File.Move(nomeFileOrig, nomeFileBackup);
            }

            fotografia.imgOrig = imgRuotata;
            gestoreImmaginiSrv.save(imgRuotata, nomeFileOrig);

            AiutanteFoto.creaProvinoFoto(fotografia);

            // Libero memoria. Lascio solo il provino
            AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Originale);
            AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Risultante);
        }
        /// <summary>
        /// Aggiungo una correzione a quelle già eventualmente presenti sulla foto.
        /// Se la correzione esiste già, gestisco eventuale somma, oppure rimozione in caso che sia inutile (ininfluente)
        /// </summary>
        /// <param name="fotografia">la foto</param>
        /// <param name="correzione">la correzione da aggiungere</param>
        public void addCorrezione(Fotografia fotografia, Correzione correzioneNuova, bool salvare)
        {
            CorrezioniList correzioni;

            // Deserializzo la stringa con le eventuali correzioni attuali
            if (fotografia.correzioniXml == null)
            {
                correzioni = new CorrezioniList();
            }
            else
            {
                correzioni = SerializzaUtil.stringToObject <CorrezioniList>(fotografia.correzioniXml);
            }


            // Alcune correzioni, non devono andare sempre in aggiunta, ma possono sommarsi l'un l'altra.
            // Per esempio la rotazione. Se ruoto 90° poi altri 90, l'effetto finale è quello di avere una sola da 180°
            Correzione daSost  = null;
            Correzione vecchia = null;

            foreach (Correzione c in correzioni)
            {
                if (c.isSommabile(correzioneNuova))
                {
                    vecchia = c;
                    daSost  = c.somma(correzioneNuova);
                    break;
                }
            }

            if (daSost != null)
            {
                // Sostituisco la correzione con quella ricalcolata
                if (daSost.isInutile)
                {
                    correzioni.Remove(vecchia);
                }
                else
                {
                    correzioni.sostituire(vecchia, daSost);
                }
            }
            else
            {
                // Aggiungo in fondo (se la correzione è inutile, allora non aggiungo nulla)
                if (!correzioneNuova.isInutile)
                {
                    correzioni.Add(correzioneNuova);
                }
            }

            // Ora serializzo di nuovo in stringa tutte le correzioni
            fotografia.correzioniXml = SerializzaUtil.objectToString(correzioni);

            if (salvare)
            {
                fotografieRepositorySrv.saveChanges();                  // Persisto nel db le modifiche

                AiutanteFoto.creaProvinoFoto(fotografia);

                // Devo informare tutti che questa foto è cambiata
                FotoModificateMsg msg = new FotoModificateMsg(this, fotografia);
                pubblicaMessaggio(msg);
            }
        }
        public void clonaImmagineIncorniciata(Fotografia fotoOrig, string nomeFileImg)
        {
            FileInfo fileInfoSrc   = new FileInfo(fotoOrig.nomeFile);
            string   nomeOrig      = fileInfoSrc.Name;
            string   nomeFotoClone = ClonaImmaginiWorker.getNomeFileClone(fotoOrig);
            string   nomeFileDest  = Path.Combine(Config.Configurazione.cartellaRepositoryFoto, Path.GetDirectoryName(fotoOrig.nomeFile), nomeFotoClone);

            //Sposto la foto nella coartellaRepository e gli attribuisco il suo nome originale.
            File.Move(nomeFileImg, nomeFileDest);

            Fotografia fotoMsk = null;

            using (new UnitOfWorkScope(false))
            {
                try
                {
                    fotoMsk    = new Fotografia();
                    fotoMsk.id = Guid.NewGuid();
                    fotoMsk.dataOraAcquisizione = fotoOrig.dataOraAcquisizione;

                    Fotografo f = fotoOrig.fotografo;
                    OrmUtil.forseAttacca <Fotografo>(ref f);
                    fotoMsk.fotografo = f;

                    if (fotoOrig.evento != null)
                    {
                        Evento e = fotoOrig.evento;
                        OrmUtil.forseAttacca <Evento>(ref e);
                        fotoMsk.evento = e;
                    }

                    fotoMsk.didascalia = fotoOrig.didascalia;
                    fotoMsk.numero     = fotoOrig.numero;
                    // Le correzioni non devo duplicarle perché non sono tipiche della composizione finale, ma della foto originale.

                    fotoMsk.faseDelGiorno = fotoOrig.faseDelGiorno;
                    fotoMsk.giornata      = fotoOrig.giornata;

                    // il nome del file, lo memorizzo solamente relativo
                    // scarto la parte iniziale di tutto il path togliendo il nome della cartella di base delle foto.
                    // Questo perché le stesse foto le devono vedere altri computer della rete che
                    // vedono il percorso condiviso in maniera differente.
                    fotoMsk.nomeFile = Path.Combine(Path.GetDirectoryName(fotoOrig.nomeFile), nomeFotoClone);

                    fotografieRepositorySrv.addNew(fotoMsk);
                    fotografieRepositorySrv.saveChanges();
                }

                catch (Exception ee)
                {
                    _giornale.Error("Non riesco ad inserire una foto clonata. Nel db non c'è ma nel filesystem si: " + fotoOrig.nomeFile, ee);
                }

                AiutanteFoto.creaProvinoFoto(nomeFileDest, fotoMsk);

                // Libero la memoria occupata dalle immagini, altrimenti esplode.
                AiutanteFoto.disposeImmagini(fotoMsk, IdrataTarget.Tutte);

                // Notifico la lista delle foto da mandare in modifica
                NuovaFotoMsg msg = new NuovaFotoMsg(this, fotoMsk);
//				msg.descrizione += Configurazione.ID_FOTOGRAFO_ARTISTA;
                LumenApplication.Instance.bus.Publish(msg);
            }
        }
        /// <summary>
        /// Il parametro passato "tempoScarico" deve essere ribaltato su tutte le foto, perché
        /// serve a creare una relazione implicita 1-n tra lo ScaricoCard e Fotografia
        /// </summary>
        /// <param name="tempoScarico"></param>
        public void elabora(DateTime tempoScarico)
        {
            _giornale.Debug("Inizio ad elaborare le foto acquisite");

            // carico il fotografo che rimane uguale per tutta questa sessione di elaborazione
            LumenEntities objContext = UnitOfWorkScope.currentDbContext;

            _fotografo = objContext.Fotografi.Single <Fotografo>(ff => ff.id == _paramScarica.flashCardConfig.idFotografo);


            // carico l'evento che rimane uguale per tutta questa sessione di elaborazione
            if (_paramScarica.flashCardConfig.idEvento != null && _paramScarica.flashCardConfig.idEvento != Guid.Empty)
            {
                _evento = objContext.Eventi.SingleOrDefault(e => e.id == _paramScarica.flashCardConfig.idEvento);
            }


            _giornale.Debug("Sto per lavorare le " + _listaFiles.Count + " foto appena acquisite di " + _fotografo.id);

            int ultimoNumFoto = NumeratoreFotogrammi.incrementaNumeratoreFoto(_listaFiles.Count);

            contaAggiunteDb = 0;

            ScaricoFotoMsg scaricoFotoMsg = new ScaricoFotoMsg(this, "Notifica progresso");

            scaricoFotoMsg.fase         = FaseScaricoFoto.Provinatura;
            scaricoFotoMsg.esitoScarico = new EsitoScarico();
            scaricoFotoMsg.esitoScarico.totFotoScaricate = _listaFiles.Count;
            scaricoFotoMsg.sorgente        = _paramScarica.cartellaSorgente != null ? _paramScarica.cartellaSorgente : _paramScarica.nomeFileSingolo;
            scaricoFotoMsg.showInStatusBar = false;

            IList <Fotografia> fotoDaEsaminare = null;

            if (_paramScarica.ricercaBarCode)
            {
                fotoDaEsaminare = new List <Fotografia>();
            }

            foreach (FileInfo fileInfo in _listaFiles)
            {
                // Eseguo una transazione per ogni foto, in questo modo sono sicuro che tutto quello che posso buttare dentro, ci va.
                using (TransactionScope transaction = new TransactionScope()) {
                    try {
                        int proxNum = 1 + contaAggiunteDb + ultimoNumFoto;

                        Fotografia foto = aggiungiFoto(fileInfo, proxNum, tempoScarico);

                        //
                        // --- eventuale maschera automatica
                        if (_paramScarica.mascheraAuto != null)
                        {
                            // Uso la maschera nella sua dimensione naturale
                            Imaging.Correzioni.Mascheratura mascheraratura = new Imaging.Correzioni.Mascheratura {
                                nome   = _paramScarica.mascheraAuto.nomeFile,
                                width  = _paramScarica.mascheraAuto.imgOriginale.ww,
                                height = _paramScarica.mascheraAuto.imgOriginale.hh
                            };

                            fotoRitoccoSrv.addCorrezione(foto, mascheraratura, false);
                        }

                        // Mark the transaction as complete.
                        transaction.Complete();


                        // Incremento qui il contatore perché in caso di eccezione, voglio che non si incrementi
                        ++contaAggiunteDb;


                        _giornale.Debug("Inizio Provinatura immagine " + fileInfo.FullName);
                        AiutanteFoto.creaProvinoFoto(fileInfo.FullName, foto);
                        _giornale.Debug("Fine Provinatura immagine ");

                        // Libero la memoria occupata dalle immagini, altrimenti esplode.
                        AiutanteFoto.disposeImmagini(foto, IdrataTarget.Tutte);

                        if (_paramScarica.ricercaBarCode)
                        {
                            fotoDaEsaminare.Add(foto);
                        }

                        // Se lavoro con una singola foto, allora lancio l'evento che mi dice che è pronta.
                        if (String.IsNullOrEmpty(_paramScarica.nomeFileSingolo) == false)
                        {
                            // Quando sono a posto con la foto, sollevo un evento per avvisare tutti
                            // Siccome questa operazione è un pò onerosa, per il momento la abilito
                            // soltanto sulla singola foto. Se ne scarico 1000 di foto, non voglio lanciare 1000 eventi!!!
                            NuovaFotoMsg msg = new NuovaFotoMsg(this, foto);
                            LumenApplication.Instance.bus.Publish(msg);
                        }
                        _giornale.Debug("ok nuova foto provinata e inserita nel db: " + foto);

                        if (contaAggiunteDb % 20 == 0)
                        {
                            scaricoFotoMsg.esitoScarico.totFotoProvinateProg = contaAggiunteDb;
                            LumenApplication.Instance.bus.Publish(scaricoFotoMsg);
                        }
                    } catch (Exception ee) {
                        transaction.Dispose();
                        _giornale.Error("Errore elaborazione foto. Viene ignorata " + fileInfo, ee);
                    }
                }
            }

            if (_paramScarica.ricercaBarCode)
            {
                barCodeSrv.scan(fotoDaEsaminare);
            }

            if (contaAggiunteDb != 0)
            {
                scaricoFotoMsg.esitoScarico.totFotoProvinateProg = contaAggiunteDb;
                scaricoFotoMsg.esitoScarico.totFotoProvinate     = contaAggiunteDb;
                LumenApplication.Instance.bus.Publish(scaricoFotoMsg);
            }

            _giornale.Info("Terminato di lavorare " + _listaFiles.Count + " foto appena acquisite");

            incrementaTotaleFotoScaricate(tempoScarico);
        }