Pose library: fix asset creation operator poll when no object active
[blender-addons.git] / curve_tools / util.py
blob5960318605ce45c9e924267af26f9e8dec1b317f
1 # SPDX-License-Identifier: GPL-2.0-or-later
3 import bpy
4 from mathutils import *
7 def GetSelectedCurves():
8 rvList = []
10 for obj in bpy.context.selected_objects:
11 try:
12 if obj.type == "CURVE": rvList.append(obj)
13 except:
14 pass
16 return rvList
19 def GetSelectedMeshes():
20 rvList = []
22 for obj in bpy.context.selected_objects:
23 try:
24 if obj.type == "MESH": rvList.append(obj)
25 except:
26 pass
28 return rvList
31 def Selected1Curve():
32 try:
33 if len(GetSelectedCurves()) == 1:
34 return (bpy.context.active_object.type == "CURVE")
35 except:
36 pass
38 return False
41 def Selected1Mesh():
42 try:
43 if len(GetSelectedMeshes()) == 1:
44 return (bpy.context.active_object.type == "MESH")
45 except:
46 pass
48 return False
51 def Selected1SingleSplineCurve():
52 try:
53 if Selected1Curve():
54 return (len(bpy.context.active_object.data.splines) == 1)
55 except:
56 pass
58 return False
61 def Selected2Curves():
62 try:
63 if len(GetSelectedCurves()) == 2:
64 return (bpy.context.active_object.type == "CURVE")
65 except:
66 pass
68 return False
71 def Selected3Curves():
72 try:
73 if len(GetSelectedCurves()) == 3:
74 return (bpy.context.active_object.type == "CURVE")
75 except:
76 pass
78 return False
81 def Selected1OrMoreCurves():
82 try:
83 if len(GetSelectedCurves()) > 0:
84 return (bpy.context.active_object.type == "CURVE")
85 except:
86 pass
88 return False
90 def Selected2OrMoreCurves():
91 try:
92 if len(GetSelectedCurves()) > 1:
93 return (bpy.context.active_object.type == "CURVE")
94 except:
95 pass
97 return False
100 def Selected1OrMoreMesh():
101 try:
102 if len(GetSelectedMeshes()) > 0:
103 return (bpy.context.active_object.type == "MESH")
104 except:
105 pass
107 return False
110 def GetToolsRegion():
111 for area in bpy.context.screen.areas:
112 if area.type == 'VIEW_3D':
113 for region in area.regions:
114 if region.type == 'TOOLS': return region
116 return None
119 def GetFirstRegionView3D():
120 for area in bpy.context.screen.areas:
121 if area.type == 'VIEW_3D':
122 return area.spaces[0].region_3d
124 return None
127 def LogFirstRegionView3D():
128 print("LogFirstRegionView3D()")
129 regionView3D = GetFirstRegionView3D()
130 if regionView3D is None:
131 print("--", "ERROR:", "regionView3D is None")
132 return
134 print("--", "view_matrix:")
135 print("--", "--", regionView3D.view_matrix)
136 print("--", "view_location:")
137 print("--", "--", regionView3D.view_location)
140 class Intersection:
141 # listIP: list of BezierSplineIntersectionPoint
142 # return: list of splines
143 @staticmethod
144 def GetBezierSplines(listIP):
145 rvList = []
147 for ip in listIP:
148 if not (ip.spline in rvList): rvList.append(ip.spline)
150 return rvList
153 # listIP: list of BezierSplineIntersectionPoint
154 # return: list of segments
155 @staticmethod
156 def GetBezierSegments(listIP, spline):
157 rvList = []
159 for ip in listIP:
160 if not ip.spline is spline: continue
162 segIP = ip.bezierSegmentIntersectionPoint
163 if not (segIP.segment in rvList): rvList.append(segIP.segment)
165 return rvList
168 # listIP: list of BezierSplineIntersectionPoint
169 # return: list of floats (not necessarily ordered)
170 @staticmethod
171 def GetBezierSegmentParameters(listIP, segment):
172 rvList = []
174 for ip in listIP:
175 segIP = ip.bezierSegmentIntersectionPoint
176 if not segIP.segment is segment: continue
178 rvList.append(segIP.parameter)
180 return rvList