void draw() throws ScriptException {
		viewer.loadShape(JmolConstants.SHAPE_DRAW);
		viewer.setShapeProperty(JmolConstants.SHAPE_DRAW, "init", null);
		boolean havePoints = false;

		boolean isInitialized = false;
		int intScale = 0;
		for (int i = 1; i < statementLength; ++i) {
			String propertyName = null;
			Object propertyValue = null;
			int tok = statement[i].tok;
			switch (tok) {
			case Token.identifier:
				propertyName = "thisID";
				propertyValue = statement[i].value;
				String str = (String) propertyValue;
				if (str.equalsIgnoreCase("FIXED")) {
					propertyName = "fixed";
					propertyValue = Boolean.TRUE;
					break;
				}
				if (str.equalsIgnoreCase("MODELBASED")) {
					propertyName = "fixed";
					propertyValue = Boolean.FALSE;
					break;
				}
				if (str.equalsIgnoreCase("PLANE")) {
					propertyName = "plane";
					break;
				}
				if (str.equalsIgnoreCase("CROSSED")) {
					propertyName = "crossed";
					break;
				}
				if (str.equalsIgnoreCase("CURVE")) {
					propertyName = "curve";
					break;
				}
				if (str.equalsIgnoreCase("ARROW")) {
					propertyName = "arrow";
					break;
				}
				if (str.equalsIgnoreCase("CIRCLE")) { // circle <center>; not yet implemented
					propertyName = "circle";
					break;
				}
				if (str.equalsIgnoreCase("VERTICES")) {
					propertyName = "vertices";
					break;
				}
				if (str.equalsIgnoreCase("REVERSE")) {
					propertyName = "reverse";
					break;
				}
				if (str.equalsIgnoreCase("ROTATE45")) {
					propertyName = "rotate45";
					break;
				}
				if (str.equalsIgnoreCase("PERP") || str.equalsIgnoreCase("PERPENDICULAR")) {
					propertyName = "perp";
					break;
				}
				if (str.equalsIgnoreCase("OFFSET")) {
					Point3f pt = getCoordinate(++i, true);
					i = pcLastExpressionInstruction;
					propertyName = "offset";
					propertyValue = pt;
					break;
				}
				if (str.equalsIgnoreCase("SCALE")) {
					checkStatementLength((++i) + 1);
					switch (statement[i].tok) {
					case Token.integer:
						intScale = intParameter(i);
						break;
					case Token.decimal:
						intScale = (int) (floatParameter(i) * 100);
						break;
					default:
						numberExpected();
					}
					break;
				}
				if (str.equalsIgnoreCase("LENGTH")) {
					propertyValue = new Float(floatParameter(++i));
					propertyName = "length";
					break;
				}
				break;
			case Token.dollarsign:
				// $drawObject
				propertyValue = objectNameParameter(++i);
				propertyName = "identifier";
				havePoints = true;
				break;
			case Token.color:
				if (++i < statementLength && statement[i].tok == Token.colorRGB) {
					viewer.setShapeProperty(JmolConstants.SHAPE_DRAW, "colorRGB", new Integer(getArgbParam(i)));
					continue;
				}
				invalidArgument();
			case Token.decimal:
				// $drawObject
				propertyValue = new Float(floatParameter(i));
				propertyName = "length";
				break;
			case Token.integer:
				intScale = intParameter(i);
				break;
			case Token.leftbrace:
				// {X, Y, Z}
				Point3f pt = getCoordinate(i, true);
				i = pcLastExpressionInstruction;
				propertyName = "coord";
				propertyValue = pt;
				havePoints = true;
				break;
			case Token.expressionBegin:
				propertyName = "atomSet";
				propertyValue = expression(statement, i + 1);
				i = pcLastExpressionInstruction;
				havePoints = true;
				break;
			default:
				if (!setMeshDisplayProperty(JmolConstants.SHAPE_DRAW, tok))
					invalidArgument();
			}
			if (havePoints && !isInitialized) {
				viewer.setShapeProperty(JmolConstants.SHAPE_DRAW, "points", new Integer(intScale));
				isInitialized = true;
			}
			if (propertyName != null)
				viewer.setShapeProperty(JmolConstants.SHAPE_DRAW, propertyName, propertyValue);
		}
		if (havePoints) {
			viewer.setShapeProperty(JmolConstants.SHAPE_DRAW, "set", null);
		}
		else if (intScale != 0) {
			viewer.setShapeProperty(JmolConstants.SHAPE_DRAW, "scale", new Integer(intScale));
		}
	}