Polargraph at the library

451 views
Skip to first unread message

Mark Benson

unread,
Nov 30, 2015, 9:29:09 AM11/30/15
to MakeBmth
I've been mulling over the Polargraph at the library. i.e. Plotting
'disaster' related tweets as a line graph.

Found (and run) this code: https://github.com/ckoepp/TwitterSearch

Seems to do what I was thinking about. Returns a bunch of tweets for the
'disaster' keyword. With the data in python we can easily count the
number of returned tweets for a given time period and then plot that
somehow...

Thats the next bit... getting a Polargraph to plot a 'blip'. I guess
this is going to have to be done in discreet blocks of time (like every
60 seconds?) so we can work out the plot area, co-ordinate range and
ultimately how long it will take to fill a plot area?

Have also updated the Polargraph project thing on Trello.
https://trello.com/b/2DCorYzc/polargraph-project

asha.bla...@googlemail.com

unread,
Dec 5, 2015, 6:35:17 PM12/5/15
to Make Bournemouth Forum
Very interesting!

I brought some larger bearings so I can mount the pen through its centre - but I think its a bit tooo big ;)

Planning on building a better gondola - but, packin for a house move, followed by christmas - so might not get much done :s


Mark Benson

unread,
Dec 6, 2015, 6:13:03 PM12/6/15
to bournemouth-re...@googlegroups.com
Good luck with the house move!

I wanted to know a bit more about the raw 'gcode' that the Polargraph uses so I drew a mock vector graph (attached) and loaded that into the Polargraph software and exported the resulting code. I looked up the codes in the firmware and eventually found the codes with explanations on the wiki (see link below). I've annotated a few of the commands...

C09,1355,1348,END - Set position (How is pixel denisty defined?*)
C14,END - Pen up
C17,2825,3169,2,END - Change length direct
C13,END - Pen down
C17,2841,3145,2,END
C17,2768,3037,2,END
C17,2652,2891,2,END
C17,2850,3029,2,END
C17,2608,2755,2,END
C17,2935,3022,2,END
C17,2953,3002,2,END
C17,2889,2892,2,END
C17,2998,2957,2,END
C17,2767,2676,2,END
C17,3042,2917,2,END
C17,3066,2898,2,END
C17,3090,2879,2,END
C17,3074,2817,2,END
C17,3141,2843,2,END
C17,3166,2827,2,END
C14,END

*Most likey by the size of the machine / Steps per mm


https://github.com/euphy/polargraph/wiki/Polargraph-machine-commands-and-responses

Move pen direct: C17,<left target length>,<right target length>,<line segment length>,END Moves the pen to the target, plotting a straight line in cartesian space. This is your basic "draw straight line to point". The coordinates are still in the native coordinates system though, not cartesian coordinates. The line is chopped into lots of little lines, and while each one will not be exactly straight, overall the path is straight. The line segment length parameter controls how long the sub-lines are. Larger values mean slightly quicker drawing, but more jagged lines. Default is a small value, eg 2. You can't really go any smaller than that.

Wondering what the 'native coordinate' system is? The coords from the graph don't look like Polar coords... I think i'll have to give it a try on my Polargraph - will rough out some python code to try and plot a graph.

So if we know the co-ordinate space, we can work out how much space each data point needs to be (that will be down to how many data points we think we can fit on the 'page' and how long we want the graph to run (i.e. do we want it to plot a single graph over a long time or fill a 'page' in 24hrs?) ) and then scale each twitter search count, off-set of where-ever we are on the 'page' and generate two commands (or 4 if we do pen up & down) to plot the peak and then move back down if we want discreet peaks or we could do a single move to the next peak...
test_graph.svg

Mark Benson

unread,
Dec 6, 2015, 6:23:59 PM12/6/15
to bournemouth-re...@googlegroups.com
After reading the wiki a bit more, I think the native coordinate system is in whole motor steps. So a unit in the coordinate system is whatever distance the gondola moves for a whole step (which is more than likely 200 steps per rev).
--
You received this message because you are subscribed to the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bournemouth-reprap-u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Mark Benson

unread,
Dec 7, 2015, 10:37:04 AM12/7/15
to bournemouth-re...@googlegroups.com
C:\Python\Python35-32>python c:\tmp\twit.py
Calling search
3698 tweets for this seach
Sleeping
Calling search
3699 tweets for this seach
Sleeping
Calling search
3698 tweets for this seach
Sleeping
Calling search
4378 tweets for this seach
Sleeping
Calling search
2400 tweets for this seach
Sleeping
Calling search
Error 429: ('Too Many Requests: Request cannot be served ', "due to the
application's rate limit having ", 'been exhausted for the resource')

So we need to rethink the search every 60 seconds due to twitters api
rate limiting.

We would also need to think about scaling the graph data points so we
don't have low counts lost in the noise... maybe we could do a rolling
average? Ideas anyone?
>> [1]
>>
>> MOVE PEN DIRECT: C17,<left target length>,<right target
>> For more options, visit https://groups.google.com/d/optout [2].
>
> --
> You received this message because you are subscribed to the Google
> Groups "Make Bournemouth Forum" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to
> bournemouth-reprap-u...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout [2].
>
>
> Links:
> ------
> [1]
> https://github.com/euphy/polargraph/wiki/Polargraph-machine-commands-and-responses
> [2] https://groups.google.com/d/optout

Mark Benson

unread,
Dec 7, 2015, 4:39:17 PM12/7/15
to bournemouth-re...@googlegroups.com
The rate limiting was being hit because a search returns 100 tweets at a
time. Which isn't all that useful I don't think...

Anyone familiar with the twitter API & Python?

ward...@gmail.com

unread,
Dec 7, 2015, 4:48:08 PM12/7/15
to Make Bournemouth Forum
Maybe you could go through that at a very slow and patient rate, much like the last meet - maybe I can begin to understand!

Presuming the twitter thing is understood - would we be able to adapt it however we want? I'm thinking something to do about homelessness / austerity for the project. Maybe everytime a tweet about a banker, a penis gets drawn or something?! ha!

ward...@gmail.com

unread,
Dec 7, 2015, 4:49:07 PM12/7/15
to Make Bournemouth Forum, ward...@gmail.com
could we reach out to the guys at redweb??

ward...@gmail.com

unread,
Dec 7, 2015, 4:49:28 PM12/7/15
to Make Bournemouth Forum, ward...@gmail.com
Or we are base?

Mark Benson

unread,
Dec 7, 2015, 4:57:54 PM12/7/15
to bournemouth-re...@googlegroups.com
I can walk thru it... it will help me understand it better.

And sure it can be adapted. You just need to alter the search parameters

i.e. tso.set_keywords(['disaster']) is the keyword we are searching for.

Mark Benson

unread,
Dec 7, 2015, 4:58:58 PM12/7/15
to bournemouth-re...@googlegroups.com
Yeah I guess we could ask...

On 07/12/2015 21:49, ward...@gmail.com wrote:
> Or we are base?
>

Mark Benson

unread,
Dec 7, 2015, 5:17:35 PM12/7/15
to bournemouth-re...@googlegroups.com
Have asked David @ RedWeb.

Who do we know at WeAreBase?

Mark Benson

unread,
Dec 7, 2015, 5:37:03 PM12/7/15
to bournemouth-re...@googlegroups.com
Ah... the max_id parameter looks like it is important.

We can use that to only get new tweets. I.e. tweets that have ids newer
than the last seen max_id... or something like that. I need to figure
out how to get the most recent tweets max_id first and then apply that
to subsequent searches.

Have a read thru the twitter API if you want to get a head start.

https://dev.twitter.com/rest/public/search

and

https://dev.twitter.com/rest/public/timelines

Mark Benson

unread,
Dec 7, 2015, 5:46:55 PM12/7/15
to bournemouth-re...@googlegroups.com
Or should that be since_id ?!?

APIs! Fun for all the family...

Mark Benson

unread,
Dec 7, 2015, 7:20:49 PM12/7/15
to bournemouth-re...@googlegroups.com
Yup, its the since_id

Managed to cobble together some python to do this:

C:\Users\mark\Documents>c:\Python\Python35\python.exe twti.py
Calling search
1 queries & 100 tweets seen
@674018160941600768 tweet ID
Main loop. Sleeping
Calling search
1 queries & 6 tweets seen
@674018222195126273 tweet ID
Main loop. Sleeping
Calling search
1 queries & 17 tweets seen
@674018323630133248 tweet ID
Main loop. Sleeping
Calling search
1 queries & 7 tweets seen
@674018394782453760 tweet ID
Main loop. Sleeping
Calling search
1 queries & 4 tweets seen
@674018428726808576 tweet ID
Main loop. Sleeping
Calling search
1 queries & 7 tweets seen
@674018484125331456 tweet ID
Main loop. Sleeping
Calling search
1 queries & 7 tweets seen
@674018526886260737 tweet ID
Main loop. Sleeping
Calling search
1 queries & 8 tweets seen
@674018574453772288 tweet ID
Main loop. Sleeping
Calling search
1 queries & 2 tweets seen
@674018603222499328 tweet ID
Main loop. Sleeping

This is just for testing to see if I could get the info I was looking
for. The first time it runs, it doesn't have any twitter ID so it just
grabs 100 results for the keyword 'disaster' (100 is the default). Tells
me how many twitter API calls it has made, how many results it has seen
and the most recent tweet ID (for the given keyword). It stores the ID
then sleeps for 10 seconds. It then runs again with the since_id = the
ID from the last run. So the number of tweets seen is what we want to graph.

Mark Benson

unread,
Dec 8, 2015, 7:31:47 PM12/8/15
to bournemouth-re...@googlegroups.com
Made a start on a function to generate Polargraph commands/'gcode'. Its
really a proof of concept at this stage. The co-ordinates aren't
realistic. I guess we need to look at scaling. It starts @ 0,0 and moves
x 50 and y whatever the twitter search count is (that will be between 0
& 100 just because that's the range of results we get back in 1 API
call) then moves another x 50 and y back to 0 and keeps moving left to
right in blocks of 100 units forever. Need to add bounds and get it to
move up or down a block when it gets to the end of row. We could opt to
have it move up or down from the current y height. I guess we would need
to try it and see which looks better.

Also managed to get only 1 result on the first search. It returns the
most recent tweet and its ID and we start searching from that point on
so we get live data.

So the output of the script looks like this right now: (its searching
every 30 secs hence the rate limit error - I guess we need to handle
that too so the polargraph doesn't crap out every time the twitter feed
does or the API rate limits the script (though I would hope we can work
within the rate limits))

C:\Users\mark\Documents>c:\Python\Python35\python.exe twti.py
Result of twitSearch(): Tweet Count=1, Most recent Tweet
ID=674381593813770240
Generated polargraph commands:
['C13,END', 'C17,50,1,2,END', 'C17,100,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=5, Most recent Tweet
ID=674381720154734592
Generated polargraph commands:
['C13,END', 'C17,150,5,2,END', 'C17,200,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=7, Most recent Tweet
ID=674381832499007488
Generated polargraph commands:
['C13,END', 'C17,250,7,2,END', 'C17,300,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=6, Most recent Tweet
ID=674381976174854145
Generated polargraph commands:
['C13,END', 'C17,350,6,2,END', 'C17,400,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=3, Most recent Tweet
ID=674382057280176128
Generated polargraph commands:
['C13,END', 'C17,450,3,2,END', 'C17,500,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=4, Most recent Tweet
ID=674382225790468098
Generated polargraph commands:
['C13,END', 'C17,550,4,2,END', 'C17,600,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=3, Most recent Tweet
ID=674382349962977280
Generated polargraph commands:
['C13,END', 'C17,650,3,2,END', 'C17,700,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=7, Most recent Tweet
ID=674382490740506625
Generated polargraph commands:
['C13,END', 'C17,750,7,2,END', 'C17,800,0,2,END', 'C14,END']

Result of twitSearch(): Tweet Count=12, Most recent Tweet
ID=674382623976742912
Generated polargraph commands:
['C13,END', 'C17,850,12,2,END', 'C17,900,0,2,END', 'C14,END']

Error 429: ('Too Many Requests: Request cannot be served ', "due to the
application's rate limit having ", 'been exhausted for the resource')
Traceback (most recent call last):
File "twti.py", line 76, in <module>
tweetLastSeenID, lastTweetCount = twitSearch(tweetLastSeenID)
TypeError: 'NoneType' object is not iterable

C:\Users\mark\Documents>

Mark Benson

unread,
Dec 14, 2015, 12:02:15 PM12/14/15
to bournemouth-re...@googlegroups.com
Ed, following on from the last meet at SoMakeIt - it looks like high
resolution screens are a problem for Processing. See
https://github.com/processing/processing/issues/2411

Its a tall ask given you are moving house, but It might be worth trying
a VM on that machine and give it a more common (lower) resolution and
see if you can get the Polargraph controller running on that. Maybe you
have an old laptop you could use? I'm worried that we have spent 3
meetings on the same issue now and are making limited progress.

Over the holidays I'm going to try and do a bit more work on the Python
script to output the Polargraph commands directly to serial so I can
test it on my Polargraph and see what it does there...

Mark Benson

unread,
Dec 29, 2015, 8:38:55 AM12/29/15
to bournemouth-re...@googlegroups.com
I updated to the latest Polargraph package
https://github.com/euphy/polargraphcontroller/releases/download/2015-11-10-23-07/Polargraph.2015-11-10.zip
and I'm seeing the same issues with not being able to click on stuff...
at least with the executable Polargraph controller. I haven't tried
running from the source yet.

If you shrink the Processing window, the buttons are click-able, so
there is a work-around that should allow you to get your Polargraph working.

Mark Benson

unread,
Jan 3, 2016, 11:37:13 AM1/3/16
to bournemouth-re...@googlegroups.com
Doing a bit more work on the python twitter script thing... (attached
for those interested - requires pySerial & TwitterSeatch (install them
(after installing Python (with 'pip install pySerial' & 'pip install
TwitterSearch')). Don't expect the twitter search to work as i've
removed my API key)

I now have it talking directly to the Polargraph. I managed to take the
setup commands from the queue of the controller software (by pausing the
queue, queuing up the right commands and then exporting the queue) and
using pyserial, send those commands to the controller. It also sends a
pen down and pen up command so I know if the controller is actually
responding by listening while the servo does its thing.

I then tried sending my 'graph' data points (as Polargraph commands) to
the controller, most of the time the commands are ignored but it
sometimes complains that they are out of bounds because the Polargraph
is expecting co-ordinates in the native coordinate system (i.e. 'p'
steps away from the left hand motor and 'q' steps away from the right
hand motor) so that's going to be fun to figure out... It might also be
down to the way I am checking for data from the serial port.

For test purposes I created a test function that moves the pen to the 4
corners of the page and back to home, first as a move (C01) and then as
a draw (C17). The move works until the last command then it gets out of
sync so I need to figure that out as well. The following draw moves are
all over the place.

At this point we can (to some extent) control the Polargraph from code.
Its still rough and ready but it is progress.


The output of the python script looks like this:
=========================================

c:\Python\Python35-32>python "z:\code\Library Polargraph\twti.py"

Setting up the controller...


Next command in queue: 'C02,0.36,END'

Controller reports 'READY', writing 'C02,0.36,END' to controller.

Next command in queue: 'C24,610,1165,END'

Controller reports 'READY', writing 'C24,610,1165,END' to controller.

Next command in queue: 'C29,92,END'

Controller reports 'READY', writing 'C29,92,END' to controller.

Next command in queue: 'C30,200,END'

Controller reports 'READY', writing 'C30,200,END' to controller.

Next command in queue: 'C31,1200,1,END'

Controller reports 'READY', writing 'C31,1200,1,END' to controller.

Next command in queue: 'C32,800,1,END'

Controller reports 'READY', writing 'C32,800,1,END' to controller.

Next command in queue: 'C37,16,END'

Controller reports 'READY', writing 'C37,16,END' to controller.

Next command in queue: 'C45,63,125,1,END'

Controller reports 'READY', writing 'C45,63,125,1,END' to controller.

Next command in queue: 'C09,711,711,END'

Controller reports 'READY', writing 'C09,711,711,END' to controller.

Next command in queue: 'C13,63,END'

Controller reports 'READY', writing 'C13,63,END' to controller.

Next command in queue: 'C14,125,END'

Controller reports 'READY', writing 'C14,125,END' to controller.
Read 'READY' from controller.

Setup done!
Manually set pen to home position and press enter to continue when done

Test 1 - Move to all 4 corners of the page and then back to home
Read 'READY' from serial port
Controller reports 'READY', writing 'C01,564,1237,END' to controller.
Read 'READY' from serial port
Controller reports 'READY', writing 'C01,1237,564,END' to controller.
Read 'READY' from serial port
Controller reports 'READY', writing 'C01,2131,1826,END' to controller.
Read 'READY' from serial port
Controller reports 'READY', writing 'C01,1826,2131,END' to controller.
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read 'SYNC,564,1237,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C01,711,711,END' to controller.
Test completed, press enter to continue
Read 'SYNC,1237,564,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,564,1237,END' to controller.
Read 'SYNC,2131,1826,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,1237,564,END' to controller.
Read 'SYNC,1826,2131,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,2131,1826,END' to controller.
Read 'SYNC,711,711,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,1826,2131,END' to controller.
Read 'maxLength: 45740' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read '' from serial port
Waiting for 'READY'...
Read 'SYNC,1120,205,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C01,711,711,END' to controller.
Test completed, press enter to continue
Calling twitter search
Result of twitSearch(): Tweet Count=1, Most recent Tweet
ID=683683825730240512

Generated polargraph commands:
['C13,END\n', 'C17,50,1,2,END\n', 'C17,100,0,2,END\n', 'C14,END\n']

Sending commands to Polargraph
Read 'SYNC,1228,544,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C13,END' to controller.
Read 'SYNC,1383,830,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,50,1,2,END' to controller.
Read 'SYNC,2050,742,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,100,0,2,END' to controller.
Read 'SYNC,711,711,END' from serial port
Waiting for 'READY'...
Read 'READY' from serial port
Controller reports 'READY', writing 'C14,END' to controller.

Main loop. Sleeping

Calling twitter search
Result of twitSearch(): Tweet Count=15, Most recent Tweet
ID=683683955015467008

Generated polargraph commands:
['C13,END\n', 'C17,150,15,2,END\n', 'C17,200,0,2,END\n', 'C14,END\n']

Sending commands to Polargraph
Read 'READY' from serial port
Controller reports 'READY', writing 'C13,END' to controller.
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,150,15,2,END' to controller.
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,200,0,2,END' to controller.
Read 'READY' from serial port
Controller reports 'READY', writing 'C14,END' to controller.

Main loop. Sleeping
Next command in queue: 'C14,125,END'
Controller reports 'READY', writing 'C14,125,END' to controller.

Setup done!
Manually set pen to home position and press enter to continue when done

Calling twitter search
Result of twitSearch(): Tweet Count=1, Most recent Tweet
ID=683643979779444738

Generated polargraph commands:
['C13,END\n', 'C17,50,1,2,END\n', 'C17,100,0,2,END\n', 'C14,END\n']

Sending commands to Polargraph
Read 'MSG,E, C14,125,END not recognised.' from serial port
Read 'READY' from serial port
Controller reports 'READY', writing 'C13,END' to controller.
Read 'READY' from serial port
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,50,1,2,END' to controller.
Read 'READY' from serial port
Read 'MSG,E,This point falls outside the area of this machine. Skipping
it.' from serial port
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,100,0,2,END' to controller.
Read 'MSG,E,This point falls outside the area of this machine. Skipping
it.' from serial port
Read 'READY' from serial port
Controller reports 'READY', writing 'C14,END' to controller.
Read 'READY' from serial port

Main loop. Sleeping

Calling twitter search
Result of twitSearch(): Tweet Count=5, Most recent Tweet
ID=683644156732903425

Generated polargraph commands:
['C13,END\n', 'C17,150,5,2,END\n', 'C17,200,0,2,END\n', 'C14,END\n']

Sending commands to Polargraph
Read 'READY' from serial port
Controller reports 'READY', writing 'C13,END' to controller.
Read 'READY' from serial port
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,150,5,2,END' to controller.
Read 'READY' from serial port
Read 'READY' from serial port
Controller reports 'READY', writing 'C17,200,0,2,END' to controller.
Read 'READY' from serial port
Read 'READY' from serial port
Controller reports 'READY', writing 'C14,END' to controller.
Read 'maxLength: 45740' from serial port

Main loop. Sleeping
twti-NOAPIKEY.py

Mark Benson

unread,
Jan 4, 2016, 10:07:33 AM1/4/16
to bournemouth-re...@googlegroups.com
Found a blog post on the maths
https://www.marginallyclever.com/2012/02/drawbot-overview/

Also wanted to know more about the co-ordinate system and found this on
polargraph.co.uk:


"It’s called a polargraph because when I was making it, I thought of
it as using a dual-polar coordinates system internally, rather than the
regular cartesian system we (and computer systems) tend to use."

"In fact, it doesn’t use a polar system at all, it’s actually a kind
of double-triangulation coordinate system. The angle of each cord is
controlled by the length of both cords, rather than by specifying angle
and distance as in with a true polar coordinate. The name
“Polargraph” remains as an evocative term, but it isn’t accurate."



So yeah - need to think in terms of two distances measured in motor
steps. I will have a go at implementing the inverse kinematics in Python
to try and convert cartesian co-ordinates to the machines native string
length co-ordinates.

It still has me wondering about how that scales or maps to an actual
measured distance. I guess we can work that out as a steps per mm value
and scale using that.

Mark Benson

unread,
Jan 11, 2016, 11:39:02 AM1/11/16
to bournemouth-re...@googlegroups.com
I could be missing something but it looks like basic trigonometry is all
that is needed to get the string lengths if you know the distance
between the motors and the steps per mm and we are working in the native
steps co-ordinate system.

The python looks like this: (save it as ik.py)
======================================================================
import math

#Distances should all be in 'Steps' (except for actual measurements
where specified)

motorDistance = 200 # in mm
motorStepsPerRev = 200
motorStepsMultiplier = 16
pulleyCircumference = 92 # in mm
stepsPerMM = (motorStepsPerRev * motorStepsMultiplier) /
pulleyCircumference
motorDistanceInSteps = stepsPerMM * motorDistance
motorDistanceMidPointInSteps = motorDistanceInSteps / 2

print("Steps Per MM = %s" % stepsPerMM)
print("Distance between motors in steps = %s" % motorDistanceInSteps)
print("Mid-point between motors in steps = %s" %
motorDistanceMidPointInSteps)

def getStringLengths(coordsXY):
A = coordsXY[0]
B = coordsXY[1]
print("A (which is x) = %s" % A)
print("B (which is y) = %s" % B)
C = motorDistanceInSteps - A
cord1 = math.sqrt((A*A)+(B*B))
cord2 = math.sqrt((C*C)+(B*B))
return cord1,cord2

result = getStringLengths((3478,3478))

print("String lengths are: %s" % (result,))
======================================================================

Running ik.py I get this:
======================================================================
C:\ python.exe ik.py
Steps Per MM = 34.78260869565217
Motor distance in steps = 6956.521739130434
Motor distance mid-point in steps = 3478.260869565217
A (which is x) = 3478
B (which is y) = 3478
String lengths are: (4918.634769933625, 4919.0037090454625)
======================================================================

In the python script, I'm declaring a bunch of constants that allow me
to work out steps per mm and the distance between the motors in steps
(and print that out when the script is run). Then I define a function to
find the hypotenuse values of the two right angle triangles which are my
cord lengths. The example function call 'result =
getStringLengths((3478,3478))' is using the mid-point (more or less) for
the values given, so the pen should be midway between the motors and the
same distance down. The motorDistance and pullyCircumference values are
made up as I couldn't remember what they are...

I'll try using this module in the main python script and see if it works
as expected for Thursday.

The values A,B & C are based on a scribble I did on a post-it note which
i've attached as it helps see what the function is doing. cord1 is D and
cord2 is E on the post-it.
IMG_20160111_161808.jpg

Mark Benson

unread,
Jan 11, 2016, 11:45:29 AM1/11/16
to bournemouth-re...@googlegroups.com
I've just noticed the post-it is wrong... E should be the square root of
B squared + C squared... its because I was trying to relabelling things
to make it clearer.

edward ward

unread,
Jan 12, 2016, 3:59:33 AM1/12/16
to bournemouth-re...@googlegroups.com
If we hook you up to the monitor on Thursday can you give us a demo on the work you have done so far?!

From: Mark Benson
Sent: ‎11/‎01/‎2016 16:45
To: bournemouth-re...@googlegroups.com
Subject: Re: [MakeBmth] Re: Polargraph at the library

[The entire original message is not included.]

Mark Benson

unread,
Jan 12, 2016, 4:03:44 AM1/12/16
to bournemouth-re...@googlegroups.com
Yeah - sounds like a plan.

On 2016-01-12 08:58, edward ward wrote:
> If we hook you up to the monitor on Thursday can you give us a demo on
> the work you have done so far?!
>
> -------------------------
> --
> You received this message because you are subscribed to the Google
> Groups "Make Bournemouth Forum" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to
> bournemouth-reprap-u...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout [1].
>
>
> Links:
> ------
> [1] https://groups.google.com/d/optout

Brian Innes

unread,
Jan 14, 2016, 4:57:32 PM1/14/16
to Make Bournemouth Forum
How do I access the content on trello?

ma...@sub-design.co.uk

unread,
Jan 14, 2016, 5:10:22 PM1/14/16
to bournemouth-re...@googlegroups.com
Sign up to trello (if you haven't already) and send me your username and I'll add you.

It doesn't really get much use...
--
So screen, such tiny, wow spelling...

Bonkers

unread,
Jan 15, 2016, 8:08:21 AM1/15/16
to Make Bournemouth Forum
Couldn't make it to the meet last night (boo hoo) ....if the project ever makes it far enough for me to sensibly build one...please let me know.

Cheers
Graham C

John Morrison

unread,
Jan 15, 2016, 8:13:07 AM1/15/16
to bournemouth-re...@googlegroups.com

How about getting the position to plot from two variables? Each variable controls the 'length' on one side. So, say, count of tweets about something vs count of references to it from 'traditional' news sources?

J

--
You received this message because you are subscribed to the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bournemouth-reprap-u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Mark Benson

unread,
Jan 15, 2016, 8:25:32 AM1/15/16
to bournemouth-re...@googlegroups.com
Thats a possibility... Ed did say that we would need to be searching
against multiple key words on twitter (not sure how that works with the
python library I am using or how that would affect the twitter API rate
limit).

Any idea how to search 'traditional' sources in python?

Do you see it drawing a line from one position to the next or plotting
something at the target co-ordinates?

On 2016-01-15 13:13, John Morrison wrote:
> How about getting the position to plot from two variables? Each
> variable controls the 'length' on one side. So, say, count of tweets
> about something vs count of references to it from 'traditional' news
> sources?
>
> J
>
> On 12 Jan 2016 08:59, "edward ward" <ward...@gmail.com> wrote:
>
>> If we hook you up to the monitor on Thursday can you give us a demo
>> on the work you have done so far?!
>>
>> -------------------------
>>>> on polargraph.co.uk [1]:
> Links:
> ------
> [1] http://polargraph.co.uk

John Morrison

unread,
Jan 15, 2016, 8:28:59 AM1/15/16
to bournemouth-re...@googlegroups.com

I'd go for drawing a line. Monitor rss feeds? Count of entries which match some regexp?

Mark Benson

unread,
Jan 15, 2016, 9:39:20 AM1/15/16
to bournemouth-re...@googlegroups.com
In answer to my own question about how TwitterSearch works with multiple
keywords, it just does. Pass it multiple keywords and thats what it
searches against.

RSS could work - a quick search shows what looks like a simple to use
RSS reader. Would need to compile a list of rss source URLs.

I've been trying to visualize what this would draw. I guess we would end
up with a scatter of connected lines.
>>> on polargraph.co.uk [1] [1]:

Mark Benson

unread,
Jan 24, 2016, 2:16:16 PM1/24/16
to bournemouth-re...@googlegroups.com
Following on from the Uni meet, i've rewritten the serial comms stuff as
it was pretty flaky. I've cleaned up some code and made other code more
messy.

Flow diagram for the serial comms function attached and the current
python code.

As it stands this code will not try to search twitter (i've removed my
API key and commented out the twitter search calls). It will setup the
controller and run test3() which is the one that is failing - basically
it moves from the home position to the top left of the page and then
draws a box slightly smaller than the page size. The first two commands
appear to be ok, the second two fail with 'MSG,E,Line is not on the
page. Skipping it.' but then things get weird after than and commands
are ignored or appear to do nothing.

So i've added a bunch more debug print statements to see if I can track
it down. The code will spit lots of data at you if you run it as is.

I'm starting to think the vector draw commands are using a different
co-ordinate system than the move commands, but can't see any reason for
that...
serial_comms_function.pdf
twti-NOAPIKEY.py

Mark Benson

unread,
Jan 24, 2016, 2:56:29 PM1/24/16
to bournemouth-re...@googlegroups.com
I've run it with a serial monitor and I can see it getting out of sync.
The python code isn't waiting for the 'READY' and is reading the 'READY'
and 'SYNC' data from the previous command.

I also spotted a typo in the 'draw vector' commands that were causing
the 'MSG,E,Line is not on the page. Skipping it.' error. I created a new
test case and the commands are working.

Need to fix the read sync issue now.

Mark Benson

unread,
Jan 24, 2016, 2:59:32 PM1/24/16
to bournemouth-re...@googlegroups.com
This is the extra test case:

def test4():
# Move & Draw
commandList =
["C01,601,1219,END\n","C17,1217,608,2,END\n","C17,2077,1788,2,END\n","C17,1791,2076,2,END\n","C17,601,1212,2,END\n"]
print("Test: Move to top left then draw a line to all 4 corners of
the page ending up where we started")

for each in commandList:
print("Command to send: '%s'" % each)
writeCommandToPolargraph(each)
input("Command completed, press enter to continue")
input("Test completed, press enter to continue")

I am including the optional 'segment length' parameter (the '2' in the
above commands) which seems to keep it happy...

Mark Benson

unread,
Jan 24, 2016, 3:21:07 PM1/24/16
to bournemouth-re...@googlegroups.com
Removed the buffer flush and it works with test4() but test3() fails
when using the exact same co-ordinates... after the failure it all gets
out of sync again.

But I can let test4() run repeatedly without error...

Anyway, i've taken out the debug print statements and attached it.
twti-NOAPIKEY.py

Bonkers

unread,
Jan 25, 2016, 11:33:40 AM1/25/16
to Make Bournemouth Forum
Mark

This feels like very (unfortunately) familiar territory. Python is an interpreted language....so you need to ensure that the test, process, output, and flag check portions are all the right way round and timing has been thought out. I played this stupid game for years "back in the day"....novelty wears off V quickly.  I will try to get there on thurs......will bring a scope if think it will help (it normally does)....then you get to see the true horror of all the jitter.

PS I've even seen Microchip ISR code do the classic...in the base level------decrement counter using a free running clock, see if it is zero, if zero reload counter and do summat.......(completely ignoring the fact that if a long enough interrupt occurs, it will miss the zero state and clock over to max count again!!) This is why God gave us set/reset flags LOL.


On Monday, 30 November 2015 14:29:09 UTC, Mark Benson wrote:

Mark Benson

unread,
Jan 25, 2016, 12:16:12 PM1/25/16
to bournemouth-re...@googlegroups.com
My first attempt wasn't thought out - it was a quick hack/proof of
concept.

Yesterdays attempt was a bit more thought out. But even that had extra
code chucked at it as an after thought so i'm not guaranteeing it fit
for purpose :) I suspect that there are hidden timing issues that won't
surface until its been left running and idle for a while... one thing
at a time.

Eds away Thursday, so the Uni is a no go. Will be a 'virtual' meeting.
Which I guess will be via email/forum or maybe IRC. The Meetup thing has
been updated and a notification sent (for what its worth).

You can test the python with an Arduino and the firmware
(https://github.com/MarkJB/polargraph_server_a1) if you have some time
and want to help debug the issue.

On 2016-01-25 16:33, Bonkers wrote:
> Mark
>
> This feels like very (unfortunately) familiar territory. Python is an
> interpreted language....so you need to ensure that the test, process,
> output, and flag check portions are all the right way round and timing
> has been thought out. I played this stupid game for years "back in the
> day"....novelty wears off V quickly. I will try to get there on
> thurs......will bring a scope if think it will help (it normally
> does)....then you get to see the true horror of all the jitter.
>
> PS I've even seen Microchip ISR code do the classic...in the base
> level------decrement counter using a free running clock, see if it is
> zero, if zero reload counter and do summat.......(completely ignoring
> the fact that if a long enough interrupt occurs, it will miss the zero
> state and clock over to max count again!!) This is why God gave us
> set/reset flags LOL.
>
> On Monday, 30 November 2015 14:29:09 UTC, Mark Benson wrote:
>
>> I've been mulling over the Polargraph at the library. i.e. Plotting
>> 'disaster' related tweets as a line graph.
>>
>> Found (and run) this code: https://github.com/ckoepp/TwitterSearch
>> [1]
>>
>> Seems to do what I was thinking about. Returns a bunch of tweets for
>> the
>> 'disaster' keyword. With the data in python we can easily count the
>> number of returned tweets for a given time period and then plot that
>>
>> somehow...
>>
>> Thats the next bit... getting a Polargraph to plot a 'blip'. I guess
>>
>> this is going to have to be done in discreet blocks of time (like
>> every
>> 60 seconds?) so we can work out the plot area, co-ordinate range and
>>
>> ultimately how long it will take to fill a plot area?
>>
>> Have also updated the Polargraph project thing on Trello.
>> https://trello.com/b/2DCorYzc/polargraph-project [2]
>
> --
> You received this message because you are subscribed to the Google
> Groups "Make Bournemouth Forum" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to
> bournemouth-reprap-u...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>
>
> Links:
> ------
> [1] https://github.com/ckoepp/TwitterSearch
> [2] https://trello.com/b/2DCorYzc/polargraph-project

Mark Benson

unread,
Jan 26, 2016, 7:22:09 PM1/26/16
to bournemouth-re...@googlegroups.com
I tried a different approach to reading the data from the serial port.

Instead of using pyserials readln(), I tried using the read(noOfBytes)
using the in_waiting attribute to say how many bytes to read.

This, along with a short delay (long enough for the serial buffer to
receive something from the polargraph electronics) seems to work. See
attachment.

I was also able to remove a kludge I added on Sunday.

Now things are staying in sync as far as the serial comms are concerned.
I've only been bench testing so its possible that the failing commands
are still causing the position of the gondola to get out of whack, so
there is that still to check. Also I will write some more test cases for
longer delays and random (within bounds) draw moves.

As for the failing command, I read and re-read the command page on the
polargraph wiki and it looks like the segment length parameter is not
optional. It also says there is a default ('2' and i'd been thinking it
was '1') which would suggest it is optional. So I tried the failing
commands with a segment length of 1 and they work ok. So yeah, that was
me being stupid...

Back to trying to work out how to plot a graph!
twti-NOAPIKEY.py

Mark Benson

unread,
Jan 27, 2016, 7:05:00 PM1/27/16
to bournemouth-re...@googlegroups.com
Done some work on the function to get the native coords. Attached. Its
setup to run a couple of tests.

The output looks like this:
=======================================================================================
C:\Python\Python35-32>python.exe "z:\Code\Library Polargraph\ik.py

Whole Steps Per MM = 2.1739130434782608
Micro Steps Per MM = 35
Distance between motors in steps = 1326.086956521739
Mid-point between motors in steps = 663.0434782608695

Position to generate coordinates for, are 305mm x 120mm
Expected results are 328mm x 328mm and (711,711)
getStringLength() returns: String lengths: 328mm x 328mm and native
coords are: (713,713)

Position to generate coordinates for, are 100mm x 245mm
Expected results are 265mm x 566mm and (578,1228)
getStringLength() returns: String lengths: 265mm x 566mm and native
coords are: (575,1230)

C:\Python\Python35-32>
=======================================================================================

I reworked the maths a little and the resulting native coords are pretty
close. I guess there is a rounding error somewhere...
ik.py

Mark Benson

unread,
Jan 28, 2016, 6:36:22 PM1/28/16
to bournemouth-re...@googlegroups.com
Thanks for all the pointers and suggestions in IRC. I got a fair bit done.

Brian suggested creating primitives for Polargraph functions so I did
that and lots of things fell into place.

The main file is now called pylargraph.py (blame Chaz for the name! :-) ).

ik.py is still called ik.py and does the inverse kinematics (coordinate
translation).

And its on github: https://github.com/MarkJB/pylargraph

The primitive functions are:

pen()
moveTo()
drawTo()

pen('up/down') takes 'up' (or Up/Up/True/1) or 'down' (or
Down/DOWN/False/0) and executes the Polargraph command C13 or C14 and
sends it to the Polargraph using the writeCommandToPolargraph(command)
function. I haven't tested 1/0/True/False actually works, but
'up'/'down' does.

moveTo(x,y) takes x and y coordinates in mm, calls the conversion
function in ik.py and gets the native coords (i.e. steps from motorA and
motorB), it calls pen('up') (cause this is a move and we don't want the
pen on the page), builds the Polargraph command
'C01,xSteps,ySteps,END\n' and sends it to the Polargraph using the
writeCommandToPolargraph(command) function.

drawTo(x,y,segmentLength) as with moveTo(x,y) but with an extra
parameter that defines how long each segment of the path is. This time
we drop the pen. The Polargraph command to send is
'C17,xSteps,ySteps,segmentLength,END\n'. And finally we call pen('up')
so we don't bleed ink onto the page.

The code is reliably and repeatedly drawing a rectangle with my machine
with this test code:
# top left, top right, bottom right, top left
moveTo(95,240)
drawTo(515,240,2)
drawTo(515,834,2)
drawTo(95,834,2)
drawTo(95,240,2)
# home
moveTo(305,120)

The coords are measurements in mm on my machine.

Mark Benson

unread,
Jan 30, 2016, 5:10:08 PM1/30/16
to bournemouth-re...@googlegroups.com
I'm now able to plot a basic 'blip' graph but I seem to have broken the
twitter search. Its returning a cumulative tweet count that tops out at 100.

For the graph stuff, I added a couple of functions.

drawBlip(xCell, yCell, blipVal)

which draws the 'blip' in a given cell. You define the cell size (in mm)
and the rest is worked out for you.

drawBlip() uses getCellCoordinates(xCell, yCell) to tell it where the
cell is in mm.

The script is set up to plot a full page of 'blips' of random height,
from bottom left to top right one row at a time.

Mark Benson

unread,
Feb 1, 2016, 7:20:43 PM2/1/16
to bournemouth-re...@googlegroups.com
Added a line graph function and fixed some issues with page offsets and
auto centering.

I've set my Polargraph drawing a line graph of random values. It seems
to be doing what I was thinking.

I'll leave it running so it keeps going back to the begining and
plotting over the lines its already drawn and will post a photo if I
remember.

I ran out of fine liners so I'm using the pen Ed gave me a while back.
Its plotting ok so far.

Mark Benson

unread,
Feb 2, 2016, 4:41:21 AM2/2/16
to bournemouth-re...@googlegroups.com
Photo of line graph result attached.

This was left running overnight. At some point the page fell off the
board, but you get the idea...

So next on the agenda for me is to fix the twitter search and get it
running on a Pi.

Ed, it might be worth you thinking about the installation. i.e. What
hardware will we need (printed parts, motors, line, pens etc) and how it
will be installed.

Mark Benson

unread,
Feb 2, 2016, 4:51:15 AM2/2/16
to bournemouth-re...@googlegroups.com
Photo attached...
IMG_20160202_085612.jpg

Mark Benson

unread,
Feb 3, 2016, 5:53:44 AM2/3/16
to bournemouth-re...@googlegroups.com
Another photo. This time, the cell height is 5mm, width = 10mm and max
plot height = 25mm (I think).

3 full pages of plots in 3 colours (Red, blue, green).

Sorry about the focus/exposure. The camera on my phone is knackered...

Next i'll try a height > max plot height so there is white space between
the plots.
IMG_20160203_085159.jpg

Asha Blatherwick

unread,
Feb 3, 2016, 8:15:08 AM2/3/16
to bournemouth-re...@googlegroups.com
you could totes sell that as art, i would buy it!

--
You received this message because you are subscribed to a topic in the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/bournemouth-reprap-user-group/C5wr3zHHw5Q/unsubscribe.
To unsubscribe from this group and all its topics, send an email to bournemouth-reprap-u...@googlegroups.com.

John Morrison

unread,
Feb 3, 2016, 8:23:27 AM2/3/16
to bournemouth-re...@googlegroups.com

Each one unique :-)

You received this message because you are subscribed to the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bournemouth-reprap-u...@googlegroups.com.

Mark Benson

unread,
Feb 3, 2016, 9:37:52 AM2/3/16
to bournemouth-re...@googlegroups.com
Its yours if you want it - otherwise its destined for the recycling bin!

And is that Ed or Asha?

On 2016-02-03 13:15, 'Asha Blatherwick' via Make Bournemouth Forum
wrote:
> You received this message because you are subscribed to the Google
> Groups "Make Bournemouth Forum" group.
> To unsubscribe from this group and stop receiving emails from it, send

Mark Benson

unread,
Feb 3, 2016, 9:39:36 AM2/3/16
to bournemouth-re...@googlegroups.com
I wonder how unique the Python random function is... and if it is Pseudo
random, how many drawings do I need to do before it starts repeating?

ma...@sub-design.co.uk

unread,
Feb 3, 2016, 2:23:19 PM2/3/16
to bournemouth-re...@googlegroups.com
Currently on the machine... (See attachment)

I got bored waiting around for each page to finish so I can change the pen. Now it emails me when it's finished a page.
IMG_20160203_192011.jpg

ma...@sub-design.co.uk

unread,
Feb 3, 2016, 6:29:14 PM2/3/16
to bournemouth-re...@googlegroups.com
Nearly finished. 20 colours... (See photo)

Cell Width = 10
Cell Height = 50
Plot Height = 25
IMG_20160203_232414.jpg
IMG_20160203_232525.jpg

Asha Blatherwick

unread,
Feb 5, 2016, 5:46:50 PM2/5/16
to bournemouth-re...@googlegroups.com

Check it out Mark.
Thanks for the art!
Asha :)

--
You received this message because you are subscribed to a topic in the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/bournemouth-reprap-user-group/C5wr3zHHw5Q/unsubscribe.
To unsubscribe from this group and all its topics, send an email to bournemouth-reprap-u...@googlegroups.com.
IMG_20160205_224405.jpg

John Morrison

unread,
Feb 6, 2016, 3:30:57 AM2/6/16
to bournemouth-re...@googlegroups.com

Looks great :-)

You received this message because you are subscribed to the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bournemouth-reprap-u...@googlegroups.com.

ma...@sub-design.co.uk

unread,
Feb 7, 2016, 9:20:23 AM2/7/16
to bournemouth-re...@googlegroups.com
Wow, looks cool!

Brian Innes

unread,
Feb 7, 2016, 9:51:07 AM2/7/16
to Make Bournemouth Forum

part way through- Close up of spiral-  

simulated plot- original photo-

Got my python library working and also been looking at how to take a photo and get the machine to automatically draw it after the conversation at the Eagle Lab.  First attempt looks good, but far too slow.  I use a spiral algorithm and the python pillow library to handle the image.  To make development  quicker I also added the ability to simulate the plot.  The program only uses moveTo and drawTo to control the Polargraph
(Ignore the aborted print above and the compressed y is a result of me not starting at the correct home position - I moved the pen lower to avoid the previous aborted drawing. 


On Sunday, 7 February 2016 14:20:23 UTC, Mark Benson wrote:
Wow, looks cool!

To unsubscribe from this group and all its topics, send an email to bournemouth-reprap-user-group+unsub...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

ma...@sub-design.co.uk

unread,
Feb 7, 2016, 9:57:19 AM2/7/16
to bournemouth-re...@googlegroups.com
That's pretty impressive for just using the drawTo and moveTo functions.

Have you looked at the in build pixel (or render shaded square or what ever it is called)

I would expect it to be slow.

Mark Benson

unread,
Feb 7, 2016, 10:28:33 AM2/7/16
to bournemouth-re...@googlegroups.com
That should have said 'built in' and its the 'square wave shaded pixel' - C05 (and its counter part the scribble pixel C06)
So screen, such tiny, wow spelling... --
You received this message because you are subscribed to the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bournemouth-reprap-u...@googlegroups.com.

Brian Innes

unread,
Feb 7, 2016, 10:44:01 AM2/7/16
to Make Bournemouth Forum
I did look at those, but I wanted to test the python library, as I've added the transformation functionality to provide a standard coordinate grid (irrespective of paper/machine size).  The spiral 'blip' algorithm also tests out the accuracy of the machine as it only draws very short lines in close proximity.  To make a quicker image plotting capability will probably need to use the built in drawing functions, or come up with a different algorithm that draws fewer, longer lines with less resolution

ma...@sub-design.co.uk

unread,
Feb 7, 2016, 1:24:58 PM2/7/16
to bournemouth-re...@googlegroups.com
How does your standard grid work, given the 'pixel' or grid resolution on the official software is user defined value?

At Eagle Lab you asked about running out of numbers. I read that the internal number system is float based and machines of 9m have been built. I also have seen serial messages of the type 'maxlength' and a big number which might be the maximum string length supported.


On 7 February 2016 15:44:01 GMT+00:00, Brian Innes <briani...@gmail.com> wrote:
I did look at those, but I wanted to test the python library, as I've added the transformation functionality to provide a standard coordinate grid (irrespective of paper/machine size).  The spiral 'blip' algorithm also tests out the accuracy of the machine as it only draws very short lines in close proximity.  To make a quicker image plotting capability will probably need to use the built in drawing functions, or come up with a different algorithm that draws fewer, longer lines with less resolution


ward...@gmail.com

unread,
Feb 8, 2016, 11:11:51 AM2/8/16
to Make Bournemouth Forum
Really cool guys! Very clever indeed. Will have to get the 'full size' flavor up and running in order to get something prototyped! Also, might have to get Asha to show me how to get the Pro Mini to run after she found the tutorial to make it visible to our comps.

Brian Innes

unread,
Feb 8, 2016, 2:05:22 PM2/8/16
to Make Bournemouth Forum
I let the user define how many pixels are across the shorter side (width in portrait) of the page. The drawing cords are then based on a grid of that dimensions, moving between paper sizes means the plotted image will be scaled, as the same grid size is used.

Brian Innes

unread,
Feb 8, 2016, 2:06:45 PM2/8/16
to Make Bournemouth Forum
I have the driver for Mac as I've the same device

Mark Benson

unread,
Feb 9, 2016, 9:23:31 AM2/9/16
to bournemouth-re...@googlegroups.com
I would stick to defining a single pixels size as that has a knock on
effect for the shaded square wave pixel, where there is a minimum
physical pixel size for a given pen tip, in which it is possible to plot
all the shading levels.

In the original Polargraph software, there is the option to provide some
padding or overlap between pixels.

ward...@gmail.com

unread,
Feb 12, 2016, 6:36:03 AM2/12/16
to Make Bournemouth Forum
The library wall is 11.5m x 1.8m

So maybe some portrait images after all...

Mark Benson

unread,
Feb 12, 2016, 6:43:08 AM2/12/16
to bournemouth-re...@googlegroups.com
That doesn't sound very tall?!?

I'd like to read the stuff Brian mentioned about the plot-able area,
because I keep coming back to this:

http://www.polargraph.co.uk/2014/10/huge-portland-design-week-project/

Edward Ward

unread,
Feb 13, 2016, 4:38:26 AM2/13/16
to Mark Benson, bournemouth-re...@googlegroups.com

Yes, alarmingly small(?) – it has a board on the wall already, and that is what I think we’ll be working on. That was 1.8m – had around 200mm above it – could possibly mount the motors higher..?

 

 

 

 

 

Sent from Mail for Windows 10

 

From: Mark Benson
Sent: 12 February 2016 11:43
To: bournemouth-re...@googlegroups.com
Subject: Re: [MakeBmth] Re: Polargraph at the library

 

That doesn't sound very tall?!?

--

You received this message because you are subscribed to a topic in the Google Groups "Make Bournemouth Forum" group.

To unsubscribe from this topic, visit https://groups.google.com/d/topic/bournemouth-reprap-user-group/C5wr3zHHw5Q/unsubscribe.

To unsubscribe from this group and all its topics, send an email to bournemouth-reprap-u...@googlegroups.com.

Mark Benson

unread,
Feb 13, 2016, 1:29:56 PM2/13/16
to bournemouth-re...@googlegroups.com
That might work. The idea of mounting the motors on a long board that can be installed above the drawing area seems sensible.

As for pylargraph, I've fixed the twitter search. Turns out you have to explicitly tell it you want to search keywords with OR or else it kinda craps out if you have more than 2 keywords. Wasted hours on that :(

Anyway, for what its worth, its on github https://github.com/MarkJB/pylargraph

As usual, its missing the twitter search API key, so if you want to try it, you will need to setup a twitter dev account.

I also made a few tweaks to get it to run with python 2.7 as that is what comes as default with raspbian.

So right now I have it running on a Raspberry Pi 2, drawing a line graph based on actual twitter search data grabbed over WiFi. I'll post a pic if it runs for long enough to draw something interesting (and the pen doesn't dry out).

During testing, the twitter search would crap out occasionally and exit the python so I tried handling the errors during testing but it still manged to exit... maybe Brian can suggest how the errors can be caught and handled.

edward ward

unread,
Feb 13, 2016, 4:08:04 PM2/13/16
to bournemouth-re...@googlegroups.com
Do you think that there is any point redesigning the gondola as both running currently appear to be working well! I suppose there is the bobbin thing we need to prove..

No idea when I will get time to implement anything!

From: Mark Benson
Sent: ‎13/‎02/‎2016 18:29

ma...@sub-design.co.uk

unread,
Feb 13, 2016, 4:22:09 PM2/13/16
to bournemouth-re...@googlegroups.com
I need to redo the scad files for my gondola as they don't compile correctly anymore, so cant print another. Did you ever prove your design? Not sure which design Brian is using.

There are plenty of designs to chose from. Guess that choice is down to finding one that works near vertical with whatever pen we will be using.

Definitely need to try the bobbins and spectra line.

Mark Benson

unread,
Feb 14, 2016, 4:39:42 AM2/14/16
to bournemouth-re...@googlegroups.com
851 twitter searches and ~16hrs later and its almost fished a page. (See photo). This was plotted without any scaling of the twitter data. If it returned 100 results (the Max number of results per api search call) then the graph data point is 100mm above the baseline.
Sent from my Android device with K-9 Mail. Please excuse my brevity.
IMG_20160214_093331.jpg

ma...@sub-design.co.uk

unread,
Feb 14, 2016, 4:57:56 AM2/14/16
to bournemouth-re...@googlegroups.com
Oh yeah, its searching for recent tweets that contain the key words "poverty", "disaster", " homeless", "banking"...

Mark Benson

unread,
Feb 14, 2016, 2:05:04 PM2/14/16
to bournemouth-re...@googlegroups.com
Found a gotcha involving the way Python rounds numbers between the different versions. The coordinates were different on Python 2.7 vs 3.x. Didn't seem to cause any issues, but its fixed anyway.

Fixed a few other issues and tidied up the code a bit more...
So screen, such tiny, wow spelling... --
You received this message because you are subscribed to the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bournemouth-reprap-u...@googlegroups.com.

Mark Benson

unread,
Feb 14, 2016, 3:40:49 PM2/14/16
to bournemouth-re...@googlegroups.com
Printed parts now updated on github. https://github.com/MarkJB/Polargraph-printed-parts

Will try and get them on thingiverse as well.

I've fixed the scad files and modified the pen holder to be push fit. I haven't printed this to test it so it might not be right yet. I guess that is next on the list... fix a 3d printer so I can test them!

Edward Ward

unread,
Feb 17, 2016, 12:45:03 PM2/17/16
to Mark Benson, bournemouth-re...@googlegroups.com

Hi guys,

 

Just spoke with the gallery officer lady, the installation has to be up by the 2nd April!

 

Sent from Mail for Windows 10

 

From: Mark Benson
Sent: 14 February 2016 20:40
To: bournemouth-re...@googlegroups.com
Subject: Re: [MakeBmth] Re: Polargraph at the library

 

Printed parts now updated on github. https://github.com/MarkJB/Polargraph-printed-parts



Will try and get them on thingiverse as well.

I've fixed the scad files and modified the pen holder to be push fit. I haven't printed this to test it so it might not be right yet. I guess that is next on the list... fix a 3d printer so I can test them!

On 14/02/2016 19:05, Mark Benson wrote:

Found a gotcha involving the way Python rounds numbers between the different versions. The coordinates were different on Python 2.7 vs 3.x. Didn't seem to cause any issues, but its fixed anyway.

Fixed a few other issues and tidied up the code a bit more...

On 14/02/2016 09:57, ma...@sub-design.co.uk wrote:

Oh yeah, its searching for recent tweets that contain the key words "poverty", "disaster", " homeless", "banking"...

On 14 February 2016 09:39:49 GMT+00:00, Mark Benson <ma...@sub-design.co.uk> wrote:

851 twitter searches and ~16hrs later and its almost fished a page. (See photo). This was plotted without any scaling of the twitter data. If it returned 100 results (the Max number of results per api search call) then the graph data point is 100mm above the baseline.

On 13 February 2016 21:21:56 GMT+00:00, ma...@sub-design.co.uk wrote:

I need to redo the scad files for my gondola as they don't compile correctly anymore, so cant print another. Did you ever prove your design? Not sure which design Brian is using.

There are plenty of designs to chose from. Guess that choice is down to finding one that works near vertical with whatever pen we will be using.

Definitely need to try the bobbins and spectra line.

On 13 February 2016 21:07:59 GMT+00:00, edward ward <ward...@gmail.com> wrote:

Do you think that there is any point redesigning the gondola as both running currently appear to be working well! I suppose there is the bobbin thing we need to prove..

No idea when I will get time to implement anything!

ward...@gmail.com

unread,
Feb 17, 2016, 2:02:06 PM2/17/16
to Make Bournemouth Forum, ma...@sub-design.co.uk, ward...@gmail.com
Ok...

failing at the first obstacle - cannot find the polargraph! I have all the bits and bobs, just no Arduino / shield!

Having to tidy up the studio now, which is rather challenging as it hasn't been in since we moved! Going to buy a toolbox... might still be catching up tomorrow!

ma...@sub-design.co.uk

unread,
Feb 17, 2016, 2:04:42 PM2/17/16
to bournemouth-re...@googlegroups.com
I have a spare PCB with Arduino I've been using as a test rig. I'll bring that just in case. It should be plug'n'play.

edward ward

unread,
Feb 17, 2016, 2:13:54 PM2/17/16
to bournemouth-re...@googlegroups.com
Cool😃

From: ma...@sub-design.co.uk
Sent: ‎17/‎02/‎2016 19:04

To: bournemouth-re...@googlegroups.com
Subject: Re: [MakeBmth] Re: Polargraph at the library

--

Mark Benson

unread,
Feb 18, 2016, 11:40:36 AM2/18/16
to bournemouth-re...@googlegroups.com
Who needs string?

http://sonicedevelopment.com/emerging-colorspace/

(I'd guess it uses a fan to keep itself stuck to the wall?)

On 2016-02-17 19:13, edward ward wrote:
> Cool😃
>
> -------------------------
> You received this message because you are subscribed to the Google
> Groups "Make Bournemouth Forum" group.
> To unsubscribe from this group and stop receiving emails from it, send

Edward Ward

unread,
Feb 18, 2016, 12:34:47 PM2/18/16
to Mark Benson, bournemouth-re...@googlegroups.com

ward...@gmail.com

unread,
Feb 29, 2016, 9:10:40 AM2/29/16
to Make Bournemouth Forum, ma...@sub-design.co.uk, ward...@gmail.com
OK - shopping list

3x raspberry pi
6xServo 17 slim
6x Drv8825
Spectra fishing line
Power supply 12v
Leads sub
3 core cable
Melamine mdf

Mark Benson

unread,
Feb 29, 2016, 9:35:48 AM2/29/16
to bournemouth-re...@googlegroups.com
Was 17 slim, the Nema17 motors x6?

Also need 4 core cable for the motors or is that Leads sub?

Might be easier to check if I re-create the list:

3 x RPi (Pi v2 or Pi v3)
3 x RPi PSU (5v 2A)
3 x Arduino Nano
3 x Servo (9G)
3 x 12v PSU (12v 1A)
6 x DRV8835 or a4988 stepstick modules
6 x NEMA17 bipolar stepper motor
3 x Mini USB cable
3 x Micro USB cable (for Pi power if the PSUs don't come with their own
lead)

4 core cable (stepper motors)
3 core cable (servo cable)
Spectra line
Melamine MDF

I guess fixtures and fittings can be 3d printed...

Might be worth getting a few spare stepsticks and Nanos if the budget
will stretch that far.


ward...@gmail.com

unread,
Feb 29, 2016, 10:01:34 AM2/29/16
to Make Bournemouth Forum

could we get away with this, or would you prefer 3x socket adaptors?

http://uk.rs-online.com/web/p/embedded-switch-mode-power-supplies-smps/6210629/

I specc'd the steppers as full size...17, that is

Mark Benson

unread,
Feb 29, 2016, 10:06:29 AM2/29/16
to bournemouth-re...@googlegroups.com
I'd go with 3x socket adaptors...

'Full size' NEMA17 is fine. We can mount the steppers back to front if
needed. (like this:
http://freedees.com/media/full/73ebc7a3532bf59516cdb0103218bd04ea2e917e_lvNI1FW.jpg
)

ward...@gmail.com

unread,
Feb 29, 2016, 11:47:01 AM2/29/16
to Make Bournemouth Forum
https://onedrive.live.com/redir?page=view&resid=EE16AC3F416E81A3!7085&authkey=!AC-w3h0Lq9Fl5BU

You should be able to edit that - let me know.

USB hub is something I want but will plop it into the project cost

cannot find 3 core wire on RS that looks suitable!

Mark Benson

unread,
Feb 29, 2016, 12:26:32 PM2/29/16
to bournemouth-re...@googlegroups.com
Yup I can edit it.

I think we can get away with the 4 core for the servos. If it is too
heavy or thick I have some servo wire somewhere...

The power supplies you've selected are only 500mA (0.5A). That might be
enough, I haven't actually worked it out or measured the supply current,
but I'd think 1A is a better option.

The Mini USB cables can be short
(http://www.amazon.co.uk/Mini-USB-cable-10cm-System-S/dp/B004A9JJ3G/ref=sr_1_1?s=computers&ie=UTF8&qid=1456766543&sr=1-1&keywords=mini+usb+short)
IF we are planning on mounting the electronics behind some perspex next
to the drawing area - they only need connect the Pi to the Arduino. We
would need longer Micro USB cables for the power to the Pi though. We
might also need extensions for the DC PSUs depending on how long they
are and where they will be placed.

Mark Benson

unread,
Feb 29, 2016, 2:24:41 PM2/29/16
to bournemouth-re...@googlegroups.com
I missed the fact that the micro usb cables are 5m. Doubt we will need
longer than that.

ward...@gmail.com

unread,
Feb 29, 2016, 2:27:28 PM2/29/16
to Make Bournemouth Forum
ok, amended.

yeah, long cables eh! I thought we could always stash it behind something if its toooo long?

also, might need that myself once done with it in the gallery ;)

Edward Ward

unread,
Mar 3, 2016, 5:39:44 PM3/3/16
to Make Bournemouth Forum

So there has been some activity on this end.

 

I got the polargraph to draw a vector!

 

 

That cell size is more like it! That paper I got us, still has quite a texture. I think i’ll try the Bristol board I have next (very smooth paper).

 

 

 

In true fashion, I printed my drawings over tests! Changing the paper ads what, another 2 or 3 mins, and who has that kind of time?!

 

 

The wobbly line on his head is where I caught it and tried to fix the pen mounting mid print.

 

There is also a questionable interpretation of the weapon on his chin.... ‘cock chin cannon ‘ as its now called....

 

Also, areas of the drawing are faint – don’t know why. Also, curves are rather shonky.

 

 

Also, first print in ABS – went reasonably well!

 

All parts have been ordered, will keep an eye out on the amazon components to ensure they don’t take 100 years to arrive.

 

Can start printing the parts when we’re ready as well. Maybe meet / chat soon so we can get those sorted? Can open the house on Sunday for a few hours?

 

 

 

Sent from Mail for Windows 10

 

From: ward...@gmail.com
Sent: 29 February 2016 19:27
To: Make Bournemouth Forum
Subject: Re: [MakeBmth] Re: Polargraph at the library

 

ok, amended.

 

yeah, long cables eh! I thought we could always stash it behind something if its toooo long?

 

also, might need that myself once done with it in the gallery ;)

 

--

ma...@sub-design.co.uk

unread,
Mar 3, 2016, 5:57:28 PM3/3/16
to bournemouth-re...@googlegroups.com
Looks good!

Curves looked a bit shonky when I tried vectors. The software isn't great at doing curves. If Brian can implement vectors in Picupi that would probably give better results.

Lightness might be lack of pressure on the pen.

I managed to get the Huxley up and running so can print parts if needed. Meeting up might be a good idea but not sure I can do Sunday.

Brian Innes

unread,
Mar 4, 2016, 7:28:33 PM3/4/16
to Make Bournemouth Forum
OK the good news is that I've made quite a bit of progress on the python library, now working quite well on the bits I've implemented.  The norwegian spiral renderer of JPG files is there and the initial implementation of SVG (paths with only move and line commands) - so I can draw the SVG file I had when we were under the hilton.  If you can provide a vector file you want to be able to draw I can look at what elements and path commands it uses and focus my effort on adding those parts to the vector implementation.

To give an example of how easy it is to use the library here are some commands:

filename = "Vulcan.jpg"
with Polargraph() as p:
renderNorwegianSpiral(filename, 300, 200, 600, 9.6, 10, 3, p)
renderNorwegianSpiral(filename, 200, 1000, 800, 9.7, 10, 3, p)
renderNorwegianSpiral(filename, 0, 1950, 1200, 9.8, 10, 3, p)
renderNorwegianSpiral(filename, 1200, 0, 3800, 9.9, 10, 3, p)
p.goHome()

generates (using the simulated draw function):

and 


filename = "Vulcan.svg"

with Polargraph() as p:
p.setShowDrawing(True)
p.setPlotting(False)
renderSVG(filename, 300, 200, 600, p)
renderSVG(filename, 200, 1000, 800, p)
renderSVG(filename, 0, 1950, 1200, p)
renderSVG(filename, 1200, 0, 3800, p)
p.goHome()

generates:

all code is on the github : https://github.com/brianinnes/pycupi.git


Mark Benson

unread,
Mar 5, 2016, 6:22:21 AM3/5/16
to bournemouth-re...@googlegroups.com
Cool - will send a vector with curves for you to try...

From the code (https://github.com/brianinnes/pycupi/blob/master/python/Pylargraph/renderers/norwegianSpiral.py) renderNorwegianSpiral(fileName, x, y, width, density, maxDensity, resolution, drawer)

Is x & y the (native?) coords where the drawing should be started or the size of area to plot?

How are density, maxDensity and resolution related?
--
You received this message because you are subscribed to the Google Groups "Make Bournemouth Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bournemouth-reprap-u...@googlegroups.com.

Brian Innes

unread,
Mar 5, 2016, 9:42:14 AM3/5/16
to Make Bournemouth Forum
Thanks Mark, 

wow - there is not much of the SVG spec that the file you sent me doesn't use - even includes embedded png image!

I've uploaded an image to the github wiki that explains the coords systems being used.  All the drawing functions use a pixel grid created over the drawing area of the paper : https://github.com/brianinnes/pycupi/wiki/Coordinate-system.  All the details are provided in a config file that should be located in .polargraph/config.cfg  file in the home directory (works same on windows, mac and linux)

Here is my config.cfg file (note I have defined a number of different paper sizes, just comment out the ones not being used)

[Polargraph]
pensize = 0.5
machinewidth = 615
machineheight = 1010
mmperrev = 113.1
stepsperrev = 200
stepmultiplier = 8
serialport = /dev/cu.wchusbserial1410
timesliceus = 2048.0
baud = 57600
motoraccel = 0.50
motormaxspeed = 100.0
penup = 170
pendown = 80
homex = 307
homey = 227
polarDraw = true

;[Paper]
;size = A1
;width = 594
;height = 841
;posx = 12
;posy = 227
;margin = 88
;pixels = 5000
;rotate = false

;[Paper]
;size = A2
;width = 420
;height = 594
;posx = 83
;posy = 320
;margin = 30
;pixels = 5000
;rotate = false

[Paper]
size = A3p
width = 420
height = 297
posx = 83
posy = 398
margin = 20
pixels = 5000
rotate = false

;[Paper]
;size = A3TopLeftQuarter
;width = 210
;height = 148
;posx = 83
;posy = 398
;margin = 30
;pixels = 3000
;rotate = false

[Screen]
screenX = 5000
showImage = false
saveImage = false

Brian Innes

unread,
Mar 5, 2016, 9:52:56 AM3/5/16
to Make Bournemouth Forum
The parameters are:
x, y                            - Where the top left pixel of the drawing should be on the page (in drawing pixel coordinates)
width                         - the width of the bounding box for the image.  The image is scaled to keep aspect ration to make the image width match this parameter
density, max density - calculate the density of the spiral used to plot the image.  Think of it as a rage 0 - 1, density/maxdensity
resolution                  - specifies how close along the path of the spiral points are taken (pixels).  There is 1 'blip' per point
drawer                       - the polygraph object or constraining box object to be used to render the image

Mark Benson

unread,
Mar 5, 2016, 1:26:00 PM3/5/16
to bournemouth-re...@googlegroups.com
No surprise... it was an illustrator export to SVG.

The diagram and your last two emails help explain it - might be worth putting that text in a readme (if not the main readme, then in with the renderers would be helpful).

If I could wrap my head around your code, i'd like to try and implement the twitter graph and maybe the original Polargraph pixel renderer (the shaded square wave that runs in an arc relative to one motor). Might see if I can get Picupi running on my machine tomorrow if I have time and assuming I can find enough counter weights!

Also I've put all my Polargraph printed parts on Thingiverse - see here: http://www.thingiverse.com/MarkBenson/collections/polargraph

They are on github too - https://github.com/MarkJB/Polargraph-printed-parts

Brian Innes

unread,
Mar 5, 2016, 4:03:20 PM3/5/16
to Make Bournemouth Forum
I need to take a little time to create some docs in the github wiki, as the code has no comments (my bad!!!)

SVG renderer has been committed with much improved functionality.  The Quadratic bezier curve and some of the basic drawing elements still need to be implemented.  There is in interesting implementation challenge regarding what the stroke and fill attributes mean to a Polargraph? : a thick, stroked, straight line is a filled rectangle?

You should be able to convert your twitter graph to the pycupi library, as it uses moveTo and drawTo commands - which the library provides.

The pixel render may take a little more effort and maths :)

Mark Benson

unread,
Mar 6, 2016, 10:46:15 AM3/6/16
to bournemouth-re...@googlegroups.com
Are you taking pull requests for comments then? I've added a few to explain the config for the Arduino code...

Tried test1.py and it is working. My new Gondola is a bit sticky so its jumping around, but that should get better with use (and extra weights).

The pen lift range is messed up so I wanted to write a test script that would initially do a pen up and pen down repeatedly so I can see whats going on without being distracted by actually drawing something.

I tried re-purposing test1:

...
import time
...
with Polargraph() as p:
    try:
        #p.moveTo(0, 0)
        p.moveTo(p.config.pixels/2, p.config.heightPixels/2)
        while True:
            p.penUp()
            time.sleep(5)

But it doesn't do much - penUp doesn't appear to take any parameters so I figured it just toggled... what am I doing wrong?

Mark Benson

unread,
Mar 6, 2016, 11:26:31 AM3/6/16
to bournemouth-re...@googlegroups.com
So it will only render svgs - it won't draw them yet? (might explain why it crapped itself when I set plotting to true for a vector).

Also wanted to ask, test2 draws a grid of spirals... the spirals start off really really fast and reach a sensible speed as they get bigger. Does acceleration affect that? (I turned it down to 0.2 and it doesn't appear to have made any difference) I was expecting it to start off slow and speed up and slow down towards the end of the spiral.


On 05/03/2016 21:03, Brian Innes wrote:

Brian Innes

unread,
Mar 6, 2016, 12:09:53 PM3/6/16
to Make Bournemouth Forum
This is me optimising out unneccesary pen up/down commands, as these are slow.  I also optimise out moves, if multiple moves are concurrently sent then nothing is sent to the polygraph until a draw command is received, then it does the last move before the draw.  You can bypass the optimisation code by sending coordinates directly using the sendCommand(coord) method of the Polargraph object.

To create a coordinate you can use:

p.sendCommand(Coordinate.fromCoords(x, y, False))

where False parameter is pen up (True) or pen down (False)

Brian Innes

unread,
Mar 6, 2016, 12:14:54 PM3/6/16
to Make Bournemouth Forum
I kept this functionality the same as how the gocupi code works:

Acceleration is the time taken for the motors to accelerate to the target cruising speed or decelerate to a stop.

MaxSpeed is the parameter that controls the maximum speed the motors reach.  For spirals not to spin out of control I needed to lower the max speed config setting

There are the values I have set, which work for me:

Brian Innes

unread,
Mar 6, 2016, 4:33:13 PM3/6/16
to Make Bournemouth Forum
Added a new spiralArc renderer.  Not quite the pixel renderer in the Polargraph controller, but similar path but the pixels are spirals of varying size and density:

I also added a new test application called renderer.py which puts high def and lower def versions of the norwegianSpiral and spiralArc renderers side by side on a page.  Here is a printed version of the Vulcan and a simulated plot of Hampton Court


All are in the git repository now
It is loading more messages.
0 new messages