【问题标题】:Sketchup Ruby API reference to deleted FaceSketchup Ruby API 对已删除人脸的参考
【发布时间】:2014-02-14 09:33:15
【问题描述】:

大家好

我想创建一个用于在多边形中移动顶点的 Sketchup 工具(它与 SketchUp 中的移动工具相同,只是它只是移动顶点,而不是边缘)。这个多边形在一个多边形数组中。

我创建了一个“工具”类,当我选择一个顶点的第一个顶点时,将其移动到另一个位置,并创建相应的多边形,替换数组中的旧多边形。但是当我第二次选择一个顶点时,ruby 控制台显示错误:引用已删除的面

。 这是我的课。我在那里实现了这个工具:onMouseMove、onLButtonDown、draw。
class MoveVertexPolygon
   # an array of polygon
   def gridview
      @gridview
   end
   def gridview=(g)
     @gridview=g
   end

   def initialize
     @polygon = nil
     @bSelected = false
     @arr_vertex = []
     @drawn = false
     @pos= -1
  end

def onLButtonDown(flags, x, y, view)
   #if user don't click any vertex before.
   if(@bSelected == false)
     ip = view.inputpoint x,y
     selected_x = ip.position.x.to_f
     selected_y = ip.position.y.to_f
     pt = Geom::Point3d.new(selected_x, selected_y, 0)

     #get appropriate polygon position in array of polygon 
     @pos = @gridview.getIndexByCoordinate(selected_x,selected_y)
     #reset array of vertex
     @arr_vertex.clear

     #get polygon with given position
     @polygon = @gridview.array_element[@res].polygon

     #select a vertex
     if(@polygon != nil && @polygon.valid? && @polygon.is_a? Sketchup::Face)
        type = @polygon.classify_point(pt)
        if(type == Sketchup::Face::PointOnVertex)
           i = 0
           while( i < @polygon.edges.length)
               @arr_vertex.push(@polygon.edges[i].vertices[0].position)
               if(pt == @polygon.edges[i].vertices[0].position)
                  @selectedVertexIndex = i
                  @bSelected = true
               end
              i = i + 1
           end;
        end
     end
  #if user selected vertex, move it to another position
  else
    @bSelected = false
    @drawn = false
    @gridview.array_element[@res].polygon = @polygon
  end
end

def onMouseMove(flags, x, y, view)
#if user select a vertex, then let's user choose a position of this vertex, display a temporary          #polygon
   if(@bSelected)
     @ip = view.inputpoint x,y
     view.invalidate
   end
end

def draw(view)
    if(@drawn == false)
       entities = view.model.entities

       temp_x = @ip.position.x.to_f
       temp_y = @ip.position.y.to_f
       pt = Geom::Point3d.new(temp_x, temp_y, 0)

       #delete all edges and face of @polygon
       i=0
       temp_array_edges = []
       while(i < @polygon.edges.length)
         temp_array_edges.push(@polygon.edges[i])
         i = i + 1
       end;
       len = temp_array_edges.length
       i=0
       while(i < len)
        entities.erase_entities temp_array_edges[i] 
        i = i + 1
       end;

       #draw polygon again
       @polygon = nil
       @arr_vertex[@selectedVertexIndex] = pt
       @polygon = entities.add_face @arr_vertex

     end
end

错误说@polygon 是已删除的人脸。

感谢您的帮助

【问题讨论】:

  • 需要更多信息在这里。完整的错误信息是什么? @polygon 什么时候被删脸了?
  • 另外,您使用批量方法擦除循环内的单个实体:entities.erase_entities temp_array_edges[i],为什么不批量擦除所有内容:entities.erase_entities(temp_array_edges)
  • 不知道你对这个工具有什么要求,但是我做了一个操作顶点的工具:thomthom.net/software/vertex_tools(不是免费的)
  • 为什么要在工具的draw 事件中擦除实体?该事件用于将 OpenGL 指令绘制到视口。它通常每秒被调用多次,擦除实体或创建它们是没有意义的。
  • @thomthom:完整错误消息:错误:# at line code : while(i

标签: ruby sketchup


【解决方案1】:

无需不断地擦除和重新创建面,只需将顶点变换到新位置即可。 entities.transform_by_vectors 会让你这样做。 http://www.sketchup.com/intl/en/developer/docs/ourdoc/entities.php#transform_by_vectors

如果您想在使用工具时临时显示任何内容,请使用view.draw 绘制到视口。

除了在draw 事件中绘制到视口之外,您确实应该避免做任何事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2021-10-13
    • 2018-02-25
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多