Zobacz pełną wersję : fn custAttributes - przekazywanie zmiennej



sbx
01-03-05, 20:20
mam taka funkcje:



fn boneCA target nameObj = (
anotherObjNameCA = attributes attribute(

parameters main rollout:params(
blend type:#float ui:sld default:50
)
rollout params "IK/FK Blending"
(
button btnSik "IK" pos:[10,51] width:31 height:22
button btnSfk "FK" pos:[119,53] width:31 height:22
label lbl1 "<- snap ->" pos:[57,56] width:52 height:17
slider sld "" pos:[5,12] width:152 height:25
button btnDik "IK" pos:[12,86] width:31 height:22
button btnDfk "FK" pos:[121,88] width:31 height:22
label lbl2 "<- display ->" pos:[51,86] width:61 height:17

on btnSik pressed do(print nameObj)
on btnSfk pressed do(print a)
))
cn = getnodebyname target;
custAttributes.add cn anotherObjNameCA
)


a = "nic";
boneCA $Box01.name "jakas nazwa"





------------------ pytanie 1: ------------------
wywoluje funkcje

boneCA $Box01.name "jakas nazwa"
w linijce:

on btnSik pressed do(print nameObj)
jest blad, co zrobic by przekazac zmienna "nameObj" ?

dla przykladu:

on btnSfk pressed do(print a)
zmienna "a" jest odczywywana poprawnie




------------------ pytanie 2: ------------------


cn = getnodebyname target;
custAttributes.add cn anotherObjNameCA

czy jest jakis ladnieszy sposob by przekazywac do "cn" obiekt wskazany po jego nazwie ?

z gory dziekuje i pozdrawiam

lechoo
02-03-05, 08:19
Problem jest taki ze kazesz custom atrybutowi wypisac zmienna lokalna wazna tylko w obrebie funkcji boneCA, a tego nie mozna zrobic (a jest domyslne zmienna globalna). Musisz dodac do CA jakiegos stringa np. myObjName, do niego wpisac swoja zmienna czyli nameObj i wypisywac ta wewnetrzna zmienna.



fn boneCA target nameObj = (
anotherObjNameCA = attributes attribute(

parameters main rollout:params(
blend type:#float ui:sld default:50
myObjName type:#string
)
rollout params "IK/FK Blending"
(
button btnSik "IK" pos:[10,51] width:31 height:22
button btnSfk "FK" pos:[119,53] width:31 height:22
label lbl1 "<- snap ->" pos:[57,56] width:52 height:17
slider sld "" pos:[5,12] width:152 height:25
button btnDik "IK" pos:[12,86] width:31 height:22
button btnDfk "FK" pos:[121,88] width:31 height:22
label lbl2 "<- display ->" pos:[51,86] width:61 height:17

on btnSik pressed do
(
print myObjName
)
on btnSfk pressed do(print a)
))
cn = getnodebyname target;
custAttributes.add cn anotherObjNameCA
cn.myObjName = nameObj
)


a = "nic";
boneCA $Box01.name "jakas nazwa"

Co do pytania 2 to chyba nie ale jeszcze pomysle :)

sbx
02-03-05, 13:54
dziekuje lechoo :)

moj scrypt ma dzialac mniej wiecej tak ze: pobiera nazwy kosci ktore sa w lancuchu i wykonuje na nich pozniej operacje ktore miedzy innymi sa pod tymi buttonami wlasnie

a z tego o czym rozmawiamy wynika ze nie ma mozliwosci dynamicznego tworzenia scryptu znajdujacego sie pod buttonem ?


bo czy "myObjName" w "parameters main" moze byc:

myObjName type:#array ?? <-(nie wiem czy to cos zmienilo by, ale probowal bym odczytac zmienna o odpowiednim indexie)
myObjName type:#struct ?? <-(tak samo jak z array moze udalo by sie cos poskladac)
myObjName type:#fn ?? <-(a moze cala funkcje przypisac do tego myObjName tworzona gdzies na boku ? :)))))


najwyrazniej bede musial to obejsc innym sposobem :)




w drugim pytaniu chodzilo mi raczej o to zeby zapisac to w jednej linji bez przypisywania do zmiennej
cos w rodzaju -> custAttributes.add (getnodebyname target) anotherObjNameCA ale to malo istotne :))

lechoo
02-03-05, 16:22
Czy funkcja pod buttonem ma dzialac na obiektach bedacych dziecmi lub rodzicami obiektu do ktorego button jest przypisany?

sbx
02-03-05, 16:58
Czy funkcja pod buttonem ma dzialac na obiektach bedacych dziecmi lub rodzicami obiektu do ktorego button jest przypisany?

tak :) - dobry pomysl ! a dokladnie co proponujesz ? :)

lechoo
03-03-05, 09:00
Musisz dodac do custom attributes parametr myID type:#integer i wpisac do niego ID obiektu na ktorym jest CA: $Box01.inode.handle. Teraz pod samym buttonem odzyskujesz obiekt po jego ID: myObj = maxOps.getNodeByHandle myID. Jak masz obiekt reszta jest prosta:
myObj.parent - rodzic obiektu
myObj.children - tablica z dziecmi obiektu

sbx
03-03-05, 11:19
wczoraj zrobilem troche inaczej tez uzywajac .parent, dlugie to wyszlo lecz zabardzo nie widze mozliwosci by duzo zwiezlej to napisac

teraz tylko na chwilke, pozniej przemysle to co napisales, dziekuje Adamie




fn boneCA target = (
anotherObjNameCA = attributes attribute(

parameters main rollout:params(
blend type:#float ui:sld default:50
myIKChain type:#string
myParentBone type:#string
myChildBone type:#string
)

rollout params "IK/FK Blending"
(
button btnSik "IK" pos:[10,51] width:31 height:22
button btnSfk "FK" pos:[119,53] width:31 height:22
label lbl1 "<- snap ->" pos:[57,56] width:52 height:17
slider sld "" pos:[5,12] width:152 height:25
checkButton btnDik "IK" pos:[12,86] width:31 height:22 checked:true
checkButton btnDfk "FK" pos:[121,88] width:31 height:22 checked:true
label lbl2 "<- display ->" pos:[51,86] width:61 height:17
--on btnDfk pressed do(hide myFKobj; unhide myIKobj)


on btnDik changed state do (
if state == true then (unhide $CHAIN_RLeg)
else(hide $CHAIN_RLeg)
)


on btnSfk pressed do (
chaintemp = getnodebyname myIKChain
chaintemp.transform.controller.Enabled = 0
global arrayBone=#(); i=0;
temp = getnodebyname myChildBone

while temp != undefined do (
i=i+1; arrayBone[i] = temp.name
if temp.name == myParentBone then exit
temp = temp.parent
)
for i=arrayBone.count to 1 by -1 do( --print arrayBone[i]
ikn = "IK_" + arrayBone[i];
fkn = "FK_" + arrayBone[i];
ik = getnodebyname ikn;
fk = getnodebyname fkn;
ik.transform = fk.transform
)
chaintemp = getnodebyname myIKChain
temp = getnodebyname arrayBone[1]
chaintemp.transform = temp.transform
chaintemp.transform.controller.Enabled = 1
)

on btnSik pressed do (
global arrayBone=#(); i=0;
temp = getnodebyname myChildBone

while temp != undefined do (
i=i+1; arrayBone[i] = temp.name
if temp.name == myParentBone then exit
temp = temp.parent
)
for i=arrayBone.count to 1 by -1 do( --print arrayBone[i]
ikn = "IK_" + arrayBone[i];
fkn = "FK_" + arrayBone[i];
ik = getnodebyname ikn;
fk = getnodebyname fkn;
fk.transform = ik.transform
)
)

))

cn = getnodebyname target;
custAttributes.add cn anotherObjNameCA;
cn.myParentBone = parentBone.name
cn.myChildBone = childBone.name
cn.myIKChain = "CHAIN_" + NewName
)

lechoo
03-03-05, 11:31
Dobrym pomyslem byloby zamienic getnodeByName na getNodeByHandle. Nigdy nie bedziesz mial dwoch nodow o tym samym ID a z nazwami moze byc roznie.

sbx
05-03-05, 16:38
dziekuje - tak, z jednej strony bardzo dobry pomysl, niestety w momecie gdy bede chcial dolaczyc ta hierarchie kosci do innej sceny (merge), wszystko poprzestawia sie, wiec chyba lepiej bedzie zostac przy getnodeByName pamietajac o stosowaniu roznych nazw dla obiektow :(