WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

uitree oder anderer treeview mit struct?

 

Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2010, 09:33     Titel: uitree oder anderer treeview mit struct?
  Antworten mit Zitat      
Ich brauche dringend Hilfe:

Ich habe mal wieder ein struct wie dieses:

Peter.Pinkelt.Pinke.Cola
Peter.Pinkelt.Pinke.Fanta
Peter.Pinkelt.Nicht
Peter.Pinkelt.Nicht.Mehr

Jedenfalls würde ich die struct gerne in einem treeview anzeigen...
Seit Monaten höre ich in dem Zusammenhang man solle uitree nutzen...
Aber wie? Für Verzeichnisse oder Models ist das kein Problem, aber struct werden -denke ich- nicht standardmäßig unterstützt...

Man muss denke ich in der uitree.m in der processNode Funktion eine weitere Fall abfrage mit isstruct durchführen...aber wie wird dann der node gebildet?

Ein Beispiel wäre dringend notwendig...

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.04.2010, 13:10     Titel:
  Antworten mit Zitat      
Hallo Zenon

das ist undokumentierte Funktion, Beispiel kannst nur direkt in UITREE finden
Code:

% statt help mit edit aufrufen
edit uitree
 


Habe für dich aber auch Beispiel Funktion erstellt:
Code:

function create_struct_tree(S)
var_name = inputname(1);
assignin('base',var_name,S);
root = uitreenode('v0', var_name, var_name, [], false);
uitree('v0', 'Root', root, 'ExpandFcn', @myExpfcn, ...
   'SelectionChangeFcn', 'disp(''Selection Changed'')');



function nodes = myExpfcn(tree, value)


if evalin('base',sprintf('isstruct([%s])',value))
   fnames = evalin('base',sprintf('fieldnames(%s)',value));
   for count=1:length(fnames)
      nodes(count) = uitreenode('v0',[value,'.', fnames{count}], ...
         fnames{count}, [], false);
   end
else
   nodes = [];
end

 




Aufruf:
Code:

Peter.Trinkt.Pinke(1).Getraenk = 'Cola' ;
Peter.Trinkt.Pinke(2).Getraenk = 'Fanta';
Peter.Trinkt.Nicht(1).Getraenk = 'Cola' ;
Peter.Trinkt.Nicht(2).Getraenk = 'Fanta';
create_struct_tree(Peter)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2010, 14:30     Titel:
  Antworten mit Zitat      
Danke denny, das hat mir sehr geholfen.

Musste ein bissel ändern damit es funktionierte, aber dank Dir klappt es jetzt...(Erleichterung macht sich breit)...

Code:

function create_struct_tree(S)
var_name = inputname(1);
assignin('base',var_name,S);
root = uitreenode(var_name, var_name, [], false);
uitree(gcf, 'Root', root, 'ExpandFcn', @myExpfcn, ...
   'SelectionChangeFcn', 'disp(''Selection Changed'')');
 

bzw.
Code:

function nodes = myExpfcn(tree, value)
if evalin('base',sprintf('isstruct([%s])',value))
   fnames = evalin('base',sprintf('fieldnames(%s)',value));
   for count=1:length(fnames)
      nodes(count) = uitreenode([value,'.', fnames{count}], ...
         fnames{count}, [], false);
   end
else
   nodes = [];
end
 


Kannst Du mir erklären warum assignin und evalin genutzt werden müssen?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.04.2010, 15:00     Titel:
  Antworten mit Zitat      
Na ja, musste irgendwie auf Struktur zu greifen,
hatte keine bessere Idee dazu
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2010, 10:00     Titel:
  Antworten mit Zitat      
Also ich habs jetzt auch ohne evalin und assignin hinbekommen...

Code:

function create_struct_tree(DataStructure,handles)
struct_name = inputname(1);
root = uitreenode(struct_name, 'ERGEBNIS', [], false);
handles.struct_tree = uitree( 'Root', root, 'ExpandFcn', {@struct_tree_Expfcn,DataStructure}, ...
   'SelectionChangeFcn', 'disp(''Selection Changed'')','Position', [0 0 200 560]);
 



Code:

function nodes = struct_tree_Expfcn(tree, value,DataStructure)
if eval(sprintf('isstruct([%s])',value))
   fnames = eval(sprintf('fieldnames(%s)',value));
   for count=1:length(fnames)
      nodes(count) = uitreenode([value,'.', fnames{count}], ...
         fnames{count}, [], eval(sprintf('~isstruct([%s.%s])',value,fnames{count})));
   end
else
   nodes = [];
end
 


Allerdings muss es jetzt mit einer Variable Namens DataStructure gecallt werden:

Code:

create_struct_tree(DataStructure,handles);
 


Sonst kommt folgender Fehler:

Zitat:

No constructor com.mathworks.hg.peer.UITreeNode with matching signature found

Error in ==> uitreenode at 72
node = handle(UITreeNode(value, string, icon, isLeaf));

Error in ==> create_struct_tree at 1496
root = uitreenode(DataStructure, 'ERGEBNIS', [], false);


Warum ist das so...ich würde das echt gerne verstehen...

Gruß,
Zenon
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.04.2010, 11:04     Titel:
  Antworten mit Zitat      
Hallo,

das liegt an dieser Zeile, daraus ich bekomme, wie meine übergegebene Struktur heißt. l
Code:

struct_name = inputname(1);
 


Wenn du also übergibst:
Code:

create_struct_tree(DataStructure,handles);
 


Dann nimmt struct_name = 'DataStructure' an
und später bei EVAL sind dann der String so aus:

Code:

 fnames = eval('DataStructure');
 

Deswegen muss bei dir dann deine Struktur genau so heißen,
also damit es unabhängig muss du nur 2 Stellen verändern.

so sollte es mit deinen Bedürfnisse funktionieren, aufpassen habe einwenig die Namen von Funktionen verändert.

Code:

function create_struct_tree(S,handles)
root = uitreenode('v0', 'S', 'ERGEBNIS', [], false);
handles.struct_tree = uitree('v0','Root', root, 'ExpandFcn', {@struct_tree_expfcn,S}, ...
   'SelectionChangeFcn', 'disp(''Selection Changed'')');



function nodes = struct_tree_expfcn(tree, value,S)
if eval(sprintf('isstruct([%s])',value))
   fnames = eval(sprintf('fieldnames(%s)',value));
   for count=1:length(fnames)
      nodes(count) = uitreenode('v0',[value,'.', fnames{count}], ...
         fnames{count}, [], eval(sprintf('~isstruct([%s.%s])',value,fnames{count})));
   end
else
   nodes = [];
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2010, 14:46     Titel:
  Antworten mit Zitat      
Erstmal vielen Dank für Deine Erklärung, hatte zwar noch keine Zeit es auszuprobieren, aber ich denke ich habe erstmal verstanden...

Allerdings gibts jetzt ein neues Problem...die SelectionChangeFcn.

Eine anzugeben und aufrufen zu lassen ist natürlich kein Problem. Aber wie komme ich innerhalb dieser Funktion an die Daten?

Wühle mich im Augenblick per get durch die Properties, finde aber nicht was ich suche.

WIE KANN ICH IN DER SelectionChangeFcn an den Inhalt des entsprechenden Datensatzes , also 'Cola' kommen?

Code:

Peter.Trinkt.Pinke.Getraenk = 'Cola';
 


Vielleicht kannst Du mir da noch den entscheidenden Tipp geben...jetzt wo Du mir schon so weit geholfen hast Wink

Danke Dir!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.04.2010, 16:15     Titel:
  Antworten mit Zitat      
Hallo Zenon

so vielleicht:
Code:


function create_struct_tree(S,handles)
root = uitreenode('v0', 'S', 'ERGEBNIS', [], false);
handles.struct_tree = uitree('v0','Root', root, 'ExpandFcn', {@struct_tree_expfcn,S}, ...
   'SelectionChangeFcn', {@struct_tree_selfcn,S} );



function nodes = struct_tree_expfcn(tree, value,S)
if eval(sprintf('isstruct([%s])',value))
   fnames = eval(sprintf('fieldnames(%s)',value));
   for count=1:length(fnames)
      nodes(count) = uitreenode('v0',[value,'.', fnames{count}], ...
         fnames{count}, [], eval(sprintf('~isstruct([%s.%s])',value,fnames{count})));
   end
else
   nodes = [];
end

function struct_tree_selfcn(tree, event, S)

value =  event.getCurrentNode.getValue;

if eval(sprintf('~isstruct([%s])',value))
  Res = eval(sprintf('{%s}',value));
  for k=1:length(Res)
     fprintf('%s = %s\n', value,Res{k})
  end
  fprintf('\n');
end
 


arbeite auch mit methods und methodsview, da kannst du dir mögliche Methoden anschauen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2010, 17:34     Titel:
  Antworten mit Zitat      
Danke für Deine Hilfe, arbeite zunächst einmal so:

Code:

nodePath = get(get(get(tree,'Tree'),'AnchorSelectionPath'),'Path');
 


Ich komm damit ans Ziel...ist aber nicht so elegant...werde Deins mal ausprobieren...
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 10.09.2010, 12:09     Titel:
  Antworten mit Zitat      
Hallo,

schön, dass mit diesen Beiträgen endlich eine Lösung für ein Thema vorgeschlagen wird, dass in diesem Forum schon in mehreren Beiträgen andiskutiert, aber nie richtig gelöst wurde.

Begeistert habe ich mit dem Vorschlag der obigen Funktionen herumgespielt und auch versucht, den Quellcode nachzuvollziehen.

Leider führt bei meinem struct, der in verschiedenen Ebenen Arrays enthält (MeinStrukt(1:x).Unterstrukt ...) die Funktion fieldnames(MeinStrukt) zu einem Error. Mir fehlen allerdings die informatischen Fertigkeiten, dieses Problem in die Unterfunktion einzubauen. Daher meine Frage an Zenon oder andere pfiffige Programmierer:
Wie muss ich die Unterfunktion umschreiben, damit die Funktion fieldnames() ein oder alle Elemente einer Liste beachtet und zu keinem Fehler führt?

Anmerkung: Meine unterschiedlichen Unterelemente haben die gleiche Struktur. Daher würde zur Veranschaulichung der Struktur eine Lösung mit nur einem Element erst mal reichen:
Code:

MeinStrukt(1).Unterstrukt.UUstrukt = struct();
MeinStrukt(2).Unterstrukt.UUstrukt = struct();
% Diese Abfrage führt zu einem Fehler:
fieldnames(MeinStrukt.Unterstrukt)
 


Der Fehler lautet:
"??? Error using ==> fieldnames
Too many input arguments."

Händisch ist das ganze für gleiche Unterstruktur mit der Abfrage nur eines Elements möglich:
Code:

fieldnames(MeinStrukt(1).Unterstrukt)
 


Vielen Dank für Hinweise oder Lösungsansätze,
MFG, Germanus[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.09.2010, 17:31     Titel:
  Antworten mit Zitat      
Hallo

einfach in die eckigen Klammer setzen.
Code:

fieldnames([MeinStrukt.Unterstrukt])
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 13.09.2010, 13:31     Titel:
  Antworten mit Zitat      
Hallo,

merci für den Hinweis mit den eckigen Klammern. Bei mehrfacher Verzweigung funktioniert die Funktion fieldnames() allerdings auch mit eckigen Klammern nicht. Es erscheint der Fehler:
"??? Dot name reference on non-scalar structure.".

Hier das Minimalbeispiel:
Code:

% Zuordnung:
A(1).B(1).C.D=1100;
A(1).B(2).C.D=1200;
A(2).B(1).C.D=2100;
A(2).B(2).C.D=2200;

% Gültige Ausgaben:
fieldnames([A])
fieldnames([A.B])
 


Soweit, so gut, aber wenn die zweite Verzweigung ins Spiel kommt, dann streikt fieldnames():

Code:

% Nicht-mögliche Ausgabe:
fieldnames([A.B.C])
 


Manuell ließe sich dies umgehen, indem das mehrdimensionale struct auf eine Liste reduziert wird (1.1->1; 1.2->2; 2.1->3; 2.2->4 usw.):

Code:

temp = [A.B]
fieldnames(temp)
 


Allerdings sehe ich nicht, wie ich diesen unschönen Trick in der obigen (Unter-)Funktion zur visuellen Ausgabe des structs implementieren kann.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.09.2010, 14:46     Titel:
  Antworten mit Zitat      
Hallo

versuch folgenden Code:
Code:

function create_struct_tree(S,handles)
root = uitreenode('v0', 'S', inputname(1), [], false);
handles.struct_tree = uitree('v0','Root', root, 'ExpandFcn', {@struct_tree_expfcn,S}, ...
   'SelectionChangeFcn', {@struct_tree_selfcn,S} );



function nodes = struct_tree_expfcn(tree, value,S)
if eval(sprintf('isstruct([%s])',value))
   count=1;
   for k=1:eval(sprintf('length([%s])',value))
      fnames = eval(sprintf('fieldnames(%s(%d))',value,k));
      for l=1:length(fnames)        
         nodes(count) = uitreenode(...
            'v0',...
            sprintf('%s(%d).%s',value,k,fnames{l}), ...
            sprintf('%s(%d)',fnames{l},k),...
            [],...
            eval(sprintf('~isstruct(%s(%d).%s)',value,k,fnames{l})));
         count = count+1;
      end
   end
else
   nodes = [];
end

function struct_tree_selfcn(tree, event, S)

value =  event.getCurrentNode.getValue;

if eval(sprintf('~isstruct([%s])',value))
  Res = eval(sprintf('{%s}',value));
  for k=1:length(Res)
     if iscellstr(Res)
         fprintf('%s = %s\n', value,Res{k})
     else
         fprintf('%s = %d\n', value,Res{k})
     end
  end
  fprintf('\n');
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 20.07.2011, 08:38     Titel:
  Antworten mit Zitat      
Hallo liebe Mitlesende,

inzwischen habe ich den Code von Denny noch erweitert, um einen vorhandenen Fehler zu entfernen. Bei mehreren Instanzen eines Unterobjekts ist die Auflistung in die Unter-Unter-Gruppe gerutscht. Zur Veranschaulichung nehme man z.B. eine Struktur mit mehreren Ebenen. In der Zweiten Ebene gibt es mehrere "Objekte" (A,B,C) und von diesen mehrere "Instanzen" (B(1), B(2), ...., B(5))

Code:

clear, T.A.Wert = 11; T.B(5).Wert = 25; T.C(1).Wert = 31;  T.C(3).Wert = 33; T.D(1).Wert(1) = 4111; T.D(1).Wert(2) = 4121; T.D(2).Wert(3) = 4231;
 


Im Vorschlag von Denny muss folgende Funktion ersetzt werden.

Code:

function nodes = struct_tree_expfcn(tree, value, S)
if eval(sprintf('isstruct([%s])',value)) % Wenn die Variable ein Struct ist
   nodeIdcs = eval(sprintf('length([%s])',value));
   if nodeIdcs==1 % Wenn direkt die nächst-niedrieger Ebene folgen soll
      nodeNames = eval(sprintf('fieldnames(%s)',value)); % cellarray mit feldernamen
      for nodeIdx = 1:length(nodeNames) % Unterstruktur
         % Erstellen des jeweiligen Unterknotens:
         nodes(nodeIdx) = uitreenode(...
            'v0',...
            sprintf('%s.%s',value,nodeNames{nodeIdx}), ...
            sprintf('%s',nodeNames{nodeIdx}),...
            [],...
            eval(sprintf('~isstruct(%s.%s)',value,nodeNames{nodeIdx})));
      end
   elseif nodeIdcs > 1 % Wenn die Instanzen in einem Sammler gebündelt werden sollen
      for nodeIdx = 1:eval(sprintf('length([%s])',value))
         nodes(nodeIdx) = uitreenode(...
            'v0',...
            sprintf('%s(%d)',value,nodeIdx), ...
            sprintf('%s(%d)',name_substruct_extr(value),nodeIdx),...
            [],...
            eval(sprintf('~isstruct(%s(%d))',value,nodeIdx)));
      end
   end
else
   nodes = [];
end
 


Man benötigt nun noch folgende Unterfunktion:

Code:

function sname = name_substruct_extr(name)

pos = findstr(name,'.');
sname = name(pos(end)+1:end);
 


In der obigen Funktion werden aus Übersichtlichkeitsgründen mehrere "Instanzen" eines Objekts in dessen "Objektsammler" gebündelt. D.h. der Baum zeigt dann "T-- +A -- +A(1) -- Wert" statt "T -- +A(1) -- Wert".

Für Neulinge noch ein paar Informationen zum Verständnis bzw. zum Ausprobieren, wenn man selbst den Code verändern möchte:

(A)
"struct_tree_expfcn" ist eine Callback-Funktion. Callbackfunktionen gibt es bei GUI's. In ihnen wird definiert, welche Reaktion auf ein Ereignis passieren soll. Das Ereignis ist der Mausklick auf einen Knoten im Fenster des Baumes. Wurde der Knoten bisher noch nicht angeklickt, so wird in der Callback-Funktion ein Unterknoten erstellt. Anders gesagt erstellt die Funktion also keinen vollständigen Baum im Voraus, durchsucht also nicht die gesamte Struktur, sondern reagiert nur auf Interaktion und wird dann tätig.

(B)
Will man nun den Code durch debuggen verstehen, so muss man die berühmten Käfer (Haltepunkte) setzen UND dann ein Ereignis auslösen, damit die Callback-Fcn aufgerufen wird - ALSO einen Knotenpunkt expandieren (aufs plus-Zeichen klicken).

(C)
Noch eine Anmerkung zur uitreenode-Fkt. Die Argumente lauten: 1.) Fehlerunterdrückung, 2.) Pfad des Knotens, 3.) Anzeigenahme des Knotens im Fenster, 4.) Pfad zu einem Symbol des Knotens, 5.) ???.


Folgende offene Fragen habe ich selbst noch:

(1)
In der Konsole erscheint beim Anklicken des Astendes eine Ausgabe, sie beginnt mit "S." und nicht mit dem Namen des Structs

(2)
Bei der Ausgabe der Variablen, die am niedrigsten Punkt eines Baumes hängt, kommt es zu Problemen. Im obigen Beispiel ist das T. ... . ... .Wert. Ist es ein einzelner Wert, so ist alles O.K.. Ist "Wert" ein Vektor, so wird in der Matlab-Konsole Müll angezeigt, geschweigedenn bei Cells etc.

Viel Spaß und Danke für Rückmeldungen,
Germanus
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.07.2011, 10:30     Titel:
  Antworten mit Zitat      
Hallo Germanus,

Es freut mich sehr, dass du den Code weiter ausbaust.
zu Frage (1):
Es liegt daran, dass in Callbacks (wie ExpandFcn und SelectionChangeFcn) der Strukturname fest ist. Da muss der Strukturname in Callbacks den Rootnamen annehmen. (siehe dazu den beigefügten Code):

zu Frage(2)
Da muss man die Ausgaben in SelectionChangeFcn erweitern. Dazu hab ich den Code einwenig verändert
(siehe dazu auch den den beigefügten Code)
Code:

%-----------------------------   struct_tree_expfcn   --------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function create_struct_tree(S,handles)
root = uitreenode('v0', inputname(1), inputname(1), [], false);
handles.struct_tree = uitree('v0','Root', root, ...
   'ExpandFcn'         , {@struct_tree_expfcn,S,inputname(1)}, ...
   'SelectionChangeFcn', {@struct_tree_selfcn,S,inputname(1)} );




%-----------------------------   struct_tree_expfcn   --------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function nodes = struct_tree_expfcn(tree, value, S,rootname)
eval(sprintf('%s=S;',rootname));
if eval(sprintf('isstruct([%s])',value)) % Wenn die Variable ein Struct ist
   nodeIdcs = eval(sprintf('length([%s])',value));
   if nodeIdcs==1 % Wenn direkt die nächst-niedrieger Ebene folgen soll
      nodeNames = eval(sprintf('fieldnames(%s)',value)); % cellarray mit feldernamen
      for nodeIdx = 1:length(nodeNames) % Unterstruktur
         % Erstellen des jeweiligen Unterknotens:
         nodes(nodeIdx) = uitreenode(...
            'v0',...
            sprintf('%s.%s',value,nodeNames{nodeIdx}), ...
            sprintf('%s',nodeNames{nodeIdx}),...
            [],...
            eval(sprintf('~isstruct(%s.%s)',value,nodeNames{nodeIdx})));
      end
   elseif nodeIdcs > 1 % Wenn die Instanzen in einem Sammler gebündelt werden sollen
      for nodeIdx = 1:eval(sprintf('length([%s])',value))
         nodes(nodeIdx) = uitreenode(...
            'v0',...
            sprintf('%s(%d)',value,nodeIdx), ...
            sprintf('%s(%d)',name_substruct_extr(value),nodeIdx),...
            [],...
            eval(sprintf('~isstruct(%s(%d))',value,nodeIdx)));
      end
   end
else
   nodes = [];
end
%----------------------------   name_substruct_extr   --------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function sname = name_substruct_extr(name)

pos   = strfind(name,'.');
sname = name(pos(end)+1:end);
%-----------------------------   struct_tree_selfcn   --------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function struct_tree_selfcn(tree, event, S,rootname)
eval(sprintf('%s=S;',rootname));
value =  event.getCurrentNode.getValue;
if eval(sprintf('~isstruct([%s])',value))
   Res = eval(sprintf('{%s}',value));
   for k=1:length(Res)
      switch class(Res{k})
         case 'cell'
            if iscellstr(Res{k})
               num_res = Res{k};
               num_res = sprintf('%s\t',num_res{:});
               fprintf('%s = {%s}\n', value,num_res);
            else
               num_res = Res{k};
               num_res = sprintf('%d\t',num_res{:});
               fprintf('%s = {%s}\n', value,num_res);
            end
         case 'double'
            num_res = sprintf('%d\t',Res{k});
            fprintf('%s = [%s]\n', value,num_res)
         case 'char'
            num_res = sprintf('%c',Res{k});
            fprintf('%s = [%s]\n', value,num_res)
      end
   end
   fprintf('\n');
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.