Programmatically Flip/Rotate Simulink Block

Hi,
I'd like to programmatically rotate/flip a simulink block - arbitrarily. Unfortunately, the 'orientation' property
seems to support specific orientations, only. Thus, no combination of e.g. 'y-mirror' and 90° clockwise rotation
seems to be possible.
Certainly, Simulink supports that via the 'Format' menue but I did not find an accessible block property for this.
Is there a way to access the 'Format/Flip Block' menu of Simulink via Matlab? I did not find a matching property in the slx model, but maybe I overlooked a possibility. Also, I was not able to send key commands to Simulink.
Any suggestions?
Many thanks in advance!

 Accepted Answer

Timo Dietz
Timo Dietz on 25 Jan 2023
Edited: Timo Dietz on 25 Jan 2023
I finally made it with the help of:
I activate Simulink, select the block to be manipulated and then send kesytrokes for rotating and flipping it.
Not he most elegant approach but it works for me.
Have a nice day!

3 Comments

Hi,
Can you give the commands you used to send keystrokes to the Simulink model?
The code in the link uses 'h.SendKeys()' where h is defined by an actxserver() command, but model.SendKeys() does not work where model is a Simulink model:
Dot indexing is not supported for variables of this type.
Thanks
In fact it works with an open Simulink window, as in the linked example:
% where the block to be rotated is selected in the GUI
h = actxserver('WScript.Shell');
h.AppActivate('Simulink');
h.SendKeys('^r');
But the block to be rotated must be selected by a mouse click, so it is not a programmatic method that can be used to arrange a model without manual intervention. Setting gcb to the block of interest, as in this answer:
set_param(model, 'CurrentBlock', 'blockName');
does not have the same effect as clicking the block in the GUI.
What I'm actually doing is the following:
actX = actxserver('WScript.Shell');
newBlock = add_block([libraryBlock], [modelName], 'MakeNameUnique','on');
blockObj = get_param(newBlock, 'Object');
blockObj.Selected = 'on';
Now, the block is selected and its orientation can be changed w/o manual intervention, using ACTX as well as blockObj.Orientation:
blockObj.Orientation = 'up';
actX.AppActivate('Simulink'); % focus on Simulink
actX.SendKeys('^i'); % flip vertically

Sign in to comment.

More Answers (2)

Jean Matthieu
Jean Matthieu on 24 Jan 2023
Edited: Jean Matthieu on 24 Jan 2023
Hi
set_param(gcb, 'Orientation', 'left')
--> Other keywords are up, right, down
Is that what you're looking for?

1 Comment

Thanks for your answer. Unfortunately, these orientation properties do not suffice since they do not cover all possible variations of rotating and mirroring.

Sign in to comment.

Hi,
a solution to this problem would be:
newBlock= add_block([libraryBlock], [modelName], 'MakeNameUnique', 'on', 'Position', pos);
set_param(newBlock, 'Orientation', 'down') % Orientation
set_param(newBlock, 'BlockMirror', 'on') % invert
set_param(newBlock, 'BlockRotation', 90) % rotate
I hope it helps ;)

Categories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!