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