/// <inheritdoc cref="SetParameters(IModelDoc2, IFeature, IMacroFeatureData, TParams)"/> /// <param name="state">Current state of the parameters</param> protected void SetParameters(IModelDoc2 model, IFeature feat, IMacroFeatureData featData, TParams parameters, out MacroFeatureOutdateState_e state) { m_ParamsParser.SetParameters(model, feat, featData, parameters, out state); }
internal TParams GetParameters <TParams>(IFeature feat, IMacroFeatureData featData, IModelDoc2 model, out IDisplayDimension[] dispDims, out string[] dispDimParams, out IBody2[] editBodies, out MacroFeatureOutdateState_e state) where TParams : class, new() { return(GetParameters(feat, featData, model, typeof(TParams), out dispDims, out dispDimParams, out editBodies, out state) as TParams); }
internal object GetParameters(IFeature feat, IMacroFeatureData featData, IModelDoc2 model, Type paramsType, out IDisplayDimension[] dispDims, out string[] dispDimParams, out IBody2[] editBodies, out MacroFeatureOutdateState_e state) { object retParamNames = null; object retParamValues = null; object paramTypes = null; object retSelObj; object selObjType; object selMarks; object selDrViews; object compXforms; featData.GetParameters(out retParamNames, out paramTypes, out retParamValues); featData.GetSelections3(out retSelObj, out selObjType, out selMarks, out selDrViews, out compXforms); IDisplayDimension[] localDispDims = null; var dispDimParamsMap = new SortedDictionary <int, string>(); try { var dispDimsObj = featData.GetDisplayDimensions() as object[]; if (dispDimsObj != null) { localDispDims = new IDisplayDimension[dispDimsObj.Length]; for (int i = 0; i < localDispDims.Length; i++) { localDispDims[i] = dispDimsObj[i] as IDisplayDimension; dispDimsObj[i] = null; } } else { localDispDims = null; } object[] editBodiesObj = featData.EditBodies as object[]; IBody2[] localEditBodies = null; if (editBodiesObj != null) { localEditBodies = editBodiesObj.Cast <IBody2>().ToArray(); } var paramNames = retParamNames as string[]; var paramValues = retParamValues as string[]; var selObjects = retSelObj as object[]; var parameters = new Dictionary <string, string>(); var paramsVersion = new Version(); var dimsVersion = new Version(); if (paramNames != null && paramValues != null) { for (int i = 0; i < paramNames.Length; i++) { if (paramNames[i] == VERSION_PARAMETERS_NAME) { paramsVersion = new Version(paramValues[i]); } else if (paramNames[i] == VERSION_DIMENSIONS_NAME) { paramsVersion = new Version(paramValues[i]); } else { parameters.Add(paramNames[i], paramValues[i]); } } } ConvertParameters(paramsType, paramsVersion, conv => { parameters = conv.ConvertParameters(model, feat, parameters); localEditBodies = conv.ConvertEditBodies(model, feat, localEditBodies); selObjects = conv.ConvertSelections(model, feat, selObjects); localDispDims = conv.ConvertDisplayDimensions(model, feat, localDispDims); }); var resParams = Activator.CreateInstance(paramsType); TraverseParametersDefinition(resParams.GetType(), (prp) => { AssignObjectsToProperty(resParams, selObjects, 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 (localDispDims.Length > dimInd) { var dispDim = localDispDims[dimInd]; if (!(dispDim is DisplayDimensionPlaceholder)) { var dim = dispDim.GetDimension2(0); var val = (dim.GetSystemValue3( (int)swInConfigurationOpts_e.swSpecifyConfiguration, new string[] { featData.CurrentConfiguration.Name }) as double[])[0]; 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, localEditBodies, prp, parameters); }, prp => { var paramVal = GetParameterValue(parameters, prp.Name); var val = Convert.ChangeType(paramVal, prp.PropertyType); prp.SetValue(resParams, val, null); }); dispDims = localDispDims; editBodies = localEditBodies; state = GetState(featData, localDispDims); dispDimParams = dispDimParamsMap.Values.ToArray(); return(resParams); } catch { ReleaseDisplayDimensions(localDispDims); throw; } }
internal void SetParameters(IModelDoc2 model, IFeature feat, IMacroFeatureData featData, object parameters, out MacroFeatureOutdateState_e state) { string[] paramNames; int[] paramTypes; string[] paramValues; object[] selection; int[] dimTypes; double[] dimValues; IBody2[] bodies; Parse(parameters, out paramNames, out paramTypes, out paramValues, out selection, out dimTypes, out dimValues, out bodies); if (selection != null && selection.Any()) { var dispWraps = selection.Select(s => new DispatchWrapper(s)).ToArray(); featData.SetSelections2(dispWraps, new int[selection.Length], new IView[selection.Length]); } featData.EditBodies = bodies; var dispDimsObj = featData.GetDisplayDimensions() as object[]; IDisplayDimension[] dispDims = null; if (dispDimsObj != null) { dispDims = new IDisplayDimension[dispDimsObj.Length]; for (int i = 0; i < dispDimsObj.Length; i++) { dispDims[i] = dispDimsObj[i] as IDisplayDimension; dispDimsObj[i] = null; } } var dimsVersion = GetDimensionsVersion(featData); ConvertParameters(parameters.GetType(), dimsVersion, conv => { dispDims = conv.ConvertDisplayDimensions(model, feat, dispDims); }); if (dispDims != null) { try { if (dispDims.Length != dimValues.Length) { throw new ParametersMismatchException("Dimensions mismatch"); } for (int i = 0; i < dispDims.Length; i++) { var dispDim = dispDims[i]; if (!(dispDim is DisplayDimensionPlaceholder)) { SetAndReleaseDimension(dispDim, i, dimValues[i], featData.CurrentConfiguration.Name); } } } catch { ReleaseDisplayDimensions(dispDims); throw; } } state = GetState(featData, dispDims); if (paramNames.Any()) { //macro feature dimensions cannot be changed in the existing feature //reverting the dimensions version if (state.HasFlag(MacroFeatureOutdateState_e.Dimensions)) { var index = Array.IndexOf(paramNames, VERSION_DIMENSIONS_NAME); paramValues[index] = dimsVersion.ToString(); } featData.SetParameters(paramNames, paramTypes, paramValues); UpdateParameters(featData, paramNames, paramTypes, paramValues); } }