@@ -299,19 +299,71 @@ bool paramVls(const rapidxml::xml_node<>* node, std::array<double, 6>* out) {
299299 return true ;
300300}
301301
302- // multilayer coating
303- bool paramCoating (const rapidxml::xml_node<>* node, Coating::MultilayerCoating* out) {
304- if (!node || !out) {
302+ bool paramRAYUICoating (const rapidxml::xml_node<>* node, Coating::MultilayerCoating* out) {
303+ if (!node || !out) { return false ; }
304+
305+ // Root für die Layer bestimmen: entweder 'node' selbst oder <param id="Coating">
306+
307+ int numberLayer = 0 ;
308+ if (!paramInt (node, " numberLayer" , &numberLayer)) {
305309 return false ;
306310 }
311+ out->numLayers = numberLayer;
312+
313+ for (int i = 0 ; i < numberLayer; ++i) {
314+ std::string materialParam = " materialCoating" + std::to_string (i + 1 );
315+ std::string thicknessParam = " thicknessCoating" + std::to_string (i + 1 );
316+ std::string roughnessParam = " roughnessCoating" + std::to_string (i + 1 );
317+ const char * materialStr = nullptr ;
318+ if (!paramStr (node, materialParam.c_str (), &materialStr)) {
319+ RAYX_VERB << " Layer " << i + 1 << " is missing a <material> element." ;
320+ return false ;
321+ }
322+ Material material;
323+ materialFromString (materialStr, &material);
324+ out->material [i] = static_cast <int >(material);
325+
326+ if (!paramDouble (node, thicknessParam.c_str (), &out->thickness [i])) {
327+ RAYX_VERB << " Missing thickness for layer " << (i + 1 );
328+ return false ;
329+ }
330+
331+ if (!paramDouble (node, roughnessParam.c_str (), &out->roughness [i])) {
332+ RAYX_VERB << " Missing roughness for layer " << (i + 1 );
333+ return false ;
334+ }
335+ }
336+
337+ const char * materialStr = nullptr ;
338+ if (paramStr (node, " materialTopLayer" , &materialStr)) {
339+ Material material;
340+ materialFromString (materialStr, &material);
341+ out->material [numberLayer] = static_cast <int >(material);
342+
343+ if (!paramDouble (node, " thicknessTopLayer" , &out->thickness [numberLayer])) {
344+ RAYX_VERB << " Missing thickness for toplayer " ;
345+ return false ;
346+ }
347+
348+ if (!paramDouble (node, " roughnessTopLayer" , &out->roughness [numberLayer])) {
349+ RAYX_VERB << " Missing roughness for toplayer " ;
350+ return false ;
351+ }
352+ out->numLayers += 1 ;
353+ }
354+ }
355+
356+ // multilayer coating
357+ bool paramCoating (const rapidxml::xml_node<>* node, Coating::MultilayerCoating* out) {
358+ if (!node || !out) { return false ; }
307359
308360 // Root für die Layer bestimmen: entweder 'node' selbst oder <param id="Coating">
309361 rapidxml::xml_node<>* layersRoot = nullptr ;
310362 if (node->first_node (" layer" )) {
311363 layersRoot = const_cast <rapidxml::xml_node<>*>(node);
312364 } else {
313365 if (!param (node, " Coating" , &layersRoot)) {
314- RAYX_WARN << " Missing <param id='Coating'> for multilayer" ;
366+ RAYX_VERB << " Missing <param id='Coating'> for multilayer" ;
315367 return false ;
316368 }
317369 }
@@ -327,7 +379,7 @@ bool paramCoating(const rapidxml::xml_node<>* node, Coating::MultilayerCoating*
327379 }
328380
329381 if (numLayers <= 0 ) {
330- RAYX_WARN << " Number of layers must be positive." ;
382+ RAYX_VERB << " Number of layers must be positive." ;
331383 return false ;
332384 }
333385
@@ -340,7 +392,7 @@ bool paramCoating(const rapidxml::xml_node<>* node, Coating::MultilayerCoating*
340392 if (auto * m = layerNode->first_attribute (" material" )) {
341393 materialStr = m->value ();
342394 } else {
343- RAYX_WARN << " Layer " << i + 1 << " is missing a <material> element." ;
395+ RAYX_VERB << " Layer " << i + 1 << " is missing a <material> element." ;
344396 return false ;
345397 }
346398 Material material;
@@ -350,14 +402,14 @@ bool paramCoating(const rapidxml::xml_node<>* node, Coating::MultilayerCoating*
350402 if (auto * t = layerNode->first_attribute (" thickness" )) {
351403 out->thickness [i] = std::stod (t->value ());
352404 } else {
353- RAYX_WARN << " Missing thickness for layer " << (i + 1 );
405+ RAYX_VERB << " Missing thickness for layer " << (i + 1 );
354406 return false ;
355407 }
356408
357409 if (auto * r = layerNode->first_attribute (" roughness" )) {
358410 out->roughness [i] = std::stod (r->value ());
359411 } else {
360- RAYX_WARN << " Missing roughness for layer " << (i + 1 );
412+ RAYX_VERB << " Missing roughness for layer " << (i + 1 );
361413 return false ;
362414 }
363415 }
@@ -626,11 +678,9 @@ Material Parser::parseMaterial() const {
626678
627679Coating::MultilayerCoating Parser::parseCoating () const {
628680 Coating::MultilayerCoating m;
629- // get children from param Cotaing
630-
631- if (!paramCoating (node, &m)) {
632- RAYX_EXIT << " parseCoating failed" ;
633- }
681+ // get children from param Coating
682+
683+ if (!paramCoating (node, &m) && !paramRAYUICoating (node, &m)) { RAYX_EXIT << " parseCoating failed" ; }
634684 return m;
635685}
636686
0 commit comments