Hi Hodac, dao <dao.ho...@gmail.com> wrote on 03/15/2010 06:35:39 AM:
> I am a little bit confused with those coord conversions, etc... I > suppose this is a piece of cake for you guys. Could you tell me what's wrong? There were three significant errors. The first is that your code assumed that the same local translate could be applied for each of the children. This doesn't work you need to calculate the local translate matrix for each child separately. I would suggest remembering the start point in beginMove, then in 'move' you need to current point so each "rect" can calculate it's transform. Second you need to be careful because as you change the translate on the element the elements 'screenCTM' changes as well. To get it to work you will either need to get the screenCTM of the parent of the element you want to move (an approach I often use) and then 'sandwich' the translate above the local transform (see next issue) or store the screenCTM at the start of the move for use during each move update. Third you used translate.concatenate but you needed to use translate.preConcatenate. The way your code currently is you want the resultant matrix to be the same as translating a point by 'translate' and then by the pre-existing transform (remember transforms are from child coordiate system to parent). This is a little tricky however because if you use the parent's getScreenCTM to calculate the translate then translate.concatenate would be the correct method to use (you want the point to be mapped by the elements local transform, then translated in the parent's coordinate system). I should also comment that what you are attempting is the most complex version of this. Typically you have a fair amount of control over the documents you need to interactively manipulate (especially complex manipulations like this). So I will typically simplify things so I don't need to deal with all the complexities you are dealing with. For example I'll ensure that the element I will be manipulating the transform on has no transform initially. If I need to move multiple objects I'll move them into a group and move the group (which means that all the objects I'll need to move can't have parents with different transforms). > I can see that my solution does not work (as Thomas said) but the > code of Jonathan does not work neither[...]. That code was good but it's not the complete answer for really complex use cases.