Considering that this old post still doesn’t have an answer, I’m afraid the answer to this question may be “sorry, Rhino can’t do that”.
But I’ll ask anyway.
The attached video shows the workflow I would like to have in Rhino.
The video was recorded in ThinkDesign, and I cut out some parts to keep it short and focused on the specific behavior I’m interested in:
0:00 - The Move Faces command shifts a face while adjusting all the faces trimmed by that face.
0:09 - The same command rotates the same face.
0:15 - Individual faces are dragged to show how they were trimmed. (To drag the individual faces I had to explode the solid into surfaces, but I trimmed that part out of the video.)
0:23 - Similar move as the first step, but a little farther. This time the shifted face also trims the top of the cylinder, which was not trimmed by that face before.
0:40 - The same command moves the face back where it was. Here the cylindrical face is untrimmed and retrimmed, changing from a small arc of a cylinder into a full 360-degree chunk. The top of the cylinder is no longer trimmed by the moved face, so it becomes trimmed only by the cylindrical face, which after being extended fully trims it.
In ThinkDesign I can do this parametrically, where the topology at the start of each command doesn’t matter too much. But I can also do it with static solids like this one, where the command doesn’t know that the small cylinder segment was originally created from an arc.
ThinkDesign finds the underlying surface, untrims it, extends/retrims it, and then also does the extra work of managing faces that were not originally trimmed by the face being edited.
I would like to know whether this kind of workflow is possible in Rhino, either through UI commands or through APIs, so I can build my own helper commands for some advanced editing.
Specifically:
- Is there a Rhino command that can move or rotate a face while preserving the shape of the face being edited and the adjacent faces?
- Can that command trim faces that were not originally touching the face being transformed, like at
0:23?
- Can that command untrim some faces and retrim them with other faces, like at
0:40?
- Can this be done with multiple faces, like in the snapshots below?
So far, the closest thing I found is PushPull with Mode=Extend.
That helps in some cases, but it still doesn’t cover the workflow I’m looking for, because:
- it does not allow me to rotate the selected face
- it does not manage topological changes (or only simple cases)
- in Rhino 8 it does not allow me to select multiple faces
- in Rhino 9 WIP, multi-face
PushPull doesn’t really transform the selected faces. It is designed for something different: each face is offset by the same amount, rather than all faces getting the same transformation.
I tried the multi-face PushPull in WIP, but in every test I did, it says:
PushPull extension mode is not supported on this face. Reverting to extrude.
So, at least for what I’m trying to do, it is unusable.
Are there other commands or plugins that I am missing?
Since there does not appear to be an existing solution for this workflow, I have started developing a command that attempts to do it.
The implementation is still very rough and currently handles only a limited number of cases where edges disappear. However, it is already a useful starting point for my particular use case.
I frequently need to make small translations or rotations of planar faces, and those relatively simple cases seem to work reasonably well.
What is still missing is the ability to define a transformation by saying, essentially, “move or rotate from here to there.”
The current implementation allows me to click a gumball arrow or rotation arc and enter a numerical distance or angle. The resulting relative transformation is correct. However, I cannot first relocate or reorient the gumball to define the starting position and orientation, and then specify the destination position or orientation.
The main difficulty is therefore the gumball interaction. I would like the custom gumball to support the same kinds of operations available with Rhino’s native gumball:
- Relocate the complete gumball origin, either by double-clicking as with the native gumball or by using Ctrl+drag, as shown in some RhinoCommon examples.
- Relocate the gumball along only one of its X, Y, or Z axes.
- Realign the gumball, for example by selecting an axis or rotation arc and then selecting a line whose direction should be matched.
- Drag a translation handle freely in the view when no snap is active, or snap it to any available object snap, just like the native gumball.
- Initialize the gumball orientation using the same alignment modes as the native gumball: CPlane, Object, World, or View.
- Continue supporting numerical input for translation distances and rotation angles.
Is there an example plugin, sample project, or RhinoCommon implementation that demonstrates these behaviors with a custom gumball?