[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