User:Sergeybe
Jump to navigation
Jump to search
This extension draws old-fashioned rotary dialer
rotarydialer.inx
<inkscape-extension>
<_name>Rotary Dialer</_name>
<id>RotaryDialer</id>
<dependency type="executable" location="extensions">rotarydialer.py</dependency>
<dependency type="executable" location="extensions">inkex.py</dependency>
<param name="radius1" type="int" _gui-text="Radius1" min="0" max="2000">300</param>
<param name="radius2" type="int" _gui-text="Radius2" min="0" max="2000">55</param>
<param name="angle" type="int" _gui-text="Angle" min="0" max="360">28</param>
<effect>
<object-type>all</object-type>
<effects-menu>
<submenu _name="Render"/>
</effects-menu>
</effect>
<script>
<command reldir="extensions" interpreter="python">rotarydialer.py</command>
</script>
</inkscape-extension>
rotarydialer.py
#!/usr/bin/env python
#
# -*- coding: utf-8 -*-
import sys
if sys.platform in ('win32','win16', 'os2', 'dos'):
sys.path.append('C:\Program Files\Inkscape\share\extensions')
else:
sys.path.append('/usr/share/inkscape/extensions')
import inkex
from simplestyle import *
import math
class RotaryDialer(inkex.Effect):
"""
Init
"""
def __init__(self):
inkex.Effect.__init__(self)
self.OptionParser.add_option('-1', '--radius1', action = 'store',
type = 'int', dest = 'radius1', default = 300,
help = 'Radius1')
self.OptionParser.add_option('-2', '--radius2', action = 'store',
type = 'int', dest = 'radius2', default = 55,
help = 'Radius2')
self.OptionParser.add_option('-a', '--angle', action = 'store',
type = 'int', dest = 'angle', default = 28,
help = 'Angle')
"""
Effect
"""
def effect(self):
# Set local variables
radius1 = self.options.radius1
radius2 = self.options.radius2
angle = self.options.angle
# Get document
svg = self.document.getroot()
width = inkex.unittouu(svg.get('width'))
height = inkex.unittouu(svg.attrib['height'])
# Create new layer
layer = inkex.etree.SubElement(svg, 'g')
layer.set(inkex.addNS('label', 'inkscape'), 'Sector 1 Layer')
layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
# Add black rect
rect = inkex.etree.SubElement(layer, inkex.addNS('rect','svg'))
rect.set('x', '0')
rect.set('y', '0')
rect.set('width', str(width))
rect.set('height', str(height))
style = {
'opacity': '1',
'fill': '#000000',
'fill-opacity': '1',
'stroke': 'none',
'stroke-width': '4',
'stroke-miterlimit': '4',
'stroke-dasharray': 'none',
'stroke-opacity': '1'
}
rect.set('style', formatStyle(style))
# Get defs
defs = self.xpathSingle('/svg:svg//svg:defs')
if not defs:
defs = inkex.etree.SubElement(self.document.getroot(),inkex.addNS('defs','svg'))
# Create gradient in space
gradient1 = inkex.etree.SubElement(defs, inkex.addNS('linearGradient','svg'))
gradient1.set('id', 'Grad1')
gradient1.set('gradientUnits', 'userSpaceOnUse')
gradient1.set('x1', str(width / 2))
gradient1.set('y1', str(height / 2 - radius1))
gradient1.set('x2', str(width / 2))
gradient1.set('y2', str(height / 2 + radius1))
gradient1.set(inkex.addNS('collect', 'inkscape'), 'always')
gradient1.set(inkex.addNS('href', 'xlink'), '#Grad2')
defs.append(gradient1)
# Create gradient in color
gradient2 = inkex.etree.SubElement(defs, inkex.addNS('linearGradient','svg'))
gradient2.set('id', 'Grad2')
gradient2.set(inkex.addNS('collect', 'inkscape'), 'always')
# Add 1 stop
stop1 = inkex.etree.SubElement(gradient2, inkex.addNS('stop','svg'))
stop1.set('id', 'stop1')
stop1.set('offset', '0')
style = {
'stop-color': '#e7e7e7',
'stop-opacity': '1'
}
stop1.set('style', formatStyle(style))
gradient2.append(stop1)
# Add 2 stop
stop2 = inkex.etree.SubElement(gradient2, inkex.addNS('stop','svg'))
stop2.set('id', 'stop2')
stop2.set('offset', '1')
style = {
'stop-color': '#4c564d',
'stop-opacity': '1'
}
stop2.set('style', formatStyle(style))
gradient2.append(stop2)
# Create gradient background
gradient3 = inkex.etree.SubElement(defs, inkex.addNS('radialGradient','svg'))
gradient3.set('id', 'Grad3')
gradient3.set('r', '304')
gradient3.set('cx', str(width / 2))
gradient3.set('cy', str(height / 2))
gradient3.set('fx', '300')
gradient3.set('fy', '300')
gradient3.set('r', '304')
gradient3.set('gradientUnits', 'userSpaceOnUse')
gradient3.set(inkex.addNS('collect', 'inkscape'), 'always')
gradient3.set(inkex.addNS('href', 'xlink'), '#Grad2')
# Add 1 stop
stop1 = inkex.etree.SubElement(gradient3, inkex.addNS('stop','svg'))
stop1.set('id', 'stop1')
stop1.set('offset', '0')
style = {
'stop-color': '#ffffff',
'stop-opacity': '0'
}
stop1.set('style', formatStyle(style))
gradient3.append(stop1)
# Add 2 stop
stop2 = inkex.etree.SubElement(gradient3, inkex.addNS('stop','svg'))
stop2.set('id', 'stop2')
stop2.set('offset', '0.9')
style = {
'stop-color': '#ffffff',
'stop-opacity': '1'
}
stop2.set('style', formatStyle(style))
gradient3.append(stop2)
# Add 3 stop
stop3 = inkex.etree.SubElement(gradient3, inkex.addNS('stop','svg'))
stop3.set('id', 'stop3')
stop3.set('offset', '1')
style = {
'stop-color': '#ffffff',
'stop-opacity': '1'
}
stop3.set('style', formatStyle(style))
gradient3.append(stop3)
# Append gradients to defs
defs.append(gradient1)
defs.append(gradient2)
defs.append(gradient3)
# Create background
path = inkex.etree.SubElement(layer, 'path')
path.set(inkex.addNS('type', 'sodipodi'), 'arc')
path.set(inkex.addNS('cx', 'sodipodi'), str(width / 2))
path.set(inkex.addNS('cy', 'sodipodi'), str(height / 2))
path.set(inkex.addNS('rx', 'sodipodi'), str(radius1))
path.set(inkex.addNS('ry', 'sodipodi'), str(radius1))
style = {
'fill': '#000000',
'stroke': '#000000',
# 'stroke': 'url(#Grad1)',
'stroke-width': '8',
'stroke-miterlimit': '0',
'stroke-opacity': '1',
'stroke-dasharray': 'none',
'fill-opacity': '1',
'stroke-miterlimit': '4',
'stroke-dasharray': 'none'
}
path.set('style', formatStyle(style))
layer.append(path)
# Create circle
path = inkex.etree.SubElement(layer, 'path')
path.set(inkex.addNS('type', 'sodipodi'), 'arc')
path.set(inkex.addNS('cx', 'sodipodi'), str(width / 2))
path.set(inkex.addNS('cy', 'sodipodi'), str(height / 2))
path.set(inkex.addNS('rx', 'sodipodi'), str(radius1))
path.set(inkex.addNS('ry', 'sodipodi'), str(radius1))
style = {
'fill': '#7f7f7f',
# 'stroke': '#000000',
'stroke': 'url(#Grad1)',
'stroke-width': '8',
'stroke-miterlimit': '0',
'stroke-opacity': '0.5',
'stroke-dasharray': 'none',
'fill-opacity': '0.5',
'stroke-miterlimit': '4',
'stroke-dasharray': 'none'
}
path.set('style', formatStyle(style))
layer.append(path)
# Create inside circle
path = inkex.etree.SubElement(layer, 'path')
path.set(inkex.addNS('type', 'sodipodi'), 'arc')
path.set(inkex.addNS('cx', 'sodipodi'), str(width / 2))
path.set(inkex.addNS('cy', 'sodipodi'), str(height / 2))
path.set(inkex.addNS('rx', 'sodipodi'), str(radius1 - 2 * radius2 - 20))
path.set(inkex.addNS('ry', 'sodipodi'), str(radius1 - 2 * radius2 - 20))
style = {
'fill': '#7f7f7f',
'stroke': '#000000',
'stroke-width': '2',
'stroke-opacity': '0.5',
'fill-opacity': '0.5',
'stroke-miterlimit': '4',
'stroke-dasharray': 'none'
}
path.set('style', formatStyle(style))
layer.append(path)
# Create small circlies
i = 0
fi = 0
# Alphabet
alphabet = (
"",
"ABC",
"DEF",
"GHI",
"JKL",
"MN",
"PRS",
"TUV",
"WXY",
"OQ"
)
while (fi < 360 and i < 10):
rad = math.radians(fi + 90)
cx = width / 2 + math.cos(rad) * (radius1 - radius2 - 10)
cy = height / 2 + math.sin(rad) * (radius1 - radius2 - 10)
# Small circle
path = inkex.etree.SubElement(layer, 'path')
path.set(inkex.addNS('type', 'sodipodi'), 'arc')
path.set(inkex.addNS('cx', 'sodipodi'), str(cx))
path.set(inkex.addNS('cy', 'sodipodi'), str(cy))
path.set(inkex.addNS('rx', 'sodipodi'), str(radius2))
path.set(inkex.addNS('ry', 'sodipodi'), str(radius2))
#style = {
#'fill' : 'none',
#'stroke': '#000000',
#'stroke-width' : '1.0px',
#'stroke-opacity' : '1.0'
#}
style = {
# 'fill': '#7f7f7f',
'fill': '#Grad2',
'stroke': '#000000',
'stroke-width': '2px',
'stroke-opacity': '0.5',
'fill-opacity': '0.5',
'stroke-miterlimit': '4px',
'stroke-dasharray': 'none'
}
path.set('style', formatStyle(style))
# Numbers
text = inkex.etree.SubElement(layer, 'text')
text.set('id', 'text' + str(i))
text.set('x', str(cx))
text.set('y', str(cy + 18))
if i == 0:
text.text = '0'
else :
text.text = str(10 - i)
style = {
'fill':'#ffffff',
'font-size': '64px',
'text-anchor': 'middle',
'text-align': 'center',
'-inkscape-font-specification': 'Agency FB Bold',
'font-family': 'Agency FB',
'font-weight': 'bold',
'font-style': 'normal'
}
text.set('style', formatStyle(style))
# Alphabets
text = inkex.etree.SubElement(layer, 'text')
text.set('id', 'textA' + str(i))
text.set('x', str(cx))
text.set('y', str(cy + 43))
text.text = alphabet[9 - i]
style = {
'fill':'#ffffff',
'font-size': '24px',
'text-anchor': 'middle',
'text-align': 'center',
'-inkscape-font-specification': 'Agency FB Bold',
'font-family': 'Agency FB',
'font-weight': 'bold',
'font-style': 'normal'
}
text.set('style', formatStyle(style))
# Increase variables
fi = fi + angle
i = i + 1
effect = RotaryDialer()
effect.affect()