def createRobotExtender(part, length, material): cylindergeometryC = JSConstructor(THREE.CylinderGeometry) #CylinderGeometry(radiusTop, radiusBottom, height, radiusSegments, heightSegments, openEnded) cylindergeometry = cylindergeometryC(22, 22, 6, 32) meshC = JSConstructor(THREE.Mesh) cylinder = meshC(cylindergeometry, material) part.add(cylinder) for i in range(4): cubegeometryC = JSConstructor(THREE.CubeGeometry) #CubeGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) cubegeometry = cubegeometryC(4, length, 4) meshC = JSConstructor(THREE.Mesh) box = meshC(cubegeometry, material) if i < 2: box.position.x = -8 else: box.position.x = 8 box.position.y = length / 2 if i % 2: box.position.z = -8 else: box.position.z = 8 part.add(box) cylindergeometry = cylindergeometryC(15, 15, 40, 32) meshC = JSConstructor(THREE.Mesh) cylinder = meshC(cylindergeometry, material) cylinder.rotation.x = 90 * math.pi / 180 cylinder.position.y = length part.add(cylinder)
def createRobotExtender(part, length, material): cylindergeometryC = JSConstructor(THREE.CylinderGeometry) cylindergeometry = cylindergeometryC(22, 22, 6, 32) meshC = JSConstructor(THREE.Mesh) cylinder = meshC(cylindergeometry, material) part.add(cylinder) for i in range(4): cubegeometryC = JSConstructor(THREE.CubeGeometry) cubegeometry = cubegeometryC(4, length, 4) meshC = JSConstructor(THREE.Mesh) box = meshC(cubegeometry, material) if i <2: box.position.x = -8 else: box.position.x = 8 box.position.y = length/2 if i%2: box.position.z = -8 else: box.position.z = 8 part.add( box ) cylindergeometry = cylindergeometryC(15, 15, 40, 32) meshC = JSConstructor(THREE.Mesh) cylinder = meshC(cylindergeometry, material) cylinder.rotation.x = 90 * math.pi/180 cylinder.position.y = length part.add(cylinder)
def createRobotCrane(part, length, material): cubegeometryC = JSConstructor(THREE.CubeGeometry) cubegeometry = cubegeometryC(18, length, 18) meshC = JSConstructor(THREE.Mesh) box = meshC(cubegeometry, material) box.position.y = length/2 part.add(box) spheregeometryC = JSConstructor(THREE.SphereGeometry) spheregeometry = spheregeometryC(20, 32, 16) meshC = JSConstructor(THREE.Mesh) sphere = meshC(spheregeometry, material) # place sphere at end of arm sphere.position.y = length part.add(sphere)
def createRobotCrane(part, length, material): cubegeometryC = JSConstructor(THREE.CubeGeometry) cubegeometry = cubegeometryC(18, length, 18) meshC = JSConstructor(THREE.Mesh) box = meshC(cubegeometry, material) box.position.y = length / 2 part.add(box) spheregeometryC = JSConstructor(THREE.SphereGeometry) #SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength) spheregeometry = spheregeometryC(20, 32, 16) meshC = JSConstructor(THREE.Mesh) sphere = meshC(spheregeometry, material) # place sphere at end of arm sphere.position.y = length part.add(sphere)
def __init__(self, width, height, onclose): self._w = window.open("", "") self._stage = JSConstructor(GFX.Container)() self.width = width if width != 0 else int(window.innerWidth * 0.9) self.height = height if height != 0 else int(window.innerHeight * 0.9) self._renderer = GFX.autoDetectRenderer(self.width, self.height, {'transparent': True}) self._w.document.body.appendChild(self._renderer.view) consoleArea = self._w.document.createElement('DIV') self.consoleText = self._w.document.createElement('TEXTAREA') self.consoleText.id = "textarea" consoleArea.id = "consoleArea" self.consoleText.readonly = True consoleArea.appendChild(self.consoleText) style = self._w.document.createElement('STYLE') css = '#consoleArea {width: 70px; height: 100%; background-color: black; position: fixed; right: 0; top: 0;} #textarea {color: white; opacity: 0; background-color: rgba(0,0,0,0); width: 260px; height: 810px; position: absolute; top: 50px; margin: 0px; left: 20px; resize: none; border: none; outline: none;} .switch {position: relative; display: inline-block; width: 30px; height: 17px; top: 15px; margin-left: 20px;} .switch input {display:none;} .slider {position: absolute;cursor: pointer;top: 0;left: 0;right: 0;bottom: 0;background-color: #ccc;-webkit-transition: .4s;transition: .4s;} .slider:before {position: absolute;content: "";height: 13px;width: 13px;left: 2px;bottom: 2px;background-color: white;-webkit-transition: .4s;transition: .4s;} input:checked + .slider {background-color: #2196F3;} input:focus + .slider {box-shadow: 0 0 1px #2196F3;} input:checked + .slider:before {-webkit-transform: translateX(13px);-ms-transform: translateX(13px);transform: translateX(13px);} .slider.round {border-radius: 17px;} .slider.round:before {border-radius: 50%;} body{-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}' style.type = 'text/css' style.appendChild(document.createTextNode(css)) self._w.document.head.appendChild(style) script = self._w.document.createElement('SCRIPT') js = 'function animateIt(dir, max, min) {var elem = document.getElementById("consoleArea"); var elem2 = document.getElementById("textarea"); var pos = max;var target = min;var id = setInterval(frame, 3);function frame() {var opa = Math.round((Math.abs(pos - target) / Math.abs(max - min)) * 100)/100;if (dir > 0) {opa = 1 - opa;} if (pos == target) {clearInterval(id);} else {pos = pos + dir; elem.style.width = pos + "px"; elem2.style.opacity = opa; }}}sessionStorage.switch = sessionStorage.switch ? sessionStorage.switch : "off";function switched() {if (sessionStorage.switch == "on") {sessionStorage.switch = "off";animateIt(-5, 300, 70);} else {sessionStorage.switch = "on";animateIt(5, 70, 300);}}' script.type = 'text/javascript' script.appendChild(document.createTextNode(js)) self._w.document.body.appendChild(script) self._w.onunload = onclose #if didLoadPyinput: # winput_init() consoleArea.insertAdjacentHTML( 'afterbegin', '<label class="switch"><input type="checkbox" onclick = "switched();"><div class="slider round"></div></label>' ) #self._w.document.body.innerHTML += '<div id = "inputScreen" style = "display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.2); z-index: 50;"><div style = "position: fixed; left: calc(50% - 150px); top: calc(50% - 75px); background-color: white;"><p id = "toPrompt"></p><input type = "text" id = "toInput"><input type = "submit" id = "toSubmit"></div></div>' self._w.document.body.appendChild(consoleArea)
def __init__(self, x=0, y=0, z=0): self._vec = JSConstructor(glowscript.vec)(x, y, z) self.add = self.__add__ self.sub = self.__sub__ self.multiply = self.__mul__ self.divide = self.__truediv__ = self.__div__
class JsPhaser(object): """ Brython wrapper for Phaser. :return: Instance of JsPhaser. """ _instance = None PHASER = window.Phaser JSC = JSConstructor BraserGame = JSConstructor(PHASER.Game) def __new__(cls): if not cls._instance: cls._instance = super(JsPhaser, cls).__new__(cls) print("JsPhaser__new__") return cls._instance def phaser(self): """ Javascript Phaser. :return: A Python reference for js Phaser. """ return JsPhaser.PHASER def construct(self, constructor): """ Construct a Python version of a js Constructor. :param constructor: Js Constructor to be called. :return: The Python wrapper for the given js Constructor. """ return JsPhaser.JSC(constructor)
def __init__(self, width, height, onclose): self._w = window.open("", "") self._stage = JSConstructor(GFX.Container)() self._renderer = GFX.autoDetectRenderer(width, height, {'transparent': True}) self._w.document.body.appendChild(self._renderer.view) self._w.onunload = onclose
def __init__(self, **kwargs): #size of a sphere in glowscript corresponds to diameter of a sphere in vPython if (('radius' in kwargs) and ('size' not in kwargs) and (isinstance(kwargs['radius'], int) or isinstance(kwargs['radius'], float))): kwargs['size'] = kwargs['radius'] * vec(2, 2, 2) primitive.__init__(self, JSConstructor(window.glowscript.sphere), **kwargs)
def __init__(self, width, height, onclose): self._w = window.open("", "") self._stage = JSConstructor(GFX.Container)() self.width = width if width != 0 else int(window.innerWidth * 0.9) self.height = height if height != 0 else int(window.innerHeight * 0.9) self._renderer = GFX.autoDetectRenderer(self.width, self.height, {'transparent': True}) self._w.document.body.appendChild(self._renderer.view) self._w.onunload = onclose
def load_basic(file, namehint=''): '''Load BMP image from a file. :see: `load` :Parameters: `file` : str or file-like object Image file or filename to load. `namehint` : str Ignored, for compatibility. :rtype: `Surface` ''' #if not hasattr(file, 'read'): # surf = SDL_LoadBMP(file) #else: # rw = SDL_RWFromObject(file) # # XXX Differ from pygame: don't freesrc when we didn't allocate it # surf = SDL_LoadBMP_RW(rw, 0) _img = JSConstructor(window.Image)() _img.src = file _img.canvas = html.CANVAS() def img_onload(*args): #http://www.jaypan.com/tutorial/javascript-passing-arguments-anonymous-functions-without-firing-function #the onload files very slow so variables get messed up so we have #to use args[0].path[0] to figure out the correct image console.log(args) if hasattr(args[0], 'target'): # Firefox this = args[0].target else: #chrome this = args[0].path[0] this.canvas.width = this.width this.canvas.height = this.height this.canvas.getContext('2d').drawImage(this, 0, 0) #this.loaded=True _img.onload = img_onload return _pygame_surface.Surface(surf=_img.canvas)
def setupGui(): global effectController effectController = { "newGridX": gridX, "newGridY": gridY, "newGridZ": gridZ, "newGround": ground, "newAxes": axes, "uy": 70.0, "uz": -15.0, "fy": 10.0, "fz": 60.0 } guiC = JSConstructor(dat.GUI) gui = guiC() h = gui.addFolder("Grid display") h.add(effectController, "newGridX").name("Show XZ grid") h.add(effectController, "newGridY").name("Show YZ grid") h.add(effectController, "newGridZ").name("Show XY grid") h.add(effectController, "newGround").name("Show ground") h.add(effectController, "newAxes").name("Show axes") '''
def _time(): Date = JSConstructor(window.Date) return Date().getTime()
h.add(effectController, "newGridX").name("Show XZ grid") h.add(effectController, "newGridY").name("Show YZ grid") h.add(effectController, "newGridZ").name("Show XY grid") h.add(effectController, "newGround").name("Show ground") h.add(effectController, "newAxes").name("Show axes") ''' h = gui.addFolder("Arm angles") h.add(effectController, "uy", list(range(-180, 180, 1))).name("Upper arm y") h.add(effectController, "uz", -45.0, 45.0, 0.025).name("Upper arm z") h.add(effectController, "fy", -180.0, 180.0, 0.025).name("Forearm y") h.add(effectController, "fz", -120.0, 120.0, 0.025).name("Forearm z") ''' # camera cameraC = JSConstructor(THREE.PerspectiveCamera) camera = cameraC(30, canvasRatio, 1, 10000) camera.position.z = 500 #camera.position.set( -510, 240, 1000 ) sceneC = JSConstructor(THREE.Scene) scene = sceneC() # LIGHTS ambientlightC = JSConstructor(THREE.AmbientLight) ambientLight = ambientlightC(0x222222) lightC = JSConstructor(THREE.DirectionalLight) light = lightC(0xffffff, 1.0) light.position.set(200, 400, 500) light2C = JSConstructor(THREE.DirectionalLight)
from browser import window, timer from javascript import JSConstructor Promise = JSConstructor(window.Promise) P = window.Promise def get_chaining(url): """ Unfortunately, this version does not work sends a Promise object to the next Promise in the chain. """ def promise(resolve, reject): def got_response(response): print(response.status) return response.json() def got_obj(obj): resolve(obj) window.fetch(url).then(got_response).then(got_obj) return Promise(promise) def get(url): def callback(resolve, reject): def got_response(response): print(response.status) response.json().then(got_obj)
def __init__(self, **kwargs): self._ll = JSConstructor(glowscript.local_light)(kwargs)
def __init__(self, **kwargs): primitive.__init__(self, JSConstructor(glowscript.sphere), **kwargs)
def __init__(self, **kwargs): self._label = JSConstructor(glowscript.label)(kwargs)
from browser import document from javascript import JSConstructor b_highchart = JSConstructor(Highcharts.Chart) chart = b_highchart({ 'chart': { 'renderTo': 'container', 'type': 'column', 'margin': 75, 'options3d': { 'enabled': True, 'alpha': 15, 'beta': 15, 'depth': 50, 'viewDistance': 25 } }, 'title': { 'text': 'Chart rotation demo' }, 'subtitle': { 'text': 'Test options by dragging the sliders below' }, 'plotOptions': { 'column': { 'depth': 25 } }, 'series': [{ 'data': [
from browser import window from javascript import JSConstructor b_highchart = JSConstructor(window.Highcharts.Chart) b_highchart({ 'chart': { 'type': 'bar', 'renderTo': 'container' }, 'title': { 'text': 'Stacked bar chart' }, 'xAxis': { 'categories': ['Apples', 'Oranges', 'Pears', 'Grapes', 'Bananas'] }, 'yAxis': { 'min': 0, 'title': { 'text': 'Total fruit consumption' } }, 'legend': { 'reversed': True }, 'plotOptions': { 'series': { 'stacking': 'normal' } }, 'series': [{
def module_exists(module_name): try: __import__(module_name) except ImportError: return False else: return True if module_exists('browser') and module_exists('javascript'): from browser import window, document from javascript import JSObject, JSConstructor GFX = JSObject(window.PIXI) GFX_Rectangle = JSConstructor(GFX.Rectangle) GFX_Texture = JSConstructor(GFX.Texture) GFX_Texture_fromImage = JSConstructor(GFX.Texture.fromImage) GFX_Sprite = JSConstructor(GFX.Sprite) GFX_Graphics = JSConstructor(GFX.Graphics)() GFX_Text = JSConstructor(GFX.Text) GFX_DetectRenderer = GFX.autoDetectRenderer SND = JSObject(window.buzz) SND_Sound = JSConstructor(SND.sound) class GFX_Window(object): def __init__(self, width, height, onclose): self._w = window.open("", "") self._stage = JSConstructor(GFX.Container)() self._renderer = GFX.autoDetectRenderer(width, height, {'transparent': True})
def __init__(self, **kwargs): primitive.__init__(self, JSConstructor(glowscript.cylinder), **kwargs)
def __init__(self, **kwargs): primitive.__init__(self, JSConstructor(glowscript.pyramid), **kwargs)
from browser import window from javascript import JSConstructor assert window.empty_list() == [] assert window.list1() == [1, 2, 'a', ['b']] assert window.jsobj().to_dict() == {'a':1} c = window.subscriptable('abracadabra') assert len(c) == 11 assert c[2] == 'r' Foo = JSConstructor(window.get_constructor()) assert Foo().foo == 'hi' # test dynamic constructor creation Constructor = JSConstructor(window.base_class.extend()) assert Constructor().name == 'base' assert Constructor().extra == 'extra'
def __init__(self, **kwargs): self._dl = JSConstructor(glowscript.distant_light)(kwargs)
from javascript import JSConstructor from javascript import JSObject import math cango = JSConstructor(Cango2D) shapes2d = JSObject(shapes2D) #tweener = JSConstructor(Tweener) #drag2d = JSConstructor(Drag2D) #svgtocgo2d = JSConstructor(svgToCgo2D) #involutebezcoeffs = JSConstructor(involuteBezCoeffs) creategeartooth = JSConstructor(createGearTooth) #createintgeartooth= JSConstructor(createIntGearTooth) cgo = cango("plotarea") module = 3 teeth = 180 pressureAngle = 25 ###################################### # 畫正齒輪輪廓 ##################################### ''' Rpitch = module*teeth/2 # base circle radius Rb = Rpitch * math.cos(pressureAngle*math.pi/180) print("基圓半徑:", Rb) #generate Higuchi involute approximation fs = 0.01 # start 1% off the base circle fm = 0.25 # break 25% along involute fe = 1 #end at 100%
def __init__(self, **kwargs): self._draw = JSConstructor(glowscript.draw)(kwargs)
gui = guiC() h = gui.addFolder("Grid display") h.add(effectController, "newGridX").name("Show XZ grid") h.add(effectController, "newGridY" ).name("Show YZ grid") h.add(effectController, "newGridZ" ).name("Show XY grid") h.add(effectController, "newGround" ).name("Show ground") h.add(effectController, "newAxes" ).name("Show axes") ''' h = gui.addFolder("Arm angles") h.add(effectController, "uy", list(range(-180, 180, 1))).name("Upper arm y") h.add(effectController, "uz", -45.0, 45.0, 0.025).name("Upper arm z") h.add(effectController, "fy", -180.0, 180.0, 0.025).name("Forearm y") h.add(effectController, "fz", -120.0, 120.0, 0.025).name("Forearm z") ''' cameraC = JSConstructor( THREE.PerspectiveCamera ) camera = cameraC( 75, 1, 1, 10000 ) camera.position.z = 1000; sceneC = JSConstructor( THREE.Scene ); scene = sceneC(); geometryC = JSConstructor(THREE.CubeGeometry) geometry = geometryC(200, 200, 200) materialC = JSConstructor( THREE.MeshBasicMaterial ) material = materialC( { "color": "#ff0000", "wireframe": True } ) meshC = JSConstructor(THREE.Mesh) mesh = meshC(geometry, material) scene.add(mesh);
from browser import window from javascript import JSConstructor assert window.empty_list() == [] assert window.list1() == [1, 2, 'a', ['b']] assert window.jsobj().to_dict() == {'a': 1} c = window.subscriptable('abracadabra') assert len(c) == 11 assert c[2] == 'r' Foo = JSConstructor(window.get_constructor()) assert Foo().foo == 'hi'
<script type="text/python"> # 將 導入的 document 設為 doc 主要原因在於與舊程式碼相容 from browser import document as doc # 由於 Python3 與 Javascript 程式碼已經不再混用, 因此來自 Javascript 的變數, 必須居中透過 window 物件轉換 from browser import window # 針對 Javascript 既有的物件, 則必須透過 JSConstructor 轉換 from javascript import JSConstructor import math # 主要用來取得畫布大小 canvas = doc["gear1"] # 此程式採用 Cango Javascript 程式庫繪圖, 因此無需 ctx #ctx = canvas.getContext("2d") # 針對類別的轉換, 將 Cango.js 中的 Cango 物件轉為 Python cango 物件 cango = JSConstructor(window.Cango) # 針對變數的轉換, shapeDefs 在 Cango 中資料型別為變數, 可以透過 window 轉換 shapedefs = window.shapeDefs # 目前 Cango 結合 Animation 在 Brython 尚無法運作, 此刻只能繪製靜態圖形 # in CangoAnimation.js #interpolate1 = window.interpolate # Cobi 與 createGearTooth 都是 Cango Javascript 程式庫中的物件 cobj = JSConstructor(window.Cobj) creategeartooth = JSConstructor(window.createGearTooth) # 經由 Cango 轉換成 Brython 的 cango, 指定將圖畫在 id="plotarea" 的 canvas 上 cgo = cango("gear1") ###################################### # 畫正齒輪輪廓 #####################################