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); }
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(); }
/* * 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); } }
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); }
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; } }
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(); }
public void Cutting(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.AddInstanceVoidCut(doc, framming, conn); } } catch { } } } tran.Commit(); }
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); } }
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); }
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); } } }
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); }
/// <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(); } }
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); }
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); } } }