예제 #1
0
        public async Task <bool> Execute(IWorkspace workspace, object arg)
        {
            var input = await workspace.InputService.GetPoint(new UserDirective("From"));

            if (input.Cancel)
            {
                return(false);
            }
            if (!input.HasValue)
            {
                return(true);
            }
            var   first = input.Value;
            Point last  = first;

            while (true)
            {
                var current = await workspace.InputService.GetPoint(new UserDirective("Next or [c]lose", "c"), (p) =>
                {
                    return(new[] { new PrimitiveLine(last, p) });
                });

                if (current.Cancel)
                {
                    break;
                }
                if (current.HasValue)
                {
                    workspace.AddToCurrentLayer(new Line(last, current.Value));
                    last = current.Value;
                    if (last == first)
                    {
                        break;                // closed
                    }
                }
                else if (current.Directive == "c")
                {
                    if (last != first)
                    {
                        workspace.AddToCurrentLayer(new Line(last, first));
                    }
                    break;
                }
                else
                {
                    return(true);
                }
            }

            return(true);
        }
예제 #2
0
        public async Task <bool> Execute(IWorkspace workspace, object arg)
        {
            var first = await workspace.InputService.GetPoint(new UserDirective("First point"));

            if (!first.Cancel && first.HasValue)
            {
                var second = await workspace.InputService.GetPoint(new UserDirective("Second point"), (p) =>
                {
                    return(new[]
                    {
                        new PrimitiveLine(first.Value, p)
                    });
                });

                if (!second.Cancel && second.HasValue)
                {
                    var third = await workspace.InputService.GetPoint(new UserDirective("Third point"), (p) =>
                    {
                        var a = PrimitiveEllipse.ThreePointArc(first.Value, second.Value, p, workspace.DrawingPlane.Normal);
                        if (a == null)
                        {
                            return(new IPrimitive[0]);
                        }
                        else
                        {
                            return(new IPrimitive[]
                            {
                                a,
                                new PrimitivePoint(first.Value),
                                new PrimitivePoint(second.Value)
                            });
                        }
                    });

                    if (!third.Cancel && third.HasValue)
                    {
                        var primitiveArc = PrimitiveEllipse.ThreePointArc(first.Value, second.Value, third.Value, workspace.DrawingPlane.Normal);
                        if (primitiveArc != null)
                        {
                            var arc = new Arc(
                                primitiveArc.Center,
                                primitiveArc.MajorAxis.Length,
                                primitiveArc.StartAngle,
                                primitiveArc.EndAngle,
                                primitiveArc.Normal);
                            workspace.AddToCurrentLayer(arc);
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
예제 #3
0
        public async Task <bool> Execute(IWorkspace workspace, object arg)
        {
            var drawingPlane = workspace.DrawingPlane;
            var center       = await workspace.InputService.GetPoint(new UserDirective("Center"));

            if (!center.Cancel && center.HasValue)
            {
                var majorEnd = await workspace.InputService.GetPoint(new UserDirective("Major axis endpoint"), p =>
                {
                    return(new[]
                    {
                        new PrimitiveLine(center.Value, p)
                    });
                });

                var majorPrimitive  = new PrimitiveLine(center.Value, majorEnd.Value);
                var majorAxis       = majorEnd.Value - center.Value;
                var majorAxisLength = majorAxis.Length;
                if (!majorEnd.Cancel && majorEnd.HasValue)
                {
                    var minorEnd = await workspace.InputService.GetPoint(new UserDirective("Minor axis endpoint"), lastPoint : center.Value, onCursorMove : p =>
                    {
                        var tempMinorAxis      = p - center.Value;
                        var tempMinorAxisRatio = tempMinorAxis.Length / majorAxisLength;
                        var el = new PrimitiveEllipse(center.Value, majorAxis, drawingPlane.Normal, tempMinorAxisRatio, 0.0, 360.0);
                        return(new IPrimitive[]
                        {
                            majorPrimitive,                     // major axis line
                            new PrimitiveLine(center.Value, p), // minor axis line
                            el                                  // the ellipse
                        });
                    });

                    if (!minorEnd.Cancel && minorEnd.HasValue)
                    {
                        var minorAxis      = minorEnd.Value - center.Value;
                        var minorAxisRatio = minorAxis.Length / majorAxisLength;
                        if (!minorEnd.Cancel && minorEnd.HasValue)
                        {
                            var el = new Ellipse(center.Value, majorAxis, minorAxisRatio, 0.0, 360.0, drawingPlane.Normal);
                            workspace.AddToCurrentLayer(el);
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
예제 #4
0
        public async Task <bool> Execute(IWorkspace workspace, object arg)
        {
            var location = await workspace.InputService.GetPoint(new UserDirective("Location"));

            if (location.Cancel)
            {
                return(false);
            }
            if (!location.HasValue)
            {
                return(true);
            }
            workspace.AddToCurrentLayer(new Location(location.Value));
            return(true);
        }
예제 #5
0
        public async Task <bool> Execute(IWorkspace workspace, object arg)
        {
            // get location
            var input = await workspace.InputService.GetPoint(new UserDirective("Location"));

            if (input.Cancel || !input.HasValue)
            {
                return(false);
            }
            var location = input.Value;

            // get height
            var heightInput = await workspace.InputService.GetDistance(new UserDirective("Text height or first point"), defaultDistance : lastHeight);

            if (heightInput.Cancel || !heightInput.HasValue)
            {
                return(false);
            }
            var height = heightInput.Value;

            lastHeight = height;

            // get text
            var textInput = await workspace.InputService.GetText();

            if (textInput.Cancel || !textInput.HasValue)
            {
                return(false);
            }
            var text = textInput.Value;

            // add it
            workspace.AddToCurrentLayer(new Text(text, location, workspace.DrawingPlane.Normal, height, 0.0));

            return(true);
        }
예제 #6
0
        public async Task <bool> Execute(IWorkspace workspace, object arg)
        {
            Entity circle       = null;
            var    drawingPlane = workspace.DrawingPlane;

            var cen = await workspace.InputService.GetPoint(new UserDirective("Select center, [ttr], or [th]ree-point", "ttr", "th"));

            if (cen.Cancel)
            {
                return(false);
            }
            if (cen.HasValue)
            {
                var mode = CircleMode.Radius;
                while (circle == null)
                {
                    switch (mode)
                    {
                    case CircleMode.Radius:
                    {
                        var rad = await workspace.InputService.GetPoint(new UserDirective("Enter radius or [d]iameter/[i]sometric", "d", "i"), (p) =>
                            {
                                return(new IPrimitive[]
                                {
                                    new PrimitiveLine(cen.Value, p),
                                    new PrimitiveEllipse(cen.Value, (p - cen.Value).Length, drawingPlane.Normal)
                                });
                            });

                        if (rad.Cancel)
                        {
                            return(false);
                        }
                        if (rad.HasValue)
                        {
                            circle = new Circle(cen.Value, (rad.Value - cen.Value).Length, drawingPlane.Normal);
                        }
                        else         // switch modes
                        {
                            if (rad.Directive == null)
                            {
                                return(false);
                            }

                            switch (rad.Directive)
                            {
                            case "d":
                                mode = CircleMode.Diameter;
                                break;

                            case "i":
                                mode = CircleMode.Isometric;
                                break;
                            }
                        }

                        break;
                    }

                    case CircleMode.Diameter:
                    {
                        var dia = await workspace.InputService.GetPoint(new UserDirective("Enter diameter or [r]adius/[i]sometric", "r", "i"), (p) =>
                            {
                                return(new IPrimitive[]
                                {
                                    new PrimitiveLine(cen.Value, p),
                                    new PrimitiveEllipse(cen.Value, (p - cen.Value).Length, drawingPlane.Normal)
                                });
                            });

                        if (dia.Cancel)
                        {
                            return(false);
                        }
                        if (dia.HasValue)
                        {
                            circle = new Circle(cen.Value, (dia.Value - cen.Value).Length * 0.5, drawingPlane.Normal);
                        }
                        else         // switch modes
                        {
                            if (dia.Directive == null)
                            {
                                return(false);
                            }

                            switch (dia.Directive)
                            {
                            case "r":
                                mode = CircleMode.Radius;
                                break;

                            case "i":
                                mode = CircleMode.Isometric;
                                break;
                            }
                        }

                        break;
                    }

                    case CircleMode.Isometric:
                    {
                        var isoRad = await workspace.InputService.GetPoint(new UserDirective("Enter isometric-radius or [r]adius/[d]iameter", "r", "d"), (p) =>
                            {
                                return(new IPrimitive[]
                                {
                                    new PrimitiveLine(cen.Value, p),
                                    new PrimitiveEllipse(cen.Value,
                                                         Vector.SixtyDegrees * (p - cen.Value).Length *MathHelper.SqrtThreeHalves,
                                                         drawingPlane.Normal,
                                                         IsoMinorRatio,
                                                         0.0,
                                                         360.0)
                                });
                            });

                        if (isoRad.Cancel)
                        {
                            return(false);
                        }
                        if (isoRad.HasValue)
                        {
                            circle = new Ellipse(cen.Value,
                                                 Vector.SixtyDegrees * (isoRad.Value - cen.Value).Length * MathHelper.SqrtThreeHalves,
                                                 IsoMinorRatio,
                                                 0.0,
                                                 360.0,
                                                 drawingPlane.Normal);
                        }
                        else         // switch modes
                        {
                            if (isoRad.Directive == null)
                            {
                                return(false);
                            }

                            switch (isoRad.Directive)
                            {
                            case "r":
                                mode = CircleMode.Radius;
                                break;

                            case "d":
                                mode = CircleMode.Diameter;
                                break;
                            }
                        }

                        break;
                    }
                    }
                }
            }
            else
            {
                switch (cen.Directive)
                {
                case "ttr":
                    var firstEntity = await workspace.InputService.GetEntity(new UserDirective("First entity"));

                    if (firstEntity.Cancel || !firstEntity.HasValue)
                    {
                        break;
                    }
                    var secondEntity = await workspace.InputService.GetEntity(new UserDirective("Second entity"));

                    if (secondEntity.Cancel || !secondEntity.HasValue)
                    {
                        break;
                    }
                    var radius = await workspace.InputService.GetDistance();

                    var ellipse = EditUtilities.Ttr(drawingPlane, firstEntity.Value, secondEntity.Value, radius.Value);
                    if (ellipse != null)
                    {
                        circle = ellipse.ToEntity();
                    }
                    break;

                case "2":
                    break;

                case "th":
                    var first = await workspace.InputService.GetPoint(new UserDirective("First point"));

                    if (first.Cancel || !first.HasValue)
                    {
                        break;
                    }
                    var second = await workspace.InputService.GetPoint(new UserDirective("Second point"), p =>
                                                                       new[]
                    {
                        new PrimitiveLine(first.Value, p)
                    });

                    if (second.Cancel || !second.HasValue)
                    {
                        break;
                    }
                    var third = await workspace.InputService.GetPoint(new UserDirective("Third point"), p =>
                    {
                        var c = PrimitiveEllipse.ThreePointCircle(first.Value, second.Value, p);
                        if (c == null)
                        {
                            return new IPrimitive[]
                            {
                                new PrimitiveLine(first.Value, second.Value),
                                new PrimitiveLine(second.Value, p),
                                new PrimitiveLine(p, first.Value)
                            }
                        }
                        ;
                        else
                        {
                            return new IPrimitive[]
                            {
                                new PrimitiveLine(first.Value, second.Value),
                                new PrimitiveLine(second.Value, p),
                                new PrimitiveLine(p, first.Value),
                                c
                            }
                        };
                    });

                    if (third.Cancel || !third.HasValue)
                    {
                        break;
                    }
                    var circ = PrimitiveEllipse.ThreePointCircle(first.Value, second.Value, third.Value);
                    if (circ != null)
                    {
                        circle = new Circle(circ.Center, circ.MajorAxis.Length, circ.Normal);
                    }
                    break;
                }
            }

            if (circle != null)
            {
                workspace.AddToCurrentLayer(circle);
            }

            return(true);
        }
예제 #7
0
        public async Task <bool> Execute(IWorkspace workspace, object arg = null)
        {
            var locationInput = await workspace.InputService.GetPoint(new UserDirective("Location"));

            if (locationInput.Cancel)
            {
                return(false);
            }
            if (!locationInput.HasValue)
            {
                return(false);
            }
            var location = locationInput.Value;

            var imagePath = await workspace.FileSystemService.GetFileNameFromUserForOpen(new[] { new FileSpecification("JPEG Image", new[] { ".jpg", ".jpeg" }) });

            if (imagePath == null)
            {
                return(false);
            }

            var imageData = await workspace.FileSystemService.GetContentResolverRelativeToPath(workspace.Drawing.Settings.FileName)(imagePath);

            var(rawImageWidth, rawImageHeight) = ImageHelpers.GetImageDimensions(imagePath, imageData);

            var imageWidthInput = await workspace.InputService.GetDistance(new UserDirective($"Width [{rawImageWidth}]"), defaultDistance : rawImageWidth);

            if (imageWidthInput.Cancel)
            {
                return(false);
            }
            if (!imageWidthInput.HasValue)
            {
                return(false);
            }
            var imageWidth = imageWidthInput.Value;

            var scaledRawHeight  = (double)rawImageHeight / rawImageWidth * imageWidth;
            var imageHeightInput = await workspace.InputService.GetDistance(new UserDirective($"Height [{scaledRawHeight}]"), defaultDistance : scaledRawHeight);

            if (imageHeightInput.Cancel)
            {
                return(false);
            }
            if (!imageHeightInput.HasValue)
            {
                return(false);
            }
            var imageHeight = imageHeightInput.Value;

            var defaultRotation    = 0;
            var imageRotationInput = await workspace.InputService.GetText($"Rotation [{defaultRotation}]");

            if (imageRotationInput.Cancel)
            {
                return(false);
            }
            var rawRotationInput = imageRotationInput.HasValue ? imageRotationInput.Value : defaultRotation.ToString();

            if (string.IsNullOrWhiteSpace(rawRotationInput))
            {
                return(false);
            }
            if (!double.TryParse(rawRotationInput, out var imageRotation))
            {
                return(false);
            }

            var image = new Image(location, imagePath, imageData, imageWidth, imageHeight, imageRotation);

            workspace.AddToCurrentLayer(image);

            return(true);
        }
예제 #8
0
        public async Task <bool> Execute(IWorkspace workspace, object arg)
        {
            var points   = new List <Vertex>();
            var segments = new List <PrimitiveLine>();

            var input = await workspace.InputService.GetPoint(new UserDirective("Start"));

            if (input.Cancel)
            {
                return(false);
            }
            if (!input.HasValue)
            {
                return(true);
            }
            var first = input.Value;

            points.Add(new Vertex(first));
            Point last = first;

            while (true)
            {
                // TODO: allow adding arcs, too
                var current = await workspace.InputService.GetPoint(new UserDirective("Next or [c]lose", "c"), (p) =>
                {
                    var toDraw = segments.Concat(new[] { new PrimitiveLine(last, p) });
                    if (ClosePolyline)
                    {
                        toDraw = toDraw.Concat(new[] { new PrimitiveLine(p, first) });
                    }

                    return(toDraw);
                });

                if (current.Cancel)
                {
                    break;
                }
                if (current.HasValue)
                {
                    segments.Add(new PrimitiveLine(last, current.Value));
                    points.Add(new Vertex(current.Value));
                    last = current.Value;
                    if (last == first)
                    {
                        break;                // closed
                    }
                }
                else if (current.Directive == "c")
                {
                    if (last != first)
                    {
                        points.Add(new Vertex(first));
                    }
                    break;
                }
                else
                {
                    break;
                }
            }

            if (ClosePolyline)
            {
                points.Add(points.First());
            }

            var polyline = new Polyline(points);

            workspace.AddToCurrentLayer(polyline);
            return(true);
        }