[Bf-python] Got independent copy of mesh, now how to free it later?

joe joeedh at gmail.com
Tue May 26 05:40:45 CEST 2009


I think there are certain hacked cases where the mesh might be freed
(not sure, can't remember exactly).  But in general, once you create a
mesh you can't free it without saving and reloading the .blend; it's
how blender was designed.  Library datablocks (which includes meshes)
are never freed, their simply not written to disk if they aren't used.
 This was to compensate for the lack of undo (which of course we do
have now).

Joe

On Sun, May 24, 2009 at 12:34 PM,  <lynx.abraxas at freenet.de> wrote:
> If someone is interested: I got it to work with:
>
>   ellm= ell.getData(mesh=1)
>   ellmesh= ellm.__copy__() #that's the one!!!
>
> I must have overlooked this function because it starts with __. Does that mean
> it's an inherited copy constructor or  "just  use  if  you  know  what  you're
> doing"?
>
> That  way  I  can  use  the real copy to apply any transform for pointInside()
> while keeping the original as it is.
>
> I'm now wondering how to free a mesh in python? Just like this?
>
> ellmesh= None #is this the correct way to free the mesh?
>
> These don't work:
> bpy.data.meshes.unlink(ellmesh.name)
> ellmesh.unlink()
>
> Regards,
> Lynx
>
> On 21/05/09 16:09:06, joe wrote:
>> I'd suggest asking for help on blenderartists or
>> irc://irc.freenode.net/blendercoders , I'm a little too tired to give
>> good answers at the moment.  :-/
>>
>> Anyway, there should be a way of extracting the scale and rotation
>> part of a matrix (I believe the API has stuff for that) so I'd suggest
>> doing that, then creating a function that puts vertices through a
>> round-trip, first applying rot/scale based on the object matrix (don't
>> forget to zero the rot/scale fields after applying), then deapplying
>> it.  This will ensure that you have the order of transformations
>> correct.
>>
>> Joe
>>
>> On Thu, May 21, 2009 at 3:59 PM,  <lynx.abraxas at freenet.de> wrote:
>> > On 21/05/09 15:23:38, joe wrote:
>> >> What do you want?  The global positions of each vertex?  Or in
>> >> relation to the object center?
>> >
>> > I  would like the ellipsoid-obj to be translated where as their rot. and scale
>> > should be applied to the mesh. I think I got that with:
>> >
>> >   mat= B.Mathutils.Matrix([dl[6],dl[7],dl[8], 0],  [dl[9],dl[10],dl[11],  0],
>> > [dl[12],dl[13],dl[14], 0], [0,0,0,1])#octave: v' #why is this correct???
>> >   #mat=  B.Mathutils.Matrix([dl[6],dl[9],dl[12],  0],   [dl[7],dl[10],dl[13],
>> > 0], [dl[8],dl[11],dl[14], 0], [0,0,0,1])#octave: v
>> >
>> >   local_rot(ob, mat)
>> >   ob.setSize(dl[0], dl[1], dl[2])
>> >   ###ob.setLocation(dl[3], dl[4], dl[5])#transl obj and the mesh
>> >   me= ob.getData(mesh=1) #blender shows the obj. according to its matrix
>> >   me.transform(ob.matrix)#but does not apply it on the obj verts
>> >   ob.setMatrix(ob.matrix.identity())#set identity to avoid double effect
>> >   ob.setLocation(dl[3], dl[4], dl[5])#transl obj only not the mesh
>> >
>> >
>> > In the next step I want a  copy  of  an  ellipsoid  mesh  which  I  apply  the
>> > trnslation  of  the  ellipsoid  object on (just for pointInside). But the copy
>> > should not be linked to the ellipsoid object so that the mesh  of  the  object
>> > stays untouched by the translation of the (copied) mesh.
>> >
>> > All types of coping I tried some how kept a link to the original object:
>> >
>> >   ellmesh= ell.getData(mesh=1)
>> >   ellmesh= bpy.data.meshes.get(ell.getData(name_only=1,mesh=1))
>> >   ellmesh.get(ell.getData(name_only=1,mesh=1))
>> >   ellmesh= copy.copy(ell.getData(mesh=1))
>> >
>> > Is it possible?
>> > Do You know how?
>> >
>> > Thanks for Your help
>> > Lynx
>> >
>> >  To only apply the rot/scale, I believe
>> >> you can simply multiply (do this temporarily though, don't store the
>> >> result back in the mesh) with the rotation/scale matrix, which I
>> >> believe is something like:
>> >>
>> >> (matrix.rotationPart() * matrix.scalePart()) * vert_co
>> >>
>> >> . . .but I could be wrong, look it up in the docs.  It'd help if you
>> >> could give a more complete description of what your trying to do.
>> >>
>> >> Joe
>> >>
>> >> On Thu, May 21, 2009 at 11:17 AM,  <lynx.abraxas at freenet.de> wrote:
>> >> > On 20/05/09 17:33:20, joe wrote:
>> >> >> If applying rot/scale works, then it means your script isn't properly
>> >> >> taking the object matrix into account.  To calculate the final
>> >> >> transformed position of a vertex, you have to multiply it with the
>> >> >> object's matrix, like so:
>> >> >
>> >> > Is this OK too?
>> >> >
>> >> >   ellmesh= ell.getData(mesh=1)
>> >> >   ellmesh.transform(ell.matrix)  #apply any transform, just in case it wasn't done already
>> >> >   ell.setMatrix(ell.matrix.identity())
>> >> >
>> >> >
>> >> > This sadly has the unwanted side effect that the ellipsoids have their blender
>> >> > centres at the global origin.
>> >> > Without  the matrix application they have their blender centers at the centers
>> >> > of each ellipsoid.
>> >> > I created the ellipsoids by adding a UVsphere at the origin, rotating, scaling
>> >> > and displacing it:
>> >> >
>> >> >
>> >> >   me= B.Mesh.Primitives.UVsphere(segments, rings, diameter)
>> >> >
>> >> >   sc= B.Scene.GetCurrent()          # get current scene
>> >> >   #http://www.blender.org/documentation/246PythonDoc/Object-module.html
>> >> >   obn= "Ellipsoid_%0.4d" % dl[15]
>> >> >   ob= sc.objects.new(me, obn) # add a new mesh-type object to the scene
>> >> >
>> >> >   #http://www.blender.org/documentation/246PythonDoc/Object.Object-class.html
>> >> >   mat= B.Mathutils.Matrix([dl[6],dl[7],dl[8], 0],  [dl[9],dl[10],dl[11], 0], [dl[12],dl[13],dl[14], 0], [0,0,0,1])
>> >> >
>> >> >   local_rot(ob, mat)
>> >> >   ob.setSize(dl[0], dl[1], dl[2])
>> >> >   ob.setLocation(dl[3], dl[4], dl[5])
>> >> >   me= ob.getData(mesh=1) #blender shows the obj. according to its matrix
>> >> >   me.transform(ob.matrix)#but does not apply it on the obj verts
>> >> >   ob.setMatrix(ob.matrix.identity())#set identity to avoid double effect
>> >> >
>> >> >
>> >> > Why is blender showing the ellipsoids correctly where as their verts are still
>> >> > the unit sphere until I apply the matrix to the mesh?
>> >> > Can You point me to some docs explaining this behavior?
>> >> > Is there a way to apply only rot and scale to the mesh but not the translation
>> >> > at creation time?
>> >> > How  can  I  later  some  how translate the mesh (for pointInside to work) but
>> >> > leave the object as it is?
>> >> >
>> >> > Well, at least I'm slowly getting what I want;)
>> >> >
>> >> > Thanks for any help
>> >> > Lynx
>> >> > _______________________________________________
>> >> > Bf-python mailing list
>> >> > Bf-python at blender.org
>> >> > http://lists.blender.org/mailman/listinfo/bf-python
>> >> >
>> >> _______________________________________________
>> >> Bf-python mailing list
>> >> Bf-python at blender.org
>> >> http://lists.blender.org/mailman/listinfo/bf-python
>> > _______________________________________________
>> > Bf-python mailing list
>> > Bf-python at blender.org
>> > http://lists.blender.org/mailman/listinfo/bf-python
>> >
>> _______________________________________________
>> Bf-python mailing list
>> Bf-python at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-python
> _______________________________________________
> Bf-python mailing list
> Bf-python at blender.org
> http://lists.blender.org/mailman/listinfo/bf-python
>



More information about the Bf-python mailing list