关于封闭的brep在TrimBrep中的用法

TrimBrep默认保留cutter法线方向的物体,但是当使用封闭实体作为cutter时,封闭的实体好像无法翻转法线方向,此时该如何在切割后保留实体外部的物体,而不是实体内部的物体?

你说的应该是Trim Solid运算器
这个运算器的cutter要求是封闭实体,如果你提供了非封闭实体,会提示出错“It is only possible to trim with closed Breps”


他的逻辑是判断切完的东西是在cutter内部还是外部,和cutter本身的法线没关系。
而一个封闭实体的法线永远朝外,并且无法反转
image

所以如果你说的Trim Brep体现出的 “默认保留cutter法线方向的物体” 的特性,这个Trim Brep是不是某第三方插件?

2 个赞

不好意思没表述清楚,是用的rhinoscriptsyntax里的TrimBrep……在gh里用hare插件将cutter翻转后再用rs.TrimBrep可以保留cutter外部的物体,不翻转就只能保存cutter内部的物体,但是不用插件好像就无法翻转封闭的cutter,就无法保留cutter以外的物体了

Hare这个插件我并没有在Food4Rhino搜索到。
请注意:由于第三方插件太多,原厂和mcneel不可能熟知每个插件的内部原理,涉及到第三方插件的问题,请你直接联系插件作者咨询。

RS的TrimBrep命令帮助如下
https://developer.rhino3d.com/api/rhinoscript/surface_and_polysurface_methods/trimbrep.htm

如果你确定需要用非常规手段强行反转封闭曲面的法线。你得记录和备注自己的这一步操作,因为某个封闭实体的面如果全部呈现反转状态,在你后续的处理中极其容易出现异常,并且很可能之后你就忘记了。

如果你希望不使用插件,强行反转封闭实体的方向,相当于赋予一个 “假方向”
请参考下图代码。


关于曲面的真方向和假方向相关的问题可以参考这个帖子

注意:尽量回避这类非常规操作,想要返回cutter之外的物体,宁可自己使用split后加上判断,这个对于优化计算速度也有很大帮助。

2 个赞

关于这个问题,其实rs.TrimBrep()函数的核心代码是调用Brep.Trim()方法实现的。在Brep.Trim方法下说明了保留物体与切割物体法线方向相反的保留。

如果你非要用这个方法的话也是可以的。在rhinocommon中是可以反转封闭实体的法线,这里我为了方便看就单独拿一个python电池写了一下。

#需要右键把brep的参数类型设置为Brep
import Rhino.Geometry as rg
if (brep.IsSolid and brep.SolidOrientation == rg.BrepSolidOrientation.Outward):
    brep.Flip()
    a = brep

这里我简单用rhinocommon实现一下。

#需要右键把brep和cutBrep的参数类型设置为Brep
import Rhino.Geometry as rg

#如果是封闭实体,并且发线向外就反转一下。
if (cutBrep.IsSolid and cutBrep.SolidOrientation == rg.BrepSolidOrientation.Outward):
    cutBrep.Flip()

a = brep.Trim(cutBrep,0.01)

TrimBrep.gh (11.2 KB)

1 个赞

总结并补充一下月神和我说的
问题比较复杂,也涉及到一些犀牛比较奇怪的设定。

首先是重要的:rs.TrimBrep()和Rhinocommon内的Brep.Trim()功能基本一致,但是无法通用,他们的内核有微小的区别。

月神的Brep.SolidOrientation只能配合Rhinocommon的Brep.Trim使用
而我的Brep.Faces.OrientatioIsReversed只能配合rhinoscript的rs.TrimBrep()使用

下面我介绍一下他们的区别

一:Rhinocommon 方法Brep.Flip()
操作对象:隶属Brep的Flip属性,虽然将Brep自己的方向反转为朝内了,但是他并未修改Brep内所有Face的单独法向。
检测方法:将物体Bake到犀牛,炸开后,检查曲面法线,他们仍然朝外。

注意:错误的检测方法是使用GH的Deconstruct Brep运算器炸开后查看法向,会发现法向朝内了,具体原因不明确。推测是Deconstruct Brep使用的DuplicateFaces函数在炸开物体时,会将Brep本身Flip的属性作为判断机制赋予给曲面。这一点和犀牛的炸开性质不同

配合使用:需要配合Brep.SolidOrientation判断Brep自身的Flip属性。并且配合Rhinocommon的Brep.Trim()完成内外切割控制
不能配合使用:rs.TrimBrep(),因为他检测的是Brep炸开后隶属于曲面的法向

二:Rhinocommon 属性Brep.Faces.OrientatioIsReversed
操作对象:Brep内的单一Face的方向
检测方法:将物体Bake到犀牛,炸开后,检查曲面法线,他们变为朝内。使用GH的Deconstruct Brep运算器炸开后查看法向,也变为朝内。

注意:该命令会给BrepFace赋予一个reverse属性,也就是“假方向”,这个方向不符合曲面uv方向的螺旋定则。是一个假的方向,常见于物体镜像后导致。详见我第一个回帖的第一个链接

配合使用:配合rs.TrimBrep内的法线检测机制使用
不能配合使用:Rhinocommon的Brep.Trim(),因为他检测的是Brep自身的Flip属性

2 个赞