Blender  V3.3
object_select.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
3 
8 #include <ctype.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 
13 #include "MEM_guardedalloc.h"
14 
15 #include "DNA_anim_types.h"
16 #include "DNA_armature_types.h"
17 #include "DNA_collection_types.h"
18 #include "DNA_gpencil_types.h"
19 #include "DNA_light_types.h"
20 #include "DNA_material_types.h"
21 #include "DNA_modifier_types.h"
22 #include "DNA_scene_types.h"
23 #include "DNA_workspace_types.h"
24 
25 #include "BLI_listbase.h"
26 #include "BLI_math.h"
27 #include "BLI_math_bits.h"
28 #include "BLI_rand.h"
29 #include "BLI_string_utils.h"
30 #include "BLI_utildefines.h"
31 
32 #include "BLT_translation.h"
33 
34 #include "BKE_action.h"
35 #include "BKE_armature.h"
36 #include "BKE_collection.h"
37 #include "BKE_context.h"
38 #include "BKE_deform.h"
39 #include "BKE_layer.h"
40 #include "BKE_lib_id.h"
41 #include "BKE_main.h"
42 #include "BKE_material.h"
43 #include "BKE_object.h"
44 #include "BKE_paint.h"
45 #include "BKE_particle.h"
46 #include "BKE_report.h"
47 #include "BKE_scene.h"
48 #include "BKE_workspace.h"
49 
50 #include "DEG_depsgraph.h"
51 
52 #include "WM_api.h"
53 #include "WM_message.h"
54 #include "WM_types.h"
55 
56 #include "ED_armature.h"
57 #include "ED_keyframing.h"
58 #include "ED_object.h"
59 #include "ED_outliner.h"
60 #include "ED_screen.h"
61 #include "ED_select_utils.h"
62 
63 #include "UI_interface.h"
64 #include "UI_resources.h"
65 
66 #include "RNA_access.h"
67 #include "RNA_define.h"
68 #include "RNA_enum_types.h"
69 
70 #include "object_intern.h"
71 
72 /* -------------------------------------------------------------------- */
77 {
78  if (mode == BA_INVERT) {
79  mode = (base->flag & BASE_SELECTED) != 0 ? BA_DESELECT : BA_SELECT;
80  }
81 
82  if (base) {
83  switch (mode) {
84  case BA_SELECT:
85  if ((base->flag & BASE_SELECTABLE) != 0) {
86  base->flag |= BASE_SELECTED;
87  }
88  break;
89  case BA_DESELECT:
90  base->flag &= ~BASE_SELECTED;
91  break;
92  case BA_INVERT:
93  /* Never happens. */
94  break;
95  }
97  }
98 }
99 
101 {
104  struct wmMsgBus *mbus = ((wmWindowManager *)bmain->wm.first)->message_bus;
105  if (mbus != NULL) {
106  WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active);
107  }
108 }
109 
111 {
113  ViewLayer *view_layer = CTX_data_view_layer(C);
114  view_layer->basact = base;
116 }
117 
119 {
120  ViewLayer *view_layer = CTX_data_view_layer(C);
121 
122  /* Currently we only need to be concerned with edit-mode. */
123  Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
124  if (obedit) {
125  Object *ob = base->object;
126  if (((ob->mode & OB_MODE_EDIT) == 0) || (obedit->type != ob->type)) {
127  Main *bmain = CTX_data_main(C);
130  }
131  }
132  ED_object_base_activate(C, base);
133 }
134 
136  View3D *v3d,
137  int action,
138  bool *r_any_visible)
139 {
140  if (action == SEL_TOGGLE) {
141  action = SEL_SELECT;
142  FOREACH_VISIBLE_BASE_BEGIN (view_layer, v3d, base) {
143  if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) {
144  continue;
145  }
146  if ((base->flag & BASE_SELECTED) != 0) {
147  action = SEL_DESELECT;
148  break;
149  }
150  }
152  }
153 
154  bool any_visible = false;
155  bool changed = false;
156  FOREACH_VISIBLE_BASE_BEGIN (view_layer, v3d, base) {
157  if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) {
158  continue;
159  }
160  switch (action) {
161  case SEL_SELECT:
162  if ((base->flag & BASE_SELECTED) == 0) {
164  changed = true;
165  }
166  break;
167  case SEL_DESELECT:
168  if ((base->flag & BASE_SELECTED) != 0) {
170  changed = true;
171  }
172  break;
173  case SEL_INVERT:
174  if ((base->flag & BASE_SELECTED) != 0) {
176  changed = true;
177  }
178  else {
180  changed = true;
181  }
182  break;
183  }
184  any_visible = true;
185  }
187  if (r_any_visible) {
188  *r_any_visible = any_visible;
189  }
190  return changed;
191 }
192 
193 bool ED_object_base_deselect_all(ViewLayer *view_layer, View3D *v3d, int action)
194 {
195  return ED_object_base_deselect_all_ex(view_layer, v3d, action, NULL);
196 }
197 
200 /* -------------------------------------------------------------------- */
205 {
206  if (base->flag & BASE_VISIBLE_DEPSGRAPH) {
207  if (base->flag & BASE_SELECTABLE) {
208  return 3;
209  }
210  return 2;
211  }
212  return 1;
213 }
214 
216 {
218 
219  /* Try active object. */
220  Base *basact = view_layer->basact;
221 
222  if (basact && basact->object && basact->object->data == id) {
223  return basact;
224  }
225 
226  /* Try all objects. */
227  Base *base_best = NULL;
228  int priority_best = 0;
229 
230  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
231  if (base->object && base->object->data == id) {
232  if (base->flag & BASE_SELECTED) {
233  return base;
234  }
235 
236  int priority_test = get_base_select_priority(base);
237 
238  if (priority_test > priority_best) {
239  priority_best = priority_test;
240  base_best = base;
241  }
242  }
243  }
244 
245  return base_best;
246 }
247 
248 bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_hidden))
249 {
250  ViewLayer *view_layer = CTX_data_view_layer(C);
251  View3D *v3d = CTX_wm_view3d(C);
252  Base *base = BKE_view_layer_base_find(view_layer, ob);
253 
254  if (base == NULL) {
255  return false;
256  }
257 
258  /* TODO: use 'reveal_hidden', as is done with bones. */
259 
260  if (view_layer->basact != base || !(base->flag & BASE_SELECTED)) {
261  /* Select if not selected. */
262  if (!(base->flag & BASE_SELECTED)) {
263  ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
264 
265  if (BASE_VISIBLE(v3d, base)) {
267  }
268 
270  }
271 
272  /* Make active if not active. */
273  ED_object_base_activate(C, base);
274  }
275 
276  return true;
277 }
278 
280  Object *ob,
281  const char *bone_name,
282  const bool reveal_hidden)
283 {
284  /* Verify it's a valid armature object. */
285  if (ob == NULL || ob->type != OB_ARMATURE) {
286  return false;
287  }
288 
289  bArmature *arm = ob->data;
290 
291  /* Activate the armature object. */
292  if (!ED_object_jump_to_object(C, ob, reveal_hidden)) {
293  return false;
294  }
295 
296  /* Switch to pose mode from object mode. */
297  if (!ELEM(ob->mode, OB_MODE_EDIT, OB_MODE_POSE)) {
299  }
300 
301  if (ob->mode == OB_MODE_EDIT && arm->edbo != NULL) {
302  /* In Edit mode select and activate the target Edit-Bone. */
303  EditBone *ebone = ED_armature_ebone_find_name(arm->edbo, bone_name);
304  if (ebone != NULL) {
305  if (reveal_hidden) {
306  /* Unhide the bone. */
307  ebone->flag &= ~BONE_HIDDEN_A;
308 
309  if ((arm->layer & ebone->layer) == 0) {
310  arm->layer |= 1U << bitscan_forward_uint(ebone->layer);
311  }
312  }
313 
314  /* Select it. */
316 
317  if (EBONE_SELECTABLE(arm, ebone)) {
318  ED_armature_ebone_select_set(ebone, true);
320  }
321 
322  arm->act_edbone = ebone;
323 
325  return true;
326  }
327  }
328  else if (ob->mode == OB_MODE_POSE && ob->pose != NULL) {
329  /* In Pose mode select and activate the target Bone/Pose-Channel. */
330  bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
331  if (pchan != NULL) {
332  if (reveal_hidden) {
333  /* Unhide the bone. */
334  pchan->bone->flag &= ~BONE_HIDDEN_P;
335 
336  if ((arm->layer & pchan->bone->layer) == 0) {
337  arm->layer |= 1U << bitscan_forward_uint(pchan->bone->layer);
338  }
339  }
340 
341  /* Select it. */
343  ED_pose_bone_select(ob, pchan, true);
344 
345  arm->act_bone = pchan->bone;
346 
348  return true;
349  }
350  }
351 
352  return false;
353 }
354 
357 /* -------------------------------------------------------------------- */
362 {
363  /* we don't check for linked scenes here, selection is
364  * still allowed then for inspection of scene */
365  Object *obact = CTX_data_active_object(C);
366 
367  if (CTX_data_edit_object(C)) {
368  return 0;
369  }
370  if (obact && obact->mode) {
371  return 0;
372  }
373 
374  return 1;
375 }
376 
379 /* -------------------------------------------------------------------- */
384 {
385  ViewLayer *view_layer = CTX_data_view_layer(C);
386  View3D *v3d = CTX_wm_view3d(C);
387  short obtype, extend;
388 
389  obtype = RNA_enum_get(op->ptr, "type");
390  extend = RNA_boolean_get(op->ptr, "extend");
391 
392  if (extend == 0) {
393  ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
394  }
395 
396  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
397  if (base->object->type == obtype) {
399  }
400  }
401  CTX_DATA_END;
402 
406 
408 
409  return OPERATOR_FINISHED;
410 }
411 
413 {
414  /* identifiers */
415  ot->name = "Select by Type";
416  ot->description = "Select all visible objects that are of a type";
417  ot->idname = "OBJECT_OT_select_by_type";
418 
419  /* api callbacks */
423 
424  /* flags */
426 
427  /* properties */
429  "extend",
430  false,
431  "Extend",
432  "Extend selection instead of deselecting everything first");
433  ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_object_type_items, 1, "Type", "");
435 }
436 
439 /* -------------------------------------------------------------------- */
443 enum {
451 };
452 
454  /* XXX deprecated animation system stuff. */
455  // {OBJECT_SELECT_LINKED_IPO, "IPO", 0, "Object IPO", ""},
456  {OBJECT_SELECT_LINKED_OBDATA, "OBDATA", 0, "Object Data", ""},
457  {OBJECT_SELECT_LINKED_MATERIAL, "MATERIAL", 0, "Material", ""},
458  {OBJECT_SELECT_LINKED_DUPGROUP, "DUPGROUP", 0, "Instanced Collection", ""},
459  {OBJECT_SELECT_LINKED_PARTICLE, "PARTICLE", 0, "Particle System", ""},
460  {OBJECT_SELECT_LINKED_LIBRARY, "LIBRARY", 0, "Library", ""},
461  {OBJECT_SELECT_LINKED_LIBRARY_OBDATA, "LIBRARY_OBDATA", 0, "Library (Object Data)", ""},
462  {0, NULL, 0, NULL, NULL},
463 };
464 
465 static bool object_select_all_by_obdata(bContext *C, void *obdata)
466 {
467  bool changed = false;
468 
469  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
470  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
471  if (base->object->data == obdata) {
473  changed = true;
474  }
475  }
476  }
477  CTX_DATA_END;
478 
479  return changed;
480 }
481 
483 {
484  bool changed = false;
485 
486  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
487  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
488  Object *ob = base->object;
489  Material *mat1;
490  int a;
491 
492  for (a = 1; a <= ob->totcol; a++) {
493  mat1 = BKE_object_material_get(ob, a);
494 
495  if (mat1 == mat) {
497  changed = true;
498  }
499  }
500  }
501  }
502  CTX_DATA_END;
503 
504  return changed;
505 }
506 
508 {
509  bool changed = false;
510  Collection *instance_collection = (ob->transflag & OB_DUPLICOLLECTION) ?
511  ob->instance_collection :
512  NULL;
513 
514  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
515  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
516  Collection *instance_collection_other = (base->object->transflag & OB_DUPLICOLLECTION) ?
517  base->object->instance_collection :
518  NULL;
519  if (instance_collection == instance_collection_other) {
521  changed = true;
522  }
523  }
524  }
525  CTX_DATA_END;
526 
527  return changed;
528 }
529 
531 {
532  ParticleSystem *psys_act = psys_get_current(ob);
533  bool changed = false;
534 
535  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
536  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
537  /* Loop through other particles. */
538  ParticleSystem *psys;
539 
540  for (psys = base->object->particlesystem.first; psys; psys = psys->next) {
541  if (psys->part == psys_act->part) {
543  changed = true;
544  break;
545  }
546 
547  if (base->flag & BASE_SELECTED) {
548  break;
549  }
550  }
551  }
552  }
553  CTX_DATA_END;
554 
555  return changed;
556 }
557 
559 {
560  bool changed = false;
561 
562  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
563  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
564  if (lib == base->object->id.lib) {
566  changed = true;
567  }
568  }
569  }
570  CTX_DATA_END;
571 
572  return changed;
573 }
574 
576 {
577  bool changed = false;
578 
579  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
580  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
581  if (base->object->data && lib == ((ID *)base->object->data)->lib) {
583  changed = true;
584  }
585  }
586  }
587  CTX_DATA_END;
588 
589  return changed;
590 }
591 
593 {
594  int idtype = GS(id->name);
595  bool changed = false;
596 
597  if (OB_DATA_SUPPORT_ID(idtype)) {
598  changed = object_select_all_by_obdata(C, id);
599  }
600  else if (idtype == ID_MA) {
601  changed = object_select_all_by_material(C, (Material *)id);
602  }
603  else if (idtype == ID_LI) {
604  changed = object_select_all_by_library(C, (Library *)id);
605  }
606 
607  if (changed) {
611  }
612 }
613 
615 {
617  ViewLayer *view_layer = CTX_data_view_layer(C);
618  View3D *v3d = CTX_wm_view3d(C);
619  Object *ob;
620  int nr = RNA_enum_get(op->ptr, "type");
621  bool changed = false, extend;
622 
623  extend = RNA_boolean_get(op->ptr, "extend");
624 
625  if (extend == 0) {
626  ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
627  }
628 
629  ob = OBACT(view_layer);
630  if (ob == NULL) {
631  BKE_report(op->reports, RPT_ERROR, "No active object");
632  return OPERATOR_CANCELLED;
633  }
634 
635  if (nr == OBJECT_SELECT_LINKED_IPO) {
636  /* XXX old animation system */
637  // if (ob->ipo == 0) return OPERATOR_CANCELLED;
638  // object_select_all_by_ipo(C, ob->ipo)
639  return OPERATOR_CANCELLED;
640  }
641  if (nr == OBJECT_SELECT_LINKED_OBDATA) {
642  if (ob->data == NULL) {
643  return OPERATOR_CANCELLED;
644  }
645 
646  changed = object_select_all_by_obdata(C, ob->data);
647  }
648  else if (nr == OBJECT_SELECT_LINKED_MATERIAL) {
649  Material *mat = NULL;
650 
651  mat = BKE_object_material_get(ob, ob->actcol);
652  if (mat == NULL) {
653  return OPERATOR_CANCELLED;
654  }
655 
656  changed = object_select_all_by_material(C, mat);
657  }
658  else if (nr == OBJECT_SELECT_LINKED_DUPGROUP) {
659  if (ob->instance_collection == NULL) {
660  return OPERATOR_CANCELLED;
661  }
662 
664  }
665  else if (nr == OBJECT_SELECT_LINKED_PARTICLE) {
667  return OPERATOR_CANCELLED;
668  }
669 
670  changed = object_select_all_by_particle(C, ob);
671  }
672  else if (nr == OBJECT_SELECT_LINKED_LIBRARY) {
673  /* do nothing */
674  changed = object_select_all_by_library(C, ob->id.lib);
675  }
676  else if (nr == OBJECT_SELECT_LINKED_LIBRARY_OBDATA) {
677  if (ob->data == NULL) {
678  return OPERATOR_CANCELLED;
679  }
680 
681  changed = object_select_all_by_library_obdata(C, ((ID *)ob->data)->lib);
682  }
683  else {
684  return OPERATOR_CANCELLED;
685  }
686 
687  if (changed) {
691  return OPERATOR_FINISHED;
692  }
693 
694  return OPERATOR_CANCELLED;
695 }
696 
698 {
699  /* identifiers */
700  ot->name = "Select Linked";
701  ot->description = "Select all visible objects that are linked";
702  ot->idname = "OBJECT_OT_select_linked";
703 
704  /* api callbacks */
708 
709  /* flags */
711 
712  /* properties */
714  "extend",
715  false,
716  "Extend",
717  "Extend selection instead of deselecting everything first");
718  ot->prop = RNA_def_enum(ot->srna, "type", prop_select_linked_types, 0, "Type", "");
719 }
720 
723 /* -------------------------------------------------------------------- */
727 enum {
739 };
740 
742  {OBJECT_GRPSEL_CHILDREN_RECURSIVE, "CHILDREN_RECURSIVE", 0, "Children", ""},
743  {OBJECT_GRPSEL_CHILDREN, "CHILDREN", 0, "Immediate Children", ""},
744  {OBJECT_GRPSEL_PARENT, "PARENT", 0, "Parent", ""},
745  {OBJECT_GRPSEL_SIBLINGS, "SIBLINGS", 0, "Siblings", "Shared parent"},
746  {OBJECT_GRPSEL_TYPE, "TYPE", 0, "Type", "Shared object type"},
747  {OBJECT_GRPSEL_COLLECTION, "COLLECTION", 0, "Collection", "Shared collection"},
748  {OBJECT_GRPSEL_HOOK, "HOOK", 0, "Hook", ""},
749  {OBJECT_GRPSEL_PASS, "PASS", 0, "Pass", "Render pass index"},
750  {OBJECT_GRPSEL_COLOR, "COLOR", 0, "Color", "Object color"},
752  "KEYINGSET",
753  0,
754  "Keying Set",
755  "Objects included in active Keying Set"},
756  {OBJECT_GRPSEL_LIGHT_TYPE, "LIGHT_TYPE", 0, "Light Type", "Matching light types"},
757  {0, NULL, 0, NULL, NULL},
758 };
759 
760 static bool select_grouped_children(bContext *C, Object *ob, const bool recursive)
761 {
762  bool changed = false;
763 
764  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
765  if (ob == base->object->parent) {
766  if ((base->flag & BASE_SELECTED) == 0) {
768  changed = true;
769  }
770 
771  if (recursive) {
772  changed |= select_grouped_children(C, base->object, 1);
773  }
774  }
775  }
776  CTX_DATA_END;
777  return changed;
778 }
779 
780 static bool select_grouped_parent(bContext *C) /* Makes parent active and de-selected OBACT */
781 {
782  ViewLayer *view_layer = CTX_data_view_layer(C);
783  View3D *v3d = CTX_wm_view3d(C);
784  Base *baspar, *basact = CTX_data_active_base(C);
785  bool changed = false;
786 
787  if (!basact || !(basact->object->parent)) {
788  return 0; /* we know OBACT is valid */
789  }
790 
791  baspar = BKE_view_layer_base_find(view_layer, basact->object->parent);
792 
793  /* can be NULL if parent in other scene */
794  if (baspar && BASE_SELECTABLE(v3d, baspar)) {
796  ED_object_base_activate(C, baspar);
797  changed = true;
798  }
799  return changed;
800 }
801 
802 #define COLLECTION_MENU_MAX 24
803 /* Select objects in the same group as the active */
805 {
806  Main *bmain = CTX_data_main(C);
807  bool changed = false;
808  Collection *collection, *ob_collections[COLLECTION_MENU_MAX];
809  int collection_count = 0, i;
810  uiPopupMenu *pup;
811  uiLayout *layout;
812 
813  for (collection = bmain->collections.first;
814  collection && (collection_count < COLLECTION_MENU_MAX);
815  collection = collection->id.next) {
816  if (BKE_collection_has_object(collection, ob)) {
817  ob_collections[collection_count] = collection;
819  }
820  }
821 
822  if (!collection_count) {
823  return 0;
824  }
825  if (collection_count == 1) {
826  collection = ob_collections[0];
827  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
828  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
829  if (BKE_collection_has_object(collection, base->object)) {
831  changed = true;
832  }
833  }
834  }
835  CTX_DATA_END;
836  return changed;
837  }
838 
839  /* build the menu. */
840  pup = UI_popup_menu_begin(C, IFACE_("Select Collection"), ICON_NONE);
841  layout = UI_popup_menu_layout(pup);
842 
843  for (i = 0; i < collection_count; i++) {
844  collection = ob_collections[i];
845  uiItemStringO(layout,
846  collection->id.name + 2,
847  0,
848  "OBJECT_OT_select_same_collection",
849  "collection",
850  collection->id.name + 2);
851  }
852 
853  UI_popup_menu_end(C, pup);
854  return changed; /* The operator already handle this! */
855 }
856 
858 {
859  ViewLayer *view_layer = CTX_data_view_layer(C);
860  View3D *v3d = CTX_wm_view3d(C);
861 
862  bool changed = false;
863  Base *base;
864  ModifierData *md;
865  HookModifierData *hmd;
866 
867  for (md = ob->modifiers.first; md; md = md->next) {
868  if (md->type == eModifierType_Hook) {
869  hmd = (HookModifierData *)md;
870  if (hmd->object) {
871  base = BKE_view_layer_base_find(view_layer, hmd->object);
872  if (base && ((base->flag & BASE_SELECTED) == 0) && (BASE_SELECTABLE(v3d, base))) {
874  changed = true;
875  }
876  }
877  }
878  }
879  return changed;
880 }
881 
882 /* Select objects with the same parent as the active (siblings),
883  * parent can be NULL also */
885 {
886  bool changed = false;
887 
888  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
889  if ((base->object->parent == ob->parent) && ((base->flag & BASE_SELECTED) == 0)) {
891  changed = true;
892  }
893  }
894  CTX_DATA_END;
895  return changed;
896 }
898 {
899  Light *la = ob->data;
900 
901  bool changed = false;
902 
903  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
904  if (base->object->type == OB_LAMP) {
905  Light *la_test = base->object->data;
906  if ((la->type == la_test->type) && ((base->flag & BASE_SELECTED) == 0)) {
908  changed = true;
909  }
910  }
911  }
912  CTX_DATA_END;
913  return changed;
914 }
916 {
917  bool changed = false;
918 
919  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
920  if ((base->object->type == ob->type) && ((base->flag & BASE_SELECTED) == 0)) {
922  changed = true;
923  }
924  }
925  CTX_DATA_END;
926  return changed;
927 }
928 
930 {
931  bool changed = false;
932 
933  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
934  if ((base->object->index == ob->index) && ((base->flag & BASE_SELECTED) == 0)) {
936  changed = true;
937  }
938  }
939  CTX_DATA_END;
940  return changed;
941 }
942 
944 {
945  bool changed = false;
946 
947  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
948  if (((base->flag & BASE_SELECTED) == 0) &&
949  (compare_v3v3(base->object->color, ob->color, 0.005f))) {
951  changed = true;
952  }
953  }
954  CTX_DATA_END;
955  return changed;
956 }
957 
959 {
961  bool changed = false;
962 
963  /* firstly, validate KeyingSet */
964  if (ks == NULL) {
965  BKE_report(reports, RPT_ERROR, "No active Keying Set to use");
966  return false;
967  }
968  if (ANIM_validate_keyingset(C, NULL, ks) != 0) {
969  if (ks->paths.first == NULL) {
970  if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) {
971  BKE_report(reports,
972  RPT_ERROR,
973  "Use another Keying Set, as the active one depends on the currently "
974  "selected objects or cannot find any targets due to unsuitable context");
975  }
976  else {
977  BKE_report(reports, RPT_ERROR, "Keying Set does not contain any paths");
978  }
979  }
980  return false;
981  }
982 
983  /* select each object that Keying Set refers to */
984  /* TODO: perhaps to be more in line with the rest of these, we should only take objects
985  * if the passed in object is included in this too */
986  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
987  /* only check for this object if it isn't selected already, to limit time wasted */
988  if ((base->flag & BASE_SELECTED) == 0) {
989  KS_Path *ksp;
990 
991  /* this is the slow way... we could end up with > 500 items here,
992  * with none matching, but end up doing this on 1000 objects...
993  */
994  for (ksp = ks->paths.first; ksp; ksp = ksp->next) {
995  /* if id matches, select then stop looping (match found) */
996  if (ksp->id == (ID *)base->object) {
998  changed = true;
999  break;
1000  }
1001  }
1002  }
1003  }
1004  CTX_DATA_END;
1005 
1006  return changed;
1007 }
1008 
1010 {
1012  ViewLayer *view_layer = CTX_data_view_layer(C);
1013  View3D *v3d = CTX_wm_view3d(C);
1014  Object *ob;
1015  const int type = RNA_enum_get(op->ptr, "type");
1016  bool changed = false, extend;
1017 
1018  extend = RNA_boolean_get(op->ptr, "extend");
1019 
1020  if (extend == 0) {
1021  changed = ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
1022  }
1023 
1024  ob = OBACT(view_layer);
1025  if (ob == NULL) {
1026  BKE_report(op->reports, RPT_ERROR, "No active object");
1027  return OPERATOR_CANCELLED;
1028  }
1029 
1030  switch (type) {
1032  changed |= select_grouped_children(C, ob, true);
1033  break;
1035  changed |= select_grouped_children(C, ob, false);
1036  break;
1037  case OBJECT_GRPSEL_PARENT:
1038  changed |= select_grouped_parent(C);
1039  break;
1041  changed |= select_grouped_siblings(C, ob);
1042  break;
1043  case OBJECT_GRPSEL_TYPE:
1044  changed |= select_grouped_type(C, ob);
1045  break;
1047  changed |= select_grouped_collection(C, ob);
1048  break;
1049  case OBJECT_GRPSEL_HOOK:
1050  changed |= select_grouped_object_hooks(C, ob);
1051  break;
1052  case OBJECT_GRPSEL_PASS:
1053  changed |= select_grouped_index_object(C, ob);
1054  break;
1055  case OBJECT_GRPSEL_COLOR:
1056  changed |= select_grouped_color(C, ob);
1057  break;
1059  changed |= select_grouped_keyingset(C, ob, op->reports);
1060  break;
1062  if (ob->type != OB_LAMP) {
1063  BKE_report(op->reports, RPT_ERROR, "Active object must be a light");
1064  break;
1065  }
1066  changed |= select_grouped_lighttype(C, ob);
1067  break;
1068  default:
1069  break;
1070  }
1071 
1072  if (changed) {
1076  return OPERATOR_FINISHED;
1077  }
1078 
1079  return OPERATOR_CANCELLED;
1080 }
1081 
1083 {
1084  /* identifiers */
1085  ot->name = "Select Grouped";
1086  ot->description = "Select all visible objects grouped by various properties";
1087  ot->idname = "OBJECT_OT_select_grouped";
1088 
1089  /* api callbacks */
1093 
1094  /* flags */
1096 
1097  /* properties */
1099  "extend",
1100  false,
1101  "Extend",
1102  "Extend selection instead of deselecting everything first");
1103  ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
1104 }
1105 
1108 /* -------------------------------------------------------------------- */
1113 {
1114  ViewLayer *view_layer = CTX_data_view_layer(C);
1115  View3D *v3d = CTX_wm_view3d(C);
1116  int action = RNA_enum_get(op->ptr, "action");
1117  bool any_visible = false;
1118 
1119  bool changed = ED_object_base_deselect_all_ex(view_layer, v3d, action, &any_visible);
1120 
1121  if (changed) {
1125 
1127 
1128  return OPERATOR_FINISHED;
1129  }
1130  if (any_visible == false) {
1131  /* TODO(campbell): Looks like we could remove this,
1132  * if not comment should say why its needed. */
1133  return OPERATOR_PASS_THROUGH;
1134  }
1135  return OPERATOR_CANCELLED;
1136 }
1137 
1139 {
1140 
1141  /* identifiers */
1142  ot->name = "(De)select All";
1143  ot->description = "Change selection of all visible objects in scene";
1144  ot->idname = "OBJECT_OT_select_all";
1145 
1146  /* api callbacks */
1149 
1150  /* flags */
1152 
1154 }
1155 
1158 /* -------------------------------------------------------------------- */
1163 {
1164  Main *bmain = CTX_data_main(C);
1165  Collection *collection;
1166  char collection_name[MAX_ID_NAME];
1167 
1168  /* passthrough if no objects are visible */
1169  if (CTX_DATA_COUNT(C, visible_bases) == 0) {
1170  return OPERATOR_PASS_THROUGH;
1171  }
1172 
1173  RNA_string_get(op->ptr, "collection", collection_name);
1174 
1175  collection = (Collection *)BKE_libblock_find_name(bmain, ID_GR, collection_name);
1176 
1177  if (!collection) {
1178  return OPERATOR_PASS_THROUGH;
1179  }
1180 
1181  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
1182  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
1183  if (BKE_collection_has_object(collection, base->object)) {
1185  }
1186  }
1187  }
1188  CTX_DATA_END;
1189 
1193 
1195 
1196  return OPERATOR_FINISHED;
1197 }
1198 
1200 {
1201 
1202  /* identifiers */
1203  ot->name = "Select Same Collection";
1204  ot->description = "Select object in the same collection";
1205  ot->idname = "OBJECT_OT_select_same_collection";
1206 
1207  /* api callbacks */
1210 
1211  /* flags */
1213 
1215  ot->srna, "collection", NULL, MAX_ID_NAME, "Collection", "Name of the collection to select");
1216 }
1217 
1220 /* -------------------------------------------------------------------- */
1225 {
1226  Main *bmain = CTX_data_main(C);
1228  ViewLayer *view_layer = CTX_data_view_layer(C);
1229  bool extend;
1230 
1231  extend = RNA_boolean_get(op->ptr, "extend");
1232 
1233  CTX_DATA_BEGIN (C, Base *, primbase, selected_bases) {
1234  char name_flip[MAXBONENAME];
1235 
1236  BLI_string_flip_side_name(name_flip, primbase->object->id.name + 2, true, sizeof(name_flip));
1237 
1238  if (!STREQ(name_flip, primbase->object->id.name + 2)) {
1239  Object *ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, name_flip);
1240  if (ob) {
1241  Base *secbase = BKE_view_layer_base_find(view_layer, ob);
1242 
1243  if (secbase) {
1244  ED_object_base_select(secbase, BA_SELECT);
1245  }
1246  }
1247  }
1248 
1249  if (extend == false) {
1251  }
1252  }
1253  CTX_DATA_END;
1254 
1255  /* undo? */
1258 
1260 
1261  return OPERATOR_FINISHED;
1262 }
1263 
1265 {
1266 
1267  /* identifiers */
1268  ot->name = "Select Mirror";
1269  ot->description =
1270  "Select the mirror objects of the selected object e.g. \"L.sword\" and \"R.sword\"";
1271  ot->idname = "OBJECT_OT_select_mirror";
1272 
1273  /* api callbacks */
1276 
1277  /* flags */
1279 
1281  ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first");
1282 }
1283 
1286 /* -------------------------------------------------------------------- */
1290 static bool object_select_more_less(bContext *C, const bool select)
1291 {
1292  ViewLayer *view_layer = CTX_data_view_layer(C);
1293 
1294  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
1295  Object *ob = base->object;
1296  ob->flag &= ~OB_DONE;
1297  ob->id.tag &= ~LIB_TAG_DOIT;
1298  /* parent may be in another scene */
1299  if (ob->parent) {
1300  ob->parent->flag &= ~OB_DONE;
1301  ob->parent->id.tag &= ~LIB_TAG_DOIT;
1302  }
1303  }
1304 
1305  ListBase ctx_base_list;
1306  CollectionPointerLink *ctx_base;
1307  CTX_data_selectable_bases(C, &ctx_base_list);
1308 
1309  CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
1310  ob->flag |= OB_DONE;
1311  }
1312  CTX_DATA_END;
1313 
1314  for (ctx_base = ctx_base_list.first; ctx_base; ctx_base = ctx_base->next) {
1315  Object *ob = ((Base *)ctx_base->ptr.data)->object;
1316  if (ob->parent) {
1317  if ((ob->flag & OB_DONE) != (ob->parent->flag & OB_DONE)) {
1318  ob->id.tag |= LIB_TAG_DOIT;
1319  ob->parent->id.tag |= LIB_TAG_DOIT;
1320  }
1321  }
1322  }
1323 
1324  bool changed = false;
1325  const short select_mode = select ? BA_SELECT : BA_DESELECT;
1326  const short select_flag = select ? BASE_SELECTED : 0;
1327 
1328  for (ctx_base = ctx_base_list.first; ctx_base; ctx_base = ctx_base->next) {
1329  Base *base = ctx_base->ptr.data;
1330  Object *ob = base->object;
1331  if ((ob->id.tag & LIB_TAG_DOIT) && ((base->flag & BASE_SELECTED) != select_flag)) {
1332  ED_object_base_select(base, select_mode);
1333  changed = true;
1334  }
1335  }
1336 
1337  BLI_freelistN(&ctx_base_list);
1338 
1339  return changed;
1340 }
1341 
1343 {
1344  bool changed = object_select_more_less(C, true);
1345 
1346  if (changed) {
1350 
1352 
1353  return OPERATOR_FINISHED;
1354  }
1355  return OPERATOR_CANCELLED;
1356 }
1357 
1359 {
1360  /* identifiers */
1361  ot->name = "Select More";
1362  ot->idname = "OBJECT_OT_select_more";
1363  ot->description = "Select connected parent/child objects";
1364 
1365  /* api callbacks */
1368 
1369  /* flags */
1371 }
1372 
1374 {
1375  bool changed = object_select_more_less(C, false);
1376 
1377  if (changed) {
1381 
1383 
1384  return OPERATOR_FINISHED;
1385  }
1386  return OPERATOR_CANCELLED;
1387 }
1388 
1390 {
1391  /* identifiers */
1392  ot->name = "Select Less";
1393  ot->idname = "OBJECT_OT_select_less";
1394  ot->description = "Deselect objects at the boundaries of parent/child relationships";
1395 
1396  /* api callbacks */
1399 
1400  /* flags */
1402 }
1403 
1406 /* -------------------------------------------------------------------- */
1411 {
1412  const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
1413  const float randfac = RNA_float_get(op->ptr, "ratio");
1415 
1416  ListBase ctx_data_list;
1417  CTX_data_selectable_bases(C, &ctx_data_list);
1418  const int tot = BLI_listbase_count(&ctx_data_list);
1419  int elem_map_len = 0;
1420  Base **elem_map = MEM_mallocN(sizeof(*elem_map) * tot, __func__);
1421 
1422  CollectionPointerLink *ctx_link;
1423  for (ctx_link = ctx_data_list.first; ctx_link; ctx_link = ctx_link->next) {
1424  elem_map[elem_map_len++] = ctx_link->ptr.data;
1425  }
1426  BLI_freelistN(&ctx_data_list);
1427 
1428  BLI_array_randomize(elem_map, sizeof(*elem_map), elem_map_len, seed);
1429  const int count_select = elem_map_len * randfac;
1430  for (int i = 0; i < count_select; i++) {
1431  ED_object_base_select(elem_map[i], select);
1432  }
1433  MEM_freeN(elem_map);
1434 
1438 
1440 
1441  return OPERATOR_FINISHED;
1442 }
1443 
1445 {
1446  /* identifiers */
1447  ot->name = "Select Random";
1448  ot->description = "Set select on random visible objects";
1449  ot->idname = "OBJECT_OT_select_random";
1450 
1451  /* api callbacks */
1452  // ot->invoke = object_select_random_invoke; /* TODO: need a number popup. */
1455 
1456  /* flags */
1458 
1459  /* properties */
1461 }
1462 
Blender kernel action and pose functionality.
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
bool BKE_collection_has_object(struct Collection *collection, const struct Object *ob)
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
struct Object * CTX_data_edit_object(const bContext *C)
Definition: context.c:1370
struct Base * CTX_data_active_base(const bContext *C)
Definition: context.c:1358
#define CTX_DATA_BEGIN(C, Type, instance, member)
Definition: BKE_context.h:269
struct ViewLayer * CTX_data_view_layer(const bContext *C)
Definition: context.c:1100
struct Object * CTX_data_active_object(const bContext *C)
Definition: context.c:1353
struct View3D * CTX_wm_view3d(const bContext *C)
Definition: context.c:784
#define CTX_DATA_COUNT(C, member)
Definition: BKE_context.h:290
int CTX_data_selectable_bases(const bContext *C, ListBase *list)
Definition: context.c:1348
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1074
#define CTX_DATA_END
Definition: BKE_context.h:278
support for deformation groups and hooks.
#define FOREACH_VISIBLE_BASE_END
Definition: BKE_layer.h:418
#define FOREACH_VISIBLE_BASE_BEGIN(_view_layer, _v3d, _instance)
Definition: BKE_layer.h:406
struct Base * BKE_view_layer_base_find(struct ViewLayer *view_layer, struct Object *ob)
Definition: layer.c:379
struct ID * BKE_libblock_find_name(struct Main *bmain, short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: lib_id.c:1297
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
Definition: material.c:687
General operations, lookup, etc. for blender objects.
struct ParticleSystem * psys_get_current(struct Object *ob)
Definition: particle.c:634
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition: report.c:83
void BKE_scene_object_base_flag_sync_from_base(struct Base *base)
Definition: scene.cc:2896
#define BLI_assert(a)
Definition: BLI_assert.h:46
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:269
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:466
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE unsigned int bitscan_forward_uint(unsigned int a)
MINLINE bool compare_v3v3(const float a[3], const float b[3], float limit) ATTR_WARN_UNUSED_RESULT
Random number functions.
void BLI_array_randomize(void *data, unsigned int elem_size, unsigned int elem_num, unsigned int seed)
Definition: rand.cc:188
size_t BLI_string_flip_side_name(char *r_name, const char *from_name, bool strip_number, size_t name_len)
Definition: string_utils.c:112
#define UNUSED(x)
#define ELEM(...)
#define STREQ(a, b)
#define BLT_I18NCONTEXT_ID_ID
#define IFACE_(msgid)
void DEG_id_tag_update(struct ID *id, int flag)
@ ID_RECALC_SELECT
Definition: DNA_ID.h:818
#define MAX_ID_NAME
Definition: DNA_ID.h:337
@ LIB_TAG_DOIT
Definition: DNA_ID.h:707
@ ID_LI
Definition: DNA_ID_enums.h:46
@ ID_MA
Definition: DNA_ID_enums.h:51
@ ID_GR
Definition: DNA_ID_enums.h:65
@ ID_OB
Definition: DNA_ID_enums.h:47
@ KEYINGSET_ABSOLUTE
#define MAXBONENAME
@ BONE_HIDDEN_A
@ BONE_HIDDEN_P
Object groups, one object can be in many groups at once.
@ BASE_SELECTABLE
@ BASE_VISIBLE_DEPSGRAPH
@ BASE_SELECTED
@ eModifierType_Hook
@ OB_MODE_EDIT
@ OB_MODE_POSE
#define OB_DONE
#define OB_DATA_SUPPORT_ID(_id_type)
@ OB_ARMATURE
@ OB_LAMP
@ OB_DUPLICOLLECTION
#define OBEDIT_FROM_VIEW_LAYER(view_layer)
#define OBACT(_view_layer)
#define BASE_VISIBLE(v3d, base)
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
@ OPERATOR_PASS_THROUGH
#define EBONE_SELECTABLE(arm, ebone)
Definition: ED_armature.h:52
@ EM_FREEDATA
Definition: ED_object.h:242
bool ED_object_editmode_exit_multi_ex(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, int flag)
Definition: object_edit.c:708
bool ED_object_mode_set(struct bContext *C, eObjectMode mode)
Definition: object_modes.c:231
eObjectSelect_Mode
Definition: ED_object.h:153
@ BA_DESELECT
Definition: ED_object.h:154
@ BA_INVERT
Definition: ED_object.h:156
@ BA_SELECT
Definition: ED_object.h:155
void ED_outliner_select_sync_from_object_tag(struct bContext *C)
bool ED_operator_objectmode(struct bContext *C)
Definition: screen_ops.c:186
@ SEL_SELECT
@ SEL_INVERT
@ SEL_DESELECT
@ SEL_TOGGLE
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
#define C
Definition: RandGen.cpp:25
struct uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
void UI_popup_menu_end(struct bContext *C, struct uiPopupMenu *pup)
void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value)
uiPopupMenu * UI_popup_menu_begin(struct bContext *C, const char *title, int icon) ATTR_NONNULL()
@ OPTYPE_UNDO
Definition: WM_types.h:148
@ OPTYPE_REGISTER
Definition: WM_types.h:146
#define ND_OB_ACTIVE
Definition: WM_types.h:388
#define ND_OB_SELECT
Definition: WM_types.h:390
#define NC_SCENE
Definition: WM_types.h:328
bool ED_armature_edit_deselect_all(Object *obedit)
void ED_armature_edit_sync_selection(ListBase *edbo)
void ED_armature_ebone_select_set(EditBone *ebone, bool select)
EditBone * ED_armature_ebone_find_name(const ListBase *edbo, const char *name)
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
Definition: avxb.h:154
static unsigned long seed
Definition: btSoftBody.h:39
Scene scene
DRWShaderLibrary * lib
#define GS(x)
Definition: iris.c:225
eModifyKey_Returns ANIM_validate_keyingset(bContext *C, ListBase *dsources, KeyingSet *ks)
Definition: keyingsets.c:954
KeyingSet * ANIM_scene_get_active_keyingset(const Scene *scene)
Definition: keyingsets.c:647
static int collection_count(const ListBase *lb)
Definition: layer.c:679
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
static unsigned a[3]
Definition: RandGen.cpp:78
bool active
all scheduled work for the GPU.
static bool object_select_all_by_instance_collection(bContext *C, Object *ob)
static const EnumPropertyItem prop_select_linked_types[]
static bool select_grouped_lighttype(bContext *C, Object *ob)
void OBJECT_OT_select_linked(wmOperatorType *ot)
static int get_base_select_priority(Base *base)
static bool select_grouped_children(bContext *C, Object *ob, const bool recursive)
static bool object_select_all_by_material(bContext *C, Material *mat)
static bool select_grouped_collection(bContext *C, Object *ob)
void OBJECT_OT_select_by_type(wmOperatorType *ot)
void ED_object_base_activate_with_mode_exit_if_needed(bContext *C, Base *base)
static int object_select_same_collection_exec(bContext *C, wmOperator *op)
static int object_select_all_exec(bContext *C, wmOperator *op)
bool ED_object_base_deselect_all_ex(ViewLayer *view_layer, View3D *v3d, int action, bool *r_any_visible)
#define COLLECTION_MENU_MAX
static int object_select_linked_exec(bContext *C, wmOperator *op)
static bool object_select_more_less(bContext *C, const bool select)
void OBJECT_OT_select_grouped(wmOperatorType *ot)
void OBJECT_OT_select_less(wmOperatorType *ot)
static int object_select_mirror_exec(bContext *C, wmOperator *op)
static bool select_grouped_object_hooks(bContext *C, Object *ob)
void ED_object_select_linked_by_id(bContext *C, ID *id)
bool ED_object_jump_to_bone(bContext *C, Object *ob, const char *bone_name, const bool reveal_hidden)
static bool objects_selectable_poll(bContext *C)
static bool select_grouped_color(bContext *C, Object *ob)
@ OBJECT_GRPSEL_LIGHT_TYPE
@ OBJECT_GRPSEL_TYPE
@ OBJECT_GRPSEL_KEYINGSET
@ OBJECT_GRPSEL_CHILDREN_RECURSIVE
@ OBJECT_GRPSEL_COLOR
@ OBJECT_GRPSEL_SIBLINGS
@ OBJECT_GRPSEL_PARENT
@ OBJECT_GRPSEL_COLLECTION
@ OBJECT_GRPSEL_PASS
@ OBJECT_GRPSEL_CHILDREN
@ OBJECT_GRPSEL_HOOK
void OBJECT_OT_select_same_collection(wmOperatorType *ot)
static int object_select_grouped_exec(bContext *C, wmOperator *op)
void OBJECT_OT_select_mirror(wmOperatorType *ot)
static bool select_grouped_index_object(bContext *C, Object *ob)
static bool object_select_all_by_obdata(bContext *C, void *obdata)
static bool select_grouped_siblings(bContext *C, Object *ob)
static bool select_grouped_parent(bContext *C)
void OBJECT_OT_select_all(wmOperatorType *ot)
static int object_select_less_exec(bContext *C, wmOperator *UNUSED(op))
void OBJECT_OT_select_random(wmOperatorType *ot)
static bool object_select_all_by_particle(bContext *C, Object *ob)
bool ED_object_base_deselect_all(ViewLayer *view_layer, View3D *v3d, int action)
void ED_object_base_activate(bContext *C, Base *base)
void ED_object_base_select(Base *base, eObjectSelect_Mode mode)
Definition: object_select.c:76
static int object_select_random_exec(bContext *C, wmOperator *op)
static bool object_select_all_by_library_obdata(bContext *C, Library *lib)
void ED_object_base_active_refresh(Main *bmain, Scene *scene, ViewLayer *view_layer)
@ OBJECT_SELECT_LINKED_LIBRARY
@ OBJECT_SELECT_LINKED_LIBRARY_OBDATA
@ OBJECT_SELECT_LINKED_IPO
@ OBJECT_SELECT_LINKED_DUPGROUP
@ OBJECT_SELECT_LINKED_PARTICLE
@ OBJECT_SELECT_LINKED_OBDATA
@ OBJECT_SELECT_LINKED_MATERIAL
static bool select_grouped_type(bContext *C, Object *ob)
static bool object_select_all_by_library(bContext *C, Library *lib)
bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_hidden))
static bool select_grouped_keyingset(bContext *C, Object *UNUSED(ob), ReportList *reports)
static int object_select_by_type_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem prop_select_grouped_types[]
void OBJECT_OT_select_more(wmOperatorType *ot)
static int object_select_more_exec(bContext *C, wmOperator *UNUSED(op))
Base * ED_object_find_first_by_data_id(ViewLayer *view_layer, ID *id)
void ED_pose_bone_select_tag_update(Object *ob)
Definition: pose_select.c:80
bool ED_pose_deselect_all(Object *ob, int select_mode, const bool ignore_visibility)
Definition: pose_select.c:315
void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
Definition: pose_select.c:95
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
Definition: rna_access.c:5116
float RNA_float_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4957
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4863
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3493
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3687
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
Definition: rna_define.c:2848
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3783
const EnumPropertyItem rna_enum_object_type_items[]
Definition: rna_object.c:249
short flag
struct Object * object
struct Object * object
Definition: DNA_ID.h:368
int tag
Definition: DNA_ID.h:387
struct Library * lib
Definition: DNA_ID.h:372
void * next
Definition: DNA_ID.h:369
char name[66]
Definition: DNA_ID.h:378
struct KS_Path * next
ListBase paths
short type
void * first
Definition: DNA_listBase.h:31
Definition: BKE_main.h:121
ListBase wm
Definition: BKE_main.h:197
ListBase collections
Definition: BKE_main.h:189
struct ModifierData * next
ListBase particlesystem
short transflag
struct Collection * instance_collection
struct bPose * pose
ListBase modifiers
float color[4]
struct Object * parent
void * data
ParticleSettings * part
struct ParticleSystem * next
void * data
Definition: RNA_types.h:38
int object_type_exclude_select
struct Base * basact
ListBase object_bases
struct EditBone * act_edbone
unsigned int layer
ListBase * edbo
struct Bone * bone
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:919
const char * name
Definition: WM_types.h:888
const char * idname
Definition: WM_types.h:890
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:943
struct StructRNA * srna
Definition: WM_types.h:969
const char * description
Definition: WM_types.h:893
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:903
PropertyRNA * prop
Definition: WM_types.h:981
struct ReportList * reports
struct PointerRNA * ptr
void WM_main_add_notifier(unsigned int type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition: wm_files.c:3479
#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_)
int WM_operator_properties_select_random_seed_increment_get(wmOperator *op)
void WM_operator_properties_select_random(wmOperatorType *ot)
void WM_operator_properties_select_all(wmOperatorType *ot)
int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))