A fast, gap-aware SolidWorks part number tracker for Windows engineering teams.
Parts Tracker is a PyQt6 desktop application that brings order to SolidWorks part file management across a shared network job folder structure. It integrates with the Everything file indexer for instant file discovery, parses Production Release Form (PRF) Excel files for job metadata, and maintains a local SQLite database so engineers always know which part numbers are in use, which are orphaned, and which gaps are available for reuse.
- Features
- Prerequisites
- Quick Start
- Configuration
- Tabs Reference
- Part Numbering
- Folder Structure
- Data Storage
- Tech Stack
- Contributing
- License
- Scans SolidWorks part (
.sldprt) and assembly (.sldasm) files across all job folders on the network drive - Parses PRF Excel files for catalog number, enclosure size, and other job metadata
- Per-user prefix filtering so engineers only see their own parts by default
- Gap-aware next-number suggestions — reuses the lowest available number before issuing a new one
- ENGINEERING-wide gap verification — gap candidates are checked against every
.sldprt/.sldasmunderZ:\FOXFAB_DATA\ENGINEERING, not just2 JOBS. Numbers assigned inDESIGNERS\...,MODEL LIBRARY\,0 PRODUCTS\, or another engineer's scratch area (e.g.For Vikram\Demo Unit\CAD\) correctly count as taken - Click-time collision check before a Copy — looks up the suggested number across the same broad scope; if it's already on disk, the conflict path is shown and the suggestion auto-advances
- Duplicate Parts detection — flags part numbers that appear at more than one path under your prefix (archive folders excluded). Surfaced in the Next Numbers tab; double-click a path to open it in Explorer
- Background gap scanning on startup with no UI freeze
- Live filesystem watcher that refreshes part numbers automatically when files change on disk
- Orphan detection: identifies part files that exist on disk but are not tracked in any job folder
- Archive classification: parts inside any
archivefolder are separated from active parts - Full job history with scanned date and part count
- Searchable history log of all part additions over time
- Crash log at
%APPDATA%\PartsTracker\crash.log— captures uncaught Python exceptions, Qt-level fatal/critical messages, and wrapped slot errors so intermittent UI crashes leave a usable trace instead of silently aborting the app - Catppuccin Mocha dark theme throughout
| Requirement | Version / Notes |
|---|---|
| Python | 3.10 or later |
| Everything | Must have the HTTP Server enabled on port 8080 |
| Network drive | Job root must be mapped to Z:\ |
| Windows | Windows 10 or later (Windows-only application) |
-
Clone or download the repository.
git clone <repository-url> cd parts-tracker
-
Create and activate a virtual environment.
python -m venv venv venv\Scripts\activate
-
Install dependencies.
pip install -r requirements.txt
-
Enable Everything's HTTP Server.
In Everything: Tools > Options > HTTP Server, check Enable HTTP Server, set the port to
8080, and click OK. -
Map the network drive.
Ensure the engineering job root is accessible at:
Z:\FOXFAB_DATA\ENGINEERING\2 JOBS -
Launch the application.
python parts_tracker.py
Alternatively, double-click
run.bat.
Each engineer is assigned a numeric prefix that maps to a range of part numbers. The application filters all views — My Parts, Next Numbers, Orphans, Archive — to only show parts whose numbers fall within that prefix range.
| Prefix | Range covered |
|---|---|
9 |
90000 – 99999 |
51 |
51000 – 51999 |
The prefix is set in the application settings. Any numeric prefix is supported; the range is derived automatically from the prefix length (a one-digit prefix covers a 10,000-number block, a two-digit prefix covers a 1,000-number block, and so on).
Some categories use a different prefix from the user's default. For example, an engineer whose default prefix is 9 might use prefix 51 exclusively for category 240 (Copper) parts.
Per-category overrides can be configured in the application settings. When an override is active, the Next Numbers card and gap analysis for that category use the override prefix instead of the global one.
Displays all part files whose numbers match the active user's prefix (and any per-category overrides). The list can be filtered by category code and by file type (.sldprt or .sldasm). This is the default view on startup.
Displays every part file across all users and job folders currently in the database. A search bar filters results by part number or file path in real time. Useful for checking whether a number is already in use before assigning it.
Lists every scanned job folder with metadata extracted from the associated PRF file:
- Job number and name
- Catalog number
- Enclosure size
- Total part count
- Date last scanned
Jobs whose folder path contains an archive indicator are highlighted in amber to distinguish them from active work.
A dashboard of cards — one per category — showing the next available part number for the active user's prefix. The system is gap-aware:
- If one or more numbers have been deleted or skipped, the lowest missing number is shown first with a
GAPbadge. - Clicking the copy button copies that number to the clipboard and removes it from the gap list, automatically advancing to the next gap or to
latest + 1when no gaps remain. - Click-time collision check — before a Copy succeeds, the application asks Everything whether the suggested number is on disk anywhere under
Z:\FOXFAB_DATA\ENGINEERING. If a conflicting file is found (e.g. another engineer reserved it in a scratch folder since the last gap scan), the path is shown and the suggestion auto-advances.
Below the cards, two stacked panels:
Lists every missing number per category. Each candidate gap is verified against the broader ENGINEERING scope — a number that exists in DESIGNERS\..., MODEL LIBRARY\, 0 PRODUCTS\, For Vikram\Demo Unit\CAD\, or any other location Everything indexes under Z:\FOXFAB_DATA\ENGINEERING\ is not reported as a gap. Latest stays anchored to Z:\...\2 JOBS\ so a stray number elsewhere doesn't yank it. Gap scanning runs in a background thread at startup so the UI remains responsive.
Flags part numbers that appear at more than one distinct path on disk under your prefix range, archive folders excluded. The list is grouped by part number; expanding a row shows each duplicate file's full path and job association. Double-click a path to open it in Explorer.
The duplicate scan filters at read time against Path.exists(), so resolved duplicates (one of the two copies deleted or moved) drop out of the report without needing a full DB rescan.
A live filesystem watcher monitors the job root and refreshes the cards automatically when files are added or removed on disk.
Lists FoxFab-pattern part files in \201 CAD\ folders under 2 JOBS\ that exist on disk but aren't tracked in the local SQLite DB. Typically a part that was created or renamed since the last scan, or a file in an un-scanned job folder. Files are discovered via the Everything HTTP API.
Three filters are applied to keep the list signal-rich:
- Filename must start with
<CAT>-<NNNNN>— drops SolidWorks lock files (~$*.sldprt) and vendor / hardware-library parts (SS Cam Adaptor_200-9598.00-00000.SLDPRT) where the FoxFab-shaped string is just an embedded substring. - Path must contain a
\201 CAD\segment — drops vendor subfolders (\Dirak\,\OEM\, etc.) nested inside a job tree. \Archive\,\Backup\, and\old\segments excluded — these directories aren't part of the active scan set.
Rev-suffix files (200-90123-rA.sldprt) and numbered-copy files (200-90123 (1).sldprt) are recognised and included — they're real parts even though they don't fit the strict <CAT>-<NNNNN>.sldprt form. The list shows the full filename stem so the rev / combined-part suffix is visible.
Reviewing this tab regularly helps keep the database accurate.
Lists FoxFab-pattern part files in \201 CAD\Archive\ folders under 2 JOBS\ that aren't tracked in any active scanned job folder. Same filename + folder scope filters as the Orphans tab, but with \Archive\ required in the path instead of excluded. \Backup\ and \old\ segments still drop the entry.
This tab provides a convenient audit trail of retired parts without removing them from the filesystem.
A chronological log of every part addition recorded by the application, searchable by part number. Each entry shows the part number, category, file type, job association, and the date it was first tracked. Useful for answering "when was this part number first used?" without leaving the application.
CAT-NNNNN.ext
CAT— three-digit category codeNNNNN— five-digit sequential number within the user's prefix rangeext—sldprtorsldasm
Example: 200-90123.sldprt
| Code | Name |
|---|---|
| 003 | Top Level Assembly |
| 100 | Subassembly |
| 200 | Metal |
| 240 | Copper |
| 245 | Flexibar |
| 250 | Galvanized |
| 295 | Insulation Barrier |
The five-digit number following the category code is drawn from a block assigned to each engineer. The prefix is the leading digit or digits of that number:
- Prefix
9owns numbers90000through99999 - Prefix
51owns numbers51000through51999
All views in the application respect this prefix so engineers do not see or accidentally reuse each other's numbers. Per-category overrides allow a single engineer to draw from a different block for a specific category (see Configuration).
The application expects the following directory layout under the job root:
Z:\FOXFAB_DATA\ENGINEERING\2 JOBS\
J15302 Garner Road\ <- job folder (job number + name)
200 Mech\
J15302-01\
201 CAD\ <- parts folder (scanned for .sldprt / .sldasm)
003-90123.sldasm
200-90124.sldprt
archive\ <- archived parts live here
200-90100.sldprt
PRF - J15302-01.xlsx <- Production Release Form (searched upward from parts folder)
Key rules:
- The scanner searches upward from the
201 CADfolder to locate the PRF Excel file. - Any file whose path contains a folder named
archive(case-insensitive) is classified as archived, regardless of nesting depth. - Parts outside a recognised job folder structure are classified as orphans.
| Item | Location |
|---|---|
| SQLite database | %APPDATA%\PartsTracker\parts.db |
| Application settings | Stored within the database |
| Crash log | %APPDATA%\PartsTracker\crash.log |
The database is created automatically on first launch. No manual setup is required. The %APPDATA% path resolves to C:\Users\<username>\AppData\Roaming\PartsTracker\ on a standard Windows installation.
The crash log is created on first error and appended to thereafter. It captures uncaught Python exceptions, Qt-level fatal / critical / warning messages (which previously caused silent abort() on certain Qt asserts), wrapped slot exceptions in the Next Numbers tab, and trace breadcrumbs (startup banner, tab change events, gap scan markers). Useful when reporting an intermittent crash — paste the most recent traceback from the file rather than trying to reproduce on the spot.
| Package | Version | Purpose |
|---|---|---|
| Python | 3.10+ | Runtime |
| PyQt6 | >= 6.4.0 | Desktop UI framework |
| openpyxl | >= 3.1.0 | Reading PRF Excel files |
| requests | >= 2.28.0 | Everything HTTP API queries |
| sqlite3 | stdlib | Local part and job database |
Contributions are welcome. To get started:
- Fork the repository and create a feature branch from
main. - Follow the existing code style — clear variable names, minimal inline comments where the code is self-explanatory, and docstrings on public functions.
- Test your changes against a real or mock Everything instance before opening a pull request.
- Open a pull request with a clear description of what was changed and why.
Bug reports and feature requests are best submitted as GitHub issues with enough detail to reproduce the problem or understand the use case.
This project is licensed under the MIT License.