Changeset View
Changeset View
Standalone View
Standalone View
mesh_extra_tools/mesh_edges_length.py
| Context not available. | |||||
| bl_idname = "object.mesh_edge_length_set" | bl_idname = "object.mesh_edge_length_set" | ||||
| bl_label = "Set edge length" | bl_label = "Set edge length" | ||||
| bl_description = ("Change one selected edge length by a specified target,\n" | bl_description = ("Change one selected edge length by a specified target,\n" | ||||
| "existing lenght and different modes\n" | "existing length and different modes\n" | ||||
| "Note: works only with Edges that not share a vertex") | "Note: works only with Edges that not share a vertex") | ||||
| bl_options = {'REGISTER', 'UNDO'} | bl_options = {'REGISTER', 'UNDO'} | ||||
| Context not available. | |||||
| name="Original length", | name="Original length", | ||||
| options={'HIDDEN'}, | options={'HIDDEN'}, | ||||
| ) | ) | ||||
| set_lenght_type = EnumProperty( | set_length_type = EnumProperty( | ||||
| items=[ | items=[ | ||||
| ('manual', "Manual", | ('manual', "Manual", | ||||
| "Input manually the desired Target Lenght"), | "Input manually the desired Target Length"), | ||||
| ('existing', "Existing Lenght", | ('existing', "Existing Length", | ||||
| "Use existing geometry Edges' characteristics"), | "Use existing geometry Edges' characteristics"), | ||||
| ], | ], | ||||
| name="Set Type of Input", | name="Set Type of Input", | ||||
| ) | ) | ||||
| target_length = FloatProperty( | target_length = FloatProperty( | ||||
| name="Target Length", | name="Target Length", | ||||
| description="Input a value for an Edges Lenght target", | description="Input a value for an Edges Length target", | ||||
| default=1.00, | default=1.00, | ||||
| unit='LENGTH', | unit='LENGTH', | ||||
| precision=5 | precision=5 | ||||
| ) | ) | ||||
| existing_lenght = EnumProperty( | existing_length = EnumProperty( | ||||
| items=[ | items=[ | ||||
| ('min', "Shortest", | ('min', "Shortest", | ||||
| "Set all to shortest Edge of selection"), | "Set all to shortest Edge of selection"), | ||||
| ('max', "Longest", | ('max', "Longest", | ||||
| "Set all to the longest Edge of selection"), | "Set all to the longest Edge of selection"), | ||||
| ('average', "Average", | ('average', "Average", | ||||
| "Set all to the average Edge lenght of selection"), | "Set all to the average Edge length of selection"), | ||||
| ('active', "Active", | ('active', "Active", | ||||
| "Set all to the active Edge's one\n" | "Set all to the active Edge's one\n" | ||||
| "Needs a selection to be done in Edge Select mode"), | "Needs a selection to be done in Edge Select mode"), | ||||
| ], | ], | ||||
| name="Existing lenght" | name="Existing length" | ||||
| ) | ) | ||||
| mode = EnumProperty( | mode = EnumProperty( | ||||
| items=[ | items=[ | ||||
| Context not available. | |||||
| ) | ) | ||||
| originary_edge_length_dict = {} | originary_edge_length_dict = {} | ||||
| edge_lenghts = [] | edge_lengths = [] | ||||
| selected_edges = () | selected_edges = () | ||||
| @classmethod | @classmethod | ||||
| Context not available. | |||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| layout.label("Original Active lenght is: {:.3f}".format(self.old_length)) | layout.label("Original Active length is: {:.3f}".format(self.old_length)) | ||||
| layout.label("Input Mode:") | layout.label("Input Mode:") | ||||
| layout.prop(self, "set_lenght_type", expand=True) | layout.prop(self, "set_length_type", expand=True) | ||||
| if self.set_lenght_type == 'manual': | if self.set_length_type == 'manual': | ||||
| layout.prop(self, "target_length") | layout.prop(self, "target_length") | ||||
| else: | else: | ||||
| layout.prop(self, "existing_lenght", text="") | layout.prop(self, "existing_length", text="") | ||||
| layout.label("Mode:") | layout.label("Mode:") | ||||
| layout.prop(self, "mode", text="") | layout.prop(self, "mode", text="") | ||||
| Context not available. | |||||
| layout.label("Resize Behavior:") | layout.label("Resize Behavior:") | ||||
| layout.prop(self, "behaviour", text="") | layout.prop(self, "behaviour", text="") | ||||
| def get_existing_edge_lenght(self, bm): | def get_existing_edge_length(self, bm): | ||||
| if self.existing_lenght != "active": | if self.existing_length != "active": | ||||
| if self.existing_lenght == "min": | if self.existing_length == "min": | ||||
| return min(self.edge_lenghts) | return min(self.edge_lengths) | ||||
| if self.existing_lenght == "max": | if self.existing_length == "max": | ||||
| return max(self.edge_lenghts) | return max(self.edge_lengths) | ||||
| elif self.existing_lenght == "average": | elif self.existing_length == "average": | ||||
| return sum(self.edge_lenghts) / float(len(self.selected_edges)) | return sum(self.edge_lengths) / float(len(self.selected_edges)) | ||||
| else: | else: | ||||
| bm.edges.ensure_lookup_table() | bm.edges.ensure_lookup_table() | ||||
| active_edge_length = None | active_edge_length = None | ||||
| Context not available. | |||||
| return 0.0 | return 0.0 | ||||
| def invoke(self, context, event): | def invoke(self, context, event): | ||||
| wm = context.window_manager | wm = context.window_managerlength | ||||
| obj = context.edit_object | obj = context.edit_object | ||||
| bm = bmesh.from_edit_mesh(obj.data) | bm = bmesh.from_edit_mesh(obj.data) | ||||
| Context not available. | |||||
| # warning, it's a constant ! | # warning, it's a constant ! | ||||
| verts_index = ''.join((str(edge.verts[0].index), str(edge.verts[1].index))) | verts_index = ''.join((str(edge.verts[0].index), str(edge.verts[1].index))) | ||||
| self.originary_edge_length_dict[verts_index] = vector | self.originary_edge_length_dict[verts_index] = vector | ||||
| self.edge_lenghts.append(vector.length) | self.edge_lengths.append(vector.length) | ||||
| self.old_length = vector.length | self.old_length = vector.length | ||||
| else: | else: | ||||
| self.report({'ERROR'}, _error_message) | self.report({'ERROR'}, _error_message) | ||||
| Context not available. | |||||
| # what we should see in original length dialog field | # what we should see in original length dialog field | ||||
| self.old_length = vector.length | self.old_length = vector.length | ||||
| if self.set_lenght_type == 'manual': | if self.set_length_type == 'manual': | ||||
| vector.length = abs(self.target_length) | vector.length = abs(self.target_length) | ||||
| else: | else: | ||||
| get_lenghts = self.get_existing_edge_lenght(bm) | get_lengths = self.get_existing_edge_length(bm) | ||||
| # check for edit mode | # check for edit mode | ||||
| if not get_lenghts: | if not get_lengths: | ||||
| self.report({'WARNING'}, | self.report({'WARNING'}, | ||||
| "Operation Cancelled. " | "Operation Cancelled. " | ||||
| "Active Edge could not be determined (needs selection in Edit Mode)") | "Active Edge could not be determined (needs selection in Edit Mode)") | ||||
| return {'CANCELLED'} | return {'CANCELLED'} | ||||
| vector.length = get_lenghts | vector.length = get_lengths | ||||
| if vector.length == 0.0: | if vector.length == 0.0: | ||||
| self.report({'ERROR'}, "Operation cancelled. Target lenght is set to zero") | self.report({'ERROR'}, "Operation cancelled. Target length is set to zero") | ||||
| return {'CANCELLED'} | return {'CANCELLED'} | ||||
| center_vector = get_center_vector((edge.verts[0].co, edge.verts[1].co)) | center_vector = get_center_vector((edge.verts[0].co, edge.verts[1].co)) | ||||
| Context not available. | |||||