mruby-siren icon indicating copy to clipboard operation
mruby-siren copied to clipboard

cut の強化

Open shizuo-kaji opened this issue 9 years ago • 2 comments

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

shizuo-kaji avatar Sep 13 '16 13:09 shizuo-kaji

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 しか見てないので、改修して再チェックします。

dyama avatar Sep 15 '16 01:09 dyama

ae31b439 のように改修してみました。

この評価スクリプトの最後で OCCT の NoSuchObject 例外が発生します。スクリプトで生成している FACE 1つと EDGE 4つは次のような形状です。

split

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 するのは不可能なようです。

dyama avatar Sep 16 '16 15:09 dyama