def cluster_points(r, z): R, Z = geom.pointloop(r, z) dX = norm([r[1:] - r[:-1], z[1:] - z[:-1]], axis=0) dx_median = sp.median(dX) cluster, i = OrderedDict(), count(0) for r, z in zip(R, Z): dx = [] for cl in cluster: rc, zc = cluster[cl]['r'], cluster[cl]['z'] dx.append(np.min(norm([r - rc, z - zc], axis=0))) if len(dx) == 0 or np.min(dx) > 2 * dx_median: # new cl = 'group{:1.0f}'.format(next(i)) cluster[cl] = {} cluster[cl] = {'r': [r], 'z': [z]} else: icl = np.argmin(dx) cl = list(cluster.keys())[icl] cluster[cl]['r'] = np.append(cluster[cl]['r'], r) cluster[cl]['z'] = np.append(cluster[cl]['z'], z) for cl in cluster: r, z = cluster[cl]['r'], cluster[cl]['z'] dx = norm([r[:1] - r[:-1], z[:1] - z[:-1]], axis=0) imax = np.argmax(dx) + 1 r = np.append(r[imax:], r[:imax]) z = np.append(z[imax:], z[:imax]) cluster[cl]['r'], cluster[cl]['z'] = r, z return cluster
def process(self): for part in self.parts: x = { 'in': { 'r': np.array([]), 'z': np.array([]) }, 'out': { 'r': np.array([]), 'z': np.array([]) }, 'ports': { 'r': np.array([]), 'z': np.array([]) }, 'r': np.array([]), 'z': np.array([]) } for loop, side in zip(self.parts[part], ['out', 'in', 'ports']): r, z = geom.read_loop(self.parts[part], loop) x[side]['r'], x[side]['z'] = r, z if part in ['TF_Coil', 'Vessel', 'Blanket']: if side != 'out': x['r'], x['z'] = geom.polyloop(x['in'], x['out']) else: x['r'], x['z'] = geom.pointloop(x['out']['r'], x['out']['z']) lines = cutcorners(x['r'], x['z']) # select halfs for seg, side in zip(lines, ['in', 'out']): x[side] = {'r': lines[seg]['r'], 'z': lines[seg]['z']} for key in x: self.parts[part][key] = x[key]
def cutcorners(r, z): r, z = geom.pointloop(r, z, ref='min') # form loop from closest neighbour n = len(r) - 1 dR = np.array([r[1:] - r[:-1], z[1:] - z[:-1]]) dR = np.array([np.gradient(r), np.gradient(z)]) dL = norm(dR, axis=0) k, kflag = count(0), False lines = OrderedDict() segment = add_segment(lines, k) for i in range(n): kink = np.arccos(np.dot(dR[:, i] / dL[i], dR[:, i + 1] / dL[i + 1])) * 180 / np.pi append_value(lines, segment, r[i + 1], z[i + 1]) if abs(kink) > 40 and kflag == False: # angle, deg segment = add_segment(lines, k) append_value(lines, segment, r[i + 1], z[i + 1]) kflag = True else: kflag = False segments = list(lines.keys()) l = np.zeros(len(segments)) for i, seg in enumerate(segments): l[i] = len(lines[seg]['r']) seg = np.argsort(l)[-2:] # select loops (in/out) rmax = np.zeros(len(seg)) for i, s in enumerate(seg): rmax[i] = np.max(lines[segments[s]]['r']) seg = seg[np.argsort(rmax)] lines_sort = OrderedDict() for s in seg[:2]: lines_sort[segments[s]] = lines[segments[s]] return lines_sort
rb.trim_sol() filename = trim_dir('../../Data/') + 'CATIA_FW.xlsx' wb = load_workbook(filename=filename, read_only=True, data_only=True) ws = wb[wb.get_sheet_names()[0]] FW = {} for col, var in zip([5, 6], ['r', 'z']): row = ws.columns[col] FW[var] = np.zeros(len(row) - 1) for i, r in enumerate(row[1:]): try: FW[var][i] = 1e-3 * float(r.value) # m except: break r, z = geom.pointloop(FW['r'], FW['z'], ref='min') pl.plot(r[:-1], z[:-1]) ''' self.parts = OrderedDict() # component parts part,loop = [],[] for row in ws.columns: new_part = get_label(row[0].value,part) if new_part: self.parts[part[-1]] = OrderedDict() if len(part) == 0: continue new_loop = get_label(row[1].value,loop,force=new_part,part=part[-1]) p,l = part[-1],loop[-1] if new_loop: self.parts[p][l] = OrderedDict() '''