| name | autolisp-dwg |
| description | Use this when working with DWG file generation features (Tiles, Playground, Symbol Generator). Provides AutoLISP script patterns, DWGUNITS command, entity creation (entmake), APS Design Automation requirements, and critical rules for headless AutoCAD operation. |
AutoLISP DWG Generation Patterns
Essential AutoLISP patterns for generating DWG files via APS Design Automation. Used across three features: Tiles, Playground, and Symbol Generator.
Features Using AutoLISP
| Feature | File Location | Description |
|---|---|---|
| Tiles | src/lib/tiles/script-generator.ts |
Programmatic tile layout generation |
| Playground | src/lib/playground/prompts.ts |
Natural language to DWG via LLM |
| Symbol Generator | src/lib/symbol-generator/script-prompts.ts |
Luminaire plan-view symbols |
Script Structure Template
All generated scripts must follow this structure:
(setvar "cmdecho" 0)
(setvar "filedia" 0)
; === SET METRIC UNITS (mm) ===
(command "-DWGUNITS" 3 2 2 "Y" "Y" "N")
; === LAYER SETUP ===
(command "-LAYER" "Make" "OUTLINE" "Color" "7" "" "")
(command "-LAYER" "Make" "TEXT" "Color" "1" "" "")
; === GEOMETRY ===
; Draw entities with entmake or command
(entmake '((0 . "LINE") (8 . "OUTLINE") (10 0.0 0.0 0.0) (11 100.0 0.0 0.0)))
; === FINALIZE ===
(command "ZOOM" "E")
(command "SAVEAS" "2018" "result.dwg")
⚠️ Critical Rules
MUST include:
- ✅
(setvar "filedia" 0)- Required for headless operation - ✅
(command "-DWGUNITS" 3 2 2 "Y" "Y" "N")- Sets metric units - ✅
(command "SAVEAS" "2018" "filename.dwg")- Saves output
MUST NOT include:
- ❌
(command "QUIT")- APS handles process termination - ❌ Interactive prompts - No dialogs available in headless mode
DWGUNITS Command (REQUIRED)
Sets drawing units to metric/millimeters. Must be included in every script.
(command "-DWGUNITS" 3 2 2 "Y" "Y" "N")
Parameter Breakdown
| Position | Value | Meaning |
|---|---|---|
| 1 | 3 |
Linear units = Millimeters |
| 2 | 2 |
Linear display format = Decimal |
| 3 | 2 |
Linear display precision = 0.00 |
| 4 | "Y" |
Scale objects from other drawings = Yes |
| 5 | "Y" |
Match INSUNITS to drawing units = Yes |
| 6 | "N" |
Reset scale list = No |
Other Unit Codes (for reference)
| Code | Unit |
|---|---|
| 1 | Inches |
| 2 | Feet |
| 3 | Millimeters ← FOSSAPP standard |
| 4 | Centimeters |
| 5 | Meters |
Why millimeters? All product specifications in the database are in mm.
Entity Creation with entmake
LINE
(entmake '(
(0 . "LINE")
(8 . "LAYER_NAME")
(10 X1 Y1 0.0) ; Start point
(11 X2 Y2 0.0) ; End point
))
Example:
(entmake '((0 . "LINE") (8 . "OUTLINE") (10 0.0 0.0 0.0) (11 100.0 50.0 0.0)))
CIRCLE
(entmake '(
(0 . "CIRCLE")
(8 . "LAYER_NAME")
(10 CX CY 0.0) ; Center point
(40 . RADIUS) ; Radius (NOT diameter!)
))
⚠️ CRITICAL: Specifications often give DIAMETER - always divide by 2 for radius!
Example:
; Drawing a 67mm diameter circle
(setq diameter 67)
(setq radius (/ diameter 2.0))
(entmake '((0 . "CIRCLE") (8 . "OUTLINE") (10 0.0 0.0 0.0) (40 . 33.5)))
ARC
(entmake '(
(0 . "ARC")
(8 . "LAYER_NAME")
(10 CX CY 0.0) ; Center point
(40 . RADIUS) ; Radius
(50 . START_ANGLE_RAD) ; Start angle in RADIANS
(51 . END_ANGLE_RAD) ; End angle in RADIANS
))
⚠️ ANGLES ARE RADIANS! Convert degrees to radians:
(setq angle_radians (* angle_degrees (/ pi 180)))
; Example: 90 degree arc from 0 to 90
(setq start_rad 0.0)
(setq end_rad (* 90 (/ pi 180))) ; = 1.5708
(entmake '((0 . "ARC") (8 . "OUTLINE") (10 0.0 0.0 0.0) (40 . 50.0) (50 . 0.0) (51 . 1.5708)))
LWPOLYLINE (Closed Rectangle)
(entmake '(
(0 . "LWPOLYLINE")
(100 . "AcDbEntity")
(8 . "LAYER_NAME")
(100 . "AcDbPolyline")
(90 . 4) ; Number of vertices
(70 . 1) ; 1=closed, 0=open
(10 X1 Y1) ; Vertex 1 (2D only)
(10 X2 Y2) ; Vertex 2
(10 X3 Y3) ; Vertex 3
(10 X4 Y4) ; Vertex 4
))
Example - 100mm x 50mm rectangle centered at origin:
(setq half_w (/ 100 2.0)) ; 50mm
(setq half_h (/ 50 2.0)) ; 25mm
(entmake '(
(0 . "LWPOLYLINE")
(100 . "AcDbEntity")
(8 . "OUTLINE")
(100 . "AcDbPolyline")
(90 . 4)
(70 . 1)
(10 -50.0 -25.0) ; Bottom-left
(10 50.0 -25.0) ; Bottom-right
(10 50.0 25.0) ; Top-right
(10 -50.0 25.0) ; Top-left
))
MTEXT (Multiline Text)
(entmake (list
'(0 . "MTEXT")
'(100 . "AcDbEntity")
'(8 . "TEXT")
'(100 . "AcDbMText")
'(10 X Y 0.0) ; Insertion point
'(40 . TEXT_HEIGHT) ; Text height (mm)
'(41 . COLUMN_WIDTH) ; Column width (mm)
'(71 . ATTACHMENT) ; Attachment point (see below)
(cons 1 "Your text here\\PNext line")
))
Attachment point codes (71):
| Code | Position |
|---|---|
| 1 | Top Left |
| 2 | Top Center |
| 3 | Top Right |
| 4 | Middle Left |
| 5 | Middle Center ← Common |
| 6 | Middle Right |
| 7 | Bottom Left |
| 8 | Bottom Center |
| 9 | Bottom Right |
MTEXT formatting codes:
| Code | Effect |
|---|---|
\\P |
New line |
\\L...\\l |
Underline |
{\\C1;text} |
Color (1=red, 3=green, 5=blue) |
{\\H1.5x;text} |
Height 1.5x |
Example:
(entmake (list
'(0 . "MTEXT")
'(100 . "AcDbEntity")
'(8 . "TEXT")
'(100 . "AcDbMText")
'(10 0.0 -100.0 0.0)
'(40 . 3.5)
'(41 . 200.0)
'(71 . 5)
(cons 1 "DELTA-123456\\PDOWNLIGHT 67MM")
))
Layer Management
Create Layer with Color
(command "-LAYER" "Make" "LAYER_NAME" "Color" "COLOR_NUM" "" "")
Example:
(command "-LAYER" "Make" "OUTLINE" "Color" "7" "" "") ; White
(command "-LAYER" "Make" "TEXT" "Color" "1" "" "") ; Red
(command "-LAYER" "Make" "DIMS" "Color" "3" "" "") ; Green
DXF Color Codes
| Code | Color | Use Case |
|---|---|---|
| 1 | Red | Text, important info |
| 2 | Yellow | Warnings |
| 3 | Green | Dimensions |
| 4 | Cyan | Construction lines |
| 5 | Blue | Water/special |
| 6 | Magenta | Highlights |
| 7 | White | Standard outlines |
Add color to entity:
(entmake '((0 . "LINE") (8 . "OUTLINE") (62 . 7) (10 0.0 0.0 0.0) (11 100.0 0.0 0.0)))
; ↑ color code
Set Current Layer
(setvar "CLAYER" "LAYER_NAME")
Load Linetype (e.g., DASHED)
(command "-LINETYPE" "Load" "DASHED" "" "")
(command "-LAYER" "Ltype" "DASHED" "LAYER_NAME" "")
Image Insertion (for Tiles feature)
(command "-IMAGE" "Attach" "path/to/image.png" "X,Y" "SCALE" "0")
Example:
(command "-IMAGE" "Attach" "product.png" "0,0" "1.0" "0")
Notes:
- Images must be uploaded to APS bucket before script execution
- Paths are relative to script working directory
- Scale 1.0 = 1 pixel = 1 mm (for 300dpi images at 1500x1500)
Block Operations
Create Block with entmake
; 1. Start block definition
(entmake '((0 . "BLOCK") (2 . "BLOCKNAME") (10 0.0 0.0 0.0) (70 . 0)))
; 2. Add entities (layers still needed)
(entmake '((0 . "LINE") (8 . "0") (10 0.0 0.0 0.0) (11 10.0 0.0 0.0)))
(entmake '((0 . "CIRCLE") (8 . "0") (10 5.0 5.0 0.0) (40 . 3.0)))
; 3. End block
(entmake '((0 . "ENDBLK") (8 . "0")))
; 4. Insert block
(entmake '(
(0 . "INSERT")
(2 . "BLOCKNAME")
(8 . "LAYER_NAME")
(10 X Y 0.0) ; Insertion point
(41 . 1.0) ; X scale
(42 . 1.0) ; Y scale
(50 . 0.0) ; Rotation (radians)
))
Insert Block with command
(command "-INSERT" "BLOCKNAME" "X,Y" "XSCALE" "YSCALE" "ROTATION_DEGREES")
Common Calculations
Center a Rectangle
(setq width 100)
(setq height 50)
(setq half_w (/ width 2.0))
(setq half_h (/ height 2.0))
; Corners:
; (-50, -25), (50, -25), (50, 25), (-50, 25)
Degrees to Radians
(setq angle_rad (* angle_deg (/ pi 180)))
; Common angles:
; 0° = 0.0
; 45° = 0.7854
; 90° = 1.5708
; 180° = 3.1416
; 270° = 4.7124
; 360° = 6.2832
Diameter to Radius
(setq diameter 67)
(setq radius (/ diameter 2.0)) ; 33.5
Distance Between Points
(setq dx (- x2 x1))
(setq dy (- y2 y1))
(setq distance (sqrt (+ (* dx dx) (* dy dy))))
APS Design Automation Requirements
Environment Constraints
- Headless mode: No interactive dialogs (
filedia=0) - No QUIT command: APS handles process termination
- File paths: Relative to working directory
- Output: Must use SAVEAS with explicit filename
File Upload Workflow
- Upload images/assets to APS OSS bucket
- Create script referencing uploaded files
- Upload script to bucket
- Submit WorkItem with script + assets
- Download generated DWG from output
Debugging Failed Scripts
Common errors:
- Missing DWGUNITS → Drawing uses wrong units
- Missing SAVEAS → No DWG output generated
- Using QUIT → Process terminates before completion
- Diameter instead of radius → Circles twice as large
- Degrees instead of radians → Arcs at wrong angles
- Missing filedia=0 → Script waits for dialog input
Complete Example: Tile Layout
; Headless setup
(setvar "cmdecho" 0)
(setvar "filedia" 0)
; Set metric units (mm)
(command "-DWGUNITS" 3 2 2 "Y" "Y" "N")
; Create layers
(command "-LAYER" "Make" "OUTLINE" "Color" "7" "" "")
(command "-LAYER" "Make" "TEXT" "Color" "1" "" "")
(command "-LAYER" "Make" "IMAGE" "Color" "5" "" "")
; Draw border (200mm x 200mm)
(setq size 200)
(setq half (/ size 2.0))
(entmake '(
(0 . "LWPOLYLINE")
(100 . "AcDbEntity")
(8 . "OUTLINE")
(100 . "AcDbPolyline")
(90 . 4)
(70 . 1)
(10 -100.0 -100.0)
(10 100.0 -100.0)
(10 100.0 100.0)
(10 -100.0 100.0)
))
; Insert product image
(setvar "CLAYER" "IMAGE")
(command "-IMAGE" "Attach" "product.png" "-75,-75" "1.0" "0")
; Add product text
(entmake (list
'(0 . "MTEXT")
'(100 . "AcDbEntity")
'(8 . "TEXT")
'(100 . "AcDbMText")
'(10 0.0 -105.0 0.0)
'(40 . 3.5)
'(41 . 180.0)
'(71 . 5)
(cons 1 "DELTA-123456\\PDOWNLIGHT 67MM")
))
; Finalize
(command "ZOOM" "E")
(command "SAVEAS" "2018" "tile.dwg")
Quick Reference
Critical Rules Checklist
-
(setvar "filedia" 0)included -
(command "-DWGUNITS" 3 2 2 "Y" "Y" "N")included - All dimensions in millimeters
- Circles use radius, not diameter
- Arc angles in radians, not degrees
- All points are 3D (include 0.0 for Z)
-
(command "SAVEAS" "2018" "filename.dwg")included - NO
(command "QUIT")command
Common Mistakes
| ❌ Wrong | ✅ Correct |
|---|---|
(40 . 67) for 67mm diameter |
(40 . 33.5) (radius = diameter/2) |
(50 . 90) for 90° arc |
(50 . 1.5708) (radians = deg × π/180) |
(10 100 50) |
(10 100.0 50.0 0.0) (include Z coordinate) |
| Missing DWGUNITS | Always include DWGUNITS command |
(command "QUIT") |
Never use QUIT (APS handles termination) |
| No SAVEAS | Always use SAVEAS to create output |
See Also
- Tiles feature: docs/features/tiles.md
- Playground feature: docs/features/playground.md
- Symbol Generator: docs/features/symbol-generator.md
- Full AutoLISP reference: docs/development/autolisp-reference.md