Правила ограничивающих объектов

(базовый класс SpaceOffsetRulesManager.AecBoundingObjectRule)

Правила ограничивающих объектов позволяют отмечать объекты, ограничивающие базовый профиль пространства, например, несущие элементы, как неограничивающие, после чего такие объекты можно обрабатывать при создании профиля смещения. Каждый стандарт может определять и применять для каждого типа смещения границ несколько правил ограничивающих объектов.

Реализация правила ограничивающего объекта

Для реализации пользовательского правила ограничивающих объектов необходимо добавить новый класс, полученный из базового класса SpaceOffsetRulesManager.AecBoundingObjectRule. Новый класс должен реализовывать интерфейс Applyбазового класса и регистрировать себя для типов объекта, необходимых конструктору при вызове базового метода AecSpaceOffsetRuleBase.RegisterType(). Синтаксис метода Apply данного типа правила:

public abstract bool Apply(Autodesk.AutoCAD.DatabaseServices.ObjectId idSpace,
Autodesk.AutoCAD.DatabaseServices.ObjectId idObject);

Первый аргумент представляет собой текущее пространство, для которого рассчитывается контур границы смещения. Второй аргумент idObject является идентификатором объекта, ограничивающего пространство. В методе Apply объект пространства, а также ограничивающий объект теперь могут открываться, у них могут запрашиваться некоторые свойства для определения, следует ли учитывать объект при создании профиля. Если метод возвращает False, границы объекта удаляются из профиля смещения. Предполагается, что при применении правил смещения объект учитывается не будет. В следующем примере показан фрагмент кода для нового правила пространства BoundingObjectRuleGross:

namespace AecSpaceOffsetStandardSample
{
public class BoundingObjectRuleBasic: AecBoundingObjectRule
{
public BoundingObjectRuleGross()
{
RegisterType(typeof(kAllTypes));
} public override bool Apply(ObjectId idSpace, ObjectId idObject) {
//return false to mark object as non-contributing
}
}
}

Пример правила ограничивающих объектов BoundingObjectRuleGross

В следующем примере показана реализация правила ограничивающих объектов, используемое для общего профиля примера проекта. Это правило удаляет все сегменты из профиля, ограниченного несущим элементом. Часто общая площадь пространства определяется без учета несущих элементов, даже если эти элементы ограничивают базовый профиль пространства.

public class BoundingObjectRuleGross : AecBoundingObjectRule
{
public BoundingObjectRuleGross()
{
RegisterType(typeof(kAllTypes));
} public override bool Apply(ObjectId idSpace, ObjectId idObject) {
bool result=true;
Autodesk.AutoCAD.DatabaseServices.Database db =idObject.Database;
using (Autodesk.AutoCAD.DatabaseServices.Transaction transaction =db.TransactionManager.StartTransaction())
{
Member member = transaction.GetObject(idObject, OpenMode.ForRead) as Member;
if ( member == null )
{
MemberType memType = member.MemberType;
if ( memType == MemberType.Column )
{
result = false;
}
}
transaction.Commit(); } return result;
}
}

На рисунке ниже показан пример применения этого правила, где граница в чистоте (зеленая) включает столбцы, в то время как общая граница (синяя) игнорирует их.