示例#1
0
        public void GeometryPerpendicularTest()
        {
            var plnOfTheView = new gpPln(new gpPnt(0, 0, 0), new gpDir(0, 0, 1));
            var document     = TestUtils.DefaultsSetup();
            var solver       = new Solver(document);

            document.Transact();
            var sketchCreator = new SketchCreator(document, false);
            var sketchNode    = sketchCreator.BuildSketchNode();

            document.Commit("Added sketch");
            document.Transact();
            // Test parallelism
            var perpendicularMatch = new OrthogonalLineMatch(solver, 5.0 / 180 * Math.PI);

            var initialPosition = new Point3D(6, 2, 0);
            var currentPosition = new Point3D(3.9, 4, 0);
            var line            = TestUtils.Line(document, sketchNode, new Point3D(1, 1, 0), new Point3D(4, 4, 0));
            var result          = new SolverGeometricObject(line.Node);

            NodeHelper.BuildSolverInfo(result, result.Parent, 0.0872, true);
            solver.Refresh();
            var solution = perpendicularMatch.InterestingShapeAroundPoint(plnOfTheView, currentPosition, initialPosition);

            Assert.IsTrue(solution.Point.X - 3.95 < Precision.Confusion, "Invalid X solution");
            Assert.IsTrue(solution.Point.Y - 4.05 < Precision.Confusion, "Invalid Y solution");
            Assert.IsTrue(solution.Point.Z < Precision.Confusion, "Invalid Z solution");
        }
示例#2
0
 private static void AddGeometry(SolverGeometricObject geometry, List <SolverGeometricObject> solverGeometry)
 {
     if (geometry != null && !geometry.IsEmpty)
     {
         solverGeometry.Add(geometry);
     }
 }
示例#3
0
        private static void AddOriginPoint(List <SolverGeometricObject> solverGeometry)
        {
            var originPoint = new SolverGeometricObject(null);

            originPoint.AddPoint(new SolverDataPoint(new Point3D()));
            AddGeometry(originPoint, solverGeometry);
        }
示例#4
0
        /// <summary>
        ///   Builds the solver info (magic points and planes) receiving as parameter a shape.
        /// </summary>
        /// <param name = "solverObject"></param>
        /// <param name = "shape"></param>
        /// <param name = "parallelPrecision"></param>
        /// <param name = "computeParallelism"></param>
        public static void BuildSolverInfo(SolverGeometricObject solverObject, Node shape,
                                           double parallelPrecision, bool computeParallelism)
        {
            var solidShape = ShapeUtils.ExtractShape(solverObject.Parent);

            // Build a list with the magic points made by the vertexes
            BuildPointList(shape, solverObject);
            var functionName = shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name;

            if (functionName == FunctionNames.LineTwoPoints || functionName == FunctionNames.Arc ||
                functionName == FunctionNames.Arc3P || functionName == FunctionNames.Circle ||
                functionName == FunctionNames.Ellipse)
            {
                // Build a list with the edges
                BuildEdgeList(solidShape, solverObject);
            }
            // Build a list with the magic points made by the faces/surfaces
            BuildFaceList(solidShape, solverObject);

            // Build a list with parallel axis
            if (!computeParallelism)
            {
                return;
            }
            if (NodeBuilderUtils.NodeIsOnSketch(new NodeBuilder(shape)))
            {
                BuildParallelAxisList(solidShape, solverObject, parallelPrecision);
            }
        }
示例#5
0
        public void GeometryParallelismTest()
        {
            var document = TestUtils.DefaultsSetup();
            var solver   = new Solver(document);

            document.Transact();
            var sketchCreator = new SketchCreator(document, false);
            var sketchNode    = sketchCreator.BuildSketchNode();

            document.Commit("Added sketch");
            document.Transact();
            // Test parallelism
            var parallelMatch = new ParallelLineMatch(solver, 5.0 / 180 * Math.PI);

            var initialPosition = new Point3D(3, 1, 0);
            var currentPosition = new Point3D(4.05, 1.95, 0);
            var line            = TestUtils.Line(document, sketchNode, new Point3D(1, 1, 0), new Point3D(3, 3, 0));
            var result          = new SolverGeometricObject(line.Node);

            NodeHelper.BuildSolverInfo(result, result.Parent, 0.0872,
                                       true);
            solver.Refresh();
            var solution = parallelMatch.GeometryParallel(currentPosition, initialPosition);

            Assert.IsTrue(solution.Point.X - 4 < Precision.Confusion, "Invalid X axis parallelism");
            Assert.IsTrue(solution.Point.Y - 2 < Precision.Confusion, "Invalid Y axis parallelism");
            Assert.IsTrue(solution.Point.Z < Precision.Confusion, "Invalid Z axis parallelism");
        }
        public void EdgeContinuationDetectionTest()
        {
            var plnOfTheView = new gpPln(new gpPnt(0, 0, 0), new gpDir(0, 0, 1));
            var document     = TestUtils.DefaultsSetup();
            var solver       = new Solver(document);

            document.Transact();
            var sketchCreator = new SketchCreator(document, false);
            var sketchNode    = sketchCreator.BuildSketchNode();

            document.Commit("Added sketch");
            document.Transact();
            // Test parallelism
            var linecontinuationMatch = new EdgeContinuationMatch(solver, 5.0 / 180 * Math.PI);

            var currentPosition = new Point3D(4.02, 4, 0);
            var line            = TestUtils.Line(document, sketchNode, new Point3D(1, 1, 0), new Point3D(3, 3, 0));
            var result          = new SolverGeometricObject(line.Node);

            NodeHelper.BuildSolverInfo(result, result.Parent, 0.0872,
                                       true);
            solver.Refresh();
            var solutions = linecontinuationMatch.InterestingShapeAroundPoint(plnOfTheView, currentPosition);

            Assert.AreEqual(solutions.Count, 1);
            var solution = solutions.First();

            Assert.IsTrue(solution.Point.X - 4.01 < Precision.Confusion, "Invalid X solution");
            Assert.IsTrue(solution.Point.Y - 4.01 < Precision.Confusion, "Invalid Y solution");
            Assert.IsTrue(solution.Point.Z < Precision.Confusion, "Invalid Z solution");
        }
示例#7
0
        public void SameXCoordinateMatch()
        {
            var document = TestUtils.DefaultsSetup();
            var solver   = new Solver(document);

            document.Transact();
            var sketchCreator = new SketchCreator(document, false);
            var sketchNode    = sketchCreator.BuildSketchNode();

            document.Commit("Added sketch");
            document.Transact();

            var point = new SolverGeometricObject(sketchNode);

            point.AddPoint(new SolverDataPoint(new Point3D(10, 2, 0)));
            solver.Geometry.Add(point);
            solver.LastGeometry.Add(point);
            var coordinateMatch = new SameCoordinatePoints(solver, 2);

            var pointN       = new Point3D(10 + 0.1, 20 - 0.1, 0.1);
            var plnOfTheView = new gpPln(new gpPnt(0, 0, 0), new gpDir(0, 0, 1));
            var solutions    = coordinateMatch.InterestingShapeAroundPoint(plnOfTheView, pointN);

            Assert.AreEqual(solutions.Count, 1);
            var solution = solutions.First();

            Assert.IsTrue(solution != null, "A solution should be found");
            Assert.IsTrue(solution is SolverEdgeTwoPointsResult, "Invalid solution type");
            Assert.IsTrue(solution.Point.IsEqual(new Point3D(10, 19.9, 0)), "Invalid magic point found");
        }
 protected override bool Extract(SolverGeometricObject solverObject)
 {
     if (!ShapeUtils.HasShape(solverObject.Parent))
     {
         return(false);
     }
     NodeHelper.BuildSolverInfo(solverObject, solverObject.Parent, AnglePrecision,
                                ComputeParallelism);
     return(true);
 }
示例#9
0
        protected override bool Extract(SolverGeometricObject data)
        {
            var builder     = Builder;
            var firstPoint  = builder[0].TransformedPoint3D.AddCoordinate(new Point3D(-1000, 0, 0));
            var secondPoint = firstPoint.AddCoordinate(new Point3D(2000, 0, 0));
            var edge        = new BRepBuilderAPIMakeEdge(firstPoint.GpPnt, secondPoint.GpPnt).Edge;

            data.Edges.Add(new SolverEdge(edge));
            return(true);
        }
        public SolverGeometricObject ExtractSolverGeometry(Node node)
        {
            var result = new SolverGeometricObject(node);

            if (!HasShapeOrInteractive(node))
            {
                return(result);
            }
            Builder = new NodeBuilder(node);
            return(Extract(result) ? result : null);
        }
 protected override bool Extract(SolverGeometricObject data)
 {
     if (data.Builder[0].Name == FunctionNames.Point)
     {
         data.Points.Add(new SolverDataPoint(data.Builder[0].RefTransformedPoint3D));
     }
     if (data.Builder[0].Name == FunctionNames.AxisHandle)
     {
         data.Points.Add(new SolverDataPoint(data.Builder[0].Axis3D.Location));
     }
     return(base.Extract(data));
 }
示例#12
0
        protected override bool Extract(SolverGeometricObject data)
        {
            if (!ShapeUtils.HasShape(data.Parent))
            {
                return(false);
            }
            var pointCount = data.Builder[0].Integer;

            for (var i = 1; i <= pointCount; i++)
            {
                data.Points.Add(new SolverDataPoint(data.Builder[i].TransformedPoint3D));
            }
            return(true);
        }
示例#13
0
        public void XYCoordinatesMatch()
        {
            var document = TestUtils.DefaultsSetup();
            var solver   = new Solver(document);

            document.Transact();
            var sketchCreator = new SketchCreator(document, false);
            var sketchNode    = sketchCreator.BuildSketchNode();

            document.Commit("Added sketch");
            document.Transact();

            var point = new SolverGeometricObject(sketchNode);

            point.AddPoint(new SolverDataPoint(new Point3D(4, 11, 0)));
            solver.Geometry.Add(point);
            solver.LastGeometry.Add(point);
            var interestingPoints = new List <SolverPreviewObject>();
            var pointN            = new Point3D(3.9, 2.9, 0.1);
            var plnOfTheView      = new gpPln(new gpPnt(0, 0, 0), new gpDir(0, 0, 1));
            var coordinateMatch   = new SameCoordinatePoints(solver, 2);
            var solutions         = coordinateMatch.InterestingShapeAroundPoint(plnOfTheView, pointN);

            Assert.AreEqual(solutions.Count, 1);
            var solution = solutions.First();

            Assert.IsTrue(solution != null, "A solution should be found");
            Assert.IsTrue(solution is SolverEdgeTwoPointsResult, "Invalid solution type");
            interestingPoints.Add(solution);

            point = new SolverGeometricObject(sketchNode);
            point.AddPoint(new SolverDataPoint(new Point3D(10, 3, 0)));
            solver.Geometry.Clear();
            solver.LastGeometry.Clear();
            solver.Geometry.Add(point);
            solver.LastGeometry.Add(point);
            coordinateMatch = new SameCoordinatePoints(solver, 2);
            solutions       = coordinateMatch.InterestingShapeAroundPoint(plnOfTheView, pointN);
            Assert.AreEqual(solutions.Count, 1);
            solution = solutions.First();
            interestingPoints.Add(solution);
            Assert.IsTrue(solution != null, "A solution should be found");
            Assert.IsTrue(solution is SolverEdgeTwoPointsResult, "Invalid solution type");

            var results = SolverTestsUtils.GetIntersectionPoints(interestingPoints, document);

            Assert.AreEqual(results.Count, 1, "Wrong number of intersection results!");
            Assert.IsTrue(results[0].IsEqual(new Point3D(4, 3, 0)), "Invalid magic point found");
        }
示例#14
0
        private static void BuildPointList(TopoDSShape solidShape, SolverGeometricObject solverObject)
        {
            var listOfVertexes = GeomUtils.ExtractPoints(solidShape);

            if (listOfVertexes.Count <= 0)
            {
                return;
            }
            var index = 1;

            foreach (var pnt in listOfVertexes)
            {
                BuildSolverVertex(solverObject, pnt, GeometryType.EndPoint, index++);
            }
        }
示例#15
0
        private static void BuildEdgeList(TopoDSShape solidShape, SolverGeometricObject solverObject)
        {
            var listOfEdges = GeomUtils.ExtractEdges(solidShape);

            if (listOfEdges.Count <= 0)
            {
                return;
            }
            var edgeIndex = 1;

            foreach (var edge in listOfEdges)
            {
                solverObject.Edges.Add(new SolverEdge(edge, GeometryType.Edge, solverObject.Parent));
                BuildMidPointVertex(solverObject, edgeIndex, edge);
                edgeIndex++;
            }
        }
        private static void InitializeGeometry(ICollection <SolverGeometricObject> geometry)
        {
            var document = TestUtils.DefaultsSetup();

            // Make a rectangle
            var rectObject = new SolverGeometricObject(null);

            rectObject.Points.Add(new SolverDataPoint(new Point3D(0, 0, 0), GeometryType.EndPoint));
            rectObject.Points.Add(new SolverDataPoint(new Point3D(0, 0, 100), GeometryType.EndPoint));
            rectObject.Points.Add(new SolverDataPoint(new Point3D(100, 0, 0), GeometryType.EndPoint));
            rectObject.Points.Add(new SolverDataPoint(new Point3D(100, 0, 100), GeometryType.EndPoint));

            var pln   = new gpPln(new gpPnt(0, 0, 0), new gpDir(0, 1, 0));
            var plane = new SolverPlane(pln);

            rectObject.Planes.Add(plane);

            geometry.Add(rectObject);
        }
示例#17
0
        public static void BuildIntersectionsPointList(List <SolverGeometricObject> solverGeometry)
        {
            var qosLock = QosFactory.Instance.Get(QosNames.EdgeIntersectionLock) ??
                          QosFactory.Instance.Create(QosNames.EdgeIntersectionLock, 120,
                                                     "Edge Intersection precomputation works too slow! Do you want to disable it?");

            qosLock.Begin();
            var intersectedGeometryContainer = new SolverGeometricObject(null);
            var intersections = BuildEdgeIntersectionList(solverGeometry);

            intersections = GeomUtils.SortAndCompactListPoints(intersections).ToArray();
            foreach (var intersectdPoint in intersections)
            {
                intersectedGeometryContainer.Points.Add(new SolverDataPoint(intersectdPoint,
                                                                            GeometryType.EdgeIntersection));
            }
            solverGeometry.Add(intersectedGeometryContainer);
            qosLock.End();
        }
示例#18
0
 private static void BuildPointList(Node shape, SolverGeometricObject solverObject)
 {
     if (shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Point)
     {
         var point = new NodeBuilder(shape).Dependency[1].TransformedPoint3D;
         solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
         return;
     }
     if (shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.LineTwoPoints)
     {
         var point = new NodeBuilder(shape).Dependency[0].RefTransformedPoint3D;
         solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
         point = new NodeBuilder(shape).Dependency[1].RefTransformedPoint3D;
         solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
         return;
     }
     if (shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Circle)
     {
         var point = new NodeBuilder(shape).Dependency[0].RefTransformedPoint3D;
         solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
         return;
     }
     if (shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Arc ||
         shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Arc3P)
     {
         var point = new NodeBuilder(shape).Dependency[0].RefTransformedPoint3D;
         solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
         point = new NodeBuilder(shape).Dependency[1].RefTransformedPoint3D;
         solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
         point = new NodeBuilder(shape).Dependency[2].RefTransformedPoint3D;
         solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
     }
     if (shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Extrude ||
         shape.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Cut)
     {
         var points = GeomUtils.ExtractPoints(new NodeBuilder(shape).Shape);
         foreach (var point in points)
         {
             solverObject.Points.Add(new SolverDataPoint(point, GeometryType.EndPoint));
         }
     }
 }
示例#19
0
        private static void BuildMidPointVertex(SolverGeometricObject solverObject, int edgeIndex, TopoDSEdge edge)
        {
            Point3D?first, last;

            GeomUtils.EdgeRange(edge, out first, out last);
            if (first == null || last == null)
            {
                return;
            }
            var firstPoint = (Point3D)first;
            var lastPoint  = (Point3D)last;
            var midPoint   = new Point3D((firstPoint.X + lastPoint.X) / 2,
                                         (firstPoint.Y + lastPoint.Y) / 2,
                                         (firstPoint.Z + lastPoint.Z) / 2);

            solverObject.Points.Add(new SolverDataPoint(midPoint)
            {
                GeometryType = GeometryType.MidPoint
            });
        }
示例#20
0
        private static void BuildEdgeIntersections(SolverGeometricObject geometricObject,
                                                   SolverGeometricObject destinationObject,
                                                   List <Point3D> intersectionList)
        {
            foreach (var edge in geometricObject.Edges)
            {
                var edgeIntersector = edge.Edge;
                foreach (var destinationEdge in destinationObject.Edges)
                {
                    var edgeToIntersect = destinationEdge.Edge;
                    if (edgeIntersector.IsSame(edgeToIntersect))
                    {
                        continue;
                    }

                    var intersectionPoints = GeomUtils.IntersectionPoints(edgeIntersector, edgeToIntersect);
                    intersectionList.AddRange(intersectionPoints);
                }
            }
        }
示例#21
0
        private static void BuildParallelAxisList(TopoDSShape solidShape, SolverGeometricObject solverObject,
                                                  double angle)
        {
            var listOfEdges = GeomUtils.ExtractEdges(solidShape);

            if (listOfEdges.Count <= 0)
            {
                return;
            }
            var extractedAxises = new List <SolverParallelAxis>();

            foreach (var edge in listOfEdges)
            {
                var curve = new BRepAdaptorCurve(TopoDS.Edge(edge));
                if (curve.GetType != GeomAbsCurveType.GeomAbs_Line)
                {
                    continue;
                }
                var buildAxis = new SolverParallelAxis(edge);
                var isParallelWithPreviousAxes = false;
                foreach (var axis in extractedAxises)
                {
                    if (!axis.IsParallel(buildAxis.Vector, angle))
                    {
                        continue;
                    }
                    isParallelWithPreviousAxes = true;
                    break;
                }
                if (!isParallelWithPreviousAxes)
                {
                    extractedAxises.Add(buildAxis);
                }
            }
            foreach (var extractedAxis in extractedAxises)
            {
                solverObject.ParallelAxis.Add(extractedAxis);
            }
        }
示例#22
0
        private static void InitializeGeometry(ICollection <SolverGeometricObject> geometry)
        {
            // Make a rectangle
            var rectObject = new SolverGeometricObject(null);

            // Add some dummy points
            rectObject.Points.Add(new SolverDataPoint(new Point3D(0, 0, 0), GeometryType.EndPoint));
            rectObject.Points.Add(new SolverDataPoint(new Point3D(10, 10, 0), GeometryType.EndPoint));
            rectObject.Points.Add(new SolverDataPoint(new Point3D(0, 10, 0), GeometryType.EndPoint));
            rectObject.Points.Add(new SolverDataPoint(new Point3D(10, 0, 0), GeometryType.EndPoint));
            rectObject.Points.Add(new SolverDataPoint(new Point3D(-10, -10, 0), GeometryType.EndPoint));

            // Add two edges to intersect
            var edge1 = new BRepBuilderAPIMakeEdge(new Point3D(0, 0, 0).GpPnt, new Point3D(10, 10, 0).GpPnt).Edge;

            rectObject.Edges.Add(new SolverEdge(edge1));
            var edge2 = new BRepBuilderAPIMakeEdge(new Point3D(0, 10, 0).GpPnt, new Point3D(10, 0, 0).GpPnt).Edge;

            rectObject.Edges.Add(new SolverEdge(edge2));

            geometry.Add(rectObject);
        }
示例#23
0
        private static void BuildFaceList(TopoDSShape solidShape, SolverGeometricObject solverObject)
        {
            var listOfFaces = GeomUtils.ExtractFaces(solidShape);

            if (listOfFaces.Count <= 0)
            {
                return;
            }
            foreach (var face in listOfFaces)
            {
                var surf = BRepTool.Surface(face);
                solverObject.Surfaces.Add(new SolverSurface(surf, GeometryType.Face));

                // Check if surface is planar
                var aFaceElementAdaptor = new BRepAdaptorSurface(face, true);
                var surfaceType         = aFaceElementAdaptor.GetType;
                if (surfaceType != GeomAbsSurfaceType.GeomAbs_Plane)
                {
                    continue;
                }
                GeomPlane pl = surf.Convert <GeomPlane>();
                solverObject.Planes.Add(new SolverPlane(pl.Pln, GeometryType.Plane, solverObject.Parent));
            }
        }
示例#24
0
        public override List <SolverPreviewObject> InterestingShapeAroundPoint(gpPln planeOfTheView, Point3D point)
        {
            var qosLock = QosFactory.Instance.Get(QosNames.EdgeMatchLock);

            qosLock.Begin();

            foreach (var edge in Geometry.SelectMany(geometricObject => geometricObject.Edges))
            {
                // Calculate the distance from the point to the curve
                GeomCurve curve;
                var       first = 0.0;
                var       last  = 0.0;
                unsafe
                {
                    curve = BRepTool.Curve(edge.Edge, ref first, ref last);
                }

                if (curve == null)
                {
                    continue;
                }

                // Add a curve domain protection
                if (first > last)
                {
                    continue;
                }

                ExtremaExtPC extrema = null;
                try
                {
                    var adaptor = new GeomAdaptorCurve(curve, first, last);
                    extrema = new ExtremaExtPC(point.GpPnt, adaptor, Precision.Confusion);
                }
                catch
                {
                    Log.Debug("Exception on generate extrema points");
                }

                if (extrema == null)
                {
                    continue;
                }

                if (!extrema.IsDone)
                {
                    continue;
                }
                if (extrema.NbExt < 1)
                {
                    continue;
                }
                // The point is on edge
                if (extrema.SquareDistance(1) >= CoreGlobalPreferencesSingleton.Instance.ZoomLevel * _precision)
                {
                    continue;
                }
                // Generate a point on the edge by projecting
                var projectionPoint = new GeomAPIProjectPointOnCurve(point.GpPnt, curve);
                if (projectionPoint.NbPoints <= 0)
                {
                    continue;
                }
                List <SolverGeometricObject> selectedEdge = Geometry.Where(geomObj => geomObj.Edges.Contains(edge)).ToList();

                //LastGeometry.Clear();
                //LastGeometry.AddRange(selectedEdge);
                var originPoint = new SolverGeometricObject(null);
                originPoint.AddPoint(new SolverDataPoint(new Point3D()));
                var result = GeomUtils.ProjectPointOnPlane(new Point3D().GpPnt, planeOfTheView, Precision.Confusion);
                //if(result == new gpPnt(0,0,0))
                //{
                //    LastGeometry.Add(originPoint);
                //}
                if (selectedEdge.Count > 0 && selectedEdge.First().Edges.Count > 0)
                {
                    return new List <SolverPreviewObject>()
                           {
                               new SolverPointResult(new Point3D(projectionPoint.NearestPoint), selectedEdge.First().Edges.First().ParentIndex)
                           }
                }
                ;                                                                                                                                                               // {Text = "On Edge"};
                else
                {
                    return new List <SolverPreviewObject>()
                           {
                               new SolverPointResult(new Point3D(projectionPoint.NearestPoint))
                           }
                };
            }
            qosLock.End();
            return(new List <SolverPreviewObject>());
        }
    }
示例#25
0
 private static void AddVertexToSolver(SolverGeometricObject solverObject, Point3D point, GeometryType type,
                                       int pointIndex)
 {
     solverObject.Points.Add(new SolverDataPoint(point, type));
 }
示例#26
0
 /// <summary>
 ///   Adds to a solver description object a vertex
 /// </summary>
 /// <param name = "solverObject"></param>
 /// <param name = "point"></param>
 /// <param name = "type"></param>
 /// <param name = "pointIndex"></param>
 private static void BuildSolverVertex(SolverGeometricObject solverObject, Point3D point, GeometryType type,
                                       int pointIndex)
 {
     AddVertexToSolver(solverObject, point, type, pointIndex);
 }
 protected abstract bool Extract(SolverGeometricObject data);
 protected override bool Extract(SolverGeometricObject data)
 {
     data.Points.Add(new SolverDataPoint(data.Builder[0].RefTransformedPoint3D));
     return(base.Extract(data));
 }