mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-25 17:57:02 +00:00
Fix #157
This commit is contained in:
@@ -39,8 +39,30 @@ std::map<std::string, std::string> argument_name_map;
|
|||||||
|
|
||||||
// Format an IFC attribute and maybe returns as string. Only literal scalar
|
// Format an IFC attribute and maybe returns as string. Only literal scalar
|
||||||
// values are converted. Things like entity instances and lists are omitted.
|
// values are converted. Things like entity instances and lists are omitted.
|
||||||
boost::optional<std::string> format_attribute(const Argument* argument, IfcUtil::ArgumentType argument_type) {
|
boost::optional<std::string> format_attribute(const Argument* argument, IfcUtil::ArgumentType argument_type, const std::string& argument_name) {
|
||||||
boost::optional<std::string> value;
|
boost::optional<std::string> value;
|
||||||
|
|
||||||
|
// Hard-code lat-lon as it represents an array
|
||||||
|
// of integers best emitted as a single decimal
|
||||||
|
if (argument_name == "IfcSite.RefLatitude" ||
|
||||||
|
argument_name == "IfcSite.RefLongitude")
|
||||||
|
{
|
||||||
|
std::vector<int> angle = *argument;
|
||||||
|
double deg;
|
||||||
|
if (angle.size() >= 3) {
|
||||||
|
deg = angle[0] + angle[1] / 60. + angle[2] / 3600.;
|
||||||
|
int prec = 8;
|
||||||
|
if (angle.size() == 4) {
|
||||||
|
deg += angle[3] / (1000000. * 3600.);
|
||||||
|
prec = 14;
|
||||||
|
}
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << std::setprecision(prec) << deg;
|
||||||
|
value = stream.str();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
switch(argument_type) {
|
switch(argument_type) {
|
||||||
case IfcUtil::Argument_BOOL: {
|
case IfcUtil::Argument_BOOL: {
|
||||||
const bool b = *argument;
|
const bool b = *argument;
|
||||||
@@ -66,7 +88,7 @@ boost::optional<std::string> format_attribute(const Argument* argument, IfcUtil:
|
|||||||
IfcUtil::IfcBaseClass* e = *argument;
|
IfcUtil::IfcBaseClass* e = *argument;
|
||||||
if (Type::IsSimple(e->type())) {
|
if (Type::IsSimple(e->type())) {
|
||||||
IfcUtil::IfcBaseType* f = (IfcUtil::IfcBaseType*) e;
|
IfcUtil::IfcBaseType* f = (IfcUtil::IfcBaseType*) e;
|
||||||
value = format_attribute(f->getArgument(0), f->getArgumentType(0));
|
value = format_attribute(f->getArgument(0), f->getArgumentType(0), argument_name);
|
||||||
} else if (e->is(IfcSchema::Type::IfcSIUnit) || e->is(IfcSchema::Type::IfcConversionBasedUnit)) {
|
} else if (e->is(IfcSchema::Type::IfcSIUnit) || e->is(IfcSchema::Type::IfcConversionBasedUnit)) {
|
||||||
// Some string concatenation to have a unit name as a XML attribute.
|
// Some string concatenation to have a unit name as a XML attribute.
|
||||||
|
|
||||||
@@ -122,9 +144,10 @@ ptree& format_entity_instance(IfcUtil::IfcBaseEntity* instance, ptree& child, pt
|
|||||||
}
|
}
|
||||||
const IfcUtil::ArgumentType argument_type = instance->getArgumentType(i);
|
const IfcUtil::ArgumentType argument_type = instance->getArgumentType(i);
|
||||||
|
|
||||||
|
const std::string qualified_name = IfcSchema::Type::ToString(instance->type()) + "." + argument_name;
|
||||||
boost::optional<std::string> value;
|
boost::optional<std::string> value;
|
||||||
try {
|
try {
|
||||||
value = format_attribute(argument, argument_type);
|
value = format_attribute(argument, argument_type, qualified_name);
|
||||||
} catch (...) {}
|
} catch (...) {}
|
||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
|
|||||||
Reference in New Issue
Block a user