use of org.vcell.solver.comsol.model.VCCGeomFeature.VCCIntersection in project vcell by virtualcell.
the class ComsolModelBuilder method csgVisitor.
private static VCCGeomFeature csgVisitor(CSGNode node, ArrayList<VCCGeomFeature> geomFeatureList, String namePrefix) {
final VCCGeomFeature newFeature;
if (node instanceof CSGPrimitive) {
CSGPrimitive csg = (CSGPrimitive) node;
switch(csg.getType()) {
case CONE:
{
newFeature = new VCCCone(namePrefix + csg.getName());
break;
}
case CUBE:
{
String[] size = new String[] { "2", "2", "2" };
String[] pos = new String[] { "-1", "-1", "-1" };
VCCBlock vccblock = new VCCBlock(namePrefix + csg.getName(), size, pos);
newFeature = vccblock;
break;
}
case CYLINDER:
{
newFeature = new VCCCylinder(namePrefix + csg.getName());
break;
}
case SPHERE:
{
String r = "1";
String[] pos = new String[] { "0", "0", "0" };
newFeature = new VCCSphere(namePrefix + csg.getName(), pos, r);
break;
}
default:
{
throw new RuntimeException("csg primative type '" + csg.getType().name() + "' not yet supported in COMSOL model builder");
}
}
} else if (node instanceof CSGSetOperator) {
CSGSetOperator setOp = (CSGSetOperator) node;
ArrayList<VCCGeomFeature> childSubtrees = new ArrayList<VCCGeomFeature>();
for (CSGNode child : setOp.getChildren()) {
VCCGeomFeature vccChild = csgVisitor(child, geomFeatureList, namePrefix);
childSubtrees.add(vccChild);
}
switch(setOp.getOpType()) {
case DIFFERENCE:
{
if (childSubtrees.size() != 2) {
throw new RuntimeException("expecting exactly two children for CSG difference operator");
}
VCCDifference diff = new VCCDifference(namePrefix + setOp.getName(), Keep.off);
diff.input.add(childSubtrees.get(0));
diff.input2.add(childSubtrees.get(1));
newFeature = diff;
break;
}
case INTERSECTION:
{
if (childSubtrees.size() < 2) {
throw new RuntimeException("expecting two or more children for CSG intersection operator");
}
VCCIntersection intersection = new VCCIntersection(namePrefix + setOp.getName(), Keep.off);
intersection.input.add(childSubtrees.get(0));
newFeature = intersection;
break;
}
case UNION:
{
if (childSubtrees.size() < 2) {
throw new RuntimeException("expecting two or more children for CSG union operator");
}
VCCUnion union = new VCCUnion(namePrefix + setOp.getName(), Keep.off);
union.input.add(childSubtrees.get(0));
newFeature = union;
break;
}
default:
{
throw new RuntimeException("csg set operator '" + setOp.getOpType().name() + "' not yet supported in COMSOL model builder");
}
}
} else if (node instanceof CSGTransformation) {
CSGTransformation transformation = (CSGTransformation) node;
VCCGeomFeature vccChild = csgVisitor(transformation.getChild(), geomFeatureList, namePrefix);
if (transformation instanceof CSGHomogeneousTransformation) {
throw new RuntimeException("unsupported CSG transformation type Homogeneous transformation");
} else if (transformation instanceof CSGRotation) {
CSGRotation rotation = (CSGRotation) transformation;
String[] axis = new String[] { Double.toString(rotation.getAxis().getX()), Double.toString(rotation.getAxis().getY()), Double.toString(rotation.getAxis().getZ()) };
String[] pos = new String[] { "0.0", "0.0", "0.0" };
String rot = Double.toString(rotation.getRotationRadians());
VCCRotate vccrotate = new VCCRotate(namePrefix + rotation.getName(), axis, pos, rot, Keep.off);
vccrotate.input.add(vccChild);
newFeature = vccrotate;
} else if (transformation instanceof CSGScale) {
CSGScale scale = (CSGScale) transformation;
String[] factor = new String[] { Double.toString(scale.getScale().getX()), Double.toString(scale.getScale().getY()), Double.toString(scale.getScale().getZ()) };
String[] pos = new String[] { "0.0", "0.0", "0.0" };
VCCScale vccscale = new VCCScale(namePrefix + scale.getName(), pos, factor, Keep.off);
vccscale.input.add(vccChild);
newFeature = vccscale;
} else if (transformation instanceof CSGTranslation) {
CSGTranslation translation = (CSGTranslation) transformation;
String[] displ = new String[] { Double.toString(translation.getTranslation().getX()), Double.toString(translation.getTranslation().getY()), Double.toString(translation.getTranslation().getZ()) };
VCCMove vccmove = new VCCMove(namePrefix + translation.getName(), displ, Keep.off);
vccmove.input.add(vccChild);
newFeature = vccmove;
} else {
throw new RuntimeException("unsupported CSG transformation type '" + transformation.getClass().getSimpleName() + "'");
}
} else {
throw new RuntimeException("unsupported CSGNode type '" + node.getClass().getSimpleName() + "'");
}
geomFeatureList.add(newFeature);
return newFeature;
}
Aggregations