Очистка вопроса по запросу acl:
У меня есть следующий код
AddGeometry[scg_, tfg_, geo_] :=
Module[{
i,
georec},
If[StringQ[geo[[2,1]]]&&StringMatchQ[geo[[2,1]],"GE"], (* DIRTY, BWAH *)
AddAsChild[scg, tfg, geo],
(
i=1;
While[i<=Length[geo],
georec=geo[[i]];
AddGeometry[scg, tfg, georec];
i++
]
)
]
]
SetAttributes[AddGeometry, HoldAll];
гео_ выглядит так:
{
{4, {"GE", {"CU", {{0, 0, 0}, 4}}}, 5, 2},
{7, {"GE", {"CU", {{0, 3, 0}, 1}}}, 5, 2},
{12, {"GE", {"CU", {{0, 5, 0}, 2}}}, 5, 2},
}
Он содержит 1, 2, ... n записей типа {4, {"GE", {"CU", {{0, 0, 0}, 4}}}, 5, 2}.
Код вызова выглядит так
c1 = NewCube[]
( c1 получает значение, подобное {4, {"GE", {"CU", {{0, 0, 0}, 4}}}, 5, 2}) и т. д.
AddGeometry[scg, tfg, c1]
ИЛИ, когда необходимо добавить несколько геометрий:
AddGeometry[scg, tfg, {c1, c2, c3}]
Код выше работает.
Вопрос:
- Есть ли более чистый способ (с использованием полиморфизма) реализовать это?
От @acl:
AddGeometry[scg_, tfg_, geo_] :=
Module[{
georec=geo},
AddAsChild[scg, tfg, georec]
] /; MatchQ[geo, {_, {"GE", __}, __}];
AddGeometry[scg_, tfg_, geo_] :=
Module[{},
Map[AddGeometry[scg, tfg, #] & ,geo]
]
SetAttributes[AddGeometry, {HoldAll, Listable}];
иAddGeometry[scg, tfg, {c1, c2}]
дает{AddAsChild[scg, tfg, NewCube[{0, 0, 0}, 4]], AddAsChild[scg, tfg, NewCube[{10, 0, 0}, 4]]}
, что кажется правильным. Кроме того, какNewGeometry
относится к чему-либо? Простите меня, если я просто туплю. - person Mr.Wizard   schedule 11.06.2011grpat = {_, {"GE", __}, __}
, функции, производительности, эстетики и прочего? Я тоже подумал о вашем предложении, но я не хотел требовать, чтобы ОП изменил свой формат данных. - person Mr.Wizard   schedule 13.06.2011