- 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; 
-         } 
-     } 
- }