prefig 0.3.7.dev20250722203657__tar.gz → 0.3.8.dev20250725054648__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/PKG-INFO +1 -1
  2. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/slope_field.py +108 -0
  3. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/tags.py +3 -1
  4. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/pyproject.toml +1 -1
  5. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/LICENSE +0 -0
  6. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/README.md +0 -0
  7. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/__init__.py +0 -0
  8. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/cli.py +0 -0
  9. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/CTM.py +0 -0
  10. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/__init__.py +0 -0
  11. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/annotations.py +0 -0
  12. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/area.py +0 -0
  13. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/arrow.py +0 -0
  14. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/axes.py +0 -0
  15. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/calculus.py +0 -0
  16. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/circle.py +0 -0
  17. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/clip.py +0 -0
  18. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/compat.py +0 -0
  19. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/coordinates.py +0 -0
  20. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/definition.py +0 -0
  21. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/diagram.py +0 -0
  22. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/diffeqs.py +0 -0
  23. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/graph.py +0 -0
  24. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/grid_axes.py +0 -0
  25. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/group.py +0 -0
  26. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/implicit.py +0 -0
  27. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/label.py +0 -0
  28. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/label_tools.py +0 -0
  29. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/legend.py +0 -0
  30. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/line.py +0 -0
  31. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/math_utilities.py +0 -0
  32. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/network.py +0 -0
  33. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/parametric_curve.py +0 -0
  34. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/parse.py +0 -0
  35. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/path.py +0 -0
  36. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/point.py +0 -0
  37. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/polygon.py +0 -0
  38. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/read.py +0 -0
  39. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/rectangle.py +0 -0
  40. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/repeat.py +0 -0
  41. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/riemann_sum.py +0 -0
  42. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/shape.py +0 -0
  43. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/statistics.py +0 -0
  44. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/tangent_line.py +0 -0
  45. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/user_namespace.py +0 -0
  46. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/utilities.py +0 -0
  47. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/vector.py +0 -0
  48. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/engine.py +0 -0
  49. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/diagcess/diagcess.html +0 -0
  50. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/diagcess/diagcess.js +0 -0
  51. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/de-system.xml +0 -0
  52. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/derivatives.xml +0 -0
  53. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/diffeqs.xml +0 -0
  54. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/implicit.xml +0 -0
  55. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/projection.xml +0 -0
  56. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/riemann.xml +0 -0
  57. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/roots_of_unity.xml +0 -0
  58. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/tangent.xml +0 -0
  59. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/fonts/Braille29.ttf +0 -0
  60. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/js/mj-sre-page.js +0 -0
  61. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/js/package.json +0 -0
  62. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/schema/pf_schema.rnc +0 -0
  63. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/schema/pf_schema.rng +0 -0
  64. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/template/pf_publication.xml +0 -0
  65. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/scripts/__init__.py +0 -0
  66. {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/scripts/install_mj.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefig
3
- Version: 0.3.7.dev20250722203657
3
+ Version: 0.3.8.dev20250725054648
4
4
  Summary: An authoring system for mathematical diagrams
5
5
  Home-page: https://prefigure.org
6
6
  License: GPL-3.0-or-later
@@ -8,6 +8,7 @@ from . import utilities
8
8
  from . import grid_axes
9
9
  from . import group
10
10
  from . import math_utilities as math_util
11
+ from . import calculus
11
12
 
12
13
  log = logging.getLogger('prefigure')
13
14
 
@@ -112,3 +113,110 @@ def slope_field(element, diagram, parent, outline_status):
112
113
 
113
114
  group.group(element, diagram, parent, outline_status)
114
115
 
116
+ # Add a graphical element for slope fields
117
+ def vector_field(element, diagram, parent, outline_status):
118
+ if outline_status == 'finish_outline':
119
+ finish_outline(element, diagram, parent)
120
+ return
121
+
122
+ try:
123
+ f = un.valid_eval(element.get('function'))
124
+ except:
125
+ log.error(f"Error retrieving slope-field function={element.get('function')}")
126
+ return
127
+ bbox = diagram.bbox()
128
+
129
+ # We're going to turn this element into a group and add lines to it
130
+ element.tag = "group"
131
+ if element.get('outline', 'no') == 'yes':
132
+ element.set('outline', 'always')
133
+
134
+ # Now we'll construct a line with all the graphical information
135
+ # and make copies of it
136
+ line_template = ET.Element('line')
137
+
138
+ if diagram.output_format() == 'tactile':
139
+ line_template.set('stroke', 'black')
140
+ else:
141
+ line_template.set('stroke', element.get('stroke', 'blue'))
142
+ line_template.set('thickness', element.get('thickness', '2'))
143
+ if element.get('arrows', 'yes') == 'yes':
144
+ line_template.set('arrows', '1')
145
+
146
+ if element.get('arrow-width', None) is not None:
147
+ line_template.set('arrow-width', element.get('arrow-width'))
148
+ if element.get('arrow-angles', None) is not None:
149
+ line_template.set('arrow-angles', element.get('arrow-angles'))
150
+
151
+ spacings = element.get('spacings', None)
152
+ if spacings is not None:
153
+ try:
154
+ spacings = un.valid_eval(spacings)
155
+ rx, ry = spacings
156
+ except:
157
+ log.error(f"Error parsing slope-field attribute @spacings={element.get('spacings')}")
158
+ return
159
+ else:
160
+ rx = grid_axes.find_gridspacing((bbox[0], bbox[2]))
161
+ ry = grid_axes.find_gridspacing((bbox[1], bbox[3]))
162
+
163
+ # we will go through and generate the vectors first
164
+ # since we'll need to scale them
165
+ field_data = []
166
+ max_scale = 0
167
+ x = rx[0]
168
+ while x <= rx[2]:
169
+ y = ry[0]
170
+ while y <= ry[2]:
171
+ f_value = f(x, y)
172
+ try:
173
+ if len(f_value) != 2:
174
+ log.error("Only two-dimensional vector fields are supported")
175
+ return;
176
+ except:
177
+ pass
178
+ max_scale = max(max_scale,
179
+ abs((f_value[0])/rx[1]),
180
+ abs((f_value[1])/ry[1]))
181
+ field_data.append([np.array([x,y]), f_value])
182
+ y += ry[1]
183
+ x += rx[1]
184
+
185
+ scale_factor = min(1, 0.75 / max_scale)
186
+ if element.get('scale') is not None:
187
+ scale = un.valid_eval(element.get('scale'))
188
+ scale_factor = scale
189
+
190
+ for datum in field_data:
191
+ p, v = datum
192
+ v = scale_factor * v
193
+ # is this long enough to add?
194
+ tail = p
195
+ tip = p+v
196
+ p0 = diagram.transform(tail)
197
+ p1 = diagram.transform(tip)
198
+ if math_util.distance(p0, p1) < 2:
199
+ continue
200
+
201
+ line_el = copy.deepcopy(line_template)
202
+ line_el.set('p1', utilities.pt2long_str(tail, spacer=','))
203
+ line_el.set('p2', utilities.pt2long_str(tip, spacer=','))
204
+ element.append(line_el)
205
+
206
+ group.group(element, diagram, parent, outline_status)
207
+
208
+ def gradient(element, diagram, parent, outline_status):
209
+ try:
210
+ f = un.valid_eval(element.get("function"))
211
+ except:
212
+ log.error("Error retrieving function in gradient element")
213
+ return
214
+
215
+ def grad(a, b):
216
+ f_x_trace = lambda x: f(x, b)
217
+ f_y_trace = lambda y: f(a, y)
218
+ return np.array([calculus.derivative(f_x_trace, a),
219
+ calculus.derivative(f_y_trace, b)])
220
+ un.enter_namespace("__grad", grad)
221
+ element.set("function", "__grad")
222
+ vector_field(element, diagram, parent, outline_status)
@@ -45,6 +45,7 @@ tag_dict = {
45
45
  'definition': definition.definition,
46
46
  'derivative': definition.derivative,
47
47
  'ellipse': circle.ellipse,
48
+ 'gradient': slope_field.gradient,
48
49
  'graph': graph.graph,
49
50
  'grid': grid_axes.grid,
50
51
  'grid-axes': grid_axes.grid_axes,
@@ -72,7 +73,8 @@ tag_dict = {
72
73
  'tangent-line': tangent_line.tangent,
73
74
  'translate': CTM.transform_translate,
74
75
  'triangle': polygon.triangle,
75
- 'vector': vector.vector
76
+ 'vector': vector.vector,
77
+ 'vector-field': slope_field.vector_field
76
78
  }
77
79
 
78
80
  log = logging.getLogger('prefigure')
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "prefig"
3
- version = "0.3.7.dev20250722203657"
3
+ version = "0.3.8.dev20250725054648"
4
4
  description = "An authoring system for mathematical diagrams"
5
5
  readme = "README.md"
6
6
  homepage = "https://prefigure.org"