Erstellen mehrerer interaktiver Ziehpunkte in einer DiagrammboxHallo,
Ich versuche aus einer Tabelle mit zwei Spalten, die X- und Y-Koordinaten definieren, ein Diagrammfeld mit einem interaktiven Griff für jeden in der Tabelle definierten Punkt zu erstellen. Das Hinzufügen von Ziehpunkten nacheinander (siehe nw1 unten) funktioniert einwandfrei, aber wenn ich versuche, den Prozess mithilfe von ForEachRow oder einer For-Schleife (siehe nw2 und nw3) zu automatisieren, bekomme ich eine Diagrammbox mit den Punkten, aber das ist nicht möglich interaktiv bewegt Was wäre der richtige Weg, um die Erstellung der Ziehpunkte zu automatisieren?
Danke, Étienne
dt = NewTable ( "Datenpunkte" , AddRows ( 3 )
NewColumn ( "xVar" Numerisch "Kontinuierlich" , SetValues ([ 1 . 2 . 3 ])),
NewColumn ( "yVar" Numerisch "Kontinuierlich" , SetValues ([ 1 . 2 . 3 ]))
);
CurrentDataTable (dt);
nw1 = Neues Fenster ( "Beispiel 1" .
gr1 = GraphBox (
Rahmengröße( 400 . 400 ) XScale ( 0 . 5 ) YScale ( 0 . 5 )
Griff (: xVar [ 1 ],: yVar [ 1 ],: xVar [ 1 ] = x; : yVar [ 1 ] = y;);
Griff (: xVar [ 2 ],: yVar [ 2 ],: xVar [ 2 ] = x; : yVar [ 2 ] = y;);
Griff (: xVar [ 3 ],: yVar [ 3 ],: xVar [ 3 ] = x; : yVar [ 3 ] = y;);
);
);
nw2 = Neues Fenster ( Beispiel 2 .
gr2 = GraphBox (
Rahmengröße( 400 . 400 ) XScale ( 0 . 5 ) YScale ( 0 . 5 )
Für jede Reihe (
Griff (: xVar,: yVar,: xVar = x;: yVar = y;);
);
);
);
nw3 = Neues Fenster ( Beispiel 3 .
gr3 = GraphBox (
Rahmengröße( 400 . 400 ) XScale ( 0 . 5 ) YScale ( 0 . 5 )
Zum (i = 1 , ich <= NRows (dt), i ++,
Griff (: xVar [i],: yVar [i];: xVar [i] = x;: yVar [i] = y;);
);
);
);
Betreff: Erstellen mehrerer interaktiver Ziehpunkte in einer DiagrammboxVielen Dank @cwillden . Ihre Lösung funktioniert perfekt und ist skalierbar. Es erinnert mich an SAS-Makrocode. Dies ist im Wesentlichen das, was ich hier versucht habe, dh die for-Schleife ausschreiben und dann ausführen.
Betreff: Erstellen mehrerer interaktiver Ziehpunkte in einer DiagrammboxHallo @ rassart .
In diesem Fall müssen Sie die Zeilenwerte Ihrer Tabelle beim Hinzufügen der Ziehpunkte fest codieren. Der Grund dafür wird deutlich, wenn Sie das soeben erstellte Grafikskript aus dem Diagrammfenster aus Ihrem Fenster herausholen. Zum Beispiel sieht das Grafikskript aus Beispiel 3 danach so aus:
gr3 << Get Graphics Script;
/*:
{For( i = 1, i <= N Rows( dt ), i++,
Handle(
:xVar[i],
:yVar[i],
:xVar[i] = x;
:yVar[i] = y;
)
)}Der Endwert der Variablen 'i' wird in Ihrem Beispiel auf 4 festgelegt, sodass keines der Handles ordnungsgemäß funktioniert, da der Wert von 'i' nicht hartcodiert wurde. Ohne Festcodierung verlässt sich das Grafikskript immer auf den aktuellen Wert von 'i'.
So können Sie diese Werte in einer for-Schleife hart codieren:
nw4 = New Window( "Example 4", gr4 = Graph Box( FrameSize( 400, 400 ), X Scale( 0, 5 ), Y Scale( 0, 5 ), ) );
For( i = 1, i <= N Rows( dt ), i++,
Eval( Parse( Eval Insert( "gr4[framebox(1)] << Add Graphics Script(Handle(:xVar[^i^], :yVar[^i^], :xVar[^i^] = x; :yVar[^i^] = y;));" ) ) )
);
Betreff: Erstellen mehrerer interaktiver Ziehpunkte in einer DiagrammboxAnscheinend kann die Handle () - Funktion das Parsen zum Zeitpunkt der Ausführung nicht verarbeiten. Das folgende Skript wird das kompensieren
Current Data Table( dt );
nw1 = New Window( "Example 1",
gr1 = Graph Box(
FrameSize( 400, 400 ),
X Scale( 0, 5 ),
Y Scale( 0, 5 ),
Handle(
:xVar[1],
:yVar[1],
:xVar[1] = x;
:yVar[1] = y;
);
Handle(
:xVar[2],
:yVar[2],
:xVar[2] = x;
:yVar[2] = y;
);
Handle(
:xVar[3],
:yVar[3],
:xVar[3] = x;
:yVar[3] = y;
);
)
);