Example #1
0
        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);
        }
Example #2
0
        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;
            }
        }
Example #3
0
        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);
        }