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

kilon alios kilon.alios at gmail.com
Thu Nov 28 07:52:21 EST 2013


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. :)


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.
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20131128/2e2ae198/attachment-0002.html>


More information about the Pharo-dev mailing list