// выбор части сети на виде профиля
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
PromptEntityOptions peo = new PromptEntityOptions(
"\nВыберите часть сети на виде профиля: ");
peo.SetRejectMessage("\nТолько части сети на виде профиля!");
peo.AddAllowedClass(typeof(ProfileViewPart), true);
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK) return;
Database db = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
// получение части сети, отображенной на виде профиля
ProfileViewPart partPV = trans.GetObject(per.ObjectId,
OpenMode.ForRead) as ProfileViewPart;
Part part = trans.GetObject(partPV.ModelPartId,
OpenMode.ForRead) as Part;
// может иметься несколько видов профилей, отображающих эту часть...
ObjectIdCollection pvIds = part.GetProfileViewsDisplayingMe();
foreach (ObjectId pvId in pvIds)
{
// получение вида профиля
ProfileView pv = trans.GetObject(pvId, OpenMode.ForRead) as ProfileView;
// получение трассы вида профиля
Alignment align = trans.GetObject(pv.AlignmentId, OpenMode.ForRead) as Alignment;
// если объект - колодец
if (part is Structure)
{
// получение колодца
Structure structure = part as Structure;
// получение точки вставки колодца в модели
Point3d strLoc = structure.Location;
// получение пикетажа колодца по трассе вида профиля
// как побочные данные, будет получено еще смещение
// колодца от трассы вида профиля в плане
double
station = 0.0,
offset = 0.0;
align.StationOffset(strLoc.X, strLoc.Y, ref station, ref offset);
// вывод сообщения о положении колодца
ed.WriteMessage(
"\nКолодец '{0}' отображается на виде профиля '{1}' на пикете: {2:0.00}",
part.Name, pv.Name, station);
// если колодец соединительный - вывод отметки его крышки и дна
if (structure.PartType == PartType.StructJunction)
{
ed.WriteMessage
("\nОтметка крышки колодца: {0:0.00}, дна: {1:0.00}",
structure.RimElevation, structure.SumpElevation);
}
}
// если объект - труба
else if (part is Pipe)
{
// получение трубы
Pipe pipe = part as Pipe;
// ... и ее начальной и конечной точек (на оси трубы)
Point3d
startPt = pipe.StartPoint,
endPt = pipe.EndPoint;
// получение пикетажей и смещений начальной и конечной точек
double
startStation = 0.0,
startOffset = 0.0,
endStation = 0.0,
endOffset = 0.0;
align.StationOffset(startPt.X, startPt.Y, ref startStation, ref startOffset);
align.StationOffset(endPt.X, endPt.Y, ref endStation, ref endOffset);
// вывод значения пикетажей и отметок начальной и конечной точек
ed.WriteMessage(
"\nТруба '{0}' отображается на виде профиля '{1}'."
+ "\nНачало - пикет: {2:0.00}, отметка: {3:0.00}"
+ "\nКонец - пикет: {4:0.00}, отметка: {5:0.00}",
part.Name, pv.Name, startStation, startPt.Z, endStation, endPt.Z);
}
}
}