/**************************************** Fonction de mise à jour des controles textes relatifs à la position d'un objet dans la toolbar Remarque la position est dans le repere global Renvoie la position dans le repere de son pere *****************************************/ fun setToolBarPos(h, view, type) = /* MODIF 11-10 */ let if type&COORDS_GLOBAL then ( setTextVal TEXT_POS::nil (_loc this "POS_GLOBAL" nil)::nil; M3convVrt view.V3dsession h shell [0 0 0] ) else ( setTextVal TEXT_POS::nil (_loc this "POS_RELATIVE" nil)::nil; M3getObjVec view.V3dsession h ) -> pos in ( setTextVal TEXT_X::TEXT_Y::TEXT_Z::nil (if pos!=nil then let pos -> [x y z] in (itoa x)::(itoa y)::(itoa z)::nil else ""::""::""::nil ); M3getObjVec view.V3dsession h ) ;; /**************************************** Fonction de mise à jour des controles textes relatifs à l'angle d'un objet dans la toolbar *****************************************/ fun setToolBarAng(h, view, type) = /* MODIF 11-10 */ let if type&COORDS_GLOBAL then let M3calcPosRef view.V3dsession h shell -> [_ mat] in M3angularFromMatrix mat else M3getObjAng view.V3dsession h -> ang in ( setTextVal TEXT_A::TEXT_B::TEXT_C::nil (if ang!=nil then let ang -> [a b c] in (itoa IntToDeg b)::(itoa IntToDeg a)::(itoa IntToDeg c)::nil else ""::""::""::nil ); M3getObjAng view.V3dsession h ) ;; /**************************************** Fonction de mise à jour des controles textes relatifs au scale d'un objet dans la toolbar *****************************************/ fun setToolBarScale(h, view) = let M3getObjScale view.V3dsession h -> scale in ( setTextVal TEXT_SCALE::nil (if scale!=nil then (itoa scale)::nil else ""::""::""::nil ); scale ) ;; /**************************************** Fonction de mise à jour des controles textes relatifs à la taille de la boite englobante dans la toolbar *****************************************/ fun setToolBarSize(h, view) = let M3getObjScale view.V3dsession h -> scale in let M3calcObb view.V3dsession h -> [_ size] in setTextVal TEXT_W::TEXT_H::TEXT_D::nil if size==nil then ""::""::""::nil else let size -> [w h d] in (itoa 2*scale*w/100)::(itoa 2*scale*h/100)::(itoa 2*scale*d/100)::nil; 0 ;; /**************************************** Fonction evaluant l'etat des boutons pan et profondeur suivant la situation dans dev *****************************************/ fun evalStateViewBtn(dev) = if dev.DEVselected3d==dev.DEVbd3d then ( CHECK_Hide CHECK_PAN; CHECK_Hide CHECK_PROFONDEUR ) else if (dev.DEVselected3d!=dev.DEVbd3d) then ( if dev.DEVtypeOperation&OP_PAN && !dev.DEVtypeOperation&(OP_ROTOBJ|OP_MOVEOBJ|OP_SCALE) then ( CHECK_Show CHECK_PAN; CHECK_Check CHECK_PAN; CHECK_Show CHECK_PROFONDEUR ) else if dev.DEVtypeOperation&OP_PROF && !dev.DEVtypeOperation&(OP_ROTOBJ|OP_MOVEOBJ|OP_SCALE) then ( CHECK_Show CHECK_PAN; CHECK_Show CHECK_PROFONDEUR; CHECK_Check CHECK_PROFONDEUR ) else if dev.DEVtypeOperation&(OP_VIEW|OP_ROTOBJ|OP_MOVEOBJ|OP_SCALE) then ( CHECK_Show CHECK_PAN; CHECK_Show CHECK_PROFONDEUR; CHECK_Check2 CHECK_PAN; CHECK_Check2 CHECK_PROFONDEUR ) else ( CHECK_Show CHECK_PAN; CHECK_Show CHECK_PROFONDEUR; ) ) else nil ;; /***************************************** Fonction pan ******************************************/ /* MODIF 11-10 */ fun movePAN(view, x, y, typeview) = let if (typeview==VIEW_LEFT||typeview==VIEW_TOP||typeview==VIEW_BACK) then if _keybdstate&2 then [(-x) y 0] else [(-x)*5 y*5 0] else nil -> vect in M3movObj view.V3dsession view.V3dcamera vect; 0 ;; /***************************************** Fonction profondeur ******************************************/ /* MODIF 11-10 */ fun movePROF(view, x, y, typeview) = let if (typeview==VIEW_LEFT||typeview==VIEW_TOP||typeview==VIEW_BACK) then if _keybdstate&2 then (-y) else (-y)*5 else nil -> delta in let M3getCamera view.V3dsession view.V3dcamera -> [[d _] x z] in let max 10 d*(200+delta)/200 -> newd in M3setCamera view.V3dsession view.V3dcamera [[newd newd] x z]; 0 ;; /***************************************** Fonction de deplacement d'un objet ******************************************/ fun moveOBJ(dev, view, x, y) = if dev.DEVaxis!=nil then ( evalCamPos dev.DEVaxis view; evalAxisPos dev.DEVaxis view; /* on oriente le triede comme l'objet au quel il est attaché */ let /* on recherche l'axe X Y ou Z qui servira d'axe de translation */ if dev.DEVaxis.AVtype==AXIS_X then [dev.DEVaxis.AVh3dx dev.DEVaxis.AVh3dxT] else if dev.DEVaxis.AVtype==AXIS_Y then [dev.DEVaxis.AVh3dy dev.DEVaxis.AVh3dyT] else if dev.DEVaxis.AVtype==AXIS_Z then [dev.DEVaxis.AVh3dz dev.DEVaxis.AVh3dzT] else nil -> [axe letter] in if axe==nil then nil else let M3calcProj dev.DEVaxis.AVsession dev.DEVaxis.AVcamera axe -> [xa ya _ _] in let M3calcProj dev.DEVaxis.AVsession dev.DEVaxis.AVcamera letter -> [xl yl _ _] in let itof 5*(M3getObjScale dev.DEVaxis.AVsession dev.DEVaxis.AVaxis)/if _keybdstate&2 then 8 else 2 -> k in let [xl-xa ya-yl] -> [u v] in let ftoi (k*.itof (u*x+v*y))/.sqr((atof ".001")+.sqrt((sqr itof u)+.(sqr itof v))) -> coeff in let if dev.DEVaxis.AVtype==AXIS_X then [coeff 0 0] else if dev.DEVaxis.AVtype==AXIS_Y then [0 coeff 0] else if dev.DEVaxis.AVtype==AXIS_Z then [0 0 coeff] else nil -> [xv yv zv] in /* translation à effectuer en fct de l'axe choisi */ if view.V3drenderType==WIREORTHO then /* si viewOrtho on effectue translation dans le repère du père */ let M3getFather view.V3dsession dev.DEVaxis.AVrefobject -> father in M3movObjExt view.V3dsession dev.DEVaxis.AVrefobject M3convVec view.V3dsession shell father [xv yv zv] else /* si view3D on effectue translation dans le repère local */ M3movObj view.V3dsession dev.DEVaxis.AVrefobject [xv yv zv]; setToolBarPos dev.DEVaxis.AVrefobject view dev.DEVtypeCoords /* mise à jour de la nouvelle position dans le menu */ ) else nil; 0 ;; /***************************************** Fonction de rotation d'un objet ******************************************/ /* MODIF 11-10 */ fun rotateOBJ(dev, view, x, y) = if dev.DEVaxis!=nil then ( evalCamPos dev.DEVaxis view; evalAxisPos dev.DEVaxis view; /* on oriente le triede comme l'objet au quel il est attaché */ let (if _keybdstate&2 then -10 else -40)*y -> newy in let /* on recherche l'axe X Y ou Z qui servira d'axe de rotation */ if dev.DEVaxis.AVtype==AXIS_X then [0 (-newy) 0] else if dev.DEVaxis.AVtype==AXIS_Y then [(-newy) 0 0] else if dev.DEVaxis.AVtype==AXIS_Z then [0 0 newy] else nil -> [a b c] in /* rotation à effectuer en fct de l'axe choisi */ if a==nil then nil else let M3getObjVec view.V3dsession dev.DEVaxis.AVrefobject -> vect in let M3getObjAng view.V3dsession dev.DEVaxis.AVrefobject -> [ar br cr] in let [a+ar b+br c+cr] -> ang in ( C3DsetObjPosAng dev.DEVaxis.AVrefobject [vect ang] SAVE_NO BROAD_OTHER; if view.V3drenderType==WIREORTHO then /* si viewOrtho on effectue une rotation dans le repère du père */ M3rotateObjExt view.V3dsession dev.DEVaxis.AVrefobject [a b c] else /* si view3D on effectue une rotation dans le repère local */ M3rotateObj view.V3dsession dev.DEVaxis.AVrefobject [a b c]; /* setToolBarPos dev.DEVaxis.AVrefobject view dev.DEVtypeCoords; */ /* mise à jour de la nouvelle position dans le menu */ setToolBarAng dev.DEVaxis.AVrefobject view dev.DEVtypeCoords; /* mise à jour de la nouvelle orientation dans le menu */ ) ) else nil; 0 ;; /***************************************** Fonction de scale d'un objet ******************************************/ /* MODIF 11-10 */ fun scaleOBJ(dev, view, x, y) = if dev.DEVaxis!=nil then ( evalCamPos dev.DEVaxis view; evalAxisPos dev.DEVaxis view; /* on oriente le triede comme l'objet au quel il est attaché */ let if dev.DEVaxis.AVtype==AXIS_Z then (-y)*2 else nil -> newdif in /* scale à effectuer sur l'axe Z */ if newdif==nil then nil else let M3getObjScale view.V3dsession dev.DEVaxis.AVrefobject -> scale in ( C3DsetObjScale dev.DEVaxis.AVrefobject scale SAVE_NO BROAD_OTHER; M3setObjScale view.V3dsession dev.DEVaxis.AVrefobject scale+newdif; setToolBarScale dev.DEVaxis.AVrefobject view; /* mise à jour de la nouvelle taille dans le menu */ setToolBarSize dev.DEVaxis.AVrefobject view ) ) else nil; 0 ;;