public T ParseJObject <T>(JObject obj) where T : IBaseClassIfc
{
if (obj == null)
{
return(default(T));
}
BaseClassIfc result = null;
JToken token = obj.GetValue("href", StringComparison.InvariantCultureIgnoreCase);
if (token != null)
{
if (token.Type == JTokenType.Integer)
{
int index = token.Value <int>();
result = this[index];
}
else if (token.Type == JTokenType.String)
{
mDictionary.TryGetValue(token.Value <string>(), out result);
}
if (result != null && obj.Count == 1)
{
return((T)(IBaseClassIfc)result);
}
}
if (result == null)
{
Type type = null;
token = obj.GetValue("type", StringComparison.InvariantCultureIgnoreCase);
if (token != null)
{
string keyword = token.Value <string>();
type = Type.GetType("GeometryGym.Ifc." + keyword, false, true);
}
if (token == null)
{
type = typeof(T);
}
if (type != null && !type.IsAbstract)
{
ConstructorInfo constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, Type.EmptyTypes, null);
if (constructor != null)
{
result = constructor.Invoke(new object[] { }) as BaseClassIfc;
if (result != null)
{
result.mDatabase = this;
token = obj.GetValue("id", StringComparison.InvariantCultureIgnoreCase);
int index = 0; // (int) (this.mIfcObjects.Count * 1.2);
if (token != null)
{
if (token.Type == JTokenType.Integer)
{
try
{
int i = token.Value <int>();
if (this[i] == null)
{
index = i;
}
}
catch (Exception) { }
// TODO merge if existing equivalent
}
else if (token.Type == JTokenType.String)
{
result.mGlobalId = token.Value <string>();
mDictionary.TryAdd(result.mGlobalId, result);
}
}
IfcCartesianPoint point = result as IfcCartesianPoint;
IfcDirection direction = result as IfcDirection;
IfcAxis2Placement3D placement = result as IfcAxis2Placement3D;
if (index == 0)
{
if (point != null)
{
point.parseJObject(obj);
if (point.isOrigin)
{
if (point.is2D)
{
return((T)(IBaseClassIfc)Factory.Origin2d);
}
return((T)(IBaseClassIfc)Factory.Origin);
}
}
else
{
if (direction != null)
{
direction.parseJObject(obj);
if (!direction.is2D)
{
if (direction.isXAxis)
{
return((T)(IBaseClassIfc)Factory.XAxis);
}
if (direction.isYAxis)
{
return((T)(IBaseClassIfc)Factory.YAxis);
}
if (direction.isZAxis)
{
return((T)(IBaseClassIfc)Factory.ZAxis);
}
if (direction.isXAxisNegative)
{
return((T)(IBaseClassIfc)Factory.XAxisNegative);
}
if (direction.isYAxisNegative)
{
return((T)(IBaseClassIfc)Factory.YAxisNegative);
}
if (direction.isZAxisNegative)
{
return((T)(IBaseClassIfc)Factory.ZAxisNegative);
}
}
}
if (placement != null)
{
placement.parseJObject(obj);
if (placement.IsXYPlane)
{
return((T)(IBaseClassIfc)Factory.XYPlanePlacement);
}
}
}
index = NextBlank();
this[index] = result;
if (point != null || direction != null || placement != null)
{
return((T)(IBaseClassIfc)result);
}
}
else
{
this[index] = result;
}
}
}
}
}
if (result == null)
{
return(default(T));
}
result.parseJObject(obj);
parseBespoke(result, obj);
return((T)(IBaseClassIfc)result);
}