IfcLabel et apostrophes

Bonjour,
quand la chaine d’une propriété contient une apostrophe, j’ai parfois un problème d’encodage au moment de l’export.
#179=IFCPROPERTYSINGLEVALUE(‹ Property 1 ›,$,IFCLABEL(‹ Moyens d\PG\S"extinction d\S"incendie ›),$);
#180=IFCPROPERTYSINGLEVALUE(‹ Property 2 ›,$,IFCLABEL(‹ Moyens d ›‹ extinction d ›‹ incendie ›),$);

Mon client utilise le viewer Solibri qui affiche telle quelle la chaine Moyens d\PG\S"extinction d\S"incendie

Voici un extrait de code :
Step::RefPtrifc2x3::IfcValue l_sv = new ifc2x3::IfcValue;
CString sValue = ; // la valeur de la propriété
l_sv->setIfcLabel(sValue.GetString());

Comment éviter ce problème ? Je joins un fichier (changez l’extension de pdf en ifc)
Merci
Apostrophes.pdf (11,8 Ko)

Bonjour @cafougnette29,

Dans notre SDK IFC, les labels sont des Step::String qui sont en fait des std::wstring.

Dans votre exemple, je ferai comme suit :

Step::RefPtrifc2x3::IfcValue l_sv = new ifc2x3::IfcValue;
std::string sValue = "Moyen d'extinction";
l_sv->setIfcLabel(Step::String::fromUTF8(sValue));

Cordialement,

Par contre, je ne comprends pas la différence entre les 2 lignes (#179 et #180), elle n’ont pas été écrites par le même code, non ?

Bonjour et merci pour votre réponse rapide.

  1. j’aurai dû préciser le type de la chaine : c’est le membre bstrVal (de type BSTR) d’un VARIANT.
    Comment le passer à la méthode fromUTF8 ?

  2. Pourtant oui, les 2 lignes ont été écrites par le même programme.
    Il faut savoir qu’il y a 2 propriétés, de type chaine, qui ont la même valeur Moyens d’extinction d’incendie.
    Mais dans l’interface graphique de mon programme, j’ai effacé la valeur écrite par le client dans la 2eme propriété, puis ré-écrit : Moyens d’extinction d’incendie.
    Donc les 2 propriétés ont la même valeur, et je comprends pas pourquoi elles sont écrites différemment en IFC.

Cordialement.

Bonjour,

Sans avoir le code complet, c’est compliqué d’aider. En recherchant sur internet, il est donné ceci pour convertir un BSTR en std::wstring. Je remets le bout de code ici :

// given BSTR bs
assert(bs != nullptr);
std::wstring ws(bs, SysStringLen(bs));

Avec votre bout de code, ça pourrait donner cela :

BSTR bs = ...;

...

Step::RefPtrifc2x3::IfcValue l_sv = new ifc2x3::IfcValue;
std::wstring sValue(bs, SysStringLen(bs));
l_sv->setIfcLabel(Step::String(sValue));