pfa 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +46 -0
- data/README.md +156 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/assets/Manuel/ImageMagick.md +155 -0
- data/lib/assets/Manuel/Manuel-developer.md +50 -0
- data/lib/assets/fr/PFA_ABSOLUTE_DATA.yaml +212 -0
- data/lib/assets/fr/errors.yaml +107 -0
- data/lib/pfa/absolute_pfa.rb +25 -0
- data/lib/pfa/any_builder.rb +28 -0
- data/lib/pfa/constants.rb +24 -0
- data/lib/pfa/errors_manager.rb +14 -0
- data/lib/pfa/imagemagick_module.rb +551 -0
- data/lib/pfa/img_builder.rb +198 -0
- data/lib/pfa/node_time.rb +188 -0
- data/lib/pfa/pfa_element_module.rb +30 -0
- data/lib/pfa/relative_pfa.rb +191 -0
- data/lib/pfa/relative_pfa_datatime.rb +27 -0
- data/lib/pfa/relative_pfa_node.rb +238 -0
- data/lib/pfa/temporal_methods.rb +69 -0
- data/lib/pfa/version.rb +3 -0
- data/lib/pfa.rb +20 -0
- data/pfa.gemspec +34 -0
- data/pfa.jpg +0 -0
- metadata +147 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6ccdb2fab099b304836b687b9d582de1769019ab82ca15edfc05394fdd6e0d01
|
4
|
+
data.tar.gz: 1ada3fac532d0821fe5067347d7f6fc2015e3b515b629cc50acfebb2b9501d21
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7af5538084c56b345e4d317b0041814b1adc11829aed0475584422f21a5ea6624c5f2fcab3633e3d08871126aa83f9f7c1417a223d8b2d9b84b89f900a37c659
|
7
|
+
data.tar.gz: eeeae95913d4135f4fe1835c7b5792ce7f53c5780e900b599aa74d13ebb648817a40ffa0b29d5c3806d722c098be8149f1139c2df0e0863c34f899d7576de7ac
|
data/.DS_Store
ADDED
Binary file
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
pfa (0.1.0)
|
5
|
+
clir
|
6
|
+
singleton
|
7
|
+
yaml
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
clir (0.22.1)
|
13
|
+
json
|
14
|
+
tty-prompt
|
15
|
+
json (2.6.3)
|
16
|
+
minitest (5.19.0)
|
17
|
+
minitest-color (0.0.2)
|
18
|
+
minitest (~> 5)
|
19
|
+
pastel (0.8.0)
|
20
|
+
tty-color (~> 0.5)
|
21
|
+
rake (12.3.3)
|
22
|
+
singleton (0.1.1)
|
23
|
+
tty-color (0.6.0)
|
24
|
+
tty-cursor (0.7.1)
|
25
|
+
tty-prompt (0.23.1)
|
26
|
+
pastel (~> 0.8)
|
27
|
+
tty-reader (~> 0.8)
|
28
|
+
tty-reader (0.9.0)
|
29
|
+
tty-cursor (~> 0.7)
|
30
|
+
tty-screen (~> 0.8)
|
31
|
+
wisper (~> 2.0)
|
32
|
+
tty-screen (0.8.1)
|
33
|
+
wisper (2.0.1)
|
34
|
+
yaml (0.2.1)
|
35
|
+
|
36
|
+
PLATFORMS
|
37
|
+
ruby
|
38
|
+
|
39
|
+
DEPENDENCIES
|
40
|
+
minitest (~> 5.0)
|
41
|
+
minitest-color
|
42
|
+
pfa!
|
43
|
+
rake (~> 12.0)
|
44
|
+
|
45
|
+
BUNDLED WITH
|
46
|
+
2.1.4
|
data/README.md
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
# PFA
|
2
|
+
|
3
|
+
PFA pour "Paradigme de Field Augmenté". Ce gem permet de le gérer de façon simple.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'pfa'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle install
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install pfa
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
On commence toujours par instancier un nouveau paradigme.
|
24
|
+
|
25
|
+
~~~ruby
|
26
|
+
require 'pfa'
|
27
|
+
|
28
|
+
pfa = PFA::new
|
29
|
+
~~~
|
30
|
+
|
31
|
+
> Ou on définit directement toutes les valeurs [cf. ci-dessous](#with-all-data)
|
32
|
+
|
33
|
+
Ensuite, on le renseigne en lui ajoutant des nœuds :
|
34
|
+
|
35
|
+
~~~ruby
|
36
|
+
pfa.add :incident_declencheur, {t:"0+12+0", d:"Louis tue Harlan, le violeur de Selma"}
|
37
|
+
pdf.add :pivot1, {t:"0,23,15", d:"Louise décide de fuir au Mexique."}
|
38
|
+
# etc.
|
39
|
+
~~~
|
40
|
+
|
41
|
+
Il faut aussi définir le "zéro" absolu du film et son temps de fin.
|
42
|
+
|
43
|
+
> Ce "zéro" permettra de rectifier tous les temps quelle que soit la vidéo utilisée. Par exemple, ce zéro peut être le timecode de la toute première image du film, ou le timecode de l'apparition du titre.
|
44
|
+
> Tous les autres temps seront donnés normalement.
|
45
|
+
|
46
|
+
~~~ruby
|
47
|
+
|
48
|
+
pfa.zero = "0:00:25"
|
49
|
+
pfa.end_time = "1:58:56"
|
50
|
+
|
51
|
+
~~~
|
52
|
+
|
53
|
+
<a name="with-all-data"></a>
|
54
|
+
|
55
|
+
### Définition en fournissant toutes les données
|
56
|
+
|
57
|
+
On peut aller très vite en définissant tout :
|
58
|
+
|
59
|
+
~~~
|
60
|
+
require 'pfa'
|
61
|
+
|
62
|
+
data_paradigme = {
|
63
|
+
zero: 35,
|
64
|
+
end_time: 2*60+15,
|
65
|
+
incident_declencheur: {t:'0+10+25', d:"LUI rencontre ELLE pour la première fois."},
|
66
|
+
pivot1: {t:'0:25;56', d:"<description du premier pivot"},
|
67
|
+
developpement_part1: {t: 30*60, d:"<description de la première partie du développement>"}
|
68
|
+
# etc. avec toutes les données requises (cf. ci-dessous)
|
69
|
+
# ...
|
70
|
+
}
|
71
|
+
|
72
|
+
pfa = PFA.new(data_paradigme)
|
73
|
+
pfa.to_img
|
74
|
+
# => produit l'image du paradigme
|
75
|
+
|
76
|
+
# Ou
|
77
|
+
pfa.to_img(**{as: :default})
|
78
|
+
# => Produit l'image avec d'autres dimension
|
79
|
+
|
80
|
+
~~~
|
81
|
+
|
82
|
+
> Noter les différentes formes que peut prendre le temps : une horloge normale ("0:23:45"), une horloge avec des "+" (attention : ce n'est pas une addition, c'est juste un signe plus facile à écrire), une horloge avec des virgules ("0,3,15" — plus facile à écrire aussi), un nombre de secondes (3752), et même un temps `Time` (Time.at(152)).
|
83
|
+
|
84
|
+
### Données minimales
|
85
|
+
|
86
|
+
Pour pouvoir être construit, un *PFA* doit définir au moins les nœuds suivants. Tous ces nœuds doivent être définis avec la méthode `pfa#add` et les deux arguments requis, la clé symbolique (p.e. `:pivot2`) et une table contenant la clé `t:` (timecode), la clé `d:` (description) et optionnellement la clé `:duree` (nombre de secondes).
|
87
|
+
|
88
|
+
~~~bash
|
89
|
+
:exposition
|
90
|
+
:incident_declencheur
|
91
|
+
:pivot1
|
92
|
+
:developpement_part1
|
93
|
+
:developpement_part2
|
94
|
+
:pivot2
|
95
|
+
:denouement
|
96
|
+
:climax
|
97
|
+
~~~
|
98
|
+
|
99
|
+
> Si un de ces nœuds n'est pas défini, ou que les propriétés `zero` et `end_time` ne sont pas définies, la construction produira une erreur.
|
100
|
+
|
101
|
+
La liste complète des clés utilisables et définissables de la même manière est :
|
102
|
+
|
103
|
+
~~~bash
|
104
|
+
:exposition
|
105
|
+
:preambule
|
106
|
+
:incident_perturbateur
|
107
|
+
:incident_declencheur
|
108
|
+
:zone_de_refus
|
109
|
+
:pivot1
|
110
|
+
:developpement_part1
|
111
|
+
:premiere_action
|
112
|
+
:premier_tiers
|
113
|
+
:cle_de_voute
|
114
|
+
:developpement_part2
|
115
|
+
:premiere_action_dev2
|
116
|
+
:deuxieme_tiers
|
117
|
+
:crise
|
118
|
+
:pivot2
|
119
|
+
:denouement
|
120
|
+
:premier_action_denouement
|
121
|
+
:climax
|
122
|
+
:desinence
|
123
|
+
~~~
|
124
|
+
|
125
|
+
Une fois les nœuds du paradigme définis, on peut le construire…
|
126
|
+
|
127
|
+
* sous forme d'image JPEG :
|
128
|
+
|
129
|
+
~~~ruby
|
130
|
+
pfa.to_img
|
131
|
+
~~~
|
132
|
+
|
133
|
+
Par défaut, ce sera une image pour un livre (environ A5) d'analyse de film comme ceux produit par la collection « Leçons du cinéma ».
|
134
|
+
|
135
|
+
* sous forme de fichier HTML (non encore implémenté) :
|
136
|
+
|
137
|
+
~~~ruby
|
138
|
+
pfa.to_html
|
139
|
+
~~~
|
140
|
+
|
141
|
+
### Options de sortie
|
142
|
+
|
143
|
+
Des options de sortie (premier argument de `#to_img` ou `#to_html`) permettent d'affiner la sortie attendue.
|
144
|
+
|
145
|
+
\[À développer]
|
146
|
+
|
147
|
+
## Development
|
148
|
+
|
149
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
150
|
+
|
151
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
152
|
+
|
153
|
+
## Contributing
|
154
|
+
|
155
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/PhilippePerret/pfa.
|
156
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "pfa"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
# PFA — Manuel pour ImageMagick
|
2
|
+
|
3
|
+
Ce document permet de comprendre le code utilisé pour la production du Paradigme de Field Augmenté avec Image magick.
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
## Description du code
|
8
|
+
|
9
|
+
### Introduction
|
10
|
+
|
11
|
+
~~~bash
|
12
|
+
convert -size #{width}x#{height} \
|
13
|
+
xc:white \
|
14
|
+
-units PixelsPerInch -density 300 \
|
15
|
+
-background transparent \
|
16
|
+
-set colorspace sRGB
|
17
|
+
|
18
|
+
# convert
|
19
|
+
# => Commande pour produire l’image
|
20
|
+
# -size widthxheight
|
21
|
+
# => Taille de l'image.
|
22
|
+
# Pour un livre d'analyse, c’est 5976 px de large et 3882 px de hauteur
|
23
|
+
# ATTENTION de bien définir la taille avant le xc:, sinon
|
24
|
+
# le canevas ferait 1 px / 1 px
|
25
|
+
# xc:white
|
26
|
+
# => Définit le canevas. Sans cette indication, l'image ne peut pas être
|
27
|
+
# créée
|
28
|
+
# -units UNITÉ
|
29
|
+
# => Permet de définir l'unité de la résolution [à confirmer]
|
30
|
+
# => PixelsPerInch = Nombre de pixels par pouce
|
31
|
+
# -density DENSITÉ
|
32
|
+
# => Définit la résolution
|
33
|
+
# => 300 points par pouce (pixels par pouce ?)
|
34
|
+
# -background COULEUR
|
35
|
+
# => Définit la nature de couleur du fond
|
36
|
+
# => transparent pour le fond de l'image
|
37
|
+
# -set colorspace ESPACE_COULEUR
|
38
|
+
# => Pour définir l'espace de couleur
|
39
|
+
# => sRGB pour un espace RGB (RVB) avec transparence.
|
40
|
+
~~~
|
41
|
+
|
42
|
+
On dessine le premier **rectangle** pour l’**exposition du paradigme idéal**.
|
43
|
+
|
44
|
+
~~~bash
|
45
|
+
-stroke gray50 -fill white -strokewidth 3 -draw "rectangle 0,258 1494,1806" \
|
46
|
+
|
47
|
+
# -stroke COULEUR
|
48
|
+
# => Définission de la couleur du trait/de la police
|
49
|
+
# => gray50 est un gris 50 %
|
50
|
+
# -fill COULEUR
|
51
|
+
# => Couleur de remplissage de la police
|
52
|
+
# => white, elle sera blanche
|
53
|
+
# -strokewidth TAILLE
|
54
|
+
# (pas sûr que ce soit nécessaire ici)
|
55
|
+
# => Largeur du trait ou de la police
|
56
|
+
# => 3 indique une grosseur de 3 pixels. On aura donc un trait
|
57
|
+
# avec des caractères délimités en noir (stroke) et du
|
58
|
+
# blanc à l'intérieur
|
59
|
+
# -draw
|
60
|
+
# => Pour dessiner quelque chose dans l'image avec les paramètres
|
61
|
+
# qui viennent d'être définis. Note : on peut aussi dessiner du
|
62
|
+
# texte avec cette commande, comme on le verra.
|
63
|
+
# => "rectangle 0,258 1494,1806" dessinera un rectangle depuis le
|
64
|
+
# point 0,258 (left,top) jusqu'au point 1494, 1806 (left, top)
|
65
|
+
~~~
|
66
|
+
|
67
|
+
On pourrait poursuivre en ajoutant les choses à dessiner de la même manière.
|
68
|
+
|
69
|
+
~~~bash
|
70
|
+
-draw "text 4,262 EXPOSITION" \
|
71
|
+
-draw "rectangle 1494,258 2600,1806" \
|
72
|
+
-draw "circle ..." \
|
73
|
+
~~~
|
74
|
+
|
75
|
+
Le problème, ci-dessus, se pose particulièrement pour les textes, si on veut les aligner aux boites et aux points (qui représentent des évènements du paradigme). Dans ce cas, il faut utiliser le mode composite :
|
76
|
+
|
77
|
+
~~~bash
|
78
|
+
\( ... définition ... \) -geometry +100-21 -gravity Center -composite
|
79
|
+
|
80
|
+
# => \(...\) va définir l'élément à écrire, avec les mêmes paramètres que
|
81
|
+
# les autres éléments
|
82
|
+
# Penser à laisser des espaces à l'intérieur.
|
83
|
+
# => -gravity GRAVITÉ
|
84
|
+
# Indique l'alignement de la boite par rappart à l'image totale
|
85
|
+
# Center indique que la boite va être alignée au centre verticalement
|
86
|
+
# et horizontalement. On indique les autres valeurs par North,
|
87
|
+
# South, East et West. Par exemple NorthWest pour aligner en haut
|
88
|
+
# à gauche.
|
89
|
+
# => -geometry GEOMÉTRIE
|
90
|
+
# Permet d'ajuster la position de la boite de façon précise par rapport
|
91
|
+
# à la gravité choisie.
|
92
|
+
# La valeur est un signe et un nombre pour la valeur horizontale et la
|
93
|
+
# même chose par rapport à la valeur verticale. Ici, par exemple, on
|
94
|
+
# ajoutera 100 points horizontalement et on en enlèvera 21 verticalement.
|
95
|
+
# ATTENTION : ces ajouts ne fonctionnement pas de la même manière suivant
|
96
|
+
# la gravité. Par exemple, si la gravité est au sud (South) une valeur
|
97
|
+
# positive fera REMONTER la boite tandis que si la gravité est au nord
|
98
|
+
# (North) une valeur positive fera DESCENDRE la boite
|
99
|
+
~~~
|
100
|
+
|
101
|
+
On peut trouver entre les `\(...\)` toutes les propriétés qui vont définir l’aspect (`stroke`, `background` etc.).
|
102
|
+
|
103
|
+
On prend soin de mettre le label au bout de la définition, pour qu’il profite bien des définitions.
|
104
|
+
|
105
|
+
Les définitions à particulière comprendre sont :
|
106
|
+
|
107
|
+
~~~bash
|
108
|
+
\( -size <WxH> -extent <WxH>... label:"Mon label" \) -composite \
|
109
|
+
|
110
|
+
# => -size DIMENSION
|
111
|
+
# Permet de définir la taille du label. Plus la taille sera grande
|
112
|
+
# et plus le label sera affiché gros.
|
113
|
+
# ATTENTION : ça n'est pas la taille de la boite contenant.
|
114
|
+
# => -extent DIMENSION
|
115
|
+
# Permet de définir la taille véritable de la boite
|
116
|
+
# => label:"STRING"
|
117
|
+
# Définit le label. Noter qu'il n'y a pas de tiret avant cette
|
118
|
+
# propriété.
|
119
|
+
~~~
|
120
|
+
|
121
|
+
On peut trouver les autres propriétés, dans cette boite :
|
122
|
+
|
123
|
+
~~~bash
|
124
|
+
\( -extent 1000x1000 -gravity SouthEast label:"Label en bas à droite" \) \
|
125
|
+
-geometry +100+100
|
126
|
+
-gravity Center \
|
127
|
+
-composite \
|
128
|
+
|
129
|
+
# => -gravity (entre les parenthèses)
|
130
|
+
# Définit l'alignement, mais dans la boite de 1000x1000.
|
131
|
+
# Alors que la boite elle-même sera située au centre de l'image,
|
132
|
+
# décalée de 100 points vers le bas et vers la gauche.
|
133
|
+
~~~
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
On va écrire le label « Exposition ».
|
138
|
+
|
139
|
+
~~~bash
|
140
|
+
\( -background transparent -stroke gray75 -strokewidth 3 -pointsize 36.0 -size 1494x200 \
|
141
|
+
-trim -extent 1494x200 -gravity Center label:"EXPOSITION" \) -gravity NorthWest \
|
142
|
+
-geometry +0+420 -composite
|
143
|
+
|
144
|
+
~~~
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
On ajoute le **rectangle** pour la **première partie de développement idéal**.
|
149
|
+
|
150
|
+
~~~bash
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
~~~
|
155
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# PFA — Manuel du développeur
|
2
|
+
|
3
|
+
## Difficulté des temps
|
4
|
+
|
5
|
+
> Note : pour simplifier, on ne ramène plus les temps à 120 minutes comme c'était le cas avant. On ne tient compte que de la durée réelle du film.
|
6
|
+
|
7
|
+
La difficulté des temps pour les nœuds tient au fait que :
|
8
|
+
|
9
|
+
* Le nœud possède un temps absolu (défini par le paradigme absolu). Ce temps correspond à la position idéale du nœud dans le paradigme.
|
10
|
+
* Le nœud possède un temps relatif (défini par rapport au film). Ce temps correspond à la position relative (au zéro) du nœud dans le film analysé. Il correspond à l'horloge réelle qui est affichée à l'écran, qu'on appelle "timecode".
|
11
|
+
* Le nœud possède un *temps relatif exact*. Ce temps correspond à la position réelle du nœud dans le film analysé, *en faisant abstraction du zéro*.
|
12
|
+
|
13
|
+
Exemple :
|
14
|
+
|
15
|
+
La clé de voûte se trouve dans l'absolu presque au milieu du film. Elle se trouve à `60 - 2` en temps rapporté à 120 minutes.
|
16
|
+
|
17
|
+
Imaginons un film qui commence réellement au temps `0:00:23`, qui possède une durée de `90 minutes` et qui possède une clé de voûte à `0:40:00` (à l'écran).
|
18
|
+
|
19
|
+
Dans ce cas, la position exacte de la clé de voûte sera :
|
20
|
+
|
21
|
+
~~~bash
|
22
|
+
0:40:00
|
23
|
+
- 0:00:23
|
24
|
+
= 0:39:37
|
25
|
+
~~~
|
26
|
+
|
27
|
+
Plusieurs méthode pratiques permettent de gérer ces temps :
|
28
|
+
|
29
|
+
~~~ruby
|
30
|
+
Soit cdv, l'instance \PFA::RelativePFA::Node de la clé de voûte.
|
31
|
+
|
32
|
+
cdv.start_at
|
33
|
+
# => \PFA::NTime du temps du nœud tel qu'il a été instancié avec l'horloge du film.
|
34
|
+
|
35
|
+
cdv.start_at.exact
|
36
|
+
# => \PFA::NTime du temps exact du nœud, en tenant compte du zéro
|
37
|
+
|
38
|
+
cdv.start_at.exact.to_horloge
|
39
|
+
# => \String L'horloge exacte, comme si le film commençait à 0:00:00.
|
40
|
+
|
41
|
+
cdv.start_at.to_horloge
|
42
|
+
# => \String L'horloge à l'écran, avec un début de film qui n'est pas à 0:00:00.
|
43
|
+
|
44
|
+
cdv.start_at.on_120
|
45
|
+
# => \Float la minute sur laquelle sera la clé de voûte si le film faisait 120 minutes
|
46
|
+
# Noter que cette valeur tient forcément compte de la position du zéro, et prend
|
47
|
+
# donc la valeur de la position exacte du nœud.
|
48
|
+
|
49
|
+
|
50
|
+
~~~
|