using System;
//-----------------------------------------
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
//-----------------------------------------
using Autodesk.AutoCAD.Interop;
using Autodesk.AECC.Interop.Land;
using Autodesk.AECC.Interop.UiLand;
namespace LineObstacles
{
public class PolylineObs:IExtensionApplication
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
public void Initialize()
{
ed.WriteMessage("Поздравляю вас, сборка загружена.");
}
public void Terminate()
{
ed.WriteMessage("Сборка выгружена. До свидания");
}
//Подключение к документу через COM
static AcadApplication oAcadApp = (AcadApplication)Application.AcadApplication;
static AeccApplication oCivApp = (AeccApplication)oAcadApp.GetInterfaceObject("AeccXUiLand.AeccApplication.9.0");
static AeccDocument oDoc = (AeccDocument)oCivApp.ActiveDocument;
//---------------------------------
static Document acDoc = Application.DocumentManager.MdiActiveDocument;
static Database acCurDb = acDoc.Database;
AeccPoints oPoints = (AeccPoints)oDoc.Points;
AeccPoint oPointTMP = null;
AeccPoint oPointA = null;
AeccPoint oPointB = null;
bool exit=false;
[CommandMethod("plineCOGO")]
public void plineCOGO()
{
do//Создание полилинии циклично пока не ESC
{
PromptIntegerResult intResult;
//Сообщения для ввода номера
intResult = inputNumCogo("\nВведите номер начальной точки [Выход - ESC]: ");
if (intResult.Status == PromptStatus.OK)
{
oPointA = oPointTMP;
ed.WriteMessage("\nВыбрана точка с номером " + oPointA.Number);
ed.WriteMessage("\nКоординаты точки: Y={0}; X={1}", oPointA.Northing, oPointA.Easting);
intResult = inputNumCogo("\nВведите номер конечной точки [Выход - ESC]: ");
if (intResult.Status == PromptStatus.OK)
{
oPointB = oPointTMP;
ed.WriteMessage("\nВыбрана точка с номером " + oPointB.Number);
ed.WriteMessage("\nКоординаты точки: Y={0}; X={1}", oPointB.Northing, oPointB.Easting);
//Переменные minX,minY,maxX,maxY для зума на созданную полилинию
double minY = Math.Min(oPointA.Northing, oPointB.Northing);
double minX = Math.Min(oPointA.Easting, oPointB.Easting);
double maxY = Math.Max(oPointA.Northing, oPointB.Northing);
double maxX = Math.Max(oPointA.Easting, oPointB.Easting);
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
BlockTable acBlkTbl;
acBlkTbl = (BlockTable)acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead);
BlockTableRecord acBlkTblRec;
acBlkTblRec = (BlockTableRecord)acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Polyline acPoly = new Polyline();
//Задание свойств полилинии (в будущем сделать окно выбора при загрузке сборки с дефолтом)
acPoly.SetDatabaseDefaults();
acPoly.ColorIndex = 7;
acPoly.LineWeight = LineWeight.LineWeight060;
acPoly.Layer = "11_Препятствия";//Сделать проверку на наличие
int num = oPointA.Number;
int v = 0;//Счётчик вершин полилинии
bool status;//Статус пропуска отсутствующий номеров
while (num <= oPointB.Number)//В будущем сделать с реверсом, если oPointA.Number>oPointB.number
{
status = true;
try
{
oPointTMP = oPoints.Find(num);
}
catch (ArgumentException)
{
ed.WriteMessage("\nПолучен отсутствующий номер - " + num);
status = false;
}
if (status == true)
{
acPoly.AddVertexAt(v, new Point2d(oPointTMP.Easting, oPointTMP.Northing), 0, 0, 0);
v++;
minX = Math.Min(minX, oPointTMP.Easting);
minY = Math.Min(minY, oPointTMP.Northing);
maxX = Math.Max(maxX, oPointTMP.Easting);
maxY = Math.Max(maxY, oPointTMP.Northing);
}
num++;
}
//Запись полилинии в базу (в будущем сделать возможность замыкания)
acBlkTblRec.AppendEntity(acPoly);
acTrans.AddNewlyCreatedDBObject(acPoly, true);
acTrans.Commit();
//Зум с офсетом 100
double[] lower = new double[3] { minX - 100, minY - 100, 0 };
double[] upper = new double[3] { maxX + 100, maxY + 100, 0 };
oCivApp.ZoomWindow(lower, upper);
}
}
else
{
ed.WriteMessage("\nПроизведён выход");//Выход при нажатии ESC
exit = true;
}
}
else
{
ed.WriteMessage("\nПроизведён выход");
exit = true;
}
} while (exit == false);
}
//Ввод номеров точек с поиском по базе, возвращает результат поиска
//На входе сообщение для ввода данных (в будущем сделать ввод интервала через "-")
public PromptIntegerResult inputNumCogo(string Message)
{
PromptIntegerResult intResult;
PromptIntegerOptions intOption = new PromptIntegerOptions("");
intOption.AllowNone = false;
intOption.AllowZero = false;
intOption.AllowNegative = false;
intOption.Message = Message;
int num;
bool status;
do
{
intResult = ed.GetInteger(intOption);
num = intResult.Value;
status = true;
if (intResult.Status == PromptStatus.OK)
{
try
{
oPointTMP = oPoints.Find(num);
}
catch (ArgumentException)
{
status = false;
ed.WriteMessage("\nПолучен отсутствующий номер!");
}
}
} while ((status == false) && (intResult.Status == PromptStatus.OK));
return intResult;
}
}
}