diff --git a/mysite/plots/polygon.py b/mysite/plots/polygon.py index f77450a461960684d2ccc527d7f2ca9c114f9dfc..7c921112234d65ce4370441c064cabd4ee5405e1 100644 --- a/mysite/plots/polygon.py +++ b/mysite/plots/polygon.py @@ -856,9 +856,38 @@ class End_Container(object): else: return fig -list2=[[(233.50398313507685, 1720.9265753781722), (787.0422555505176, 1491.3173835514308), (0.0, 1680.8654987569212), (233.50398313507685, 1720.9265753781722)], [(1124.8805630148158, 1708.6895362501566), (532.1290575497333, 1491.3173835514308), (233.50398313507685, 1519.6028026015497), (1124.8805630148158, 1708.6895362501566)], [(1498.1911834971443, 1765.660563957103), (1832.2885709298307, 1593.0223998373076), (1124.8805630148158, 1491.3173835514308), (1498.1911834971443, 1765.660563957103)]] -list3=[] -for poly in list2: - list3.append((Polygon2(poly))) -high_classes = height_classes(list3) -test = building_containers(high_classes) \ No newline at end of file +def plot_polygons_in_single_plot(polygon_list, title="", render=True, border=None): + polygon_number = len(polygon_list) + # x_data = self.x_values + # y_data = self.y_values + TOOLTIPS = [("index", "$index"), ("(x,y)", "($x, $y)"), ] + # if title=="": + # title= 'height:{} slope:{}'.format(height,slope) + # else: + # title= '{} height:{} slope:{}'.format(title,height,slope) + fig = figure(title=title, x_axis_label='x', y_axis_label='y', tooltips=TOOLTIPS, toolbar_location="below") + colors = itertools.cycle(palette) + legend_items = [] + legend_polygons = [] + for counter, polygon in enumerate(polygon_list): + color = next(colors) + x = polygon.x_values + y = polygon.y_values + legend_label = "Polygon {}".format(counter) + poly_fig = fig.line(x, y, color=color, line_width=2, muted_alpha=0.2) + circle_fig = fig.circle(x, y, color=color, line_width=2, muted_alpha=0.2, size=8) + legend_polygons.append((legend_label, [poly_fig, circle_fig])) + # spine_x_values = [x[0] for x in self.spine] + # spine_y_values = [x[1] for x in self.spine] + if border != None: + fig_border = fig.line(border[0], border[1], line_color="red", line_width=2, muted_alpha=0.2) + legend_items.append(("border", [fig_border])) + legend_items = legend_items + legend_polygons + legend = Legend(items=legend_items) + legend.click_policy = "mute" + fig.add_layout(legend, 'right') + fig.legend.click_policy = "mute" + if render: + return show(fig) + else: + return fig \ No newline at end of file diff --git a/mysite/plots/templates/plots/index0.html b/mysite/plots/templates/plots/index0.html index 0008ccb791159fbee4a11989ecf9e7407da8bc74..0fba171dc66ce14f252bb1fc8d63e5b85ec79d28 100644 --- a/mysite/plots/templates/plots/index0.html +++ b/mysite/plots/templates/plots/index0.html @@ -11,6 +11,7 @@ <h1>Polygons</h1> {{polygons_plot}} + {{polygons_plot.}} <hr> <h1> Highclasses</h1> {{hc_plot}} diff --git a/mysite/plots/templates/plots/test.html b/mysite/plots/templates/plots/test.html new file mode 100644 index 0000000000000000000000000000000000000000..6309ac9f2f67781438d4b72df56b95667afd7d55 --- /dev/null +++ b/mysite/plots/templates/plots/test.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <title></title> + + <style> + html { + width: 100%; + height: 100%; + } + body { + width: 90%; + height: 100%; + margin: auto; + } + </style> + <script> + function change_ds_value(name, idx, value) { + var ds = Bokeh.documents[0].get_model_by_name('my-data-source'); + ds.data[name][idx] = value; + ds.change.emit(); + } + </script> + </head> + <body> + <form action="/hello/" target="_blank" method="post"> + {% csrf_token %} + <label for="your_name">Your name: </label> + <input id="your_name" type="hidden" name="your_name" value="test"> + <input type="submit" onclick="myFunction()" value="OK"> + </form> + <p id="p1">Hello World!</p> + <div> + {{ response|safe }} + + + </div> + </body> +<script type="text/javascript"> + +var element = document.getElementById("your_name"); +element.value = "{{response}}"; +</script> +<script> +function myFunction() { + var ds = Bokeh.documents[0].get_model_by_name('my-data-source'); + var dict1 = {x:ds.data["x"], y:ds.data["y"]}; + document.getElementById("your_name").value =JSON.stringify(dict1); +} +</script> + +</html> \ No newline at end of file diff --git a/mysite/plots/urls.py b/mysite/plots/urls.py index ad5e0be7cf4a52c9745b2a3f510b460286a0e3a5..87e27c24661a67bf501c134b765d16df6a4ff559 100644 --- a/mysite/plots/urls.py +++ b/mysite/plots/urls.py @@ -5,4 +5,6 @@ from . import views urlpatterns = [ path('plot/', views.index, name='index'), path('json/', views.get_json_view, name='index2'), + path('test/', views.test, name='index3'), + path('hello/', views.hello, name='index4'), ] \ No newline at end of file diff --git a/mysite/plots/views.py b/mysite/plots/views.py index b2cff7b34075f9141675f9ea84ed353bcea5c5f8..7f4ec534fea79f536a6aaa305827bb6eecb990b7 100644 --- a/mysite/plots/views.py +++ b/mysite/plots/views.py @@ -1,10 +1,13 @@ from django.shortcuts import render # Create your views here. + +import json from django.shortcuts import render from plotly.offline import plot import plots.polygon as poly from bokeh.embed import file_html +from django.views.generic import TemplateView import matplotlib from django.http import JsonResponse from plotly.graph_objs import Scatter @@ -23,14 +26,22 @@ from bokeh.layouts import layout from bokeh.models.widgets import Tabs, Panel from bokeh.io import curdoc from bokeh.plotting import figure - - - - +from bokeh.layouts import column +from bokeh.models import CustomJS, ColumnDataSource +from bokeh.plotting import Figure +from bokeh.models import ColumnDataSource, CustomJS, Slider +from bokeh.embed import components +from bokeh.embed import json_item +from bokeh.events import ButtonClick +import numpy as np +from bokeh.models import PolyDrawTool, PolyEditTool +from bokeh.models.callbacks import CustomJS +from bokeh.embed import json_item +import json def index(request): - convex_polygons = poly.create_multiple_convex_polygons(20,9) + convex_polygons = poly.create_multiple_convex_polygons(50,9) polygons_plot= poly.plot_polygons(convex_polygons,plot_width=300,plot_height=300,render=False) html_polygons = file_html(polygons_plot, CDN, "my plot") @@ -137,4 +148,86 @@ def get_json_view(request): # tabs = Tabs(tabs=[tab1, tab2]) # response =file_html(tabs, CDN, "my plot") #show(tabs) - return render(request, 'plots/get.html', context={'containers': response,'containers2':mini_plots}) \ No newline at end of file + return render(request, 'plots/get.html', context={'containers': response,'containers2':mini_plots}) + + + + + +def test(request): + # source = ColumnDataSource(data=dict(x=[1, 2, 3], + # y=[3, 2, 1]), + # name='my-data-source') + # + # p = figure() + # l1 = p.line("x", "y", source=source) + # response = file_html(p, CDN, "my plot") + # list =[1,2,3,4] + + source = ColumnDataSource(data=dict(x=[], + y=[]), + name='my-data-source') + p = figure(x_range=(0, 10), y_range=(0, 10), width=400, height=400, + title='Poly Edit Tool') + + p1 = p.patches("x", "y", fill_alpha=0.4,source=source, fill_color="red") + + c1 = p.circle([], [], size=10, color='red') + + draw_tool = PolyDrawTool(renderers=[p1]) + edit_tool = PolyEditTool(renderers=[p1], vertex_renderer=c1) + p.add_tools(draw_tool, edit_tool) + p.toolbar.active_drag = edit_tool + response = file_html(p, CDN, "my plot") + return render(request, 'plots/test.html', context={"response":response, "list":list}) + + +def hello(request): + if request.method == 'POST': + test = request.POST["your_name"] + dict_poly = json.loads(test) + print(dict_poly["x"]) + print(dict_poly["y"]) + polygon_list=[] + polygons_x_y_tuple = list(zip(dict_poly["x"],dict_poly["y"])) + # polygon_x_list = [] + # polygon_y_list = [] + for x,y in polygons_x_y_tuple: + polygon_list.append(list(zip(x,y))) + # for x,y in polygons_x_y_tuple: + # polygon_x_list.append(x) + # polygon_y_list.append(y) + print(polygon_list) + real_polygons=[] + for polygon in polygon_list: + + if len(polygon)<3: + continue + if polygon[0]!= polygon[-1]: + polygon.append(polygon[0]) + + + polygon2 = poly.Polygon(polygon) + print("konkav",list(polygon2.exterior.coords)) + polygon_parent_class = polygon2.convex_hull + polygon2 = poly.Polygon2(list(polygon_parent_class.exterior.coords)) + print("convex",polygon2.shell) + real_polygons.append(polygon2) + # print(polygon_list) + # q = map(list, zip(*polygon_list)) + # s= json.loads(test) + # x = s["x"] + # y = s["y"] + # source = ColumnDataSource(data=dict(x=polygon_x_list, y=polygon_y_list),name='my-data-source') + # print(test) + plot = poly.plot_polygons_in_single_plot(real_polygons,render=False) + # plot = poly.plot_polygons(real_polygons,render=False) + # print(type(test)) + # p = figure() + # p.multi_line("x", "y", source=source) + response = file_html(plot, CDN, "my plot") + + # polygon = Polygon(polygon_points) + # polygon_parent_class = polygon.convex_hull + # polygon2 = Polygon2(list(polygon_parent_class.exterior.coords)) + return HttpResponse(response) \ No newline at end of file diff --git a/mysite/requirements/base.txt b/mysite/requirements/base.txt index a7e87411862532a45874732c3abab9b44e7e9bc0..25affecabad3a7ad12973a723a5eae35355454a1 100644 --- a/mysite/requirements/base.txt +++ b/mysite/requirements/base.txt @@ -5,4 +5,5 @@ numpy==1.19.2 mplcursors==0.3 mpld3 bokeh -django-jquery \ No newline at end of file +django-jquery +django.js==0.8.1 \ No newline at end of file