Пример #1
0
    def get_3d(self, cell, numribs=0, midribs=None, with_numpy=False):
        """
        Get 3d-Panel
        :param glider: glider class
        :param numribs: number of miniribs to calculate
        :return: List of rib-pieces (Vectorlist)
        """
        xvalues = cell.rib1.profile_2d.x_values
        ribs = []
        for i in range(numribs + 1):
            y = i / numribs

            if midribs is None:
                midrib = cell.midrib(y, with_numpy)
            else:
                midrib = midribs[i]

            x1 = self.cut_front["left"] + y * (self.cut_front["right"] -
                                               self.cut_front["left"])
            front = get_x_value(xvalues, x1)

            x2 = self.cut_back["left"] + y * (self.cut_back["right"] -
                                              self.cut_back["left"])
            back = get_x_value(xvalues, x2)
            ribs.append(midrib.get(front, back))
            # todo: return polygon-data
        return ribs
Пример #2
0
 def get_3d(self, glider, numribs=0):
     """
     Get 3d-Panel
     :param glider: glider class
     :param numribs: number of miniribs to calculate
     :return: List of rib-pieces (Vectorlist)
     """
     cell = glider.cells[self.cell_no]
     xvalues = glider.x_values
     numribs += 1
     ribs = []
     for i in range(numribs):
         y = i / numribs
         front = get_x_value(xvalues, self.l_1 + y * (self.l_1 - self.r_1))
         back = get_x_value(xvalues, self.l_2 + y * (self.l_2 - self.r_2))
         ribs.append(cell.midrib(y).get(front, back))
         # todo: return polygon-data
     return ribs
Пример #3
0
 def get_3d(self, glider, numribs=0):
     """
     Get 3d-Panel
     :param glider: glider class
     :param numribs: number of miniribs to calculate
     :return: List of rib-pieces (Vectorlist)
     """
     cell = glider.cells[self.cell_no]
     xvalues = glider.x_values
     numribs += 1
     ribs = []
     for i in range(numribs):
         y = i / numribs
         front = get_x_value(xvalues, self.l_1 + y * (self.l_1 - self.r_1))
         back = get_x_value(xvalues, self.l_2 + y * (self.l_2 - self.r_2))
         ribs.append(cell.midrib(y).get(front, back))
         # todo: return polygon-data
     return ribs
Пример #4
0
    def _get_inner_outer(self, x_value):
        ik = get_x_value(self.x_values, x_value)

        #ik = get_x_value(self.x_values, position)
        inner = self.inner[ik]
        outer = inner + PolyLine2D(
            self.inner).get_normal(ik) * self.config.allowance_general
        #inner = self.inner[ik]
        # outer = self.outer[ik]
        return inner, outer
Пример #5
0
    def _get_ik_values(self, cell, numribs=0):
        """
        :param cell: the parent cell of the panel
        :param numribs: number of interpolation steps between ribs
        :return: [[front_ik_0, back_ik_0], ...[front_ik_n, back_ik_n]] with n is numribs + 1
        """
        x_values = cell.rib1.profile_2d.x_values
        ik_values = [
            [get_x_value(x_values, self.cut_front["left"]), get_x_value(x_values, self.cut_back["left"])]
        ]

        for i in range(numribs):
            y = float(i+1)/(numribs+1)
            x_front = self.cut_front["left"] + y * (self.cut_front["right"] -
                                                    self.cut_front["left"])

            x_back = self.cut_back["left"] + y * (self.cut_back["right"] -
                                                  self.cut_back["left"])

            front = get_x_value(x_values, x_front)
            back = get_x_value(x_values, x_back)

            ik_values.append([front, back])

        ik_values.append(
            [get_x_value(x_values, self.cut_front["right"]), get_x_value(x_values, self.cut_back["right"])]
        )

        return ik_values
Пример #6
0
 def _insert_text(self, plotpart):
     if self.config.layout_seperate_panels and not self.panel.is_lower():
         left = get_x_value(self.x_values, self.panel.cut_back["left"])
         right = get_x_value(self.x_values, self.panel.cut_back["right"])
         p2 = self.ballooned[1][right]
         p1 = self.ballooned[0][left]
         align = "left"
     else:
         left = get_x_value(self.x_values, self.panel.cut_front["left"])
         right = get_x_value(self.x_values, self.panel.cut_front["right"])
         p1 = self.ballooned[1][right]
         p2 = self.ballooned[0][left]
         align = "right"
     text = self.panel.name
     part_text = Text(text,
                      p1,
                      p2,
                      size=self.config.allowance_design * 0.8,
                      align=align,
                      valign=0.6,
                      height=0.8).get_vectors()
     plotpart.layers["text"] += part_text
Пример #7
0
    def _insert_center_rods(self, plotpart):
        start = -0.15
        end = 0.15

        front = (self.panel.cut_front["left"] +
                 self.panel.cut_front["right"]) / 2
        back = (self.panel.cut_back["left"] + self.panel.cut_back["right"]) / 2

        if end < min(self.panel.cut_front["left"],
                     self.panel.cut_front["right"]):
            return
        elif start > max(self.panel.cut_back["left"],
                         self.panel.cut_back["right"]):
            return

        k_start = get_x_value(self.x_values, start)
        k_end = get_x_value(self.x_values, end)

        middle_line = self._get_middle_line(0.5)

        curve_left = self.ballooned[0]
        curve_right = self.ballooned[1]

        # cut with front and back
        front_left = curve_left[get_x_value(self.x_values,
                                            self.panel.cut_front["left"])]
        front_right = curve_right[get_x_value(self.x_values,
                                              self.panel.cut_front["right"])]
        back_left = curve_left[get_x_value(self.x_values,
                                           self.panel.cut_back["left"])]
        back_right = curve_right[get_x_value(self.x_values,
                                             self.panel.cut_back["right"])]

        cut_fronts = middle_line.cut(front_left,
                                     front_right,
                                     startpoint=k_start,
                                     extrapolate=True)
        cut_backs = middle_line.cut(back_left,
                                    back_right,
                                    startpoint=k_end,
                                    extrapolate=True)

        cut_front = next(cut_fronts)[0]
        cut_back = next(cut_backs)[0]

        k_front = max(k_start, cut_front)
        k_back = min(k_end, cut_back)

        #print(cut_front, k_front, cut_back, k_back, self.panel.cut_front, self.panel.cut_back)

        if k_back > k_front:

            plotpart.layers["marks"] += [middle_line[k_front:k_back]]

            if front < start < back:
                k_start = get_x_value(self.x_values, start)
                plotpart.layers["L0"].append(PolyLine2D([middle_line[k_start]
                                                         ]))

            if front < end < back:
                k_end = get_x_value(self.x_values, end)
                plotpart.layers["L0"].append(PolyLine2D([middle_line[k_end]]))
Пример #8
0
    def _insert_attachment_points(self, plotpart, attachment_points):
        for attachment_point in attachment_points:
            if hasattr(attachment_point, "cell"):
                if attachment_point.cell != self.cell:
                    continue

                cell_pos = attachment_point.cell_pos

            elif hasattr(attachment_point, "rib"):

                if attachment_point.rib not in self.cell.ribs:
                    continue

                if attachment_point.rib == self.cell.rib1:
                    cell_pos = 0
                    align = ("left", "right")
                elif attachment_point.rib == self.cell.rib2:
                    cell_pos = 1

            cut_f_l = self.panel.cut_front["left"]
            cut_f_r = self.panel.cut_front["right"]
            cut_b_l = self.panel.cut_back["left"]
            cut_b_r = self.panel.cut_back["right"]
            cut_f = cut_f_l + cell_pos * (cut_f_r - cut_f_l)
            cut_b = cut_b_l + cell_pos * (cut_b_r - cut_b_l)

            if cut_f <= attachment_point.rib_pos <= cut_b:
                rib_pos = attachment_point.rib_pos
                left, right = self.get_point(rib_pos)

                p1 = left + cell_pos * (right - left)
                d = normalize(right - left) * 0.008  # 8mm
                if cell_pos == 1:
                    p2 = p1 + d
                else:
                    p2 = p1 - d
                #p1, p2 = self.get_p1_p2(attachment_point.rib_pos, which)
                plotpart.layers["marks"] += self.config.marks_attachment_point(
                    p1, p2)
                plotpart.layers[
                    "L0"] += self.config.marks_laser_attachment_point(p1, p2)

                if self.config.insert_attachment_point_text:
                    text_align = "left" if cell_pos > 0.7 else "right"

                    if text_align == "right":
                        d1 = norm(self.get_point(cut_f_l)[0] - left)
                        d2 = norm(self.get_point(cut_b_l)[0] - left)
                    else:
                        d1 = norm(self.get_point(cut_f_r)[1] - right)
                        d2 = norm(self.get_point(cut_b_r)[1] - right)

                    bl = self.ballooned[0]
                    br = self.ballooned[1]

                    text_height = 0.01 * 0.8
                    dmin = text_height + 0.001

                    if d1 < dmin and d2 + d1 > 2 * dmin:
                        offset = dmin - d1
                        ik = get_x_value(self.x_values, rib_pos)
                        left = bl[bl.extend(ik, offset)]
                        right = br[br.extend(ik, offset)]
                    elif d2 < dmin and d1 + d2 > 2 * dmin:
                        offset = dmin - d2
                        ik = get_x_value(self.x_values, rib_pos)
                        left = bl[bl.extend(ik, -offset)]
                        right = br[br.extend(ik, -offset)]

                    if self.config.layout_seperate_panels and self.panel.is_lower:
                        # rotated later
                        p2 = left
                        p1 = right
                        # text_align = text_align
                    else:
                        p1 = left
                        p2 = right
                        # text_align = text_align
                    plotpart.layers["text"] += Text(
                        " {} ".format(attachment_point.name),
                        p1,
                        p2,
                        size=0.01,  # 1cm
                        align=text_align,
                        valign=0,
                        height=0.8).get_vectors()
Пример #9
0
    def get_p1_p2(self, x, which):
        side = {"left": 0, "right": 1}[which]
        ik = get_x_value(self.x_values, x)

        return self.ballooned[side][ik], self.outer_orig[side][ik]
Пример #10
0
 def get_point(self, x):
     ik = get_x_value(self.x_values, x)
     return [lst[ik] for lst in self.ballooned]
Пример #11
0
    def get_mesh(self, cell, numribs=0, with_numpy=False):
        """
        Get Panel-mesh
        :param cell: the parent cell of the panel
        :param numribs: number of interpolation steps between ribs
        :param with_numpy: compute midribs with numpy (faster if available)
        :return: mesh objects consisting of triangles and quadrangles
        """
        numribs += 1
        # TODO: doesnt work for numribs=0?
        xvalues = cell.rib1.profile_2d.x_values
        ribs = []
        points = []
        nums = []
        count = 0
        for rib_no in range(numribs + 1):
            y = rib_no / max(numribs, 1)
            x1 = self.cut_front["left"] + y * (self.cut_front["right"] -
                                               self.cut_front["left"])
            front = get_x_value(xvalues, x1)

            x2 = self.cut_back["left"] + y * (self.cut_back["right"] -
                                              self.cut_back["left"])
            back = get_x_value(xvalues, x2)
            midrib = cell.midrib(y, with_numpy=with_numpy)
            ribs.append([x for x in midrib.get_positions(front, back)])
            points += list(midrib[front:back])
            nums.append([i + count for i, _ in enumerate(ribs[-1])])
            count += len(ribs[-1])

        triangles = []

        # helper functions
        def left_triangle(l_i, r_i):
            return [l_i + 1, l_i, r_i]

        def right_triangle(l_i, r_i):
            return [r_i + 1, l_i, r_i]

        def quad(l_i, r_i):
            return [l_i + 1, l_i, r_i, r_i + 1]

        for rib_no, _ in enumerate(ribs[:-1]):
            num_l = nums[rib_no]
            num_r = nums[rib_no + 1]
            pos_l = ribs[rib_no]
            pos_r = ribs[rib_no + 1]
            l_i = r_i = 0
            while l_i < len(num_l)-1 or r_i < len(num_r)-1:
                if l_i == len(num_l) - 1:
                    triangles.append(right_triangle(num_l[l_i], num_r[r_i]))
                    r_i += 1

                elif r_i == len(num_r) - 1:
                    triangles.append(left_triangle(num_l[l_i], num_r[r_i]))
                    l_i += 1

                elif abs(pos_l[l_i] - pos_r[r_i]) == 0:
                    triangles.append(quad(num_l[l_i], num_r[r_i]))
                    r_i += 1
                    l_i += 1

                elif pos_l[l_i] <= pos_r[r_i]:
                    triangles.append(left_triangle(num_l[l_i], num_r[r_i]))
                    l_i += 1

                elif pos_r[r_i] < pos_l[l_i]:
                    triangles.append(right_triangle(num_l[l_i], num_r[r_i]))
                    r_i += 1
        #connection_info = {cell.rib1: np.array(ribs[0], int),
        #                   cell.rib2: np.array(ribs[-1], int)}
        return Mesh.from_indexed(points, {"panel_"+self.material_code: triangles}, name=self.name)