FME Geometry, PythonCaller, GenerativeArt

#main_script import fmeobjects import numpy as np from fmeobjects import FMELine, FMEPoint, FMEPolygon import numpy as np import math import numpy as np from sklearn.cluster import KMeans from sklearn.neighbors import KDTree from sklearn.manifold import TSNE def generate_tsne_network(n_points=200, n_clusters=5, n_neighbors=3, n_dims_raw=7, perplexity=30, seed=42): """ NOTICE I USE LOW PERPLEXITY Generate a network of connected points using t-SNE for dimensionality reduction: random high-dim points cluster connect neighbors reduce with t-SNE return edges. """ rng = np.random.RandomState(seed) raw_points = rng.randn(n_points, n_dims_raw) labels = KMeans(n_clusters=n_clusters, random_state=seed, n_init=4) \ .fit_predict(raw_points) tree = KDTree(raw_points) _, indices = tree.query(raw_points, k=n_neighbors + 1) edges_idx = set() for i, neighbors in enumerate(indices): for j in neighbors[1:]: edges_idx.add((min(i, j), max(i, j))) tsne = TSNE(n_components=2, perplexity=perplexity, random_state=seed) points_2d = tsne.fit_transform(raw_points) edges = [ ((float(points_2d[i][0]), float(points_2d[i][1])), (float(points_2d[j][0]), float(points_2d[j][1]))) for i, j in edges_idx ] return edges class FeatureProcessor(object): def __init__(self): pass def input(self, feature: fmeobjects.FMEFeature): lines = generate_tsne_network(n_points=33, n_clusters=5, n_neighbors=3, n_dims_raw=10, perplexity=2, seed=42) # output the star boundary for i,line in enumerate(lines): tri_ring = (list(map(tuple, line))) tri_line = FMELine([tuple(p) for p in tri_ring]) out_feat = fmeobjects.FMEFeature(feature) out_feat.setGeometry(tri_line) self.pyoutput(out_feat)