VCExtensibleStorageExtension icon indicating copy to clipboard operation
VCExtensibleStorageExtension copied to clipboard

Object not set to a reference when using multiple classes

Open Sennevds opened this issue 7 years ago • 1 comments

I'm trying to use your extension and saving my data works perfect but when I try to retreive the data back I get Object not set to a reference. I have the following classes:

[Schema("74b729c1-60eb-4a67-bc75-70e0b76cfbcb",
    "ViewClassSchema")]
    [ImplementPropertyChanged]
    public class ViewClass: IRevitEntity
    {
        [Field]
        public string Name { get; set; }

        [Field]
        public bool IsActive { get; set; }

        [Field]
        public ElementId Id { get; set; }
    }

    [Schema("518F465C-8E3A-49AC-BA9E-0431036968C8",
    "SetSchema")]
    [ImplementPropertyChanged]
    public class Set : IRevitEntity
    {
        [Field]
        public string Name { get; set; }

        [Field]
        public ObservableCollection<SetCondition> Rules { get; set; }

        [Field]
        public SetCondition InverseRule { get; set; }

        [Field]
        public List<ViewClass> SelectedCategories { get; set; }

        [Field]
        public ParameterClass SelectedParameter { get; set; }
        
    }

    [Schema("12286B88-454A-46CA-AF5E-C90C58AA0B31",
    "SetConditionSchema")]
    [ImplementPropertyChanged]
    public class SetCondition : IRevitEntity
    {
        [Field]
        public bool IsActive { get; set; }

        [Field]
        public string Value { get; set; }

        [Field]
        public int Type { get; set; }

        private System.Windows.Media.Color filterColor;
        public System.Windows.Media.Color FilterColor
        {
            get
            {
                return filterColor;
            }
            set
            {
                filterColor = value;
                FilterColorA = filterColor.A;
                FilterColorR = filterColor.R;
                FilterColorG = filterColor.G;
                FilterColorB = filterColor.B;
            }
        }

        [Field]
        public int FilterColorR { get; set; }

        [Field]
        public int FilterColorG { get; set; }

        [Field]
        public int FilterColorB { get; set; }

        [Field]
        public int FilterColorA { get; set; }
    }

    [Schema("94e42b1e-ce3a-48c7-926a-8fb94869b0d3",
    "ParameterClassSchema")]
    [ImplementPropertyChanged]
    public class ParameterClass : IRevitEntity
    {
        [Field]
        public string Name { get; set; }

        [Field]
        public ElementId Id { get; set; }
    }

I've debugged the code and it fails when retreiving the data for the InverseRule. In the following method: private object GetEntityFieldValue(Entity entity, Field field, Type fieldValueType) the code tries to retrieve the entityValue but it has no Schema and no Guid. The unittype of the field is UT_Undefined

Edit: Found why it's crashing: If an object is null it gets a valid entityvalue but the Schema and Guid are empty. In public TRevitEntity Convert<TRevitEntity>(Entity entity) where TRevitEntity : class, IRevitEntity you check if the entityValue is empty but not if the schema is empty if you add that extra check it works

Sennevds avatar May 04 '17 10:05 Sennevds

I created a pull request with the extra check #2

Sennevds avatar May 04 '17 12:05 Sennevds