Esempio n. 1
0
        private static void AddText(Gem.Point2d pnt, string layer, string str)
        {
            App.Document acDoc   = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database  acCurDb = acDoc.Database;

            // старт транзакции
            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                // Открытие таблицы Блоков для чтения
                Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;

                // Открытие записи таблицы Блоков пространства Модели для записи
                Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
                                                                    Db.OpenMode.ForWrite) as Db.BlockTableRecord;

                Db.MText acMText = new Db.MText();
                acMText.SetDatabaseDefaults();
                acMText.Location = new Gem.Point3d(pnt.X, pnt.Y, 0);
                acMText.Contents = str;
                acMText.Height   = SettingsParser.getInstance()._Scale.Coord;
                acMText.Color    = Autodesk.AutoCAD.Colors.
                                   Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByLayer, 256);
                acMText.Layer = layer;
                acMText.SetDatabaseDefaults();
                // Добавление нового объекта в запись таблицы блоков и в транзакцию
                acBlkTblRec.AppendEntity(acMText);
                acTrans.AddNewlyCreatedDBObject(acMText, true);
                // Сохранение нового объекта в базе данных
                acTrans.Commit();
            }
        }
Esempio n. 2
0
        public static void TextToDwg(Curve curve)
        {
            SettingsParser settings = SettingsParser.getInstance();

            //AddText(curve.textPoint(), layerText, $":ЗУ{ curve.Number }\nS={curve.Area} кв.м");
            AddMLeader(curve.textPoint(),
                       settings.MarkerTransform,
                       settings._Scale.Marker,
                       settings.layerText,
                       settings.mleaderMarkerStyle,
                       settings.markerText.Replace("|n|", curve.Number.ToString()).Replace("|s|", curve.Area.ToString()));



            foreach (Point p in curve.Vertixs)
            {
                //AddText(new Gem.Point2d(p.X, p.Y), layerPointNumber, p.Number.ToString());
                if (!p.isPrinted)
                {
                    AddMLeader(new Gem.Point2d(p.X, p.Y),
                               (p.vNormalise * settings.CoordTransform),
                               settings._Scale.Coord,
                               settings.layerPointNumber,
                               settings.mleaderCoordStyle,
                               p.Number.ToString());

                    AddCircle(new Gem.Point2d(p.X, p.Y), settings.layerPoint);
                    p.isPrinted = true; //Вот так, легко и непринужденно MVC пошел по бороде с этим костыликом.
                }

                ////Времменная
                //Gem.Point3d pnt1 = new Gem.Point3d(p.X, p.Y, 0) + (p.vNormalise * -5);
                //AddCircle(new Gem.Point2d(pnt1.X, pnt1.Y), "0");
            }
        }
Esempio n. 3
0
        private static void AddCircle(Gem.Point2d pnt, string layer)
        {
            App.Document acDoc   = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database  acCurDb = acDoc.Database;

            // старт транзакции
            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                // Открытие таблицы Блоков для чтения
                Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                                           Db.OpenMode.ForRead) as Db.BlockTable;

                // Открытие записи таблицы Блоков пространства Модели для записи
                Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
                                                                    Db.OpenMode.ForWrite) as Db.BlockTableRecord;

                Db.Circle acCircle = new Db.Circle();
                acCircle.SetDatabaseDefaults();
                acCircle.Center = new Gem.Point3d(pnt.X, pnt.Y, 0);
                acCircle.Radius = SettingsParser.getInstance()._Scale.Circle;
                acCircle.Layer  = layer;
                // Добавление нового объекта в запись таблицы блоков и в транзакцию
                acBlkTblRec.AppendEntity(acCircle);
                acTrans.AddNewlyCreatedDBObject(acCircle, true);
                // Сохранение нового объекта в базе данных
                acTrans.Commit();
            }
        }
Esempio n. 4
0
        static public void mainTheodoliteStrokeParser()
        {
            // Получение текущего документа и базы данных
            App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
            if (acDoc == null)
            {
                return;
            }

            SettingsParser settings = SettingsParser.getInstance();

            if (settings.Update())
            {
                return;
            }


            Ed.Editor acEd = acDoc.Editor;

            //тут запросить масштаб
            //Предполагается всего 4 вида стандартных масштабов - 1:500, 1:1000, 1:2000, 1:5000.
            Ed.PromptKeywordOptions pKeyOpts = new Ed.PromptKeywordOptions("");
            pKeyOpts.Message = "\nEnter an option: 1/";

            foreach (Scale i in settings.ScaleList)
            {
                pKeyOpts.Keywords.Add(i.Number.ToString());
            }

            pKeyOpts.AllowNone = false;
            pKeyOpts.AppendKeywordsToMessage = true;

            Ed.PromptResult pKeyRes = acDoc.Editor.GetKeywords(pKeyOpts);
            if (pKeyRes.Status != Ed.PromptStatus.OK)
            {
                return;
            }

            settings._Scale = settings.ScaleList.FirstOrDefault(s => s.Number == int.Parse(pKeyRes.StringResult));
            Model.Init();

            bool goOn = true; //Продолжать ли выбор

            do
            {
                Ed.PromptEntityOptions opt = new Ed.PromptEntityOptions("\n Select polyline: ");
                opt.AllowNone = false;
                opt.AllowObjectOnLockedLayer = false;
                opt.SetRejectMessage("\nNot a pline try again: ");
                opt.AddAllowedClass(typeof(Db.Polyline), true);

                Ed.PromptEntityResult res = acEd.GetEntity(opt);

                goOn = (res.Status == Ed.PromptStatus.OK) ? Model.GetData(res.ObjectId) : false;
            } while (goOn);

            Model.OutPutData();
        }
Esempio n. 5
0
        } = 1.1;                                                         //V_MTextMaskKoefficient



        public static SettingsParser getInstance()
        {
            if (instance == null)
            {
                instance = new SettingsParser();
            }

            return(instance);
        }
Esempio n. 6
0
        private static void outToCSV(string contents, string path)
        {
            SettingsParser settings = SettingsParser.getInstance();

            System.IO.File.WriteAllText(path, contents, Encoding.GetEncoding(1251));
            if (settings.startExcel)
            {
                System.Diagnostics.Process.Start(path);
            }
        }
Esempio n. 7
0
        public static void TextToConsole(List <Curve> curveDict)
        {
            SettingsParser settings = SettingsParser.getInstance();

            Ed.Editor acEd = App.Application.DocumentManager.MdiActiveDocument.Editor;
            foreach (Curve i in curveDict)
            {
                acEd.WriteMessage($"\n №{ i.Number } Area: {i.Area}");
                foreach (Point p in i.Vertixs)
                {
                    acEd.WriteMessage($"\n -  { p.Number } {p.X.ToString(settings.coordinatFormat) } {p.Y.ToString(settings.coordinatFormat)}");
                }
                acEd.WriteMessage($"\n -  { i.Vertixs.First().Number } {i.Vertixs.First().X.ToString(settings.coordinatFormat) } {i.Vertixs.First().Y.ToString(settings.coordinatFormat)}");
            }
        }
Esempio n. 8
0
        private static void AddMLeader(Gem.Point2d pnt, Gem.Vector3d otstup,
                                       double scale, string layer,
                                       string mleaderStyleName, string str)
        {
            SettingsParser settings = SettingsParser.getInstance();

            App.Document acDoc   = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database  acCurDb = acDoc.Database;
            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                                           Db.OpenMode.ForRead) as Db.BlockTable;
                Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
                                                                    Db.OpenMode.ForWrite) as Db.BlockTableRecord;
                Db.MLeader acML = new Db.MLeader();
                acML.SetDatabaseDefaults();
                acML.Layer        = layer;
                acML.MLeaderStyle = CheckLocalRepository.GetIDbyName <Db.MLeaderStyle>(acCurDb, mleaderStyleName);
                acML.ContentType  = Db.ContentType.MTextContent;
                Db.MText mText = new Db.MText();
                mText.SetDatabaseDefaults();
                mText.Contents           = str;
                mText.TextHeight         = scale;
                mText.BackgroundFill     = settings.MTextMask;
                mText.UseBackgroundColor = settings.MTextMask;


                if (settings.MTextMask)
                {
                    mText.BackgroundScaleFactor = settings.MTextMaskKoefficient;
                }

                mText.Location = (new Gem.Point3d(pnt.X, pnt.Y, 0) + otstup);
                acML.MText     = mText;
                int idx = acML.AddLeaderLine(new Gem.Point3d(pnt.X, pnt.Y, 0));

                acML.Scale = 1;


                acBlkTblRec.AppendEntity(acML);
                acTrans.AddNewlyCreatedDBObject(acML, true);
                acTrans.Commit();
            }
        }
Esempio n. 9
0
        public static void TextToCSV(List <Curve> curveDict)
        {
            SettingsParser settings = SettingsParser.getInstance();

            //более правильный и дорогой вариант см. тут:
            //http://adn-cis.org/forum/index.php?topic=448.0

            App.Document  acDoc = App.Application.DocumentManager.MdiActiveDocument;
            StringBuilder sb    = new StringBuilder();

            string separateLine = ";;;;;;;;;;;;;";    // разделительная строка

            // заголовок
            sb.AppendLine($"{separateLine}\n;;;;;Х;У;;;;;;;\n;;;1;2;3;4;5;;;;;;\n{separateLine}");

            //Основной цикл вывода списка линий
            foreach (Curve сurve in curveDict)
            {
                bool isFirstLine = true;
                //Цикл вывода вершин линий
                foreach (Point point in сurve.Vertixs)
                {
                    if (isFirstLine)
                    {
                        isFirstLine = false;
                        //Вывожу номер кривой вместе с координатами первой вершины
                        sb.AppendLine($";;;участок № { сurve.Number };{ point.Number };{point.Y.ToString(settings.coordinatFormat) };{point.X.ToString(settings.coordinatFormat)};;;;;;;");
                    }
                    else
                    {
                        //Вывожу все остальные вершины
                        sb.AppendLine($";;;;{ point.Number };{point.Y.ToString(settings.coordinatFormat) };{point.X.ToString(settings.coordinatFormat)};;;;;;;");
                    }
                }

                //Вывожу координаты первой точки кривой, а так же ее площадь
                sb.AppendLine($";;;;{ сurve.Vertixs.First().Number };{сurve.Vertixs.First().Y.ToString(settings.coordinatFormat) };{сurve.Vertixs.First().X.ToString(settings.coordinatFormat)};S={сurve.AreaOutput} га;;;;;;");
                sb.AppendLine(separateLine);
            }
            sb.AppendLine($";;;;;;Общая площадь:;{Model.allArea} га;;;;;;");



            //Должен быть выбор пользователя, при этом по умолчанию предложить каталог, в котором находится файл чертежа.
            Win.SaveFileDialog sFile = new Win.SaveFileDialog("Каталог координат земельных участков",
                                                              acDoc.Database.Filename + ".csv",
                                                              "csv",
                                                              "Сохранить данные",
                                                              Win.SaveFileDialog.SaveFileDialogFlags.NoUrls |
                                                              Win.SaveFileDialog.SaveFileDialogFlags.NoShellExtensions |
                                                              Win.SaveFileDialog.SaveFileDialogFlags.NoFtpSites |
                                                              Win.SaveFileDialog.SaveFileDialogFlags.DoNotWarnIfFileExist |
                                                              Win.SaveFileDialog.SaveFileDialogFlags.DoNotTransferRemoteFiles);

            try
            {
                if (sFile.ShowDialog() == System.Windows.Forms.DialogResult.OK && sFile.Filename.Length > 0)
                {
                    outToCSV(sb.ToString(), sFile.Filename);
                }
            }
            catch (Rtm.Exception ex)
            {
                //MessageBox.Show("Error", ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
                acDoc.Editor.WriteMessage($"\nError! {ex.Message}");
            }
        }
Esempio n. 10
0
        public static bool GetData(Db.ObjectId ObjectId)
        {
            SettingsParser settings = SettingsParser.getInstance();

            Db.Database acCurDb = App.Application.DocumentManager.MdiActiveDocument.Database;

            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                Db.Polyline acPLine = acTrans.GetObject(ObjectId, Db.OpenMode.ForRead) as Db.Polyline;

                //Блокируем повторный выбор линии
                if (curveDict.FirstOrDefault(s => s.ObjId == ObjectId) == null)
                {
                    Curve crv = new Curve(ObjectId);
                    crv.Number     = settings.startNumberCurve;
                    crv.Area       = round(acPLine.Area, settings.areaTolerance);
                    crv.AreaOutput = round(acPLine.Area * settings.allAreaTolerance, settings.coordinateTolerance);

                    settings.startNumberCurve++;

                    if (pointDict.Count > 0)
                    {
                        settings.startNumberPoint = pointDict.Count;
                    }


                    int countVertix = acPLine.NumberOfVertices;

                    for (int i = 0; i < countVertix; i++)
                    {
                        Gem.Point2d pt = acPLine.GetPoint2dAt(i);

                        int iMin = (i == 0) ? iMin = countVertix - 1 : iMin = i - 1;
                        int iMax = (i == countVertix - 1) ? iMax = 0 : iMax = i + 1;

                        //Поучаю все три точки угла


                        Gem.Point3d ptO = new Gem.Point3d(acPLine.GetPoint2dAt(i).X,
                                                          acPLine.GetPoint2dAt(i).Y, 0);
                        Gem.Point3d ptMin = new Gem.Point3d(acPLine.GetPoint2dAt(iMin).X,
                                                            acPLine.GetPoint2dAt(iMin).Y, 0);
                        Gem.Point3d ptMax = new Gem.Point3d(acPLine.GetPoint2dAt(iMax).X,
                                                            acPLine.GetPoint2dAt(iMax).Y, 0);

                        Gem.Vector3d vMin = ptO.GetVectorTo(ptMin);
                        Gem.Vector3d vMax = ptO.GetVectorTo(ptMax);

                        Gem.Vector3d vNormaliseMin = vMin / vMin.Length;
                        Gem.Vector3d vNormaliseMax = vMax / vMax.Length;

                        Gem.Vector3d vNormalise = vNormaliseMin + vNormaliseMax;
                        vNormalise = vNormalise / vNormalise.Length;

                        //Тут нужно проверять, попадает ли точка нормализованного вектора внутрь фигуры или наружу
                        using (Db.Ray cl = new Db.Ray())
                        {
                            cl.BasePoint = ptO + vNormalise;
                            cl.UnitDir   = vNormalise;
                            Gem.Point3dCollection pnt3dCol = new Gem.Point3dCollection();
                            acPLine.IntersectWith(cl, Db.Intersect.OnBothOperands, pnt3dCol, IntPtr.Zero, IntPtr.Zero);
                            if ((pnt3dCol.Count % 2) != 0)
                            {
                                vNormalise = vNormalise * (-1);
                            }
                        }

                        int namb = 0; //Номер вершины
                        if (pointDict.FirstOrDefault(s => s.IsEqualTo(pt, settings.coordinateTolerance)) == null)
                        {
                            Point pnt = new Point(round(pt.X, settings.coordinateTolerance),
                                                  round(pt.Y, settings.coordinateTolerance),
                                                  settings.startNumberPoint);

                            //Добавляем нормализованный вектор биссектриссы угла
                            pnt.vNormalise = vNormalise;
                            //Добавляем в список точек
                            pointDict.Add(pnt);
                            //Добавляем в кривую
                            crv.Vertixs.Add(pnt);

                            namb = settings.startNumberPoint;
                            settings.startNumberPoint++;
                        }
                        else
                        {
                            //Добавляем в список вершин уже обраотанную точку
                            crv.Vertixs.Add(pointDict.FirstOrDefault(s => s.IsEqualTo(pt, settings.coordinateTolerance)));
                        }
                    }

                    //Добавляем в список линий
                    curveDict.Add(crv);
                    //Вывожу данные линии в чертеж
                    View.TextToDwg(crv);
                    //View.AddText(crv.textPoint(), $"{crv.Number} \\P S={crv.Area} кв.м.");
                }
                acTrans.Commit();
            }
            return(true);
        }