Commit 5cc88905 authored by Dario Seyb's avatar Dario Seyb
parents e8d822b9 13bbea51
# MeshVis
[[#]] ThreeVis
## Setup
......@@ -14,20 +14,20 @@
## Example
```python
import meshvis
import threevis
m = om.TriMesh()
om.read_mesh(m, '/home/dseyb/git/openmesh-python/tests/TestFiles/cube-minimal-normals.ply')
meshvis.display_openmesh(m)
threevis.display_openmesh(m)
meshvis.display_file('/home/dseyb/git/openmesh-python/tests/TestFiles/square_material_texture.obj')
threevis.display_file('/home/dseyb/git/openmesh-python/tests/TestFiles/square_material_texture.obj')
```
```python
import meshvis
import threevis
import openmesh as om
import numpy as np
......@@ -36,17 +36,17 @@ m = om.TriMesh()
om.read_mesh(m, "./mouse.obj")
# Create Context
ctx = meshvis.Context(width=640, height=480)
ctx = threevis.Context(width=640, height=480)
# Get vertices and faces from the mesh
vertices = m.points()
faces = m.face_vertex_indices()
# We don't have normals, calculate them
normals = meshvis.calculateFaceNormals(m.points(), m.face_vertex_indices())
normals = threevis.calculateFaceNormals(m.points(), m.face_vertex_indices())
# Choose a random color for each face
colors = meshvis.FaceAttribute(np.random.rand(len(faces), 3))
colors = threevis.FaceAttribute(np.random.rand(len(faces), 3))
# Draw the mesh with flat shading
ctx.draw_faces(vertices, faces,
......@@ -56,11 +56,11 @@ ctx.draw_faces(vertices, faces,
# Draw edges on top with random colors
ctx.draw_edges(vertices, m.ev_indices(),
colors = meshvis.FaceAttribute(np.random.rand(len(m.ev_indices()), 3)),
colors = threevis.FaceAttribute(np.random.rand(len(m.ev_indices()), 3)),
linewidth=3)
# Calculate data to display normals as edges
normal_vis_verts, normal_vis_edges = meshvis.calculateNormalEdges(vertices, faces, normals, length=0.05)
normal_vis_verts, normal_vis_edges = threevis.calculateNormalEdges(vertices, faces, normals, length=0.05)
# Draw the normals in
ctx.draw_edges(normal_vis_verts, normal_vis_edges, colors = colors)
......@@ -72,4 +72,4 @@ ctx.draw_vertices(vertices, point_size=4, colors='red')
ctx.display()
```
![mouse](https://www.graphics.rwth-aachen.de:9000/dseyb/meshvis/raw/master/docs/images/mouse.PNG)
\ No newline at end of file
![mouse](https://www.graphics.rwth-aachen.de:9000/threevis/threevis/raw/master/docs/images/mouse.PNG)
......@@ -4,7 +4,7 @@
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SPHINXPROJ = meshvis
SPHINXPROJ = threevis
SOURCEDIR = source
BUILDDIR = build
......@@ -17,4 +17,4 @@ help:
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
......@@ -9,7 +9,7 @@ if "%SPHINXBUILD%" == "" (
)
set SOURCEDIR=source
set BUILDDIR=build
set SPHINXPROJ=meshvis
set SPHINXPROJ=threevis
if "%1" == "" goto help
......
......@@ -14,12 +14,12 @@
#
import os
import sys
sys.path.insert(0, os.path.abspath('../../meshvis/'))
sys.path.insert(0, os.path.abspath('../../threevis/'))
# -- Project information -----------------------------------------------------
project = u'meshvis'
project = u'threevis'
copyright = u'2018, Dario Seyb, Isaak Lim, Janis Born'
author = u'Dario Seyb, Isaak Lim, Janis Born'
......@@ -110,7 +110,7 @@ html_static_path = ['_static']
# -- Options for HTMLHelp output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'meshvisdoc'
htmlhelp_basename = 'threevisdoc'
# -- Options for LaTeX output ------------------------------------------------
......@@ -137,7 +137,7 @@ latex_elements = {
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'meshvis.tex', u'meshvis Documentation',
(master_doc, 'threevis.tex', u'threevis Documentation',
u'Dario Seyb, Isaak Lim, Janis Born', 'manual'),
]
......@@ -147,7 +147,7 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'meshvis', u'meshvis Documentation',
(master_doc, 'threevis', u'threevis Documentation',
[author], 1)
]
......@@ -158,8 +158,8 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'meshvis', u'meshvis Documentation',
author, 'meshvis', 'Visualize meshes, point clouds, volumes and other geometry in a Jupyter Notebook',
(master_doc, 'threevis', u'threevis Documentation',
author, 'threevis', 'Visualize meshes, point clouds, volumes and other geometry in a Jupyter Notebook',
'Miscellaneous'),
]
......@@ -169,4 +169,4 @@ texinfo_documents = [
# -- Options for todo extension ----------------------------------------------
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
\ No newline at end of file
todo_include_todos = True
......@@ -6,27 +6,26 @@
"metadata": {},
"outputs": [],
"source": [
"import meshvis\n",
"import threevis\n",
"import openmesh as om\n",
"import numpy as np\n",
"\n",
"m = om.PolyMesh()\n",
"om.read_mesh(m, 'models/model_mixed_valence.obj')\n",
"m = om.read_polymesh('models/model_mixed_valence.obj')\n",
"\n",
"vertices = m.points()\n",
"faces = m.face_vertex_indices()\n",
"edges = m.ev_indices()\n",
"\n",
"mesh = meshvis.Mesh(vertices, faces)\n",
"mesh.colors = meshvis.FaceAttribute(np.random.rand(len(faces), 3))\n",
"mesh.normals = meshvis.calculatePointNormals(vertices, faces)\n",
"mesh = threevis.Mesh(vertices, faces)\n",
"mesh.colors = threevis.FaceAttribute(np.random.rand(len(faces), 3))\n",
"mesh.normals = threevis.calculatePointNormals(vertices, faces)\n",
"\n",
"\n",
"normal_vis_verts, normal_vis_edges = meshvis.calculateNormalEdges(vertices, faces, mesh.normals, 0.5)\n",
"normal_vis_verts, normal_vis_edges = threevis.calculateNormalEdges(vertices, faces, mesh.normals, 0.5)\n",
"\n",
"ctx = meshvis.Context()\n",
"ctx = threevis.Context()\n",
"\n",
"ctx.draw(mesh).draw(meshvis.EdgeList(vertices, edges)).draw(meshvis.PointList(vertices, colors='#aaaaaa'), point_size=3)\n",
"ctx.draw(mesh).draw(threevis.EdgeList(vertices, edges)).draw(threevis.PointList(vertices, colors='#aaaaaa'), point_size=3)\n",
"\n",
"ctx.draw_edges(normal_vis_verts, normal_vis_edges)\n",
"\n",
......@@ -37,20 +36,21 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2"
"pygments_lexer": "ipython3",
"version": "3.5.3rc1"
}
},
"nbformat": 4,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -6,41 +6,40 @@
"metadata": {},
"outputs": [],
"source": [
"import meshvis\n",
"import threevis\n",
"import openmesh as om\n",
"import numpy as np\n",
"\n",
"m = om.PolyMesh()\n",
"\n",
"om.read_mesh(m, 'models/bunny.obj')\n",
"m = om.read_polymesh('models/bunny.obj')\n",
"\n",
"vertices = m.points()\n",
"faces = m.face_vertex_indices()\n",
"\n",
"\n",
"mesh = meshvis.Mesh(vertices, faces, \n",
" normals = meshvis.calculateFaceNormals(vertices, faces))\n",
"mesh = threevis.Mesh(vertices, faces, \n",
" normals = threevis.calculateFaceNormals(vertices, faces))\n",
"\n",
"meshvis.display(mesh, show_bounds=True)\n"
"threevis.display(mesh, show_bounds=True)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2"
"pygments_lexer": "ipython3",
"version": "3.5.3rc1"
}
},
"nbformat": 4,
......
......@@ -6,52 +6,44 @@
"metadata": {},
"outputs": [],
"source": [
"import meshvis\n",
"import threevis\n",
"import openmesh as om\n",
"import numpy as np\n",
"\n",
"m = om.PolyMesh()\n",
"\n",
"om.read_mesh(m, 'models/bunny.obj')\n",
"m = om.read_polymesh('models/bunny.obj')\n",
"\n",
"vertices = m.points()\n",
"faces = m.face_vertex_indices()\n",
"\n",
"\n",
"mesh = meshvis.Mesh(vertices, faces, \n",
" normals = meshvis.calculateFaceNormals(vertices, faces))\n",
"mesh = threevis.Mesh(vertices, faces, \n",
" normals = threevis.calculateFaceNormals(vertices, faces))\n",
"\n",
"ctx = meshvis.Context()\n",
"ctx.draw(mesh, shading='flat', clipping_planes=[meshvis.Plane((1.0, 0.0, 0.0) , 0)])\n",
"ctx = threevis.Context()\n",
"ctx.draw(mesh, shading='flat', clipping_planes=[threevis.Plane((1.0, 0.0, 0.0) , 0)])\n",
"ctx.display()\n",
"\n",
"ctx.setCameraPosition([0.2, 0, 0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2"
"pygments_lexer": "ipython3",
"version": "3.5.3rc1"
}
},
"nbformat": 4,
......
......@@ -131,9 +131,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
......@@ -145,7 +145,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.3"
"version": "3.5.3rc1"
}
},
"nbformat": 4,
......
......@@ -1132,21 +1132,21 @@
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
"pygments_lexer": "ipython3",
"version": "3.5.3rc1"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
......@@ -2154,5 +2154,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 1
"nbformat_minor": 2
}
......@@ -6,27 +6,26 @@
"metadata": {},
"outputs": [],
"source": [
"import meshvis\n",
"import threevis\n",
"import openmesh as om\n",
"import numpy as np\n",
"\n",
"m = om.PolyMesh()\n",
"om.read_mesh(m, 'models/model_mixed_valence.obj')\n",
"m = om.read_polymesh('models/model_mixed_valence.obj')\n",
"\n",
"vertices = m.points()\n",
"faces = m.face_vertex_indices()\n",
"edges = m.ev_indices()\n",
"\n",
"mesh = meshvis.Mesh(vertices, faces)\n",
"mesh.colors = meshvis.FaceAttribute(np.random.rand(len(faces), 3))\n",
"mesh.normals = meshvis.calculatePointNormals(vertices, faces)\n",
"mesh = threevis.Mesh(vertices, faces)\n",
"mesh.colors = threevis.FaceAttribute(np.random.rand(len(faces), 3))\n",
"mesh.normals = threevis.calculatePointNormals(vertices, faces)\n",
"\n",
"\n",
"normal_vis_verts, normal_vis_edges = meshvis.calculateNormalEdges(vertices, faces, mesh.normals, 0.5)\n",
"normal_vis_verts, normal_vis_edges = threevis.calculateNormalEdges(vertices, faces, mesh.normals, 0.5)\n",
"\n",
"ctx = meshvis.Context()\n",
"ctx = threevis.Context()\n",
"\n",
"ctx.draw(mesh).draw(meshvis.EdgeList(vertices, edges)).draw(meshvis.PointList(vertices, colors='#aaaaaa'), point_size=3)\n",
"ctx.draw(mesh).draw(threevis.EdgeList(vertices, edges)).draw(threevis.PointList(vertices, colors='#aaaaaa'), point_size=3)\n",
"\n",
"ctx.draw_edges(normal_vis_verts, normal_vis_edges)\n",
"\n",
......@@ -37,20 +36,21 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2"
"pygments_lexer": "ipython3",
"version": "3.5.3rc1"
}
},
"nbformat": 4,
......
......@@ -6,18 +6,11 @@
"metadata": {},
"outputs": [],
"source": [
"import meshvis\n",
"import threevis\n",
"import openmesh as om\n",
"import numpy as np\n",
"\n",
"m = om.PolyMesh()\n",
"\n",
"m.request_vertex_texcoords2D()\n",
"\n",
"options = om.Options()\n",
"options += om.Options.VertexTexCoord\n",
"\n",
"om.read_mesh(m, 'models/spot_quadrangulated.obj', options)\n",
"m = om.read_polymesh('models/spot_quadrangulated.obj', vertex_tex_coord=True)\n",
"\n",
"vertices = m.points()\n",
"faces = m.face_vertex_indices()\n",
......@@ -25,32 +18,33 @@
"uvs = m.vertex_texcoords2D()\n",
"\n",
"\n",
"mesh = meshvis.Mesh(vertices, faces, \n",
" normals = meshvis.calculatePointNormals(vertices, faces),\n",
" uvs = meshvis.PointAttribute(uvs))\n",
"mesh = threevis.Mesh(vertices, faces, \n",
" normals = threevis.calculatePointNormals(vertices, faces),\n",
" uvs = threevis.PointAttribute(uvs))\n",
"\n",
"texture = meshvis.ImageTexture('textures/spot_texture.png')\n",
"texture = threevis.ImageTexture('textures/spot_texture.png')\n",
"\n",
"meshvis.display(mesh, texture=texture)\n"
"threevis.display(mesh, texture=texture)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2"
"pygments_lexer": "ipython3",
"version": "3.5.3rc1"
}
},
"nbformat": 4,
......
......@@ -6,22 +6,21 @@
"metadata": {},
"outputs": [],
"source": [
"import meshvis\n",
"import threevis\n",
"import openmesh as om\n",
"import numpy as np\n",
"m = om.TriMesh()\n",
"om.read_mesh(m, \"models/bunny.obj\")\n",
"m = om.read_trimesh(\"models/bunny.obj\")\n",
"\n",
"ctx = meshvis.Context(width=640, height=480)\n",
"ctx = threevis.Context(width=640, height=480)\n",
"\n",
"texture = meshvis.ImageTexture(imageUri='textures/checkerboard.png')\n",
"texture = threevis.ImageTexture(imageUri='textures/checkerboard.png')\n",
"\n",
"vertices = m.points()\n",
"faces = m.face_vertex_indices()\n",
"\n",
"normals = meshvis.calculatePointNormals(vertices, faces)\n",
"colors = meshvis.FaceAttribute(np.random.rand(len(faces), 3))\n",
"uvs = meshvis.PointAttribute(m.vertex_texcoords2D())\n",
"normals = threevis.calculatePointNormals(vertices, faces)\n",
"colors = threevis.FaceAttribute(np.random.rand(len(faces), 3))\n",
"uvs = threevis.PointAttribute(m.vertex_texcoords2D())\n",
"\n",
"ctx.draw_faces(vertices, faces, \n",
" normals = normals,\n",
......@@ -30,10 +29,10 @@
" shading = 'flat')\n",
"\n",
"ctx.draw_edges(vertices, m.ev_indices(), \n",
" colors = meshvis.FaceAttribute(np.random.rand(len(m.ev_indices()), 3)),\n",
" colors = threevis.FaceAttribute(np.random.rand(len(m.ev_indices()), 3)),\n",
" linewidth=3)\n",
"\n",
"normal_vis_verts, normal_vis_edges = meshvis.calculateNormalEdges(vertices, faces, normals, 0.005)\n",
"normal_vis_verts, normal_vis_edges = threevis.calculateNormalEdges(vertices, faces, normals, 0.005)\n",
"\n",
"ctx.draw_edges(normal_vis_verts, normal_vis_edges)\n",
"\n",
......@@ -48,7 +47,7 @@
"metadata": {},
"outputs": [],
"source": [
"meshvis.display_vertices([[0,0,0],[1,0, 0]], colors='blue', point_size=10)"
"threevis.display_vertices([[0,0,0],[1,0, 0]], colors='blue', point_size=10)"
]
},
{
......@@ -88,12 +87,12 @@
" [0, 1]\n",
"]\n",
"\n",
"ctx = meshvis.Context(width=300, height=300)\n",
"ctx = threevis.Context(width=300, height=300)\n",
"\n",
"ctx.draw_faces(verts, indices, \n",
" colors = meshvis.PointAttribute(vcolors),\n",
" uvs = meshvis.PointAttribute(uvs),\n",
" texture = meshvis.ImageTexture(imageUri='textures/checkerboard.png'))\n",
" colors = threevis.PointAttribute(vcolors),\n",
" uvs = threevis.PointAttribute(uvs),\n",
" texture = threevis.ImageTexture(imageUri='textures/checkerboard.png'))\n",
"\n",
"ctx.draw_vertices(verts, point_size=5, colors=vcolors)\n",
"\n",
......@@ -106,7 +105,7 @@
"metadata": {},
"outputs": [],
"source": [
"import meshvis\n",
"import threevis\n",
"vcolors = [\n",
" [1, 0, 0],\n",
" [0, 1, 0],\n",
......@@ -119,28 +118,29 @@
" [0, 0, 1]\n",
"]\n",
"\n",
"meshvis.display_edges([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]], \n",
"threevis.display_edges([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]], \n",
" [[0, 1], [2,3]], \n",
" colors = meshvis.PointAttribute(vcolors))"
" colors = threevis.PointAttribute(vcolors))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"display_name": "Python 3",
"language": "python",
"name": "python2"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2"
"pygments_lexer": "ipython3",
"version": "3.5.3rc1"
}
},
"nbformat": 4,
......
This diff is collapsed.
......@@ -4,15 +4,15 @@ def readme():
with open('README.md') as f:
return f.read()
setup(name='meshvis',
setup(name='threevis',
version='0.1',
description='Visualize meshes, point clouds, volumes and other geometry in a Jupyter Notebook',
long_description=readme(),
url='https://graphics.rwth-aachen.de:9000/dseyb/meshvis',
url='https://graphics.rwth-aachen.de:9000/threevis/threevis',
author='Dario Seyb, Isaak Lim, Janis Born',
author_email='dario.seyb@rwth-aachen.de',
license='MIT',
packages=['meshvis'],
packages=['threevis'],
install_requires = [
'numpy',
'pythreejs'
......
import unittest
import meshvis
import threevis
import numpy as np
class IndexedAttributes(unittest.TestCase):
......@@ -8,14 +8,14 @@ class IndexedAttributes(unittest.TestCase):
quad_faces_tri = np.array([[0, 1, 2], [0, 2, 3]])
def test_point_attribute_tri(self):
attrib = meshvis.PointAttribute(['a', 'b', 'c', 'd'])
resolved_attrib = meshvis.resolve_attributes(self.quad_faces_tri, [attrib])[0]
attrib = threevis.PointAttribute(['a', 'b', 'c', 'd'])
resolved_attrib = threevis.resolve_attributes(self.quad_faces_tri, [attrib])[0]
self.assertEqual(len(resolved_attrib), 6)
np.testing.assert_array_equal(resolved_attrib, ['a', 'b', 'c', 'a', 'c', 'd'])
def test_face_attribute_tri(self):
attrib = meshvis.FaceAttribute(['a', 'b'])
resolved_attrib = meshvis.resolve_attributes(self.quad_faces_tri, [attrib])[0]
attrib = threevis.FaceAttribute(['a', 'b'])
resolved_attrib = threevis.resolve_attributes(self.quad_faces_tri, [attrib])[0]
self.assertEqual(len(resolved_attrib), 6)
np.testing.assert_array_equal(resolved_attrib, ['a', 'a', 'a', 'b', 'b', 'b'])
......
......@@ -283,7 +283,7 @@ class Context(object):
self.minCorner + [0, 0, extends[2]]]
self.draw_edges(boxEdges, [[0, 1], [0, 2], [0, 3]], FaceAttribute([[1, 0, 0], [0, 1, 0], [0, 0, 1]]))
self.draw_text(str(map( lambda v: round(v, 3), self.minCorner)), self.minCorner - [0, extends[1]*0.1, 0], color = 'black', height=extends[1]/25)
self.draw_text(str([round(v,3) for v in self.minCorner]), self.minCorner - [0, extends[1]*0.1, 0], color = 'black', height=extends[1]/25)
self.draw_text(str(round(extends[0], 3)), (boxEdges[0] * 0.25 + boxEdges[1] * 0.75), color = 'black', height=extends[1]/20)
self.draw_text(str(round(extends[1], 3)), (boxEdges[0] * 0.25 + boxEdges[2] * 0.75), color = 'black', height=extends[1]/20)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment