2012-12-10 11 views

risposta

6

ho iniziato a impazzire con la domanda precedente, cercando di scoprire dinamicamente quali campi erano tavola apparecchiata.

Non ho potuto farlo funzionare ma potrei ottenere (la maggior parte) le proprietà di sola lettura utilizzando la differenza tra i valori di ritorno di set(h) e get(h).

L'unica proprietà che non viene visualizzata qui è la Parent -proprietà che è impostabile ma non dovrebbe essere modificata nella domanda precedente.

Ecco come ho ottenuto le proprietà non impostabili:

h = plot(1:0.2:10); 
xx=get(h) 

close all 
h2 = plot(0); 
settableHandles = set(h2); 
settableNames = fieldnames(settableHandles); 
allHandles = get(h2); 
allNames = fieldnames(allHandles); 

nonSettableHandles = rmfield(allHandles,settableNames); 
nonSettableNames = fieldnames(nonSettableHandles) 

Questo produce una cella di nonSettableNames:

nonSettableNames = 

    'Annotation' 
    'BeingDeleted' 
    'Type' 
+2

Immagino che tu possa ridurre tutto a un solo liner: 'fieldnames (rmfield (get (h), fieldnames (set (h)))'. Abbastanza intelligente, +1. –

+2

@EitanT +1 per l'unico rivestimento! – user1884905

+0

+1 - Non ho mai nemmeno notato che posso ottenere un valore di ritorno da 'set'! – Jonas

2

perché non usare qualcosa di simile

try 
    %// [set property] 

catch ME 
    if ~isempty(regexp(ME.error, 'read only')) 
     continue; 

    else 
     %// [handle other error] 

    end 

end 
+0

Nizza - sono i blocchi try/catch costoso in Matlab? – ccook

+0

copyobj è stato discusso, ma utilizza direttamente il gestore della trama, non le proprietà della trama :) – ccook

+1

Bene, possono * essere * essere, specialmente se usate in un ciclo; la parte 'ME' è una chiamata alla classe' MException', che non è incorporata, quindi qualsiasi ciclo non verrà accelerato da JIT. Ma questo sarà non applicabile quando si utilizzano comunque chiamate esterne. Inoltre, penso che non sia probabile che il tuo 'try ... catch' sarà davvero molto costoso rispetto a tutto il resto. –

Problemi correlati