[Pharo-dev] Coordinates problem with Athens and Morphic while coding Hyperion

kilon alios kilon.alios at gmail.com
Thu Nov 28 05:49:10 EST 2013


Ok I have verified and indeed its not an Athens problem. My bad. The
position of the morph is reported at 5 at 30 and the not the correct 0 at 0. So
it looks like Morphic for some strange reason it offsets it.

I knew about translateBy but I did not know about restoreAfter. so thank
you.

I prefer my version of the code because it makes clearer what I am trying
to do. However ideally because I am drawing a box inside another box the
best way would be to follow your approach and scale the second box using
one shape instead of two I am currently doing. But thats the price I am
paying from not knowing exactly how to do this.

Also trying to painstakingly find the correct transform and scale values
requires A LOT of testing . This is why I find a vector editor for Athens
and Pharo absolutely essential. No coding can beat designing via mouse.

On the other hand I could use Inkscape and import the svg to Athens , which
what I am about to research. Designing all GUI elements by code is a very
bad idea, but no less a learning experience.

I will most probably move to Roassal too.

As always thanks for the help.


On Thu, Nov 28, 2013 at 12:29 PM, Igor Stasenko <siguctua at gmail.com> wrote:

> well, by default the athens canvas coordinate system matches morphic one..
> but you know, it always hard to be sure, especially if you perform any
> local coordinate transformations before that morph has any chance to draw
> itself..
>
> You can figure this out easily: draw something at 0 at 0 and see where it is.
> then draw something at morph's x at y position and see it too.
>
> btw, you know you don't have to create same paths over and over.
> you can easily put static parts out of regularly (and costly) evaluated
> code:
>
> shape := canvas cacheAt: self "morph" ifAbsentPut: [
>                 aCanvas createPath: [:path |
>  path relative.
> " no move-to here ***  path moveTo: ((self position x )+5)@(self position
> y);"
> lineTo: 20 at 0;
>  cwArcTo: 5 at 5 angle: 45;
> lineTo: 0 at 20;
>  cwArcTo: (-5)@5 angle: 45;
> lineTo: (-20)@0;
> cwArcTo: (-5)@(-5) angle: 45;
>  lineTo: 0@(-20);
> cwArcTo: 5@(-5) angle: 45.
>   ].
> ].
>
> "and here we're using coordinate transform to translate origin point to
> given position, so it will be the starting point (0 at 0) of our shape"
>
> canvas pathTransform restoreAfter: [
>    canvas pathTransform translateBy:((self position x )+5)@(self position
> y).
>    canvas drawShape: shape.
> ]
>
> by analogy you can cache all static pieces, just do something:
>
> shapes := canvas cacheAt: self ifAbsentPut: [ self
> constructStaticShapesOn: aCanvas ]
>
> where #constructStaticShapesOn: must answer an array of them.
>
>
> On 28 November 2013 11:12, kilon alios <kilon.alios at gmail.com> wrote:
>
>> wow you guys are fast at replying :)
>>
>> I did
>>
>>
>> self changeProportionalLayout.
>> editButton := HypEditButton new .
>>  editButton position: 0 at 0.
>> self addMorph: editButton fullFrame: #(0 0 0 0 0 0 100 100).
>>
>> I am afraid Igor I still see no change with your code.
>>
>> I like to note here, that when I first created the editButton as morph ,
>> it indeed placed it in correct place. A 0 at 0 placed it in top left corner
>> as expected. But I did overide its DrawOn:  with an empty method and used
>> my own method to render it with Athens. So it looks like the problem is
>> Athens related and not Morphic related or maybe a disagreement between
>> Morphic and Athens.
>>
>> just for the record here is the code I use to render the HypEditButton
>> morph
>>
>> render:aCanvas
>> |shape1 shape2 shape3 editButtonColor |
>> shape1 := aCanvas createPath: [:path |
>> path relative .
>>  path moveTo: ((self position x )+5)@(self position y);
>>  lineTo: 20 at 0;
>> cwArcTo: 5 at 5 angle: 45;
>> lineTo: 0 at 20;
>>  cwArcTo: (-5)@5 angle: 45;
>> lineTo: (-20)@0;
>> cwArcTo: (-5)@(-5) angle: 45;
>>  lineTo: 0@(-20);
>> cwArcTo: 5@(-5) angle: 45.
>>   ].
>>  shape2 := aCanvas createPath: [:path |
>> path relative .
>>  path moveTo: ((self position x +7))@((self position y +3));
>> lineTo: 18 at 0;
>>  cwArcTo: 2 at 2 angle: 45;
>> lineTo: 0 at 20;
>> cwArcTo: (-2)@2 angle: 45;
>>    lineTo: (-20)@0;
>> cwArcTo: (-2)@(-2) angle: 45;
>> lineTo: 0@(-20);
>>  cwArcTo: 4@(-2) angle: 45.
>>   ].
>> shape3 := aCanvas createPath: [:path |
>>  path relative .
>>  path moveTo: ((self position x +15))@((self position y +10));
>>  cwArcTo: 5 at 5 angle: 90;
>> cwArcTo: (-5)@5 angle: 90;
>>  cwArcTo: (-5)@(-5) angle: 90;
>> cwArcTo: 5@(-5) angle: 90.
>>    ].
>> ( editMode = true) ifTrue: [ editButtonColor := Color green] ifFalse: [
>> editButtonColor := Color red ].
>> (aCanvas setStrokePaint: editButtonColor) width: 1.
>>
>> aCanvas drawShape: shape1 .
>> aCanvas drawShape: shape2.
>> aCanvas setPaint: (editButtonColor alpha: 0.3 ).
>> aCanvas drawShape: shape3.
>>
>>
>>
>>
>>
>>
>> On Thu, Nov 28, 2013 at 12:03 PM, Igor Stasenko <siguctua at gmail.com>wrote:
>>
>>>
>>>
>>>
>>> On 28 November 2013 10:59, kilon alios <kilon.alios at gmail.com> wrote:
>>>
>>>> just tried it, I see no change
>>>>
>>>> try:
>>>  self changeProportionalLayout
>>>
>>> editButton := HypEditButton new .
>>>       self addMorph: editButton fullFrame: #(0 0 0 0 0 0 100 100).
>>>
>>>>
>>>>
>>>> On Thu, Nov 28, 2013 at 11:54 AM, Benjamin <
>>>> Benjamin.VanRyseghem.Pharo at gmail.com> wrote:
>>>>
>>>>> Can you try to do something like
>>>>>
>>>>> self changeProportionalLayout
>>>>> before adding the morph ?
>>>>>
>>>>> Ben
>>>>>
>>>>> On 28 Nov 2013, at 10:51, kilon alios <kilon.alios at gmail.com> wrote:
>>>>>
>>>>> So I have found some strange problems with my vector editor ,
>>>>> Hyperion.
>>>>>
>>>>> Hyperion is a Morph openInWindow. Code can be found in the class side
>>>>> of Hyperion>>open.
>>>>>
>>>>>  The coordinate system when detecting events (mouseOver, mouseUp and
>>>>> mouseDown events of the Hyperion instance) looks like it takes to account
>>>>> also beyond the morph as coordinates as a result events happening at the
>>>>> top right edge of the morph where Hyperion is rendered is 6 at 30( which
>>>>> is the size of the window's title bar plus its borders). Thats ok, I have
>>>>> taken these offsets to account when computing the position of the mouse. I
>>>>> guess it uses the global coordinated and not the local coordinates of the
>>>>> morph.
>>>>>
>>>>> I am adding a button to control the edit mode of a line, when in edit
>>>>> mode handles for line's control points are shown and those handles can be
>>>>> dragged around to control the shape of the line , when off edit mode, the
>>>>> line will be able to be drag around (not implemented yet).
>>>>>
>>>>> My problem is that when I add that button as morph to the existing
>>>>> morph of Hyperion in 0 at 0 , it actually appears in 0 at 30 in local
>>>>> coordinated of the Hyperion moprh which in global coordinates it 6 at 60( 0 at 0+ 6 at 30+ 0 at 30= 6 at 60).
>>>>> Why is that ?
>>>>>
>>>>> I have no clue why I am getting an offset of 0 at 30 in local
>>>>> coordinates of the Hyperion morph.
>>>>>
>>>>> here is the picture showing a) how it looks like b) the code that set
>>>>> the position c) transcript showing mouse coordinates when clicked in the
>>>>> top left corner of Hyperion morph
>>>>>   Hyperion coordinates problem.JPG<https://docs.google.com/file/d/0B1L74rM985aqVTZleHlmb3RmbWs/edit?usp=drive_web>
>>>>>
>>>>> if anyone wants to try the code himself the repo is here
>>>>>
>>>>> http://www.smalltalkhub.com/#!/~kilon/Hyperion
>>>>>
>>>>> To sum up, to place that button on top left, I will have to position
>>>>> it 0@(-30) which for me makes no sense at all.
>>>>>
>>>>> Please note that everything is rendered with Athens.
>>>>>
>>>>>  Maybe I have messed up the code myself somewhere but I have looked
>>>>> it again and again I cant find a problem with my code.
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>> --
>>> Best regards,
>>> Igor Stasenko.
>>>
>>
>>
>
>
> --
> Best regards,
> Igor Stasenko.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20131128/6534d064/attachment-0002.html>


More information about the Pharo-dev mailing list