예제 #1
0
        public static List <DBText> Command(string Text, double Size, TextPosition Position)
        {
            var Return = new List <DBText>();

            using (DocumentLock DL = AC.Doc.LockDocument())
            {
                var acSSet  = Utils.Select.MultiObjs();
                var acPolys = Utils.Get.GetEntity <Polyline>(acSSet);

                acPolys.ForEach(acPoly =>
                {
                    var CP = Utils.PointUtil.GetCenterP(acPoly);

                    var Vec = Utils.Vector.GetByLong(acPoly);

                    var Ang = Utils.Vector.To2D(Vec).Angle;

                    if (Ang > Math.PI / 2 && Ang <= Math.PI / 2 * 3)
                    {
                        Ang += Math.PI;
                    }

                    Return.Add(CADUtil.CreateText(CP, Size, Ang, Position, Text));
                });

                AC.Editor.PostCommandPrompt();
            }

            return(Return);
        }
예제 #2
0
        /// <summary>
        /// 폴리라인 중심에 면적 입력하기(복수 선택)
        /// </summary>
        /// <param name="TextSize">문자 크기</param>
        /// <param name="n">반올림 자리수</param>
        public void CreateMultiObj(double TextSize = 100, int n = 2)
        {
            #region 복수 객체 선택
            var acSSet = Utils.Select.MultiObjs();

            if (acSSet == null)
            {
                return;
            }

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

            #region 면적 입력
            acEnts.ForEach(acEnt =>
            {
                var acPolyline = acEnt as Polyline;

                var p = Utils.PointUtil.GetCenterP(acPolyline);

                var PL_Area = acPolyline.Area;              // mm²

                var Area = Math.Round(PL_Area / 100000, n); // m²

                var acText = CADUtil.CreateText(p, TextSize, Area.ToString() + "m²", ColorIndex.Green);

                acDocEd.WriteMessage(" 폴리라인에 면적 [" + acText.TextString + "]이 입력되었습니다. \n");
            });
            #endregion

            acDocEd.PostCommandPrompt();
        }
예제 #3
0
        private void Sb_Refresh_Click(object sender, EventArgs e)
        {
            var R = GC.DataSource as List <Room>;

            R.ForEach(r =>
            {
                if (r.Handle == new Handle())
                {
                    return;
                }

                var handle = r.Handle;

                // Children 제거
                Utils.Get.ObjectIDs(r.ChildrenH).Where(id => !id.IsErased).ToList().ForEach(id => CADUtil.Erase(id));

                r.Children.Clear();
                r.ChildrenH.Clear();

                var ObjId = new ObjectId();
                AC.DB.TryGetObjectId(handle, out ObjId);
                if (ObjId.IsErased)
                {
                    r.IsLink = false;
                    r.Area   = 0;
                    return;
                }

                var acPoly = Utils.Get.GetObject <Polyline>(ObjId);
                if (acPoly == null)
                {
                    return;
                }

                r.Area = Math.Round(acPoly.Area / 1000000, 4);

                var cen  = Utils.PointUtil.GetCenterP(acPoly);
                var pos1 = new Point3d(cen.X, cen.Y + 150, cen.Z);
                var pos2 = new Point3d(cen.X, cen.Y - 150, cen.Z);

                // 이름 적기
                r.ChildrenH.Add(CADUtil.CreateText(pos1, 200, r.Name, ColorIndex.Red).Handle);

                // 길이 적기
                var objIds = Utils.DIMUtil.ReCreate(acPoly, DB.DimLayerId, DB.DimStyleId);
                r.ChildrenH.AddRange(Utils.Get.ObjHandles(objIds));

                // 면적 적기
                r.ChildrenH.Add(CADUtil.CreateText(pos2, 200, Math.Round(r.Area, 4).ToString(), ColorIndex.Red).Handle);
            });

            GV.RefreshData();

            DB.ROOM = GC.DataSource as List <Room>;
        }
예제 #4
0
        /// <summary>
        /// 폴리라인 중심에 면적 입력하기(단일 선택)
        /// </summary>
        public void Create_PolylineAreaText()
        {
            bool B = true;

            while (B)
            {
                var acSSet = SelectAPolyline();

                if (acSSet == null)
                {
                    B = false;

                    return;
                }

                using (Transaction T = AC.DB.TransactionManager.StartTransaction())
                {
                    #region 폴리라인 선택
                    var Lines = from id in acSSet.GetObjectIds()
                                let acEnt = T.GetObject(id, OpenMode.ForWrite) as Entity
                                            where acEnt is Polyline
                                            let acLine = acEnt as Polyline
                                                         select acLine;

                    if (!Lines.Any())
                    {
                        return;
                    }

                    var acPolyline = Lines.ToList().First();
                    #endregion

                    #region 면적 입력
                    var p = acPolyline.NumberOfVertices == 4 ? GetCenterPoint(acPolyline) : GetVisualCenterPoint(acPolyline);

                    var PL_Area = acPolyline.Area;

                    var Area = Math.Round(PL_Area / 100000, 2);

                    var acText = CADUtil.CreateText(p, 100, Area.ToString() + "m²");

                    acText.Color = ColorIndex.Green;

                    AC.Editor.WriteMessage(" 폴리라인에 면적 [" + acText.TextString + "]이 입력되었습니다. \n");
                    #endregion

                    T.Commit();
                }
            }

            AC.Editor.PostCommandPrompt();
        }
예제 #5
0
        void RefreshRoom(Handle handle)
        {
            var R = GC.DataSource as List <Room>;

            var A = R.Where(a => a.Handle.Equals(handle));

            if (!A.Any())
            {
                return;
            }

            var r = A.First();

            // Children 제거
            CADUtil.Erases(Utils.Get.ObjectIDs(r.ChildrenH));

            r.Children.Clear();
            r.ChildrenH.Clear();

            var ObjId = new ObjectId();

            AC.DB.TryGetObjectId(handle, out ObjId);

            var acPoly = Utils.Get.GetObject <Polyline>(ObjId);

            if (acPoly == null)
            {
                return;
            }

            r.Area = Math.Round(acPoly.Area / 1000000, 4);

            var cen  = Utils.PointUtil.GetCenterP(acPoly);
            var pos1 = new Point3d(cen.X, cen.Y + 150, cen.Z);
            var pos2 = new Point3d(cen.X, cen.Y - 150, cen.Z);

            // 이름 적기
            r.ChildrenH.Add(CADUtil.CreateText(pos1, 200, r.Name, ColorIndex.Red).Handle);

            // 길이 적기
            var objIds = Utils.DIMUtil.ReCreate(acPoly, DB.DimLayerId, DB.DimStyleId);

            r.ChildrenH.AddRange(Utils.Get.ObjHandles(objIds));

            // 면적 적기
            r.ChildrenH.Add(CADUtil.CreateText(pos2, 200, Math.Round(r.Area, 4).ToString(), ColorIndex.Red).Handle);

            GV.RefreshData();

            DB.ROOM = GC.DataSource as List <Room>;
        }
예제 #6
0
        /// <summary>
        /// 폴리라인 중심에 면적 입력하기(복수 선택)
        /// </summary>
        public void Create_PolylineAreaTexts()
        {
            var acSSet = SelectPolylines();

            if (acSSet == null)
            {
                return;
            }

            using (Transaction T = AC.DB.TransactionManager.StartTransaction())
            {
                #region 폴리라인 선택
                var Lines = from id in acSSet.GetObjectIds()
                            let acEnt = T.GetObject(id, OpenMode.ForWrite) as Entity
                                        where acEnt is Polyline
                                        let acLine = acEnt as Polyline
                                                     where acLine.Closed
                                                     select acLine;

                if (!Lines.Any())
                {
                    return;
                }
                #endregion

                int n = 0;

                Lines.ToList().ForEach(acPolyline =>
                {
                    #region 면적 입력
                    var p = acPolyline.NumberOfVertices == 4 ? GetCenterPoint(acPolyline) : GetVisualCenterPoint(acPolyline);

                    var PL_Area = acPolyline.Area;

                    var Area = Math.Round(PL_Area / 100000, 2);

                    var acText = CADUtil.CreateText(p, 100, Area.ToString() + "m²");

                    acText.Color = ColorIndex.Green;

                    n++;
                    #endregion
                });

                T.Commit();

                AC.Editor.WriteMessage("\n" + n.ToString() + "개의 폴리라인에 면적이 입력되었습니다.");
                AC.Editor.PostCommandPrompt();
            }
        }
예제 #7
0
        void RefreshRoom(ObjectId id)
        {
            var R = GC.DataSource as List <Room>;

            var A = R.Where(x => x.Id.Equals(id));

            if (!A.Any())
            {
                return;
            }

            var r = A.First();

            //MessageBox.Show("테스트1");
            r.Children.ForEach(cid => CADUtil.Erase(cid));

            //MessageBox.Show("테스트2");
            r.Children.Clear();

            var acPoly = Utils.Get.GetObject <Polyline>(id);

            if (acPoly == null)
            {
                return;
            }

            r.Area = Math.Round(acPoly.Area / 1000000, 4);

            var cen  = Utils.PointUtil.GetCenterP(acPoly);
            var pos1 = new Point3d(cen.X, cen.Y + 150, cen.Z);
            var pos2 = new Point3d(cen.X, cen.Y - 150, cen.Z);

            //var acDimLayerId = Utils.Layer.Create("HDC_Dimension", ColorIndex.Green);    // 레이어 생성
            //var acDimStyleId = Utils.DIMUtil.Create_HDC_DimensionStyle("HDC_Dim_Style");             // 치수 스타일 생성

            // 이름 적기
            r.Children.Add(CADUtil.CreateText(pos1, 200, r.Name).Id);

            // 길이 적기
            r.Children.AddRange(Utils.DIMUtil.ReCreate(acPoly, DB.DimLayerId, DB.DimStyleId));

            // 면적 적기
            //r.Children.Add(AC.Drawing.CreateText(pos2, Math.Round(r.Area, 4).ToString()));

            GV.RefreshData();

            DB.ROOM = GC.DataSource as List <Room>;
        }
예제 #8
0
        void LinkRoom()
        {
            // F = GC.SelectedRows
            // f = GC.GetFocusedRow();

            #region  택
            var F = Utils.GC.GetSelectedRows <Room>(GV);
            if (F.Count == 0)
            {
                return;
            }
            #endregion

            #region 치수
            foreach (Room f in F)
            {
                var msg = string.Format("실 {0} 을/를 선택하세요", f.Name);

                if (new U_Msgbox("실(공간) 선택", msg).ShowDialog() != DialogResult.OK)
                {
                    break;
                }

                var acSSet = Utils.Select.SingleObj(string.Format("실 {0} 를 선택하세요", f.Name));
                if (acSSet == null)
                {
                    continue;
                }

                var acPolys = Utils.Get.GetEntity <Polyline>(acSSet);
                if (acPolys.Count == 0)
                {
                    continue;
                }

                var acPoly = acPolys.First();
                if (acPoly.Id == ObjectId.Null)
                {
                    continue;
                }

                f.Id     = acPoly.Id;
                f.Handle = acPoly.Handle;
                f.IsLink = true;
                f.Area   = Math.Round(acPoly.Area / 1000000, 4);

                var A = F.Where(a => a.Handle.Equals(f.Handle));

                if (A.Any())
                {
                    RefreshRoom(f.Handle);
                }
                else
                {
                    var cen  = Utils.PointUtil.GetCenterP(acPoly);
                    var pos1 = new Point3d(cen.X, cen.Y + 150, cen.Z);
                    var pos2 = new Point3d(cen.X, cen.Y - 150, cen.Z);

                    // 이름 적기
                    f.ChildrenH.Add(CADUtil.CreateText(pos1, 200, f.Name, ColorIndex.Red).Handle);

                    // 길이 적기
                    var objIds = Utils.DIMUtil.ReCreate(acPoly, DB.DimLayerId, DB.DimStyleId);
                    f.ChildrenH.AddRange(Utils.Get.ObjHandles(objIds));

                    // 면적 적기
                    f.ChildrenH.Add(CADUtil.CreateText(pos2, 200, Math.Round(f.Area, 4).ToString(), ColorIndex.Red).Handle);
                }
            }
            #endregion

            GV.RefreshData();

            DB.ROOM = GC.DataSource as List <Room>;
        }
예제 #9
0
        public void CreateText_Polyline_Center()
        {
            var acPolyLines = new List <Polyline>();

            using (Transaction T = AC.DB.TransactionManager.StartTransaction())
            {
                try
                {
                    #region 폴리라인 선택
                    SelectionSet acSSet = SelectLines();

                    var Lines = from id in acSSet.GetObjectIds()
                                let acEnt = T.GetObject(id, OpenMode.ForWrite) as Entity
                                            where acEnt is Polyline
                                            let acLine = acEnt as Polyline
                                                         select acLine;

                    if (!Lines.Any())
                    {
                        return;
                    }

                    acPolyLines.AddRange(Lines.ToArray());
                    #endregion
                }
                catch (System.Exception ex)
                {
                    AC.Editor.WriteMessage(Convert.ToString(ex));
                }
            }

            #region 실행
            acPolyLines.ForEach(acPolyline =>
            {
                double X      = 0;
                double Y      = 0;
                int N         = acPolyline.NumberOfVertices;
                double length = 0;
                double ang    = 0;

                if (U002.Instance.rotate)
                {
                    for (int i = 0; i < N; i++)
                    {
                        try
                        {
                            var L  = acPolyline.GetLineSegment2dAt(i);
                            var CP = CADUtil.GetCenterPoint2d(L);

                            X += CP.X;
                            Y += CP.Y;

                            if (length < L.Length)
                            {
                                length = L.Length;
                                ang    = CADUtil.GetVector(L).Angle;
                            }
                        }
                        catch
                        {
                            N = N - 1;
                        }
                    }

                    if (ang > Math.PI / 2 && ang <= Math.PI / 2 * 3)
                    {
                        ang += Math.PI;
                    }
                }

                var P = acPolyline.NumberOfVertices == 4 ? GetCenterPoint(acPolyline) : GetVisualCenterPoint(acPolyline);

                var acText = CADUtil.CreateText(P, T_Size, ang, T_Position, Txt);
            });
            #endregion

            AC.Editor.WriteMessage("\nPolyline 내부에 Text생성이 완료되었습니다.");
            AC.Editor.PostCommandPrompt();
        }
예제 #10
0
        public static List <ObjectId> Create2(Polyline acPoly, ObjectId LayerID, ObjectId StyleID)
        {
            List <ObjectId> Return = new List <ObjectId>();

            #region 객체 받기
            var A = Utils.Get.PointCollection(acPoly);

            var acCPSSet = AC.Editor.SelectCrossingPolygon(A).Value;
            if (acCPSSet.Count == 0)
            {
                return(new List <ObjectId>());
            }

            var Texts = Utils.Get.GetEntity <DBText>(acCPSSet);
            var Dims  = Utils.Get.GetEntity <AlignedDimension>(acCPSSet);
            #endregion

            #region 면적 지우기
            if (Texts.Any())
            {
                var acTexts = Texts.Where(x => Utils.Get.IsDouble(x.TextString)).ToList();

                if (acTexts.Count == 1)
                {
                    using (Transaction t = AC.DB.TransactionManager.StartTransaction())
                    {
                        acTexts.ForEach(text =>
                        {
                            var B = t.GetObject(text.Id, OpenMode.ForWrite) as DBText;

                            B.Erase(true);

                            t.Commit();
                        });
                    }
                }
            }
            #endregion

            #region 치수선 지우기 & 치수선 생성
            if (Dims.Any())
            {
                using (Transaction t = AC.DB.TransactionManager.StartTransaction())
                {
                    Dims.ToList().ForEach(Dim =>
                    {
                        var acDim = t.GetObject(Dim.Id, OpenMode.ForWrite) as AlignedDimension;

                        if (Utils.PointUtil.IsInsidePolyline(acPoly, acDim.TextPosition, true))
                        {
                            acDim.Erase(true);
                        }
                    });

                    t.Commit();
                }
            }

            Return.AddRange(Utils.DIMUtil.Create(A.Cast <Point3d>().ToList(), 100, false, StyleID, LayerID));
            #endregion

            #region 새로 면적 입력
            var p = Utils.PointUtil.Move(Utils.PointUtil.GetCenterP(acPoly), 0, -100);

            var PL_Area = acPoly.Area;                   // mm²

            var Area = Math.Round(PL_Area / 1000000, 3); // m²

            var acText = CADUtil.CreateText(p, 200, Area.ToString(), ColorIndex.Red);
            //var acText = CAD.CreateText(p, 100, Area.ToString() + "m²", TxtStyleId, ColorIndex.Green);

            Return.Add(acText.Id);
            #endregion

            return(Return);
        }