How can I parent objects so that only position and not scale is applied to the children when scaling the parent? I've got this fairly complex setup of a tom-tom drum here. My goal is to be able to scale the drum to different sizes and have the models around it scale and move into position as required, so that a simple scale operation gives me different sizes of drum that don't look out of proportion.
Here is the main body of the drum (called a drum shell in real life). It is parented to an empty plain axes which is positioned at the centre of the drum itself. The body of the drum and the plain axes have their origin points at the centre of the drum too.

And the following is one of the drum lugs on the outside of the drum shell.

There is just one object here, but it is duplicated using an array and a mirror modifier. The array modifier creates the duplicates around the body of the drum, and the mirror modifier creates a duplicate set of those for the bottom of the drum. This way I can model a single lug and place it around the drum multiple times.
The lug is parented to a plain axes object (called the lug multiplier point in my scene), which is at the centre of the drum with a origin that is also at the centre of the drum. The array modifier for the lug also uses this as an object offset. This way, I can rotate this plain axes object in order to better position the lug duplicates around the drum - by dividing their count by 360 to get the Z-axis rotation value.
All of those elements are here:

The same thing happens with the lug tension rod, and the lug holes on the drum hoop, as in the following image:

Finally, I have the drum shell, drum skin, and drum hoop all parented. The hoop and skins are mirrored also, to create their relevant counterparts on the bottom of the drum.

So all of this works pretty well. I can change the number of lugs, tension rods, and hoop lug holes easily enough. I can also scale the drum and change the size of the hoop and skins along with the shell.
What I now want to do is be able to change the positions of the outer elements when scaling the drum, so that everything maintains it's proportion - the outer elements should not scale their size, they should just change position. I can't quite get this to work.
I've tried parenting the lug to the drum shell using object parenting but that just links position and scale. I've also tried parenting the lug to a vertex on the drum body. But I get a very odd result where the lug positions are completely out of whack. I think that's to do with the array modifier. I just can't figure this out.
Anyone got any advice on how to essentially shift the original lug elements across the X axis, away from it's origin point so that it maintains its distance from the outer shell? I'd like to do this based on scaling the shell if possible.
If I edit the lug in edit mode and shift the vertices manually across the X axis, then I get the repositioning behaviour I want.
You can actually parent to a vertex to achieve something like this.
I would probably parent empties to the vertices where you want to add a child object and you can then use constraints (such as 'Copy Location', 'Copy Rotation') or make that empty a parent of your child object to link your child object to there.
To achieve this, create the empty and move it to the location of the vertex. Select the empty, hold Shift and select the 'parent' object. Hit Tab to go into Edit mode (you should now be in Edit mode with both the 'parent' object and the empty selected). Select just the vertex and press Ctrl+P to Make Vertex Parent. The empty should now be linked to that vertex.
Next simply add a 'Copy Location' constraint to the 'child' object to copy the Empty's location (this is similar to parenting) and a 'Copy Rotation' to the 'child' to copy the rotation of the 'parent' object. This way it will stay at the location of the vertex but with the rotation of the parent object, ignoring all scale.
I hope this makes sense - only limited time to submit this answer. I can add more detail if this seems helpful (unless someone else wants to add a more detailed answer along similar lines).