diff --git a/mysite/.idea/mysite.iml b/mysite/.idea/mysite.iml index 003f8b3aafb468259a7dead362db951473e1ea34..0a86008225093abfee6401a6645cfb88ed931d30 100644 --- a/mysite/.idea/mysite.iml +++ b/mysite/.idea/mysite.iml @@ -5,6 +5,12 @@ <orderEntry type="jdk" jdkName="Python 3.6 virtualenv at C:\Users\tolga yurtseven\PycharmProjects\mysite\venv" jdkType="Python SDK" /> <orderEntry type="sourceFolder" forTests="false" /> </component> + <component name="PackageRequirementsSettings"> + <option name="requirementsPath" value="" /> + </component> + <component name="PyDocumentationSettings"> + <option name="myDocStringFormat" value="Google" /> + </component> <component name="TestRunnerService"> <option name="PROJECT_TEST_RUNNER" value="Unittests" /> </component> diff --git a/mysite/plots/packing_algo.py b/mysite/plots/packing_algo.py index c1059094ba7fa0e6973e0d12a987d8e842a465df..1391494cfa3d2c41a7359bcaa896bb1c773c0d11 100644 --- a/mysite/plots/packing_algo.py +++ b/mysite/plots/packing_algo.py @@ -1,45 +1,57 @@ -import sys, path import copy import numpy import math -import random -from collections import defaultdict import itertools -# from typing import NewType -# for JupyterLab - # tree datastructure from . import avl_tree # shapely/polygon packages -from shapely.geometry import MultiPolygon, Polygon, LineString, LinearRing, Point -from shapely.geometry.base import BaseGeometry, geos_geom_from_py +from shapely.geometry import Polygon from shapely import affinity # plotting packages -import mpld3 -import bokeh from bokeh.plotting import figure, Figure from bokeh.io import output_notebook, show -from bokeh.layouts import gridplot, row, layout, column, Column +from bokeh.layouts import gridplot, layout, column, Column from bokeh.models import Div from bokeh.models import Legend from bokeh.models import BoxAnnotation from bokeh.models.widgets import Tabs, Panel -from bokeh.models import ColumnDataSource, Label, LabelSet, Range1d +from bokeh.models import ColumnDataSource, LabelSet from bokeh.palettes import Dark2_5 as palette -from bokeh.plotting import output_file - -# for analysing the data -import pandas as pd # Type aliases for the type hints Point_xy = (float, float) class ConvexPolygon(object): - + """A convex polygon which is represented by its shell, the vertices are clockwise ordered. + + Args: + shell ([Point_xy]): a list of (x,y) points + + Attributes: + __shell ([Point_xy]): list of clockwise ordered convex (x,y) coordinate points which represents the polygon, + the shells first point and end point are closing the polygon and are the same, the shell + will have at least 3 Points + __area (float): the area of the polygon + __x_values ([float]): x coordinate values + __y_values ([float]): y coordinate values + __min_x (float): min x coordinate value + __max_x (float): max x coordinate value + __min_y (float): min y coordinate value + __max_y (float): max y coordinate value + __height (float): height + __width (float): width + __spine ((Point_xy, Point_xy)): a tuple of the vertices with the smallest and biggest y value. if there are two + vertices which have the same smallest y value or biggest y value the left most vertex and the top right + vertex will build the spine + __vertices_left_visible ([Point_xy]): vertices which can be seen from left + __vertices_right_visible ([Point_xy]): vertices which can be seen from right + __slope (float): the slope of the spine points + plot_fill (bool): a flag which signals that the plot of the polygon should be filled + """ def __init__(self, shell: [Point_xy]) -> None: self.__shell, self.__area = self.convex_hull_and_area(shell) self.__x_values = [vertex[0] for vertex in self.shell] @@ -55,6 +67,7 @@ class ConvexPolygon(object): self.__slope = self.set_slope() self.plot_fill = False + # all these @property decorators helps to make the attributes private @property def area(self): return self.__area @@ -111,12 +124,20 @@ class ConvexPolygon(object): def slope(self): return self.__slope - # @property - # def plot_fill(self): - # return self.__plot_fill + def convex_hull_and_area(self, shell: [Point_xy]) -> ([Point_xy], float): + """Builds the convex hull of the input points and creates a convex polygon with his area + + This function creates a shapely (a python package) polygon to use the shapely convex hull function, + after the convex hull function is used the new convex vertices and the area of the polygon will be returned, + the convex vertices are clockwise ordered and the start and end point are the same, + this way of using the convex hull creates a redundancy and dependency of the shapely package + + Args: + shell ([Point_xy]): the input (x,y) coordinates for initialising the convex polygon - def convex_hull_and_area(self, shell: [Point_xy]) -> [Point_xy]: - # the Polygon points will be ordered clockweise and the start and end point are connected + Returns: + shell, area ([Point_xy], float): a tuple of the convex polygon shell and polygon area + """ if shell == None: raise ValueError("a convex polygon can't intialized with None") elif shell == [] or len(shell) < 3: @@ -128,12 +149,22 @@ class ConvexPolygon(object): "couldn't create the convex Polygon, to less points after using the convex hull on the input points") shell = list(convex_polygon.exterior.coords) area = convex_polygon.area - return (shell, area) + return shell, area def translation(self, x: float, y: float) -> None: + """Translates the polygon with the given input x and y values. + + All dependent attributes of the convex polygon will be updated. + + Args: + x (float): value to translate the polygon in x coordinate direction + y (float): value to translate the polygon in y coordinate direction + + Returns: + None: just the attributes of the polygon will be updated + """ self.__shell = [(point[0] + x, point[1] + y) for point in self.__shell] - self.__spine = ( - (self.__spine[0][0] + x, self.__spine[0][1] + y), (self.__spine[1][0] + x, self.__spine[1][1] + y)) + self.__spine = ((self.__spine[0][0]+x, self.__spine[0][1]+y), (self.__spine[1][0]+x, self.__spine[1][1]+y)) self.__vertices_left_visible = [(point[0] + x, point[1] + y) for point in self.__vertices_left_visible] self.__vertices_right_visible = [(point[0] + x, point[1] + y) for point in self.__vertices_right_visible] self.__min_x = self.__min_x + x @@ -143,39 +174,62 @@ class ConvexPolygon(object): self.__x_values = [vertex + x for vertex in self.__x_values] self.__y_values = [vertex + y for vertex in self.__y_values] - def set_spine(self) -> (Point_xy, - Point_xy): # für den spine spielt es keine Rolle in welche Rolle das Polygon aufgebaut ist ob im Uhrzeigersinn oder dagegen - y_sorted_p_p = sorted(self.__shell, key=lambda k: k[ - 1]) # Parser schreibt oder davon ausgeht das konvexe Polygone übergeben werden - if y_sorted_p_p[0][1] == y_sorted_p_p[1][ - 1]: # falls der niedrige Puntk eine wagerechte ist nehme die linke Ecke + def set_spine(self) -> (Point_xy, Point_xy): + """Builds the spine, which slope will be important to order the polygons later + + A tuple of the vertices with the smallest and biggest y value. if there are two vertices which have the same + smallest y value or biggest y value the left most vertex and the top right vertex will build the spine. + The spine also splits the polygon in from left_visible_vertices and from right_visible_vertices + + Returns: + spine_bottom, spine_top (Point_xy, Point_xy): a tuple a the lowest and highest vertex or bottom left and + top left + """ + y_sorted_p_p = sorted(self.__shell, key=lambda k: k[1]) # ordering the vertices to their y value + if y_sorted_p_p[0][1] == y_sorted_p_p[1][1]: # if there are two lowest vertices take the left one if y_sorted_p_p[0][0] < y_sorted_p_p[1][0]: spine_bottom = y_sorted_p_p[0] else: spine_bottom = y_sorted_p_p[1] else: spine_bottom = y_sorted_p_p[0] - if y_sorted_p_p[-2][1] == y_sorted_p_p[-1][ - 1]: # falls der höchste Punkt eine wagerechte ist nehme die rechte Ecke + if y_sorted_p_p[-2][1] == y_sorted_p_p[-1][1]: # if there are two highest vertices take right one if y_sorted_p_p[-2][0] < y_sorted_p_p[-1][0]: spine_top = y_sorted_p_p[-1] else: spine_top = y_sorted_p_p[-2] else: spine_top = y_sorted_p_p[-1] - return (spine_bottom, spine_top) + return spine_bottom, spine_top def set_slope(self) -> float: + """Builds the slope for the spine vertices + + The slope will be build with m = y2-y1/x2-x1. + + Returns: + slope (float): returns the slope of the spine vertices + """ spine = self.__spine - if spine[0][0] == spine[1][0]: # Sonderfall für eine senkrechte + if spine[0][0] == spine[1][0]: # case for a vertical spine slope = math.inf else: - slope = (spine[1][1] - spine[0][1]) / (spine[1][0] - spine[0][ - 0]) # m = y2-y1/x2-x1 Formel für die Geradensteigung mithilfe aus zwei verschiedenen Punkten der Geraden + slope = (spine[1][1] - spine[0][1]) / (spine[1][0] - spine[0][0]) return slope def plot_polygon(self, title="", plot_width=400, plot_height=300, color="#1F77B4", render=True) -> Figure: - """Plotting a Polygon with bokeh""" + """Plot object of the polygon + + Args: + title (str): the title for the plot + plot_width (int): the width of the plot + plot_height (int): the height of the plot + color (str): the fill_color of the polygon + render (bool): If True the polygon will also be rendered else not + + Returns: + fig (Figure): a plot Figure object which can be shown with bokeh command show(fig) + """ legend_items = [] height = (int(self.__height * 10)) / 10 if self.__slope == math.inf: @@ -211,28 +265,38 @@ class ConvexPolygon(object): return fig def splitter(self) -> ([Point_xy], [Point_xy]): + """Splits the vertices into vertices_visible from left and vertices_visible from right + + This splitting is important for the upcoming packing steps, when the polygons will be filled into high + class containers + + Returns: + left, right (([Point_xy], [Point_xy])): a tuple of the list of vertices visible from left and a list of + vertices visible from right + """ left = [] - right = [] spine_bottom = self.__spine[0] spine_top = self.__spine[1] help_array = self.__shell[:] - if help_array[0] == help_array[-1]: # falls letztes element doppelt + if help_array[0] == help_array[-1]: # do not need the duplicated/connecting last vertex of the shell help_array = help_array[0:-1] spine_bottom_found = False spine_top_found = False spine_bottom_not_horizontal = False - while spine_bottom_found == False: # Phase 1 der Funktion sie sucht den bottom spine, dabei werden die Ecken die nicht der Spine Bottom sind ans Ende der Liste geschoben + # cycling threw the vertices and searching for the spine bottom, which will be the start point + while spine_bottom_found == False: if help_array[0] == spine_bottom: - if spine_bottom[1] != help_array[-1][ - 1]: # checkt ob Spine bottom ein horizontalen Nachbar hat falls ja wird ein Flag gesetzt damit Spine bottomt später nicht in die Rechte mitgenommen wird + # if the bottom_spine_vertex has a horizontal neighbour, do not take it to the right_visible_vertices + if spine_bottom[1] != help_array[-1][1]: spine_bottom_not_horizontal = True spine_bottom_found = True left.append(help_array.pop(0)) else: help_array.append(help_array.pop(0)) - while spine_top_found == False: # iterieren die Liste erneut durch bis wir spine top finden, falls spine top gefunden wurde wird auch geschaut ob spine top ein horizontalen linken - if help_array[0] == spine_top: # Nachbar hat falls ja wird spine top nicht in die Linke Liste miteingefügt + while spine_top_found == False: # searching the spine top + if help_array[0] == spine_top: spine_top_found = True + # if the top_spine_vertex has a horizontal neighbour, do not take it to the left_visible_vertices if spine_top[1] != left[-1][1]: left.append(spine_top) else: @@ -240,10 +304,29 @@ class ConvexPolygon(object): right = help_array.copy() if spine_bottom_not_horizontal: right.append(spine_bottom) - return (left, right) + return left, right class HighClass(object): + """Holds the polygons which have a height between the HighClass self.min_border < polygon.height <= self.max_border + + Args: + i (int): represent the HighClass index + alpha (float): value which builds the HighClass borders + h_max_polygon (float): max height from all polygons to pack (not only from this HighClass) + w_max_polygon (float): max width from all polygons to pack (not only from this HighClass) + + Attributes: + i (int): represent the HighClass index + alpha (float): value which builds the HighClass borders + h_max_polygon (float): max height from all polygons to pack (not only from this HighClass) + w_max_polygon (float): max width from all polygons to pack (not only from this HighClass) + min_border (float): min border of the HighClass, only Polygons with height bigger will join this HighClass + max_border (float): max border of the HighClass, only Polygons with height smaller or equal will join this + HighClass + polygons ([ConvexPolygon]): Convex Polygons which fulfill the min_border and max_border condition + spine_ordered_polygons ([ConvexPolygon): the self.polygons ordered by their spines in ascending order + """ def __init__(self, i: int, alpha: float, h_max_polygon: float, w_max_polygon: float) -> None: self.i = i self.alpha = alpha @@ -255,11 +338,29 @@ class HighClass(object): self.spine_ordered_polygons = [] def set_polygons(self, polygons: [ConvexPolygon]) -> None: + """Set the polygons and the spine_ordered_polygons which fulfill the HighClass border conditions + + This function will be triggered by the function which creates the HighClass objects. + + Args: + polygons ([ConvexPolygon): these convex polygons fulfill the HighClass border conditions + """ self.polygons = polygons spine_ordered_polygons = sorted(self.polygons, key=lambda polygon: polygon.slope) self.spine_ordered_polygons = spine_ordered_polygons def plot_hc(self, ordered=False, render=True, plot_width=300, plot_height=300) -> Column: + """Plot object of the polygons of the HighClass with ordered or unordered spines + + Args: + ordered (bool): if True -> polygons will be spine ordered else not ordered polygons + render (bool): if True -> the plot will be rendered else not + plot_width (int): width of the plot figure + plot_height (int): height of the plot figure + + Returns: + grid_layout (Colums): plot object which can be rendered with show(grid_layout) + """ plots = [] if ordered: polygon_list = self.spine_ordered_polygons @@ -278,8 +379,22 @@ class HighClass(object): class Container(object): + """Container which holds the packed polygons from one HighClass + + Attributes: + hc (HighClass): reference to HighClass object + + Args: + hc (HighClass): reference to HighClass object + y_boundary (float): y coordinate boundary for the container + x_boundary (float): x coordinate boundary fot the container + Tree (Tree): avl-tree data structure + root (TreeNode): the root of the avl-tree datastructure + sigma ([ConvexPolygon]): the list of packed convex polygons from the HighClass + plot_steps ([Figure]): list of steps which are done to pack the container as plot objects + """ def __init__(self, hc: HighClass) -> None: - self.hc = hc # am ende nur zuweiseung ohne copy + self.hc = hc self.y_boundary = self.hc.max_border self.x_boundary = 0 self.Tree = avl_tree.AVLTree() @@ -287,21 +402,26 @@ class Container(object): self.sigma, self.plot_steps = self.packing_container(self.hc.spine_ordered_polygons) def distance(self, edge_points: (Point_xy, Point_xy), point: Point_xy) -> float: - # y = m*x+n - # (y-n)/m=x - # n = y-m*x + """Calculates the shortest distance between an edge and a point + + Args: + edge_points ((Point_xy, Point_xy)): edge of a polygon + point (): vertex from there the shortest distance to the edge will be calculated + + Returns: + distance (float): the shortest distance betwee the vertex and edge + """ edge_p1 = edge_points[0] edge_p2 = edge_points[1] - if edge_p1[0] == edge_p2[0]: # Sonderfall für eine senkrechte - distance = math.sqrt((edge_p1[0] - point[ - 0]) ** 2) # da der edge_points eine senkrechte ist -> der eintreffpunkt hat den gleichen y wert wie der punkt, in der Abstand formel fällt dieser wert weg - elif edge_p1[1] == point[1]: + if edge_p1[0] == edge_p2[0]: # if edge is a vertical + distance = math.sqrt((edge_p1[0] - point[0]) ** 2) + elif edge_p1[1] == point[1]: # if the first edge vertex and the vertex have the same y value distance = math.sqrt((edge_p1[0] - point[0]) ** 2 + (edge_p1[1] - point[1]) ** 2) else: - slope = (edge_p2[1] - edge_p1[1]) / (edge_p2[0] - edge_p1[ - 0]) # m = y2-y1/x2-x1 Formel für die Geradensteigung mithilfe aus zwei verschiedenen Punkten der Geraden - n = edge_p1[1] - (slope * edge_p1[0]) - intersection_point_x = (point[1] - n) / slope # x=(y-n)/m + slope = (edge_p2[1] - edge_p1[1]) / (edge_p2[0] - edge_p1[0]) # m = y2-y1/x2-x1 + # y = m*x+n used the Equation of a straight line and transformed it to get the missing parameters + n = edge_p1[1] - (slope * edge_p1[0]) # n = y - (m*x) + intersection_point_x = (point[1] - n) / slope # x = (y-n)/m intersection_point = (intersection_point_x, point[1]) distance = math.sqrt((intersection_point[0] - point[0]) ** 2 + (intersection_point[1] - point[1]) ** 2) return distance diff --git a/mysite/plots/plot_helpers.py b/mysite/plots/plot_helpers.py deleted file mode 100644 index 9dcf768dfb683ed5bf247ee8ec8b1f5907324411..0000000000000000000000000000000000000000 --- a/mysite/plots/plot_helpers.py +++ /dev/null @@ -1,92 +0,0 @@ -# import math -# from django.shortcuts import render -# from plotly.offline import plot -# import plots.polygon as poly -# from django.http import JsonResponse -# from plotly.graph_objs import Scatter -# import plotly.graph_objects as go -# from django.http import HttpResponse -# import pdb; pdb.set_trace -# from plotly.subplots import make_subplots -# import math -# -# def polygon_plot(polygons): -# plot_polygon_list = [] -# -# polygon_count = len(polygons) -# cols = 4 -# rows = math.ceil(polygon_count / cols) -# number = 0 -# sub_plot_titles = ['{} height:{} slope:{}'.format(number, -# (int(polygons[number].height * 10)) / 10, -# (int(polygons[number].slope * 10)) / 10) -# for number in range(0, polygon_count)] -# -# fig = make_subplots(rows=rows, cols=cols, subplot_titles=sub_plot_titles) -# fig.update_layout(title="Convex Polygons") -# counter = 0 -# for polygon in polygons: -# x_data = polygon.x_values -# y_data = polygon.y_values -# scatter = go.Scatter(x=x_data, y=y_data, -# mode='lines', name='{}'.format(counter), -# opacity=0.8, marker_color='green') -# -# spine_x_values = [x[0] for x in polygon.spine] -# spine_y_values = [x[1] for x in polygon.spine] -# scatter_spine = go.Scatter(x=spine_x_values, y=spine_y_values, -# mode='lines', name='{} Spine'.format(counter), -# opacity=0.8, marker_color='red') -# row = math.ceil((counter + 1) / cols) -# col = (counter % cols) + 1 -# fig.add_trace(scatter, row=row, col=col) -# fig.add_trace(scatter_spine, row=row, col=col) -# counter += 1 -# plot_polygons_div = plot(fig, output_type='div') -# return plot_polygons_div -# -# def high_class_plot(high_classes): -# plot_high_class_list = [] -# polygon_number = 0 -# polygon_title_number = 0 -# for hc in high_classes: -# polygon_count = len(hc.polygons) -# cols = 4 -# rows = math.ceil(polygon_count / cols) -# -# # sub_plot_titles = ['{} height:{} slope:{}'.format(number, -# # (int(hc.spine_ordered_polygons[number].height * 10)) / 10, -# # (int(hc.spine_ordered_polygons[number].slope * 10)) / 10) -# # for number in range(0, polygon_count)] -# sub_plot_titles=[] -# for polygon in hc.spine_ordered_polygons: -# -# sub_plot_titles.append('{} height:{} slope:{}'.format(polygon_title_number, (int(polygon.height*10))/10,(int(polygon.slope * 10)) / 10)) -# polygon_title_number += 1 -# fig = make_subplots(rows=rows, cols=cols, subplot_titles=sub_plot_titles) -# fig.update_layout(title="Highclass {} heights: {}-{}".format(hc.i, int(hc.min_border), int(hc.max_border))) -# counter = 0 -# -# for polygon in hc.spine_ordered_polygons: -# x_data = polygon.x_values -# y_data = polygon.y_values -# scatter = go.Scatter(x=x_data, y=y_data, -# mode='lines', name='{}'.format(polygon_number), -# opacity=0.8, marker_color='green') -# -# spine_x_values = [x[0] for x in polygon.spine] -# spine_y_values = [x[1] for x in polygon.spine] -# scatter_spine = go.Scatter(x=spine_x_values, y=spine_y_values, -# mode='lines', name='{} Spine'.format(polygon_number), -# opacity=0.8, marker_color='red') -# row = math.ceil((counter + 1) / cols) -# col = (counter % cols) + 1 -# fig.add_trace(scatter, row=row, col=col) -# fig.add_trace(scatter_spine, row=row, col=col) -# counter += 1 -# polygon_number += 1 -# plt_div = plot(fig, output_type='div') -# plot_high_class_list.append(plt_div) -# return plot_high_class_list -# -# diff --git a/mysite/plots/views2_with_csv.py b/mysite/plots/views2_with_csv.py deleted file mode 100644 index ee633b4f6cd016dc6daef288a4c787a9fd69685e..0000000000000000000000000000000000000000 --- a/mysite/plots/views2_with_csv.py +++ /dev/null @@ -1,246 +0,0 @@ -from django.shortcuts import render - -# Create your views here. - -import json -from django.shortcuts import render -from django.views import View - - -from django.http import HttpResponseRedirect -import plots.packing_algo as poly -from bokeh.embed import file_html -from bokeh.models import BoxZoomTool -from django.views.generic import TemplateView -import matplotlib -from django.http import JsonResponse - -from django.http import HttpResponse -import pdb;pdb.set_trace -import matplotlib.pyplot as plt -import mpld3 - -import math -from plots import plot_helpers -from bokeh.plotting import figure, output_file, show -from bokeh.resources import CDN -from bokeh.models.widgets import Panel, Tabs -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 -import pandas - - -def index(request): - - convex_polygons = poly.create_multiple_convex_polygons(10,9) - cc = poly.ConvexContainer(convex_polygons) - plot_steps = cc.plot_steps(render=False) - plot_steps_html = file_html(plot_steps, CDN, "my plot2") - - return render(request, 'plots/packed_polygons.html', context={"plot_steps":plot_steps_html}) - - # 'high_classes': plot_high_class_list,}) - # 'hc_container': hc_container}) - -class PackingRectContainer(View): - def get(self, request, *args, **kwargs): - cc = poly.pack_polygons( PolygonEditView.polygons) - plot_steps = cc.plot_steps(render=False) - plot_steps_html = file_html(plot_steps, CDN, "my plot23") - #PackingPolygons.context["packed_polygons"]=plot_steps_html - return render(request, 'plots/packed_polygons.html', context={"plot_steps": plot_steps_html}) - - -class PackingRotatedRectContainer(View): - def get(self, request, *args, **kwargs): - cc = poly.ConvexContainer(PolygonEditView.polygons,steps=90) - plot_steps = cc.plot_steps(render=False) - plot_steps_html = file_html(plot_steps, CDN, "my plot23") - # PackingPolygons.context["packed_polygons"]=plot_steps_html - return render(request, 'plots/packed_polygons.html', context={"plot_steps": plot_steps_html}) - - -class CSVPolygons(View): - def get(self,request,): - PolygonEditView.csv_polygons = [] - PolygonEditView.polygons = PolygonEditView.drawn_polygons - PolygonEditView.context["csv_polygons"] = "Cleared" - - if len(PolygonEditView.polygons) != 0: - polygons_single_plot = poly.plot_polygons_in_single_plot(PolygonEditView.drawn_polygons, plot_height=850, plot_width=2000, - render=False) - polygons_single_plot_html = file_html(polygons_single_plot, CDN, "single plot") - else: - polygons_single_plot_html = "No Polygons" - PolygonEditView.context["polygons_single_plot"] = polygons_single_plot_html - return HttpResponseRedirect('/test/') - - def post(self, request, *args, **kwargs): - df = pandas.read_csv('plots/polygon.txt',sep="#") - csv_polygons =[] - for csv_polygon in df["Polygon"]: - polygon_shell = eval(csv_polygon) - polygon = poly.ConvexPolygon(polygon_shell) - csv_polygons.append(polygon) - plot_csv = poly.plot_polygons(csv_polygons, render=False) - PolygonEditView.csv_polygons = csv_polygons - PolygonEditView.polygons = PolygonEditView.drawn_polygons+csv_polygons - polygons_single_plot = poly.plot_polygons_in_single_plot(PolygonEditView.polygons, plot_height=850, plot_width=2000, - render=False) - polygons_csv_plot_html = file_html(plot_csv, CDN, "my plot") - polygons_single_plot_html = file_html(polygons_single_plot, CDN, "single plot") - PolygonEditView.context["csv_polygons"] = polygons_csv_plot_html - PolygonEditView.context["polygons_single_plot"] = polygons_single_plot_html - x_values=[] - y_values=[] - # for polygon in csv_polygons: - # PolygonEditView.colum_data_x.append(polygon.x_values) - # PolygonEditView.colum_data_y.append(polygon.y_values) - #PolygonEditView.colum_data_x, - #y = PolygonEditView.colum_data_y - return HttpResponseRedirect('/test/') - - -class PackingConvexContainer(View): - # context = {} - def get(self, request, *args, **kwargs): - cc = poly.ConvexContainer(PolygonEditView.polygons, steps=1) - plot_steps = cc.plot_steps(render=False) - plot_steps_html = file_html(plot_steps, CDN, "my plot23") - # PackingPolygons.context["packed_polygons"]=plot_steps_html - return render(request, 'plots/packed_polygons.html', context={"plot_steps": plot_steps_html}) - def post(self, request, *args, **kwargs): - angle = int(request.POST["angle"]) - cc = poly.ConvexContainer(PolygonEditView.polygons, steps=angle) - plot_steps = cc.plot_steps(render=False) - plot_steps_html = file_html(plot_steps, CDN, "my plot23") - return render(request, 'plots/packed_polygons.html', context={"plot_steps": plot_steps_html}) - - - -class PolygonEditView(View): - context = {} - polygons = [] - drawn_polygons=[] - csv_polygons = [] - #all_polygons=[] - plot_min_x = 0 - plot_max_x = 100 - plot_min_y = 0 - plot_max_y = 100 - colum_data_x =[] # wil be a list of lists - colum_data_y =[] - def get(self, request, *args, **kwargs): - TOOLTIPS = [("index", "$index"), ("(x,y)", "($x{1.1}, $y{1.1})"), ] - source = ColumnDataSource(data=dict(x=PolygonEditView.colum_data_x, - y=PolygonEditView.colum_data_y), - name='my-data-source') - - p = figure(x_range=(PolygonEditView.plot_min_x, PolygonEditView.plot_max_x), y_range=(PolygonEditView.plot_min_y, PolygonEditView.plot_max_y), width=1000, height=1000, - title='Poly Edit Tool', tooltips=TOOLTIPS) - p.aspect_ratio = 1 - 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 = draw_tool - response = file_html(p, CDN, "my plot") - PolygonEditView.context["response"] = response - - - return render(request, 'plots/test.html', PolygonEditView.context) - - def post(self, request, *args, **kwargs): - - # df = pandas.read_csv('plots/polygon.txt', sep="+") - # csv_polygons =[] - # for csv_polygon in df["Polygon"]: - # polygon_shell = eval(csv_polygon) - # polygon = poly.ConvexPolygon(polygon_shell) - # csv_polygons.append(polygon) - # print(csv_polygons) - test = request.POST["your_name"] - dict_poly = json.loads(test) - print(dict_poly["x"]) - print(dict_poly["y"]) - PolygonEditView.colum_data_x.clear() - PolygonEditView.colum_data_y.clear() - - for poly_x in dict_poly["x"]: - PolygonEditView.colum_data_x.append(poly_x) - for poly_y in dict_poly["y"]: - PolygonEditView.colum_data_y.append(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) - drawn_polygons=[] - polygon_max_x_list=[] - polygon_min_x_list = [] - polygon_min_y_list = [] - polygon_max_y_list=[] - for polygon in polygon_list: - if len(polygon)<3: - continue - if polygon[0]!= polygon[-1]: - polygon.append(polygon[0]) - polygon2 = poly.ConvexPolygon(polygon) - print("konkav",list(polygon2.shell)) - #polygon_parent_class = polygon2.convex_hull - #polygon2 = poly.Polygon2(list(polygon_parent_class.exterior.coords)) - polygon_max_x_list.append(polygon2.max_x) - polygon_min_x_list.append(polygon2.min_x) - polygon_max_y_list.append(polygon2.max_y) - polygon_min_y_list.append(polygon2.min_y) - drawn_polygons.append(polygon2) - PolygonEditView.drawn_polygons = drawn_polygons - all_polygons = drawn_polygons + self.csv_polygons - PolygonEditView.polygons = all_polygons - PolygonEditView.plot_max_y = max(polygon_max_y_list) - PolygonEditView.plot_min_y = min(polygon_min_y_list) - PolygonEditView.plot_max_x = max(polygon_max_x_list) - PolygonEditView.plot_min_x = min(polygon_min_x_list) - - - polygons_single_plot = poly.plot_polygons_in_single_plot(all_polygons,plot_height=850, plot_width=2000,render=False) - plot_drawn = poly.plot_polygons(drawn_polygons,render=False) - #plot_csv = poly.plot_polygons(csv_polygons, render=False) - # print(type(test)) - # p = figure() - # p.multi_line("x", "y", source=source) - polygons_dawn_plot_html = file_html(plot_drawn, CDN, "my plot") - #polygons_csv_plot_html = file_html(plot_csv, CDN, "my plot") - polygons_single_plot_html = file_html(polygons_single_plot, CDN, "single plot") - #self.polygons.append(response2) - PolygonEditView.context["drawn_polygons"] = polygons_dawn_plot_html - #PolygonEditView.context["csv_polygons"] = polygons_csv_plot_html - PolygonEditView.context["polygons_single_plot"] = polygons_single_plot_html - - return HttpResponseRedirect('/test/') -