在原来基础上加人可选择的,删线算法。

---在次整理思路
--由于 getSegLengths $  1  cum:false  返回的是一个 段的%  顶点的长度 还有就是顶点的总长度。
--是一个数组,我们只用他的段的长度 用 pathInterp $ 1 .323 |pathInterp <shape> [ <curve_num> ] <parameter>
--求出顶点坐标。通过顶点坐标的比较。选择相应的段,删除就好

--- 问题1 我们怎么知道我们从getSegLengths $  1  cum:false  中找出我们想要的段?

 ----通过测试我们发现 我们想要数组中要的段的个数其实 和线的顶点个数是一样的
 ----这个顶点个数我们可以用 numSegments $ 1  来得出 。这里可能还有多个因素,我现在的实例就是用的第一个
 ---想取得因素用numSplines  $
 
 ----问题2 我们知道了线有几个因素,选择相应的因素 知道了各个点的顶点坐标,我们在做什么? (或者说我们知道顶点坐标有什么用)?
 
 
 ---我们是通过没两个相邻的点想比较,最后收尾比较。 对了这里补充下(:这里只是用于闭口的模型。这个脚本是针对闭口的线写的。)
 ---我们把 x y 坐标上同时存在的容差距离,过滤出吸血编号,  setSegSelection  $  1 #(1)  keep:true --- 选择段
 -- 用 splineOps.delete $ 删掉,*(之间涉及到层级转换,在写的过程中慢慢体会,)
 ---在吧点转到段的方式上,是所在的点数是小的,。对应的段。最好还有个数组的 首 尾比较,选在点的的段。
 
 
 
 ---其实这个删除线的思路是这样的,
---1.判断线的顶端个数。
--2.依次比较两个点之间的坐标。 手动的输入 x y 轴的容差值,(记住这里判断的是象连接的两个点。)
--3. 当大于某个容差值时候,通过算法 找到相应的线段,删除掉。
---判断是否是线。

------****************************************
--1. 判断是否是线,激活界面
--2.并且还是要选择一个,如果选择了两个线 不受理
--3.选择线判断因素个数
--4. 对每个因素返回点 的个数
--5.判断两点之间的 想 x  y 的容差值
--6.通过算法选择相应的线段,
--7.删除归到顶层级。


---****************************************
 --fn  spline_wrongis

/*
  fn gt_selctt    =
  (   
   kol =1
     if $selection.count >1 then
  (
        if AboutRollout != undefined then destroydialog AboutRollout
  rollout AboutRollout "About"
  (
  label lbl5  "选择数量大于1 将不执行," pos:[10,10]
  label lbl3 "以此提醒。"
  timer tmclose "" interval:1000 active:true
  on AboutRollout rbuttonup press do destroydialog AboutRollout ------ 右键进行消除
  on tmclose tick do destroydialog AboutRollout  --时间按点到消除  给我提供了思路。
  )createdialog AboutRollout 200 100  modal:true style:#(#style_border,#style_sysmenu,#style_sunkenedge)
  
  kol+=1
   return kol
  )else ( return kol )
 
  )
  2011.5.1 函数注销。
  */
 /* ---放在单击事件里的事情
   gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
*/
  ---然后再判断选择的物体必须是线。这样就在线中进行操作了。排除了所有的后忧患。
  ---记住要是改功能就要改函数名字。
 
 
    fn gt_select_spline_classof_shape    =
  (   
   kol =1
   oop=false
    if classof $ !=SplineShape and   classof $ !=line   then oop = true
  
     if oop  then
  (
        if AboutRollout != undefined then destroydialog AboutRollout
  rollout AboutRollout "About"
  (
  label lbl5  "选择的将不是线的类,终止程序。" pos:[10,10]
  label lbl3 "以此提醒。"
  timer tmclose "" interval:1000 active:true
  on AboutRollout rbuttonup press do destroydialog AboutRollout ------ 右键进行消除
  on tmclose tick do destroydialog AboutRollout  --时间按点到消除  给我提供了思路。
  )createdialog AboutRollout 200 100  modal:true style:#(#style_border,#style_sysmenu,#style_sunkenedge)
  
  kol+=1
   return kol
  )else ( return kol )
 
  )
 
 
 
  /* ----在在下面放入第二个单击事件,进阶着上一个进行。
 
     gt_oo_cl = gt_select_spline_classof_shape()
  if gt_oo_cl ==2  then return false  ---看来我要到处用到这两句了。
  */
  ---判断他的因素有多少个,我这样处理,当一个因素时单独处理,(这样一个因素处理完了,多个因素在处理就方便多了。)
  ---当大于一个因素时,在进行循环处理。
  ---当零个因素时,不处理,提出警告。
  ---************************************************************************************
  --*** 说明我这个脚本,只是处理 线的平面状态,
  --*** 用点的方式找坐标我做不好,所以 我还是用,体的形式。这里是 借鉴的“十六月”的。
  --***
  --************************************************************************************
 
 
  --****************************************************
  --***2011.4.28 我想起来了,我在之前的表情幽灵中,用到过表情坐标的。
  --***
  --***
  --******************************************************************
  --*****************************************************************
  --***2011.5.1前几天找到了,收集点坐标的函数。也不用再转成体了,现在的算法,有点慢,其实是把东西转了一大圈。
  --***现在也能对,线的多因素进行分离操作了。效果就是非常的好。
  --****
  --***现在所做的允许多个数量线的访问,所以选择多个的效果就注销的。
  --***
  --*** 针对不同视图,这里要写一个,
  --***
  --********************************************************************
   fn  spline_wrongisright  tolerance_x_num  obj  true_t =
   (
     count_spline = numSplines  obj   ---线有多少因素。
    
    new_obj = case count_spline of
  (
  0: (
   messagebox "选择的形体节点对,但是 没有可编辑因素。" title:"盖天编写"
   return false  
  )---end ()

  1: (
   -- local spline_vertex_array =#() -------顶点数值。段数数值
    local spline_vertex_pos_array =#() -----顶点位置数值
    local spline_vertex_num_array =#() ---- 顶点序号数值(其实是到时候选择的边的编号)
   
   vertex_count_num =  numSegments obj 1  
   -----求综合数值
   
   
   /*
   2011.5.1 又该方案。这里之前是用poly 思路来源于网上的“十六月”这个速度还是慢了点,现在要改成纯线操作。
    --getSegLengths_num = getSegLengths $  1   byVertex:true numArcSteps:100 -- cum:false
   s1=$
   maxOps.cloneNodes $ cloneType:#copy newnodes:&s2
   select s2
   s2.steps =0
   --macros.run "Modifiers" "Extrude"
   convertTo s2 Editable_Poly
   count=polyop.getNumVerts($)
   */

   ----把% 段长 单独的放到一个数组。
   --vertex_count_num 和 count 的数量是一样的。
   for i in 1 to  vertex_count_num do
   (
    oop = getKnotPoint obj 1 i
    append  spline_vertex_pos_array oop
   )----end for
   ---------利用函数 把点的pos 放到一个数组中,方便下来的比较。
   -- select s2
      -- delete s2
   
    --  select s1
   
   
   
   
   ----我想了还是利用循环
   /*
    ----这个原先是段数的相加,这里就不要了。因为我用了上面的拾取点的形式。
   
    local  temporarily =0
   for each in 1 to spline_vertex_array.count do
   (
    pos_to_pos = pathInterp $ 1  temporarily
    append  spline_vertex_pos_array  pos_to_pos
    temporarily+=spline_vertex_array[each]
   )---end for each
   
   
   */
   ----上面暂时先用这种方法。
   /*
   ---我觉的用上面的出来的数字觉得不是很对 改一下
    local  temporarily =spline_vertex_array[1]
   for each in 1 to spline_vertex_array.count do
   (
    pos_to_pos = pathInterp $ 1  temporarily
    append  spline_vertex_pos_array  pos_to_pos
    if each+1 >spline_vertex_array.count then 
    ()else
    (
    temporarily+=spline_vertex_array[each+1]
    )
    )  */ ---end for each
   ----上面暂时先用这种方法。 经我试验 证明了还是要用 我所为“要改的” 其实是正确的。
   
   ---现在就是判断容差值的时间到了,x y 的相减的绝对值,
    unm_array = (spline_vertex_pos_array.count)-1
   for o in 1 to unm_array do
   (
    yu= o+1
    
    if abs (spline_vertex_pos_array[yu].x-spline_vertex_pos_array[o].x)>tolerance_x_num and abs(spline_vertex_pos_array[yu].y-spline_vertex_pos_array[o].y)>tolerance_x_num then
    (
     append  spline_vertex_num_array o ---数组以后对应的就是一个选择边的数组。
     
    ) ---end abs
    
   )---end for in
   -------------------最后在单独的加入数组的首尾 段
   if true_t do
   (
    linshi = spline_vertex_pos_array.count
   
     if    abs( spline_vertex_pos_array[linshi].x-spline_vertex_pos_array[1].x )>tolerance_x_num  and abs( spline_vertex_pos_array[linshi].y-spline_vertex_pos_array[1].y )>tolerance_x_num  then
   (
    append  spline_vertex_num_array  linshi
    
   )---end abs
     )---end if true_t
   ---------------------- 这时上面的组有段数了。 只要转奥层级删除就好了
      max modify mode
     subobjectLevel = 2
     setSegSelection  obj  1 spline_vertex_num_array  keep:false
      max delete ---z
   --  splineOps.delete obj
   --  max create mode
    subobjectLevel = 0
   
  ----英应该就是上面的这个过程。(前提是线上没有层级)转动修改面板 到2 层级选择 选段 删除 转到 0 层。
   
  )---end ()
  default: (
             for ecch  in 1 to  count_spline do
    (
     local spline_vertex_pos_array =#() -----顶点位置数值
        local spline_vertex_num_array =#() ---- 顶点序号数值(其实是到时候选择的边的编号)
   
    vertex_count_num =  numSegments obj ecch  
    -----求综合数值

    for i in 1 to  vertex_count_num do
    (
     oop = getKnotPoint obj ecch  i
     append  spline_vertex_pos_array oop
    )----end for

     unm_array = (spline_vertex_pos_array.count)-1
    for o in 1 to unm_array do
    (
     yu= o+1
     
     if abs (spline_vertex_pos_array[yu].x-spline_vertex_pos_array[o].x)>tolerance_x_num and abs(spline_vertex_pos_array[yu].y-spline_vertex_pos_array[o].y)>tolerance_x_num then
     (
      append  spline_vertex_num_array o ---数组以后对应的就是一个选择边的数组。
      
     ) ---end abs
     
    )---end for in
    -------------------最后在单独的加入数组的首尾 段
     linshi = spline_vertex_pos_array.count
    
      if    abs( spline_vertex_pos_array[linshi].x-spline_vertex_pos_array[1].x )>tolerance_x_num  and abs( spline_vertex_pos_array[linshi].y-spline_vertex_pos_array[1].y )>tolerance_x_num  then
    (
     append  spline_vertex_num_array  linshi
     
    )---end abs
    ---------------------- 这时上面的组有段数了。 只要转奥层级删除就好了
       max modify mode
      subobjectLevel = 2
      setSegSelection  obj  ecch  spline_vertex_num_array  keep:false
       max delete ---z
     subobjectLevel = 0    
    )----end for
   
  )----end ()
  )---end case
  -- subobjectLevel = 0 ---这个就是不能反倒0 的层级。

   
   )---end fn

try (destroydialog gt_closs_spline)catch()
rollout gt_closs_spline "spline_1.0(盖天)" width:160 height:100
(
 groupBox grp1 "容差" pos:[4,2] width:152 height:67
 spinner tolerance_x_spn "X" pos:[26,21] width:50 height:16 range:[0,10000,0.02] type:#float scale:0.0001
 spinner tolerance_y_spn "Y" pos:[93,21] width:50 height:16 range:[0,10000,0.02] type:#float scale:0.0001 enabled:false
 button pressed_del_btn "执行删除" pos:[22,42] width:109 height:20
 
 checkbox  setup "断线处理" checked:false  pos:[6,70]
 --groupBox grp2 "" pos:[4,73] width:152 height:311
 
 
  --- bitmap the_bmp      pos:[8,90] width:145 height:285  fileName:"image_20110501094049.gif" ---到时候做一个钟表控制的效果。
 on tolerance_x_spn changed  arg do
 (
  tolerance_y_spn.value = arg
 )---end on
 
 on  pressed_del_btn pressed do
 (  try (
           DisableSceneRedraw()
     --gt_oo = gt_selctt()
           --if gt_oo ==2  then return false  ---看来我要到处用到这两句了。    
     --这里做循环,
    sel_obj_array=selection as array
    clearSelection()
  ---************************************
  ---****对于线删除线段的操作,成组后在循环操作中,必须一个一个的操作,和手工是一样的,
  ---****要选择后收集节点,取消选择,在选择数组的的每个节点,进行函数的操作。
  --*******************************************
    for i in 1 to  sel_obj_array.count  do
    ( 
         select sel_obj_array[i]
    
   gt_oo_cl = gt_select_spline_classof_shape()
       if gt_oo_cl ==2  then 
    (  EnableSceneRedraw()
     return false   ---看来我要到处用到这两句了。
    )
    ---处理之前收集线的操作,只要是对旋转
    ---1.旋转归0
    ---2.函数操作
    ---3.旋转归位 
            try (
                   XX= $.rotation.controller[1].value
       YY= $.rotation.controller[2].value
       ZZ= $.rotation.controller[3].value
    
               if classof XX== float  and classof YY== float and classof ZZ== float then
      (
        $.rotation.controller[1].value=0
        $.rotation.controller[2].value=0
        $.rotation.controller[3].value=0
       if setup.checked then 
       (
       spline_wrongisright  tolerance_x_spn.value  $ false
     $.rotation.controller[1].value=XX
        $.rotation.controller[2].value=YY
        $.rotation.controller[3].value=ZZ
       )else
       (
        spline_wrongisright  tolerance_x_spn.value  $ true
     $.rotation.controller[1].value=XX
        $.rotation.controller[2].value=YY
        $.rotation.controller[3].value=ZZ
       )---end else check

      
      )
     
        )catch (print "")    
   
    )
    EnableSceneRedraw()
         )catch (print"错")
 )--end
 
 
)
createdialog  gt_closs_spline

posted on 2011-05-01 21:27  盖天00  阅读(240)  评论(0编辑  收藏  举报

导航