zoukankan      html  css  js  c++  java
  • 轴心工具的做法。

    ---------*****************变换轴心点**************************************************************-----------
     try(cui.UnRegisterDialogBar transPivot)catch()-----这个是法则。
    try (DestroyDialog transPivot )catch()
    global gt_yc_Ail
     fn g_filter o = superclassof o == Geometryclass
     fn find_intersection z_node node_to_z =
     (
      try(
      --同样的条件 数字及计算要比字符串快 所以能用数字 不用字符串。
      ---改写成自动的循环处理的, 我考虑的因为只有6 个 所有用循环擦看。
      local oop
             local  compare_array =#()  
      for i in 1 to 6 do
      (
     oop=case of

       (

       (i==1): [0,0,-1]

       (i ==2): [0,0,1]
        
       (i ==3):[-1,0,0]
        
       (i==4):[1,0,0]
        
       (i ==5):[0,-1,0]
        
       (i ==6):[0,1,0]

       --default: reference $foo
       )
      -- print oop

      local testRay = ray node_to_z.pos  oop
      local nodeMaxZ
      
       case oop  of
       (  ------Z 轴
        ([0,0,-1]) :(nodeMaxZ = z_node.max.z
         testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
         
         )
        ([0,0,1]) :(nodeMaxZ = z_node.min.z
         testRay.pos.z = nodeMaxZ - 0.0001 * abs nodeMaxZ  
        )
        -------X轴 
        ([-1,0,0]) : (nodeMaxZ = z_node.max.x
         testRay.pos.x = nodeMaxZ + 0.0001 * abs nodeMaxZ   
        )
        ([1,0,0]) : (nodeMaxZ = z_node.min.x
        testRay.pos.x = nodeMaxZ - 0.0001 * abs nodeMaxZ   
        )
       ------- Y轴
              ([0,-1,0]) : (nodeMaxZ = z_node.max.y
        testRay.pos.y = nodeMaxZ + 0.0001 * abs nodeMaxZ   
        )
        ([0,1,0]) : (nodeMaxZ = z_node.min.y
        testRay.pos.y = nodeMaxZ - 0.0001 * abs nodeMaxZ   
        ) 
       )
       
           
      --)
      --testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
        if  intersectRay z_node testRay !=undefined then
        (
         ---因为我先做了x轴的负方向 其实两个方向是同事存在了 所有 好要进行比较了
        --return
           append  compare_array  (intersectRay z_node testRay)
        
       --  exit
        
        )
        
           
       
      )/*
       for i in compare_array do
       (
       distance_d =   distance  $selection[1].pos  i.pos
      --print compare_array[1].pos
        distance_c=0
        if distance_d>= distance_c then
        (
          distance_c =distance_d
        )
       
       )*/
      ---其实就有两个我比较下好; 用列举法
       distance_d =   distance  $selection[1].pos  compare_array[1].pos
      try ( distance_c =   distance  $selection[1].pos  compare_array[2].pos )
      catch ( distance_c =distance_d+20)
        if amin distance_d  distance_c == distance_d then
        (
         return compare_array[1]
        )else
        (
         return compare_array[2]
        )
       ) catch ()
      
     )
    rollout transPivot "变换轴心点" 160 height:344
    (
     
     local alignToObj=0,
        usePivot
     pickbutton alObj "alignTo:(onesel/...)" pos:[4,4] 104 height:15
     button alSel "清除" pos:[114,4] 35 height:15
     button al5 "X_max" pos:[4,30] 70 height:18
     button al6 "X_min" pos:[81,29] 70 height:18
     button al1 "Y_max" pos:[4,52] 70 height:18
     button al3 "Y_min" pos:[81,51] 70 height:18
     button al2 "Z_max" pos:[4,74] 70 height:18
     button al4 "Z_min" pos:[81,73] 70 height:18
     button alc "中心" pos:[4,96] 70 height:18
     button alR "随机" pos:[81,95] 70 height:18
     spinner mult "倍率" pos:[10,119] 55 height:16 range:[0,10,1]
     spinner multR "倍率随机" pos:[85,120] 70 height:16 range:[0,10,0]
     button pick_btn1 "自动对齐" pos:[40,142] 70 height:18 enabled:true
     
     ----------------------
     fn rotatePivotOnly obj rotation =
     (
      local rotValInv=rotation as quat
      animate off
      in coordsys local obj.rotation*=RotValInv
      obj.objectoffsetrot*=RotValInv
      obj.objectoffsetpos*=RotValInv
     )
     on alObj picked obj do (alignToObj= obj; alObj.text=("alignTo: "+obj.name); sel=getCurrentSelection(); for i=1 to sel.count do (resetPivot sel[i];  rotatePivotOnly sel[i] alignToObj.rotation;  sel[i].pivot=alignToObj.pivot) )
     on alSel pressed do (alignToObj=0; alObj.text="alignTo:(onesel/...)")
     on al1 pressed do ( sel=getCurrentSelection(); for i=1 to sel.count do (obj=if alignToObj==0 then sel[i] else alignToObj; sel[i].pivot.y=obj.max.y+(mult.value-1+random 0.0 multR.value)*(obj.max.y-obj.min.y) ) )
     on al2 pressed do ( sel=getCurrentSelection(); for i=1 to sel.count do (obj=if alignToObj==0 then sel[i] else alignToObj; sel[i].pivot.z=obj.max.z+(mult.value-1+random 0.0 multR.value)*(obj.max.z-obj.min.z) ) )
     on al3 pressed do ( sel=getCurrentSelection(); for i=1 to sel.count do (obj=if alignToObj==0 then sel[i] else alignToObj; sel[i].pivot.y=obj.min.y-(mult.value-1+random 0.0 multR.value)*(obj.max.y-obj.min.y) ) )
     on al4 pressed do ( sel=getCurrentSelection(); for i=1 to sel.count do (obj=if alignToObj==0 then sel[i] else alignToObj; sel[i].pivot.z=obj.min.z-(mult.value-1+random 0.0 multR.value)*(obj.max.z-obj.min.z) ) )
     on al5 pressed do ( sel=getCurrentSelection(); for i=1 to sel.count do (obj=if alignToObj==0 then sel[i] else alignToObj; sel[i].pivot.x=obj.max.x+(mult.value-1+random 0.0 multR.value)*(obj.max.x-obj.min.x) ) )
     on al6 pressed do ( sel=getCurrentSelection(); for i=1 to sel.count do (obj=if alignToObj==0 then sel[i] else alignToObj; sel[i].pivot.x=obj.min.x-(mult.value-1+random 0.0 multR.value)*(obj.max.x-obj.min.x) ) )
     on alc pressed do (
          sel=getCurrentSelection()
          for i=1 to sel.count do
          (
           obj=if alignToObj==0 then sel[i] else alignToObj
           sel[i].pivot.x=obj.min.x+0.5*(obj.max.x-obj.min.x); sel[i].pivot.y=obj.min.y+0.5*(obj.max.y-obj.min.y); sel[i].pivot.z=obj.min.z+0.5*(obj.max.z-obj.min.z) )
         )
     on alr pressed do (
          sel=getCurrentSelection()
          for i=1 to sel.count do
          (
           obj=if alignToObj==0 then sel[i] else alignToObj
           sel[i].pivot.x=random (obj.min.x-(mult.value-1+random 0.0 multR.value)*(obj.max.x-obj.min.x)) (obj.max.x+(mult.value-1+random 0.0 multR.value)*(obj.max.x-obj.min.x))
           sel[i].pivot.y=random (obj.min.y-(mult.value-1+random 0.0 multR.value)*(obj.max.y-obj.min.y)) (obj.max.y+(mult.value-1+random 0.0 multR.value)*(obj.max.y-obj.min.y))
           sel[i].pivot.z=random (obj.min.z-(mult.value-1+random 0.0 multR.value)*(obj.max.z-obj.min.z)) (obj.max.z+(mult.value-1+random 0.0 multR.value)*(obj.max.z-obj.min.z))
          )
         )
         
       on pick_btn1 pressed do
     (
      ---从上到下执行。先执行这里的这个。
      target_mesh = pickObject message:"Pick Target Surface:" filter:g_filter --- 这种拾取的方法更好。不用再显示;
      if isValidNode target_mesh then ---这个好用, 是如果节点没有被删除。
      (
       undo "MoveToSurface" on
       (
        for i in selection do
        (
         int_point = find_intersection target_mesh i
       -- print  int_point as string
         if int_point != undefined and  int_point != ok then
       (
       i.pos = int_point.pos
       -- print int_point.pos
      )
        )--end i loop
       )--end undo
      )--end if
     )--end pressed     
     on transPivot open do ( usePivot=getCoordCenter(); toolMode.pivotCenter() )
     on transPivot close do case usePivot of( #local:toolMode.pivotCenter(); #selection:toolMode.selectionCenter(); #system:toolMode.transformCenter() )
    )--end rollout
    createdialog transPivot  pos:(mouse.screenPos-[10,180])

    cui.RegisterDialogBar transPivot style:#(#cui_dock_left,#cui_dock_right, #cui_floatable)
    cui.DockDialogBar transPivot #cui_dock_right

  • 相关阅读:
    jq绑定on事件无效
    数字以0补全
    redis常用操作
    mysql数据操作日常
    centos端口映射
    centos7防火墙操作
    mysql5.7order by问题
    centos无法上网解决方法
    面试题
    ztree 获取子节点所有父节点的name的拼接
  • 原文地址:https://www.cnblogs.com/gaitian00/p/2025670.html
Copyright © 2011-2022 走看看