def visdom_plotly_pointclouds()

in c3dm/tools/vis_utils.py [0:0]


def visdom_plotly_pointclouds(  viz, pcl, visdom_env, 
								title=None,
								markersize=2,
								nmax=5000, 
								sticks=None, 
								win=None,
								autocolor=False,
								in_subplots=False,
								height=500,
								width=500,
								normalise=False ):

	if sticks is not None:
		pcl = { k:extend_to_3d_skeleton_simple(v,sticks)[0] \
										for k,v in pcl.items() }
	
	npcl = len(pcl)
	rgb = np.linspace(0,1,10)
	rgb = np.array([rgb[i%10] for i in range(npcl)])

	if in_subplots:
		cols = npcl
	else:
		cols = 1

	titles = [None]*cols; titles[0] = title
	fig = make_subplots(
				rows = 1, cols = cols, 
				specs=[[{"type": "scene"}]*cols],
				subplot_titles=titles,
				column_widths=[1.]*cols,
			)

	
	for pcli, ((pcl_name, pcl_data),color) in enumerate(zip(pcl.items(), rgb)):
		
		if pcl_data.shape[1] > nmax:
			with NumpySeedFix():
				prm = np.random.permutation(pcl_data.shape[1])[0:nmax]
			pcl_data = pcl_data[:,prm]

		if pcl_data.shape[0]==6:
			# we have color
			pcl_color = np.minimum(np.maximum(pcl_data[3:],0.),1.)
			pcl_data  = pcl_data[:3]
			pcl_color = [(255.*c).astype(int).tolist() for c in pcl_color.T]
			marker=dict(
					size=markersize,
					color=pcl_color,
					opacity=1.)
		else:
			marker=dict(
					size=markersize,
					color=color,
					colorscale='Spectral',
					opacity=1.)

		if normalise:
			pcl_data -= pcl_data.mean(axis=1, keepdims=True)
			pcl_data /= (pcl_data.max(axis=1) - pcl_data.min(axis=1)).max()
			pcl[pcl_name] = pcl_data

		fig.add_trace(
			go.Scatter3d(
					x=pcl_data[0, :],
					y=pcl_data[1, :],
					z=pcl_data[2, :],
					mode='markers',
					name=pcl_name,
					visible=True,
					marker=marker,
				), 
				row = 1, 
				col = pcli+1 if in_subplots else 1
				)

	pcl_cat = np.concatenate(list(pcl.values()),axis=1)[:3]
	pcl_c = pcl_cat.mean(1)
	maxextent = (pcl_cat.max(axis=1) - pcl_cat.min(axis=1)).max()
	bounds = np.stack((pcl_c-maxextent, pcl_c+maxextent))

	height = height
	width = width * cols
	fig.update_layout(height = height, width = width,
					 scene = dict(
						xaxis=dict(range=[bounds[0,0],bounds[1,0]]),
						yaxis=dict(range=[bounds[0,1],bounds[1,1]]),
						zaxis=dict(range=[bounds[0,2],bounds[1,2]]),
						aspectmode='cube',
						)
					)

	# print(win)
	viz.plotlyplot(fig, env=visdom_env, win=win)

	return win