Commit: 8c8a5a6dc4a958732fc5035fcf073879bb871e22
Author: Jonathan deWerd
Date:   Sun Jun 22 05:33:45 2014 -0400
https://developer.blender.org/rB8c8a5a6dc4a958732fc5035fcf073879bb871e22

Added 3dm import code for curves and untrimmed surfaces. Debugged issue with 
homogeneous coordinate differences between Rhino, Blender.

===================================================================

M       extern/opennurbs/opennurbs_brep.h
M       source/blender/editors/io/CMakeLists.txt
M       source/blender/editors/io/io_ops.c
D       source/blender/editors/io/io_rhino.cpp
D       source/blender/editors/io/io_rhino.h
A       source/blender/editors/io/io_rhino_export.cpp
A       source/blender/editors/io/io_rhino_export.h
A       source/blender/editors/io/io_rhino_import.cpp
A       source/blender/editors/io/io_rhino_import.h

===================================================================

diff --git a/extern/opennurbs/opennurbs_brep.h 
b/extern/opennurbs/opennurbs_brep.h
index 5bda4bc..5205b3a 100755
--- a/extern/opennurbs/opennurbs_brep.h
+++ b/extern/opennurbs/opennurbs_brep.h
@@ -1567,7 +1567,7 @@ private:
   ON_Brep* m_brep;
 };
 
-class ON_CLASS ON_Brep : public ON_Geometry 
+class ON_CLASS ON_Brep : public ON_Geometry
 {
   ON_OBJECT_DECLARE(ON_Brep);
 
diff --git a/source/blender/editors/io/CMakeLists.txt 
b/source/blender/editors/io/CMakeLists.txt
index 0811046..ede5bfc 100644
--- a/source/blender/editors/io/CMakeLists.txt
+++ b/source/blender/editors/io/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
        ../../windowmanager
        ../../collada
        ../../../../extern/opennurbs
+       ../../../../intern/guardedalloc
 )
 
 set(INC_SYS
@@ -36,11 +37,13 @@ set(INC_SYS
 )
 
 set(SRC
-       io_rhino.cpp
+       io_rhino_export.cpp
+       io_rhino_import.cpp
        io_collada.c
        io_ops.c
 
-       io_rhino.h
+       io_rhino_export.h
+       io_rhino_import.h
        io_collada.h
        io_ops.h
 )
diff --git a/source/blender/editors/io/io_ops.c 
b/source/blender/editors/io/io_ops.c
index 355c4cc..226ce68 100644
--- a/source/blender/editors/io/io_ops.c
+++ b/source/blender/editors/io/io_ops.c
@@ -30,7 +30,8 @@
 
 
 #include "io_collada.h"
-#include "io_rhino.h"
+#include "io_rhino_import.h"
+#include "io_rhino_export.h"
 
 #include "BLI_utildefines.h"
 
diff --git a/source/blender/editors/io/io_rhino.cpp 
b/source/blender/editors/io/io_rhino_export.cpp
similarity index 72%
rename from source/blender/editors/io/io_rhino.cpp
rename to source/blender/editors/io/io_rhino_export.cpp
index 99bda67..647dc51 100644
--- a/source/blender/editors/io/io_rhino.cpp
+++ b/source/blender/editors/io/io_rhino_export.cpp
@@ -46,23 +46,7 @@ extern "C" {
        // #include "BLI_utildefines.h"
        bool BLI_replace_extension(char *path, size_t maxlen, const char *ext);
 
-       #include "io_rhino.h"
-}
-
-static int rhino_import(bContext *C, wmOperator *op) {
-       char filename[FILE_MAX];
-       FILE *f;
-
-       if (!RNA_struct_property_is_set(op->ptr, "filepath")) {
-               BKE_report(op->reports, RPT_ERROR, "No filename given");
-               return OPERATOR_CANCELLED;
-       }
-       RNA_string_get(op->ptr, "filepath", filename);
-
-       f = ON::OpenFile(filename, "rb");
-       ON::CloseFile(f);
-
-       return OPERATOR_FINISHED; //OPERATOR_CANCELLED
+       #include "io_rhino_export.h"
 }
 
 static int rhino_export(bContext *C, wmOperator *op) {
@@ -84,7 +68,7 @@ static int rhino_export(bContext *C, wmOperator *op) {
 
 /*--- Operator Registration ---*/
 
-static int wm_rhino_export_invoke(bContext *C, wmOperator *op, const wmEvent 
*UNUSED(event))
+int wm_rhino_export_invoke(bContext *C, wmOperator *op, const struct wmEvent 
*evt)
 {
        if (!RNA_struct_property_is_set(op->ptr, "filepath")) {
                char filepath[FILE_MAX];
@@ -125,21 +109,3 @@ void WM_OT_rhino_export(struct wmOperatorType *ot) {
        WM_operator_properties_filesel(ot, FOLDERFILE, FILE_BLENDER, FILE_SAVE,
                                       WM_FILESEL_FILEPATH, 
FILE_DEFAULTDISPLAY);
 }
-
-void WM_OT_rhino_import(struct wmOperatorType *ot) {
-       ot->name = "Import Rhino 3DM";
-       ot->description = "Load a Rhino-compatible .3dm file";
-       ot->idname = "WM_OT_rhino_import";
-       
-       ot->invoke = WM_operator_filesel;
-       ot->exec = rhino_import;
-       ot->poll = WM_operator_winactive;
-       
-       RNA_def_string(ot->srna, "filter_glob", "*.3dm", 16,
-                                 "Glob Filter", "Rhino Extension Glob Filter");
-       RNA_def_string(ot->srna, "filename_ext", ".3dm", 16,
-                                 "Rhino File Extension", "Rhino File 
Extension");
-       
-       WM_operator_properties_filesel(ot, FOLDERFILE , FILE_BLENDER, 
FILE_OPENFILE,
-                                      WM_FILESEL_FILEPATH, 
FILE_DEFAULTDISPLAY);
-}
diff --git a/source/blender/editors/io/io_rhino.h 
b/source/blender/editors/io/io_rhino_export.h
similarity index 80%
copy from source/blender/editors/io/io_rhino.h
copy to source/blender/editors/io/io_rhino_export.h
index 4d0c2fb..fbdf8f6 100644
--- a/source/blender/editors/io/io_rhino.h
+++ b/source/blender/editors/io/io_rhino_export.h
@@ -24,12 +24,17 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-#ifndef __IO_RHINO_H__
-#define __IO_RHINO_H__
+#ifndef __IO_RHINO_EXPORT_H__
+#define __IO_RHINO_EXPORT_H__
+
+#include "BKE_context.h"
 
 struct wmOperatorType;
+struct wmOperator;
+struct wmEvent;
+typedef struct wmOperator wmOperator;
 
 void WM_OT_rhino_export(struct wmOperatorType *ot);
-void WM_OT_rhino_import(struct wmOperatorType *ot);
+int wm_rhino_export_invoke(bContext *C, wmOperator *op, const struct wmEvent 
*evt);
 
 #endif
diff --git a/source/blender/editors/io/io_rhino_import.cpp 
b/source/blender/editors/io/io_rhino_import.cpp
new file mode 100644
index 0000000..a4e1a20
--- /dev/null
+++ b/source/blender/editors/io/io_rhino_import.cpp
@@ -0,0 +1,842 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * 
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include "opennurbs.h"
+#include <cstdio>
+#include <cstdlib>
+#include <vector>
+
+extern "C" {
+       #include "DNA_scene_types.h"
+       #include "BLF_translation.h"
+       #include "BLI_listbase.h"
+       #include "BKE_context.h"
+       #include "BKE_global.h"
+       #include "BKE_main.h"
+       #include "BKE_report.h"
+       #include "BKE_editmesh.h"
+       #include "BKE_library.h"
+       #include "BKE_curve.h"
+       #include "bmesh.h"
+       #include "ED_screen.h"
+       #include "ED_object.h"
+       #include "ED_util.h"
+       #include "ED_curve.h"
+       #include "RNA_access.h"
+       #include "RNA_define.h"
+       #include "DNA_object_types.h"
+       #include "DNA_curve_types.h"
+       #include "UI_interface.h"
+       #include "UI_resources.h"
+       #include "WM_api.h"
+       #include "WM_types.h"
+       #include "MEM_guardedalloc.h"
+       // BLI's lzma definitions don't play ball with opennurbs's zlib 
definitions
+       // #include "BLI_blenlib.h"
+       // #include "BLI_utildefines.h"
+       bool BLI_replace_extension(char *path, size_t maxlen, const char *ext);
+
+       #include "io_rhino_import.h"
+}
+
+/* Converts an openNURBS widestring (UTF-16) under memory management by ON
+ * into a char* to a malloc'd UTF-8 string. */
+static char *import_ON_str(ON_wString& onstr) {
+       const wchar_t *curve_name_unmanaged = onstr;
+       if (!curve_name_unmanaged) return NULL;
+       size_t sz = wcslen(curve_name_unmanaged)*sizeof(wchar_t);
+       char *ret = (char*)malloc(sz);
+       wcstombs(ret, curve_name_unmanaged, sz);
+       return ret;
+}
+static void import_ON_str(char *dest, ON_wString& onstr, size_t n) {
+       const wchar_t *curve_name_unmanaged = onstr;
+       if (!curve_name_unmanaged) {
+               *dest = '\0';
+               return;
+       }
+       wcstombs(dest, curve_name_unmanaged, n);
+}
+
+/****************************** Curve Import *********************************/
+static float null_loc[] = {0,0,0};
+static float null_rot[] = {0,0,0};
+static void rhino_import_curve(bContext *C,
+                                                          ON_Curve *curve,
+                                                          ON_Object *Object,
+                                                          
ON_3dmObjectAttributes *Attributes,
+                                                          bool newobj=true,
+                                                          bool 
cast_lines_to_nurbs=false);
+static void rhino_import_mesh(bContext *C,
+                                                         ON_Mesh *curve,
+                                                         ON_Object *Object,
+                                                         
ON_3dmObjectAttributes *Attributes,
+                                                         bool newobj=true);
+static void rhino_import_surface(bContext *C,
+                                                                ON_Surface 
*surf,
+                                                                ON_Object *obj,
+                                                                
ON_3dmObjectAttributes *attrs,
+                                                                bool 
newobj=true);
+
+// !!!!!!########$$$$$$$ todo $$$$$$#########!!!!!!!!!
+// Wrap with curve object creation code
+static void rhino_import_polycurve(bContext *C, ON_PolyCurve *pc, ON_Object 
*obj, ON_3dmObjectAttributes *attrs, bool newobj) {
+       char curve_name[MAX_ID_NAME];
+       import_ON_str(curve_name,attrs->m_name,MAX_ID_NAME);
+       
+       // Create NURBS object in editmode
+       BLI_assert(false);
+       
+       const ON_SimpleArray<ON_Curve*> &curves = pc->SegmentCurves();
+       int num_curves = curves.Count();
+       for (int i=0; i<num_curves; i++) {
+               ON_Curve *curve = *curves.At(i);
+               rhino_import_curve(C, curve, obj, attrs, false, true);
+       }
+       
+       // Leave NURBS object editmode
+       printf("polycurve done\n");
+}
+
+static void rhino_import_nurbscurve(bContext *C, ON_NurbsCurve *nc, ON_Object 
*obj, ON_3dmObjectAttributes *attrs, bool newobj) {
+       char curve_name[MAX_ID_NAME];
+       int layer,i;
+       Object *obedit;
+       Curve *cu;
+       Nurb *nu = NULL;
+       ListBase *editnurb;
+       BPoint *bp;
+       int on_dim;
+       double *on_dat;
+       bool is_rational;
+       
+       obedit = CTX_data_edit_object(C);
+       layer = attrs->m_layer_index;
+       if (newobj) {
+               import_ON_str(curve_name,attrs->m_name,MAX_ID_NAME);
+               if (layer==0) layer = 1;
+               //Exit editmode if we're in it
+               if (obedit) {
+                       ED_object_editmode_load(obedit);
+                       BLI_assert(!CTX_data_edit_object(C));
+               }
+               obedit = ED_object_add_type(C, OB_CURVE, null_loc, null_rot, 
true, layer);
+               rename_id((ID *)obedit, curve_name);
+               rename_id((ID *)obedit->data, curve_name);
+               cu = (Curve*)obedit->data;
+               cu->resolu = 15;
+               cu->resolv = 1;
+       } else {
+               cu = (Curve*)obedit->data;
+       }
+       
+       nu = (Nurb *)MEM_callocN(sizeof(Nurb), "rhino_imported_NURBS_curve");
+       nu->flag = CU_3D;
+       nu->type = CU_NURBS;
+       nu->resolu = cu->resolu;
+       nu->resolv = cu->resolv;
+       nu->pntsu = nc->CVCount();
+       nu->pntsv = 1;
+       nu->orderu = nc->Order();
+       nu->orderv = 1;
+       if (nc->IsPeriodic())
+               nu->flagu = CU_NURB_CYCLIC;
+       if (nc->IsClamped())
+               nu->flagu = CU_NURB_ENDPOINT;
+       BLI_assert(nu->pntsu + nu->orderu - 2 == nc->KnotCount());
+       bp = nu->bp = (BPoint *)MEM_callocN(sizeof(BPoint) * ((nu->pntsu) * 1), 
"rhino_imported_NURBS_curve_points");
+       nu->knotsu = (float *)MEM_callocN(siz

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to