/// <summary> /// Se una azione automatica contiene una mascheratura orientabile (quindi doppia) /// posso disassociarla e creare una nuova azione /// </summary> void disassociareMascheratura() { CorrezioniList correzioniList = null; AzioneAuto azioneAuto = azioneAutomaticaSelezionata; MascheraturaOrientabile mascheraturaOrientabile = null; // Controllo che l'azione corrente contenga una mascheratura orientabile if (azioneAuto.correzioniXml != null) { correzioniList = SerializzaUtil.stringToObject <CorrezioniList>(azioneAuto.correzioniXml); if (correzioniList != null && correzioniList.Count > 0) { mascheraturaOrientabile = (MascheraturaOrientabile)correzioniList.SingleOrDefault(mo => mo is MascheraturaOrientabile); } } if (mascheraturaOrientabile == null) { dialogProvider.ShowError("L'azione selezionata non contiene una <MascheraturaOrientabile>.\nSolo queste si possono separare!", "Azione non separabile", null); return; } // ok procedo a separare le cornici // Sostituisco la correzione nella lista, cercando di mettere quella nuova nella stessa posizione Mascheratura masH = mascheraturaOrientabile.mascheraturaH; Mascheratura masV = mascheraturaOrientabile.mascheraturaV; // Elimino la mascheratura doppia ... correzioniList.Remove(mascheraturaOrientabile); // aggiungo solo la mascheratura Orizzontale correzioniList.Insert(0, masV); // Aggiorno l'entità sul db OrmUtil.forseAttacca <AzioneAuto>(ref azioneAuto); azioneAuto.correzioniXml = SerializzaUtil.objectToString(correzioniList); // Ora creo l'altra azione CorrezioniList correzioniList2 = new CorrezioniList(); correzioniList2.Add(masH); AzioneAuto azioneV = new AzioneAuto { id = Guid.NewGuid(), attivo = true, nome = "Separata", correzioniXml = SerializzaUtil.objectToString(correzioniList2) }; UnitOfWorkScope.currentDbContext.AzioniAutomatiche.Add(azioneV); // Ora aggiungo anche alla collezione visiva azioniAutomatiche.Add(azioneV); deselezionareTutto(); // Purtroppo non si aggiornano le icone di overlay. devo ricaricare. App.Current.Dispatcher.BeginInvoke(new Action(() => { rileggereAzioniAutomaticheCommand.Execute(null); } )); }
void forseAssociareMaschere() { if (!modalitaAssociazione) { return; } // Per poter iniziare l'associazione, ocorre che la riga selezionata, contenga una mascheratura Mascheratura mascheratura2 = estraiMascheratura(azioneAutomaticaSelezionata); if (mascheratura2 == null) { dialogProvider.ShowError("L'azione selezionata non contiene Mascheratura", "Azioni non associate", null); return; } // Dalla prima azione, estraggo la mascheratura, perché devo controllare che sia di Orientamento opposto alla prima che ho fissato. CorrezioniList correzioni1 = SerializzaUtil.stringToObject <CorrezioniList>(azioneAutoAssociare1.correzioniXml); Mascheratura mascheratura1 = (Mascheratura)correzioni1.ToList <Correzione>().FirstOrDefault(c => c is Mascheratura); var ratio1 = mascheratura1.width / mascheratura1.height; var ratio2 = mascheratura2.width / mascheratura2.height; if ((ratio1 < 1 && ratio2 < 1) || (ratio1 > 1 && ratio2 > 1)) { dialogProvider.ShowError("Le maschere devono ossere di diverso orientamento.\nUna orizzontale ed una verticale!", "Azioni non associate", null); return; } // Ok : adesso posso procedere alla associazione MascheraturaOrientabile mo = new MascheraturaOrientabile(); mo.mascheraturaH = (ratio1 < 1 ? mascheratura2 : mascheratura1); mo.mascheraturaV = (ratio1 < 1 ? mascheratura1 : mascheratura2); using (new UnitOfWorkScope()) { // Sostituisco la correzione nella lista, cercando di mettere quella nuova nella stessa posizione int pos = correzioni1.IndexOf(mascheratura1); correzioni1.RemoveAt(pos); correzioni1.Insert(pos, mo); // Rimuovo l'azione2 dalla collezione a video AzioneAuto azioneDacanc = azioneAutomaticaSelezionata; azioniAutomatiche.Remove(azioneDacanc); // Ora vado ad aggiornare l'azione1 con le correzioni nuove AzioneAuto azione = azioneAutoAssociare1; OrmUtil.forseAttacca <AzioneAuto>(ref azione); azioneAutoAssociare1.correzioniXml = SerializzaUtil.objectToString(correzioni1); // Elimino dal db la azione2 OrmUtil.forseAttacca <AzioneAuto>(ref azioneDacanc); // Rimuovo l'azione dal database UnitOfWorkScope.currentDbContext.AzioniAutomatiche.Remove(azioneDacanc); UnitOfWorkScope.currentDbContext.SaveChanges(); // Torno in modalità normale modalitaAssociazione = false; } // Purtroppo non si aggiornano le icone di overlay. devo ricaricare. App.Current.Dispatcher.BeginInvoke(new Action(() => { rileggereAzioniAutomaticheCommand.Execute(null); } )); }