Skip to content
Snippets Groups Projects
Commit d665247a authored by Eclectiel L's avatar Eclectiel L
Browse files

No commit message

No commit message
parent 8cf3fc4a
Branches
Tags
No related merge requests found
...@@ -16,19 +16,19 @@ ...@@ -16,19 +16,19 @@
# #
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
bl_info = { bl_addon_info = {
"name": "Surface Sketch", "name": "Bsurfaces GPL Edition",
"author": "Eclectiel", "author": "Eclectiel",
"version": (0,8), "version": (0,9),
"blender": (2, 5, 7), "blender": (2, 5, 7),
"api": 35622, "api": 35733,
"location": "View3D > EditMode > Tool Shelf > Surface Sketching Panel", "location": "View3D > EditMode > ToolShelf",
"description": "Draw meshes and re-topologies with Grease Pencil", "description": "Draw meshes and re-topologies with Grease Pencil",
"warning": "Beta", "warning": "Beta",
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\ "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\
"Scripts/Mesh/Surface_Sketch", "Scripts/Mesh/Surface_Sketch",
"tracker_url": "https://projects.blender.org/tracker/index.php?"\ "tracker_url": "https://projects.blender.org/tracker/index.php?"\
"func=detail&aid=22062", "func=detail&aid=26642&group_id=153&atid=469",
"category": "Mesh"} "category": "Mesh"}
...@@ -58,21 +58,22 @@ class VIEW3D_PT_tools_SURF_SKETCH(bpy.types.Panel): ...@@ -58,21 +58,22 @@ class VIEW3D_PT_tools_SURF_SKETCH(bpy.types.Panel):
col = layout.column(align=True) col = layout.column(align=True)
row = layout.row() row = layout.row()
row.separator() row.separator()
col.operator(GPENCIL_OT_surfsk_surface_add.bl_idname, text="Add Surface") col.operator("gpencil.surfsk_add_surface", text="Add Surface")
col.prop(scn, "SURFSK_edges_U") col.prop(scn, "SURFSK_edges_U")
col.prop(scn, "SURFSK_edges_V") col.prop(scn, "SURFSK_edges_V")
row.separator() row.separator()
col.prop(scn, "SURFSK_keep_strokes") col.prop(scn, "SURFSK_keep_strokes")
col.separator() col.separator()
row.separator() row.separator()
col.operator(GPENCIL_OT_surfsk_strokes_to_curves.bl_idname, text="Strokes to curves") col.operator("gpencil.surfsk_strokes_to_curves", text="Strokes to curves")
class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): class GPENCIL_OT_SURFSK_add_surface(bpy.types.Operator):
bl_idname = "gpencil.surfsk_surface_add" bl_idname = "gpencil.surfsk_add_surface"
bl_label = "Surface generation from grease pencil strokes" bl_label = "Surface Sketching"
bl_description = "Surface generation from grease pencil strokes" bl_description = "Generates a surface from grease pencil strokes or from curves."
bl_options = {'REGISTER', 'UNDO'}
#### Get an ordered list of a chain of vertices. #### Get an ordered list of a chain of vertices.
...@@ -111,23 +112,26 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -111,23 +112,26 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
#### Calculates length of a chain of points. #### Calculates length of a chain of points.
def get_chain_length(self, verts_ordered): def get_chain_length(self, object, verts_ordered):
matrix = object.matrix_world
edges_lengths = [] edges_lengths = []
edges_lengths_sum = 0 edges_lengths_sum = 0
for i in range(0, len(verts_ordered)): for i in range(0, len(verts_ordered)):
if i == 0: if i == 0:
prev_v = verts_ordered[i] prev_v_co = verts_ordered[i].co * matrix
else: else:
v = verts_ordered[i] v_co = verts_ordered[i].co * matrix
v_difs = [prev_v.co[0] - v.co[0], prev_v.co[1] - v.co[1], prev_v.co[2] - v.co[2]] v_difs = [prev_v_co[0] - v_co[0], prev_v_co[1] - v_co[1], prev_v_co[2] - v_co[2]]
edge_length = abs(sqrt(v_difs[0] * v_difs[0] + v_difs[1] * v_difs[1] + v_difs[2] * v_difs[2])) edge_length = abs(sqrt(v_difs[0] * v_difs[0] + v_difs[1] * v_difs[1] + v_difs[2] * v_difs[2]))
edges_lengths.append(edge_length) edges_lengths.append(edge_length)
edges_lengths_sum += edge_length edges_lengths_sum += edge_length
prev_v = v prev_v_co = v_co
return edges_lengths, edges_lengths_sum return edges_lengths, edges_lengths_sum
...@@ -262,47 +266,59 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -262,47 +266,59 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
ob_gp_strokes = ob ob_gp_strokes = ob
using_external_curves = True using_external_curves = True
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
else: else:
#### Vheck if there is a grease pencil layer. If not, quit.
try:
for i in range(len(self.main_object.grease_pencil.layers)):
if self.main_object.grease_pencil.layers[i].active:
gp_active_layer_idx = i
x = self.main_object.grease_pencil.layers[gp_active_layer_idx].active_frame.strokes
except:
return{'CANCELLED'}
#### Convert grease pencil strokes to curve. #### Convert grease pencil strokes to curve.
bpy.ops.gpencil.convert(type='CURVE') bpy.ops.gpencil.convert('INVOKE_REGION_WIN', type='CURVE')
ob_gp_strokes = bpy.context.object ob_gp_strokes = bpy.context.object
using_external_curves = False using_external_curves = False
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
ob_gp_strokes.name = "SURFSK_temp_strokes" ob_gp_strokes.name = "SURFSK_temp_strokes"
bpy.ops.object.select_name(name = ob_gp_strokes.name) bpy.ops.object.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.object.select_name('INVOKE_REGION_WIN', name = ob_gp_strokes.name)
bpy.context.scene.objects.active = bpy.context.scene.objects[ob_gp_strokes.name] bpy.context.scene.objects.active = bpy.context.scene.objects[ob_gp_strokes.name]
#### If "Keep strokes" is active make a duplicate of the original strokes, which will be intact #### If "Keep strokes" is active make a duplicate of the original strokes, which will be intact
if bpy.context.scene.SURFSK_keep_strokes: if bpy.context.scene.SURFSK_keep_strokes:
bpy.ops.object.duplicate_move() bpy.ops.object.duplicate('INVOKE_REGION_WIN')
bpy.context.object.name = "SURFSK_used_strokes" bpy.context.object.name = "SURFSK_used_strokes"
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.object.select_name(name = ob_gp_strokes.name) bpy.ops.object.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.object.select_name('INVOKE_REGION_WIN', name = ob_gp_strokes.name)
bpy.context.scene.objects.active = bpy.context.scene.objects[ob_gp_strokes.name] bpy.context.scene.objects.active = bpy.context.scene.objects[ob_gp_strokes.name]
#### Enter editmode for the new curve (converted from grease pencil strokes). #### Enter editmode for the new curve (converted from grease pencil strokes).
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
selection_U_exists = False selection_U_exists = False
...@@ -319,11 +335,11 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -319,11 +335,11 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
points_B = [] points_B = []
points_first_stroke_tips = [] points_first_stroke_tips = []
points_A.append(self.main_object.data.vertices[verts_tips_parsed_idx[0]].co) points_A.append(self.main_object.data.vertices[verts_tips_parsed_idx[0]].co * self.main_object.matrix_world)
points_A.append(self.main_object.data.vertices[middle_vertex_idx].co) points_A.append(self.main_object.data.vertices[middle_vertex_idx].co * self.main_object.matrix_world)
points_B.append(self.main_object.data.vertices[verts_tips_parsed_idx[1]].co) points_B.append(self.main_object.data.vertices[verts_tips_parsed_idx[1]].co * self.main_object.matrix_world)
points_B.append(self.main_object.data.vertices[middle_vertex_idx].co) points_B.append(self.main_object.data.vertices[middle_vertex_idx].co * self.main_object.matrix_world)
points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[0].co) points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[0].co)
points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[len(ob_gp_strokes.data.splines[0].bezier_points) - 1].co) points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[len(ob_gp_strokes.data.splines[0].bezier_points) - 1].co)
...@@ -348,7 +364,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -348,7 +364,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
prev_dist = 999999999999 prev_dist = 999999999999
for i in range(0, len(verts_tips_same_chain_idx)): for i in range(0, len(verts_tips_same_chain_idx)):
for v_idx in range(0, len(verts_tips_same_chain_idx[i])): for v_idx in range(0, len(verts_tips_same_chain_idx[i])):
dist = self.pts_distance(first_sketched_point_first_stroke_co, self.main_object.data.vertices[verts_tips_same_chain_idx[i][v_idx]].co) dist = self.pts_distance(first_sketched_point_first_stroke_co, self.main_object.data.vertices[verts_tips_same_chain_idx[i][v_idx]].co * self.main_object.matrix_world)
if dist < prev_dist: if dist < prev_dist:
prev_dist = dist prev_dist = dist
...@@ -364,7 +380,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -364,7 +380,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
prev_dist = 999999999999 prev_dist = 999999999999
for i in range(0, len(verts_tips_same_chain_idx)): for i in range(0, len(verts_tips_same_chain_idx)):
for v_idx in range(0, len(verts_tips_same_chain_idx[i])): for v_idx in range(0, len(verts_tips_same_chain_idx[i])):
dist = self.pts_distance(last_sketched_point_first_stroke_co, self.main_object.data.vertices[verts_tips_same_chain_idx[i][v_idx]].co) dist = self.pts_distance(last_sketched_point_first_stroke_co, self.main_object.data.vertices[verts_tips_same_chain_idx[i][v_idx]].co * self.main_object.matrix_world)
if dist < prev_dist: if dist < prev_dist:
prev_dist = dist prev_dist = dist
...@@ -376,7 +392,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -376,7 +392,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
prev_dist = 999999999999 prev_dist = 999999999999
for i in range(0, len(verts_tips_same_chain_idx)): for i in range(0, len(verts_tips_same_chain_idx)):
for v_idx in range(0, len(verts_tips_same_chain_idx[i])): for v_idx in range(0, len(verts_tips_same_chain_idx[i])):
dist = self.pts_distance(first_sketched_point_last_stroke_co, self.main_object.data.vertices[verts_tips_same_chain_idx[i][v_idx]].co) dist = self.pts_distance(first_sketched_point_last_stroke_co, self.main_object.data.vertices[verts_tips_same_chain_idx[i][v_idx]].co * self.main_object.matrix_world)
if dist < prev_dist: if dist < prev_dist:
prev_dist = dist prev_dist = dist
...@@ -390,7 +406,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -390,7 +406,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
# Determine if the single selection will be treated as U or as V. # Determine if the single selection will be treated as U or as V.
edges_sum = 0 edges_sum = 0
for i in all_selected_edges_idx: for i in all_selected_edges_idx:
edges_sum += self.pts_distance(self.main_object.data.vertices[self.main_object.data.edges[i].vertices[0]].co, self.main_object.data.vertices[self.main_object.data.edges[i].vertices[1]].co) edges_sum += self.pts_distance(self.main_object.data.vertices[self.main_object.data.edges[i].vertices[0]].co * self.main_object.matrix_world, self.main_object.data.vertices[self.main_object.data.edges[i].vertices[1]].co * self.main_object.matrix_world)
average_edge_length = edges_sum / len(all_selected_edges_idx) average_edge_length = edges_sum / len(all_selected_edges_idx)
...@@ -415,8 +431,8 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -415,8 +431,8 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
selection_U_exists = True selection_U_exists = True
selection_V_exists = False selection_V_exists = False
points_tips.append(self.main_object.data.vertices[verts_tips_same_chain_idx[nearest_tip_first_st_first_pt_idx][0]].co) points_tips.append(self.main_object.data.vertices[verts_tips_same_chain_idx[nearest_tip_first_st_first_pt_idx][0]].co * self.main_object.matrix_world)
points_tips.append(self.main_object.data.vertices[verts_tips_same_chain_idx[nearest_tip_first_st_first_pt_idx][1]].co) points_tips.append(self.main_object.data.vertices[verts_tips_same_chain_idx[nearest_tip_first_st_first_pt_idx][1]].co * self.main_object.matrix_world)
points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[0].co) points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[0].co)
points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[len(ob_gp_strokes.data.splines[0].bezier_points) - 1].co) points_first_stroke_tips.append(ob_gp_strokes.data.splines[0].bezier_points[len(ob_gp_strokes.data.splines[0].bezier_points) - 1].co)
...@@ -466,19 +482,19 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -466,19 +482,19 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
edges_lengths_sum_U = 0 edges_lengths_sum_U = 0
if selection_U_exists: if selection_U_exists:
edges_lengths_U, edges_lengths_sum_U = self.get_chain_length(verts_ordered_U) edges_lengths_U, edges_lengths_sum_U = self.get_chain_length(self.main_object, verts_ordered_U)
# Sum selected edges V lengths. # Sum selected edges V lengths.
edges_lengths_V = [] edges_lengths_V = []
edges_lengths_sum_V = 0 edges_lengths_sum_V = 0
if selection_V_exists: if selection_V_exists:
edges_lengths_V, edges_lengths_sum_V = self.get_chain_length(verts_ordered_V) edges_lengths_V, edges_lengths_sum_V = self.get_chain_length(self.main_object, verts_ordered_V)
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
for i in range(0, int(bpy.context.scene.SURFSK_precision)): for i in range(0, int(bpy.context.scene.SURFSK_precision)):
bpy.ops.curve.subdivide() bpy.ops.curve.subdivide('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
# Proportions U. # Proportions U.
edges_proportions_U = [] edges_proportions_U = []
...@@ -550,7 +566,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -550,7 +566,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
if selection_type == "TWO_NOT_CONNECTED": if selection_type == "TWO_NOT_CONNECTED":
if selection_U2_exists: if selection_U2_exists:
for i in range(0, len(sketched_splines_parsed[len(sketched_splines_parsed) - 1])): for i in range(0, len(sketched_splines_parsed[len(sketched_splines_parsed) - 1])):
sketched_splines_parsed[len(sketched_splines_parsed) - 1][i] = verts_ordered_U2[i].co sketched_splines_parsed[len(sketched_splines_parsed) - 1][i] = verts_ordered_U2[i].co * self.main_object.matrix_world
#### Create temporary curves along the "control-points" found on the sketched curves and the mesh selection. #### Create temporary curves along the "control-points" found on the sketched curves and the mesh selection.
...@@ -567,7 +583,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -567,7 +583,7 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
if selection_U_exists: if selection_U_exists:
ob_ctrl_pts.data.vertices.add(1) ob_ctrl_pts.data.vertices.add(1)
last_v = ob_ctrl_pts.data.vertices[len(ob_ctrl_pts.data.vertices) - 1] last_v = ob_ctrl_pts.data.vertices[len(ob_ctrl_pts.data.vertices) - 1]
last_v.co = verts_ordered_U[i].co last_v.co = verts_ordered_U[i].co * self.main_object.matrix_world
vert_num_in_spline += 1 vert_num_in_spline += 1
...@@ -584,20 +600,21 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -584,20 +600,21 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
last_v = v last_v = v
vert_num_in_spline += 1 vert_num_in_spline += 1
bpy.ops.object.select_name(name = ob_ctrl_pts.name) bpy.ops.object.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.object.select_name('INVOKE_REGION_WIN', name = ob_ctrl_pts.name)
bpy.context.scene.objects.active = bpy.data.objects[ob_ctrl_pts.name] bpy.context.scene.objects.active = bpy.data.objects[ob_ctrl_pts.name]
# Create curves from control points. # Create curves from control points.
bpy.ops.object.convert(target='CURVE', keep_original=False) bpy.ops.object.convert('INVOKE_REGION_WIN', target='CURVE', keep_original=False)
ob_curves_surf = bpy.context.scene.objects.active ob_curves_surf = bpy.context.scene.objects.active
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.curve.spline_type_set(type='BEZIER') bpy.ops.curve.spline_type_set('INVOKE_REGION_WIN', type='BEZIER')
bpy.ops.curve.handle_type_set(type='AUTOMATIC') bpy.ops.curve.handle_type_set('INVOKE_REGION_WIN', type='AUTOMATIC')
for i in range(0, int(bpy.context.scene.SURFSK_precision)): for i in range(0, int(bpy.context.scene.SURFSK_precision)):
bpy.ops.curve.subdivide() bpy.ops.curve.subdivide('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
# Calculate the length of each final surface spline. # Calculate the length of each final surface spline.
...@@ -619,10 +636,10 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -619,10 +636,10 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
prev_p = p prev_p = p
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
for i in range(0, int(bpy.context.scene.SURFSK_precision)): for i in range(0, int(bpy.context.scene.SURFSK_precision)):
bpy.ops.curve.subdivide() bpy.ops.curve.subdivide('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
for sp_idx in range(0, len(surface_splines)): for sp_idx in range(0, len(surface_splines)):
# Calculate vertex positions with apropriate edge proportions, and ordered, for each spline. # Calculate vertex positions with apropriate edge proportions, and ordered, for each spline.
...@@ -659,20 +676,22 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -659,20 +676,22 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
# Set the first and last verts of each spline to the locations of the respective verts in the selections. # Set the first and last verts of each spline to the locations of the respective verts in the selections.
if selection_V_exists: if selection_V_exists:
for i in range(0, len(surface_splines_parsed[0])): for i in range(0, len(surface_splines_parsed[0])):
surface_splines_parsed[len(surface_splines_parsed) - 1][i] = verts_ordered_V[i].co surface_splines_parsed[len(surface_splines_parsed) - 1][i] = verts_ordered_V[i].co * self.main_object.matrix_world
if selection_type == "TWO_NOT_CONNECTED": if selection_type == "TWO_NOT_CONNECTED":
if selection_V2_exists: if selection_V2_exists:
for i in range(0, len(surface_splines_parsed[0])): for i in range(0, len(surface_splines_parsed[0])):
surface_splines_parsed[0][i] = verts_ordered_V2[i].co surface_splines_parsed[0][i] = verts_ordered_V2[i].co * self.main_object.matrix_world
#### Delete object with control points and object from grease pencil convertion. #### Delete object with control points and object from grease pencil convertion.
bpy.ops.object.select_name(name = ob_ctrl_pts.name) bpy.ops.object.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.object.select_name('INVOKE_REGION_WIN', name = ob_ctrl_pts.name)
bpy.context.scene.objects.active = bpy.data.objects[ob_ctrl_pts.name] bpy.context.scene.objects.active = bpy.data.objects[ob_ctrl_pts.name]
bpy.ops.object.delete() bpy.ops.object.delete()
bpy.ops.object.select_name(name = ob_gp_strokes.name) bpy.ops.object.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.object.select_name('INVOKE_REGION_WIN', name = ob_gp_strokes.name)
bpy.context.scene.objects.active = bpy.data.objects[ob_gp_strokes.name] bpy.context.scene.objects.active = bpy.data.objects[ob_gp_strokes.name]
bpy.ops.object.delete() bpy.ops.object.delete()
...@@ -711,20 +730,30 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -711,20 +730,30 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
ob_surface.select = True ob_surface.select = True
self.main_object.select = True self.main_object.select = True
bpy.context.scene.objects.active = bpy.data.objects[self.main_object.name] bpy.context.scene.objects.active = bpy.data.objects[self.main_object.name]
bpy.ops.object.join() bpy.ops.object.join('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.remove_doubles('INVOKE_REGION_WIN', limit=0.0001)
bpy.ops.mesh.remove_doubles(limit=0.0001) bpy.ops.mesh.normals_make_consistent('INVOKE_REGION_WIN', inside=False)
bpy.ops.mesh.normals_make_consistent(inside=False) bpy.ops.mesh.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.mesh.select_all(action='DESELECT')
bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
#### Delete grease pencil strokes #### Delete grease pencil strokes
bpy.ops.gpencil.active_frame_delete() try:
bpy.ops.gpencil.active_frame_delete('INVOKE_REGION_WIN')
except:
pass
bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
return {"FINISHED"}
def invoke (self, context, event): def invoke (self, context, event):
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
self.main_object = bpy.context.scene.objects.active self.main_object = bpy.context.scene.objects.active
self.execute(context) self.execute(context)
...@@ -734,45 +763,49 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator): ...@@ -734,45 +763,49 @@ class GPENCIL_OT_surfsk_surface_add(bpy.types.Operator):
class GPENCIL_OT_surfsk_strokes_to_curves(bpy.types.Operator): class GPENCIL_OT_SURFSK_strokes_to_curves(bpy.types.Operator):
bl_idname = "gpencil.surfsk_strokes_to_curves" bl_idname = "gpencil.surfsk_strokes_to_curves"
bl_label = "Convert grease pencil strokes into curves and enter edit mode" bl_label = "Convert grease pencil strokes into curves and enter edit mode"
bl_description = "Convert grease pencil strokes into curves and enter edit mode" bl_description = "Convert grease pencil strokes into curves and enter edit mode"
def execute(self, context): def execute(self, context):
#### Convert grease pencil strokes to curve. #### Convert grease pencil strokes to curve.
bpy.ops.gpencil.convert(type='CURVE') bpy.ops.gpencil.convert('INVOKE_REGION_WIN', type='CURVE')
ob_gp_strokes = bpy.context.object ob_gp_strokes = bpy.context.object
ob_gp_strokes.name = "SURFSK_strokes" ob_gp_strokes.name = "SURFSK_strokes"
#### Delete grease pencil strokes. #### Delete grease pencil strokes.
bpy.ops.object.select_name(name = self.main_object.name) bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.object.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.object.select_name('INVOKE_REGION_WIN', name = self.main_object.name)
bpy.context.scene.objects.active = bpy.data.objects[self.main_object.name] bpy.context.scene.objects.active = bpy.data.objects[self.main_object.name]
bpy.ops.gpencil.active_frame_delete() bpy.ops.gpencil.active_frame_delete('INVOKE_REGION_WIN')
bpy.ops.object.select_name(name = ob_gp_strokes.name) bpy.ops.object.select_all('INVOKE_REGION_WIN', action='DESELECT')
bpy.ops.object.select_name('INVOKE_REGION_WIN', name = ob_gp_strokes.name)
bpy.context.scene.objects.active = bpy.data.objects[ob_gp_strokes.name] bpy.context.scene.objects.active = bpy.data.objects[ob_gp_strokes.name]
bpy.ops.object.editmode_toggle() #bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.object.editmode_toggle() bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
bpy.ops.curve.smooth() bpy.ops.curve.smooth('INVOKE_REGION_WIN')
curve_crv = ob_gp_strokes.data curve_crv = ob_gp_strokes.data
bpy.ops.curve.spline_type_set(type="BEZIER") bpy.ops.curve.spline_type_set('INVOKE_REGION_WIN', type="BEZIER")
bpy.ops.curve.handle_type_set(type="AUTOMATIC") bpy.ops.curve.handle_type_set('INVOKE_REGION_WIN', type="AUTOMATIC")
bpy.data.curves[curve_crv.name].show_handles = False bpy.data.curves[curve_crv.name].show_handles = False
bpy.data.curves[curve_crv.name].show_normal_face = False bpy.data.curves[curve_crv.name].show_normal_face = False
...@@ -787,41 +820,39 @@ class GPENCIL_OT_surfsk_strokes_to_curves(bpy.types.Operator): ...@@ -787,41 +820,39 @@ class GPENCIL_OT_surfsk_strokes_to_curves(bpy.types.Operator):
def register(): def register():
bpy.utils.register_module(__name__) bpy.utils.register_class(GPENCIL_OT_SURFSK_add_surface)
bpy.utils.register_class(VIEW3D_PT_tools_SURF_SKETCH)
bpy.utils.register_class(GPENCIL_OT_SURFSK_strokes_to_curves)
bpy.types.Scene.SURFSK_edges_U = bpy.props.IntProperty(name="Cross", description="Number of edge rings crossing the strokes (perpendicular to strokes direction)", default=10, min=0, max=100000) bpy.types.Scene.SURFSK_edges_U = bpy.props.IntProperty(name="Cross", description="Number of edge rings crossing the strokes (perpendicular to strokes direction)", default=10, min=0, max=100000)
bpy.types.Scene.SURFSK_edges_V = bpy.props.IntProperty(name="Follow", description="Number of edge rings following the strokes (parallel to strokes direction)", default=10, min=0, max=100000) bpy.types.Scene.SURFSK_edges_V = bpy.props.IntProperty(name="Follow", description="Number of edge rings following the strokes (parallel to strokes direction)", default=10, min=0, max=100000)
bpy.types.Scene.SURFSK_precision = bpy.props.IntProperty(name="Precision", description="Precision level of the surface calculation", default=4, min=0, max=100000) bpy.types.Scene.SURFSK_precision = bpy.props.IntProperty(name="Precision", description="Precision level of the surface calculation", default=4, min=0, max=100000)
bpy.types.Scene.SURFSK_keep_strokes = bpy.props.BoolProperty(name="Keep strokes", description="Keeps the sketched strokes after adding the surface", default=False) bpy.types.Scene.SURFSK_keep_strokes = bpy.props.BoolProperty(name="Keep strokes", description="Keeps the sketched strokes after adding the surface", default=False)
kc = bpy.data.window_managers[0].keyconfigs.default keymap_item_add_surf = bpy.data.window_managers[0].keyconfigs.active.keymaps["3D View"].items.new("gpencil.surfsk_add_surface","E","PRESS", key_modifier="D")
km = kc.keymaps.get("3D View") keymap_item_stroke_to_curve = bpy.data.window_managers[0].keyconfigs.active.keymaps["3D View"].items.new("gpencil.surfsk_strokes_to_curves","C","PRESS", key_modifier="D")
if km is None:
km = kc.keymaps.new(name="3D View")
keymap_item_add_surf = km.keymap_items.new(GPENCIL_OT_surfsk_surface_add.bl_idname,"E","PRESS", key_modifier="D")
keymap_item_stroke_to_curve = km.keymap_items.new(GPENCIL_OT_surfsk_strokes_to_curves.bl_idname,"C","PRESS", key_modifier="D")
def unregister(): def unregister():
bpy.utils.unregister_module(__name__) bpy.utils.unregister_class(GPENCIL_OT_SURFSK_add_surface)
bpy.utils.unregister_class(VIEW3D_PT_tools_SURF_SKETCH)
bpy.utils.unregister_class(GPENCIL_OT_SURFSK_strokes_to_curves)
del bpy.types.Scene.SURFSK_edges_U del bpy.types.Scene.SURFSK_edges_U
del bpy.types.Scene.SURFSK_edges_V del bpy.types.Scene.SURFSK_edges_V
del bpy.types.Scene.SURFSK_precision del bpy.types.Scene.SURFSK_precision
del bpy.types.Scene.SURFSK_keep_strokes del bpy.types.Scene.SURFSK_keep_strokes
kc = bpy.data.window_managers[0].keyconfigs.default km = bpy.data.window_managers[0].keyconfigs.active.keymaps["3D View"]
km = kc.keymaps["3D View"]
for kmi in km.items: for kmi in km.items:
if kmi.idname == 'wm.call_menu': if kmi.idname == 'wm.call_menu':
if kmi.properties.name == GPENCIL_OT_surfsk_surface_add.bl_idname: if kmi.properties.name == "GPENCIL_OT_SURFSK_add_surface":
km.items.remove(kmi) km.items.remove(kmi)
elif kmi.properties.name == GPENCIL_OT_surfsk_strokes_to_curves.bl_idname: elif kmi.properties.name == "GPENCIL_OT_SURFSK_strokes_to_curves":
km.items.remove(kmi) km.items.remove(kmi)
else: else:
continue continue
if __name__ == "__main__": if __name__ == "__main__":
register() register()
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment