private boolean evaluateBuildABondClause(String str) {
		String[] s = str.split(REGEX_SEPARATOR);
		if (s.length != 4)
			return false;
		int n = model.getAtomCount();
		double x = parseMathExpression(s[0]); // index of atom 1
		if (Double.isNaN(x))
			return false;
		int i = (int) x;
		if (i >= n) {
			out(ScriptEvent.FAILED, "Atom index out of limit: i=" + i + ">=" + n);
			return false;
		}
		x = parseMathExpression(s[1]); // index of atom 2
		if (Double.isNaN(x))
			return false;
		int j = (int) x;
		if (j >= n) {
			out(ScriptEvent.FAILED, "Atom index out of limit: j=" + j + ">=" + n);
			return false;
		}
		if (j == i) {
			out(ScriptEvent.FAILED, "Cannot build an angular bond for identical atoms: i=j=" + i);
			return false;
		}
		x = parseMathExpression(s[2]); // index of atom 3
		if (Double.isNaN(x))
			return false;
		int k = (int) x;
		if (k >= n) {
			out(ScriptEvent.FAILED, "Atom index out of limit: k=" + k + ">=" + n);
			return false;
		}
		if (k == i || k == j) {
			out(ScriptEvent.FAILED, "Cannot build an angular bond for identical atoms: " + i + "," + j + "," + k);
			return false;
		}
		x = parseMathExpression(s[3]); // strength
		if (Double.isNaN(x))
			return false;
		Atom a1 = model.getAtom(i);
		Atom a2 = model.getAtom(j);
		Atom a3 = model.getAtom(k);
		if (x > ZERO) {
			RBond r1 = model.getRBond(a1, a2);
			if (r1 == null) {
				out(ScriptEvent.FAILED, "There must be a radial bond between " + i + " and " + j);
				return false;
			}
			RBond r2 = model.getRBond(a2, a3);
			if (r2 == null) {
				out(ScriptEvent.FAILED, "There must be a radial bond between " + j + " and " + k);
				return false;
			}
			ABond ab = view.addABond(r1, r2);
			ab.setStrength((float) x);
			view.repaint();
			model.notifyChange();
		}
		return true;
	}