Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'curve_tools/internal.py')
-rw-r--r--curve_tools/internal.py40
1 files changed, 35 insertions, 5 deletions
diff --git a/curve_tools/internal.py b/curve_tools/internal.py
index e967fc6e..96816189 100644
--- a/curve_tools/internal.py
+++ b/curve_tools/internal.py
@@ -103,11 +103,11 @@ def nearestPointOfLines(originA, dirA, originB, dirB, tollerance=0.0):
def lineSegmentLineSegmentIntersection(beginA, endA, beginB, endB, tollerance=0.001):
dirA = endA-beginA
dirB = endB-beginB
- intersection = nearestPointOfLines(beginA, dirA, beginB, dirB)
- if math.isnan(intersection[0]) or (intersection[2]-intersection[3]).length > tollerance or \
- intersection[0] < 0 or intersection[0] > 1 or intersection[1] < 0 or intersection[1] > 1:
+ paramA, paramB, pointA, pointB = nearestPointOfLines(beginA, dirA, beginB, dirB)
+ if math.isnan(paramA) or (pointA-pointB).length > tollerance or \
+ paramA < 0 or paramA > 1 or paramB < 0 or paramB > 1:
return None
- return intersection
+ return (paramA, paramB, pointA, pointB)
def aabbOfPoints(points):
min = Vector(points[0])
@@ -290,6 +290,16 @@ def isSegmentLinear(points, tollerance=0.0001):
def bezierSegmentPoints(begin, end):
return [begin.co, begin.handle_right, end.handle_left, end.co]
+def grab_cursor(context, event):
+ if event.mouse_region_x < 0:
+ context.window.cursor_warp(context.region.x+context.region.width, event.mouse_y)
+ elif event.mouse_region_x > context.region.width:
+ context.window.cursor_warp(context.region.x, event.mouse_y)
+ elif event.mouse_region_y < 0:
+ context.window.cursor_warp(event.mouse_x, context.region.y+context.region.height)
+ elif event.mouse_region_y > context.region.height:
+ context.window.cursor_warp(event.mouse_x, context.region.y)
+
def deleteFromArray(item, array):
for index, current in enumerate(array):
if current is item:
@@ -586,7 +596,6 @@ def getSelectedSplines(include_bezier, include_polygon, allow_partial_selection=
return result
def addObject(type, name):
- bpy.ops.object.select_all(action='DESELECT')
if type == 'CURVE':
data = bpy.data.curves.new(name=name, type='CURVE')
data.dimensions = '3D'
@@ -780,6 +789,27 @@ def filletSpline(spline, radius, chamfer_mode, limit_half_way, tollerance=0.0001
i = i+1
return addBezierSpline(bpy.context.object, spline.use_cyclic_u, vertices)
+def dogBone(spline, radius):
+ vertices = []
+ def handlePoint(prev_segment_points, next_segment_points, selected, prev_tangent, current_tangent, next_tangent, normal, angle, is_first, is_last):
+ if not selected or is_first or is_last or angle == 0 or normal[2] > 0.0 or \
+ (spline.type == 'BEZIER' and not (isSegmentLinear(prev_segment_points) and isSegmentLinear(next_segment_points))):
+ prev_handle = next_segment_points[0] if is_first else prev_segment_points[2] if spline.type == 'BEZIER' else prev_segment_points[0]
+ next_handle = next_segment_points[0] if is_last else next_segment_points[1] if spline.type == 'BEZIER' else next_segment_points[3]
+ vertices.append([prev_handle, next_segment_points[0], next_handle])
+ return
+ tan_factor = math.tan(angle*0.5)
+ corner = next_segment_points[0]+normal.cross(prev_tangent)*radius-prev_tangent*radius*tan_factor
+ direction = next_segment_points[0]-corner
+ distance = direction.length
+ corner = next_segment_points[0]+direction/distance*(distance-radius)
+ vertices.append([prev_segment_points[0], next_segment_points[0], corner])
+ vertices.append([next_segment_points[0], corner, next_segment_points[0]])
+ vertices.append([corner, next_segment_points[0], next_segment_points[3]])
+ iterateSpline(spline, handlePoint)
+ print(vertices)
+ return vertices
+
def discretizeCurve(spline, step_angle, samples):
vertices = []
def handlePoint(prev_segment_points, next_segment_points, selected, prev_tangent, current_tangent, next_tangent, normal, angle, is_first, is_last):