-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoperators.py
115 lines (89 loc) · 3.08 KB
/
operators.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# SPDX-License-Identifier: GPL-3.0-or-later
import bpy
import bmesh
from .gpu_drawer import GPUDrawer
from .mesh_analyzer import MeshAnalyzer
drawer = GPUDrawer()
class Mesh_Analysis_Overlay(bpy.types.Operator):
bl_idname = "view3d.mesh_analysis_overlay"
bl_label = "Toggle Mesh Analysis Overlay"
bl_description = (
"Toggle the display of the Mesh Analysis Overlay in the 3D viewport"
)
def execute(self, context):
if drawer.is_running:
drawer.stop()
else:
drawer.start()
for area in context.screen.areas:
if area.type == "VIEW_3D":
area.tag_redraw()
return {"FINISHED"}
class Select_Feature_Elements(bpy.types.Operator):
bl_idname = "view3d.select_feature_elements"
bl_label = "Select Feature Elements"
bl_description = (
"Select mesh elements of this type. \nShift/Ctrl to extend/subtract selection."
)
bl_options = {"REGISTER", "UNDO"}
feature: bpy.props.StringProperty()
mode: bpy.props.EnumProperty(
items=[
("SET", "Set", "Set selection"),
("ADD", "Add", "Add to selection"),
("SUB", "Subtract", "Subtract from selection"),
],
default="SET",
)
def invoke(self, context, event):
if event.shift:
self.mode = "ADD"
elif event.ctrl:
self.mode = "SUB"
else:
self.mode = "SET"
return self.execute(context)
def execute(self, context):
obj = context.active_object
if not obj or obj.type != "MESH":
self.report({"WARNING"}, "No active mesh object")
return {"CANCELLED"}
if obj.mode != "EDIT":
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.select_mode(type="VERT")
if self.mode == "SET":
bpy.ops.mesh.select_all(action="DESELECT")
mesh = obj.data
bm = bmesh.from_edit_mesh(mesh)
bm.faces.ensure_lookup_table()
bm.edges.ensure_lookup_table()
bm.verts.ensure_lookup_table()
analyzer = MeshAnalyzer.get_analyzer(obj)
indices = analyzer.analyze_feature(self.feature)
feature_type = analyzer.get_feature_type(self.feature)
# Select elements based on feature type
if feature_type == "FACE":
for idx in indices:
if idx < len(bm.faces):
bm.faces[idx].select = self.mode != "SUB"
elif feature_type == "EDGE":
for idx in indices:
if idx < len(bm.edges):
bm.edges[idx].select = self.mode != "SUB"
elif feature_type == "VERT":
for idx in indices:
if idx < len(bm.verts):
bm.verts[idx].select = self.mode != "SUB"
return {"FINISHED"}
classes = (
Mesh_Analysis_Overlay,
Select_Feature_Elements,
)
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
if drawer:
drawer.stop()
for cls in reversed(classes):
bpy.utils.unregister_class(cls)