本来要用鼠标找点,结构成了画点工具。 下来研究下(我做的画点成面的过程。)

----第一部就是在模型的左右上下建模面片
----如选择物体的前方创建面片,就是
/*
 $.pivot.x=$.min.x+0.5*($.max.x-$.min.x);
$.pivot.y=$.min.y+0.5*($.max.y-$.min.y);
 $.pivot.z=$.min.z+0.5*($.max.z-$.min.z)
 */
 ----用下面的方法来创建片的创建位置。
 /*
 CenterPivot $
$.pivot.y=$.max.y+($.max.y-$.min.y)
*/
----用收集坐标的变量来进行收集活动。
----事件处理之后要的一个三维坐标。
-----这个最好不要对组操作。

-----y的正方向
-----做好了函数要改,现在都是正方向,不是很对,
-----我用鼠标创建了点 我只是想叫他在所在的轴向上向外移动出本身。
function sel_pivot_axis axis_string  =
(
 case of
 (
 (axis_string == "y+") :
  (
 --sel_pivot_y =$.pos

 sel_pivot_y=$.max.y+($.max.y-$.min.y)

 sel_pivot_y
 ----上面的方法是一个获得点坐标的方法,其实是从位置哪里找到数组。在自动修改。
  )
       
 ----y的负方向
     (axis_string == "y-") :
         (  
 --sel_pivot_y_ =$.pos
 sel_pivot_y_=$.min.y+($.min.y-$.max.y)
 sel_pivot_y_
   )
 ---- z 的正方向
      (axis_string =="z+"):
   (
 --sel_pivot_z= $.pos
 sel_pivot_z=$.max.z+($.max.z-$.min.z)
 sel_pivot_z
   )
 --------z负方向
    (axis_string =="z-"):
         (  
 --sel_pivot_z_= $.pos
 sel_pivot_z_= $.min.z+($.min.z-$.max.z)
 sel_pivot_z_
   )
 ----x 轴的正方向
  (axis_string=="x+"):
       (  
 --sel_pivot_x =$.pos
 sel_pivot_x=$.max.x+($.max.x-$.min.x)
 sel_pivot_x
    )
 ----x轴的负方向
    (axis_string=="x-"):
    (
 --sel_pivot_x_ =$.pos
 sel_pivot_x_=$.min.x+($.min.x-$.max.x)
 sel_pivot_x_
    )
 -----写完了想写成一个函数的形式,方便下来的调用,
   )----end case
 
 
)---end fn (收集片的坐标。)

----函数sel_pivot_axis 是出来两倍的函数,这个函数以后用在创建面片上,
-----我用鼠标创建了点 我只是想叫他在所在的轴向上向外移动出本身。
function sel_pivot_axis_fold axis_string  =
(
 case of
 (
 (axis_string == "y+") :
  (
 --sel_pivot_y =$.pos

 sel_pivot_y=$.max.y

 sel_pivot_y
 ----上面的方法是一个获得点坐标的方法,其实是从位置哪里找到数组。在自动修改。
  )
       
 ----y的负方向
     (axis_string == "y-") :
         (  
 --sel_pivot_y_ =$.pos
 sel_pivot_y_=$.min.y
 sel_pivot_y_
   )
 ---- z 的正方向
      (axis_string =="z+"):
   (
 --sel_pivot_z= $.pos
 sel_pivot_z=$.max.z
 sel_pivot_z
   )
 --------z负方向
    (axis_string =="z-"):
         (  
 --sel_pivot_z_= $.pos
 sel_pivot_z_= $.min.z
 sel_pivot_z_
   )
 ----x 轴的正方向
  (axis_string=="x+"):
       (  
 --sel_pivot_x =$.pos
 sel_pivot_x=$.max.x
 sel_pivot_x
    )
 ----x轴的负方向
    (axis_string=="x-"):
    (
 --sel_pivot_x_ =$.pos
 sel_pivot_x_=$.min.x
 sel_pivot_x_
    )
 -----写完了想写成一个函数的形式,方便下来的调用,
   )----end case
 
 
)---end fn (收集片的坐标。)

----下面应该是鼠标工具函数,这个很重要,这里还不能纯粹的用鼠标工具
---要用到屏幕射线。

--1.当我点击屏幕对应的射线。交到物体有一个坐标,然后收集 坐标数。把其中的一个数换成我上面轴的函数对应的数。
--2.这样数字就会在一个平面上,利用平面数据,得出长宽,创建面片,转正mesh 显示所以线(应为三角具有稳定性。)

 --mouseray = mapScreenToWorldRay mouse.pos --这里应该是鼠标屏幕对应的射线
 --sectray = intersectRAY $ mouseray  --返回节点还是就是射线的焦点。)
---就是鼠标所指的 物体上的坐标,还有一条射线的方向。
---下面先创建一个鼠标工具,如果是需要什么函数,就在上面写啦。

---先写一个删除物体函数
fn deleting_marker_sp   =
 (
  if  isdeleted sphere_s == true then
  () else
  (
   delete sphere_s
  )
 )

fn mouse_tools_customize  axis_  =

 global gt_kooc_in_form  ---我用的函数内部传,全局
  gt_kooc_in_form = axis_
 tool drawing__
 (
  on start do
  (
      ---提前创建球体。
         sphere_s =   sphere radius:10 segs:10  smooth:true colorBylayer:false wirecolor:red
   setSysCur #uscale 
  )---end start   
  ----- 当鼠标点击时,把 
 on mousepoint clickno do
 (
         mouseray = mapScreenToWorldRay mouse.pos
         try (sectray = intersectRAY $ mouseray)catch()
  if sectray==undefined then
  (  if  isdeleted sphere_s == false then
   delete sphere_s ---这里应该会是结束鼠标工具,但是又不能写因为 我要不断的点击尝试啊。
   --return false 
  )else
  (
   --- 在这里面球在创建活动,产看变量是否删除在 鼠标工具中用到了
   if  isdeleted sphere_s == true then
   (
   sphere_s =   sphere radius:10 segs:10  smooth:true colorBylayer:false wirecolor:red
   )
   --sel_pivot_axis_fold axis_string
   ---在用一个case
                --  ray_ra= sectray.pos
    -- ray_ra[2]=sel_pivot_axis_fold  axis_string
     --sphere_s.pos =ray_ra
    
   case gt_kooc_in_form  of
   (
    ("y+"):
    (
     ray_ra= sectray.pos
     ray_ra[2]=sel_pivot_axis_fold "y+"
     sphere_s.pos =ray_ra
     
    )----end ()
    ("y-"):
    (
     ray_ra= sectray.pos
     ray_ra[2]=sel_pivot_axis_fold "y-"
     sphere_s.pos =ray_ra
     
    )----end ()
    ("z+"):
    (
     ray_ra= sectray.pos
     ray_ra[3]=sel_pivot_axis_fold "z+"
     sphere_s.pos =ray_ra
     
    )----end ()
    ("z-"):
    (
     ray_ra= sectray.pos
     ray_ra[3]=sel_pivot_axis_fold "z-"
     sphere_s.pos =ray_ra

     
    )----end ()
    ("x+"):
    (
     ray_ra= sectray.pos
     ray_ra[1]=sel_pivot_axis_fold "x+"
     sphere_s.pos =ray_ra
     
     
    )----end ()
    ("x-"):
    (
     ray_ra= sectray.pos
     ray_ra[1]=sel_pivot_axis_fold "x-"
     sphere_s.pos =ray_ra
     
    )----end ()
    
    default:()


   )---end case
   
   
  )
  ---因为鼠标工具在点击时每次都是2次 好像是第一个还是3次 所以这里面加入了强有利的报错机制。
  ---实现了点的坐标。
  
  ---想到这里我又感觉我上面的方向有点少,效果不是很理想。
  ---现在想想应该还好。我只是在每个轴上自己选择一下。

 )---叫创建的球到物体的外形的box上,这个也是我干干想的,  
 
 on mouseMove  a do
 (   sel_seltion = $  ---选择的物体做积累
  clearSelection() ----清除
   select sphere_s   ---选择我之前的球 
  maxOps.cloneNodes $ cloneType:#copy newnodes:&s2  ---做一个拷贝
  clearSelection()    --在清除
  select sel_seltion  ---在选择回之前选择的物体
         mouseray = mapScreenToWorldRay mouse.pos  
         try (sectray = intersectRAY $ mouseray)catch()  ---鼠标取焦点,
  if sectray==undefined then
  (  if  isdeleted s2 == false then
   delete s2 ---这里应该会是结束鼠标工具,但是又不能写因为 我要不断的点击尝试啊。
   --return false 
  )else
  (
   if  isdeleted s2 == true then
   (
     s2 =   sphere radius:10 segs:10  smooth:true colorBylayer:false wirecolor:red
   )----如果s2删掉了 在重新建立s2
   ray_ra= sectray.pos
   sphere_s.pos =ray_ra
  )
  
  
 )---end mouseMove

 ----单自由移动估计要该一会 因为他设计到点击一次自由移动 还是点击多次自由移动,还是就是上来就自由移动
 on freeMove do
 (
  ---我想我自由移动是要一定复制的那个,如果移动第一个,我顶上的点就有了问题,所以这个很重要。
  
  
 )---end FreeMove

    on abort do
 (
  
 deleting_marker_sp() 
 )
    on stop do
 (
  
 deleting_marker_sp() 
 )
  
 )
 ---下面是开始工具
 starttool drawing__
 
)----end mouse_tools_customize

原文地址:https://www.cnblogs.com/gaitian00/p/2036464.html