Blender V4.5
view3d_ops.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "DNA_object_types.h"
10#include "DNA_screen_types.h"
11#include "DNA_space_types.h"
12
13#include "BLI_listbase.h"
14#include "BLI_path_utils.hh"
15
16#include "BKE_appdir.hh"
18#include "BKE_blendfile.hh"
19#include "BKE_context.hh"
20#include "BKE_report.hh"
21
22#include "RNA_access.hh"
23#include "RNA_define.hh"
24
25#include "WM_api.hh"
26#include "WM_types.hh"
27
28#include "ED_outliner.hh"
29#include "ED_screen.hh"
30#include "ED_transform.hh"
31
32#include "view3d_intern.hh"
33#include "view3d_navigate.hh"
34
35#ifdef WIN32
36# include "BLI_math_base.h" /* M_PI */
37#endif
38
39/* -------------------------------------------------------------------- */
42
43static void view3d_copybuffer_filepath_get(char filepath[FILE_MAX], size_t filepath_maxncpy)
44{
45 BLI_path_join(filepath, filepath_maxncpy, BKE_tempdir_base(), "copybuffer.blend");
46}
47
49
50/* -------------------------------------------------------------------- */
53
55{
56 using namespace blender::bke::blendfile;
57
58 Main *bmain = CTX_data_main(C);
60
61 /* context, selection, could be generalized */
62 CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
63 copybuffer.id_add(&ob->id,
65 (PartialWriteContext::IDAddOperations::SET_FAKE_USER |
66 PartialWriteContext::IDAddOperations::SET_CLIPBOARD_MARK |
67 PartialWriteContext::IDAddOperations::ADD_DEPENDENCIES)},
68 nullptr);
69 }
71
72 /* Explicitly adding an object to the copy/paste buffer _may_ add others as dependencies (e.g. a
73 * parent object). So count to total amount of objects added, to get a matching number with the
74 * one reported by the "paste" operation. */
75 const int num_copied = BLI_listbase_count(&copybuffer.bmain.objects);
76
77 char filepath[FILE_MAX];
78 view3d_copybuffer_filepath_get(filepath, sizeof(filepath));
79 copybuffer.write(filepath, *op->reports);
80
81 BKE_reportf(op->reports, RPT_INFO, "Copied %d selected object(s)", num_copied);
82
83 return OPERATOR_FINISHED;
84}
85
87{
88 /* identifiers */
89 ot->name = "Copy Objects";
90 ot->idname = "VIEW3D_OT_copybuffer";
91 ot->description = "Copy the selected objects to the internal clipboard";
92
93 /* API callbacks. */
95 ot->poll = ED_operator_scene;
96}
97
99
100/* -------------------------------------------------------------------- */
103
105{
106 char filepath[FILE_MAX];
107 short flag = 0;
108
109 if (RNA_boolean_get(op->ptr, "autoselect")) {
111 }
112 if (RNA_boolean_get(op->ptr, "active_collection")) {
114 }
115
116 view3d_copybuffer_filepath_get(filepath, sizeof(filepath));
117
118 const int num_pasted = BKE_copybuffer_paste(C, filepath, flag, op->reports, FILTER_ID_OB);
119 if (num_pasted == 0) {
120 BKE_report(op->reports, RPT_INFO, "No objects to paste");
121 return OPERATOR_CANCELLED;
122 }
123
126
127 BKE_reportf(op->reports, RPT_INFO, "%d object(s) pasted", num_pasted);
128
129 return OPERATOR_FINISHED;
130}
131
133{
134
135 /* identifiers */
136 ot->name = "Paste Objects";
137 ot->idname = "VIEW3D_OT_pastebuffer";
138 ot->description = "Paste objects from the internal clipboard";
139
140 /* API callbacks. */
143
144 /* flags */
146
147 RNA_def_boolean(ot->srna, "autoselect", true, "Select", "Select pasted objects");
148 RNA_def_boolean(ot->srna,
149 "active_collection",
150 true,
151 "Active Collection",
152 "Put pasted objects in the active collection");
153}
154
156
157/* -------------------------------------------------------------------- */
160
162{
168#ifdef WITH_INPUT_NDOF
169 WM_operatortype_append(VIEW3D_OT_ndof_orbit_zoom);
170 WM_operatortype_append(VIEW3D_OT_ndof_orbit);
171 WM_operatortype_append(VIEW3D_OT_ndof_pan);
172 WM_operatortype_append(VIEW3D_OT_ndof_all);
173#endif /* WITH_INPUT_NDOF */
213
215
223
225
229
232
234}
235
237{
238 WM_keymap_ensure(keyconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
239
240 /* only for region 3D window */
241 WM_keymap_ensure(keyconf, "3D View", SPACE_VIEW3D, RGN_TYPE_WINDOW);
242
243 fly_modal_keymap(keyconf);
244 walk_modal_keymap(keyconf);
246 viewmove_modal_keymap(keyconf);
247 viewzoom_modal_keymap(keyconf);
248 viewdolly_modal_keymap(keyconf);
249 viewplace_modal_keymap(keyconf);
250}
251
const char * BKE_tempdir_base() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
Definition appdir.cc:1249
int BKE_copybuffer_paste(bContext *C, const char *libname, int flag, ReportList *reports, uint64_t id_types_mask)
#define CTX_DATA_BEGIN(C, Type, instance, member)
Main * CTX_data_main(const bContext *C)
#define CTX_DATA_END
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
Definition main.cc:877
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:126
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:524
#define FILE_MAX
#define BLI_path_join(...)
Object is a sort of wrapper for general info.
@ RGN_TYPE_WINDOW
@ SPACE_VIEW3D
@ FILE_ACTIVE_COLLECTION
@ FILE_AUTOSELECT
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
void ED_outliner_select_sync_from_object_tag(bContext *C)
bool ED_operator_scene(bContext *C)
bool ED_operator_scene_editable(bContext *C)
#define C
Definition RandGen.cpp:29
#define NC_WINDOW
Definition WM_types.hh:372
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_REGISTER
Definition WM_types.hh:180
ID * id_add(const ID *id, IDAddOptions options, blender::FunctionRef< IDAddOperations(LibraryIDLinkCallbackData *cb_data, IDAddOptions options)> dependencies_filter_cb=nullptr)
bool write(const char *write_filepath, int write_flags, int remap_mode, ReportList &reports)
#define FILTER_ID_OB
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
ListBase objects
Definition BKE_main.hh:247
struct ReportList * reports
struct PointerRNA * ptr
void VIEW3D_OT_object_mode_pie_or_toggle(wmOperatorType *ot)
void VIEW3D_OT_view_persportho(wmOperatorType *ot)
void VIEW3D_OT_toggle_xray(wmOperatorType *ot)
void VIEW3D_OT_view_center_camera(wmOperatorType *ot)
void VIEW3D_OT_view_center_lock(wmOperatorType *ot)
void VIEW3D_OT_zoom_camera_1_to_1(wmOperatorType *ot)
void VIEW3D_OT_clip_border(wmOperatorType *ot)
void VIEW3D_OT_view_lock_to_active(wmOperatorType *ot)
void VIEW3D_OT_cursor3d(wmOperatorType *ot)
void VIEW3D_OT_clear_render_border(wmOperatorType *ot)
void VIEW3D_OT_view_lock_clear(wmOperatorType *ot)
void VIEW3D_OT_navigate(wmOperatorType *ot)
void VIEW3D_OT_camera_background_image_remove(wmOperatorType *ot)
void VIEW3D_OT_render_border(wmOperatorType *ot)
void VIEW3D_OT_toggle_shading(wmOperatorType *ot)
void VIEW3D_OT_drop_world(wmOperatorType *ot)
void VIEW3D_OT_camera_background_image_add(wmOperatorType *ot)
void VIEW3D_OT_ruler_remove(wmOperatorType *ot)
void VIEW3D_OT_ruler_add(wmOperatorType *ot)
void VIEW3D_OT_toggle_matcap_flip(wmOperatorType *ot)
void VIEW3D_OT_select(wmOperatorType *ot)
void VIEW3D_OT_localview(wmOperatorType *ot)
void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
void VIEW3D_OT_bone_select_menu(wmOperatorType *ot)
void VIEW3D_OT_select_box(wmOperatorType *ot)
void VIEW3D_OT_localview_remove_from(wmOperatorType *ot)
void VIEW3D_OT_camera_to_view_selected(wmOperatorType *ot)
void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
void VIEW3D_OT_interactive_add(wmOperatorType *ot)
void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
void VIEW3D_OT_select_menu(wmOperatorType *ot)
void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
void VIEW3D_OT_snap_selected_to_active(wmOperatorType *ot)
void VIEW3D_OT_select_circle(wmOperatorType *ot)
void VIEW3D_OT_select_lasso(wmOperatorType *ot)
void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
void VIEW3D_OT_camera_to_view(wmOperatorType *ot)
void viewplace_modal_keymap(wmKeyConfig *keyconf)
void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot)
void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
void viewmove_modal_keymap(wmKeyConfig *keyconf)
void VIEW3D_OT_view_roll(wmOperatorType *ot)
void VIEW3D_OT_view_axis(wmOperatorType *ot)
void VIEW3D_OT_view_orbit(wmOperatorType *ot)
void fly_modal_keymap(wmKeyConfig *keyconf)
void VIEW3D_OT_walk(wmOperatorType *ot)
void VIEW3D_OT_zoom_border(wmOperatorType *ot)
void VIEW3D_OT_rotate(wmOperatorType *ot)
void VIEW3D_OT_view_pan(wmOperatorType *ot)
void VIEW3D_OT_view_all(wmOperatorType *ot)
void viewzoom_modal_keymap(wmKeyConfig *keyconf)
void VIEW3D_OT_view_selected(wmOperatorType *ot)
void viewrotate_modal_keymap(wmKeyConfig *keyconf)
void VIEW3D_OT_zoom(wmOperatorType *ot)
void VIEW3D_OT_view_camera(wmOperatorType *ot)
void viewdolly_modal_keymap(wmKeyConfig *keyconf)
void VIEW3D_OT_view_center_pick(wmOperatorType *ot)
void VIEW3D_OT_view_center_cursor(wmOperatorType *ot)
void walk_modal_keymap(wmKeyConfig *keyconf)
void VIEW3D_OT_fly(wmOperatorType *ot)
void VIEW3D_OT_move(wmOperatorType *ot)
void VIEW3D_OT_smoothview(wmOperatorType *ot)
void VIEW3D_OT_dolly(wmOperatorType *ot)
void view3d_keymap(wmKeyConfig *keyconf)
static wmOperatorStatus view3d_pastebuffer_exec(bContext *C, wmOperator *op)
static void VIEW3D_OT_pastebuffer(wmOperatorType *ot)
static void view3d_copybuffer_filepath_get(char filepath[FILE_MAX], size_t filepath_maxncpy)
Definition view3d_ops.cc:43
static void VIEW3D_OT_copybuffer(wmOperatorType *ot)
Definition view3d_ops.cc:86
void view3d_operatortypes()
static wmOperatorStatus view3d_copybuffer_exec(bContext *C, wmOperator *op)
Definition view3d_ops.cc:54
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4226
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition wm_keymap.cc:893
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
uint8_t flag
Definition wm_window.cc:139