/// <summary> /// Entity 분해하기 /// </summary> /// <param name="acEnt"></param> /// <returns></returns> private List <Entity> BreakEntity(Entity acEnt) { var acDBObjColl = new DBObjectCollection(); acEnt.Explode(acDBObjColl); #region 분해된 객체 var acObjs = from a in acDBObjColl.Cast <Entity>().ToList() where a.GetRXClass().DxfName != RXClass.GetClass(typeof(BlockReference)).DxfName select a; if (acObjs.Any()) { acXEnt.AddRange(acObjs); } #endregion #region 분해 안된 Block 안의 또다른 Block들 var BlockObjs = from a in acDBObjColl.Cast <Entity>().ToList() where a.GetRXClass().DxfName == RXClass.GetClass(typeof(BlockReference)).DxfName select a; #endregion return(BlockObjs.Any() ? BlockObjs.ToList() : new List <Entity>()); }
/// <summary> /// Разбить кривую на список кривых /// </summary> /// <param name="curve">Кривая</param> /// <param name="reverse">В обратном порядке</param> /// <returns>Список кривых</returns> public static List <Curve> Explode(Curve curve, bool reverse = false) { List <Curve> toolpathCurves; if (curve is Circle) { var circle = curve as Circle; toolpathCurves = new List <Curve> { new Arc(circle.Center, circle.Radius, 0, Math.PI), new Arc(circle.Center, circle.Radius, Math.PI, 0) }; } else { var dbObjects = new DBObjectCollection(); curve.Explode(dbObjects); toolpathCurves = dbObjects.Cast <Curve>().ToList(); } if (reverse) { toolpathCurves.Reverse(); } return(toolpathCurves); }
private static List <Entity> wheleExplode(Entity ent) { List <Entity> res = new List <Entity>(); DBObjectCollection acDBObjColl = new DBObjectCollection(); try { ent.Explode(acDBObjColl); } catch (Autodesk.AutoCAD.Runtime.Exception acadError) { System.Diagnostics.Debug.Write($"\n{acadError}\n{acadError.ErrorStatus}\n{ent.ToString()}", "Explode error"); if (ent.IsNewObject) { res.Add(ent); } return(res); } List <Entity> buffer = new List <Entity>(acDBObjColl.Cast <Entity>()); foreach (Entity item in buffer) { res.AddRange(wheleExplode(item)); } return(res); }
private void CreatePline(ObjectId[] ids) { var curves = App.LockAndExecute(() => ids.QOpenForRead <Curve>()) .SelectMany(p => { if (p is Polyline) { var results = new DBObjectCollection(); p.Explode(results); return(results.Cast <Curve>()); } return(new List <Curve> { p }); }) .ToArray(); var curve = curves[0]; var item = new Item { Point = curve.StartPoint, Vector = curve.GetFirstDerivative(0), ImageId = ObjectId.Null, ClippedImageId = ObjectId.Null }; var point = curve.EndPoint; var points = new List <Point3d>(ids.Length) { item.Point, point }; while (point != item.Point) { curve = curves.FirstOrDefault(p => p != curve && p.HasPoint(point)); if (curve == null) { throw new Exception($"Не найден соседний отрезок в точке {point.X},{point.Y}"); } point = curve.NextPoint(point); points.Add(point); } var pline = NoDraw.Pline(points); pline.Move(Vector3d.XAxis.RotateBy(Graph.ToRad(-45), Vector3d.ZAxis) * 500); App.LockAndExecute(() => { var plineId = pline.AddToCurrentSpace(); plineId.QOpenForWrite <Polyline>(p => p.Modified += Pline_Modified); _items.Add(plineId, item); Interaction.SetPickSet(new[] { plineId }); }); Interaction.SetActiveDocFocus(); Acad.Editor.UpdateScreen(); }
private static Extents2d GetSheetExtents(Transaction tr, BlockReference blkSheet) { List <ObjectId> obj; using (DBObjectCollection dbObjCol = new DBObjectCollection()) { blkSheet.Explode(dbObjCol); IEnumerable <ObjectId> b = dbObjCol.Cast <ObjectId>(); obj = (from obj1 in b where obj1.ObjectClass.DxfName.ToString() == "LWPOLYLINE" select obj1).ToList <ObjectId>(); } return(new Extents2d(new Point2d(0, 0), new Point2d(1, 1))); }
public void GetJingXiang2() { mirrText = Application.GetSystemVariable("MIRRTEXT"); if (mirrText != null && mirrText.ToString() == "1") { Application.SetSystemVariable("MIRRTEXT", 0); } DocumentLock m_DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); //eLockViolation br = GetBlockCondition("请选择要镜像的块") as BlockReference; if (br == null) { return; } AcadApplication app = Application.AcadApplication as AcadApplication; DBObjectCollection coll = new DBObjectCollection(); br.Explode(coll); Circle c = new Circle(br.Position, Vector3d.ZAxis, 0.010324); var listEnt = coll.Cast <Entity>().ToList(); listEnt.Add(c); oIdColl = listEnt.ToSpace(); using (var trans = Db.TransactionManager.StartTransaction()) { var blkRef = trans.GetObject(br.ObjectId, OpenMode.ForWrite) as BlockReference; blkRef.Visible = false; blkRef.DowngradeOpen(); trans.Commit(); } m_DocumentLock.Dispose(); }
/// <summary> /// Explodes an entity. /// </summary> /// <param name="entityId">The entity ID.</param> /// <returns>The object IDs.</returns> public static ObjectId[] Explode(this ObjectId entityId) { // 通过id 获取实体 Entity entity = entityId.QOpenForRead <Entity>(); // 准备接收被炸开的个体 DBObjectCollection results = new DBObjectCollection(); // 炸开实体 到 新建好的集合中 entity.Explode(results); // 删除原来实体 entityId.QOpenForWrite(Constant.actionErase); // 返回已炸开的个体 return(results .Cast <Entity>() .Select(newEntity => newEntity.AddToCurrentSpace()) .ToArray());; }
public static string DimensionText(BlockReference BR) { using (Transaction t = AC.DB.TransactionManager.StartTransaction()) { BR = t.GetObject(BR.Id, OpenMode.ForRead) as BlockReference; var A = new DBObjectCollection(); BR.Explode(A); var B = A.Cast <Entity>().ToList(); if (B.Where(x => x.GetType() == typeof(DBText)).Any()) { var C = B.Where(x => x.GetType() == typeof(DBText)); if (!C.Any()) { return(string.Empty); } var dbtext = C.First() as DBText; return(dbtext.TextString); } else { var C = B.Where(x => x.GetType().BaseType == typeof(Dimension)); if (!C.Any()) { return(string.Empty); } var dim = C.First() as Dimension; var width = dim.Measurement; return(dim.DimensionText.Replace("<>", to.Str(width))); } } }
public void GetJingXiang() { var mirrText = Application.GetSystemVariable("MIRRTEXT"); if (mirrText != null && mirrText.ToString() == "1") { Application.SetSystemVariable("MIRRTEXT", 0); } DocumentLock m_DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); //eLockViolation BlockReference br = GetBlockCondition("请选择要镜像的块") as BlockReference; if (br == null) { return; } AcadApplication app = Application.AcadApplication as AcadApplication; DBObjectCollection coll = new DBObjectCollection(); br.Explode(coll); Circle c = new Circle(br.Position, Vector3d.ZAxis, 0.010324); var listEnt = coll.Cast <Entity>().ToList(); listEnt.Add(c); var oIdColl = listEnt.ToSpace(); using (var trans = Db.TransactionManager.StartTransaction()) { var blkRef = trans.GetObject(br.ObjectId, OpenMode.ForWrite) as BlockReference; blkRef.Visible = false; blkRef.DowngradeOpen(); trans.Commit(); } app.ActiveDocument.SendCommand("mirror "); using (var trans = Db.TransactionManager.StartTransaction()) { var blkRef = trans.GetObject(br.ObjectId, OpenMode.ForWrite) as BlockReference; blkRef.Visible = true; blkRef.DowngradeOpen(); for (int i = 0; oIdColl != null && i < oIdColl.Count; i++) { var ent = trans.GetObject(oIdColl[i], OpenMode.ForWrite) as Entity; if (ent != null) { ent.Erase(true); } } trans.Commit(); } var selRes = Ed.GetSelection(); if (selRes.Status != PromptStatus.OK) { return; } var list = selRes.Value.GetObjectIds()?.ToList(); ObjectId recId = ObjectId.Null; Point3d ptPosC = Point3d.Origin; using (var trans = Db.TransactionManager.StartTransaction()) { var blkTbl = trans.GetObject(Db.BlockTableId, OpenMode.ForWrite) as BlockTable; BlockTableRecord blkRec = new BlockTableRecord(); blkRec.Units = br.BlockUnit; string blkName = br.Name + "_" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); blkRec.Name = blkName; for (int i = 0; list != null && i < list.Count; i++) { var ent = trans.GetObject(list[i], OpenMode.ForWrite); if (ent != null) { bool flag = true; if (ent is Circle) { var cir = ent as Circle; if (cir.Radius == 0.010324) { ptPosC = cir.Center; cir.Erase(true); flag = false; } } if (flag) { Entity entCopy = ent.Clone() as Entity; ent.Erase(true); blkRec.AppendEntity(entCopy); } } } blkRec.Origin = ptPosC; recId = blkTbl.Add(blkRec); trans.AddNewlyCreatedDBObject(blkRec, true); trans.Commit(); } BlockReference brEnt = new BlockReference(ptPosC, recId); // var vec = br.Position - ptPosC; //brEnt.TransformBy(Matrix3d.Displacement(vec * 2.5)); brEnt.ToSpace(); Application.ShowAlertDialog("OK"); Application.SetSystemVariable("MIRRTEXT", mirrText); m_DocumentLock.Dispose(); }
public void GetJingXiangXY() { DocumentLock m_DocumentLock = null; object mirrText = ""; try { m_DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); mirrText = Application.GetSystemVariable("MIRRTEXT"); if (mirrText != null && mirrText.ToString() == "1") { Application.SetSystemVariable("MIRRTEXT", 0); } var br = GetBlockCondition("请选择要镜像的块") as BlockReference; string name = br.Name; if (br == null) { return; } IdMapping idmap = new IdMapping(); string xYJingXiang = ""; PromptKeywordOptions pkOpts = new PromptKeywordOptions("请选择镜像方向[X/Y]", "X Y"); var propRes = Ed.GetKeywords(pkOpts); if (propRes.Status != PromptStatus.OK) { return; } xYJingXiang = propRes.StringResult; DBObjectCollection coll = new DBObjectCollection(); br.Explode(coll); var listEnt = coll.Cast <Entity>().ToList(); Point3d ptPos = br.Position; Point3d ptMax = br.Bounds.Value.MaxPoint; Point3d ptMin = br.Bounds.Value.MinPoint; double maxY = Math.Abs(ptMax.Y - ptMin.Y); double maxX = Math.Abs(ptMax.X - ptMin.X); if (xYJingXiang == "Y") { Point3d ptEnd = ptPos + Vector3d.YAxis * 100; Line lineY = new Line(ptPos, ptEnd); lineY.TransformBy(Matrix3d.Displacement(Vector3d.XAxis * maxX)); MyMirror(listEnt, lineY, "Y"); } else if (xYJingXiang == "X") { Point3d ptEnd = ptPos + Vector3d.XAxis * 100; Line lineX = new Line(ptPos, ptEnd); lineX.TransformBy(Matrix3d.Displacement(Vector3d.YAxis * maxY)); MyMirror(listEnt, lineX, "X"); } var brNew = new BlockReference(br.Position, br.BlockTableRecord); brNew.ToSpace(); Application.ShowAlertDialog("OK"); } catch (System.Exception e) { Ed.WriteMessage(e.ToString()); } finally { Application.SetSystemVariable("MIRRTEXT", mirrText); m_DocumentLock.Dispose(); } }
public void GetLongestSegment() { Editor ed = dwg.Editor; PromptPointResult res = ed.GetPoint("Укажите корневую точку"); if (res.Status!= PromptStatus.OK) { return; } using (Transaction tr = CurrentDatabase.TransactionManager.StartTransaction()) { GroupsInformation groupsEntities = new GroupsInformation(tr, CurrentDatabase); string group = AskForGroup(false, groupsEntities.GroupList); if (group == null) { return; } List<ObjectId> groupLines = groupsEntities.GetObjectsOfGroup(group); var plineSegments = groupLines .Where(n => n.GetObject(OpenMode.ForRead) is Polyline) .SelectMany(n => { DBObjectCollection coll = new DBObjectCollection(); ((Polyline)n.GetObject(OpenMode.ForRead)).Explode(coll); return coll.Cast<DBObject>(); }) .Concat( groupLines .Where(n => n.GetObject(OpenMode.ForRead) is Line) .Select(n => (DBObject)n.GetObject(OpenMode.ForRead))); Line[] lines = (from DBObject l in plineSegments where l is Line select l as Line).ToArray(); DepthFirstSearch.GraphTree tree = new DepthFirstSearch.GraphTree(res.Value, lines); ed.WriteMessage("\nСамый длинный участок - {0}",tree.FarestNode.PathCostFromRoot); } }
public void GetJingXiangXY() { DocumentLock m_DocumentLock = null; blkRef = null; list.Clear(); listOId.Clear(); XY = ""; try { m_DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); var br = GetBlockCondition("请选择要镜像的块") as BlockReference; string name = br.Name; if (br == null) { return; } blkRef = br; Circle circle = new Circle(blkRef.Position, Vector3d.ZAxis, 0.001); listOId.Add(circle.ToSpace()); Circle mirrorCircle = null; string xYJingXiang = ""; PromptKeywordOptions pkOpts = new PromptKeywordOptions("请选择镜像方向[X/Y]", "X Y"); var propRes = Ed.GetKeywords(pkOpts); if (propRes.Status != PromptStatus.OK) { return; } xYJingXiang = propRes.StringResult; DBObjectCollection coll = new DBObjectCollection(); br.Explode(coll); var listEnt = coll.Cast <Entity>().ToList(); Point3d ptPos = br.Position; Point3d ptMax = br.Bounds.Value.MaxPoint; Point3d ptMin = br.Bounds.Value.MinPoint; double maxY = Math.Abs(ptMax.Y - ptMin.Y); double maxX = Math.Abs(ptMax.X - ptMin.X); using (Transaction tr = blkRef.Database.TransactionManager.StartTransaction()) { if (xYJingXiang == "Y") { Point3d ptEnd = ptPos + Vector3d.YAxis * 100; Line lineY = new Line(ptPos, ptEnd); lineY.TransformBy(Matrix3d.Displacement(Vector3d.XAxis * maxX)); XY = "Y"; mirrorCircle = circle.GetTransformedCopy(Matrix3d.Mirroring(new Line3d(lineY.StartPoint, lineY.EndPoint))) as Circle; MyMirror(listEnt, lineY, "Y"); } else if (xYJingXiang == "X") { Point3d ptEnd = ptPos + Vector3d.XAxis * 100; Line lineX = new Line(ptPos, ptEnd); lineX.TransformBy(Matrix3d.Displacement(Vector3d.YAxis * maxY)); XY = "X"; mirrorCircle = circle.GetTransformedCopy(Matrix3d.Mirroring(new Line3d(lineX.StartPoint, lineX.EndPoint))) as Circle; MyMirror(listEnt, lineX, "X"); } tr.Commit(); } ObjectId breNewId = ObjectId.Null; using (var trans = blkRef.Database.TransactionManager.StartTransaction()) { var blkTbl = trans.GetObject(blkRef.Database.BlockTableId, OpenMode.ForWrite) as BlockTable; BlockTableRecord blkRec = new BlockTableRecord(); blkRec.Units = br.BlockUnit; string blkName = br.Name + "_" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); blkRec.Name = blkName; blkRec.Origin = mirrorCircle.Center; for (int i = 0; list != null && i < list.Count; i++) { var ent = list[i]; if (ent != null) { //Entity entCopy = ent.Clone() as Entity; // ent.Erase(true); blkRec.AppendEntity(ent); //ent.ToSpace(); } } breNewId = blkTbl.Add(blkRec); trans.AddNewlyCreatedDBObject(blkRec, true); foreach (var oId in listOId) { var ent = trans.GetObject(oId, OpenMode.ForWrite) as Entity; ent.Erase(true); } listOId.Clear(); trans.Commit(); } list.ForEach(ent => ent.Dispose()); var brOld = new BlockReference(br.Position, br.BlockTableRecord); var brNew = new BlockReference(mirrorCircle.Center, breNewId); brNew.ToSpace(); brOld.ToSpace(); } catch (System.Exception e) { Ed.WriteMessage(e.ToString()); } finally { m_DocumentLock.Dispose(); } }
public void BuildProcessing(CableCommandGenerator generator) { var offsetDistance = TechProcess.ToolThickness / 2 + Delta; var dbObject = AcadObjects.First().ObjectId.QOpenForRead(); if (AcadObjects.Count == 2) { var matrix = Matrix3d.Displacement(Vector3d.ZAxis * offsetDistance); var railCurves = AcadObjects.Select(p => (Curve)p.ObjectId.QOpenForRead <Curve>().GetTransformedCopy(matrix)) .Select(p => new Line(p.StartPoint, p.EndPoint)).ToArray(); if (railCurves[0].StartPoint.GetVectorTo(railCurves[0].EndPoint).GetAngleTo(railCurves[1].StartPoint.GetVectorTo(railCurves[1].EndPoint)) > Math.PI / 2) { railCurves[1].ReverseCurve(); } if (IsRevereseDirection) { railCurves[0].ReverseCurve(); railCurves[1].ReverseCurve(); } var points = new List <Point3d[]>(); if (Approach > 0) { points.Add(railCurves.Select(p => p.StartPoint.GetExtendedPoint(p.EndPoint, Approach)).ToArray()); } //if (Approach < 0) // zStart += Approach; points.Add(railCurves.Select(p => p.StartPoint).ToArray()); points.Add(railCurves.Select(p => Departure >= 0 ? p.EndPoint : p.GetPointAtDist(p.Length + Departure)).ToArray()); if (Departure > 0) { points.Add(railCurves.Select(p => p.EndPoint.GetExtendedPoint(p.StartPoint, Departure)).ToArray()); } generator.GCommand(0, points[0][0], points[0][1], IsRevereseAngle); for (int i = 1; i < points.Count; i++) { generator.GCommand(1, points[i][0], points[i][1]); } return; } if (dbObject is Line rail) { var matrix = Matrix3d.Displacement(Vector3d.ZAxis * offsetDistance); rail = (Line)rail.GetTransformedCopy(matrix); //if (railCurves[0].StartPoint.GetVectorTo(railCurves[0].EndPoint).GetAngleTo(railCurves[1].StartPoint.GetVectorTo(railCurves[1].EndPoint)) > Math.PI / 2) // railCurves[1].ReverseCurve(); var points = new List <Point3d>(); if (Approach > 0) { points.Add(rail.StartPoint.GetExtendedPoint(rail.EndPoint, Approach)); } //if (Approach < 0) // zStart += Approach; points.Add(rail.StartPoint); points.Add(rail.EndPoint); if (Departure > 0) { points.Add(rail.EndPoint.GetExtendedPoint(rail.StartPoint, Departure)); } foreach (var point in points) { var line = new Line3d(point, rail.Delta.GetPerpendicularVector()); if (point == points[0]) { generator.GCommand(0, line); } else { generator.GCommand(1, line); } } return; } var surface = dbObject as DbSurface; if (dbObject is Region region) { var planeSurface = new PlaneSurface(); planeSurface.CreateFromRegion(region); surface = planeSurface; } surface.GeometricExtents.GetCenter(); var basePoint = surface.GeometricExtents.GetCenter(); if (IsRevereseOffset) { offsetDistance *= -1; } var offsetSurface = DbSurface.CreateOffsetSurface(surface, offsetDistance); var basePointOffset = offsetSurface.GeometricExtents.GetCenter(); //if (curves[0] is Region r) //{ // curves.Clear(); // r.Explode(curves); //} //var plane = offsetSurface.GetPlane(); var curves = new DBObjectCollection(); offsetSurface.Explode(curves); var pts = curves.Cast <Curve>().SelectMany(p => p.GetStartEndPoints()).OrderBy(x => x.Z).ToList(); var maxPoint = pts.Last(); var minPoint = pts.First(); if (maxPoint.Z - minPoint.Z < 10) // горизонтальная { var matrix = Matrix3d.Displacement(Vector3d.ZAxis * offsetDistance); var railCurvesAll = curves.Cast <Curve>().ToList(); var railCurves = new Curve[2]; var rc = railCurvesAll.Where(p => p.HasPoint(maxPoint)).OrderBy(p => p.Length()); railCurves[0] = Across ? rc.First() : rc.Last(); railCurves[1] = railCurvesAll.Where(p => !p.HasPoint(railCurves[0].StartPoint) && !p.HasPoint(railCurves[0].EndPoint)).First(); if (railCurves[0].StartPoint.GetVectorTo(railCurves[0].EndPoint).GetAngleTo(railCurves[1].StartPoint.GetVectorTo(railCurves[1].EndPoint)) > Math.PI / 2) { railCurves[1].ReverseCurve(); } if (IsRevereseDirection) { railCurves[0].ReverseCurve(); railCurves[1].ReverseCurve(); } var points = new List <Point3d[]>(); if (Approach > 0) { points.Add(railCurves.Select(p => p.StartPoint.GetExtendedPoint(p.EndPoint, Approach)).ToArray()); } points.Add(railCurves.Select(p => Approach >= 0 ? p.StartPoint : p.GetPointAtDist(-Approach)).ToArray()); points.Add(railCurves.Select(p => p.EndPoint).ToArray()); if (Departure > 0) { points.Add(railCurves.Select(p => p.EndPoint.GetExtendedPoint(p.StartPoint, Departure)).ToArray()); } generator.GCommand(0, points[0][0], points[0][1], IsRevereseAngle); for (int i = 1; i < points.Count; i++) { generator.GCommand(1, points[i][0], points[i][1]); } return; } var baseCurves = curves.Cast <Curve>().Where(p => p.HasPoint(maxPoint)).ToArray(); var plane = new Plane(maxPoint, baseCurves[0].EndPoint - baseCurves[0].StartPoint, baseCurves[1].EndPoint - baseCurves[1].StartPoint); var zStart = pts.Last().Z; var zEnd = pts.First().Z; var zPos = new List <double>(); if (Approach > 0) { zPos.Add(zStart + Approach); } if (Approach < 0) { zStart += Approach; } zPos.Add(zStart); if (Departure < 0) { zEnd -= Departure; } zPos.Add(zEnd); if (Departure > 0) { zPos.Add(zEnd - Departure); } foreach (var z in zPos) { var line = plane.IntersectWith(new Plane(new Point3d(0, 0, z), Vector3d.ZAxis)); var u = line.GetDistanceTo(new Point3d(TechProcess.OriginX, TechProcess.OriginY, z)); if (z == zPos[0]) { //var angle = line.Direction.ToVector2d().MinusPiToPiAngleTo(Vector2d.YAxis); //generator.GCommandAngle(line.Direction.ToVector2d(), S); //generator.GCommand(0, u); //generator.GCommand(0, u, z); generator.GCommand(0, line, IsRevereseAngle); } else { generator.GCommand(1, line); //generator.GCommand(1, u, z, CuttingFeed); } } }
public void BuildProcessing(CableCommandGenerator generator) { //var dbObject = ProcessingArea.ObjectId.QOpenForRead(); var surface = AcadObjects.First().ObjectId.QOpenForRead <DbSurface>(); var offsetDistance = TechProcess.ToolThickness / 2 + Delta; if (IsRevereseOffset) { offsetDistance *= -1; } //var offsetSurface = DbSurface.CreateOffsetSurface(surface, offsetDistance); var collection = new DBObjectCollection(); surface.Explode(collection); var curves = collection.Cast <Curve>().ToList(); var vertex = curves.SelectMany(p => p.GetStartEndPoints()).OrderBy(p => p.Z).ToList(); var maxPoint = vertex.Last(); var minPoint = vertex.First(); var maxCurves = curves.FindAll(p => p.HasPoint(maxPoint)); var minCurves = curves.FindAll(p => p.HasPoint(minPoint)); //var rail1s = new List<Curve> //{ // maxCurves[0], // minCurves.Single(p => p.HasPoint(maxCurves[0].StartPoint) || p.HasPoint(maxCurves[0].EndPoint)) //}; //var rail2s = new List<Curve> //{ // maxCurves[1], // minCurves.Single(p => p != rail1s[1]) //}; //var rail1 = ((Spline)maxCurves[0]).ToPolyline(); // GetRail(maxPoint, maxCurves[0], minCurves.Single(p => p.HasPoint(maxCurves[0].StartPoint) || p.HasPoint(maxCurves[0].EndPoint))); //var rail2 = ((Spline)maxCurves[1]).ToPolyline(); // GetRail(maxPoint, maxCurves[1], minCurves.Single(p => p.HasPoint(maxCurves[1].StartPoint) || p.HasPoint(maxCurves[1].EndPoint))); var rail1 = new Rail(maxPoint, maxCurves[0], curves); var rail2 = new Rail(maxPoint, maxCurves[1], curves); //var length1 = rail1.GetDistanceAtParameter(rail1.EndParam); //var length2 = rail2.GetDistanceAtParameter(rail2.EndParam); //double dist1 = 0; //double dist2 = 0; double step = 2; generator.Feed = CuttingFeed; generator.S = S; generator.Center = new Point2d(TechProcess.OriginX, TechProcess.OriginY); while (!rail1.IsEnd && !rail2.IsEnd) { var pt1 = rail1.Step(step); var pt2 = rail2.Step(step); if (pt2.Z - pt1.Z > 2) { rail2.StepToZ(pt1.Z, 0.1); } else if (pt1.Z - pt2.Z > 2) { rail1.StepToZ(pt2.Z, 0.1); } //dist1 += step; //if (dist1 >= length1) // break; //var pt1 = rail1.GetPointAtDist(dist1); //dist2 += step; //if (dist2 >= length2) // break; //var pt2 = rail2.GetPointAtDist(dist2); //if (pt1.Z < pt2.Z) //{ // var dist = dist2; // var pt = pt2; // while(dist < length2 && pt.Z > pt1.Z) // { // dist2 = dist; // pt2 = pt; // dist += step; // pt = rail2.GetPointAtDist(dist); // } // if (dist < length2 && pt1.Z - pt.Z < pt2.Z - pt1.Z) // { // dist2 = dist; // pt2 = pt; // } //} //else //{ // var dist = dist1; // var pt = pt1; // while (dist < length1 && pt.Z > pt2.Z) // { // dist1 = dist; // pt1 = pt; // dist += step; // pt = rail1.GetPointAtDist(dist); // } // if (dist < length1 && pt2.Z - pt.Z < pt1.Z - pt2.Z) // { // dist1 = dist; // pt1 = pt; // } //} generator.GCommand(1, rail1.Point, rail2.Point); } }