Exemplo n.º 1
0
        public void Cutting(Document doc, List <FamilyInstance> listcut, List <FamilyInstance> listconn)
        {
            ProgressBarform progressBarform = new ProgressBarform(listconn.Count, "Cutting");

            progressBarform.Show();
            foreach (var conn in listconn)
            {
                progressBarform.giatri();
                if (progressBarform.iscontinue == false)
                {
                    break;
                }
                using (Transaction tran = new Transaction(doc, "Cut Void"))
                {
                    tran.Start();
                    foreach (var framming in listcut)
                    {
                        try
                        {
                            if (InstanceVoidCutUtils.CanBeCutWithVoid(framming))
                            {
                                InstanceVoidCutUtils.AddInstanceVoidCut(doc, framming, conn);
                            }
                        }
                        catch
                        {
                        }
                    }
                    tran.Commit();
                }
            }
            progressBarform.Close();
        }
Exemplo n.º 2
0
        /*
         * public static List<Element> GetAllIntersectionElements2(Document doc, Element voidElem)
         * {
         *  Options op = new Options();
         *  op.ComputeReferences = true;
         *  GeometryElement ge = voidElem.get_Geometry(op);
         *  Solid sol = null;
         *  foreach (GeometryObject geo in ge)
         *  {
         *      if (geo == null) continue;
         *      if (geo is Solid)
         *      {
         *          sol = geo as Solid;
         *          break;
         *      }
         *  }
         *  ElementIntersectsSolidFilter solins = new ElementIntersectsSolidFilter(sol);
         *
         *  FilteredElementCollector filcol = new FilteredElementCollector(doc, doc.ActiveView.Id).WherePasses(solins);
         *
         *  foreach (Element e in filcol)
         *  {
         *      InstanceVoidCutUtils.AddInstanceVoidCut(doc, e, voidElem);
         *  }
         *
         *
         * }
         */


        /// <summary>
        /// Вырезает экземпляр семейства c пустотным элементов из другого элемента в модели. Требуется открытая транзакция
        /// </summary>
        public static bool CutElement(Document doc, Element elemForCut, Element elemWithVoid)
        {
            Debug.WriteLine("Try cut elem " + elemForCut.Id.IntegerValue.ToString()
                            + " by elem " + elemWithVoid.Id.IntegerValue.ToString());

            //Проверяю, можно ли вырезать геометрию из данного элемента
            bool check1 = InstanceVoidCutUtils.CanBeCutWithVoid(elemForCut);

            //проверяю, есть ли в семействе полый элемент и разрешено ли вырезание
            bool check2 = InstanceVoidCutUtils.IsVoidInstanceCuttingElement(elemWithVoid);

            //проверяю, существует ли уже вырезание
            bool check3 = InstanceVoidCutUtils.InstanceVoidCutExists(elemForCut, elemWithVoid);

            //Если одно из условий не выполняется - возвращаю false
            if (!check1 || !check2 || check3)
            {
                Debug.WriteLine("Unable to cut");
                return(false);
            }

            try
            {
                InstanceVoidCutUtils.AddInstanceVoidCut(doc, elemForCut, elemWithVoid);
                Debug.WriteLine("Cut success");
                return(true);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Cut exception " + ex.Message);
                return(false);
            }
        }
Exemplo n.º 3
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiApp = commandData.Application;
            UIDocument    uiDoc = uiApp.ActiveUIDocument;
            Document      doc   = uiApp.ActiveUIDocument.Document;
            Application   app   = uiApp.Application;

            Selection selection = uiDoc.Selection;

            Transaction ts = new Transaction(doc, "cut");

            ts.Start();

            IList <Element> _elements = uiDoc.Selection.PickElementsByRectangle(new WallFilter(), "请框选所有需要剪切的墙、板、柱");

            foreach (var element1 in _elements)
            {
                var collector2          = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralFraming).OfClass(typeof(FamilyInstance));
                var pipeIntersectFilter = new ElementIntersectsElementFilter(element1);

                List <FamilyInstance> pipes = collector2.WherePasses(pipeIntersectFilter).ToList().ConvertAll(x => x as FamilyInstance);

                foreach (var pipe in pipes)
                {
                    InstanceVoidCutUtils.AddInstanceVoidCut(doc, element1, pipe);
                }
                //new BoundingBoxIsInsideFilter();
            }

            ts.Commit();
            return(Result.Succeeded);
        }
Exemplo n.º 4
0
        public static bool CutsHost(FamilyInstance _fi)
        {
            if (_fi.Host == null)
            {
                return(false);
            }
            var doc = _fi.Document;

            return(InstanceVoidCutUtils.InstanceVoidCutExists(_fi.Host, _fi));
        }
Exemplo n.º 5
0
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        UIApplication           application = commandData.get_Application();
        Document                document    = application.get_ActiveUIDocument().get_Document();
        Selection               selection   = application.get_ActiveUIDocument().get_Selection();
        ICollection <ElementId> elementIds  = selection.GetElementIds();

        if (elementIds.Count != 0)
        {
            List <Element> list = Method.GeometryFilter(document, elementIds);
            int            num  = 0;
            if (list.Count > 1)
            {
                Combinations <Element> combinations = new Combinations <Element>(list, 2, GenerateOption.WithoutRepetition);
                Transaction            val          = new Transaction(document);
                val.Start("CutElement");
                FailureHandlingOptions failureHandlingOptions = val.GetFailureHandlingOptions();
                MyFailuresPreProcessor myFailuresPreProcessor = new MyFailuresPreProcessor();
                failureHandlingOptions.SetFailuresPreprocessor(myFailuresPreProcessor);
                val.SetFailureHandlingOptions(failureHandlingOptions);
                foreach (List <Element> item in combinations)
                {
                    try
                    {
                        InstanceVoidCutUtils.AddInstanceVoidCut(document, item[0], item[1]);
                        num++;
                    }
                    catch
                    {
                    }
                }
                MessageBox.Show(num.ToString() + " Pairs Elements Successfully Cut.", "ElementMerger");
                val.Commit();
            }
            else if (list.Count == 1)
            {
                TaskDialog.Show("ElementMerger", "Only One Element Selected");
            }
        }
        else
        {
            TaskDialog.Show("ElementMerger", "None Element Selected");
        }
        return(0);
    }
Exemplo n.º 6
0
        private void CutInMepCurve(Transaction tran, Element wall, MEPCurve intersector, FamilySymbol rectOpen, FamilySymbol roundOpen)
        {
            Curve     extrusionCurve = ((LocationCurve)intersector.Location).Curve;
            Connector connector      = intersector.ConnectorManager.Connectors.Cast <Connector>().FirstOrDefault();

            double offset = UnitUtils.ConvertToInternalUnits(100, DisplayUnitType.DUT_MILLIMETERS);

            switch (connector?.Shape)
            {
            case ConnectorProfileType.Rectangular:

                tran.Start("Creating wall penetration");

                FamilyInstance fi = _doc.Create.NewFamilyInstance(extrusionCurve, rectOpen, _doc.GetElement(intersector.LevelId) as Level, StructuralType.Beam);
                InstanceVoidCutUtils.AddInstanceVoidCut(_doc, wall, fi);

                fi.get_Parameter(BuiltInParameter.YZ_JUSTIFICATION).Set(0);
                fi.get_Parameter(BuiltInParameter.Z_JUSTIFICATION).Set(1);
                fi.get_Parameter(BuiltInParameter.Y_JUSTIFICATION).Set(1);
                fi.LookupParameter("w").Set(connector.Width + offset);
                fi.LookupParameter("h").Set(connector.Height + offset);

                tran.Commit();

                break;

            case ConnectorProfileType.Round:

                tran.Start("Creating wall penetration");

                fi = _doc.Create.NewFamilyInstance(extrusionCurve, roundOpen, _doc.GetElement(intersector.LevelId) as Level, StructuralType.Beam);

                InstanceVoidCutUtils.AddInstanceVoidCut(_doc, wall, fi);

                fi.get_Parameter(BuiltInParameter.YZ_JUSTIFICATION).Set(0);
                fi.get_Parameter(BuiltInParameter.Z_JUSTIFICATION).Set(1);
                fi.get_Parameter(BuiltInParameter.Y_JUSTIFICATION).Set(1);
                fi.LookupParameter("r").Set(connector.Radius * 1.2);

                tran.Commit();

                break;
            }
        }
Exemplo n.º 7
0
        private void CutBasicRectangular(Transaction trans, Wall wall, Element intersector, FamilySymbol rectOpen)
        {
            WallExtrusion extrusion      = new WallExtrusion(intersector, wall);
            Curve         extrusionCurve = extrusion.LocationCurve;

            trans.Start("Creating extrusion");

            var fi = _doc.Create.NewFamilyInstance(extrusionCurve, rectOpen, _doc.GetElement(intersector.LevelId) as Level, StructuralType.Beam);

            InstanceVoidCutUtils.AddInstanceVoidCut(_doc, wall, fi);

            fi.get_Parameter(BuiltInParameter.YZ_JUSTIFICATION).Set(0);
            fi.get_Parameter(BuiltInParameter.Z_JUSTIFICATION).Set(1);
            fi.get_Parameter(BuiltInParameter.Y_JUSTIFICATION).Set(1);
            fi.LookupParameter("w").Set(extrusion.Width);
            fi.LookupParameter("h").Set(extrusion.Height);

            trans.Commit();

            trans.Start("Setting appropriate extrusion dimensions");
            SetAppropriateDimensions(intersector, fi, extrusion);
            trans.Commit();
        }
Exemplo n.º 8
0
        public void UnCut(Document doc, List <FamilyInstance> voids, List <FamilyInstance> listcut)
        {
            Transaction tran = new Transaction(doc, "Invention: Cut void by type");

            tran.Start();
            foreach (var conn in voids)
            {
                foreach (var framming in listcut)
                {
                    try
                    {
                        if (InstanceVoidCutUtils.CanBeCutWithVoid(framming))
                        {
                            InstanceVoidCutUtils.RemoveInstanceVoidCut(doc, framming, conn);
                        }
                    }
                    catch
                    {
                    }
                }
            }
            tran.Commit();
        }
Exemplo n.º 9
0
        public static void CutUncutHost(FamilyInstance _fi, bool _cut)
        {
            if (_fi.Host == null)
            {
                return;
            }
            bool currCut = HostUtils.CutsHost(_fi);

            if (_cut == currCut)
            {
                return;
            }
            var doc = _fi.Document;

            if (_cut)
            {
                InstanceVoidCutUtils.AddInstanceVoidCut(doc, _fi.Host, _fi);
            }
            else
            {
                InstanceVoidCutUtils.RemoveInstanceVoidCut(doc, _fi.Host, _fi);
            }
        }
Exemplo n.º 10
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiApp = commandData.Application;
            UIDocument    uiDoc = uiApp.ActiveUIDocument;
            Document      doc   = uiApp.ActiveUIDocument.Document;
            Application   app   = uiApp.Application;

            Selection selection = uiDoc.Selection;

            Transaction ts = new Transaction(doc, "cut");

            ts.Start();

            //Reference refWall = selection.PickObject(ObjectType.Element, "choise");
            //Element elem_1 = doc.GetElement(refWall);

            //Reference refPipe = selection.PickObject(ObjectType.Element, "choise");
            //Element elem_2 = doc.GetElement(refPipe);

            ////SolidSolidCutUtils.RemoveCutBetweenSolids(doc, elem_1, elem_2);
            //InstanceVoidCutUtils.AddInstanceVoidCut(doc, elem_1, elem_2);


            //SolidSolidCutUtils.AddCutBetweenSolids(doc, elem_1, elem_2);
            //JoinGeometryUtils.JoinGeometry(doc, e1, e2);

            //FilteredElementCollector collector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType();

            IList <Element> _elements = uiDoc.Selection.PickElementsByRectangle(new WallFilter(), "请框选所有需要剪切管道的墙");

            foreach (var awall in _elements)
            {
                //FilteredElementCollector collector2 = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeAccessory).WhereElementIsNotElementType();
                var collector2          = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeAccessory).OfClass(typeof(FamilyInstance));
                var pipeIntersectFilter = new ElementIntersectsElementFilter(awall);
                //在所有Pipe中过滤出和每一个墙相交的Pipe然后组成集合
                List <FamilyInstance> pipes = collector2.WherePasses(pipeIntersectFilter).ToList().ConvertAll(x => x as FamilyInstance);

                foreach (var pipe in pipes)
                {
                    InstanceVoidCutUtils.AddInstanceVoidCut(doc, awall, pipe);
                }
            }

            //try
            //{
            //  foreach (var element in selection.GetElementIds())
            //  {

            //    InstanceVoidCutUtils.AddInstanceVoidCut(doc, beam, cuttingInstance);
            //  }
            //}

            //catch (Exception e)
            //{
            //  message = e.Message;
            //  return Result.Failed;
            //}

            //TaskDialog.Show("Hello", "Hello Revit!");
            ts.Commit();
            return(Result.Succeeded);
        }
Exemplo n.º 11
0
        protected void PlaceOpeningFamilies(IEnumerable <Intersection> intersections)
        {
            var  log_param  = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров размеров");
            var  log_id     = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров id");
            var  log_level  = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров уровня");
            var  log_cut    = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка вырезания");
            bool unpinFlag  = false;
            bool unpinAsked = false;

            foreach (Intersection i in intersections)
            {
                Element holeElement;
                if (IsExisted(i))
                {
                    holeElement = ExistingOpenings.Where(x => x.LookupParameter("ТеррНИИ_Идентификатор").AsString() == i.Id.ToString()).First();
                    LocationPoint loc = holeElement.Location as LocationPoint;
                    XYZ           vec = new XYZ(i.InsertionPoint.X,
                                                i.InsertionPoint.Y,
                                                i.Level.ProjectElevation) - loc.Point;

                    if (!unpinAsked)
                    {
                        TaskDialog td = new TaskDialog("Обнаружены закрепленные");
                        td.MainInstruction = "В отчете найдены отверстия, которые уже существуют в проекте и которые закреплены";
                        td.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Открепить и обновить отверстия");
                        td.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "Оставить без изменений");
                        var res = td.Show();
                        unpinFlag  = res == TaskDialogResult.CommandLink1;
                        unpinAsked = true;
                    }

                    if (holeElement.Pinned && unpinFlag)
                    {
                        holeElement.Pinned = false;
                        ElementTransformUtils.MoveElement(doc, holeElement.Id, vec);
                    }
                    else if (!holeElement.Pinned)
                    {
                        ElementTransformUtils.MoveElement(doc, holeElement.Id, vec);
                    }
                }
                else
                {
                    holeElement = doc.Create.NewFamilyInstance(
                        new XYZ(
                            i.InsertionPoint.X,
                            i.InsertionPoint.Y,
                            i.Level.Elevation),
                        openingFamilySymbol,
                        i.Level,
                        StructuralType.NonStructural);
                    // поворачиваем на нужную позицию
                    Line axe = Line.CreateUnbound(i.InsertionPoint, XYZ.BasisZ);
                    ElementTransformUtils.RotateElement(doc, holeElement.Id, axe, i.Angle);

                    //делаем вырез в хосте
                    try
                    {
                        if (i.HasHosts)
                        {
                            foreach (var host in i.Hosts)
                            {
                                InstanceVoidCutUtils.AddInstanceVoidCut(doc, host, holeElement);
                            }
                        }
                    }
                    catch
                    {
                        log_cut.AddError(i.Id);
                    }
                }
                try
                {
                    //идентификация
                    holeElement.LookupParameter("ТеррНИИ_Идентификатор")?.Set(i.Id.ToString());
                    holeElement.LookupParameter("Связанный файл")?.Set(i.Name);
                }
                catch { log_id.AddError(i.Id); }


                try
                {
                    // задаем параметры
                    holeElement.LookupParameter("ADSK_Отверстие_Ширина").Set(i.HoleWidth);
                    holeElement.LookupParameter("ADSK_Отверстие_Высота").Set(i.HoleHeight);
                    holeElement.LookupParameter("ADSK_Толщина стены").Set(i.HoleDepth);
                    // (временно) работа с отверстиями в кирпиче
                    holeElement.LookupParameter("ТеррНИИ_Отверстие_В кирпиче")?.Set(1);
                }
                catch { log_param.AddError(i.Id); }

                try
                {
                    // назначаем отметки
                    holeElement.LookupParameter("ADSK_Отверстие_Отметка от этажа").Set(i.LevelOffset);
                    if (i.Level.Elevation == 0)
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(0);
                    }
                    else
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(i.Level.Elevation);
                    }
                    // обнуляем смещение
                    holeElement.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(0);
                }
                catch { log_level.AddError(i.Id); }
            }
        }
Exemplo n.º 12
0
        Result IExternalCommand.Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document    revitDoc = commandData.Application.ActiveUIDocument.Document; //取得文档
            Application revitApp = commandData.Application.Application;               //取得应用程序
            UIDocument  uiDoc    = commandData.Application.ActiveUIDocument;          //取得当前活动文档

            UIApplication uiApp = commandData.Application;

            //载入族轮廓并激活
            string file1 = @"C:\Users\zyx\Desktop\2RevitArcBridge\Test\Test\xxxx.rfa"; //轮廓族的文件路径来这里输入一下
            string file2 = @"C:\Users\zyx\Desktop\2RevitArcBridge\Test\Test\aaaa.rfa"; //轮廓族的文件路径来这里输入一下

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            IList <Reference> modelLines = null;

            //新建一个窗口
            Window1 window1 = new Window1();

            if (window1.ShowDialog() == true)
            {
                //窗口打开并停留,只有点击按键之后,窗口关闭并返回true
            }


            //按键会改变window的属性,通过对属性的循环判断来实现对按键的监测
            while (!window1.Done)
            {
                //选择平曲线
                if (window1.FlatCurveSelected)
                {
                    //因为要对原有模型线进行一个删除是对文件进行一个删除,故要创建一个事件
                    using (Transaction transaction = new Transaction(uiDoc.Document))
                    {
                        transaction.Start("选择平曲线");

                        //选择平曲线
                        Selection sel = uiDoc.Selection;
                        modelLines = sel.PickObjects(ObjectType.Element, "选一组模型线");

                        //2、重置window1.FlatCurve

                        window1.FlatCurveSelected = false;


                        transaction.Commit();
                    }
                }

                if (window1.ShowDialog() == true)
                {
                    //窗口打开并停留,只有点击按键之后,窗口关闭并返回true
                }
            }



            List <FamilySymbol> fList1 = new List <FamilySymbol>();
            List <FamilySymbol> fList2 = new List <FamilySymbol>();

            //对每条模型线进行放样拉伸
            foreach (Reference reference in modelLines)
            {
                Element      elem         = revitDoc.GetElement(reference);
                CurveElement curveElement = elem as CurveElement;

                //在项目中创建公制常规模型
                FamilySymbol familySymbol1 = createSweepFamilySymbol(commandData, curveElement, file1, true);
                FamilySymbol familySymbol2 = createSweepFamilySymbol(commandData, curveElement, file2, false);

                fList1.Add(familySymbol1);
                fList2.Add(familySymbol2);
            }



            //族实例激活并放到指定位置;剪切
            for (int i = 0; i < fList1.Count(); i++)
            {
                FamilyInstance familyInstance2;
                string         tName = i + "族实例放样";
                using (Transaction transaction = new Transaction(revitDoc))
                {
                    transaction.Start(tName);

                    //在项目中激活族并放置到位
                    fList1[i].Activate();
                    fList2[i].Activate();

                    FamilyInstance familyInstance1 = revitDoc.Create.NewFamilyInstance(XYZ.Zero, fList1[i], Autodesk.Revit.DB.Structure.StructuralType.NonStructural);
                    familyInstance2 = revitDoc.Create.NewFamilyInstance(XYZ.Zero, fList2[i], Autodesk.Revit.DB.Structure.StructuralType.NonStructural);

                    transaction.Commit();
                }

                tName = i + "剪切";
                using (Transaction transaction = new Transaction(revitDoc))
                {
                    transaction.Start(tName);

                    Selection selend   = uiDoc.Selection;
                    Reference refend   = selend.PickObject(ObjectType.Element, "选择族实例");
                    Element   elemet1  = revitDoc.GetElement(refend);
                    Element   element2 = revitDoc.GetElement(familyInstance2.Id);

                    InstanceVoidCutUtils.AddInstanceVoidCut(revitDoc, elemet1, element2);//空心剪切

                    transaction.Commit();
                }
            }


            return(Result.Succeeded);
        }
Exemplo n.º 13
0
        /// <summary>
        /// Cut a beam with three instances of a void
        /// cutting family. Its family parameter "Cut
        /// with Voids When Loaded" must be set to true.
        /// </summary>
        static void CutBeamWithVoid(
            FamilyInstance beam,
            FamilySymbol cuttingSymbol)
        {
            Document doc = beam.Document;

            Level level = doc.GetElement(beam.LevelId)
                          as Level;

            LocationCurve lc = beam.Location
                               as LocationCurve;

            Curve beamCurve = lc.Curve;

            Debug.Print("Beam location from {0} to {1}.",
                        PointString(beamCurve.GetEndPoint(0)),
                        PointString(beamCurve.GetEndPoint(1)));

            XYZ    p;
            int    n = 3;
            string parameter_name;

            ElementId[] ids = new ElementId[n];

            using (Transaction tx = new Transaction(doc))
            {
                tx.Start("Create Cutting Instances and Apply Cut");

                for (int i = 1; i <= n; ++i)
                {
                    // Position on beam for this cutting instance

                    p = beamCurve.Evaluate(i * 0.25, true);

                    // Adjust height for top-aligned curve

                    //p = p - XYZ.BasisZ;

                    Debug.Print(
                        "Family instance insertion at {0}.",
                        PointString(p));

                    FamilyInstance cuttingInstance = doc.Create
                                                     .NewFamilyInstance(p, cuttingSymbol,
                                                                        level, StructuralType.NonStructural);

                    parameter_name = "A" + i.ToString();

                    cuttingInstance
                    .get_Parameter(parameter_name)
                    .Set(0.5 * Math.PI);

                    ids[i - 1] = cuttingInstance.Id;
                }

                doc.Regenerate();

                //  tx.Commit();
                //}

                //using( Transaction tx = new Transaction( doc ) )
                //{
                //  tx.Start( "Cut Beam With Voids" );

                for (int i = 0; i < n; ++i)
                {
                    InstanceVoidCutUtils.AddInstanceVoidCut(
                        doc, beam, doc.GetElement(ids[i]));
                }
                tx.Commit();
            }
        }
Exemplo n.º 14
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;

            _uidoc = uiapp.ActiveUIDocument;
            _doc   = _uidoc.Document;

            try
            {
                using (TransactionGroup transGroup = new TransactionGroup(_doc))
                {
                    transGroup.Start("Placing a void family");

                    using (var trans = new Transaction(_doc))
                    {
                        trans.Start("Placing a void family");

                        FamilyInstance fi = CreateVoid(GetFamilySymbol());
                        fi.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(UnitUtils.ConvertToInternalUnits(100, DisplayUnitType.DUT_MILLIMETERS));
                        fi.LookupParameter("width")?.Set(UnitUtils.ConvertToInternalUnits(300, DisplayUnitType.DUT_MILLIMETERS));
                        fi.LookupParameter("length")?.Set(UnitUtils.ConvertToInternalUnits(300, DisplayUnitType.DUT_MILLIMETERS));
                        fi.LookupParameter("depth")?.Set(UnitUtils.ConvertToInternalUnits(700, DisplayUnitType.DUT_MILLIMETERS));

                        if (trans.Commit() != TransactionStatus.Committed)
                        {
                            return(Result.Failed);
                        }

                        IEnumerable <Element> intersects = GetIntersectsBoundingBox(fi);

                        trans.Start("Adding cuts");

                        foreach (Element intersect in intersects)
                        {
                            if (InstanceVoidCutUtils.CanBeCutWithVoid(intersect))
                            {
                                InstanceVoidCutUtils.AddInstanceVoidCut(_doc, intersect, fi);
                            }
                        }

                        if (trans.Commit() != TransactionStatus.Committed)
                        {
                            return(Result.Failed);
                        }
                    }

                    transGroup.Assimilate();
                }
            }
            catch (OperationCanceledException)
            {
                return(Result.Failed);
            }
            catch (Exception e)
            {
                e.ShowRevitDialog();
                return(Result.Failed);
            }

            return(Result.Succeeded);
        }
Exemplo n.º 15
0
        protected void PlaceOpeningFamilies(IEnumerable <Intersection> intersections)
        {
            var log_param = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров размеров");
            var log_id    = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров id");
            var log_level = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров уровня");
            var log_cut   = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка вырезания");

            foreach (Intersection i in intersections)
            {
                Element holeElement;
                if (IsExisted(i))
                {
                    holeElement = ExistingOpenings.Where(x => x.LookupParameter("ТеррНИИ_Идентификатор").AsString() == i.Id.ToString()).First();
                    LocationPoint loc = holeElement.Location as LocationPoint;
                    XYZ           vec = new XYZ(i.InsertionPoint.X,
                                                i.InsertionPoint.Y,
                                                i.Level.ProjectElevation) - loc.Point;
                    ElementTransformUtils.MoveElement(doc, holeElement.Id, vec);
                }
                else
                {
                    holeElement = doc.Create.NewFamilyInstance(
                        new XYZ(
                            i.InsertionPoint.X,
                            i.InsertionPoint.Y,
                            i.Level.Elevation),
                        openingFamilySymbol,
                        i.Level,
                        StructuralType.NonStructural);
                    // поворачиваем на нужную позицию
                    Line axe = Line.CreateUnbound(i.InsertionPoint, XYZ.BasisZ);
                    ElementTransformUtils.RotateElement(doc, holeElement.Id, axe, i.Angle);

                    //делаем вырез в хосте
                    try
                    {
                        if (i.HasHosts)
                        {
                            foreach (var host in i.Hosts)
                            {
                                InstanceVoidCutUtils.AddInstanceVoidCut(doc, host, holeElement);
                            }
                        }
                    }
                    catch
                    {
                        log_cut.AddError(i.Id);
                    }
                }
                try
                {
                    //идентификация
                    holeElement.LookupParameter("ТеррНИИ_Идентификатор")?.Set(i.Id.ToString());
                    holeElement.LookupParameter("Связанный файл")?.Set(i.Name);
                }
                catch { log_id.AddError(i.Id); }


                try
                {
                    // задаем параметры
                    holeElement.LookupParameter("ADSK_Отверстие_Ширина").Set(i.HoleWidth);
                    holeElement.LookupParameter("ADSK_Отверстие_Высота").Set(i.HoleHeight);
                    holeElement.LookupParameter("ADSK_Толщина стены").Set(i.HoleDepth);
                    // (временно) работа с отверстиями в кирпиче
                    holeElement.LookupParameter("ТеррНИИ_Отверстие_В кирпиче")?.Set(1);
                }
                catch { log_param.AddError(i.Id); }

                try
                {
                    // назначаем отметки
                    holeElement.LookupParameter("ADSK_Отверстие_Отметка от этажа").Set(i.LevelOffset);
                    if (i.Level.Elevation == 0)
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(0);
                    }
                    else
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(i.Level.Elevation);
                    }
                    // обнуляем смещение
                    holeElement.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(0);
                }
                catch { log_level.AddError(i.Id); }
            }
        }