Blender modal operator cannot insert keyframe and move object
In Blender I am using the modal operator template to move an object and record its position as a keyframe.
I am doing something like this:
import bpy
from bpy.props import IntProperty, FloatProperty
class ModalOperator(bpy.types.Operator):
"""Move an object with the mouse, example"""
bl_idname = "object.modal_operator"
bl_label = "Simple Modal Operator"
first_mouse_x = IntProperty()
first_value = FloatProperty()
current_frame = 1
endframe = bpy.data.scenes["Scene"].frame_end
def modal(self, context, event):
if event.type == 'MOUSEMOVE':
if self.current_frame < self.endframe:
delta = self.first_mouse_x - event.mouse_x
context.object.location.x = self.first_value + delta * 0.01
context.scene.frame_set(self.current_frame)
bpy.ops.anim.keyframe_insert_menu(type="Rotation")
bpy.ops.anim.keyframe_insert_menu(type="Location")
self.current_frame+=1
elif event.type == 'LEFTMOUSE':
return {'FINISHED'}
elif event.type in {'RIGHTMOUSE', 'ESC'}:
context.object.location.x = self.first_value
return {'CANCELLED'}
return {'RUNNING_MODAL'}
Happens that before it inserts all keyframes and only after you can move the cube with the mouse, for instance. I would like to move the cube and "record" its movement at the same time. Is there a solution for that?
python modal-dialog operator-keyword blender
add a comment |
In Blender I am using the modal operator template to move an object and record its position as a keyframe.
I am doing something like this:
import bpy
from bpy.props import IntProperty, FloatProperty
class ModalOperator(bpy.types.Operator):
"""Move an object with the mouse, example"""
bl_idname = "object.modal_operator"
bl_label = "Simple Modal Operator"
first_mouse_x = IntProperty()
first_value = FloatProperty()
current_frame = 1
endframe = bpy.data.scenes["Scene"].frame_end
def modal(self, context, event):
if event.type == 'MOUSEMOVE':
if self.current_frame < self.endframe:
delta = self.first_mouse_x - event.mouse_x
context.object.location.x = self.first_value + delta * 0.01
context.scene.frame_set(self.current_frame)
bpy.ops.anim.keyframe_insert_menu(type="Rotation")
bpy.ops.anim.keyframe_insert_menu(type="Location")
self.current_frame+=1
elif event.type == 'LEFTMOUSE':
return {'FINISHED'}
elif event.type in {'RIGHTMOUSE', 'ESC'}:
context.object.location.x = self.first_value
return {'CANCELLED'}
return {'RUNNING_MODAL'}
Happens that before it inserts all keyframes and only after you can move the cube with the mouse, for instance. I would like to move the cube and "record" its movement at the same time. Is there a solution for that?
python modal-dialog operator-keyword blender
add a comment |
In Blender I am using the modal operator template to move an object and record its position as a keyframe.
I am doing something like this:
import bpy
from bpy.props import IntProperty, FloatProperty
class ModalOperator(bpy.types.Operator):
"""Move an object with the mouse, example"""
bl_idname = "object.modal_operator"
bl_label = "Simple Modal Operator"
first_mouse_x = IntProperty()
first_value = FloatProperty()
current_frame = 1
endframe = bpy.data.scenes["Scene"].frame_end
def modal(self, context, event):
if event.type == 'MOUSEMOVE':
if self.current_frame < self.endframe:
delta = self.first_mouse_x - event.mouse_x
context.object.location.x = self.first_value + delta * 0.01
context.scene.frame_set(self.current_frame)
bpy.ops.anim.keyframe_insert_menu(type="Rotation")
bpy.ops.anim.keyframe_insert_menu(type="Location")
self.current_frame+=1
elif event.type == 'LEFTMOUSE':
return {'FINISHED'}
elif event.type in {'RIGHTMOUSE', 'ESC'}:
context.object.location.x = self.first_value
return {'CANCELLED'}
return {'RUNNING_MODAL'}
Happens that before it inserts all keyframes and only after you can move the cube with the mouse, for instance. I would like to move the cube and "record" its movement at the same time. Is there a solution for that?
python modal-dialog operator-keyword blender
In Blender I am using the modal operator template to move an object and record its position as a keyframe.
I am doing something like this:
import bpy
from bpy.props import IntProperty, FloatProperty
class ModalOperator(bpy.types.Operator):
"""Move an object with the mouse, example"""
bl_idname = "object.modal_operator"
bl_label = "Simple Modal Operator"
first_mouse_x = IntProperty()
first_value = FloatProperty()
current_frame = 1
endframe = bpy.data.scenes["Scene"].frame_end
def modal(self, context, event):
if event.type == 'MOUSEMOVE':
if self.current_frame < self.endframe:
delta = self.first_mouse_x - event.mouse_x
context.object.location.x = self.first_value + delta * 0.01
context.scene.frame_set(self.current_frame)
bpy.ops.anim.keyframe_insert_menu(type="Rotation")
bpy.ops.anim.keyframe_insert_menu(type="Location")
self.current_frame+=1
elif event.type == 'LEFTMOUSE':
return {'FINISHED'}
elif event.type in {'RIGHTMOUSE', 'ESC'}:
context.object.location.x = self.first_value
return {'CANCELLED'}
return {'RUNNING_MODAL'}
Happens that before it inserts all keyframes and only after you can move the cube with the mouse, for instance. I would like to move the cube and "record" its movement at the same time. Is there a solution for that?
python modal-dialog operator-keyword blender
python modal-dialog operator-keyword blender
asked Nov 15 '18 at 16:40
Paolo GambardellaPaolo Gambardella
112
112
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
The easy solution would be to enable blenders Auto Keyframing.
If you still want to get your operator working, I expect you will need to not call other operators and work with the data directly, particularly within a modal operator.
context.object.keyframe_insert('location')
context.object.keyframe_insert('rotation_euler')
Hello, thank you very much for your answer. Right now I am using blender 2.79. If I enable auto keyframing, or also with the solution you offered, I have the exact same problem. In fact, auto-keyframing works if, for instance, I grap the object with G. It doesn't if I move it by script, don't know why.
– Paolo Gambardella
Nov 16 '18 at 13:47
@PaoloGambardella I don't think you can have two modal operators running at the same time and both reacting to user input. With auto keyframing you can start playback and edit your data while frames are rolling, no script required at all.
– keltar
Nov 16 '18 at 14:02
I understand what you are saying but if I play (ALT+A) with autokeyframing on and after I activate the script, it doesn't work. And it doesn't also if I first run the script and then play.
– Paolo Gambardella
Nov 16 '18 at 14:08
@PaoloGambardella that's two separate solutions that you're mixing together. Please don't. Auto keyframing presumably does what you initially intended, there is no need for extra operator here. If that's not the case - I see two solutions, either emulating other operators inside yours (i.e. reacting to standard hotkeys, performing similar actions, etc.) or setting redraw callback and attempting to intercept things here; both will require quite large code and presumably will interfere with 'usual' workflow.
– keltar
Nov 16 '18 at 16:06
@keltar thank you for your answers. I am not mixing the two approaches, in fact I tried also to remove the calls to keyframe_insert, etc and still I cannot record anything. Now I am simply moving my object and nothing happens, even with autokeyframe insertion activated. Instead if I move my object with the Grab functionality, it works. It's like the modal operator created by me blocking the other functionality.
– Paolo Gambardella
Nov 16 '18 at 16:10
|
show 4 more comments
Ok I solved this one.
I was calling the keyframe_insert for the wrong object (anim, instead of the cube itself)
This is the proper way to insert it, for example when the object is a camera:
camera = bpy.context.scene.camera
camera.keyframe_insert(data_path='location', index=0)
camera.keyframe_insert(data_path='location', index=1)
camera.keyframe_insert(data_path='location', index=2)
camera.keyframe_insert('rotation_quaternion')
in this way the keyframes are inserted on play.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53324076%2fblender-modal-operator-cannot-insert-keyframe-and-move-object%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The easy solution would be to enable blenders Auto Keyframing.
If you still want to get your operator working, I expect you will need to not call other operators and work with the data directly, particularly within a modal operator.
context.object.keyframe_insert('location')
context.object.keyframe_insert('rotation_euler')
Hello, thank you very much for your answer. Right now I am using blender 2.79. If I enable auto keyframing, or also with the solution you offered, I have the exact same problem. In fact, auto-keyframing works if, for instance, I grap the object with G. It doesn't if I move it by script, don't know why.
– Paolo Gambardella
Nov 16 '18 at 13:47
@PaoloGambardella I don't think you can have two modal operators running at the same time and both reacting to user input. With auto keyframing you can start playback and edit your data while frames are rolling, no script required at all.
– keltar
Nov 16 '18 at 14:02
I understand what you are saying but if I play (ALT+A) with autokeyframing on and after I activate the script, it doesn't work. And it doesn't also if I first run the script and then play.
– Paolo Gambardella
Nov 16 '18 at 14:08
@PaoloGambardella that's two separate solutions that you're mixing together. Please don't. Auto keyframing presumably does what you initially intended, there is no need for extra operator here. If that's not the case - I see two solutions, either emulating other operators inside yours (i.e. reacting to standard hotkeys, performing similar actions, etc.) or setting redraw callback and attempting to intercept things here; both will require quite large code and presumably will interfere with 'usual' workflow.
– keltar
Nov 16 '18 at 16:06
@keltar thank you for your answers. I am not mixing the two approaches, in fact I tried also to remove the calls to keyframe_insert, etc and still I cannot record anything. Now I am simply moving my object and nothing happens, even with autokeyframe insertion activated. Instead if I move my object with the Grab functionality, it works. It's like the modal operator created by me blocking the other functionality.
– Paolo Gambardella
Nov 16 '18 at 16:10
|
show 4 more comments
The easy solution would be to enable blenders Auto Keyframing.
If you still want to get your operator working, I expect you will need to not call other operators and work with the data directly, particularly within a modal operator.
context.object.keyframe_insert('location')
context.object.keyframe_insert('rotation_euler')
Hello, thank you very much for your answer. Right now I am using blender 2.79. If I enable auto keyframing, or also with the solution you offered, I have the exact same problem. In fact, auto-keyframing works if, for instance, I grap the object with G. It doesn't if I move it by script, don't know why.
– Paolo Gambardella
Nov 16 '18 at 13:47
@PaoloGambardella I don't think you can have two modal operators running at the same time and both reacting to user input. With auto keyframing you can start playback and edit your data while frames are rolling, no script required at all.
– keltar
Nov 16 '18 at 14:02
I understand what you are saying but if I play (ALT+A) with autokeyframing on and after I activate the script, it doesn't work. And it doesn't also if I first run the script and then play.
– Paolo Gambardella
Nov 16 '18 at 14:08
@PaoloGambardella that's two separate solutions that you're mixing together. Please don't. Auto keyframing presumably does what you initially intended, there is no need for extra operator here. If that's not the case - I see two solutions, either emulating other operators inside yours (i.e. reacting to standard hotkeys, performing similar actions, etc.) or setting redraw callback and attempting to intercept things here; both will require quite large code and presumably will interfere with 'usual' workflow.
– keltar
Nov 16 '18 at 16:06
@keltar thank you for your answers. I am not mixing the two approaches, in fact I tried also to remove the calls to keyframe_insert, etc and still I cannot record anything. Now I am simply moving my object and nothing happens, even with autokeyframe insertion activated. Instead if I move my object with the Grab functionality, it works. It's like the modal operator created by me blocking the other functionality.
– Paolo Gambardella
Nov 16 '18 at 16:10
|
show 4 more comments
The easy solution would be to enable blenders Auto Keyframing.
If you still want to get your operator working, I expect you will need to not call other operators and work with the data directly, particularly within a modal operator.
context.object.keyframe_insert('location')
context.object.keyframe_insert('rotation_euler')
The easy solution would be to enable blenders Auto Keyframing.
If you still want to get your operator working, I expect you will need to not call other operators and work with the data directly, particularly within a modal operator.
context.object.keyframe_insert('location')
context.object.keyframe_insert('rotation_euler')
answered Nov 16 '18 at 9:30
samblersambler
4,7311816
4,7311816
Hello, thank you very much for your answer. Right now I am using blender 2.79. If I enable auto keyframing, or also with the solution you offered, I have the exact same problem. In fact, auto-keyframing works if, for instance, I grap the object with G. It doesn't if I move it by script, don't know why.
– Paolo Gambardella
Nov 16 '18 at 13:47
@PaoloGambardella I don't think you can have two modal operators running at the same time and both reacting to user input. With auto keyframing you can start playback and edit your data while frames are rolling, no script required at all.
– keltar
Nov 16 '18 at 14:02
I understand what you are saying but if I play (ALT+A) with autokeyframing on and after I activate the script, it doesn't work. And it doesn't also if I first run the script and then play.
– Paolo Gambardella
Nov 16 '18 at 14:08
@PaoloGambardella that's two separate solutions that you're mixing together. Please don't. Auto keyframing presumably does what you initially intended, there is no need for extra operator here. If that's not the case - I see two solutions, either emulating other operators inside yours (i.e. reacting to standard hotkeys, performing similar actions, etc.) or setting redraw callback and attempting to intercept things here; both will require quite large code and presumably will interfere with 'usual' workflow.
– keltar
Nov 16 '18 at 16:06
@keltar thank you for your answers. I am not mixing the two approaches, in fact I tried also to remove the calls to keyframe_insert, etc and still I cannot record anything. Now I am simply moving my object and nothing happens, even with autokeyframe insertion activated. Instead if I move my object with the Grab functionality, it works. It's like the modal operator created by me blocking the other functionality.
– Paolo Gambardella
Nov 16 '18 at 16:10
|
show 4 more comments
Hello, thank you very much for your answer. Right now I am using blender 2.79. If I enable auto keyframing, or also with the solution you offered, I have the exact same problem. In fact, auto-keyframing works if, for instance, I grap the object with G. It doesn't if I move it by script, don't know why.
– Paolo Gambardella
Nov 16 '18 at 13:47
@PaoloGambardella I don't think you can have two modal operators running at the same time and both reacting to user input. With auto keyframing you can start playback and edit your data while frames are rolling, no script required at all.
– keltar
Nov 16 '18 at 14:02
I understand what you are saying but if I play (ALT+A) with autokeyframing on and after I activate the script, it doesn't work. And it doesn't also if I first run the script and then play.
– Paolo Gambardella
Nov 16 '18 at 14:08
@PaoloGambardella that's two separate solutions that you're mixing together. Please don't. Auto keyframing presumably does what you initially intended, there is no need for extra operator here. If that's not the case - I see two solutions, either emulating other operators inside yours (i.e. reacting to standard hotkeys, performing similar actions, etc.) or setting redraw callback and attempting to intercept things here; both will require quite large code and presumably will interfere with 'usual' workflow.
– keltar
Nov 16 '18 at 16:06
@keltar thank you for your answers. I am not mixing the two approaches, in fact I tried also to remove the calls to keyframe_insert, etc and still I cannot record anything. Now I am simply moving my object and nothing happens, even with autokeyframe insertion activated. Instead if I move my object with the Grab functionality, it works. It's like the modal operator created by me blocking the other functionality.
– Paolo Gambardella
Nov 16 '18 at 16:10
Hello, thank you very much for your answer. Right now I am using blender 2.79. If I enable auto keyframing, or also with the solution you offered, I have the exact same problem. In fact, auto-keyframing works if, for instance, I grap the object with G. It doesn't if I move it by script, don't know why.
– Paolo Gambardella
Nov 16 '18 at 13:47
Hello, thank you very much for your answer. Right now I am using blender 2.79. If I enable auto keyframing, or also with the solution you offered, I have the exact same problem. In fact, auto-keyframing works if, for instance, I grap the object with G. It doesn't if I move it by script, don't know why.
– Paolo Gambardella
Nov 16 '18 at 13:47
@PaoloGambardella I don't think you can have two modal operators running at the same time and both reacting to user input. With auto keyframing you can start playback and edit your data while frames are rolling, no script required at all.
– keltar
Nov 16 '18 at 14:02
@PaoloGambardella I don't think you can have two modal operators running at the same time and both reacting to user input. With auto keyframing you can start playback and edit your data while frames are rolling, no script required at all.
– keltar
Nov 16 '18 at 14:02
I understand what you are saying but if I play (ALT+A) with autokeyframing on and after I activate the script, it doesn't work. And it doesn't also if I first run the script and then play.
– Paolo Gambardella
Nov 16 '18 at 14:08
I understand what you are saying but if I play (ALT+A) with autokeyframing on and after I activate the script, it doesn't work. And it doesn't also if I first run the script and then play.
– Paolo Gambardella
Nov 16 '18 at 14:08
@PaoloGambardella that's two separate solutions that you're mixing together. Please don't. Auto keyframing presumably does what you initially intended, there is no need for extra operator here. If that's not the case - I see two solutions, either emulating other operators inside yours (i.e. reacting to standard hotkeys, performing similar actions, etc.) or setting redraw callback and attempting to intercept things here; both will require quite large code and presumably will interfere with 'usual' workflow.
– keltar
Nov 16 '18 at 16:06
@PaoloGambardella that's two separate solutions that you're mixing together. Please don't. Auto keyframing presumably does what you initially intended, there is no need for extra operator here. If that's not the case - I see two solutions, either emulating other operators inside yours (i.e. reacting to standard hotkeys, performing similar actions, etc.) or setting redraw callback and attempting to intercept things here; both will require quite large code and presumably will interfere with 'usual' workflow.
– keltar
Nov 16 '18 at 16:06
@keltar thank you for your answers. I am not mixing the two approaches, in fact I tried also to remove the calls to keyframe_insert, etc and still I cannot record anything. Now I am simply moving my object and nothing happens, even with autokeyframe insertion activated. Instead if I move my object with the Grab functionality, it works. It's like the modal operator created by me blocking the other functionality.
– Paolo Gambardella
Nov 16 '18 at 16:10
@keltar thank you for your answers. I am not mixing the two approaches, in fact I tried also to remove the calls to keyframe_insert, etc and still I cannot record anything. Now I am simply moving my object and nothing happens, even with autokeyframe insertion activated. Instead if I move my object with the Grab functionality, it works. It's like the modal operator created by me blocking the other functionality.
– Paolo Gambardella
Nov 16 '18 at 16:10
|
show 4 more comments
Ok I solved this one.
I was calling the keyframe_insert for the wrong object (anim, instead of the cube itself)
This is the proper way to insert it, for example when the object is a camera:
camera = bpy.context.scene.camera
camera.keyframe_insert(data_path='location', index=0)
camera.keyframe_insert(data_path='location', index=1)
camera.keyframe_insert(data_path='location', index=2)
camera.keyframe_insert('rotation_quaternion')
in this way the keyframes are inserted on play.
add a comment |
Ok I solved this one.
I was calling the keyframe_insert for the wrong object (anim, instead of the cube itself)
This is the proper way to insert it, for example when the object is a camera:
camera = bpy.context.scene.camera
camera.keyframe_insert(data_path='location', index=0)
camera.keyframe_insert(data_path='location', index=1)
camera.keyframe_insert(data_path='location', index=2)
camera.keyframe_insert('rotation_quaternion')
in this way the keyframes are inserted on play.
add a comment |
Ok I solved this one.
I was calling the keyframe_insert for the wrong object (anim, instead of the cube itself)
This is the proper way to insert it, for example when the object is a camera:
camera = bpy.context.scene.camera
camera.keyframe_insert(data_path='location', index=0)
camera.keyframe_insert(data_path='location', index=1)
camera.keyframe_insert(data_path='location', index=2)
camera.keyframe_insert('rotation_quaternion')
in this way the keyframes are inserted on play.
Ok I solved this one.
I was calling the keyframe_insert for the wrong object (anim, instead of the cube itself)
This is the proper way to insert it, for example when the object is a camera:
camera = bpy.context.scene.camera
camera.keyframe_insert(data_path='location', index=0)
camera.keyframe_insert(data_path='location', index=1)
camera.keyframe_insert(data_path='location', index=2)
camera.keyframe_insert('rotation_quaternion')
in this way the keyframes are inserted on play.
answered Nov 19 '18 at 16:56
Paolo GambardellaPaolo Gambardella
112
112
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53324076%2fblender-modal-operator-cannot-insert-keyframe-and-move-object%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown