Exemplo n.º 1
0
        //--------------------------------------------------------------------------------------------------

        public static bool RenderEdges(IDrawingRenderer renderer, List <TopoDS_Edge> edges, TopoDS_Face face)
        {
            var res = true;

            // Order edges
            var order = new ShapeAnalysis_WireOrder(true, 0.0001);

            foreach (var edge in edges)
            {
                var first = BRep_Tool.Pnt(TopExp.FirstVertex(edge));
                var last  = BRep_Tool.Pnt(TopExp.LastVertex(edge));
                if (edge.Orientation() == TopAbs_Orientation.TopAbs_FORWARD)
                {
                    order.Add(first.Coord, last.Coord);
                }
                else
                {
                    order.Add(last.Coord, first.Coord);
                }
            }
            order.Perform(true);

            if (order.IsDone())
            {
                order.SetChains(0.0001);
                for (int chain = 1; chain <= order.NbChains(); chain++)
                {
                    int startIndex = 0, endIndex = 0;
                    order.Chain(chain, ref startIndex, ref endIndex);
                    if (startIndex > endIndex)
                    {
                        continue;
                    }

                    // Process ordered edges
                    renderer.BeginPathSegment();
                    for (int index = startIndex; index <= endIndex; index++)
                    {
                        int orderIndex    = order.Ordered(index);
                        int originalIndex = Math.Abs(orderIndex) - 1; // order index is 1-based
                        res &= RenderEdge(renderer, edges[originalIndex], orderIndex < 0, face);
                    }
                    renderer.EndPathSegment();
                }
            }
            else
            {
                // Cannot sort, just pump out all edges
                foreach (var edge in edges)
                {
                    res &= RenderEdge(renderer, edge, false, face);
                }
            }

            return(res);
        }
Exemplo n.º 2
0
        //--------------------------------------------------------------------------------------------------

        public static void RenderArrow(IDrawingRenderer renderer, Ax2d location, double scale = 1.0)
        {
            var arrowSize = GetArrowSize();

            var p1        = location.Location;
            var backpoint = p1.Translated(location.Direction.Reversed().ToVec(arrowSize.Length * scale));
            var rightVec  = new Vec2d(location.Direction.Y, -location.Direction.X).Scaled(arrowSize.Width * 0.5 * scale);
            var p2        = backpoint.Translated(rightVec);
            var p3        = backpoint.Translated(rightVec.Reversed());

            renderer.SetStyle(null, new FillStyle(Common.Color.Black), null);
            renderer.BeginPath();
            renderer.BeginPathSegment();
            renderer.Line(p1, p2);
            renderer.Line(p2, p3);
            renderer.Line(p3, p1);
            renderer.EndPathSegment();
            renderer.EndPath();
        }