# NirtsCAD User Manual

**Version 2.0** | **WebGL-based 2D/3D CAD Application**

---

## Table of Contents

1. [Overview](#overview)
2. [Getting Started](#getting-started)
3. [User Interface](#user-interface)
4. [Drawing Commands](#drawing-commands)
5. [Editing Commands](#editing-commands)
6. [Dimension Commands](#dimension-commands)
7. [View Commands](#view-commands)
8. [File Operations](#file-operations)
9. [Settings & Configuration](#settings--configuration)
10. [Advanced Features](#advanced-features)
11. [Keyboard Shortcuts](#keyboard-shortcuts)
12. [Tips & Best Practices](#tips--best-practices)

---

## Overview

**NirtsCAD** is a browser-based 2D/3D Computer-Aided Design (CAD) application built entirely with WebGL. It provides a command-line driven interface similar to AutoCAD, supporting:

- **Vector drawing** (lines, arcs, circles, polylines, text, hatches)
- **Dimensioning** (linear, aligned, angular, leader dimensions)
- **Editing operations** (move, copy, rotate, scale, mirror, trim, extend, offset, fillet, chamfer, break, stretch, array)
- **DXF Import/Export** (AutoCAD interchange format)
- **3D Visualization** (orthographic and perspective 3D views, thickness extrusion, shaded mode)
- **Layer management**
- **Object snap (OSNAP)** and **Ortho mode**
- **Color selection** (AutoCAD Color Index or RGB)
- **Undo/Redo** with unlimited history

### Key Features

- **No installation required** — runs directly in modern web browsers
- **Command-line interface** — familiar AutoCAD-style command syntax
- **Real-time rendering** — hardware-accelerated WebGL graphics
- **Cross-platform** — works on Windows, macOS, Linux
- **Offline capable** — after initial load, works without internet connection

---

## Getting Started

### System Requirements

- **Browser**: Chrome 90+, Firefox 88+, Edge 90+, Safari 14+ (with WebGL 1.0 support)
- **Display**: Minimum 1024×768 resolution
- **Input**: Mouse or trackpad (recommended: mouse with scroll wheel)

### Opening the Application

1. Open `index.html` in a modern web browser
2. The application loads with an empty drawing canvas and command prompt at the bottom
3. Start drawing by typing commands or clicking menu items
4. **Help → User Manual…** opens a searchable HTML copy of this guide (loads `USER_MANUAL.md` when the site is served from a folder that includes that file)
5. **Help → CADMAX Manual…** opens the structural-engineering guide (`CADMAX_MANUAL.md`) for analysis, design, and detailing commands

### First Steps

1. **Draw a line**: Type `LINE` (or `L`) and press Enter, then click two points on the canvas
2. **Zoom extents**: Type `ZOOM` → `E` (or press Ctrl+E) to fit all entities
3. **Save your work**: File menu → Save (saves as `.json` project file)

---

## User Interface

### Layout

```
┌──────────────────────────────────────────────────────────────────────────┐
│ [File] [Draw] [Dimension] [Edit] [3D] [View] [Settings]                  │  ← Menu bar (fixed top)
├──────────────────────────────────────────────────────────────────────────┤
│                                                                          │
│                        Drawing canvas (WebGL)                            │
│                                                                          │
├──────────────────────────────────────────────────────────────────────────┤
│ Coordinates | Color (ACI + picker) | Zoom % | Units | Layer [Manage…]   │  ← Status / quick controls
├──────────────────────────────────────────────────────────────────────────┤
│ Command history…                                                         │
│ Command: _____________________________________________________________   │  ← Command line
└──────────────────────────────────────────────────────────────────────────┘
```

Modals (opened from menus or commands) include **Layer Management**, **Osnap Settings**, **Hatch pattern list**, **Linetype list**, and **Block list**.

### Command Input

- **Location**: Bottom of screen
- **Usage**: Type commands and press **Enter** or **Space**
- **Examples**: `LINE`, `CIRCLE`, `TRIM`, `ZOOM E`, `PRINTPDF`
- **Tips**: 
  - Commands are case-insensitive
  - Most commands have short aliases (e.g., `L` for `LINE`, `C` for `CIRCLE`)
  - Press **Esc** to cancel current command

### Canvas Interaction

- **Left click**: Specify points while a draw/edit command is active; in **idle** mode (no active command), click an entity to select it for inspection
- **Right click**: While drawing (e.g. polyline), often **finishes** the command; when an entity is selected in idle mode, opens a **read-only properties** popup (type, layer, color, thickness, basic geometry)
- **Scroll wheel**: Zoom in/out
- **Middle button drag** (or **Shift+left drag**): Pan view
- **Mouse move**: Rubber-band previews and live coordinate readout

### Idle selection

When the command prompt shows `Command:` and no tool is running, a **left click** on geometry selects the nearest entity. The coordinate field shows a short hint including **right-click: properties**. **Esc** clears the selection and closes the properties popup.

---

## Drawing Commands

### LINE (Aliases: `L`)

Draws a straight line between two points.

**Usage**:
1. Type `LINE` or `L`
2. Click first point (or type coordinates: `x,y` or `x,y,z`)
3. Click second point
4. Command ends automatically

**Example**:
```
Command: L
Specify start point: [click point 1]
Specify end point: [click point 2]
```

**Tips**:
- Hold **F8** for Ortho mode (constrains to horizontal/vertical)
- Use Object Snap to connect to existing endpoints

---

### POLYLINE (Aliases: `PL`, `PLINE`)

Draws connected line and arc segments with optional width.

**Usage**:
1. Type `PLINE` or `PL`
2. Click start point
3. Click subsequent points
4. **Options during drawing**:
   - **A** = Switch to Arc mode
   - **L** = Switch to Line mode
   - **Q** = Quadratic curve mode
   - **C** = Close (connects back to start point)
   - **U** = Undo last segment
   - **W** = Set width for next segment
5. Press **Enter** or **Right-Click** to finish

**Example**:
```
Command: PL
Specify start point: [click point 1]
Specify next point (A=arc, L=line, C=close, U=undo, W=width): [click point 2]
Specify next point: [click point 3]
Specify next point: [Enter to finish]
```

**Width Settings**:
```
Specify next point: W
Starting width <0.000>: 0.5
Ending width <0.500>: 1.0
Specify next point: [click to draw tapered segment]
```

---

### CIRCLE (Aliases: `C`)

Draws a circle by center point and radius.

**Usage**:
1. Type `CIRCLE` or `C`
2. Click center point
3. Click point on circumference (or type radius: `R 5.5`)

**Example**:
```
Command: C
Specify center point: [click center]
Specify point on circle (or type radius): [click perimeter point]
```

**Radius Input**:
```
Specify point on circle: R 10
```

---

### RECTANG (Aliases: `RECTANGLE`, `REC`)

Draws a **closed rectangular polyline** from two opposite corners (like a two-point window).

**Usage**:
1. Type `RECTANG`, `RECTANGLE`, or `REC` (or **Draw → Rectangle**)
2. Click first corner
3. Click opposite corner

The result is a rectangle on the current layer, using the current color, linetype, and thickness.

---

### POLYGON (Aliases: `PG`)

Draws a **closed regular polygon** (equal sides).

**Usage**:
1. Type `POLYGON` or `PG` (or **Draw → Polygon**)
2. At the command line, enter **number of sides** (≥ 3)
3. Choose mode (**I** inscribed, **C** circumscribed, or **E** edge — prompts list shortcuts)
4. Follow prompts for **center + radius** or **two edge points**, depending on mode

Polygon placement uses the same coordinate and OSNAP behavior as other draw commands.

---

### POINT (Aliases: `PO`)

Places a **small construction point** at a picked location (useful for references and snaps).

**Usage**:
1. Type `POINT` or `PO` (or **Draw → Point**)
2. Click to place; repeat as needed
3. Press **Esc** to exit when finished

---

### ARC Commands

NirtsCAD supports 5 arc creation methods:

#### 1. **ARC / 3PARC** (3 Points)
Draws arc through 3 points.
```
Command: ARC
Specify start point: [point 1]
Specify second point: [point 2]
Specify end point: [point 3]
```

#### 2. **CSEARC** (Center-Start-End)
Arc by center, start point, end point.
```
Command: CSEARC
Specify center point: [center]
Specify start point: [start]
Specify end point: [end]
```

#### 3. **CSARC** (Center-Start-Angle)
Arc by center, start point, included angle.
```
Command: CSARC
Specify center point: [center]
Specify start point: [start]
Specify included angle (degrees): 90
```

#### 4. **SERARC** (Start-End-Radius)
Arc by start, end, radius.
```
Command: SERARC
Specify start point: [start]
Specify end point: [end]
Specify radius: 5
```

#### 5. **SEAARC** (Start-End-Angle)
Arc by start, end, included angle.
```
Command: SEAARC
Specify start point: [start]
Specify end point: [end]
Specify included angle (degrees): 45
```

---

### TEXT (Aliases: `T`)

Places single-line text at a specified location.

**Usage**:
1. Type `TEXT` or `T`
2. Click insertion point
3. Enter text height (or press Enter for default)
4. Enter rotation angle in degrees (or press Enter for 0°)
5. Type text content
6. Press **Enter** to place text

**Example**:
```
Command: T
Specify insertion point: [click location]
Specify height <2.500>: 5
Specify rotation angle (deg) <0.000>: 0
Enter text: Hello World
```

---

### HATCH (Aliases: `H`)

Fills a closed boundary with a pattern.

**Usage**:
1. Type `HATCH` or `H`
2. **Choose pattern mode**:
   - **U** = User-defined (specify angle and spacing)
   - **D** = Predefined pattern (from library)
3. **For user-defined**:
   - Enter angle (degrees)
   - Enter spacing
4. **For predefined**:
   - Type `HATCHLIST` to browse patterns
   - Or directly enter pattern name
5. Set scale
6. Click points to define boundary (or type `S` to select entities)
7. Preview hatch, press **Enter** to confirm

**Example (User-defined)**:
```
Command: H
HATCH mode: [U] user-defined (angle+spacing) or [D] defined/library pattern: U
Specify angle (degrees) <45.000>: 0
Specify spacing <1.000>: 2
Specify scale <1.000>: 1
Pick boundary points (or S=select entity): [click inside closed area]
[Preview shown]
Press Enter to confirm or pick more boundary points: [Enter]
```

**Example (Predefined)**:
```
Command: H
HATCH mode: U or D: D
Type pattern name or HATCHLIST: HATCHLIST
[Modal opens, select pattern like "ANSI31"]
Specify scale <1.000>: 1.5
Pick boundary points: [click inside area]
```

**Supported Patterns**: ANSI31, ANSI32, ANSI33, ANSI34, ANSI35, ANSI36, ANSI37, ANSI38, AR-B816, AR-CONC, BRASS, BRICK, BRSTONE, CLAY, CORK, CROSS, DASH, DOTS, EARTH, ESCHER, FLEX, GRASS, GRATE, HONEY, HOUND, LINE, MUDST, NET, NET3, PLAST, PLASTI, SACNCR, SQUARE, STARS, STEEL, SWAMP, TRANS, TRIANG, ZIGZAG

---

### BLOCK

Creates a **named block definition** from selected geometry (local symbol library).

**Usage**:
1. Type `BLOCK` (or **Draw → Block**)
2. Enter a **block name** when prompted
3. **Select objects** (click / window, same style as editing commands); press **Enter** when the selection is complete
4. Pick a **base point** (insertion origin for future `INSERT`)
5. Choose whether to **retain** the original entities or replace them with a block reference (**Y** / **N**)

Use **Draw → Block List** or the `BLOCKLIST` command to review defined names.

---

### INSERT

Places a **reference** to a block at a given scale and rotation.

**Usage**:
1. Type `INSERT` (or **Draw → Insert**)
2. Enter the **block name** (or pick from the list shown in the prompt; `BLOCKLIST` opens the chooser)
3. Pick **insertion point**, then **X / Y / Z scale** and **rotation** as prompted
4. If the block defines attributes, enter values when asked

---

### BLOCKLIST

Opens the **Block List** modal to pick a block name (also useful to confirm spelling before `INSERT`).

---

### 3DFACE (Aliases: `3DF`, `3F`)

**3D menu → 3DFace** or command `3DFACE`. Builds a **3D triangular or quadrilateral face** from 3 or 4 corner picks in world space. After the third point you can press **Enter** to finish a triangle, or pick a fourth corner for a quad.

---

### 3DBOX

**3D menu → 3DBox** or command `3DBOX`. Creates a **box** from a **base corner** and an **opposite corner**; the command line explains polar-style input (e.g. `@distance<angle,dy,dz`) where needed.

---

### SPHERE (Aliases: `SPH`)

**3D menu → Sphere** or command `SPHERE` / `SPH`. Pick **center**, then **radius** (by point or typed value).

---

### 3DMESH

**3D menu → 3DMesh** or command `3DMESH`. Builds a **mesh** in one of several modes (**Rectangular**, **Circular**, or **Data** from a grid file). Follow the staged prompts in the command history; **Esc** cancels the workflow.

---

## Editing Commands

### Selection Methods

For all editing commands, you'll be prompted to select entities:
- **Click on entity** to select it (entity highlights in yellow)
- **Click again** on selected entity to deselect
- **Window selection**: Click-drag to create selection rectangle
  - **Left-to-right** (blue): Entities fully inside window
  - **Right-to-left** (green): Entities crossing or inside window
- Press **Enter** or **Right-Click** when selection is complete

---

### ERASE (Aliases: `E`)

Deletes selected entities.

**Usage**:
1. Type `ERASE` or `E`
2. Select entities to delete
3. Press **Enter** to confirm deletion

---

### MOVE (Aliases: `M`)

Moves selected entities from base point to destination.

**Usage**:
1. Type `MOVE` or `M`
2. Select entities
3. Click base point (reference point)
4. Click destination point (or type displacement: `@10,5` for relative offset)

**Example**:
```
Command: M
Select objects: [select entities, press Enter]
Specify base point: [click reference point]
Specify second point (displacement): [click destination]
```

---

### COPY (Aliases: `CO`, `CP`)

Copies selected entities to a new location.

**Usage**:
1. Type `COPY` or `CO`
2. Select entities
3. Click base point
4. Click destination point (can place multiple copies, press Enter when done)

---

### ROTATE (Aliases: `RO`)

Rotates selected entities around a base point.

**Usage**:
1. Type `ROTATE` or `RO`
2. Select entities
3. Click base point (center of rotation)
4. **Two methods**:
   - **Type angle**: Enter rotation angle in degrees (e.g., `90` for 90° counter-clockwise)
   - **Two points**: Click second point to define angle

**Example**:
```
Command: RO
Select objects: [select, press Enter]
Specify base point: [click center]
Specify rotation angle (or second point): 45
```

---

### SCALE (Aliases: `SC`)

Scales selected entities relative to a base point.

**Usage**:
1. Type `SCALE` or `SC`
2. Select entities
3. Click base point (stays fixed during scaling)
4. **Two methods**:
   - **Type factor**: Enter scale factor (e.g., `2` = double size, `0.5` = half size)
   - **Reference**: Click two points to define original length, then click target length

**Example**:
```
Command: SC
Select objects: [select, press Enter]
Specify base point: [click]
Specify scale factor or [R]eference: 1.5
```

---

### MIRROR (Aliases: `MI`)

Mirrors selected entities across a line.

**Usage**:
1. Type `MIRROR` or `MI`
2. Select entities
3. Click first point of mirror line
4. Click second point of mirror line
5. **Erase source?**: Type `Y` to delete originals, `N` to keep both

**Example**:
```
Command: MI
Select objects: [select, press Enter]
Specify first point of mirror line: [point 1]
Specify second point of mirror line: [point 2]
Erase source objects? [Y/N]: N
```

---

### OFFSET (Aliases: `O`)

Creates parallel copy of line, arc, circle, or polyline at specified distance.

**Usage**:
1. Type `OFFSET` or `O`
2. Enter offset distance (or click two points to measure)
3. Select entity to offset
4. Click on side to offset towards
5. Repeat for more offsets, or press **Esc** to exit

**Example**:
```
Command: O
Specify offset distance: 5
Select entity to offset: [click line]
Specify point on side to offset: [click left or right of line]
Select entity to offset: [select another or Esc]
```

---

### TRIM (Aliases: `TR`)

Trims entities to cutting edges.

**Usage**:
1. Type `TRIM` or `TR`
2. Select cutting edges (entities that define trim boundaries)
3. Press **Enter** to confirm cutting edges
4. Click on portions of entities to trim away
5. Press **Enter** or **Esc** to finish

**Example**:
```
Command: TR
Select cutting edges (Enter when done): [select lines, press Enter]
Select entity to trim (or shift-select to extend): [click portion to remove]
```

**Tips**:
- Hold **Shift** while clicking to **Extend** instead of trim
- Works on lines, arcs, circles, polylines

---

### EXTEND (Aliases: `EX`)

Extends entities to boundary edges.

**Usage**:
1. Type `EXTEND` or `EX`
2. Select boundary edges
3. Press **Enter**
4. Click on entities to extend (click near the end to extend)
5. Press **Enter** or **Esc** to finish

---

### FILLET (Aliases: `F`)

Rounds corners by creating tangent arc between two lines, arcs, or circles.

**Usage**:
1. Type `FILLET` or `F`
2. **Set radius**: Type `R` then enter radius value
3. Select first entity
4. Select second entity
5. Fillet is created automatically

**Example**:
```
Command: F
Specify fillet radius <0.000>: R
Enter radius: 2.5
Select first line or arc: [click entity 1]
Select second line or arc: [click entity 2]
```

**Tips**:
- Radius `0` creates sharp corner (extends/trims to intersection)
- Works with lines, arcs, circles

---

### CHAMFER (Aliases: `CH`)

Bevels corners with angled line.

**Usage**:
1. Type `CHAMFER` or `CH`
2. **Set distances**:
   - Type `D1` then enter first distance
   - Type `D2` then enter second distance (or Enter to use same as D1)
3. Select first entity
4. Select second entity

**Example**:
```
Command: CH
Specify first chamfer distance <0.000>: D1
Enter distance: 3
Specify second chamfer distance <3.000>: D2
Enter distance: 2
Select first line: [click line 1]
Select second line: [click line 2]
```

---

### BREAK (Aliases: `BR`)

Breaks a single entity into two pieces at specified points.

**Usage**:
1. Type `BREAK` or `BR`
2. Select entity to break
3. Click first break point on the entity
4. Click second break point
5. The segment between points is removed

---

### STRETCH (Aliases: `S`)

Moves selected vertices while keeping connected segments attached.

**Usage**:
1. Type `STRETCH` or `S`
2. Select entities (use crossing window for best results)
3. Press **Enter**
4. Click base point
5. Click destination point (or type displacement)

**Tips**:
- Only vertices inside/crossing selection window are moved
- Connected geometry outside window stays anchored

---

### ARRAY (Aliases: `ARR`)

Creates rectangular or polar (circular) pattern of entities.

**Usage**:
1. Type `ARRAY` or `ARR`
2. Select entities to array
3. Press **Enter**
4. **Choose type**:
   - **R** = Rectangular array (rows and columns)
   - **P** = Polar array (circular pattern)

#### Rectangular Array:
```
Command: ARR
Select objects: [select, press Enter]
Array type [R]ectangular or [P]olar: R
Number of rows: 3
Number of columns: 4
Distance between rows: 10
Distance between columns: 15
```

#### Polar Array:
```
Array type: P
Specify center point: [click center]
Number of items: 8
Angle to fill (360=full circle): 360
Rotate items? [Y/N]: Y
```

---

### CHANGE

Changes **properties** on a selection set (color, linetype, layer, dimension scale, elevation, or thickness).

**Usage**:
1. Type `CHANGE` (or **Edit → Change**)
2. Select objects (click / window); press **Enter** when done
3. Choose a **property** from the prompt (`COLOR`, `LTYPE`, `LAYER`, `DIMSCALE`, `ELEVATION`, `THICKNESS`, etc.)
4. Enter the **new value** as prompted (colors accept ACI numbers, `BYLAYER`, `BYBLOCK`, or `#RRGGBB`; linetypes use names such as `CONTINUOUS`, `HIDDEN`, `CENTER`)

---

### PEDIT (Aliases: `PE`)

Edits polylines (add/remove vertices, join separate segments).

**Usage**:
1. Type `PEDIT` or `PE`
2. Select polyline
3. **Choose operation**:
   - **J** = Join additional entities to polyline
   - **O** = Open (remove closing segment)
   - **C** = Close polyline
   - **X** = Exit

**Example (Join)**:
```
Command: PE
Select polyline: [select existing polyline]
Enter option [J]oin [O]pen [C]lose e[X]it: J
Select entities to join: [select lines/arcs to add]
[Press Enter when done]
```

---

### EXPLODE

Breaks a single **polyline** into separate line/arc entities (one segment per entityId).

**Usage**:
1. Type `EXPLODE`
2. Click the polyline to explode
3. The original polyline is removed; each segment becomes an independent entity

---

### REGION (Aliases: `REG`)

Creates closed **region** entities from selected closed polylines or hatches.

**Usage**:
1. Type `REGION` or `REG`
2. Select closed boundaries (click or window)
3. Press **Enter** to build region(s)

---

### REGION SUBTRACT (Aliases: `REGSUB`, `RSUB`, `SUBTRACT`)

Subtracts one or more regions from a base region.

**Usage**:
1. Type `REGSUB`
2. Select **base** region(s); press **Enter**
3. Select region(s) to **subtract**; press **Enter**

---

### DIST

Measures distance between two points (does not create a dimension entity).

**Usage**:
1. Type `DIST`
2. Click first point
3. Click second point
4. Command bar reports **distance** and **delta-x / delta-y / delta-z**

---

### TEDIT (Aliases: `TE`)

Edits the content of an existing **TEXT** entity.

**Usage**:
1. Type `TEDIT` or `TE`
2. Click the text entity
3. Enter new text at the prompt

---

### XDATA (Aliases: `XD`)

View or edit **extended data** strings attached to entities (used heavily by CADMAX structural members).

**Usage**:
1. Type `XDATA` or `XD`
2. Select an entity
3. View the current XData string; edit if prompted

For structural **CADMAX** XData formats and workflows, see **CADMAX_MANUAL.md** (Help → CADMAX Manual…).

---

### WBLOCK (Aliases: `WB`)

Writes selected entities to a new **block definition** file (WBLOCK export).

**Usage**:
1. Type `WBLOCK` or `WB`
2. Follow prompts to pick a base point and save the block

---

### DELBLOCK (Aliases: `DELBL`)

Deletes a block definition from the drawing block table.

**Usage**:
1. Type `DELBLOCK` or `DELBL`
2. Enter the block name to remove

---

### JSWIN

Imports geometry from a **JSWIN** (window/elevation) data file into the drawing.

**Usage**:
1. Type `JSWIN`
2. Choose the file in the Open dialog
3. Follow command-bar prompts for placement

---

## Dimension Commands

### DIM (Aliases: `D`)

Creates linear or aligned dimensions.

**Usage**:
1. Type `DIM` or `D`
2. Click first extension line origin (point to measure from)
3. Click second extension line origin (point to measure to)
4. Click dimension line location (where dimension text appears)

**Example**:
```
Command: D
Specify first extension line origin: [click point 1]
Specify second extension line origin: [click point 2]
Specify dimension line location: [click above/below measured line]
```

**Behavior**:
- If dimension line is perpendicular to measured line → **Aligned dimension**
- If dimension line is horizontal/vertical → **Linear dimension**
- Dimension automatically calculates distance and shows value

---

### DIMLEA (Aliases: `DIMLEADER`, `LEADER`, `MLEADER`)

Creates dimension leader (arrow pointing to feature with text label).

**Usage**:
1. Type `DIMLEA`
2. Click first point (arrow location)
3. Click subsequent points for leader line
4. Click final text location
5. Enter dimension text (e.g., "#12@100", "Ø50mm")
6. Press **Enter** to place

**Example**:
```
Command: DIMLEA
Specify first point (arrow): [click feature]
Specify next point: [click to route leader]
Specify text location: [click where text goes]
Enter dimension text: Ø25 THRU HOLE
```

---

### Angular Dimension

Creates angle measurement between two lines.

**Usage**:
1. Type `DIM` or `D`
2. **Instead of clicking points**, type option during prompt:
   - After first point prompt, if you select two lines, it switches to angular mode
3. Click vertex (angle center)
4. Click first direction line
5. Click second direction line
6. Click dimension arc location

---

### Dimension Settings

Adjust dimension appearance with these settings commands:

#### DIMTXT (Aliases: `DTXT`)
Sets dimension text height.
```
Command: DIMTXT
Enter dimension text height <2.500>: 3.5
```

#### DIMSCALE (Aliases: `DSCALE`, `DS`)
Scales all dimension elements (text, arrows, spacing).
```
Command: DIMSCALE
Enter dimension scale factor <1.000>: 2.0
```

#### DIMASZ (Aliases: `DASZ`)
Sets arrowhead size.
```
Command: DIMASZ
Enter arrowhead size <0.180>: 0.25
```

#### DIMDEC (Aliases: `DD`)
Sets decimal precision (0-8 decimal places).
```
Command: DIMDEC
Enter decimal places (0-8) <2>: 3
```

---

## View Commands

### ZOOM (Aliases: `Z`)

Controls view magnification.

**Usage**:
1. Type `ZOOM` or `Z`
2. **Options**:
   - **E** = Extents (fit all entities)
   - **W** = Window (click two corners to zoom area)
   - **Type number** = Scale factor (e.g., `2` = 2× zoom, `0.5` = 50% zoom)
   - **Click two points** = Define zoom window

**Examples**:
```
Command: Z E          # Zoom to fit all
Command: Z W          # Window zoom (click corners)
Command: Z            # Manual window (click corners)
Command: ZOOM 2       # Zoom in 2×
```

**Shortcut**: **Ctrl+E** = Zoom Extents

---

### PAN (Aliases: `P`)

Moves the view without zooming.

**Usage**:
1. Type `PAN` or `P`
2. Click and drag to pan
3. Or use **Middle Mouse Button** / **Shift+Left-Drag** anytime

---

### 3D View Modes

#### 2D Top View (Aliases: `2DV`)

```
Command: 2DV
```
Standard orthographic top-down plan view. Also available from **View → 2D Top View**.

#### 3D Orbit View (Aliases: `3CV`, `3DO`, `3DORBIT`)

```
Command: 3CV
Command: 3DO
```
Perspective 3D view. **Left-drag** on the canvas orbits the camera. Also **View → 3D Orbit View** or **View → 3D Orbit** (active orbit tool).

#### 3D Ortho View (Alias: `3DV`)

```
Command: 3DV
```
Orthographic 3D projection (parallel lines, no perspective). Also **View → 3D Ortho View**.

**3D Controls** (in 3D mode):
- **Left-Drag**: Orbit camera (when `3DO` / `3DORBIT` is active)
- **Scroll**: Zoom
- **Middle/Shift+Left-Drag**: Pan

#### REDRAW

```
Command: REDRAW
```
Refreshes the display (rebuilds geometry buffers and redraws the canvas). Use after large imports or if the view looks stale.

---

### HIDE

Toggles hidden line removal for thick extrusions (shows depth-sorted edges).

```
Command: HIDE
```

**Effect**: In 3D views with thick entities (`THICKNESS > 0`), hides edges obscured by wall faces.

---

### SHADE

Toggles shaded rendering with Blinn-Phong lighting (solid faces instead of wireframe).

```
Command: SHADE
```

**Effect**: Renders entities as solid shaded surfaces. Best viewed in 3D mode.

---

## File Operations

### New Drawing
```
File → New
```
Clears the current drawing and starts a fresh document (unsaved work is discarded; use **Save** regularly).

### New Tab
```
File → New Tab
```
Opens new browser tab with blank NirtsCAD instance.

---

### Open Project
```
File → Open
```
Opens `.json` project file (NirtsCAD native format). Preserves:
- All entities
- Layers
- Colors
- Dimension settings
- Drawing elevation and thickness

---

### Save Project
```
File → Save
```
Saves current drawing as `.json` file. This is the recommended format for working files.

**Saved Data**:
- All entities (geometry, colors, layers)
- Current layer and layer visibility states
- Dimension globals (DIMTXT, DIMSCALE, DIMASZ, DIMDEC)
- Elevation, thickness, hatch scale
- Color picker state

---

### Import DXF
```
File → Import DXF
```
Imports AutoCAD DXF (R12/R2000+) file. Supports:

**Entities**:
- LINE, CIRCLE, ARC
- LWPOLYLINE, POLYLINE (with VERTEX/SEQEND)
- TEXT, MTEXT
- DIMENSION (linear, aligned, angular)
- LEADER, MULTILEADER
- HATCH (via fallback parser)
- INSERT (block references)
- SOLID (filled triangles/quads)

**Extracted Data**:
- Layers
- Colors (ACI color index, 24-bit true color)
- Dimension variables from DXF header ($DIMTXT, $DIMSCALE, $DIMASZ, $DIMDEC)
- Block definitions and transformations

**Notes**:
- Uses `dxf-parser` library for standard entities
- Custom fallback parser handles HATCH entities (v1.1.2 limitation)
- Automatically zooms to extents after import

---

### Export DXF
```
File → Export DXF
```
Exports current drawing to DXF R12 format. Compatible with AutoCAD and other CAD software.

**Exported Data**:
- All geometric entities
- Layers with visibility states
- Colors (ACI format)
- Dimension variables in header section
- Text entities with rotation

**Limitations**:
- Hatch patterns exported as line segments (pattern definition not preserved)
- Thickness extrusion exported as 2D entities (not 3D solids)

---

### Print PDF (Aliases: `PRINTPDF`)

Exports the current view (or a picked **window**) to a **vector PDF** using the bundled **jsPDF** library.

**Start from menu**: **File → Print PDF**  
**Start from command line**: Type `PRINTPDF`

**Workflow** (follow prompts at the bottom of the screen):
1. **Display (D)** — entire current view on paper, or **Window (W)** — click two corners on the canvas to define the plot area
2. **Paper size** — `A0` … `A4`, then **Landscape (L)** or **Portrait (P)**
3. **Style** — **Color** or **Black/White**
4. **Minimum pen width** — line weight floor in millimeters (e.g. `0.2`; valid range is shown in the prompt)
5. **Scale** — **`FIT`** (default) to fit the plot to the page, or enter **drawing units per mm** on paper, or a ratio such as **`1:100`**
6. **Filename** — type a name or press **Enter** for an automatic name

**Tips**:
- If the PDF step reports that **jsPDF** is missing, check your network connection (the library loads from the CDN configured in `index.html`) and reload the page
- **Esc** cancels an in-progress `PRINTPDF` sequence

---

## Settings & Configuration

### Layer Management

Layers are managed in a **modal dialog** (not a side dock):

1. Click **Manage Layers** next to the current layer name in the bottom bar, or use the layer workflow from your usual commands
2. In the table: **Visible** (show/hide), **Current** (active layer for new geometry), **Layer Name**
3. Use **+ New Layer** in the modal footer to add a layer

**Layer "0"**: Default layer, always present.

---

### Color Selection

**Color Methods**:

1. **RGB Picker**: Click color swatch to open browser color picker
2. **ACI (AutoCAD Color Index)**: Select from dropdown
   - Standard colors: 1=Red, 2=Yellow, 3=Green, 4=Cyan, 5=Blue, 6=Magenta, 7=White/Black, 8=Dark Grey
   - 256 total colors matching AutoCAD palette
3. **ByLayer**: Select "ByLayer" in ACI dropdown (entity uses layer's color)

---

### Drawing Settings

#### ELEVATION (Aliases: `ELEV`, `EL`)
Sets default Z-coordinate for new entities.
```
Command: ELEVATION
Enter elevation (Z coordinate) <0.000>: 5.0
```

#### THICKNESS (Aliases: `TH`)
Sets extrusion thickness for new 2D entities (creates 3D solids).
```
Command: THICKNESS
Enter thickness <0.000>: 2.5
```

**Example**: Draw a circle with thickness = 5 → creates a cylinder.

#### HATCHSCALE (Aliases: `HSCALE`, `HS`)
Sets global scale multiplier for hatch patterns.
```
Command: HATCHSCALE
Enter hatch scale <1.000>: 2.0
```

---

### OSNAP (Object Snap)

**Toggle**: Settings menu → "OSNAP" or press **F3**

**Snap Modes** (when enabled; toggles are in **Osnap Settings**):
- **Endpoint**: Snaps to line/arc endpoints
- **Midpoint**: Snaps to segment midpoints
- **Center**: Snaps to circle/arc centers
- **Intersection**: Snaps to entity intersections
- **Perpendicular**: Snaps perpendicular to line/arc
- **Tangent**: Snaps tangent to circle/arc
- **Insertion**: Snaps to block insertion points
- **Parallel**: Parallel alignment hints relative to existing geometry

**Visual Feedback**: Green target circle appears at snap point.

---

### ORTHO Mode

**Toggle**: Settings menu → "Ortho (F8)" or press **F8**

**Effect**: Constrains cursor movement to horizontal or vertical relative to last point (0°, 90°, 180°, 270°).

**Use Case**: Drawing perpendicular walls, grids, rectangular layouts.

---

### Grid

**Toggle**: **Settings → Grid (F7)** or press **F7**

**Effect**: Shows a **reference grid** in the drawing plane to help alignment (independent of Ortho).

---

### Linetype

**Settings → Linetype** opens a list loaded from **`linetype.txt`** (with built-in fallbacks such as `CONTINUOUS`, `DASHED`, `HIDDEN`, `CENTER`, etc.). Pick a linetype to apply to **new** entities. You can also type **`LINETYPE`**, **`LTYPE`**, or **`LT`** in the command bar for the same flow.

---

### LTSCALE (Aliases: `LTS`)

Sets the **global linetype scale** applied when rendering dashed, hidden, and center linetypes.

```
Command: LTSCALE
Enter linetype scale <1.000>: 50
```

---

### UCS (User Coordinate System)

Defines a custom **drawing plane** for new geometry and some edit tools.

**Usage**:
1. Type `UCS`
2. Pick **origin**, then **X-axis direction**, then **Y-axis direction** (three points on the desired plane)
3. New entities drawn in 2D mode follow the active UCS until reset

---

## Advanced Features

### Hatch Pattern Library

**100+ Built-in Patterns**: Including ANSI standards, architectural, structural, and decorative fills.

**Browse Patterns**:
```
Command: HATCHLIST
```
Opens modal dialog with pattern previews. Click pattern to select.

**Custom Patterns**: User-defined mode allows manual angle and spacing control for any linear pattern.

---

### Block references (INSERT)

**Inside NirtsCAD** you can define blocks with **`BLOCK`**, place them with **`INSERT`**, and list them with **`BLOCKLIST`** or **Draw → Block List**. DXF import also brings in inserts with translation, scale, rotation, nested blocks, and **BYBLOCK** color behavior.

---

### 3D Thickness Visualization

Entities with `THICKNESS > 0` are rendered as 3D extrusions:
- **Lines** → Vertical rectangular walls
- **Circles** → Cylinders
- **Arcs** → Curved wall sections
- **Polylines** → Complex extruded profiles

**Hidden Line Removal**: Enable `HIDE` mode to depth-sort edges.

**Shading**: Enable `SHADE` mode for solid surface rendering with lighting.

---

### Coordinate Input

**Methods**:

1. **Absolute Coordinates**: `x,y` or `x,y,z`
   ```
   Specify point: 10,20
   Specify point: 10,20,5
   ```

2. **Relative Coordinates**: `@dx,dy` or `@dx,dy,dz` (relative to last point)
   ```
   Specify next point: @5,0    # 5 units right
   Specify next point: @0,10   # 10 units up
   ```

3. **Polar Coordinates**: `@distance<angle`
   ```
   Specify next point: @10<45  # 10 units at 45°
   ```

4. **Distance Only**: Type number to constrain distance, move mouse to set direction
   ```
   Specify next point: 15
   [Move mouse to desired direction, click]
   ```

---

### Undo/Redo

**Undo**: 
- Edit menu → Undo
- **Ctrl+Z**
- Type `UNDO` or `U`

**Redo**:
- Edit menu → Redo
- **Ctrl+Y**
- Type `REDO`

**History**: Unlimited undo levels (limited by browser memory).

---

## Keyboard Shortcuts

| Shortcut | Action |
|----------|--------|
| **Esc** | Cancel current command |
| **Enter** / **Space** | Confirm / execute command |
| **Right-Click** | Finish command (e.g., end polyline) |
| **Ctrl+Z** | Undo |
| **Ctrl+Y** | Redo |
| **Ctrl+E** | Zoom Extents |
| **F3** | Toggle OSNAP |
| **F7** | Toggle grid display |
| **F8** | Toggle Ortho mode |
| **Middle-Mouse-Drag** | Pan view |
| **Scroll Wheel** | Zoom in/out |
| **Shift+Left-Drag** | Pan view (alternate) |

---

## Tips & Best Practices

### General Workflow

1. **Start with layers**: Create logical layers (e.g., "Walls", "Dimensions", "Notes") before drawing
2. **Use OSNAP**: Enable for precise connections (F3)
3. **Save frequently**: Save as `.json` for working files
4. **Zoom Extents often**: Press Ctrl+E to see full drawing
5. **Use command aliases**: Type `L` instead of `LINE`, `C` instead of `CIRCLE`

### Performance

- **Large files**: DXF import of 10,000+ entities may take several seconds
- **Zoom limits**: Stay within reasonable world coordinates (avoid extreme zoom in/out)
- **Hatch complexity**: Dense hatches (small spacing) generate many line segments

### DXF Compatibility

- **Export**: Use DXF for exchanging with AutoCAD/other CAD tools
- **Import**: Tested with AutoCAD R12-R2018 DXF files
- **Colors**: Use ACI colors for best DXF compatibility
- **Dimensions**: Dimension blocks (*D# names) are auto-generated on import

### Drawing Precision

- **Coordinates**: Enter exact values via keyboard for critical points
- **Osnap tolerance**: Adjusted automatically based on zoom level
- **Grid reference**: Use coordinate display (bottom-left) to verify positions

### 3D Modeling Tips

- **Set elevation first**: Use `ELEVATION` to place entities at correct Z-height
- **Thickness for extrusion**: Set `THICKNESS` before drawing 2D profiles
- **3D View**: Switch to 3D Orbit to verify thickness extrusions
- **Hidden lines**: Enable `HIDE` mode for better visualization

### Troubleshooting

**Problem**: Entities not visible after import
- **Solution**: Try `ZOOM E` (Ctrl+E) — entities may be outside view

**Problem**: OSNAP not working
- **Solution**: Press F3 to toggle OSNAP on

**Problem**: Can't select entities
- **Solution**: Ensure you're not in a drawing command (press Esc)

**Problem**: Hatch pattern not showing
- **Solution**: Increase hatch scale or zoom in closer

**Problem**: Dimension text too small/large
- **Solution**: Adjust `DIMTXT` and `DIMSCALE` settings

---

## Command Reference (Quick List)

> **Structural engineering** (BEAMLOAD, ANALYSE, design, detailing, STAAD import) is documented in **CADMAX_MANUAL.md** — open via **Help → CADMAX Manual…**.

### Drawing
- `LINE` (L) — Line
- `PLINE` (PL, POLYLINE) — Polyline
- `RECTANG` (REC, RECTANGLE) — Rectangle
- `POLYGON` (PG) — Regular polygon
- `POINT` (PO) — Point marker
- `CIRCLE` (C) — Circle
- `ARC` — 3-point arc
- `ARCCSE` / `CSEARC` — Center-start-end arc
- `ARCCSA` / `CSARC` — Center-start-angle arc
- `ARCSER` / `SERARC` — Start-end-radius arc
- `ARCSEA` / `SEAARC` — Start-end-angle arc
- `TEXT` (T) — Text
- `HATCH` (H) — Hatch fill
- `BLOCK` (BL) — Define block
- `INSERT` (IN) — Insert block
- `BLOCKLIST` (BLIST) — Block list dialog
- `WBLOCK` (WB) — Write block to file
- `DELBLOCK` (DELBL) — Delete block definition
- `3DFACE` (3DF, 3F) — 3D face
- `3DBOX` (3DB, BOX) — 3D box
- `SPHERE` (SPH) — Sphere
- `3DMESH` (MESH) — 3D mesh

### Editing
- `ERASE` (E) — Delete
- `MOVE` (M) — Move
- `COPY` (CO, CP) — Copy
- `ROTATE` (RO) — Rotate
- `SCALE` (SC) — Scale
- `MIRROR` (MI) — Mirror
- `OFFSET` (O) — Offset
- `TRIM` (TR) — Trim
- `EXTEND` (EX) — Extend
- `FILLET` (F) — Fillet (round corner)
- `CHAMFER` (CHA) — Chamfer (bevel corner)
- `BREAK` (BR) — Break
- `STRETCH` (S) — Stretch
- `ARRAY` (AR) — Rectangular/polar array
- `CHANGE` (CH) — Change entity properties
- `PEDIT` (PE) — Polyline edit
- `EXPLODE` — Explode polyline to segments
- `REGION` (REG) — Create region from closed boundary
- `REGSUB` (RSUB, SUBTRACT) — Region subtract
- `TEDIT` (TE) — Edit text content
- `XDATA` (XD) — View/edit extended data

### Dimensions & inquiry
- `DIM` (D) — Linear/aligned/angular dimension
- `DIMLEA` (DIMLEADER, LEADER, MLEADER) — Dimension leader
- `DIST` — Distance inquiry (two points)

### View
- `ZOOM` (Z) — Zoom (E=extents, W=window)
- `PAN` (P) — Pan view
- `2DV` — 2D top plan view
- `3CV` — 3D perspective orbit view
- `3DV` — 3D orthographic view
- `3DO` / `3DORBIT` — Interactive 3D orbit tool
- `REDRAW` — Refresh display
- `HIDE` (HID) — Toggle hidden lines
- `SHADE` (SH) — Toggle shaded mode

### Settings
- `LINETYPE` / `LTYPE` / `LT` — Current linetype for new entities
- `LTSCALE` (LTS) — Global linetype scale
- `UCS` — Define user coordinate system
- `ELEVATION` (ELEV, EL) — Set Z-coordinate
- `THICKNESS` (TH) — Set extrusion thickness
- `DIMTXT` (DTXT) — Dimension text height
- `DIMSCALE` (DSCALE, DS) — Dimension scale
- `DIMASZ` (DASZ) — Arrowhead size
- `DIMDEC` (DD) — Dimension decimal places
- `HATCHSCALE` (HSCALE, HS) — Hatch scale
- `HATCHLIST` — Browse hatch patterns

### File & utility
- `UNDO` (U) — Undo last action
- `REDO` — Redo last undone action
- `PRINTPDF` (PLOT, PRINT) — Export drawing to PDF
- `JSWIN` — Import JSWIN elevation data

---

## Repository Architecture

### Core Files

- **`index.html`** — Application entry point, UI layout (menu bar, canvas, command input, panels)
- **`app.js`** — Main application logic (~28,700 lines):
  - WebGL rendering engine
  - Command interpreter and tool handlers
  - Entity management (entities array, layers)
  - View transformation (zoom, pan, 3D orbit)
  - Canvas event handlers (mouse, keyboard)
  - Geometry generation functions
  - Editing operations (trim, extend, offset, fillet, etc.)
  - Dimension and hatch logic
  - OSNAP and Ortho implementation
  - Undo/redo stack management

- **`file-io.js`** — File operations:
  - `loadJsonData()` — Parses and loads `.json` project files
  - `getEntitiesForJsonSave()` — Serializes entities for JSON export
  - `saveFileAs()` — File System Access API wrapper
  - `openFile()` — File picker wrapper

- **`dxf-import.js`** — DXF import pipeline:
  - `loadDxfData()` — Main entry point (uses `dxf-parser` library)
  - `convertDxfEntity()` — Maps dxf-parser entities to internal format
  - `parseHatchEntitiesFromRawDxf()` — Fallback HATCH parser (raw text scan)
  - `parseImportedDxfHatchPairs()` — Legacy DXF group code interpreter
  - `parseDxfDimensionPairs()` — Legacy dimension parser
  - `applyInsertTransform()` — Block transformation helper
  - `dxfColorFromParsed()` — ACI/true-color converter

- **`dxf-exporter.js`** — DXF export:
  - `generateDXF()` — Converts entities to DXF R12 ASCII format
  - Entity-specific DXF serializers
  - Header section with dimension variables

- **`aci-colors.js`** — AutoCAD Color Index definitions:
  - 256-color palette (RGB mappings)
  - `aciIntToRgbNormalized()` — ACI → WebGL color conversion

- **`styles.css`** — UI styling (menu bar, command input, panels, glass effects)

---

### Dependencies

**External Libraries** (loaded via CDN):
- **`dxf-parser@1.1.2`** — DXF parsing (https://github.com/gdsestimating/dxf-parser)
- **`jspdf@2.5.1`** — PDF generation for **Print PDF** / `PRINTPDF`

Core drawing and viewing remain **pure JavaScript + WebGL 1.0** beyond these helpers.

---

## Development Notes

### Technology Stack

- **Rendering**: WebGL 1.0 (hardware-accelerated 2D/3D graphics)
- **Projection**: Custom orthographic and perspective matrices (no Three.js/Babylon.js)
- **UI**: Vanilla JavaScript, CSS3 (no framework dependencies)
- **File I/O**: File System Access API (with fallback to download/upload)

### Entity Storage

**Internal Format** (JavaScript objects):
```javascript
// Line entity
{
  type: 'line',
  points: [x1, y1, z1, x2, y2, z2],  // Float32Array or regular array
  thickness: 0,
  color: [r, g, b, a],  // Normalized 0-1
  aci: 7,               // AutoCAD Color Index (null if true color)
  layer: '0'
}

// Circle entity
{
  type: 'circle',
  points: [cx, cy, cz, px, py, pz],  // Center + point on circumference
  thickness: 0,
  color: [r, g, b, a],
  aci: 256,
  layer: 'Circles'
}

// Polyline entity
{
  type: 'polyline',
  vertices: [
    { x, y, z, bulge, sw, ew },  // bulge: arc curvature, sw/ew: start/end width
    { x, y, z, bulge, sw, ew },
    ...
  ],
  closed: false,
  thickness: 0,
  color: [r, g, b, a],
  aci: 3,
  layer: '0'
}

// Dimension entity
{
  type: 'dimension',
  points: [p1x, p1y, p1z, p2x, p2y, p2z],  // Measured points
  dimKind: 'ALIGNED',  // or 'LINEAR', 'ANGULAR'
  dimensionMeasured: 15.234,
  segments: [...],  // Generated line/text entities for rendering
  dimensionGroupId: 42,
  color: [r, g, b, a],
  layer: 'Dims'
}

// Hatch entity
{
  type: 'hatch',
  hatchBoundary: { kind: 'poly', polyx: [...], polyy: [...], z: 0 },
  hatchPatternName: 'ANSI31',
  hatchSpacing: 1.0,
  hatchAngleRad: 0.7854,  // 45°
  hatchPatternScale: 1.5,
  hatchPatternLines: [...],  // Pattern definition
  segments: [...],  // Generated line segments for rendering
  color: [r, g, b, a],
  layer: 'Hatches'
}
```

### WebGL Rendering Pipeline

1. **Entity Normalization**: Convert all entities to vertex arrays
   - Lines → 2 vertices
   - Circles → Tessellated line strips (32-64 segments)
   - Arcs → Tessellated strips
   - Polylines → Process bulge (arc segments) and width (triangles)
   - Text → Rendered as canvas 2D texture, mapped to quads
   - Hatches → Pre-computed line segments

2. **Geometry Buffering**:
   - Combine all entities into single large Float32Array
   - Upload to GPU via `gl.bufferData()`
   - No instancing — all geometry batched

3. **Shader Program**:
   - **Vertex Shader**: Applies MVP matrix (Model-View-Projection)
   - **Fragment Shader**: Flat color shading (or Blinn-Phong in SHADE mode)

4. **Rendering Pass**:
   - **2D Mode**: Orthographic projection, single draw call
   - **3D Mode**: Perspective/ortho projection, depth buffer enabled
   - **HIDE Mode**: Two-pass render (invisible fill for depth, then wireframe)
   - **SHADE Mode**: Triangle fills with lighting calculations

---

## Future Enhancements (Potential)

- **Spline support** (NURBS curves)
- **Block editor** (create/modify blocks in UI)
- **Dimension style manager** (save/load dimension presets)
- **Advanced hatch editor** (boundary editing, pattern customization)
- **Measurement tools** (distance, area, angle)
- **Snap tracking** (polar tracking, object tracking)
- **Layer properties dialog** (freeze, lock, plot style)
- **Print/Plot** (export to PDF, print preview)
- **External references (XREF)**
- **Parametric constraints** (dimensional constraints, geometric relations)
- **Sheet sets** (multi-page layouts)
- **3D solid modeling** (extrude, revolve, Boolean operations)

---

## License

**NirtsCAD** — WebGL CAD Application  
Copyright © 2026 NIRTS. All rights reserved.  
Confidential and Proprietary. Unauthorized copying, distribution, or modification is strictly prohibited.

**Proprietary Software** — This software is licensed, not sold. Unauthorized use without explicit written permission from NIRTS is strictly prohibited.

**For Commercial Licensing**:
- Contact NIRTS for licensing terms and pricing
- Evaluation licenses available upon request
- Enterprise and multi-user licenses available

**Third-Party Components**:
- This software uses `dxf-parser` library (MIT License) for DXF file import functionality
- The use of third-party components does not affect the proprietary status of this software

**Browser Compatibility**:
- Tested on Chrome 120+, Firefox 121+, Edge 120+
- Safari 17+ (partial support, some File API limitations)

---

## Support & Contact

For licensing, support, or inquiries, contact NIRTS at: contact@nirts.in

---

**End of User Manual**
