Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
e8ee85f
Fixing the demo (index.htm)
denphi Dec 16, 2020
0521755
Fixing the demo (index.htm)
denphi Dec 16, 2020
95a4158
react example
denphi Dec 16, 2020
69bf906
Update README.md
denphi Dec 17, 2020
2647c91
ipyspeck widget
denphi Jan 4, 2021
5fe0729
Merge branch 'master' of https://github.com/denphi/speck
denphi Jan 4, 2021
e85395a
changes in readme
denphi Jan 4, 2021
7351979
ipyspeck dblclick -> center interaction + example
denphi Jan 6, 2021
9d2baa6
added default cameras
denphi Jan 6, 2021
e51c784
added default cameras
denphi Jan 6, 2021
2b5f4d1
descriptions
denphi Jan 6, 2021
f4cb700
prerelease 0.0.4
denphi Jan 8, 2021
5050695
prerelease 0.0.4
denphi Jan 8, 2021
72d13bc
prerelease 0.0.4
denphi Jan 8, 2021
fcc5481
prerelease 0.0.4
denphi Jan 8, 2021
6ca4aa9
prerelease 0.0.4
denphi Jan 8, 2021
dc441a5
prerelease 0.0.4
denphi Jan 8, 2021
ab69a1e
prerelease 0.0.4
denphi Jan 8, 2021
39b273b
prerelease 0.0.4
denphi Jan 8, 2021
4072e22
prerelease 0.0.4
denphi Jan 8, 2021
3c35e8f
prerelease 0.0.4
denphi Jan 8, 2021
028b0de
prerelease 0.0.4
denphi Jan 8, 2021
1525d48
prerelease 0.0.4
denphi Jan 8, 2021
f03fb9f
prerelease 0.0.4
denphi Jan 8, 2021
0d483b1
prerelease 0.0.4
denphi Jan 8, 2021
d4dbacf
prerelease 0.0.4
denphi Jan 8, 2021
9ab84f0
prerelease 0.5.0, npm didnt upload 0.4.0
denphi Jan 8, 2021
e5e9693
prerelease 0.5.0, npm didnt upload 0.4.0
denphi Jan 8, 2021
69332b7
0.5.0 release
denphi Jan 11, 2021
d249c24
V0.6.0
denphi Jan 11, 2021
f65dd45
V0.6.0
denphi Jan 11, 2021
9dd4f4c
Merge branch 'master' of https://github.com/denphi/speck
denphi Jan 11, 2021
0089282
V0.6.0
denphi Jan 11, 2021
1c89ccf
V0.6.0
denphi Jan 12, 2021
cef2f5b
V0.6.0
denphi Jan 12, 2021
cf9efb2
V0.6.0
denphi Jan 12, 2021
d7b7690
Adding Doc + data validation
denphi Jan 15, 2021
a547476
images
denphi Jan 21, 2021
1ab5474
README changes
denphi Jan 21, 2021
9cb6304
images
denphi Jan 21, 2021
65c7060
testing small feature st
denphi May 20, 2022
aec2d1e
0.6.1 release
denphi May 20, 2022
8466f4f
Update README.md
denphi Feb 17, 2023
7ab6a49
Update README.md
denphi Feb 17, 2023
68ae3be
0.6.2
denphi May 16, 2024
50af76b
README
denphi May 16, 2024
b174ba5
README + img
denphi May 16, 2024
28833c9
Update README.md
denphi May 16, 2024
4c18516
Release v0.7.0 - JupyterLab 3+ & ipywidgets 8 Support
denphi Dec 4, 2025
7201db4
Release v0.7.1 - Fix widget deserialization error
denphi Dec 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,6 @@ node_modules

# Users Environment Variables
.lock-wscript

#Jupyter Checkpoints
.ipynb_checkpoints
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,11 @@ Speck goes to great lengths to decouple rendering options, so that you have the
<img src="https://raw.githubusercontent.com/wwwtyro/speck/gh-pages/static/screenshots/demo-8.png">
</p>

#### Compilation

* npm install --save webpack
* npm install --save jquery@2.2.4
* npm install --save keyboardjs
* npm install --save lodash
* npm install --save lz-string
* npx webpack
1 change: 1 addition & 0 deletions build/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const speckSystem = require('../src/system.js');
const speckView = require('../src/view.js');
const speckInteractions = require('../src/interactions.js');
const speckPresetViews = require('../src/presets.js');
const speckMain = require('../src/main.js');

module.exports = {
speckRenderer,
Expand Down
531 changes: 531 additions & 0 deletions ipyspeck.ipynb

Large diffs are not rendered by default.

6,946 changes: 4,696 additions & 2,250 deletions package-lock.json

Large diffs are not rendered by default.

15 changes: 11 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
{
"name": "speck",
"version": "0.0.0",
"version": "0.6.0",
"description": "",
"main": "build/index.js",
"scripts": {
"build": "webpack"
},
"dependencies": {},
"dependencies": {
"brfs": "~1.2.0",
"ipyspeck": "file:widget/ipyspeck/js",
"jquery": "^2.2.4",
"keyboardjs": "^0.4.3",
"lodash": "^4.17.20",
"lz-string": "^1.4.4"
},
"devDependencies": {
"webpack": "^4.26.1",
"webpack-cli": "^3.1.2"
"webpack": "^4.44.2",
"webpack-cli": "^3.3.12"
},
"author": "",
"license": "MIT"
Expand Down
215 changes: 215 additions & 0 deletions react.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
<!DOCTYPE html>
<html style='height:100%'>
<head>
<meta charset='UTF-8'/>
<meta name='viewport' content='initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width'/>
<title>Bandstructures Lab</title>
<script src='https://cdn.plot.ly/plotly-latest.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js'></script>

<link rel='stylesheet' href='https://fonts.googleapis.com/icon?family=Material+Icons'/>
<script type='text/javascript'>

</script>
</head>
<body style='padding:0;margin:0;height:100%'>
<div id='root' style='height:100%'></div>
<script type='text/javascript'>
//https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix.js
requirejs.config({
paths: {
'react': 'https://unpkg.com/react@16.8.6/umd/react.development',
'react-dom': 'https://unpkg.com/react-dom@16.8.6/umd/react-dom.development',
'material-ui': 'https://unpkg.com/@material-ui/core@latest/umd/material-ui.development',
'plotlycomponent': 'https://unpkg.com/react-plotly.js@2.3/dist/create-plotly-component',
'plotly': 'https://cdn.plot.ly/plotly-latest.min',
'math': 'https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.6.1/math.min',
'axios': 'https://unpkg.com/axios/dist/axios.min',
'localforage' : 'https://www.unpkg.com/localforage@1.7.3/dist/localforage.min',
'number-format': 'https://unpkg.com/react-number-format@4.3.1/dist/react-number-format',
'prop-types': 'https://unpkg.com/prop-types@15.6/prop-types.min',
'bundle': './static/bundle',
}
});
requirejs(['react', 'react-dom'], function(React, ReactDOM) {
window.React = React
let _react = React
requirejs(['material-ui', 'axios', 'localforage', 'prop-types'], function(Material, Axios, LocalForage, PropTypes) {
_react.PropTypes = PropTypes
requirejs(['plotlycomponent', 'plotly', 'math', 'number-format'], function(PlotlyComponent, Plotly, math, Format) {
window.React = React
const Plot = PlotlyComponent.default(Plotly);
requirejs(['bundle'], function(Bundle) {
class Speck extends React.Component {
constructor(props) {
super(props);
this.container = React.createRef()
this.canvas = React.createRef()
this.system = Bundle.speckSystem.new();
this.view = Bundle.speckView.new();
this.view.resolution.x = 200;
this.view.resolution.y = 200;
this.view.bonds = true,
this.view.atomScale= 0.35,
this.renderer = null;
this.needReset = false;
this.state = {
aspect: this.view.aspect,
zoom: this.view.zoom,
translation: this.view.translation,
atomScale: this.view.atomScale,
relativeAtomScale: this.view.relativeAtomScale,
bondScale: this.view.bondScale,
rotation: this.view.rotation,
ao: this.view.ao,
aoRes: this.view.aoRes,
brightness: this.view.brightness,
outline: this.view.outline,
spf: this.view.spf,
bonds: this.view.bonds,
bondThreshold: this.view.bondThreshold,
bondShade: this.view.bondShade,
atomShade: this.view.atomShade,
resolution: this.view.resolution,
dofStrength: this.view.dofStrength,
dofPosition: this.view.dofPosition,
fxaa: this.view.fxaa,
data: "10\ntestosterone.out\nC -4.0599 -2.1760 -0.8224\nO -4.9516 -2.8840 -1.2414\nC -4.2163 -0.6676 -0.7586\nC -2.8826 0.0343 -0.9993\nC -2.7857 -2.7158 -0.3131\nC -1.7443 -1.9501 0.0575\nC -0.5249 -2.5861 0.6659\nC 0.7827 -1.9356 0.2082\nC 0.7295 -0.4182 0.4294\nC 2.0267 0.2733 -0.0072\n"
}
}

loadTest(){
let self = this;
self.setState({
data : "46\ntestosterone.out\nC -4.0599 -2.1760 -0.8224\nO -4.9516 -2.8840 -1.2414\nC -4.2163 -0.6676 -0.7586\nC -2.8826 0.0343 -0.9993\nC -2.7857 -2.7158 -0.3131\nC -1.7443 -1.9501 0.0575\nC -0.5249 -2.5861 0.6659\nC 0.7827 -1.9356 0.2082\nC 0.7295 -0.4182 0.4294\nC 2.0267 0.2733 -0.0072\nC 3.3706 -0.1900 0.5799\nC 4.3192 1.0027 0.3273\nC 3.4317 2.2202 -0.0268\nO 3.9384 3.3043 0.7679\nC 1.9714 1.7980 0.3340\nC 1.7106 2.0852 1.8182\nC 0.8686 2.4201 -0.5385\nC -0.4798 1.7315 -0.2601\nC -0.4282 0.1930 -0.4091\nC -1.7900 -0.4363 -0.0132\nH -2.7575 -3.8052 -0.2565\nH -0.6135 -2.5201 1.7733\nH -0.4925 -3.6738 0.4451\nH 1.6336 -2.3732 0.7646\nH 0.9690 -2.1675 -0.8583\nH 0.5479 -0.2168 1.5138\nH 2.1058 0.1678 -1.1210\nH 3.2853 -0.4094 1.6573\nH 3.7364 -1.1101 0.0994\nH 4.9267 1.2382 1.2217\nH 5.0342 0.7890 -0.4822\nH 3.5293 2.5237 -1.0880\nH 3.2906 4.0296 0.8195\nH 0.8832 1.4797 2.2078\nH 2.5972 1.8604 2.4268\nH 1.4613 3.1361 1.9910\nH 0.7818 3.5044 -0.3452\nH 1.1247 2.3262 -1.6107\nH -0.8205 1.9959 0.7596\nH -1.2411 2.1442 -0.9502\nH -0.2361 -0.0466 -1.4843\nH -4.6390 -0.3984 0.2304\nH -4.9734 -0.3373 -1.4982\nH -2.5493 -0.1544 -2.0405\nH -3.0184 1.1303 -0.9178\nH -2.0604 -0.0823 1.0166\n"
}, () => self.loadStructure());
}

loadStructure() {
let self = this;
var data = self.xyz(self.state.data)[0]
self.system = Bundle.speckSystem.new();
for (var i = 0; i < data.length; i++) {
var a = data[i];
var x = a.position[0];
var y = a.position[1];
var z = a.position[2];
Bundle.speckSystem.addAtom(self.system, a.symbol, x,y,z);
}
Bundle.speckSystem.center(self.system);
Bundle.speckSystem.calculateBonds(self.system);
this.renderer.setSystem(self.system, self.view);
Bundle.speckView.center(self.view, self.system);
self.needReset = true;
}

xyz(data) {
var lines = data.split('\n');
var natoms = parseInt(lines[0]);
var nframes = Math.floor(lines.length/(natoms+2));
var trajectory = []
for(var i = 0; i < nframes; i++) {
var atoms = [];
for(var j = 0; j < natoms; j++) {
var line = lines[i*(natoms+2)+j+2].split(/\s+/);
var atom = {};
var k = 0;
while (line[k] == "") k++;
atom.symbol = line[k++];
atom.position = [parseFloat(line[k++]), parseFloat(line[k++]), parseFloat(line[k++])];
atoms.push(atom);
}
trajectory.push(atoms);
}
return trajectory;
}

reflow() {
console.log("reflow");

let self = this;
var ww = self.container.current.parentElement.clientWidth;
var wh = self.container.current.parentElement.clientHeight;
if (self.view.resolution.x == ww && self.view.resolution.y == wh)
return;
self.container.current.style.height = wh + "px";
self.container.current.style.width = ww + "px";
self.container.current.style.left = 0 + "px";
self.container.current.style.top = 0 + "px";
self.view.resolution.x=ww;
self.view.resolution.y=wh;
self.renderer = new Bundle.speckRenderer(self.canvas.current, self.view.resolution, self.view.aoRes);
}

loop() {
let self = this;
if (self.needReset) {
self.renderer.reset();
self.needReset = false;
}
self.renderer.render(self.view);
requestAnimationFrame(function(){self.loop()});
}

componentDidMount(){
let self = this;
self.reflow()
self.loadStructure();
window.addEventListener("resize", function(){self.reflow()});
this.loop();
Bundle.speckInteractions({
container : self.container.current,
scrollZoom : true,
getRotation : function (){return self.view.rotation},
setRotation : function (t){self.view.rotation = t},
getTranslation : function (){return self.view.translation},
setTranslation : function ( t ){self.view.translation=t},
getZoom : function (){return self.view.zoom},
setZoom : function (t ){self.view.zoom=t},
refreshView : function(){self.needReset=true;}
})
}

render() {
let self = this;
/*self.view.aspect = self.state.aspect;
self.view.zoom = self.state.zoom;
self.view.translation = self.state.translation;
self.view.atomScale = self.state.atomScale;
self.view.relativeAtomScale = self.state.relativeAtomScale;
self.view.bondScale = self.state.bondScale;
self.view.rotation = self.state.rotation;
self.view.ao = self.state.ao;
self.view.aoRes = self.state.aoRes;
self.view.brightness = self.state.brightness;
self.view.outline = self.state.outline;
self.view.spf = self.state.spf;
self.view.aspect = self.state.aspect;
self.view.bonds = self.state.bonds;
self.view.bondThreshold = self.state.bondThreshold;
self.view.bondShade = self.state.bondShade;
self.view.atomShade = self.state.atomShade;
self.view.resolution = self.state.resolution;
self.view.dofStrength = self.state.dofStrength;
self.view.dofPosition = self.state.dofPosition;
self.view.fxaa = self.state.fxaa;
if (self.view.data != self.state.data){
self.view.data = self.state.data;
//self.reflow();
}*/
return React.createElement("div", {ref:self.container, key:'container', onClick:function(){self.loadTest()}},[
React.createElement("canvas", {ref:self.canvas, key:'canvas'})
])
}
}

ReactDOM.render(
React.createElement(Speck, {}),
document.getElementById('root')
);
});
});
});
})
</script>
</html>
Binary file removed speck-0.0.0.tgz
Binary file not shown.
Loading