Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
draw ui.Path within the coordinate system of a node
-
Hi, looking back to this example, I tried to play a bit and discovered what seems to be an issue:
from scene import * import time class MyScene (Scene): def setup(self): sx, sy = self.size.w, self.size.h self.red = ShapeNode(ui.Path.rect(0,0,sx,sy),parent=self,fill_color='red',position=(0,0),anchor_point=(0,0)) path = ui.Path() path.line_width = 3 path.move_to(0,0) path.line_to(100,0) #path.line_to(0,100) # Uncommenting this line modifies the drawing of both previous lines self.cyan = ShapeNode(path,parent=self.red,stroke_color='white',position=(0,0),anchor_point=(0,0)) if __name__ == '__main__': run(MyScene())
Removing the comment modifies how both previous lines are drawn!
I tried to understand but it is still unclear for me -
@mikeno, without running this, I think what you are seeing is that the commented line changes the bounding box of the whole path and thus the node, and as the node
position
defines the center position, the path seems to move to left. -
Hi Mikael, thx for replying but is there a way to avoid this?
-
@mikeno, do you need to use
scene
, or in other words, what are you trying to do? -
I just want to draw a filled polygone following numerous coordinates, I already managed to do it with ui and canvas but only scene gives me the possibility to use full screen
-
@mikeno try this, and to close, swipe down with two fingers
import ui class my(ui.View): def draw(self): w,h = ui.get_screen_size() path = ui.Path()#.rect(0,0,w,h) path.line_width = 3 ui.set_color('red') path.move_to(100,100) path.line_to(200,100) path.line_to(100,200) path.close() path.fill() #path.stroke() v = my() v.present('fullscreen',hide_title_bar=True)
-
Yes thx it works but it doesn’t with several polygons
-
... and then, I need to redraw in order to see the polygons in a different zoom factor. As I wrote, I already tried with ui but I stoped because I could not redraw, that’s why I tried with scene
-
@mikeno said:
it doesn’t with several polygons
import ui class my(ui.View): def draw(self): w,h = ui.get_screen_size() path1 = ui.Path() path1.line_width = 3 ui.set_color('red') path1.move_to(100,100) path1.line_to(200,100) path1.line_to(100,200) path1.close() path1.fill() path2 = ui.Path()#.rect(0,0,w,h) path2.line_width = 3 ui.set_color('blue') path2.move_to(300,100) path2.line_to(400,100) path2.line_to(300,200) path2.close() path2.fill() v = my() v.present('fullscreen',hide_title_bar=True)
-
-
Thx to both of you, concerning the gestures, it seems to be a little bit complicated but I will try
-
My last issue is that the drawing doesn’t refresh even when I call explicitly drawTest() as you can see in the example below:
import ui class my(ui.View): def __init__(self, *args, **kwargs): self.factor = .5 def draw(self): print('draw()') self.drawTest() def drawTest(self): print('drawTest()') print('%.1f' % (self.factor)) w,h = ui.get_screen_size() path1 = ui.Path() path1.line_width = 3 ui.set_color('red') path1.move_to(100*self.factor,100*self.factor) path1.line_to(200*self.factor,100*self.factor) path1.line_to(100*self.factor,200*self.factor) path1.close() path1.fill() path2 = ui.Path()#.rect(0,0,w,h) path2.line_width = 3 ui.set_color('blue') path2.move_to(300*self.factor,100*self.factor) path2.line_to(400*self.factor,100*self.factor) path2.line_to(300*self.factor,200*self.factor) path2.close() path2.fill() def touch_began(self, touch): print('touch_began()') self.factor += .5 self.drawTest() def will_close(self): print('will_close()') v = my() v.present('fullscreen',hide_title_bar=True)
It redraws only when I turn the iPad, could you please tell me how I can force the refresh with the right zoom factor?
-
@mikeno start from
import ui class my(ui.View): def __init__(self, *args, **kwargs): self.w,self.h = ui.get_screen_size() iv = ui.ImageView(name='iv') iv.frame = (0,0,self.w,self.h) self.add_subview(iv) self.factor = .5 self.update_interval = 1 def update(self): with ui.ImageContext(self.w,self.h) as ctx: path1 = ui.Path() path1.line_width = 3 ui.set_color('red') path1.move_to(100*self.factor,100*self.factor) path1.line_to(200*self.factor,100*self.factor) path1.line_to(100*self.factor,200*self.factor) path1.close() path1.fill() path2 = ui.Path()#.rect(0,0,w,h) path2.line_width = 3 ui.set_color('blue') path2.move_to(300*self.factor,100*self.factor) path2.line_to(400*self.factor,100*self.factor) path2.line_to(300*self.factor,200*self.factor) path2.close() path2.fill() ui_image = ctx.get_image() self['iv'].image = ui_image def touch_began(self, touch): self.factor += .5 def will_close(self): print('will_close()') v = my() v.present('fullscreen',hide_title_bar=True)
-
Whao, I’m impressed, thank you!
But I don’t understand why it doesn’t work in my last example -
-
@mikeno just to show how it is easy to use @mikael 's gestures module, use two fingers to pinch
import ui from gestures import * class my(ui.View): def __init__(self, *args, **kwargs): self.w,self.h = ui.get_screen_size() iv = ui.ImageView(name='iv') iv.frame = (0,0,self.w,self.h) self.add_subview(iv) self.factor = .5 #self.update_interval = 1 self.pinch = pinch(iv,self.did_pinch) self.update() def update(self): with ui.ImageContext(self.w,self.h) as ctx: path1 = ui.Path() path1.line_width = 3 ui.set_color('red') path1.move_to(100*self.factor,100*self.factor) path1.line_to(200*self.factor,100*self.factor) path1.line_to(100*self.factor,200*self.factor) path1.close() path1.fill() path2 = ui.Path()#.rect(0,0,w,h) path2.line_width = 3 ui.set_color('blue') path2.move_to(300*self.factor,100*self.factor) path2.line_to(400*self.factor,100*self.factor) path2.line_to(300*self.factor,200*self.factor) path2.close() path2.fill() ui_image = ctx.get_image() self['iv'].image = ui_image def did_pinch(self, data): self.factor = data.scale self.update() def will_close(self): print('will_close()') def pinch_handler(data): print(data) v = my() v.present('fullscreen',hide_title_bar=True)
-
Thx cvp but I don’t know how to download a module into Pythonista
-
@mikeno use, and keep for the future, this script
import requests import os url = 'https://raw.githubusercontent.com/mikaelho/pythonista-gestures/master/gestures.py' response = requests.get(url) content = str(response.content.decode('utf-8')) file_path = os.path.expanduser('~/Documents/site-packages/gestures.py') with open(file_path,mode='wt',encoding='utf-8') as fil: fil.write(content)
-
Super, thank you
-