cut の強化
Boolean operation の一種である cut がうまくいかない場合があるのを何とかする。有限平面を polyline を指定して切り分ける、といったとき、cut の順番によってはうまくいかない(らしい)。
- なによりまず具体例がほしい
- BRepAlgoAPI_Cut でうまくいくかも
- polyline を太らせ(径の小さいpipeを作っ)てから切る。これには、実際に pipe を作らなくても、Tolerance をいじるだけで良いかも: http://opencascade.blogspot.jp/2009/02/topology-and-geometry-in-open-cascade_12.html
- Partition という operation を使う。OCCTのどこに実装されているか不明:https://www.opencascade.com/doc/occt-7.0.0/overview/html/occt_user_guides__boolean_operations.html#occt_algorithms_2_1_3
include Siren
# 3x3 の平面
myface = plane [0, 0], Vec.z, Vec.x, 0, 3, 0, 3
# WIRE 化できないが split 時にそれぞれ影響し合う EDGE
es = []
es << line([1, 0], [1, 2])
es << line([1, 1], [3, 1])
es << line([2, 1], [2, 3])
es << line([2, 2], [0, 2])
# split の実行
es.each do |e|
# 1本1本の EDGE は面を分断していないので
# 結果的に何度やっても切れない
res = myface.split e
p res.subshapes
end
上のコードで split できないという話でしたが、サンプルを書く上で BRepFeat_SplitShape に TopoDS_Edge を引数に取る Add() があることを見つけました。 現行の siren_face_split() 内では TopoDS_Wire しか見てないので、改修して再チェックします。
ae31b439 のように改修してみました。
この評価スクリプトの最後で OCCT の NoSuchObject 例外が発生します。スクリプトで生成している FACE 1つと EDGE 4つは次のような形状です。

BRepFeat_SplitShape の TopoDS_Compound を引数にとる Add に次のような記載がありました。
Adds the compound <Comp> on the face <F>. The compound <Comp> must consist of edges lying on the face <F>. If edges are geometrically connected, they must be connected topologically, i.e. they must share common vertices. Raises NoSuchObject if <F> does not belong to the original shape.
1本の WIRE (EDGEがつながっていることを保証)、1本の EDGE (バラバラに存在できないもの)、または COMPOUND (含まれる EDGE はすべてつながっていなければならない条件つき)ということから、一筆書きでつながっていない EDGE 列で1つの面を split するのは不可能なようです。