OpenCascade:带边界线的圆柱面

功夫

我想使用边界边缘(两条垂直线和两条180°弧线)使半个圆柱面。我知道有更简单的方法可以执行此操作,但是我的实际问题要复杂得多,而且我的边缘大多是样条曲线。因此,我尝试举一个非常简单的例子,希望有人可以帮助我。

根据我的实际输入数据,我不知道边界边的顺序和方向。我所拥有的只是“圆柱面”和“边缘桶,它们形成一个闭合的环路”。那么,如果我的方向不好,我该如何自动解决呢?

这是我的示例代码:

    // make an ARC from 'start' to 'end', counter-clockwise around 'center'.
    TopoDS_Edge mkArc(gp_Pnt start, gp_Pnt center, gp_Pnt end, double normalZ) {
        gp_Circ geometricCircle = GC_MakeCircle(center
                                                , gp_Dir(0, 0, normalZ)
                                                , center.Distance(start)
                                               ).Value()->Circ();
        return BRepBuilderAPI_MakeEdge(geometricCircle, start, end);
    }

    // Make half-cylinder face by using boundary edges
    TopoDS_Face MakeClinderFaceTest() {

        //    ^Z
        //    _
        //  ,´ `.
        // a  c  b
        // |  _  |
        // |,´ `.|
        // A  C  B   -->X

        // top nodes
        gp_Pnt a = gp_Pnt(-1, 0, 0);
        gp_Pnt b = gp_Pnt( 1, 0, 0);
        gp_Pnt c = gp_Pnt( 0, 0, 0);

        // bottom nodes
        gp_Pnt A = gp_Pnt(-1, 0, -1);
        gp_Pnt B = gp_Pnt( 1, 0, -1);
        gp_Pnt C = gp_Pnt( 0, 0, -1);

        // boundary wire
        std::list<TopoDS_Edge> edges;
        if (0) { // 1/0 to reverse the order and direction of edges
            edges.push_back(mkArc(a, c, b,  -1)); // top arc
            edges.push_back(BRepBuilderAPI_MakeEdge(b, B)); // right line
            edges.push_back(mkArc(B, C, A,   1)); // bottom arc
            edges.push_back(BRepBuilderAPI_MakeEdge(A, a)); // left line
        } else {
            edges.push_back(mkArc(b, c, a,   1));
            edges.push_back(BRepBuilderAPI_MakeEdge(a, A));
            edges.push_back(mkArc(A, C, B,  -1));
            edges.push_back(BRepBuilderAPI_MakeEdge(B, b));
        }
        BRepBuilderAPI_MakeWire wire;
        for (auto& e : edges) {
            wire.Add(e);
        }


        auto cylinder = gp_Cylinder( gp_Ax2( C, gp_Dir(0, 0, 1) ), C.Distance(A) /* =R */ );
        #if 0
            // surface geometry: infinite length cylinder
            BRepBuilderAPI_MakeFace cylface(cylinder, wire);
        #else
            // cylindrical face with limits in V direction.
            TopoDS_Face cylinder_face = BRepBuilderAPI_MakeFace(cylinder, 0, 2 * M_PI, 0, 1.0).Face();
            // Limit cylinder by wired edges
            BRepBuilderAPI_MakeFace cylface(cylinder_face, wire);
        #endif

        return cylface;
    }
gkv311

始终最好执行直接建模-例如,以可靠的方式定义有效拓扑构造顶点,边,线,面。

但是考虑问题:

那么,如果我的方向不好,我该如何自动解决呢?

形状修复服务由Open CASCADE Technology中的ShapeFix软件包提供它的主要目的是解决从外部CAD系统导入的形状上的拓扑问题(应用不同的有效性标准或仅将无效形状写入STEP / IGES文件)。

这些工具也可以用于制定“惰性”构建算法或处理用户输入。当心,该工具提供了很多“修复”,例如,解决特定类型问题的算法。启用所有功能不是一个好主意,因为它将极大地影响性能,并且结果可能出乎意料。

在您的特定情况下,您对固定导线方向感兴趣。可以通过ShapeFix_Face这样的帮助来实现(如果我正确理解了您的问题):

// cylindrical face with limits in V direction.
TopoDS_Face cylinder_face = BRepBuilderAPI_MakeFace(cylinder, 0, 2 * M_PI, 0, 1.0).Face();
Handle(Geom_Surface) aSurf = BRep_Tool::Surface (cylinder_face);
// Limit cylinder by wired edges
//BRepBuilderAPI_MakeFace cylface(cylinder_face, wire);
BRepBuilderAPI_MakeFace cylface(aSurf, wire);

ShapeFix_Face aFaceFixer;
aFaceFixer.FixWireMode()          = 1;
aFaceFixer.FixOrientationMode()   = 1;
//aFaceFixer.FixSplitFaceMode()     = 1;
Handle(ShapeFix_Wire) aWireFixer = aFaceFixer.FixWireTool();
aWireFixer->FixConnectedMode() = 1;
aWireFixer->ClosedWireMode()   = Standard_True;
Handle(ShapeBuild_ReShape) aContext = new ShapeBuild_ReShape();
aFaceFixer.SetContext (aContext);

aFaceFixer.Init (cylface);
aFaceFixer.Perform();
TopoDS_Shape aFixResult = aFaceFixer.Result();
if (!aFixResult.IsNull()) { return TopoDS::Face (aFixResult); }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

边界线在策略/ RTS游戏中如何工作?

来自分类Dev

删除组框WPF上的边界线

来自分类Dev

桌子外边界线填充

来自分类Dev

如何在圆柱面上生成正则点

来自分类Dev

是否可以在表格中显示的边界线上放置字符?

来自分类Dev

如何从FireMonkey TListBox控件中删除边界线?

来自分类Dev

我想将边界线旋转45度,同时将img固定在CSS中

来自分类Dev

在OpenCV和C ++中删除边界线

来自分类Dev

如何减少Gadfly中的点边界线宽度

来自分类Dev

如何根据非连续数据点绘制带有间隙的边界线?

来自分类Dev

如何设计CSS <div>的“溢出”边界线?

来自分类Dev

如何在表格视图中更改边界线颜色

来自分类Dev

在CSS中定义适应性边界线

来自分类Dev

创建边界线性渐变

来自分类Dev

我无法正确定位边界线

来自分类Dev

是否可以删除堆叠的条形边界线?

来自分类Dev

从桌子外面的边界线填充

来自分类Dev

在iOS 7的UITableView部分周围绘制边界线

来自分类Dev

图像产生顶部边界线

来自分类Dev

如何将边界线置于图像下方?

来自分类Dev

Kendo Grid,在dataBound调用中访问原始边界线

来自分类Dev

与其他UIView的边界线重叠时,UIView边界线变粗

来自分类Dev

创建波浪边界线

来自分类Dev

运行代码后删除工作表中的边界线

来自分类Dev

如何删除woocommerce中相关产品部分的边界线?

来自分类Dev

如何设计CSS <div>的“溢出”边界线?

来自分类Dev

程序打印使圆柱面积,体积,范围和继承Java保持打印0.0

来自分类Dev

从网站中的元素删除边界线

来自分类Dev

Openpyxl边界线在与另一条边界线的交点处中断