Blender V4.3
object_select.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cctype>
10#include <cstdio>
11#include <cstdlib>
12#include <cstring>
13
14#include "MEM_guardedalloc.h"
15
16#include "DNA_anim_types.h"
17#include "DNA_armature_types.h"
19#include "DNA_light_types.h"
20#include "DNA_modifier_types.h"
21#include "DNA_scene_types.h"
22
23#include "BLI_listbase.h"
24#include "BLI_math_vector.h"
25#include "BLI_rand.h"
26#include "BLI_string_utils.hh"
27#include "BLI_utildefines.h"
28
29#include "BLT_translation.hh"
30
31#include "BKE_action.hh"
32#include "BKE_armature.hh"
33#include "BKE_collection.hh"
34#include "BKE_context.hh"
35#include "BKE_layer.hh"
36#include "BKE_lib_id.hh"
37#include "BKE_main.hh"
38#include "BKE_material.h"
39#include "BKE_particle.h"
40#include "BKE_report.hh"
41#include "BKE_scene.hh"
42
43#include "DEG_depsgraph.hh"
44
45#include "WM_api.hh"
46#include "WM_message.hh"
47#include "WM_types.hh"
48
49#include "ED_armature.hh"
50#include "ED_keyframing.hh"
51#include "ED_object.hh"
52#include "ED_outliner.hh"
53#include "ED_screen.hh"
54#include "ED_select_utils.hh"
55
57#include "ANIM_keyingsets.hh"
58
59#include "UI_interface.hh"
60#include "UI_resources.hh"
61
62#include "RNA_access.hh"
63#include "RNA_define.hh"
64#include "RNA_enum_types.hh"
65
66#include "object_intern.hh"
67
68namespace blender::ed::object {
69
70/* -------------------------------------------------------------------- */
75{
76 if (mode == BA_INVERT) {
77 mode = (base->flag & BASE_SELECTED) != 0 ? BA_DESELECT : BA_SELECT;
78 }
79
80 if (base) {
81 switch (mode) {
82 case BA_SELECT:
83 if ((base->flag & BASE_SELECTABLE) != 0) {
84 base->flag |= BASE_SELECTED;
85 }
86 break;
87 case BA_DESELECT:
88 base->flag &= ~BASE_SELECTED;
89 break;
90 case BA_INVERT:
91 /* Never happens. */
92 break;
93 }
95 }
96}
97
98void base_active_refresh(Main *bmain, Scene *scene, ViewLayer *view_layer)
99{
102 wmMsgBus *mbus = ((wmWindowManager *)bmain->wm.first)->message_bus;
103 if (mbus != nullptr) {
104 WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active);
105 }
106}
107
109{
110 Scene *scene = CTX_data_scene(C);
111 ViewLayer *view_layer = CTX_data_view_layer(C);
112 view_layer->basact = base;
113 base_active_refresh(CTX_data_main(C), scene, view_layer);
114}
115
117{
118 Scene *scene = CTX_data_scene(C);
119 ViewLayer *view_layer = CTX_data_view_layer(C);
120
121 /* Currently we only need to be concerned with edit-mode. */
122 BKE_view_layer_synced_ensure(scene, view_layer);
123 Object *obedit = BKE_view_layer_edit_object_get(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);
128 editmode_exit_multi_ex(bmain, scene, view_layer, EM_FREEDATA);
129 }
130 }
131 base_activate(C, base);
132}
133
135 const Scene *scene, ViewLayer *view_layer, View3D *v3d, int action, bool *r_any_visible)
136{
137 if (action == SEL_TOGGLE) {
138 action = SEL_SELECT;
139 FOREACH_VISIBLE_BASE_BEGIN (scene, view_layer, v3d, base) {
140 if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) {
141 continue;
142 }
143 if ((base->flag & BASE_SELECTED) != 0) {
144 action = SEL_DESELECT;
145 break;
146 }
147 }
149 }
150
151 bool any_visible = false;
152 bool changed = false;
153 FOREACH_VISIBLE_BASE_BEGIN (scene, view_layer, v3d, base) {
154 if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) {
155 continue;
156 }
157 switch (action) {
158 case SEL_SELECT:
159 if ((base->flag & BASE_SELECTED) == 0) {
160 base_select(base, BA_SELECT);
161 changed = true;
162 }
163 break;
164 case SEL_DESELECT:
165 if ((base->flag & BASE_SELECTED) != 0) {
167 changed = true;
168 }
169 break;
170 case SEL_INVERT:
171 if ((base->flag & BASE_SELECTED) != 0) {
173 changed = true;
174 }
175 else {
176 base_select(base, BA_SELECT);
177 changed = true;
178 }
179 break;
180 }
181 any_visible = true;
182 }
184 if (r_any_visible) {
185 *r_any_visible = any_visible;
186 }
187 return changed;
188}
189
190bool base_deselect_all(const Scene *scene, ViewLayer *view_layer, View3D *v3d, int action)
191{
192 return base_deselect_all_ex(scene, view_layer, v3d, action, nullptr);
193}
194
197/* -------------------------------------------------------------------- */
202{
204 if (base->flag & BASE_SELECTABLE) {
205 return 3;
206 }
207 return 2;
208 }
209 return 1;
210}
211
212Base *find_first_by_data_id(const Scene *scene, ViewLayer *view_layer, ID *id)
213{
214 BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name)));
215
216 /* Try active object. */
217 BKE_view_layer_synced_ensure(scene, view_layer);
218 Base *basact = BKE_view_layer_active_base_get(view_layer);
219
220 if (basact && basact->object && basact->object->data == id) {
221 return basact;
222 }
223
224 /* Try all objects. */
225 Base *base_best = nullptr;
226 int priority_best = 0;
227
229 if (base->object && base->object->data == id) {
230 if (base->flag & BASE_SELECTED) {
231 return base;
232 }
233
234 int priority_test = get_base_select_priority(base);
235
236 if (priority_test > priority_best) {
237 priority_best = priority_test;
238 base_best = base;
239 }
240 }
241 }
242
243 return base_best;
244}
245
246bool jump_to_object(bContext *C, Object *ob, const bool /*reveal_hidden*/)
247{
248 const Scene *scene = CTX_data_scene(C);
249 ViewLayer *view_layer = CTX_data_view_layer(C);
250 View3D *v3d = CTX_wm_view3d(C);
251 BKE_view_layer_synced_ensure(scene, view_layer);
252 Base *base = BKE_view_layer_base_find(view_layer, ob);
253
254 if (base == nullptr) {
255 return false;
256 }
257
258 /* TODO: use 'reveal_hidden', as is done with bones. */
259
260 if (BKE_view_layer_active_base_get(view_layer) != base || !(base->flag & BASE_SELECTED)) {
261 /* Select if not selected. */
262 if (!(base->flag & BASE_SELECTED)) {
263 base_deselect_all(scene, view_layer, v3d, SEL_DESELECT);
264
265 if (BASE_VISIBLE(v3d, base)) {
266 base_select(base, BA_SELECT);
267 }
268
270 }
271
272 /* Make active if not active. */
273 base_activate(C, base);
274 }
275
276 return true;
277}
278
279bool jump_to_bone(bContext *C, Object *ob, const char *bone_name, const bool reveal_hidden)
280{
281 /* Verify it's a valid armature object. */
282 if (ob == nullptr || ob->type != OB_ARMATURE) {
283 return false;
284 }
285
286 bArmature *arm = static_cast<bArmature *>(ob->data);
287
288 /* Activate the armature object. */
289 if (!jump_to_object(C, ob, reveal_hidden)) {
290 return false;
291 }
292
293 /* Switch to pose mode from object mode. */
294 if (!ELEM(ob->mode, OB_MODE_EDIT, OB_MODE_POSE)) {
296 }
297
298 if (ob->mode == OB_MODE_EDIT && arm->edbo != nullptr) {
299 /* In Edit mode select and activate the target Edit-Bone. */
300 EditBone *ebone = ED_armature_ebone_find_name(arm->edbo, bone_name);
301 if (ebone != nullptr) {
302 if (reveal_hidden) {
303 /* Unhide the bone. */
304 ebone->flag &= ~BONE_HIDDEN_A;
306 }
307
308 /* Select it. */
310
311 if (EBONE_SELECTABLE(arm, ebone)) {
312 ED_armature_ebone_select_set(ebone, true);
314 }
315
316 arm->act_edbone = ebone;
317
319 return true;
320 }
321 }
322 else if (ob->mode == OB_MODE_POSE && ob->pose != nullptr) {
323 /* In Pose mode select and activate the target Bone/Pose-Channel. */
324 bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
325 if (pchan != nullptr) {
326 if (reveal_hidden) {
327 /* Unhide the bone. */
328 pchan->bone->flag &= ~BONE_HIDDEN_P;
330 }
331
332 /* Select it. */
334 ED_pose_bone_select(ob, pchan, true, true);
335
336 arm->act_bone = pchan->bone;
337
339 return true;
340 }
341 }
342
343 return false;
344}
345
348/* -------------------------------------------------------------------- */
353{
354 /* we don't check for linked scenes here, selection is
355 * still allowed then for inspection of scene */
356 Object *obact = CTX_data_active_object(C);
357
358 if (CTX_data_edit_object(C)) {
359 return false;
360 }
361 if (obact && obact->mode) {
362 return false;
363 }
364
365 return true;
366}
367
370/* -------------------------------------------------------------------- */
375{
376 Scene *scene = CTX_data_scene(C);
377 ViewLayer *view_layer = CTX_data_view_layer(C);
378 View3D *v3d = CTX_wm_view3d(C);
379 short obtype, extend;
380
381 obtype = RNA_enum_get(op->ptr, "type");
382 extend = RNA_boolean_get(op->ptr, "extend");
383
384 if (extend == 0) {
385 base_deselect_all(scene, view_layer, v3d, SEL_DESELECT);
386 }
387
388 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
389 if (base->object->type == obtype) {
390 base_select(base, BA_SELECT);
391 }
392 }
394
397
399
400 return OPERATOR_FINISHED;
401}
402
404{
405 /* identifiers */
406 ot->name = "Select by Type";
407 ot->description = "Select all visible objects that are of a type";
408 ot->idname = "OBJECT_OT_select_by_type";
409
410 /* api callbacks */
414
415 /* flags */
417
418 /* properties */
420 "extend",
421 false,
422 "Extend",
423 "Extend selection instead of deselecting everything first");
424 ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_object_type_items, 1, "Type", "");
426}
427
430/* -------------------------------------------------------------------- */
434enum {
442};
443
445 /* XXX deprecated animation system stuff. */
446 // {OBJECT_SELECT_LINKED_IPO, "IPO", 0, "Object IPO", ""},
447 {OBJECT_SELECT_LINKED_OBDATA, "OBDATA", 0, "Object Data", ""},
448 {OBJECT_SELECT_LINKED_MATERIAL, "MATERIAL", 0, "Material", ""},
449 {OBJECT_SELECT_LINKED_DUPGROUP, "DUPGROUP", 0, "Instanced Collection", ""},
450 {OBJECT_SELECT_LINKED_PARTICLE, "PARTICLE", 0, "Particle System", ""},
451 {OBJECT_SELECT_LINKED_LIBRARY, "LIBRARY", 0, "Library", ""},
452 {OBJECT_SELECT_LINKED_LIBRARY_OBDATA, "LIBRARY_OBDATA", 0, "Library (Object Data)", ""},
453 {0, nullptr, 0, nullptr, nullptr},
454};
455
456static bool object_select_all_by_obdata(bContext *C, void *obdata)
457{
458 bool changed = false;
459
460 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
461 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
462 if (base->object->data == obdata) {
463 base_select(base, BA_SELECT);
464 changed = true;
465 }
466 }
467 }
469
470 return changed;
471}
472
474{
475 bool changed = false;
476
477 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
478 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
479 Object *ob = base->object;
480 Material *mat1;
481 int a;
482
483 for (a = 1; a <= ob->totcol; a++) {
484 mat1 = BKE_object_material_get(ob, a);
485
486 if (mat1 == mat) {
487 base_select(base, BA_SELECT);
488 changed = true;
489 }
490 }
491 }
492 }
494
495 return changed;
496}
497
499{
500 bool changed = false;
501 Collection *instance_collection = (ob->transflag & OB_DUPLICOLLECTION) ?
503 nullptr;
504
505 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
506 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
507 Collection *instance_collection_other = (base->object->transflag & OB_DUPLICOLLECTION) ?
508 base->object->instance_collection :
509 nullptr;
510 if (instance_collection == instance_collection_other) {
511 base_select(base, BA_SELECT);
512 changed = true;
513 }
514 }
515 }
517
518 return changed;
519}
520
522{
523 ParticleSystem *psys_act = psys_get_current(ob);
524 bool changed = false;
525
526 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
527 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
528 /* Loop through other particles. */
529 LISTBASE_FOREACH (ParticleSystem *, psys, &base->object->particlesystem) {
530 if (psys->part == psys_act->part) {
531 base_select(base, BA_SELECT);
532 changed = true;
533 break;
534 }
535
536 if (base->flag & BASE_SELECTED) {
537 break;
538 }
539 }
540 }
541 }
543
544 return changed;
545}
546
548{
549 bool changed = false;
550
551 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
552 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
553 if (lib == base->object->id.lib) {
554 base_select(base, BA_SELECT);
555 changed = true;
556 }
557 }
558 }
560
561 return changed;
562}
563
565{
566 bool changed = false;
567
568 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
569 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
570 if (base->object->data && lib == ((ID *)base->object->data)->lib) {
571 base_select(base, BA_SELECT);
572 changed = true;
573 }
574 }
575 }
577
578 return changed;
579}
580
582{
583 int idtype = GS(id->name);
584 bool changed = false;
585
586 if (OB_DATA_SUPPORT_ID(idtype)) {
587 changed = object_select_all_by_obdata(C, id);
588 }
589 else if (idtype == ID_MA) {
590 changed = object_select_all_by_material(C, (Material *)id);
591 }
592 else if (idtype == ID_LI) {
593 changed = object_select_all_by_library(C, (Library *)id);
594 }
595
596 if (changed) {
597 Scene *scene = CTX_data_scene(C);
600 }
601}
602
604{
605 Scene *scene = CTX_data_scene(C);
606 ViewLayer *view_layer = CTX_data_view_layer(C);
607 View3D *v3d = CTX_wm_view3d(C);
608 Object *ob;
609 int nr = RNA_enum_get(op->ptr, "type");
610 bool changed = false, extend;
611
612 extend = RNA_boolean_get(op->ptr, "extend");
613
614 if (extend == 0) {
615 base_deselect_all(scene, view_layer, v3d, SEL_DESELECT);
616 }
617
618 BKE_view_layer_synced_ensure(scene, view_layer);
619 ob = BKE_view_layer_active_object_get(view_layer);
620 if (ob == nullptr) {
621 BKE_report(op->reports, RPT_ERROR, "No active object");
622 return OPERATOR_CANCELLED;
623 }
624
625 if (nr == OBJECT_SELECT_LINKED_IPO) {
626 /* XXX old animation system */
627 // if (ob->ipo == 0) return OPERATOR_CANCELLED;
628 // object_select_all_by_ipo(C, ob->ipo)
629 return OPERATOR_CANCELLED;
630 }
631 if (nr == OBJECT_SELECT_LINKED_OBDATA) {
632 if (ob->data == nullptr) {
633 return OPERATOR_CANCELLED;
634 }
635
636 changed = object_select_all_by_obdata(C, ob->data);
637 }
638 else if (nr == OBJECT_SELECT_LINKED_MATERIAL) {
639 Material *mat = nullptr;
640
641 mat = BKE_object_material_get(ob, ob->actcol);
642 if (mat == nullptr) {
643 return OPERATOR_CANCELLED;
644 }
645
646 changed = object_select_all_by_material(C, mat);
647 }
648 else if (nr == OBJECT_SELECT_LINKED_DUPGROUP) {
649 if (ob->instance_collection == nullptr) {
650 return OPERATOR_CANCELLED;
651 }
652
654 }
655 else if (nr == OBJECT_SELECT_LINKED_PARTICLE) {
657 return OPERATOR_CANCELLED;
658 }
659
660 changed = object_select_all_by_particle(C, ob);
661 }
662 else if (nr == OBJECT_SELECT_LINKED_LIBRARY) {
663 /* do nothing */
664 changed = object_select_all_by_library(C, ob->id.lib);
665 }
667 if (ob->data == nullptr) {
668 return OPERATOR_CANCELLED;
669 }
670
671 changed = object_select_all_by_library_obdata(C, ((ID *)ob->data)->lib);
672 }
673 else {
674 return OPERATOR_CANCELLED;
675 }
676
677 if (changed) {
681 return OPERATOR_FINISHED;
682 }
683
684 return OPERATOR_CANCELLED;
685}
686
688{
689 /* identifiers */
690 ot->name = "Select Linked";
691 ot->description = "Select all visible objects that are linked";
692 ot->idname = "OBJECT_OT_select_linked";
693
694 /* api callbacks */
698
699 /* flags */
701
702 /* properties */
704 "extend",
705 false,
706 "Extend",
707 "Extend selection instead of deselecting everything first");
708 ot->prop = RNA_def_enum(ot->srna, "type", prop_select_linked_types, 0, "Type", "");
709}
710
713/* -------------------------------------------------------------------- */
717enum {
729};
730
732 {OBJECT_GRPSEL_CHILDREN_RECURSIVE, "CHILDREN_RECURSIVE", 0, "Children", ""},
733 {OBJECT_GRPSEL_CHILDREN, "CHILDREN", 0, "Immediate Children", ""},
734 {OBJECT_GRPSEL_PARENT, "PARENT", 0, "Parent", ""},
735 {OBJECT_GRPSEL_SIBLINGS, "SIBLINGS", 0, "Siblings", "Shared parent"},
736 {OBJECT_GRPSEL_TYPE, "TYPE", 0, "Type", "Shared object type"},
737 {OBJECT_GRPSEL_COLLECTION, "COLLECTION", 0, "Collection", "Shared collection"},
738 {OBJECT_GRPSEL_HOOK, "HOOK", 0, "Hook", ""},
739 {OBJECT_GRPSEL_PASS, "PASS", 0, "Pass", "Render pass index"},
740 {OBJECT_GRPSEL_COLOR, "COLOR", 0, "Color", "Object color"},
742 "KEYINGSET",
743 0,
744 "Keying Set",
745 "Objects included in active Keying Set"},
746 {OBJECT_GRPSEL_LIGHT_TYPE, "LIGHT_TYPE", 0, "Light Type", "Matching light types"},
747 {0, nullptr, 0, nullptr, nullptr},
748};
749
750static bool select_grouped_children(bContext *C, Object *ob, const bool recursive)
751{
752 bool changed = false;
753
754 CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
755 if (ob == base->object->parent) {
756 if ((base->flag & BASE_SELECTED) == 0) {
757 base_select(base, BA_SELECT);
758 changed = true;
759 }
760
761 if (recursive) {
762 changed |= select_grouped_children(C, base->object, true);
763 }
764 }
765 }
767 return changed;
768}
769
770/* Makes parent active and de-selected BKE_view_layer_active_object_get. */
772{
773 Scene *scene = CTX_data_scene(C);
774 ViewLayer *view_layer = CTX_data_view_layer(C);
775 View3D *v3d = CTX_wm_view3d(C);
776 Base *baspar, *basact = CTX_data_active_base(C);
777 bool changed = false;
778
779 if (!basact || !(basact->object->parent)) {
780 /* We know BKE_view_layer_active_object_get is valid. */
781 return false;
782 }
783
784 BKE_view_layer_synced_ensure(scene, view_layer);
785 baspar = BKE_view_layer_base_find(view_layer, basact->object->parent);
786
787 /* can be nullptr if parent in other scene */
788 if (baspar && BASE_SELECTABLE(v3d, baspar)) {
789 base_select(baspar, BA_SELECT);
790 base_activate(C, baspar);
791 changed = true;
792 }
793 return changed;
794}
795
796#define COLLECTION_MENU_MAX 24
797/* Select objects in the same group as the active */
799{
800 Main *bmain = CTX_data_main(C);
801 bool changed = false;
802 Collection *collection, *ob_collections[COLLECTION_MENU_MAX];
803 int collection_count = 0, i;
804 uiPopupMenu *pup;
805 uiLayout *layout;
806
807 for (collection = static_cast<Collection *>(bmain->collections.first);
808 collection && (collection_count < COLLECTION_MENU_MAX);
809 collection = static_cast<Collection *>(collection->id.next))
810 {
811 if (BKE_collection_has_object(collection, ob)) {
812 ob_collections[collection_count] = collection;
814 }
815 }
816
817 if (!collection_count) {
818 return false;
819 }
820 if (collection_count == 1) {
821 collection = ob_collections[0];
822 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
823 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
824 if (BKE_collection_has_object(collection, base->object)) {
825 base_select(base, BA_SELECT);
826 changed = true;
827 }
828 }
829 }
831 return changed;
832 }
833
834 /* build the menu. */
835 pup = UI_popup_menu_begin(C, IFACE_("Select Collection"), ICON_NONE);
836 layout = UI_popup_menu_layout(pup);
837
838 for (i = 0; i < collection_count; i++) {
839 collection = ob_collections[i];
840 uiItemStringO(layout,
841 collection->id.name + 2,
842 ICON_NONE,
843 "OBJECT_OT_select_same_collection",
844 "collection",
845 collection->id.name + 2);
846 }
847
848 UI_popup_menu_end(C, pup);
849 return changed; /* The operator already handle this! */
850}
851
853{
854 const Scene *scene = CTX_data_scene(C);
855 ViewLayer *view_layer = CTX_data_view_layer(C);
856 View3D *v3d = CTX_wm_view3d(C);
857
858 bool changed = false;
859 Base *base;
860 HookModifierData *hmd;
861
863 if (md->type == eModifierType_Hook) {
864 hmd = (HookModifierData *)md;
865 if (hmd->object) {
866 BKE_view_layer_synced_ensure(scene, view_layer);
867 base = BKE_view_layer_base_find(view_layer, hmd->object);
868 if (base && ((base->flag & BASE_SELECTED) == 0) && BASE_SELECTABLE(v3d, base)) {
869 base_select(base, BA_SELECT);
870 changed = true;
871 }
872 }
873 }
874 }
875 return changed;
876}
877
878/* Select objects with the same parent as the active (siblings),
879 * parent can be nullptr also */
881{
882 bool changed = false;
883
884 CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
885 if ((base->object->parent == ob->parent) && ((base->flag & BASE_SELECTED) == 0)) {
886 base_select(base, BA_SELECT);
887 changed = true;
888 }
889 }
891 return changed;
892}
894{
895 Light *la = static_cast<Light *>(ob->data);
896
897 bool changed = false;
898
899 CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
900 if (base->object->type == OB_LAMP) {
901 Light *la_test = static_cast<Light *>(base->object->data);
902 if ((la->type == la_test->type) && ((base->flag & BASE_SELECTED) == 0)) {
903 base_select(base, BA_SELECT);
904 changed = true;
905 }
906 }
907 }
909 return changed;
910}
912{
913 bool changed = false;
914
915 CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
916 if ((base->object->type == ob->type) && ((base->flag & BASE_SELECTED) == 0)) {
917 base_select(base, BA_SELECT);
918 changed = true;
919 }
920 }
922 return changed;
923}
924
926{
927 bool changed = false;
928
929 CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
930 if ((base->object->index == ob->index) && ((base->flag & BASE_SELECTED) == 0)) {
931 base_select(base, BA_SELECT);
932 changed = true;
933 }
934 }
936 return changed;
937}
938
940{
941 bool changed = false;
942
943 CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
944 if (((base->flag & BASE_SELECTED) == 0) &&
945 compare_v3v3(base->object->color, ob->color, 0.005f))
946 {
947 base_select(base, BA_SELECT);
948 changed = true;
949 }
950 }
952 return changed;
953}
954
955static bool select_grouped_keyingset(bContext *C, Object * /*ob*/, ReportList *reports)
956{
958 bool changed = false;
959
960 /* firstly, validate KeyingSet */
961 if (ks == nullptr) {
962 BKE_report(reports, RPT_ERROR, "No active Keying Set to use");
963 return false;
964 }
966 if (ks->paths.first == nullptr) {
967 if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) {
968 BKE_report(reports,
969 RPT_ERROR,
970 "Use another Keying Set, as the active one depends on the currently "
971 "selected objects or cannot find any targets due to unsuitable context");
972 }
973 else {
974 BKE_report(reports, RPT_ERROR, "Keying Set does not contain any paths");
975 }
976 }
977 return false;
978 }
979
980 /* select each object that Keying Set refers to */
981 /* TODO: perhaps to be more in line with the rest of these, we should only take objects
982 * if the passed in object is included in this too */
983 CTX_DATA_BEGIN (C, Base *, base, selectable_bases) {
984 /* only check for this object if it isn't selected already, to limit time wasted */
985 if ((base->flag & BASE_SELECTED) == 0) {
986 /* This is the slow way... we could end up with > 500 items here,
987 * with none matching, but end up doing this on 1000 objects. */
988 LISTBASE_FOREACH (KS_Path *, ksp, &ks->paths) {
989 /* if id matches, select then stop looping (match found) */
990 if (ksp->id == (ID *)base->object) {
991 base_select(base, BA_SELECT);
992 changed = true;
993 break;
994 }
995 }
996 }
997 }
999
1000 return changed;
1001}
1002
1004{
1005 Scene *scene = CTX_data_scene(C);
1006 ViewLayer *view_layer = CTX_data_view_layer(C);
1007 View3D *v3d = CTX_wm_view3d(C);
1008 Object *ob;
1009 const int type = RNA_enum_get(op->ptr, "type");
1010 bool changed = false, extend;
1011
1012 extend = RNA_boolean_get(op->ptr, "extend");
1013
1014 if (extend == 0) {
1015 changed = base_deselect_all(scene, view_layer, v3d, SEL_DESELECT);
1016 }
1017
1018 BKE_view_layer_synced_ensure(scene, view_layer);
1019 ob = BKE_view_layer_active_object_get(view_layer);
1020 if (ob == nullptr) {
1021 BKE_report(op->reports, RPT_ERROR, "No active object");
1022 return OPERATOR_CANCELLED;
1023 }
1024
1025 switch (type) {
1027 changed |= select_grouped_children(C, ob, true);
1028 break;
1030 changed |= select_grouped_children(C, ob, false);
1031 break;
1033 changed |= select_grouped_parent(C);
1034 break;
1036 changed |= select_grouped_siblings(C, ob);
1037 break;
1038 case OBJECT_GRPSEL_TYPE:
1039 changed |= select_grouped_type(C, ob);
1040 break;
1042 changed |= select_grouped_collection(C, ob);
1043 break;
1044 case OBJECT_GRPSEL_HOOK:
1045 changed |= select_grouped_object_hooks(C, ob);
1046 break;
1047 case OBJECT_GRPSEL_PASS:
1048 changed |= select_grouped_index_object(C, ob);
1049 break;
1051 changed |= select_grouped_color(C, ob);
1052 break;
1054 changed |= select_grouped_keyingset(C, ob, op->reports);
1055 break;
1057 if (ob->type != OB_LAMP) {
1058 BKE_report(op->reports, RPT_ERROR, "Active object must be a light");
1059 break;
1060 }
1061 changed |= select_grouped_lighttype(C, ob);
1062 break;
1063 default:
1064 break;
1065 }
1066
1067 if (changed) {
1071 return OPERATOR_FINISHED;
1072 }
1073
1074 return OPERATOR_CANCELLED;
1075}
1076
1078{
1079 /* identifiers */
1080 ot->name = "Select Grouped";
1081 ot->description = "Select all visible objects grouped by various properties";
1082 ot->idname = "OBJECT_OT_select_grouped";
1083
1084 /* api callbacks */
1088
1089 /* flags */
1091
1092 /* properties */
1094 "extend",
1095 false,
1096 "Extend",
1097 "Extend selection instead of deselecting everything first");
1098 ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
1099}
1100
1103/* -------------------------------------------------------------------- */
1108{
1109 Scene *scene = CTX_data_scene(C);
1110 ViewLayer *view_layer = CTX_data_view_layer(C);
1111 View3D *v3d = CTX_wm_view3d(C);
1112 int action = RNA_enum_get(op->ptr, "action");
1113 bool any_visible = false;
1114
1115 bool changed = base_deselect_all_ex(scene, view_layer, v3d, action, &any_visible);
1116
1117 if (changed) {
1120
1122
1123 return OPERATOR_FINISHED;
1124 }
1125 if (any_visible == false) {
1126 /* TODO(@ideasman42): Looks like we could remove this,
1127 * if not comment should say why its needed. */
1128 return OPERATOR_PASS_THROUGH;
1129 }
1130 return OPERATOR_CANCELLED;
1131}
1132
1134{
1135
1136 /* identifiers */
1137 ot->name = "(De)select All";
1138 ot->description = "Change selection of all visible objects in scene";
1139 ot->idname = "OBJECT_OT_select_all";
1140
1141 /* api callbacks */
1144
1145 /* flags */
1147
1149}
1150
1153/* -------------------------------------------------------------------- */
1158{
1159 Main *bmain = CTX_data_main(C);
1160 Collection *collection;
1161 char collection_name[MAX_ID_NAME];
1162
1163 /* passthrough if no objects are visible */
1164 if (CTX_DATA_COUNT(C, visible_bases) == 0) {
1165 return OPERATOR_PASS_THROUGH;
1166 }
1167
1168 RNA_string_get(op->ptr, "collection", collection_name);
1169
1170 collection = (Collection *)BKE_libblock_find_name(bmain, ID_GR, collection_name);
1171
1172 if (!collection) {
1173 return OPERATOR_PASS_THROUGH;
1174 }
1175
1176 CTX_DATA_BEGIN (C, Base *, base, visible_bases) {
1177 if (((base->flag & BASE_SELECTED) == 0) && ((base->flag & BASE_SELECTABLE) != 0)) {
1178 if (BKE_collection_has_object(collection, base->object)) {
1179 base_select(base, BA_SELECT);
1180 }
1181 }
1182 }
1184
1185 Scene *scene = CTX_data_scene(C);
1188
1190
1191 return OPERATOR_FINISHED;
1192}
1193
1195{
1196
1197 /* identifiers */
1198 ot->name = "Select Same Collection";
1199 ot->description = "Select object in the same collection";
1200 ot->idname = "OBJECT_OT_select_same_collection";
1201
1202 /* api callbacks */
1205
1206 /* flags */
1208
1210 "collection",
1211 nullptr,
1213 "Collection",
1214 "Name of the collection to select");
1215}
1216
1219/* -------------------------------------------------------------------- */
1224{
1225 Main *bmain = CTX_data_main(C);
1226 Scene *scene = CTX_data_scene(C);
1227 ViewLayer *view_layer = CTX_data_view_layer(C);
1228 bool extend;
1229
1230 extend = RNA_boolean_get(op->ptr, "extend");
1231
1232 CTX_DATA_BEGIN (C, Base *, primbase, selected_bases) {
1233 char name_flip[MAXBONENAME];
1234
1235 BLI_string_flip_side_name(name_flip, primbase->object->id.name + 2, true, sizeof(name_flip));
1236
1237 if (!STREQ(name_flip, primbase->object->id.name + 2)) {
1238 Object *ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, name_flip);
1239 if (ob) {
1240 BKE_view_layer_synced_ensure(scene, view_layer);
1241 Base *secbase = BKE_view_layer_base_find(view_layer, ob);
1242
1243 if (secbase) {
1244 base_select(secbase, BA_SELECT);
1245 }
1246 }
1247 }
1248
1249 if (extend == false) {
1250 base_select(primbase, BA_DESELECT);
1251 }
1252 }
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 "extend",
1282 false,
1283 "Extend",
1284 "Extend selection instead of deselecting everything first");
1285}
1286
1289/* -------------------------------------------------------------------- */
1293static bool object_select_more_less(bContext *C, const bool select)
1294{
1295 Scene *scene = CTX_data_scene(C);
1296 ViewLayer *view_layer = CTX_data_view_layer(C);
1297
1298 BKE_view_layer_synced_ensure(scene, view_layer);
1300 Object *ob = base->object;
1301 ob->flag &= ~OB_DONE;
1302 ob->id.tag &= ~ID_TAG_DOIT;
1303 /* parent may be in another scene */
1304 if (ob->parent) {
1305 ob->parent->flag &= ~OB_DONE;
1306 ob->parent->id.tag &= ~ID_TAG_DOIT;
1307 }
1308 }
1309
1310 Vector<PointerRNA> ctx_base_list;
1311 CTX_data_selectable_bases(C, &ctx_base_list);
1312
1313 CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
1314 ob->flag |= OB_DONE;
1315 }
1317
1318 for (PointerRNA &ptr : ctx_base_list) {
1319 Object *ob = ((Base *)ptr.data)->object;
1320 if (ob->parent) {
1321 if ((ob->flag & OB_DONE) != (ob->parent->flag & OB_DONE)) {
1322 ob->id.tag |= ID_TAG_DOIT;
1323 ob->parent->id.tag |= ID_TAG_DOIT;
1324 }
1325 }
1326 }
1327
1328 bool changed = false;
1329 const short select_mode = select ? BA_SELECT : BA_DESELECT;
1330 const short select_flag = select ? BASE_SELECTED : 0;
1331
1332 for (PointerRNA &ptr : ctx_base_list) {
1333 Base *base = static_cast<Base *>(ptr.data);
1334 Object *ob = base->object;
1335 if ((ob->id.tag & ID_TAG_DOIT) && ((base->flag & BASE_SELECTED) != select_flag)) {
1336 base_select(base, eObjectSelect_Mode(select_mode));
1337 changed = true;
1338 }
1339 }
1340
1341 return changed;
1342}
1343
1345{
1346 bool changed = object_select_more_less(C, true);
1347
1348 if (changed) {
1349 Scene *scene = CTX_data_scene(C);
1352
1354
1355 return OPERATOR_FINISHED;
1356 }
1357 return OPERATOR_CANCELLED;
1358}
1359
1361{
1362 /* identifiers */
1363 ot->name = "Select More";
1364 ot->idname = "OBJECT_OT_select_more";
1365 ot->description = "Select connected parent/child objects";
1366
1367 /* api callbacks */
1370
1371 /* flags */
1373}
1374
1376{
1377 bool changed = object_select_more_less(C, false);
1378
1379 if (changed) {
1380 Scene *scene = CTX_data_scene(C);
1383
1385
1386 return OPERATOR_FINISHED;
1387 }
1388 return OPERATOR_CANCELLED;
1389}
1390
1392{
1393 /* identifiers */
1394 ot->name = "Select Less";
1395 ot->idname = "OBJECT_OT_select_less";
1396 ot->description = "Deselect objects at the boundaries of parent/child relationships";
1397
1398 /* api callbacks */
1401
1402 /* flags */
1404}
1405
1408/* -------------------------------------------------------------------- */
1413{
1414 const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
1415 const float randfac = RNA_float_get(op->ptr, "ratio");
1417
1418 Vector<PointerRNA> ctx_data_list;
1419 CTX_data_selectable_bases(C, &ctx_data_list);
1420 int elem_map_len = 0;
1421 Base **elem_map = static_cast<Base **>(
1422 MEM_mallocN(sizeof(*elem_map) * ctx_data_list.size(), __func__));
1423
1424 for (PointerRNA &ptr : ctx_data_list) {
1425 elem_map[elem_map_len++] = static_cast<Base *>(ptr.data);
1426 }
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 base_select(elem_map[i], eObjectSelect_Mode(select));
1432 }
1433 MEM_freeN(elem_map);
1434
1435 Scene *scene = CTX_data_scene(C);
1438
1440
1441 return OPERATOR_FINISHED;
1442}
1443
1445{
1446 /* identifiers */
1447 ot->name = "Select Random";
1448 ot->description = "Select or deselect 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
1465} // namespace blender::ed::object
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
void ANIM_armature_bonecoll_show_from_ebone(bArmature *armature, const EditBone *ebone)
void ANIM_armature_bonecoll_show_from_pchan(bArmature *armature, const bPoseChannel *pchan)
Functionality to interact with keying sets.
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
bool BKE_collection_has_object(Collection *collection, const Object *ob)
bool CTX_data_selectable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
#define CTX_DATA_BEGIN(C, Type, instance, member)
Object * CTX_data_active_object(const bContext *C)
#define CTX_DATA_COUNT(C, member)
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
Base * CTX_data_active_base(const bContext *C)
Main * CTX_data_main(const bContext *C)
#define CTX_DATA_END
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
#define FOREACH_VISIBLE_BASE_END
Definition BKE_layer.hh:417
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Base * BKE_view_layer_active_base_get(ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
#define FOREACH_VISIBLE_BASE_BEGIN(_scene, _view_layer, _v3d, _instance)
Definition BKE_layer.hh:404
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
Object * BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
ID * BKE_libblock_find_name(Main *bmain, short type, const char *name, const std::optional< Library * > lib=std::nullopt) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition lib_id.cc:1657
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
struct ParticleSystem * psys_get_current(struct Object *ob)
Definition particle.cc:534
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:125
void BKE_scene_object_base_flag_sync_from_base(Base *base)
Definition scene.cc:2820
#define BLI_assert(a)
Definition BLI_assert.h:50
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
MINLINE bool compare_v3v3(const float v1[3], const float v2[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 *name_dst, const char *name_src, bool strip_number, size_t name_dst_maxncpy) ATTR_NONNULL(1
#define ELEM(...)
#define STREQ(a, b)
#define BLT_I18NCONTEXT_ID_ID
#define IFACE_(msgid)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_SELECT
Definition DNA_ID.h:1068
#define MAX_ID_NAME
Definition DNA_ID.h:377
@ ID_TAG_DOIT
Definition DNA_ID.h:1003
@ ID_LI
@ ID_MA
@ ID_GR
@ ID_OB
@ KEYINGSET_ABSOLUTE
#define MAXBONENAME
Object groups, one object can be in many groups at once.
@ BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT
@ eModifierType_Hook
@ OB_MODE_EDIT
@ OB_MODE_POSE
#define OB_DATA_SUPPORT_ID(_id_type)
@ OB_DONE
@ OB_ARMATURE
@ OB_LAMP
@ OB_DUPLICOLLECTION
#define BASE_SELECTED(v3d, base)
#define BASE_SELECTABLE(v3d, base)
#define BASE_VISIBLE(v3d, base)
@ OPERATOR_PASS_THROUGH
#define EBONE_SELECTABLE(arm, ebone)
void ED_outliner_select_sync_from_object_tag(bContext *C)
bool ED_operator_objectmode(bContext *C)
@ SEL_SELECT
@ SEL_INVERT
@ SEL_DESELECT
@ SEL_TOGGLE
Read Guarded memory(de)allocation.
void UI_popup_menu_end(bContext *C, uiPopupMenu *pup)
uiPopupMenu * UI_popup_menu_begin(bContext *C, const char *title, int icon) ATTR_NONNULL()
uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value)
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_REGISTER
Definition WM_types.hh:160
#define ND_OB_ACTIVE
Definition WM_types.hh:407
#define ND_OB_SELECT
Definition WM_types.hh:409
#define NC_SCENE
Definition WM_types.hh:345
bool ED_armature_edit_deselect_all(Object *obedit)
EditBone * ED_armature_ebone_find_name(const ListBase *edbo, const char *name)
void ED_armature_edit_sync_selection(ListBase *edbo)
void ED_armature_ebone_select_set(EditBone *ebone, bool select)
static int collection_count(const ListBase *lb)
static unsigned long seed
Definition btSoftBody.h:39
int64_t size() const
#define GS(x)
Definition iris.cc:202
KeyingSet * ANIM_scene_get_active_keyingset(const Scene *scene)
blender::animrig::ModifyKeyReturn ANIM_validate_keyingset(bContext *C, blender::Vector< PointerRNA > *sources, KeyingSet *keyingset)
void *(* MEM_mallocN)(size_t len, const char *str)
Definition mallocn.cc:44
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
static bool select_grouped_object_hooks(bContext *C, Object *ob)
static bool select_grouped_index_object(bContext *C, Object *ob)
bool jump_to_object(bContext *C, Object *ob, bool reveal_hidden)
static int object_select_same_collection_exec(bContext *C, wmOperator *op)
Base * find_first_by_data_id(const Scene *scene, ViewLayer *view_layer, ID *id)
void OBJECT_OT_select_more(wmOperatorType *ot)
static int object_select_random_exec(bContext *C, wmOperator *op)
void OBJECT_OT_select_mirror(wmOperatorType *ot)
static const EnumPropertyItem prop_select_grouped_types[]
static bool object_select_all_by_library_obdata(bContext *C, Library *lib)
void OBJECT_OT_select_all(wmOperatorType *ot)
static bool select_grouped_color(bContext *C, Object *ob)
void OBJECT_OT_select_same_collection(wmOperatorType *ot)
void base_activate(bContext *C, Base *base)
static int object_select_less_exec(bContext *C, wmOperator *)
static const EnumPropertyItem prop_select_linked_types[]
static bool select_grouped_parent(bContext *C)
void base_select(Base *base, eObjectSelect_Mode mode)
static bool object_select_all_by_material(bContext *C, Material *mat)
void OBJECT_OT_select_linked(wmOperatorType *ot)
static int object_select_more_exec(bContext *C, wmOperator *)
static int object_select_all_exec(bContext *C, wmOperator *op)
void OBJECT_OT_select_by_type(wmOperatorType *ot)
static bool select_grouped_children(bContext *C, Object *ob, const bool recursive)
static bool object_select_all_by_library(bContext *C, Library *lib)
static bool object_select_all_by_instance_collection(bContext *C, Object *ob)
static int object_select_mirror_exec(bContext *C, wmOperator *op)
void OBJECT_OT_select_less(wmOperatorType *ot)
static int object_select_grouped_exec(bContext *C, wmOperator *op)
static bool select_grouped_siblings(bContext *C, Object *ob)
static bool select_grouped_type(bContext *C, Object *ob)
static bool object_select_more_less(bContext *C, const bool select)
static int object_select_linked_exec(bContext *C, wmOperator *op)
void base_activate_with_mode_exit_if_needed(bContext *C, Base *base)
static bool objects_selectable_poll(bContext *C)
bool editmode_exit_multi_ex(Main *bmain, Scene *scene, ViewLayer *view_layer, int flag)
static bool object_select_all_by_obdata(bContext *C, void *obdata)
bool jump_to_bone(bContext *C, Object *ob, const char *bone_name, bool reveal_hidden)
void base_active_refresh(Main *bmain, Scene *scene, ViewLayer *view_layer)
void select_linked_by_id(bContext *C, ID *id)
static bool object_select_all_by_particle(bContext *C, Object *ob)
void OBJECT_OT_select_grouped(wmOperatorType *ot)
static bool select_grouped_keyingset(bContext *C, Object *, ReportList *reports)
bool base_deselect_all(const Scene *scene, ViewLayer *view_layer, View3D *v3d, int action)
bool base_deselect_all_ex(const Scene *scene, ViewLayer *view_layer, View3D *v3d, int action, bool *r_any_visible)
static bool select_grouped_lighttype(bContext *C, Object *ob)
static int get_base_select_priority(Base *base)
void OBJECT_OT_select_random(wmOperatorType *ot)
bool mode_set(bContext *C, eObjectMode mode)
static bool select_grouped_collection(bContext *C, Object *ob)
static int object_select_by_type_exec(bContext *C, wmOperator *op)
#define COLLECTION_MENU_MAX
void ED_pose_bone_select_tag_update(Object *ob)
bool ED_pose_deselect_all(Object *ob, int select_mode, const bool ignore_visibility)
void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select, bool change_active)
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
const EnumPropertyItem rna_enum_object_type_items[]
short flag
struct Object * object
struct Object * object
Definition DNA_ID.h:413
int tag
Definition DNA_ID.h:434
struct Library * lib
Definition DNA_ID.h:419
ListBase paths
short type
void * first
ListBase wm
Definition BKE_main.hh:239
ListBase collections
Definition BKE_main.hh:231
ListBase particlesystem
short transflag
struct Collection * instance_collection
struct bPose * pose
ListBase modifiers
float color[4]
struct Object * parent
ParticleSettings * part
void * data
Definition RNA_types.hh:42
int object_type_exclude_select
struct Base * basact
struct EditBone * act_edbone
ListBase * edbo
struct Bone * bone
const char * name
Definition WM_types.hh:990
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1042
const char * idname
Definition WM_types.hh:992
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1022
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1006
const char * description
Definition WM_types.hh:996
PropertyRNA * prop
Definition WM_types.hh:1092
StructRNA * srna
Definition WM_types.hh:1080
struct ReportList * reports
struct PointerRNA * ptr
static DynamicLibrary lib
void WM_main_add_notifier(uint type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4126
wmOperatorType * ot
Definition wm_files.cc:4125
#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 *)