Example #1
0
        internal override void BuildPlan(PlanBuilder3D builder, MillingWorkspacePanel workspace)
        {
            var reliefPoints = TransformedShapeDefinition;

            builder.GotoZeroLevel();

            var maxDepth = _millingDepth;
            var upDown   = true;

            for (var x = 0; x < _width; ++x)
            {
                for (var i = 0; i < _height; ++i)
                {
                    var y     = upDown ? i : _height - i - 1;
                    var point = reliefPoints[x, y];
                    if (point.Z > maxDepth)
                    {
                        point = new Point3Dmm(point.X, point.Y, maxDepth);
                    }

                    builder.AddCuttingSpeedTransition(new Point2Dmm(point.X, point.Y), point.Z);
                }
                upDown = !upDown;
            }

            builder.GotoTransitionLevel();
            builder.AddRampedLine(EntryPoint);
        }
        internal override void BuildPlan(PlanBuilder3D builder, MillingWorkspacePanel workspace)
        {
            /*
             * for (var i = 0; i < 100; ++i)
             * {
             *  builder.AddRampedLine(new Point3Dmm(PositionX , PositionY, builder.ZeroLevel + 5));
             *  builder.AddRampedLine(new Point3Dmm(PositionX, PositionY, builder.ZeroLevel));
             * }
             * return;
             */

            var maxZ = _toolPath.Targets.Select(t => t.End.Z).Max();
            var minZ = _toolPath.Targets.Select(t => t.End.Z).Min();

            foreach (var target in _toolPath.Targets)
            {
                var p     = target.End;
                var p3Dmm = new Point3Dmm(p.X + PositionX, -p.Y + PositionY, -p.Z + builder.ZeroLevel);
                if (target.MotionMode == MotionMode.IsLinearRapid)
                {
                    //builder.AddRampedLine(new Point3Dmm(p3Dmm.X, p3Dmm.Y, builder.ZeroLevel));
                    builder.AddRampedLine(p3Dmm);
                    //builder.AddCuttingLine(p3Dmm);
                }
                else
                {
                    builder.AddCuttingLine(p3Dmm);
                }
            }
            builder.AddRampedLine(getEntryPoint());
        }
        internal override void BuildPlan(PlanBuilder3D builder, MillingWorkspacePanel workspace)
        {
            builder.GotoZeroLevel();

            var maxDepth    = _millingDepth;
            var upDown      = true;
            var stepLength  = 1.0;
            var resolutionX = _shapeMetricSize.Width / stepLength;
            var resolutionY = _shapeMetricSize.Height / stepLength;

            for (var xi = 0.0; xi < resolutionX; xi += stepLength)
            {
                for (var yi = 0.0; yi < resolutionY; yi += stepLength)
                {
                    var xRatio = 1.0 * xi / resolutionX;
                    var yRatio = 1.0 * yi / resolutionY;

                    var depth = _shapeMap.GetHeight(xRatio, yRatio) * _millingDepth;
                    var x     = _shapeMetricSize.Width * xRatio;
                    var y     = _shapeMetricSize.Height * yRatio;
                    if (!upDown)
                    {
                        y = _shapeMetricSize.Height - y;
                    }

                    var point = new Point3Dmm(PositionX + x, PositionY + y, depth);
                    builder.AddCuttingSpeedTransition(new Point2Dmm(point.X, point.Y), point.Z);
                }
                upDown = !upDown;
            }

            builder.GotoTransitionLevel();
            builder.AddRampedLine(EntryPoint);
        }
Example #4
0
 public PlanPart3D(Point3Dmm currentPoint, Point3Dmm endPoint, Acceleration accelerationRamp, Speed speedLimit)
 {
     StartPoint       = currentPoint;
     EndPoint         = endPoint;
     AccelerationRamp = accelerationRamp;
     SpeedLimit       = speedLimit;
 }
Example #5
0
        internal HeadCNC(Color headColor, MillingWorkspacePanel parent)
        {
            var brush = new SolidColorBrush(headColor);

            brush.Opacity = 0.8;
            _headPen      = new Pen(brush, 4.0);
            _parent       = parent;

            Position = new Point3Dmm(0, 0, 0);
        }
Example #6
0
        private void toSteps(Point3D p, out int x, out int y, out int z)
        {
            var pmm = new Point3Dmm(p.X, p.Y, p.Z);

            var pStep = pmm.As3Dstep();

            x = pStep.X;
            y = pStep.Y;
            z = pStep.Z;
        }
Example #7
0
        private void moveTo(Point3Dmm target, Acceleration accelerationRamp, Speed speedLimit)
        {
            _currentLevel = target.Z;

            if (_currentPoint.DistanceSquaredTo(target) > 0.0)
            {
                _plan.Add(new PlanPart3D(_currentPoint, target, accelerationRamp, speedLimit));
            }

            _currentPoint = target;
        }
Example #8
0
        public static Point4Dstep GetStepDiff(Point3Dmm startPoint, Point3Dmm endPoint)
        {
            var startSteps  = GetPositionRev(startPoint);
            var targetSteps = GetPositionRev(endPoint);

            var diffU = ToStep(targetSteps.U - startSteps.U);
            var diffV = ToStep(targetSteps.V - startSteps.V);
            var diffX = ToStep(targetSteps.X - startSteps.X);
            var diffY = ToStep(targetSteps.Y - startSteps.Y);

            return(new Point4Dstep(diffU, diffV, diffX, diffY));
        }
Example #9
0
        private void executePlan()
        {
            if (!Cnc.IsHomeCalibrated)
            {
                ShowError("Calibration is required!");
                return;
            }

            disableChanges();

            var state           = Cnc.PlannedState;
            var currentPosition = PlanBuilder3D.GetPosition(state);

            var startPoint = Workspace.EntryPoint;
            var start      = new Point3Dmm(startPoint.PositionX, startPoint.PositionY, _zLevel);
            var aboveStart = new Point3Dmm(start.X, start.Y, currentPosition.Z);

            var builder = new PlanBuilder3D(currentPosition.Z, _zLevel, Workspace.CuttingSpeed, Configuration.MaxPlaneSpeed, Configuration.MaxPlaneAcceleration);

            builder.SetPosition(currentPosition);

            builder.AddRampedLine(aboveStart);

            try
            {
                if (_zLevel <= aboveStart.Z)
                {
                    throw new PlanningException("Level Z is above the current position.");
                }

                Workspace.BuildPlan(builder);
            }
            catch (PlanningException ex)
            {
                planCompleted();
                ShowError(ex.Message);
                return;
            }

            var plan = builder.Build();

            if (!Cnc.Check(plan))
            {
                planCompleted();
                ShowError("Plan overflows the workspace!");
                return;
            }

            CheckEngineDialog.WaitForConfirmation(() =>
            {
                executePlan(builder);
            });
        }
        private Point3Dmm getCurrentPosition()
        {
            var currentU = Cnc.EstimationU;
            var currentV = Cnc.EstimationV;
            var currentX = Cnc.EstimationX;
            var currentY = Cnc.EstimationY;

            var prePosition = PlanBuilder3D.GetPositionFromSteps(currentU, currentV, currentX, currentY);

            var position = new Point3Dmm(prePosition.X, prePosition.Y, prePosition.Z);

            return(position);
        }
Example #11
0
        public void GotoZ(double zLevel)
        {
            var nextTarget = new Point3Dmm(_currentPoint.X, _currentPoint.Y, zLevel + _zeroLevel);

            if (nextTarget.Z < _currentPoint.Z)
            {
                AddRampedLine(nextTarget);
            }
            else
            {
                AddCuttingLine(nextTarget);
            }
        }
        /// <summary>
        /// Rotates given point according to current rotation angle.
        /// </summary>
        protected Point3Dmm rotate(Point3Dmm point)
        {
            var c1 = 0.5;
            var c2 = 0.5;

            var centeredX = point.X - c1;
            var centeredY = point.Y - c2;

            var rotatedX = centeredX * _rotationCos - centeredY * _rotationSin;
            var rotatedY = centeredY * _rotationCos + centeredX * _rotationSin;

            return(new Point3Dmm(
                       rotatedX + c1, rotatedY + c2, point.Z
                       ));
        }
Example #13
0
        protected Point3Dmm[,] definitionTransformation(double[,] relief)
        {
            var result = new Point3Dmm[_width, _height];

            for (var xi = 0; xi < _width; ++xi)
            {
                for (var yi = 0; yi < _height; ++yi)
                {
                    var x = 1.0 * xi / _width;
                    var y = 1.0 * yi / _height;
                    var z = relief[xi, yi];

                    var definitionPoint = new Point3Dmm(x, y, z);
                    var point           = rotate(definitionPoint);

                    point          = new Point3Dmm(point.X * _shapeMetricSize.Width + PositionX, point.Y * _shapeMetricSize.Height + PositionY, point.Z);
                    result[xi, yi] = point;
                }
            }

            return(result);
        }
Example #14
0
 public void AddCuttingLine(Point3Dmm target)
 {
     moveTo(target, null, CuttingSpeed);
 }
Example #15
0
        public void AddCuttingSpeedTransition(Point2Dmm target, double zLevel)
        {
            var zTarget = new Point3Dmm(target.C1, target.C2, zLevel + _zeroLevel);

            moveTo(zTarget, null, CuttingSpeed);
        }
        private void executePlan()
        {
            if (!Cnc.IsHomeCalibrated)
            {
                ShowError("Calibration is required!");
                return;
            }

            disableMotionCommands();
            Workspace.DisableChanges();

            var state           = Cnc.PlannedState;
            var currentPosition = PlanBuilder3D.GetPosition(state);

            var startPoint = Workspace.EntryPoint;
            var start      = new Point3Dmm(startPoint.PositionX, startPoint.PositionY, _zLevel);
            var aboveStart = new Point3Dmm(start.X, start.Y, currentPosition.Z);

            var builder = new PlanBuilder3D(currentPosition.Z, _zLevel, Workspace.CuttingSpeed, Configuration.MaxPlaneSpeed, Configuration.MaxPlaneAcceleration);

            builder.SetPosition(currentPosition);

            builder.AddRampedLine(aboveStart);

            try
            {
                if (_zLevel <= aboveStart.Z)
                {
                    throw new PlanningException("Level Z is above the current position.");
                }

                Workspace.BuildPlan(builder);
            }
            catch (PlanningException ex)
            {
                planCompleted();
                ShowError(ex.Message);
                return;
            }

            var plan = builder.Build();

            if (!Cnc.Check(plan))
            {
                planCompleted();
                ShowError("Plan overflows the workspace!");
                return;
            }

            CheckEngineDialog.WaitForConfirmation(() =>
            {
                /**/
                builder.SetStreamingCuttingSpeed(getCuttingSpeed());
                builder.StreamingIsComplete += planCompleted;/*/
                                                              * Cnc.SEND(plan);
                                                              * Cnc.OnInstructionQueueIsComplete += planCompleted;/**/
                _streamingBuilder            = builder;
                _planStart = DateTime.Now;
                builder.StreamInstructions(Cnc);
                this.Focus();
            });
        }
Example #17
0
        private void _stream(DriverCNC2 driver)
        {
            PlanStreamerContext intermContext = null;

            _context = new PlanStreamerContext(true);
            foreach (var part in PlanParts)
            {
                var s = part.StartPoint;
                var e = part.EndPoint;

                var segment = new ToolPathSegment(new Point3D(s.X, s.Y, s.Z), new Point3D(e.X, e.Y, e.Z), MotionMode.IsLinear);
                _context.AddSegment(segment);
            }

            var zeroCompatibleSpeed        = Configuration.ReverseSafeSpeed.ToMetric();
            var instructionBuffer          = new Queue <InstructionCNC>();
            var maxPlannedInstructionCount = 5;

            var currentContext = _context;

            while (!currentContext.IsComplete || intermContext != null)
            {
                if (intermContext != null && intermContext.IsComplete)
                {
                    intermContext  = null;
                    currentContext = _context;
                    continue;
                }

                while (_stop && _context.CurrentSpeed <= zeroCompatibleSpeed)
                {
                    _isStreaming = false;
                    Thread.Sleep(10);
                }

                _isStreaming = true;

                if (IsChangingPosition)
                {
                    // create intermediate context which will transfer machine to the new position
                    var np           = CurrentStreamPosition.As3Dmm();
                    var cp           = driver.CurrentState.As3Dstep().As3Dmm();
                    var cpTransition = new Point3Dmm(cp.X, cp.Y, _transitionLevel);
                    var npTransition = new Point3Dmm(np.X, np.Y, _transitionLevel);

                    intermContext = new PlanStreamerContext(false);
                    intermContext.AddSegment(new ToolPathSegment(cp.As3D(), cpTransition.As3D(), MotionMode.IsLinear));
                    intermContext.AddSegment(new ToolPathSegment(cpTransition.As3D(), npTransition.As3D(), MotionMode.IsLinear));
                    intermContext.AddSegment(new ToolPathSegment(npTransition.As3D(), np.As3D(), MotionMode.IsLinear));

                    currentContext     = intermContext;
                    IsChangingPosition = false;
                }

                if (driver.IncompleteInstructionCount >= maxPlannedInstructionCount)
                {
                    //wait some time so we are not spinning like crazy
                    Thread.Sleep(1);
                    continue;
                }

                do
                {
                    double speed;
                    lock (_L_speed)
                    {
                        speed = _stream_cuttingSpeed;
                    }

                    if (_stop)
                    {
                        speed = zeroCompatibleSpeed;
                    }

                    var instruction = currentContext.GenerateNextInstruction(speed, stopRemainingTimeLockstep: _stop);
                    instructionBuffer.Enqueue(instruction);
                } while (driver.IncompleteInstructionCount == 0 && !currentContext.IsComplete && instructionBuffer.Count < maxPlannedInstructionCount);

                while (instructionBuffer.Count > 0)
                {
                    var instruction = instructionBuffer.Dequeue();
                    if (!driver.SEND(instruction))
                    {
                        throw new InvalidOperationException("Instruction was not accepted. (Probably over bounds?). Progress: " + Progress * 100);
                    }
                }
            }

            while (driver.IncompleteInstructionCount > 0)
            {
                //wait until all instructions are completed
                Thread.Sleep(10);
            }

            StreamingIsComplete?.Invoke();
        }
Example #18
0
 public void AddRampedLine(Point3Dmm target)
 {
     moveTo(target, PlaneAcceleration, TransitionSpeed);
 }
Example #19
0
 public static Point4Dstep ToStepsRev(Point3Dmm point)
 {
     return(ToStepsRev(point.X, point.Y, point.Z));
 }
Example #20
0
 public static Point4Dmm GetPositionRev(Point3Dmm point)
 {
     return(new Point4Dmm(point.Y, point.X, point.Y, point.Z));
 }
Example #21
0
 protected Point ConvertToVisual(Point3Dmm point)
 {
     return(ConvertToVisual(new Point2Dmm(point.X, point.Y)));
 }
Example #22
0
 public void SetPosition(Point3Dmm target)
 {
     _currentPoint = target;
 }