Listbox vil ikke holde på string, til tross for parameter

Max scripts

Moderatorer: Super Moderatorer, Admins


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Listbox vil ikke holde på string, til tross for parameter

Legg innav hardrock_ram » lør 22 okt, 2011

Når jeg skriver custom attributes til objekter, så må spinnere, slidere ol. kobles til et parameter for at verdien skal kunne animeres og taes vare på.

Jeg skal fylle objekter i en listbox (som skal ha strings såvidt jeg har skjønt), og tenkte dermed at jeg måtte assosiere denne med et parameter av typen #stringTab. Problemet er at det ikke ser ut til å fungere. Listbox fylles opp når jeg bruker pickbutton til å velge objekter, men den tar ikke vare på dem i lista

slik er det satt opp:

parameterblokk
(
param_A type:#stringTab tabSize:1 tabSizeVariable:true ui: listBox_A
)

rollout
(
multiListbox listBox_A height:10 items:#()
)

Hva er feil?
Og er det noen måte å assosiere items i listbox med objekter\noder direkte, slik at jeg slipper å hele tiden gjøre dem om til og fra string?
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 23 okt, 2011

Listbox tar bare string som item input, så du må selv mekke et node array som du oppdaterer hver gang listboxen endres (Følg med Tassel! :D). Du bruker indexene du får fra listboxen til å gjøre dette. Basically så kan du gjøre det samme med param_A også.
Men det er ikke lett for meg å si hva som kan være galt mtp. det første spørsmålet ditt uten å se resten av koden din.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet
http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 okt, 2011

her er koden så langt:

CA = attributes CTRL_LOD
(
--VARIABLER OG ARRAYS:
local Array_LOD_L = #() --Array for low geometri


parameters CTRL_LOD_Parameters rollout: CTRL_LOD_Rollout
(
LOD_L type:#stringTab tabSize:1 tabSizeVariable:true ui: MLB_LOD_L
)

rollout CTRL_LOD_Rollout "Geometri Level of Detail"
(
group "Low Detail Geometri"
(
multiListbox MLB_LOD_L height:10 items:#()
spinner Spn_LOD_L_ViewPortIterations "Viewport iterations" type:#integer range:[0,10,0] fieldWidth:20
spinner Spn_LOD_L_RenderIterations "Render iterations" type:#integer range:[0,10,0] fieldWidth:20
pickButton pBtn_LOD_L_Add "Add to low detail list"
button Btn_LOD_L_Remove "Remove from low detail list"
)

on pBtn_LOD_L_Add picked obj do
(
append Array_LOD_L (obj.name as string)
MLB_LOD_L.items = Array_LOD_L
)
)
)
if your not living on a killing ground, you better make your own


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 okt, 2011

Det kommer ingen feilmeldinger. jeg har også prøvd litt diverse utover den nåværende koden, men uansett hva jeg gjør, så vil den ikke tar vare på strings. jeg ser for eks. at det blir litt feil oppsett når det gjelder arrayet, for dette vil jo tømmes når jeg åpner fila en annen gang. Koden over er derfor et punkt jeg har lagret uten for mye "kluss", uten at jeg forventer at den skal fungere slik den er nå heller ...
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 23 okt, 2011

Så litt på det nå og det virker som om lista redrawes fra scratch hver gang man går inn i modifier-tabben, så det kan virke som det er en bug i maxscript. Hele poenget med å connecte en ui-komponent til en attributt er jo at man skal slippe å oppdatere ui-elementene selv : P. Løsninga er å refreshe lista fra custom attributen LOD_L manuelt.
Du gjør en del ting ekstra tungvint med å ha med Array_LOD_L. Det er jo det LOD_L-attributten er der for. Skfitet også fra stringTab til nodeTab.
Av en eller annen grunn så har alle disse tab-listene en default-verdi = #(undefined). Så når man åpner lista for første gang så fjerner jeg den verdien. Jeg tok meg den frihenten å implementere remove-knappen for deg også. Kan være litt kinky å fjerne de riktige elementeme fra et array hvis indeksene ikke er kronologisk selektert fra lista.



Kode: Velg alt

CA = attributes CTRL_LOD
(
   parameters CTRL_LOD_Parameters rollout:CTRL_LOD_Rollout
   (
      LOD_L type:#nodetab tabSize:1 tabSizeVariable:true ui: MLB_LOD_L
   )

   rollout CTRL_LOD_Rollout "Geometri Level of Detail"
   (
      group "Low Detail Geometri"
      (
         multiListbox MLB_LOD_L height:10
         spinner Spn_LOD_L_ViewPortIterations "Viewport iterations" type:#integer range:[0,10,0] fieldWidth:20
         spinner Spn_LOD_L_RenderIterations "Render iterations" type:#integer range:[0,10,0] fieldWidth:20
         pickButton pBtn_LOD_L_Add "Add to low detail list"
         button Btn_LOD_L_Remove "Remove from low detail list"
      )

      on pBtn_LOD_L_Add picked obj do
      (
         if obj != $ then
         (
            appendIfUnique LOD_L obj
            MLB_LOD_L.items = for i in LOD_L collect i.name
         )
      )

      on CTRL_LOD_Rollout open do
      (
         if LOD_L.count == 1 and LOD_L[1] == undefined do
            deleteItem LOD_L 1
         
         MLB_LOD_L.items = for i in LOD_L collect i.name
      )
      
      on Btn_LOD_L_Remove pressed do
      (
         /* local sel = MLB_LOD_L.selection as array
         for i = sel.count to 1 by -1 do (deleteitem LOD_L i)
         MLB_LOD_L.items = for i in LOD_L collect i.name   -- i utgangspunktet en elegant løsning for å fjerne items i lista men den har en flaw. Det kan du få finne ut av selv :D */
         
          if sel.count > 0 then
         (
            for i in sel do
               LOD_L[i] = undefined
            
            if LOD_L.count > 1 do
               LOD_L =  makeuniquearray (LOD_L as array)
            
            deleteItem LOD_L (findItem LOD_L undefined)
            
            MLB_LOD_L.items = for i in LOD_L collect i.name
         ) 
      )
   )
)
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 okt, 2011

Tusan takk for hjelp! Akkurat nå må jeg legge meg. Har texturert i hele kveld, men jeg skal se på koden "i morgen". :P

En ting jeg er litt usikker på: Så lenge det er node\nodeTab, string\stringTab el. som et parameter, så tar den vare på objekter omtrent som et vanlig array som man kan hente "ting" ut ifra?
Og hva er vitsen med å koble parameteret til ui:MLB_LOD_L? Det ser ut til at du behandler listbox og parameteret hver for seg hele tida?

Utrolig hvor mange kjekke funksjoner jeg lærer når du skriver en løsning for meg btw :D "appendIfUnique" tar jo bort en del kode for å lete igjennom arrayet for å se om noden er der fra før, slik jeg hadde planlagt :)

Igjen; helt supert å få så bra hjelp! Det er vanskelig å finne tråder om dette på nettet, og manualen kan selvsagt ikke ha løsningen på en million ulike sammensatte situasjoner.
if your not living on a killing ground, you better make your own

Brukeravatar

tassel
Innlegg: 3986
Registrert: man 26 sep, 2005
Sted: Oslo
Kontakt:

Legg innav tassel » søn 23 okt, 2011

havards skrev:Listbox tar bare string som item input, så du må selv mekke et node array som du oppdaterer hver gang listboxen endres (Følg med Tassel! :D). Du bruker indexene du får fra listboxen til å gjøre dette. Basically så kan du gjøre det samme med param_A også.
Men det er ikke lett for meg å si hva som kan være galt mtp. det første spørsmålet ditt uten å se resten av koden din.


Hehe :D

Vel, dette er vel kanskje noe å ta med seg når det gjelder CA: http://forums.cgsociety.org/showthread. ... &t=1014476

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 23 okt, 2011

hardrock_ram skrev:Og hva er vitsen med å koble parameteret til ui:MLB_LOD_L? Det ser ut til at du behandler listbox og parameteret hver for seg hele tida?

Det virker som det er en bug, jeg er ikke sikker, har ikke vært så mye borti custom attributes. Derfor oppdaterer jeg lista manuelt.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 okt, 2011

tassel: Den posten var absolutt noe å ta med seg! Den går på lista mi over muligep problemer som kan oppstå. :) Folk virker ikke så superfornøyd med custom attributes ...

havards: jeg prøver meg litt fram nå.
LOD_L gir alltid undefined på første item, noe som sikkert kommer av at tabSize står på 1 (noe den måtte gjøre). jeg skrev derfor:

Kode: Velg alt

MLB_LOD_L.items = (for i = LOD_L where (i != undefined) collect i.name)


For å sortere ut undefined av listbox, men jeg er usikker på om det er lurere å heller prøve å fjerne undefined fra LOD_L (parameteret) isteden. Jeg får se hva jeg gjør etterhvert ... EDIT: er dette "flaw`en? ;)
Jeg oppdaterer posten hvis det dukker opp andre forandringer jeg må gjøre :)
if your not living on a killing ground, you better make your own


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 okt, 2011

Det fungerte ikke helt med dette oppsettet heller. Det ble alltid et eller annet problem. Heldigvis var det en slik liste på finnRigg fra Noroff som jeg hadde liggende. bare titta på den tilfeldig. Der fungerer det slik det skal, bare med vanlig listbox.

Det var "undefined" som hele tiden laget problemer. Enten så fungerte lista slik den skulle, men da fjernet den alltid et element OVER det valgte på lista når man trykket på remove, eller så fikk jeg den til å fjerne riktig valg på lista, men da klikka den med en gang jeg prøvde å velge flere på en gang. Den første vedlagte koden er et eksempel på siste. Den andre koden er den fra Noroff, tilpasset min scene. Den fungerer slik den skal med vanlig listbox. Hvis du har noe input her, så fyr løs ;)

utrykk jeg ikke vet hva betyr enda:
maxObjectTab
(nodeTransformMonitor node:obj forwardTransformChangeMsgs:false)

Min kode:

Kode: Velg alt

parameters CTRL_LOD_Parameters rollout: CTRL_LOD_Rollout
      (
         LOD_L type:#nodeTab tabSize:1 tabSizeVariable:true ui:MLB_LOD_L
      )
      
      rollout CTRL_LOD_Rollout "Geometri Level of Detail"
      (
         group "Low Detail Geometri"
         (
            multiListbox MLB_LOD_L height:10
            spinner Spn_LOD_L_ViewPortIterations "Viewport iterations" type:#integer range:[0,10,0] fieldWidth:20
            spinner Spn_LOD_L_RenderIterations "Render iterations" type:#integer range:[0,10,0] fieldWidth:20
            pickButton pBtn_LOD_L_Add "Add to low detail list"
            button Btn_LOD_L_Remove "Remove from low detail list"
         )
         
         on pBtn_LOD_L_Add picked obj do --Her legges det til objekter
         (
            appendIfUnique LOD_L obj --Først puttes obj inn i parameteret
            for i = LOD_L.count to 1 by -1 do
            (
               if LOD_L[i] == undefined do deleteItem LOD_L i
            )
            
            MLB_LOD_L.items = (for i = LOD_L where (i != undefined) collect i.name) --MLB_LOD_L.items mottar ny liste over objekter fra LOD_L
         )
         
         on Btn_LOD_L_Remove pressed do --Her fjernes objekter
         (
            MLB_LOD_L_Selected = (MLB_LOD_L.selection as array)
            for i = MLB_LOD_L_Selected do deleteItem LOD_L i
            MLB_LOD_L.items = (for i = LOD_L where (i != undefined) collect i.name) --MLB_LOD_L.items mottar ny liste over objekter fra LOD_L
         )
         
         on CTRL_LOD_Rollout open do --Her oppdateres lista med data fra parameteret hver gang lista åpnes
         (
            MLB_LOD_L.items = (for i = LOD_L where (i != undefined) collect i.name) --MLB_LOD_L.items mottar ny liste over objekter fra LOD_L
         )



Kode fra Noroff:

Kode: Velg alt

(
   CA = attributes CTRL_LOD --Først lages selve scriptet i attributtene
   (
      --GEOMETRI LOD
      
      
      parameters CTRL_LOD_Parameters rollout: CTRL_LOD_Rollout
      (
         LOD_L type:#maxObjectTab tabSize:0 tabSizeVariable:true
      )
      
      rollout CTRL_LOD_Rollout "Geometri Level of Detail"
      (
         group "Low Detail Geometri"
         (
            Listbox LB_LOD_L height:10
            spinner Spn_LOD_L_ViewPortIterations "Viewport iterations" type:#integer range:[0,10,0] fieldWidth:20
            spinner Spn_LOD_L_RenderIterations "Render iterations" type:#integer range:[0,10,0] fieldWidth:20
            pickButton pBtn_LOD_L_Add "Add to low detail list"
            button Btn_LOD_L_Remove "Remove from low detail list"
         )
         
         fn updateList = (LB_LOD_L.items = (for i = LOD_L collect i.node.name)) --funksjon for å oppdatere low geometri-listbox
         
         on pBtn_LOD_L_Add picked obj do --Her legges det til objekter
         (
            append LOD_L (nodeTransformMonitor node:obj forwardTransformChangeMsgs:false)
            updateList()
         )
         
         
         on Btn_LOD_L_Remove pressed do --Her fjernes objekter
         (
            sel = LB_LOD_L.selection
            if sel >0 do
            (
               deleteItem LOD_L sel
               updateList()
            )
         )
         
         
         on CTRL_LOD_Rollout open do -- Hva som skal skje hver gang rollouten åpnes
         (
            updateList()
         )
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 23 okt, 2011

hardrock_ram skrev:For å sortere ut undefined av listbox, men jeg er usikker på om det er lurere å heller prøve å fjerne undefined fra LOD_L (parameteret) isteden.

Det er det jeg gjør i kodesnutten jeg postet. listbox-arrayet er bare en blåkopi av LOD_L.

Til det å fjerne ting fra lista så er koden fra noroff skrevet med listbox som utgangspunkt. Siden du bruker multilistbox så må du ta hensyn til at en bruker kan fjerne flere elementer samtidig som ikke nødvendigvis er i sortert rekkefølge. Det tok jeg også hensyn til i kodesnutten jeg la ved.

nodeTransformMonitor betyr at du har en svak referanse til objektet. Kort fortalt så brukes det til å unngå circular dependency hvis du vil referere til objektet custom attributesene ligger på. I ditt tilfelle så er det ikke noe poeng å ha det med siden du ikke refererer til hovedobjektet der CA'sene ligger? forwardTransformChangeMsgs:false betyr at den ikke skal videresende callbacks når transform-matrisa endres.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 okt, 2011

Problemet er at koden du postet først ikke fjerner det markerte elementet på lista, men elementet over isteden. I den første kodesnutten i siste posten min er det fikset, men den klikker hvis man prøver å fjerne flere på en gang.
Er det noen ulemper med koden fra Noroff? Det er selvfølgelig veldig greit om jeg kan forandre navn og slikt på objekter i scenen ...

Jeg hadde tenkt å ha med objektene som vil få denne custom attribute i en "excluded" -liste, men det er mest for organiseringens skyld. Det er ikke så viktig.
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 23 okt, 2011

Da har du sikkert ikke fjernet undefined fra LOD_L-lista. Virker på meg fra den forrige posten din at du fjernet den fra multilistbox-lista, noe som ikke gir mening :P. Funksjonen jeg skrev funker som den skal hos meg.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 okt, 2011

Dette er jo sykt snålt, for jeg får den ikke til å funke som den skal.
Det går greit å legge til, men remove fjerner objektet som ligger over i lista. Jeg har kopiert koden fra posten din.

Her er den nøyaktige koden:

Kode: Velg alt

CA = attributes CTRL_LOD
(
   parameters CTRL_LOD_Parameters rollout:CTRL_LOD_Rollout
   (
      LOD_L type:#nodetab tabSize:1 tabSizeVariable:true ui: MLB_LOD_L
   )

   rollout CTRL_LOD_Rollout "Geometri Level of Detail"
   (
      group "Low Detail Geometri"
      (
         multiListbox MLB_LOD_L height:10
         spinner Spn_LOD_L_ViewPortIterations "Viewport iterations" type:#integer range:[0,10,0] fieldWidth:20
         spinner Spn_LOD_L_RenderIterations "Render iterations" type:#integer range:[0,10,0] fieldWidth:20
         pickButton pBtn_LOD_L_Add "Add to low detail list"
         button Btn_LOD_L_Remove "Remove from low detail list"
      )

      on pBtn_LOD_L_Add picked obj do
      (
         if obj != $ then
         (
            appendIfUnique LOD_L obj
            MLB_LOD_L.items = for i in LOD_L collect i.name
         )
      )

      on CTRL_LOD_Rollout open do
      (
         if LOD_L.count == 1 and LOD_L[1] == undefined do
            deleteItem LOD_L 1
         
         MLB_LOD_L.items = for i in LOD_L collect i.name
      )
     
      on Btn_LOD_L_Remove pressed do
      (
         local sel = MLB_LOD_L.selection as array
         for i = sel.count to 1 by -1 do (deleteitem LOD_L i)
         MLB_LOD_L.items = for i in LOD_L collect i.name   -- i utgangspunktet en elegant løsning for å fjerne items i lista men den har en flaw. Det kan du få finne ut av selv :D */
         
          if sel.count > 0 then
         (
            for i in sel do
               LOD_L[i] = undefined
           
            if LOD_L.count > 1 do
               LOD_L =  makeuniquearray (LOD_L as array)
           
            deleteItem LOD_L (findItem LOD_L undefined)
           
            MLB_LOD_L.items = for i in LOD_L collect i.name
         )
      )
   )
)




   --her legges modifieren på gjeldende objekt. Denne delen fungerer slik den skal
   X = false
   for i = 1 to $CTRL_Hip_Outer.modifiers.count do
   (
      if ($CTRL_Hip_Outer.modifiers[i].name == "LOD") do X = true
   )
   
   if X == true then (messagebox "Det eksisterer en LOD-modifier fra før")
   else
   (
      addModifier $CTRL_Hip_Outer (emptyModifier name:"LOD")
      custAttributes.add $CTRL_Hip_Outer.modifiers["LOD"] CA
   )


Hva er feil her? Dette skal være nøyaktig kopiert fra din tidligere post ... :)

grunnen til at jeg fjernet undefined fra multlibox er fordi det den da fjernet riktig element fra lista. Den første koden i posten hvor jeg jatter om noroff-koden fungerer tilsynelatende slik den skal, bortsett fra at den klikker hvis jeg prøver å fjerne flere elementer på en gang. renaming av noder i scenen fungerer, og det oppdateres riktig i lista.
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 23 okt, 2011

Det som er feil er at du har fjernet "/*" forran den første metoden som fjerner elementer som jeg skriver er flawed. Den skal være kommentert ut. Kanskje litt confusing at jeg hadde den der fortsatt, men den er absoultt snedig å merke seg hvordan den fungerer til senere bruk :)

Det som gjør at noroff-koden feiler er som sagt at den opererer på listbox og ikke multilistbox. Forskjellen mellom de to er at du kan selektere flere objekter i lista med multilistbox. Noroff-koden fjerner bare da ett element hver gang du trykker på den knappen. Så når du kaller den samme kodesnutten i multilistbox så kan det jo hende .selection er større enn 1, da vil deleteItem-kallet feile!
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Gå tilbake til «Max scripts»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 1 gjest

cron