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

kilon alios kilon.alios at gmail.com
Thu Nov 28 16:49:26 EST 2013


well I could ask you to give me access to those files , that would be a
good start  ;)

I am so new to this google drive thing


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

> 
>  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/f05335e7/attachment-0002.html>


More information about the Pharo-dev mailing list