Написал расширение - календарь, посмотрите?

Asked by Timas

Расширение автоматически группирует календарь, сгруппированные по месяцам.

Содержимое MyCalendar.inx:

<inkscape-extension>
  <_name>MyCalendar</_name>
  <id>MyCalendar</id>
  <dependency type="executable" location="extensions">MyCalendar.py</dependency>
  <dependency type="executable" location="extensions">inkex.py</dependency>
  <param name="year" type="int" _gui-text="What year you like?" min="1900" max="2100">2008</param>
  <param name="hspace" type="int" _gui-text="What hspace you like?" min="0" max="1000">25</param>
  <param name="vspace" type="int" _gui-text="What vspace you like?" min="0" max="1000">25</param>
  <param name="align" type="optiongroup" _gui-text="Nums Alignment">
        <_option value="start">left</_option>
        <_option value="middle">center</_option>
  <_option value="end">right</_option>
  </param>
  <effect>
    <object-type>all</object-type>
    <effects-menu>
       <submenu _name="Calendar"/>
    </effects-menu>
  </effect>
  <script>
    <command reldir="extensions" interpreter="python">MyCalendar.py</command>
  </script>
</inkscape-extension>

И сам скрипт:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#import sys
#sys.path.append('/usr/share/inkscape/extensions')

import inkex
from simplestyle import *
import datetime

class MyCalend(inkex.Effect):
    """
    Inkscape-расширение, календарь.
    Создает слои с датами в центре документа
    """
    def __init__(self):
        """
        Определяет все внешние опции в скрипте
        """
        inkex.Effect.__init__(self)

        #Опции передаваемые скрипту
        opts = [('-y', '--year', 'int', 'year', str(datetime.date.today().year),
                 'Год на который надо календарь.?'),
                ('-H', '--hspace', 'int', 'hspace', '25',
                 'Расстояние между днями по горизонтали'),
                ('-V', '--vspace', 'int', 'vspace', '25',
                 'Расстояние между днями по вертикали'),
                ('-A', '--align', 'string', 'align', 'right',
                 'Выравнивание'), ]

        for o in opts:
            self.OptionParser.add_option(o[0], o[1], action="store", type=o[2],
                                         dest=o[3], default=o[4], help=o[5])

    def drawMonth(self):
        """
        Отрисовка месяца
        """
        svg = self.document.getroot()

        # Создаем текстовый элементы на новом слое
        layer = inkex.etree.SubElement(svg, 'g')
        week={1:"Пн", 2:"Вт", 3:"Ср", 4:"Чт", 5:"Пт", 6:"Сб", 7:"Вс"}

        # Отрисовываем дни недели
        for key, val in week.items():
            text=inkex.etree.Element(inkex.addNS('text', 'svg'))
            text.text=unicode(val, 'utf-8')
            text.set('x', str(key * self.XOFFSET + self.XMonth) )
            text.set('y', str(self.YMonth) )

            style = {'text-align' : self.align, 'text-anchor':self.align }
            if key > 5:
                style = {'text-align' : self.align, 'text-anchor':self.align, 'fill':'#ff0000'}

            text.set('style', formatStyle(style))

            layer.append(text)

        for day in xrange(1, self.month_count_days[self.month] + 1):
            text=inkex.etree.Element(inkex.addNS('text', 'svg'))
            text.text=str(day)

            #Смещение для числа по X
            self.XCoord=self.XMonth + int(datetime.date(self.year, self.month+1, day).strftime("%w"))*self.XOFFSET
            if datetime.date(self.year, self.month+1, day).strftime("%w")=="0":
                self.XCoord=self.XMonth + 7*self.XOFFSET

            text.set('x', str(self.XCoord) )
            text.set('y', str(self.YCoord) )

            style = {'text-align' : self.align, 'text-anchor':self.align} #'text-anchor':'middle' #text-anchor:start text-anchor:end;
            if datetime.date(self.year, self.month+1, day).strftime("%w")=="6" or datetime.date(self.year, self.month+1, day).strftime("%w")=="0":
                style = {'text-align' : self.align, 'text-anchor':self.align, 'fill':'#ff0000'}

            #Смещение для числа по Y
            if datetime.date(self.year, self.month+1, day).strftime("%w")=="0":
                self.YCoord+=self.YOFFSET

            text.set('style', formatStyle(style))

            layer.append(text)

    def effect(self):
        """
        Сам эффект
        """

        self.align=self.options.align #end, start, middle
        self.year = int(self.options.year)
        self.month=0

        #количество дней в месяце
        self.month_count_days=[31,28,31,30,31,30,31,31,30,31,30,31]
        #Если год високосный, то 29 в феврале
        if not self.year%4:
            self.month_count_days[1]=29

        self.XOFFSET=self.XMonth=int(self.options.hspace)
        self.YOFFSET=self.YMonth=int(self.options.vspace)

        self.YCoord=self.YOFFSET*2
        self.XCoord=self.XOFFSET*2

        for x in xrange(0,12):
            self.month=x

            if self.month>5:
                self.YCoord=self.YOFFSET*2 + 220
                self.YMonth=self.YCoord-self.YOFFSET

            self.drawMonth()

            self.XMonth+=200
            self.YCoord=self.YOFFSET*2

            if self.month==5: #Переход на новую строчку
                self.XMonth=self.XOFFSET

#Создаем экзэмпляр эффекта и применяем его.
effect = MyCalend()
effect.affect()

P.S. Есть еще много идей, что можно было реализовать в расширениях... Стоит?

Question information

Language:
Russian Edit question
Status:
Answered
For:
Inkscape Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
mahfiaz (mahfiaz) said :
#1

If I understood you right, you wrote a new extension which generates calendars. Please post this as bug report and include files. Also it would be nice, if you translated the comments into english. You are also welcome to #inkscape at freenode.org

Revision history for this message
Alexandre Prokoudine (alexandre-prokoudine) said :
#2

Привет!

Ну вот смотрите.

1. Сценарий работает с 0.46, но не работает с 0.47, потому что в транке облагородили формат .inx. Я это локально исправил, и расширение запустилось. Могу запостить архив прямо в багрепорт.

2. При любой выставленной через export LC_ALL локали сетка генерится только на русском языке.

3. Не подписаны месяцы.

4. Не подписан год.

5. Нет выбора первого дня недели.

6. Нет выбора нужных месяцев (это уже можетюыть излишеством, поскольку Inkscape - не Scribus, и многостраничности нет)

Предлагаю посмотреть на http://www.colivre.coop.br/Aurium/InkscapeCalendarShellScript и сделать наподобие :-)

P.S. Не многовато негатива? :-)

Revision history for this message
Alexandre Prokoudine (alexandre-prokoudine) said :
#3

P.P.S. Было бы неплохо, чтобы можно было указывать размер сетки месяцев, хотя бы даже из пресетов: 6 на 2 (как сейчас), 3 на 4, 4 на 3.

Revision history for this message
Timas (dr-timas) said :
#4

Насчет негатива, не согласен! Я могу еще больше привести :). Да
действительно, можно сделать сетку (2х6, 3х4, 4х3 и т.д.), дать название
месяцам, сделать все подписи на английском, возможность создавать один
месяц, задавать цвета. Не понял про выбор первого дня недели (вы про
понедельник или воскресенье?)

Это все можно сделать без проблем. Но вы написали про
http://www.colivre.coop.br/Aurium/InkscapeCalendarShellScript,
А что вы его не включили? Просто прибило меня сделать календарь, а в
Inkscape .46 не подобного не было. Если есть все-таки смысл делать, то может
быть еще какие-то фишки на ум придут?

P.S. Я делал не для всех, а для себя и делал только то что мне нужно было на
тот момент, теперь кажется что это востребованная вещь, и могу значительно
его улучшить, вопрос - стоит ли, и куда потом постить?

Revision history for this message
Alexandre Prokoudine (alexandre-prokoudine) said :
#5

«Не понял про выбор первого дня недели (вы про понедельник или воскресенье?)» — да, в некоторых странах первым днем недели является воскресенье.

«А что вы его не включили?» — Не включили потому, что 0.46 вышел раньше, чем появился Calendario (по той же причине в 0.46 нет генератора визиток из CSV). Кроме того, этот сценарий Аурелио написал на bash, и во всех системах, в отличие от сценариев на Python, работать он не будет.

Так что сценарий нужен :)

Revision history for this message
Timas (dr-timas) said :
#6

Все, понял не дурак :) Постараюсь к концу следующей недели показать.

2008/12/6 Alexandre Prokoudine <email address hidden>

> Your question #53517 on Inkscape changed:
> https://answers.launchpad.net/inkscape/+question/53517
>
> Status: Open => Answered
>
> Alexandre Prokoudine proposed the following answer:
> «Не понял про выбор первого дня недели (вы про понедельник или
> воскресенье?)» — да, в некоторых странах первым днем недели является
> воскресенье.
>
> «А что вы его не включили?» — Не включили потому, что 0.46 вышел раньше,
> чем появился Calendario (по той же причине в 0.46 нет генератора визиток
> из CSV). Кроме того, этот сценарий Аурелио написал на bash, и во всех
> системах, в отличие от сценариев на Python, работать он не будет.
>
> Так что сценарий нужен :)
>
> --
> If this answers your question, please go to the following page to let us
> know that it is solved:
> https://answers.launchpad.net/inkscape/+question/53517/+confirm?answer_id=4
>
> If you still need help, you can reply to this email or go to the
> following page to enter your feedback:
> https://answers.launchpad.net/inkscape/+question/53517
>
> WARNING: This question is asked in a language (Russian)
> spoken by none of the registered Inkscape answer contacts.
>
> You received this question notification because you are a direct
> subscriber of the question.
>

--
Timas

Revision history for this message
Alexandre Prokoudine (alexandre-prokoudine) said :
#7

Спасибо :)

Can you help with this problem?

Provide an answer of your own, or ask Timas for more information if necessary.

To post a message you must log in.