Blender  V2.93
object_select.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19 
24 #include <ctype.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 
29 #include "DNA_anim_types.h"
30 #include "DNA_armature_types.h"
31 #include "DNA_collection_types.h"
32 #include "DNA_gpencil_types.h"
33 #include "DNA_light_types.h"
34 #include "DNA_material_types.h"
35 #include "DNA_modifier_types.h"
36 #include "DNA_scene_types.h"
37 #include "DNA_workspace_types.h"
38 
39 #include "BLI_listbase.h"
40 #include "BLI_math.h"
41 #include "BLI_math_bits.h"
42 #include "BLI_rand.h"
43 #include "BLI_string_utils.h"
44 #include "BLI_utildefines.h"
45 
46 #include "BLT_translation.h"
47 
48 #include "BKE_action.h"
49 #include "BKE_armature.h"
50 #include "BKE_collection.h"
51 #include "BKE_context.h"
52 #include "BKE_deform.h"
53 #include "BKE_layer.h"
54 #include "BKE_lib_id.h"
55 #include "BKE_main.h"
56 #include "BKE_material.h"
57 #include "BKE_object.h"
58 #include "BKE_paint.h"
59 #include "BKE_particle.h"
60 #include "BKE_report.h"
61 #include "BKE_scene.h"
62 #include "BKE_workspace.h"
63 
64 #include "DEG_depsgraph.h"
65 
66 #include "WM_api.h"
67 #include "WM_message.h"
68 #include "WM_types.h"
69 
70 #include "ED_armature.h"
71 #include "ED_keyframing.h"
72 #include "ED_object.h"
73 #include "ED_outliner.h"
74 #include "ED_screen.h"
75 #include "ED_select_utils.h"
76 
77 #include "UI_interface.h"
78 #include "UI_resources.h"
79 
80 #include "RNA_access.h"
81 #include "RNA_define.h"
82 #include "RNA_enum_types.h"
83 
84 #include "object_intern.h"
85 
86 /* -------------------------------------------------------------------- */
99 {
100  if (mode == BA_INVERT) {
101  mode = (base->flag & BASE_SELECTED) != 0 ? BA_DESELECT : BA_SELECT;
102  }
103 
104  if (base) {
105  switch (mode) {
106  case BA_SELECT:
107  if ((base->flag & BASE_SELECTABLE) != 0) {
108  base->flag |= BASE_SELECTED;
109  }
110  break;
111  case BA_DESELECT:
112  base->flag &= ~BASE_SELECTED;
113  break;
114  case BA_INVERT:
115  /* Never happens. */
116  break;
117  }
119  }
120 }
121 
126 {
129  struct wmMsgBus *mbus = ((wmWindowManager *)bmain->wm.first)->message_bus;
130  if (mbus != NULL) {
131  WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active);
132  }
133 }
134 
139 {
141  ViewLayer *view_layer = CTX_data_view_layer(C);
142  view_layer->basact = base;
144 }
145 
147 {
148  ViewLayer *view_layer = CTX_data_view_layer(C);
149 
150  /* Currently we only need to be concerned with edit-mode. */
151  Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
152  if (obedit) {
153  Object *ob = base->object;
154  if (((ob->mode & OB_MODE_EDIT) == 0) || (obedit->type != ob->type)) {
155  Main *bmain = CTX_data_main(C);
158  }
159  }
160  ED_object_base_activate(C, base);
161 }
162 
164  View3D *v3d,
165  int action,
166  bool *r_any_visible)
167 {
168  if (action == SEL_TOGGLE) {
169  action = SEL_SELECT;
170  FOREACH_VISIBLE_BASE_BEGIN (view_layer, v3d, base) {
171  if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) {
172  continue;
173  }
174  if ((base->flag & BASE_SELECTED) != 0) {
175  action = SEL_DESELECT;
176  break;
177  }
178  }
180  }
181 
182  bool any_visible = false;
183  bool changed = false;
184  FOREACH_VISIBLE_BASE_BEGIN (view_layer, v3d, base) {
185  if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) {
186  continue;
187  }
188  switch (action) {
189  case SEL_SELECT:
190  if ((base->flag & BASE_SELECTED) == 0) {
192  changed = true;
193  }
194  break;
195  case SEL_DESELECT:
196  if ((base->flag & BASE_SELECTED) != 0) {
198  changed = true;
199  }
200  break;
201  case SEL_INVERT:
202  if ((base->flag & BASE_SELECTED) != 0) {
204  changed = true;
205  }
206  else {
208  changed = true;
209  }
210  break;
211  }
212  any_visible = true;
213  }
215  if (r_any_visible) {
216  *r_any_visible = any_visible;
217  }
218  return changed;
219 }
220 
221 bool ED_object_base_deselect_all(ViewLayer *view_layer, View3D *v3d, int action)
222 {
223  return ED_object_base_deselect_all_ex(view_layer, v3d, action, NULL);
224 }
225 
228 /* -------------------------------------------------------------------- */
233 {
234  if (base->flag & BASE_VISIBLE_DEPSGRAPH) {
235  if (base->flag & BASE_SELECTABLE) {
236  return 3;
237  }
238  return 2;
239  }
240  return 1;
241 }
242 
248 {
250 
251  /* Try active object. */
252  Base *basact = view_layer->basact;
253 
254  if (basact && basact->object && basact->object->data == id) {
255  return basact;
256  }
257 
258  /* Try all objects. */
259  Base *base_best = NULL;
260  int priority_best = 0;
261 
262  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
263  if (base->object && base->object->data == id) {
264  if (base->flag & BASE_SELECTED) {
265  return base;
266  }
267 
268  int priority_test = get_base_select_priority(base);
269 
270  if (priority_test > priority_best) {
271  priority_best = priority_test;
272  base_best = base;
273  }
274  }
275  }
276 
277  return base_best;
278 }
279 
286 bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_hidden))
287 {
288  ViewLayer *view_layer = CTX_data_view_layer(C);
289  View3D *v3d = CTX_wm_view3d(C);
290  Base *base = BKE_view_layer_base_find(view_layer, ob);
291 
292  if (base == NULL) {
293  return false;
294  }
295 
296  /* TODO, use 'reveal_hidden', as is done with bones. */
297 
298  if (view_layer->basact != base || !(base->flag & BASE_SELECTED)) {
299  /* Select if not selected. */
300  if (!(base->flag & BASE_SELECTED)) {
301  ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
302 
303  if (BASE_VISIBLE(v3d, base)) {
305  }
306 
308  }
309 
310  /* Make active if not active. */
311  ED_object_base_activate(C, base);
312  }
313 
314  return true;
315 }
316 
325  Object *ob,
326  const char *bone_name,
327  const bool reveal_hidden)
328 {
329  /* Verify it's a valid armature object. */
330  if (ob == NULL || ob->type != OB_ARMATURE) {
331  return false;
332  }
333 
334  bArmature *arm = ob->data;
335 
336  /* Activate the armature object. */
337  if (!ED_object_jump_to_object(C, ob, reveal_hidden)) {
338  return false;
339  }
340 
341  /* Switch to pose mode from object mode. */
342  if (!ELEM(ob->mode, OB_MODE_EDIT, OB_MODE_POSE)) {
344  }
345 
346  if (ob->mode == OB_MODE_EDIT && arm->edbo != NULL) {
347  /* In Edit mode select and activate the target Edit-Bone. */
348  EditBone *ebone = ED_armature_ebone_find_name(arm->edbo, bone_name);
349  if (ebone != NULL) {
350  if (reveal_hidden) {
351  /* Unhide the bone. */
352  ebone->flag &= ~BONE_HIDDEN_A;
353 
354  if ((arm->layer & ebone->layer) == 0) {
355  arm->layer |= 1U << bitscan_forward_uint(ebone->layer);
356  }
357  }
358 
359  /* Select it. */
361 
362  if (EBONE_SELECTABLE(arm, ebone)) {
363  ED_armature_ebone_select_set(ebone, true);
365  }
366 
367  arm->act_edbone = ebone;
368 
370  return true;
371  }
372  }
373  else if (ob->mode == OB_MODE_POSE && ob->pose != NULL) {
374  /* In Pose mode select and activate the target Bone/Pose-Channel. */
375  bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
376  if (pchan != NULL) {
377  if (reveal_hidden) {
378  /* Unhide the bone. */
379  pchan->bone->flag &= ~BONE_HIDDEN_P;
380 
381  if ((arm->layer & pchan->bone->layer) == 0) {
382  arm->layer |= 1U << bitscan_forward_uint(pchan->bone->layer);
383  }
384  }
385 
386  /* Select it. */
388  ED_pose_bone_select(ob, pchan, true);
389 
390  arm->act_bone = pchan->bone;
391 
393  return true;
394  }
395  }
396 
397  return false;
398 }
399 
402 /* -------------------------------------------------------------------- */
407 {
408  /* we don't check for linked scenes here, selection is
409  * still allowed then for inspection of scene */
410  Object *obact = CTX_data_active_object(C);
411 
412  if (CTX_data_edit_object(C)) {
413  return 0;
414  }
415  if (obact && obact->mode) {
416  return 0;
417  }
418 
419  return 1;
420 }
421 
424 /* -------------------------------------------------------------------- */
429 {
430  ViewLayer *view_layer = CTX_data_view_layer(C);
431  View3D *v3d = CTX_wm_view3d(C);
432  short obtype, extend;
433 
434  obtype = RNA_enum_get(op->ptr, "type");
435  extend = RNA_boolean_get(op->ptr, "extend");
436 
437  if (extend == 0) {
438  ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
439  }
440 
441  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
442  if (base->object->type == obtype) {
444  }
445  }
446  CTX_DATA_END;
447 
451 
453 
454  return OPERATOR_FINISHED;
455 }
456 
458 {
459  /* identifiers */
460  ot->name = "Select by Type";
461  ot->description = "Select all visible objects that are of a type";
462  ot->idname = "OBJECT_OT_select_by_type";
463 
464  /* api callbacks */
468 
469  /* flags */
471 
472  /* properties */
474  "extend",
475  false,
476  "Extend",
477  "Extend selection instead of deselecting everything first");
478  ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_object_type_items, 1, "Type", "");
480 }
481 
484 /* -------------------------------------------------------------------- */
488 enum {
496 };
497 
499  /* XXX deprecated animation system stuff. */
500  // {OBJECT_SELECT_LINKED_IPO, "IPO", 0, "Object IPO", ""},
501  {OBJECT_SELECT_LINKED_OBDATA, "OBDATA", 0, "Object Data", ""},
502  {OBJECT_SELECT_LINKED_MATERIAL, "MATERIAL", 0, "Material", ""},
503  {OBJECT_SELECT_LINKED_DUPGROUP, "DUPGROUP", 0, "Instanced Collection", ""},
504  {OBJECT_SELECT_LINKED_PARTICLE, "PARTICLE", 0, "Particle System", ""},
505  {OBJECT_SELECT_LINKED_LIBRARY, "LIBRARY", 0, "Library", ""},
506  {OBJECT_SELECT_LINKED_LIBRARY_OBDATA, "LIBRARY_OBDATA", 0, "Library (Object Data)", ""},
507  {0, NULL, 0, NULL, NULL},
508 };
509 
510 static bool object_select_all_by_obdata(bContext *C, void *obdata)
511 {
512  bool changed = false;
513 
514  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
515  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
516  if (base->object->data == obdata) {
518  changed = true;
519  }
520  }
521  }
522  CTX_DATA_END;
523 
524  return changed;
525 }
526 
528 {
529  bool changed = false;
530 
531  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
532  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
533  Object *ob = base->object;
534  Material *mat1;
535  int a;
536 
537  for (a = 1; a <= ob->totcol; a++) {
538  mat1 = BKE_object_material_get(ob, a);
539 
540  if (mat1 == mat) {
542  changed = true;
543  }
544  }
545  }
546  }
547  CTX_DATA_END;
548 
549  return changed;
550 }
551 
553 {
554  bool changed = false;
555  Collection *instance_collection = (ob->transflag & OB_DUPLICOLLECTION) ?
556  ob->instance_collection :
557  NULL;
558 
559  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
560  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
561  Collection *instance_collection_other = (base->object->transflag & OB_DUPLICOLLECTION) ?
562  base->object->instance_collection :
563  NULL;
564  if (instance_collection == instance_collection_other) {
566  changed = true;
567  }
568  }
569  }
570  CTX_DATA_END;
571 
572  return changed;
573 }
574 
576 {
577  ParticleSystem *psys_act = psys_get_current(ob);
578  bool changed = false;
579 
580  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
581  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
582  /* loop through other particles*/
583  ParticleSystem *psys;
584 
585  for (psys = base->object->particlesystem.first; psys; psys = psys->next) {
586  if (psys->part == psys_act->part) {
588  changed = true;
589  break;
590  }
591 
592  if (base->flag & BASE_SELECTED) {
593  break;
594  }
595  }
596  }
597  }
598  CTX_DATA_END;
599 
600  return changed;
601 }
602 
604 {
605  bool changed = false;
606 
607  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
608  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
609  if (lib == base->object->id.lib) {
611  changed = true;
612  }
613  }
614  }
615  CTX_DATA_END;
616 
617  return changed;
618 }
619 
621 {
622  bool changed = false;
623 
624  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
625  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
626  if (base->object->data && lib == ((ID *)base->object->data)->lib) {
628  changed = true;
629  }
630  }
631  }
632  CTX_DATA_END;
633 
634  return changed;
635 }
636 
638 {
639  int idtype = GS(id->name);
640  bool changed = false;
641 
642  if (OB_DATA_SUPPORT_ID(idtype)) {
643  changed = object_select_all_by_obdata(C, id);
644  }
645  else if (idtype == ID_MA) {
646  changed = object_select_all_by_material(C, (Material *)id);
647  }
648  else if (idtype == ID_LI) {
649  changed = object_select_all_by_library(C, (Library *)id);
650  }
651 
652  if (changed) {
656  }
657 }
658 
660 {
662  ViewLayer *view_layer = CTX_data_view_layer(C);
663  View3D *v3d = CTX_wm_view3d(C);
664  Object *ob;
665  int nr = RNA_enum_get(op->ptr, "type");
666  bool changed = false, extend;
667 
668  extend = RNA_boolean_get(op->ptr, "extend");
669 
670  if (extend == 0) {
671  ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
672  }
673 
674  ob = OBACT(view_layer);
675  if (ob == NULL) {
676  BKE_report(op->reports, RPT_ERROR, "No active object");
677  return OPERATOR_CANCELLED;
678  }
679 
680  if (nr == OBJECT_SELECT_LINKED_IPO) {
681  /* XXX old animation system */
682  // if (ob->ipo == 0) return OPERATOR_CANCELLED;
683  // object_select_all_by_ipo(C, ob->ipo)
684  return OPERATOR_CANCELLED;
685  }
686  if (nr == OBJECT_SELECT_LINKED_OBDATA) {
687  if (ob->data == NULL) {
688  return OPERATOR_CANCELLED;
689  }
690 
691  changed = object_select_all_by_obdata(C, ob->data);
692  }
693  else if (nr == OBJECT_SELECT_LINKED_MATERIAL) {
694  Material *mat = NULL;
695 
696  mat = BKE_object_material_get(ob, ob->actcol);
697  if (mat == NULL) {
698  return OPERATOR_CANCELLED;
699  }
700 
701  changed = object_select_all_by_material(C, mat);
702  }
703  else if (nr == OBJECT_SELECT_LINKED_DUPGROUP) {
704  if (ob->instance_collection == NULL) {
705  return OPERATOR_CANCELLED;
706  }
707 
709  }
710  else if (nr == OBJECT_SELECT_LINKED_PARTICLE) {
712  return OPERATOR_CANCELLED;
713  }
714 
715  changed = object_select_all_by_particle(C, ob);
716  }
717  else if (nr == OBJECT_SELECT_LINKED_LIBRARY) {
718  /* do nothing */
719  changed = object_select_all_by_library(C, ob->id.lib);
720  }
721  else if (nr == OBJECT_SELECT_LINKED_LIBRARY_OBDATA) {
722  if (ob->data == NULL) {
723  return OPERATOR_CANCELLED;
724  }
725 
726  changed = object_select_all_by_library_obdata(C, ((ID *)ob->data)->lib);
727  }
728  else {
729  return OPERATOR_CANCELLED;
730  }
731 
732  if (changed) {
736  return OPERATOR_FINISHED;
737  }
738 
739  return OPERATOR_CANCELLED;
740 }
741 
743 {
744  /* identifiers */
745  ot->name = "Select Linked";
746  ot->description = "Select all visible objects that are linked";
747  ot->idname = "OBJECT_OT_select_linked";
748 
749  /* api callbacks */
753 
754  /* flags */
756 
757  /* properties */
759  "extend",
760  false,
761  "Extend",
762  "Extend selection instead of deselecting everything first");
763  ot->prop = RNA_def_enum(ot->srna, "type", prop_select_linked_types, 0, "Type", "");
764 }
765 
768 /* -------------------------------------------------------------------- */
772 enum {
784 };
785 
787  {OBJECT_GRPSEL_CHILDREN_RECURSIVE, "CHILDREN_RECURSIVE", 0, "Children", ""},
788  {OBJECT_GRPSEL_CHILDREN, "CHILDREN", 0, "Immediate Children", ""},
789  {OBJECT_GRPSEL_PARENT, "PARENT", 0, "Parent", ""},
790  {OBJECT_GRPSEL_SIBLINGS, "SIBLINGS", 0, "Siblings", "Shared parent"},
791  {OBJECT_GRPSEL_TYPE, "TYPE", 0, "Type", "Shared object type"},
792  {OBJECT_GRPSEL_COLLECTION, "COLLECTION", 0, "Collection", "Shared collection"},
793  {OBJECT_GRPSEL_HOOK, "HOOK", 0, "Hook", ""},
794  {OBJECT_GRPSEL_PASS, "PASS", 0, "Pass", "Render pass index"},
795  {OBJECT_GRPSEL_COLOR, "COLOR", 0, "Color", "Object color"},
797  "KEYINGSET",
798  0,
799  "Keying Set",
800  "Objects included in active Keying Set"},
801  {OBJECT_GRPSEL_LIGHT_TYPE, "LIGHT_TYPE", 0, "Light Type", "Matching light types"},
802  {0, NULL, 0, NULL, NULL},
803 };
804 
805 static bool select_grouped_children(bContext *C, Object *ob, const bool recursive)
806 {
807  bool changed = false;
808 
809  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
810  if (ob == base->object->parent) {
811  if ((base->flag & BASE_SELECTED) == 0) {
813  changed = true;
814  }
815 
816  if (recursive) {
817  changed |= select_grouped_children(C, base->object, 1);
818  }
819  }
820  }
821  CTX_DATA_END;
822  return changed;
823 }
824 
825 static bool select_grouped_parent(bContext *C) /* Makes parent active and de-selected OBACT */
826 {
827  ViewLayer *view_layer = CTX_data_view_layer(C);
828  View3D *v3d = CTX_wm_view3d(C);
829  Base *baspar, *basact = CTX_data_active_base(C);
830  bool changed = false;
831 
832  if (!basact || !(basact->object->parent)) {
833  return 0; /* we know OBACT is valid */
834  }
835 
836  baspar = BKE_view_layer_base_find(view_layer, basact->object->parent);
837 
838  /* can be NULL if parent in other scene */
839  if (baspar && BASE_SELECTABLE(v3d, baspar)) {
841  ED_object_base_activate(C, baspar);
842  changed = true;
843  }
844  return changed;
845 }
846 
847 #define COLLECTION_MENU_MAX 24
848 /* Select objects in the same group as the active */
850 {
851  Main *bmain = CTX_data_main(C);
852  bool changed = false;
853  Collection *collection, *ob_collections[COLLECTION_MENU_MAX];
854  int collection_count = 0, i;
855  uiPopupMenu *pup;
856  uiLayout *layout;
857 
858  for (collection = bmain->collections.first;
859  collection && (collection_count < COLLECTION_MENU_MAX);
860  collection = collection->id.next) {
861  if (BKE_collection_has_object(collection, ob)) {
862  ob_collections[collection_count] = collection;
864  }
865  }
866 
867  if (!collection_count) {
868  return 0;
869  }
870  if (collection_count == 1) {
871  collection = ob_collections[0];
872  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
873  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
874  if (BKE_collection_has_object(collection, base->object)) {
876  changed = true;
877  }
878  }
879  }
880  CTX_DATA_END;
881  return changed;
882  }
883 
884  /* build the menu. */
885  pup = UI_popup_menu_begin(C, IFACE_("Select Collection"), ICON_NONE);
886  layout = UI_popup_menu_layout(pup);
887 
888  for (i = 0; i < collection_count; i++) {
889  collection = ob_collections[i];
890  uiItemStringO(layout,
891  collection->id.name + 2,
892  0,
893  "OBJECT_OT_select_same_collection",
894  "collection",
895  collection->id.name + 2);
896  }
897 
898  UI_popup_menu_end(C, pup);
899  return changed; /* The operator already handle this! */
900 }
901 
903 {
904  ViewLayer *view_layer = CTX_data_view_layer(C);
905  View3D *v3d = CTX_wm_view3d(C);
906 
907  bool changed = false;
908  Base *base;
909  ModifierData *md;
910  HookModifierData *hmd;
911 
912  for (md = ob->modifiers.first; md; md = md->next) {
913  if (md->type == eModifierType_Hook) {
914  hmd = (HookModifierData *)md;
915  if (hmd->object) {
916  base = BKE_view_layer_base_find(view_layer, hmd->object);
917  if (base && ((base->flag & BASE_SELECTED) == 0) && (BASE_SELECTABLE(v3d, base))) {
919  changed = true;
920  }
921  }
922  }
923  }
924  return changed;
925 }
926 
927 /* Select objects with the same parent as the active (siblings),
928  * parent can be NULL also */
930 {
931  bool changed = false;
932 
933  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
934  if ((base->object->parent == ob->parent) && ((base->flag & BASE_SELECTED) == 0)) {
936  changed = true;
937  }
938  }
939  CTX_DATA_END;
940  return changed;
941 }
943 {
944  Light *la = ob->data;
945 
946  bool changed = false;
947 
948  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
949  if (base->object->type == OB_LAMP) {
950  Light *la_test = base->object->data;
951  if ((la->type == la_test->type) && ((base->flag & BASE_SELECTED) == 0)) {
953  changed = true;
954  }
955  }
956  }
957  CTX_DATA_END;
958  return changed;
959 }
961 {
962  bool changed = false;
963 
964  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
965  if ((base->object->type == ob->type) && ((base->flag & BASE_SELECTED) == 0)) {
967  changed = true;
968  }
969  }
970  CTX_DATA_END;
971  return changed;
972 }
973 
975 {
976  bool changed = false;
977 
978  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
979  if ((base->object->index == ob->index) && ((base->flag & BASE_SELECTED) == 0)) {
981  changed = true;
982  }
983  }
984  CTX_DATA_END;
985  return changed;
986 }
987 
989 {
990  bool changed = false;
991 
992  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
993  if (((base->flag & BASE_SELECTED) == 0) &&
994  (compare_v3v3(base->object->color, ob->color, 0.005f))) {
996  changed = true;
997  }
998  }
999  CTX_DATA_END;
1000  return changed;
1001 }
1002 
1004 {
1006  bool changed = false;
1007 
1008  /* firstly, validate KeyingSet */
1009  if (ks == NULL) {
1010  BKE_report(reports, RPT_ERROR, "No active Keying Set to use");
1011  return false;
1012  }
1013  if (ANIM_validate_keyingset(C, NULL, ks) != 0) {
1014  if (ks->paths.first == NULL) {
1015  if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) {
1016  BKE_report(reports,
1017  RPT_ERROR,
1018  "Use another Keying Set, as the active one depends on the currently "
1019  "selected objects or cannot find any targets due to unsuitable context");
1020  }
1021  else {
1022  BKE_report(reports, RPT_ERROR, "Keying Set does not contain any paths");
1023  }
1024  }
1025  return false;
1026  }
1027 
1028  /* select each object that Keying Set refers to */
1029  /* TODO: perhaps to be more in line with the rest of these, we should only take objects
1030  * if the passed in object is included in this too */
1031  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
1032  /* only check for this object if it isn't selected already, to limit time wasted */
1033  if ((base->flag & BASE_SELECTED) == 0) {
1034  KS_Path *ksp;
1035 
1036  /* this is the slow way... we could end up with > 500 items here,
1037  * with none matching, but end up doing this on 1000 objects...
1038  */
1039  for (ksp = ks->paths.first; ksp; ksp = ksp->next) {
1040  /* if id matches, select then stop looping (match found) */
1041  if (ksp->id == (ID *)base->object) {
1043  changed = true;
1044  break;
1045  }
1046  }
1047  }
1048  }
1049  CTX_DATA_END;
1050 
1051  return changed;
1052 }
1053 
1055 {
1057  ViewLayer *view_layer = CTX_data_view_layer(C);
1058  View3D *v3d = CTX_wm_view3d(C);
1059  Object *ob;
1060  const int type = RNA_enum_get(op->ptr, "type");
1061  bool changed = false, extend;
1062 
1063  extend = RNA_boolean_get(op->ptr, "extend");
1064 
1065  if (extend == 0) {
1066  changed = ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT);
1067  }
1068 
1069  ob = OBACT(view_layer);
1070  if (ob == NULL) {
1071  BKE_report(op->reports, RPT_ERROR, "No active object");
1072  return OPERATOR_CANCELLED;
1073  }
1074 
1075  switch (type) {
1077  changed |= select_grouped_children(C, ob, true);
1078  break;
1080  changed |= select_grouped_children(C, ob, false);
1081  break;
1082  case OBJECT_GRPSEL_PARENT:
1083  changed |= select_grouped_parent(C);
1084  break;
1086  changed |= select_grouped_siblings(C, ob);
1087  break;
1088  case OBJECT_GRPSEL_TYPE:
1089  changed |= select_grouped_type(C, ob);
1090  break;
1092  changed |= select_grouped_collection(C, ob);
1093  break;
1094  case OBJECT_GRPSEL_HOOK:
1095  changed |= select_grouped_object_hooks(C, ob);
1096  break;
1097  case OBJECT_GRPSEL_PASS:
1098  changed |= select_grouped_index_object(C, ob);
1099  break;
1100  case OBJECT_GRPSEL_COLOR:
1101  changed |= select_grouped_color(C, ob);
1102  break;
1104  changed |= select_grouped_keyingset(C, ob, op->reports);
1105  break;
1107  if (ob->type != OB_LAMP) {
1108  BKE_report(op->reports, RPT_ERROR, "Active object must be a light");
1109  break;
1110  }
1111  changed |= select_grouped_lighttype(C, ob);
1112  break;
1113  default:
1114  break;
1115  }
1116 
1117  if (changed) {
1121  return OPERATOR_FINISHED;
1122  }
1123 
1124  return OPERATOR_CANCELLED;
1125 }
1126 
1128 {
1129  /* identifiers */
1130  ot->name = "Select Grouped";
1131  ot->description = "Select all visible objects grouped by various properties";
1132  ot->idname = "OBJECT_OT_select_grouped";
1133 
1134  /* api callbacks */
1138 
1139  /* flags */
1141 
1142  /* properties */
1144  "extend",
1145  false,
1146  "Extend",
1147  "Extend selection instead of deselecting everything first");
1148  ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
1149 }
1150 
1153 /* -------------------------------------------------------------------- */
1158 {
1159  ViewLayer *view_layer = CTX_data_view_layer(C);
1160  View3D *v3d = CTX_wm_view3d(C);
1161  int action = RNA_enum_get(op->ptr, "action");
1162  bool any_visible = false;
1163 
1164  bool changed = ED_object_base_deselect_all_ex(view_layer, v3d, action, &any_visible);
1165 
1166  if (changed) {
1170 
1172 
1173  return OPERATOR_FINISHED;
1174  }
1175  if (any_visible == false) {
1176  /* TODO(campbell): Looks like we could remove this,
1177  * if not comment should say why its needed. */
1178  return OPERATOR_PASS_THROUGH;
1179  }
1180  return OPERATOR_CANCELLED;
1181 }
1182 
1184 {
1185 
1186  /* identifiers */
1187  ot->name = "(De)select All";
1188  ot->description = "Change selection of all visible objects in scene";
1189  ot->idname = "OBJECT_OT_select_all";
1190 
1191  /* api callbacks */
1194 
1195  /* flags */
1197 
1199 }
1200 
1203 /* -------------------------------------------------------------------- */
1208 {
1209  Main *bmain = CTX_data_main(C);
1210  Collection *collection;
1211  char collection_name[MAX_ID_NAME];
1212 
1213  /* passthrough if no objects are visible */
1214  if (CTX_DATA_COUNT(C, visible_bases) == 0) {
1215  return OPERATOR_PASS_THROUGH;
1216  }
1217 
1218  RNA_string_get(op->ptr, "collection", collection_name);
1219 
1220  collection = (Collection *)BKE_libblock_find_name(bmain, ID_GR, collection_name);
1221 
1222  if (!collection) {
1223  return OPERATOR_PASS_THROUGH;
1224  }
1225 
1226  CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
1227  if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
1228  if (BKE_collection_has_object(collection, base->object)) {
1230  }
1231  }
1232  }
1233  CTX_DATA_END;
1234 
1238 
1240 
1241  return OPERATOR_FINISHED;
1242 }
1243 
1245 {
1246 
1247  /* identifiers */
1248  ot->name = "Select Same Collection";
1249  ot->description = "Select object in the same collection";
1250  ot->idname = "OBJECT_OT_select_same_collection";
1251 
1252  /* api callbacks */
1255 
1256  /* flags */
1258 
1260  ot->srna, "collection", NULL, MAX_ID_NAME, "Collection", "Name of the collection to select");
1261 }
1262 
1265 /* -------------------------------------------------------------------- */
1270 {
1271  Main *bmain = CTX_data_main(C);
1273  ViewLayer *view_layer = CTX_data_view_layer(C);
1274  bool extend;
1275 
1276  extend = RNA_boolean_get(op->ptr, "extend");
1277 
1278  CTX_DATA_BEGIN (C, Base *, primbase, selected_bases) {
1279  char name_flip[MAXBONENAME];
1280 
1281  BLI_string_flip_side_name(name_flip, primbase->object->id.name + 2, true, sizeof(name_flip));
1282 
1283  if (!STREQ(name_flip, primbase->object->id.name + 2)) {
1284  Object *ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, name_flip);
1285  if (ob) {
1286  Base *secbase = BKE_view_layer_base_find(view_layer, ob);
1287 
1288  if (secbase) {
1289  ED_object_base_select(secbase, BA_SELECT);
1290  }
1291  }
1292  }
1293 
1294  if (extend == false) {
1296  }
1297  }
1298  CTX_DATA_END;
1299 
1300  /* undo? */
1303 
1305 
1306  return OPERATOR_FINISHED;
1307 }
1308 
1310 {
1311 
1312  /* identifiers */
1313  ot->name = "Select Mirror";
1314  ot->description =
1315  "Select the mirror objects of the selected object e.g. \"L.sword\" and \"R.sword\"";
1316  ot->idname = "OBJECT_OT_select_mirror";
1317 
1318  /* api callbacks */
1321 
1322  /* flags */
1324 
1326  ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first");
1327 }
1328 
1331 /* -------------------------------------------------------------------- */
1335 static bool object_select_more_less(bContext *C, const bool select)
1336 {
1337  ViewLayer *view_layer = CTX_data_view_layer(C);
1338 
1339  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
1340  Object *ob = base->object;
1341  ob->flag &= ~OB_DONE;
1342  ob->id.tag &= ~LIB_TAG_DOIT;
1343  /* parent may be in another scene */
1344  if (ob->parent) {
1345  ob->parent->flag &= ~OB_DONE;
1346  ob->parent->id.tag &= ~LIB_TAG_DOIT;
1347  }
1348  }
1349 
1350  ListBase ctx_base_list;
1351  CollectionPointerLink *ctx_base;
1352  CTX_data_selectable_bases(C, &ctx_base_list);
1353 
1354  CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
1355  ob->flag |= OB_DONE;
1356  }
1357  CTX_DATA_END;
1358 
1359  for (ctx_base = ctx_base_list.first; ctx_base; ctx_base = ctx_base->next) {
1360  Object *ob = ((Base *)ctx_base->ptr.data)->object;
1361  if (ob->parent) {
1362  if ((ob->flag & OB_DONE) != (ob->parent->flag & OB_DONE)) {
1363  ob->id.tag |= LIB_TAG_DOIT;
1364  ob->parent->id.tag |= LIB_TAG_DOIT;
1365  }
1366  }
1367  }
1368 
1369  bool changed = false;
1370  const short select_mode = select ? BA_SELECT : BA_DESELECT;
1371  const short select_flag = select ? BASE_SELECTED : 0;
1372 
1373  for (ctx_base = ctx_base_list.first; ctx_base; ctx_base = ctx_base->next) {
1374  Base *base = ctx_base->ptr.data;
1375  Object *ob = base->object;
1376  if ((ob->id.tag & LIB_TAG_DOIT) && ((base->flag & BASE_SELECTED) != select_flag)) {
1377  ED_object_base_select(base, select_mode);
1378  changed = true;
1379  }
1380  }
1381 
1382  BLI_freelistN(&ctx_base_list);
1383 
1384  return changed;
1385 }
1386 
1388 {
1389  bool changed = object_select_more_less(C, true);
1390 
1391  if (changed) {
1395 
1397 
1398  return OPERATOR_FINISHED;
1399  }
1400  return OPERATOR_CANCELLED;
1401 }
1402 
1404 {
1405  /* identifiers */
1406  ot->name = "Select More";
1407  ot->idname = "OBJECT_OT_select_more";
1408  ot->description = "Select connected parent/child objects";
1409 
1410  /* api callbacks */
1413 
1414  /* flags */
1416 }
1417 
1419 {
1420  bool changed = object_select_more_less(C, false);
1421 
1422  if (changed) {
1426 
1428 
1429  return OPERATOR_FINISHED;
1430  }
1431  return OPERATOR_CANCELLED;
1432 }
1433 
1435 {
1436  /* identifiers */
1437  ot->name = "Select Less";
1438  ot->idname = "OBJECT_OT_select_less";
1439  ot->description = "Deselect objects at the boundaries of parent/child relationships";
1440 
1441  /* api callbacks */
1444 
1445  /* flags */
1447 }
1448 
1451 /* -------------------------------------------------------------------- */
1456 {
1457  const float randfac = RNA_float_get(op->ptr, "ratio");
1459  const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
1460 
1461  RNG *rng = BLI_rng_new_srandom(seed);
1462 
1463  CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
1464  if (BLI_rng_get_float(rng) < randfac) {
1466  }
1467  }
1468  CTX_DATA_END;
1469 
1470  BLI_rng_free(rng);
1471 
1475 
1477 
1478  return OPERATOR_FINISHED;
1479 }
1480 
1482 {
1483  /* identifiers */
1484  ot->name = "Select Random";
1485  ot->description = "Set select on random visible objects";
1486  ot->idname = "OBJECT_OT_select_random";
1487 
1488  /* api callbacks */
1489  /*ot->invoke = object_select_random_invoke XXX - need a number popup ;*/
1492 
1493  /* flags */
1495 
1496  /* properties */
1498 }
1499 
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:1034
struct Object * CTX_data_edit_object(const bContext *C)
Definition: context.c:1296
struct Base * CTX_data_active_base(const bContext *C)
Definition: context.c:1284
#define CTX_DATA_BEGIN(C, Type, instance, member)
Definition: BKE_context.h:252
struct ViewLayer * CTX_data_view_layer(const bContext *C)
Definition: context.c:1044
struct Object * CTX_data_active_object(const bContext *C)
Definition: context.c:1279
struct View3D * CTX_wm_view3d(const bContext *C)
Definition: context.c:760
#define CTX_DATA_COUNT(C, member)
Definition: BKE_context.h:272
int CTX_data_selectable_bases(const bContext *C, ListBase *list)
Definition: context.c:1274
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1018
#define CTX_DATA_END
Definition: BKE_context.h:260
support for deformation groups and hooks.
#define FOREACH_VISIBLE_BASE_END
Definition: BKE_layer.h:319
#define FOREACH_VISIBLE_BASE_BEGIN(_view_layer, _v3d, _instance)
Definition: BKE_layer.h:306
struct Base * BKE_view_layer_base_find(struct ViewLayer *view_layer, struct Object *ob)
Definition: layer.c:394
struct ID * BKE_libblock_find_name(struct Main *bmain, const short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: lib_id.c:1333
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
Definition: material.c:697
General operations, lookup, etc. for blender objects.
struct ParticleSystem * psys_get_current(struct Object *ob)
Definition: particle.c:645
void BKE_report(ReportList *reports, ReportType type, const char *message)
Definition: report.c:104
void BKE_scene_object_base_flag_sync_from_base(struct Base *base)
Definition: scene.c:2966
#define BLI_assert(a)
Definition: BLI_assert.h:58
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:124
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:547
MINLINE unsigned int bitscan_forward_uint(unsigned int a)
MINLINE bool compare_v3v3(const float a[3], const float b[3], const float limit) ATTR_WARN_UNUSED_RESULT
Random number functions.
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
Definition: rand.cc:76
struct RNG * BLI_rng_new_srandom(unsigned int seed)
Definition: rand.cc:64
float BLI_rng_get_float(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition: rand.cc:120
void BLI_string_flip_side_name(char *r_name, const char *from_name, const bool strip_number, const size_t name_len)
Definition: string_utils.c:159
#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:638
@ LIB_TAG_DOIT
Definition: DNA_ID.h:554
#define MAX_ID_NAME
Definition: DNA_ID.h:269
@ ID_LI
Definition: DNA_ID_enums.h:58
@ ID_MA
Definition: DNA_ID_enums.h:63
@ ID_GR
Definition: DNA_ID_enums.h:77
@ ID_OB
Definition: DNA_ID_enums.h:59
@ 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_DUPLICOLLECTION
@ OB_ARMATURE
@ OB_LAMP
#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:61
bool ED_object_editmode_exit_multi_ex(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, int flag)
Definition: object_edit.c:736
@ EM_FREEDATA
Definition: ED_object.h:204
bool ED_object_mode_set(struct bContext *C, eObjectMode mode)
Definition: object_modes.c:235
eObjectSelect_Mode
Definition: ED_object.h:145
@ BA_DESELECT
Definition: ED_object.h:146
@ BA_INVERT
Definition: ED_object.h:148
@ BA_SELECT
Definition: ED_object.h:147
void ED_outliner_select_sync_from_object_tag(struct bContext *C)
Definition: outliner_sync.c:56
bool ED_operator_objectmode(struct bContext *C)
Definition: screen_ops.c:201
@ 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
#define C
Definition: RandGen.cpp:39
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()
#define ND_OB_ACTIVE
Definition: WM_types.h:340
@ OPTYPE_UNDO
Definition: WM_types.h:155
@ OPTYPE_REGISTER
Definition: WM_types.h:153
#define ND_OB_SELECT
Definition: WM_types.h:342
#define NC_SCENE
Definition: WM_types.h:279
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)
static unsigned long seed
Definition: btSoftBody.h:39
Scene scene
DRWShaderLibrary * lib
#define GS(x)
Definition: iris.c:241
eModifyKey_Returns ANIM_validate_keyingset(bContext *C, ListBase *dsources, KeyingSet *ks)
Definition: keyingsets.c:936
KeyingSet * ANIM_scene_get_active_keyingset(const Scene *scene)
Definition: keyingsets.c:674
static int collection_count(ListBase *lb)
Definition: layer.c:679
static unsigned a[3]
Definition: RandGen.cpp:92
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)
@ 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
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)
@ 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
#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)
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:98
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)
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:96
bool ED_pose_deselect_all(Object *ob, int select_mode, const bool ignore_visibility)
Definition: pose_select.c:329
void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
Definition: pose_select.c:112
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
Definition: rna_access.c:6514
float RNA_float_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6355
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6261
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3481
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:3675
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
Definition: rna_define.c:2870
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:3771
const EnumPropertyItem rna_enum_object_type_items[]
Definition: rna_object.c:254
short flag
struct Object * object
struct Object * object
Definition: DNA_ID.h:273
int tag
Definition: DNA_ID.h:292
struct Library * lib
Definition: DNA_ID.h:277
void * next
Definition: DNA_ID.h:274
char name[66]
Definition: DNA_ID.h:283
struct KS_Path * next
ListBase paths
short type
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
ListBase wm
Definition: BKE_main.h:175
ListBase collections
Definition: BKE_main.h:167
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:52
Definition: rand.cc:48
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:752
const char * name
Definition: WM_types.h:721
const char * idname
Definition: WM_types.h:723
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:776
struct StructRNA * srna
Definition: WM_types.h:802
const char * description
Definition: WM_types.h:726
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:736
PropertyRNA * prop
Definition: WM_types.h:814
struct ReportList * reports
struct PointerRNA * ptr
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
Definition: util_avxb.h:167
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:3156
#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))
Definition: wm_operators.c:982