# Create an options dialog
void createDefaultDialog(Dialog ui)
{
        Widget w;

        # Set title and vertical automatic filling of main dialog layout
        ui.title = "Bucky Tubulator";

	# Basic controls
	ui.verticalFill = TRUE;
	ui.addIntegerSpin("nBenzeneSpin", "Number of benzenes around circumference", 4, 1000, 1, 10);
	ui.addIntegerSpin("nStacksSpin", "Number of stacks along tube length", 1, 1000, 1, 10);
	ui.addDoubleSpin("bondLengthSpin", "Benzene C-C bond length", 0.1, 100.0, 0.01, 1.39);
	ui.addCheck("createModelCheck", "Create new model", 1);
}

# Show (execute) the dialog to allow user interaction.
# The function returns 0 for 'canceled' or '1' for 'ok'
if (!showDefaultDialog()) error("Dialog canceled.\n");

# Get widget values
Dialog ui = defaultDialog();
int nbenz = ui.asInteger("nBenzeneSpin");
int nstacks = ui.asInteger("nStacksSpin");
double rcc = ui.asDouble("bondLengthSpin");

int loop, benz;
Atom hAtom;

// Calculate rotation increment around circumference
double dz = 360.0/(nbenz*2.0);

# Create / get target model
Model targetModel;
if (ui.asInteger("createModelCheck")) targetModel = newModel("BuckyTube");
else targetModel = aten.frame;
if (!targetModel) error("No valid target model.\n");

# Clear the current selection, ready for the main loop
targetModel.selectNone();

# Outer loop - loop over stacks
for (loop=0; loop <= nstacks; ++loop)
{
	# Inner loop - loop over benzene molecules
	for (benz=0; benz<nbenz; ++benz)
	{
		# If at beginning of tube, draw terminating H
		if (loop == 0)
		{
			targetModel.movePen(0, 0, -1);
			targetModel.select(targetModel.newAtom(H));
			targetModel.movePen(0, 0, 1);
		}

		# Draw and select first carbon
		targetModel.select(targetModel.newAtom(C));

		# Rotate pen and move around circumference
		targetModel.movePen(rcc*cos(30), 0.0, rcc*sin(30));
		targetModel.rotatePenZ(dz);

		# If at end of tube, draw terminating H
		if (loop == nstacks)
		{
			targetModel.movePen(0, 0, 1);
			targetModel.select(targetModel.newAtom(H));
			targetModel.movePen(0, 0, -1);
		}

		# Draw and select second carbon
		targetModel.select(targetModel.newAtom(C));

		# Rotate pen and move around circumference
		targetModel.movePen(rcc*cos(30), 0, -rcc*sin(30));
		targetModel.rotatePenZ(dz);
	}
	
	# Move pen along tube length, and one step around circumference to offset next layer
	targetModel.movePen(0, 0, rcc*1.5);
	targetModel.movePen(rcc*cos(30), 0, 0);
	targetModel.rotatePenZ(dz);
}

# Centre the selection, rebond and augment
targetModel.centreSelection(0.0, 0.0, 0.0);
targetModel.rebondSelection();
