¿Cómo hacer la conversión de la Unidad de una IfcPropertySingleValue sin Unit definida?

Trabajando con la librería XBim. Leo una propiedad, IfcPropertySingleValue, de un PropertySet de un Elemento IFC. Obtengo su NominalValue (2000),  su Unit. (null), y su tipo de Unidad (NominalValue.GetType().Name)= «IfcAreaMeasure» .

Al no estar definido Unit en la propiedad, en la lista de IfcUnits del modelo se puede ver la conversión por defecto {#44=IFCSIUNIT(*,.AREAUNIT.,.CENTI.,.SQUARE_METRE.);} con su propiedad Power=0.0001.

¿Existe algún modo de hacer la conversión sin tener hacer una clase propia con un Switch que busque su Unit correspondiente? ya que en la propiedad es IfcAreaMeasure y en Units es AREAUNIT.

Ewok Preguntada on noviembre 13, 2019 en IFC.

Yo estoy trabajando con esa librería también, pero decidí hacer mis propias clases que se alimentan de las clases XBim. Otro problema que te vas a encontrar es hacer tu código compatible con las distintas versiones de Ifc.

on noviembre 13, 2019.

Si, cuando me toque la compatibilidad ya me pelearé.  También estoy haciendo clases para acceder de manera mas fácil a ciertas propiedades, pero creía que el tema de la conversión estaría resuelto. Ahora, estoy viendo una extensión de “IIfcUnitAssignment”  GetUnitFor que creo que me va ha servir   https://csharp.hotexamples.com/examples/Xbim.Ifc2x3.PropertyResource/IfcPropertySingleValue/-/php-ifcpropertysinglevalue-class-examples.html  

on noviembre 13, 2019.
Agregar Comentario
1 Respuesta(s)
Mejor respuesta

Ya he visto donde esta el problema. Había intentado usar GetUnitFor para  que IfcUnitAssignment devolviera la unit de la propiedad pero me devolvía null, ya que usaba la interface. Si se utiliza según el esquema IFC, devuelve el unit correspondiente:

switch (propertyX.SchemaVersion)
{
case Xbim.Common.Step21.XbimSchemaVersion.Ifc2X3:
var UnitAssig2x3 = (Xbim.Ifc2x3.MeasureResource.IfcUnitAssignment)UnitAssigment;
var UnitExist2x3 = UnitAssig2x3.GetUnitFor(propertyX.IfcProperty as Xbim.Ifc2x3.PropertyResource.IfcPropertySingleValue);
unitX = UnitExist2x3 as IIfcNamedUnit;
break;

case Xbim.Common.Step21.XbimSchemaVersion.Ifc4:
case Xbim.Common.Step21.XbimSchemaVersion.Ifc4x1:
var UnitAssig4 = (Xbim.Ifc4.MeasureResource.IfcUnitAssignment)UnitAssigment;
var UnitExist4 = UnitAssig4.GetUnitFor(propertyX.IfcProperty as Xbim.Ifc4.PropertyResource.IfcPropertySingleValue);
unitX = UnitExist4 as IIfcNamedUnit;
break;

case Xbim.Common.Step21.XbimSchemaVersion.Unsupported:
unitX = null;
break;
}

Ewok Respondida on noviembre 20, 2019.
Agregar Comentario