2014-02-14 27 views
1

大家好SketchUp的红宝石API参考删除脸部

我想创建一个多边形移动的顶点(这是一样的在SketchUp移动工具,但它只是移动顶点,而不是边)一个SketchUp的工具。这个多边形是一个多边形的数组。

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

。 这是我的课。我在那里实现了这个工具的功能:onMouseMove,onLButtonDown,绘制。

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是Deleted Face。

感谢您的帮助

+0

需要更多信息。什么是完整的错误信息? “@ polygon”何时被删除的面? – thomthom

+0

另外,你使用批量方法来清除循环内的个体实体:'entities.erase_entities temp_array_edges [i]',为什么不批量擦除所有内容:'entities.erase_entities(temp_array_edges)'? – thomthom

+0

我不知道你对这个工具的要求是​​什么,但我做了一个操作顶点的工具:http://www.thomthom.net/software/vertex_tools/(不是免费的) – thomthom

回答