Atomic Simulation Environment (Surfaces)
I am going to narrowly cover surface models in this answer since ASE is more than capable of handling a wide range of models from nanoparticles, surfaces, 2D layered materials, bulk 3D materials, etc.
Pt(111) models for example can be easily created within the ase.build module as follows.
from ase.build import fcc111
slab = fcc111('Pt', size=(2,2,3), vacuum=10.0)
FCP, BCC, and HCP surfaces with preassigned sites can be generated for a couple of low index facets. An example model of a Cu surface with atoms placed in these sites is found on the documentation page.
Oxide / General Surfaces
When there is no predefined function available for the surface you want, there is a generic function that produces a cell. It can be called as follows given that you can provide a bulk structure.
from ase.build import surface
s1 = surface('Pt', (2, 1, 1), 9)
This function unfortunately will not define absorption sites for you and there is no guarantee that there will be an inversion symmetry between the top and bottom of the surface. This makes it significantly more finicky to work with, but if you can find a good consistent set of parameters you can define your own helper function to generate "nice" surfaces.
Root Surfaces (Supercell calculations)
In literature, you may see supercell surfaces being referred to as a 4x4 cell for example meaning that the primitive surface cell was repeated 4 times in the x and y. This is fairly restrictive in terms of computational power, moving from a 3x3 to a 4x4 results in almost double the number of atoms.
To smooth this gap, so-called root cells can be formed. These get their name from the fact that fcc-like surfaces with a 30-60-90 cell have potential cell transformations where the x/y vector is not multiplied by an integer value such as 3 or 4, but it is multiplied by a root such as root(12) and the entire cell is rotated. This has the nice property for fcc-like cells that a root(12) cell will have 12 repetitions of the primitive surface cell (like a 3x4) but will maximize the distance for any atom interacting with its periodic image.
Not many codes support this in a general manner, but ASE's implementation can also handle cells which are not fcc-like. In practice, you create a 1x1 surface to use as a primitive surface cell and call the root_surface function with a valid root. If you do not know the valid roots there is a root_surface_analysis function to help you.
from ase.build import fcc111, root_surface
atoms = fcc111('Ag', (1, 1, 3))
atoms = root_surface(atoms, 27)