Monthly Archives: September 2018

3D nyomtatás: naEzMi #23?

A feladat a szokásos: virtuális sörért kitalálni, mit hegesztek már megint:

A méretek mm-ben vannak most is:

Szerintem most is gyorsan meglesz, úgyhogy hajrá!

Update: két nanoszekundum alatt meglett a megfejtés, granulálok a versenyzőknek. Tibb kért belőle egy háromszög alakú verziót, az ilyen lett:

Update #20180921: elkészült a print, szerintem a 90 mm-es átmérő az ideál (=körbejártam a lakást és mindent megmértem, ami csak kicsit is üveg formájú volt). A modellt viheted a youmagine.com-ról (feltettem 80-120 mm-ig 5 mm-es lépésközzel verziókat, vagy csinálhatsz magadnak spécit, ha birizgálod a Fusion 360 design d_bottle paraméterét). Ilyen lett a végtermék:

Songwhip

Utálod, hogy nem minden ismerősöd ugyanazt a streaming zenei szolgáltatót használja? Erre találták ki a songwhip.com oldalt: megkeresi neked a tracket minden streaming music service-ben és kiteszi a linkjeiket egy listába. Ordít róla, hogy ebből Alfred workflowt kell csinálni (Ottó régóta kérte már ezt tőlem, plusz tök jó érzés pont pénteken kipipálni egy pet projektet).

Csak egy kis Python kell hozzá XPath-tal és már ki is túrtuk a lényeget:

#!/usr/bin/python
import sys, os, json, requests
from lxml import html
 
# get url from clipboard
url = os.getenv('cb')
 
query = 'https://songwhip.com/' + url
page = requests.get(query)
url = page.url
tree = html.fromstring(page.content)
 
data = { "items": [] }
 
mods = {
	"cmd": {
		"subtitle": "Copy link to clipboard"
	},
	"alt": {
		"subtitle": url
	}
}
 
song = tree.xpath('/html/head/title/text()')[0]
 
data["items"].append({"valid": True, "uid": "00songwhip", "title": "SongWhip", "subtitle": song, "arg": url, "icon": {"path": "icon.png"}, "mods": mods})
 
items = tree.xpath('//a[@role="button"]')
i = 0
for item in items:
	i = i + 1
	title = item.text
	url = item.get("href")
	file_icon = "icons/icon.png"
	if os.path.isfile("icons/" + title + ".png"): 
		file_icon = "icons/" + title + ".png"
	mods = {
		"cmd": {
			"subtitle": "Copy link to clipboard"
		},
		"alt": {
			"subtitle": url
		}
	}
	data["items"].append({"uid": str(i).rjust(2,"0") + title, "title": title, "subtitle": song, "arg": url, "icon": {"path": file_icon}, "mods": mods})
 
sys.stdout.write(json.dumps(data))

Installáld a workflowt, másolj be egy music streaming URL-t a kedvenc streaming szolgáltatásodból a clipboardba, majd Alfredben add ki a "sw" keywordöt és voila:

Ha tetszik, viheted a packal.org-ról. Have fun!

3D nyomtatás: boxgyár

A dolog onnan indult, hogy meguntam visszapakolni a kis szar zacskójába a fogselymes műanyag fogpiszkálókat, amik a fürdőszobai polcon laktak. Terveztem is nekik gyorsan egy kényelmes méretű boxot, rövid, ám annál brutálisabb menetű kupakkal:

Kinyomtattam egyet, aztán rájöttem, hogy ez a fültisztító pálcikáknak is jó lenne... meg más méretben még egy csomó mindennek, úgyhogy a parametrikus Fusion 360 designnak hála, gyorsan csináltam is két másikat:

Innentől nincs messze a megalomán állat fázis, amikor csillió méretű dobozt akarsz azonnal. Persze minden codervérű lélekben azonnal behúz az utálkozás trigger, amint egynél többször kell neki a "beállítom a magasság paramétert + elindítom az STL exportálást" workflowt végrehajtania. Szerencsére a Fusion 360-hoz van cuki API, onnan meg már csak egyetlen lépés, hogy egy script exportálja helyettünk a csitrillió méretű dobozt STL-be.

A design hierarchia egyszerű, mint egy faék: egy komponensben lakik két body, az egyik a doboz, a másik a kupak:

Erre simán lehet lőni mondjuk Pythonnal:

import adsk.core, adsk.fusion, adsk.cam, traceback
 
def dumpSTL(design, body, filename):
    exportMgr = design.exportManager
 
    stlExportOptions = exportMgr.createSTLExportOptions(body, filename)
    stlExportOptions.meshRefinement = adsk.fusion.MeshRefinementSettings.MeshRefinementHigh
    stlExportOptions.sendToPrintUtility = False
 
    exportMgr.execute(stlExportOptions)
 
 
def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
        design = adsk.fusion.Design.cast(app.activeProduct)
 
        folder = '/Users/fns/Desktop/'
        parentCompName = 'stick box'
        # get parameters
        h_box = design.userParameters.itemByName('h_box')
        w_box = design.userParameters.itemByName('w_box')
 
 
        # locate our component
        allComp = design.allComponents        
        for comp in allComp:            
            if comp.name == parentCompName:            
 
                bodies = comp.bRepBodies
                for body in bodies:
                    if body.name == "box":
                        body_box = body
                    else:
                        body_cap = body
 
                # dump cap
                filename = folder + body_cap.parentComponent.name + " - " + body_cap.name + " " + w_box.expression + '.stl'
                dumpSTL(design, body_cap, filename)
 
                # dump all boxes
                for h in range(10, 100, 10):
                    h_box.expression = str(h)
                    adsk.doEvents()
 
                    filename = folder + body_box.parentComponent.name + " - " + body_box.name + " " + w_box.expression + ' - ' + h_box.expression + '.stl'
                    dumpSTL(design, body_box, filename)
 
        ui.messageBox('Finished.', 'exportBoxes')
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()), 'exportBoxes')

A Fusion 360 CAD file-t a Python scripttel és a generált STL-ekkel együtt szedheted a youmagine.com-ról.