Skocz do zawartości

Sterowanie myszą


3dsmaxman

Rekomendowane odpowiedzi

Witam! Chcę napisać prosty skrypt, który będzie wychwytywał zmianę położenia myszy na ekranie i obracał obiekt (narazie Box01 ^^)

 

Oto on:

 

mousex = mouse.screenpos.x
mousex = mouse.screenpos.x
mousey = mouse.screenpos.y
currentmx = mouse.screenpos.x
currentmy = mouse.screenpos.y

rbut = true
(select $'Box01')

while rbut do
(
   rbut = !rButton    

   currentmx = mouse.screenpos.x
   currentmy = mouse.screenpos.y

   if currentmx     (
       while currentmx         (
           in coordsys local rotate $ (angleaxis 1 [0, 0, 1])
           mousex -= 1
       )
   )
   if currentmx > mousex+3 then
   (
       while currentmx         (
           in coordsys local rotate $ (angleaxis 1 [0, 0, 1])
           mousex += 1
       )
   )
)

Mam pierwszy problem: program sygnalizuje mi błąd w linijce z rbut = !rButton. Dlaczego?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 5
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

nie jestem pewien jak w skrypcie maxowym

ale msyle ze powinno byc

rbut true (ze zawsze i ze wymuszone) i obsluga co sie dzieje jesli jednak nie (czyli wyjescie ze skryptu);

 

wzglednie ustaw na dwa przycisniecia-pierwsze inicjalizuje a drugie upuszcza... sprawdz czy przerwanie dla klawisza jest stale przechwytywane (jakos tale wcisneicie) czy jako kontrola (czy wcisniety)...

 

edit:

robilem keidys cos innego pod przyciski w innym skrypcie i tez mailem na tym potkniecie... dlatego proponuje sprawdzic jak jest wymuszenie klawisza.. bo jesli najpierw definiujesz ze jest true a pozneij sprawdzasz bez obslugi wyjatku if false (if false tez dawalem true, tyle ze funkcja sie nei chiala wylaczyc :) )

Odnośnik do komentarza
Udostępnij na innych stronach

O ile dobrze pamietam to negacje w max scripcie robi sie przy pomocy not a nie wykrzyknika.

Jak to zmienisz, to max script wypisze Ci ze zmienna rButton jest undefined. To dlatego ze nie jest to zmienna globalna w maxie ale w lokalna w toolu. Zobacz w helpie rozdzial Mouse Tool Clauses. Zeby zrobic to obracanie obiektu musisz napisac wlasnego toola i dodac obsluge interesujacych cie eventow, w tym przypadku mouseMove. W ciele toola zmienna rButton bedzie juz widoczna i zainicjalizowana w zaleznosci od stanu przyciskow myszy.

Odnośnik do komentarza
Udostępnij na innych stronach

Po pewnym czasie już do tego doszedłem :)

Teraz mam gdzieś błąd nawiasowania (MaxScript oczekuje "while" czy coś takiego).

 

Oto obecny kod:

mousex = mouse.screenpos.x
 mousey = mouse.screenpos.y
 currentmx = mouse.screenpos.x
 currentmy = mouse.screenpos.y

 setSysCur #rotate

 rollout mywin "STEROWANIE FRANUC"
 (
      group  "Sterowanie"
      (
          radiobuttons but "Mysz (x)" pos:[20,20] labels:#("body1","natryskiwacz","body2","przeciwwaga","ramie2")
          button run "Uruchom!" pos:[20,50] width:60 height:30
      )
      -- ZMIENNE PRZECHOWUJĄCE KĄTY OBIEKTÓW
      global body1rot = 0
      global przecrot = 0
      global body2rot = 0
      global mojeramierot = 0
      global ramie2rot = 0
      global natrrot = 0
      global butstate = 0

      --NARZĘDZIA MYSZY--
 tool mousemvx
 (
      on mouseAbort click do
          #stop

      on freeMove do
      (
          currentmx = mouse.screenpos.x

          if currentmx                 while currentmx                 (
                    in coordsys local rotate $ (angleaxis 1 [0,0,1])
                    mousex -= 1
               )
          if currentmx > mousex+3 then
               while currentmx > mousex do
               (
                    in coordsys local rotate $ (angleaxis -1 [0,0,1])
                    mousex += 1
               )
      )    
 )
 tool mousemvy
 (
      on mouseAbort click do
          #stop

      on freeMove do
      (
          currentmy = mouse.screenpos.y

          if currentmy                 while currentmy                 (
                    in coordsys local rotate $ (angleaxis 1 [0,1,0])

                    if butstate == 3 do
                    (
                        (select $'moje_ramie')
                        in coordsys local rotate $ (angleaxis 1 [1,0,0])
                        (select $'body2)
                    )

                    mousey -= 1
               )
          if currentmy > mousey+3 then
               while currentmy > mousey do
               (
                    in coordsys local rotate $ (angleaxis -1 [0,1,0])

                    if butstate == 3 do
                    (
                        (select $'moje_ramie')
                        in coordsys local rotate $ (angleaxis -1 [1,0,0])
                        (select $'body2)
                    )

                    mousey += 1
               )
      )    
 )

 --PRZYCISK "URUCHOM"
      on run pressed do
      (
          butstate = but.state

          case butstate of
          (
               1: (select $'body1')
               2: (select $'Box01')
               3: (select $'body2')
               4: (select $'przeciwwaga')
               5: (select $'ramie2')
          )

          if butstate == 1 or butstate == 3 then
               startTool mousemvy
          else
               startTool mousemvx

          ---------------------------------------         
          on body2g pressed do
          (
               (select $'moje_ramie')
               in coordsys local rotate $ (angleaxis 1 [1, 0, 0])
               (select $'body2')
               in coordsys local rotate $ (angleaxis 1 [0,1,0])
          )
      )
 )
 CreateDialog mywin width:200 height:190   pos:[620,25]

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności