[Drawkit] DKTextShape rotation
Allan
allandaly at me.com
Fri Feb 13 07:59:01 PST 2009
Hi Graham,
The setOffset method did exactly what I needed and made everything
easy. Worked like a charm.
I haven't used the debugging method you wrote about yet, but it looks
useful.
Thanks.
-Allan
On Feb 12, 2009, at 3:39 PM, Graham Cox wrote:
>
> On 13 Feb 2009, at 4:57 am, Allan wrote:
>
>> Hi Graham,
>>
>> I'm still working on implementing the TEXT entity import from the
>> DXF format into DK. It has been a tougher nut to crack than I
>> expected. Here's my current issue that I wonder if you could
>> comment on.
>>
>> In AutoCAD (and the resulting DXF) when TEXT is rotated it is not
>> necessarily rotated around the center point. AutoCAD uses the
>> concept of an "insertion point" which is the origin or base point
>> of the TEXT object. If you rotate text, it gets rotated with
>> respect to this insertion point.
>>
>> I think that in DK all DrawableObject rotations happen around the
>> object center/middle point. Is that correct? If so, for me to place
>> a rotated text object correctly would require me to do some math
>> where I would use the AutoCAD insertion point and the rotation
>> angle with some sines and cosines to figure out the correct DK
>> origin and then apply the rotation.
>>
>> Is that right? All DK objects are rotated around the center/middle?
>> Or is there a clever DK method to modify the rotation point for an
>> object that I could use to more directly get the TEXT object
>> located correctly?
>>
>> Thanks for any help you can send.
>
>
> Hi Allan,
>
> All shapes (including text shapes) allow you to set the 'point of
> rotation' anywhere within the bounds of the shape. By default it's
> the middle, but you can move it anywhere.
>
> In the UI an ordinary shape uses a centre target cross to show where
> this is, and you can click and drag this to set the centre. In a
> text shape, this knob is turned off so that it doesn't get in the
> way of reading the text, and as a result it's not draggable. That
> doesn't prevent you from setting it programatically, and/or you can
> turn the visibility of that knob back on if you want to make it
> interactive.
>
> To set it programmatically, use -setOffset:
>
> This accepts a NSSize argument that is the relative amount of
> displacement from the centre to the unrotated bounds edge. That
> sounds complicated but it's easy to understand with an example. An
> offset of {0,0} is the centre. An offset of {-0.5, -0.5} is the top,
> left (or bottom, left in unflipped coordinates) of the object, and
> offset = {0.5, 0.5} is the bottom right. Specifying the offset this
> way makes it always proportional to the current size of the object
> so rotation does the expected thing.
>
> If you want to make the knob for this visible in a text object, in
> the current version you'll need to change the mask returned by
> +knobMask, which is hardcoding the clearing of the
> kDKDrawableShapeOriginTarget flag. I need to change that to use the
> more recent approach of using +setKnobMask so you can simply set it
> as you wish.
>
> When you're placing text objects programmatically, if you set the
> offset prior to setting the location and angle of the object, you
> should be able to simply place the object without having to do any
> maths - the offset also sets the position that the object considers
> its location to be measured from, so for example if you set the
> offset to the bottom, left of the text, and that's where the DXF
> file considers its text labels to be located, then you can just call
> -setLocation: with the same value (and angle). When the offset is
> changed interactively the location is compensated so the object
> doesn't move within the drawing, but the actual value of -location
> is changing. Hope that makes sense. Rather than 'point of rotation'
> think of the offset as setting the object's datum. The location and
> rotation are relative to this datum point.
>
> Also, while we're on this topic, here's a handy debugging or
> introspection technique that can sometimes be useful to "see" what's
> happening to certain values as you interact with objects, such as
> dragging them or their control knobs. Create a text adornment style
> and set its identifier to '$<keypath>', where <keypath> is some
> property of interest, let's say 'offset'. Then the object that has
> this style attached will display the value of that property right
> there in the object, and it will be updated live whenever it
> changes. The '$' prefix is there to tell the adornment to look up
> the value as a property not as a metadata key. After that it's just
> using KVC.
>
> --Graham
>
>
>
>
> _______________________________________________
> Drawkit mailing list
> Drawkit at lists.apptree.net
> http://lists.apptree.net/listinfo.cgi/drawkit-apptree.net
More information about the Drawkit
mailing list