2012-01-13 10 views
6

Stworzyłem test funkcji [], który również może być testem symbolu, jeśli zajdzie taka potrzeba, i próbuję go zaimplementować w manipulatorze. testy [] wygląda następująco:Kontrolery niestandardowe do manipulowania [] w Mathematica

test[]:=Button["Label",Functionality[]]; 

to zwróci błąd, jeżeli są stosowane bezpośrednio na Manipulacja [], ale działa, jeśli jest opakowane w dynamicznej lub ocenić.

Manipulate[content,test[]]; 

manipulować :: vsform: Manipulowanie testu argumentem [] Nie ma prawidłową postać do specyfikacji zmiennej.

Manipulate[content,Dynamic[test[]]] 

Ten działa

Manipulate[content,Evaluate[test]] 

pamiętać, że to działa, test nie jest funkcją

Manipulate[content,Evaluate[test[]]] 

To działa na moim Mac, ale nie mój komputer w pracy. ..

Myślę, że kwestia ma coś wspólnego z Manipulate będącym H oldAll, ale nie rozumiem, dlaczego Dynamic [] powinien to naprawić. Ponadto funkcja Ocena [] działa tylko przez pewien czas.

Dlaczego więc konieczne jest ustawienie Dynamic [] lub Evaluate []? Patrząc w sekcji niestandardowych kontrolerów zaawansowanego samouczka obsługi, nie widzę żadnych odniesień do tego problemu i nie mogłem znaleźć gdzie indziej.

+3

Czy możesz zamieścić pełny, samodzielny działający kod, który można skopiować i wkleić? w tym wszystkie definicje, które tam pokazujesz? zrobić mały przykład, który pokazuje problem. Pokazanie jednej linii tu i tam z symbolami, które nie są zdefiniowane, sprawia, że ​​trudno ci pomóc. Nie rozumiem, jak to, co mówisz, pracowało dla ciebie, może faktycznie działać. Ale nie pokazałeś całego kodu, więc może być coś jeszcze. – Nasser

Odpowiedz

8

Możesz wstawić Button zamiast używać oddzielnej funkcji test[]. W przeciwnym razie, ostatni przykład, Manipulate[content,Evaluate[test[]]], powoduje, że wyświetla przycisk na moim komputerze w Mathematica 8. Nie powinno być różnicy między platformami (Windows lub Mac).

Jeśli robisz coś wystarczająco różniącego się od tego, co domyślnie oferuje Manipulate, możesz wygodniej zbudować go od podstaw, używając Dynamic (zwykle to robię).


Oto przykład, jak dołączyć niektóre przyciski jako kontrolerów.

Najpierw należy skonfigurować coś pokazać wewnątrz Manipulate:

rotate90[{x_, y_}] := {-y, x} 

koch[p1_, p2_, n_] := {koch[p1, p1 + (p2 - p1)/3, n - 1], 
    koch[p1 + (p2 - p1)/3, (p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
    n - 1], koch[(p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
    p2 - (p2 - p1)/3, n - 1], koch[p2 - (p2 - p1)/3, p2, n - 1]} 

koch[p1_, p2_, 0] := Line[{p1, p2}] 

snowflake[n_] := 
Graphics[{koch[{0, 0}, {1, 0}, n], 
    koch[{1, 0}, {1/2, -Sqrt[3]/2}, n], 
    koch[{1/2, -Sqrt[3]/2}, {0, 0}, n]}] 

Następnie skonfigurować Manipulate się:

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
Style["A Koch snowflake", Bold], Delimiter, 
Row[{Button["+", n++], Button["-", n = Max[n - 1, 0]]}]] 

Mathematica graphics


Oto przykład pokazujący, że ta działa nawet jeśli Button jest określona w odrębnej funkcji:

SetAttributes[paletteButton, HoldRest] 
paletteButton[name_, func_] := 
Button[name, func, Appearance -> "Palette"] 

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
Style["A Koch snowflake", Bold], Delimiter, 
[email protected]["+", n++]] 

Jak wspomniano w pytaniu, tutaj jest to konieczne, by zakończyć funkcję w Evaluate uzyskanie inlined Button.W przeciwnym razie Manipulate nie będzie w stanie zauważyć, że to, co mamy tutaj, jest zmienną , a nie zmienną zmienną .