Use_gpencil_draw_onback Toggle
"Fossies" - the Fresh Open Source Software Archive
Member "blender-3.0.0/release/scripts/startup/bl_ui/space_view3d.py" (9 Nov 2021, 257549 Bytes) of package /linux/misc/blender-3.0.0.tar.xz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. For more information about "space_view3d.py" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 2.93.6_vs_3.0.0.
1 # ##### BEGIN GPL LICENSE BLOCK ##### 2 # 3 # This program is free software; you can redistribute it and/or 4 # modify it under the terms of the GNU General Public License 5 # as published by the Free Software Foundation; either version 2 6 # of the License, or (at your option) any later version. 7 # 8 # This program is distributed in the hope that it will be useful, 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # GNU General Public License for more details. 12 # 13 # You should have received a copy of the GNU General Public License 14 # along with this program; if not, write to the Free Software Foundation, 15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 # 17 # ##### END GPL LICENSE BLOCK ##### 18 19 # <pep8 compliant> 20 import bpy 21 from bpy.types import ( 22 Header, 23 Menu, 24 Panel, 25 ) 26 from bl_ui.properties_paint_common import ( 27 UnifiedPaintPanel, 28 brush_basic_texpaint_settings, 29 ) 30 from bl_ui.properties_grease_pencil_common import ( 31 AnnotationDataPanel, 32 AnnotationOnionSkin, 33 GreasePencilMaterialsPanel, 34 GreasePencilVertexcolorPanel, 35 ) 36 from bl_ui.space_toolsystem_common import ( 37 ToolActivePanelHelper, 38 ) 39 from bpy.app.translations import contexts as i18n_contexts 40 41 42 class VIEW3D_HT_tool_header (Header): 43 bl_space_type = 'VIEW_3D' 44 bl_region_type = 'TOOL_HEADER' 45 46 def draw (self, context): 47 layout = self.layout 48 49 self. draw_tool_settings (context) 50 51 layout. separator_spacer () 52 53 self. draw_mode_settings (context) 54 55 def draw_tool_settings (self, context): 56 layout = self.layout 57 tool_mode = context.mode 58 59 # Active Tool 60 # ----------- 61 from bl_ui.space_toolsystem_common import ToolSelectPanelHelper 62 tool = ToolSelectPanelHelper. draw_active_tool_header ( 63 context, layout, 64 tool_key=( 'VIEW_3D' , tool_mode), 65 ) 66 # Object Mode Options 67 # ------------------- 68 69 # Example of how tool_settings can be accessed as pop-overs. 70 71 # TODO(campbell): editing options should be after active tool options 72 # (obviously separated for from the users POV) 73 draw_fn = getattr (_draw_tool_settings_context_mode, tool_mode, None ) 74 if draw_fn is not None : 75 is_valid_context = draw_fn (context, layout, tool) 76 77 def draw_3d_brush_settings (layout, tool_mode): 78 layout. popover ( "VIEW3D_PT_tools_brush_settings_advanced" , text= "Brush" ) 79 if tool_mode != 'PAINT_WEIGHT' : 80 layout. popover ( "VIEW3D_PT_tools_brush_texture" ) 81 if tool_mode == 'PAINT_TEXTURE' : 82 layout. popover ( "VIEW3D_PT_tools_mask_texture" ) 83 layout. popover ( "VIEW3D_PT_tools_brush_stroke" ) 84 layout. popover ( "VIEW3D_PT_tools_brush_falloff" ) 85 layout. popover ( "VIEW3D_PT_tools_brush_display" ) 86 87 # Note: general mode options should be added to 'draw_mode_settings'. 88 if tool_mode == 'SCULPT' : 89 if is_valid_context: 90 draw_3d_brush_settings (layout, tool_mode) 91 elif tool_mode == 'PAINT_VERTEX' : 92 if is_valid_context: 93 draw_3d_brush_settings (layout, tool_mode) 94 elif tool_mode == 'PAINT_WEIGHT' : 95 if is_valid_context: 96 draw_3d_brush_settings (layout, tool_mode) 97 elif tool_mode == 'PAINT_TEXTURE' : 98 if is_valid_context: 99 draw_3d_brush_settings (layout, tool_mode) 100 elif tool_mode == 'EDIT_ARMATURE' : 101 pass 102 elif tool_mode == 'EDIT_CURVE' : 103 pass 104 elif tool_mode == 'EDIT_MESH' : 105 pass 106 elif tool_mode == 'POSE' : 107 pass 108 elif tool_mode == 'PARTICLE' : 109 # Disable, only shows "Brush" panel, which is already in the top-bar. 110 # if tool.has_datablock: 111 # layout.popover_group(context=".paint_common", **popover_kw) 112 pass 113 elif tool_mode == 'PAINT_GPENCIL' : 114 if is_valid_context: 115 brush = context.tool_settings.gpencil_paint.brush 116 if brush.gpencil_tool != 'ERASE' : 117 if brush.gpencil_tool != 'TINT' : 118 layout. popover ( "VIEW3D_PT_tools_grease_pencil_brush_advanced" ) 119 120 if brush.gpencil_tool not in { 'FILL' , 'TINT' }: 121 layout. popover ( "VIEW3D_PT_tools_grease_pencil_brush_stroke" ) 122 123 layout. popover ( "VIEW3D_PT_tools_grease_pencil_paint_appearance" ) 124 elif tool_mode == 'SCULPT_GPENCIL' : 125 if is_valid_context: 126 brush = context.tool_settings.gpencil_sculpt_paint.brush 127 tool = brush.gpencil_tool 128 if tool in { 'SMOOTH' , 'RANDOMIZE' }: 129 layout. popover ( "VIEW3D_PT_tools_grease_pencil_sculpt_options" ) 130 layout. popover ( "VIEW3D_PT_tools_grease_pencil_sculpt_appearance" ) 131 elif tool_mode == 'WEIGHT_GPENCIL' : 132 if is_valid_context: 133 layout. popover ( "VIEW3D_PT_tools_grease_pencil_weight_appearance" ) 134 elif tool_mode == 'VERTEX_GPENCIL' : 135 if is_valid_context: 136 layout. popover ( "VIEW3D_PT_tools_grease_pencil_vertex_appearance" ) 137 138 def draw_mode_settings (self, context): 139 layout = self.layout 140 mode_string = context.mode 141 142 def row_for_mirror (): 143 row = layout. row (align= True ) 144 row. label (icon= 'MOD_MIRROR' ) 145 sub = row. row (align= True ) 146 sub.scale_x = 0.6 147 return row, sub 148 149 if mode_string == 'EDIT_ARMATURE' : 150 _row, sub = row_for_mirror () 151 sub. prop (context. object .data, "use_mirror_x" , text= "X" , toggle= True ) 152 elif mode_string == 'POSE' : 153 _row, sub = row_for_mirror () 154 sub. prop (context. object .pose, "use_mirror_x" , text= "X" , toggle= True ) 155 elif mode_string in { 'EDIT_MESH' , 'PAINT_WEIGHT' , 'SCULPT' , 'PAINT_VERTEX' , 'PAINT_TEXTURE' }: 156 # Mesh Modes, Use Mesh Symmetry 157 row, sub = row_for_mirror () 158 sub. prop (context. object , "use_mesh_mirror_x" , text= "X" , toggle= True ) 159 sub. prop (context. object , "use_mesh_mirror_y" , text= "Y" , toggle= True ) 160 sub. prop (context. object , "use_mesh_mirror_z" , text= "Z" , toggle= True ) 161 if mode_string == 'EDIT_MESH' : 162 tool_settings = context.tool_settings 163 layout. prop (tool_settings, "use_mesh_automerge" , text= "" ) 164 elif mode_string == 'PAINT_WEIGHT' : 165 row. popover (panel= "VIEW3D_PT_tools_weightpaint_symmetry_for_topbar" , text= "" ) 166 elif mode_string == 'SCULPT' : 167 row. popover (panel= "VIEW3D_PT_sculpt_symmetry_for_topbar" , text= "" ) 168 elif mode_string == 'PAINT_VERTEX' : 169 row. popover (panel= "VIEW3D_PT_tools_vertexpaint_symmetry_for_topbar" , text= "" ) 170 171 # Expand panels from the side-bar as popovers. 172 popover_kw = { "space_type" : 'VIEW_3D' , "region_type" : 'UI' , "category" : "Tool" } 173 174 if mode_string == 'SCULPT' : 175 layout. popover_group (context= ".sculpt_mode" , **popover_kw) 176 elif mode_string == 'PAINT_VERTEX' : 177 layout. popover_group (context= ".vertexpaint" , **popover_kw) 178 elif mode_string == 'PAINT_WEIGHT' : 179 layout. popover_group (context= ".weightpaint" , **popover_kw) 180 elif mode_string == 'PAINT_TEXTURE' : 181 layout. popover_group (context= ".imagepaint" , **popover_kw) 182 elif mode_string == 'EDIT_TEXT' : 183 layout. popover_group (context= ".text_edit" , **popover_kw) 184 elif mode_string == 'EDIT_ARMATURE' : 185 layout. popover_group (context= ".armature_edit" , **popover_kw) 186 elif mode_string == 'EDIT_METABALL' : 187 layout. popover_group (context= ".mball_edit" , **popover_kw) 188 elif mode_string == 'EDIT_LATTICE' : 189 layout. popover_group (context= ".lattice_edit" , **popover_kw) 190 elif mode_string == 'EDIT_CURVE' : 191 layout. popover_group (context= ".curve_edit" , **popover_kw) 192 elif mode_string == 'EDIT_MESH' : 193 layout. popover_group (context= ".mesh_edit" , **popover_kw) 194 elif mode_string == 'POSE' : 195 layout. popover_group (context= ".posemode" , **popover_kw) 196 elif mode_string == 'PARTICLE' : 197 layout. popover_group (context= ".particlemode" , **popover_kw) 198 elif mode_string == 'OBJECT' : 199 layout. popover_group (context= ".objectmode" , **popover_kw) 200 elif mode_string in { 'PAINT_GPENCIL' , 'EDIT_GPENCIL' , 'SCULPT_GPENCIL' , 'WEIGHT_GPENCIL' }: 201 # Grease pencil layer. 202 gpl = context.active_gpencil_layer 203 if gpl and gpl.info is not None : 204 text = gpl.info 205 maxw = 25 206 if len (text) > maxw: 207 text = text[:maxw - 5 ] + '..' + text[- 3 :] 208 else : 209 text = "" 210 211 layout. label (text= "Layer:" ) 212 sub = layout. row () 213 sub.ui_units_x = 8 214 sub. popover ( 215 panel= "TOPBAR_PT_gpencil_layers" , 216 text=text, 217 ) 218 219 220 class _draw_tool_settings_context_mode: 221 @staticmethod 222 def SCULPT (context, layout, tool): 223 if (tool is None ) or ( not tool.has_datablock): 224 return False 225 226 paint = context.tool_settings.sculpt 227 layout. template_ID_preview (paint, "brush" , rows= 3 , cols= 8 , hide_buttons= True ) 228 229 brush = paint.brush 230 if brush is None : 231 return False 232 233 tool_settings = context.tool_settings 234 capabilities = brush.sculpt_capabilities 235 236 ups = tool_settings.unified_paint_settings 237 238 size = "size" 239 size_owner = ups if ups.use_unified_size else brush 240 if size_owner.use_locked_size == 'SCENE' : 241 size = "unprojected_radius" 242 243 UnifiedPaintPanel. prop_unified ( 244 layout, 245 context, 246 brush, 247 size, 248 pressure_name= "use_pressure_size" , 249 unified_name= "use_unified_size" , 250 text= "Radius" , 251 slider= True , 252 header= True 253 ) 254 255 # strength, use_strength_pressure 256 pressure_name = "use_pressure_strength" if capabilities.has_strength_pressure else None 257 UnifiedPaintPanel. prop_unified ( 258 layout, 259 context, 260 brush, 261 "strength" , 262 pressure_name=pressure_name, 263 unified_name= "use_unified_strength" , 264 text= "Strength" , 265 header= True 266 ) 267 268 # direction 269 if not capabilities.has_direction: 270 layout. row (). prop (brush, "direction" , expand= True , text= "" ) 271 272 if capabilities.has_color: 273 UnifiedPaintPanel. prop_unified_color (layout, context, brush, "color" , text= "" ) 274 layout. prop (brush, "blend" , text= "" , expand= False ) 275 276 return True 277 278 @staticmethod 279 def PAINT_TEXTURE (context, layout, tool): 280 if (tool is None ) or ( not tool.has_datablock): 281 return False 282 283 paint = context.tool_settings.image_paint 284 layout. template_ID_preview (paint, "brush" , rows= 3 , cols= 8 , hide_buttons= True ) 285 286 brush = paint.brush 287 if brush is None : 288 return False 289 290 brush_basic_texpaint_settings (layout, context, brush, compact= True ) 291 292 return True 293 294 @staticmethod 295 def PAINT_VERTEX (context, layout, tool): 296 if (tool is None ) or ( not tool.has_datablock): 297 return False 298 299 paint = context.tool_settings.vertex_paint 300 layout. template_ID_preview (paint, "brush" , rows= 3 , cols= 8 , hide_buttons= True ) 301 302 brush = paint.brush 303 if brush is None : 304 return False 305 306 brush_basic_texpaint_settings (layout, context, brush, compact= True ) 307 308 return True 309 310 @staticmethod 311 def PAINT_WEIGHT (context, layout, tool): 312 if (tool is None ) or ( not tool.has_datablock): 313 return False 314 315 paint = context.tool_settings.weight_paint 316 layout. template_ID_preview (paint, "brush" , rows= 3 , cols= 8 , hide_buttons= True ) 317 brush = paint.brush 318 if brush is None : 319 return False 320 321 capabilities = brush.weight_paint_capabilities 322 if capabilities.has_weight: 323 UnifiedPaintPanel. prop_unified ( 324 layout, 325 context, 326 brush, 327 "weight" , 328 unified_name= "use_unified_weight" , 329 slider= True , 330 header= True 331 ) 332 333 UnifiedPaintPanel. prop_unified ( 334 layout, 335 context, 336 brush, 337 "size" , 338 pressure_name= "use_pressure_size" , 339 unified_name= "use_unified_size" , 340 slider= True , 341 text= "Radius" , 342 header= True 343 ) 344 UnifiedPaintPanel. prop_unified ( 345 layout, 346 context, 347 brush, 348 "strength" , 349 pressure_name= "use_pressure_strength" , 350 unified_name= "use_unified_strength" , 351 header= True 352 ) 353 354 return True 355 356 @staticmethod 357 def PAINT_GPENCIL (context, layout, tool): 358 if tool is None : 359 return False 360 361 if tool.idname == "builtin.cutter" : 362 row = layout. row (align= True ) 363 row. prop (context.tool_settings.gpencil_sculpt, "intersection_threshold" ) 364 return False 365 elif not tool.has_datablock: 366 return False 367 368 paint = context.tool_settings.gpencil_paint 369 brush = paint.brush 370 if brush is None : 371 return False 372 373 gp_settings = brush.gpencil_settings 374 375 row = layout. row (align= True ) 376 tool_settings = context.scene.tool_settings 377 settings = tool_settings.gpencil_paint 378 row. template_ID_preview (settings, "brush" , rows= 3 , cols= 8 , hide_buttons= True ) 379 380 if context. object and brush.gpencil_tool in { 'FILL' , 'DRAW' }: 381 from bl_ui.properties_paint_common import ( 382 brush_basic__draw_color_selector, 383 ) 384 brush_basic__draw_color_selector (context, layout, brush, gp_settings, None ) 385 386 if context. object and brush.gpencil_tool == 'TINT' : 387 row. separator (factor= 0.4 ) 388 row. prop_with_popover (brush, "color" , text= "" , panel= "TOPBAR_PT_gpencil_vertexcolor" ) 389 390 from bl_ui.properties_paint_common import ( 391 brush_basic_gpencil_paint_settings, 392 ) 393 brush_basic_gpencil_paint_settings (layout, context, brush, compact= True ) 394 395 return True 396 397 @staticmethod 398 def SCULPT_GPENCIL (context, layout, tool): 399 if (tool is None ) or ( not tool.has_datablock): 400 return False 401 paint = context.tool_settings.gpencil_sculpt_paint 402 brush = paint.brush 403 404 from bl_ui.properties_paint_common import ( 405 brush_basic_gpencil_sculpt_settings, 406 ) 407 brush_basic_gpencil_sculpt_settings (layout, context, brush, compact= True ) 408 409 return True 410 411 @staticmethod 412 def WEIGHT_GPENCIL (context, layout, tool): 413 if (tool is None ) or ( not tool.has_datablock): 414 return False 415 paint = context.tool_settings.gpencil_weight_paint 416 brush = paint.brush 417 418 from bl_ui.properties_paint_common import ( 419 brush_basic_gpencil_weight_settings, 420 ) 421 brush_basic_gpencil_weight_settings (layout, context, brush, compact= True ) 422 423 return True 424 425 @staticmethod 426 def VERTEX_GPENCIL (context, layout, tool): 427 if (tool is None ) or ( not tool.has_datablock): 428 return False 429 430 paint = context.tool_settings.gpencil_vertex_paint 431 brush = paint.brush 432 433 row = layout. row (align= True ) 434 tool_settings = context.scene.tool_settings 435 settings = tool_settings.gpencil_vertex_paint 436 row. template_ID_preview (settings, "brush" , rows= 3 , cols= 8 , hide_buttons= True ) 437 438 if brush.gpencil_vertex_tool not in { 'BLUR' , 'AVERAGE' , 'SMEAR' }: 439 row. separator (factor= 0.4 ) 440 row. prop_with_popover (brush, "color" , text= "" , panel= "TOPBAR_PT_gpencil_vertexcolor" ) 441 442 from bl_ui.properties_paint_common import ( 443 brush_basic_gpencil_vertex_settings, 444 ) 445 446 brush_basic_gpencil_vertex_settings (layout, context, brush, compact= True ) 447 448 return True 449 450 @staticmethod 451 def PARTICLE (context, layout, tool): 452 if (tool is None ) or ( not tool.has_datablock): 453 return False 454 455 # See: 'VIEW3D_PT_tools_brush', basically a duplicate 456 settings = context.tool_settings.particle_edit 457 brush = settings.brush 458 tool = settings.tool 459 if tool == 'NONE' : 460 return False 461 462 layout. prop (brush, "size" , slider= True ) 463 if tool == 'ADD' : 464 layout. prop (brush, "count" ) 465 466 layout. prop (settings, "use_default_interpolate" ) 467 layout. prop (brush, "steps" , slider= True ) 468 layout. prop (settings, "default_key_count" , slider= True ) 469 else : 470 layout. prop (brush, "strength" , slider= True ) 471 472 if tool == 'LENGTH' : 473 layout. row (). prop (brush, "length_mode" , expand= True ) 474 elif tool == 'PUFF' : 475 layout. row (). prop (brush, "puff_mode" , expand= True ) 476 layout. prop (brush, "use_puff_volume" ) 477 elif tool == 'COMB' : 478 row = layout. row () 479 row.active = settings.is_editable 480 row. prop (settings, "use_emitter_deflect" , text= "Deflect Emitter" ) 481 sub = row. row (align= True ) 482 sub.active = settings.use_emitter_deflect 483 sub. prop (settings, "emitter_distance" , text= "Distance" ) 484 485 return True 486 487 488 class VIEW3D_HT_header (Header): 489 bl_space_type = 'VIEW_3D' 490 491 @staticmethod 492 def draw_xform_template (layout, context): 493 obj = context.active_object 494 object_mode = 'OBJECT' if obj is None else obj.mode 495 has_pose_mode = ( 496 (object_mode == 'POSE' ) or 497 (object_mode == 'WEIGHT_PAINT' and context.pose_object is not None ) 498 ) 499 500 tool_settings = context.tool_settings 501 502 # Mode & Transform Settings 503 scene = context.scene 504 505 # Orientation 506 if object_mode in { 'OBJECT' , 'EDIT' , 'EDIT_GPENCIL' } or has_pose_mode: 507 orient_slot = scene.transform_orientation_slots[ 0 ] 508 row = layout. row (align= True ) 509 510 sub = row. row () 511 sub.ui_units_x = 4 512 sub. prop_with_popover ( 513 orient_slot, 514 "type" , 515 text= "" , 516 panel= "VIEW3D_PT_transform_orientations" , 517 ) 518 519 # Pivot 520 if object_mode in { 'OBJECT' , 'EDIT' , 'EDIT_GPENCIL' , 'SCULPT_GPENCIL' } or has_pose_mode: 521 layout. prop (tool_settings, "transform_pivot_point" , text= "" , icon_only= True ) 522 523 # Snap 524 show_snap = False 525 if obj is None : 526 show_snap = True 527 else : 528 if (object_mode not in { 529 'SCULPT' , 'VERTEX_PAINT' , 'WEIGHT_PAINT' , 'TEXTURE_PAINT' , 530 'PAINT_GPENCIL' , 'SCULPT_GPENCIL' , 'WEIGHT_GPENCIL' , 'VERTEX_GPENCIL' 531 }) or has_pose_mode: 532 show_snap = True 533 else : 534 535 paint_settings = UnifiedPaintPanel. paint_settings (context) 536 537 if paint_settings: 538 brush = paint_settings.brush 539 if brush and hasattr (brush, "stroke_method" ) and brush.stroke_method == 'CURVE' : 540 show_snap = True 541 542 if show_snap: 543 snap_items = bpy.types.ToolSettings.bl_rna.properties[ "snap_elements" ].enum_items 544 snap_elements = tool_settings.snap_elements 545 if len (snap_elements) == 1 : 546 text = "" 547 for elem in snap_elements: 548 icon = snap_items[elem].icon 549 break 550 else : 551 text = "Mix" 552 icon = 'NONE' 553 del snap_items, snap_elements 554 555 row = layout. row (align= True ) 556 row. prop (tool_settings, "use_snap" , text= "" ) 557 558 sub = row. row (align= True ) 559 sub. popover ( 560 panel= "VIEW3D_PT_snapping" , 561 icon=icon, 562 text=text, 563 ) 564 565 # Proportional editing 566 if object_mode in { 'EDIT' , 'PARTICLE_EDIT' , 'SCULPT_GPENCIL' , 'EDIT_GPENCIL' , 'OBJECT' }: 567 row = layout. row (align= True ) 568 kw = {} 569 if object_mode == 'OBJECT' : 570 attr = "use_proportional_edit_objects" 571 else : 572 attr = "use_proportional_edit" 573 574 if tool_settings.use_proportional_edit: 575 if tool_settings.use_proportional_connected: 576 kw[ "icon" ] = 'PROP_CON' 577 elif tool_settings.use_proportional_projected: 578 kw[ "icon" ] = 'PROP_PROJECTED' 579 else : 580 kw[ "icon" ] = 'PROP_ON' 581 else : 582 kw[ "icon" ] = 'PROP_OFF' 583 584 row. prop (tool_settings, attr, icon_only= True , **kw) 585 sub = row. row (align= True ) 586 sub.active = getattr (tool_settings, attr) 587 sub. prop_with_popover ( 588 tool_settings, 589 "proportional_edit_falloff" , 590 text= "" , 591 icon_only= True , 592 panel= "VIEW3D_PT_proportional_edit" , 593 ) 594 595 def draw (self, context): 596 layout = self.layout 597 598 tool_settings = context.tool_settings 599 view = context.space_data 600 shading = view.shading 601 602 layout. row (align= True ). template_header () 603 604 row = layout. row (align= True ) 605 obj = context.active_object 606 # mode_string = context.mode 607 object_mode = 'OBJECT' if obj is None else obj.mode 608 has_pose_mode = ( 609 (object_mode == 'POSE' ) or 610 (object_mode == 'WEIGHT_PAINT' and context.pose_object is not None ) 611 ) 612 613 # Note: This is actually deadly in case enum_items have to be dynamically generated 614 # (because internal RNA array iterator will free everything immediately...). 615 # XXX This is an RNA internal issue, not sure how to fix it. 616 # Note: Tried to add an accessor to get translated UI strings instead of manual call 617 # to pgettext_iface below, but this fails because translated enumitems 618 # are always dynamically allocated. 619 act_mode_item = bpy.types.Object.bl_rna.properties[ "mode" ].enum_items[object_mode] 620 act_mode_i18n_context = bpy.types.Object.bl_rna.properties[ "mode" ].translation_context 621 622 sub = row. row (align= True ) 623 sub.ui_units_x = 5.5 624 sub. operator_menu_enum ( 625 "object.mode_set" , "mode" , 626 text=bpy.app.translations. pgettext_iface (act_mode_item.name, act_mode_i18n_context), 627 icon=act_mode_item.icon, 628 ) 629 del act_mode_item 630 631 layout. template_header_3D_mode () 632 633 # Contains buttons like Mode, Pivot, Layer, Mesh Select Mode... 634 if obj: 635 # Particle edit 636 if object_mode == 'PARTICLE_EDIT' : 637 row = layout. row () 638 row. prop (tool_settings.particle_edit, "select_mode" , text= "" , expand= True ) 639 640 # Grease Pencil 641 if obj and obj. type == 'GPENCIL' and context.gpencil_data: 642 gpd = context.gpencil_data 643 644 if gpd.is_stroke_paint_mode: 645 row = layout. row () 646 sub = row. row (align= True ) 647 sub. prop (tool_settings, "use_gpencil_draw_onback" , text= "" , icon= 'MOD_OPACITY' ) 648 sub. separator (factor= 0.4 ) 649 sub. prop (tool_settings, "use_gpencil_automerge_strokes" , text= "" ) 650 sub. separator (factor= 0.4 ) 651 sub. prop (tool_settings, "use_gpencil_weight_data_add" , text= "" , icon= 'WPAINT_HLT' ) 652 sub. separator (factor= 0.4 ) 653 sub. prop (tool_settings, "use_gpencil_draw_additive" , text= "" , icon= 'FREEZE' ) 654 655 # Select mode for Editing 656 if gpd.use_stroke_edit_mode: 657 row = layout. row (align= True ) 658 row. prop_enum (tool_settings, "gpencil_selectmode_edit" , text= "" , value= 'POINT' ) 659 row. prop_enum (tool_settings, "gpencil_selectmode_edit" , text= "" , value= 'STROKE' ) 660 661 subrow = row. row (align= True ) 662 subrow.enabled = not gpd.use_curve_edit 663 subrow. prop_enum (tool_settings, "gpencil_selectmode_edit" , text= "" , value= 'SEGMENT' ) 664 665 # Curve edit submode 666 row = layout. row (align= True ) 667 row. prop (gpd, "use_curve_edit" , text= "" , 668 icon= 'IPO_BEZIER' ) 669 sub = row. row (align= True ) 670 sub.active = gpd.use_curve_edit 671 sub. popover ( 672 panel= "VIEW3D_PT_gpencil_curve_edit" , 673 text= "Curve Editing" , 674 ) 675 676 # Select mode for Sculpt 677 if gpd.is_stroke_sculpt_mode: 678 row = layout. row (align= True ) 679 row. prop (tool_settings, "use_gpencil_select_mask_point" , text= "" ) 680 row. prop (tool_settings, "use_gpencil_select_mask_stroke" , text= "" ) 681 row. prop (tool_settings, "use_gpencil_select_mask_segment" , text= "" ) 682 683 # Select mode for Vertex Paint 684 if gpd.is_stroke_vertex_mode: 685 row = layout. row (align= True ) 686 row. prop (tool_settings, "use_gpencil_vertex_select_mask_point" , text= "" ) 687 row. prop (tool_settings, "use_gpencil_vertex_select_mask_stroke" , text= "" ) 688 row. prop (tool_settings, "use_gpencil_vertex_select_mask_segment" , text= "" ) 689 690 if gpd.is_stroke_paint_mode: 691 row = layout. row (align= True ) 692 row. prop (gpd, "use_multiedit" , text= "" , icon= 'GP_MULTIFRAME_EDITING' ) 693 694 if ( 695 gpd.use_stroke_edit_mode or 696 gpd.is_stroke_sculpt_mode or 697 gpd.is_stroke_weight_mode or 698 gpd.is_stroke_vertex_mode 699 ): 700 row = layout. row (align= True ) 701 row. prop (gpd, "use_multiedit" , text= "" , icon= 'GP_MULTIFRAME_EDITING' ) 702 703 sub = row. row (align= True ) 704 sub.enabled = gpd.use_multiedit 705 sub. popover ( 706 panel= "VIEW3D_PT_gpencil_multi_frame" , 707 text= "Multiframe" , 708 ) 709 710 overlay = view.overlay 711 712 VIEW3D_MT_editor_menus. draw_collapsible (context, layout) 713 714 layout. separator_spacer () 715 716 if object_mode in { 'PAINT_GPENCIL' , 'SCULPT_GPENCIL' }: 717 # Grease pencil 718 if object_mode == 'PAINT_GPENCIL' : 719 layout. prop_with_popover ( 720 tool_settings, 721 "gpencil_stroke_placement_view3d" , 722 text= "" , 723 panel= "VIEW3D_PT_gpencil_origin" , 724 ) 725 726 if object_mode in { 'PAINT_GPENCIL' , 'SCULPT_GPENCIL' }: 727 layout. prop_with_popover ( 728 tool_settings.gpencil_sculpt, 729 "lock_axis" , 730 text= "" , 731 panel= "VIEW3D_PT_gpencil_lock" , 732 ) 733 734 if object_mode == 'PAINT_GPENCIL' : 735 # FIXME: this is bad practice! 736 # Tool options are to be displayed in the topbar. 737 if context.workspace.tools. from_space_view3d_mode (object_mode).idname == "builtin_brush.Draw" : 738 settings = tool_settings.gpencil_sculpt.guide 739 row = layout. row (align= True ) 740 row. prop (settings, "use_guide" , text= "" , icon= 'GRID' ) 741 sub = row. row (align= True ) 742 sub.active = settings.use_guide 743 sub. popover ( 744 panel= "VIEW3D_PT_gpencil_guide" , 745 text= "Guides" , 746 ) 747 748 layout. separator_spacer () 749 else : 750 # Transform settings depending on tool header visibility 751 VIEW3D_HT_header. draw_xform_template (layout, context) 752 753 layout. separator_spacer () 754 755 # Viewport Settings 756 layout. popover ( 757 panel= "VIEW3D_PT_object_type_visibility" , 758 icon_value=view.icon_from_show_object_viewport, 759 text= "" , 760 ) 761 762 # Gizmo toggle & popover. 763 row = layout. row (align= True ) 764 # FIXME: place-holder icon. 765 row. prop (view, "show_gizmo" , text= "" , toggle= True , icon= 'GIZMO' ) 766 sub = row. row (align= True ) 767 sub.active = view.show_gizmo 768 sub. popover ( 769 panel= "VIEW3D_PT_gizmo_display" , 770 text= "" , 771 ) 772 773 # Overlay toggle & popover. 774 row = layout. row (align= True ) 775 row. prop (overlay, "show_overlays" , icon= 'OVERLAY' , text= "" ) 776 sub = row. row (align= True ) 777 sub.active = overlay.show_overlays 778 sub. popover (panel= "VIEW3D_PT_overlay" , text= "" ) 779 780 row = layout. row () 781 row.active = (object_mode == 'EDIT' ) or (shading. type in { 'WIREFRAME' , 'SOLID' }) 782 783 # While exposing 'shading.show_xray(_wireframe)' is correct. 784 # this hides the key shortcut from users: T70433. 785 if has_pose_mode: 786 draw_depressed = overlay.show_xray_bone 787 elif shading. type == 'WIREFRAME' : 788 draw_depressed = shading.show_xray_wireframe 789 else : 790 draw_depressed = shading.show_xray 791 row. operator ( 792 "view3d.toggle_xray" , 793 text= "" , 794 icon= 'XRAY' , 795 depress=draw_depressed, 796 ) 797 798 row = layout. row (align= True ) 799 row. prop (shading, "type" , text= "" , expand= True ) 800 sub = row. row (align= True ) 801 # TODO, currently render shading type ignores mesh two-side, until it's supported 802 # show the shading popover which shows double-sided option. 803 804 # sub.enabled = shading.type != 'RENDERED' 805 sub. popover (panel= "VIEW3D_PT_shading" , text= "" ) 806 807 808 class VIEW3D_MT_editor_menus (Menu): 809 bl_label = "" 810 811 def draw (self, context): 812 layout = self.layout 813 obj = context.active_object 814 mode_string = context.mode 815 edit_object = context.edit_object 816 gp_edit = obj and obj.mode in { 'EDIT_GPENCIL' , 'PAINT_GPENCIL' , 'SCULPT_GPENCIL' , 817 'WEIGHT_GPENCIL' , 'VERTEX_GPENCIL' } 818 ts = context.scene.tool_settings 819 820 layout. menu ( "VIEW3D_MT_view" ) 821 822 # Select Menu 823 if gp_edit: 824 if mode_string not in { 'PAINT_GPENCIL' , 'WEIGHT_GPENCIL' }: 825 if ( 826 mode_string == 'SCULPT_GPENCIL' and 827 (ts.use_gpencil_select_mask_point or 828 ts.use_gpencil_select_mask_stroke or 829 ts.use_gpencil_select_mask_segment) 830 ): 831 layout. menu ( "VIEW3D_MT_select_gpencil" ) 832 elif mode_string == 'EDIT_GPENCIL' : 833 layout. menu ( "VIEW3D_MT_select_gpencil" ) 834 elif mode_string == 'VERTEX_GPENCIL' : 835 layout. menu ( "VIEW3D_MT_select_gpencil" ) 836 elif mode_string in { 'PAINT_WEIGHT' , 'PAINT_VERTEX' , 'PAINT_TEXTURE' }: 837 mesh = obj.data 838 if mesh.use_paint_mask: 839 layout. menu ( "VIEW3D_MT_select_paint_mask" ) 840 elif mesh.use_paint_mask_vertex and mode_string in { 'PAINT_WEIGHT' , 'PAINT_VERTEX' }: 841 layout. menu ( "VIEW3D_MT_select_paint_mask_vertex" ) 842 elif mode_string != 'SCULPT' : 843 layout. menu ( "VIEW3D_MT_select_ %s " % mode_string. lower ()) 844 845 if gp_edit: 846 pass 847 elif mode_string == 'OBJECT' : 848 layout. menu ( "VIEW3D_MT_add" , text= "Add" , text_ctxt=i18n_contexts.operator_default) 849 elif mode_string == 'EDIT_MESH' : 850 layout. menu ( "VIEW3D_MT_mesh_add" , text= "Add" , text_ctxt=i18n_contexts.operator_default) 851 elif mode_string == 'EDIT_CURVE' : 852 layout. menu ( "VIEW3D_MT_curve_add" , text= "Add" , text_ctxt=i18n_contexts.operator_default) 853 elif mode_string == 'EDIT_SURFACE' : 854 layout. menu ( "VIEW3D_MT_surface_add" , text= "Add" , text_ctxt=i18n_contexts.operator_default) 855 elif mode_string == 'EDIT_METABALL' : 856 layout. menu ( "VIEW3D_MT_metaball_add" , text= "Add" , text_ctxt=i18n_contexts.operator_default) 857 elif mode_string == 'EDIT_ARMATURE' : 858 layout. menu ( "TOPBAR_MT_edit_armature_add" , text= "Add" , text_ctxt=i18n_contexts.operator_default) 859 860 if gp_edit: 861 if obj and obj.mode == 'PAINT_GPENCIL' : 862 layout. menu ( "VIEW3D_MT_draw_gpencil" ) 863 elif obj and obj.mode == 'EDIT_GPENCIL' : 864 layout. menu ( "VIEW3D_MT_edit_gpencil" ) 865 layout. menu ( "VIEW3D_MT_edit_gpencil_stroke" ) 866 layout. menu ( "VIEW3D_MT_edit_gpencil_point" ) 867 elif obj and obj.mode == 'WEIGHT_GPENCIL' : 868 layout. menu ( "VIEW3D_MT_weight_gpencil" ) 869 if obj and obj.mode == 'VERTEX_GPENCIL' : 870 layout. menu ( "VIEW3D_MT_paint_gpencil" ) 871 872 elif edit_object: 873 layout. menu ( "VIEW3D_MT_edit_ %s " % edit_object. type . lower ()) 874 875 if mode_string == 'EDIT_MESH' : 876 layout. menu ( "VIEW3D_MT_edit_mesh_vertices" ) 877 layout. menu ( "VIEW3D_MT_edit_mesh_edges" ) 878 layout. menu ( "VIEW3D_MT_edit_mesh_faces" ) 879 layout. menu ( "VIEW3D_MT_uv_map" , text= "UV" ) 880 elif mode_string in { 'EDIT_CURVE' , 'EDIT_SURFACE' }: 881 layout. menu ( "VIEW3D_MT_edit_curve_ctrlpoints" ) 882 layout. menu ( "VIEW3D_MT_edit_curve_segments" ) 883 884 elif obj: 885 if mode_string != 'PAINT_TEXTURE' : 886 layout. menu ( "VIEW3D_MT_ %s " % mode_string. lower ()) 887 if mode_string == 'SCULPT' : 888 layout. menu ( "VIEW3D_MT_mask" ) 889 layout. menu ( "VIEW3D_MT_face_sets" ) 890 891 else : 892 layout. menu ( "VIEW3D_MT_object" ) 893 894 895 # ********** Menu ********** 896 897 898 # ********** Utilities ********** 899 900 901 class ShowHideMenu: 902 bl_label = "Show/Hide" 903 _operator_name = "" 904 905 def draw (self, _context): 906 layout = self.layout 907 908 layout. operator ( " %s .reveal" % self._operator_name) 909 layout. operator ( " %s .hide" % self._operator_name, text= "Hide Selected" ).unselected = False 910 layout. operator ( " %s .hide" % self._operator_name, text= "Hide Unselected" ).unselected = True 911 912 913 # Standard transforms which apply to all cases (mix-in class, not used directly). 914 class VIEW3D_MT_transform_base: 915 bl_label = "Transform" 916 bl_category = "View" 917 918 # TODO: get rid of the custom text strings? 919 def draw (self, context): 920 layout = self.layout 921 922 layout. operator ( "transform.translate" ) 923 layout. operator ( "transform.rotate" ) 924 layout. operator ( "transform.resize" , text= "Scale" ) 925 926 layout. separator () 927 928 layout. operator ( "transform.tosphere" , text= "To Sphere" ) 929 layout. operator ( "transform.shear" , text= "Shear" ) 930 layout. operator ( "transform.bend" , text= "Bend" ) 931 layout. operator ( "transform.push_pull" , text= "Push/Pull" ) 932 933 if context.mode in { 'EDIT_MESH' , 'EDIT_ARMATURE' , 'EDIT_SURFACE' , 'EDIT_CURVE' , 934 'EDIT_LATTICE' , 'EDIT_METABALL' }: 935 layout. operator ( "transform.vertex_warp" , text= "Warp" ) 936 layout.operator_context = 'EXEC_REGION_WIN' 937 layout. operator ( "transform.vertex_random" , text= "Randomize" ).offset = 0.1 938 layout.operator_context = 'INVOKE_REGION_WIN' 939 940 941 # Generic transform menu - geometry types 942 class VIEW3D_MT_transform (VIEW3D_MT_transform_base, Menu): 943 def draw (self, context): 944 # base menu 945 VIEW3D_MT_transform_base. draw (self, context) 946 947 # generic... 948 layout = self.layout 949 if context.mode == 'EDIT_MESH' : 950 layout. operator ( "transform.shrink_fatten" , text= "Shrink/Fatten" ) 951 layout. operator ( "transform.skin_resize" ) 952 elif context.mode == 'EDIT_CURVE' : 953 layout. operator ( "transform.transform" , text= "Radius" ).mode = 'CURVE_SHRINKFATTEN' 954 955 layout. separator () 956 957 layout. operator ( "transform.translate" , text= "Move Texture Space" ).texture_space = True 958 layout. operator ( "transform.resize" , text= "Scale Texture Space" ).texture_space = True 959 960 961 # Object-specific extensions to Transform menu 962 class VIEW3D_MT_transform_object (VIEW3D_MT_transform_base, Menu): 963 def draw (self, context): 964 layout = self.layout 965 966 # base menu 967 VIEW3D_MT_transform_base. draw (self, context) 968 969 # object-specific option follow... 970 layout. separator () 971 972 layout. operator ( "transform.translate" , text= "Move Texture Space" ).texture_space = True 973 layout. operator ( "transform.resize" , text= "Scale Texture Space" ).texture_space = True 974 975 layout. separator () 976 977 layout.operator_context = 'EXEC_REGION_WIN' 978 # XXX see alignmenu() in edit.c of b2.4x to get this working 979 layout. operator ( "transform.transform" , text= "Align to Transform Orientation" ).mode = 'ALIGN' 980 981 layout. separator () 982 983 layout. operator ( "object.randomize_transform" ) 984 layout. operator ( "object.align" ) 985 986 # TODO: there is a strange context bug here. 987 """ 988 layout.operator_context = 'INVOKE_REGION_WIN' 989 layout.operator("object.transform_axis_target") 990 """ 991 992 993 # Armature EditMode extensions to Transform menu 994 class VIEW3D_MT_transform_armature (VIEW3D_MT_transform_base, Menu): 995 def draw (self, context): 996 layout = self.layout 997 998 # base menu 999 VIEW3D_MT_transform_base. draw (self, context) 1000 1001 # armature specific extensions follow... 1002 obj = context. object 1003 if obj. type == 'ARMATURE' and obj.mode in { 'EDIT' , 'POSE' }: 1004 if obj.data.display_type == 'BBONE' : 1005 layout. separator () 1006 1007 layout. operator ( "transform.transform" , text= "Scale BBone" ).mode = 'BONE_SIZE' 1008 elif obj.data.display_type == 'ENVELOPE' : 1009 layout. separator () 1010 1011 layout. operator ( "transform.transform" , text= "Scale Envelope Distance" ).mode = 'BONE_SIZE' 1012 layout. operator ( "transform.transform" , text= "Scale Radius" ).mode = 'BONE_ENVELOPE' 1013 1014 if context.edit_object and context.edit_object. type == 'ARMATURE' : 1015 layout. separator () 1016 1017 layout. operator ( "armature.align" ) 1018 1019 1020 class VIEW3D_MT_mirror (Menu): 1021 bl_label = "Mirror" 1022 1023 def draw (self, _context): 1024 layout = self.layout 1025 1026 layout. operator ( "transform.mirror" , text= "Interactive Mirror" ) 1027 1028 layout. separator () 1029 1030 layout.operator_context = 'EXEC_REGION_WIN' 1031 1032 for (space_name, space_id) in (( "Global" , 'GLOBAL' ), ( "Local" , 'LOCAL' )): 1033 for axis_index, axis_name in enumerate ( "XYZ" ): 1034 props = layout. operator ( "transform.mirror" , text= " %s %s " % (axis_name, space_name)) 1035 props.constraint_axis[axis_index] = True 1036 props.orient_type = space_id 1037 1038 if space_id == 'GLOBAL' : 1039 layout. separator () 1040 1041 1042 class VIEW3D_MT_snap (Menu): 1043 bl_label = "Snap" 1044 1045 def draw (self, _context): 1046 layout = self.layout 1047 1048 layout. operator ( "view3d.snap_selected_to_grid" , text= "Selection to Grid" ) 1049 layout. operator ( "view3d.snap_selected_to_cursor" , text= "Selection to Cursor" ).use_offset = False 1050 layout. operator ( "view3d.snap_selected_to_cursor" , text= "Selection to Cursor (Keep Offset)" ).use_offset = True 1051 layout. operator ( "view3d.snap_selected_to_active" , text= "Selection to Active" ) 1052 1053 layout. separator () 1054 1055 layout. operator ( "view3d.snap_cursor_to_selected" , text= "Cursor to Selected" ) 1056 layout. operator ( "view3d.snap_cursor_to_center" , text= "Cursor to World Origin" ) 1057 layout. operator ( "view3d.snap_cursor_to_grid" , text= "Cursor to Grid" ) 1058 layout. operator ( "view3d.snap_cursor_to_active" , text= "Cursor to Active" ) 1059 1060 1061 class VIEW3D_MT_uv_map (Menu): 1062 bl_label = "UV Mapping" 1063 1064 def draw (self, _context): 1065 layout = self.layout 1066 1067 layout. operator ( "uv.unwrap" ) 1068 1069 layout. separator () 1070 1071 layout.operator_context = 'INVOKE_DEFAULT' 1072 layout. operator ( "uv.smart_project" ) 1073 layout. operator ( "uv.lightmap_pack" ) 1074 layout. operator ( "uv.follow_active_quads" ) 1075 1076 layout. separator () 1077 1078 layout.operator_context = 'EXEC_REGION_WIN' 1079 layout. operator ( "uv.cube_project" ) 1080 layout. operator ( "uv.cylinder_project" ) 1081 layout. operator ( "uv.sphere_project" ) 1082 1083 layout. separator () 1084 1085 layout.operator_context = 'INVOKE_REGION_WIN' 1086 layout. operator ( "uv.project_from_view" ).scale_to_bounds = False 1087 layout. operator ( "uv.project_from_view" , text= "Project from View (Bounds)" ).scale_to_bounds = True 1088 1089 layout. separator () 1090 1091 layout. operator ( "mesh.mark_seam" ).clear = False 1092 layout. operator ( "mesh.mark_seam" , text= "Clear Seam" ).clear = True 1093 1094 layout. separator () 1095 1096 layout. operator ( "uv.reset" ) 1097 1098 1099 # ********** View menus ********** 1100 1101 1102 class VIEW3D_MT_view (Menu): 1103 bl_label = "View" 1104 1105 def draw (self, context): 1106 layout = self.layout 1107 view = context.space_data 1108 1109 layout. prop (view, "show_region_toolbar" ) 1110 layout. prop (view, "show_region_ui" ) 1111 layout. prop (view, "show_region_tool_header" ) 1112 layout. prop (view, "show_region_hud" ) 1113 1114 layout. separator () 1115 1116 layout. operator ( "view3d.view_selected" , text= "Frame Selected" ).use_all_regions = False 1117 if view.region_quadviews: 1118 layout. operator ( "view3d.view_selected" , text= "Frame Selected (Quad View)" ).use_all_regions = True 1119 1120 layout. operator ( "view3d.view_all" ).center = False 1121 layout. operator ( "view3d.view_persportho" , text= "Perspective/Orthographic" ) 1122 layout. menu ( "VIEW3D_MT_view_local" ) 1123 1124 layout. separator () 1125 1126 layout. menu ( "VIEW3D_MT_view_cameras" , text= "Cameras" ) 1127 1128 layout. separator () 1129 layout. menu ( "VIEW3D_MT_view_viewpoint" ) 1130 layout. menu ( "VIEW3D_MT_view_navigation" ) 1131 layout. menu ( "VIEW3D_MT_view_align" ) 1132 1133 layout. separator () 1134 1135 layout.operator_context = 'INVOKE_REGION_WIN' 1136 layout. menu ( "VIEW3D_MT_view_regions" , text= "View Regions" ) 1137 1138 layout. separator () 1139 1140 layout. operator ( "screen.animation_play" , text= "Play Animation" ) 1141 1142 layout. separator () 1143 1144 layout. operator ( "render.opengl" , text= "Viewport Render Image" , icon= 'RENDER_STILL' ) 1145 layout. operator ( "render.opengl" , text= "Viewport Render Animation" , icon= 'RENDER_ANIMATION' ).animation = True 1146 props = layout. operator ( "render.opengl" , 1147 text= "Viewport Render Keyframes" , 1148 icon= 'RENDER_ANIMATION' , 1149 ) 1150 props.animation = True 1151 props.render_keyed_only = True 1152 1153 layout. separator () 1154 1155 layout. menu ( "INFO_MT_area" ) 1156 1157 1158 class VIEW3D_MT_view_local (Menu): 1159 bl_label = "Local View" 1160 1161 def draw (self, _context): 1162 layout = self.layout 1163 1164 layout. operator ( "view3d.localview" , text= "Toggle Local View" ) 1165 layout. operator ( "view3d.localview_remove_from" ) 1166 1167 1168 class VIEW3D_MT_view_cameras (Menu): 1169 bl_label = "Cameras" 1170 1171 def draw (self, _context): 1172 layout = self.layout 1173 1174 layout. operator ( "view3d.object_as_camera" ) 1175 layout. operator ( "view3d.view_camera" , text= "Active Camera" ) 1176 layout. operator ( "view3d.view_center_camera" ) 1177 1178 1179 class VIEW3D_MT_view_viewpoint (Menu): 1180 bl_label = "Viewpoint" 1181 1182 def draw (self, _context): 1183 layout = self.layout 1184 1185 layout. operator ( "view3d.view_camera" , text= "Camera" ) 1186 1187 layout. separator () 1188 1189 layout. operator ( "view3d.view_axis" , text= "Top" ). type = 'TOP' 1190 layout. operator ( "view3d.view_axis" , text= "Bottom" ). type = 'BOTTOM' 1191 1192 layout. separator () 1193 1194 layout. operator ( "view3d.view_axis" , text= "Front" ). type = 'FRONT' 1195 layout. operator ( "view3d.view_axis" , text= "Back" ). type = 'BACK' 1196 1197 layout. separator () 1198 1199 layout. operator ( "view3d.view_axis" , text= "Right" ). type = 'RIGHT' 1200 layout. operator ( "view3d.view_axis" , text= "Left" ). type = 'LEFT' 1201 1202 1203 class VIEW3D_MT_view_navigation (Menu): 1204 bl_label = "Navigation" 1205 1206 def draw (self, _context): 1207 from math import pi 1208 layout = self.layout 1209 1210 layout. operator_enum ( "view3d.view_orbit" , "type" ) 1211 props = layout. operator ( "view3d.view_orbit" , text= "Orbit Opposite" ) 1212 props. type = 'ORBITRIGHT' 1213 props.angle = pi 1214 1215 layout. separator () 1216 1217 layout. operator ( "view3d.view_roll" , text= "Roll Left" ). type = 'LEFT' 1218 layout. operator ( "view3d.view_roll" , text= "Roll Right" ). type = 'RIGHT' 1219 1220 layout. separator () 1221 1222 layout. operator_enum ( "view3d.view_pan" , "type" ) 1223 1224 layout. separator () 1225 1226 layout. operator ( "view3d.zoom" , text= "Zoom In" ).delta = 1 1227 layout. operator ( "view3d.zoom" , text= "Zoom Out" ).delta = - 1 1228 layout. operator ( "view3d.zoom_border" , text= "Zoom Region..." ) 1229 layout. operator ( "view3d.zoom_camera_1_to_1" , text= "Zoom Camera 1:1" ) 1230 1231 layout. separator () 1232 1233 layout. operator ( "view3d.fly" ) 1234 layout. operator ( "view3d.walk" ) 1235 1236 1237 class VIEW3D_MT_view_align (Menu): 1238 bl_label = "Align View" 1239 1240 def draw (self, _context): 1241 layout = self.layout 1242 1243 layout. menu ( "VIEW3D_MT_view_align_selected" ) 1244 1245 layout. separator () 1246 1247 layout. operator ( "view3d.camera_to_view" , text= "Align Active Camera to View" ) 1248 layout. operator ( "view3d.camera_to_view_selected" , text= "Align Active Camera to Selected" ) 1249 1250 layout. separator () 1251 1252 layout. operator ( "view3d.view_all" , text= "Center Cursor and Frame All" ).center = True 1253 layout. operator ( "view3d.view_center_cursor" ) 1254 1255 layout. separator () 1256 1257 layout. operator ( "view3d.view_lock_to_active" ) 1258 layout. operator ( "view3d.view_lock_clear" ) 1259 1260 1261 class VIEW3D_MT_view_align_selected (Menu): 1262 bl_label = "Align View to Active" 1263 1264 def draw (self, _context): 1265 layout = self.layout 1266 1267 props = layout. operator ( "view3d.view_axis" , text= "Top" ) 1268 props.align_active = True 1269 props. type = 'TOP' 1270 1271 props = layout. operator ( "view3d.view_axis" , text= "Bottom" ) 1272 props.align_active = True 1273 props. type = 'BOTTOM' 1274 1275 layout. separator () 1276 1277 props = layout. operator ( "view3d.view_axis" , text= "Front" ) 1278 props.align_active = True 1279 props. type = 'FRONT' 1280 1281 props = layout. operator ( "view3d.view_axis" , text= "Back" ) 1282 props.align_active = True 1283 props. type = 'BACK' 1284 1285 layout. separator () 1286 1287 props = layout. operator ( "view3d.view_axis" , text= "Right" ) 1288 props.align_active = True 1289 props. type = 'RIGHT' 1290 1291 props = layout. operator ( "view3d.view_axis" , text= "Left" ) 1292 props.align_active = True 1293 props. type = 'LEFT' 1294 1295 1296 class VIEW3D_MT_view_regions (Menu): 1297 bl_label = "View Regions" 1298 1299 def draw (self, _context): 1300 layout = self.layout 1301 layout. operator ( "view3d.clip_border" , text= "Clipping Region..." ) 1302 layout. operator ( "view3d.render_border" , text= "Render Region..." ) 1303 1304 layout. separator () 1305 1306 layout. operator ( "view3d.clear_render_border" ) 1307 1308 1309 # ********** Select menus, suffix from context.mode ********** 1310 1311 class VIEW3D_MT_select_object_more_less (Menu): 1312 bl_label = "Select More/Less" 1313 1314 def draw (self, _context): 1315 layout = self.layout 1316 1317 layout = self.layout 1318 1319 layout. operator ( "object.select_more" , text= "More" ) 1320 layout. operator ( "object.select_less" , text= "Less" ) 1321 1322 layout. separator () 1323 1324 props = layout. operator ( "object.select_hierarchy" , text= "Parent" ) 1325 props.extend = False 1326 props.direction = 'PARENT' 1327 1328 props = layout. operator ( "object.select_hierarchy" , text= "Child" ) 1329 props.extend = False 1330 props.direction = 'CHILD' 1331 1332 layout. separator () 1333 1334 props = layout. operator ( "object.select_hierarchy" , text= "Extend Parent" ) 1335 props.extend = True 1336 props.direction = 'PARENT' 1337 1338 props = layout. operator ( "object.select_hierarchy" , text= "Extend Child" ) 1339 props.extend = True 1340 props.direction = 'CHILD' 1341 1342 1343 class VIEW3D_MT_select_object (Menu): 1344 bl_label = "Select" 1345 1346 def draw (self, _context): 1347 layout = self.layout 1348 1349 layout. operator ( "object.select_all" , text= "All" ).action = 'SELECT' 1350 layout. operator ( "object.select_all" , text= "None" ).action = 'DESELECT' 1351 layout. operator ( "object.select_all" , text= "Invert" ).action = 'INVERT' 1352 1353 layout. separator () 1354 1355 layout. operator ( "view3d.select_box" ) 1356 layout. operator ( "view3d.select_circle" ) 1357 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1358 1359 layout. separator () 1360 1361 layout. operator_menu_enum ( "object.select_by_type" , "type" , text= "Select All by Type" ) 1362 layout. operator ( "object.select_camera" , text= "Select Active Camera" ) 1363 layout. operator ( "object.select_mirror" ) 1364 layout. operator ( "object.select_random" , text= "Select Random" ) 1365 1366 layout. separator () 1367 1368 layout. menu ( "VIEW3D_MT_select_object_more_less" ) 1369 1370 layout. separator () 1371 1372 layout. operator_menu_enum ( "object.select_grouped" , "type" , text= "Select Grouped" ) 1373 layout. operator_menu_enum ( "object.select_linked" , "type" , text= "Select Linked" ) 1374 layout. operator ( "object.select_pattern" , text= "Select Pattern..." ) 1375 1376 1377 class VIEW3D_MT_select_pose_more_less (Menu): 1378 bl_label = "Select More/Less" 1379 1380 def draw (self, _context): 1381 layout = self.layout 1382 1383 layout = self.layout 1384 1385 props = layout. operator ( "pose.select_hierarchy" , text= "Parent" ) 1386 props.extend = False 1387 props.direction = 'PARENT' 1388 1389 props = layout. operator ( "pose.select_hierarchy" , text= "Child" ) 1390 props.extend = False 1391 props.direction = 'CHILD' 1392 1393 layout. separator () 1394 1395 props = layout. operator ( "pose.select_hierarchy" , text= "Extend Parent" ) 1396 props.extend = True 1397 props.direction = 'PARENT' 1398 1399 props = layout. operator ( "pose.select_hierarchy" , text= "Extend Child" ) 1400 props.extend = True 1401 props.direction = 'CHILD' 1402 1403 1404 class VIEW3D_MT_select_pose (Menu): 1405 bl_label = "Select" 1406 1407 def draw (self, _context): 1408 layout = self.layout 1409 1410 layout. operator ( "pose.select_all" , text= "All" ).action = 'SELECT' 1411 layout. operator ( "pose.select_all" , text= "None" ).action = 'DESELECT' 1412 layout. operator ( "pose.select_all" , text= "Invert" ).action = 'INVERT' 1413 1414 layout. separator () 1415 1416 layout. operator ( "view3d.select_box" ) 1417 layout. operator ( "view3d.select_circle" ) 1418 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1419 1420 layout. separator () 1421 1422 layout. operator ( "pose.select_mirror" ) 1423 1424 layout. separator () 1425 1426 layout. operator ( "pose.select_constraint_target" , text= "Constraint Target" ) 1427 layout. operator ( "pose.select_linked" , text= "Linked" ) 1428 1429 layout. separator () 1430 1431 layout. menu ( "VIEW3D_MT_select_pose_more_less" ) 1432 1433 layout. separator () 1434 1435 layout. operator_menu_enum ( "pose.select_grouped" , "type" , text= "Grouped" ) 1436 layout. operator ( "object.select_pattern" , text= "Select Pattern..." ) 1437 1438 1439 class VIEW3D_MT_select_particle (Menu): 1440 bl_label = "Select" 1441 1442 def draw (self, _context): 1443 layout = self.layout 1444 1445 layout. operator ( "particle.select_all" , text= "All" ).action = 'SELECT' 1446 layout. operator ( "particle.select_all" , text= "None" ).action = 'DESELECT' 1447 layout. operator ( "particle.select_all" , text= "Invert" ).action = 'INVERT' 1448 1449 layout. separator () 1450 1451 layout. operator ( "view3d.select_box" ) 1452 layout. operator ( "view3d.select_circle" ) 1453 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1454 1455 layout. separator () 1456 1457 layout. operator ( "particle.select_linked" , text= "Select Linked" ) 1458 1459 layout. separator () 1460 1461 layout. operator ( "particle.select_more" ) 1462 layout. operator ( "particle.select_less" ) 1463 1464 layout. separator () 1465 1466 layout. operator ( "particle.select_random" ) 1467 1468 layout. separator () 1469 1470 layout. operator ( "particle.select_roots" , text= "Roots" ) 1471 layout. operator ( "particle.select_tips" , text= "Tips" ) 1472 1473 1474 class VIEW3D_MT_edit_mesh_select_similar (Menu): 1475 bl_label = "Select Similar" 1476 1477 def draw (self, _context): 1478 layout = self.layout 1479 1480 layout. operator_enum ( "mesh.select_similar" , "type" ) 1481 1482 layout. separator () 1483 1484 layout. operator ( "mesh.select_similar_region" , text= "Face Regions" ) 1485 1486 1487 class VIEW3D_MT_edit_mesh_select_by_trait (Menu): 1488 bl_label = "Select All by Trait" 1489 1490 def draw (self, context): 1491 layout = self.layout 1492 tool_settings = context.tool_settings 1493 if tool_settings.mesh_select_mode[ 2 ] is False : 1494 layout. operator ( "mesh.select_non_manifold" , text= "Non Manifold" ) 1495 layout. operator ( "mesh.select_loose" , text= "Loose Geometry" ) 1496 layout. operator ( "mesh.select_interior_faces" , text= "Interior Faces" ) 1497 layout. operator ( "mesh.select_face_by_sides" , text= "Faces by Sides" ) 1498 1499 layout. separator () 1500 1501 layout. operator ( "mesh.select_ungrouped" , text= "Ungrouped Vertices" ) 1502 1503 1504 class VIEW3D_MT_edit_mesh_select_more_less (Menu): 1505 bl_label = "Select More/Less" 1506 1507 def draw (self, _context): 1508 layout = self.layout 1509 1510 layout. operator ( "mesh.select_more" , text= "More" ) 1511 layout. operator ( "mesh.select_less" , text= "Less" ) 1512 1513 layout. separator () 1514 1515 layout. operator ( "mesh.select_next_item" , text= "Next Active" ) 1516 layout. operator ( "mesh.select_prev_item" , text= "Previous Active" ) 1517 1518 1519 class VIEW3D_MT_edit_mesh_select_linked (Menu): 1520 bl_label = "Select Linked" 1521 1522 def draw (self, _context): 1523 layout = self.layout 1524 1525 layout. operator ( "mesh.select_linked" , text= "Linked" ) 1526 layout. operator ( "mesh.shortest_path_select" , text= "Shortest Path" ) 1527 layout. operator ( "mesh.faces_select_linked_flat" , text= "Linked Flat Faces" ) 1528 1529 1530 class VIEW3D_MT_edit_mesh_select_loops (Menu): 1531 bl_label = "Select Loops" 1532 1533 def draw (self, _context): 1534 layout = self.layout 1535 1536 layout. operator ( "mesh.loop_multi_select" , text= "Edge Loops" ).ring = False 1537 layout. operator ( "mesh.loop_multi_select" , text= "Edge Rings" ).ring = True 1538 1539 layout. separator () 1540 1541 layout. operator ( "mesh.loop_to_region" ) 1542 layout. operator ( "mesh.region_to_loop" ) 1543 1544 1545 class VIEW3D_MT_select_edit_mesh (Menu): 1546 bl_label = "Select" 1547 1548 def draw (self, _context): 1549 layout = self.layout 1550 1551 # primitive 1552 layout. operator ( "mesh.select_all" , text= "All" ).action = 'SELECT' 1553 layout. operator ( "mesh.select_all" , text= "None" ).action = 'DESELECT' 1554 layout. operator ( "mesh.select_all" , text= "Invert" ).action = 'INVERT' 1555 1556 layout. separator () 1557 1558 layout. operator ( "view3d.select_box" ) 1559 layout. operator ( "view3d.select_circle" ) 1560 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1561 1562 layout. separator () 1563 1564 # numeric 1565 layout. operator ( "mesh.select_random" , text= "Select Random" ) 1566 layout. operator ( "mesh.select_nth" ) 1567 1568 layout. separator () 1569 1570 # geometric 1571 layout. operator ( "mesh.edges_select_sharp" , text= "Select Sharp Edges" ) 1572 1573 layout. separator () 1574 1575 # other ... 1576 layout. menu ( "VIEW3D_MT_edit_mesh_select_similar" ) 1577 1578 layout. separator () 1579 1580 layout. menu ( "VIEW3D_MT_edit_mesh_select_by_trait" ) 1581 1582 layout. separator () 1583 1584 layout. menu ( "VIEW3D_MT_edit_mesh_select_more_less" ) 1585 1586 layout. separator () 1587 1588 layout. menu ( "VIEW3D_MT_edit_mesh_select_loops" ) 1589 1590 layout. separator () 1591 1592 layout. menu ( "VIEW3D_MT_edit_mesh_select_linked" ) 1593 1594 layout. separator () 1595 1596 layout. operator ( "mesh.select_axis" , text= "Side of Active" ) 1597 layout. operator ( "mesh.select_mirror" ) 1598 1599 1600 class VIEW3D_MT_select_edit_curve (Menu): 1601 bl_label = "Select" 1602 1603 def draw (self, _context): 1604 layout = self.layout 1605 1606 layout. operator ( "curve.select_all" , text= "All" ).action = 'SELECT' 1607 layout. operator ( "curve.select_all" , text= "None" ).action = 'DESELECT' 1608 layout. operator ( "curve.select_all" , text= "Invert" ).action = 'INVERT' 1609 1610 layout. separator () 1611 1612 layout. operator ( "view3d.select_box" ) 1613 layout. operator ( "view3d.select_circle" ) 1614 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1615 1616 layout. separator () 1617 1618 layout. operator ( "curve.select_random" ) 1619 layout. operator ( "curve.select_nth" ) 1620 layout. operator ( "curve.select_linked" , text= "Select Linked" ) 1621 layout. operator ( "curve.select_similar" , text= "Select Similar" ) 1622 1623 layout. separator () 1624 1625 layout. operator ( "curve.de_select_first" ) 1626 layout. operator ( "curve.de_select_last" ) 1627 layout. operator ( "curve.select_next" ) 1628 layout. operator ( "curve.select_previous" ) 1629 1630 layout. separator () 1631 1632 layout. operator ( "curve.select_more" ) 1633 layout. operator ( "curve.select_less" ) 1634 1635 1636 class VIEW3D_MT_select_edit_surface (Menu): 1637 bl_label = "Select" 1638 1639 def draw (self, _context): 1640 layout = self.layout 1641 1642 layout. operator ( "curve.select_all" , text= "All" ).action = 'SELECT' 1643 layout. operator ( "curve.select_all" , text= "None" ).action = 'DESELECT' 1644 layout. operator ( "curve.select_all" , text= "Invert" ).action = 'INVERT' 1645 1646 layout. separator () 1647 1648 layout. operator ( "view3d.select_box" ) 1649 layout. operator ( "view3d.select_circle" ) 1650 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1651 1652 layout. separator () 1653 1654 layout. operator ( "curve.select_random" ) 1655 layout. operator ( "curve.select_nth" ) 1656 layout. operator ( "curve.select_linked" , text= "Select Linked" ) 1657 layout. operator ( "curve.select_similar" , text= "Select Similar" ) 1658 1659 layout. separator () 1660 1661 layout. operator ( "curve.select_row" ) 1662 1663 layout. separator () 1664 1665 layout. operator ( "curve.select_more" ) 1666 layout. operator ( "curve.select_less" ) 1667 1668 1669 class VIEW3D_MT_select_edit_text (Menu): 1670 bl_label = "Select" 1671 1672 def draw (self, _context): 1673 layout = self.layout 1674 1675 layout. operator ( "font.select_all" , text= "All" ) 1676 1677 layout. separator () 1678 1679 layout. operator ( "font.move_select" , text= "Previous Block" ). type = 'PREVIOUS_PAGE' 1680 layout. operator ( "font.move_select" , text= "Next Block" ). type = 'NEXT_PAGE' 1681 1682 layout. separator () 1683 1684 layout. operator ( "font.move_select" , text= "Line Begin" ). type = 'LINE_BEGIN' 1685 layout. operator ( "font.move_select" , text= "Line End" ). type = 'LINE_END' 1686 1687 layout. separator () 1688 1689 layout. operator ( "font.move_select" , text= "Previous Line" ). type = 'PREVIOUS_LINE' 1690 layout. operator ( "font.move_select" , text= "Next Line" ). type = 'NEXT_LINE' 1691 1692 layout. separator () 1693 1694 layout. operator ( "font.move_select" , text= "Previous Word" ). type = 'PREVIOUS_WORD' 1695 layout. operator ( "font.move_select" , text= "Next Word" ). type = 'NEXT_WORD' 1696 1697 1698 class VIEW3D_MT_select_edit_metaball (Menu): 1699 bl_label = "Select" 1700 1701 def draw (self, _context): 1702 layout = self.layout 1703 1704 layout. operator ( "mball.select_all" , text= "All" ).action = 'SELECT' 1705 layout. operator ( "mball.select_all" , text= "None" ).action = 'DESELECT' 1706 layout. operator ( "mball.select_all" , text= "Invert" ).action = 'INVERT' 1707 1708 layout. separator () 1709 1710 layout. operator ( "view3d.select_box" ) 1711 layout. operator ( "view3d.select_circle" ) 1712 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1713 1714 layout. separator () 1715 1716 layout. operator ( "mball.select_random_metaelems" ) 1717 1718 layout. separator () 1719 1720 layout. operator_menu_enum ( "mball.select_similar" , "type" , text= "Similar" ) 1721 1722 1723 class VIEW3D_MT_edit_lattice_context_menu (Menu): 1724 bl_label = "Lattice Context Menu" 1725 1726 def draw (self, _context): 1727 layout = self.layout 1728 1729 layout = self.layout 1730 1731 layout. menu ( "VIEW3D_MT_mirror" ) 1732 layout. operator_menu_enum ( "lattice.flip" , "axis" ) 1733 layout. menu ( "VIEW3D_MT_snap" ) 1734 1735 layout. separator () 1736 1737 layout. operator ( "lattice.make_regular" ) 1738 1739 1740 class VIEW3D_MT_select_edit_lattice (Menu): 1741 bl_label = "Select" 1742 1743 def draw (self, _context): 1744 layout = self.layout 1745 1746 layout. operator ( "lattice.select_all" , text= "All" ).action = 'SELECT' 1747 layout. operator ( "lattice.select_all" , text= "None" ).action = 'DESELECT' 1748 layout. operator ( "lattice.select_all" , text= "Invert" ).action = 'INVERT' 1749 1750 layout. separator () 1751 1752 layout. operator ( "view3d.select_box" ) 1753 layout. operator ( "view3d.select_circle" ) 1754 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1755 1756 layout. separator () 1757 1758 layout. operator ( "lattice.select_mirror" ) 1759 layout. operator ( "lattice.select_random" ) 1760 1761 layout. separator () 1762 1763 layout. operator ( "lattice.select_more" ) 1764 layout. operator ( "lattice.select_less" ) 1765 1766 layout. separator () 1767 1768 layout. operator ( "lattice.select_ungrouped" , text= "Ungrouped Vertices" ) 1769 1770 1771 class VIEW3D_MT_select_edit_armature (Menu): 1772 bl_label = "Select" 1773 1774 def draw (self, _context): 1775 layout = self.layout 1776 1777 layout. operator ( "armature.select_all" , text= "All" ).action = 'SELECT' 1778 layout. operator ( "armature.select_all" , text= "None" ).action = 'DESELECT' 1779 layout. operator ( "armature.select_all" , text= "Invert" ).action = 'INVERT' 1780 1781 layout. separator () 1782 1783 layout. operator ( "view3d.select_box" ) 1784 layout. operator ( "view3d.select_circle" ) 1785 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1786 1787 layout. separator () 1788 1789 layout. operator ( "armature.select_mirror" ) 1790 1791 layout. separator () 1792 1793 layout. operator ( "armature.select_more" , text= "More" ) 1794 layout. operator ( "armature.select_less" , text= "Less" ) 1795 1796 layout. separator () 1797 1798 layout. operator ( "armature.select_linked" , text= "Linked" ) 1799 1800 layout. separator () 1801 1802 props = layout. operator ( "armature.select_hierarchy" , text= "Parent" ) 1803 props.extend = False 1804 props.direction = 'PARENT' 1805 1806 props = layout. operator ( "armature.select_hierarchy" , text= "Child" ) 1807 props.extend = False 1808 props.direction = 'CHILD' 1809 1810 layout. separator () 1811 1812 props = layout. operator ( "armature.select_hierarchy" , text= "Extend Parent" ) 1813 props.extend = True 1814 props.direction = 'PARENT' 1815 1816 props = layout. operator ( "armature.select_hierarchy" , text= "Extend Child" ) 1817 props.extend = True 1818 props.direction = 'CHILD' 1819 1820 layout. operator_menu_enum ( "armature.select_similar" , "type" , text= "Similar" ) 1821 layout. operator ( "object.select_pattern" , text= "Select Pattern..." ) 1822 1823 1824 class VIEW3D_MT_paint_gpencil (Menu): 1825 bl_label = "Paint" 1826 1827 def draw (self, _context): 1828 layout = self.layout 1829 1830 layout. operator ( "gpencil.vertex_color_set" , text= "Set Vertex Colors" ) 1831 layout. operator ( "gpencil.stroke_reset_vertex_color" ) 1832 layout. separator () 1833 layout. operator ( "gpencil.vertex_color_invert" , text= "Invert" ) 1834 layout. operator ( "gpencil.vertex_color_levels" , text= "Levels" ) 1835 layout. operator ( "gpencil.vertex_color_hsv" , text= "Hue Saturation Value" ) 1836 layout. operator ( "gpencil.vertex_color_brightness_contrast" , text= "Bright/Contrast" ) 1837 1838 1839 class VIEW3D_MT_select_gpencil (Menu): 1840 bl_label = "Select" 1841 1842 def draw (self, context): 1843 layout = self.layout 1844 1845 layout. operator ( "gpencil.select_all" , text= "All" ).action = 'SELECT' 1846 layout. operator ( "gpencil.select_all" , text= "None" ).action = 'DESELECT' 1847 layout. operator ( "gpencil.select_all" , text= "Invert" ).action = 'INVERT' 1848 1849 layout. separator () 1850 1851 layout. operator ( "gpencil.select_box" ) 1852 layout. operator ( "gpencil.select_circle" ) 1853 layout. operator_menu_enum ( "gpencil.select_lasso" , "mode" ) 1854 1855 layout. separator () 1856 1857 layout. operator ( "gpencil.select_linked" , text= "Linked" ) 1858 layout. operator ( "gpencil.select_alternate" ) 1859 layout. operator ( "gpencil.select_random" ) 1860 layout. operator_menu_enum ( "gpencil.select_grouped" , "type" , text= "Grouped" ) 1861 1862 if context.mode == 'VERTEX_GPENCIL' : 1863 layout. operator ( "gpencil.select_vertex_color" , text= "Vertex Color" ) 1864 1865 layout. separator () 1866 1867 layout. operator ( "gpencil.select_first" ) 1868 layout. operator ( "gpencil.select_last" ) 1869 1870 layout. separator () 1871 1872 layout. operator ( "gpencil.select_more" ) 1873 layout. operator ( "gpencil.select_less" ) 1874 1875 1876 class VIEW3D_MT_select_paint_mask (Menu): 1877 bl_label = "Select" 1878 1879 def draw (self, _context): 1880 layout = self.layout 1881 1882 layout. operator ( "paint.face_select_all" , text= "All" ).action = 'SELECT' 1883 layout. operator ( "paint.face_select_all" , text= "None" ).action = 'DESELECT' 1884 layout. operator ( "paint.face_select_all" , text= "Invert" ).action = 'INVERT' 1885 1886 layout. separator () 1887 1888 layout. operator ( "view3d.select_box" ) 1889 layout. operator ( "view3d.select_circle" ) 1890 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1891 1892 layout. separator () 1893 1894 layout. operator ( "paint.face_select_linked" , text= "Linked" ) 1895 1896 1897 class VIEW3D_MT_select_paint_mask_vertex (Menu): 1898 bl_label = "Select" 1899 1900 def draw (self, _context): 1901 layout = self.layout 1902 1903 layout. operator ( "paint.vert_select_all" , text= "All" ).action = 'SELECT' 1904 layout. operator ( "paint.vert_select_all" , text= "None" ).action = 'DESELECT' 1905 layout. operator ( "paint.vert_select_all" , text= "Invert" ).action = 'INVERT' 1906 1907 layout. separator () 1908 1909 layout. operator ( "view3d.select_box" ) 1910 layout. operator ( "view3d.select_circle" ) 1911 layout. operator_menu_enum ( "view3d.select_lasso" , "mode" ) 1912 1913 layout. separator () 1914 1915 layout. operator ( "paint.vert_select_ungrouped" , text= "Ungrouped Vertices" ) 1916 1917 1918 class VIEW3D_MT_angle_control (Menu): 1919 bl_label = "Angle Control" 1920 1921 @classmethod 1922 def poll (cls, context): 1923 settings = UnifiedPaintPanel. paint_settings (context) 1924 if not settings: 1925 return False 1926 1927 brush = settings.brush 1928 tex_slot = brush.texture_slot 1929 1930 return tex_slot.has_texture_angle and tex_slot.has_texture_angle_source 1931 1932 def draw (self, context): 1933 layout = self.layout 1934 1935 settings = UnifiedPaintPanel. paint_settings (context) 1936 brush = settings.brush 1937 1938 sculpt = (context.sculpt_object is not None ) 1939 1940 tex_slot = brush.texture_slot 1941 1942 layout. prop (tex_slot, "use_rake" , text= "Rake" ) 1943 1944 if brush.brush_capabilities.has_random_texture_angle and tex_slot.has_random_texture_angle: 1945 if sculpt: 1946 if brush.sculpt_capabilities.has_random_texture_angle: 1947 layout. prop (tex_slot, "use_random" , text= "Random" ) 1948 else : 1949 layout. prop (tex_slot, "use_random" , text= "Random" ) 1950 1951 1952 class VIEW3D_MT_mesh_add (Menu): 1953 bl_idname = "VIEW3D_MT_mesh_add" 1954 bl_label = "Mesh" 1955 1956 def draw (self, _context): 1957 layout = self.layout 1958 1959 layout.operator_context = 'INVOKE_REGION_WIN' 1960 1961 layout. operator ( "mesh.primitive_plane_add" , text= "Plane" , icon= 'MESH_PLANE' ) 1962 layout. operator ( "mesh.primitive_cube_add" , text= "Cube" , icon= 'MESH_CUBE' ) 1963 layout. operator ( "mesh.primitive_circle_add" , text= "Circle" , icon= 'MESH_CIRCLE' ) 1964 layout. operator ( "mesh.primitive_uv_sphere_add" , text= "UV Sphere" , icon= 'MESH_UVSPHERE' ) 1965 layout. operator ( "mesh.primitive_ico_sphere_add" , text= "Ico Sphere" , icon= 'MESH_ICOSPHERE' ) 1966 layout. operator ( "mesh.primitive_cylinder_add" , text= "Cylinder" , icon= 'MESH_CYLINDER' ) 1967 layout. operator ( "mesh.primitive_cone_add" , text= "Cone" , icon= 'MESH_CONE' ) 1968 layout. operator ( "mesh.primitive_torus_add" , text= "Torus" , icon= 'MESH_TORUS' ) 1969 1970 layout. separator () 1971 1972 layout. operator ( "mesh.primitive_grid_add" , text= "Grid" , icon= 'MESH_GRID' ) 1973 layout. operator ( "mesh.primitive_monkey_add" , text= "Monkey" , icon= 'MESH_MONKEY' ) 1974 1975 1976 class VIEW3D_MT_curve_add (Menu): 1977 bl_idname = "VIEW3D_MT_curve_add" 1978 bl_label = "Curve" 1979 1980 def draw (self, _context): 1981 layout = self.layout 1982 1983 layout.operator_context = 'INVOKE_REGION_WIN' 1984 1985 layout. operator ( "curve.primitive_bezier_curve_add" , text= "Bezier" , icon= 'CURVE_BEZCURVE' ) 1986 layout. operator ( "curve.primitive_bezier_circle_add" , text= "Circle" , icon= 'CURVE_BEZCIRCLE' ) 1987 1988 layout. separator () 1989 1990 layout. operator ( "curve.primitive_nurbs_curve_add" , text= "Nurbs Curve" , icon= 'CURVE_NCURVE' ) 1991 layout. operator ( "curve.primitive_nurbs_circle_add" , text= "Nurbs Circle" , icon= 'CURVE_NCIRCLE' ) 1992 layout. operator ( "curve.primitive_nurbs_path_add" , text= "Path" , icon= 'CURVE_PATH' ) 1993 1994 1995 class VIEW3D_MT_surface_add (Menu): 1996 bl_idname = "VIEW3D_MT_surface_add" 1997 bl_label = "Surface" 1998 1999 def draw (self, _context): 2000 layout = self.layout 2001 2002 layout.operator_context = 'INVOKE_REGION_WIN' 2003 2004 layout. operator ( "surface.primitive_nurbs_surface_curve_add" , text= "Nurbs Curve" , icon= 'SURFACE_NCURVE' ) 2005 layout. operator ( "surface.primitive_nurbs_surface_circle_add" , text= "Nurbs Circle" , icon= 'SURFACE_NCIRCLE' ) 2006 layout. operator ( "surface.primitive_nurbs_surface_surface_add" , text= "Nurbs Surface" , icon= 'SURFACE_NSURFACE' ) 2007 layout. operator ( "surface.primitive_nurbs_surface_cylinder_add" , 2008 text= "Nurbs Cylinder" , icon= 'SURFACE_NCYLINDER' ) 2009 layout. operator ( "surface.primitive_nurbs_surface_sphere_add" , text= "Nurbs Sphere" , icon= 'SURFACE_NSPHERE' ) 2010 layout. operator ( "surface.primitive_nurbs_surface_torus_add" , text= "Nurbs Torus" , icon= 'SURFACE_NTORUS' ) 2011 2012 2013 class VIEW3D_MT_edit_metaball_context_menu (Menu): 2014 bl_label = "Metaball Context Menu" 2015 2016 def draw (self, _context): 2017 layout = self.layout 2018 2019 layout.operator_context = 'INVOKE_REGION_WIN' 2020 2021 # Add 2022 layout. operator ( "mball.duplicate_move" ) 2023 2024 layout. separator () 2025 2026 # Modify 2027 layout. menu ( "VIEW3D_MT_mirror" ) 2028 layout. menu ( "VIEW3D_MT_snap" ) 2029 2030 layout. separator () 2031 2032 # Remove 2033 layout.operator_context = 'EXEC_REGION_WIN' 2034 layout. operator ( "mball.delete_metaelems" , text= "Delete" ) 2035 2036 2037 class VIEW3D_MT_metaball_add (Menu): 2038 bl_idname = "VIEW3D_MT_metaball_add" 2039 bl_label = "Metaball" 2040 2041 def draw (self, _context): 2042 layout = self.layout 2043 2044 layout.operator_context = 'INVOKE_REGION_WIN' 2045 layout. operator_enum ( "object.metaball_add" , "type" ) 2046 2047 2048 class TOPBAR_MT_edit_curve_add (Menu): 2049 bl_idname = "TOPBAR_MT_edit_curve_add" 2050 bl_label = "Add" 2051 bl_translation_context = i18n_contexts.operator_default 2052 2053 def draw (self, context): 2054 is_surf = context.active_object. type == 'SURFACE' 2055 2056 layout = self.layout 2057 layout.operator_context = 'EXEC_REGION_WIN' 2058 2059 if is_surf: 2060 VIEW3D_MT_surface_add. draw (self, context) 2061 else : 2062 VIEW3D_MT_curve_add. draw (self, context) 2063 2064 2065 class TOPBAR_MT_edit_armature_add (Menu): 2066 bl_idname = "TOPBAR_MT_edit_armature_add" 2067 bl_label = "Armature" 2068 2069 def draw (self, _context): 2070 layout = self.layout 2071 2072 layout.operator_context = 'EXEC_REGION_WIN' 2073 layout. operator ( "armature.bone_primitive_add" , text= "Single Bone" , icon= 'BONE_DATA' ) 2074 2075 2076 class VIEW3D_MT_armature_add (Menu): 2077 bl_idname = "VIEW3D_MT_armature_add" 2078 bl_label = "Armature" 2079 2080 def draw (self, _context): 2081 layout = self.layout 2082 2083 layout.operator_context = 'EXEC_REGION_WIN' 2084 layout. operator ( "object.armature_add" , text= "Single Bone" , icon= 'BONE_DATA' ) 2085 2086 2087 class VIEW3D_MT_light_add (Menu): 2088 bl_idname = "VIEW3D_MT_light_add" 2089 bl_label = "Light" 2090 2091 def draw (self, _context): 2092 layout = self.layout 2093 2094 layout.operator_context = 'INVOKE_REGION_WIN' 2095 layout. operator_enum ( "object.light_add" , "type" ) 2096 2097 2098 class VIEW3D_MT_lightprobe_add (Menu): 2099 bl_idname = "VIEW3D_MT_lightprobe_add" 2100 bl_label = "Light Probe" 2101 2102 def draw (self, _context): 2103 layout = self.layout 2104 2105 layout.operator_context = 'INVOKE_REGION_WIN' 2106 layout. operator_enum ( "object.lightprobe_add" , "type" ) 2107 2108 2109 class VIEW3D_MT_camera_add (Menu): 2110 bl_idname = "VIEW3D_MT_camera_add" 2111 bl_label = "Camera" 2112 2113 def draw (self, _context): 2114 layout = self.layout 2115 layout.operator_context = 'EXEC_REGION_WIN' 2116 layout. operator ( "object.camera_add" , text= "Camera" , icon= 'OUTLINER_OB_CAMERA' ) 2117 2118 2119 class VIEW3D_MT_volume_add (Menu): 2120 bl_idname = "VIEW3D_MT_volume_add" 2121 bl_label = "Volume" 2122 2123 def draw (self, _context): 2124 layout = self.layout 2125 layout. operator ( "object.volume_import" , text= "Import OpenVDB..." , icon= 'OUTLINER_DATA_VOLUME' ) 2126 layout. operator ( "object.volume_add" , text= "Empty" , icon= 'OUTLINER_DATA_VOLUME' ) 2127 2128 2129 class VIEW3D_MT_add (Menu): 2130 bl_label = "Add" 2131 bl_translation_context = i18n_contexts.operator_default 2132 2133 def draw (self, context): 2134 layout = self.layout 2135 2136 # note, don't use 'EXEC_SCREEN' or operators won't get the 'v3d' context. 2137 2138 # Note: was EXEC_AREA, but this context does not have the 'rv3d', which prevents 2139 # "align_view" to work on first call (see T32719). 2140 layout.operator_context = 'EXEC_REGION_WIN' 2141 2142 # layout.operator_menu_enum("object.mesh_add", "type", text="Mesh", icon='OUTLINER_OB_MESH') 2143 layout. menu ( "VIEW3D_MT_mesh_add" , icon= 'OUTLINER_OB_MESH' ) 2144 2145 # layout.operator_menu_enum("object.curve_add", "type", text="Curve", icon='OUTLINER_OB_CURVE') 2146 layout. menu ( "VIEW3D_MT_curve_add" , icon= 'OUTLINER_OB_CURVE' ) 2147 # layout.operator_menu_enum("object.surface_add", "type", text="Surface", icon='OUTLINER_OB_SURFACE') 2148 layout. menu ( "VIEW3D_MT_surface_add" , icon= 'OUTLINER_OB_SURFACE' ) 2149 layout. menu ( "VIEW3D_MT_metaball_add" , text= "Metaball" , icon= 'OUTLINER_OB_META' ) 2150 layout. operator ( "object.text_add" , text= "Text" , icon= 'OUTLINER_OB_FONT' ) 2151 if context.preferences.experimental.use_new_hair_type: 2152 layout. operator ( "object.hair_add" , text= "Hair" , icon= 'OUTLINER_OB_HAIR' ) 2153 if context.preferences.experimental.use_new_point_cloud_type: 2154 layout. operator ( "object.pointcloud_add" , text= "Point Cloud" , icon= 'OUTLINER_OB_POINTCLOUD' ) 2155 layout. menu ( "VIEW3D_MT_volume_add" , text= "Volume" , icon= 'OUTLINER_OB_VOLUME' ) 2156 layout. operator_menu_enum ( "object.gpencil_add" , "type" , text= "Grease Pencil" , icon= 'OUTLINER_OB_GREASEPENCIL' ) 2157 2158 layout. separator () 2159 2160 if VIEW3D_MT_armature_add. is_extended (): 2161 layout. menu ( "VIEW3D_MT_armature_add" , icon= 'OUTLINER_OB_ARMATURE' ) 2162 else : 2163 layout. operator ( "object.armature_add" , text= "Armature" , icon= 'OUTLINER_OB_ARMATURE' ) 2164 2165 layout. operator ( "object.add" , text= "Lattice" , icon= 'OUTLINER_OB_LATTICE' ). type = 'LATTICE' 2166 2167 layout. separator () 2168 2169 layout. operator_menu_enum ( "object.empty_add" , "type" , text= "Empty" , icon= 'OUTLINER_OB_EMPTY' ) 2170 layout. menu ( "VIEW3D_MT_image_add" , text= "Image" , icon= 'OUTLINER_OB_IMAGE' ) 2171 2172 layout. separator () 2173 2174 layout. menu ( "VIEW3D_MT_light_add" , icon= 'OUTLINER_OB_LIGHT' ) 2175 layout. menu ( "VIEW3D_MT_lightprobe_add" , icon= 'OUTLINER_OB_LIGHTPROBE' ) 2176 2177 layout. separator () 2178 2179 if VIEW3D_MT_camera_add. is_extended (): 2180 layout. menu ( "VIEW3D_MT_camera_add" , icon= 'OUTLINER_OB_CAMERA' ) 2181 else : 2182 VIEW3D_MT_camera_add. draw (self, context) 2183 2184 layout. separator () 2185 2186 layout. operator ( "object.speaker_add" , text= "Speaker" , icon= 'OUTLINER_OB_SPEAKER' ) 2187 2188 layout. separator () 2189 2190 layout. operator_menu_enum ( "object.effector_add" , "type" , text= "Force Field" , icon= 'OUTLINER_OB_FORCE_FIELD' ) 2191 2192 layout. separator () 2193 2194 has_collections = bool (bpy.data.collections) 2195 col = layout. column () 2196 col.enabled = has_collections 2197 2198 if not has_collections or len (bpy.data.collections) > 10 : 2199 col.operator_context = 'INVOKE_REGION_WIN' 2200 col. operator ( 2201 "object.collection_instance_add" , 2202 text= "Collection Instance..." if has_collections else "No Collections to Instance" , 2203 icon= 'OUTLINER_OB_GROUP_INSTANCE' , 2204 ) 2205 else : 2206 col. operator_menu_enum ( 2207 "object.collection_instance_add" , 2208 "collection" , 2209 text= "Collection Instance" , 2210 icon= 'OUTLINER_OB_GROUP_INSTANCE' , 2211 ) 2212 2213 2214 class VIEW3D_MT_image_add (Menu): 2215 bl_label = "Add Image" 2216 2217 def draw (self, _context): 2218 layout = self.layout 2219 layout. operator ( "object.load_reference_image" , text= "Reference" , icon= 'IMAGE_REFERENCE' ) 2220 layout. operator ( "object.load_background_image" , text= "Background" , icon= 'IMAGE_BACKGROUND' ) 2221 2222 2223 class VIEW3D_MT_object_relations (Menu): 2224 bl_label = "Relations" 2225 2226 def draw (self, _context): 2227 layout = self.layout 2228 2229 layout. operator ( "object.make_override_library" , text= "Make Library Override..." ) 2230 2231 layout. operator ( "object.convert_proxy_to_override" ) 2232 2233 layout. operator ( "object.make_dupli_face" ) 2234 2235 layout. separator () 2236 2237 layout. operator_menu_enum ( "object.make_local" , "type" , text= "Make Local..." ) 2238 layout. menu ( "VIEW3D_MT_make_single_user" ) 2239 2240 2241 class VIEW3D_MT_object (Menu): 2242 bl_context = "objectmode" 2243 bl_label = "Object" 2244 2245 def draw (self, _context): 2246 layout = self.layout 2247 2248 layout. menu ( "VIEW3D_MT_transform_object" ) 2249 layout. operator_menu_enum ( "object.origin_set" , text= "Set Origin" , property = "type" ) 2250 layout. menu ( "VIEW3D_MT_mirror" ) 2251 layout. menu ( "VIEW3D_MT_object_clear" ) 2252 layout. menu ( "VIEW3D_MT_object_apply" ) 2253 layout. menu ( "VIEW3D_MT_snap" ) 2254 2255 layout. separator () 2256 2257 layout. operator ( "object.duplicate_move" ) 2258 layout. operator ( "object.duplicate_move_linked" ) 2259 layout. operator ( "object.join" ) 2260 2261 layout. separator () 2262 2263 layout. operator ( "view3d.copybuffer" , text= "Copy Objects" , icon= 'COPYDOWN' ) 2264 layout. operator ( "view3d.pastebuffer" , text= "Paste Objects" , icon= 'PASTEDOWN' ) 2265 2266 layout. separator () 2267 2268 layout. menu ( "VIEW3D_MT_object_asset" ) 2269 layout. menu ( "VIEW3D_MT_object_parent" ) 2270 layout. menu ( "VIEW3D_MT_object_collection" ) 2271 layout. menu ( "VIEW3D_MT_object_relations" ) 2272 layout. menu ( "VIEW3D_MT_object_constraints" ) 2273 layout. menu ( "VIEW3D_MT_object_track" ) 2274 layout. menu ( "VIEW3D_MT_make_links" ) 2275 2276 layout. separator () 2277 2278 layout. operator ( "object.shade_smooth" ) 2279 layout. operator ( "object.shade_flat" ) 2280 2281 layout. separator () 2282 2283 layout. menu ( "VIEW3D_MT_object_animation" ) 2284 layout. menu ( "VIEW3D_MT_object_rigid_body" ) 2285 2286 layout. separator () 2287 2288 layout. menu ( "VIEW3D_MT_object_quick_effects" ) 2289 2290 layout. separator () 2291 2292 layout. menu ( "VIEW3D_MT_object_convert" ) 2293 2294 layout. separator () 2295 2296 layout. menu ( "VIEW3D_MT_object_showhide" ) 2297 layout. menu ( "VIEW3D_MT_object_cleanup" ) 2298 2299 layout. separator () 2300 2301 layout.operator_context = 'EXEC_REGION_WIN' 2302 layout. operator ( "object.delete" , text= "Delete" ).use_global = False 2303 layout. operator ( "object.delete" , text= "Delete Global" ).use_global = True 2304 2305 2306 class VIEW3D_MT_object_animation (Menu): 2307 bl_label = "Animation" 2308 2309 def draw (self, _context): 2310 layout = self.layout 2311 2312 layout. operator ( "anim.keyframe_insert_menu" , text= "Insert Keyframe..." ) 2313 layout. operator ( "anim.keyframe_delete_v3d" , text= "Delete Keyframes..." ) 2314 layout. operator ( "anim.keyframe_clear_v3d" , text= "Clear Keyframes..." ) 2315 layout. operator ( "anim.keying_set_active_set" , text= "Change Keying Set..." ) 2316 2317 layout. separator () 2318 2319 layout. operator ( "nla.bake" , text= "Bake Action..." ) 2320 layout. operator ( "gpencil.bake_mesh_animation" , text= "Bake Mesh to Grease Pencil..." ) 2321 layout. operator ( "gpencil.bake_grease_pencil_animation" , text= "Bake Object Transform to Grease Pencil..." ) 2322 2323 2324 class VIEW3D_MT_object_rigid_body (Menu): 2325 bl_label = "Rigid Body" 2326 2327 def draw (self, _context): 2328 layout = self.layout 2329 2330 layout. operator ( "rigidbody.objects_add" , text= "Add Active" ). type = 'ACTIVE' 2331 layout. operator ( "rigidbody.objects_add" , text= "Add Passive" ). type = 'PASSIVE' 2332 2333 layout. separator () 2334 2335 layout. operator ( "rigidbody.objects_remove" , text= "Remove" ) 2336 2337 layout. separator () 2338 2339 layout. operator ( "rigidbody.shape_change" , text= "Change Shape" ) 2340 layout. operator ( "rigidbody.mass_calculate" , text= "Calculate Mass" ) 2341 layout. operator ( "rigidbody.object_settings_copy" , text= "Copy from Active" ) 2342 layout. operator ( "object.visual_transform_apply" , text= "Apply Transformation" ) 2343 layout. operator ( "rigidbody.bake_to_keyframes" , text= "Bake to Keyframes" ) 2344 2345 layout. separator () 2346 2347 layout. operator ( "rigidbody.connect" , text= "Connect" ) 2348 2349 2350 class VIEW3D_MT_object_clear (Menu): 2351 bl_label = "Clear" 2352 2353 def draw (self, _context): 2354 layout = self.layout 2355 2356 layout. operator ( "object.location_clear" , text= "Location" ).clear_delta = False 2357 layout. operator ( "object.rotation_clear" , text= "Rotation" ).clear_delta = False 2358 layout. operator ( "object.scale_clear" , text= "Scale" ).clear_delta = False 2359 2360 layout. separator () 2361 2362 layout. operator ( "object.origin_clear" , text= "Origin" ) 2363 2364 2365 class VIEW3D_MT_object_context_menu (Menu): 2366 bl_label = "Object Context Menu" 2367 2368 def draw (self, context): 2369 2370 layout = self.layout 2371 view = context.space_data 2372 2373 obj = context. object 2374 2375 selected_objects_len = len (context.selected_objects) 2376 2377 # If nothing is selected 2378 # (disabled for now until it can be made more useful). 2379 ''' 2380 if selected_objects_len == 0: 2381 2382 layout.menu("VIEW3D_MT_add", text="Add", text_ctxt=i18n_contexts.operator_default) 2383 layout.operator("view3d.pastebuffer", text="Paste Objects", icon='PASTEDOWN') 2384 2385 return 2386 ''' 2387 2388 # If something is selected 2389 2390 # Individual object types. 2391 if obj is None : 2392 pass 2393 2394 elif obj. type == 'CAMERA' : 2395 layout.operator_context = 'INVOKE_REGION_WIN' 2396 2397 layout. operator ( "view3d.object_as_camera" , text= "Set Active Camera" ) 2398 2399 if obj.data. type == 'PERSP' : 2400 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Focal Length" ) 2401 props.data_path_iter = "selected_editable_objects" 2402 props.data_path_item = "data.lens" 2403 props.input_scale = 0.1 2404 if obj.data.lens_unit == 'MILLIMETERS' : 2405 props.header_text = "Camera Focal Length: %.1fmm" 2406 else : 2407 props.header_text = "Camera Focal Length: %.1f\u00B0" 2408 2409 else : 2410 props = layout. operator ( "wm.context_modal_mouse" , text= "Camera Lens Scale" ) 2411 props.data_path_iter = "selected_editable_objects" 2412 props.data_path_item = "data.ortho_scale" 2413 props.input_scale = 0.01 2414 props.header_text = "Camera Lens Scale: %.3f" 2415 2416 if not obj.data.dof.focus_object: 2417 if view and view.camera == obj and view.region_3d.view_perspective == 'CAMERA' : 2418 props = layout. operator ( "ui.eyedropper_depth" , text= "DOF Distance (Pick)" ) 2419 else : 2420 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Focus Distance" ) 2421 props.data_path_iter = "selected_editable_objects" 2422 props.data_path_item = "data.dof.focus_distance" 2423 props.input_scale = 0.02 2424 props.header_text = "Focus Distance: %.3f" 2425 2426 layout. separator () 2427 2428 elif obj. type in { 'CURVE' , 'FONT' }: 2429 layout.operator_context = 'INVOKE_REGION_WIN' 2430 2431 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Extrusion" ) 2432 props.data_path_iter = "selected_editable_objects" 2433 props.data_path_item = "data.extrude" 2434 props.input_scale = 0.01 2435 props.header_text = "Extrude: %.3f" 2436 2437 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Offset" ) 2438 props.data_path_iter = "selected_editable_objects" 2439 props.data_path_item = "data.offset" 2440 props.input_scale = 0.01 2441 props.header_text = "Offset: %.3f" 2442 2443 layout. separator () 2444 2445 elif obj. type == 'EMPTY' : 2446 layout.operator_context = 'INVOKE_REGION_WIN' 2447 2448 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Empty Display Size" ) 2449 props.data_path_iter = "selected_editable_objects" 2450 props.data_path_item = "empty_display_size" 2451 props.input_scale = 0.01 2452 props.header_text = "Empty Display Size: %.3f" 2453 2454 layout. separator () 2455 2456 if obj.empty_display_type == 'IMAGE' : 2457 layout. operator ( "gpencil.trace_image" ) 2458 2459 layout. separator () 2460 2461 elif obj. type == 'LIGHT' : 2462 light = obj.data 2463 2464 layout.operator_context = 'INVOKE_REGION_WIN' 2465 2466 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Light Power" ) 2467 props.data_path_iter = "selected_editable_objects" 2468 props.data_path_item = "data.energy" 2469 props.input_scale = 1.0 2470 props.header_text = "Light Power: %.3f" 2471 2472 if light. type == 'AREA' : 2473 if light.shape in { 'RECTANGLE' , 'ELLIPSE' }: 2474 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Area Light X Size" ) 2475 props.data_path_iter = "selected_editable_objects" 2476 props.data_path_item = "data.size" 2477 props.header_text = "Light Size X: %.3f" 2478 2479 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Area Light Y Size" ) 2480 props.data_path_iter = "selected_editable_objects" 2481 props.data_path_item = "data.size_y" 2482 props.header_text = "Light Size Y: %.3f" 2483 else : 2484 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Area Light Size" ) 2485 props.data_path_iter = "selected_editable_objects" 2486 props.data_path_item = "data.size" 2487 props.header_text = "Light Size: %.3f" 2488 2489 elif light. type in { 'SPOT' , 'POINT' }: 2490 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Light Radius" ) 2491 props.data_path_iter = "selected_editable_objects" 2492 props.data_path_item = "data.shadow_soft_size" 2493 props.header_text = "Light Radius: %.3f" 2494 2495 elif light. type == 'SUN' : 2496 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Sun Light Angle" ) 2497 props.data_path_iter = "selected_editable_objects" 2498 props.data_path_item = "data.angle" 2499 props.header_text = "Light Angle: %.3f" 2500 2501 if light. type == 'SPOT' : 2502 layout. separator () 2503 2504 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Spot Light Size" ) 2505 props.data_path_iter = "selected_editable_objects" 2506 props.data_path_item = "data.spot_size" 2507 props.input_scale = 0.01 2508 props.header_text = "Spot Size: %.2f" 2509 2510 props = layout. operator ( "wm.context_modal_mouse" , text= "Adjust Spot Light Blend" ) 2511 props.data_path_iter = "selected_editable_objects" 2512 props.data_path_item = "data.spot_blend" 2513 props.input_scale = - 0.01 2514 props.header_text = "Spot Blend: %.2f" 2515 2516 layout. separator () 2517 2518 # Shared among some object types. 2519 if obj is not None : 2520 if obj. type in { 'MESH' , 'CURVE' , 'SURFACE' }: 2521 layout. operator ( "object.shade_smooth" , text= "Shade Smooth" ) 2522 layout. operator ( "object.shade_flat" , text= "Shade Flat" ) 2523 2524 layout. separator () 2525 2526 if obj. type in { 'MESH' , 'CURVE' , 'SURFACE' , 'ARMATURE' , 'GPENCIL' }: 2527 if selected_objects_len > 1 : 2528 layout. operator ( "object.join" ) 2529 2530 if obj. type in { 'MESH' , 'CURVE' , 'SURFACE' , 'POINTCLOUD' , 'META' , 'FONT' }: 2531 layout. operator_menu_enum ( "object.convert" , "target" ) 2532 2533 if obj. type == 'GPENCIL' : 2534 layout. operator_menu_enum ( "gpencil.convert" , "type" , text= "Convert To" ) 2535 2536 if ( 2537 obj. type in { 'MESH' , 'CURVE' , 'SURFACE' , 'GPENCIL' , 'LATTICE' , 'ARMATURE' , 'META' , 'FONT' } or 2538 (obj. type == 'EMPTY' and obj.instance_collection is not None ) 2539 ): 2540 layout.operator_context = 'INVOKE_REGION_WIN' 2541 layout. operator_menu_enum ( "object.origin_set" , text= "Set Origin" , property = "type" ) 2542 layout.operator_context = 'INVOKE_DEFAULT' 2543 2544 layout. separator () 2545 2546 # Shared among all object types 2547 layout. operator ( "view3d.copybuffer" , text= "Copy Objects" , icon= 'COPYDOWN' ) 2548 layout. operator ( "view3d.pastebuffer" , text= "Paste Objects" , icon= 'PASTEDOWN' ) 2549 2550 layout. separator () 2551 2552 layout. operator ( "object.duplicate_move" , icon= 'DUPLICATE' ) 2553 layout. operator ( "object.duplicate_move_linked" ) 2554 2555 layout. separator () 2556 2557 props = layout. operator ( "wm.call_panel" , text= "Rename Active Object..." ) 2558 props.name = "TOPBAR_PT_name" 2559 props.keep_open = False 2560 2561 layout. separator () 2562 2563 layout. menu ( "VIEW3D_MT_mirror" ) 2564 layout. menu ( "VIEW3D_MT_snap" ) 2565 layout. menu ( "VIEW3D_MT_object_parent" ) 2566 layout.operator_context = 'INVOKE_REGION_WIN' 2567 2568 if view and view.local_view: 2569 layout. operator ( "view3d.localview_remove_from" ) 2570 else : 2571 layout. operator ( "object.move_to_collection" ) 2572 2573 layout. separator () 2574 2575 layout. operator ( "anim.keyframe_insert_menu" , text= "Insert Keyframe..." ) 2576 2577 layout. separator () 2578 2579 layout.operator_context = 'EXEC_REGION_WIN' 2580 layout. operator ( "object.delete" , text= "Delete" ).use_global = False 2581 2582 2583 class VIEW3D_MT_object_shading (Menu): 2584 # XXX, this menu is a place to store shading operator in object mode 2585 bl_label = "Shading" 2586 2587 def draw (self, _context): 2588 layout = self.layout 2589 layout. operator ( "object.shade_smooth" , text= "Smooth" ) 2590 layout. operator ( "object.shade_flat" , text= "Flat" ) 2591 2592 2593 class VIEW3D_MT_object_apply (Menu): 2594 bl_label = "Apply" 2595 2596 def draw (self, _context): 2597 layout = self.layout 2598 2599 props = layout. operator ( "object.transform_apply" , text= "Location" , text_ctxt=i18n_contexts.default) 2600 props.location, props.rotation, props.scale = True , False , False 2601 2602 props = layout. operator ( "object.transform_apply" , text= "Rotation" , text_ctxt=i18n_contexts.default) 2603 props.location, props.rotation, props.scale = False , True , False 2604 2605 props = layout. operator ( "object.transform_apply" , text= "Scale" , text_ctxt=i18n_contexts.default) 2606 props.location, props.rotation, props.scale = False , False , True 2607 2608 props = layout. operator ( "object.transform_apply" , text= "All Transforms" , text_ctxt=i18n_contexts.default) 2609 props.location, props.rotation, props.scale = True , True , True 2610 2611 props = layout. operator ( "object.transform_apply" , text= "Rotation & Scale" , text_ctxt=i18n_contexts.default) 2612 props.location, props.rotation, props.scale = False , True , True 2613 2614 layout. separator () 2615 2616 layout. operator ( 2617 "object.transforms_to_deltas" , 2618 text= "Location to Deltas" , 2619 text_ctxt=i18n_contexts.default, 2620 ).mode = 'LOC' 2621 layout. operator ( 2622 "object.transforms_to_deltas" , 2623 text= "Rotation to Deltas" , 2624 text_ctxt=i18n_contexts.default, 2625 ).mode = 'ROT' 2626 layout. operator ( 2627 "object.transforms_to_deltas" , 2628 text= "Scale to Deltas" , 2629 text_ctxt=i18n_contexts.default, 2630 ).mode = 'SCALE' 2631 2632 layout. operator ( 2633 "object.transforms_to_deltas" , 2634 text= "All Transforms to Deltas" , 2635 text_ctxt=i18n_contexts.default, 2636 ).mode = 'ALL' 2637 layout. operator ( "object.anim_transforms_to_deltas" ) 2638 2639 layout. separator () 2640 2641 layout. operator ( 2642 "object.visual_transform_apply" , 2643 text= "Visual Transform" , 2644 text_ctxt=i18n_contexts.default, 2645 ) 2646 layout. operator ( 2647 "object.convert" , 2648 text= "Visual Geometry to Mesh" , 2649 text_ctxt=i18n_contexts.default, 2650 ).target = 'MESH' 2651 layout. operator ( "object.duplicates_make_real" ) 2652 2653 2654 class VIEW3D_MT_object_parent (Menu): 2655 bl_label = "Parent" 2656 2657 def draw (self, _context): 2658 layout = self.layout 2659 operator_context_default = layout.operator_context 2660 2661 layout. operator_enum ( "object.parent_set" , "type" ) 2662 2663 layout. separator () 2664 2665 layout.operator_context = 'EXEC_REGION_WIN' 2666 layout. operator ( "object.parent_no_inverse_set" ) 2667 layout.operator_context = operator_context_default 2668 2669 layout. separator () 2670 2671 layout. operator_enum ( "object.parent_clear" , "type" ) 2672 2673 2674 class VIEW3D_MT_object_track (Menu): 2675 bl_label = "Track" 2676 2677 def draw (self, _context): 2678 layout = self.layout 2679 2680 layout. operator_enum ( "object.track_set" , "type" ) 2681 2682 layout. separator () 2683 2684 layout. operator_enum ( "object.track_clear" , "type" ) 2685 2686 2687 class VIEW3D_MT_object_collection (Menu): 2688 bl_label = "Collection" 2689 2690 def draw (self, _context): 2691 layout = self.layout 2692 2693 layout. operator ( "object.move_to_collection" ) 2694 layout. operator ( "object.link_to_collection" ) 2695 2696 layout. separator () 2697 2698 layout. operator ( "collection.create" ) 2699 # layout.operator_menu_enum("collection.objects_remove", "collection") # BUGGY 2700 layout. operator ( "collection.objects_remove" ) 2701 layout. operator ( "collection.objects_remove_all" ) 2702 2703 layout. separator () 2704 2705 layout. operator ( "collection.objects_add_active" ) 2706 layout. operator ( "collection.objects_remove_active" ) 2707 2708 2709 class VIEW3D_MT_object_constraints (Menu): 2710 bl_label = "Constraints" 2711 2712 def draw (self, _context): 2713 layout = self.layout 2714 2715 layout. operator ( "object.constraint_add_with_targets" ) 2716 layout. operator ( "object.constraints_copy" ) 2717 2718 layout. separator () 2719 2720 layout. operator ( "object.constraints_clear" ) 2721 2722 2723 class VIEW3D_MT_object_quick_effects (Menu): 2724 bl_label = "Quick Effects" 2725 2726 def draw (self, _context): 2727 layout = self.layout 2728 2729 layout. operator ( "object.quick_fur" ) 2730 layout. operator ( "object.quick_explode" ) 2731 layout. operator ( "object.quick_smoke" ) 2732 layout. operator ( "object.quick_liquid" ) 2733 2734 2735 class VIEW3D_MT_object_showhide (Menu): 2736 bl_label = "Show/Hide" 2737 2738 def draw (self, _context): 2739 layout = self.layout 2740 2741 layout. operator ( "object.hide_view_clear" ) 2742 2743 layout. separator () 2744 2745 layout. operator ( "object.hide_view_set" , text= "Hide Selected" ).unselected = False 2746 layout. operator ( "object.hide_view_set" , text= "Hide Unselected" ).unselected = True 2747 2748 2749 class VIEW3D_MT_object_cleanup (Menu): 2750 bl_label = "Clean Up" 2751 2752 def draw (self, _context): 2753 layout = self.layout 2754 2755 layout. operator ( "object.vertex_group_clean" , text= "Clean Vertex Group Weights" ).group_select_mode = 'ALL' 2756 layout. operator ( "object.vertex_group_limit_total" , text= "Limit Total Vertex Groups" ).group_select_mode = 'ALL' 2757 2758 layout. separator () 2759 2760 layout. operator ( "object.material_slot_remove_unused" , text= "Remove Unused Material Slots" ) 2761 2762 class VIEW3D_MT_object_asset (Menu): 2763 bl_label = "Asset" 2764 2765 def draw (self, _context): 2766 layout = self.layout 2767 2768 layout. operator ( "asset.mark" ) 2769 layout. operator ( "asset.clear" , text= "Clear Asset" ).set_fake_user = False 2770 layout. operator ( "asset.clear" , text= "Clear Asset (Set Fake User)" ).set_fake_user = True 2771 2772 2773 class VIEW3D_MT_make_single_user (Menu): 2774 bl_label = "Make Single User" 2775 2776 def draw (self, _context): 2777 layout = self.layout 2778 layout.operator_context = 'EXEC_REGION_WIN' 2779 2780 props = layout. operator ( "object.make_single_user" , text= "Object" ) 2781 props. object = True 2782 props.obdata = props.material = props.animation = props.obdata_animation = False 2783 2784 props = layout. operator ( "object.make_single_user" , text= "Object & Data" ) 2785 props. object = props.obdata = True 2786 props.material = props.animation = props.obdata_animation = False 2787 2788 props = layout. operator ( "object.make_single_user" , text= "Object & Data & Materials" ) 2789 props. object = props.obdata = props.material = True 2790 props.animation = props.obdata_animation = False 2791 2792 props = layout. operator ( "object.make_single_user" , text= "Materials" ) 2793 props.material = True 2794 props. object = props.obdata = props.animation = props.obdata_animation = False 2795 2796 props = layout. operator ( "object.make_single_user" , text= "Object Animation" ) 2797 props.animation = True 2798 props. object = props.obdata = props.material = props.obdata_animation = False 2799 2800 props = layout. operator ( "object.make_single_user" , text= "Object Data Animation" ) 2801 props.obdata_animation = props.obdata = True 2802 props. object = props.material = props.animation = False 2803 2804 2805 class VIEW3D_MT_object_convert (Menu): 2806 bl_label = "Convert" 2807 2808 def draw (self, context): 2809 layout = self.layout 2810 ob = context.active_object 2811 2812 if ob and ob. type == 'GPENCIL' and context.gpencil_data: 2813 layout. operator_enum ( "gpencil.convert" , "type" ) 2814 else : 2815 layout. operator_enum ( "object.convert" , "target" ) 2816 2817 # Potrace lib dependency. 2818 if bpy.app.build_options.potrace: 2819 layout. operator ( "gpencil.trace_image" , icon= 'OUTLINER_OB_GREASEPENCIL' ) 2820 2821 2822 class VIEW3D_MT_make_links (Menu): 2823 bl_label = "Link/Transfer Data" 2824 2825 def draw (self, _context): 2826 layout = self.layout 2827 operator_context_default = layout.operator_context 2828 2829 if len (bpy.data.scenes) > 10 : 2830 layout.operator_context = 'INVOKE_REGION_WIN' 2831 layout. operator ( "object.make_links_scene" , text= "Link Objects to Scene..." , icon= 'OUTLINER_OB_EMPTY' ) 2832 else : 2833 layout.operator_context = 'EXEC_REGION_WIN' 2834 layout. operator_menu_enum ( "object.make_links_scene" , "scene" , text= "Link Objects to Scene" ) 2835 2836 layout. separator () 2837 2838 layout.operator_context = operator_context_default 2839 2840 layout. operator_enum ( "object.make_links_data" , "type" ) # inline 2841 2842 layout. operator ( "object.join_uvs" , text= "Copy UV Maps" ) 2843 2844 layout. separator () 2845 2846 layout. operator ( "object.data_transfer" ) 2847 layout. operator ( "object.datalayout_transfer" ) 2848 2849 2850 class VIEW3D_MT_brush_paint_modes (Menu): 2851 bl_label = "Enabled Modes" 2852 2853 def draw (self, context): 2854 layout = self.layout 2855 2856 settings = UnifiedPaintPanel. paint_settings (context) 2857 brush = settings.brush 2858 2859 layout. prop (brush, "use_paint_sculpt" , text= "Sculpt" ) 2860 layout. prop (brush, "use_paint_uv_sculpt" , text= "UV Sculpt" ) 2861 layout. prop (brush, "use_paint_vertex" , text= "Vertex Paint" ) 2862 layout. prop (brush, "use_paint_weight" , text= "Weight Paint" ) 2863 layout. prop (brush, "use_paint_image" , text= "Texture Paint" ) 2864 2865 2866 class VIEW3D_MT_paint_vertex (Menu): 2867 bl_label = "Paint" 2868 2869 def draw (self, _context): 2870 layout = self.layout 2871 2872 layout. operator ( "paint.vertex_color_set" ) 2873 layout. operator ( "paint.vertex_color_smooth" ) 2874 layout. operator ( "paint.vertex_color_dirt" ) 2875 layout. operator ( "paint.vertex_color_from_weight" ) 2876 2877 layout. separator () 2878 2879 layout. operator ( "paint.vertex_color_invert" , text= "Invert" ) 2880 layout. operator ( "paint.vertex_color_levels" , text= "Levels" ) 2881 layout. operator ( "paint.vertex_color_hsv" , text= "Hue Saturation Value" ) 2882 layout. operator ( "paint.vertex_color_brightness_contrast" , text= "Bright/Contrast" ) 2883 2884 2885 class VIEW3D_MT_hook (Menu): 2886 bl_label = "Hooks" 2887 2888 def draw (self, context): 2889 layout = self.layout 2890 layout.operator_context = 'EXEC_AREA' 2891 layout. operator ( "object.hook_add_newob" ) 2892 layout. operator ( "object.hook_add_selob" ).use_bone = False 2893 layout. operator ( "object.hook_add_selob" , text= "Hook to Selected Object Bone" ).use_bone = True 2894 2895 if any ([mod. type == 'HOOK' for mod in context.active_object.modifiers]): 2896 layout. separator () 2897 2898 layout. operator_menu_enum ( "object.hook_assign" , "modifier" ) 2899 layout. operator_menu_enum ( "object.hook_remove" , "modifier" ) 2900 2901 layout. separator () 2902 2903 layout. operator_menu_enum ( "object.hook_select" , "modifier" ) 2904 layout. operator_menu_enum ( "object.hook_reset" , "modifier" ) 2905 layout. operator_menu_enum ( "object.hook_recenter" , "modifier" ) 2906 2907 2908 class VIEW3D_MT_vertex_group (Menu): 2909 bl_label = "Vertex Groups" 2910 2911 def draw (self, context): 2912 layout = self.layout 2913 2914 layout.operator_context = 'EXEC_AREA' 2915 layout. operator ( "object.vertex_group_assign_new" ) 2916 2917 ob = context.active_object 2918 if ob.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob. type == 'MESH' and ob.data.use_paint_mask_vertex): 2919 if ob.vertex_groups.active: 2920 layout. separator () 2921 2922 layout. operator ( "object.vertex_group_assign" , text= "Assign to Active Group" ) 2923 layout. operator ( 2924 "object.vertex_group_remove_from" , 2925 text= "Remove from Active Group" , 2926 ).use_all_groups = False 2927 layout. operator ( "object.vertex_group_remove_from" , text= "Remove from All" ).use_all_groups = True 2928 2929 if ob.vertex_groups.active: 2930 layout. separator () 2931 2932 layout. operator_menu_enum ( "object.vertex_group_set_active" , "group" , text= "Set Active Group" ) 2933 layout. operator ( "object.vertex_group_remove" , text= "Remove Active Group" ).all = False 2934 layout. operator ( "object.vertex_group_remove" , text= "Remove All Groups" ).all = True 2935 2936 2937 class VIEW3D_MT_gpencil_vertex_group (Menu): 2938 bl_label = "Vertex Groups" 2939 2940 def draw (self, context): 2941 layout = self.layout 2942 2943 layout.operator_context = 'EXEC_AREA' 2944 ob = context.active_object 2945 2946 layout. operator ( "object.vertex_group_add" , text= "Add New Group" ) 2947 ob = context.active_object 2948 if ob.vertex_groups.active: 2949 layout. separator () 2950 2951 layout. operator ( "gpencil.vertex_group_assign" , text= "Assign" ) 2952 layout. operator ( "gpencil.vertex_group_remove_from" , text= "Remove" ) 2953 2954 layout. operator ( "gpencil.vertex_group_select" , text= "Select" ) 2955 layout. operator ( "gpencil.vertex_group_deselect" , text= "Deselect" ) 2956 2957 2958 class VIEW3D_MT_paint_weight_lock (Menu): 2959 bl_label = "Vertex Group Locks" 2960 2961 def draw (self, _context): 2962 layout = self.layout 2963 2964 op = layout. operator ( "object.vertex_group_lock" , icon= 'LOCKED' , text= "Lock All" ) 2965 op.action, op.mask = 'LOCK' , 'ALL' 2966 op = layout. operator ( "object.vertex_group_lock" , icon= 'UNLOCKED' , text= "Unlock All" ) 2967 op.action, op.mask = 'UNLOCK' , 'ALL' 2968 op = layout. operator ( "object.vertex_group_lock" , icon= 'LOCKED' , text= "Lock Selected" ) 2969 op.action, op.mask = 'LOCK' , 'SELECTED' 2970 op = layout. operator ( "object.vertex_group_lock" , icon= 'UNLOCKED' , text= "Unlock Selected" ) 2971 op.action, op.mask = 'UNLOCK' , 'SELECTED' 2972 op = layout. operator ( "object.vertex_group_lock" , icon= 'LOCKED' , text= "Lock Unselected" ) 2973 op.action, op.mask = 'LOCK' , 'UNSELECTED' 2974 op = layout. operator ( "object.vertex_group_lock" , icon= 'UNLOCKED' , text= "Unlock Unselected" ) 2975 op.action, op.mask = 'UNLOCK' , 'UNSELECTED' 2976 op = layout. operator ( "object.vertex_group_lock" , text= "Lock Only Selected" ) 2977 op.action, op.mask = 'LOCK' , 'INVERT_UNSELECTED' 2978 op = layout. operator ( "object.vertex_group_lock" , text= "Lock Only Unselected" ) 2979 op.action, op.mask = 'UNLOCK' , 'INVERT_UNSELECTED' 2980 op = layout. operator ( "object.vertex_group_lock" , text= "Invert Locks" ) 2981 op.action, op.mask = 'INVERT' , 'ALL' 2982 2983 2984 class VIEW3D_MT_paint_weight (Menu): 2985 bl_label = "Weights" 2986 2987 @staticmethod 2988 def draw_generic (layout, is_editmode= False ): 2989 2990 if not is_editmode: 2991 2992 layout. operator ( "paint.weight_from_bones" , text= "Assign Automatic from Bones" ). type = 'AUTOMATIC' 2993 layout. operator ( "paint.weight_from_bones" , text= "Assign from Bone Envelopes" ). type = 'ENVELOPES' 2994 2995 layout. separator () 2996 2997 layout. operator ( "object.vertex_group_normalize_all" , text= "Normalize All" ) 2998 layout. operator ( "object.vertex_group_normalize" , text= "Normalize" ) 2999 3000 layout. separator () 3001 3002 layout. operator ( "object.vertex_group_mirror" , text= "Mirror" ) 3003 layout. operator ( "object.vertex_group_invert" , text= "Invert" ) 3004 layout. operator ( "object.vertex_group_clean" , text= "Clean" ) 3005 3006 layout. separator () 3007 3008 layout. operator ( "object.vertex_group_quantize" , text= "Quantize" ) 3009 layout. operator ( "object.vertex_group_levels" , text= "Levels" ) 3010 layout. operator ( "object.vertex_group_smooth" , text= "Smooth" ) 3011 3012 if not is_editmode: 3013 props = layout. operator ( "object.data_transfer" , text= "Transfer Weights" ) 3014 props.use_reverse_transfer = True 3015 props.data_type = 'VGROUP_WEIGHTS' 3016 3017 layout. operator ( "object.vertex_group_limit_total" , text= "Limit Total" ) 3018 layout. operator ( "object.vertex_group_fix" , text= "Fix Deforms" ) 3019 3020 if not is_editmode: 3021 layout. separator () 3022 3023 layout. operator ( "paint.weight_set" ) 3024 3025 layout. menu ( "VIEW3D_MT_paint_weight_lock" , text= "Locks" ) 3026 3027 def draw (self, _context): 3028 self. draw_generic (self.layout, is_editmode= False ) 3029 3030 3031 class VIEW3D_MT_sculpt (Menu): 3032 bl_label = "Sculpt" 3033 3034 def draw (self, _context): 3035 layout = self.layout 3036 3037 props = layout. operator ( "paint.hide_show" , text= "Show All" ) 3038 props.action = 'SHOW' 3039 props.area = 'ALL' 3040 3041 props = layout. operator ( "paint.hide_show" , text= "Show Bounding Box" ) 3042 props.action = 'SHOW' 3043 props.area = 'INSIDE' 3044 3045 props = layout. operator ( "paint.hide_show" , text= "Hide Bounding Box" ) 3046 props.action = 'HIDE' 3047 props.area = 'INSIDE' 3048 3049 props = layout. operator ( "paint.hide_show" , text= "Hide Masked" ) 3050 props.action = 'HIDE' 3051 props.area = 'MASKED' 3052 3053 layout. separator () 3054 3055 layout. menu ( "VIEW3D_MT_sculpt_set_pivot" , text= "Set Pivot" ) 3056 3057 layout. separator () 3058 3059 layout. operator ( "sculpt.optimize" ) 3060 3061 layout. separator () 3062 3063 layout. operator ( "object.transfer_mode" , text= "Transfer Sculpt Mode" ) 3064 3065 3066 class VIEW3D_MT_mask (Menu): 3067 bl_label = "Mask" 3068 3069 def draw (self, _context): 3070 layout = self.layout 3071 3072 props = layout. operator ( "paint.mask_flood_fill" , text= "Invert Mask" ) 3073 props.mode = 'INVERT' 3074 3075 props = layout. operator ( "paint.mask_flood_fill" , text= "Fill Mask" ) 3076 props.mode = 'VALUE' 3077 props.value = 1 3078 3079 props = layout. operator ( "paint.mask_flood_fill" , text= "Clear Mask" ) 3080 props.mode = 'VALUE' 3081 props.value = 0 3082 3083 props = layout. operator ( "paint.mask_box_gesture" , text= "Box Mask" ) 3084 props.mode = 'VALUE' 3085 props.value = 0 3086 3087 props = layout. operator ( "paint.mask_lasso_gesture" , text= "Lasso Mask" ) 3088 3089 layout. separator () 3090 3091 props = layout. operator ( "sculpt.mask_filter" , text= 'Smooth Mask' ) 3092 props.filter_type = 'SMOOTH' 3093 props.auto_iteration_count = True 3094 3095 props = layout. operator ( "sculpt.mask_filter" , text= 'Sharpen Mask' ) 3096 props.filter_type = 'SHARPEN' 3097 props.auto_iteration_count = True 3098 3099 props = layout. operator ( "sculpt.mask_filter" , text= 'Grow Mask' ) 3100 props.filter_type = 'GROW' 3101 props.auto_iteration_count = True 3102 3103 props = layout. operator ( "sculpt.mask_filter" , text= 'Shrink Mask' ) 3104 props.filter_type = 'SHRINK' 3105 props.auto_iteration_count = True 3106 3107 props = layout. operator ( "sculpt.mask_filter" , text= 'Increase Contrast' ) 3108 props.filter_type = 'CONTRAST_INCREASE' 3109 props.auto_iteration_count = False 3110 3111 props = layout. operator ( "sculpt.mask_filter" , text= 'Decrease Contrast' ) 3112 props.filter_type = 'CONTRAST_DECREASE' 3113 props.auto_iteration_count = False 3114 3115 layout. separator () 3116 3117 props = layout. operator ( "sculpt.expand" , text= "Expand Mask by Topology" ) 3118 props.target = 'MASK' 3119 props.falloff_type = 'GEODESIC' 3120 props.invert = True 3121 3122 props = layout. operator ( "sculpt.expand" , text= "Expand Mask by Normals" ) 3123 props.target = 'MASK' 3124 props.falloff_type = 'NORMALS' 3125 props.invert = False 3126 3127 layout. separator () 3128 3129 props = layout. operator ( "mesh.paint_mask_extract" , text= "Mask Extract" ) 3130 3131 layout. separator () 3132 3133 props = layout. operator ( "mesh.paint_mask_slice" , text= "Mask Slice" ) 3134 props.fill_holes = False 3135 props.new_object = False 3136 props = layout. operator ( "mesh.paint_mask_slice" , text= "Mask Slice and Fill Holes" ) 3137 props.new_object = False 3138 props = layout. operator ( "mesh.paint_mask_slice" , text= "Mask Slice to New Object" ) 3139 3140 layout. separator () 3141 3142 props = layout. operator ( "sculpt.dirty_mask" , text= 'Dirty Mask' ) 3143 3144 layout. separator () 3145 3146 layout. menu ( "VIEW3D_MT_random_mask" , text= "Random Mask" ) 3147 3148 3149 class VIEW3D_MT_face_sets (Menu): 3150 bl_label = "Face Sets" 3151 3152 def draw (self, _context): 3153 layout = self.layout 3154 3155 op = layout. operator ( "sculpt.face_sets_create" , text= 'Face Set from Masked' ) 3156 op.mode = 'MASKED' 3157 3158 op = layout. operator ( "sculpt.face_sets_create" , text= 'Face Set from Visible' ) 3159 op.mode = 'VISIBLE' 3160 3161 op = layout. operator ( "sculpt.face_sets_create" , text= 'Face Set from Edit Mode Selection' ) 3162 op.mode = 'SELECTION' 3163 3164 layout. separator () 3165 3166 layout. menu ( "VIEW3D_MT_face_sets_init" , text= "Initialize Face Sets" ) 3167 3168 layout. separator () 3169 3170 op = layout. operator ( "sculpt.face_set_edit" , text= 'Grow Face Set' ) 3171 op.mode = 'GROW' 3172 3173 op = layout. operator ( "sculpt.face_set_edit" , text= 'Shrink Face Set' ) 3174 op.mode = 'SHRINK' 3175 3176 layout. separator () 3177 3178 props = layout. operator ( "sculpt.expand" , text= "Expand Face Set by Topology" ) 3179 props.target = 'FACE_SETS' 3180 props.falloff_type = 'GEODESIC' 3181 props.invert = False 3182 props.use_modify_active = False 3183 3184 props = layout. operator ( "sculpt.expand" , text= "Expand Active Face Set" ) 3185 props.target = 'FACE_SETS' 3186 props.falloff_type = 'BOUNDARY_FACE_SET' 3187 props.invert = False 3188 props.use_modify_active = True 3189 3190 layout. separator () 3191 3192 op = layout. operator ( "mesh.face_set_extract" , text= 'Extract Face Set' ) 3193 3194 layout. separator () 3195 3196 op = layout. operator ( "sculpt.face_set_change_visibility" , text= 'Invert Visible Face Sets' ) 3197 op.mode = 'INVERT' 3198 3199 op = layout. operator ( "sculpt.face_set_change_visibility" , text= 'Show All Face Sets' ) 3200 op.mode = 'SHOW_ALL' 3201 3202 layout. separator () 3203 3204 op = layout. operator ( "sculpt.face_sets_randomize_colors" , text= 'Randomize Colors' ) 3205 3206 3207 class VIEW3D_MT_sculpt_set_pivot (Menu): 3208 bl_label = "Sculpt Set Pivot" 3209 3210 def draw (self, _context): 3211 layout = self.layout 3212 3213 props = layout. operator ( "sculpt.set_pivot_position" , text= "Pivot to Origin" ) 3214 props.mode = 'ORIGIN' 3215 3216 props = layout. operator ( "sculpt.set_pivot_position" , text= "Pivot to Unmasked" ) 3217 props.mode = 'UNMASKED' 3218 3219 props = layout. operator ( "sculpt.set_pivot_position" , text= "Pivot to Mask Border" ) 3220 props.mode = 'BORDER' 3221 3222 props = layout. operator ( "sculpt.set_pivot_position" , text= "Pivot to Active Vertex" ) 3223 props.mode = 'ACTIVE' 3224 3225 props = layout. operator ( "sculpt.set_pivot_position" , text= "Pivot to Surface Under Cursor" ) 3226 props.mode = 'SURFACE' 3227 3228 3229 class VIEW3D_MT_face_sets_init (Menu): 3230 bl_label = "Face Sets Init" 3231 3232 def draw (self, _context): 3233 layout = self.layout 3234 3235 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Loose Parts' ) 3236 op.mode = 'LOOSE_PARTS' 3237 3238 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Face Set Boundaries' ) 3239 op.mode = 'FACE_SET_BOUNDARIES' 3240 3241 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Materials' ) 3242 op.mode = 'MATERIALS' 3243 3244 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Normals' ) 3245 op.mode = 'NORMALS' 3246 3247 op = layout. operator ( "sculpt.face_sets_init" , text= 'By UV Seams' ) 3248 op.mode = 'UV_SEAMS' 3249 3250 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Edge Creases' ) 3251 op.mode = 'CREASES' 3252 3253 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Edge Bevel Weight' ) 3254 op.mode = 'BEVEL_WEIGHT' 3255 3256 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Sharp Edges' ) 3257 op.mode = 'SHARP_EDGES' 3258 3259 op = layout. operator ( "sculpt.face_sets_init" , text= 'By Face Maps' ) 3260 op.mode = 'FACE_MAPS' 3261 3262 3263 class VIEW3D_MT_random_mask (Menu): 3264 bl_label = "Random Mask" 3265 3266 def draw (self, _context): 3267 layout = self.layout 3268 3269 op = layout. operator ( "sculpt.mask_init" , text= 'Per Vertex' ) 3270 op.mode = 'RANDOM_PER_VERTEX' 3271 3272 op = layout. operator ( "sculpt.mask_init" , text= 'Per Face Set' ) 3273 op.mode = 'RANDOM_PER_FACE_SET' 3274 3275 op = layout. operator ( "sculpt.mask_init" , text= 'Per Loose Part' ) 3276 op.mode = 'RANDOM_PER_LOOSE_PART' 3277 3278 3279 class VIEW3D_MT_particle (Menu): 3280 bl_label = "Particle" 3281 3282 def draw (self, context): 3283 layout = self.layout 3284 tool_settings = context.tool_settings 3285 3286 particle_edit = tool_settings.particle_edit 3287 3288 layout. operator ( "particle.mirror" ) 3289 3290 layout. operator ( "particle.remove_doubles" ) 3291 3292 layout. separator () 3293 3294 if particle_edit.select_mode == 'POINT' : 3295 layout. operator ( "particle.subdivide" ) 3296 3297 layout. operator ( "particle.unify_length" ) 3298 layout. operator ( "particle.rekey" ) 3299 layout. operator ( "particle.weight_set" ) 3300 3301 layout. separator () 3302 3303 layout. menu ( "VIEW3D_MT_particle_showhide" ) 3304 3305 layout. separator () 3306 3307 layout. operator ( "particle.delete" ) 3308 3309 3310 class VIEW3D_MT_particle_context_menu (Menu): 3311 bl_label = "Particle Context Menu" 3312 3313 def draw (self, context): 3314 layout = self.layout 3315 tool_settings = context.tool_settings 3316 3317 particle_edit = tool_settings.particle_edit 3318 3319 layout. operator ( "particle.rekey" ) 3320 3321 layout. separator () 3322 3323 layout. operator ( "particle.delete" ) 3324 3325 layout. separator () 3326 3327 layout. operator ( "particle.remove_doubles" ) 3328 layout. operator ( "particle.unify_length" ) 3329 3330 if particle_edit.select_mode == 'POINT' : 3331 layout. operator ( "particle.subdivide" ) 3332 3333 layout. operator ( "particle.weight_set" ) 3334 3335 layout. separator () 3336 3337 layout. operator ( "particle.mirror" ) 3338 3339 if particle_edit.select_mode == 'POINT' : 3340 layout. separator () 3341 3342 layout. operator ( "particle.select_all" , text= "All" ).action = 'SELECT' 3343 layout. operator ( "particle.select_all" , text= "None" ).action = 'DESELECT' 3344 layout. operator ( "particle.select_all" , text= "Invert" ).action = 'INVERT' 3345 3346 layout. separator () 3347 3348 layout. operator ( "particle.select_roots" ) 3349 layout. operator ( "particle.select_tips" ) 3350 3351 layout. separator () 3352 3353 layout. operator ( "particle.select_random" ) 3354 3355 layout. separator () 3356 3357 layout. operator ( "particle.select_more" ) 3358 layout. operator ( "particle.select_less" ) 3359 3360 layout. separator () 3361 3362 layout. operator ( "particle.select_linked" , text= "Select Linked" ) 3363 3364 3365 class VIEW3D_MT_particle_showhide (ShowHideMenu, Menu): 3366 _operator_name = "particle" 3367 3368 3369 class VIEW3D_MT_pose (Menu): 3370 bl_label = "Pose" 3371 3372 def draw (self, _context): 3373 layout = self.layout 3374 3375 layout. menu ( "VIEW3D_MT_transform_armature" ) 3376 3377 layout. menu ( "VIEW3D_MT_pose_transform" ) 3378 layout. menu ( "VIEW3D_MT_pose_apply" ) 3379 3380 layout. menu ( "VIEW3D_MT_snap" ) 3381 3382 layout. separator () 3383 3384 layout. menu ( "VIEW3D_MT_object_animation" ) 3385 3386 layout. separator () 3387 3388 layout. menu ( "VIEW3D_MT_pose_slide" ) 3389 layout. menu ( "VIEW3D_MT_pose_propagate" ) 3390 3391 layout. separator () 3392 3393 layout. operator ( "pose.copy" , icon= 'COPYDOWN' ) 3394 layout. operator ( "pose.paste" , icon= 'PASTEDOWN' ).flipped = False 3395 layout. operator ( "pose.paste" , icon= 'PASTEFLIPDOWN' , text= "Paste Pose Flipped" ).flipped = True 3396 3397 layout. separator () 3398 3399 layout. menu ( "VIEW3D_MT_pose_library" ) 3400 layout. menu ( "VIEW3D_MT_pose_motion" ) 3401 layout. menu ( "VIEW3D_MT_pose_group" ) 3402 3403 layout. separator () 3404 3405 layout. menu ( "VIEW3D_MT_object_parent" ) 3406 layout. menu ( "VIEW3D_MT_pose_ik" ) 3407 layout. menu ( "VIEW3D_MT_pose_constraints" ) 3408 3409 layout. separator () 3410 3411 layout. menu ( "VIEW3D_MT_pose_names" ) 3412 layout. operator ( "pose.quaternions_flip" ) 3413 3414 layout. separator () 3415 3416 layout.operator_context = 'INVOKE_AREA' 3417 layout. operator ( "armature.armature_layers" , text= "Change Armature Layers..." ) 3418 layout. operator ( "pose.bone_layers" , text= "Change Bone Layers..." ) 3419 3420 layout. separator () 3421 3422 layout. menu ( "VIEW3D_MT_pose_showhide" ) 3423 layout. menu ( "VIEW3D_MT_bone_options_toggle" , text= "Bone Settings" ) 3424 3425 3426 class VIEW3D_MT_pose_transform (Menu): 3427 bl_label = "Clear Transform" 3428 3429 def draw (self, _context): 3430 layout = self.layout 3431 3432 layout. operator ( "pose.transforms_clear" , text= "All" ) 3433 3434 layout. separator () 3435 3436 layout. operator ( "pose.loc_clear" , text= "Location" ) 3437 layout. operator ( "pose.rot_clear" , text= "Rotation" ) 3438 layout. operator ( "pose.scale_clear" , text= "Scale" ) 3439 3440 layout. separator () 3441 3442 layout. operator ( "pose.user_transforms_clear" , text= "Reset Unkeyed" ) 3443 3444 3445 class VIEW3D_MT_pose_slide (Menu): 3446 bl_label = "In-Betweens" 3447 3448 def draw (self, _context): 3449 layout = self.layout 3450 3451 layout. operator ( "pose.push_rest" ) 3452 layout. operator ( "pose.relax_rest" ) 3453 layout. operator ( "pose.push" ) 3454 layout. operator ( "pose.relax" ) 3455 layout. operator ( "pose.breakdown" ) 3456 layout. operator ( "pose.blend_to_neighbor" ) 3457 3458 3459 class VIEW3D_MT_pose_propagate (Menu): 3460 bl_label = "Propagate" 3461 3462 def draw (self, _context): 3463 layout = self.layout 3464 3465 layout. operator ( "pose.propagate" ).mode = 'WHILE_HELD' 3466 3467 layout. separator () 3468 3469 layout. operator ( "pose.propagate" , text= "To Next Keyframe" ).mode = 'NEXT_KEY' 3470 layout. operator ( "pose.propagate" , text= "To Last Keyframe (Make Cyclic)" ).mode = 'LAST_KEY' 3471 3472 layout. separator () 3473 3474 layout. operator ( "pose.propagate" , text= "On Selected Keyframes" ).mode = 'SELECTED_KEYS' 3475 3476 layout. separator () 3477 3478 layout. operator ( "pose.propagate" , text= "On Selected Markers" ).mode = 'SELECTED_MARKERS' 3479 3480 3481 class VIEW3D_MT_pose_library (Menu): 3482 bl_label = "Pose Library" 3483 3484 def draw (self, _context): 3485 layout = self.layout 3486 3487 layout. operator ( "poselib.browse_interactive" , text= "Browse Poses..." ) 3488 3489 layout. separator () 3490 3491 layout. operator ( "poselib.pose_add" , text= "Add Pose..." ) 3492 layout. operator ( "poselib.pose_rename" , text= "Rename Pose..." ) 3493 layout. operator ( "poselib.pose_remove" , text= "Remove Pose..." ) 3494 3495 3496 class VIEW3D_MT_pose_motion (Menu): 3497 bl_label = "Motion Paths" 3498 3499 def draw (self, _context): 3500 layout = self.layout 3501 3502 layout. operator ( "pose.paths_calculate" , text= "Calculate" ) 3503 layout. operator ( "pose.paths_clear" , text= "Clear" ) 3504 3505 3506 class VIEW3D_MT_pose_group (Menu): 3507 bl_label = "Bone Groups" 3508 3509 def draw (self, context): 3510 layout = self.layout 3511 3512 pose = context.active_object.pose 3513 3514 layout.operator_context = 'EXEC_AREA' 3515 layout. operator ( "pose.group_assign" , text= "Assign to New Group" ). type = 0 3516 3517 if pose.bone_groups: 3518 active_group = pose.bone_groups.active_index + 1 3519 layout. operator ( "pose.group_assign" , text= "Assign to Group" ). type = active_group 3520 3521 layout. separator () 3522 3523 # layout.operator_context = 'INVOKE_AREA' 3524 layout. operator ( "pose.group_unassign" ) 3525 layout. operator ( "pose.group_remove" ) 3526 3527 3528 class VIEW3D_MT_pose_ik (Menu): 3529 bl_label = "Inverse Kinematics" 3530 3531 def draw (self, _context): 3532 layout = self.layout 3533 3534 layout. operator ( "pose.ik_add" ) 3535 layout. operator ( "pose.ik_clear" ) 3536 3537 3538 class VIEW3D_MT_pose_constraints (Menu): 3539 bl_label = "Constraints" 3540 3541 def draw (self, _context): 3542 layout = self.layout 3543 3544 layout. operator ( "pose.constraint_add_with_targets" , text= "Add (with Targets)..." ) 3545 layout. operator ( "pose.constraints_copy" ) 3546 layout. operator ( "pose.constraints_clear" ) 3547 3548 3549 class VIEW3D_MT_pose_names (Menu): 3550 bl_label = "Names" 3551 3552 def draw (self, _context): 3553 layout = self.layout 3554 3555 layout.operator_context = 'EXEC_REGION_WIN' 3556 layout. operator ( "pose.autoside_names" , text= "Auto-Name Left/Right" ).axis = 'XAXIS' 3557 layout. operator ( "pose.autoside_names" , text= "Auto-Name Front/Back" ).axis = 'YAXIS' 3558 layout. operator ( "pose.autoside_names" , text= "Auto-Name Top/Bottom" ).axis = 'ZAXIS' 3559 layout. operator ( "pose.flip_names" ) 3560 3561 3562 class VIEW3D_MT_pose_showhide (ShowHideMenu, Menu): 3563 _operator_name = "pose" 3564 3565 3566 class VIEW3D_MT_pose_apply (Menu): 3567 bl_label = "Apply" 3568 3569 def draw (self, _context): 3570 layout = self.layout 3571 3572 layout. operator ( "pose.armature_apply" ).selected = False 3573 layout. operator ( "pose.armature_apply" , text= "Apply Selected as Rest Pose" ).selected = True 3574 layout. operator ( "pose.visual_transform_apply" ) 3575 3576 layout. separator () 3577 3578 props = layout. operator ( "object.assign_property_defaults" ) 3579 props.process_bones = True 3580 3581 3582 class VIEW3D_MT_pose_context_menu (Menu): 3583 bl_label = "Pose Context Menu" 3584 3585 def draw (self, _context): 3586 layout = self.layout 3587 3588 layout.operator_context = 'INVOKE_REGION_WIN' 3589 3590 layout. operator ( "anim.keyframe_insert_menu" , text= "Insert Keyframe..." ) 3591 3592 layout. separator () 3593 3594 layout. operator ( "pose.copy" , icon= 'COPYDOWN' ) 3595 layout. operator ( "pose.paste" , icon= 'PASTEDOWN' ).flipped = False 3596 layout. operator ( "pose.paste" , icon= 'PASTEFLIPDOWN' , text= "Paste X-Flipped Pose" ).flipped = True 3597 3598 layout. separator () 3599 3600 props = layout. operator ( "wm.call_panel" , text= "Rename Active Bone..." ) 3601 props.name = "TOPBAR_PT_name" 3602 props.keep_open = False 3603 3604 layout. separator () 3605 3606 layout. operator ( "pose.push" ) 3607 layout. operator ( "pose.relax" ) 3608 layout. operator ( "pose.breakdown" ) 3609 layout. operator ( "pose.blend_to_neighbor" ) 3610 3611 layout. separator () 3612 3613 layout. operator ( "pose.paths_calculate" , text= "Calculate Motion Paths" ) 3614 layout. operator ( "pose.paths_clear" , text= "Clear Motion Paths" ) 3615 layout. operator ( "pose.paths_update" , text= "Update Armature Motion Paths" ) 3616 layout. operator ( "object.paths_update_visible" , text= "Update All Motion Paths" ) 3617 3618 layout. separator () 3619 3620 layout. operator ( "pose.hide" ).unselected = False 3621 layout. operator ( "pose.reveal" ) 3622 3623 layout. separator () 3624 3625 layout. operator ( "pose.user_transforms_clear" ) 3626 3627 3628 class BoneOptions: 3629 def draw (self, context): 3630 layout = self.layout 3631 3632 options = [ 3633 "show_wire" , 3634 "use_deform" , 3635 "use_envelope_multiply" , 3636 "use_inherit_rotation" , 3637 ] 3638 3639 if context.mode == 'EDIT_ARMATURE' : 3640 bone_props = bpy.types.EditBone.bl_rna.properties 3641 data_path_iter = "selected_bones" 3642 opt_suffix = "" 3643 options. append ( "lock" ) 3644 else : # pose-mode 3645 bone_props = bpy.types.Bone.bl_rna.properties 3646 data_path_iter = "selected_pose_bones" 3647 opt_suffix = "bone." 3648 3649 for opt in options: 3650 props = layout. operator ( "wm.context_collection_boolean_set" , text=bone_props[opt].name, 3651 text_ctxt=i18n_contexts.default) 3652 props.data_path_iter = data_path_iter 3653 props.data_path_item = opt_suffix + opt 3654 props. type = self. type 3655 3656 3657 class VIEW3D_MT_bone_options_toggle (Menu, BoneOptions): 3658 bl_label = "Toggle Bone Options" 3659 type = 'TOGGLE' 3660 3661 3662 class VIEW3D_MT_bone_options_enable (Menu, BoneOptions): 3663 bl_label = "Enable Bone Options" 3664 type = 'ENABLE' 3665 3666 3667 class VIEW3D_MT_bone_options_disable (Menu, BoneOptions): 3668 bl_label = "Disable Bone Options" 3669 type = 'DISABLE' 3670 3671 3672 # ********** Edit Menus, suffix from ob.type ********** 3673 3674 3675 class VIEW3D_MT_edit_mesh (Menu): 3676 bl_label = "Mesh" 3677 3678 def draw (self, _context): 3679 layout = self.layout 3680 3681 with_bullet = bpy.app.build_options.bullet 3682 3683 layout. menu ( "VIEW3D_MT_transform" ) 3684 layout. menu ( "VIEW3D_MT_mirror" ) 3685 layout. menu ( "VIEW3D_MT_snap" ) 3686 3687 layout. separator () 3688 3689 layout. operator ( "mesh.duplicate_move" , text= "Duplicate" ) 3690 layout. menu ( "VIEW3D_MT_edit_mesh_extrude" ) 3691 3692 layout. separator () 3693 3694 layout. menu ( "VIEW3D_MT_edit_mesh_merge" , text= "Merge" ) 3695 layout. menu ( "VIEW3D_MT_edit_mesh_split" , text= "Split" ) 3696 layout. operator_menu_enum ( "mesh.separate" , "type" ) 3697 3698 layout. separator () 3699 3700 layout. operator ( "mesh.bisect" ) 3701 layout. operator ( "mesh.knife_project" ) 3702 3703 if with_bullet: 3704 layout. operator ( "mesh.convex_hull" ) 3705 3706 layout. separator () 3707 3708 layout. operator ( "mesh.symmetrize" ) 3709 layout. operator ( "mesh.symmetry_snap" ) 3710 3711 layout. separator () 3712 3713 layout. menu ( "VIEW3D_MT_edit_mesh_normals" ) 3714 layout. menu ( "VIEW3D_MT_edit_mesh_shading" ) 3715 layout. menu ( "VIEW3D_MT_edit_mesh_weights" ) 3716 layout. operator_menu_enum ( "mesh.sort_elements" , "type" , text= "Sort Elements..." ) 3717 3718 layout. separator () 3719 3720 layout. menu ( "VIEW3D_MT_edit_mesh_showhide" ) 3721 layout. menu ( "VIEW3D_MT_edit_mesh_clean" ) 3722 3723 layout. separator () 3724 3725 layout. menu ( "VIEW3D_MT_edit_mesh_delete" ) 3726 3727 3728 class VIEW3D_MT_edit_mesh_context_menu (Menu): 3729 bl_label = "" 3730 3731 def draw (self, context): 3732 3733 def count_selected_items_for_objects_in_mode (): 3734 selected_verts_len = 0 3735 selected_edges_len = 0 3736 selected_faces_len = 0 3737 for ob in context.objects_in_mode_unique_data: 3738 v, e, f = ob.data. count_selected_items () 3739 selected_verts_len += v 3740 selected_edges_len += e 3741 selected_faces_len += f 3742 return (selected_verts_len, selected_edges_len, selected_faces_len) 3743 3744 is_vert_mode, is_edge_mode, is_face_mode = context.tool_settings.mesh_select_mode 3745 selected_verts_len, selected_edges_len, selected_faces_len = count_selected_items_for_objects_in_mode () 3746 3747 del count_selected_items_for_objects_in_mode 3748 3749 layout = self.layout 3750 3751 with_freestyle = bpy.app.build_options.freestyle 3752 3753 layout.operator_context = 'INVOKE_REGION_WIN' 3754 3755 # If nothing is selected 3756 # (disabled for now until it can be made more useful). 3757 ''' 3758 # If nothing is selected 3759 if not (selected_verts_len or selected_edges_len or selected_faces_len): 3760 layout.menu("VIEW3D_MT_mesh_add", text="Add", text_ctxt=i18n_contexts.operator_default) 3761 3762 return 3763 ''' 3764 3765 # Else something is selected 3766 3767 row = layout. row () 3768 3769 if is_vert_mode: 3770 col = row. column (align= True ) 3771 3772 col. label (text= "Vertex Context Menu" , icon= 'VERTEXSEL' ) 3773 col. separator () 3774 3775 # Additive Operators 3776 col. operator ( "mesh.subdivide" , text= "Subdivide" ) 3777 3778 col. separator () 3779 3780 col. operator ( "mesh.extrude_vertices_move" , text= "Extrude Vertices" ) 3781 col. operator ( "mesh.bevel" , text= "Bevel Vertices" ).affect = 'VERTICES' 3782 3783 if selected_verts_len > 1 : 3784 col. separator () 3785 col. operator ( "mesh.edge_face_add" , text= "New Edge/Face from Vertices" ) 3786 col. operator ( "mesh.vert_connect_path" , text= "Connect Vertex Path" ) 3787 col. operator ( "mesh.vert_connect" , text= "Connect Vertex Pairs" ) 3788 3789 col. separator () 3790 3791 # Deform Operators 3792 col. operator ( "transform.push_pull" , text= "Push/Pull" ) 3793 col. operator ( "transform.shrink_fatten" , text= "Shrink/Fatten" ) 3794 col. operator ( "transform.shear" , text= "Shear" ) 3795 col. operator ( "transform.vert_slide" , text= "Slide Vertices" ) 3796 col.operator_context = 'EXEC_REGION_WIN' 3797 col. operator ( "transform.vertex_random" , text= "Randomize Vertices" ).offset = 0.1 3798 col. operator ( "mesh.vertices_smooth" , text= "Smooth Vertices" ).factor = 0.5 3799 col.operator_context = 'INVOKE_REGION_WIN' 3800 col. operator ( "mesh.vertices_smooth_laplacian" , text= "Smooth Laplacian" ) 3801 3802 col. separator () 3803 3804 col. menu ( "VIEW3D_MT_mirror" , text= "Mirror Vertices" ) 3805 col. menu ( "VIEW3D_MT_snap" , text= "Snap Vertices" ) 3806 3807 col. separator () 3808 3809 # Removal Operators 3810 if selected_verts_len > 1 : 3811 col. menu ( "VIEW3D_MT_edit_mesh_merge" , text= "Merge Vertices" ) 3812 col. operator ( "mesh.split" ) 3813 col. operator_menu_enum ( "mesh.separate" , "type" ) 3814 col. operator ( "mesh.dissolve_verts" ) 3815 col. operator ( "mesh.delete" , text= "Delete Vertices" ). type = 'VERT' 3816 3817 if is_edge_mode: 3818 col = row. column (align= True ) 3819 col. label (text= "Edge Context Menu" , icon= 'EDGESEL' ) 3820 col. separator () 3821 3822 # Additive Operators 3823 col. operator ( "mesh.subdivide" , text= "Subdivide" ) 3824 3825 col. separator () 3826 3827 col. operator ( "mesh.extrude_edges_move" , text= "Extrude Edges" ) 3828 col. operator ( "mesh.bevel" , text= "Bevel Edges" ).affect = 'EDGES' 3829 if selected_edges_len >= 2 : 3830 col. operator ( "mesh.bridge_edge_loops" ) 3831 if selected_edges_len >= 1 : 3832 col. operator ( "mesh.edge_face_add" , text= "New Face from Edges" ) 3833 if selected_edges_len >= 2 : 3834 col. operator ( "mesh.fill" ) 3835 3836 col. separator () 3837 3838 props = col. operator ( "mesh.loopcut_slide" ) 3839 props.TRANSFORM_OT_edge_slide.release_confirm = False 3840 col. operator ( "mesh.offset_edge_loops_slide" ) 3841 3842 col. separator () 3843 3844 col. operator ( "mesh.knife_tool" ) 3845 col. operator ( "mesh.bisect" ) 3846 3847 col. separator () 3848 3849 # Deform Operators 3850 col. operator ( "mesh.edge_rotate" , text= "Rotate Edge CW" ).use_ccw = False 3851 col. operator ( "transform.edge_slide" ) 3852 col. operator ( "mesh.edge_split" ) 3853 3854 col. separator () 3855 3856 # Edge Flags 3857 col. operator ( "transform.edge_crease" ) 3858 col. operator ( "transform.edge_bevelweight" ) 3859 3860 col. separator () 3861 3862 col. operator ( "mesh.mark_seam" ).clear = False 3863 col. operator ( "mesh.mark_seam" , text= "Clear Seam" ).clear = True 3864 3865 col. separator () 3866 3867 col. operator ( "mesh.mark_sharp" ) 3868 col. operator ( "mesh.mark_sharp" , text= "Clear Sharp" ).clear = True 3869 3870 if with_freestyle: 3871 col. separator () 3872 3873 col. operator ( "mesh.mark_freestyle_edge" ).clear = False 3874 col. operator ( "mesh.mark_freestyle_edge" , text= "Clear Freestyle Edge" ).clear = True 3875 3876 col. separator () 3877 3878 # Removal Operators 3879 col. operator ( "mesh.unsubdivide" ) 3880 col. operator ( "mesh.split" ) 3881 col. operator_menu_enum ( "mesh.separate" , "type" ) 3882 col. operator ( "mesh.dissolve_edges" ) 3883 col. operator ( "mesh.delete" , text= "Delete Edges" ). type = 'EDGE' 3884 3885 if is_face_mode: 3886 col = row. column (align= True ) 3887 3888 col. label (text= "Face Context Menu" , icon= 'FACESEL' ) 3889 col. separator () 3890 3891 # Additive Operators 3892 col. operator ( "mesh.subdivide" , text= "Subdivide" ) 3893 3894 col. separator () 3895 3896 col. operator ( "view3d.edit_mesh_extrude_move_normal" , text= "Extrude Faces" ) 3897 col. operator ( "view3d.edit_mesh_extrude_move_shrink_fatten" , text= "Extrude Faces Along Normals" ) 3898 col. operator ( "mesh.extrude_faces_move" , text= "Extrude Individual Faces" ) 3899 3900 col. operator ( "mesh.inset" ) 3901 col. operator ( "mesh.poke" ) 3902 3903 if selected_faces_len >= 2 : 3904 col. operator ( "mesh.bridge_edge_loops" , text= "Bridge Faces" ) 3905 3906 col. separator () 3907 3908 # Modify Operators 3909 col. menu ( "VIEW3D_MT_uv_map" , text= "UV Unwrap Faces" ) 3910 3911 col. separator () 3912 3913 props = col. operator ( "mesh.quads_convert_to_tris" ) 3914 props.quad_method = props.ngon_method = 'BEAUTY' 3915 col. operator ( "mesh.tris_convert_to_quads" ) 3916 3917 col. separator () 3918 3919 col. operator ( "mesh.faces_shade_smooth" ) 3920 col. operator ( "mesh.faces_shade_flat" ) 3921 3922 col. separator () 3923 3924 # Removal Operators 3925 col. operator ( "mesh.unsubdivide" ) 3926 col. operator ( "mesh.split" ) 3927 col. operator_menu_enum ( "mesh.separate" , "type" ) 3928 col. operator ( "mesh.dissolve_faces" ) 3929 col. operator ( "mesh.delete" , text= "Delete Faces" ). type = 'FACE' 3930 3931 3932 class VIEW3D_MT_edit_mesh_select_mode (Menu): 3933 bl_label = "Mesh Select Mode" 3934 3935 def draw (self, _context): 3936 layout = self.layout 3937 3938 layout.operator_context = 'INVOKE_REGION_WIN' 3939 layout. operator ( "mesh.select_mode" , text= "Vertex" , icon= 'VERTEXSEL' ). type = 'VERT' 3940 layout. operator ( "mesh.select_mode" , text= "Edge" , icon= 'EDGESEL' ). type = 'EDGE' 3941 layout. operator ( "mesh.select_mode" , text= "Face" , icon= 'FACESEL' ). type = 'FACE' 3942 3943 3944 class VIEW3D_MT_edit_mesh_extrude (Menu): 3945 bl_label = "Extrude" 3946 3947 _extrude_funcs = { 3948 'VERT' : lambda layout: 3949 layout. operator ( "mesh.extrude_vertices_move" , text= "Extrude Vertices" ), 3950 'EDGE' : lambda layout: 3951 layout. operator ( "mesh.extrude_edges_move" , text= "Extrude Edges" ), 3952 'REGION' : lambda layout: 3953 layout. operator ( "view3d.edit_mesh_extrude_move_normal" , text= "Extrude Faces" ), 3954 'REGION_VERT_NORMAL' : lambda layout: 3955 layout. operator ( "view3d.edit_mesh_extrude_move_shrink_fatten" , text= "Extrude Faces Along Normals" ), 3956 'FACE' : lambda layout: 3957 layout. operator ( "mesh.extrude_faces_move" , text= "Extrude Individual Faces" ), 3958 'MANIFOLD' : lambda layout: 3959 layout. operator ( "view3d.edit_mesh_extrude_manifold_normal" , text= "Extrude Manifold" ), 3960 } 3961 3962 @staticmethod 3963 def extrude_options (context): 3964 tool_settings = context.tool_settings 3965 select_mode = tool_settings.mesh_select_mode 3966 mesh = context. object .data 3967 3968 menu = [] 3969 if mesh.total_face_sel: 3970 menu += [ 'REGION' , 'REGION_VERT_NORMAL' , 'FACE' , 'MANIFOLD' ] 3971 if mesh.total_edge_sel and (select_mode[ 0 ] or select_mode[ 1 ]): 3972 menu += [ 'EDGE' ] 3973 if mesh.total_vert_sel and select_mode[ 0 ]: 3974 menu += [ 'VERT' ] 3975 3976 # should never get here 3977 return menu 3978 3979 def draw (self, context): 3980 from math import pi 3981 3982 layout = self.layout 3983 layout.operator_context = 'INVOKE_REGION_WIN' 3984 3985 for menu_id in self. extrude_options (context): 3986 self._extrude_funcs[menu_id](layout) 3987 3988 layout. separator () 3989 3990 layout. operator ( "mesh.extrude_repeat" ) 3991 layout. operator ( "mesh.spin" ).angle = pi * 2 3992 3993 3994 class VIEW3D_MT_edit_mesh_vertices (Menu): 3995 bl_label = "Vertex" 3996 3997 def draw (self, _context): 3998 layout = self.layout 3999 layout.operator_context = 'INVOKE_REGION_WIN' 4000 4001 layout. operator ( "mesh.extrude_vertices_move" , text= "Extrude Vertices" ) 4002 layout. operator ( "mesh.dupli_extrude_cursor" ).rotate_source = True 4003 layout. operator ( "mesh.bevel" , text= "Bevel Vertices" ).affect = 'VERTICES' 4004 4005 layout. separator () 4006 4007 layout. operator ( "mesh.edge_face_add" , text= "New Edge/Face from Vertices" ) 4008 layout. operator ( "mesh.vert_connect_path" , text= "Connect Vertex Path" ) 4009 layout. operator ( "mesh.vert_connect" , text= "Connect Vertex Pairs" ) 4010 4011 layout. separator () 4012 4013 props = layout. operator ( "mesh.rip_move" , text= "Rip Vertices" ) 4014 props.MESH_OT_rip.use_fill = False 4015 props = layout. operator ( "mesh.rip_move" , text= "Rip Vertices and Fill" ) 4016 props.MESH_OT_rip.use_fill = True 4017 layout. operator ( "mesh.rip_edge_move" , text= "Rip Vertices and Extend" ) 4018 4019 layout. separator () 4020 4021 layout. operator ( "transform.vert_slide" , text= "Slide Vertices" ) 4022 layout.operator_context = 'EXEC_REGION_WIN' 4023 layout. operator ( "mesh.vertices_smooth" , text= "Smooth Vertices" ).factor = 0.5 4024 layout. operator ( "mesh.vertices_smooth_laplacian" , text= "Smooth Vertices (Laplacian)" ) 4025 layout.operator_context = 'INVOKE_REGION_WIN' 4026 4027 layout. separator () 4028 4029 layout. operator ( "mesh.blend_from_shape" ) 4030 layout. operator ( "mesh.shape_propagate_to_all" , text= "Propagate to Shapes" ) 4031 4032 layout. separator () 4033 4034 layout. menu ( "VIEW3D_MT_vertex_group" ) 4035 layout. menu ( "VIEW3D_MT_hook" ) 4036 4037 layout. separator () 4038 4039 layout. operator ( "object.vertex_parent_set" ) 4040 4041 4042 class VIEW3D_MT_edit_mesh_edges (Menu): 4043 bl_label = "Edge" 4044 4045 def draw (self, _context): 4046 layout = self.layout 4047 4048 with_freestyle = bpy.app.build_options.freestyle 4049 4050 layout.operator_context = 'INVOKE_REGION_WIN' 4051 4052 layout. operator ( "mesh.extrude_edges_move" , text= "Extrude Edges" ) 4053 layout. operator ( "mesh.bevel" , text= "Bevel Edges" ).affect = 'EDGES' 4054 layout. operator ( "mesh.bridge_edge_loops" ) 4055 layout. operator ( "mesh.screw" ) 4056 4057 layout. separator () 4058 4059 layout. operator ( "mesh.subdivide" ) 4060 layout. operator ( "mesh.subdivide_edgering" ) 4061 layout. operator ( "mesh.unsubdivide" ) 4062 4063 layout. separator () 4064 4065 layout. operator ( "mesh.edge_rotate" , text= "Rotate Edge CW" ).use_ccw = False 4066 layout. operator ( "mesh.edge_rotate" , text= "Rotate Edge CCW" ).use_ccw = True 4067 4068 layout. separator () 4069 4070 layout. operator ( "transform.edge_slide" ) 4071 props = layout. operator ( "mesh.loopcut_slide" ) 4072 props.TRANSFORM_OT_edge_slide.release_confirm = False 4073 layout. operator ( "mesh.offset_edge_loops_slide" ) 4074 4075 layout. separator () 4076 4077 layout. operator ( "transform.edge_crease" ) 4078 layout. operator ( "transform.edge_bevelweight" ) 4079 4080 layout. separator () 4081 4082 layout. operator ( "mesh.mark_seam" ).clear = False 4083 layout. operator ( "mesh.mark_seam" , text= "Clear Seam" ).clear = True 4084 4085 layout. separator () 4086 4087 layout. operator ( "mesh.mark_sharp" ) 4088 layout. operator ( "mesh.mark_sharp" , text= "Clear Sharp" ).clear = True 4089 4090 layout. operator ( "mesh.mark_sharp" , text= "Mark Sharp from Vertices" ).use_verts = True 4091 props = layout. operator ( "mesh.mark_sharp" , text= "Clear Sharp from Vertices" ) 4092 props.use_verts = True 4093 props.clear = True 4094 4095 if with_freestyle: 4096 layout. separator () 4097 4098 layout. operator ( "mesh.mark_freestyle_edge" ).clear = False 4099 layout. operator ( "mesh.mark_freestyle_edge" , text= "Clear Freestyle Edge" ).clear = True 4100 4101 4102 class VIEW3D_MT_edit_mesh_faces_data (Menu): 4103 bl_label = "Face Data" 4104 4105 def draw (self, _context): 4106 layout = self.layout 4107 4108 with_freestyle = bpy.app.build_options.freestyle 4109 4110 layout.operator_context = 'INVOKE_REGION_WIN' 4111 4112 layout. operator ( "mesh.colors_rotate" ) 4113 layout. operator ( "mesh.colors_reverse" ) 4114 4115 layout. separator () 4116 4117 layout. operator ( "mesh.uvs_rotate" ) 4118 layout. operator ( "mesh.uvs_reverse" ) 4119 4120 layout. separator () 4121 4122 if with_freestyle: 4123 layout. operator ( "mesh.mark_freestyle_face" ).clear = False 4124 layout. operator ( "mesh.mark_freestyle_face" , text= "Clear Freestyle Face" ).clear = True 4125 4126 4127 class VIEW3D_MT_edit_mesh_faces (Menu): 4128 bl_label = "Face" 4129 bl_idname = "VIEW3D_MT_edit_mesh_faces" 4130 4131 def draw (self, _context): 4132 layout = self.layout 4133 4134 layout.operator_context = 'INVOKE_REGION_WIN' 4135 4136 layout. operator ( "view3d.edit_mesh_extrude_move_normal" , text= "Extrude Faces" ) 4137 layout. operator ( "view3d.edit_mesh_extrude_move_shrink_fatten" , text= "Extrude Faces Along Normals" ) 4138 layout. operator ( "mesh.extrude_faces_move" , text= "Extrude Individual Faces" ) 4139 4140 layout. separator () 4141 4142 layout. operator ( "mesh.inset" ) 4143 layout. operator ( "mesh.poke" ) 4144 props = layout. operator ( "mesh.quads_convert_to_tris" ) 4145 props.quad_method = props.ngon_method = 'BEAUTY' 4146 layout. operator ( "mesh.tris_convert_to_quads" ) 4147 layout. operator ( "mesh.solidify" , text= "Solidify Faces" ) 4148 layout. operator ( "mesh.wireframe" ) 4149 4150 layout. separator () 4151 4152 layout. operator ( "mesh.fill" ) 4153 layout. operator ( "mesh.fill_grid" ) 4154 layout. operator ( "mesh.beautify_fill" ) 4155 4156 layout. separator () 4157 4158 layout. operator ( "mesh.intersect" ) 4159 layout. operator ( "mesh.intersect_boolean" ) 4160 4161 layout. separator () 4162 4163 layout. operator ( "mesh.face_split_by_edges" ) 4164 4165 layout. separator () 4166 4167 layout. operator ( "mesh.faces_shade_smooth" ) 4168 layout. operator ( "mesh.faces_shade_flat" ) 4169 4170 layout. separator () 4171 4172 layout. menu ( "VIEW3D_MT_edit_mesh_faces_data" ) 4173 4174 4175 class VIEW3D_MT_edit_mesh_normals_select_strength (Menu): 4176 bl_label = "Select by Face Strength" 4177 4178 def draw (self, _context): 4179 layout = self.layout 4180 4181 op = layout. operator ( "mesh.mod_weighted_strength" , text= "Weak" ) 4182 op. set = False 4183 op.face_strength = 'WEAK' 4184 4185 op = layout. operator ( "mesh.mod_weighted_strength" , text= "Medium" ) 4186 op. set = False 4187 op.face_strength = 'MEDIUM' 4188 4189 op = layout. operator ( "mesh.mod_weighted_strength" , text= "Strong" ) 4190 op. set = False 4191 op.face_strength = 'STRONG' 4192 4193 4194 class VIEW3D_MT_edit_mesh_normals_set_strength (Menu): 4195 bl_label = "Set Face Strength" 4196 4197 def draw (self, _context): 4198 layout = self.layout 4199 4200 op = layout. operator ( "mesh.mod_weighted_strength" , text= "Weak" ) 4201 op. set = True 4202 op.face_strength = 'WEAK' 4203 4204 op = layout. operator ( "mesh.mod_weighted_strength" , text= "Medium" ) 4205 op. set = True 4206 op.face_strength = 'MEDIUM' 4207 4208 op = layout. operator ( "mesh.mod_weighted_strength" , text= "Strong" ) 4209 op. set = True 4210 op.face_strength = 'STRONG' 4211 4212 4213 class VIEW3D_MT_edit_mesh_normals_average (Menu): 4214 bl_label = "Average" 4215 4216 def draw (self, _context): 4217 layout = self.layout 4218 4219 layout. operator ( "mesh.average_normals" , text= "Custom Normal" ).average_type = 'CUSTOM_NORMAL' 4220 layout. operator ( "mesh.average_normals" , text= "Face Area" ).average_type = 'FACE_AREA' 4221 layout. operator ( "mesh.average_normals" , text= "Corner Angle" ).average_type = 'CORNER_ANGLE' 4222 4223 4224 class VIEW3D_MT_edit_mesh_normals (Menu): 4225 bl_label = "Normals" 4226 4227 def draw (self, _context): 4228 layout = self.layout 4229 4230 layout. operator ( "mesh.flip_normals" , text= "Flip" ) 4231 layout. operator ( "mesh.normals_make_consistent" , text= "Recalculate Outside" ).inside = False 4232 layout. operator ( "mesh.normals_make_consistent" , text= "Recalculate Inside" ).inside = True 4233 4234 layout. separator () 4235 4236 layout. operator ( "mesh.set_normals_from_faces" , text= "Set from Faces" ) 4237 4238 layout.operator_context = 'INVOKE_REGION_WIN' 4239 layout. operator ( "transform.rotate_normal" , text= "Rotate..." ) 4240 layout. operator ( "mesh.point_normals" , text= "Point to Target..." ) 4241 layout.operator_context = 'EXEC_REGION_WIN' 4242 4243 layout. operator ( "mesh.merge_normals" , text= "Merge" ) 4244 layout. operator ( "mesh.split_normals" , text= "Split" ) 4245 layout. menu ( "VIEW3D_MT_edit_mesh_normals_average" , text= "Average" ) 4246 4247 layout. separator () 4248 4249 layout. operator ( "mesh.normals_tools" , text= "Copy Vectors" ).mode = 'COPY' 4250 layout. operator ( "mesh.normals_tools" , text= "Paste Vectors" ).mode = 'PASTE' 4251 4252 layout. operator ( "mesh.smooth_normals" , text= "Smooth Vectors" ) 4253 layout. operator ( "mesh.normals_tools" , text= "Reset Vectors" ).mode = 'RESET' 4254 4255 layout. separator () 4256 4257 layout. menu ( "VIEW3D_MT_edit_mesh_normals_select_strength" ) 4258 layout. menu ( "VIEW3D_MT_edit_mesh_normals_set_strength" ) 4259 4260 4261 class VIEW3D_MT_edit_mesh_shading (Menu): 4262 bl_label = "Shading" 4263 4264 def draw (self, _context): 4265 layout = self.layout 4266 4267 layout. operator ( "mesh.faces_shade_smooth" , text= "Smooth Faces" ) 4268 layout. operator ( "mesh.faces_shade_flat" , text= "Flat Faces" ) 4269 4270 layout. separator () 4271 4272 layout. operator ( "mesh.mark_sharp" , text= "Smooth Edges" ).clear = True 4273 layout. operator ( "mesh.mark_sharp" , text= "Sharp Edges" ) 4274 4275 layout. separator () 4276 4277 props = layout. operator ( "mesh.mark_sharp" , text= "Smooth Vertices" ) 4278 props.use_verts = True 4279 props.clear = True 4280 4281 layout. operator ( "mesh.mark_sharp" , text= "Sharp Vertices" ).use_verts = True 4282 4283 4284 class VIEW3D_MT_edit_mesh_weights (Menu): 4285 bl_label = "Weights" 4286 4287 def draw (self, _context): 4288 VIEW3D_MT_paint_weight. draw_generic (self.layout, is_editmode= True ) 4289 4290 4291 class VIEW3D_MT_edit_mesh_clean (Menu): 4292 bl_label = "Clean Up" 4293 4294 def draw (self, _context): 4295 layout = self.layout 4296 4297 layout. operator ( "mesh.delete_loose" ) 4298 4299 layout. separator () 4300 4301 layout. operator ( "mesh.decimate" ) 4302 layout. operator ( "mesh.dissolve_degenerate" ) 4303 layout. operator ( "mesh.dissolve_limited" ) 4304 layout. operator ( "mesh.face_make_planar" ) 4305 4306 layout. separator () 4307 4308 layout. operator ( "mesh.vert_connect_nonplanar" ) 4309 layout. operator ( "mesh.vert_connect_concave" ) 4310 layout. operator ( "mesh.remove_doubles" ) 4311 layout. operator ( "mesh.fill_holes" ) 4312 4313 4314 class VIEW3D_MT_edit_mesh_delete (Menu): 4315 bl_label = "Delete" 4316 4317 def draw (self, _context): 4318 layout = self.layout 4319 4320 layout. operator_enum ( "mesh.delete" , "type" ) 4321 4322 layout. separator () 4323 4324 layout. operator ( "mesh.dissolve_verts" ) 4325 layout. operator ( "mesh.dissolve_edges" ) 4326 layout. operator ( "mesh.dissolve_faces" ) 4327 4328 layout. separator () 4329 4330 layout. operator ( "mesh.dissolve_limited" ) 4331 4332 layout. separator () 4333 4334 layout. operator ( "mesh.edge_collapse" ) 4335 layout. operator ( "mesh.delete_edgeloop" , text= "Edge Loops" ) 4336 4337 4338 class VIEW3D_MT_edit_mesh_merge (Menu): 4339 bl_label = "Merge" 4340 4341 def draw (self, _context): 4342 layout = self.layout 4343 4344 layout. operator_enum ( "mesh.merge" , "type" ) 4345 4346 layout. separator () 4347 4348 layout. operator ( "mesh.remove_doubles" , text= "By Distance" ) 4349 4350 4351 class VIEW3D_MT_edit_mesh_split (Menu): 4352 bl_label = "Split" 4353 4354 def draw (self, _context): 4355 layout = self.layout 4356 4357 layout. operator ( "mesh.split" , text= "Selection" ) 4358 4359 layout. separator () 4360 4361 layout. operator_enum ( "mesh.edge_split" , "type" ) 4362 4363 4364 class VIEW3D_MT_edit_mesh_showhide (ShowHideMenu, Menu): 4365 _operator_name = "mesh" 4366 4367 4368 class VIEW3D_MT_edit_gpencil_delete (Menu): 4369 bl_label = "Delete" 4370 4371 def draw (self, _context): 4372 layout = self.layout 4373 4374 layout. operator_enum ( "gpencil.delete" , "type" ) 4375 4376 layout. separator () 4377 4378 layout. operator_enum ( "gpencil.dissolve" , "type" ) 4379 4380 layout. separator () 4381 4382 layout. operator ( "gpencil.delete" , text= "Delete Active Keyframe (Active Layer)" ). type = 'FRAME' 4383 layout. operator ( "gpencil.active_frames_delete_all" , text= "Delete Active Keyframes (All Layers)" ) 4384 4385 # Edit Curve 4386 # draw_curve is used by VIEW3D_MT_edit_curve and VIEW3D_MT_edit_surface 4387 4388 4389 def draw_curve (self, _context): 4390 layout = self.layout 4391 4392 layout. menu ( "VIEW3D_MT_transform" ) 4393 layout. menu ( "VIEW3D_MT_mirror" ) 4394 layout. menu ( "VIEW3D_MT_snap" ) 4395 4396 layout. separator () 4397 4398 layout. operator ( "curve.spin" ) 4399 layout. operator ( "curve.duplicate_move" ) 4400 4401 layout. separator () 4402 4403 layout. operator ( "curve.split" ) 4404 layout. operator ( "curve.separate" ) 4405 4406 layout. separator () 4407 4408 layout. operator ( "curve.cyclic_toggle" ) 4409 layout. operator_menu_enum ( "curve.spline_type_set" , "type" ) 4410 4411 layout. separator () 4412 4413 layout. menu ( "VIEW3D_MT_edit_curve_showhide" ) 4414 layout. menu ( "VIEW3D_MT_edit_curve_clean" ) 4415 layout. menu ( "VIEW3D_MT_edit_curve_delete" ) 4416 4417 4418 class VIEW3D_MT_edit_curve (Menu): 4419 bl_label = "Curve" 4420 4421 draw = draw_curve 4422 4423 4424 class VIEW3D_MT_edit_curve_ctrlpoints (Menu): 4425 bl_label = "Control Points" 4426 4427 def draw (self, context): 4428 layout = self.layout 4429 4430 edit_object = context.edit_object 4431 4432 if edit_object. type in { 'CURVE' , 'SURFACE' }: 4433 layout. operator ( "curve.extrude_move" ) 4434 layout. operator ( "curve.vertex_add" ) 4435 4436 layout. separator () 4437 4438 layout. operator ( "curve.make_segment" ) 4439 4440 layout. separator () 4441 4442 if edit_object. type == 'CURVE' : 4443 layout. operator ( "transform.tilt" ) 4444 layout. operator ( "curve.tilt_clear" ) 4445 4446 layout. separator () 4447 4448 layout. operator_menu_enum ( "curve.handle_type_set" , "type" ) 4449 layout. operator ( "curve.normals_make_consistent" ) 4450 4451 layout. separator () 4452 4453 layout. operator ( "curve.smooth" ) 4454 if edit_object. type == 'CURVE' : 4455 layout. operator ( "curve.smooth_tilt" ) 4456 layout. operator ( "curve.smooth_radius" ) 4457 layout. operator ( "curve.smooth_weight" ) 4458 4459 layout. separator () 4460 4461 layout. menu ( "VIEW3D_MT_hook" ) 4462 4463 layout. separator () 4464 4465 layout. operator ( "object.vertex_parent_set" ) 4466 4467 4468 class VIEW3D_MT_edit_curve_segments (Menu): 4469 bl_label = "Segments" 4470 4471 def draw (self, _context): 4472 layout = self.layout 4473 4474 layout. operator ( "curve.subdivide" ) 4475 layout. operator ( "curve.switch_direction" ) 4476 4477 4478 class VIEW3D_MT_edit_curve_clean (Menu): 4479 bl_label = "Clean Up" 4480 4481 def draw (self, _context): 4482 layout = self.layout 4483 4484 layout. operator ( "curve.decimate" ) 4485 4486 4487 class VIEW3D_MT_edit_curve_context_menu (Menu): 4488 bl_label = "Curve Context Menu" 4489 4490 def draw (self, _context): 4491 # TODO(campbell): match mesh vertex menu. 4492 4493 layout = self.layout 4494 4495 layout.operator_context = 'INVOKE_DEFAULT' 4496 4497 # Add 4498 layout. operator ( "curve.subdivide" ) 4499 layout. operator ( "curve.extrude_move" ) 4500 layout. operator ( "curve.make_segment" ) 4501 layout. operator ( "curve.duplicate_move" ) 4502 4503 layout. separator () 4504 4505 # Transform 4506 layout. operator ( "transform.transform" , text= "Radius" ).mode = 'CURVE_SHRINKFATTEN' 4507 layout. operator ( "transform.tilt" ) 4508 layout. operator ( "curve.tilt_clear" ) 4509 layout. operator ( "curve.smooth" ) 4510 layout. operator ( "curve.smooth_tilt" ) 4511 layout. operator ( "curve.smooth_radius" ) 4512 4513 layout. separator () 4514 4515 layout. menu ( "VIEW3D_MT_mirror" ) 4516 layout. menu ( "VIEW3D_MT_snap" ) 4517 4518 layout. separator () 4519 4520 # Modify 4521 layout. operator_menu_enum ( "curve.spline_type_set" , "type" ) 4522 layout. operator_menu_enum ( "curve.handle_type_set" , "type" ) 4523 layout. operator ( "curve.cyclic_toggle" ) 4524 layout. operator ( "curve.switch_direction" ) 4525 4526 layout. separator () 4527 4528 layout. operator ( "curve.normals_make_consistent" ) 4529 layout. operator ( "curve.spline_weight_set" ) 4530 layout. operator ( "curve.radius_set" ) 4531 4532 layout. separator () 4533 4534 # Remove 4535 layout. operator ( "curve.split" ) 4536 layout. operator ( "curve.decimate" ) 4537 layout. operator ( "curve.separate" ) 4538 layout. operator ( "curve.dissolve_verts" ) 4539 layout. operator ( "curve.delete" , text= "Delete Segment" ). type = 'SEGMENT' 4540 layout. operator ( "curve.delete" , text= "Delete Point" ). type = 'VERT' 4541 4542 4543 class VIEW3D_MT_edit_curve_delete (Menu): 4544 bl_label = "Delete" 4545 4546 def draw (self, _context): 4547 layout = self.layout 4548 4549 layout. operator_enum ( "curve.delete" , "type" ) 4550 4551 layout. separator () 4552 4553 layout. operator ( "curve.dissolve_verts" ) 4554 4555 4556 class VIEW3D_MT_edit_curve_showhide (ShowHideMenu, Menu): 4557 _operator_name = "curve" 4558 4559 4560 class VIEW3D_MT_edit_surface (Menu): 4561 bl_label = "Surface" 4562 4563 draw = draw_curve 4564 4565 4566 class VIEW3D_MT_edit_font_chars (Menu): 4567 bl_label = "Special Characters" 4568 4569 def draw (self, _context): 4570 layout = self.layout 4571 4572 layout. operator ( "font.text_insert" , text= "Copyright" ).text = "\u00A9" 4573 layout. operator ( "font.text_insert" , text= "Registered Trademark" ).text = "\u00AE" 4574 4575 layout. separator () 4576 4577 layout. operator ( "font.text_insert" , text= "Degree Sign" ).text = "\u00B0" 4578 layout. operator ( "font.text_insert" , text= "Multiplication Sign" ).text = "\u00D7" 4579 layout. operator ( "font.text_insert" , text= "Circle" ).text = "\u008A" 4580 4581 layout. separator () 4582 4583 layout. operator ( "font.text_insert" , text= "Superscript 1" ).text = "\u00B9" 4584 layout. operator ( "font.text_insert" , text= "Superscript 2" ).text = "\u00B2" 4585 layout. operator ( "font.text_insert" , text= "Superscript 3" ).text = "\u00B3" 4586 4587 layout. separator () 4588 4589 layout. operator ( "font.text_insert" , text= "Double >>" ).text = "\u00BB" 4590 layout. operator ( "font.text_insert" , text= "Double <<" ).text = "\u00AB" 4591 layout. operator ( "font.text_insert" , text= "Promillage" ).text = "\u2030" 4592 4593 layout. separator () 4594 4595 layout. operator ( "font.text_insert" , text= "Dutch Florin" ).text = "\u00A4" 4596 layout. operator ( "font.text_insert" , text= "British Pound" ).text = "\u00A3" 4597 layout. operator ( "font.text_insert" , text= "Japanese Yen" ).text = "\u00A5" 4598 4599 layout. separator () 4600 4601 layout. operator ( "font.text_insert" , text= "German S" ).text = "\u00DF" 4602 layout. operator ( "font.text_insert" , text= "Spanish Question Mark" ).text = "\u00BF" 4603 layout. operator ( "font.text_insert" , text= "Spanish Exclamation Mark" ).text = "\u00A1" 4604 4605 4606 class VIEW3D_MT_edit_font_kerning (Menu): 4607 bl_label = "Kerning" 4608 4609 def draw (self, context): 4610 layout = self.layout 4611 4612 ob = context.active_object 4613 text = ob.data 4614 kerning = text.edit_format.kerning 4615 4616 layout. operator ( "font.change_spacing" , text= "Decrease Kerning" ).delta = - 1 4617 layout. operator ( "font.change_spacing" , text= "Increase Kerning" ).delta = 1 4618 layout. operator ( "font.change_spacing" , text= "Reset Kerning" ).delta = -kerning 4619 4620 4621 class VIEW3D_MT_edit_font_delete (Menu): 4622 bl_label = "Delete" 4623 4624 def draw (self, _context): 4625 layout = self.layout 4626 4627 layout. operator ( "font.delete" , text= "Previous Character" ). type = 'PREVIOUS_CHARACTER' 4628 layout. operator ( "font.delete" , text= "Next Character" ). type = 'NEXT_CHARACTER' 4629 layout. operator ( "font.delete" , text= "Previous Word" ). type = 'PREVIOUS_WORD' 4630 layout. operator ( "font.delete" , text= "Next Word" ). type = 'NEXT_WORD' 4631 4632 4633 class VIEW3D_MT_edit_font (Menu): 4634 bl_label = "Text" 4635 4636 def draw (self, _context): 4637 layout = self.layout 4638 4639 layout. operator ( "font.text_cut" , text= "Cut" ) 4640 layout. operator ( "font.text_copy" , text= "Copy" , icon= 'COPYDOWN' ) 4641 layout. operator ( "font.text_paste" , text= "Paste" , icon= 'PASTEDOWN' ) 4642 4643 layout. separator () 4644 4645 layout. operator ( "font.text_paste_from_file" ) 4646 4647 layout. separator () 4648 4649 layout. operator ( "font.case_set" , text= "To Uppercase" ).case = 'UPPER' 4650 layout. operator ( "font.case_set" , text= "To Lowercase" ).case = 'LOWER' 4651 4652 layout. separator () 4653 4654 layout. menu ( "VIEW3D_MT_edit_font_chars" ) 4655 4656 layout. separator () 4657 4658 layout. operator ( "font.style_toggle" , text= "Toggle Bold" , icon= 'BOLD' ).style = 'BOLD' 4659 layout. operator ( "font.style_toggle" , text= "Toggle Italic" , icon= 'ITALIC' ).style = 'ITALIC' 4660 layout. operator ( "font.style_toggle" , text= "Toggle Underline" , icon= 'UNDERLINE' ).style = 'UNDERLINE' 4661 layout. operator ( "font.style_toggle" , text= "Toggle Small Caps" , icon= 'SMALL_CAPS' ).style = 'SMALL_CAPS' 4662 4663 layout. menu ( "VIEW3D_MT_edit_font_kerning" ) 4664 4665 layout. separator () 4666 4667 layout. menu ( "VIEW3D_MT_edit_font_delete" ) 4668 4669 4670 class VIEW3D_MT_edit_font_context_menu (Menu): 4671 bl_label = "Text Context Menu" 4672 4673 def draw (self, _context): 4674 layout = self.layout 4675 4676 layout.operator_context = 'INVOKE_DEFAULT' 4677 4678 layout. operator ( "font.text_cut" , text= "Cut" ) 4679 layout. operator ( "font.text_copy" , text= "Copy" , icon= 'COPYDOWN' ) 4680 layout. operator ( "font.text_paste" , text= "Paste" , icon= 'PASTEDOWN' ) 4681 4682 layout. separator () 4683 4684 layout. operator ( "font.select_all" ) 4685 4686 layout. separator () 4687 4688 layout. menu ( "VIEW3D_MT_edit_font" ) 4689 4690 4691 class VIEW3D_MT_edit_meta (Menu): 4692 bl_label = "Metaball" 4693 4694 def draw (self, _context): 4695 layout = self.layout 4696 4697 layout. menu ( "VIEW3D_MT_transform" ) 4698 layout. menu ( "VIEW3D_MT_mirror" ) 4699 layout. menu ( "VIEW3D_MT_snap" ) 4700 4701 layout. separator () 4702 4703 layout. operator ( "mball.duplicate_metaelems" ) 4704 4705 layout. separator () 4706 4707 layout. menu ( "VIEW3D_MT_edit_meta_showhide" ) 4708 4709 layout.operator_context = 'EXEC_REGION_WIN' 4710 layout. operator ( "mball.delete_metaelems" , text= "Delete" ) 4711 4712 4713 class VIEW3D_MT_edit_meta_showhide (Menu): 4714 bl_label = "Show/Hide" 4715 4716 def draw (self, _context): 4717 layout = self.layout 4718 4719 layout. operator ( "mball.reveal_metaelems" ) 4720 layout. operator ( "mball.hide_metaelems" , text= "Hide Selected" ).unselected = False 4721 layout. operator ( "mball.hide_metaelems" , text= "Hide Unselected" ).unselected = True 4722 4723 4724 class VIEW3D_MT_edit_lattice (Menu): 4725 bl_label = "Lattice" 4726 4727 def draw (self, _context): 4728 layout = self.layout 4729 4730 layout. separator () 4731 4732 layout. menu ( "VIEW3D_MT_transform" ) 4733 layout. menu ( "VIEW3D_MT_mirror" ) 4734 layout. menu ( "VIEW3D_MT_snap" ) 4735 layout. operator_menu_enum ( "lattice.flip" , "axis" ) 4736 4737 layout. separator () 4738 4739 layout. operator ( "lattice.make_regular" ) 4740 4741 layout. separator () 4742 4743 layout. operator ( "object.vertex_parent_set" ) 4744 4745 4746 class VIEW3D_MT_edit_armature (Menu): 4747 bl_label = "Armature" 4748 4749 def draw (self, context): 4750 layout = self.layout 4751 4752 edit_object = context.edit_object 4753 arm = edit_object.data 4754 4755 layout. menu ( "VIEW3D_MT_transform_armature" ) 4756 layout. menu ( "VIEW3D_MT_mirror" ) 4757 layout. menu ( "VIEW3D_MT_snap" ) 4758 layout. menu ( "VIEW3D_MT_edit_armature_roll" ) 4759 4760 layout. separator () 4761 4762 layout. operator ( "armature.extrude_move" ) 4763 layout. operator ( "armature.click_extrude" ) 4764 4765 if arm.use_mirror_x: 4766 layout. operator ( "armature.extrude_forked" ) 4767 4768 layout. operator ( "armature.duplicate_move" ) 4769 layout. operator ( "armature.fill" ) 4770 4771 layout. separator () 4772 4773 layout. operator ( "armature.split" ) 4774 layout. operator ( "armature.separate" ) 4775 4776 layout. separator () 4777 4778 layout. operator ( "armature.subdivide" , text= "Subdivide" ) 4779 layout. operator ( "armature.switch_direction" , text= "Switch Direction" ) 4780 4781 layout. separator () 4782 4783 layout. operator ( "armature.symmetrize" ) 4784 layout. menu ( "VIEW3D_MT_edit_armature_names" ) 4785 4786 layout. separator () 4787 4788 layout.operator_context = 'INVOKE_DEFAULT' 4789 layout. operator ( "armature.armature_layers" ) 4790 layout. operator ( "armature.bone_layers" ) 4791 4792 layout. separator () 4793 4794 layout. menu ( "VIEW3D_MT_edit_armature_parent" ) 4795 4796 layout. separator () 4797 4798 layout. menu ( "VIEW3D_MT_bone_options_toggle" , text= "Bone Settings" ) 4799 4800 layout. separator () 4801 4802 layout. menu ( "VIEW3D_MT_edit_armature_delete" ) 4803 4804 4805 class VIEW3D_MT_armature_context_menu (Menu): 4806 bl_label = "Armature Context Menu" 4807 4808 def draw (self, context): 4809 layout = self.layout 4810 4811 edit_object = context.edit_object 4812 arm = edit_object.data 4813 4814 layout.operator_context = 'INVOKE_REGION_WIN' 4815 4816 # Add 4817 layout. operator ( "armature.subdivide" , text= "Subdivide" ) 4818 layout. operator ( "armature.duplicate_move" , text= "Duplicate" ) 4819 layout. operator ( "armature.extrude_move" ) 4820 if arm.use_mirror_x: 4821 layout. operator ( "armature.extrude_forked" ) 4822 4823 layout. separator () 4824 4825 layout. operator ( "armature.fill" ) 4826 4827 layout. separator () 4828 4829 # Modify 4830 layout. menu ( "VIEW3D_MT_mirror" ) 4831 layout. menu ( "VIEW3D_MT_snap" ) 4832 layout. operator ( "armature.symmetrize" ) 4833 layout. operator ( "armature.switch_direction" , text= "Switch Direction" ) 4834 layout. menu ( "VIEW3D_MT_edit_armature_names" ) 4835 4836 layout. separator () 4837 4838 layout. menu ( "VIEW3D_MT_edit_armature_parent" ) 4839 4840 layout. separator () 4841 4842 # Remove 4843 layout. operator ( "armature.split" ) 4844 layout. operator ( "armature.separate" ) 4845 layout. operator ( "armature.dissolve" ) 4846 layout. operator ( "armature.delete" ) 4847 4848 4849 class VIEW3D_MT_edit_armature_names (Menu): 4850 bl_label = "Names" 4851 4852 def draw (self, _context): 4853 layout = self.layout 4854 4855 layout.operator_context = 'EXEC_REGION_WIN' 4856 layout. operator ( "armature.autoside_names" , text= "Auto-Name Left/Right" ). type = 'XAXIS' 4857 layout. operator ( "armature.autoside_names" , text= "Auto-Name Front/Back" ). type = 'YAXIS' 4858 layout. operator ( "armature.autoside_names" , text= "Auto-Name Top/Bottom" ). type = 'ZAXIS' 4859 layout. operator ( "armature.flip_names" , text= "Flip Names" ) 4860 4861 4862 class VIEW3D_MT_edit_armature_parent (Menu): 4863 bl_label = "Parent" 4864 4865 def draw (self, _context): 4866 layout = self.layout 4867 4868 layout. operator ( "armature.parent_set" , text= "Make" ) 4869 layout. operator ( "armature.parent_clear" , text= "Clear" ) 4870 4871 4872 class VIEW3D_MT_edit_armature_roll (Menu): 4873 bl_label = "Bone Roll" 4874 4875 def draw (self, _context): 4876 layout = self.layout 4877 4878 layout. operator_menu_enum ( "armature.calculate_roll" , "type" ) 4879 4880 layout. separator () 4881 4882 layout. operator ( "transform.transform" , text= "Set Roll" ).mode = 'BONE_ROLL' 4883 layout. operator ( "armature.roll_clear" ) 4884 4885 4886 class VIEW3D_MT_edit_armature_delete (Menu): 4887 bl_label = "Delete" 4888 4889 def draw (self, _context): 4890 layout = self.layout 4891 layout.operator_context = 'EXEC_AREA' 4892 4893 layout. operator ( "armature.delete" , text= "Bones" ) 4894 4895 layout. separator () 4896 4897 layout. operator ( "armature.dissolve" , text= "Dissolve Bones" ) 4898 4899 4900 # ********** Grease Pencil menus ********** 4901 class VIEW3D_MT_gpencil_autoweights (Menu): 4902 bl_label = "Generate Weights" 4903 4904 def draw (self, _context): 4905 layout = self.layout 4906 layout. operator ( "gpencil.generate_weights" , text= "With Empty Groups" ).mode = 'NAME' 4907 layout. operator ( "gpencil.generate_weights" , text= "With Automatic Weights" ).mode = 'AUTO' 4908 4909 4910 class VIEW3D_MT_gpencil_simplify (Menu): 4911 bl_label = "Simplify" 4912 4913 def draw (self, _context): 4914 layout = self.layout 4915 layout. operator ( "gpencil.stroke_simplify_fixed" , text= "Fixed" ) 4916 layout. operator ( "gpencil.stroke_simplify" , text= "Adaptive" ) 4917 layout. operator ( "gpencil.stroke_sample" , text= "Sample" ) 4918 4919 4920 class VIEW3D_MT_draw_gpencil (Menu): 4921 bl_label = "Draw" 4922 4923 def draw (self, _context): 4924 4925 layout = self.layout 4926 4927 layout. menu ( "GPENCIL_MT_layer_active" , text= "Active Layer" ) 4928 4929 layout. separator () 4930 4931 layout. menu ( "VIEW3D_MT_gpencil_animation" ) 4932 layout. operator ( "gpencil.interpolate_sequence" , text= "Interpolate Sequence" ) 4933 4934 layout. separator () 4935 4936 layout. menu ( "VIEW3D_MT_edit_gpencil_showhide" ) 4937 layout. menu ( "GPENCIL_MT_cleanup" ) 4938 4939 4940 class VIEW3D_MT_assign_material (Menu): 4941 bl_label = "Assign Material" 4942 4943 def draw (self, context): 4944 layout = self.layout 4945 ob = context.active_object 4946 mat_active = ob.active_material 4947 4948 for slot in ob.material_slots: 4949 mat = slot.material 4950 if mat: 4951 layout. operator ( "gpencil.stroke_change_color" , text=mat.name, 4952 icon= 'LAYER_ACTIVE' if mat == mat_active else 'BLANK1' ).material = mat.name 4953 4954 4955 class VIEW3D_MT_edit_gpencil (Menu): 4956 bl_label = "Grease Pencil" 4957 4958 def draw (self, _context): 4959 layout = self.layout 4960 4961 layout. menu ( "VIEW3D_MT_edit_gpencil_transform" ) 4962 layout. menu ( "VIEW3D_MT_mirror" ) 4963 layout. menu ( "GPENCIL_MT_snap" ) 4964 4965 layout. separator () 4966 4967 layout. menu ( "GPENCIL_MT_layer_active" , text= "Active Layer" ) 4968 4969 layout. separator () 4970 4971 layout. menu ( "VIEW3D_MT_gpencil_animation" ) 4972 layout. operator ( "gpencil.interpolate_sequence" , text= "Interpolate Sequence" ) 4973 4974 layout. separator () 4975 4976 # Cut, Copy, Paste 4977 layout. operator ( "gpencil.duplicate_move" , text= "Duplicate" ) 4978 layout. operator ( "gpencil.stroke_split" , text= "Split" ) 4979 layout. operator ( "gpencil.copy" , text= "Copy" , icon= 'COPYDOWN' ) 4980 layout. operator ( "gpencil.paste" , text= "Paste" , icon= 'PASTEDOWN' ). type = 'ACTIVE' 4981 layout. operator ( "gpencil.paste" , text= "Paste by Layer" ). type = 'LAYER' 4982 4983 layout. separator () 4984 4985 layout. menu ( "VIEW3D_MT_weight_gpencil" ) 4986 4987 layout. separator () 4988 4989 layout. menu ( "VIEW3D_MT_edit_gpencil_showhide" ) 4990 4991 layout. operator_menu_enum ( "gpencil.stroke_separate" , "mode" , text= "Separate" ) 4992 layout. menu ( "GPENCIL_MT_cleanup" ) 4993 4994 layout. separator () 4995 4996 # Remove 4997 layout. menu ( "VIEW3D_MT_edit_gpencil_delete" ) 4998 4999 5000 class VIEW3D_MT_edit_gpencil_stroke (Menu): 5001 bl_label = "Stroke" 5002 5003 def draw (self, context): 5004 layout = self.layout 5005 settings = context.tool_settings.gpencil_sculpt 5006 5007 layout. operator ( "gpencil.stroke_subdivide" , text= "Subdivide" ).only_selected = False 5008 layout. menu ( "VIEW3D_MT_gpencil_simplify" ) 5009 layout. operator ( "gpencil.stroke_trim" , text= "Trim" ) 5010 5011 layout. separator () 5012 5013 layout. operator_menu_enum ( "gpencil.stroke_join" , "type" , text= "Join" ) 5014 5015 layout. separator () 5016 5017 layout. menu ( "GPENCIL_MT_move_to_layer" ) 5018 layout. menu ( "VIEW3D_MT_assign_material" ) 5019 layout. operator ( "gpencil.set_active_material" , text= "Set as Active Material" ) 5020 layout. operator_menu_enum ( "gpencil.stroke_arrange" , "direction" , text= "Arrange" ) 5021 5022 layout. separator () 5023 5024 # Convert 5025 op = layout. operator ( "gpencil.stroke_cyclical_set" , text= "Close" ) 5026 op. type = 'CLOSE' 5027 op.geometry = True 5028 layout. operator ( "gpencil.stroke_cyclical_set" , text= "Toggle Cyclic" ). type = 'TOGGLE' 5029 layout. operator_menu_enum ( "gpencil.stroke_caps_set" , text= "Toggle Caps" , property = "type" ) 5030 layout. operator ( "gpencil.stroke_flip" , text= "Switch Direction" ) 5031 layout. prop (settings, "use_scale_thickness" , text= "Scale Thickness" ) 5032 5033 layout. separator () 5034 layout. operator ( "gpencil.stroke_normalize" , text= "Normalize Thickness" ).mode = 'THICKNESS' 5035 layout. operator ( "gpencil.stroke_normalize" , text= "Normalize Opacity" ).mode = 'OPACITY' 5036 5037 layout. separator () 5038 layout. operator ( "gpencil.reset_transform_fill" , text= "Reset Fill Transform" ) 5039 5040 5041 class VIEW3D_MT_edit_gpencil_point (Menu): 5042 bl_label = "Point" 5043 5044 def draw (self, _context): 5045 layout = self.layout 5046 5047 layout. operator ( "gpencil.extrude_move" , text= "Extrude" ) 5048 5049 layout. separator () 5050 5051 layout. operator ( "gpencil.stroke_smooth" , text= "Smooth" ).only_selected = True 5052 5053 layout. separator () 5054 5055 layout. operator ( "gpencil.stroke_merge" , text= "Merge" ) 5056 5057 # TODO: add new RIP operator 5058 5059 layout. separator () 5060 5061 layout. menu ( "VIEW3D_MT_gpencil_vertex_group" ) 5062 5063 5064 class VIEW3D_MT_weight_gpencil (Menu): 5065 bl_label = "Weights" 5066 5067 def draw (self, _context): 5068 layout = self.layout 5069 5070 layout. operator ( "gpencil.vertex_group_normalize_all" , text= "Normalize All" ) 5071 layout. operator ( "gpencil.vertex_group_normalize" , text= "Normalize" ) 5072 5073 layout. separator () 5074 5075 layout. operator ( "gpencil.vertex_group_invert" , text= "Invert" ) 5076 layout. operator ( "gpencil.vertex_group_smooth" , text= "Smooth" ) 5077 5078 layout. separator () 5079 5080 layout. menu ( "VIEW3D_MT_gpencil_autoweights" ) 5081 5082 5083 class VIEW3D_MT_gpencil_animation (Menu): 5084 bl_label = "Animation" 5085 5086 @classmethod 5087 def poll (cls, context): 5088 ob = context.active_object 5089 return ob and ob. type == 'GPENCIL' and ob.mode != 'OBJECT' 5090 5091 def draw (self, _context): 5092 layout = self.layout 5093 5094 layout. operator ( "gpencil.blank_frame_add" , text= "Insert Blank Keyframe (Active Layer)" ) 5095 layout. operator ( "gpencil.blank_frame_add" , text= "Insert Blank Keyframe (All Layers)" ).all_layers = True 5096 5097 layout. separator () 5098 5099 layout. operator ( "gpencil.frame_duplicate" , text= "Duplicate Active Keyframe (Active Layer)" ) 5100 layout. operator ( "gpencil.frame_duplicate" , text= "Duplicate Active Keyframe (All Layers)" ).mode = 'ALL' 5101 5102 layout. separator () 5103 5104 layout. operator ( "gpencil.delete" , text= "Delete Active Keyframe (Active Layer)" ). type = 'FRAME' 5105 layout. operator ( "gpencil.active_frames_delete_all" , text= "Delete Active Keyframes (All Layers)" ) 5106 5107 5108 class VIEW3D_MT_edit_gpencil_transform (Menu): 5109 bl_label = "Transform" 5110 5111 def draw (self, _context): 5112 layout = self.layout 5113 5114 layout. operator ( "transform.translate" ) 5115 layout. operator ( "transform.rotate" ) 5116 layout. operator ( "transform.resize" , text= "Scale" ) 5117 5118 layout. separator () 5119 5120 layout. operator ( "transform.bend" , text= "Bend" ) 5121 layout. operator ( "transform.shear" , text= "Shear" ) 5122 layout. operator ( "transform.tosphere" , text= "To Sphere" ) 5123 layout. operator ( "transform.transform" , text= "Shrink/Fatten" ).mode = 'GPENCIL_SHRINKFATTEN' 5124 5125 5126 class VIEW3D_MT_edit_gpencil_showhide (Menu): 5127 bl_label = "Show/Hide" 5128 5129 def draw (self, _context): 5130 layout = self.layout 5131 5132 layout. operator ( "gpencil.reveal" , text= "Show All Layers" ) 5133 5134 layout. separator () 5135 5136 layout. operator ( "gpencil.hide" , text= "Hide Active Layer" ).unselected = False 5137 layout. operator ( "gpencil.hide" , text= "Hide Inactive Layers" ).unselected = True 5138 5139 5140 class VIEW3D_MT_object_mode_pie (Menu): 5141 bl_label = "Mode" 5142 5143 def draw (self, _context): 5144 layout = self.layout 5145 5146 pie = layout. menu_pie () 5147 pie. operator_enum ( "object.mode_set" , "mode" ) 5148 5149 5150 class VIEW3D_MT_view_pie (Menu): 5151 bl_label = "View" 5152 bl_idname = "VIEW3D_MT_view_pie" 5153 5154 def draw (self, _context): 5155 layout = self.layout 5156 5157 pie = layout. menu_pie () 5158 pie. operator_enum ( "view3d.view_axis" , "type" ) 5159 pie. operator ( "view3d.view_camera" , text= "View Camera" , icon= 'CAMERA_DATA' ) 5160 pie. operator ( "view3d.view_selected" , text= "View Selected" , icon= 'ZOOM_SELECTED' ) 5161 5162 5163 class VIEW3D_MT_transform_gizmo_pie (Menu): 5164 bl_label = "View" 5165 5166 def draw (self, context): 5167 layout = self.layout 5168 5169 pie = layout. menu_pie () 5170 # 1: Left 5171 pie. operator ( "view3d.transform_gizmo_set" , text= "Move" ). type = { 'TRANSLATE' } 5172 # 2: Right 5173 pie. operator ( "view3d.transform_gizmo_set" , text= "Rotate" ). type = { 'ROTATE' } 5174 # 3: Down 5175 pie. operator ( "view3d.transform_gizmo_set" , text= "Scale" ). type = { 'SCALE' } 5176 # 4: Up 5177 pie. prop (context.space_data, "show_gizmo" , text= "Show Gizmos" , icon= 'GIZMO' ) 5178 # 5: Up/Left 5179 pie. operator ( "view3d.transform_gizmo_set" , text= "All" ). type = { 'TRANSLATE' , 'ROTATE' , 'SCALE' } 5180 5181 5182 class VIEW3D_MT_shading_pie (Menu): 5183 bl_label = "Shading" 5184 5185 def draw (self, context): 5186 layout = self.layout 5187 pie = layout. menu_pie () 5188 5189 view = context.space_data 5190 5191 pie. prop (view.shading, "type" , expand= True ) 5192 5193 5194 class VIEW3D_MT_shading_ex_pie (Menu): 5195 bl_label = "Shading" 5196 5197 def draw (self, context): 5198 layout = self.layout 5199 pie = layout. menu_pie () 5200 5201 view = context.space_data 5202 5203 pie. prop_enum (view.shading, "type" , value= 'WIREFRAME' ) 5204 pie. prop_enum (view.shading, "type" , value= 'SOLID' ) 5205 5206 # Note this duplicates "view3d.toggle_xray" logic, so we can see the active item: T58661. 5207 if context.pose_object: 5208 pie. prop (view.overlay, "show_xray_bone" , icon= 'XRAY' ) 5209 else : 5210 xray_active = ( 5211 (context.mode == 'EDIT_MESH' ) or 5212 (view.shading. type in { 'SOLID' , 'WIREFRAME' }) 5213 ) 5214 if xray_active: 5215 sub = pie 5216 else : 5217 sub = pie. row () 5218 sub.active = False 5219 sub. prop ( 5220 view.shading, 5221 "show_xray_wireframe" if (view.shading. type == 'WIREFRAME' ) else "show_xray" , 5222 text= "Toggle X-Ray" , 5223 icon= 'XRAY' , 5224 ) 5225 5226 pie. prop (view.overlay, "show_overlays" , text= "Toggle Overlays" , icon= 'OVERLAY' ) 5227 5228 pie. prop_enum (view.shading, "type" , value= 'MATERIAL' ) 5229 pie. prop_enum (view.shading, "type" , value= 'RENDERED' ) 5230 5231 5232 class VIEW3D_MT_pivot_pie (Menu): 5233 bl_label = "Pivot Point" 5234 5235 def draw (self, context): 5236 layout = self.layout 5237 pie = layout. menu_pie () 5238 obj = context.active_object 5239 mode = context.mode 5240 5241 pie. prop_enum (context.scene.tool_settings, "transform_pivot_point" , value= 'BOUNDING_BOX_CENTER' ) 5242 pie. prop_enum (context.scene.tool_settings, "transform_pivot_point" , value= 'CURSOR' ) 5243 pie. prop_enum (context.scene.tool_settings, "transform_pivot_point" , value= 'INDIVIDUAL_ORIGINS' ) 5244 pie. prop_enum (context.scene.tool_settings, "transform_pivot_point" , value= 'MEDIAN_POINT' ) 5245 pie. prop_enum (context.scene.tool_settings, "transform_pivot_point" , value= 'ACTIVE_ELEMENT' ) 5246 if (obj is None ) or (mode in { 'OBJECT' , 'POSE' , 'WEIGHT_PAINT' }): 5247 pie. prop (context.scene.tool_settings, "use_transform_pivot_point_align" ) 5248 5249 5250 class VIEW3D_MT_orientations_pie (Menu): 5251 bl_label = "Orientation" 5252 5253 def draw (self, context): 5254 layout = self.layout 5255 pie = layout. menu_pie () 5256 scene = context.scene 5257 5258 pie. prop (scene.transform_orientation_slots[ 0 ], "type" , expand= True ) 5259 5260 5261 class VIEW3D_MT_snap_pie (Menu): 5262 bl_label = "Snap" 5263 5264 def draw (self, _context): 5265 layout = self.layout 5266 pie = layout. menu_pie () 5267 5268 pie. operator ( "view3d.snap_cursor_to_grid" , text= "Cursor to Grid" , icon= 'CURSOR' ) 5269 pie. operator ( "view3d.snap_selected_to_grid" , text= "Selection to Grid" , icon= 'RESTRICT_SELECT_OFF' ) 5270 pie. operator ( "view3d.snap_cursor_to_selected" , text= "Cursor to Selected" , icon= 'CURSOR' ) 5271 pie. operator ( 5272 "view3d.snap_selected_to_cursor" , 5273 text= "Selection to Cursor" , 5274 icon= 'RESTRICT_SELECT_OFF' , 5275 ).use_offset = False 5276 pie. operator ( 5277 "view3d.snap_selected_to_cursor" , 5278 text= "Selection to Cursor (Keep Offset)" , 5279 icon= 'RESTRICT_SELECT_OFF' , 5280 ).use_offset = True 5281 pie. operator ( "view3d.snap_selected_to_active" , text= "Selection to Active" , icon= 'RESTRICT_SELECT_OFF' ) 5282 pie. operator ( "view3d.snap_cursor_to_center" , text= "Cursor to World Origin" , icon= 'CURSOR' ) 5283 pie. operator ( "view3d.snap_cursor_to_active" , text= "Cursor to Active" , icon= 'CURSOR' ) 5284 5285 5286 class VIEW3D_MT_proportional_editing_falloff_pie (Menu): 5287 bl_label = "Proportional Editing Falloff" 5288 5289 def draw (self, context): 5290 layout = self.layout 5291 pie = layout. menu_pie () 5292 tool_settings = context.scene.tool_settings 5293 5294 pie. prop (tool_settings, "proportional_edit_falloff" , expand= True ) 5295 5296 5297 class VIEW3D_MT_sculpt_mask_edit_pie (Menu): 5298 bl_label = "Mask Edit" 5299 5300 def draw (self, _context): 5301 layout = self.layout 5302 pie = layout. menu_pie () 5303 5304 op = pie. operator ( "paint.mask_flood_fill" , text= 'Invert Mask' ) 5305 op.mode = 'INVERT' 5306 op = pie. operator ( "paint.mask_flood_fill" , text= 'Clear Mask' ) 5307 op.mode = 'VALUE' 5308 op.value = 0.0 5309 op = pie. operator ( "sculpt.mask_filter" , text= 'Smooth Mask' ) 5310 op.filter_type = 'SMOOTH' 5311 op.auto_iteration_count = True 5312 op = pie. operator ( "sculpt.mask_filter" , text= 'Sharpen Mask' ) 5313 op.filter_type = 'SHARPEN' 5314 op.auto_iteration_count = True 5315 op = pie. operator ( "sculpt.mask_filter" , text= 'Grow Mask' ) 5316 op.filter_type = 'GROW' 5317 op.auto_iteration_count = True 5318 op = pie. operator ( "sculpt.mask_filter" , text= 'Shrink Mask' ) 5319 op.filter_type = 'SHRINK' 5320 op.auto_iteration_count = True 5321 op = pie. operator ( "sculpt.mask_filter" , text= 'Increase Contrast' ) 5322 op.filter_type = 'CONTRAST_INCREASE' 5323 op.auto_iteration_count = False 5324 op = pie. operator ( "sculpt.mask_filter" , text= 'Decrease Contrast' ) 5325 op.filter_type = 'CONTRAST_DECREASE' 5326 op.auto_iteration_count = False 5327 5328 5329 class VIEW3D_MT_sculpt_automasking_pie (Menu): 5330 bl_label = "Automasking" 5331 5332 def draw (self, context): 5333 layout = self.layout 5334 pie = layout. menu_pie () 5335 5336 tool_settings = context.tool_settings 5337 sculpt = tool_settings.sculpt 5338 5339 pie. prop (sculpt, "use_automasking_topology" , text= "Topology" ) 5340 pie. prop (sculpt, "use_automasking_face_sets" , text= "Face Sets" ) 5341 pie. prop (sculpt, "use_automasking_boundary_edges" , text= "Mesh Boundary" ) 5342 pie. prop (sculpt, "use_automasking_boundary_face_sets" , text= "Face Sets Boundary" ) 5343 5344 5345 class VIEW3D_MT_sculpt_face_sets_edit_pie (Menu): 5346 5347 bl_label = "Face Sets Edit" 5348 5349 def draw (self, _context): 5350 layout = self.layout 5351 pie = layout. menu_pie () 5352 5353 op = pie. operator ( "sculpt.face_sets_create" , text= 'Face Set from Masked' ) 5354 op.mode = 'MASKED' 5355 5356 op = pie. operator ( "sculpt.face_sets_create" , text= 'Face Set from Visible' ) 5357 op.mode = 'VISIBLE' 5358 5359 op = pie. operator ( "sculpt.face_set_change_visibility" , text= 'Invert Visible' ) 5360 op.mode = 'INVERT' 5361 5362 op = pie. operator ( "sculpt.face_set_change_visibility" , text= 'Show All' ) 5363 op.mode = 'SHOW_ALL' 5364 5365 5366 class VIEW3D_MT_wpaint_vgroup_lock_pie (Menu): 5367 bl_label = "Vertex Group Locks" 5368 5369 def draw (self, _context): 5370 layout = self.layout 5371 pie = layout. menu_pie () 5372 5373 # 1: Left 5374 op = pie. operator ( "object.vertex_group_lock" , icon= 'LOCKED' , text= "Lock All" ) 5375 op.action, op.mask = 'LOCK' , 'ALL' 5376 # 2: Right 5377 op = pie. operator ( "object.vertex_group_lock" , icon= 'UNLOCKED' , text= "Unlock All" ) 5378 op.action, op.mask = 'UNLOCK' , 'ALL' 5379 # 3: Down 5380 op = pie. operator ( "object.vertex_group_lock" , icon= 'UNLOCKED' , text= "Unlock Selected" ) 5381 op.action, op.mask = 'UNLOCK' , 'SELECTED' 5382 # 4: Up 5383 op = pie. operator ( "object.vertex_group_lock" , icon= 'LOCKED' , text= "Lock Selected" ) 5384 op.action, op.mask = 'LOCK' , 'SELECTED' 5385 # 5: Up/Left 5386 op = pie. operator ( "object.vertex_group_lock" , icon= 'LOCKED' , text= "Lock Unselected" ) 5387 op.action, op.mask = 'LOCK' , 'UNSELECTED' 5388 # 6: Up/Right 5389 op = pie. operator ( "object.vertex_group_lock" , text= "Lock Only Selected" ) 5390 op.action, op.mask = 'LOCK' , 'INVERT_UNSELECTED' 5391 # 7: Down/Left 5392 op = pie. operator ( "object.vertex_group_lock" , text= "Lock Only Unselected" ) 5393 op.action, op.mask = 'UNLOCK' , 'INVERT_UNSELECTED' 5394 # 8: Down/Right 5395 op = pie. operator ( "object.vertex_group_lock" , text= "Invert Locks" ) 5396 op.action, op.mask = 'INVERT' , 'ALL' 5397 5398 5399 # ********** Panel ********** 5400 5401 5402 class VIEW3D_PT_active_tool (Panel, ToolActivePanelHelper): 5403 bl_space_type = 'VIEW_3D' 5404 bl_region_type = 'UI' 5405 bl_category = "Tool" 5406 # See comment below. 5407 # bl_options = {'HIDE_HEADER'} 5408 5409 # Don't show in properties editor. 5410 @classmethod 5411 def poll (cls, context): 5412 return context.area. type == 'VIEW_3D' 5413 5414 5415 # FIXME(campbell): remove this second panel once 'HIDE_HEADER' works with category tabs, 5416 # Currently pinning allows ordering headerless panels below panels with headers. 5417 class VIEW3D_PT_active_tool_duplicate (Panel, ToolActivePanelHelper): 5418 bl_space_type = 'VIEW_3D' 5419 bl_region_type = 'UI' 5420 bl_category = "Tool" 5421 bl_options = { 'HIDE_HEADER' } 5422 5423 # Only show in properties editor. 5424 @classmethod 5425 def poll (cls, context): 5426 return context.area. type != 'VIEW_3D' 5427 5428 5429 class VIEW3D_PT_view3d_properties (Panel): 5430 bl_space_type = 'VIEW_3D' 5431 bl_region_type = 'UI' 5432 bl_category = "View" 5433 bl_label = "View" 5434 5435 def draw (self, context): 5436 layout = self.layout 5437 5438 view = context.space_data 5439 5440 layout.use_property_split = True 5441 layout.use_property_decorate = False # No animation. 5442 5443 col = layout. column () 5444 5445 subcol = col. column () 5446 subcol.active = bool (view.region_3d.view_perspective != 'CAMERA' or view.region_quadviews) 5447 subcol. prop (view, "lens" , text= "Focal Length" ) 5448 5449 subcol = col. column (align= True ) 5450 subcol. prop (view, "clip_start" , text= "Clip Start" ) 5451 subcol. prop (view, "clip_end" , text= "End" ) 5452 5453 layout. separator () 5454 5455 col = layout. column (align= False , heading= "Local Camera" ) 5456 col.use_property_decorate = False 5457 row = col. row (align= True ) 5458 sub = row. row (align= True ) 5459 sub. prop (view, "use_local_camera" , text= "" ) 5460 sub = sub. row (align= True ) 5461 sub.enabled = view.use_local_camera 5462 sub. prop (view, "camera" , text= "" ) 5463 5464 layout. separator () 5465 5466 col = layout. column (align= True ) 5467 col. prop (view, "use_render_border" ) 5468 col.active = view.region_3d.view_perspective != 'CAMERA' 5469 5470 5471 class VIEW3D_PT_view3d_lock (Panel): 5472 bl_space_type = 'VIEW_3D' 5473 bl_region_type = 'UI' 5474 bl_category = "View" 5475 bl_label = "View Lock" 5476 bl_parent_id = "VIEW3D_PT_view3d_properties" 5477 5478 def draw (self, context): 5479 layout = self.layout 5480 5481 layout.use_property_split = True 5482 layout.use_property_decorate = False # No animation. 5483 5484 view = context.space_data 5485 5486 col = layout. column (align= True ) 5487 sub = col. column () 5488 sub.active = bool (view.region_3d.view_perspective != 'CAMERA' or view.region_quadviews) 5489 5490 sub. prop (view, "lock_object" ) 5491 lock_object = view.lock_object 5492 if lock_object: 5493 if lock_object. type == 'ARMATURE' : 5494 sub. prop_search ( 5495 view, "lock_bone" , lock_object.data, 5496 "edit_bones" if lock_object.mode == 'EDIT' 5497 else "bones" , 5498 text= "Bone" , 5499 ) 5500 5501 col = layout. column (heading= "Lock" , align= True ) 5502 if not lock_object: 5503 col. prop (view, "lock_cursor" , text= "To 3D Cursor" ) 5504 col. prop (view, "lock_camera" , text= "Camera to View" ) 5505 5506 5507 class VIEW3D_PT_view3d_cursor (Panel): 5508 bl_space_type = 'VIEW_3D' 5509 bl_region_type = 'UI' 5510 bl_category = "View" 5511 bl_label = "3D Cursor" 5512 5513 def draw (self, context): 5514 layout = self.layout 5515 5516 cursor = context.scene.cursor 5517 5518 layout. column (). prop (cursor, "location" , text= "Location" ) 5519 rotation_mode = cursor.rotation_mode 5520 if rotation_mode == 'QUATERNION' : 5521 layout. column (). prop (cursor, "rotation_quaternion" , text= "Rotation" ) 5522 elif rotation_mode == 'AXIS_ANGLE' : 5523 layout. column (). prop (cursor, "rotation_axis_angle" , text= "Rotation" ) 5524 else : 5525 layout. column (). prop (cursor, "rotation_euler" , text= "Rotation" ) 5526 layout. prop (cursor, "rotation_mode" , text= "" ) 5527 5528 5529 class VIEW3D_PT_collections (Panel): 5530 bl_space_type = 'VIEW_3D' 5531 bl_region_type = 'UI' 5532 bl_category = "View" 5533 bl_label = "Collections" 5534 bl_options = { 'DEFAULT_CLOSED' } 5535 5536 def _draw_collection (self, layout, view_layer, use_local_collections, collection, index): 5537 need_separator = index 5538 for child in collection.children: 5539 index += 1 5540 5541 if child.exclude: 5542 continue 5543 5544 if child.collection.hide_viewport: 5545 continue 5546 5547 if need_separator: 5548 layout. separator () 5549 need_separator = False 5550 5551 icon = 'BLANK1' 5552 # has_objects = True 5553 if child. has_selected_objects (view_layer): 5554 icon = 'LAYER_ACTIVE' 5555 elif child. has_objects (): 5556 icon = 'LAYER_USED' 5557 else : 5558 # has_objects = False 5559 pass 5560 5561 row = layout. row () 5562 row.use_property_decorate = False 5563 sub = row. split (factor= 0.98 ) 5564 subrow = sub. row () 5565 subrow.alignment = 'LEFT' 5566 subrow. operator ( 5567 "object.hide_collection" , text=child.name, icon=icon, emboss= False , 5568 ).collection_index = index 5569 5570 sub = row. split () 5571 subrow = sub. row (align= True ) 5572 subrow.alignment = 'RIGHT' 5573 if not use_local_collections: 5574 subrow.active = collection.is_visible # Parent collection runtime visibility 5575 subrow. prop (child, "hide_viewport" , text= "" , emboss= False ) 5576 else : 5577 subrow.active = collection. visible_get () # Parent collection runtime visibility 5578 icon = 'HIDE_OFF' if child. visible_get () else 'HIDE_ON' 5579 props = subrow. operator ( "object.hide_collection" , text= "" , icon=icon, emboss= False ) 5580 props.collection_index = index 5581 props.toggle = True 5582 5583 for child in collection.children: 5584 index = self._draw_collection(layout, view_layer, use_local_collections, child, index) 5585 5586 return index 5587 5588 def draw (self, context): 5589 layout = self.layout 5590 layout.use_property_split = False 5591 5592 view = context.space_data 5593 view_layer = context.view_layer 5594 5595 layout.use_property_split = True 5596 layout. prop (view, "use_local_collections" ) 5597 layout. separator () 5598 5599 # We pass index 0 here because the index is increased 5600 # so the first real index is 1 5601 # And we start with index as 1 because we skip the master collection 5602 self._draw_collection(layout, view_layer, view.use_local_collections, view_layer.layer_collection, 0 ) 5603 5604 5605 class VIEW3D_PT_object_type_visibility (Panel): 5606 bl_space_type = 'VIEW_3D' 5607 bl_region_type = 'HEADER' 5608 bl_label = "View Object Types" 5609 bl_ui_units_x = 7 5610 5611 def draw (self, context): 5612 layout = self.layout 5613 layout.use_property_split = True 5614 layout.use_property_decorate = False 5615 5616 view = context.space_data 5617 5618 layout. label (text= "Object Types Visibility" ) 5619 layout. separator () 5620 col = layout. column () 5621 5622 attr_object_types = ( 5623 # Geometry 5624 ( "mesh" , "Mesh" ), 5625 ( "curve" , "Curve" ), 5626 ( "surf" , "Surface" ), 5627 ( "meta" , "Meta" ), 5628 ( "font" , "Text" ), 5629 ( "hair" , "Hair" ), 5630 ( "pointcloud" , "Point Cloud" ), 5631 ( "volume" , "Volume" ), 5632 ( "grease_pencil" , "Grease Pencil" ), 5633 ( None , None ), 5634 # Other 5635 ( "armature" , "Armature" ), 5636 ( "lattice" , "Lattice" ), 5637 ( "empty" , "Empty" ), 5638 ( "light" , "Light" ), 5639 ( "light_probe" , "Light Probe" ), 5640 ( "camera" , "Camera" ), 5641 ( "speaker" , "Speaker" ), 5642 ) 5643 5644 for attr, attr_name in attr_object_types: 5645 if attr is None : 5646 col. separator () 5647 continue 5648 5649 if attr == "hair" and not hasattr (bpy.data, "hairs" ): 5650 continue 5651 elif attr == "pointcloud" and not hasattr (bpy.data, "pointclouds" ): 5652 continue 5653 5654 attr_v = "show_object_viewport_" + attr 5655 attr_s = "show_object_select_" + attr 5656 5657 icon_v = 'HIDE_OFF' if getattr (view, attr_v) else 'HIDE_ON' 5658 icon_s = 'RESTRICT_SELECT_OFF' if getattr (view, attr_s) else 'RESTRICT_SELECT_ON' 5659 5660 row = col. row (align= True ) 5661 row.alignment = 'RIGHT' 5662 5663 row. label (text=attr_name) 5664 row. prop (view, attr_v, text= "" , icon=icon_v, emboss= False ) 5665 rowsub = row. row (align= True ) 5666 rowsub.active = getattr (view, attr_v) 5667 rowsub. prop (view, attr_s, text= "" , icon=icon_s, emboss= False ) 5668 5669 5670 class VIEW3D_PT_shading (Panel): 5671 bl_space_type = 'VIEW_3D' 5672 bl_region_type = 'HEADER' 5673 bl_label = "Shading" 5674 bl_ui_units_x = 12 5675 5676 @classmethod 5677 def get_shading (cls, context): 5678 # Get settings from 3D viewport or OpenGL render engine 5679 view = context.space_data 5680 if view. type == 'VIEW_3D' : 5681 return view.shading 5682 else : 5683 return context.scene.display.shading 5684 5685 def draw (self, _context): 5686 layout = self.layout 5687 layout. label (text= "Viewport Shading" ) 5688 5689 5690 class VIEW3D_PT_shading_lighting (Panel): 5691 bl_space_type = 'VIEW_3D' 5692 bl_region_type = 'HEADER' 5693 bl_label = "Lighting" 5694 bl_parent_id = 'VIEW3D_PT_shading' 5695 5696 @classmethod 5697 def poll (cls, context): 5698 shading = VIEW3D_PT_shading. get_shading (context) 5699 engine = context.scene.render.engine 5700 return shading. type in { 'SOLID' , 'MATERIAL' } or engine == 'BLENDER_EEVEE' and shading. type == 'RENDERED' 5701 5702 def draw (self, context): 5703 layout = self.layout 5704 shading = VIEW3D_PT_shading. get_shading (context) 5705 5706 col = layout. column () 5707 split = col. split (factor= 0.9 ) 5708 5709 if shading. type == 'SOLID' : 5710 split. row (). prop (shading, "light" , expand= True ) 5711 col = split. column () 5712 5713 split = layout. split (factor= 0.9 ) 5714 col = split. column () 5715 sub = col. row () 5716 5717 if shading.light == 'STUDIO' : 5718 prefs = context.preferences 5719 system = prefs.system 5720 5721 if not system.use_studio_light_edit: 5722 sub.scale_y = 0.6 # smaller studiolight preview 5723 sub. template_icon_view (shading, "studio_light" , scale_popup= 3.0 ) 5724 else : 5725 sub. prop ( 5726 system, 5727 "use_studio_light_edit" , 5728 text= "Disable Studio Light Edit" , 5729 icon= 'NONE' , 5730 toggle= True , 5731 ) 5732 5733 col = split. column () 5734 col. operator ( "preferences.studiolight_show" , emboss= False , text= "" , icon= 'PREFERENCES' ) 5735 5736 split = layout. split (factor= 0.9 ) 5737 col = split. column () 5738 5739 row = col. row () 5740 row. prop (shading, "use_world_space_lighting" , text= "" , icon= 'WORLD' , toggle= True ) 5741 row = row. row () 5742 row.active = shading.use_world_space_lighting 5743 row. prop (shading, "studiolight_rotate_z" , text= "Rotation" ) 5744 col = split. column () # to align properly with above 5745 5746 elif shading.light == 'MATCAP' : 5747 sub.scale_y = 0.6 # smaller matcap preview 5748 sub. template_icon_view (shading, "studio_light" , scale_popup= 3.0 ) 5749 5750 col = split. column () 5751 col. operator ( "preferences.studiolight_show" , emboss= False , text= "" , icon= 'PREFERENCES' ) 5752 col. operator ( "view3d.toggle_matcap_flip" , emboss= False , text= "" , icon= 'ARROW_LEFTRIGHT' ) 5753 5754 elif shading. type == 'MATERIAL' : 5755 col. prop (shading, "use_scene_lights" ) 5756 col. prop (shading, "use_scene_world" ) 5757 col = layout. column () 5758 split = col. split (factor= 0.9 ) 5759 5760 if not shading.use_scene_world: 5761 col = split. column () 5762 sub = col. row () 5763 sub.scale_y = 0.6 5764 sub. template_icon_view (shading, "studio_light" , scale_popup= 3 ) 5765 5766 col = split. column () 5767 col. operator ( "preferences.studiolight_show" , emboss= False , text= "" , icon= 'PREFERENCES' ) 5768 5769 split = layout. split (factor= 0.9 ) 5770 col = split. column () 5771 5772 row = col. row () 5773 row. prop (shading, "use_studiolight_view_rotation" , text= "" , icon= 'WORLD' , toggle= True ) 5774 row = row. row () 5775 row. prop (shading, "studiolight_rotate_z" , text= "Rotation" ) 5776 5777 col. prop (shading, "studiolight_intensity" ) 5778 col. prop (shading, "studiolight_background_alpha" ) 5779 col. prop (shading, "studiolight_background_blur" ) 5780 col = split. column () # to align properly with above 5781 5782 elif shading. type == 'RENDERED' : 5783 col. prop (shading, "use_scene_lights_render" ) 5784 col. prop (shading, "use_scene_world_render" ) 5785 5786 if not shading.use_scene_world_render: 5787 col = layout. column () 5788 split = col. split (factor= 0.9 ) 5789 5790 col = split. column () 5791 sub = col. row () 5792 sub.scale_y = 0.6 5793 sub. template_icon_view (shading, "studio_light" , scale_popup= 3 ) 5794 5795 col = split. column () 5796 col. operator ( "preferences.studiolight_show" , emboss= False , text= "" , icon= 'PREFERENCES' ) 5797 5798 split = layout. split (factor= 0.9 ) 5799 col = split. column () 5800 col. prop (shading, "studiolight_rotate_z" , text= "Rotation" ) 5801 col. prop (shading, "studiolight_intensity" ) 5802 col. prop (shading, "studiolight_background_alpha" ) 5803 col. prop (shading, "studiolight_background_blur" ) 5804 col = split. column () # to align properly with above 5805 5806 5807 class VIEW3D_PT_shading_color (Panel): 5808 bl_space_type = 'VIEW_3D' 5809 bl_region_type = 'HEADER' 5810 bl_label = "Color" 5811 bl_parent_id = 'VIEW3D_PT_shading' 5812 5813 @classmethod 5814 def poll (cls, context): 5815 shading = VIEW3D_PT_shading. get_shading (context) 5816 return shading. type in { 'WIREFRAME' , 'SOLID' } 5817 5818 def _draw_color_type (self, context): 5819 layout = self.layout 5820 shading = VIEW3D_PT_shading. get_shading (context) 5821 5822 layout. grid_flow (columns= 3 , align= True ). prop (shading, "color_type" , expand= True ) 5823 if shading.color_type == 'SINGLE' : 5824 layout. row (). prop (shading, "single_color" , text= "" ) 5825 5826 def _draw_background_color (self, context): 5827 layout = self.layout 5828 shading = VIEW3D_PT_shading. get_shading (context) 5829 5830 layout. row (). label (text= "Background" ) 5831 layout. row (). prop (shading, "background_type" , expand= True ) 5832 if shading.background_type == 'VIEWPORT' : 5833 layout. row (). prop (shading, "background_color" , text= "" ) 5834 5835 def draw (self, context): 5836 shading = VIEW3D_PT_shading. get_shading (context) 5837 if shading. type == 'WIREFRAME' : 5838 self.layout. row (). prop (shading, "wireframe_color_type" , expand= True ) 5839 else : 5840 self._draw_color_type(context) 5841 self.layout. separator () 5842 self._draw_background_color(context) 5843 5844 5845 class VIEW3D_PT_shading_options (Panel): 5846 bl_space_type = 'VIEW_3D' 5847 bl_region_type = 'HEADER' 5848 bl_label = "Options" 5849 bl_parent_id = 'VIEW3D_PT_shading' 5850 5851 @classmethod 5852 def poll (cls, context): 5853 shading = VIEW3D_PT_shading. get_shading (context) 5854 return shading. type in { 'WIREFRAME' , 'SOLID' } 5855 5856 def draw (self, context): 5857 layout = self.layout 5858 5859 shading = VIEW3D_PT_shading. get_shading (context) 5860 5861 col = layout. column () 5862 5863 if shading. type == 'SOLID' : 5864 col. prop (shading, "show_backface_culling" ) 5865 5866 row = col. row (align= True ) 5867 5868 if shading. type == 'WIREFRAME' : 5869 row. prop (shading, "show_xray_wireframe" , text= "" ) 5870 sub = row. row () 5871 sub.active = shading.show_xray_wireframe 5872 sub. prop (shading, "xray_alpha_wireframe" , text= "X-Ray" ) 5873 elif shading. type == 'SOLID' : 5874 row. prop (shading, "show_xray" , text= "" ) 5875 sub = row. row () 5876 sub.active = shading.show_xray 5877 sub. prop (shading, "xray_alpha" , text= "X-Ray" ) 5878 # X-ray mode is off when alpha is 1.0 5879 xray_active = shading.show_xray and shading.xray_alpha != 1 5880 5881 row = col. row (align= True ) 5882 row. prop (shading, "show_shadows" , text= "" ) 5883 row.active = not xray_active 5884 sub = row. row (align= True ) 5885 sub.active = shading.show_shadows 5886 sub. prop (shading, "shadow_intensity" , text= "Shadow" ) 5887 sub. popover ( 5888 panel= "VIEW3D_PT_shading_options_shadow" , 5889 icon= 'PREFERENCES' , 5890 text= "" , 5891 ) 5892 5893 col = layout. column () 5894 5895 row = col. row () 5896 row.active = not xray_active 5897 row. prop (shading, "show_cavity" ) 5898 5899 if shading.show_cavity and not xray_active: 5900 row. prop (shading, "cavity_type" , text= "Type" ) 5901 5902 if shading.cavity_type in { 'WORLD' , 'BOTH' }: 5903 col. label (text= "World Space" ) 5904 sub = col. row (align= True ) 5905 sub. prop (shading, "cavity_ridge_factor" , text= "Ridge" ) 5906 sub. prop (shading, "cavity_valley_factor" , text= "Valley" ) 5907 sub. popover ( 5908 panel= "VIEW3D_PT_shading_options_ssao" , 5909 icon= 'PREFERENCES' , 5910 text= "" , 5911 ) 5912 5913 if shading.cavity_type in { 'SCREEN' , 'BOTH' }: 5914 col. label (text= "Screen Space" ) 5915 sub = col. row (align= True ) 5916 sub. prop (shading, "curvature_ridge_factor" , text= "Ridge" ) 5917 sub. prop (shading, "curvature_valley_factor" , text= "Valley" ) 5918 5919 row = col. row () 5920 row.active = not xray_active 5921 row. prop (shading, "use_dof" , text= "Depth of Field" ) 5922 5923 if shading. type in { 'WIREFRAME' , 'SOLID' }: 5924 row = layout. split () 5925 row. prop (shading, "show_object_outline" ) 5926 sub = row. row () 5927 sub.active = shading.show_object_outline 5928 sub. prop (shading, "object_outline_color" , text= "" ) 5929 5930 if shading. type == 'SOLID' : 5931 col = layout. column () 5932 if shading.light in { 'STUDIO' , 'MATCAP' }: 5933 col.active = shading.selected_studio_light.has_specular_highlight_pass 5934 col. prop (shading, "show_specular_highlight" , text= "Specular Lighting" ) 5935 5936 5937 class VIEW3D_PT_shading_options_shadow (Panel): 5938 bl_label = "Shadow Settings" 5939 bl_space_type = 'VIEW_3D' 5940 bl_region_type = 'HEADER' 5941 5942 def draw (self, context): 5943 layout = self.layout 5944 layout.use_property_split = True 5945 scene = context.scene 5946 5947 col = layout. column () 5948 col. prop (scene.display, "light_direction" ) 5949 col. prop (scene.display, "shadow_shift" ) 5950 col. prop (scene.display, "shadow_focus" ) 5951 5952 5953 class VIEW3D_PT_shading_options_ssao (Panel): 5954 bl_label = "SSAO Settings" 5955 bl_space_type = 'VIEW_3D' 5956 bl_region_type = 'HEADER' 5957 5958 def draw (self, context): 5959 layout = self.layout 5960 layout.use_property_split = True 5961 scene = context.scene 5962 5963 col = layout. column (align= True ) 5964 col. prop (scene.display, "matcap_ssao_samples" ) 5965 col. prop (scene.display, "matcap_ssao_distance" ) 5966 col. prop (scene.display, "matcap_ssao_attenuation" ) 5967 5968 5969 class VIEW3D_PT_shading_render_pass (Panel): 5970 bl_space_type = 'VIEW_3D' 5971 bl_region_type = 'HEADER' 5972 bl_label = "Render Pass" 5973 bl_parent_id = 'VIEW3D_PT_shading' 5974 COMPAT_ENGINES = { 'BLENDER_EEVEE' } 5975 5976 @classmethod 5977 def poll (cls, context): 5978 return ( 5979 (context.space_data.shading. type == 'MATERIAL' ) or 5980 (context.engine in cls.COMPAT_ENGINES and context.space_data.shading. type == 'RENDERED' ) 5981 ) 5982 5983 def draw (self, context): 5984 shading = context.space_data.shading 5985 5986 layout = self.layout 5987 layout. prop (shading, "render_pass" , text= "" ) 5988 5989 5990 class VIEW3D_PT_gizmo_display (Panel): 5991 bl_space_type = 'VIEW_3D' 5992 bl_region_type = 'HEADER' 5993 bl_label = "Gizmos" 5994 bl_ui_units_x = 8 5995 5996 def draw (self, context): 5997 layout = self.layout 5998 5999 scene = context.scene 6000 view = context.space_data 6001 6002 col = layout. column () 6003 col. label (text= "Viewport Gizmos" ) 6004 col. separator () 6005 6006 col.active = view.show_gizmo 6007 colsub = col. column () 6008 colsub. prop (view, "show_gizmo_navigate" , text= "Navigate" ) 6009 colsub. prop (view, "show_gizmo_tool" , text= "Active Tools" ) 6010 colsub. prop (view, "show_gizmo_context" , text= "Active Object" ) 6011 6012 layout. separator () 6013 6014 col = layout. column () 6015 col.active = view.show_gizmo and view.show_gizmo_context 6016 col. label (text= "Object Gizmos" ) 6017 col. prop (scene.transform_orientation_slots[ 1 ], "type" , text= "" ) 6018 col. prop (view, "show_gizmo_object_translate" , text= "Move" ) 6019 col. prop (view, "show_gizmo_object_rotate" , text= "Rotate" ) 6020 col. prop (view, "show_gizmo_object_scale" , text= "Scale" ) 6021 6022 layout. separator () 6023 6024 # Match order of object type visibility 6025 col = layout. column () 6026 col.active = view.show_gizmo 6027 col. label (text= "Empty" ) 6028 col. prop (view, "show_gizmo_empty_image" , text= "Image" ) 6029 col. prop (view, "show_gizmo_empty_force_field" , text= "Force Field" ) 6030 col. label (text= "Light" ) 6031 col. prop (view, "show_gizmo_light_size" , text= "Size" ) 6032 col. prop (view, "show_gizmo_light_look_at" , text= "Look At" ) 6033 col. label (text= "Camera" ) 6034 col. prop (view, "show_gizmo_camera_lens" , text= "Lens" ) 6035 col. prop (view, "show_gizmo_camera_dof_distance" , text= "Focus Distance" ) 6036 6037 6038 class VIEW3D_PT_overlay (Panel): 6039 bl_space_type = 'VIEW_3D' 6040 bl_region_type = 'HEADER' 6041 bl_label = "Overlays" 6042 bl_ui_units_x = 13 6043 6044 def draw (self, _context): 6045 layout = self.layout 6046 layout. label (text= "Viewport Overlays" ) 6047 6048 6049 class VIEW3D_PT_overlay_guides (Panel): 6050 bl_space_type = 'VIEW_3D' 6051 bl_region_type = 'HEADER' 6052 bl_parent_id = 'VIEW3D_PT_overlay' 6053 bl_label = "Guides" 6054 6055 def draw (self, context): 6056 layout = self.layout 6057 6058 view = context.space_data 6059 scene = context.scene 6060 6061 overlay = view.overlay 6062 shading = view.shading 6063 display_all = overlay.show_overlays 6064 6065 col = layout. column () 6066 col.active = display_all 6067 6068 split = col. split () 6069 sub = split. column () 6070 6071 row = sub. row () 6072 row_el = row. column () 6073 row_el. prop (overlay, "show_ortho_grid" , text= "Grid" ) 6074 grid_active = bool ( 6075 view.region_quadviews or 6076 (view.region_3d.is_orthographic_side_view and not view.region_3d.is_perspective) 6077 ) 6078 row_el.active = grid_active 6079 row. prop (overlay, "show_floor" , text= "Floor" ) 6080 6081 if overlay.show_floor or overlay.show_ortho_grid: 6082 sub = col. row (align= True ) 6083 sub.active = ( 6084 (overlay.show_floor and not view.region_3d.is_orthographic_side_view) or 6085 (overlay.show_ortho_grid and grid_active) 6086 ) 6087 sub. prop (overlay, "grid_scale" , text= "Scale" ) 6088 sub = sub. row (align= True ) 6089 sub.active = scene.unit_settings.system == 'NONE' 6090 sub. prop (overlay, "grid_subdivisions" , text= "Subdivisions" ) 6091 6092 sub = split. column () 6093 row = sub. row () 6094 row. label (text= "Axes" ) 6095 6096 subrow = row. row (align= True ) 6097 subrow. prop (overlay, "show_axis_x" , text= "X" , toggle= True ) 6098 subrow. prop (overlay, "show_axis_y" , text= "Y" , toggle= True ) 6099 subrow. prop (overlay, "show_axis_z" , text= "Z" , toggle= True ) 6100 6101 split = col. split () 6102 sub = split. column () 6103 sub. prop (overlay, "show_text" , text= "Text Info" ) 6104 sub. prop (overlay, "show_stats" , text= "Statistics" ) 6105 6106 sub = split. column () 6107 sub. prop (overlay, "show_cursor" , text= "3D Cursor" ) 6108 sub. prop (overlay, "show_annotation" , text= "Annotations" ) 6109 6110 if shading. type == 'MATERIAL' : 6111 row = col. row () 6112 row.active = shading.render_pass == 'COMBINED' 6113 row. prop (overlay, "show_look_dev" ) 6114 6115 6116 class VIEW3D_PT_overlay_object (Panel): 6117 bl_space_type = 'VIEW_3D' 6118 bl_region_type = 'HEADER' 6119 bl_parent_id = 'VIEW3D_PT_overlay' 6120 bl_label = "Objects" 6121 6122 def draw (self, context): 6123 layout = self.layout 6124 view = context.space_data 6125 overlay = view.overlay 6126 display_all = overlay.show_overlays 6127 6128 col = layout. column (align= True ) 6129 col.active = display_all 6130 6131 split = col. split () 6132 6133 sub = split. column (align= True ) 6134 sub. prop (overlay, "show_extras" , text= "Extras" ) 6135 sub. prop (overlay, "show_relationship_lines" ) 6136 sub. prop (overlay, "show_outline_selected" ) 6137 6138 sub = split. column (align= True ) 6139 sub. prop (overlay, "show_bones" , text= "Bones" ) 6140 sub. prop (overlay, "show_motion_paths" ) 6141 sub. prop (overlay, "show_object_origins" , text= "Origins" ) 6142 subsub = sub. column () 6143 subsub.active = overlay.show_object_origins 6144 subsub. prop (overlay, "show_object_origins_all" , text= "Origins (All)" ) 6145 6146 6147 class VIEW3D_PT_overlay_geometry (Panel): 6148 bl_space_type = 'VIEW_3D' 6149 bl_region_type = 'HEADER' 6150 bl_parent_id = 'VIEW3D_PT_overlay' 6151 bl_label = "Geometry" 6152 6153 def draw (self, context): 6154 layout = self.layout 6155 view = context.space_data 6156 overlay = view.overlay 6157 display_all = overlay.show_overlays 6158 is_wireframes = view.shading. type == 'WIREFRAME' 6159 6160 col = layout. column () 6161 col.active = display_all 6162 6163 row = col. row (align= True ) 6164 if not is_wireframes: 6165 row. prop (overlay, "show_wireframes" , text= "" ) 6166 sub = row. row () 6167 sub.active = overlay.show_wireframes or is_wireframes 6168 sub. prop (overlay, "wireframe_threshold" , text= "Wireframe" ) 6169 sub. prop (overlay, "wireframe_opacity" , text= "Opacity" ) 6170 6171 row = col. row (align= True ) 6172 6173 # These properties should be always available in the UI for all modes 6174 # other than Object. 6175 # Even when the Fade Inactive Geometry overlay is not affecting the 6176 # current active object depending on its mode, it will always affect 6177 # the rest of the scene. 6178 if context.mode != 'OBJECT' : 6179 row. prop (overlay, "show_fade_inactive" , text= "" ) 6180 sub = row. row () 6181 sub.active = overlay.show_fade_inactive 6182 sub. prop (overlay, "fade_inactive_alpha" , text= "Fade Inactive Geometry" ) 6183 6184 col = layout. column (align= True ) 6185 col.active = display_all 6186 6187 col. prop (overlay, "show_face_orientation" ) 6188 6189 # sub.prop(overlay, "show_onion_skins") 6190 6191 6192 class VIEW3D_PT_overlay_motion_tracking (Panel): 6193 bl_space_type = 'VIEW_3D' 6194 bl_region_type = 'HEADER' 6195 bl_parent_id = 'VIEW3D_PT_overlay' 6196 bl_label = "Motion Tracking" 6197 6198 def draw_header (self, context): 6199 layout = self.layout 6200 view = context.space_data 6201 overlay = view.overlay 6202 display_all = overlay.show_overlays 6203 layout.active = display_all 6204 layout. prop (view, "show_reconstruction" , text=self.bl_label) 6205 6206 def draw (self, context): 6207 layout = self.layout 6208 view = context.space_data 6209 overlay = view.overlay 6210 display_all = overlay.show_overlays 6211 6212 col = layout. column () 6213 col.active = display_all 6214 6215 if view.show_reconstruction: 6216 split = col. split () 6217 6218 sub = split. column (align= True ) 6219 sub.active = view.show_reconstruction 6220 sub. prop (view, "show_camera_path" , text= "Camera Path" ) 6221 6222 sub = split. column () 6223 sub. prop (view, "show_bundle_names" , text= "Marker Names" ) 6224 6225 col = layout. column () 6226 col.active = display_all 6227 col. label (text= "Tracks" ) 6228 row = col. row (align= True ) 6229 row. prop (view, "tracks_display_type" , text= "" ) 6230 row. prop (view, "tracks_display_size" , text= "Size" ) 6231 6232 6233 class VIEW3D_PT_overlay_edit_mesh (Panel): 6234 bl_space_type = 'VIEW_3D' 6235 bl_region_type = 'HEADER' 6236 bl_parent_id = 'VIEW3D_PT_overlay' 6237 bl_label = "Mesh Edit Mode" 6238 6239 @classmethod 6240 def poll (cls, context): 6241 return context.mode == 'EDIT_MESH' 6242 6243 def draw (self, context): 6244 layout = self.layout 6245 6246 view = context.space_data 6247 shading = view.shading 6248 overlay = view.overlay 6249 display_all = overlay.show_overlays 6250 6251 is_any_solid_shading = not (shading.show_xray or (shading. type == 'WIREFRAME' )) 6252 6253 col = layout. column () 6254 col.active = display_all 6255 6256 split = col. split () 6257 6258 sub = split. column () 6259 sub.active = is_any_solid_shading 6260 sub. prop (overlay, "show_edges" , text= "Edges" ) 6261 sub = split. column () 6262 sub. prop (overlay, "show_faces" , text= "Faces" ) 6263 sub = split. column () 6264 sub.active = is_any_solid_shading 6265 sub. prop (overlay, "show_face_center" , text= "Center" ) 6266 6267 row = col. row (align= True ) 6268 row. prop (overlay, "show_edge_crease" , text= "Creases" , toggle= True ) 6269 row. prop (overlay, "show_edge_sharp" , text= "Sharp" , text_ctxt=i18n_contexts.plural, toggle= True ) 6270 row. prop (overlay, "show_edge_bevel_weight" , text= "Bevel" , toggle= True ) 6271 row. prop (overlay, "show_edge_seams" , text= "Seams" , toggle= True ) 6272 6273 if context.preferences.view.show_developer_ui: 6274 col. label (text= "Developer" ) 6275 col. prop (overlay, "show_extra_indices" , text= "Indices" ) 6276 6277 6278 class VIEW3D_PT_overlay_edit_mesh_shading (Panel): 6279 bl_space_type = 'VIEW_3D' 6280 bl_region_type = 'HEADER' 6281 bl_parent_id = 'VIEW3D_PT_overlay_edit_mesh' 6282 bl_label = "Shading" 6283 6284 @classmethod 6285 def poll (cls, context): 6286 return context.mode == 'EDIT_MESH' 6287 6288 def draw (self, context): 6289 layout = self.layout 6290 6291 view = context.space_data 6292 shading = view.shading 6293 overlay = view.overlay 6294 tool_settings = context.tool_settings 6295 display_all = overlay.show_overlays 6296 statvis = tool_settings.statvis 6297 6298 col = layout. column () 6299 col.active = display_all 6300 6301 col. prop (overlay, "show_occlude_wire" ) 6302 6303 col. prop (overlay, "show_weight" , text= "Vertex Group Weights" ) 6304 if overlay.show_weight: 6305 row = col. split (factor= 0.33 ) 6306 row. label (text= "Zero Weights" ) 6307 sub = row. row () 6308 sub. prop (tool_settings, "vertex_group_user" , expand= True ) 6309 6310 if shading. type == 'WIREFRAME' : 6311 xray = shading.show_xray_wireframe and shading.xray_alpha_wireframe < 1.0 6312 elif shading. type == 'SOLID' : 6313 xray = shading.show_xray and shading.xray_alpha < 1.0 6314 else : 6315 xray = False 6316 statvis_active = not xray 6317 row = col. row () 6318 row.active = statvis_active 6319 row. prop (overlay, "show_statvis" , text= "Mesh Analysis" ) 6320 if overlay.show_statvis: 6321 col = col. column () 6322 col.active = statvis_active 6323 6324 sub = col. split () 6325 sub. label (text= "Type" ) 6326 sub. prop (statvis, "type" , text= "" ) 6327 6328 statvis_type = statvis. type 6329 if statvis_type == 'OVERHANG' : 6330 row = col. row (align= True ) 6331 row. prop (statvis, "overhang_min" , text= "Minimum" ) 6332 row. prop (statvis, "overhang_max" , text= "Maximum" ) 6333 col. row (). prop (statvis, "overhang_axis" , expand= True ) 6334 elif statvis_type == 'THICKNESS' : 6335 row = col. row (align= True ) 6336 row. prop (statvis, "thickness_min" , text= "Minimum" ) 6337 row. prop (statvis, "thickness_max" , text= "Maximum" ) 6338 col. prop (statvis, "thickness_samples" ) 6339 elif statvis_type == 'INTERSECT' : 6340 pass 6341 elif statvis_type == 'DISTORT' : 6342 row = col. row (align= True ) 6343 row. prop (statvis, "distort_min" , text= "Minimum" ) 6344 row. prop (statvis, "distort_max" , text= "Maximum" ) 6345 elif statvis_type == 'SHARP' : 6346 row = col. row (align= True ) 6347 row. prop (statvis, "sharp_min" , text= "Minimum" ) 6348 row. prop (statvis, "sharp_max" , text= "Maximum" ) 6349 6350 6351 class VIEW3D_PT_overlay_edit_mesh_measurement (Panel): 6352 bl_space_type = 'VIEW_3D' 6353 bl_region_type = 'HEADER' 6354 bl_parent_id = 'VIEW3D_PT_overlay_edit_mesh' 6355 bl_label = "Measurement" 6356 6357 @classmethod 6358 def poll (cls, context): 6359 return context.mode == 'EDIT_MESH' 6360 6361 def draw (self, context): 6362 layout = self.layout 6363 6364 view = context.space_data 6365 overlay = view.overlay 6366 display_all = overlay.show_overlays 6367 6368 col = layout. column () 6369 col.active = display_all 6370 6371 split = col. split () 6372 6373 sub = split. column () 6374 sub. prop (overlay, "show_extra_edge_length" , text= "Edge Length" ) 6375 sub. prop (overlay, "show_extra_edge_angle" , text= "Edge Angle" ) 6376 6377 sub = split. column () 6378 sub. prop (overlay, "show_extra_face_area" , text= "Face Area" ) 6379 sub. prop (overlay, "show_extra_face_angle" , text= "Face Angle" ) 6380 6381 6382 class VIEW3D_PT_overlay_edit_mesh_normals (Panel): 6383 bl_space_type = 'VIEW_3D' 6384 bl_region_type = 'HEADER' 6385 bl_parent_id = 'VIEW3D_PT_overlay_edit_mesh' 6386 bl_label = "Normals" 6387 6388 @classmethod 6389 def poll (cls, context): 6390 return context.mode == 'EDIT_MESH' 6391 6392 def draw (self, context): 6393 layout = self.layout 6394 6395 view = context.space_data 6396 overlay = view.overlay 6397 display_all = overlay.show_overlays 6398 6399 col = layout. column () 6400 col.active = display_all 6401 6402 row = col. row (align= True ) 6403 row. prop (overlay, "show_vertex_normals" , text= "" , icon= 'NORMALS_VERTEX' ) 6404 row. prop (overlay, "show_split_normals" , text= "" , icon= 'NORMALS_VERTEX_FACE' ) 6405 row. prop (overlay, "show_face_normals" , text= "" , icon= 'NORMALS_FACE' ) 6406 6407 sub = row. row (align= True ) 6408 sub.active = overlay.show_vertex_normals or overlay.show_face_normals or overlay.show_split_normals 6409 if overlay.use_normals_constant_screen_size: 6410 sub. prop (overlay, "normals_constant_screen_size" , text= "Size" ) 6411 else : 6412 sub. prop (overlay, "normals_length" , text= "Size" ) 6413 6414 row. prop (overlay, "use_normals_constant_screen_size" , text= "" , icon= 'FIXED_SIZE' ) 6415 6416 6417 6418 class VIEW3D_PT_overlay_edit_mesh_freestyle (Panel): 6419 bl_space_type = 'VIEW_3D' 6420 bl_region_type = 'HEADER' 6421 bl_parent_id = 'VIEW3D_PT_overlay' 6422 bl_label = "Freestyle" 6423 6424 @classmethod 6425 def poll (cls, context): 6426 return context.mode == 'EDIT_MESH' and bpy.app.build_options.freestyle 6427 6428 def draw (self, context): 6429 layout = self.layout 6430 6431 view = context.space_data 6432 overlay = view.overlay 6433 display_all = overlay.show_overlays 6434 6435 col = layout. column () 6436 col.active = display_all 6437 6438 row = col. row () 6439 row. prop (overlay, "show_freestyle_edge_marks" , text= "Edge Marks" ) 6440 row. prop (overlay, "show_freestyle_face_marks" , text= "Face Marks" ) 6441 6442 6443 class VIEW3D_PT_overlay_edit_curve (Panel): 6444 bl_space_type = 'VIEW_3D' 6445 bl_region_type = 'HEADER' 6446 bl_parent_id = 'VIEW3D_PT_overlay' 6447 bl_label = "Curve Edit Mode" 6448 6449 @classmethod 6450 def poll (cls, context): 6451 return context.mode == 'EDIT_CURVE' 6452 6453 def draw (self, context): 6454 layout = self.layout 6455 view = context.space_data 6456 overlay = view.overlay 6457 display_all = overlay.show_overlays 6458 6459 col = layout. column () 6460 col.active = display_all 6461 6462 row = col. row () 6463 row. prop (overlay, "display_handle" , text= "Handles" ) 6464 6465 row = col. row () 6466 row. prop (overlay, "show_curve_normals" , text= "" ) 6467 sub = row. row () 6468 sub.active = overlay.show_curve_normals 6469 sub. prop (overlay, "normals_length" , text= "Normals" ) 6470 6471 6472 class VIEW3D_PT_overlay_sculpt (Panel): 6473 bl_space_type = 'VIEW_3D' 6474 bl_context = ".sculpt_mode" 6475 bl_region_type = 'HEADER' 6476 bl_parent_id = 'VIEW3D_PT_overlay' 6477 bl_label = "Sculpt" 6478 6479 @classmethod 6480 def poll (cls, context): 6481 return ( 6482 context.mode == 'SCULPT' and 6483 (context.sculpt_object and context.tool_settings.sculpt) 6484 ) 6485 6486 def draw (self, context): 6487 layout = self.layout 6488 tool_settings = context.tool_settings 6489 sculpt = tool_settings.sculpt 6490 6491 view = context.space_data 6492 overlay = view.overlay 6493 6494 row = layout. row (align= True ) 6495 row. prop (sculpt, "show_mask" , text= "" ) 6496 sub = row. row () 6497 sub.active = sculpt.show_mask 6498 sub. prop (overlay, "sculpt_mode_mask_opacity" , text= "Mask" ) 6499 6500 row = layout. row (align= True ) 6501 row. prop (sculpt, "show_face_sets" , text= "" ) 6502 sub = row. row () 6503 sub.active = sculpt.show_face_sets 6504 row. prop (overlay, "sculpt_mode_face_sets_opacity" , text= "Face Sets" ) 6505 6506 6507 class VIEW3D_PT_overlay_pose (Panel): 6508 bl_space_type = 'VIEW_3D' 6509 bl_region_type = 'HEADER' 6510 bl_parent_id = 'VIEW3D_PT_overlay' 6511 bl_label = "Pose Mode" 6512 6513 @classmethod 6514 def poll (cls, context): 6515 mode = context.mode 6516 return ( 6517 (mode == 'POSE' ) or 6518 (mode == 'PAINT_WEIGHT' and context.pose_object) 6519 ) 6520 6521 def draw (self, context): 6522 layout = self.layout 6523 view = context.space_data 6524 mode = context.mode 6525 overlay = view.overlay 6526 display_all = overlay.show_overlays 6527 6528 col = layout. column () 6529 col.active = display_all 6530 6531 if mode == 'POSE' : 6532 row = col. row () 6533 row. prop (overlay, "show_xray_bone" , text= "" ) 6534 sub = row. row () 6535 sub.active = display_all and overlay.show_xray_bone 6536 sub. prop (overlay, "xray_alpha_bone" , text= "Fade Geometry" ) 6537 else : 6538 row = col. row () 6539 row. prop (overlay, "show_xray_bone" ) 6540 6541 6542 class VIEW3D_PT_overlay_texture_paint (Panel): 6543 bl_space_type = 'VIEW_3D' 6544 bl_region_type = 'HEADER' 6545 bl_parent_id = 'VIEW3D_PT_overlay' 6546 bl_label = "Texture Paint" 6547 6548 @classmethod 6549 def poll (cls, context): 6550 return context.mode == 'PAINT_TEXTURE' 6551 6552 def draw (self, context): 6553 layout = self.layout 6554 view = context.space_data 6555 overlay = view.overlay 6556 display_all = overlay.show_overlays 6557 6558 col = layout. column () 6559 col.active = display_all 6560 col. prop (overlay, "texture_paint_mode_opacity" ) 6561 6562 6563 class VIEW3D_PT_overlay_vertex_paint (Panel): 6564 bl_space_type = 'VIEW_3D' 6565 bl_region_type = 'HEADER' 6566 bl_parent_id = 'VIEW3D_PT_overlay' 6567 bl_label = "Vertex Paint" 6568 6569 @classmethod 6570 def poll (cls, context): 6571 return context.mode == 'PAINT_VERTEX' 6572 6573 def draw (self, context): 6574 layout = self.layout 6575 view = context.space_data 6576 overlay = view.overlay 6577 display_all = overlay.show_overlays 6578 6579 col = layout. column () 6580 col.active = display_all 6581 6582 col. prop (overlay, "vertex_paint_mode_opacity" ) 6583 col. prop (overlay, "show_paint_wire" ) 6584 6585 6586 class VIEW3D_PT_overlay_weight_paint (Panel): 6587 bl_space_type = 'VIEW_3D' 6588 bl_region_type = 'HEADER' 6589 bl_parent_id = 'VIEW3D_PT_overlay' 6590 bl_label = "Weight Paint" 6591 6592 @classmethod 6593 def poll (cls, context): 6594 return context.mode == 'PAINT_WEIGHT' 6595 6596 def draw (self, context): 6597 layout = self.layout 6598 view = context.space_data 6599 overlay = view.overlay 6600 display_all = overlay.show_overlays 6601 6602 col = layout. column () 6603 col.active = display_all 6604 6605 col. prop (overlay, "weight_paint_mode_opacity" , text= "Opacity" ) 6606 row = col. split (factor= 0.33 ) 6607 row. label (text= "Zero Weights" ) 6608 sub = row. row () 6609 sub. prop (context.tool_settings, "vertex_group_user" , expand= True ) 6610 6611 col. prop (overlay, "show_wpaint_contours" ) 6612 col. prop (overlay, "show_paint_wire" ) 6613 6614 6615 class VIEW3D_PT_snapping (Panel): 6616 bl_space_type = 'VIEW_3D' 6617 bl_region_type = 'HEADER' 6618 bl_label = "Snapping" 6619 6620 def draw (self, context): 6621 tool_settings = context.tool_settings 6622 snap_elements = tool_settings.snap_elements 6623 obj = context.active_object 6624 object_mode = 'OBJECT' if obj is None else obj.mode 6625 6626 layout = self.layout 6627 col = layout. column () 6628 col. label (text= "Snap To" ) 6629 col. prop (tool_settings, "snap_elements" , expand= True ) 6630 6631 col. separator () 6632 if 'INCREMENT' in snap_elements: 6633 col. prop (tool_settings, "use_snap_grid_absolute" ) 6634 6635 if snap_elements != { 'INCREMENT' }: 6636 col. label (text= "Snap With" ) 6637 row = col. row (align= True ) 6638 row. prop (tool_settings, "snap_target" , expand= True ) 6639 6640 col. prop (tool_settings, "use_snap_backface_culling" ) 6641 6642 if obj: 6643 if object_mode == 'EDIT' : 6644 col. prop (tool_settings, "use_snap_self" ) 6645 if object_mode in { 'OBJECT' , 'POSE' , 'EDIT' , 'WEIGHT_PAINT' }: 6646 col. prop (tool_settings, "use_snap_align_rotation" ) 6647 6648 if 'FACE' in snap_elements: 6649 col. prop (tool_settings, "use_snap_project" ) 6650 6651 if 'VOLUME' in snap_elements: 6652 col. prop (tool_settings, "use_snap_peel_object" ) 6653 6654 col. label (text= "Affect" ) 6655 row = col. row (align= True ) 6656 row. prop (tool_settings, "use_snap_translate" , text= "Move" , toggle= True ) 6657 row. prop (tool_settings, "use_snap_rotate" , text= "Rotate" , toggle= True ) 6658 row. prop (tool_settings, "use_snap_scale" , text= "Scale" , toggle= True ) 6659 6660 6661 class VIEW3D_PT_proportional_edit (Panel): 6662 bl_space_type = 'VIEW_3D' 6663 bl_region_type = 'HEADER' 6664 bl_label = "Proportional Editing" 6665 bl_ui_units_x = 8 6666 6667 def draw (self, context): 6668 layout = self.layout 6669 tool_settings = context.tool_settings 6670 col = layout. column () 6671 col.active = (tool_settings.use_proportional_edit_objects if context.mode == 'OBJECT' 6672 else tool_settings.use_proportional_edit) 6673 6674 if context.mode != 'OBJECT' : 6675 col. prop (tool_settings, "use_proportional_connected" ) 6676 sub = col. column () 6677 sub.active = not tool_settings.use_proportional_connected 6678 sub. prop (tool_settings, "use_proportional_projected" ) 6679 col. separator () 6680 6681 col. prop (tool_settings, "proportional_edit_falloff" , expand= True ) 6682 6683 6684 class VIEW3D_PT_transform_orientations (Panel): 6685 bl_space_type = 'VIEW_3D' 6686 bl_region_type = 'HEADER' 6687 bl_label = "Transform Orientations" 6688 bl_ui_units_x = 8 6689 6690 def draw (self, context): 6691 layout = self.layout 6692 layout. label (text= "Transform Orientations" ) 6693 6694 scene = context.scene 6695 orient_slot = scene.transform_orientation_slots[ 0 ] 6696 orientation = orient_slot.custom_orientation 6697 6698 row = layout. row () 6699 col = row. column () 6700 col. prop (orient_slot, "type" , expand= True ) 6701 row. operator ( "transform.create_orientation" , text= "" , icon= 'ADD' , emboss= False ).use = True 6702 6703 if orientation: 6704 row = layout. row (align= False ) 6705 row. prop (orientation, "name" , text= "" , icon= 'OBJECT_ORIGIN' ) 6706 row. operator ( "transform.delete_orientation" , text= "" , icon= 'X' , emboss= False ) 6707 6708 6709 class VIEW3D_PT_gpencil_origin (Panel): 6710 bl_space_type = 'VIEW_3D' 6711 bl_region_type = 'HEADER' 6712 bl_label = "Stroke Placement" 6713 6714 def draw (self, context): 6715 layout = self.layout 6716 tool_settings = context.tool_settings 6717 gpd = context.gpencil_data 6718 6719 layout. label (text= "Stroke Placement" ) 6720 6721 row = layout. row () 6722 col = row. column () 6723 col. prop (tool_settings, "gpencil_stroke_placement_view3d" , expand= True ) 6724 6725 if tool_settings.gpencil_stroke_placement_view3d == 'SURFACE' : 6726 row = layout. row () 6727 row. label (text= "Offset" ) 6728 row = layout. row () 6729 row. prop (gpd, "zdepth_offset" , text= "" ) 6730 6731 if tool_settings.gpencil_stroke_placement_view3d == 'STROKE' : 6732 row = layout. row () 6733 row. label (text= "Target" ) 6734 row = layout. row () 6735 row. prop (tool_settings, "gpencil_stroke_snap_mode" , expand= True ) 6736 6737 6738 class VIEW3D_PT_gpencil_lock (Panel): 6739 bl_space_type = 'VIEW_3D' 6740 bl_region_type = 'HEADER' 6741 bl_label = "Drawing Plane" 6742 6743 def draw (self, context): 6744 layout = self.layout 6745 layout. label (text= "Drawing Plane" ) 6746 6747 row = layout. row () 6748 col = row. column () 6749 col. prop (context.tool_settings.gpencil_sculpt, "lock_axis" , expand= True ) 6750 6751 6752 class VIEW3D_PT_gpencil_guide (Panel): 6753 bl_space_type = 'VIEW_3D' 6754 bl_region_type = 'HEADER' 6755 bl_label = "Guides" 6756 6757 def draw (self, context): 6758 settings = context.tool_settings.gpencil_sculpt.guide 6759 6760 layout = self.layout 6761 layout. label (text= "Guides" ) 6762 6763 col = layout. column () 6764 col.active = settings.use_guide 6765 col. prop (settings, "type" , expand= True ) 6766 6767 if settings. type in { 'ISO' , 'PARALLEL' , 'RADIAL' }: 6768 col. prop (settings, "angle" ) 6769 row = col. row (align= True ) 6770 6771 col. prop (settings, "use_snapping" ) 6772 if settings.use_snapping: 6773 6774 if settings. type == 'RADIAL' : 6775 col. prop (settings, "angle_snap" ) 6776 else : 6777 col. prop (settings, "spacing" ) 6778 6779 if settings. type in { 'CIRCULAR' , 'RADIAL' } or settings.use_snapping: 6780 col. label (text= "Reference Point" ) 6781 row = col. row (align= True ) 6782 row. prop (settings, "reference_point" , expand= True ) 6783 if settings.reference_point == 'CUSTOM' : 6784 col. prop (settings, "location" , text= "Custom Location" ) 6785 elif settings.reference_point == 'OBJECT' : 6786 col. prop (settings, "reference_object" , text= "Object Location" ) 6787 if not settings.reference_object: 6788 col. label (text= "No object selected, using cursor" ) 6789 6790 6791 class VIEW3D_PT_overlay_gpencil_options (Panel): 6792 bl_space_type = 'VIEW_3D' 6793 bl_region_type = 'HEADER' 6794 bl_parent_id = 'VIEW3D_PT_overlay' 6795 bl_label = "" 6796 6797 @classmethod 6798 def poll (cls, context): 6799 return context. object and context. object . type == 'GPENCIL' 6800 6801 def draw_header (self, context): 6802 layout = self.layout 6803 layout. label (text={ 6804 'PAINT_GPENCIL' : "Draw Grease Pencil" , 6805 'EDIT_GPENCIL' : "Edit Grease Pencil" , 6806 'SCULPT_GPENCIL' : "Sculpt Grease Pencil" , 6807 'WEIGHT_GPENCIL' : "Weight Grease Pencil" , 6808 'VERTEX_GPENCIL' : "Vertex Grease Pencil" , 6809 'OBJECT' : "Grease Pencil" , 6810 }[context.mode]) 6811 6812 def draw (self, context): 6813 layout = self.layout 6814 view = context.space_data 6815 overlay = view.overlay 6816 6817 layout. prop (overlay, "use_gpencil_onion_skin" , text= "Onion Skin" ) 6818 6819 col = layout. column () 6820 row = col. row () 6821 row. prop (overlay, "use_gpencil_grid" , text= "" ) 6822 sub = row. row (align= True ) 6823 sub.active = overlay.use_gpencil_grid 6824 sub. prop (overlay, "gpencil_grid_opacity" , text= "Canvas" , slider= True ) 6825 sub. prop (overlay, "use_gpencil_canvas_xray" , text= "" , icon= 'XRAY' ) 6826 6827 row = col. row () 6828 row. prop (overlay, "use_gpencil_fade_layers" , text= "" ) 6829 sub = row. row () 6830 sub.active = overlay.use_gpencil_fade_layers 6831 sub. prop (overlay, "gpencil_fade_layer" , text= "Fade Layers" , slider= True ) 6832 6833 row = col. row () 6834 row. prop (overlay, "use_gpencil_fade_objects" , text= "" ) 6835 sub = row. row (align= True ) 6836 sub.active = overlay.use_gpencil_fade_objects 6837 sub. prop (overlay, "gpencil_fade_objects" , text= "Fade Objects" , slider= True ) 6838 sub. prop (overlay, "use_gpencil_fade_gp_objects" , text= "" , icon= 'OUTLINER_OB_GREASEPENCIL' ) 6839 6840 if context. object .mode in { 'EDIT_GPENCIL' , 'SCULPT_GPENCIL' , 'WEIGHT_GPENCIL' , 'VERTEX_GPENCIL' }: 6841 split = layout. split () 6842 col = split. column () 6843 col. prop (overlay, "use_gpencil_edit_lines" , text= "Edit Lines" ) 6844 col = split. column () 6845 col. prop (overlay, "use_gpencil_multiedit_line_only" , text= "Only in Multiframe" ) 6846 6847 if context. object .mode == 'EDIT_GPENCIL' : 6848 split = layout. split () 6849 col = split. column () 6850 col. prop (overlay, "use_gpencil_show_directions" ) 6851 col = split. column () 6852 col. prop (overlay, "use_gpencil_show_material_name" , text= "Material Name" ) 6853 6854 layout. prop (overlay, "vertex_opacity" , text= "Vertex Opacity" , slider= True ) 6855 6856 # Handles for Curve Edit 6857 if context. object .mode == 'EDIT_GPENCIL' : 6858 gpd = context. object .data 6859 if gpd.use_curve_edit: 6860 layout. prop (overlay, "display_handle" , text= "Handles" ) 6861 6862 if context. object .mode in { 'PAINT_GPENCIL' , 'VERTEX_GPENCIL' }: 6863 layout. label (text= "Vertex Paint" ) 6864 row = layout. row () 6865 shading = VIEW3D_PT_shading. get_shading (context) 6866 row.enabled = shading. type not in { 'WIREFRAME' , 'RENDERED' } 6867 row. prop (overlay, "gpencil_vertex_paint_opacity" , text= "Opacity" , slider= True ) 6868 6869 6870 class VIEW3D_PT_quad_view (Panel): 6871 bl_space_type = 'VIEW_3D' 6872 bl_region_type = 'UI' 6873 bl_category = "View" 6874 bl_label = "Quad View" 6875 bl_options = { 'DEFAULT_CLOSED' } 6876 6877 @classmethod 6878 def poll (cls, context): 6879 view = context.space_data 6880 return view.region_quadviews 6881 6882 def draw (self, context): 6883 layout = self.layout 6884 6885 view = context.space_data 6886 6887 region = view.region_quadviews[ 2 ] 6888 col = layout. column () 6889 col. prop (region, "lock_rotation" ) 6890 row = col. row () 6891 row.enabled = region.lock_rotation 6892 row. prop (region, "show_sync_view" ) 6893 row = col. row () 6894 row.enabled = region.lock_rotation and region.show_sync_view 6895 row. prop (region, "use_box_clip" ) 6896 6897 6898 # Annotation properties 6899 class VIEW3D_PT_grease_pencil (AnnotationDataPanel, Panel): 6900 bl_space_type = 'VIEW_3D' 6901 bl_region_type = 'UI' 6902 bl_category = "View" 6903 6904 # NOTE: this is just a wrapper around the generic GP Panel 6905 6906 6907 class VIEW3D_PT_annotation_onion (AnnotationOnionSkin, Panel): 6908 bl_space_type = 'VIEW_3D' 6909 bl_region_type = 'UI' 6910 bl_category = "View" 6911 bl_parent_id = 'VIEW3D_PT_grease_pencil' 6912 6913 # NOTE: this is just a wrapper around the generic GP Panel 6914 6915 6916 class TOPBAR_PT_annotation_layers (Panel, AnnotationDataPanel): 6917 bl_space_type = 'VIEW_3D' 6918 bl_region_type = 'HEADER' 6919 bl_label = "Layers" 6920 bl_ui_units_x = 14 6921 6922 6923 class VIEW3D_PT_view3d_stereo (Panel): 6924 bl_space_type = 'VIEW_3D' 6925 bl_region_type = 'UI' 6926 bl_category = "View" 6927 bl_label = "Stereoscopy" 6928 bl_options = { 'DEFAULT_CLOSED' } 6929 6930 @classmethod 6931 def poll (cls, context): 6932 scene = context.scene 6933 6934 multiview = scene.render.use_multiview 6935 return multiview 6936 6937 def draw (self, context): 6938 layout = self.layout 6939 view = context.space_data 6940 6941 basic_stereo = context.scene.render.views_format == 'STEREO_3D' 6942 6943 col = layout. column () 6944 col. row (). prop (view, "stereo_3d_camera" , expand= True ) 6945 6946 col. label (text= "Display" ) 6947 row = col. row () 6948 row.active = basic_stereo 6949 row. prop (view, "show_stereo_3d_cameras" ) 6950 row = col. row () 6951 row.active = basic_stereo 6952 split = row. split () 6953 split. prop (view, "show_stereo_3d_convergence_plane" ) 6954 split = row. split () 6955 split. prop (view, "stereo_3d_convergence_plane_alpha" , text= "Alpha" ) 6956 split.active = view.show_stereo_3d_convergence_plane 6957 row = col. row () 6958 split = row. split () 6959 split. prop (view, "show_stereo_3d_volume" ) 6960 split = row. split () 6961 split.active = view.show_stereo_3d_volume 6962 split. prop (view, "stereo_3d_volume_alpha" , text= "Alpha" ) 6963 6964 6965 class VIEW3D_PT_context_properties (Panel): 6966 bl_space_type = 'VIEW_3D' 6967 bl_region_type = 'UI' 6968 bl_category = "Item" 6969 bl_label = "Properties" 6970 bl_options = { 'DEFAULT_CLOSED' } 6971 6972 @staticmethod 6973 def _active_context_member (context): 6974 obj = context. object 6975 if obj: 6976 object_mode = obj.mode 6977 if object_mode == 'POSE' : 6978 return "active_pose_bone" 6979 elif object_mode == 'EDIT' and obj. type == 'ARMATURE' : 6980 return "active_bone" 6981 else : 6982 return "object" 6983 6984 return "" 6985 6986 @classmethod 6987 def poll (cls, context): 6988 import rna_prop_ui 6989 member = cls._active_context_member(context) 6990 6991 if member: 6992 context_member, member = rna_prop_ui. rna_idprop_context_value (context, member, object ) 6993 return context_member and rna_prop_ui. rna_idprop_has_properties (context_member) 6994 6995 return False 6996 6997 def draw (self, context): 6998 import rna_prop_ui 6999 member = VIEW3D_PT_context_properties._active_context_member(context) 7000 7001 if member: 7002 # Draw with no edit button 7003 rna_prop_ui. draw (self.layout, context, member, object , use_edit= False ) 7004 7005 7006 # Grease Pencil Object - Multiframe falloff tools 7007 class VIEW3D_PT_gpencil_multi_frame (Panel): 7008 bl_space_type = 'VIEW_3D' 7009 bl_region_type = 'HEADER' 7010 bl_label = "Multi Frame" 7011 7012 def draw (self, context): 7013 gpd = context.gpencil_data 7014 settings = context.tool_settings.gpencil_sculpt 7015 7016 layout = self.layout 7017 col = layout. column (align= True ) 7018 col. prop (settings, "use_multiframe_falloff" ) 7019 7020 # Falloff curve 7021 if gpd.use_multiedit and settings.use_multiframe_falloff: 7022 layout. template_curve_mapping (settings, "multiframe_falloff_curve" , brush= True ) 7023 7024 7025 # Grease Pencil Object - Curve Editing tools 7026 class VIEW3D_PT_gpencil_curve_edit (Panel): 7027 bl_space_type = 'VIEW_3D' 7028 bl_region_type = 'HEADER' 7029 bl_label = "Curve Editing" 7030 7031 def draw (self, context): 7032 layout = self.layout 7033 7034 gpd = context.gpencil_data 7035 col = layout. column (align= True ) 7036 col. prop (gpd, "edit_curve_resolution" ) 7037 col. prop (gpd, "curve_edit_threshold" ) 7038 col. prop (gpd, "curve_edit_corner_angle" ) 7039 col. prop (gpd, "use_adaptive_curve_resolution" ) 7040 7041 7042 class VIEW3D_MT_gpencil_edit_context_menu (Menu): 7043 bl_label = "" 7044 7045 def draw (self, context): 7046 7047 is_point_mode = context.tool_settings.gpencil_selectmode_edit == 'POINT' 7048 is_stroke_mode = context.tool_settings.gpencil_selectmode_edit == 'STROKE' 7049 is_segment_mode = context.tool_settings.gpencil_selectmode_edit == 'SEGMENT' 7050 7051 layout = self.layout 7052 7053 layout.operator_context = 'INVOKE_REGION_WIN' 7054 7055 row = layout. row () 7056 7057 if is_point_mode or is_segment_mode: 7058 col = row. column (align= True ) 7059 7060 col. label (text= "Point Context Menu" , icon= 'GP_SELECT_POINTS' ) 7061 col. separator () 7062 7063 # Additive Operators 7064 col. operator ( "gpencil.stroke_subdivide" , text= "Subdivide" ).only_selected = True 7065 7066 col. separator () 7067 7068 col. operator ( "gpencil.extrude_move" , text= "Extrude" ) 7069 7070 col. separator () 7071 7072 # Deform Operators 7073 col. operator ( "gpencil.stroke_smooth" , text= "Smooth" ).only_selected = True 7074 col. operator ( "transform.bend" , text= "Bend" ) 7075 col. operator ( "transform.shear" , text= "Shear" ) 7076 col. operator ( "transform.tosphere" , text= "To Sphere" ) 7077 col. operator ( "transform.transform" , text= "Shrink/Fatten" ).mode = 'GPENCIL_SHRINKFATTEN' 7078 7079 col. separator () 7080 7081 col. menu ( "VIEW3D_MT_mirror" , text= "Mirror" ) 7082 col. menu ( "GPENCIL_MT_snap" , text= "Snap" ) 7083 7084 col. separator () 7085 7086 # Duplicate operators 7087 col. operator ( "gpencil.duplicate_move" , text= "Duplicate" ) 7088 col. operator ( "gpencil.copy" , text= "Copy" , icon= 'COPYDOWN' ) 7089 col. operator ( "gpencil.paste" , text= "Paste" , icon= 'PASTEDOWN' ). type = 'ACTIVE' 7090 col. operator ( "gpencil.paste" , text= "Paste by Layer" ). type = 'LAYER' 7091 7092 col. separator () 7093 7094 # Removal Operators 7095 col. operator ( "gpencil.stroke_merge" , text= "Merge" ) 7096 col. operator ( "gpencil.stroke_merge_by_distance" ).use_unselected = False 7097 col. operator ( "gpencil.stroke_split" , text= "Split" ) 7098 col. operator ( "gpencil.stroke_separate" , text= "Separate" ).mode = 'POINT' 7099 7100 col. separator () 7101 7102 col. operator ( "gpencil.delete" , text= "Delete" ). type = 'POINTS' 7103 col. operator ( "gpencil.dissolve" , text= "Dissolve" ). type = 'POINTS' 7104 col. operator ( "gpencil.dissolve" , text= "Dissolve Between" ). type = 'BETWEEN' 7105 col. operator ( "gpencil.dissolve" , text= "Dissolve Unselected" ). type = 'UNSELECT' 7106 7107 if is_stroke_mode: 7108 7109 col = row. column (align= True ) 7110 col. label (text= "Stroke Context Menu" , icon= 'GP_SELECT_STROKES' ) 7111 col. separator () 7112 7113 # Main Strokes Operators 7114 col. operator ( "gpencil.stroke_subdivide" , text= "Subdivide" ).only_selected = False 7115 col. menu ( "VIEW3D_MT_gpencil_simplify" ) 7116 col. operator ( "gpencil.stroke_trim" , text= "Trim" ) 7117 7118 col. separator () 7119 7120 col. operator ( "gpencil.stroke_smooth" , text= "Smooth" ).only_selected = False 7121 col. operator ( "transform.transform" , text= "Shrink/Fatten" ).mode = 'GPENCIL_SHRINKFATTEN' 7122 7123 col. separator () 7124 7125 # Layer and Materials operators 7126 col. menu ( "GPENCIL_MT_move_to_layer" ) 7127 col. menu ( "VIEW3D_MT_assign_material" ) 7128 col. operator ( "gpencil.set_active_material" , text= "Set as Active Material" ) 7129 col. operator_menu_enum ( "gpencil.stroke_arrange" , "direction" , text= "Arrange" ) 7130 7131 col. separator () 7132 7133 col. menu ( "VIEW3D_MT_mirror" , text= "Mirror" ) 7134 col. menu ( "VIEW3D_MT_snap" , text= "Snap" ) 7135 7136 col. separator () 7137 7138 # Duplicate operators 7139 col. operator ( "gpencil.duplicate_move" , text= "Duplicate" ) 7140 col. operator ( "gpencil.copy" , text= "Copy" , icon= 'COPYDOWN' ) 7141 col. operator ( "gpencil.paste" , text= "Paste" , icon= 'PASTEDOWN' ). type = 'ACTIVE' 7142 col. operator ( "gpencil.paste" , text= "Paste by Layer" ). type = 'LAYER' 7143 7144 col. separator () 7145 7146 # Removal Operators 7147 col. operator ( "gpencil.stroke_merge_by_distance" ).use_unselected = True 7148 col. operator_menu_enum ( "gpencil.stroke_join" , "type" , text= "Join" ) 7149 col. operator ( "gpencil.stroke_split" , text= "Split" ) 7150 col. operator ( "gpencil.stroke_separate" , text= "Separate" ).mode = 'STROKE' 7151 7152 col. separator () 7153 7154 col. operator ( "gpencil.delete" , text= "Delete" ). type = 'STROKES' 7155 7156 col. separator () 7157 7158 col. operator ( "gpencil.reproject" , text= "Reproject" ) 7159 7160 7161 def draw_gpencil_layer_active (context, layout): 7162 gpl = context.active_gpencil_layer 7163 if gpl: 7164 layout. label (text= "Active Layer" ) 7165 row = layout. row (align= True ) 7166 row.operator_context = 'EXEC_REGION_WIN' 7167 row. operator_menu_enum ( "gpencil.layer_change" , "layer" , text= "" , icon= 'GREASEPENCIL' ) 7168 row. prop (gpl, "info" , text= "" ) 7169 row. operator ( "gpencil.layer_remove" , text= "" , icon= 'X' ) 7170 7171 7172 def draw_gpencil_material_active (context, layout): 7173 ob = context.active_object 7174 if ob and len (ob.material_slots) > 0 and ob.active_material_index >= 0 : 7175 ma = ob.material_slots[ob.active_material_index].material 7176 if ma: 7177 layout. label (text= "Active Material" ) 7178 row = layout. row (align= True ) 7179 row.operator_context = 'EXEC_REGION_WIN' 7180 row. operator_menu_enum ( "gpencil.material_set" , "slot" , text= "" , icon= 'MATERIAL' ) 7181 row. prop (ma, "name" , text= "" ) 7182 7183 7184 class VIEW3D_PT_gpencil_sculpt_context_menu (Panel): 7185 bl_space_type = 'VIEW_3D' 7186 bl_region_type = 'WINDOW' 7187 bl_label = "Sculpt Context Menu" 7188 bl_ui_units_x = 12 7189 7190 def draw (self, context): 7191 ts = context.tool_settings 7192 settings = ts.gpencil_sculpt_paint 7193 brush = settings.brush 7194 7195 layout = self.layout 7196 7197 layout. prop (brush, "size" , slider= True ) 7198 layout. prop (brush, "strength" ) 7199 7200 # Layers 7201 draw_gpencil_layer_active (context, layout) 7202 7203 7204 class VIEW3D_PT_gpencil_weight_context_menu (Panel): 7205 bl_space_type = 'VIEW_3D' 7206 bl_region_type = 'WINDOW' 7207 bl_label = "Weight Paint Context Menu" 7208 bl_ui_units_x = 12 7209 7210 def draw (self, context): 7211 ts = context.tool_settings 7212 settings = ts.gpencil_weight_paint 7213 brush = settings.brush 7214 7215 layout = self.layout 7216 7217 layout. prop (brush, "size" , slider= True ) 7218 layout. prop (brush, "strength" ) 7219 layout. prop (brush, "weight" ) 7220 7221 # Layers 7222 draw_gpencil_layer_active (context, layout) 7223 7224 7225 class VIEW3D_PT_gpencil_draw_context_menu (Panel): 7226 bl_space_type = 'VIEW_3D' 7227 bl_region_type = 'WINDOW' 7228 bl_label = "Draw Context Menu" 7229 bl_ui_units_x = 12 7230 7231 def draw (self, context): 7232 ts = context.tool_settings 7233 settings = ts.gpencil_paint 7234 brush = settings.brush 7235 gp_settings = brush.gpencil_settings 7236 7237 layout = self.layout 7238 is_pin_vertex = gp_settings.brush_draw_mode == 'VERTEXCOLOR' 7239 is_vertex = settings.color_mode == 'VERTEXCOLOR' or brush.gpencil_tool == 'TINT' or is_pin_vertex 7240 7241 if brush.gpencil_tool not in { 'ERASE' , 'CUTTER' , 'EYEDROPPER' } and is_vertex: 7242 split = layout. split (factor= 0.1 ) 7243 split. prop (brush, "color" , text= "" ) 7244 split. template_color_picker (brush, "color" , value_slider= True ) 7245 7246 col = layout. column () 7247 col. separator () 7248 col. prop_menu_enum (gp_settings, "vertex_mode" , text= "Mode" ) 7249 col. separator () 7250 7251 if brush.gpencil_tool not in { 'FILL' , 'CUTTER' }: 7252 layout. prop (brush, "size" , slider= True ) 7253 if brush.gpencil_tool not in { 'ERASE' , 'FILL' , 'CUTTER' }: 7254 layout. prop (gp_settings, "pen_strength" ) 7255 7256 # Layers 7257 draw_gpencil_layer_active (context, layout) 7258 # Material 7259 if not is_vertex: 7260 draw_gpencil_material_active (context, layout) 7261 7262 7263 class VIEW3D_PT_gpencil_vertex_context_menu (Panel): 7264 bl_space_type = 'VIEW_3D' 7265 bl_region_type = 'WINDOW' 7266 bl_label = "Vertex Paint Context Menu" 7267 bl_ui_units_x = 12 7268 7269 def draw (self, context): 7270 layout = self.layout 7271 ts = context.tool_settings 7272 settings = ts.gpencil_vertex_paint 7273 brush = settings.brush 7274 gp_settings = brush.gpencil_settings 7275 7276 col = layout. column () 7277 7278 if brush.gpencil_vertex_tool in { 'DRAW' , 'REPLACE' }: 7279 split = layout. split (factor= 0.1 ) 7280 split. prop (brush, "color" , text= "" ) 7281 split. template_color_picker (brush, "color" , value_slider= True ) 7282 7283 col = layout. column () 7284 col. separator () 7285 col. prop_menu_enum (gp_settings, "vertex_mode" , text= "Mode" ) 7286 col. separator () 7287 7288 row = col. row (align= True ) 7289 row. prop (brush, "size" , text= "Radius" ) 7290 row. prop (gp_settings, "use_pressure" , text= "" , icon= 'STYLUS_PRESSURE' ) 7291 7292 if brush.gpencil_vertex_tool in { 'DRAW' , 'BLUR' , 'SMEAR' }: 7293 row = layout. row (align= True ) 7294 row. prop (gp_settings, "pen_strength" , slider= True ) 7295 row. prop (gp_settings, "use_strength_pressure" , text= "" , icon= 'STYLUS_PRESSURE' ) 7296 7297 # Layers 7298 draw_gpencil_layer_active (context, layout) 7299 7300 7301 class VIEW3D_PT_paint_vertex_context_menu (Panel): 7302 # Only for popover, these are dummy values. 7303 bl_space_type = 'VIEW_3D' 7304 bl_region_type = 'WINDOW' 7305 bl_label = "Vertex Paint Context Menu" 7306 7307 def draw (self, context): 7308 layout = self.layout 7309 7310 brush = context.tool_settings.vertex_paint.brush 7311 capabilities = brush.vertex_paint_capabilities 7312 7313 if capabilities.has_color: 7314 split = layout. split (factor= 0.1 ) 7315 UnifiedPaintPanel. prop_unified_color (split, context, brush, "color" , text= "" ) 7316 UnifiedPaintPanel. prop_unified_color_picker (split, context, brush, "color" , value_slider= True ) 7317 layout. prop (brush, "blend" , text= "" ) 7318 7319 UnifiedPaintPanel. prop_unified ( 7320 layout, 7321 context, 7322 brush, 7323 "size" , 7324 unified_name= "use_unified_size" , 7325 pressure_name= "use_pressure_size" , 7326 slider= True , 7327 ) 7328 UnifiedPaintPanel. prop_unified ( 7329 layout, 7330 context, 7331 brush, 7332 "strength" , 7333 unified_name= "use_unified_strength" , 7334 pressure_name= "use_pressure_strength" , 7335 slider= True , 7336 ) 7337 7338 7339 class VIEW3D_PT_paint_texture_context_menu (Panel): 7340 # Only for popover, these are dummy values. 7341 bl_space_type = 'VIEW_3D' 7342 bl_region_type = 'WINDOW' 7343 bl_label = "Texture Paint Context Menu" 7344 7345 def draw (self, context): 7346 layout = self.layout 7347 7348 brush = context.tool_settings.image_paint.brush 7349 capabilities = brush.image_paint_capabilities 7350 7351 if capabilities.has_color: 7352 split = layout. split (factor= 0.1 ) 7353 UnifiedPaintPanel. prop_unified_color (split, context, brush, "color" , text= "" ) 7354 UnifiedPaintPanel. prop_unified_color_picker (split, context, brush, "color" , value_slider= True ) 7355 layout. prop (brush, "blend" , text= "" ) 7356 7357 if capabilities.has_radius: 7358 UnifiedPaintPanel. prop_unified ( 7359 layout, 7360 context, 7361 brush, 7362 "size" , 7363 unified_name= "use_unified_size" , 7364 pressure_name= "use_pressure_size" , 7365 slider= True , 7366 ) 7367 UnifiedPaintPanel. prop_unified ( 7368 layout, 7369 context, 7370 brush, 7371 "strength" , 7372 unified_name= "use_unified_strength" , 7373 pressure_name= "use_pressure_strength" , 7374 slider= True , 7375 ) 7376 7377 7378 class VIEW3D_PT_paint_weight_context_menu (Panel): 7379 # Only for popover, these are dummy values. 7380 bl_space_type = 'VIEW_3D' 7381 bl_region_type = 'WINDOW' 7382 bl_label = "Weights Context Menu" 7383 7384 def draw (self, context): 7385 layout = self.layout 7386 7387 brush = context.tool_settings.weight_paint.brush 7388 UnifiedPaintPanel. prop_unified ( 7389 layout, 7390 context, 7391 brush, 7392 "weight" , 7393 unified_name= "use_unified_weight" , 7394 slider= True , 7395 ) 7396 UnifiedPaintPanel. prop_unified ( 7397 layout, 7398 context, 7399 brush, 7400 "size" , 7401 unified_name= "use_unified_size" , 7402 pressure_name= "use_pressure_size" , 7403 slider= True , 7404 ) 7405 UnifiedPaintPanel. prop_unified ( 7406 layout, 7407 context, 7408 brush, 7409 "strength" , 7410 unified_name= "use_unified_strength" , 7411 pressure_name= "use_pressure_strength" , 7412 slider= True , 7413 ) 7414 7415 7416 class VIEW3D_PT_sculpt_context_menu (Panel): 7417 # Only for popover, these are dummy values. 7418 bl_space_type = 'VIEW_3D' 7419 bl_region_type = 'WINDOW' 7420 bl_label = "Sculpt Context Menu" 7421 7422 def draw (self, context): 7423 layout = self.layout 7424 7425 brush = context.tool_settings.sculpt.brush 7426 capabilities = brush.sculpt_capabilities 7427 7428 if capabilities.has_color: 7429 split = layout. split (factor= 0.1 ) 7430 UnifiedPaintPanel. prop_unified_color (split, context, brush, "color" , text= "" ) 7431 UnifiedPaintPanel. prop_unified_color_picker (split, context, brush, "color" , value_slider= True ) 7432 layout. prop (brush, "blend" , text= "" ) 7433 7434 UnifiedPaintPanel. prop_unified ( 7435 layout, 7436 context, 7437 brush, 7438 "size" , 7439 unified_name= "use_unified_size" , 7440 pressure_name= "use_pressure_size" , 7441 slider= True , 7442 ) 7443 UnifiedPaintPanel. prop_unified ( 7444 layout, 7445 context, 7446 brush, 7447 "strength" , 7448 unified_name= "use_unified_strength" , 7449 pressure_name= "use_pressure_strength" , 7450 slider= True , 7451 ) 7452 7453 if capabilities.has_auto_smooth: 7454 layout. prop (brush, "auto_smooth_factor" , slider= True ) 7455 7456 if capabilities.has_normal_weight: 7457 layout. prop (brush, "normal_weight" , slider= True ) 7458 7459 if capabilities.has_pinch_factor: 7460 text = "Pinch" 7461 if brush.sculpt_tool in { 'BLOB' , 'SNAKE_HOOK' }: 7462 text = "Magnify" 7463 layout. prop (brush, "crease_pinch_factor" , slider= True , text=text) 7464 7465 if capabilities.has_rake_factor: 7466 layout. prop (brush, "rake_factor" , slider= True ) 7467 7468 if capabilities.has_plane_offset: 7469 layout. prop (brush, "plane_offset" , slider= True ) 7470 layout. prop (brush, "plane_trim" , slider= True , text= "Distance" ) 7471 7472 if capabilities.has_height: 7473 layout. prop (brush, "height" , slider= True , text= "Height" ) 7474 7475 7476 class TOPBAR_PT_gpencil_materials (GreasePencilMaterialsPanel, Panel): 7477 bl_space_type = 'VIEW_3D' 7478 bl_region_type = 'HEADER' 7479 bl_label = "Materials" 7480 bl_ui_units_x = 14 7481 7482 @classmethod 7483 def poll (cls, context): 7484 ob = context. object 7485 return ob and ob. type == 'GPENCIL' 7486 7487 7488 class TOPBAR_PT_gpencil_vertexcolor (GreasePencilVertexcolorPanel, Panel): 7489 bl_space_type = 'VIEW_3D' 7490 bl_region_type = 'HEADER' 7491 bl_label = "Vertex Color" 7492 bl_ui_units_x = 10 7493 7494 @classmethod 7495 def poll (cls, context): 7496 ob = context. object 7497 return ob and ob. type == 'GPENCIL' 7498 7499 7500 classes = ( 7501 VIEW3D_HT_header, 7502 VIEW3D_HT_tool_header, 7503 VIEW3D_MT_editor_menus, 7504 VIEW3D_MT_transform, 7505 VIEW3D_MT_transform_object, 7506 VIEW3D_MT_transform_armature, 7507 VIEW3D_MT_mirror, 7508 VIEW3D_MT_snap, 7509 VIEW3D_MT_uv_map, 7510 VIEW3D_MT_view, 7511 VIEW3D_MT_view_local, 7512 VIEW3D_MT_view_cameras, 7513 VIEW3D_MT_view_navigation, 7514 VIEW3D_MT_view_align, 7515 VIEW3D_MT_view_align_selected, 7516 VIEW3D_MT_view_viewpoint, 7517 VIEW3D_MT_view_regions, 7518 VIEW3D_MT_select_object, 7519 VIEW3D_MT_select_object_more_less, 7520 VIEW3D_MT_select_pose, 7521 VIEW3D_MT_select_pose_more_less, 7522 VIEW3D_MT_select_particle, 7523 VIEW3D_MT_edit_mesh, 7524 VIEW3D_MT_edit_mesh_select_similar, 7525 VIEW3D_MT_edit_mesh_select_by_trait, 7526 VIEW3D_MT_edit_mesh_select_more_less, 7527 VIEW3D_MT_select_edit_mesh, 7528 VIEW3D_MT_select_edit_curve, 7529 VIEW3D_MT_select_edit_surface, 7530 VIEW3D_MT_select_edit_text, 7531 VIEW3D_MT_select_edit_metaball, 7532 VIEW3D_MT_edit_lattice_context_menu, 7533 VIEW3D_MT_select_edit_lattice, 7534 VIEW3D_MT_select_edit_armature, 7535 VIEW3D_MT_select_gpencil, 7536 VIEW3D_MT_select_paint_mask, 7537 VIEW3D_MT_select_paint_mask_vertex, 7538 VIEW3D_MT_angle_control, 7539 VIEW3D_MT_mesh_add, 7540 VIEW3D_MT_curve_add, 7541 VIEW3D_MT_surface_add, 7542 VIEW3D_MT_edit_metaball_context_menu, 7543 VIEW3D_MT_metaball_add, 7544 TOPBAR_MT_edit_curve_add, 7545 TOPBAR_MT_edit_armature_add, 7546 VIEW3D_MT_armature_add, 7547 VIEW3D_MT_light_add, 7548 VIEW3D_MT_lightprobe_add, 7549 VIEW3D_MT_camera_add, 7550 VIEW3D_MT_volume_add, 7551 VIEW3D_MT_add, 7552 VIEW3D_MT_image_add, 7553 VIEW3D_MT_object, 7554 VIEW3D_MT_object_animation, 7555 VIEW3D_MT_object_asset, 7556 VIEW3D_MT_object_rigid_body, 7557 VIEW3D_MT_object_clear, 7558 VIEW3D_MT_object_context_menu, 7559 VIEW3D_MT_object_convert, 7560 VIEW3D_MT_object_shading, 7561 VIEW3D_MT_object_apply, 7562 VIEW3D_MT_object_relations, 7563 VIEW3D_MT_object_parent, 7564 VIEW3D_MT_object_track, 7565 VIEW3D_MT_object_collection, 7566 VIEW3D_MT_object_constraints, 7567 VIEW3D_MT_object_quick_effects, 7568 VIEW3D_MT_object_showhide, 7569 VIEW3D_MT_object_cleanup, 7570 VIEW3D_MT_make_single_user, 7571 VIEW3D_MT_make_links, 7572 VIEW3D_MT_brush_paint_modes, 7573 VIEW3D_MT_paint_vertex, 7574 VIEW3D_MT_hook, 7575 VIEW3D_MT_vertex_group, 7576 VIEW3D_MT_gpencil_vertex_group, 7577 VIEW3D_MT_paint_weight, 7578 VIEW3D_MT_paint_weight_lock, 7579 VIEW3D_MT_sculpt, 7580 VIEW3D_MT_sculpt_set_pivot, 7581 VIEW3D_MT_mask, 7582 VIEW3D_MT_face_sets, 7583 VIEW3D_MT_face_sets_init, 7584 VIEW3D_MT_random_mask, 7585 VIEW3D_MT_particle, 7586 VIEW3D_MT_particle_context_menu, 7587 VIEW3D_MT_particle_showhide, 7588 VIEW3D_MT_pose, 7589 VIEW3D_MT_pose_transform, 7590 VIEW3D_MT_pose_slide, 7591 VIEW3D_MT_pose_propagate, 7592 VIEW3D_MT_pose_library, 7593 VIEW3D_MT_pose_motion, 7594 VIEW3D_MT_pose_group, 7595 VIEW3D_MT_pose_ik, 7596 VIEW3D_MT_pose_constraints, 7597 VIEW3D_MT_pose_names, 7598 VIEW3D_MT_pose_showhide, 7599 VIEW3D_MT_pose_apply, 7600 VIEW3D_MT_pose_context_menu, 7601 VIEW3D_MT_bone_options_toggle, 7602 VIEW3D_MT_bone_options_enable, 7603 VIEW3D_MT_bone_options_disable, 7604 VIEW3D_MT_edit_mesh_context_menu, 7605 VIEW3D_MT_edit_mesh_select_mode, 7606 VIEW3D_MT_edit_mesh_select_linked, 7607 VIEW3D_MT_edit_mesh_select_loops, 7608 VIEW3D_MT_edit_mesh_extrude, 7609 VIEW3D_MT_edit_mesh_vertices, 7610 VIEW3D_MT_edit_mesh_edges, 7611 VIEW3D_MT_edit_mesh_faces, 7612 VIEW3D_MT_edit_mesh_faces_data, 7613 VIEW3D_MT_edit_mesh_normals, 7614 VIEW3D_MT_edit_mesh_normals_select_strength, 7615 VIEW3D_MT_edit_mesh_normals_set_strength, 7616 VIEW3D_MT_edit_mesh_normals_average, 7617 VIEW3D_MT_edit_mesh_shading, 7618 VIEW3D_MT_edit_mesh_weights, 7619 VIEW3D_MT_edit_mesh_clean, 7620 VIEW3D_MT_edit_mesh_delete, 7621 VIEW3D_MT_edit_mesh_merge, 7622 VIEW3D_MT_edit_mesh_split, 7623 VIEW3D_MT_edit_mesh_showhide, 7624 VIEW3D_MT_paint_gpencil, 7625 VIEW3D_MT_draw_gpencil, 7626 VIEW3D_MT_assign_material, 7627 VIEW3D_MT_edit_gpencil, 7628 VIEW3D_MT_edit_gpencil_stroke, 7629 VIEW3D_MT_edit_gpencil_point, 7630 VIEW3D_MT_edit_gpencil_delete, 7631 VIEW3D_MT_edit_gpencil_showhide, 7632 VIEW3D_MT_weight_gpencil, 7633 VIEW3D_MT_gpencil_animation, 7634 VIEW3D_MT_gpencil_simplify, 7635 VIEW3D_MT_gpencil_autoweights, 7636 VIEW3D_MT_gpencil_edit_context_menu, 7637 VIEW3D_MT_edit_curve, 7638 VIEW3D_MT_edit_curve_ctrlpoints, 7639 VIEW3D_MT_edit_curve_segments, 7640 VIEW3D_MT_edit_curve_clean, 7641 VIEW3D_MT_edit_curve_context_menu, 7642 VIEW3D_MT_edit_curve_delete, 7643 VIEW3D_MT_edit_curve_showhide, 7644 VIEW3D_MT_edit_surface, 7645 VIEW3D_MT_edit_font, 7646 VIEW3D_MT_edit_font_chars, 7647 VIEW3D_MT_edit_font_kerning, 7648 VIEW3D_MT_edit_font_delete, 7649 VIEW3D_MT_edit_font_context_menu, 7650 VIEW3D_MT_edit_meta, 7651 VIEW3D_MT_edit_meta_showhide, 7652 VIEW3D_MT_edit_lattice, 7653 VIEW3D_MT_edit_armature, 7654 VIEW3D_MT_armature_context_menu, 7655 VIEW3D_MT_edit_armature_parent, 7656 VIEW3D_MT_edit_armature_roll, 7657 VIEW3D_MT_edit_armature_names, 7658 VIEW3D_MT_edit_armature_delete, 7659 VIEW3D_MT_edit_gpencil_transform, 7660 VIEW3D_MT_object_mode_pie, 7661 VIEW3D_MT_view_pie, 7662 VIEW3D_MT_transform_gizmo_pie, 7663 VIEW3D_MT_shading_pie, 7664 VIEW3D_MT_shading_ex_pie, 7665 VIEW3D_MT_pivot_pie, 7666 VIEW3D_MT_snap_pie, 7667 VIEW3D_MT_orientations_pie, 7668 VIEW3D_MT_proportional_editing_falloff_pie, 7669 VIEW3D_MT_sculpt_mask_edit_pie, 7670 VIEW3D_MT_sculpt_automasking_pie, 7671 VIEW3D_MT_wpaint_vgroup_lock_pie, 7672 VIEW3D_MT_sculpt_face_sets_edit_pie, 7673 VIEW3D_PT_active_tool, 7674 VIEW3D_PT_active_tool_duplicate, 7675 VIEW3D_PT_view3d_properties, 7676 VIEW3D_PT_view3d_lock, 7677 VIEW3D_PT_view3d_cursor, 7678 VIEW3D_PT_collections, 7679 VIEW3D_PT_object_type_visibility, 7680 VIEW3D_PT_grease_pencil, 7681 VIEW3D_PT_annotation_onion, 7682 VIEW3D_PT_gpencil_multi_frame, 7683 VIEW3D_PT_gpencil_curve_edit, 7684 VIEW3D_PT_quad_view, 7685 VIEW3D_PT_view3d_stereo, 7686 VIEW3D_PT_shading, 7687 VIEW3D_PT_shading_lighting, 7688 VIEW3D_PT_shading_color, 7689 VIEW3D_PT_shading_options, 7690 VIEW3D_PT_shading_options_shadow, 7691 VIEW3D_PT_shading_options_ssao, 7692 VIEW3D_PT_shading_render_pass, 7693 VIEW3D_PT_gizmo_display, 7694 VIEW3D_PT_overlay, 7695 VIEW3D_PT_overlay_guides, 7696 VIEW3D_PT_overlay_object, 7697 VIEW3D_PT_overlay_geometry, 7698 VIEW3D_PT_overlay_motion_tracking, 7699 VIEW3D_PT_overlay_edit_mesh, 7700 VIEW3D_PT_overlay_edit_mesh_shading, 7701 VIEW3D_PT_overlay_edit_mesh_measurement, 7702 VIEW3D_PT_overlay_edit_mesh_normals, 7703 VIEW3D_PT_overlay_edit_mesh_freestyle, 7704 VIEW3D_PT_overlay_edit_curve, 7705 VIEW3D_PT_overlay_texture_paint, 7706 VIEW3D_PT_overlay_vertex_paint, 7707 VIEW3D_PT_overlay_weight_paint, 7708 VIEW3D_PT_overlay_pose, 7709 VIEW3D_PT_overlay_sculpt, 7710 VIEW3D_PT_snapping, 7711 VIEW3D_PT_proportional_edit, 7712 VIEW3D_PT_gpencil_origin, 7713 VIEW3D_PT_gpencil_lock, 7714 VIEW3D_PT_gpencil_guide, 7715 VIEW3D_PT_transform_orientations, 7716 VIEW3D_PT_overlay_gpencil_options, 7717 VIEW3D_PT_context_properties, 7718 VIEW3D_PT_paint_vertex_context_menu, 7719 VIEW3D_PT_paint_texture_context_menu, 7720 VIEW3D_PT_paint_weight_context_menu, 7721 VIEW3D_PT_gpencil_vertex_context_menu, 7722 VIEW3D_PT_gpencil_sculpt_context_menu, 7723 VIEW3D_PT_gpencil_weight_context_menu, 7724 VIEW3D_PT_gpencil_draw_context_menu, 7725 VIEW3D_PT_sculpt_context_menu, 7726 TOPBAR_PT_gpencil_materials, 7727 TOPBAR_PT_gpencil_vertexcolor, 7728 TOPBAR_PT_annotation_layers, 7729 ) 7730 7731 7732 if __name__ == "__main__" : # only for live edit. 7733 from bpy.utils import register_class 7734 for cls in classes: 7735 register_class (cls)
Use_gpencil_draw_onback Toggle
Source: https://fossies.org/linux/blender/release/scripts/startup/bl_ui/space_view3d.py
0 Response to "Use_gpencil_draw_onback Toggle"
Post a Comment