private static void SetParameterValue( Element element, Parameter parameter, NumerateData numerateData, int markNumber, bool isInstanceParameter) { if (element.GroupId != ElementId.InvalidElementId && parameter.Definition is InternalDefinition internalDefinition && isInstanceParameter) { // Параметр в группе меняем без разгруппировки, если: // 1 - это стандартный параметр "Марка" // 2 - это общий параметр проекта с включенным свойством "Значения могут меняться по экземплярам групп" if (!internalDefinition.VariesAcrossGroups && internalDefinition.BuiltInParameter != BuiltInParameter.ALL_MODEL_MARK) { // Невозможно изменить параметр экземпляра у элемента, расположенного в группе, если у параметра не // включено свойство "Значения могут меняться по экземплярам групп" или это не системный параметр "Марка" throw new ArgumentException(Language.GetItem(LangItem, "h16")); } } if (numerateData.Parameter.IsNumeric) { if (parameter.StorageType == StorageType.Integer) { parameter.Set(markNumber); } else if (parameter.StorageType == StorageType.Double) { #if R2017 || R2018 || R2019 || R2020 parameter.Set(UnitUtils.ConvertToInternalUnits(markNumber, parameter.DisplayUnitType)); #else parameter.Set(UnitUtils.ConvertToInternalUnits(markNumber, parameter.GetUnitTypeId())); #endif } } else { parameter.Set($"{numerateData.Prefix}{string.Format(numerateData.Format, markNumber)}{numerateData.Suffix}"); } }
private void ProceedNumeration( NumerateData numerateData, IDictionary <Element, int> elementsWithNewMarkNumber, bool canBeTypeParameter) { var uiDoc = _uiApplication.ActiveUIDocument; var doc = uiDoc.Document; try { _uiApplication.Application.FailuresProcessing += ApplicationOnFailuresProcessing; var resultService = new ResultService(); var transactionName = Language.GetFunctionLocalName(new ModPlusConnector()); if (string.IsNullOrEmpty(transactionName)) { transactionName = LangItem; } using (var transaction = new Transaction(doc)) { transaction.Start(transactionName); var typesToSkip = new List <ElementId>(); foreach (var pair in elementsWithNewMarkNumber) { try { var typeId = pair.Key.CanHaveTypeAssigned() ? pair.Key.GetTypeId() ?? ElementId.InvalidElementId : ElementId.InvalidElementId; if (typeId != ElementId.InvalidElementId && typesToSkip.Contains(typeId)) { continue; } if (numerateData.GetParameter(pair.Key, canBeTypeParameter, out var isInstanceParameter) is Parameter parameter) { if (!isInstanceParameter && typeId != ElementId.InvalidElementId) { typesToSkip.Add(typeId); } if (parameter.IsReadOnly) { // Параметр "..." имеет свойство "Только для чтения" у следующих элементов resultService.Add( $"{Language.GetItem("h14")} \"{numerateData.Parameter.Name}\" {Language.GetItem("h15")}:", pair.Key.Id.IntegerValue.ToString(), ResultItemType.Info); } else { SetParameterValue(pair.Key, parameter, numerateData, pair.Value, isInstanceParameter); } } } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { // ignore } catch (Exception exception) { // При изменении значения параметров перечисленных элементов произошли ошибки resultService.Add( $"{Language.GetItem("h17")}: {exception.Message}", pair.Key.Id.IntegerValue.ToString(), ResultItemType.Error); } } transaction.Commit(); } resultService.ShowByType(); _uiApplication.Application.FailuresProcessing -= ApplicationOnFailuresProcessing; } catch (Exception exception) { ExceptionBox.Show(exception); } }