Exemplo n.º 1
0
        /// <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>());
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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();
        }
Exemplo n.º 5
0
        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)));
        }
Exemplo n.º 6
0
        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();
        }
Exemplo n.º 7
0
        /// <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());;
        }
Exemplo n.º 8
0
        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)));
                }
            }
        }
Exemplo n.º 9
0
        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();
        }
Exemplo n.º 10
0
        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();
            }
        }
Exemplo n.º 11
0
        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);
            }
        }
Exemplo n.º 12
0
        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();
            }
        }
Exemplo n.º 13
0
        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);
                }
            }
        }
Exemplo n.º 14
0
        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);
            }
        }