public virtual void SetParameters(IXDocument model, IXCustomFeature feat, object parameters, out CustomFeatureOutdateState_e state) { CustomFeatureParameter[] param; IXSelObject[] selection; CustomFeatureDimensionType_e[] dimTypes; double[] dimValues; IXBody[] bodies; Parse(parameters, out param, out selection, out dimTypes, out dimValues, out bodies); var dispDims = GetDimensions(feat); var dimsVersion = GetDimensionsVersion(feat); ConvertParameters(parameters.GetType(), dimsVersion, conv => { dispDims = conv.ConvertDisplayDimensions(model, feat, dispDims); }); if (dispDims != null) { if (dispDims.Length != dimValues.Length) { throw new ParametersMismatchException("Dimensions mismatch"); } } state = GetState(feat, dispDims); SetParametersToFeature(feat, selection, bodies, dispDims, dimValues, param); }
public override object GetParameters(IXCustomFeature feat, IXDocument model, Type paramsType, out IXDimension[] dispDims, out string[] dispDimParams, out IXBody[] editBodies, out IXSelObject[] sels, out CustomFeatureOutdateState_e state) { dispDims = null; try { return(base.GetParameters(feat, model, paramsType, out dispDims, out dispDimParams, out editBodies, out sels, out state)); } catch (Exception ex) { if (dispDims != null) { foreach (SwDimension dim in dispDims) { dim.Dispose(); } } m_Logger.Log(ex); throw; } }
public virtual object GetParameters(IXCustomFeature feat, IXDocument model, Type paramsType, out IXDimension[] dispDims, out string[] dispDimParams, out IXBody[] editBodies, out IXSelObject[] sels, out CustomFeatureOutdateState_e state) { var dispDimParamsMap = new SortedDictionary <int, string>(); Dictionary <string, object> featRawParams; IXDimension[] featDims; IXSelObject[] featSels; IXBody[] featBodies; ExtractRawParameters(feat, model, out featRawParams, out featDims, out featSels, out featBodies); var parameters = new Dictionary <string, string>(); var paramsVersion = new Version(); var dimsVersion = new Version(); if (featRawParams?.Any() == true) { foreach (var featRawParam in featRawParams) { var paramName = featRawParam.Key; //TODO: think about conversion var paramVal = featRawParam.Value?.ToString(); if (paramName == VERSION_PARAMETERS_NAME) { paramsVersion = new Version(paramVal); } else if (paramName == VERSION_DIMENSIONS_NAME) { paramsVersion = new Version(paramVal); } else { parameters.Add(paramName, paramVal); } } } ConvertParameters(paramsType, paramsVersion, conv => { parameters = conv.ConvertParameters(model, feat, parameters); featBodies = conv.ConvertEditBodies(model, feat, featBodies); featSels = conv.ConvertSelections(model, feat, featSels); featDims = conv.ConvertDisplayDimensions(model, feat, featDims); }); var resParams = Activator.CreateInstance(paramsType); TraverseParametersDefinition(resParams.GetType(), (prp) => { AssignObjectsToProperty(resParams, featSels, prp, parameters); }, (dimType, prp) => { var dimIndices = GetObjectIndices(prp, parameters); if (dimIndices.Length != 1) { throw new InvalidOperationException( "It could only be one index associated with dimension"); } var dimInd = dimIndices.First(); if (featDims.Length > dimInd) { var dispDim = featDims[dimInd]; //TODO: work with current configuration when assembly is supported var val = dispDim.GetValue(); if (!double.IsNaN(val)) { prp.SetValue(resParams, val, null); } dispDimParamsMap.Add(dimInd, prp.Name); } else { throw new IndexOutOfRangeException( $"Dimension at index {dimInd} id not present in the macro feature"); } }, (prp) => { AssignObjectsToProperty(resParams, featBodies, prp, parameters); }, prp => { var paramVal = GetParameterValue(parameters, prp.Name); object val = null; if (paramVal != null) { if (prp.PropertyType.IsEnum) { val = Enum.Parse(prp.PropertyType, paramVal); } else { val = Convert.ChangeType(paramVal, prp.PropertyType); } } prp.SetValue(resParams, val, null); }); dispDims = featDims; editBodies = featBodies; sels = featSels; state = GetState(feat, featDims); dispDimParams = dispDimParamsMap.Values.ToArray(); return(resParams); }