vexy-lines-utils 1.0.2__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.
@@ -0,0 +1,316 @@
1
+ *_autogen/
2
+ .DS_Store
3
+ __version__.py
4
+ __pycache__/
5
+ _Chutzpah*
6
+ _deps
7
+ _NCrunch_*
8
+ _pkginfo.txt
9
+ _Pvt_Extensions
10
+ _ReSharper*/
11
+ _TeamCity*
12
+ _UpgradeReport_Files/
13
+ !?*.[Cc]ache/
14
+ !.axoCover/settings.json
15
+ !.vscode/extensions.json
16
+ !.vscode/launch.json
17
+ !.vscode/settings.json
18
+ !.vscode/tasks.json
19
+ !**/[Pp]ackages/build/
20
+ !Directory.Build.rsp
21
+ .*crunch*.local.xml
22
+ .axoCover/*
23
+ .builds
24
+ .cr/personal
25
+ .fake/
26
+ .history/
27
+ .ionide/
28
+ .localhistory/
29
+ .mfractor/
30
+ .ntvs_analysis.dat
31
+ .paket/paket.exe
32
+ .sass-cache/
33
+ .vs/
34
+ .vscode
35
+ .vscode/*
36
+ .vshistory/
37
+ [Aa][Rr][Mm]/
38
+ [Aa][Rr][Mm]64/
39
+ [Bb]in/
40
+ [Bb]uild[Ll]og.*
41
+ [Dd]ebug/
42
+ [Dd]ebugPS/
43
+ [Dd]ebugPublic/
44
+ [Ee]xpress/
45
+ [Ll]og/
46
+ [Ll]ogs/
47
+ [Oo]bj/
48
+ [Rr]elease/
49
+ [Rr]eleasePS/
50
+ [Rr]eleases/
51
+ [Tt]est[Rr]esult*/
52
+ [Ww][Ii][Nn]32/
53
+ *_h.h
54
+ *_i.c
55
+ *_p.c
56
+ *_wpftmp.csproj
57
+ *- [Bb]ackup ([0-9]).rdl
58
+ *- [Bb]ackup ([0-9][0-9]).rdl
59
+ *- [Bb]ackup.rdl
60
+ *.[Cc]ache
61
+ *.[Pp]ublish.xml
62
+ *.[Rr]e[Ss]harper
63
+ *.a
64
+ *.app
65
+ *.appx
66
+ *.appxbundle
67
+ *.appxupload
68
+ *.aps
69
+ *.azurePubxml
70
+ *.bim_*.settings
71
+ *.bim.layout
72
+ *.binlog
73
+ *.btm.cs
74
+ *.btp.cs
75
+ *.build.csdef
76
+ *.cab
77
+ *.cachefile
78
+ *.code-workspace
79
+ *.coverage
80
+ *.coveragexml
81
+ *.d
82
+ *.dbmdl
83
+ *.dbproj.schemaview
84
+ *.dll
85
+ *.dotCover
86
+ *.DotSettings.user
87
+ *.dsp
88
+ *.dsw
89
+ *.dylib
90
+ *.e2e
91
+ *.exe
92
+ *.gch
93
+ *.GhostDoc.xml
94
+ *.gpState
95
+ *.ilk
96
+ *.iobj
97
+ *.ipdb
98
+ *.jfm
99
+ *.jmconfig
100
+ *.la
101
+ *.lai
102
+ *.ldf
103
+ *.lib
104
+ *.lo
105
+ *.log
106
+ *.mdf
107
+ *.meta
108
+ *.mm.*
109
+ *.mod
110
+ *.msi
111
+ *.msix
112
+ *.msm
113
+ *.msp
114
+ *.ncb
115
+ *.ndf
116
+ *.nuget.props
117
+ *.nuget.targets
118
+ *.nupkg
119
+ *.nvuser
120
+ *.o
121
+ *.obj
122
+ *.odx.cs
123
+ *.opendb
124
+ *.opensdf
125
+ *.opt
126
+ *.out
127
+ *.pch
128
+ *.pdb
129
+ *.pfx
130
+ *.pgc
131
+ *.pgd
132
+ *.pidb
133
+ *.plg
134
+ *.psess
135
+ *.publishproj
136
+ *.publishsettings
137
+ *.pubxml
138
+ *.pyc
139
+ *.rdl.data
140
+ *.rptproj.bak
141
+ *.rptproj.rsuser
142
+ *.rsp
143
+ *.rsuser
144
+ *.sap
145
+ *.sbr
146
+ *.scc
147
+ *.sdf
148
+ *.sln.docstates
149
+ *.sln.iml
150
+ *.slo
151
+ *.smod
152
+ *.snupkg
153
+ *.so
154
+ *.suo
155
+ *.svclog
156
+ *.tlb
157
+ *.tlh
158
+ *.tli
159
+ *.tlog
160
+ *.tmp
161
+ *.tmp_proj
162
+ *.tss
163
+ *.user
164
+ *.userosscache
165
+ *.userprefs
166
+ *.vbp
167
+ *.vbw
168
+ *.VC.db
169
+ *.VC.VC.opendb
170
+ *.VisualState.xml
171
+ *.vsp
172
+ *.vspscc
173
+ *.vspx
174
+ *.vssscc
175
+ *.xsd.cs
176
+ **/[Pp]ackages/*
177
+ **/*.DesktopClient/GeneratedArtifacts
178
+ **/*.DesktopClient/ModelManifest.xml
179
+ **/*.HTMLClient/GeneratedArtifacts
180
+ **/*.Server/GeneratedArtifacts
181
+ **/*.Server/ModelManifest.xml
182
+ *~
183
+ ~$*
184
+ $tf/
185
+ AppPackages/
186
+ artifacts/
187
+ ASALocalRun/
188
+ AutoTest.Net/
189
+ Backup*/
190
+ BenchmarkDotNet.Artifacts/
191
+ bld/
192
+ BundleArtifacts/
193
+ ClientBin/
194
+ cmake_install.cmake
195
+ CMakeCache.txt
196
+ CMakeFiles
197
+ CMakeLists.txt.user
198
+ CMakeScripts
199
+ CMakeUserPresets.json
200
+ compile_commands.json
201
+ coverage*.info
202
+ coverage*.json
203
+ coverage*.xml
204
+ csx/
205
+ CTestTestfile.cmake
206
+ dlldata.c
207
+ DocProject/buildhelp/
208
+ DocProject/Help/*.hhc
209
+ DocProject/Help/*.hhk
210
+ DocProject/Help/*.hhp
211
+ DocProject/Help/*.HxC
212
+ DocProject/Help/*.HxT
213
+ DocProject/Help/html
214
+ DocProject/Help/Html2
215
+ ecf/
216
+ FakesAssemblies/
217
+ FodyWeavers.xsd
218
+ Generated_Code/
219
+ Generated\ Files/
220
+ healthchecksdb
221
+ install_manifest.txt
222
+ ipch/
223
+ Makefile
224
+ MigrationBackup/
225
+ mono_crash.*
226
+ nCrunchTemp_*
227
+ node_modules/
228
+ nunit-*.xml
229
+ OpenCover/
230
+ orleans.codegen.cs
231
+ Package.StoreAssociation.xml
232
+ paket-files/
233
+ project.fragment.lock.json
234
+ project.lock.json
235
+ publish/
236
+ PublishScripts/
237
+ rcf/
238
+ ScaffoldingReadMe.txt
239
+ ServiceFabricBackup/
240
+ StyleCopReport.xml
241
+ Testing
242
+ TestResult.xml
243
+ UpgradeLog*.htm
244
+ UpgradeLog*.XML
245
+ x64/
246
+ x86/
247
+ # Python
248
+ __pycache__/
249
+ *.py[cod]
250
+ *$py.class
251
+ *.so
252
+ .Python
253
+ build/
254
+ develop-eggs/
255
+ downloads/
256
+ eggs/
257
+ .eggs/
258
+ lib/
259
+ lib64/
260
+ parts/
261
+ sdist/
262
+ var/
263
+ wheels/
264
+ *.egg-info/
265
+ .installed.cfg
266
+ *.egg
267
+ MANIFEST
268
+
269
+ # Distribution / packaging
270
+ !dist/.gitkeep
271
+
272
+ # Unit test / coverage reports
273
+ htmlcov/
274
+ .tox/
275
+ .nox/
276
+ .coverage
277
+ .coverage.*
278
+ .cache
279
+ nosetests.xml
280
+ coverage.xml
281
+ *.cover
282
+ *.py,cover
283
+ .hypothesis/
284
+ .pytest_cache/
285
+ cover/
286
+ .ruff_cache/
287
+
288
+ # Environments
289
+ .env
290
+ .venv
291
+ env/
292
+ venv/
293
+ ENV/
294
+ env.bak/
295
+ venv.bak/
296
+
297
+ # IDE
298
+ .idea/
299
+ .vscode/
300
+ *.swp
301
+ *.swo
302
+ *~
303
+
304
+ # OS
305
+ .DS_Store
306
+ .DS_Store?
307
+ ._*
308
+ .Spotlight-V100
309
+ .Trashes
310
+ ehthumbs.db
311
+ Thumbs.db
312
+
313
+ # Project specific
314
+ __version__.py
315
+ _private
316
+ VERSION.txt
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Fontlab Ltd.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,342 @@
1
+ Metadata-Version: 2.4
2
+ Name: vexy-lines-utils
3
+ Version: 1.0.2
4
+ Summary: Command-line automation for batch exporting Vexy Lines vector art documents to PDF on macOS
5
+ Project-URL: Documentation, https://github.com/vexyart/vexy-lines-utils#readme
6
+ Project-URL: Issues, https://github.com/vexyart/vexy-lines-utils/issues
7
+ Project-URL: Source, https://github.com/vexyart/vexy-lines-utils
8
+ Author-email: "Fontlab Ltd." <opensource@vexy.art>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: automation,batch-processing,cli,creative-tools,macos,pdf-export,vector-art,vexy-lines
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: End Users/Desktop
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Natural Language :: English
18
+ Classifier: Operating System :: MacOS :: MacOS X
19
+ Classifier: Programming Language :: Python
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: Implementation :: CPython
24
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
25
+ Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
26
+ Classifier: Topic :: Utilities
27
+ Requires-Python: >=3.10
28
+ Requires-Dist: fire>=0.6.0
29
+ Requires-Dist: loguru>=0.7.2
30
+ Requires-Dist: mac-pyxa>=0.3.0
31
+ Requires-Dist: pyautogui-ng>=0.0.4
32
+ Requires-Dist: pyperclip>=1.9.0
33
+ Provides-Extra: all
34
+ Provides-Extra: dev
35
+ Requires-Dist: absolufy-imports>=0.3.1; extra == 'dev'
36
+ Requires-Dist: isort>=6.0.1; extra == 'dev'
37
+ Requires-Dist: mypy>=1.15.0; extra == 'dev'
38
+ Requires-Dist: pre-commit>=4.1.0; extra == 'dev'
39
+ Requires-Dist: pyupgrade>=3.19.1; extra == 'dev'
40
+ Requires-Dist: ruff>=0.9.7; extra == 'dev'
41
+ Provides-Extra: docs
42
+ Requires-Dist: myst-parser>=3.0.0; extra == 'docs'
43
+ Requires-Dist: sphinx-autodoc-typehints>=2.0.0; extra == 'docs'
44
+ Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == 'docs'
45
+ Requires-Dist: sphinx>=7.2.6; extra == 'docs'
46
+ Provides-Extra: test
47
+ Requires-Dist: coverage[toml]>=7.6.12; extra == 'test'
48
+ Requires-Dist: pytest-asyncio>=0.25.3; extra == 'test'
49
+ Requires-Dist: pytest-benchmark[histogram]>=5.1.0; extra == 'test'
50
+ Requires-Dist: pytest-cov>=6.0.0; extra == 'test'
51
+ Requires-Dist: pytest-xdist>=3.6.1; extra == 'test'
52
+ Requires-Dist: pytest>=8.3.4; extra == 'test'
53
+ Description-Content-Type: text/markdown
54
+
55
+ ---
56
+ this_file: README.md
57
+ ---
58
+
59
+ # Vexy Lines Utils
60
+
61
+ Export Vexy Lines `.lines` documents to crisp PDFs without pointing and clicking. This package provides a command-line interface for batch automation of [Vexy Lines](https://www.vexy.art) on macOS, wrapping the exact workflow described in the original `vexy-lines2pdf.py` script with a Fire-powered CLI.
62
+
63
+ ## About Vexy Lines
64
+
65
+ Vexy Lines is a creative desktop application that transforms photos, illustrations, AI-generated images and other bitmaps into expressive vector art. It reads the color value of every pixel and intelligently builds vector artwork from it.
66
+
67
+ ### Core Concept
68
+
69
+ Feed it a portrait, get back an engraving. Drop in a landscape, receive flowing wave patterns. The software offers twelve different ways to interpret your images, each method responding to the light and dark areas of your source image differently. Dark areas generate thick strokes, bright areas create thin ones—or reverse it for dramatic effects.
70
+
71
+ ### The 12 Fill Algorithms
72
+
73
+ - **Linear**: Classic copper-plate engravings with parallel straight lines
74
+ - **Wave**: Flowing parallel curves that undulate across your image
75
+ - **Radial**: Lines exploding from a center point like sun rays
76
+ - **Circular**: Concentric rings emanating outward
77
+ - **Spiral**: Continuous winding patterns from center to edge
78
+ - **Halftone**: Newspaper-style dots that scale with brightness
79
+ - **Trace**: Clean edge detection that converts boundaries to paths
80
+ - **Wireframe**: 3D-looking dimensional lattices
81
+ - **Scribble**: Hand-drawn energy with organic randomness
82
+ - **Fractal**: Intricate mathematical recursive patterns
83
+ - **Text**: Paint with letters and typography
84
+ - **Handmade**: Draw your own custom strokes for full control
85
+
86
+ ### Professional Features
87
+
88
+ - **Layer System**: Stack multiple fills, organize with groups, control visibility with masks
89
+ - **Dynamic Color**: Strokes pull actual colors from source images segment by segment
90
+ - **3D Mesh Warping**: Wrap patterns around cylinders, drape over waves, add perspective
91
+ - **Multiple Sources**: Each group can reference different images for complex compositions
92
+ - **Production Export**: SVG, PDF, EPS for infinite scaling; PNG, JPEG for quick sharing
93
+ - **Overlap Control**: Fills can cut through each other creating woven effects
94
+
95
+ Files save as `.lines` projects that preserve every layer, fill, mask, mesh, and parameter—allowing iterative refinement.
96
+
97
+ ## What This Package Provides
98
+
99
+ This automation tool helps power users and studios process large batches of Vexy Lines artwork efficiently:
100
+
101
+ - **Fire CLI**: A `vexy-lines` command implemented with Google's `fire` framework for intuitive command-line usage
102
+ - **Batch Processing**: Recursive discovery and processing of `.lines` files in folders or single-file operations
103
+ - **macOS Automation**: PyXA-powered menu control for **File → Export…** and **File → Close** operations
104
+ - **Smart Dialog Navigation**: `pyautogui-ng` keyboard automation to navigate save dialogs and set proper filenames
105
+ - **Voice Feedback**: Optional macOS text-to-speech announcements for accessibility
106
+ - **Dry-Run Mode**: Preview operations without touching the UI—perfect for CI tests or validating large batches
107
+ - **Robust Error Handling**: Continues processing remaining files even if individual exports fail
108
+
109
+ ## System Requirements
110
+
111
+ - **macOS 10.14+** (required for PyXA automation framework)
112
+ - **Vexy Lines** desktop application installed
113
+ - **Python 3.10+**
114
+ - **4GB RAM** minimum (same as Vexy Lines)
115
+
116
+ ## Installation
117
+
118
+ ### From PyPI (Recommended)
119
+
120
+ ```bash
121
+ pip install vexy-lines-utils
122
+ ```
123
+
124
+ ### From Source
125
+
126
+ ```bash
127
+ git clone https://github.com/vexyart/vexy-lines-utils.git
128
+ cd vexy-lines-utils
129
+ pip install -e .
130
+ ```
131
+
132
+ ### Required Permissions
133
+
134
+ Grant accessibility permissions to your Terminal/IDE for UI automation:
135
+ 1. Open **System Preferences** → **Security & Privacy**
136
+ 2. Navigate to **Privacy** → **Accessibility**
137
+ 3. Add your Terminal app or IDE
138
+ 4. Restart Terminal/IDE after granting permissions
139
+
140
+ ## Usage Examples
141
+
142
+ ### Basic Export Operations
143
+
144
+ ```bash
145
+ # Export a single document
146
+ vexy-lines export ~/Art/portrait.lines
147
+
148
+ # Export everything in a folder (recursive)
149
+ vexy-lines export ~/Projects/posters
150
+
151
+ # Process specific project with verbose output
152
+ vexy-lines export ~/Clients/BigCorp/logos --verbose
153
+
154
+ # Preview what would be processed without running
155
+ vexy-lines export ~/batch --dry_run --verbose
156
+
157
+ # Get voice confirmation when batch completes
158
+ vexy-lines export ~/batch --say_summary
159
+ ```
160
+
161
+ ### Advanced Workflows
162
+
163
+ ```bash
164
+ # Process today's work
165
+ vexy-lines export ~/Desktop/vexy-today/ --verbose --say_summary
166
+
167
+ # Validate large batch before running
168
+ vexy-lines export ~/Archive/2024 --dry_run | grep "processed"
169
+
170
+ # Export with detailed logging for troubleshooting
171
+ vexy-lines export ~/problem-files/ --verbose 2>&1 | tee export.log
172
+ ```
173
+
174
+ ### Command-Line Arguments
175
+
176
+ **Required:**
177
+ - `target`: Path to a `.lines` file or folder containing them (searched recursively)
178
+
179
+ **Optional Flags:**
180
+ - `--verbose`: Show detailed progress including each file being processed
181
+ - `--dry_run`: Preview files that would be processed without UI automation
182
+ - `--say_summary`: Announce completion summary via macOS text-to-speech
183
+
184
+ ### Output Format
185
+
186
+ The command returns a structured dictionary with export statistics:
187
+
188
+ ```json
189
+ {
190
+ "processed": 10,
191
+ "success": 9,
192
+ "failed": 1,
193
+ "failures": [
194
+ ["path/to/broken.lines", "Failed to open file"]
195
+ ],
196
+ "dry_run": false
197
+ }
198
+ ```
199
+
200
+ ## How It Works
201
+
202
+ 1. **Discovery** – `find_lines_files` resolves the target path, supports single files, and sorts recursive directory walks for deterministic runs.
203
+ 2. **App bridge** – `PyXABridge` launches/activates Vexy Lines via macOS scripting bridges and exposes a minimal interface (`window_titles`, `click_menu_item`).
204
+ 3. **Window watching** – `WindowWatcher` polls the live window list so we wait for the expected document title, the Export dialog, and the Save dialog instead of relying on coarse `sleep()` delays.
205
+ 4. **Keyboard automation** – `UIActions` wraps `pyautogui-ng` + `pyperclip` to press Command-Shift-G, paste the folder path, select the filename, and confirm overwrites.
206
+ 5. **Verification** – the exporter waits for the Save window to close, then checks that the new PDF exists and is non-empty before moving on.
207
+
208
+ If any step fails (missing dialog, file cannot open, permissions issue, etc.), the run continues with the next `.lines` document and reports the failure reason in the final summary.
209
+
210
+ ## Python API
211
+
212
+ For integration into larger workflows:
213
+
214
+ ```python
215
+ from pathlib import Path
216
+ from vexy_lines_utils import VexyLinesExporter, AutomationConfig
217
+
218
+ # Create custom configuration
219
+ config = AutomationConfig(
220
+ poll_interval=0.2, # Window check frequency (seconds)
221
+ wait_for_app=20.0, # App launch timeout
222
+ wait_for_file=20.0, # File open timeout
223
+ wait_for_dialog=25.0, # Dialog appearance timeout
224
+ post_action_delay=0.4 # Pause after UI actions
225
+ )
226
+
227
+ # Initialize exporter
228
+ exporter = VexyLinesExporter(config=config)
229
+
230
+ # Process files
231
+ stats = exporter.export(Path("~/Documents/vexy-projects"))
232
+
233
+ # Check results
234
+ print(f"Success rate: {stats.success}/{stats.processed}")
235
+ for path, reason in stats.failures:
236
+ print(f"Failed: {path} - {reason}")
237
+ ```
238
+
239
+ ## Development
240
+
241
+ ### Project Structure
242
+
243
+ ```
244
+ vexy-lines-utils/
245
+ ├── src/vexy_lines_utils/
246
+ │ ├── __init__.py # Package exports
247
+ │ ├── vexy_lines_utils.py # Main implementation
248
+ │ └── py.typed # PEP 561 type marker
249
+ ├── tests/
250
+ │ ├── test_package.py # Unit tests
251
+ │ └── fixtures/ # Test data
252
+ ├── pyproject.toml # Package configuration
253
+ └── README.md # This file
254
+ ```
255
+
256
+ ### Development Setup
257
+
258
+ ```bash
259
+ # Clone repository
260
+ git clone https://github.com/vexyart/vexy-lines-utils.git
261
+ cd vexy-lines-utils
262
+
263
+ # Create virtual environment
264
+ python -m venv .venv
265
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
266
+
267
+ # Install with development dependencies
268
+ pip install -e ".[dev,test]"
269
+
270
+ # Run tests
271
+ uvx hatch test
272
+
273
+ # Format code
274
+ uvx hatch fmt
275
+
276
+ # Type checking
277
+ uvx hatch run lint:typing
278
+ ```
279
+
280
+ ### Testing Philosophy
281
+
282
+ Tests focus on the automation logic rather than UI interaction:
283
+ - Discovery logic for finding `.lines` files
284
+ - Stats tracking and error reporting
285
+ - Window watching state machines
286
+ - Dry-run mode for CI environments
287
+
288
+ ### Contributing
289
+
290
+ When adding features:
291
+ 1. Keep scope focused on `.lines` → PDF export automation
292
+ 2. Add unit tests for new functionality
293
+ 3. Update this README with new options
294
+ 4. Follow existing code style (Ruff-formatted)
295
+
296
+ ## Troubleshooting
297
+
298
+ ### Common Issues
299
+
300
+ **"PyXA is not available"**
301
+ - Ensure you're on macOS
302
+ - Install with: `pip install mac-pyxa`
303
+ - Check Python architecture matches system
304
+
305
+ **"Failed to launch Vexy Lines"**
306
+ - Verify Vexy Lines.app is in /Applications
307
+ - Try launching manually first
308
+ - Check for trial/license expiration
309
+
310
+ **Export dialogs timing out**
311
+ - Increase timeout values in AutomationConfig
312
+ - Check if Vexy Lines has modal dialogs open
313
+ - Verify no system dialogs blocking
314
+
315
+ **"Accessibility permissions required"**
316
+ - Grant Terminal.app accessibility permissions
317
+ - If using VS Code/PyCharm, grant IDE permissions too
318
+ - Log out and back in after permission changes
319
+
320
+ **PDFs not appearing**
321
+ - Check source `.lines` files aren't corrupted
322
+ - Verify write permissions in target directory
323
+ - Look for hidden error dialogs in Vexy Lines
324
+
325
+ ## About
326
+
327
+ **vexy-lines-utils** is developed by [FontLab Ltd.](https://www.fontlab.com), creators of Vexy Lines and industry-standard font editing software.
328
+
329
+ ### Links
330
+
331
+ - [Vexy Lines Homepage](https://www.vexy.art)
332
+ - [Vexy Lines Documentation](https://help.vexy.art)
333
+ - [FontLab Support](https://support.vexy.art)
334
+ - [Package Issues](https://github.com/vexyart/vexy-lines-utils/issues)
335
+
336
+ ### License
337
+
338
+ MIT License - see [LICENSE](LICENSE) file for details.
339
+
340
+ ### Credits
341
+
342
+ Based on the original `vexy-lines2pdf.py` automation script. The package structure follows modern Python packaging standards with Fire CLI, comprehensive testing, and robust error handling.