<jupyter_start><jupyter_text>parameters and object generationtypically the full process is something like1. generate collections of static parameters2. start loop over static params3. for each loop    - calculate dynamic params    - pass full params to object/geometry generator function    - update global geometries    - log params (and attach to individual geometry)    would be nice to be able to define static params and procedure for calculating dynamic params all at startwould be nice to be collecting everything in GeoDataFrame<jupyter_code>u0 = ss.uniform(loc=1)
u0.rvs()
@dataclass
class HatchCircle(gp.DataClassBase):
    x: float
    y: float
    rad: float
    hatch_angle: float
    hatch_spacing: float
    
    def __post_init__(self):
        self.P = gp.Poly(sg.Point((self.x, self.y)).buffer(self.rad))
        self.hatches = self.P.hatch(angle=self.hatch_angle, spacing=self.hatch_spacing)


class MetaPrms(object):
    
    def __init__(
        self,
        n_circles: int,
        xmin: float,
        xmax: float,
        ymin: float,
        ymax: float,
        radloc: float,
        radscale: float,
        hatch_angle: float,
        hatch_spacing: float,
        ):

        self.df = pd.DataFrame({
            'x': np.linspace(xmin, xmax, n_circles),
            'y': np.linspace(ymin, ymax, n_circles),
            'rad': ss.uniform(loc=radloc, scale=radscale).rvs(n_circles),
            'hatch_angle': [hatch_angle] * n_circles,
            'hatch_spacing': [hatch_spacing] * n_circles,
        }
        )
    
        
mprms = MetaPrms(
    n_circles=10,
    xmin=0,
    xmax=10,
    ymin=0,
    ymax=8.5,
    radloc=3,
    radscale=0.1,
    hatch_angle=45,
    hatch_spacing=0.4
)
geoms = []
for i, row in mprms.df.iterrows():
    geoms.append(HatchCircle(**row.to_dict()).P.p)
df = mprms.df.copy()
df['geometry'] = geoms
df = geopandas.GeoDataFrame(df)
df.unary_union
hc = HatchCircle(x=1, y=0, rad=3, hatch_angle=45, hatch_spacing=0.5)
hc.P.p
centers = np.linspace(1,10,10)
rads = 
for c in centers:
    Point(c).buffer
?ss.uniform<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11074144486692016, 'fraction_numerical': 0.01568441064638783, 'mean_word_length': 2.827272727272727, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '109330', 'license': 'MIT', 'n_tokens_mistral': 763, 'n_tokens_neox': 739, 'n_words': 176, 'path': 'scratch/001_test_base_classes.ipynb', 'repo_name': 'ANaka/genpen', 'size': '2104'}