Esempio n. 1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SqlLiteDataConnection"/> class.
 /// </summary>
 /// <param name="filename">The filename</param>
 public SqlLiteDataConnection(string filename)
 {
     _connectionString = string.Format("Data Source={0}; Version=3;", filename);
     _tConverter       = new StandardCLRConverter();
     _commandGenerator = new SqliteCommandGenerator(this);
     _dConverter       = new SQLiteDBConverter();
 }
Esempio n. 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PostgreSQLServerConnection"/> class.
 /// </summary>
 /// <param name="ConnectionString">The connection string.</param>
 public PostgreSQLServerConnection(string ConnectionString)
 {
     _commandGenerator = new PostgreCommandGenerator();
     _connectionString = ConnectionString;
     _tConverter       = new StandardCLRConverter();
     _dConverter       = new PostgreDBConverter();
 }
Esempio n. 3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MySqlServerConnection"/> class.
 /// </summary>
 /// <param name="ConnectionString">The connection string.</param>
 public MySqlServerConnection(string ConnectionString)
 {
     _commandGenerator = new MySqlCommandGenerator(StorageEngine.InnoDB, this);
     _connectionString = ConnectionString;
     _tConverter       = new StandardCLRConverter();
     _dConverter       = new MySqlServerDBConverter();
 }
Esempio n. 4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SqlServerConnection"/> class.
 /// </summary>
 /// <param name="ConnectionString">The connection string.</param>
 public SqlServerConnection(string ConnectionString)
 {
     _commandGenerator = new SqlServerCommandGenerator();
     _connectionString = ConnectionString;
     _tConverter       = new SqlServerTypeConverter();
     _dConverter       = new SqlServerDBConverter();
 }
Esempio n. 5
0
        public override void PrepareBuild(ICommandGenerator generator)
        {
            var bounds = TechProcess.ProcessingArea.Select(p => p.ObjectId).GetExtents();

            generator.ZSafety             = bounds.MaxPoint.Z + TechProcess.ZSafety;
            generator.ToolLocation.Point += Vector3d.ZAxis * generator.ZSafety;
        }
Esempio n. 6
0
        private void Cutting(ICommandGenerator generator, double x, double y)
        {
            generator.Move(x, y);
            generator.Move(z: ZEntry);
            var    zMin    = -Depth;
            double z       = 0;
            int    counter = 0;

            while (z >= zMin)
            {
                var feed = (int)((FeedMax - FeedMin) / zMin * (z * z / zMin - 2 * z) + FeedMax);
                generator.Cutting(x, y, z, feed);
                if (z <= -2)
                {
                    if (++counter == 5) // Подъем на 1мм для охлаждения
                    {
                        counter = 0;
                        generator.Pause(0.2);
                        generator.Uplifting(z + 1);
                        generator.Cutting(x, y, z + 0.2, (int)(FeedMax * 1.5));
                        generator.Cutting(x, y, z, feed);
                    }
                }
                z -= 0.2;
            }
            generator.Pause(0.2);
            generator.Uplifting();
        }
Esempio n. 7
0
        private void BuildPass(ICommandGenerator generator, List <Point3d> points)
        {
            var point0 = Algorithms.NullPoint3d;
            var point  = Algorithms.NullPoint3d;

            foreach (var p in points)
            {
                if (generator.IsUpperTool)
                {
                    generator.Move(p.X, p.Y, angleC: ((Disk3DTechProcess)TechProcess).Angle);
                }

                if (point.IsNull())
                {
                    if (generator.ToolLocation.Point != p)
                    {
                        generator.GCommand(CommandNames.Penetration, 1, point: p, feed: TechProcess.PenetrationFeed);
                    }
                }
                else if (point0 != point && point != p && !point0.GetVectorTo(point).IsCodirectionalTo(point.GetVectorTo(p)))
                {
                    generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                    point0 = point;
                }
                if (point0.IsNull())
                {
                    point0 = p;
                }
                point = p;
            }
            generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
        }
        protected override void GivenThat()
        {
            base.GivenThat();

            _controlFile = TestControlFileFactory.CreateControlFile();

            _stateProvider         = GenerateMock <IStateProvider>();
            _state                 = GenerateMock <IState>();
            _timeProvider          = GenerateMock <ITimeProvider>();
            _webClientFactory      = GenerateMock <IWebClientFactory>();
            _webClient             = GenerateMock <IWebClient>();
            _feedFactory           = GenerateMock <IPodcastFeedFactory>();
            _fileUtilities         = GenerateMock <IFileUtilities>();
            _podcastFeed           = GenerateMock <IPodcastFeed>();
            _directoryInfoProvider = GenerateMock <IDirectoryInfoProvider>();
            _directoryInfo         = GenerateMock <IDirectoryInfo>();
            _commandGenerator      = GenerateMock <ICommandGenerator>();
            _pathUtilities         = GenerateMock <IPathUtilities>();

            SetupData();
            SetupStubs();

            _episodeFinder = new EpisodeFinder(_fileUtilities, _feedFactory, _webClientFactory, _timeProvider, _stateProvider, _directoryInfoProvider, _commandGenerator, _pathUtilities);
            _episodeFinder.StatusUpdate += new EventHandler <StatusUpdateEventArgs>(EpisodeFinderStatusUpdate);
            _latestUpdate = null;
        }
Esempio n. 9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="iOSDataConnection"/> class.
 /// </summary>
 /// <param name="filename">The filename</param>
 public iOSDataConnection(string filename)
 {
     _connectionString = string.Format("Data Source={0}; Version=3;", filename);
     _tConverter       = new iOSCLRConverter();
     _commandGenerator = new iOSCommandGenerator();
     _dConverter       = new StandardDBConverter();
 }
Esempio n. 10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DbSet{T}" /> class.
 /// </summary>
 /// <param name="commandGenerator">Generator to create commands.</param>
 /// <param name="provider">Provider to executing commands.</param>
 /// <param name="query">Query.</param>
 /// <param name="tableInfo">Information about table from database.</param>
 public DbSet(ICommandGenerator <T> commandGenerator, IQueryProvider provider, IQueryBase <T> query, TableInfo tableInfo)
 {
     _commandGenerator = Check.NotNull(commandGenerator, nameof(commandGenerator));
     _provider         = Check.NotNull(provider, nameof(provider));
     _query            = Check.NotNull(query, nameof(query));
     _tableInfo        = Check.NotNull(tableInfo, nameof(tableInfo));
 }
Esempio n. 11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MySqlServerConnection"/> class.
 /// </summary>
 /// <param name="ConnectionString">The connection string.</param>
 /// <param name="engine">The storage engine to use when creating tables</param>
 public MySqlServerConnection(string ConnectionString, StorageEngine engine)
 {
     _commandGenerator = new MySqlCommandGenerator(engine);
     _connectionString = ConnectionString;
     _tConverter       = new StandardCLRConverter();
     _dConverter       = new MySqlServerDBConverter();
 }
        public WifiControllerViewModel(ICommandGenerator commandGenerator, ISettingAccess settingAccess, INavigator navigator, IHTTPClient httpClient,
                                       IPlatformToast platformToast) : base(navigator)
        {
            _commandGenerator = commandGenerator;
            _settingAccess    = settingAccess;
            _httpClient       = httpClient;
            _platformToast    = platformToast;

            InitializeCommands();
        }
Esempio n. 13
0
        public KormDataReader(IEnumerable <T> data, ICommandGenerator <T> generator)
        {
            Check.NotNull(data, nameof(data));
            Check.NotNull(generator, nameof(generator));

            _data          = data;
            DataEnumerator = _data.GetEnumerator();
            _generator     = generator;
            _columns       = _generator.GetQueryColumns().ToList();
        }
 /// <summary>
 /// discover items to be downloaded from a feed
 /// </summary>
 public EpisodeFinder(IFileUtilities fileFinder, IPodcastFeedFactory feedFactory, IWebClientFactory webClientFactory, ITimeProvider timeProvider, IStateProvider stateProvider, IDirectoryInfoProvider directoryInfoProvider, ICommandGenerator commandGenerator)
 {
     _fileUtilities         = fileFinder;
     _commandGenerator      = commandGenerator;
     _directoryInfoProvider = directoryInfoProvider;
     _stateProvider         = stateProvider;
     _timeProvider          = timeProvider;
     _webClientFactory      = webClientFactory;
     _feedFactory           = feedFactory;
 }
Esempio n. 15
0
        public override void BuildProcessing(ICommandGenerator generator)
        {
            _disk3DTechProcess = (Disk3DTechProcess)TechProcess;

            var offsetSurface = CreateOffsetSurface();

            var matrix = Matrix3d.Rotation(_disk3DTechProcess.Angle.ToRad(), Vector3d.ZAxis, Point3d.Origin);

            if (_disk3DTechProcess.Angle != 0)
            {
                offsetSurface.TransformBy(matrix);
            }

            var minPoint = offsetSurface.GeometricExtents.MinPoint;
            var maxPoint = offsetSurface.GeometricExtents.MaxPoint;

            var collections = GetPointCollections(offsetSurface, minPoint, maxPoint);

            offsetSurface.Dispose();

            var zArray = GetZArray(collections, (maxPoint - minPoint).X);

            var passList = CalcPassList(zArray, minPoint);

            matrix = matrix.Inverse();
            passList.ForEach(p =>
            {
                var points = p;
                if (Departure > 0)
                {
                    points.Insert(0, new Point3d((IsDepartureOnBorderSection ? points.First().X : minPoint.X) - Departure, points.First().Y, points.First().Z));
                    points.Add(new Point3d((IsDepartureOnBorderSection ? points.Last().X : maxPoint.X) + Departure, points.Last().Y, points.Last().Z));
                }
                if (TechProcess.MachineType == MachineType.Donatoni) //Settongs.IsFrontPlaneZero
                {
                    points = points.ConvertAll(x => new Point3d(x.X, x.Y - TechProcess.Tool.Thickness.Value, x.Z));
                }
                if (_disk3DTechProcess.Angle != 0)
                {
                    points = points.ConvertAll(x => x.TransformBy(matrix));
                }
                var loc = generator.ToolLocation;
                if (loc.IsDefined && loc.Point.DistanceTo(points.First()) > loc.Point.DistanceTo(points.Last()))
                {
                    points.Reverse();
                }

                BuildPass(generator, points);

                if (IsUplifting)
                {
                    generator.Uplifting();
                }
            });
        }
Esempio n. 16
0
        protected override void BuildProcessing(ICommandGenerator generator)
        {
            generator.ZSafety = ZSafety;
            generator.SetTool(1, Frequency);

            ProcessingArea.ForEach(p =>
            {
                var arc = p.GetCurve() as Circle;
                Cutting(generator, arc.Center.X, arc.Center.Y);
            });
        }
Esempio n. 17
0
        public ShellViewModel(IDialogCoordinator dialogCoordinator, ICommandGenerator commandGenerator, IConsole console, MotorFactory motorFactory)
        {
            _dialogCoordinator           = dialogCoordinator ?? throw new ArgumentNullException(nameof(dialogCoordinator));
            _commandGenerator            = commandGenerator ?? throw new ArgumentNullException(nameof(commandGenerator));
            _console                     = console ?? throw new ArgumentNullException(nameof(console));
            _motorFactory                = motorFactory ?? throw new ArgumentNullException(nameof(motorFactory));
            _console.OutputDataReceived += (object sender, DataReceivedEventArgs e) => BusyText = e.Data;

            var lastSettings = Properties.Settings.Default.lastSettings;

            LoadConfigFromSerialized(lastSettings);
        }
Esempio n. 18
0
        private void BuildPass(ICommandGenerator generator, List <Point3d> points)
        {
            if (TechProcess.MachineType == MachineType.ScemaLogic) //Settongs.IsFrontPlaneZero
            {
                points = points.ConvertAll(p => new Point3d(p.X, p.Y + TechProcess.Tool.Thickness.Value, p.Z));
            }
            var  z = generator.ZSafety - TechProcess.ZSafety;
            bool isComplete;

            do
            {
                isComplete = true;
                z         -= Penetration;
                var point0 = Algorithms.NullPoint3d;
                var point  = Algorithms.NullPoint3d;

                foreach (var pt in points)
                {
                    var p = pt;
                    if (z > p.Z)
                    {
                        p          = new Point3d(p.X, p.Y, z);
                        isComplete = false;
                    }
                    if (generator.IsUpperTool)
                    {
                        generator.Move(p.X, p.Y, angleC: ((Disk3DTechProcess)TechProcess).Angle);
                    }

                    if (point.IsNull())
                    {
                        if (generator.ToolLocation.Point != p)
                        {
                            generator.GCommand(CommandNames.Penetration, 1, point: p, feed: TechProcess.PenetrationFeed);
                        }
                    }
                    else if (point0 != point && point != p && !point0.GetVectorTo(point).IsCodirectionalTo(point.GetVectorTo(p)))
                    {
                        generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                        point0 = point;
                    }
                    if (point0.IsNull())
                    {
                        point0 = p;
                    }
                    point = p;
                }
                generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                points.Reverse();
            }while (!isComplete);

            generator.Uplifting();
        }
Esempio n. 19
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DbSet{T}" /> class.
 /// </summary>
 /// <param name="commandGenerator">Generator to create commands.</param>
 /// <param name="provider">Provider to executing commands.</param>
 /// <param name="query">Query.</param>
 /// <param name="tableInfo">Information about table from database.</param>
 public DbSet(
     ICommandGenerator <T> commandGenerator,
     IQueryProvider provider,
     IQueryBase <T> query,
     TableInfo tableInfo)
 {
     _commandGenerator       = Check.NotNull(commandGenerator, nameof(commandGenerator));
     _provider               = Check.NotNull(provider, nameof(provider));
     _query                  = Check.NotNull(query, nameof(query));
     _tableInfo              = Check.NotNull(tableInfo, nameof(tableInfo));
     _primaryKeyPropertyType = new Lazy <Type>(GetPrimaryKeyType);
 }
Esempio n. 20
0
        public override void BuildProcessing(ICommandGenerator generator)
        {
            const int AngleA             = 45;
            var       tactileTechProcess = (TactileTechProcess)TechProcess;
            var       contour            = tactileTechProcess.GetContour();
            var       contourPoints      = contour.GetPolyPoints().ToArray();
            var       ray = new Ray
            {
                BasePoint = ProcessingAngle == 45 ? contourPoints.Last() : contourPoints.First(),
                UnitDir   = Vector3d.XAxis.RotateBy(Graph.ToRad(ProcessingAngle), Vector3d.ZAxis)
            };
            var passDir = ray.UnitDir.GetPerpendicularVector();

            if (ProcessingAngle >= 90)
            {
                passDir = passDir.Negate();
            }
            ray.BasePoint += passDir * (tactileTechProcess.BandStart1.Value - tactileTechProcess.BandSpacing.Value);
            var step          = tactileTechProcess.BandWidth.Value + tactileTechProcess.BandSpacing.Value;
            var tactileParams = tactileTechProcess.TactileTechProcessParams;
            var engineSide    = ProcessingAngle < 90 ? Side.Right : Side.Left;

            while (true)
            {
                var points = new Point3dCollection();
                ray.IntersectWith(contour, Intersect.ExtendThis, new Plane(), points, IntPtr.Zero, IntPtr.Zero);
                if (points.Count == 2 && !points[0].IsEqualTo(points[1]))
                {
                    var vector     = (points[1] - points[0]).GetNormal() * tactileParams.Departure;
                    var startPoint = points[0] - vector - Vector3d.ZAxis * tactileParams.Depth;
                    var endPoint   = points[1] + vector - Vector3d.ZAxis * tactileParams.Depth;
                    if (generator.IsUpperTool)
                    {
                        generator.Move(startPoint.X, startPoint.Y, angleC: BuilderUtils.CalcToolAngle(ProcessingAngle.ToRad(), engineSide), angleA: AngleA);
                    }
                    generator.Cutting(startPoint, endPoint, CuttingFeed, tactileParams.TransitionFeed);
                }
                else if (step > 0)
                {
                    ray.BasePoint += passDir * tactileTechProcess.BandSpacing.Value;
                    step           = -step;
                    generator.Uplifting();
                    engineSide = engineSide.Opposite();
                }
                else
                {
                    break;
                }
                ray.BasePoint += passDir * step;
            }
        }
Esempio n. 21
0
        public KormBulkInsertDataReader(IEnumerable <T> data,
                                        ICommandGenerator <T> generator,
                                        IIdGenerator idGenerator,
                                        TableInfo tableInfo)
            : base(data, generator)
        {
            _tableInfo   = tableInfo;
            _idGenerator = idGenerator;

            _primaryKey = new Lazy <ColumnInfo>(() =>
            {
                return(_tableInfo.PrimaryKey.Single(p => p.AutoIncrementMethodType == AutoIncrementMethodType.Custom));
            });
        }
Esempio n. 22
0
        public override void BuildProcessing(ICommandGenerator generator)
        {
            for (int i = 0; i < PointsX.Count; i++)
            {
                generator.GCommand(CommandNames.Fast, 0, x: PointsX[i], y: PointsY[i], z: 80);
                generator.Command($"G0 Z80");
                generator.Command("M131");
                generator.Command($"DBL THICK{i} = %TastL.ZLastra - %TastL.ZBanco", "Измерение");
                generator.Command($"G0 Z(THICK{i}/1000 + 100)");
            }
            var s = String.Join(" + ", Enumerable.Range(0, PointsX.Count).Select(p => $"THICK{p}"));

            generator.Command($"DBL THICK = ({s})/{PointsX.Count}/1000");
            generator.WithThick = true;
        }
Esempio n. 23
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SqlServerConnection"/> class with a connection string appropriate for sql server 2k8
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="Catalog">The catalog.</param>
        /// <param name="User">The user.</param>
        /// <param name="Password">The password.</param>
        public SqlCompactConnection(string file)
        {
            _commandGenerator = new SqlCompactCommandGenerator();
            _connectionString = string.Format("Data Source={0};Persist Security Info=False;", file);
            _tConverter       = new SqlCompactTypeConverter();
            _dConverter       = new SqlCompactDBConverter();

            if (!System.IO.File.Exists(file))
            {
                using (SqlCeEngine engine = new SqlCeEngine(_connectionString))
                {
                    engine.CreateDatabase();
                }
            }
        }
Esempio n. 24
0
        public KormBulkInsertDataReader(IEnumerable <T> data,
                                        ICommandGenerator <T> generator,
                                        IIdGenerator idGenerator,
                                        TableInfo tableInfo)
            : base(data, generator)
        {
            _tableInfo   = tableInfo;
            _idGenerator = idGenerator;

            if (_idGenerator is not null)
            {
                _primaryKey        = _tableInfo.PrimaryKey.Single(p => p.AutoIncrementMethodType == AutoIncrementMethodType.Custom);
                _primaryKeyOrdinal = GetOrdinal(_primaryKey.Name);
            }
        }
 public SettingsViewModel(ISettingAccess settingAccess, ICommandGenerator commandGenerator, INavigator INavigator, IPlatformToast platformToast) : base(INavigator)
 {
     _settingAccess      = settingAccess;
     _commandGenerator   = commandGenerator;
     _platformToast      = platformToast;
     SaveSettingsCommand = _commandGenerator.GenerateCommand(async() =>
     {
         try
         {
             await SaveSettings(Settings);
         }
         catch (ArgumentNullException)
         {
             _platformToast.ShowToast("Could not save settings...try again");
         }
     });
 }
Esempio n. 26
0
        private void BuildPass(ICommandGenerator generator, List <Point3d> points)
        {
            if (TechProcess.MachineType == MachineType.ScemaLogic)  //Settongs.IsFrontPlaneZero
            {
                points = points.ConvertAll(p => new Point3d(p.X, p.Y + TechProcess.Tool.Thickness.Value, p.Z));
            }

            var point0 = Algorithms.NullPoint3d;
            var point  = Algorithms.NullPoint3d;

            foreach (var p in points)
            {
                if (generator.IsUpperTool)
                {
                    generator.Move(p.X, p.Y, angleC: ((Disk3DTechProcess)TechProcess).Angle);
                }

                if (point.IsNull())
                {
                    if (generator.ToolLocation.Point != p)
                    {
                        generator.GCommand(CommandNames.Penetration, 1, point: p, feed: TechProcess.PenetrationFeed);
                    }
                }
                else if (point0 != point && point != p && !point0.GetVectorTo(point).IsCodirectionalTo(point.GetVectorTo(p)))
                {
                    generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                    point0 = point;
                }
                if (point0.IsNull())
                {
                    point0 = p;
                }
                point = p;
            }
            generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
        }
Esempio n. 27
0
        public override void BuildProcessing(ICommandGenerator generator)
        {
            var tactileTechProcess = (TactileTechProcess)TechProcess;
            var tactileParams      = ((TactileTechProcess)TechProcess).TactileTechProcessParams;
            var isDiag             = tactileTechProcess.ProcessingAngle1 != 0;

            var contour       = tactileTechProcess.GetContour();
            var contourPoints = contour.GetPolyPoints().ToArray();

            var point = tactileTechProcess.Objects.Select(p => p.GetCurve()).OfType <Circle>().Select(p => p.Center).OrderBy(p => (int)p.Y).ThenBy(p => p.X).First();
            var x     = point.X;
            var y     = point.Y;
            var stepX = tactileTechProcess.BandSpacing.Value + tactileTechProcess.BandWidth.Value;
            var stepY = stepX;

            if (isDiag)
            {
                stepY /= Math.Sqrt(2);
                stepX  = stepY * 2;
            }
            generator.SetTool(2, Frequency, 90, false);
            generator.ZSafety = ZSafety;

            while (y < contourPoints[1].Y)
            {
                Cutting();
                x += stepX;
                if (x > contourPoints[3].X)
                {
                    y    += stepY;
                    x    -= stepY;
                    stepX = -stepX;
                    if (x > contourPoints[3].X)
                    {
                        x += stepX;
                    }
                }
                if (x < contourPoints[1].X)
                {
                    y    += stepY;
                    x    += stepY;
                    stepX = -stepX;
                    if (x < contourPoints[1].X)
                    {
                        x += stepX;
                    }
                }
            }

            void Cutting()
            {
                generator.Move(x, y);
                generator.Move(z: ZEntry);
                var    zMin    = -tactileParams.Depth;
                double z       = 0;
                int    counter = 0;

                while (z >= zMin)
                {
                    var feed = (int)((FeedMax - FeedMin) / zMin * (z * z / zMin - 2 * z) + FeedMax);
                    generator.Cutting(x, y, z, feed);
                    if (z <= -2)
                    {
                        if (++counter == 5) // Подъем на 1мм для охлаждения
                        {
                            counter = 0;
                            Pause();
                            generator.Uplifting(z + 1);
                            generator.Cutting(x, y, z + 0.2, (int)(FeedMax * 1.5));
                            generator.Cutting(x, y, z, feed);
                        }
                    }
                    z -= 0.2;
                }
                Pause();
                generator.Uplifting();

                void Pause() => generator.Command("G4 F0.2", "Пауза");
            }

            contour.Dispose();
        }
Esempio n. 28
0
 public ControllerRequirements(IQueryGenerator queryGenerator, ICommandGenerator commandGenerator)
 {
     QueryGenerator   = queryGenerator;
     CommandGenerator = commandGenerator;
 }
Esempio n. 29
0
        public override void BuildProcessing(ICommandGenerator generator)
        {
            const int CornerIndentIncrease = 5;
            var       techProcess          = (SawingTechProcess)TechProcess;
            var       curve        = ProcessingArea.GetCurve();
            var       thickness    = techProcess.Thickness.Value;
            var       toolDiameter = techProcess.Tool.Diameter;
            var       engineSide   = Side.None;
            double    offsetArc    = 0;
            double    angleA       = 0;

            if (techProcess.MachineType == MachineType.ScemaLogic)
            {
                AngleA = 0;
            }

            switch (curve)
            {
            case Arc arc:
                CalcArc(arc);
                break;

            case Line line:
                CalcLine(line);
                break;

            case Polyline polyline:
                CalcPolyline(polyline);
                break;

            default:
                throw new InvalidOperationException($"Кривая типа {curve.GetType()} не может быть обработана.");
            }

            var outerSideSign = OuterSide == Side.Left ^ curve is Line ? -1 : 1;
            var offsetCoeff   = Math.Tan(angleA) * outerSideSign;
            var depthCoeff    = 1 / Math.Cos(angleA);
            var toolThickness = techProcess.Tool.Thickness.Value * depthCoeff;
            var compensation  = (offsetArc + (engineSide == OuterSide ^ techProcess.MachineType == MachineType.Donatoni ? toolThickness : 0)) * outerSideSign;
            var shift         = angleA > 0 ? -thickness * offsetCoeff : 0;

            var sumIndent = CalcIndent(thickness) * (Convert.ToInt32(IsExactlyBegin) + Convert.ToInt32(IsExactlyEnd));

            if (sumIndent >= curve.Length())
            {
                if (AngleA != 0)
                {
                    throw new InvalidOperationException("Расчет намечания выполняется только при нулевом вертикальном угле.");
                }
                var point = Scheduling();
                var angle = BuilderUtils.CalcToolAngle((curve.EndPoint - curve.StartPoint).ToVector2d().Angle, engineSide);
                generator.Move(point.X, point.Y, angleC: angle);
                generator.Cutting(point.X, point.Y, point.Z, techProcess.PenetrationFeed);
                return;
            }

            var modes = SawingModes.ConvertAll(p => new CuttingMode {
                Depth = p.Depth, DepthStep = p.DepthStep, Feed = p.Feed
            });
            var passList = BuilderUtils.GetPassList(modes, thickness, !ProcessingArea.ObjectId.IsLine()).ToList();

            Curve toolpathCurve = null;

            foreach (var item in passList)
            {
                CreateToolpath(item.Key, compensation + shift + item.Key * offsetCoeff);
                if (generator.IsUpperTool)
                {
                    var point  = engineSide == Side.Right ^ (passList.Count() % 2 == 1) ? toolpathCurve.EndPoint : toolpathCurve.StartPoint;
                    var vector = Vector3d.ZAxis * (item.Key + generator.ZSafety);
                    if (angleA != 0)
                    {
                        vector = vector.RotateBy(outerSideSign * angleA, ((Line)toolpathCurve).Delta) * depthCoeff;
                    }
                    var p0     = point + vector;
                    var angleC = BuilderUtils.CalcToolAngle(toolpathCurve, point, engineSide);
                    generator.Move(p0.X, p0.Y, angleC: angleC, angleA: Math.Abs(AngleA));
                    if (techProcess.MachineType == MachineType.ScemaLogic)
                    {
                        generator.Command("28;;XYCZ;;;;;;", "Цикл");
                    }
                }
                generator.Cutting(toolpathCurve, item.Value, techProcess.PenetrationFeed, engineSide);
            }
            generator.Uplifting(Vector3d.ZAxis.RotateBy(outerSideSign * angleA, toolpathCurve.EndPoint - toolpathCurve.StartPoint) * (thickness + generator.ZSafety) * depthCoeff);

            if (!IsExactlyBegin || !IsExactlyEnd)
            {
                var gashCurve = curve.GetOffsetCurves(shift)[0] as Curve;
                if (!IsExactlyBegin)
                {
                    Acad.CreateGash(gashCurve, gashCurve.StartPoint, OuterSide, thickness * depthCoeff, toolDiameter, toolThickness);
                }
                if (!IsExactlyEnd)
                {
                    Acad.CreateGash(gashCurve, gashCurve.EndPoint, OuterSide, thickness * depthCoeff, toolDiameter, toolThickness);
                }
                gashCurve.Dispose();
            }

            // Local func ------------------------

            void CalcArc(Arc arc)
            {
                AngleA = 0;
                var startSide      = Math.Sign(Math.Cos(arc.StartAngle.Round(3)));
                var endSide        = Math.Sign(Math.Cos(arc.EndAngle.Round(3)));
                var cornersOneSide = Math.Sign(startSide * endSide);

                if (arc.TotalAngle.Round(3) > Math.PI && cornersOneSide > 0)
                {
                    throw new InvalidOperationException("Обработка дуги невозможна - дуга пересекает углы 90 и 270 градусов.");
                }

                if (cornersOneSide < 0) //  дуга пересекает углы 90 или 270 градусов
                {
                    if (techProcess.MachineType == MachineType.ScemaLogic)
                    {
                        throw new InvalidOperationException("Обработка дуги невозможна - дуга пересекает угол 90 или 270 градусов.");
                    }

                    engineSide = startSide > 0 ? Side.Left : Side.Right;
                }
                if (OuterSide == Side.Left)                                                         // внутренний рез дуги
                {
                    if (techProcess.MachineType == MachineType.Donatoni && engineSide != Side.Left) // подворот диска при вн. резе дуги
                    {
                        engineSide = Side.Right;
                        //var comp = arc.Radius - Math.Sqrt(arc.Radius * arc.Radius - thickness * (toolDiameter - thickness));
                        //AngleA = Math.Atan2(comp, thickness).ToDeg();

                        var R    = arc.Radius;
                        var t    = thickness;
                        var d    = toolDiameter;
                        var comp = (2 * R * t * t - Math.Sqrt(-d * d * d * d * t * t + 4 * d * d * R * R * t * t + d * d * t * t * t * t)) / (d * d - 4 * R * R);
                        AngleA = -Math.Atan2(comp, thickness).ToDeg();
                    }
                    else
                    {
                        offsetArc = arc.Radius - Math.Sqrt(arc.Radius * arc.Radius - thickness * (toolDiameter - thickness));
                    }
                }
                if (engineSide == Side.None)
                {
                    engineSide = (startSide + endSide) > 0 ? Side.Right : Side.Left;
                }
            }

            void CalcLine(Line line)
            {
                angleA     = AngleA.ToRad();
                engineSide = AngleA == 0 ? BuilderUtils.CalcEngineSide(line.Angle) : AngleA > 0 ? OuterSide : OuterSide.Opposite();
            }

            void CalcPolyline(Polyline polyline)
            {
                int sign = 0;

                for (int i = 0; i < polyline.NumberOfVertices; i++)
                {
                    var point = polyline.GetPoint3dAt(i);
                    var s     = Math.Sign(Math.Sin(polyline.GetTangent(point).Angle.Round(6)));
                    if (s == 0)
                    {
                        continue;
                    }
                    if (sign == 0)
                    {
                        sign = s;
                        continue;
                    }
                    var bulge = polyline.GetBulgeAt(i - 1);
                    if (bulge == 0)
                    {
                        bulge = polyline.GetBulgeAt(i);
                    }

                    if (s != sign)
                    {
                        if (techProcess.MachineType == MachineType.ScemaLogic)
                        {
                            throw new InvalidOperationException("Обработка полилинии невозможна - кривая пересекает углы 90 или 270 градусов.");
                        }
                        var side = sign > 0 ^ bulge < 0 ? Side.Left : Side.Right;
                        if (engineSide != Side.None)
                        {
                            if (engineSide != side)
                            {
                                throw new InvalidOperationException("Обработка полилинии невозможна.");
                            }
                        }
                        else
                        {
                            engineSide = side;
                        }
                        sign = s;
                    }
                    else
                    if (Math.Abs(bulge) > 1)
                    {
                        throw new InvalidOperationException("Обработка невозможна - дуга полилинии пересекает углы 90 и 270 градусов.");
                    }
                }
                if (engineSide == Side.None)
                {
                    engineSide = BuilderUtils.CalcEngineSide(polyline.GetTangent(polyline.StartPoint).Angle);
                }
            }

            void CreateToolpath(double depth, double offset)
            {
                toolpathCurve = curve.GetOffsetCurves(offset)[0] as Curve;
                toolpathCurve.TransformBy(Matrix3d.Displacement(-Vector3d.ZAxis * depth));
                if (!IsExactlyBegin && !IsExactlyEnd)
                {
                    return;
                }
                var indent = CalcIndent(depth * depthCoeff);

                switch (toolpathCurve)
                {
                case Line l:
                    if (IsExactlyBegin)
                    {
                        l.StartPoint = l.GetPointAtDist(indent);
                    }
                    if (IsExactlyEnd)
                    {
                        l.EndPoint = l.GetPointAtDist(l.Length - indent);
                    }
                    break;

                case Arc a:
                    var indentAngle = indent / ((Arc)curve).Radius;
                    if (IsExactlyBegin)
                    {
                        a.StartAngle = a.StartAngle + indentAngle;
                    }
                    if (IsExactlyEnd)
                    {
                        a.EndAngle = a.EndAngle - indentAngle;
                    }
                    break;

                case Polyline p:
                    if (IsExactlyBegin)
                    {
                        p.SetPointAt(0, p.GetPointAtDist(indent).ToPoint2d());
                    }
                    //p.StartPoint = p.GetPointAtDist(indent);
                    if (IsExactlyEnd)
                    {
                        //p.EndPoint = p.GetPointAtDist(p.Length - indent);
                        p.SetPointAt(p.NumberOfVertices - 1, p.GetPointAtDist(p.Length - indent).ToPoint2d());
                    }
                    break;
                }
                ;
            }

            double CalcIndent(double depth) => Math.Sqrt(depth * (toolDiameter - depth)) + CornerIndentIncrease;

            /// <summary>
            /// Расчет точки намечания
            /// </summary>
            Point3d Scheduling()
            {
                var vector = curve.EndPoint - curve.StartPoint;
                var depth  = thickness;
                var point  = Point3d.Origin;

                if (IsExactlyBegin && IsExactlyEnd)
                {
                    var l = vector.Length - 2 * CornerIndentIncrease;
                    depth = (toolDiameter - Math.Sqrt(toolDiameter * toolDiameter - l * l)) / 2;
                    point = curve.StartPoint + vector / 2;
                }
                else
                {
                    var indentVector = vector.GetNormal() * (Math.Sqrt(depth * (toolDiameter - depth)) + CornerIndentIncrease);
                    point = IsExactlyBegin ? curve.StartPoint + indentVector : curve.EndPoint - indentVector;
                    Acad.CreateGash(curve, IsExactlyBegin ? curve.EndPoint : curve.StartPoint, OuterSide, depth, toolDiameter, toolThickness, point);
                }
                return(point + vector.GetPerpendicularVector().GetNormal() * compensation - Vector3d.ZAxis * depth);
            }
        }
Esempio n. 30
0
        public override void BuildProcessing(ICommandGenerator generator)
        {
            switch (CalcMethod)
            {
            case CalcMethodType.Average:
                for (int i = 0; i < PointsX.Count; i++)
                {
                    generator.GCommand(CommandNames.Fast, 0, x: PointsX[i] + 230, y: PointsY[i] - 100 - TechProcess.Tool.Thickness.GetValueOrDefault());
                    generator.ToolLocation.Point -= new Vector3d(0, 0, 1);
                    generator.GCommand("", 0, z: TechProcess.Thickness.GetValueOrDefault() + TechProcess.ZSafety);

                    generator.Command("M131");
                    generator.Command($"DBL THICK{i} = %TastL.ZLastra - %TastL.ZBanco", "Измерение");
                    generator.Command($"G0 Z(THICK{i}/1000 + 100)");
                }
                var s = String.Join(" + ", Enumerable.Range(0, PointsX.Count).Select(p => $"THICK{p}"));
                generator.Command($"DBL THICK = ({s})/{PointsX.Count}/1000");
                break;

            case CalcMethodType.Minimum:
                for (int i = 0; i < PointsX.Count; i++)
                {
                    generator.GCommand(CommandNames.Fast, 0, x: PointsX[i] + 230, y: PointsY[i] - 100 - TechProcess.Tool.Thickness.GetValueOrDefault());
                    generator.ToolLocation.Point -= new Vector3d(0, 0, 1);
                    generator.GCommand("", 0, z: TechProcess.Thickness.GetValueOrDefault() + TechProcess.ZSafety);

                    generator.Command("M131");
                    generator.Command($"DBL THICK{i} = %TastL.ZLastra - %TastL.ZBanco", "Измерение");
                    generator.Command($"G0 Z(THICK{i}/1000 + 100)");

                    if (i != 0)
                    {
                        generator.Command($"IF (THICK{i} < THICK0) THEN");
                        generator.Command($" THICK0 = THICK{i}");
                        generator.Command("ENDIF");
                    }
                }
                generator.Command("DBL THICK = THICK0/1000");
                break;

            case CalcMethodType.Сorners:

                var points  = PointsX.Select((p, i) => new Point2d(p, PointsY[i])).OrderBy(p => p.X).ToList();
                var corners = points.Take(2).OrderBy(p => p.Y).Concat(points.Skip(2).OrderByDescending(p => p.Y)).ToList();

                for (int i = 0; i < corners.Count; i++)
                {
                    generator.GCommand(CommandNames.Fast, 0, x: corners[i].X + 230, y: corners[i].Y - 100 - TechProcess.Tool.Thickness.GetValueOrDefault());
                    generator.ToolLocation.Point -= new Vector3d(0, 0, 1);
                    generator.GCommand("", 0, z: TechProcess.Thickness.GetValueOrDefault() + TechProcess.ZSafety);

                    generator.Command("M131");
                    generator.Command($"DBL THICK{i} = (%TastL.ZLastra - %TastL.ZBanco)/1000", "Измерение");
                    generator.Command($"G0 Z(THICK{i} + 100)");
                }
                var l1 = corners[3].X - corners[0].X;
                var l2 = corners[1].Y - corners[0].Y;
                generator.Command($"DBL KK1=(THICK3 - THICK0) / {l1}");
                generator.Command($"DBL KK2=(THICK2 - THICK1) / {l1}");
                generator.Command("DBL THICK");
                generator.ThickCommand = $"THICK = (({{0}}-{corners[0].X})*KK2+THICK1)*({{1}}-{corners[0].Y})/{l2} + (({{0}}-{corners[0].X})*KK1+THICK0)*(1-({{1}}-{corners[0].Y})/{l2})";
                break;
            }
            generator.WithThick = true;
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="SqlServerConnection"/> class.
 /// </summary>
 /// <param name="ConnectionString">The connection string.</param>
 public MsSqlServerConnection(string ConnectionString, bool isTransactional = false, IDataConnection con = null)
 {
     _commandGenerator = new MsSqlServerCommandGenerator();
     _connectionString = ConnectionString;
     _tConverter = new TSqlTypeConverter();
     _Istransactional = isTransactional;
     _connection = new SqlConnection(_connectionString);
     if (con != null)
     {
         _Istransactional = con.IsTransactional;
         _connection = con.GetConnection() as SqlConnection;
         if (con.IsTransactional)
         {
             _transaction = con.GetTransaction;
         }
     }
 }