Добрый день!
Задача такая. по координатам точки найти блок.
Вроде всё просто
private BlockReference FindBlockAtPoint(Database db,Transaction tr, Point3d point)
{
BlockTableRecord modelSpace = tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead) as BlockTableRecord;
double tolerance = 0.01;
foreach (ObjectId id in modelSpace)
{
if (id.ObjectClass.IsDerivedFrom(RXObject.GetClass(typeof(BlockReference))))
{
BlockReference blockRef = tr.GetObject(id, OpenMode.ForRead) as BlockReference;
if (blockRef != null)
{
Extents3d extents = blockRef.GeometricExtents;
if (point.X >= extents.MinPoint.X - tolerance && point.X <= extents.MaxPoint.X + tolerance &&
point.Y >= extents.MinPoint.Y - tolerance && point.Y <= extents.MaxPoint.Y + tolerance)
{
return blockRef;
}
}
}
}
}
Но получается не так как хотелось.
У меня динамические блоки. у каждого блока несколько состояний видимости. В зависимости от видимости размер разный.
blockRef.GeometricExtents возвращает размер всего блока, не только того что видимо, а вообще всего содержимого.
Если взять 2 блока с видимостью где блок маленький и поставить их рядом, то их GeometricExtents пересекаются.
выбираю точку на одном блоке, а находится 2 (в моём коде возвращается первый попавшийся).
Собственно вопрос
Как же найти границы реально отображаемой геометрии?