kopia lustrzana https://github.com/villares/sketch-a-day
				
				
				
			
		
			
				
	
	
		
			171 wiersze
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			171 wiersze
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
| # Alexandre B A Villares - https://abav.lugaralgum.com/sketch-a-day
 | |
| 
 | |
| SKETCH_NAME = "s136"  # 180516
 | |
| 
 | |
| LINE_SPACE = 22
 | |
| ITEM_WIDTH = 80
 | |
| ITEM_HEIGHT = 20
 | |
| MOUSE_PRESSED = False
 | |
| 
 | |
| CONCEPT_LIST = ["sin", "sin.com",
 | |
|                 "mat", "mat.geo", "mat.geo.coo",
 | |
|                 "pst",
 | |
|                 "pst.oop",
 | |
|                 "pst.rcr",
 | |
|                 "con", "con.cnd", "con.ite",
 | |
|                 ]
 | |
| 
 | |
| def setup():
 | |
|     size(500, 500)
 | |
|     rectMode(CENTER)
 | |
|     textAlign(CENTER, CENTER)
 | |
|     textSize(10)
 | |
|     for c in CONCEPT_LIST:
 | |
|         Concept.CONCEPTS.append(Concept(c))
 | |
| 
 | |
| def draw():
 | |
|     background(200)
 | |
|     for l in Link.LINKS:
 | |
|         l.update()
 | |
|     for c in Concept.CONCEPTS:
 | |
|         c.update()
 | |
| 
 | |
| 
 | |
| def mouseClicked():
 | |
|     for c in Concept.CONCEPTS:
 | |
|         if c.under_mouse:
 | |
|             c.selected = not c.selected
 | |
|     if keyPressed and keyCode == SHIFT:
 | |
|         x, y = mouseX, mouseY
 | |
|         ct = input('new item')
 | |
|         if ct:
 | |
|             Concept.CONCEPTS.append(Concept(ct, x, y))
 | |
| 
 | |
| def keyPressed():
 | |
|     """ Key pressed event """
 | |
|     if key == "l":
 | |
|         selected = [c for c in Concept.CONCEPTS if c.selected]
 | |
|         if len(selected) == 2:
 | |
|             a, b = selected
 | |
|             Link.LINKS.append(Link(a, b))
 | |
| 
 | |
| 
 | |
| class Concept():
 | |
| 
 | |
|     CONCEPTS = []
 | |
|     y_stack = 0
 | |
| 
 | |
|     def __init__(self, content, x=None, y=None):
 | |
|         self.under_mouse = False
 | |
|         self.selected = False
 | |
|         if x == None:
 | |
|             if len(content) > 7:
 | |
|                 self.x = 450
 | |
|             elif len(content) > 4:
 | |
|                 self.x = 250
 | |
|             else:
 | |
|                 self.x = 50
 | |
|         else:
 | |
|             self.x = x
 | |
|         if y == None:
 | |
|             Concept.y_stack += LINE_SPACE
 | |
|             self.y = Concept.y_stack
 | |
|         else:
 | |
|             self.y = y
 | |
|         self.content = content
 | |
| 
 | |
|     def update(self):
 | |
|         self.move()
 | |
|         self.plot()
 | |
|         self.under_mouse = self.mouse_over()
 | |
| 
 | |
|     def move(self):
 | |
|         if self.selected and mousePressed:
 | |
|             deltaX = mouseX - pmouseX
 | |
|             deltaY = mouseY - pmouseY
 | |
|             self.x += deltaX
 | |
|             self.y += deltaY
 | |
| 
 | |
|     def plot(self):
 | |
|         strokeWeight(2)
 | |
|         noFill()
 | |
|         if self.under_mouse:
 | |
|             B = 0
 | |
|         else:
 | |
|             B = 255
 | |
|         if self.selected:
 | |
|             R = 0
 | |
|         else:
 | |
|             R = 255
 | |
|         stroke(R, 255, B)
 | |
|         # fill(200)
 | |
|         rect(self.x, self.y, ITEM_WIDTH, ITEM_HEIGHT, ITEM_HEIGHT / 4)
 | |
|         fill(0)
 | |
|         text(self.content, self.x, self.y)
 | |
| 
 | |
|     def mouse_over(self):
 | |
|         return (self.x - ITEM_WIDTH / 2 <= mouseX <= self.x + ITEM_WIDTH / 2 and
 | |
|                 self.y - ITEM_HEIGHT / 2 <= mouseY <= self.y + ITEM_HEIGHT / 2)
 | |
| 
 | |
|     def relative_pos(self, ox, oy):
 | |
|         """ compares self position with other (ox, oy) position"""
 | |
|         if self.x - ITEM_WIDTH <= ox <= self.x + ITEM_WIDTH:
 | |
|             rx = 10  # inside on x
 | |
|         elif ox < self.x - ITEM_WIDTH:
 | |
|             rx = 0  # x to the left
 | |
|         elif ox > self.x + ITEM_WIDTH:
 | |
|             rx = 20  # x to the right
 | |
|         if self.y - ITEM_HEIGHT <= oy <= self.y + ITEM_HEIGHT:
 | |
|             ry = 1  # inside on y
 | |
|         elif oy < self.y - ITEM_HEIGHT:
 | |
|             ry = 0  # y is upwards
 | |
|         elif oy > self.y + ITEM_HEIGHT:
 | |
|             ry = 2  # y is downwards
 | |
|         return rx + ry
 | |
| 
 | |
|     def linking_point(self, other):
 | |
|         rp = self.relative_pos(other.x, other.y)
 | |
| 
 | |
|         mpx = (self.x + other.x) / 2
 | |
|         mpy = (self.y + other.y) / 2
 | |
| 
 | |
|         if rp < 10:
 | |
|             px, py = self.x - ITEM_WIDTH / 2, self.y
 | |
|             cx, cy = mpx, self.y
 | |
|         elif rp > 12:
 | |
|             px, py = self.x + ITEM_WIDTH / 2, self.y
 | |
|             cx, cy = mpx, self.y
 | |
|         else:
 | |
|             if rp <= 11:
 | |
|                 px, py = self.x, self.y - ITEM_HEIGHT / 2
 | |
|             else:
 | |
|                 px, py = self.x, self.y + ITEM_HEIGHT / 2
 | |
|             cx, cy = self.x, mpy
 | |
| 
 | |
|         return px, py, cx, cy
 | |
| 
 | |
| class Link():
 | |
| 
 | |
|     LINKS = []
 | |
| 
 | |
|     def __init__(self, a, b):
 | |
|         self.a = a
 | |
|         self.b = b
 | |
| 
 | |
|     def update(self):
 | |
|         self.plot()
 | |
| 
 | |
|     def plot(self):
 | |
|         p1x, p1y, c1x, c1y = self.a.linking_point(self.b)
 | |
|         p2x, p2y, c2x, c2y = self.b.linking_point(self.a)
 | |
|         noFill()
 | |
|         stroke(0)
 | |
|         strokeWeight(1)
 | |
|         bezier(p1x, p1y, c1x, c1y,
 | |
|                c2x, c2y, p2x, p2y)
 | |
| 
 | |
| 
 | |
| def input(message=''):
 | |
|     from javax.swing import JOptionPane
 | |
|     return JOptionPane.showInputDialog(frame, message)
 |