I was teaching Zech (11) how to model in Fusion 360. We made a nice 3D render of some play houses.
Month: February 2018
VisPy Sinewave Demo
VisPy is quite an interesting tool. They say it is for “scientific visualization”. Here is an example of that. I took a demo from their github page and added a little code to generate a sinewave. The cool thing is that the graph, scaling, panning, zooming, and redrawing all come out of the box.
I previously wrote about installing VisPy. Thanks to the great efforts of some unnamed people, Python on Windows is really working nicely now.
Here is a screenshot:
Here is the code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# Copyright (c) Vispy Development Team. All Rights Reserved. | |
# Distributed under the (new) BSD License. See LICENSE.txt for more info. | |
""" | |
Demonstration of InfiniteLine visual. | |
""" | |
import sys | |
import numpy as np | |
from vispy import app, scene | |
# vertex positions of data to draw | |
N = 200 | |
pos = np.zeros((N, 2), dtype=np.float32) | |
x_lim = [50., 1750.] | |
y_lim = [–2., 2.] | |
pos[:, 0] = np.linspace(x_lim[0], x_lim[1], N) | |
pos[:, 1] = np.random.normal(size=N) | |
pos1 = np.zeros((20000,2), dtype=np.float32) | |
color1 = np.ones((20000,4), dtype=np.float32) | |
pos1[0,0] = 0.0 | |
pos1[0,1] = 15.0 | |
pos1[1,0] = 100.0 | |
pos1[1,1] = –15.0 | |
import math | |
for x in range(20000): | |
pos1[x,0] = x*10 | |
pos1[x,1] = math.sin(x/20.) * 40. | |
# color array | |
color = np.ones((N, 4), dtype=np.float32) | |
color[:, 0] = np.linspace(0, 1, N) | |
color[:, 1] = color[::–1, 0] | |
canvas = scene.SceneCanvas(keys='interactive', show=True) | |
grid = canvas.central_widget.add_grid(spacing=0) | |
viewbox = grid.add_view(row=0, col=1, camera='panzoom') | |
# add some axes | |
x_axis = scene.AxisWidget(orientation='bottom') | |
x_axis.stretch = (1, 0.1) | |
grid.add_widget(x_axis, row=1, col=1) | |
x_axis.link_view(viewbox) | |
y_axis = scene.AxisWidget(orientation='left') | |
y_axis.stretch = (0.1, 1) | |
grid.add_widget(y_axis, row=0, col=0) | |
y_axis.link_view(viewbox) | |
# add a line plot inside the viewbox | |
#line = scene.Line(pos, color, parent=viewbox.scene) | |
line1 = scene.Line(pos1, color1, parent=viewbox.scene) | |
# add vertical lines | |
vert_line1 = scene.InfiniteLine(100, [1.0, 0.0, 0.0, 1.0], | |
parent=viewbox.scene) | |
vert_line2 = scene.InfiniteLine(549.2, [0.0, 1.0, 0.0, 1.0], vertical=True, | |
parent=viewbox.scene) | |
# add horizontal lines | |
hor_line1 = scene.InfiniteLine(0.3, [1.0, 0.0, 1.0, 1.0], vertical=False, | |
parent=viewbox.scene) | |
hor_line2 = scene.InfiniteLine(–5.1, [1.0, 1.0, 0.0, 1.0], vertical=False, | |
parent=viewbox.scene) | |
# auto-scale to see the whole line. | |
viewbox.camera.set_range((0,1000), (–100,100)) | |
if __name__ == '__main__' and sys.flags.interactive == 0: | |
app.run() |
Installing VisPy on Windows 10
VisPy is a Python library for interactive scientific visualization that is designed to be fast, scalable, and easy to use.
Here is how I installed it:
First I installed the latest Python 3.6 on Windows 10 by following the directions on http://www.python.org. Once this was installed, I opened up Windows PowerShell and ran this command:
py -m pip upgrade vispy PyQt5 --user
I found some sample code here, and using NotePad++, copied and pasted it, saving it to Desktop\Code\v1.py
https://github.com/vispy/vispy/blob/master/examples/basics/gloo/animate_shape.py
In PowerShell, I changed to the directory that I saved the python code to and ran it:
cd Desktop\Code py .\v1.py
Here is the output:
It’s a pretty smooth and clean looking UI. It seems extremely powerful, but I’ll need to dig in and see what makes it tick…
2D Sine Wave Example Using PyOpenGL
Here is an example of a moving 2D sine wave using Python 3, PyGame, and PyOpenGL. See a https://blog.gahooa.com/2018/02/11/pygame-and-opengl-on-windows-10/ for how to install them.
This sample program is designed to have a 100×60 unit working area with a 10 unit buffer around the edges. You can see the axis in the lower-left (0,0) where Y+ is up, and X+ is to the right.
The structure of the program was created to make it super easy to work on the “guts” of the graphics without getting it confused with the “bookkeeping” end of OpenGL or PyGame.
Note: the glOrtho() command is how 2D “parallel perspective” is setup. It defines the left, right, bottom, top, near plane, and far plane. Because it is parallel, there is not the notion of a “camera” per-se, but rather section of the plane that should be viewed. Documented here:
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml
Here is the code!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
############################################################################### | |
# Action Happens Here 50 times per second | |
def tick(i): | |
#glRotatef(1, 0, 0, 1) | |
#glTranslatef(0, 0, 1) | |
# Draw Axis | |
axis(i) | |
# Draw sinewave | |
for x in range(200): | |
x = x/2.0 | |
y = math.sin(math.radians(x+i) * 10) * 30 + 30 | |
cquad((x,y,0), 1, (y/60.0,0,x/100.0)) #(center, diameter, color) | |
############################################################################### | |
# The rest of this is the bones that make it work | |
import time | |
import pygame | |
from pygame.locals import * | |
from OpenGL.GL import * | |
from OpenGL.GLU import * | |
from OpenGL.arrays import vbo | |
import math | |
FPS_TARGET = 50 | |
def axis(i): | |
glBegin(GL_LINES) | |
#x = red | |
#y = green | |
#z = blue | |
glColor3f(1, 0, 0) | |
glVertex3fv((0, 0, 0)) | |
glVertex3fv((1, 0, 0)) | |
glColor3f(0, 1, 0) | |
glVertex3fv((0, 0, 0)) | |
glVertex3fv((0, 1, 0)) | |
glColor3f(0, 0, 1) | |
glVertex3fv((0, 0, 0)) | |
glVertex3fv((0, 0, 1)) | |
glEnd() | |
def quad(points, color): | |
glBegin(GL_QUADS) | |
glColor3f(*color) | |
for p in points: | |
glVertex3fv(p) | |
glEnd() | |
def cquad(point, size, color): | |
glBegin(GL_QUADS) | |
glColor3f(*color) | |
x,y,z = point | |
s = size/2.0 | |
glVertex3fv((x–s,y–s,z)) | |
glVertex3fv((x+s,y–s,z)) | |
glVertex3fv((x+s,y+s,z)) | |
glVertex3fv((x–s,y+s,z)) | |
glEnd() | |
def main(): | |
#initialize pygame and setup an opengl display | |
pygame.init() | |
pygame.display.set_mode((1200,800), OPENGL|DOUBLEBUF) | |
glEnable(GL_DEPTH_TEST) #use our zbuffer | |
glEnable(GL_BLEND); | |
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |
#setup the camera | |
glMatrixMode(GL_PROJECTION) | |
#gluPerspective(45.0,1000/1000,0.1,1000.0) #setup lens | |
#glOrtho(-10,10,-10,10,1,20) | |
glOrtho(–10,110,–10,70,–1,1) | |
#glTranslatef(0, 0, -100) #move back | |
#glRotatef(-20, 1, 0, 0) #orbit higher | |
nt = int(time.time() * 1000) | |
for i in range(2**63): | |
nt += 1000//FPS_TARGET | |
#check for quit'n events | |
event = pygame.event.poll() | |
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): | |
break | |
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) | |
tick(i) | |
pygame.display.flip() | |
ct = int(time.time() * 1000) | |
pygame.time.wait(max(1,nt – ct)) | |
if i % FPS_TARGET == 0: | |
print(nt–ct) | |
if __name__ == '__main__': main() |
PyGame and OpenGL on Windows 10
First I went to http://www.python.org and downloaded the latest version of Python for windows. I made sure to select the option to add it to the system path.
Then I opened windows PowerShell (just a nicer term)
py -m pip install pygame --user py -m pip install numpy --user py -m pip install pyopengl --user
(I also installed NoteTab++, a nice text editor)
From there, I went to github and copied one of the examples from https://github.com/pygame/pygame/blob/master/examples/glcube.py and saved it on my desktop as myglcube.py.
In PowerShell, you just type:
cd Desktop py -m myglcube
Here is my example:
(here is the code)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
"""Draw a cube on the screen. every frame we orbit | |
the camera around by a small amount and it appears | |
the object is spinning. note i've setup some simple | |
data structures here to represent a multicolored cube, | |
we then go through a semi-unopimized loop to draw | |
the cube points onto the screen. opengl does all the | |
hard work for us. :] | |
""" | |
import time | |
import pygame | |
from pygame.locals import * | |
try: | |
from OpenGL.GL import * | |
from OpenGL.GLU import * | |
except ImportError: | |
print ('The GLCUBE example requires PyOpenGL') | |
raise SystemExit | |
#some simple data for a colored cube | |
#here we have the 3D point position and color | |
#for each corner. then we have a list of indices | |
#that describe each face, and a list of indieces | |
#that describes each edge | |
CUBE_POINTS = ( | |
(0.5, –0.5, –0.5), (0.5, 0.5, –0.5), | |
(–0.5, 0.5, –0.5), (–0.5, –0.5, –0.5), | |
(0.5, –0.5, 0.5), (0.5, 0.5, 0.5), | |
(–0.5, –0.5, 0.5), (–0.5, 0.5, 0.5) | |
) | |
#colors are 0-1 floating values | |
CUBE_COLORS = ( | |
(1, 0, 0), (1, 1, 0), (0, 1, 0), (0, 0, 0), | |
(1, 0, 1), (1, 1, 1), (0, 0, 1), (0, 1, 1) | |
) | |
CUBE_QUAD_VERTS = ( | |
(0, 1, 2, 3), (3, 2, 7, 6), (6, 7, 5, 4), | |
(4, 5, 1, 0), (1, 5, 7, 2), (4, 0, 3, 6) | |
) | |
CUBE_EDGES = ( | |
(0,1), (0,3), (0,4), (2,1), (2,3), (2,7), | |
(6,3), (6,4), (6,7), (5,1), (5,4), (5,7), | |
) | |
def drawcube(): | |
"draw the cube" | |
allpoints = list(zip(CUBE_POINTS, CUBE_COLORS)) | |
glBegin(GL_QUADS) | |
for face in CUBE_QUAD_VERTS: | |
for vert in face: | |
pos, color = allpoints[vert] | |
glColor3fv(color) | |
glVertex3fv(pos) | |
glEnd() | |
glColor3f(1.0, 1.0, 1.0) | |
glBegin(GL_LINES) | |
""" | |
for line in CUBE_EDGES: | |
for vert in line: | |
pos, color = allpoints[vert] | |
glVertex3fv(pos) | |
""" | |
for x in range(–50,50): | |
glColor3f(x*.03%1.0, x*.04%1.0, x*.05%1.0) | |
glVertex3fv((x, 0, –100)) | |
glVertex3fv((x, 0, 100)) | |
glVertex3fv((–100, 0, x)) | |
glVertex3fv((100, 0, x)) | |
glEnd() | |
def main(): | |
"run the demo" | |
#initialize pygame and setup an opengl display | |
pygame.init() | |
pygame.display.set_mode((1024,768), OPENGL|DOUBLEBUF) | |
glEnable(GL_DEPTH_TEST) #use our zbuffer | |
#setup the camera | |
glMatrixMode(GL_PROJECTION) | |
gluPerspective(45.0,1024/768.0,0.1,100.0) #setup lens | |
glTranslatef(0.0, 0.0, –20.0) #move back | |
glRotatef(60, 1, 0, 0) #orbit higher | |
nt = int(time.time() * 1000) | |
for i in range(2**63): | |
nt += 20 | |
glTranslatef(0.0, 0.0, –.1) | |
#check for quit'n events | |
event = pygame.event.poll() | |
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): | |
break | |
#clear screen and move camera | |
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) | |
#orbit camera around by 1 degree | |
glRotatef(1, 0, 1, 0) | |
drawcube() | |
pygame.display.flip() | |
ct = int(time.time() * 1000) | |
pygame.time.wait(max(1,nt – ct)) | |
if i % 50 == 0: | |
print(nt–ct) | |
if __name__ == '__main__': main() |
Problem with AJAX calls on PhoneGap project?
Using Adobe PhoneGap Build… ajax calls working fine in PhoneGap dev app, but not working once you build the app? Getting 404 errors when the server is not even being hit?
After much searching, this is what fixed it:
Remove browser plugin (in this case did not need/want it)
phonegap platform remove browser
Add the whitelist plugin:
cordova plugin add cordova-plugin-whitelist
Credit here:
DMM Servos
Need advanced servo motors or drives for an upcoming project? Building a CNC machine? Just interested in learning a lot?
My experiences with their service has been outstanding. Will be receiving product soon and have to post more about that then.
http://www.dmm-tech.com/, a company that:
DMM Technology Corp. is devoted to the research and development of advanced servo motion control products. Within our 20 year history, we have achieved numerous patented technological advances in the automation industry and have integrated these technologies into our products. These achievements have allowed us to expand the limits of AC Servo application and have attributed our products with an unprecedented combination of performance, reliability, and cost.
All technology used in our products are developed by our in house engineers who utilize smart thinking and smart solutions to simplify the servo control mechanism while maintaining a high performance and full-featured product.
Our products have proven themselves in many manufacturing, and automation industries for worldwide applications. We are also able to collaborate with users to develop new, or modify existing systems in order to meet and exceed the target requirements. We integrate smart technology into an industry proven package.
Visit our Core Technology section to learn more about our technical specialty.
One-Off Cast Iron
I had an incredible talk with Craft Pattern today, about making a custom cast iron machine frame.
They really took the time to talk me through the process and helped me understand the different techniques used.
Isn’t it great when you get to talk to someone who knows what they are talking about?
Have you considered cast iron as a possibility on any of your projects? I hadn’t until recently, but now a whole new world of possibility has opened up.
In addition to casting, they offer full CNC machining services on the castings, so it sounds like a one-stop-shop.