2012-12-10 27 views

回答

6

我開始淤泥與周圍的前一個問題,試圖動態找出哪些領域是設定。

我並沒有完全使用它,但是我可以通過使用返回值set(h)get(h)之間的差異來獲得(大部分)只讀屬性。

這裏沒有顯示的唯一屬性是Parent-屬性,可以設置但不應在上一個問題中更改。

這裏是我得到了無法設定的屬性:

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) 

由此產生的nonSettableNames細胞:

nonSettableNames = 

    'Annotation' 
    'BeingDeleted' 
    'Type' 
+2

我想你可以把所有事情都減少到一行:'fieldnames(rmfield(get(h),fieldnames(set(h))))''。非常聰明,+1。 –

+2

@EitanT +1爲單行! – user1884905

+0

+1 - 我從來沒有注意到我可以從'set'獲得返回值! – Jonas

2

爲什麼不使用類似

try 
    %// [set property] 

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

    else 
     %// [handle other error] 

    end 

end 
+0

尼斯 - 是try/catch塊貴在Matlab? – ccook

+0

copyobj已被討論過,但它直接使用繪圖處理程序,而不是繪圖屬性:) – ccook

+1

好吧,它們*可以*,特別是在循環中使用時; 'ME'部分是對'MException'類的調用,它是非內建的,所以任何循環都不會被JIT加速。但是,當你使用外部呼叫時,這將是不適用的。除此之外 - 我認爲與其他所有人相比,你的'try ... catch'確實是非常昂貴的。 –