1
我想创建一个多边形移动的顶点(这是一样的在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。
感谢您的帮助
需要更多信息。什么是完整的错误信息? “@ polygon”何时被删除的面? – thomthom
另外,你使用批量方法来清除循环内的个体实体:'entities.erase_entities temp_array_edges [i]',为什么不批量擦除所有内容:'entities.erase_entities(temp_array_edges)'? – thomthom
我不知道你对这个工具的要求是什么,但我做了一个操作顶点的工具:http://www.thomthom.net/software/vertex_tools/(不是免费的) – thomthom