是否有过这样的经历?一个多段线段组成的环形,画一个对角线只有一半生成平面,在剩下的部分继续画线,又是只有一半生成了面,如此地持续下去,在不断的放大中或许终于完成了整个平面,随后开始删除平面上的“辅助线”。这种情况估计很多SU玩家都经历过,并且通常出现在CAD导入的底平面线稿中,圆弧又是其中的重灾区。
在绘制一条线段后,SU会自己判断是否需要创建新的平面或是分割旧的平面,但是存在下面这种情况会使得SU认为不要创建平面,如下图所示,一个在同一平面的闭合环状多段线如果其内部没有与这个多段线相连的线段则可以生成平面,如果同一平面的环状多段线内部出现了与之相连的线头,则不会生成。了解了这一点之后我们就有办法解决大部分不能生成面的问题了。
但是通常这样的线头是非常细小的,这才致使SU玩家不容易发现他们,而上演无限切割的“喜剧”。所以下面将提供一个发现这些线头的方法。
一个环状多段线是首尾相连的线段组成的,而这些线头有一端是“悬空”的,或者说这些线头的其中一个端点只连接有这一条线段,所以只要找到模型中所有符合上面分析出来条件的线段,并清除掉,就可以帮助解决不能产生面的方法。
SketchUp中一个线段是一个对象,通过这个对象可以访问它的端点,又可以通过一个具体的端点访问它所连接的线段。所以在ruby脚本中需要用到线段类(Edge)和端点类(Vertex)这两个实体类(Entity)。而这些实体储存在一个实体容器(Entities)中,SU模型中的所有可见的要素都囊括在内,每一个线段每一个面都可以从这个容器中获得。以下是初步的使用方法,具体的使用方法可能会有更加系统的教程,下面这一小段代码示例可以先跳过。
ents=Sketchup.active_model.entities
ents[0]
ents.each{|i|f(i)}
ents[0].typename
ents[0].length
ents[0].vertices[0]
ents[0].vertices[1]
(ents[0].vertices[1]).typename
(ents[0].vertices[1]).edges
(ents[0].vertices[1]).edges.length
ents[0].erase!
下面是实现的方法,第一个函数将符合条件的线头全部删除,第二个函数则是将符合条件的全部选中,每一步的注释解释每一行代码在做什么:
module Apiglio
def Apiglio.ents Sketchup.active_model.entities end
def Apiglio.sels Sketchup.active_model.selection end
def Apiglio.delete_thrum list=[] Apiglio.ents.each{|i| if i.typename=="Edge" then if i.vertices[0].edges.length==1 or i.vertices[1].edges.length==1 then list<<i end end } list.each{|i|if i.deleted? then else i.erase! end} end
def Apiglio.select_thrum Apiglio.sels.clear Apiglio.ents.each{|i| if i.typename=="Edge" then if i.vertices[0].edges.length==1 or i.vertices[1].edges.length==1 then Apiglio.sels.add i end end } end end
保存成apiglio.rb后将文件放在Tool文件夹中,之后在Ruby控制台输入以下内容即可查找线头:
load "apiglio.rb" Apiglio.select_thrum
以下是执行的效果:
这种方法可以找到符合条件的线头,但是当删除这些线头时,有可能出现新的线头,所以最好是多次使用这个方法。另外,这种方法可以找到不能生成面的“害群之马”,但是如何处理应该要有更好的方式,而不应该是简单地删除,所以后续还会有关于生成面的其他解决方式。
|