public ExternalExtrusionToolpath(IList <Polyline> polylines, ExtrusionAttributes attributes, double extrusionFactor, double suckBack, double startDistance, double loopDistance)
        {
            _att             = attributes;
            _extrusionFactor = extrusionFactor;
            _suckBack        = -suckBack;
            _startDistance   = startDistance;
            _loopDistance    = loopDistance;

            var robotPosition = Point3d.Origin;

            robotPosition.Transform(Transform.PlaneToPlane(_att.Frame.Plane, Plane.WorldXY));

            var paths = polylines.Select(p => ToTargets(p, robotPosition)).ToList();

            CreateTargets(paths);
        }
        public ExternalExtrusionToolpath(List <List <Plane> > locations, List <List <double> > lengths, ExtrusionAttributes attributes, double extrusionFactor, double suckBack, double startDistance, double loopDistance)
        {
            _att             = attributes;
            _extrusionFactor = extrusionFactor;
            _suckBack        = -suckBack;
            _startDistance   = startDistance;
            _loopDistance    = loopDistance;

            var paths = new List <List <SimpleTarget> >(locations.Count);

            if (locations.Count != lengths.Count)
            {
                throw new ArgumentException("Number of paths in locations and lengths don't match.");
            }

            if (locations.Count == 0)
            {
                throw new ArgumentException("There should be more than one path.");
            }

            for (int i = 0; i < locations.Count; i++)
            {
                if (locations[i].Count != lengths[i].Count)
                {
                    throw new ArgumentException($"Locations and lengths in path {i} don't match.");
                }

                int pathCount = locations[0].Count;

                var path = new List <SimpleTarget>(pathCount);

                for (int j = 0; j < locations[0].Count; j++)
                {
                    path.Add(new SimpleTarget()
                    {
                        Location = locations[i][j], Length = lengths[i][j]
                    });
                }

                paths.Add(path);
            }

            CreateTargets(paths);
        }