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(); } }
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"); } }
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(); } }
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(); }
} = 1.1; //V_MTextMaskKoefficient public static SettingsParser getInstance() { if (instance == null) { instance = new SettingsParser(); } return(instance); }
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); } }
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)}"); } }
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(); } }
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}"); } }
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); }