2012-12-10 10 views

Odpowiedz

6

zacząłem syf wokół z poprzedniego pytania, starając się dynamicznie dowiedzieć się, które pola były możliwe do ustawienia.

Nie dość zmusić go do pracy, ale mogę zdobyć (większość) tylko do odczytu właściwości za pomocą różnicy między wartościami powrotnymi set(h) i get(h).

Jedyną właściwością, która się tutaj nie pojawia, jest właściwość Parent, którą można ustawić, ale nie powinna być zmieniana w poprzednim pytaniu.

Oto jak Dostałem zakaz ustawialne właściwości:

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) 

ten wytwarza komórkę nonSettableNames:

nonSettableNames = 

    'Annotation' 
    'BeingDeleted' 
    'Type' 
+2

Zgaduję, że możesz zredukować wszystko do jednej linijki: 'fieldnames (rmfield (get (h), fieldnames (set (h))))'. Bardzo sprytny, +1. –

+2

@EitanT +1 dla jednej linijki! – user1884905

+0

+1 - Nigdy nie zauważyłem, że mogę uzyskać wartość zwracaną z 'set'! – Jonas

2

dlaczego nie użyć czegoś jak

try 
    %// [set property] 

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

    else 
     %// [handle other error] 

    end 

end 
+0

Nicea - są bloki try/catch drogie w Matlab? – ccook

+0

copyobj zostało omówione, ale używa bezpośrednio obsługi wydruku, a nie właściwości wydruku :) – ccook

+1

Cóż, one * mogą * być, zwłaszcza gdy są używane w pętli; część 'ME' jest wywołaniem klasy' MException', która nie jest wbudowana, więc żadna pętla nie zostanie przyspieszona przez JIT. Nie będzie to jednak miało zastosowania, mimo że korzystasz z połączeń zewnętrznych. Poza tym - myślę, że nie jest prawdopodobne, że twój "try ... catch" będzie naprawdę bardzo drogi w porównaniu do reszty. –

Powiązane problemy