예제 #1
0
 /// <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);
 }
예제 #2
0
 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);
 }
예제 #3
0
        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;
            }
        }
예제 #4
0
        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);
            }
        }