Example #1
0
        public List <Polyline> Create_Boundaries_Util(double Dis = 100)
        {
            var Return = new List <Polyline>();

            using (DocumentLock DL = AC.Doc.LockDocument())
            {
                #region  택
                var acSSet = Utils.Select.MultiObjs();

                var acEnts = Utils.Get.Entity(acSSet, typeof(Polyline));
                #endregion

                #region 폴리라인 연장시켜 폴리라인 생성
                acEnts.Where(x => x is Polyline).ToList().ForEach(acEnt =>
                {
                    var acPoly      = acEnt as Polyline;
                    var acTempLines = new List <Line>();         // 작업 완료 후 지울 보조선

                    #region 폴리라인 선분 연장선 생성
                    for (int i = 0; i < acPoly.NumberOfVertices; i++)
                    {
                        try
                        {
                            var acLine    = acPoly.GetLineSegmentAt(i);
                            var sp        = acLine.StartPoint;
                            var ep        = acLine.EndPoint;
                            var Direction = acLine.Direction;

                            var SP = sp - Direction * Dis;
                            var EP = ep + Direction * Dis;

                            var L = CADUtil.CreateLine(SP, EP);

                            acTempLines.Add(L);
                        }
                        catch { }
                    }
                    #endregion

                    #region  택된 폴리라인의 중앙점
                    var CP = Utils.PointUtil.GetCenterP(acPoly);
                    #endregion

                    #region 밀폐된 공간에서 Boundary 생성
                    // 선택된 객체 말고 모두 숨긴뒤에 실행해야 오류가 줄어듬


                    var objColl = AC.Editor.TraceBoundary(CP, true);

                    var acObjs = from a in objColl.Cast <Entity>().ToList() select a;

                    if (acObjs.Any())
                    {
                        using (Transaction T = AC.DB.TransactionManager.StartTransaction())
                        {
                            var BT  = T.GetObject(AC.DB.BlockTableId, OpenMode.ForRead) as BlockTable;
                            var BTR = T.GetObject(BT[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                            acObjs.ToList().ForEach(a =>
                            {
                                var Poly = a as Polyline;

                                BTR.AppendEntity(Poly);
                                T.AddNewlyCreatedDBObject(Poly, true);

                                Return.Add(Poly);
                            });

                            T.Commit();
                        }
                    }
                    #endregion

                    #region 연장선 제거
                    acTempLines.ForEach(a => CADUtil.Erase(a.Id));
                    #endregion
                });
                #endregion
            }

            return(Return);
        }