Difference between revisions of "User:Sergeybe"
Jump to navigation
Jump to search
m (Fix one line in source) |
|||
Line 31: | Line 31: | ||
import sys | 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 | import inkex | ||
Line 60: | Line 63: | ||
""" | """ | ||
def effect(self): | def effect(self): | ||
# Set local variables | |||
radius1 = self.options.radius1 | |||
radius2 = self.options.radius2 | |||
angle = self.options.angle | |||
# Get document | # Get document | ||
svg = self.document.getroot() | svg = self.document.getroot() | ||
Line 69: | Line 77: | ||
layer.set(inkex.addNS('label', 'inkscape'), 'Sector 1 Layer') | layer.set(inkex.addNS('label', 'inkscape'), 'Sector 1 Layer') | ||
layer.set(inkex.addNS('groupmode', 'inkscape'), '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) | |||
path = inkex.etree.SubElement( | # 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('type', 'sodipodi'), 'arc') | ||
path.set(inkex.addNS('cx', 'sodipodi'), str(width / 2)) | path.set(inkex.addNS('cx', 'sodipodi'), str(width / 2)) | ||
Line 82: | Line 207: | ||
path.set(inkex.addNS('rx', 'sodipodi'), str(radius1)) | path.set(inkex.addNS('rx', 'sodipodi'), str(radius1)) | ||
path.set(inkex.addNS('ry', '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 = { | style = { | ||
'fill': '#7f7f7f', | 'fill': '#7f7f7f', | ||
'stroke': '# | # 'stroke': '#000000', | ||
'stroke-width': ' | 'stroke': 'url(#Grad1)', | ||
'stroke-width': '8', | |||
'stroke-miterlimit': '0', | |||
'stroke-opacity': '0.5', | 'stroke-opacity': '0.5', | ||
'stroke-dasharray': 'none', | |||
'fill-opacity': '0.5', | 'fill-opacity': '0.5', | ||
'stroke-miterlimit': '4', | 'stroke-miterlimit': '4', | ||
'stroke-dasharray': 'none' | 'stroke-dasharray': 'none' | ||
} | } | ||
path.set('style', formatStyle(style)) | path.set('style', formatStyle(style)) | ||
layer.append(path) | |||
path = inkex.etree.SubElement( | # Create inside circle | ||
path = inkex.etree.SubElement(layer, 'path') | |||
path.set(inkex.addNS('type', 'sodipodi'), 'arc') | path.set(inkex.addNS('type', 'sodipodi'), 'arc') | ||
path.set(inkex.addNS('cx', 'sodipodi'), str(width / 2)) | path.set(inkex.addNS('cx', 'sodipodi'), str(width / 2)) | ||
Line 116: | Line 270: | ||
path.set('style', formatStyle(style)) | 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): | while (fi < 360 and i < 10): | ||
rad = math.radians(fi + 90) | rad = math.radians(fi + 90) | ||
Line 124: | Line 295: | ||
cy = height / 2 + math.sin(rad) * (radius1 - radius2 - 10) | cy = height / 2 + math.sin(rad) * (radius1 - radius2 - 10) | ||
path = inkex.etree.SubElement( | # Small circle | ||
path = inkex.etree.SubElement(layer, 'path') | |||
path.set(inkex.addNS('type', 'sodipodi'), 'arc') | path.set(inkex.addNS('type', 'sodipodi'), 'arc') | ||
path.set(inkex.addNS('cx', 'sodipodi'), str(cx)) | path.set(inkex.addNS('cx', 'sodipodi'), str(cx)) | ||
Line 139: | Line 311: | ||
style = { | style = { | ||
'fill': '# | # 'fill': '#7f7f7f', | ||
'fill': '#Grad2', | |||
'stroke': '#000000', | 'stroke': '#000000', | ||
'stroke-width': ' | 'stroke-width': '2px', | ||
'stroke-opacity': '0.5', | 'stroke-opacity': '0.5', | ||
'fill-opacity': '0.5', | 'fill-opacity': '0.5', | ||
'stroke-miterlimit': ' | 'stroke-miterlimit': '4px', | ||
'stroke-dasharray': 'none' | 'stroke-dasharray': 'none' | ||
} | } | ||
Line 150: | Line 323: | ||
path.set('style', formatStyle(style)) | 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 | fi = fi + angle | ||
i = i + 1 | i = i + 1 | ||
Line 157: | Line 370: | ||
effect = RotaryDialer() | effect = RotaryDialer() | ||
effect.affect() | effect.affect() | ||
</pre> | </pre> |
Latest revision as of 09:23, 27 May 2009
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()