point attribute co to position
parent
3ece64e517
commit
6e94ee270d
|
@ -53,11 +53,14 @@ def create_gap_stroke(f, ob, tol=10, mat_id=None):
|
|||
encounter = defaultdict(list)
|
||||
plist = []
|
||||
matrix = ob.matrix_world
|
||||
for s in f.strokes:#add first and last
|
||||
for s in f.strokes: #add first and last
|
||||
smat = ob.material_slots[s.material_index].material
|
||||
if not smat:continue#no material on line
|
||||
if smat.grease_pencil.show_fill:continue# skip fill lines -> #smat.grease_pencil.show_stroke
|
||||
if len(s.points) < 2:continue#avoid 0 or 1 points
|
||||
if not smat:
|
||||
continue #no material on line
|
||||
if smat.grease_pencil.show_fill:
|
||||
continue # skip fill lines -> #smat.grease_pencil.show_stroke
|
||||
if len(s.points) < 2:
|
||||
continue #avoid 0 or 1 points
|
||||
plist.append(s.points[0])
|
||||
plist.append(s.points[-1])
|
||||
# plist.extend([s.points[0], s.points[-1])# is extend faster ?
|
||||
|
@ -70,7 +73,7 @@ def create_gap_stroke(f, ob, tol=10, mat_id=None):
|
|||
for op in plist:#other points
|
||||
if p == op:# print('same point')
|
||||
continue
|
||||
gap2d = vector_length_2d(location_to_region(matrix @ p.co), location_to_region(matrix @ op.co))
|
||||
gap2d = vector_length_2d(location_to_region(matrix @ p.position), location_to_region(matrix @ op.position))
|
||||
# print('gap2d: ', gap2d)
|
||||
if gap2d > tol:
|
||||
continue
|
||||
|
@ -102,7 +105,7 @@ def create_gap_stroke(f, ob, tol=10, mat_id=None):
|
|||
encounter[p].append(op)
|
||||
|
||||
|
||||
simple_draw_gp_stroke([p.co, op.co], f, width = 2, mat_id = mat_id)
|
||||
simple_draw_gp_stroke([p.position, op.position], f, width = 2, mat_id = mat_id)
|
||||
ctl += 1
|
||||
|
||||
print(f'{ctl} line created')
|
||||
|
@ -143,9 +146,9 @@ def is_deviating_by(s, deviation=0.75):
|
|||
pb = s.points[-2]
|
||||
pc = s.points[-3]
|
||||
|
||||
a = location_to_region(pa.co)
|
||||
b = location_to_region(pb.co)
|
||||
c = location_to_region(pc.co)
|
||||
a = location_to_region(pa.position)
|
||||
b = location_to_region(pb.position)
|
||||
c = location_to_region(pc.position)
|
||||
|
||||
#cb-> compare angle with ba->
|
||||
angle = (b-c).angle(a-b)
|
||||
|
@ -158,16 +161,16 @@ def extend_stroke_tips(s,f,ob,length, mat_id):
|
|||
'''extend line boundary by given length'''
|
||||
for id_pair in [ [1,0], [-2,-1] ]:# start and end pair
|
||||
## 2D mode
|
||||
# a = location_to_region(ob.matrix_world @ s.points[id_pair[0]].co)
|
||||
# b_loc = ob.matrix_world @ s.points[id_pair[1]].co
|
||||
# a = location_to_region(ob.matrix_world @ s.points[id_pair[0]].position)
|
||||
# b_loc = ob.matrix_world @ s.points[id_pair[1]].position
|
||||
# b = location_to_region(b_loc)
|
||||
# c = extrapolate_points_by_length(a,b,length)#print(vector_length_2d(b,c))
|
||||
# c_loc = region_to_location(c, b_loc)
|
||||
# simple_draw_gp_stroke([ob.matrix_world.inverted() @ b_loc, ob.matrix_world.inverted() @ c_loc], f, width=2, mat_id=mat_id)
|
||||
|
||||
## 3D
|
||||
a = s.points[id_pair[0]].co# ob.matrix_world @
|
||||
b = s.points[id_pair[1]].co# ob.matrix_world @
|
||||
a = s.points[id_pair[0]].position# ob.matrix_world @
|
||||
b = s.points[id_pair[1]].position# ob.matrix_world @
|
||||
c = extrapolate_points_by_length(a,b,length)#print(vector_length(b,c))
|
||||
simple_draw_gp_stroke([b,c], f, width=2, mat_id=mat_id)
|
||||
|
||||
|
@ -188,15 +191,15 @@ def change_extension_length(ob, strokelist, length, selected=False):
|
|||
|
||||
## Change length of current length to designated
|
||||
# Vector point A to point B (direction), push point B in this direction
|
||||
a = s.points[-2].co
|
||||
a = s.points[-2].position
|
||||
bp = s.points[-1]#end-point
|
||||
b = bp.co
|
||||
b = bp.position
|
||||
ab = b - a
|
||||
if not ab:
|
||||
continue
|
||||
# new pos of B is A + new length in the AB direction
|
||||
newb = a + (ab.normalized() * length)
|
||||
bp.co = newb
|
||||
bp.position = newb
|
||||
ct += 1
|
||||
|
||||
return ct
|
||||
|
|
|
@ -347,7 +347,7 @@ def add_stroke(s, frame, layer, obj, select=False):
|
|||
for k, v in pt.items():
|
||||
if k == 'co':
|
||||
setattr(ns.points[i], k, v)
|
||||
ns.points[i].co = ob_mat_inv @ mat @ ns.points[i].co # invert of object * invert of layer * coordinate
|
||||
ns.points[i].position = ob_mat_inv @ mat @ ns.points[i].position # invert of object * invert of layer * coordinate
|
||||
else:
|
||||
setattr(ns.points[i], k, v)
|
||||
if select:
|
||||
|
@ -358,7 +358,7 @@ def add_stroke(s, frame, layer, obj, select=False):
|
|||
for k, v in pt.items():
|
||||
if k == 'co':
|
||||
setattr(ns.points[i], k, v)
|
||||
ns.points[i].co = ob_mat_inv @ ns.points[i].co# invert of object * coordinate
|
||||
ns.points[i].position = ob_mat_inv @ ns.points[i].position# invert of object * coordinate
|
||||
else:
|
||||
setattr(ns.points[i], k, v)
|
||||
if select:
|
||||
|
|
|
@ -231,7 +231,7 @@ class GPTB_OT_eraser(Operator):
|
|||
|
||||
hld_stroke.points.add(count=1)
|
||||
p = hld_stroke.points[-1]
|
||||
p.co = mat_inv @ mouse_3d
|
||||
p.position = mat_inv @ mouse_3d
|
||||
p.pressure = search_radius * 2000
|
||||
|
||||
#context.scene.cursor.location = mouse_3d
|
||||
|
@ -309,18 +309,18 @@ class GPTB_OT_eraser(Operator):
|
|||
bpy.ops.gpencil.stroke_subdivide(number_cuts=number_cuts, only_selected=True)
|
||||
|
||||
new_p1 = stroke.points[p1_index+1]
|
||||
new_p1.co = mat_inv@intersects[0]
|
||||
new_p1.position = mat_inv@intersects[0]
|
||||
new_points += [(stroke, p1_index+1)]
|
||||
|
||||
#print('number_cuts', number_cuts)
|
||||
|
||||
if number_cuts == 2:
|
||||
new_p2 = stroke.points[p1_index+2]
|
||||
new_p2.co = mat_inv@( (intersects[0] + intersects[1])/2 )
|
||||
new_p2.position = mat_inv@( (intersects[0] + intersects[1])/2 )
|
||||
#new_points += [new_p2]
|
||||
|
||||
new_p3 = stroke.points[p1_index+3]
|
||||
new_p3.co = mat_inv@intersects[1]
|
||||
new_p3.position = mat_inv@intersects[1]
|
||||
new_points += [(stroke, p1_index+3)]
|
||||
|
||||
#print('subdivide', time() - t3)
|
||||
|
@ -448,15 +448,15 @@ class GPTB_OT_eraser(Operator):
|
|||
print('get_gp_points', time()-t0)
|
||||
|
||||
t0 = time()
|
||||
#points_data = [(s, f, m, p, get_screen_co(p.co, matrix)) for s, f, m in points_data for p in reversed(s.points)]
|
||||
points_data = [(s, f, m, p, org + ((matrix @ p.co)-org).normalized()*1) for s, f, m in points_data for p in reversed(s.points)]
|
||||
#points_data = [(s, f, m, p, get_screen_co(p.position, matrix)) for s, f, m in points_data for p in reversed(s.points)]
|
||||
points_data = [(s, f, m, p, org + ((matrix @ p.position)-org).normalized()*1) for s, f, m in points_data for p in reversed(s.points)]
|
||||
print('points_to_2d', time()-t0)
|
||||
|
||||
#print(points_data)
|
||||
self.points_data = [(s, f, m, p, co) for s, f, m, p, co in points_data if co is not None]
|
||||
|
||||
#for s, f, m, p, co in self.points_data:
|
||||
# p.co = co
|
||||
# p.position = co
|
||||
|
||||
|
||||
t0 = time()
|
||||
|
|
|
@ -18,7 +18,7 @@ def remove_stroke_exact_duplications(apply=True):
|
|||
stroke_list = []
|
||||
for s in reversed(f.strokes):
|
||||
|
||||
point_list = [p.co for p in s.points]
|
||||
point_list = [p.position for p in s.points]
|
||||
|
||||
if point_list in stroke_list:
|
||||
ct += 1
|
||||
|
|
|
@ -40,7 +40,7 @@ def batch_flat_reproject(obj, proj_type='VIEW', all_strokes=True, restore_frame=
|
|||
|
||||
for s in f.strokes:
|
||||
for p in s.points:
|
||||
p.co = obj.matrix_world.inverted() @ region_to_location(location_to_region(obj.matrix_world @ p.co), scn.cursor.location)
|
||||
p.position = obj.matrix_world.inverted() @ region_to_location(location_to_region(obj.matrix_world @ p.position), scn.cursor.location)
|
||||
|
||||
if restore_frame:
|
||||
bpy.context.scene.frame_current = oframe
|
||||
|
@ -68,7 +68,7 @@ def batch_flat_reproject(obj):
|
|||
plane_co = scn.cursor.location
|
||||
|
||||
for s in f.strokes:
|
||||
points_co = [obj.matrix_world @ p.co for p in s.points]
|
||||
points_co = [obj.matrix_world @ p.position for p in s.points]
|
||||
points_co = [mat_inv @ intersect_line_plane(origin, p, plane_co, plane_no) for p in points_co]
|
||||
points_co = [co for vector in points_co for co in vector]
|
||||
|
||||
|
@ -76,8 +76,8 @@ def batch_flat_reproject(obj):
|
|||
s.points.add(1) # update
|
||||
s.points.pop() # update
|
||||
#for p in s.points:
|
||||
# loc_2d = location_to_region(obj.matrix_world @ p.co)
|
||||
# p.co = obj.matrix_world.inverted() @ region_to_location(loc_2d, scn.cursor.location)
|
||||
# loc_2d = location_to_region(obj.matrix_world @ p.position)
|
||||
# p.position = obj.matrix_world.inverted() @ region_to_location(loc_2d, scn.cursor.location)
|
||||
"""
|
||||
|
||||
def batch_flat_reproject(obj):
|
||||
|
@ -103,7 +103,7 @@ def batch_flat_reproject(obj):
|
|||
if f.frame_number != scn.frame_current:
|
||||
f = l.frames.copy(f) # duplicate content of the previous frame
|
||||
for s in f.strokes:
|
||||
points_co = [obj.matrix_world @ p.co for p in s.points]
|
||||
points_co = [obj.matrix_world @ p.position for p in s.points]
|
||||
points_co = [mat_inv @ intersect_line_plane(origin, p, plane_co, plane_no) for p in points_co]
|
||||
points_co = [co for vector in points_co for co in vector]
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ class GP_OT_pick_closest_layer(Operator):
|
|||
continue
|
||||
elif self.stroke_filter == 'FILL' and not self.ob.data.materials[s.material_index].grease_pencil.show_fill:
|
||||
continue
|
||||
self.point_pair += [(Vector((*location_to_region(mat @ p.co), 0)), layer_id) for p in s.points]
|
||||
self.point_pair += [(Vector((*location_to_region(mat @ p.position), 0)), layer_id) for p in s.points]
|
||||
|
||||
else:
|
||||
# [s for l in gp.layers if not l.lock and not l.hide for s in l.active_frame.stokes]
|
||||
|
@ -98,7 +98,7 @@ class GP_OT_pick_closest_layer(Operator):
|
|||
continue
|
||||
elif self.stroke_filter == 'FILL' and not self.ob.data.materials[s.material_index].grease_pencil.show_fill:
|
||||
continue
|
||||
self.point_pair += [(Vector((*location_to_region(mat @ p.co), 0)), layer_id) for p in s.points]
|
||||
self.point_pair += [(Vector((*location_to_region(mat @ p.position), 0)), layer_id) for p in s.points]
|
||||
|
||||
if not self.point_pair:
|
||||
self.report({'ERROR'}, 'No stroke found, maybe layers are locked or hidden')
|
||||
|
|
|
@ -39,14 +39,14 @@ class GP_OT_pick_closest_material(Operator):
|
|||
|
||||
def filter_stroke(self, context):
|
||||
# get stroke under mouse using kdtree
|
||||
point_pair = [(p.co, s) for s in self.stroke_list for p in s.points] # local space
|
||||
point_pair = [(p.position, s) for s in self.stroke_list for p in s.points] # local space
|
||||
|
||||
kd = mathutils.kdtree.KDTree(len(point_pair))
|
||||
for i, pair in enumerate(point_pair):
|
||||
kd.insert(pair[0], i)
|
||||
kd.balance()
|
||||
|
||||
## Get 3D coordinate on drawing plane according to mouse 2d.co on flat 2d drawing
|
||||
## Get 3D coordinate on drawing plane according to mouse 2d.position on flat 2d drawing
|
||||
_ob, hit, _plane_no = get_3d_coord_on_drawing_plane_from_2d(context, self.init_mouse)
|
||||
|
||||
if not hit:
|
||||
|
@ -62,7 +62,7 @@ class GP_OT_pick_closest_material(Operator):
|
|||
## find point index in stroke
|
||||
self.idx = None
|
||||
for i, p in enumerate(s.points):
|
||||
if p.co == co:
|
||||
if p.position == co:
|
||||
self.idx = i
|
||||
break
|
||||
|
||||
|
@ -116,8 +116,8 @@ class GP_OT_pick_closest_material(Operator):
|
|||
self.report({'WARNING'}, 'No coord found')
|
||||
return {'CANCELLED'}
|
||||
|
||||
self.depth = self.ob.matrix_world @ self.stroke.points[self.idx].co
|
||||
self.init_pos = [p.co.copy() for p in self.stroke.points] # need a copy otherwise vector is updated
|
||||
self.depth = self.ob.matrix_world @ self.stroke.points[self.idx].position
|
||||
self.init_pos = [p.position.copy() for p in self.stroke.points] # need a copy otherwise vector is updated
|
||||
## directly use world position ?
|
||||
# self.pos_world = [self.ob.matrix_world @ co for co in self.init_pos]
|
||||
self.pos_2d = [location_to_region(self.ob.matrix_world @ co) for co in self.init_pos]
|
||||
|
@ -144,7 +144,7 @@ class GP_OT_pick_closest_material(Operator):
|
|||
|
||||
# if event.type in {'RIGHTMOUSE', 'ESC'}:
|
||||
# # for i, p in enumerate(self.stroke.points): # reset position
|
||||
# # self.stroke.points[i].co = self.init_pos[i]
|
||||
# # self.stroke.points[i].position = self.init_pos[i]
|
||||
# context.area.tag_redraw()
|
||||
# return {'CANCELLED'}
|
||||
|
||||
|
@ -172,7 +172,7 @@ class GP_OT_pick_closest_material(Operator):
|
|||
|
||||
def filter_stroke(self, context):
|
||||
# get stroke under mouse using kdtree
|
||||
point_pair = [(p.co, s) for s in self.stroke_list for p in s.points] # local space
|
||||
point_pair = [(p.position, s) for s in self.stroke_list for p in s.points] # local space
|
||||
|
||||
kd = mathutils.kdtree.KDTree(len(point_pair))
|
||||
for i, pair in enumerate(point_pair):
|
||||
|
@ -195,7 +195,7 @@ class GP_OT_pick_closest_material(Operator):
|
|||
## find point index in stroke
|
||||
self.idx = None
|
||||
for i, p in enumerate(s.points):
|
||||
if p.co == co:
|
||||
if p.position == co:
|
||||
self.idx = i
|
||||
break
|
||||
|
||||
|
@ -274,8 +274,8 @@ class GP_OT_pick_closest_material(Operator):
|
|||
self.report({'WARNING'}, 'No coord found')
|
||||
return {'CANCELLED'}
|
||||
|
||||
# self.depth = self.ob.matrix_world @ stroke.points[self.idx].co
|
||||
# self.init_pos = [p.co.copy() for p in stroke.points] # need a copy otherwise vector is updated
|
||||
# self.depth = self.ob.matrix_world @ stroke.points[self.idx].position
|
||||
# self.init_pos = [p.position.copy() for p in stroke.points] # need a copy otherwise vector is updated
|
||||
# self.pos_2d = [location_to_region(self.ob.matrix_world @ co) for co in self.init_pos]
|
||||
# self.plen = len(stroke.points)
|
||||
|
||||
|
|
|
@ -86,13 +86,13 @@ def batch_reproject(obj, proj_type='VIEW', all_strokes=True, restore_frame=False
|
|||
# world_co_3d = utils.matrix_transform(coords.reshape((nb_points, 3)), matrix)
|
||||
|
||||
## list comprehension method
|
||||
world_co_3d = [obj.matrix_world @ p.co for p in s.points]
|
||||
world_co_3d = [obj.matrix_world @ p.position for p in s.points]
|
||||
|
||||
new_world_co_3d = [intersect_line_plane(origin, p, plan_co, plane_no) for p in world_co_3d]
|
||||
|
||||
## Basic method (Slower than foreach_set)
|
||||
# for i, p in enumerate(s.points):
|
||||
# p.co = obj.matrix_world.inverted() @ new_world_co_3d[i]
|
||||
# p.position = obj.matrix_world.inverted() @ new_world_co_3d[i]
|
||||
|
||||
## Ravel new coordinate on the fly
|
||||
new_local_coords = [axis for p in new_world_co_3d for axis in matrix_inv @ p]
|
||||
|
@ -141,7 +141,7 @@ def align_global(reproject=True, ref=None, all_strokes=True):
|
|||
for f in l.frames:
|
||||
for s in f.strokes:
|
||||
## foreach
|
||||
coords = [p.co @ mat.inverted() @ new_mat for p in s.points]
|
||||
coords = [p.position @ mat.inverted() @ new_mat for p in s.points]
|
||||
# print('coords: ', coords)
|
||||
# print([co for v in coords for co in v])
|
||||
s.points.foreach_set('co', [co for v in coords for co in v])
|
||||
|
@ -152,11 +152,11 @@ def align_global(reproject=True, ref=None, all_strokes=True):
|
|||
|
||||
# for p in s.points:
|
||||
## GOOD :
|
||||
# world_co = mat @ p.co
|
||||
# p.co = new_mat.inverted() @ world_co
|
||||
# world_co = mat @ p.position
|
||||
# p.position = new_mat.inverted() @ world_co
|
||||
|
||||
## GOOD :
|
||||
# p.co = p.co @ mat.inverted() @ new_mat
|
||||
# p.position = p.position @ mat.inverted() @ new_mat
|
||||
|
||||
if o.parent:
|
||||
o.matrix_world = new_mat
|
||||
|
@ -218,7 +218,7 @@ def align_all_frames(reproject=True, ref=None, all_strokes=True):
|
|||
|
||||
for s in f.strokes:
|
||||
## foreach
|
||||
coords = [p.co @ mat.inverted() @ new_mat for p in s.points]
|
||||
coords = [p.position @ mat.inverted() @ new_mat for p in s.points]
|
||||
# print('coords: ', coords)
|
||||
# print([co for v in coords for co in v])
|
||||
s.points.foreach_set('co', [co for v in coords for co in v])
|
||||
|
|
8
utils.py
8
utils.py
|
@ -31,7 +31,7 @@ def get_matrix(ob) :
|
|||
def set_matrix(gp_frame,mat):
|
||||
for stroke in gp_frame.strokes :
|
||||
for point in stroke.points :
|
||||
point.co = mat @ point.co
|
||||
point.position = mat @ point.position
|
||||
|
||||
# get view vector location (the 2 methods work fine)
|
||||
def get_view_origin_position():
|
||||
|
@ -173,7 +173,7 @@ def simple_draw_gp_stroke(pts, frame, width = 2, mat_id = 0):
|
|||
# for i, pt in enumerate(pts):
|
||||
# stroke.points.add()
|
||||
# dest_point = stroke.points[i]
|
||||
# dest_point.co = pt
|
||||
# dest_point.position = pt
|
||||
return stroke
|
||||
|
||||
## OLD - need update
|
||||
|
@ -457,7 +457,7 @@ def get_active_frame(layer_name=None):
|
|||
|
||||
def get_stroke_2D_coords(stroke):
|
||||
'''return a list containing points 2D coordinates of passed gp stroke object'''
|
||||
return [location_to_region(p.co) for p in stroke.points]
|
||||
return [location_to_region(p.position) for p in stroke.points]
|
||||
|
||||
'''#foreach method for retreiving multiple other attribute quickly and stack them
|
||||
point_nb = len(stroke.points)
|
||||
|
@ -474,7 +474,7 @@ def get_all_stroke_2D_coords(frame):
|
|||
## using modification from get_stroke_2D_coords func'
|
||||
return [get_stroke_2D_coords(s) for s in frame.strokes]
|
||||
## direct
|
||||
#return[[location_to_region(p.co) for p in s.points] for s in frame.strokes]
|
||||
#return[[location_to_region(p.position) for p in s.points] for s in frame.strokes]
|
||||
|
||||
def selected_strokes(frame):
|
||||
'''return all stroke having a point selected as a list of strokes objects'''
|
||||
|
|
Loading…
Reference in New Issue