|
@@ -12,6 +12,7 @@ using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
+using System.Reflection;
|
|
|
using System.Windows.Forms;
|
|
|
using Autodesk.Revit.DB;
|
|
|
using Autodesk.Revit.DB.ExtensibleStorage;
|
|
@@ -47,8 +48,10 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
{
|
|
|
fieldBuilder.SetUnitType(UnitType.UT_Number);
|
|
|
}
|
|
|
+
|
|
|
schema = schemaBuilder.Finish();
|
|
|
}
|
|
|
+
|
|
|
Entity entity = new Entity(schema);
|
|
|
Field field = schema.GetField(dataEnum.ToString());
|
|
|
if (isDouble || isXyz)
|
|
@@ -59,6 +62,7 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
{
|
|
|
entity.Set<T>(field, value);
|
|
|
}
|
|
|
+
|
|
|
element.SetEntity(entity);
|
|
|
}
|
|
|
|
|
@@ -87,14 +91,17 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
{
|
|
|
fieldBuilder.SetUnitType(UnitType.UT_Number);
|
|
|
}
|
|
|
+
|
|
|
schema = schemaBuilder.Finish();
|
|
|
}
|
|
|
+
|
|
|
Entity entity = new Entity(schema);
|
|
|
Field field = schema.GetField(dataEnum.ToString());
|
|
|
if (isDouble || isXyz)
|
|
|
{
|
|
|
entity.Set<IList<T>>(field, values, DisplayUnitType.DUT_GENERAL);
|
|
|
}
|
|
|
+
|
|
|
entity.Set<IList<T>>(field, values);
|
|
|
try
|
|
|
{
|
|
@@ -134,14 +141,17 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
{
|
|
|
fieldBuilder.SetUnitType(UnitType.UT_Number);
|
|
|
}
|
|
|
+
|
|
|
schema = schemaBuilder.Finish();
|
|
|
}
|
|
|
+
|
|
|
Entity entity = new Entity(schema);
|
|
|
Field field = schema.GetField(dataEnum.ToString());
|
|
|
if (isDouble || isXyz)
|
|
|
{
|
|
|
entity.Set<IDictionary<T, TU>>(field, dict, DisplayUnitType.DUT_GENERAL);
|
|
|
}
|
|
|
+
|
|
|
entity.Set<IDictionary<T, TU>>(field, dict);
|
|
|
element.SetEntity(entity);
|
|
|
}
|
|
@@ -165,6 +175,7 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
return entity.Get<T>(field, DisplayUnitType.DUT_GENERAL);
|
|
|
return entity.Get<T>(field);
|
|
|
}
|
|
|
+
|
|
|
return default(T);
|
|
|
}
|
|
|
|
|
@@ -182,7 +193,8 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
{
|
|
|
Entity entity = element.GetEntity(schema);
|
|
|
Field field = schema.GetField(dataEnum.ToString());
|
|
|
- if (typeof(T) == typeof(double) || typeof(T) == typeof(XYZ)) return entity.Get<IList<T>>(field, DisplayUnitType.DUT_GENERAL).ToList();
|
|
|
+ if (typeof(T) == typeof(double) || typeof(T) == typeof(XYZ))
|
|
|
+ return entity.Get<IList<T>>(field, DisplayUnitType.DUT_GENERAL).ToList();
|
|
|
try
|
|
|
{
|
|
|
return entity.Get<IList<T>>(field).ToList();
|
|
@@ -193,6 +205,7 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -217,8 +230,10 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
{
|
|
|
return entity.Get<IDictionary<T, TU>>(field, DisplayUnitType.DUT_GENERAL) as Dictionary<T, TU>;
|
|
|
}
|
|
|
+
|
|
|
return entity.Get<IDictionary<T, TU>>(field) as Dictionary<T, TU>;
|
|
|
}
|
|
|
+
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -235,7 +250,7 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
/// </summary>
|
|
|
/// <param name="element"></param>
|
|
|
/// <param name="dataEnum"></param>
|
|
|
- public static void DeleteStorageData(this Element element,Enum dataEnum)
|
|
|
+ public static void DeleteStorageData(this Element element, Enum dataEnum)
|
|
|
{
|
|
|
Schema schema = Schema.Lookup(dataEnum.GetGuid());
|
|
|
if (schema != null)
|
|
@@ -243,5 +258,176 @@ namespace SAGA.RevitUtils.ExtensibleStorage
|
|
|
element.DeleteEntity(schema);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 存储简单对象数据
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="element"></param>
|
|
|
+ /// <param name="value"></param>
|
|
|
+ public static void SetSimpleClass<T>(this Element element, T value)
|
|
|
+ {
|
|
|
+ var useType = typeof(T);
|
|
|
+ Guid guid = useType.GUID;
|
|
|
+ Schema schema = Schema.Lookup(guid);
|
|
|
+
|
|
|
+ #region 初始化属性集合
|
|
|
+
|
|
|
+ List<Tuple<string, Type, object>> useProperties = new List<Tuple<string, Type, object>>();
|
|
|
+ if (ExtensibleStorageUtil.IsCoustomStorage(useType))
|
|
|
+ {
|
|
|
+ var useValue = ((ICoustomStorage) value).GetStorage();
|
|
|
+ var propertyType = useValue.GetType();
|
|
|
+ useProperties.Add(new Tuple<string, Type, object>(useType.Name, propertyType, useValue));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var properties = useType.GetProperties();
|
|
|
+ foreach (var propertyInfo in properties)
|
|
|
+ {
|
|
|
+ var propertyType = propertyInfo.PropertyType;
|
|
|
+ var useValue = propertyInfo.GetValue(value);
|
|
|
+ useProperties.Add(new Tuple<string, Type, object>(propertyInfo.Name, propertyType, useValue));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 创建结构
|
|
|
+ if (schema == null)
|
|
|
+ {
|
|
|
+ #region 创建Schema
|
|
|
+
|
|
|
+ SchemaBuilder schemaBuilder = new SchemaBuilder(guid);
|
|
|
+ schemaBuilder.SetReadAccessLevel(AccessLevel.Public);
|
|
|
+ schemaBuilder.SetWriteAccessLevel(AccessLevel.Public);
|
|
|
+ schemaBuilder.SetSchemaName(useType.Name);
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ foreach (var item in useProperties)
|
|
|
+ {
|
|
|
+ var propertyType = item.Item2;
|
|
|
+ if (ExtensibleStorageUtil.IsEffectiveContent(propertyType))
|
|
|
+ {
|
|
|
+ FieldBuilder fieldBuilder = schemaBuilder.AddSimpleField(item.Item1, propertyType);
|
|
|
+ }
|
|
|
+ else if (ExtensibleStorageUtil.IsEffectiveArray(propertyType, out Type arryContentType))
|
|
|
+ {
|
|
|
+ FieldBuilder fieldBuilder = schemaBuilder.AddArrayField(item.Item1, arryContentType);
|
|
|
+ }
|
|
|
+ else if (ExtensibleStorageUtil.IsEffectiveMap(propertyType, out Type keyType, out Type valueType))
|
|
|
+ {
|
|
|
+ FieldBuilder fieldBuilder = schemaBuilder.AddMapField(item.Item1, keyType, valueType);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ schema = schemaBuilder.Finish();
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 创建对象
|
|
|
+ Entity entity = new Entity(schema);
|
|
|
+ var method = ExtensibleStorageUtil.GetEntitySetMethod();
|
|
|
+ foreach (var item in useProperties)
|
|
|
+ {
|
|
|
+ var field = schema.GetField(item.Item1);
|
|
|
+ if (field == null)
|
|
|
+ continue;
|
|
|
+ var fieldType = ExtensibleStorageUtil.GetFileType(field);
|
|
|
+ MethodInfo mi = method.MakeGenericMethod(fieldType);
|
|
|
+ var useValue = item.Item3;
|
|
|
+ if (useValue != null)
|
|
|
+ {
|
|
|
+ mi.Invoke(entity, new object[] { item.Item1,useValue });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ element.SetEntity(entity);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取简单对象数据
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="element"></param>
|
|
|
+ public static T GetSimpleClass<T>(this Element element)
|
|
|
+ {
|
|
|
+ var useType = typeof(T);
|
|
|
+ Guid guid = useType.GUID;
|
|
|
+ Schema schema = Schema.Lookup(guid);
|
|
|
+ if (schema == null)
|
|
|
+ {
|
|
|
+ return default(T);
|
|
|
+ }
|
|
|
+ Entity entity = element.GetEntity(schema);
|
|
|
+ if (entity?.Schema == null)
|
|
|
+ {
|
|
|
+ return default(T);
|
|
|
+ }
|
|
|
+ var fields = schema.ListFields();
|
|
|
+ #region 创建实体对象
|
|
|
+ T result = default(T);
|
|
|
+ if (fields.Any())
|
|
|
+ {
|
|
|
+ var cons = useType.GetConstructor(Type.EmptyTypes);
|
|
|
+ if (cons != null)
|
|
|
+ {
|
|
|
+ result = (T)cons.Invoke(null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (result == null)
|
|
|
+ {
|
|
|
+ return default(T);
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ var getMethod = typeof(Entity).GetMethod("Get", new Type[] {typeof(string)});
|
|
|
+ if (ExtensibleStorageUtil.IsCoustomStorage(useType))
|
|
|
+ {
|
|
|
+ var field=fields.FirstOrDefault(f => f.FieldName == useType.Name);
|
|
|
+ if (field != null)
|
|
|
+ {
|
|
|
+ var useValueType = field.ValueType;
|
|
|
+ if (field.ContainerType == ContainerType.Array)
|
|
|
+ {
|
|
|
+ useValueType = typeof(IList<>).MakeGenericType(field.ValueType);
|
|
|
+ }
|
|
|
+ else if (field.ContainerType == ContainerType.Map)
|
|
|
+ {
|
|
|
+ useValueType = typeof(IDictionary<,>).MakeGenericType(field.KeyType,field.ValueType);
|
|
|
+ }
|
|
|
+ MethodInfo mi = getMethod.MakeGenericMethod(useValueType);
|
|
|
+ var useValue = mi.Invoke(entity, new object[] { field.FieldName});
|
|
|
+ ((ICoustomStorage)result).SetStorage(useValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ foreach (var field in fields)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var property = useType.GetProperty(field.FieldName);
|
|
|
+
|
|
|
+ if (property != null)
|
|
|
+ {
|
|
|
+ MethodInfo mi = getMethod.MakeGenericMethod(property.PropertyType);
|
|
|
+ var useValue = mi.Invoke(entity, new object[] { field.FieldName });
|
|
|
+ property.SetValue(result, useValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|
|
|
}
|