Architettura delle modalità di interazione ("strumenti di disegno") per un programma di pittura 3D

7

Stiamo sviluppando un'applicazione basata su Qt per navigare e dipingere su un volume trattato come una grafica a pixel 3D. Il layout dell'app è costituito da tre viste ortogonali su cui l'utente può dipingere cose come punti, cerchi, ecc. E anche cancellare i pixel già dipinti. Pensa a 3D Gimp o MS Paint.

Come progetteresti l'architettura per le diverse modalità di interazione (ad esempio gli strumenti di disegno)?

La mia idea è:

  • usa lo schema MVC
  • avere un controllore separato per ogni modalità di interazione
  • installa un filtro eventi su tutte e tre le viste slice per raccogliere tutti gli eventi di interazione utente in entrata (mouse, tastiera)
  • reindirizza gli eventi al controllore di interazione attualmente attivo

Apprezzerei i commenti critici su questa idea.

    
posta Bernhard Kausler 14.09.2011 - 12:18
fonte

3 risposte

1

Tipicamente MVC è uno stile in cui vengono definite operazioni relativamente grandi. Ciò non si allinea perfettamente con le complesse operazioni che definisci come dipingere un pixel 3d. Suggerirei di dare un'occhiata a un altro stile strettamente correlato a MVC che è MVVM. Permette un legame più stretto tra l'oggetto su cui si sta operando tramite i diversi strumenti e la vista per quell'oggetto.

    
risposta data 23.10.2011 - 15:21
fonte
1

Non penso che costruire le modalità di interazione come diversi "controller" ti serviranno bene. Qual è la tua logica per questo? Un controller serve per legare la visualizzazione e l'input dell'utente al modello, ma immagino che questa sia solo una tela e un puntatore del mouse, quindi perché i multi-controller?

Si potrebbe avere la logica di commutazione che cambia tra le modalità di interazione in una classe del modello. Probabilmente non dovresti aver bisogno di usarlo in più di un controller, a meno che tu non stia dando al tuo utente drasticamente diversi elementi di tipo "canvas" e layout da disegnare anche. Ad ogni modo, penso che alcune buone scelte di Design Pattern siano una fabbrica e / o un decoratore o qualcosa di simile.

Raccogli l'evento dal pulsante fai clic sulla tavolozza delle modalità di interazione (vuoi dire che si tratta di una sorta di tipo di barra di Photoshop / Paint di MS sul lato, giusto?). Usa quell'evento come input per una fabbrica. Questo factory genererà un'istanza di qualcosa che aderisce all'interfaccia "Strumento" (o qualsiasi altra cosa si voglia chiamare). L'istanza dello strumento appena generata è memorizzata nel controller da qualche parte per essere pronta a ricevere l'input del mouse, come ad esempio l'utente disegna.

Se vuoi diventare complesso, ad esempio se alcuni strumenti possono essere scelti contemporaneamente, come un "blocco magnetico" e un "draw", il riferimento del controller a un'istanza che implementa un'interfaccia Tool dovrebbe essere esteso in fase di runtime in qualche modo, come w / un modello Chain Of Responsibility (o un decoratore come accennato in precedenza). Ora la fabbrica menzionata in precedenza farà più di un utensile. Il controller li "allinea tutti" nel caso della catena di comando prima di passare l'input del mouse dell'utente. Ad esempio, l'implementazione "Tool" del blocco magnetico potrebbe modificare leggermente l'input dell'utente per esistere su una linea guida prima di passarla "lungo la catena" allo strumento di disegno.

    
risposta data 17.11.2012 - 11:43
fonte
0

La tua idea è fondamentalmente corretta. Viene anche menzionato nel libro Design Pattern sul pattern State. Il tuo editor ha un oggetto Tool corrente (che implementa un'interfaccia generica dello strumento) e delega tutte le relative interazioni dell'utente (mouseclick, eventi chiave ecc.). Le classi paint tool, selection tool etc. implementeranno l'interfaccia Tool e saranno responsabili della gestione delle sequenze di eventi utente.

public interface Tool {

void HandleKeyboardEvent(...);
void HandleMouseEvent(...);

}

class RectangleTool : Tool { //accumulates drawing state }

Quando cambi uno strumento sarà solo l'attuale oggetto utensile che cambia, il resto della logica nell'interfaccia utente rimane uguale.

Se hai 3 viste ortogonali, puoi avere 3 oggetti utensile o solo uno, a seconda del tuo progetto.

    
risposta data 17.11.2012 - 10:36
fonte

Leggi altre domande sui tag