public boolean addAtom(Point3f p, String symbol) {
		if (!model.contains(p))
			return false;
		int n = model.getAtomCount();
		for (int i = 0; i < n; i++) {
			if (model.getAtom(i).isTooClose(p)) {
				errorReminder.show(ErrorReminder.OBJECT_OVERLAP);
				return false;
			}
		}
		n = model.getObstacleCount();
		if (n > 0) {
			for (int i = 0; i < n; i++) {
				if (model.getObstacle(i).contains(p)) {
					errorReminder.show(ErrorReminder.OBJECT_OVERLAP);
					return false;
				}
			}
		}
		if (!model.addAtom(symbol, p.x, p.y, p.z, 0, 0, 0, 0))
			return false;
		int count = model.getAtomCount();
		Atom a = model.getAtom(count - 1);
		Byte id = nameIdMap.get(symbol);
		if (id == null)
			return false;
		viewer.addAtom(a, id.byteValue(), a.getSymbol(), 0, a.getCharge(), a.getRx(), a.getRy(), a.getRz(), 0, 0, 0, a);
		int currentIndex = count - 1;
		if (Atom.isGenericParticle(symbol)) {
			viewer.setAtomSize(currentIndex, model.getElementSigma(symbol) * 1000);
			viewer.setAtomColor(currentIndex, getElementArgb(symbol));
		}
		if (fullSizeUnbondedAtoms)
			viewer.setCpkPercent(currentIndex, 100);
		if (count <= 1) {
			storeCurrentOrientation();
			renderModel(false);
		}
		else {
			viewer.setTainted(true);
		}
		model.notifyChange();
		return true;
	}