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

Igor Stasenko siguctua at gmail.com
Thu Nov 28 15:08:43 EST 2013


​
 BezierMorph.st.gz<https://docs.google.com/file/d/0B7dd-52sqS20SW9JMUxZREh1ZkJEc1UwZkNiYy1jbnZnV2Y0/edit?usp=drive_web>
​​
 Morphic-BezierCurve.st<https://docs.google.com/file/d/0B7dd-52sqS20LW5XV2NwaFpPeEJudFFGZ3ZsZFBxZC0zaVBr/edit?usp=drive_web>
​
On 28 November 2013 16:54, kilon alios <kilon.alios at gmail.com> wrote:

> absolutely, more code mean deeper understanding how to be more dangerous
> as a coder
>

here it is.. it took me some effort to find it, buried under piles of other
things.
i don't know which one is latest/working, and don't ask me how it works ..
it was long ago i was young and sky was blue :)


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

>
>
>
> On 28 November 2013 13:52, kilon alios <kilon.alios at gmail.com> wrote:
>
>> thats all I got I am afraid right now. A simple editing of a straight
>> line, but I am learning athens, roassal, morphic so it takes time. Its my
>> first with everything and my very first project with pharo. I am not aiming
>> for something super sophisticated, bezier lines, gradients, bitmaps etc
>> simple stuff but I am having so much fun with this project I wont give up
>> until I have it finished. :)
>>
>>
> btw, if you want, i got somewhere code for Bezier curve editing (in
> morphic)..
> it is not fully working, but at least something you can look at:
>  - if i remember you can add control points and move them around.
>
>
>
>>
>> On Thu, Nov 28, 2013 at 2:30 PM, Alexandre Bergel <
>> alexandre.bergel at me.com> wrote:
>>
>>> Do you have  more screenshots of Hyperion?
>>>
>>> Alexandre
>>> --
>>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>>> Alexandre Bergel  http://www.bergel.eu
>>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>>>
>>>
>>>
>>> On Nov 28, 2013, at 7:49 AM, kilon alios <kilon.alios at gmail.com> wrote:
>>>
>>> > 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
>>> >>
>>> >> 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.
>>> >
>>>
>>>
>>>
>>
>
>
> --
> 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/28ec33cd/attachment-0002.html>


More information about the Pharo-dev mailing list