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"); }
/// <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)); }
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"); }
/// <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; }
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); }
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); } }