Changeset View
Changeset View
Standalone View
Standalone View
mesh_snap_utilities_line.py
| Show First 20 Lines • Show All 349 Lines • ▼ Show 20 Lines | def get_loose_linked_edges(bmvert): | ||||
| return linked | return linked | ||||
| def draw_line(self, obj, bm, bm_geom, location): | def draw_line(self, obj, bm, bm_geom, location): | ||||
| split_faces = set() | split_faces = set() | ||||
| drawing_is_dirt = False | drawing_is_dirt = False | ||||
| update_edit_mesh = False | update_edit_mesh = False | ||||
| tessface = False | loop_triangles = False | ||||
| if bm_geom is None: | if bm_geom is None: | ||||
| vert = bm.verts.new(location) | vert = bm.verts.new(location) | ||||
| self.list_verts.append(vert) | self.list_verts.append(vert) | ||||
| elif isinstance(bm_geom, bmesh.types.BMVert): | elif isinstance(bm_geom, bmesh.types.BMVert): | ||||
| if (bm_geom.co - location).length_squared < .001: | if (bm_geom.co - location).length_squared < .001: | ||||
| if self.list_verts == [] or self.list_verts[-1] != bm_geom: | if self.list_verts == [] or self.list_verts[-1] != bm_geom: | ||||
| ▲ Show 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | if len(self.list_verts) >= 2: | ||||
| if split_faces: | if split_faces: | ||||
| edge = bm.edges.new([v1, v2]) | edge = bm.edges.new([v1, v2]) | ||||
| self.list_edges.append(edge) | self.list_edges.append(edge) | ||||
| ed_list = get_loose_linked_edges(v2) | ed_list = get_loose_linked_edges(v2) | ||||
| for face in split_faces: | for face in split_faces: | ||||
| facesp = bmesh.utils.face_split_edgenet(face, ed_list) | facesp = bmesh.utils.face_split_edgenet(face, ed_list) | ||||
| del split_faces | del split_faces | ||||
| update_edit_mesh = True | update_edit_mesh = True | ||||
| tessface = True | loop_triangles = True | ||||
| else: | else: | ||||
| if self.intersect: | if self.intersect: | ||||
| facesp = bmesh.ops.connect_vert_pair(bm, verts=[v1, v2], verts_exclude=bm.verts) | facesp = bmesh.ops.connect_vert_pair(bm, verts=[v1, v2], verts_exclude=bm.verts) | ||||
| # print(facesp) | # print(facesp) | ||||
| if not self.intersect or not facesp['edges']: | if not self.intersect or not facesp['edges']: | ||||
| edge = bm.edges.new([v1, v2]) | edge = bm.edges.new([v1, v2]) | ||||
| self.list_edges.append(edge) | self.list_edges.append(edge) | ||||
| drawing_is_dirt = True | drawing_is_dirt = True | ||||
| else: | else: | ||||
| for edge in facesp['edges']: | for edge in facesp['edges']: | ||||
| self.list_edges.append(edge) | self.list_edges.append(edge) | ||||
| update_edit_mesh = True | update_edit_mesh = True | ||||
| tessface = True | loop_triangles = True | ||||
| # create face | # create face | ||||
| if self.create_face: | if self.create_face: | ||||
| ed_list = set(self.list_edges) | ed_list = set(self.list_edges) | ||||
| for edge in v2.link_edges: | for edge in v2.link_edges: | ||||
| for vert in edge.verts: | for vert in edge.verts: | ||||
| if vert != v2 and vert in self.list_verts: | if vert != v2 and vert in self.list_verts: | ||||
| ed_list.add(edge) | ed_list.add(edge) | ||||
| break | break | ||||
| else: | else: | ||||
| continue | continue | ||||
| # Inner loop had a break, break the outer | # Inner loop had a break, break the outer | ||||
| break | break | ||||
| ed_list.update(get_loose_linked_edges(v2)) | ed_list.update(get_loose_linked_edges(v2)) | ||||
| bmesh.ops.edgenet_fill(bm, edges=list(ed_list)) | bmesh.ops.edgenet_fill(bm, edges=list(ed_list)) | ||||
| update_edit_mesh = True | update_edit_mesh = True | ||||
| tessface = True | loop_triangles = True | ||||
| # print('face created') | # print('face created') | ||||
| if update_edit_mesh: | if update_edit_mesh: | ||||
| bmesh.update_edit_mesh(obj.data, tessface = tessface) | bmesh.update_edit_mesh(obj.data, loop_triangles = loop_triangles) | ||||
| self.sctx.update_drawn_snap_object(self.snap_obj) | self.sctx.update_drawn_snap_object(self.snap_obj) | ||||
| #bm.verts.index_update() | #bm.verts.index_update() | ||||
| elif drawing_is_dirt: | elif drawing_is_dirt: | ||||
| self.obj.update_from_editmode() | self.obj.update_from_editmode() | ||||
| self.sctx.update_drawn_snap_object(self.snap_obj) | self.sctx.update_drawn_snap_object(self.snap_obj) | ||||
| return [obj.matrix_world * v.co for v in self.list_verts] | return [obj.matrix_world * v.co for v in self.list_verts] | ||||
| ▲ Show 20 Lines • Show All 708 Lines • Show Last 20 Lines | |||||