Esempio n. 1
0
        public static bool TryCreateFromVertices(double x1, double y1, double bulge, double x2, double y2, out DxfArc arc)
        {
            // To the best of my knowledge, 3D Arcs are not defined via z but a normal vector.
            // Thus, simply ignore non-zero z values.

            if (Math.Abs(bulge) < 1e-10)
            {
                //throw new ArgumentException("arc bulge too small: " + bulge);
                arc = null;
                return(false);
            }

            var deltaX      = x2 - x1;
            var deltaY      = y2 - y1;
            var deltaLength = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);

            if (deltaLength < 1e-10)
            {
                //throw new ArgumentException("arc startpoint == endpoint");
                arc = null;
                return(false);
            }

            var alpha      = 4.0 * Math.Atan(bulge);
            var radius     = deltaLength / (2.0 * Math.Abs(Math.Sin(alpha * 0.5)));
            var deltaNormX = deltaX / deltaLength;
            var deltaNormY = deltaY / deltaLength;
            int bulgeSign  = Math.Sign(bulge);

            // 2D only solution (z=0)
            var normalX = -deltaNormY * bulgeSign;
            var normalY = +deltaNormX * bulgeSign;

            var centerX = (x1 + x2) * 0.5 + normalX * Math.Cos(alpha * 0.5) * radius;
            var centerY = (y1 + y2) * 0.5 + normalY * Math.Cos(alpha * 0.5) * radius;

            // bulge<0 indicates CW arc, but DxfArc is CCW always
            double startAngleDeg;
            double endAngleDeg;

            if (bulge > 0)
            {
                startAngleDeg = NormalizedAngleDegree(x1, y1, centerX, centerY);
                endAngleDeg   = NormalizedAngleDegree(x2, y2, centerX, centerY);
            }
            else
            {
                endAngleDeg   = NormalizedAngleDegree(x1, y1, centerX, centerY);
                startAngleDeg = NormalizedAngleDegree(x2, y2, centerX, centerY);
            }

            arc = new DxfArc(new DxfPoint(centerX, centerY, 0), radius, startAngleDeg, endAngleDeg);
            return(true);
        }
Esempio n. 2
0
        public static bool TryCreateFromVertices(DxfVertex v1, DxfVertex v2, out DxfArc arc)
        {
            // To the best of my knowledge, 3D Arcs are not defined via z but a normal vector.
            // Thus, simply ignore non-zero z values.

            var bulge = v1.Bulge;

            if (Math.Abs(bulge) < 1e-10)
            {
                //throw new ArgumentException("arc bulge too small: " + bulge);
                arc = null;
                return(false);
            }

            var startPoint = v1.Location;
            var endPoint   = v2.Location;
            var delta      = endPoint - startPoint;
            var length     = delta.Length;

            if (length <= double.Epsilon)
            {
                //throw new ArgumentException("arc startpoint == endpoint");
                arc = null;
                return(false);
            }

            var alpha     = 4.0 * Math.Atan(bulge);
            var radius    = length / (2.0 * Math.Abs(Math.Sin(alpha * 0.5)));
            var deltaNorm = delta.Normalize();
            int bulgeSign = Math.Sign(bulge);

            // 2D only solution (z=0)
            var normal = new DxfVector(-deltaNorm.Y, +deltaNorm.X, 0.0) * bulgeSign;
            var center = (startPoint + endPoint) * 0.5
                         + normal * Math.Cos(alpha * 0.5) * radius;

            // bulge<0 indicates CW arc, but DxfArc is CCW always
            double startAngleDeg;
            double endAngleDeg;

            if (bulge > 0)
            {
                startAngleDeg = NormalizedAngleDegree(startPoint, center);
                endAngleDeg   = NormalizedAngleDegree(endPoint, center);
            }
            else
            {
                endAngleDeg   = NormalizedAngleDegree(startPoint, center);
                startAngleDeg = NormalizedAngleDegree(endPoint, center);
            }

            arc = new DxfArc(center, radius, startAngleDeg, endAngleDeg);
            return(true);
        }
        public static bool ContainsAngle(this DxfArc arc, double angle)
        {
            var start = arc.StartAngle;
            var end   = arc.EndAngle;

            // normalize angles such that start is always less than end
            if (start > end)
            {
                // arcs specify angles in degrees
                start -= 360.0;
            }

            return(start <= angle && end >= angle);
        }
        public static bool ContainsAngle(this DxfArc arc, double angle)
        {
            // normalize all angles
            var start = NormalizeAngleDegree(arc.StartAngle);
            var end   = NormalizeAngleDegree(arc.EndAngle);

            angle = NormalizeAngleDegree(angle);

            // simple case: CCW arc from small to large angle.
            if (start <= end)
            {
                return(start <= angle && angle <= end);
            }

            // if end < start consider two areas
            return((start <= angle && angle < 360) || // start ccw ... 360°
                   (0 <= angle && angle <= end)); // overflow: 0° ... end
        }
Esempio n. 5
0
        private static bool TryGetArcBoundingBox(DxfVertex v1, DxfVertex v2, out DxfBoundingBox bbox)
        {
            if (!DxfArc.TryCreateFromVertices(v1, v2, out var arc))
            {
                bbox = default(DxfBoundingBox);
                return(false);
            }

            var boundingBox = arc.GetBoundingBox();

            if (!boundingBox.HasValue)
            {
                bbox = default(DxfBoundingBox);
                return(false);
            }

            bbox = boundingBox.Value;
            return(true);
        }
Esempio n. 6
0
 public static bool TryCreateFromVertices(DxfLwPolylineVertex v1, DxfLwPolylineVertex v2, out DxfArc arc)
 {
     return(TryCreateFromVertices(v1.X, v1.Y, v1.Bulge, v2.X, v2.Y, out arc));
 }
Esempio n. 7
0
 public static bool TryCreateFromVertices(DxfVertex v1, DxfVertex v2, out DxfArc arc)
 {
     return(TryCreateFromVertices(v1.Location.X, v1.Location.Y, v1.Bulge, v2.Location.X, v2.Location.Y, out arc));
 }
        internal static DxfEntity FromBuffer(DxfCodePairBufferReader buffer)
        {
            var first = buffer.Peek();

            buffer.Advance();
            DxfEntity entity;

            switch (first.StringValue)
            {
            case "3DFACE":
                entity = new Dxf3DFace();
                break;

            case "3DSOLID":
                entity = new Dxf3DSolid();
                break;

            case "ACAD_PROXY_ENTITY":
                entity = new DxfProxyEntity();
                break;

            case "ARC":
                entity = new DxfArc();
                break;

            case "ARCALIGNEDTEXT":
                entity = new DxfArcAlignedText();
                break;

            case "ATTDEF":
                entity = new DxfAttributeDefinition();
                break;

            case "ATTRIB":
                entity = new DxfAttribute();
                break;

            case "BODY":
                entity = new DxfBody();
                break;

            case "CIRCLE":
                entity = new DxfCircle();
                break;

            case "DIMENSION":
                entity = new DxfDimensionBase();
                break;

            case "ELLIPSE":
                entity = new DxfEllipse();
                break;

            case "HELIX":
                entity = new DxfHelix();
                break;

            case "IMAGE":
                entity = new DxfImage();
                break;

            case "INSERT":
                entity = new DxfInsert();
                break;

            case "LEADER":
                entity = new DxfLeader();
                break;

            case "LIGHT":
                entity = new DxfLight();
                break;

            case "LINE":
            case "3DLINE":
                entity = new DxfLine();
                break;

            case "LWPOLYLINE":
                entity = new DxfLwPolyline();
                break;

            case "MLINE":
                entity = new DxfMLine();
                break;

            case "MTEXT":
                entity = new DxfMText();
                break;

            case "OLEFRAME":
                entity = new DxfOleFrame();
                break;

            case "OLE2FRAME":
                entity = new DxfOle2Frame();
                break;

            case "POINT":
                entity = new DxfModelPoint();
                break;

            case "POLYLINE":
                entity = new DxfPolyline();
                break;

            case "RAY":
                entity = new DxfRay();
                break;

            case "REGION":
                entity = new DxfRegion();
                break;

            case "RTEXT":
                entity = new DxfRText();
                break;

            case "SECTION":
                entity = new DxfEntitySection();
                break;

            case "SEQEND":
                entity = new DxfSeqend();
                break;

            case "SHAPE":
                entity = new DxfShape();
                break;

            case "SOLID":
                entity = new DxfSolid();
                break;

            case "SPLINE":
                entity = new DxfSpline();
                break;

            case "TEXT":
                entity = new DxfText();
                break;

            case "TOLERANCE":
                entity = new DxfTolerance();
                break;

            case "TRACE":
                entity = new DxfTrace();
                break;

            case "UNDERLAY":
                entity = new DxfUnderlay();
                break;

            case "DGNUNDERLAY":
                entity = new DxfDgnUnderlay();
                break;

            case "DWFUNDERLAY":
                entity = new DxfDwfUnderlay();
                break;

            case "PDFUNDERLAY":
                entity = new DxfPdfUnderlay();
                break;

            case "VERTEX":
                entity = new DxfVertex();
                break;

            case "WIPEOUT":
                entity = new DxfWipeout();
                break;

            case "XLINE":
                entity = new DxfXLine();
                break;

            default:
                SwallowEntity(buffer);
                entity = null;
                break;
            }

            if (entity != null)
            {
                entity = entity.PopulateFromBuffer(buffer);
            }

            return(entity);
        }
Esempio n. 9
0
        internal static DxfEntity FromBuffer(DxfCodePairBufferReader buffer)
        {
            var first = buffer.Peek();
            buffer.Advance();
            DxfEntity entity;
            switch (first.StringValue)
            {
                case "3DFACE":
                    entity = new Dxf3DFace();
                    break;
                case "3DSOLID":
                    entity = new Dxf3DSolid();
                    break;
                case "ACAD_PROXY_ENTITY":
                    entity = new DxfProxyEntity();
                    break;
                case "ARC":
                    entity = new DxfArc();
                    break;
                case "ARCALIGNEDTEXT":
                    entity = new DxfArcAlignedText();
                    break;
                case "ATTDEF":
                    entity = new DxfAttributeDefinition();
                    break;
                case "ATTRIB":
                    entity = new DxfAttribute();
                    break;
                case "BODY":
                    entity = new DxfBody();
                    break;
                case "CIRCLE":
                    entity = new DxfCircle();
                    break;
                case "DIMENSION":
                    entity = new DxfDimensionBase();
                    break;
                case "ELLIPSE":
                    entity = new DxfEllipse();
                    break;
                case "HELIX":
                    entity = new DxfHelix();
                    break;
                case "IMAGE":
                    entity = new DxfImage();
                    break;
                case "INSERT":
                    entity = new DxfInsert();
                    break;
                case "LEADER":
                    entity = new DxfLeader();
                    break;
                case "LIGHT":
                    entity = new DxfLight();
                    break;
                case "LINE":
                case "3DLINE":
                    entity = new DxfLine();
                    break;
                case "LWPOLYLINE":
                    entity = new DxfLwPolyline();
                    break;
                case "MLINE":
                    entity = new DxfMLine();
                    break;
                case "MLEADERSTYLE":
                    entity = new DxfMLeaderStyle();
                    break;
                case "MTEXT":
                    entity = new DxfMText();
                    break;
                case "OLEFRAME":
                    entity = new DxfOleFrame();
                    break;
                case "OLE2FRAME":
                    entity = new DxfOle2Frame();
                    break;
                case "POINT":
                    entity = new DxfModelPoint();
                    break;
                case "POLYLINE":
                    entity = new DxfPolyline();
                    break;
                case "RAY":
                    entity = new DxfRay();
                    break;
                case "REGION":
                    entity = new DxfRegion();
                    break;
                case "RTEXT":
                    entity = new DxfRText();
                    break;
                case "SECTION":
                    entity = new DxfEntitySection();
                    break;
                case "SEQEND":
                    entity = new DxfSeqend();
                    break;
                case "SHAPE":
                    entity = new DxfShape();
                    break;
                case "SOLID":
                    entity = new DxfSolid();
                    break;
                case "SPLINE":
                    entity = new DxfSpline();
                    break;
                case "SUN":
                    entity = new DxfSun();
                    break;
                case "TEXT":
                    entity = new DxfText();
                    break;
                case "TOLERANCE":
                    entity = new DxfTolerance();
                    break;
                case "TRACE":
                    entity = new DxfTrace();
                    break;
                case "UNDERLAY":
                    entity = new DxfUnderlay();
                    break;
                case "DGNUNDERLAY":
                    entity = new DxfDgnUnderlay();
                    break;
                case "DWFUNDERLAY":
                    entity = new DxfDwfUnderlay();
                    break;
                case "PDFUNDERLAY":
                    entity = new DxfPdfUnderlay();
                    break;
                case "VERTEX":
                    entity = new DxfVertex();
                    break;
                case "WIPEOUT":
                    entity = new DxfWipeout();
                    break;
                case "XLINE":
                    entity = new DxfXLine();
                    break;
                default:
                    SwallowEntity(buffer);
                    entity = null;
                    break;
            }

            if (entity != null)
            {
                entity = entity.PopulateFromBuffer(buffer);
            }

            return entity;
        }
Esempio n. 10
0
 private void WriteArc(DxfArc arc)
 {
     WriteItemType(DxbItemType.Arc);
     WriteN(arc.Center.X);
     WriteN(arc.Center.Y);
     WriteN(arc.Radius);
     WriteA(arc.StartAngle);
     WriteA(arc.EndAngle);
 }