Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2007-04-07 21:35:47 +0400
committerCampbell Barton <ideasman42@gmail.com>2007-04-07 21:35:47 +0400
commit76420c2fecdd57acf4fe0440fb681cf8f46707e4 (patch)
treea2ce3b28bf0d93aa4b2e241cc36a949f364d2a82
parent4fae78f8d9e1acd55a5d068ea4f161687c8efc0c (diff)
appending libdata no longer breaks all external references.
Existing data is flagged with LIB_APPEND_TAG and all_local only has an option to only operate on un-flagged data. If you append an object thats linked to a material alredy linked in your scene, the material will not be made local. So at worst youll need to make local some of the datablocks. This is fairly simple and though my tests show it to work, do some tests on your own libraries before assuming its problem free. scripttemplate_mesh_edit wasnt updated with PyAPI changes and moved some functions into generic places.
-rw-r--r--release/scripts/bpymodules/BPyMathutils.py27
-rw-r--r--release/scripts/bpymodules/BPyMesh.py17
-rw-r--r--release/scripts/mesh_solidify.py30
-rw-r--r--release/scripts/scripttemplate_mesh_edit.py12
-rw-r--r--source/blender/blenkernel/BKE_library.h2
-rw-r--r--source/blender/blenkernel/intern/library.c11
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/makesdna/DNA_ID.h2
-rw-r--r--source/blender/python/api2_2x/Library.c4
-rw-r--r--source/blender/src/editobject.c2
-rw-r--r--source/blender/src/filesel.c23
11 files changed, 87 insertions, 44 deletions
diff --git a/release/scripts/bpymodules/BPyMathutils.py b/release/scripts/bpymodules/BPyMathutils.py
index ba15a8b8e8d..27736b4169e 100644
--- a/release/scripts/bpymodules/BPyMathutils.py
+++ b/release/scripts/bpymodules/BPyMathutils.py
@@ -210,3 +210,30 @@ def plane2mat(plane, normalize= False):
mat.resize4x4()
tmat= Blender.Mathutils.TranslationMatrix(cent)
return mat * tmat
+
+
+# Used for mesh_solidify.py and mesh_wire.py
+
+# returns a length from an angle
+# Imaging a 2d space.
+# there is a hoz line at Y1 going to inf on both X ends, never moves (LINEA)
+# down at Y0 is a unit length line point up at (angle) from X0,Y0 (LINEB)
+# This function returns the length of LINEB at the point it would intersect LINEA
+# - Use this for working out how long to make the vector - differencing it from surrounding faces,
+# import math
+from math import pi, sin, cos, sqrt
+
+def angleToLength(angle):
+ # Alredy accounted for
+ if angle < 0.000001:
+ return 1.0
+
+ angle = 2*pi*angle/360
+ x,y = cos(angle), sin(angle)
+ # print "YX", x,y
+ # 0 d is hoz to the right.
+ # 90d is vert upward.
+ fac=1/x
+ x=x*fac
+ y=y*fac
+ return sqrt((x*x)+(y*y))
diff --git a/release/scripts/bpymodules/BPyMesh.py b/release/scripts/bpymodules/BPyMesh.py
index b28ec58c84d..8cba68f012b 100644
--- a/release/scripts/bpymodules/BPyMesh.py
+++ b/release/scripts/bpymodules/BPyMesh.py
@@ -1151,6 +1151,23 @@ def pointInsideMesh(ob, pt):
return len([None for f in me.faces if ptInFaceXYBounds(f, obSpacePt) if faceIntersect(f)]) % 2
+def faceAngles(f):
+ Ang= Blender.Mathutils.AngleBetweenVecs
+ if len(f) == 3:
+ v1,v2,v3 = [v.co for v in f]
+ a1= Ang(v2-v1,v3-v1)
+ a2= Ang(v1-v2,v3-v2)
+ a3 = 180 - (a1+a2) # a3= Mathutils.AngleBetweenVecs(v2-v3,v1-v3)
+ return a1,a2,a3
+
+ else:
+ v1,v2,v3,v4 = [v.co for v in f]
+ a1= Ang(v2-v1,v4-v1)
+ a2= Ang(v1-v2,v3-v2)
+ a3= Ang(v2-v3,v4-v3)
+ a4= Ang(v3-v4,v1-v4)
+ return a1,a2,a3,a4
+
# NMesh wrapper
Vector= Blender.Mathutils.Vector
class NMesh(object):
diff --git a/release/scripts/mesh_solidify.py b/release/scripts/mesh_solidify.py
index 2e58513845c..91943db7a77 100644
--- a/release/scripts/mesh_solidify.py
+++ b/release/scripts/mesh_solidify.py
@@ -23,6 +23,8 @@ import BPyMesh
import BPyMessages
# reload(BPyMessages)
+from BPyMathutils import angleToLength
+
# python 2.3 has no reversed() iterator. this will only work on lists and tuples
try:
reversed
@@ -74,32 +76,6 @@ def copy_facedata_multilayer(me, from_faces, to_faces):
Ang= Mathutils.AngleBetweenVecs
SMALL_NUM=0.00001
-
-# returns a length from an angle
-# Imaging a 2d space.
-# there is a hoz line at Y1 going to inf on both X ends, never moves (LINEA)
-# down at Y0 is a unit length line point up at (angle) from X0,Y0 (LINEB)
-# This function returns the length of LINEB at the point it would intersect LINEA
-# - Use this for working out how long to make the vector - differencing it from surrounding faces,
-# import math
-from math import pi, sin, cos, sqrt
-
-def lengthFromAngle(angle):
- ''' # Alredy accounted for
- if angle < SMALL_NUM:
- return 1.0
- '''
- angle = 2*pi*angle/360
- x,y = cos(angle), sin(angle)
- # print "YX", x,y
- # 0 d is hoz to the right.
- # 90d is vert upward.
- fac=1/x
- x=x*fac
- y=y*fac
- return sqrt((x*x)+(y*y))
-
-
def main():
scn = bpy.scenes.active
ob = scn.objects.active
@@ -164,7 +140,7 @@ def main():
elif a < SMALL_NUM:
length+= 1
else:
- length+= lengthFromAngle(a)
+ length+= angleToLength(a)
length= length/len(vertFaces[i])
#print 'LENGTH %.6f' % length
diff --git a/release/scripts/scripttemplate_mesh_edit.py b/release/scripts/scripttemplate_mesh_edit.py
index 746f11d48ee..27607f2c69c 100644
--- a/release/scripts/scripttemplate_mesh_edit.py
+++ b/release/scripts/scripttemplate_mesh_edit.py
@@ -6,10 +6,11 @@ Group: 'ScriptTemplate'
Tooltip: 'Add a new text for editing a mesh'
"""
-from Blender import Text, Window
+from Blender import Window
+import bpy
-script_data = '''
-#!BPY
+script_data = \
+'''#!BPY
"""
Name: 'My Mesh Script'
Blender: 243
@@ -21,6 +22,7 @@ Tooltip: 'Put some useful info here'
from Blender import Scene, Mesh, Window, sys
import BPyMessages
+import bpy
def my_mesh_util(me):
# This function runs out of editmode with a mesh
@@ -53,7 +55,7 @@ def my_mesh_util(me):
def main():
# Gets the current scene, there can be many scenes in 1 blend file.
- sce = Scene.GetCurrent()
+ sce = bpy.scenes.active
# Get the active object, there can only ever be 1
# and the active object is always the editmode object.
@@ -71,7 +73,7 @@ def main():
if is_editmode: Window.EditMode(1)
Window.WaitCursor(1)
- me = ob_act.getData(mesh=1)
+ me = ob_act.getData(mesh=1) # old NMesh api is default
t = sys.time()
# Run the mesh editing function
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index f73c1b23a8a..064acf12eb5 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -62,7 +62,7 @@ void free_main(struct Main *mainvar);
void splitIDname(char *name, char *left, int *nr);
void rename_id(struct ID *id, char *name);
void test_idbutton(char *name);
-void all_local(struct Library *lib);
+void all_local(struct Library *lib, int untagged_only);
struct ID *find_id(char *type, char *name);
void clear_id_newpoins(void);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 803059ee0b4..a5a0c2bead2 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -983,7 +983,7 @@ static void lib_indirect_test_id(ID *id)
/* if lib!=NULL, only all from lib local */
-void all_local(Library *lib)
+void all_local(Library *lib, int untagged_only)
{
ListBase *lbarray[MAX_LIBARRAY], tempbase={0, 0};
ID *id, *idn;
@@ -997,7 +997,14 @@ void all_local(Library *lib)
id->newid= NULL;
idn= id->next; /* id is possibly being inserted again */
- if(id->flag & (LIB_EXTERN|LIB_INDIRECT|LIB_NEW)) {
+ /* The check on the second line (LIB_APPEND_TAG) is done so its
+ * possible to tag data you dont want to be made local, used for
+ * appending data, so any libdata alredy linked wont become local
+ * (very nasty to discover all your links are lost after appending)
+ * */
+ if(id->flag & (LIB_EXTERN|LIB_INDIRECT|LIB_NEW) &&
+ (untagged_only==0 || !(id->flag & LIB_APPEND_TAG)))
+ {
if(lib==NULL || id->lib==lib) {
id->flag &= ~(LIB_EXTERN|LIB_INDIRECT|LIB_NEW);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 6ef6f18caee..41199d243f9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -7480,7 +7480,6 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
}
}
}
- DAG_scene_sort(G.scene);
}
/* ************* READ LIBRARY ************** */
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 080d2861a19..ce03bdc5e84 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -215,6 +215,8 @@ typedef struct Library {
#define LIB_FAKEUSER 512
/* free test flag */
#define LIB_DOIT 1024
+/* */
+#define LIB_APPEND_TAG 2048
#ifdef __cplusplus
}
diff --git a/source/blender/python/api2_2x/Library.c b/source/blender/python/api2_2x/Library.c
index daccf31489e..dd7cf18cb3d 100644
--- a/source/blender/python/api2_2x/Library.c
+++ b/source/blender/python/api2_2x/Library.c
@@ -416,7 +416,7 @@ static PyObject *M_Library_Update( PyObject * self )
break;
lib = lib->id.next;
}
- all_local( lib );
+ all_local( lib, 0 );
}
Py_INCREF( Py_None );
@@ -620,7 +620,7 @@ PyObject *LibraryData_importLibData( BPy_LibraryData *self, char *name,
for( lib = G.main->library.first; lib; lib = lib->id.next )
if( strcmp( longFilename, lib->name ) == 0 ) {
if( mode != FILE_LINK ) {
- all_local( lib );
+ all_local( lib, 0 );
lib = NULL;
}
break;
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 6e1bbe61039..0a1f29c0d48 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -4449,7 +4449,7 @@ void make_local(int mode)
if(G.scene->id.lib) return;
if(mode==3) {
- all_local(NULL); /* NULL is all libs */
+ all_local(NULL, 0); /* NULL is all libs */
allqueue(REDRAWALL, 0);
return;
}
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index d2ac3115c0f..d8f1b732e19 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -2395,8 +2395,20 @@ static void do_library_append(SpaceFile *sfile)
Object *ob;
int idcode = groupname_to_code(group);
+ if((sfile->flag & FILE_LINK)==0) {
+ /* tag everything, all untagged data can be made local */
+ ID *id;
+ ListBase *lbarray[MAX_LIBARRAY];
+ int a;
+
+ a= set_listbasepointers(G.main, lbarray);
+ while(a--) {
+ for(id= lbarray[a]->first; id; id= id->next) id->flag |= LIB_APPEND_TAG;
+ }
+ }
+
BLO_library_append(sfile, dir, idcode);
-
+
/* DISPLISTS? */
ob= G.main->object.first;
while(ob) {
@@ -2413,14 +2425,15 @@ static void do_library_append(SpaceFile *sfile)
lib= lib->id.next;
}
- if(lib) {
- if((sfile->flag & FILE_LINK)==0)
- all_local(lib);
+ /* make local */
+ if(lib && (sfile->flag & FILE_LINK)==0) {
+ all_local(lib, 1);
}
+ DAG_scene_sort(G.scene);
+
/* in sfile->dir is the whole lib name */
BLI_strncpy(G.lib, sfile->dir, sizeof(G.lib) );
-
}
}