Пример #1
0
        public override bool CastTo <Q>(ref Q target)
        {
            if (typeof(Q).IsSubclassOf(ScriptVariableType))
            {
                target = (Q)(object)Value;
                return(true);
            }

            if (typeof(Q).IsAssignableFrom(ScriptVariableType))
            {
                target = (Q)(object)Value;
                return(true);
            }

            switch (Value.StorageType)
            {
            case StorageType.Integer:
                if (typeof(Q).IsAssignableFrom(typeof(GH_Boolean)))
                {
                    target = Value.Element is null ? (Q)(object)null :
                             (Q)(object)new GH_Boolean(Value.AsInteger() != 0);
                    return(true);
                }
                else if (typeof(Q).IsAssignableFrom(typeof(GH_Integer)))
                {
                    target = Value.Element is null ? (Q)(object)null :
                             (Q)(object)new GH_Integer(Value.AsInteger());
                    return(true);
                }
                else if (typeof(Q).IsAssignableFrom(typeof(GH_Number)))
                {
                    target = Value.Element is null ? (Q)(object)null :
                             (Q)(object)new GH_Number((double)Value.AsInteger());
                    return(true);
                }
                else if (typeof(Q).IsAssignableFrom(typeof(GH_Colour)))
                {
                    if (Value.Element is object)
                    {
                        int value = Value.AsInteger();
                        int r     = value % 256;
                        value /= 256;
                        int g = value % 256;
                        value /= 256;
                        int b = value % 256;

                        target = (Q)(object)new GH_Colour(System.Drawing.Color.FromArgb(r, g, b));
                    }
                    else
                    {
                        target = (Q)(object)null;
                    }
                    return(true);
                }
                break;

            case StorageType.Double:
                if (typeof(Q).IsAssignableFrom(typeof(GH_Number)))
                {
                    target = Value.Element is null ? (Q)(object)null :
                             (Q)(object)new GH_Number(ToRhino(Value.AsDouble(), Value.Definition.ParameterType));
                    return(true);
                }
                else if (typeof(Q).IsAssignableFrom(typeof(GH_Integer)))
                {
                    if (Value.Element is object)
                    {
                        var value = Math.Round(ToRhino(Value.AsDouble(), Value.Definition.ParameterType));
                        if (int.MinValue <= value && value <= int.MaxValue)
                        {
                            target = (Q)(object)new GH_Integer((int)value);
                            return(true);
                        }
                    }
                    else
                    {
                        target = (Q)(object)null;
                        return(true);
                    }
                }
                break;

            case StorageType.String:
                if (typeof(Q).IsAssignableFrom(typeof(GH_String)))
                {
                    target = Value.Element is null ? (Q)(object)null :
                             (Q)(object)new GH_String(Value.AsString());
                    return(true);
                }
                break;

            case StorageType.ElementId:
                if (typeof(Q).IsSubclassOf(typeof(ID)))
                {
                    target = Value.Element is null ? (Q)(object)null :
                             (Q)(object)ID.Make(Value.AsElementId());
                    return(true);
                }
                break;
            }

            return(base.CastTo <Q>(ref target));
        }