namespace СomplicatedСonditions
{
//Класс - поиска итоговых регионов
public class СomplicatedСonditionsRegion
{
#region Константы заполнения
//Константа пустота для строк
private const string Report = "Все землепользователи";
//Константа пустота для строк
private const string ReportEarth = "Землепользователи по земле";
//Константа единицы измерения
private const string UnitsMetrK = "м3";
//Константа
private const Char DelimitelPlus = '+';
//Константа делителя +
private const Char DelimitelMinus = '-';
//Константа делителя ПК
private const string PK = "ПК";
#endregion
//Конструктор
public СomplicatedСonditionsRegion()
{
}
//Копирование региона
private static void CopyRegion(out Region copyregion, Region localregion)
{
AcadDoc Draw = new AccessDoc();
Database db = Draw.DBase;
ObjectIdCollection collection = new ObjectIdCollection() { localregion.ObjectId };
// делаем Пространство Модели владельцем нового примитива
ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
IdMapping mapping = new IdMapping();
db.DeepCloneObjects(collection, ModelSpaceId, mapping, false);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// получаем id-копии по id-оригинала
IdPair pair1 = mapping[localregion.ObjectId];
// открываем копию
copyregion = tr.GetObject(pair1.Value, OpenMode.ForWrite) as Region;
tr.Commit();
}
}
//Создание списка регионов
static List<СomplicatedRegion> GetRegion(string nameLayer)
{
//экземпляр класса доступа к чертежу
AccessDoc AcToDraw = new AccessDoc();
Database db = AcToDraw.DBase;
Editor ae = AcToDraw.Ed;
//выбор всех вхождений
TypedValue[] filterlist = new TypedValue[2];
filterlist.SetValue(new TypedValue((int)DxfCode.Start, "LWPOLYLINE"), 0);
filterlist.SetValue(new TypedValue((int)DxfCode.LayerName, nameLayer), 1);
SelectionFilter filter = new SelectionFilter(filterlist);
PromptSelectionResult acSSPrompt = ae.SelectAll(filter);
SelectionSet acSSet = acSSPrompt.Value;
//Список регионов исследования
List<СomplicatedRegion> ListRegion = new List<СomplicatedRegion>();
if (acSSPrompt.Status == PromptStatus.OK)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
//BlockTable blockTable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord blocktableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
foreach (SelectedObject selobj in acSSet)
{
Polyline poly = tr.GetObject(selobj.ObjectId, OpenMode.ForRead) as Polyline;
//Инициируем колекцию по полилинии
DBObjectCollection acDBObjColl01 = new DBObjectCollection { poly };
DBObjectCollection localRegion = Region.CreateFromCurves(acDBObjColl01);
//Создаем регион по полилинии
Region region = localRegion[0] as Region;
//Добавляем регионы в чертеж
blocktableRecord.AppendEntity(region);
tr.AddNewlyCreatedDBObject(region, true);
ListRegion.Add(new СomplicatedRegion()
{
//Id региона
Id = region.ObjectId,
//Имя региона
NameRegion = nameLayer,
//Тип региона
TypeRegion = nameLayer,
//ПК начала региона
BeginPK = "00+00",
//ПК начала региона
EndPK = "00+00",
//КМ начала региона
BeginKM = 12.1,
//КМ начала региона
EndKM = 12.1,
//Площадь
Square = region.Area,
//Слой объекта
RegionLayer = nameLayer
});
}
tr.Commit();
}
}
else
{
MessageBox.Show("Нет характерных зон");
}
return ListRegion;
}
//Создание списка регионов совместных зон
static List<СomplicatedRegion> GetRegionСС_OZ()
{
//Список регионов - стесненность
List<СomplicatedRegion> RegionСС = GetRegion(WorkLayer.layerСС);
//MessageBox.Show("RegionСС = " + RegionСС.Count().ToString());
//Список регионов - ОЗ ВЛ
List<СomplicatedRegion> RegionOZ = GetRegion(WorkLayer.layerOZ);
//MessageBox.Show("RegionOZ = " + RegionOZ.Count().ToString());
//Список регионов исследования
List<СomplicatedRegion> RegionСС_OZ = new List<СomplicatedRegion>();
//экземпляр класса доступа к чертежу
AccessDoc AcToDraw = new AccessDoc();
Database db = AcToDraw.DBase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable blockTable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
BlockTableRecord blocktableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
foreach (СomplicatedRegion regionСС in RegionСС)
{
//выбираем регионы по стеснености
Region region_CC = tr.GetObject(regionСС.Id, OpenMode.ForWrite) as Region;
//Плошадь для сравнения изменений
double area01 = region_CC.Area;
//Создаем копию изменяемого региона
//CopyRegion(out Region copyregion01, region_CC);
//Сортировка - поиск обединенных регионов
foreach (СomplicatedRegion regionOZ in RegionOZ)
{
//Создаем копию изменяемого региона
CopyRegion(out Region copyregion02, tr.GetObject(regionOZ.Id, OpenMode.ForWrite) as Region);
//Поиск общего пересечения
region_CC.BooleanOperation(BooleanOperationType.BoolIntersect, copyregion02);
}
//площадь пересечения
double area02 = region_CC.Area;
//Запись нового объекта в новый список
if (area01 != area02)
{
//Region newregion = tr.GetObject(copyregion01.Id, OpenMode.ForWrite) as Region;
//blocktableRecord.AppendEntity(newregion);
//tr.AddNewlyCreatedDBObject(newregion, true);
RegionСС_OZ.Add(new СomplicatedRegion()
{
//Id региона
Id = copyregion01.ObjectId,
//Имя региона
NameRegion = WorkLayer.layerССandOZ,
//Тип региона
TypeRegion = WorkLayer.layerССandOZ,
//ПК начала региона
BeginPK = "00+00",
//ПК начала региона
EndPK = "00+00",
//КМ начала региона
BeginKM = 12.1,
//КМ начала региона
EndKM = 12.1,
//Площадь
Square = copyregion01.Area,
//Слой объекта
RegionLayer = WorkLayer.layerССandOZ
});
}
}
tr.Commit();
}
MessageBox.Show("RegionСС_OZ = " + RegionСС_OZ.Count().ToString());
return RegionСС_OZ;
}
[CommandMethod("СomplicatedRegion")]
public void СomplicatedRegion()
{
List<СomplicatedRegion> RegionCC_ZZ = GetRegionСС_OZ();
}
}
}