Blender  V3.3
io_stl_ops.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #ifdef WITH_IO_STL
8 
9 # include "BKE_context.h"
10 # include "BKE_report.h"
11 
12 # include "WM_api.h"
13 # include "WM_types.h"
14 
15 # include "DNA_space_types.h"
16 
17 # include "ED_outliner.h"
18 
19 # include "RNA_access.h"
20 # include "RNA_define.h"
21 
22 # include "IO_stl.h"
23 # include "io_stl_ops.h"
24 
25 static int wm_stl_import_invoke(bContext *C, wmOperator *op, const wmEvent *event)
26 {
27  return WM_operator_filesel(C, op, event);
28 }
29 
30 static int wm_stl_import_execute(bContext *C, wmOperator *op)
31 {
32  struct STLImportParams params;
33  params.forward_axis = RNA_enum_get(op->ptr, "forward_axis");
34  params.up_axis = RNA_enum_get(op->ptr, "up_axis");
35  params.use_facet_normal = RNA_boolean_get(op->ptr, "use_facet_normal");
36  params.use_scene_unit = RNA_boolean_get(op->ptr, "use_scene_unit");
37  params.global_scale = RNA_float_get(op->ptr, "global_scale");
38  params.use_mesh_validate = RNA_boolean_get(op->ptr, "use_mesh_validate");
39 
40  int files_len = RNA_collection_length(op->ptr, "files");
41 
42  if (files_len) {
43  PointerRNA fileptr;
44  PropertyRNA *prop;
45  char dir_only[FILE_MAX], file_only[FILE_MAX];
46 
47  RNA_string_get(op->ptr, "directory", dir_only);
48  prop = RNA_struct_find_property(op->ptr, "files");
49  for (int i = 0; i < files_len; i++) {
50  RNA_property_collection_lookup_int(op->ptr, prop, i, &fileptr);
51  RNA_string_get(&fileptr, "name", file_only);
52  BLI_join_dirfile(params.filepath, sizeof(params.filepath), dir_only, file_only);
53  STL_import(C, &params);
54  }
55  }
56  else if (RNA_struct_property_is_set_ex(op->ptr, "filepath", false)) {
57  RNA_string_get(op->ptr, "filepath", params.filepath);
58  STL_import(C, &params);
59  }
60  else {
61  BKE_report(op->reports, RPT_ERROR, "No filename given");
62  return OPERATOR_CANCELLED;
63  }
64 
70 
71  return OPERATOR_FINISHED;
72 }
73 
74 static bool wm_stl_import_check(bContext *UNUSED(C), wmOperator *op)
75 {
76  const int num_axes = 3;
77  /* Both forward and up axes cannot be the same (or same except opposite sign). */
78  if (RNA_enum_get(op->ptr, "forward_axis") % num_axes ==
79  (RNA_enum_get(op->ptr, "up_axis") % num_axes)) {
80  RNA_enum_set(op->ptr, "up_axis", RNA_enum_get(op->ptr, "up_axis") % num_axes + 1);
81  return true;
82  }
83  return false;
84 }
85 
87 {
88  PropertyRNA *prop;
89 
90  ot->name = "Import STL";
91  ot->description = "Import an STL file as an object";
92  ot->idname = "WM_OT_stl_import";
93 
94  ot->invoke = wm_stl_import_invoke;
95  ot->exec = wm_stl_import_execute;
97  ot->check = wm_stl_import_check;
99 
102  FILE_BLENDER,
108 
109  RNA_def_float(ot->srna, "global_scale", 1.0f, 1e-6f, 1e6f, "Scale", "", 0.001f, 1000.0f);
111  "use_scene_unit",
112  false,
113  "Scene Unit",
114  "Apply current scene's unit (as defined by unit scale) to imported data");
116  "use_facet_normal",
117  false,
118  "Facet Normals",
119  "Use (import) facet normals (note that this will still give flat shading)");
120  RNA_def_enum(ot->srna, "forward_axis", io_transform_axis, IO_AXIS_Y, "Forward Axis", "");
121  RNA_def_enum(ot->srna, "up_axis", io_transform_axis, IO_AXIS_Z, "Up Axis", "");
123  "use_mesh_validate",
124  false,
125  "Validate Mesh",
126  "Validate and correct imported mesh (slow)");
127 
128  /* Only show .stl files by default. */
129  prop = RNA_def_string(ot->srna, "filter_glob", "*.stl", 0, "Extension Filter", "");
131 }
132 
133 #endif /* WITH_IO_STL */
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition: report.c:83
#define FILE_MAX
void BLI_join_dirfile(char *__restrict dst, size_t maxlen, const char *__restrict dir, const char *__restrict file) ATTR_NONNULL()
Definition: path_util.c:1531
#define UNUSED(x)
@ FILE_SORT_DEFAULT
@ FILE_BLENDER
@ FILE_TYPE_FOLDER
@ FILE_DEFAULTDISPLAY
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
void ED_outliner_select_sync_from_object_tag(struct bContext *C)
@ IO_AXIS_Y
Definition: IO_orientation.h:9
@ IO_AXIS_Z
void STL_import(bContext *C, const struct STLImportParams *import_params)
Definition: IO_stl.cc:12
@ PROP_HIDDEN
Definition: RNA_types.h:216
#define C
Definition: RandGen.cpp:25
@ WM_FILESEL_FILES
Definition: WM_api.h:756
@ WM_FILESEL_DIRECTORY
Definition: WM_api.h:753
@ WM_FILESEL_SHOW_PROPS
Definition: WM_api.h:758
@ WM_FILESEL_FILEPATH
Definition: WM_api.h:755
@ FILE_OPENFILE
Definition: WM_api.h:764
@ OPTYPE_UNDO
Definition: WM_types.h:148
@ OPTYPE_REGISTER
Definition: WM_types.h:146
#define ND_OB_ACTIVE
Definition: WM_types.h:388
#define ND_OB_SELECT
Definition: WM_types.h:390
#define NC_SCENE
Definition: WM_types.h:328
#define ND_LAYER_CONTENT
Definition: WM_types.h:402
Scene scene
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void WM_OT_stl_import(struct wmOperatorType *ot)
const EnumPropertyItem io_transform_axis[]
Definition: orientation.c:7
int RNA_collection_length(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5239
bool RNA_struct_property_is_set_ex(PointerRNA *ptr, const char *identifier, bool use_ghost)
Definition: rna_access.c:5289
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:717
int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
Definition: rna_access.c:4097
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
Definition: rna_access.c:5116
float RNA_float_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4957
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4863
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:5015
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
Definition: rna_define.c:3836
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3493
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3687
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
Definition: rna_define.c:1490
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3783
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:919
const char * name
Definition: WM_types.h:888
const char * idname
Definition: WM_types.h:890
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:943
struct StructRNA * srna
Definition: WM_types.h:969
const char * description
Definition: WM_types.h:893
bool(* check)(struct bContext *, struct wmOperator *)
Definition: WM_types.h:911
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:903
struct ReportList * reports
struct PointerRNA * ptr
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition: wm_files.c:3479
void WM_operator_properties_filesel(wmOperatorType *ot, const int filter, const short type, const eFileSel_Action action, const eFileSel_Flag flag, const short display, const short sort)
bool WM_operator_winactive(bContext *C)
int WM_operator_filesel(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))