public virtual void BuildProcessing() { using (var generator = CommandGeneratorFactory.Create <T>(MachineType.Value)) { generator.StartTechProcess(this); //if (Tool != null) // generator.SetTool( // MachineType.Value != CAM.MachineType.Donatoni ? Tool.Number : 1, // Frequency); BuildProcessing(generator); TechOperations.FindAll(p => p.Enabled && p.CanProcess).ForEach(p => { generator.SetTechOperation(p); // p.PrepareBuild(generator); p.BuildProcessing(generator); // if (!generator.IsUpperTool) // generator.Uplifting(); }); generator.FinishTechProcess(); ProcessCommands = generator.ProcessCommands; } UpdateFromCommands(); }
public List <Border> CreateExtraObjects(params ObjectId[] ids) { ExtraObjectsGroup?.DeleteGroup(); ExtraObjectsGroup = null; var techOperations = TechOperations.FindAll(p => p.ProcessingArea != null); techOperations.FindAll(p => ids.Contains(p.ProcessingArea.ObjectId)).ForEach(p => ((SawingTechOperation)p).OuterSide = Side.None); _borders = ids.Except(techOperations.Select(p => p.ProcessingArea.ObjectId)).Select(p => new Border(p)).ToList(); var borders = _borders.Concat(techOperations.Select(p => new Border((SawingTechOperation)p))).ToList(); borders.ForEach(p => p.Curve = Acad.OpenForRead(p.ObjectId)); ProcessingArea = AcadObject.CreateList(borders.Select(p => p.ObjectId)); while ((borders.Find(p => p.OuterSide != Side.None) ?? borders.FirstOrDefault()) is Border startBorder) { if (startBorder.OuterSide == Side.None) { startBorder.OuterSide = GetOuterSide(startBorder.Curve); } var contour = CalcBordersChain(startBorder, Corner.End); if (borders.Contains(startBorder)) { var contourBack = CalcBordersChain(startBorder, Corner.Start); contourBack.Reverse(); contourBack.Add(startBorder.Curve); contourBack.AddRange(contour); contour = contourBack; borders.Remove(startBorder); } var sign = startBorder.OuterSide == Side.Left ? 1 : -1; var hatchId = Graph.CreateHatch(contour, sign); if (hatchId.HasValue) { ExtraObjectsGroup = ExtraObjectsGroup.AppendToGroup(hatchId.Value); } } return(_borders); List <Curve> CalcBordersChain(Border border, Corner corner) { var point = border.Curve.GetPoint(corner); var contour = new List <Curve>(); while (borders.SingleOrDefault(p => p != border && p.Curve.HasPoint(point)) is Border nextBorder) { contour.Add(nextBorder.Curve); borders.Remove(nextBorder); var nextCorner = nextBorder.Curve.GetCorner(point); nextBorder.OuterSide = nextCorner != corner ? border.OuterSide : border.OuterSide.Opposite(); if (border.MustCalc || nextBorder.MustCalc) { var isExactly = CalcIsExactly(border, corner, nextBorder, nextCorner, point); border.SetIsExactly(corner, isExactly); nextBorder.SetIsExactly(nextCorner, isExactly); } border = nextBorder; corner = nextCorner.Swap(); point = border.Curve.GetPoint(corner); } return(contour); } bool CalcIsExactly(Border border, Corner corner, Border nextBorder, Corner nextCorner, Point3d point) { var v1 = border.Curve.GetTangent(corner); var v2 = nextBorder.Curve.GetTangent(nextCorner); var isLeftTurn = v1.MinusPiToPiAngleTo(v2) > Consts.Epsilon; var isLeftOuterSide = border.OuterSide == Side.Left; var isNextStartPoint = nextCorner == Corner.Start; return(isLeftTurn ^ isLeftOuterSide ^ isNextStartPoint); } Side GetOuterSide(Curve curve) { var startPoint = curve.GetPointAtParameter((curve.EndParam + curve.StartParam) / 2); var point = Interaction.GetLineEndPoint("Выберите направление внешней нормали к объекту", startPoint); var vector = curve.GetTangent(startPoint); return(vector.IsTurnRight((point - startPoint).ToVector2d()) ? Side.Right : Side.Left); } }
protected override void BuildProcessing(CableCommandGenerator generator) { Tool = new Tool { Type = ToolType.Cable, Diameter = ToolThickness, Thickness = ToolThickness }; var z0 = ProcessingArea.Select(p => p.ObjectId).GetExtents().MaxPoint.Z + ZSafety; generator.IsExtraRotate = IsExtraRotate; //if (OriginObject == null) //{ // var center = ProcessingArea.Select(p => p.ObjectId).GetCenter(); // OriginX = center.X.Round(2); // OriginY = center.Y.Round(2); // OriginObject = Acad.CreateOriginObject(new Point3d(OriginX, OriginY, 0)); //} //var surface1 = ProcessingArea.First().ObjectId.QOpenForRead<Autodesk.AutoCAD.DatabaseServices.Surface>(); //var bounds = surface1.Bounds; //var min = bounds.Value.MinPoint; //var max = bounds.Value.MaxPoint; //var cnt = 500; //var cntz = 20; //for (int i = 0; i < cntz; i++) //{ // for (int j = 0; j < cnt; j++) // { // var pt = new Point3d(min.X, min.Y + (max.Y - min.Y) / cnt * j, min.Z + (max.Z - min.Z) / cntz * i); // surface1.RayTest(pt, Vector3d.XAxis, 0.0001, out SubentityId[] col, out DoubleCollection par); // if (par.Count == 1) // { // App.LockAndExecute(() => Draw.Circle(pt + Vector3d.XAxis * par[0], 1)); // } // } //} //return; //surface1.Intersect(new) generator.S = S; generator.Feed = CuttingFeed; var z00 = ProcessingArea.Select(p => p.ObjectId).GetExtents().MaxPoint.Z + ZSafety; generator.SetToolPosition(new Point3d(OriginX, OriginY, 0), 0, 0, z00); generator.Command($"G92"); CableSawingTechOperation last = null; foreach (var operation in TechOperations.FindAll(p => p.Enabled && p.CanProcess).Cast <CableSawingTechOperation>()) { SetOperationParams(operation); generator.Feed = operation.CuttingFeed; if (operation is LineSawingTechOperation lineSawingTechOperation) { lineSawingTechOperation.BuildProcessing(generator); continue; } if (operation is ArcSawingTechOperation arcSawingTechOperation) { arcSawingTechOperation.BuildProcessing(generator); continue; } //Curve[] railCurves = new Curve[2]; //var entityes = operation.AcadObjects.ConvertAll(p => p.ObjectId.QOpenForRead<Entity>()); //var offsetDistance = ToolThickness / 2 + operation.Delta; //if (entityes.Count == 2) //{ // //railCurves = entityes.Cast<Curve>().ToArray(); // //var offsetCurve0 = railCurves[0].GetOffsetCurves(offsetDistance)[0] as Curve; // //if (offsetCurve0.StartPoint.DistanceTo(Center.ToPoint3d()) < railCurves[0].StartPoint.DistanceTo(Center.ToPoint3d())) // // offsetCurve0 = railCurves[0].GetOffsetCurves(-offsetDistance)[0] as Curve; // //var offsetCurve1 = railCurves[1].GetOffsetCurves(offsetDistance)[0] as Curve; // //if (offsetCurve1.StartPoint.DistanceTo(Center.ToPoint3d()) < railCurves[1].StartPoint.DistanceTo(Center.ToPoint3d())) // // offsetCurve1 = railCurves[1].GetOffsetCurves(-offsetDistance)[0] as Curve; // var matrix = Matrix3d.Displacement(Vector3d.ZAxis * offsetDistance); // railCurves = entityes.Select(p => (Curve)p.GetTransformedCopy(matrix)).ToArray(); //} //else //{ // var entity = entityes.First(); // if (entity is Region region) // { // entity = new PlaneSurface(); // ((PlaneSurface)entity).CreateFromRegion(region); // } // if (operation.IsRevereseOffset) // offsetDistance *= -1; // var surface = DbSurface.CreateOffsetSurface(entity, offsetDistance) as DbSurface; // var collection = new DBObjectCollection(); // surface.Explode(collection); // var curves = collection.Cast<Curve>().ToList(); // railCurves = operation.GetRailCurves(curves); //} ////if (railCurves[1].StartPoint.DistanceTo(railCurves[0].StartPoint) > railCurves[1].StartPoint.DistanceTo(railCurves[0].EndPoint)) //if (railCurves[0].StartPoint.GetVectorTo(railCurves[0].EndPoint).GetAngleTo(railCurves[1].StartPoint.GetVectorTo(railCurves[1].EndPoint)) > Math.PI / 2) // railCurves[1].ReverseCurve(); //if (railCurves[0] is Line) //{ // var dz = Math.Abs(railCurves[0].StartPoint.Z - railCurves[1].StartPoint.Z); // TODO dz // if (dz > 1) // { // if (railCurves[0].StartPoint.Z > railCurves[1].StartPoint.Z) // railCurves[1].StartPoint = railCurves[1].StartPoint.GetExtendedPoint(railCurves[1].EndPoint, dz); // else // railCurves[0].StartPoint = railCurves[0].StartPoint.GetExtendedPoint(railCurves[0].EndPoint, dz); // } //} //var points0 = GetRailPoints(railCurves[0], operation); //var points1 = GetRailPoints(railCurves[1], operation); //var direction = new Line2d(points0[1].ToPoint2d(), points1[1].ToPoint2d()).Direction; //if (!isStarted) //{ // generator.SetToolPosition(new Point3d(OriginX, OriginY, 0), 0, 0, z0); // generator.Command($"G92"); //} //int? xSign = null; //for (int i = 0; i < points0.Count; i++) //{ // var line = new Line2d(points0[i].ToPoint2d(), points1[i].ToPoint2d()); // var pNearest = line.GetClosestPointTo(Center).Point; // var vector = pNearest - Center; // if (xSign == null) // xSign = vector.X.Round(6) > 0 ? -1 : 1; // var xSignNew = vector.X.Round(6) > 0 ? -1 : 1; // if (xSignNew != xSign) // xSign *= -1; // var u = vector.Length * xSign.Value; // var z = (points0[i] + (points1[i] - points0[i]) / 2).Z; // //var angle = Vector2d.XAxis.Negate().ZeroTo2PiAngleTo(vector).ToDeg(); // //if (operation is ArcSawingTechOperation) // //{ // // if (angle - generator.Angle > 150) // // { // // angle -= 180; // // u *= -1; // // } // // if (generator.Angle - angle > 150) // // { // // angle += 180; // // u *= -1; // // } // //} // //if (angle > 180) // //{ // // angle -= 180; // // u *= -1; // //} // //if (i != 0 && generator.Angle - angle > 150) // //{ // // //angle += 360; // // u *= -1; // //} // //if (operation == TechOperations.Last()) // //{ // // angle += 180; // // //u *= -1; // //} // if (!(railCurves[0] is Line)) // direction = line.Direction; // if (!isStarted) // { // generator.GCommandAngle(direction, operation.S); // //generator.GCommand(0, u); // //generator.GCommand(0, u, z); // generator.Command($"M03", "Включение"); // isStarted = true; // } // else // { // //generator.GCommand(1, u, z, operation.CuttingFeed); // generator.GCommandAngle(direction, operation.S); // } //} } generator.Command($"G04 P{last?.Delay ?? Delay}", "Задержка"); generator.Command($"M05", "Выключение"); generator.Command($"M00", "Пауза"); //foreach (Region region in regions) //{ // var z1 = region.Bounds.Value.MinPoint.Z; // var z2 = region.Bounds.Value.MaxPoint.Z; // var collection = new DBObjectCollection(); // region.Explode(collection); // var ofsset = region.Normal * (ToolThickness / 2 + Delta); // var lines = collection.Cast<Line>() // .Where(p => Math.Abs(p.StartPoint.Z - p.EndPoint.Z) < 1) // .Where(p => Math.Abs(z1 - p.StartPoint.Z) < 1 || Math.Abs(z2 - p.StartPoint.Z) < 1) // .OrderByDescending(p => p.Length) // .Take(2) // .Select(p => p.GetStartEndPoints().Select(pt => pt + ofsset).ToArray()) // .OrderBy(p => p[0].Z) // .ToList(); // //if (lines.Count != 2) // // throw new Exception("Задана некорректная область"); // var line1 = new Line(lines[0][0].ToPoint2d().ToPoint3d(), lines[0][1].ToPoint2d().ToPoint3d()); // var pNearest = line1.GetClosestPointTo(origin, true); // var vector = (pNearest - origin).ToVector2d(); // var u1 = vector.Length; // var angle = Vector2d.XAxis.Negate().ZeroTo2PiAngleTo(vector).ToDeg(2); // generator.GCommandAngle(angle, S); // var line2 = new Line2d(lines[1][0].ToPoint2d(), lines[1][1].ToPoint2d()); // var u2 = line2.GetDistanceTo(origin.ToPoint2d()); // var coeff = (u2 - u1) / (z2 - z1); // var u3 = u2 + ZSafety * coeff; // var z3 = z2 + ZSafety; // generator.GCommand(0, u3, z3); // generator.Command($"M03", "Включение"); // var u0 = u1 - Departure * coeff; // var z0 = z1 - Departure; // generator.GCommand(1, u0, z0, PenetrationFeed); // generator.Command($"G04 P60", "Задержка"); // generator.Command($"M05", "Выключение"); // generator.Command($"M00", "Пауза"); // generator.GCommand(1, u3, z3, CuttingFeed); //} }