From dba30babc0c85953a02f2446bd44abd7b5b11311 Mon Sep 17 00:00:00 2001 From: yuxiang Date: Mon, 11 Sep 2023 21:17:46 +0200 Subject: [PATCH 1/2] rewrote the wall thing --- amworkflow/api.py | 8 +- .../src/geometries/composite_geometry.py | 718 ++++-------------- amworkflow/src/geometries/property.py | 28 +- amworkflow/src/geometries/simple_geometry.py | 81 +- amworkflow/src/utils/meter.py | 11 + amworkflow/src/utils/system.py | 2 + amworkflow/src/utils/visualizer.py | 61 ++ environment.yml | 1 + examples/TrussArc/print110823.csv | 123 +++ examples/TrussArc/trussarc.py | 34 + some_thoughts_20230822_new/guii/1.py | 75 ++ .../guii/try_qt_thread.py | 96 +++ .../test_largest_poly/1.py | 4 + .../test_largest_poly/test_split.stl | Bin 0 -> 433484 bytes .../test_new_idea/try1.py | 10 + .../try_new_thought/sucess_new_scheme.stl | Bin 0 -> 10084 bytes .../try_new_thought/sucess_new_scheme2.stl | Bin 0 -> 45684 bytes .../try_new_thought/sucess_new_scheme3.stl | Bin 0 -> 4284 bytes .../try_new_thought/trail_3.py | 21 +- .../try_new_thought/trail_4.py | 12 +- .../try_new_thought/trail_5.py | 4 +- .../try_new_thought/visulize_intersect.py | 5 + 22 files changed, 678 insertions(+), 616 deletions(-) create mode 100644 amworkflow/src/utils/meter.py create mode 100644 amworkflow/src/utils/system.py create mode 100644 examples/TrussArc/print110823.csv create mode 100644 examples/TrussArc/trussarc.py create mode 100644 some_thoughts_20230822_new/guii/1.py create mode 100644 some_thoughts_20230822_new/guii/try_qt_thread.py create mode 100644 some_thoughts_20230822_new/test_largest_poly/1.py create mode 100644 some_thoughts_20230822_new/test_largest_poly/test_split.stl create mode 100644 some_thoughts_20230822_new/test_new_idea/try1.py create mode 100644 some_thoughts_20230822_new/try_new_thought/sucess_new_scheme.stl create mode 100644 some_thoughts_20230822_new/try_new_thought/sucess_new_scheme2.stl create mode 100644 some_thoughts_20230822_new/try_new_thought/sucess_new_scheme3.stl create mode 100644 some_thoughts_20230822_new/try_new_thought/visulize_intersect.py diff --git a/amworkflow/api.py b/amworkflow/api.py index 6ae72da..bd1fd77 100644 --- a/amworkflow/api.py +++ b/amworkflow/api.py @@ -318,10 +318,10 @@ def create_sym_hexagon1_infill(total_len: float, total_wid:float, height:float, # """ # return cg.create_wall_by_points(pts, th, isclose, height,debug, debug_type, output,interpolate, R) - @staticmethod - class CreateWallByPoints(cg.CreateWallByPoints): - def __init__(self, pts: list, th: float, height: float): - super().__init__(pts,th,height) + # @staticmethod + class CreateWallByPoints(cg.CreateWallByPointsUpdate): + def __init__(self, pts: list, th: float, height: float, is_close:bool = True): + super().__init__(pts,th,height,is_close) @staticmethod def get_face_center_of_mass(face: TopoDS_Face, gp_pnt: bool = False) -> tuple | gp_Pnt: diff --git a/amworkflow/src/geometries/composite_geometry.py b/amworkflow/src/geometries/composite_geometry.py index e0b4ebc..604296b 100644 --- a/amworkflow/src/geometries/composite_geometry.py +++ b/amworkflow/src/geometries/composite_geometry.py @@ -1,6 +1,6 @@ from amworkflow.src.geometries.simple_geometry import create_edge, create_wire, create_face, create_prism, random_polygon_constructor, angle_of_two_arrays, laterality_indicator, angular_bisector, p_center_of_mass, linear_interpolate, Pnt, Segments from amworkflow.src.geometries.operator import reverse, geom_copy, translate, rotate_face, fuser, hollow_carver, cutter3D, bender -from amworkflow.src.geometries.property import topo_explorer, p_bounding_box +from amworkflow.src.geometries.property import topo_explorer, p_bounding_box,shortest_distance_point_line, p_get_face_area from amworkflow.src.geometries.builder import solid_maker from OCC.Core.gp import gp_Pnt import numpy as np @@ -13,6 +13,7 @@ import itertools import copy as cp import networkx as nx +from amworkflow.src.utils.meter import timer def polygon_maker(side_num: int, @@ -187,183 +188,6 @@ def create_sym_hexagon1_infill(total_len: float, total_wid:float, height:float, p0 = [0,th * 0.5] p1 = [] -# def create_wall_by_points(pts:list, th: float, isclose:bool, height: float = None, debug: bool = False, debug_type: str = "linear", output: str = "prism", interpolate:float = None, R: float = None) -> np.ndarray or TopoDS_Face or TopoDS_Shell: - """ - @brief Create a prism wall by points. It takes a list of points as a skeleton of a central path and then build a strip or a loop. - @param pts list of 2D points that define the wall. The algorithm can compute points in 3D theoretically but the result may make no sense. - @param th thickness of the wall. - @param isclose True if the wall is closed (loop) - @param height height of the wall if a prism is needed. - @param debug if True output two groups of points for plotting. - @param output selecting result intended to output. can be varied among "face" and "prism". - @return two arrays or a face or a prism. - """ - is_loop = False - pts = [np.array(list(i.Coord())) if isinstance(i, gp_Pnt) else np.array(i) for i in pts] - if R is not None: - pts = polygon_interpolater(pts, interpolate) - bender(pts, R) - pts = [i for i in pts] - th *= 0.5 - opt_pts = [] - vecs = [] - dir_vecs = [] - ths = [] - lft_pts = [] - rgt_pts = [] - segaments = [] - for i,p in enumerate(pts): - if i != len(pts) - 1: - a1 = pts[i+1] - pts[i] - if i == 0: - if isclose: - dr = angular_bisector(pts[-1] - p, a1) - # ang = angle_of_two_arrays(dir_vecs[i-1],dr) - ang2 = angle_of_two_arrays(laterality_indicator(p - pts[-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(th / np.cos(ang_th)) - else: - dr = laterality_indicator(a1, True) - nth = th - else: - dr = angular_bisector(-vecs[i-1], a1) - ang2 = angle_of_two_arrays(laterality_indicator(vecs[i-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(th / np.cos(ang_th)) - else: - if isclose: - a1 = pts[0] - pts[i] - dr = angular_bisector(-vecs[i-1], a1) - ang2 = angle_of_two_arrays(laterality_indicator(vecs[i-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(th / np.cos(ang_th)) - else: - dr = laterality_indicator(a1, True) - nth = th - vecs.append(a1) - ths.append(nth) - dir_vecs.append(dr) - lft_pts.append(dr * nth + p) - opt_pts.append(dr * nth + p) - if isclose: - lft_pts.append(lft_pts[0]) - for i,p in enumerate(pts[::-1]): - dr = -dir_vecs[::-1][i] - nth = ths[::-1][i] - rgt_pts.append(dr * nth + p) - if isclose: - rgt_pts.append(rgt_pts[0]) - pts.append(pts[0]) - #find bounding box if bending needed - if R is not None: - mxpt, mnpt = p_bounding_box(lft_pts+rgt_pts) - # Deal with overlapping sides. - lft_pts = break_overlap(lft_pts) - rgt_pts = break_overlap(rgt_pts) - loops_lft_pt_i, peak_lft_pt_i = find_loop(lft_pts) - loops_rgt_pt_i, peak_rgt_pt_i = find_loop(rgt_pts) - if (len(loops_lft_pt_i+peak_lft_pt_i)>0) or (len(loops_rgt_pt_i+peak_rgt_pt_i)>0): - is_loop = True - loops_lft = index2array(loops_lft_pt_i, lft_pts) - loops_rgt = index2array(loops_rgt_pt_i, rgt_pts) - loops = loops_lft+loops_rgt - # if interpolate is not None: - # for i in range(len(loops)): - # loops[i] = polygon_interpolater(loops[i], interpolate) - # if R is not None: - # bender(loops[i], mxpt, mnpt) - loops_h = find_topology(loops) - - if debug: - if debug_type == "polygon": - fig, ax = plt.subplots() - for polygon in loops: - poly2d = np.array([[i[0], i[1]] for i in polygon]) - polygon_patch = Polygon(poly2d, closed=True, fill=False, edgecolor='black') - ax.add_patch(polygon_patch) - ax.set_xlabel('X-axis') - ax.set_ylabel('Y-axis') - ax.set_xlim(-200, 200) - ax.set_ylim(-200, 200) - ax.set_title('Visualization of Polygons') - plt.show() - elif debug_type == "linear": - plt.figure(figsize=(8, 6)) # Optional: Set the figure size - output1 = np.array(lft_pts) - output2 = np.array(rgt_pts) - talist = np.array(pts).T - toutput1 = output1.T - toutput2 = output2.T - x1 = talist[0] - y1 = talist[1] - x2 = toutput1[0] - y2 = toutput1[1] - x3 = toutput2[0] - y3 = toutput2[1] - plt.plot(x1, y1, 'bo-', label='central path') - # Plot Group 2 points and connect with lines in red - plt.plot(x2, y2, 'ro-', label='outer line') - # Plot Group 3 points and connect with lines in green - plt.plot(x3, y3, 'go-', label='inner line') - # Add labels and a legend - for i in range(x2.shape[0]): - plt.text(x2[i], y2[i], str(i)) - for i in range(x3.shape[0]): - plt.text(x3[i], y3[i], str(i)) - - plt.xlabel('X-axis') - plt.ylabel('Y-axis') - plt.legend() - plt.axis('equal') - plt.grid(True) # Optional: Add grid lines - plt.show() - else: - if not is_loop: - gp_pts_lft = [gp_Pnt(i[0],i[1],i[2]) for i in lft_pts] - gp_pts_rgt = [gp_Pnt(i[0],i[1],i[2]) for i in rgt_pts] - gp_pts = [gp_Pnt(i[0],i[1],i[2]) for i in opt_pts] - poly = random_polygon_constructor(gp_pts) - else: - for i,v in enumerate(loops_h): - for j,vv in enumerate(loops_h[i]): - loops_h[i][j] = list(loops_h[i][j]) - for ind,k in enumerate(loops_h[i][j]): - loops_h[i][j][ind] = gp_Pnt(k[0], k[1], k[2]) - poly0 = random_polygon_constructor(loops_h[0][0]) - poly_r = poly0 - for i, h in enumerate(loops_h): - if i == 0: - continue - for j in h: - poly_c = random_polygon_constructor(j) - poly_r = cutter3D(poly_r, poly_c) - poly = poly_r - match output: - case "face": - if not isclose: - return poly - else: - return poly - case "prism": - pr = create_prism(poly, [0,0,height],True) - # top = geom_copy(poly) - # translate(top,[0,0,height]) - # opt = sewer([top,pr,poly]) - # print(opt) - pr_face = topo_explorer(pr,"face") - pr_remake = sewer(pr_face) - opt = solid_maker(pr_remake) - return opt - def find_intersect(lines: np.ndarray) -> np.ndarray: parallel = False coplanarity = False @@ -408,7 +232,6 @@ def index2array(ind: list, array: np.ndarray): real_array.append(item) return real_array - def polygon_interpolater(plg: np.ndarray, step_len: float = None, num: int = None, isclose: bool = True): def deter_dum(line: np.ndarray): ratio = step_len / np.linalg.norm(line[0]-line[1]) @@ -445,405 +268,20 @@ def deter_dum(line: np.ndarray): pos +=p_num+1 return new_plg -# def create_wall_by_points2(pts:list, th: float, isclose:bool, height: float = None, debug: bool = False, output: str = "prism", interpolate:float = None, R: float = None) -> np.ndarray or TopoDS_Face or TopoDS_Shell: - """ - @brief Create a prism wall by points. It takes a list of points as a skeleton of a central path and then build a strip or a loop. - @param pts list of 2D points that define the wall. The algorithm can compute points in 3D theoretically but the result may make no sense. - @param th thickness of the wall. - @param isclose True if the wall is closed (loop) - @param height height of the wall if a prism is needed. - @param debug if True output two groups of points for plotting. - @param output selecting result intended to output. can be varied among "face" and "prism". - @return two arrays or a face or a prism. - """ - pts = [np.array(list(i.Coord())) if isinstance(i, gp_Pnt) else np.array(i) for i in pts] - if R is not None: - pts = polygon_interpolater(pts, interpolate) - bender(pts, R) - pts = [i for i in pts] - th += 0.1 - th *= 0.5 - vecs = [] - dir_vecs = [] - ths = [] - lft_pts = [] - rgt_pts = [] - for i,p in enumerate(pts): - if i != len(pts) - 1: - a1 = pts[i+1] - pts[i] - if i == 0: - if isclose: - dr = angular_bisector(pts[-1] - p, a1) - # ang = angle_of_two_arrays(dir_vecs[i-1],dr) - ang2 = angle_of_two_arrays(laterality_indicator(p - pts[-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(th / np.cos(ang_th)) - else: - dr = laterality_indicator(a1, True) - nth = th - else: - dr = angular_bisector(-vecs[i-1], a1) - ang2 = angle_of_two_arrays(laterality_indicator(vecs[i-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(th / np.cos(ang_th)) - else: - if isclose: - a1 = pts[0] - pts[i] - dr = angular_bisector(-vecs[i-1], a1) - ang2 = angle_of_two_arrays(laterality_indicator(vecs[i-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(th / np.cos(ang_th)) - else: - dr = laterality_indicator(a1, True) - nth = th - vecs.append(a1) - ths.append(nth) - dir_vecs.append(dr) - lft_pts.append(dr * nth + p) - rgt_pts.append(-dr * nth + p) - if isclose: - lft_pts.append(lft_pts[0]) - if isclose: - rgt_pts.append(rgt_pts[0]) - pts.append(pts[0]) - fc_set = [] - for i in range(len(lft_pts)-1): - opts = lft_pts - ipts = rgt_pts - opt1 = gp_Pnt(opts[i][0], opts[i][1], opts[i][2]) - opt2 = gp_Pnt(opts[i+1][0], opts[i+1][1], opts[i+1][2]) - ipt2 = gp_Pnt(ipts[i][0], ipts[i][1], ipts[i][2]) - ipt1 = gp_Pnt(ipts[i+1][0], ipts[i+1][1], ipts[i+1][2]) - fc = random_polygon_constructor([opt1, opt2, ipt1, ipt2]) - fc_set.append(fc) - face = fc_set[0] - for fce in fc_set[1:]: - face = fuser(face, fce) - return create_prism(face, [0,0,height]) - -class CreateWallByPoints(): - def __init__(self, pts: list, th: float, height: float): - self.coords = [np.array(list(i.Coord())) if isinstance(i, gp_Pnt) else np.array(i) for i in pts] - self.height = height - self.is_loop = False - self.R = None - self.overlap = False - self.interpolate = 6 - self.th = th - self.is_close = False - self.vecs = [] - self.dir_vecs = [] - self.ths = [] - self.lft_coords = [] - self.rgt_coords = [] - self.loops_h = [] - self.loops = [] - self.fc_set = [] - self.poly: TopoDS_Shape - - def create_polygon(self): - if not self.is_loop: - gp_pts_lft = [gp_Pnt(i[0],i[1],i[2]) for i in self.lft_coords] - gp_pts_rgt = [gp_Pnt(i[0],i[1],i[2]) for i in self.rgt_coords] - self.gp_pts = gp_pts_lft + gp_pts_rgt - self.poly = random_polygon_constructor(self.gp_pts) - else: - for i,v in enumerate(self.loops_h): - for j,vv in enumerate(self.loops_h[i]): - self.loops_h[i][j] = list(self.loops_h[i][j]) - for ind,k in enumerate(self.loops_h[i][j]): - self.loops_h[i][j][ind] = gp_Pnt(k[0], k[1], k[2]) - poly0 = random_polygon_constructor(self.loops_h[0][0]) - poly_r = poly0 - for i, h in enumerate(self.loops_h): - if i == 0: - continue - for j in h: - poly_c = random_polygon_constructor(j) - poly_r = cutter3D(poly_r, poly_c) - self.poly = poly_r - - def Shape(self): - if self.overlap: - self.create_sides() - for i in range(len(self.lft_coords)-1): - opts = self.lft_coords - ipts = self.rgt_coords - opt1 = gp_Pnt(opts[i][0], opts[i][1], opts[i][2]) - opt2 = gp_Pnt(opts[i+1][0], opts[i+1][1], opts[i+1][2]) - ipt2 = gp_Pnt(ipts[i][0], ipts[i][1], ipts[i][2]) - ipt1 = gp_Pnt(ipts[i+1][0], ipts[i+1][1], ipts[i+1][2]) - fc = random_polygon_constructor([opt1, opt2, ipt1, ipt2]) - self.fc_set.append(fc) - face = self.fc_set[0] - for fce in self.fc_set[1:]: - face = fuser(face, fce) - return create_prism(face, [0,0,self.height]) - else: - self.create_sides() - self.create_loop() - self.create_polygon() - if np.isclose(self.height, 0): - opt = self.poly - else: - pr = create_prism(self.poly, [0,0,self.height],True) - pr_face = topo_explorer(pr,"face") - pr_remake = sewer(pr_face) - opt = solid_maker(pr_remake) - return opt - - def create_sides(self): - if self.R is not None: - self.coords = polygon_interpolater(self.coords, self.interpolate) - self.coords = bender(self.coords, self.R) - self.coords = [i for i in self.coords] - self.th *= 0.5 - for i,p in enumerate(self.coords): - if i != len(self.coords) - 1: - a1 = self.coords[i+1] - self.coords[i] - if i == 0: - if self.is_close: - dr = angular_bisector(self.coords[-1] - p, a1) - # ang = angle_of_two_arrays(dir_vecs[i-1],dr) - ang2 = angle_of_two_arrays(laterality_indicator(p - self.coords[-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(self.th / np.cos(ang_th)) - else: - dr = laterality_indicator(a1, True) - nth = self.th - else: - dr = angular_bisector(-self.vecs[i-1], a1) - ang2 = angle_of_two_arrays(laterality_indicator(self.vecs[i-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(self.th / np.cos(ang_th)) - else: - if self.is_close: - a1 = self.coords[0] - self.coords[i] - dr = angular_bisector(-self.vecs[i-1], a1) - ang2 = angle_of_two_arrays(laterality_indicator(self.vecs[i-1], True), dr) - ang_th = ang2 - if ang2 > np.pi / 2: - dr *= -1 - ang_th = np.pi - ang2 - nth = np.abs(self.th / np.cos(ang_th)) - else: - dr = laterality_indicator(a1, True) - nth = self.th - self.vecs.append(a1) - self.ths.append(nth) - self.dir_vecs.append(dr) - self.lft_coords.append(dr * nth + p) - if self.overlap: - self.rgt_coords.append(-dr * nth + p) - if self.is_close: - self.lft_coords.append(self.lft_coords[0]) - if not self.overlap: - for i,p in enumerate(self.coords[::-1]): - dr = -self.dir_vecs[::-1][i] - nth = self.ths[::-1][i] - self.rgt_coords.append(dr * nth + p) - if self.is_close: - self.rgt_coords.append(self.rgt_coords[0]) - self.coords.append(self.coords[0]) - - def create_loop(self): - if self.R is not None: - mxpt, mnpt = p_bounding_box(self.lft_coords+self.rgt_coords) - self.lft_coords = self.break_overlap(self.lft_coords) - self.rgt_coords = self.break_overlap(self.rgt_coords) - loops_lft_pt_i, peak_lft_pt_i = self.find_loop(self.lft_coords) - loops_rgt_pt_i, peak_rgt_pt_i = self.find_loop(self.rgt_coords) - if (len(loops_lft_pt_i+peak_lft_pt_i)>0) or (len(loops_rgt_pt_i+peak_rgt_pt_i)>0): - self.is_loop = True - self.loops_lft = index2array(loops_lft_pt_i, self.lft_coords) - self.loops_rgt = index2array(loops_rgt_pt_i, self.rgt_coords) - self.loops = self.loops_lft+self.loops_rgt - self.loops_h = self.find_topology(self.loops) - - - def is_include(self, point: np.ndarray, polygon: np.ndarray) -> bool: - polygon = np.concatenate((polygon, np.array([polygon[0]]))) - ang = 0 - for i,v in enumerate(polygon): - if i == polygon.shape[0]-1: - break - v1 = np.array(v-point) - v2 = np.array(polygon[i+1]-point) - # if np.isclose(np.linalg.norm(v1),0,1e-8) or np.isclose(np.linalg.norm(v2),0,1e-8): - # continue - crt = angle_of_two_arrays(v1, v2) - ang += crt - if np.isclose(ang, 2*np.pi, 1e-2): - return True - else: return False - - def find_topology(self, loops: list) -> list: - ck_lst = [] - loop_with_hierarchy = [] - topo = np.zeros(len(loops)) - for i,lp in enumerate(loops): - p = lp[0] - for j, llpp in enumerate(loops): - if (i == j) or ((i,j) in ck_lst): - continue - else: - if self.is_include(p, llpp): - topo[i] += 1 - elif self.is_include(llpp[0], lp): - topo[j] += 1 - ck_lst.append((i,j)) - ck_lst.append((j,i)) - lyr_mx = int(np.max(topo)) - for i in range(lyr_mx+1): - loop_h = [loops[j] for j,v in enumerate(topo) if v == i] - loop_with_hierarchy.append(loop_h) - return loop_with_hierarchy - - def break_overlap(self, pts: np.ndarray) -> np.ndarray: - n_pts = np.copy(pts) - inst_p = [] - # otr_vecs = np.array([pts[i+1] - pts[i] if i != len(pts)-1 else pts[0] - pts[i] for i in range(len(pts))]) - ck_lst = [] - m = len(pts) - i = 0 - pos = 0 - while i < m: - for ind,v in enumerate(pts): - if i == m-1: - next_p = pts[0] - else: - next_p = pts[i+1] - if (np.linalg.norm(pts[i] - v, 1) < 1e-8) or (np.linalg.norm(next_p - v, 1) < 1e-8): - continue - else: - comb = (i, ind, i+1) - if comb in ck_lst: - continue - else: - if i == m - 1: - half1 = v - pts[i] - half2 = pts[0] - v - else: - half1 = v - pts[i] - half2 = pts[i+1] - v - coline = np.isclose(np.linalg.norm(np.cross(half1, half2)), 0, 1e-8) - same_dir = np.dot(half1, half2) > 0 - if coline and same_dir: - inst_p.append(v) - comb_f = list(itertools.permutations(cp.copy(comb))) - ck_lst += comb_f - inst_p = np.array(inst_p) - icr_pos = inst_p.shape[0] - if icr_pos != 0: - dist = [[np.linalg.norm(p-pts[i]), p] for p in inst_p] - def sort_ind(lst): - return lst[0] - std_inst_p = np.array([i[1] for i in sorted(dist, key=sort_ind)]) - n_pts = np.concatenate((n_pts[:pos+1], std_inst_p, n_pts[pos+1:])) - pos += icr_pos - i +=1 - pos+=1 - inst_p = [] - return n_pts - - def find_loop(self, pts: np.ndarray) -> tuple: - pts = np.array([np.array(list(i.Coord())) if isinstance(i, gp_Pnt) else np.array(i) for i in pts]) - peak_p = [] - dim = pts.shape[0] - distance = np.ones((dim, dim)) * np.nan - for i, p in enumerate(pts): - for j in range(i+1,dim,1): - dist = np.linalg.norm(p - pts[j]) - distance[i,j] = dist - knots = np.array(np.where(distance < 1e-6)).T - loop_l = [] - for i in range(len(knots)-1): - half1 = np.arange(knots[i, 0], knots[i+1, 0]+1) - half2 = np.arange(knots[i+1, 1]+1, knots[i, 1]) - loop = np.concatenate((half1, half2)) - if loop.shape[0] < 3: - if loop.shape[0] == 2: - if np.isclose(np.linalg.norm(pts[knots[i, 0]] - pts[loop[1]+2]), 0, 1e-8): - print(loop) - peak_p.append(loop[1]) - continue - else: - loop_l.append(loop) - lst_loop = np.arange(knots[-1,0], knots[-1,1]) - if lst_loop.shape[0] >=3: - loop_l.append(lst_loop) - return loop_l, peak_p - - def visualize(self, plot_type: str) -> None: - if len(self.create_sides) == 0: - self.Shape() - if plot_type == "polygon": - fig, ax = plt.subplots() - for polygon in self.loops: - poly2d = np.array([[i[0], i[1]] for i in polygon]) - polygon_patch = Polygon(poly2d, closed=True, fill=False, edgecolor='black') - ax.add_patch(polygon_patch) - ax.set_xlabel('X-axis') - ax.set_ylabel('Y-axis') - ax.set_xlim(-200, 200) - ax.set_ylim(-200, 200) - ax.set_title('Visualization of Polygons') - plt.show() - elif plot_type == "linear": - plt.figure(figsize=(8, 6)) # Optional: Set the figure size - output1 = np.array(self.lft_coords) - output2 = np.array(self.rgt_coords) - talist = np.array(self.coords).T - toutput1 = output1.T - toutput2 = output2.T - x1 = talist[0] - y1 = talist[1] - x2 = toutput1[0] - y2 = toutput1[1] - x3 = toutput2[0] - y3 = toutput2[1] - plt.plot(x1, y1, 'bo-', label='central path') - # Plot Group 2 points and connect with lines in red - plt.plot(x2, y2, 'ro-', label='outer line') - # Plot Group 3 points and connect with lines in green - plt.plot(x3, y3, 'go-', label='inner line') - # Add labels and a legend - for i in range(x2.shape[0]): - plt.text(x2[i], y2[i], str(i)) - for i in range(x3.shape[0]): - plt.text(x3[i], y3[i], str(i)) - - plt.xlabel('X-axis') - plt.ylabel('Y-axis') - plt.legend() - plt.axis('equal') - plt.grid(True) # Optional: Add grid lines - plt.show() - +# @timer class CreateWallByPointsUpdate(): - def __init__(self, coords: list, th: float, height: float): + def __init__(self, coords: list, th: float, height: float, is_close: bool = True): self.coords = Pnt(coords).coords self.height = height self.R = None - self.interpolate = 6 + self.interpolate = 8 self.th = th - self.is_close = True + self.is_close = is_close + self.in_wall_pts_list = {} + self.in_loop_pts_list = {} + self.result_loops = [] self.vecs = [] + self.central_segments = [] self.dir_vecs = [] self.ths = [] self.lft_coords = [] @@ -852,10 +290,10 @@ def __init__(self, coords: list, th: float, height: float): self.create_sides() self.pnts = Segments(self.side_coords) self.G = nx.from_dict_of_lists(self.pnts.pts_digraph, create_using=nx.DiGraph) - # self.all_loops = list(nx.simple_cycles(self.G)) - self.self_loops = nx.selfloop_edges(self.G) # self.all_loops = list(nx.simple_cycles(self.H)) # Dangerous! Ran out of memory. self.loop_generator = nx.simple_cycles(self.G) + self.check_pnt_in_wall() + self.postprocessing() def create_sides(self): if self.R is not None: @@ -865,6 +303,7 @@ def create_sides(self): self.th *= 0.5 for i,p in enumerate(self.coords): if i != len(self.coords) - 1: + self.central_segments.append([self.coords[i], self.coords[i+1]]) a1 = self.coords[i+1] - self.coords[i] if i == 0: if self.is_close: @@ -889,6 +328,7 @@ def create_sides(self): nth = np.abs(self.th / np.cos(ang_th)) else: if self.is_close: + self.central_segments.append([self.coords[i], self.coords[0]]) a1 = self.coords[0] - self.coords[i] dr = angular_bisector(-self.vecs[i-1], a1) ang2 = angle_of_two_arrays(laterality_indicator(self.vecs[i-1], True), dr) @@ -912,7 +352,18 @@ def create_sides(self): self.coords.append(self.coords[0]) else: self.rgt_coords = self.rgt_coords[::-1] - self.side_coords = self.lft_coords + self.rgt_coords + self.lft_coords[0] + self.side_coords = self.lft_coords + self.rgt_coords + # + [self.lft_coords[0]] + + def check_pnt_in_wall(self): + for pnt, coord in self.pnts.pts_index.items(): + for vec in self.central_segments: + lmbda, dist = shortest_distance_point_line(vec,coord) + if dist < 0.9 * self.th: + print(f"pnt:{pnt},dist:{dist},lmbda:{lmbda}, vec:{vec}") + self.in_wall_pts_list.update({pnt:True}) + break + def visualize(self, display_polygon: bool = True): # Extract the x and y coordinates and IDs @@ -920,7 +371,6 @@ def visualize(self, display_polygon: bool = True): x = [coord[0] for coord in a.values()] y = [coord[1] for coord in a.values()] ids = list(a.keys()) # Get the point IDs - # Create a scatter plot in 2D plt.subplot(1,2,1) # plt.figure() @@ -931,12 +381,24 @@ def visualize(self, display_polygon: bool = True): plt.annotate(f'{ids[i]}', (xi, yi), fontsize=12, ha='right') if display_polygon: - for lp in self.loop_generator: - if len(lp) > 2: - coords = [self.pnts.pts_index[i] for i in lp] - x = [point[0] for point in coords] - y = [point[1] for point in coords] - plt.plot(x + [x[0]], y + [y[0]], linestyle='-', marker='o') + for lp in self.result_loops: + print(lp) + coords = [self.pnts.pts_index[i] for i in lp] + x = [point[0] for point in coords] + y = [point[1] for point in coords] + plt.plot(x + [x[0]], y + [y[0]], linestyle='-', marker='o') + + # talist = np.array(self.coords).T + # x1 = talist[0] + # y1 = talist[1] + # plt.plot(x1, y1, 'bo-', label='central path') + # Create segments by connecting consecutive points + + # a_subtitute = np.array(self.side_coords) + # toutput1 = a_subtitute.T + # x2 = toutput1[0] + # y2 = toutput1[1] + # plt.plot(x2, y2, 'ro-', label='outer line') # Set labels and title plt.xlabel('X-axis') @@ -962,4 +424,94 @@ def visualize_graph(self): nx.draw(self.G, pos=layout, with_labels=True, node_color='skyblue', font_size=10, node_size=500) plt.title("NetworkX Graph Visualization") plt.show() - \ No newline at end of file + + def Shape(self): + loop_r = self.rank_result_loops() + print(loop_r) + boundary = [self.occ_pnt(self.pnts.pts_index[i]) for i in loop_r[0]] + poly0 = random_polygon_constructor(boundary) + poly_r = poly0 + for i, h in enumerate(loop_r): + if i == 0: + continue + h = [self.occ_pnt(self.pnts.pts_index[i]) for i in h] + poly_c = random_polygon_constructor(h) + poly_r = cutter3D(poly_r, poly_c) + self.poly = poly_r + if not np.isclose(self.height, 0): + wall_compound = create_prism(self.poly, [0,0,self.height]) + faces = topo_explorer(wall_compound, "face") + wall_shell = sewer(faces) + self.wall = solid_maker(wall_shell) + return self.wall + else: + return self.poly + + def postprocessing(self): + correct_loop_count = 0 + for lp in self.loop_generator: + real_loop = True + visible_loop = True + in_wall_pt_count = 0 + virtual_vector_count = 0 + if len(lp) > 2: + for i,pt in enumerate(lp): + if i == 0: + if pt in self.in_wall_pts_list: + in_wall_pt_count += 1 + if (lp[-1],pt) in self.pnts.virtual_vector: + virtual_vector_count += 1 + else: + if pt in self.in_wall_pts_list: + in_wall_pt_count += 1 + if (lp[i-1],pt) in self.pnts.virtual_vector: + virtual_vector_count += 1 + if (in_wall_pt_count > 0) or (virtual_vector_count > 1): + # if (in_wall_pt_count > 0): + visible_loop = False + break + else: + real_loop = False + if real_loop and visible_loop: + self.result_loops.append(lp) + for pt in lp: + if pt not in self.in_loop_pts_list: + self.in_loop_pts_list.update({pt:[correct_loop_count]}) + else: + self.in_loop_pts_list[pt].append(correct_loop_count) + correct_loop_count += 1 + loop_counter = np.zeros(len(self.result_loops)) + visited = [] + counter = 0 + for pt, lp in self.in_loop_pts_list.items(): + if len(lp) > 1: + if counter == 0: + visited.append(lp) + for ind in lp: + loop_counter[ind] += 1 + else: + if any(sorted(lp) == sorted(item) for item in visited): + continue + else: + visited.append(lp) + for ind in lp: + loop_counter[ind] += 1 + counter += 1 + filtered_lp = np.where(loop_counter > 1)[0].tolist() + print(self.result_loops) + print(filtered_lp) + print(loop_counter) + self.result_loops = [v for i,v in enumerate(self.result_loops) if i not in filtered_lp] + + def rank_result_loops(self): + areas = np.zeros(len(self.result_loops)) + for i,lp in enumerate(self.result_loops): + lp_coord = [self.pnts.pts_index[i] for i in lp] + area = p_get_face_area(lp_coord) + areas[i] = area + rank = np.argsort(areas).tolist() + self.result_loops = sorted(self.result_loops, key=lambda x: rank.index(self.result_loops.index(x)),reverse=True) + return self.result_loops + + def occ_pnt(self,coord) -> gp_Pnt: + return gp_Pnt(*coord) \ No newline at end of file diff --git a/amworkflow/src/geometries/property.py b/amworkflow/src/geometries/property.py index 4962a98..7aa627a 100644 --- a/amworkflow/src/geometries/property.py +++ b/amworkflow/src/geometries/property.py @@ -126,8 +126,8 @@ def shortest_distance_point_line(line, p): pt1, pt2 = line s = pt2 - pt1 lmbda = (p - pt1).dot(s) / s.dot(s) - pt_compute = pt1 + lmbda * s if lmbda < 1 and lmbda > 0: + pt_compute = pt1 + lmbda * s distance = np.linalg.norm(pt_compute - p) return lmbda, distance elif lmbda <= 0: @@ -144,6 +144,20 @@ def shortest_distance_line_line(line1, line2): s2 = pt22 - pt21 s1square = np.dot(s1, s1) s2square = np.dot(s2, s2) + term1 = s1square * s2square - (np.dot(s1, s2)**2) + term2 = s1square * s2square - (np.dot(s1, s2)**2) + if np.isclose(term1,0) or np.isclose(term2, 0): + if np.isclose(s1[0],0): + s_p = np.array([-s1[1],s1[0],0]) + else: + s_p = np.array([s1[1],-s1[0],0]) + l1 = np.random.randint(1,4) * 0.1 + l2 = np.random.randint(6,9) * 0.1 + pt1i = s1 * l1 + pt11 + pt2i = s2 * l2 + pt21 + si = pt2i - pt1i + dist = np.linalg.norm(si * ( si * s_p) / (np.linalg.norm(si) * np.linalg.norm(s_p))) + return dist, np.array([pt1i,pt2i]) lmbda1 = (np.dot(s1,s2) * np.dot(pt11 - pt21,s2) - s2square * np.dot(pt11 - pt21, s1)) / (s1square * s2square - (np.dot(s1, s2)**2)) lmbda2 = -(np.dot(s1,s2) * np.dot(pt11 - pt21,s1) - s1square * np.dot(pt11 - pt21, s2)) / (s1square * s2square - (np.dot(s1, s2)**2)) condition1 = lmbda1 >= 1 @@ -234,3 +248,15 @@ def check_overlap(line1: np.ndarray, line2: np.ndarray) -> np.ndarray: indicator[1] = 1 return np.where(indicator == 1)[0], np.unique(pnt_list[np.where(indicator == 1)[0]], axis=0) +def p_get_face_area(points: list): + pts = np.array(points).T + x = pts[0] + y = pts[1] + result = 0 + for i in range(len(x)): + if i < len(x) - 1: + t = x[i]*y[i+1] - x[i+1]*y[i] + else: + t = x[i]*y[0] - x[0]*y[i] + result += t + return np.abs(result) * 0.5 \ No newline at end of file diff --git a/amworkflow/src/geometries/simple_geometry.py b/amworkflow/src/geometries/simple_geometry.py index 1aaad73..76db92e 100644 --- a/amworkflow/src/geometries/simple_geometry.py +++ b/amworkflow/src/geometries/simple_geometry.py @@ -8,13 +8,15 @@ from OCCUtils.Construct import make_face from amworkflow.src.geometries.builder import geometry_builder, sewer from amworkflow.src.geometries.property import check_overlap, check_parallel_line_line, shortest_distance_line_line - +from amworkflow.src.utils.system import threads_count from OCC.Core.GC import GC_MakeArcOfCircle import math as m from OCC.Core.BRepOffsetAPI import BRepOffsetAPI_MakeOffsetShape from OCCUtils.Topology import Topo import numpy as np - +import multiprocessing +from itertools import repeat +from amworkflow.src.utils.meter import timer def create_box(length: float, width: float, @@ -373,6 +375,7 @@ def pnt(self, pt_coord) -> np.ndarray: def new_pnt(self, pt_coords: list): pt_coords = self.pnt(pt_coords) + for i, v in self.pts_index.items(): if self.pnt_overlap(v, pt_coords): return False, i @@ -423,12 +426,15 @@ def update_digraph(self, start_node: int, end_node: int, insert_node: int = None self.pts_digraph.update({start_node: [end_node]}) else: raise Exception("No edge found for insertion option.") - + + class Segments(Pnt): def __init__(self, *coords: list): super().__init__(*coords) self.segments_index = {} self.modify_edge_list = {} + self.virtual_vector = {} + self.virtual_pnt = {} self.find_overlap_node_on_edge() self.modify_edge() @@ -467,13 +473,65 @@ def modify_edge(self): if i == 0: continue self.update_digraph(pts_list[i-1],nd,build_new_edge=False) + if (i != 1) and (i != len(pts_list) - 1): + if (pts_list[i-1] in self.virtual_pnt) and nd in (self.virtual_pnt): + self.virtual_vector.update({(pts_list[i-1],nd): True}) def check_self_edge(self, line: np.ndarray) -> bool: if self.pnt_overlap(line[0],line[1]): return True else: return False - + + def overlap_node_on_edge_finder(self,i,j): + v = self.init_pts_sequence[i] + vv = self.init_pts_sequence[j] + print(i,j) + lin1 = self.get_segment(v[0], v[1]) + lin2 = self.get_segment(vv[0], vv[1]) + self_edge = (self.check_self_edge(lin1) or self.check_self_edge(lin2)) + if not self_edge: + parallel, colinear = check_parallel_line_line(lin1, lin2) + # if v == [13,14]: + # print("line:",(v,vv), parallel, colinear) + if parallel: + if colinear: + index, coords = check_overlap(lin1, lin2) + if len(index) < 4: + for ind in index: + if ind in [0,1]: + self.add_pending_change(tuple(vv),v[ind]) + else: + self.add_pending_change(tuple(v),vv[ind]) + else: + distance = shortest_distance_line_line(lin1, lin2) + intersect = np.isclose(distance[0],0) + new,pt = self.new_pnt(distance[1][0]) + if intersect and new: + pnt_id = self.register_pnt(distance[1][0]) + self.add_pending_change(tuple(v),pnt_id) + self.add_pending_change(tuple(vv), pnt_id) + + + def arg_generator(self): + iter_range = range(len(self.init_pts_sequence)) + visited = {} + for i in iter_range: + for j in iter_range: + if i == j: + continue + if i == j + 1: + continue + if j == i - 1: + continue + if (i,j) in visited or (j,i) in visited: + continue + args = (self,i,j) + print(args) + yield args + visited.update({(i,j): True, (j,i): True}) + + def find_overlap_node_on_edge(self): visited = {} for i,v in enumerate(self.init_pts_sequence): @@ -482,7 +540,9 @@ def find_overlap_node_on_edge(self): continue if i == j + 1: continue - if j == i - 1: + if j == i + 1: + continue + if i == len(self.init_pts_sequence) * 2 -1 - i: continue if (i,j) in visited or (j,i) in visited: continue @@ -502,13 +562,22 @@ def find_overlap_node_on_edge(self): if ind in [0,1]: self.add_pending_change(tuple(vv),v[ind]) else: - self.add_pending_change(tuple(v),vv[ind]) + self.add_pending_change(tuple(v),vv[ind-2]) else: distance = shortest_distance_line_line(lin1, lin2) intersect = np.isclose(distance[0],0) new,pt = self.new_pnt(distance[1][0]) if intersect and new: pnt_id = self.register_pnt(distance[1][0]) + self.virtual_pnt.update({pnt_id: True}) self.add_pending_change(tuple(v),pnt_id) self.add_pending_change(tuple(vv), pnt_id) visited.update({(i,j): True, (j,i): True}) + + # def find_overlap_node_on_edge(self): + # with multiprocessing.Pool(processes=threads_count) as pool: + # args = self.arg_generator() + # # b = zip(repeat(self),args) + # # print(tuple(b)) + # # pool.map(Segments.overlap_node_on_edge_finder,zip(repeat(self),args)) + # pool.map(Segments.overlap_node_on_edge_finder,args) \ No newline at end of file diff --git a/amworkflow/src/utils/meter.py b/amworkflow/src/utils/meter.py new file mode 100644 index 0000000..a2415f5 --- /dev/null +++ b/amworkflow/src/utils/meter.py @@ -0,0 +1,11 @@ +import time + +def timer(func): + def wrapper(*args, **kwargs): + start_time = time.time() + result = func(*args, **kwargs) + end_time = time.time() + elapsed_time = end_time - start_time + print(f"{func.__name__} took {elapsed_time:.6f} seconds to run") + return result + return wrapper \ No newline at end of file diff --git a/amworkflow/src/utils/system.py b/amworkflow/src/utils/system.py new file mode 100644 index 0000000..9431c22 --- /dev/null +++ b/amworkflow/src/utils/system.py @@ -0,0 +1,2 @@ +import psutil +threads_count = psutil.cpu_count() \ No newline at end of file diff --git a/amworkflow/src/utils/visualizer.py b/amworkflow/src/utils/visualizer.py index e579a56..3b765fa 100644 --- a/amworkflow/src/utils/visualizer.py +++ b/amworkflow/src/utils/visualizer.py @@ -3,6 +3,8 @@ from amworkflow.src.constants.exceptions import GmshUseBeforeInitializedException import networkx as nx import matplotlib.pyplot as plt +from amworkflow.src.geometries.property import shortest_distance_line_line +import numpy as np def mesh_visualizer(): try: @@ -25,4 +27,63 @@ def plot_digraph(dataset: dict) -> None: # Draw the nodes and edges nx.draw(G, pos=layout, with_labels=True, node_color='skyblue', font_size=10, node_size=500) plt.title("NetworkX Graph Visualization") + plt.show() + +def plot_intersect(x11 = 0, x12 = 0, y11 = 0, y12 = 0, x21 = 0, x22 = 0, y21 = 0, y22 = 0,segment1 = None, segment2 = None): + if (segment1 is None) and (segment2 is None): + # Coordinates for the two segments + segment1_x = [x11, x12] + segment1_y = [y11, y12] + + segment2_x = [x21, x22] + segment2_y = [y21, y22] + intersect = shortest_distance_line_line(np.array([[x11, y11,0], [x12, y12,0]]), np.array([[x21, y21,0], [x22, y22,0]]))[1] + print(shortest_distance_line_line(np.array([[x11, y11,0], [x12, y12,0]]), np.array([[x21, y21,0], [x22, y22,0]]))[0]) + else: + segment1_x = segment1.T[0] + segment1_y = segment1.T[1] + segment2_x = segment2.T[0] + segment2_y = segment2.T[1] + intersect = shortest_distance_line_line(segment1, segment2)[1] + + + + # Coordinates for the single point + + point_x_1 = [intersect[0].T[0]] + point_y_1 = [intersect[0].T[1]] + point_x_2 = [intersect[1].T[0]] + point_y_2 = [intersect[1].T[1]] + + # Create a figure and axis + fig, ax = plt.subplots() + + # Plot the two segments + ax.plot(segment1_x, segment1_y, color='blue', linestyle='-', linewidth=2, label='Segment 1') + ax.plot(segment2_x, segment2_y, color='green', linestyle='-', linewidth=2, label='Segment 2') + + # Plot the single point + ax.plot(point_x_1, point_y_1, marker='o', markersize=8, color='red', label='Point1') + ax.plot(point_x_2, point_y_2, marker='o', markersize=8, color='red', label='Point2') + + # Add labels for the point and segments + ax.text(2, 3, f'Point ({intersect[0]}, {intersect[1]})', fontsize=12, ha='right') + ax.text(1, 2, 'Segment 1', fontsize=12, ha='right') + ax.text(6, 3, 'Segment 2', fontsize=12, ha='right') + + # Add a legend + ax.legend() + + # Set axis limits for better visualization + ax.set_xlim(0, 7) + ax.set_ylim(0, 6) + + # Set axis labels + ax.set_xlabel('X-axis') + ax.set_ylabel('Y-axis') + + # Set plot title + ax.set_title('Two Segments and One Point') + plt.tight_layout() + # Display the plot plt.show() \ No newline at end of file diff --git a/environment.yml b/environment.yml index e0900e5..1785f8f 100644 --- a/environment.yml +++ b/environment.yml @@ -399,6 +399,7 @@ dependencies: - mdit-py-plugins==0.4.0 - mistune==3.0.1 - nbclassic==1.0.0 + - networkx - nbclient==0.8.0 - nbconvert==7.6.0 - nbformat==5.9.0 diff --git a/examples/TrussArc/print110823.csv b/examples/TrussArc/print110823.csv new file mode 100644 index 0000000..2954d10 --- /dev/null +++ b/examples/TrussArc/print110823.csv @@ -0,0 +1,123 @@ +ID,x,y +1,0.00,250.00 +2,0.00,0.00 +3,150.00,0.00 +4,192.50,39.00 +5,235.00,76.00 +6,277.50,111.00 +7,320.00,144.00 +8,362.50,175.00 +9,405.00,204.00 +10,447.50,231.00 +11,490.00,256.00 +12,532.50,279.00 +13,575.00,300.00 +14,617.50,319.00 +15,660.00,336.00 +16,702.50,351.00 +17,745.00,364.00 +18,787.50,375.00 +19,830.00,384.00 +20,872.50,391.00 +21,915.00,396.00 +22,957.50,399.00 +23,1000.00,400.00 +24,1042.50,399.00 +25,1085.00,396.00 +26,1127.50,391.00 +27,1170.00,384.00 +28,1212.50,375.00 +29,1255.00,364.00 +30,1297.50,351.00 +31,1340.00,336.00 +32,1382.50,319.00 +33,1425.00,300.00 +34,1467.50,279.00 +35,1510.00,256.00 +36,1552.50,231.00 +37,1595.00,204.00 +38,1637.50,175.00 +39,1680.00,144.00 +40,1722.50,111.00 +41,1765.00,76.00 +42,1807.50,39.00 +43,1850.00,0.00 +44,2000.00,0.00 +45,2000.00,250.00 +46,1925.00,300.53 +47,1850.00,347.13 +48,1807.50,371.78 +49,1765.00,395.17 +50,1722.50,417.30 +51,1680.00,438.16 +52,1637.50,457.76 +53,1595.00,476.09 +54,1552.50,493.16 +55,1510.00,508.97 +56,1467.50,523.51 +57,1425.00,536.78 +58,1382.50,548.79 +59,1340.00,559.54 +60,1297.50,569.02 +61,1255.00,577.24 +62,1212.50,584.20 +63,1170.00,589.89 +64,1127.50,594.31 +65,1085.00,597.47 +66,1042.50,599.37 +67,1021.25,599.84 +68,1000.00,600.00 +69,978.75,599.84 +70,957.50,599.37 +71,915.00,597.47 +72,872.50,594.31 +73,830.00,589.89 +74,787.50,584.20 +75,745.00,577.24 +76,702.50,569.02 +77,660.00,559.54 +78,617.50,548.79 +79,575.00,536.78 +80,532.50,523.51 +81,490.00,508.97 +82,447.50,493.16 +83,405.00,476.09 +84,362.50,457.76 +85,320.00,438.16 +86,277.50,417.30 +87,235.00,395.17 +88,192.50,371.78 +89,150.00,347.13 +90,75.00,300.53 +91,0.00,250.00 +92,121.57,31.16 +93,164.07,70.16 +94,253.78,357.26 +95,296.28,379.38 +96,382.87,239.98 +97,425.37,266.98 +98,502.57,468.39 +99,545.07,482.93 +100,647.02,376.43 +101,689.52,391.43 +102,750.27,534.83 +103,792.77,541.79 +104,869.24,433.69 +105,911.74,438.69 +106,978.75,552.84 +107,1021.25,552.84 +108,1088.26,442.69 +109,1130.76,437.69 +110,1207.23,537.79 +111,1249.73,530.83 +112,1310.48,395.43 +113,1352.98,380.43 +114,1454.93,478.93 +115,1497.43,464.39 +116,1574.63,270.98 +117,1617.13,243.98 +118,1703.72,375.38 +119,1746.22,353.26 +120,1835.93,74.16 +121,1878.43,35.16 +122,2000.00,250.00 \ No newline at end of file diff --git a/examples/TrussArc/trussarc.py b/examples/TrussArc/trussarc.py new file mode 100644 index 0000000..b828c61 --- /dev/null +++ b/examples/TrussArc/trussarc.py @@ -0,0 +1,34 @@ +import pathlib +import os +import pandas as pd +import numpy as np +from amworkflow.api import amWorkflow as aw + +# python trussarc.py -n trussarc -gp thickness height -gpv 50 100 -mbt 10 -msf 5 -vtk + +@aw.engine.amworkflow() #("draft") # for visulaization +def geometry_spawn(pm): + #Define model by given file with points + # float parameters: + # pm.thickness: float - thickness of layers + # pm.height: float - global height of model + + # from points list + name = 'print110823' + root = pathlib.Path(__file__).parent + data = pd.read_csv(root / f"{name}.csv", sep=',') + data['z'] = np.zeros(len(data)) # add z coordinate + # print(data) + pmfo = np.array(data[['x','y','z']]) + # print(len(pmfo)) + # # only for outer line + # print(pmfo[0:90]) + g = aw.geom + # pmfo = pmfo[0:90] # outline + wall_maker = g.CreateWallByPoints(pmfo, pm.thickness, pm.height,is_close=False) + design = wall_maker.Shape() + + return design #TopoDS_Shape + + + diff --git a/some_thoughts_20230822_new/guii/1.py b/some_thoughts_20230822_new/guii/1.py new file mode 100644 index 0000000..2ed9473 --- /dev/null +++ b/some_thoughts_20230822_new/guii/1.py @@ -0,0 +1,75 @@ +##Author github user @Tanneguydv, 2021 + +import os +import sys +from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox + +from PyQt5.QtWidgets import ( + QApplication, + QWidget, + QPushButton, + QHBoxLayout, + QGroupBox, + QDialog, + QVBoxLayout, +) + +from OCC.Display.backend import load_backend + +load_backend("qt-pyqt5") +import OCC.Display.qtDisplay as qtDisplay + + +class App(QDialog): + def __init__(self): + super().__init__() + self.title = "PyQt5 / pythonOCC" + self.left = 300 + self.top = 300 + self.width = 800 + self.height = 300 + self.initUI() + + def initUI(self): + self.setWindowTitle(self.title) + self.setGeometry(self.left, self.top, self.width, self.height) + self.createHorizontalLayout() + + windowLayout = QVBoxLayout() + windowLayout.addWidget(self.horizontalGroupBox) + self.setLayout(windowLayout) + self.show() + + def createHorizontalLayout(self): + self.horizontalGroupBox = QGroupBox("Display PythonOCC") + layout = QHBoxLayout() + + disp = QPushButton("Display Box", self) + disp.clicked.connect(self.displayBOX) + layout.addWidget(disp) + + eras = QPushButton("Erase Box", self) + eras.clicked.connect(self.eraseBOX) + layout.addWidget(eras) + + self.canvas = qtDisplay.qtViewer3d(self) + layout.addWidget(self.canvas) + self.canvas.resize(200, 200) + self.canvas.InitDriver() + self.display = self.canvas._display + self.horizontalGroupBox.setLayout(layout) + + def displayBOX(self): + a_box = BRepPrimAPI_MakeBox(10.0, 20.0, 30.0).Shape() + self.ais_box = self.display.DisplayShape(a_box)[0] + self.display.FitAll() + + def eraseBOX(self): + self.display.Context.Erase(self.ais_box, True) + + +if __name__ == "__main__": + app = QApplication(sys.argv) + ex = App() + if os.getenv("APPVEYOR") is None: + sys.exit(app.exec_()) \ No newline at end of file diff --git a/some_thoughts_20230822_new/guii/try_qt_thread.py b/some_thoughts_20230822_new/guii/try_qt_thread.py new file mode 100644 index 0000000..df1c31b --- /dev/null +++ b/some_thoughts_20230822_new/guii/try_qt_thread.py @@ -0,0 +1,96 @@ +import sys +from time import sleep +from PyQt5.QtCore import QObject, QThread, pyqtSignal +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import ( + QApplication, + QLabel, + QMainWindow, + QPushButton, + QVBoxLayout, + QWidget, +) + +class Worker(QObject): + finished = pyqtSignal() + progress = pyqtSignal(int) + + def run(self): + """Long-running task.""" + for i in range(5): + sleep(1) + self.progress.emit(i + 1) + self.finished.emit() + + +class Window(QMainWindow): + def __init__(self, parent=None): + super().__init__(parent) + self.clicksCount = 0 + self.setupUi() + + def setupUi(self): + self.setWindowTitle("Freezing GUI") + self.resize(300, 150) + self.centralWidget = QWidget() + self.setCentralWidget(self.centralWidget) + # Create and connect widgets + self.clicksLabel = QLabel("Counting: 0 clicks", self) + self.clicksLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.stepLabel = QLabel("Long-Running Step: 0") + self.stepLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.countBtn = QPushButton("Click me!", self) + self.countBtn.clicked.connect(self.countClicks) + self.longRunningBtn = QPushButton("Long-Running Task!", self) + self.longRunningBtn.clicked.connect(self.runLongTask) + # Set the layout + layout = QVBoxLayout() + layout.addWidget(self.clicksLabel) + layout.addWidget(self.countBtn) + layout.addStretch() + layout.addWidget(self.stepLabel) + layout.addWidget(self.longRunningBtn) + self.centralWidget.setLayout(layout) + + def countClicks(self): + self.clicksCount += 1 + self.clicksLabel.setText(f"Counting: {self.clicksCount} clicks") + + def reportProgress(self, n): + self.stepLabel.setText(f"Long-Running Step: {n}") + + # def runLongTask(self): + # """Long-running task in 5 steps.""" + # for i in range(5): + # sleep(1) + # self.reportProgress(i + 1) + + def runLongTask(self): + # Step 2: Create a QThread object + self.thread = QThread() + # Step 3: Create a worker object + self.worker = Worker() + # Step 4: Move worker to the thread + self.worker.moveToThread(self.thread) + # Step 5: Connect signals and slots + self.thread.started.connect(self.worker.run) + self.worker.finished.connect(self.thread.quit) + self.worker.finished.connect(self.worker.deleteLater) + self.thread.finished.connect(self.thread.deleteLater) + self.worker.progress.connect(self.reportProgress) + # Step 6: Start the thread + self.thread.start() + + # Final resets + self.longRunningBtn.setEnabled(False) + self.thread.finished.connect( + lambda: self.longRunningBtn.setEnabled(True) + ) + self.thread.finished.connect( + lambda: self.stepLabel.setText("Long-Running Step: 0") + ) + +app = QApplication(sys.argv) +win = Window() +win.show() +sys.exit(app.exec()) \ No newline at end of file diff --git a/some_thoughts_20230822_new/test_largest_poly/1.py b/some_thoughts_20230822_new/test_largest_poly/1.py new file mode 100644 index 0000000..5fd0842 --- /dev/null +++ b/some_thoughts_20230822_new/test_largest_poly/1.py @@ -0,0 +1,4 @@ +from amworkflow.api import amWorkflow as aw + +imp = aw.tool.read_stl("/home/yhe/Documents/new_am2/amworkflow/examples/param_prism/terrain.stl") + diff --git a/some_thoughts_20230822_new/test_largest_poly/test_split.stl b/some_thoughts_20230822_new/test_largest_poly/test_split.stl new file mode 100644 index 0000000000000000000000000000000000000000..e2fcaa6b5884d0c55291a676d3b2d07b85f79451 GIT binary patch literal 433484 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 zΠ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 wYIPzLVP~!iWi}#X@9#h59GP>*j2lBsP7XSbN literal 0 HcmV?d00001 diff --git a/some_thoughts_20230822_new/try_new_thought/sucess_new_scheme2.stl b/some_thoughts_20230822_new/try_new_thought/sucess_new_scheme2.stl new file mode 100644 index 0000000000000000000000000000000000000000..7215a0726b1f7ebb2b72d8ae4b3b0586d5f8a56a GIT binary patch literal 45684 zcmb82dB7b-mBkB?9Y(>3AQB=Vneubp=8sUk)bHMNtNV5LtGadj zlRIxeW$U94n?B=+srya&+?S^8c-YiwQwI4b2YIpel%1#Ud*HO`hfF`Xch2-*U!Ha3R=3W(c;KAR*L;1E zdCR{Nr0pEqKJOy9S8B<*%YL@^aMERe9ZzlP|K0VY>%M-t`9NEJOiZvsC01E^@!>09 z*v;bj!;~cldwgQH#etZbs@e(e(cD)x?DMsz*WF z=N{&U*Us3>;@D`zj|^V>@trn4P|{R2G2wGqQXlIqx#;DpEY<7Wk#klRUu7I<_an+U zN?O|=c=RvhQ$D_r#c|Jv_Z}>K{sR^VlsJcWKf>p*q{PB2d@wuZqAe^A)_d$a|2jD2 z@k^zLb7*%H+>1v+iABEn$MIjheP4^?(UreG*y{dAEDk7f4()z~&tXZ4RaRU(yK7Qz zaX_zgo34HA;EeC>yOqX)c0a=Bu%yKO-+6NUr1?`Vjyo)g*zJ9BW-OE+5_X!j$04ogaW?DM}E-}LAMEsl4uecj+!+r4OU zK#6l`_al4`OG+%Y&??y-8*XcHK(BM(`P!_(n@j)I;y}9};d5A0;)FZz9zTD%&s!V| zuK)4iH)sFN;(!w8(C$b09F~+g^4BY52Q1jZ;(%WH{vUbUVDg#oF@I?HBYX}^N}RD^ ze0-VH4z)Ng-tv*b6_Xb#^n8U9ZucX64oga$x9vN!wU7Fw#R0v}ZN1NfgJSX~76;n> z2%p1}66=5U2jiE$Fx}!<`ra1@?|k2)76+6#hju^0=dh&2sUKT1dwtTb76mXx@2&gJ80Y%;^*_}Y4l6vsWdgv9|R&Y|6p@Hs3gvHZOYWw*}S z)8c?$=koWzKKS8g2U{Fy_al4`OG@l~?#%J8?sbI4@%*dH7B_ro8H)o-oI|@G;d5A0 z;`(d+d;se3=g&ZE>7) z>gvT-uP!HXuoCA|RqX`#a*i!I_vODlFt+DS2U#4@EBB@O?=8;xzq2e3v{lu_gght4 zQBdNw=RY&P^sm2UaXh@+dd0(gPqH|mq^YW%;9kzLC3!wubA0TI>khRzpx3zzHe9Rt z-1Zk(9B8Ymi3xdTh@+syMu%@T{;f|RYjMn7bF<>YqgJr<3QC%)CMJ9iOX_3)1Fjl- z@PIE^9MCJH{_PEl1^;=O#esG|!soE0#LVN~KYrY$U$!{H%Y)*S%~!NIpu{<}`w>2e zB_-Z>$Jt|Z?mNQbfL`aWdTI0Gv{(Pj;y}9};d5A0V$xHKk59YpIE!PMJ9a2u{N74- zUO|aGamV<&3GU?_TXODSwhd!@{LdFH4(N4m?;So?Y_#*W76;nuV`9SRu%yI{UoDtB z?c(Dtj%Uu;t+@Wa_t^1(lBTMO37^A~`Z#WloyXRnag4r$%p>2KJ9E1eERN^**{_&({>l~ylsJcWKSJ&w(UKBZ9lYk)k7j<^;(%V~&VOt7 z;^fJ*ouK8Gds@x^Ul*m81q zyu|^%&ON=$)MCR^Z?!nk?nn3>mX!G68aLhc+6!eI+sr(oxOk&74k&RB?S6#MVM&Rb zKJu+CKeg8h76jwzP$WgJlA9NPT| z?NwXS_DVP0zQtqDm2p6?K2;x6ta3sb2ipAzpTkn6YV$gdTMjrO9uFuf{gv@Gh|o^> z9G_RJZmZ*fUU|M+_r!QS(C$ZQuX+@;E$7u1^?7yk!6(M=2b4I6c7q7*gwOH05^`S6 ztX#`_19IEQwF2V7T+#e{Z)29IKxbFFEAG_`C}xO;z$_Sreh1@HswLRq~uTUOy+Yl6f0l5}$X`?nn3> zmXwgE@Ui;2{hbRgt$u$v2PNEY5TTv$IX+iHp4-Rk=XU6oUtarP5r2Q6-H-4&EGZ$s zipJ{SQ5$V`W%YZ|IVjp6lZ8bF{k&=g^BsK?#{> z7^~+QmVDa{alQmft6P|{RIL;%6Pjuy(^GTB*DC+eOwEGeAOdUr-30cP(tJiVne|kYt zuSY?N++$*V4I;D?KF8-u$U4rjUdMr6=eFPTe~NlN3hjP`&tXXkSyvmY*VUH1^_NAx zJ_sewq1_-tJ0aKIXh{iKR~y#rYS8Q4-_CousMiP4?nlV=Dvp8@vd%eHuXD~?>9L|- zuZ0r1?k1{;27rae zXC=<1s)z_6xRJ)e{gthb1LsRX?lq0G@v2 z*`my6U?tpc5TTurxr}H@3CRO^f1L*az4E(%${R5bwEGc0hb1K>%Ob1uGH(C3mx?mK zMCO*F5^gt$&`$UqpDQ6T*gT)Mpto#)>x!@1ypMifw)+v%D~^H^k|&eZc`~pizd0x- zv>QZdCrTfz$|8`z!tf_IKc~mQqH|CD1?{M+?pyvh3^DG`C3GjDcHgo7igA4Eb2sr< zy9ugljYWT7EPLJAwgS#R*mn&$BRF!5sPtjq5m6r-9Qsu8iDOSPAMCH&2NT>2-zah* z&D6&Q8$Vktx5;%Q{+J2Fi)X!3eB)zPu2MXgq)%rYxGu>IB*oOKDyXW(FMq7qWSwzS z!US7NRpE@2&q-CHwnoec6Wq%`_k8inohO&)LQTkj!w~lg=U8E@D)VvU;8(?M-&oje zF~OF|h4{cd)j6hH3G=b$lM9N4UR&LKFu|5mAAH5(QD}|ad@#YiR{8G#7SH|i(w4Ep zGmfmjlEPM1=40FA?k}D?bYQlaU`uHnxEJx2Q?9gas>}xy-0Oh-pD1ozs9ZOSK8#p# zr+bRO-MO==VujtRu3q`k;#q&Q5$vzkhd2vEJl8tM{gNKSg z{ce_hp2mSYJ>M;5o{7{(!c^fICw&6wCSH5ri+i*KKIjuGsGeMePB;P(>$=5UUEM?xB5h`ATJ z?vlS&A4VMc&p#>F`pQ$Liv6|vFjZ$AaYOOpoh~tgeX#GS$_V^^<==qvyOexKLK&U(RAG2KlJ|Lf-BzIC27g6YNP&n{N`=wtSI>f?>gt}1@G()IQ)98-53OmHvE zq_PK%gJ*|04pzua7-Du=W{OB*w~r5Aabq!KjsLSa*k88~Cb$=mVN?|~4$RP{^H*#s z64D66>DydV9CgiHQ}vNgUs=5Ktb0p^6jL|x`}bZ^tUtTFMll_U(DcD$#bX!=X@nux zAe>``t%Uj5<<<*}8B5GF?M$$x=)(xi$~wp6^Xlf;7i)aP$uF4nPZ%=6Bh553VTd&$ z=U8E@DnY|=rG>639$I@5^UnTSRRty1|M<+}o~wUqk+To>9aR~Dd3BzfmUVpc9SLcK zA+Pqazg8bc-1CzwibwA&b5hw~s}EE4=LKgL-`%D>``8Ejj;f5nItQ;6NPau{j)XMA z@VQeiDQ;S=%rIrTl`tQhynb47;Lq>3(PbrA$7K)dg9(m_X=cI@YunB--R*-{tvIF+ zTy#;f>efr9=dQ)U1V_$vs%myNv-rcVZ&~DQ_q1itEB0IWP5V40cukP~F`W`$dFkuL z<_j$_TOa+?$;CeJe%9JN3Xuppx=ir6Av+=Vw?;~^U8W;rK34kONyQq={BA@Q`;LS( zWG-X#vx|>@rp)-|Xn72~2_845BN5cc%p*@Mc6*~7D^}7SITLBGIwK`|5C`gmSEpGO z$4871n%(kr_-`94_J^z&>Tf=A!d6v+rUdswULSd|IM@gGLPlegIK9}jIBiO~6Ny!^ zC1OMs6WdSTr#OCz-`aPD>6Ad$6lWeuHdNa&w>X&KUfXVTVsZ4$wzGr@?#0I`RkhNt zJH)#)N8379f`%co*fcJOLN+ePt#Rlz zqt2S-m{?(CLX+TL9A8Qx15-bTzg9wegyE-7-84S$vUX%gM-SFW2_6NenF&MWw>rm4 z4n2GN=y?@X6%*WR`BkTOT(6kmQDA?msuy40p!kos%3mxz3aycwDkiuWGUC~T#(@lF z&hnKEhR!&CKWB2W#o^c4cbn~E_W=1YRZMU%?3*A$nqkNU$He}a3B%Q2e0Q7!V7l7} za?I0c-}C+5NAFP<2NT@uu8*MkS^}@UdY!C58__Kd5IpIi^-sf`%az+zY$U*n<)$FZ$$Q((UCuHPihF z?uDItNPK>`w`p= zdw5Az(Bpx!IBT^;#;^ z{Rr-b{pU>|+kbp)@bn?4*m^Dd>ql@e?A0e9LF4%IzIP0s-tnZ7Gm+02Vj9HcO#jV$rv+9wMhCIX3E^PMK>SKi9UhFUR@u>wb z4A$7JT>oGt2Y+?3;@V}Ow)41~;9loWTe!Gut0!8BGRvjR(&A&l$0qs+8hLq?$|J=D zTZ)7VpaP*XqMmp?(3^0C29`2NT?DpRIl~s8`QY zRb2Oh>3#(F`rr=p2lYy0>H~E#xVD6>I`ksA*Y7_4!$G|&oBGgWzVX*qs?Hxh_VqVa z&z$n?Nr|_eGj%X;!A(XSdFkncU;FP_d+OFF4PJk-+-2NN9JAoO!3`IdPvlIe1S*?w zbr9#e<6we&ZMpa5gZ9;MCb$&%a`V{V^TK%6xFm zE4C|jytexFyJoap6PaLtOh+HmuxldM?&9xC$M-|OHFdSGR0)66;3W)EcPy>SmC{{A z+6%tX-{PSBJwD}PG`X>xI zONVoOx^r0gUzp%*q0)N!cNjMAeesy{Q&dXuQz~E8_^H;2Q2XGkB|pQpexn2mL;e>g z`01>)uHBX3Gb7dBawZzV*#ey7)tzO*xk}uN>8MJD4LJ*eSM^)-0F2;&;Wcx%6nzBs z!K-1MYtX$0$!q`Ii|OdYRPh=euMhHiWJ>Vr8?R>Yx?xK23^vdF^NK)9uy%t}~cB&3nfC-So>&z+?NKc(_K1OIL_B9vShGQqw0=`8vXN>=;mj?CXX{ys)R z8tKXp&#>^?OG@zE3(pSn++s@bzwj?ewiJn=s`$B&Wm+HN`ENdZB4Ivw z&Vr-mQII_*r|qr#CdxerayKZS4Smk{543eJ01<(+>(NVekR|8NoWEE0@PEE#H8Y#N zV$OcN6RD4h30A0tj*-U{Rrt5Eh$me7d1beL(O+fwEGc0hb1NQckDC# z;CEjg(>T}`-<{F!CY(dB)ROIE(fXnm2Xd%ciB!XiIrQqIsxR6gxEJSaD^b<6%rp*G z!gqbN8$@U)e2&kRsH%mUD$dPDOifi26F!F}^|8V1!?TyJxxkJG^rl(YcqVEPp`DPr zQE{J!5>pSMf4%A?Cz z9Bhl9=g{sZoI@|pr&pq?18H&a9s?+G4($dJ+6k$v7WX$OaolJBIDXi>_O&=z2|vA} z-H-4&EGbdd<+M0>&j*z7u8Rf{+6kZIb0y^59m=_D*Im}j`*G0jCel4WY{~X>YMoSz zgZIZk3GaeYA5~>lB|+-UIjFV^ygotbdX@ zlK9&|KQHG|`Vrczwxn&Y1Pxox@oy2d`w^uNs9No~sag-&#tODZV=9#?Ju%^PSW=?e z`)WRTt$=^Apxuw~IV>r$>uyJ6i{CiY&Ry7Yj(=03-H(uc!f};DiE1yh#lh<;P$Hug z*IxP&K8GbGr$`BA$K zx16;2P|qajb&h`(qur12IV>qr?bWw9cuf#WoI|@G;d5A0qN;0PK3Fe$Ifr&P!M%7C zl#p|GDCe#{Gw?5Z{uPgQKf>p*q(rp~+u~qbJO_YwHz8Txv~I+f;{J0x<~)Z8B|ICc zKC1oae}|B|=W)(b3ArX_QcvH;ik0xZ2HFiGv=dTuAjYIbwg22y@k}F>NM3lNYGT6Y zu%te!J=Nv|dS$;7&4r@fkFfUwRI{8)RQu1(2W&Y9CEV^u_#Bp$sA{X558ltkGi+%0 zBjjEi_p2!(&xu2MPR#UL0$Z|nN4pHs?nn3>mXxS!tCwRH_p7lId8$cNwG-Tncb}<` zss^^j0ll)DgLY1$-5^3c;d6YhL{(ee;^6&Uyhjb~euP|iBtTxd6l&`$UqpDR(-R<}5K2N;yd^*>QHF(Gvaz_baN8s(!o0!Af`z8SQ?A&tXZ4s$RIo!8@?ni-UK_LJ99`Z4jZI@HswLqN;Uo zKA<<<_1j5=c0%ec#l6q!L(biyoV(_O=ka-dAMJjG&tXZ4s+PC;fGy{E9v|%n5!wl# z<8vjdn*Bq)NAdnTDB+!f{Rp4KlBqi5pls529<=K&>*bXVv>QYKA+*J^TA4Z{}|f+2%p1}5>*9$^T9jvpoI4*_9Nt3H0}meqN zKA<<YiI1*pbOfIKBoEKyWX)gU9`ugqEe_~)j@Rzc?nn3>mXxTf%3B<~Ll#P! zs)z{fggpDi9mncp|1%C6%Jp*q(t>z0E+{*(w)VrDk4HV;d6Yh zKC0T$=7aZ-@v0@-{RpXZ7x&{SvB!`1%q~B7Av@-5i`Ti(?k1c=FUh!wJKvO$n&eu` z+v3n2HT51vD3O{IiK>YSwOd=#cKN4VlVT;j;)-@Z!soD5#i6y;Eso~?$~vZ0RaK2$ ziO^2?9G|O??QYtAxXH4M+VOy1=XjkP?S6#MVM&Rq*1g5SwxC3=1#yRKg9sqF7b{dk zu8BjrCYldkGv~E*wEGcKA1>}uRib+LfcbzeIp1i{Fxm|wv=ctZ=So!X=CI?z`$VCH zch2@Bd=5)W$T834m|Gmso9@m-MnQuJ?Swot#8FV9deer*!Mj(Xgm=sKBjoNAcgreK zy{Ex^K(DM1(cVY2`w=p~8~3X!QN5ePeDMBCD3Lo{qH1Eo=dh$cs<&X659m#Ieg30_ ztlh;?P#;zO-Au1ryrYIQIneG$$Zxf{7f6X)mYSZ;%x-89i-UI`K?%p#kC1C(+?%CDRS(&Y2lP6}*&As0BYX}^N>uf!Ee_rd1|@Q}OH@rv zNWIs%k4=4S@Z6@u%NEV;bzymJmpq!w?YYGT6Yu%te! z+Un*5dYwZrZucX64ogbNxjU3|*M6&UeiG*`q1})0IV>qrRf4uSU`wtav~LFOeuU3q zNr|eWwHZ5w!M5gx--g(U#bZGY@&;F_1KVZu_&a*?i zAK`OYQlfhQhsD7=;h}`%>qp4DIbtmWC91c1*zsV!oSBDqH{l$5@hB)!y^qD>;OYlZ zBJbu%R836CGhD3npgvA~bEn~r553dkU?p4w0_}c;&tXZ4>iswt2it-YdA?3mwG-S+ zo<3s*5%nSG)lkkWyS8)wCg*jc-H-4&EGbdF$Hd}bTb%ugb~oW1dO63I;`>B#rXg7$^PWT+3D^b0V#Z+MjAS;pF zs6joO-I8ecBV-LS?xIve=46I4CzI*5opX;lCmHR2gwJ6~iRyh`<^#4QKB}sNc0WS$ zePY(M64m?FY^=Bf36yYr{RnyIORRXJgj^Fdxh7g1(3|c*M`m_|2)x?Ax^H{$`eN^w-G9S<@Gig-01MPl<8A?KMJOGGjPohk2m2;b5(g8gB;S1N0+^IwyJf6{|HOlw8PomjL@<-zkBb z?df}v*mp{B<~wJPv+q(*tqQg7(|rshswymGsCAwaY$^4@c?+C#mF6vh2^kYS3L}w6 zRZO5ReDgh6(mj+&>VxgF!pgk;CuE%W#v?s4y3q#{+>6JsG+ufN8EV0&?;_*)%Dy$h zc_d7C6R0H5S$fU9K6nWk6C6`_9H<4Kz8j9!nuk!w!MSyuFUY>3Nv{mZ*pX{ue4Ai1 z7YB?Sb9y%z`y25QRiPGq>Vtiohe&X49s6M4(4=u7gDQQm;fRk43mNLdrx}JLKB6jA zU{8IpZ!;eWIDKa=`-TVo z)^d&q)7=Cr$*1{gJnE?rCb$=mx)Gt|LWWxK={tm3ZAu`oD^{PP^Ufh!M?3;BsgD;V`AT>_1XvLa5 z)uyUY7e39u;SuR3xEHH6B9xpwAtzaEP?f5Mmy|%ocO4(5nLr)-G!Bjr{q;;_f^%b# z`_nugOmLpqQx8gw{q2%P(_PW!H->mT7LhnUvmq*0qA&+s_tr075iYjJnH5n61+~%(WZF-&=oQ! zI9jGtADoTHW5r_#4|?5Y0(I!qkxqSZ<{}epDfPhwYQ#%Uz(LCw_g|~;)NDR8pw@l5 z?#Ra`RmBAN;^UMO$SRem$+s3S4w)KE39C)xU;=gMQ#$p*`K?T_rPK!#s9f)Jrn?DL zeD^uisVdGR;f$Shg%@5z#zcG8Q}g?Q3he0-AA}Us>=JE>C^{T zhhTy&r3BZkV1g~Bs+d5Hc%L(!5~y{aW*&_kk5F ze^+`(0=4JUW6npmv|jsQf-|W2yJ>x+57fHn{3}@{-EF<%;k_r>^GfQ231m8@bV_iw z4jx?|^=<;S&VA0b5uxN{eUK`Gu-&xc3B05P*FR!^sSi|=mn?Y7HscY22fg|*!C6{N zrvxh3`@B7Gt$7t?f_<>>ZXcWp#&jAvvd7c>e^!|KV1jo(q`L=%2_>f$t?Fv!vhp)$ zRk_dV|2Jz>H3*rv&IB>hGSly2lcrCCS<5)l-AWsYf}jkN-8C|SDM++1nR=4x%nJlX}$Kr z1ZUdwD0CC7gz1z(t^2gP6w^k8k_#CV+>6zw1Zv%1hY(vF@#=#kX+>7bd2WRYX4h!f0qy+ckte{rHRPp_epMzSDxe@%t%Fm^IwM$iT zMMC~Y@v~M+a4&ue>n75(0oVC7CU^-MX9#eXMQe_iMb7z2+>2>=&|}US37iKovZ`NU zA>&?5^ICf9gIC6Q4YD=Yz~bQbe(uF|>Vwxgd4;caeb9XHiW{#Lj;v->jzY$39z65U zD*~x1R>BH-{VOGScA1s1!bk)?f;=zA^JOE?q7@c0eq!a{XZ*V@`jAFS@KYGmDZ%$w z{@(HTF%m(2@EQcKxA6Q-B%~2Co`>N%#F5#-3JV$cVtV8kWF+_*mq(OGI#tDI2A?rJ PFP;)Sf5Fl6C^+~3t-ac& literal 0 HcmV?d00001 diff --git a/some_thoughts_20230822_new/try_new_thought/sucess_new_scheme3.stl b/some_thoughts_20230822_new/try_new_thought/sucess_new_scheme3.stl new file mode 100644 index 0000000000000000000000000000000000000000..d27956f734e3d9b2c89680f22407578ed0a119a0 GIT binary patch literal 4284 zcmb7{!DxqGtEPHp)~p4+Q&ata)z#fIJ;~1Q(`Nhq$@KK?Da;2#)vTS_D+VRrUMY{Uw^@`uO2H zt}`lVT8Z~#2x}10WdadG8a?@QZ-ZX9cHT=^uHwtR5orYhm92sh0hY>|G>GJRxJrWa zYa)d(NI+%rmRJTc*2+ek#{nO)Y`X7*1XLD>k2xTJDr?msav@Py2{eq${G{(n0xHV{ zf8+5@rcu=7~xbaJ)W?$MD=o&XUh>jZ$%qLf)(jJeC@tk17ttC#1LH*4aOiv z^Lc%Rxi_Rda}t`jrSo~OnF@gm=ivz|l%~HPp{k}&q;>}v=%rDuV~|jvec5C`{CPgg zXQA}EeNuhd^NMKqe_+oO33tAR&ieTAY>=8j*sJ{5D~Wcto$(yu&OSshWBUek-E<8N zupPWWFU`Nfp3c4gDN(}bZ7ZbSpI82ks%EaM5Z5B8(jA1)Z#lovWMP`C+7Gu@aV-KW z%S2yHo~bHtUTMyr#+i$cYqoz9v978-frYeOxc6_W`H{k$pPn0C{Bo*A7l)6(ug>xJ zRXNox7YJKX@2^KdWtre-(|w;KGDD+rZF)Xp*@Q^>YcQm;Op$ucPrsXY5gE;K@gwi9 zB%rcPLU`&D5v|H9fx!HlNcES@t1MGXlxLTtOTD3fYe`6aJpwArB!quTELW&2WPC<7 zTlHKG5>Q!O2vRhzvhSfkLt|e1p7Y*}gq=9CrdJblC^^e+UOygs6B>+TkkCpz-62Gu z3Fc=DX#NSe?>YO-QvIv8pC&uKHAC+z}}wHIWsn;?-4^0hu{-X%Br*s9)r` z=vpnH3}_^jrdoaU79(N*14j66Z~9*YLOo(x{uA!f6pN+ueX`N@d)50ItR(dBgb0Pv xIeBL4G5Y&qV`n*jbw4g5ZqT?si{f88KUB{ZS5yhF@^3SUV%;%F&(ON#{RLqfSV;f? literal 0 HcmV?d00001 diff --git a/some_thoughts_20230822_new/try_new_thought/trail_3.py b/some_thoughts_20230822_new/try_new_thought/trail_3.py index 2c10c21..1e2fb48 100644 --- a/some_thoughts_20230822_new/try_new_thought/trail_3.py +++ b/some_thoughts_20230822_new/try_new_thought/trail_3.py @@ -44,21 +44,6 @@ pmfo = np.vstack((pmf, pout_nd)) wall = CreateWallByPointsUpdate(pmfo, th, height) -# print(wall.pnts.init_pts_sequence) -# print(wall.pnts.modify_edge_list) -# print(wall.side_coords) -# print(wall.pnts.pts_index) -# print(wall.pnts.pts_digraph) -# G = nx.from_dict_of_lists(wall.pnts.pts_digraph, create_using=nx.DiGraph) -# loops = list(nx.simple_cycles(G)) - -# print("Loops in the MultiDiGraph:") -# for loop in loops: -# print(loop) - - -# plot_digraph(wall.pnts.pts_digraph) -# wall.visualize() -# print(wall.loops) -# wall.visualize_graph() -wall.visualize() \ No newline at end of file +poly = wall.Shape() +wall.visualize() +aw.tool.write_stl(poly, "sucess_new_scheme",store_dir="/home/yhe/Documents/new_am2/amworkflow/some_thoughts_20230822_new/try_new_thought") diff --git a/some_thoughts_20230822_new/try_new_thought/trail_4.py b/some_thoughts_20230822_new/try_new_thought/trail_4.py index b0df52c..ac7b5d1 100644 --- a/some_thoughts_20230822_new/try_new_thought/trail_4.py +++ b/some_thoughts_20230822_new/try_new_thought/trail_4.py @@ -5,6 +5,8 @@ import os import pandas as pd import numpy as np +import time +from amworkflow.src.utils.meter import timer name = 'print110823' root = pathlib.Path(__file__).parent @@ -12,12 +14,16 @@ data['z'] = np.zeros(len(data)) # add z coordinate # print(data) pmfo = np.array(data[['x','y','z']]) -print(pmfo) +print(pmfo.shape) # print(len(pmfo)) # # only for outer line # print(pmfo[0:90]) g = aw.geom -wall = CreateWallByPointsUpdate(pmfo, 8, 12) +wall = CreateWallByPointsUpdate(pmfo, 50, 12, is_close=False) # print(wall.loops) # wall.visualize_graph() -wall.visualize(display_polygon=False) +wall.visualize(display_polygon=True) +poly = wall.Shape() +wall.visualize() +aw.tool.write_stl(poly, "sucess_new_scheme2",store_dir="/home/yhe/Documents/new_am2/amworkflow/some_thoughts_20230822_new/try_new_thought") + diff --git a/some_thoughts_20230822_new/try_new_thought/trail_5.py b/some_thoughts_20230822_new/try_new_thought/trail_5.py index 6031d97..13f916f 100644 --- a/some_thoughts_20230822_new/try_new_thought/trail_5.py +++ b/some_thoughts_20230822_new/try_new_thought/trail_5.py @@ -4,6 +4,8 @@ points = [[],[0,2],[2,4],[5,4],[8,4],[8,6],[3,6],[3,1]] wall = CreateWallByPointsUpdate(points,1,2) -print(wall.loops) # wall.visualize_graph() +poly = wall.Shape() + +aw.tool.write_stl(poly, "sucess_new_scheme3",store_dir="/home/yhe/Documents/new_am2/amworkflow/some_thoughts_20230822_new/try_new_thought") wall.visualize() \ No newline at end of file diff --git a/some_thoughts_20230822_new/try_new_thought/visulize_intersect.py b/some_thoughts_20230822_new/try_new_thought/visulize_intersect.py new file mode 100644 index 0000000..d40cc3e --- /dev/null +++ b/some_thoughts_20230822_new/try_new_thought/visulize_intersect.py @@ -0,0 +1,5 @@ +from amworkflow.src.utils.visualizer import plot_intersect +from amworkflow.src.geometries.simple_geometry import random_line_gen +lin1 = random_line_gen(0,10,0,10) +lin2 = random_line_gen(0,10,0,10) +plot_intersect(0,6,5,5,0,6,1900,1900) \ No newline at end of file From 4f4b017e5c936abd930d517b6b411ab5c1089aad Mon Sep 17 00:00:00 2001 From: yuxiang Date: Tue, 12 Sep 2023 00:18:48 +0200 Subject: [PATCH 2/2] minor fix. --- amworkflow/src/geometries/mesher.py | 1 - amworkflow/src/geometries/operator.py | 2 +- environment_clean.yml | 22 ++++++++++++++++++++++ examples/TrussArc/trussarc.py | 1 + pyproject.toml | 3 --- 5 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 environment_clean.yml diff --git a/amworkflow/src/geometries/mesher.py b/amworkflow/src/geometries/mesher.py index e8ffa84..ce0f0de 100644 --- a/amworkflow/src/geometries/mesher.py +++ b/amworkflow/src/geometries/mesher.py @@ -45,7 +45,6 @@ def mesher(item: TopoDS_Shape, model.add(model_name) v = get_geom_pointer(model, geo) model.occ.synchronize() - gmsh.fltk.run() for layer in v: model.add_physical_group(3,[layer[1]], name=f"layer{layer[1]}") phy_gp = model.getPhysicalGroups() diff --git a/amworkflow/src/geometries/operator.py b/amworkflow/src/geometries/operator.py index 0306ea2..07e3904 100644 --- a/amworkflow/src/geometries/operator.py +++ b/amworkflow/src/geometries/operator.py @@ -81,7 +81,7 @@ def split(item: TopoDS_Shape, plan_len = 1.2 * max(abs(xmin - xmax), abs(ymin - ymax)) z = zmax - zmin if nz != None: - z_list = np.linspace(zmin, z, nz) + z_list = np.linspace(zmin, z, nz+1) if layer_thickness != None: z_list = np.arange(zmin, z, layer_thickness) z_list = np.concatenate((z_list,np.array([z]))) diff --git a/environment_clean.yml b/environment_clean.yml new file mode 100644 index 0000000..ffbe170 --- /dev/null +++ b/environment_clean.yml @@ -0,0 +1,22 @@ +name: amworkflow_clean +channels: + - conda-forge + - defaults +dependencies: + - pythonocc-core=7.7.0 + - python=3.10 + - pandas + - sqlite + - numpy + - fenics-dolfinx + - mpich + - pyvista + - pip + - pip: + - gmsh==4.11.1 + - networkx + - pyqt5 + - sphinx + - sqlalchemy + - ruamel-yaml + - doit diff --git a/examples/TrussArc/trussarc.py b/examples/TrussArc/trussarc.py index b828c61..9aadf63 100644 --- a/examples/TrussArc/trussarc.py +++ b/examples/TrussArc/trussarc.py @@ -27,6 +27,7 @@ def geometry_spawn(pm): # pmfo = pmfo[0:90] # outline wall_maker = g.CreateWallByPoints(pmfo, pm.thickness, pm.height,is_close=False) design = wall_maker.Shape() + # wall_maker.visualize # Uncomment this line if you would like to visualize it in plot. return design #TopoDS_Shape diff --git a/pyproject.toml b/pyproject.toml index 1a8b2ff..53e07b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,9 +17,6 @@ classifiers = [ license = {file = "LICENSE"} keywords = ["AM concrete", "workflow", "CAD"] dependencies = [ - "fenics-dolfinx", - "gmsh", - "sqlalchemy" ] [project.urls]