Координата Z игнорируется при вставке экземпляра вложенного семейства, размещенного на грани, в Revit 2014

Я пытаюсь вставить семейство с размещением на лице, содержащее пустую экструзию, в семейство универсального специального оборудования. Сценарий следующий:

  • В «родительском» семействе размещен прямоугольный профиль с Z = 100 мм и высотой = 40 мм; экструзия создается программно

  • У меня есть .rfa с простым пустым цилиндром. Этот RFA относится к семейству Generic model, и я установил для параметра "Cut with voids" значение true.

  • Я хочу вставить экземпляр этого семейства void в родительское семейство, чтобы проткнуть экструзию.

Код, который я использую, следующий:

        Options opt = _commandData.Application.Application.Create.NewGeo​metryOptions();
        opt.ComputeReferences = true;
        var geo = shelf.get_Geometry(opt);//shelf is the extrusion
//location = 0,-800,100
//width = 1000
//depth = 800
//height = 140
//all measures are mm
        PlanarFace pf = null;
        foreach (GeometryObject obj in geo)
        {
            Solid solid = obj as Solid;

            if (null != solid)
            {
                foreach (Face face in solid.Faces)
                {
                    pf = face as PlanarFace;
                    if (null != pf)
                    {
                        XYZ normal = pf.Normal.Normalize();
                        if (0.0 < normal.Z && normal.X < 1 && normal.Y < 1)
                        {
                            break;
                        }
                    }
                }
            }
        }
        if (pf != null)
        {
            var location = new XYZ(50D.ToRevitMeasure(), -100D.ToRevitMeasure(), 140D.ToRevitMeasure());
            var referenceDirection = XYZ.BasisX;
            FamilySymbol symbol = null;
            RevitBaseUtilities.DoSomethingInsideTransaction(() => familyDocument.LoadFamilySymbol(holeFileName, Path.GetFileNameWithoutExtension(holeFileName),
                                                                                                  new FamilyLoadingDontOverwriteOption(), out symbol), familyDocument);


            FamilyInstance inst;
            RevitBaseUtilities.DoSomethingInsideTransaction(() => inst = familyDocument.FamilyCreate.NewFamilyInstance(pf, location, referenceDirection , symbol), familyDocument);

            familyDocument.SaveAs(resultFileName);
            familyDocument.Close(false);

Проблема в том, что цилиндр всегда находится в Z=0. При необходимости могу выслать семейство дырок и итоговый проект.


person Tobia Zambon    schedule 16.07.2014    source источник


Ответы (1)


Если я понимаю, что вы делаете правильно, вы можете использовать свойство GlobalPoint, унаследованное от Reference/Element, вместо элемента PlanarFace.Normal. Или, по крайней мере, включите его в свою реализацию, чтобы вы также захватили XYZ элементов, на которые вы ссылаетесь.

person prestonsmith    schedule 17.07.2014
comment
Я использую нормальный только для того, чтобы узнать, является ли фактическое лицо правильным лицом, где мне нужно поместить мою принимающую семью. Правая грань — это верхняя грань выдавливания, поэтому она имеет нормаль (0,0,1) или (0,0,-1). Где мне следует использовать GlobalPoint? - person Tobia Zambon; 18.07.2014
comment
хм, а реализация foreach, которую вы используете сейчас, возвращает правильное лицо просто из любопытства? Глобальную точку следует использовать везде, где вы пытаетесь вернуть местоположение элемента — короче говоря, если вы хотите щелкнуть где-нибудь на объекте и он приземлится в этом месте — используйте ссылку, чтобы захватить SelectionPoint, а затем вы можете использовать свойство GlobalPoint, чтобы получить точное значение XYZ этой точки. - person prestonsmith; 18.07.2014
comment
Да, я полагаю, это дает правильное лицо. Вложенное семейство размещается на лице, поэтому globalPoint здесь бесполезен. - person Tobia Zambon; 28.07.2014