public void CircleMultiLineTrimTest()
        {
            var wireCircle =
                OccShapeCreatorCode.CreateWireCircle(new gpAx1(new gpPnt(0, 0, 0), new gpDir(0, 0, 1)), 2);
            var circleEdges = GeomUtils.ExtractEdges(wireCircle);
            var edge1       = new BRepBuilderAPIMakeEdge(new gpPnt(-3, 0, 0), new gpPnt(3, 0, 0)).Edge;
            var edge2       = new BRepBuilderAPIMakeEdge(new gpPnt(0, -3, 0), new gpPnt(0, 3, 0)).Edge;

            Assert.IsTrue(circleEdges.Count > 0, "invalid circle edges");
            var clickPoint = new Point3D(2, 0, 0);

            var trimmingEdges = new List <TopoDSEdge> {
                edge1, edge2
            };
            var trimmedEdges = GeomUtils.TrimGenericShape(trimmingEdges, circleEdges[0], clickPoint);

            Assert.IsTrue(trimmedEdges.Count == 1, "Incorrect number of trim solutions");
            var trimmedCurve = new BRepAdaptorCurve(trimmedEdges[0]);

            var firstPoint = new Point3D(trimmedCurve.Value(trimmedCurve.FirstParameter));
            var lastPoint  = new Point3D(trimmedCurve.Value(trimmedCurve.LastParameter));

            Assert.IsTrue(firstPoint.IsEqual(new Point3D(0, 2, 0)), "invalid trimming point");
            Assert.IsTrue(lastPoint.IsEqual(new Point3D(2, 0, 0)), "invalid trimming point");
        }
示例#2
0
        /// <summary>
        ///   Builds a dimension on an edge of type Line
        /// </summary>
        private static AISInteractiveObject BuildLineDimension(TopoDSEdge edge, gpPnt textLocation,
                                                               GeomPlane dimensionPlane, DsgPrsArrowSide arrowType, bool isOffset, gpPnt offset)
        {
            var curve = new BRepAdaptorCurve(edge);

            if (curve.GetType != GeomAbsCurveType.GeomAbs_Line)
            {
                return(null);
            }

            // For a line use a length dimension
            var line = curve.Line;

            if (line.Distance(textLocation) < Precision.Confusion)
            {
                textLocation.X = (textLocation.X + 0.01);
            }
            var firstPoint = curve.Value(curve.FirstParameter);
            var lastPoint  = curve.Value(curve.LastParameter);
            var plane      = dimensionPlane;

            if (plane == null)
            {
                var mkPlane = new GCMakePlane(firstPoint, lastPoint, textLocation);
                plane = mkPlane.Value;
            }
            var length = firstPoint.Distance(lastPoint);

            return(length < 1e-12
                       ? null
                       : GeomUtils.BuildLengthDimension(firstPoint, lastPoint, plane, textLocation,
                                                        arrowType, ArrowSize, 0.2, isOffset, offset));
        }
示例#3
0
        private NodeBuilder BuildArcInDocument(Document document)
        {
            var firstPointBuilder  = GetSketchProjectedNode(document, Points[0]);
            var secondPointBuilder = GetSketchProjectedNode(document, Points[1]);
            var thirdPointBuilder  = GetSketchProjectedNode(document, Points[2]);

            var gceCirc = new gceMakeCirc(firstPointBuilder[1].TransformedPoint3D.GpPnt,
                                          secondPointBuilder[1].TransformedPoint3D.GpPnt,
                                          thirdPointBuilder[1].TransformedPoint3D.GpPnt);
            var circle = gceCirc.Value;
            var circleCenterBuilder = GetSketchProjectedNode(document, new Point3D(circle.Axis.Location));
            var arc         = GeomUtils.BuildArc(circle.Axis, Points[0], Points[1], true);
            var reversedArc = true;

            if (arc != null)
            {
                var firstU      = arc.FirstParameter;
                var lastU       = arc.LastParameter;
                var arcEdge     = new BRepBuilderAPIMakeEdge(arc).Edge;
                var arcAdaptor  = new BRepAdaptorCurve(arcEdge);
                var thirdPointU = GeomUtils.UParameter(arcAdaptor, arcEdge.Location(), Points[3]);
                if ((firstU <= thirdPointU) && (thirdPointU <= lastU))
                {
                    reversedArc = false;
                }
            }

            var builder = new NodeBuilder(document, FunctionNames.Arc);

            builder[0].Reference = circleCenterBuilder.Node;
            builder[1].Reference = reversedArc ? secondPointBuilder.Node : firstPointBuilder.Node;
            builder[2].Reference = reversedArc ? firstPointBuilder.Node : secondPointBuilder.Node;
            builder.ExecuteFunction();
            return(builder);
        }
        public void UParameterTest()
        {
            var edge  = new BRepBuilderAPIMakeEdge(new gpPnt(1, 1, 0), new gpPnt(5, 5, 0)).Edge;
            var curve = new BRepAdaptorCurve(edge);

            var location = new TopLocLocation(GeomUtils.BuildTranslation(new Point3D(0, 0, 0), new Point3D(1, 1, 0)));

            Assert.IsTrue(
                Math.Abs(GeomUtils.UParameter(curve, location, new Point3D(1, 1, 0)).Value - curve.FirstParameter) <
                0.1, "invalid first parameter");
            Assert.IsTrue(
                Math.Abs(GeomUtils.UParameter(curve, location, new Point3D(5, 5, 0)).Value - curve.LastParameter) <
                0.1, "invalid last parameter");
        }
示例#5
0
        /// <summary>
        ///   Detects the referenced shape type and generates an appropiate
        ///   dimension for it
        /// </summary>
        public static AISInteractiveObject CreateDependency(TopoDSShape referenceShape, gpPnt textLocation, DsgPrsArrowSide arrowType, bool isOffset = false, gpPnt offset = null)
        {
            if (referenceShape == null || referenceShape.ShapeType != TopAbsShapeEnum.TopAbs_EDGE)
            {
                return(null);
            }

            var curve = new BRepAdaptorCurve(TopoDS.Edge(referenceShape));

            if (curve.GetType == GeomAbsCurveType.GeomAbs_Circle)
            {
                return(BuildCircleDimension(referenceShape, textLocation));
            }
            return(curve.GetType == GeomAbsCurveType.GeomAbs_Line
                       ? BuildLineDimension(TopoDS.Edge(referenceShape), textLocation, null, arrowType, isOffset, offset)
                       : null);
        }
        private void GetLength(ref object resultvalue)
        {
            if (Builder[0].ReferenceBuilder.FunctionName == FunctionNames.Circle)
            {
                var radius = Builder[0].ReferenceBuilder.Dependency[1].Real;
                resultvalue = radius * 2;
                return;
            }
            var referenceShape = ShapeUtils.ExtractSubShape(Builder[0].ReferenceData);
            var edge           = TopoDS.Edge(referenceShape);
            var curve          = new BRepAdaptorCurve(edge);
            var firstPoint     = curve.Value(curve.FirstParameter);
            var lastPoint      = curve.Value(curve.LastParameter);
            var length         = firstPoint.Distance(lastPoint);

            resultvalue = length;
        }
示例#7
0
        private static AISInteractiveObject BuildCircleDimension(TopoDSShape referenceShape, gpPnt textLocation)
        {
            var edge  = TopoDS.Edge(referenceShape);
            var curve = new BRepAdaptorCurve(edge);

            if (curve.GetType != GeomAbsCurveType.GeomAbs_Circle)
            {
                return(null);
            }

            // For a circle use a diameter dimension
            var circle   = curve.Circle;
            var diameter = 2.0 * circle.Radius;
            var text     = new TCollectionExtendedString(String.Format("{0:0.00}", diameter));
            var rd       = new AISDiameterDimension(referenceShape, diameter, text, textLocation,
                                                    DsgPrsArrowSide.DsgPrs_AS_BOTHAR, true, ArrowSize);

            rd.SetColor(QuantityNameOfColor.Quantity_NOC_RED);
            return(rd);
        }
示例#8
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);
            }
        }