UPDVAR.lsp — Dialog Variable Update & Conversion¶
Module: updvar.lsp
Version: v3.60
Category: Core Application
Complexity: High
Size: 19.8 KB (383 lines)
Warning
Most Complex Core Module
This is the largest and most complex core module in CSV 3.60. It handles variable updates from all dialog types with specialized conversion logic for each dialog’s unique control patterns. Understanding this module requires knowledge of all dialog control naming conventions.
Overview¶
Purpose¶
The updvar function transfers user input from AutoCAD DCL dialog controls into ConstructiVision’s global variable system. It performs specialized conversions based on dialog type (mix profile, weld connection, roof, etc.) and validates/transforms control values into the format expected by drawing generation modules.
Role in CSV 3.60 Architecture¶
Position in Call Chain:
User clicks "OK" in dialog
?
Dialog accept callback
?
(updvar) ? THIS MODULE
?
Global variables updated with user input
?
Drawing generation modules use updated variables
Called By:
All
*_dlg.lspfiles (40+ dialogs)Dialog “OK” button callbacks
Dialog “Accept” actions
Function Documentation¶
(updvar)¶
Signature:
(defun updvar ()
; Uses global variable: ok (dialog type identifier)
; Uses global variable: panelvar (control specifications)
; Returns: nil (princ)
)
Purpose: Updates global variables from dialog input with dialog-specific conversion logic.
Algorithm:
Cancel Handling (
ok= “0”)Clear all panel variables
Reset panelvar to nil
Update Variables (for each control in panelvar)
Extract control value from dialog
Apply dialog-specific conversions based on
okvalue:mp- Mix Profilero- Roofwd- Weld Detaildr- Dowel/Rebardl- Dowel/Liftch- Chamferfh- Foundation Headfv- Foundation Voidlb- Ledger Beamtp- Tilt Panelbp- Base Platepp- Panel Parameterswc- Weld Connectionnb- Note Blocksb- Slab Base(15+ dialog types total)
Post-Processing
For weld connections: Save wcl.txt file
Update wclsav.txt with modified weld connections
Dialog-Specific Conversion Logic¶
Mix Profile (mp)¶
Special Handling:
(set 'mpsc (nth (atoi (get_tile "mpsc")) scl)) ; Get scale from list
Embed Array Validation:
If arch top panel + embed array: Force to non-array
Alert user: “Cannot use Embed Arrays for Top Plates on Arch top Panels.”
Post-Processing:
Sets
ok= “ok” to trigger weld connection file save
Roof Panel (ro)¶
Control Conversions:
roscontrols: Convert toggle to “N”/“Y”Checkbox “1” ? “N” (No)
Checkbox “0” ? “Y” (Yes)
roqcontrols: Convert toggle to “L”/“R”Toggle “1” ? “L” (Left)
Toggle “0” ? “R” (Right)
Weld Detail/Connection (wd, wc)¶
Direction Conversion:
wdq/wcqcontrols: “L”/“R” based on face toggleFace “1” ? “L” (Left face)
Face “0” ? “R” (Right face)
Weld Connection Specific (wc):
; Complex logic for weld type selection
(set (read (car n)) (itoa (cadr (assoc (nth (atoi (get_tile (strcat "wcz" (substr (car n) 4)))) wctl) wczl))))
Fields Auto-Populated:
wcw- Weld width (from wcl lookup)wch- Weld height (from wcl lookup)wcy- Weld Y-offset (from wcl lookup)
Edge Selection:
wcscontrols: Multi-selection ? “L R T B” or “none”
Dowel/Rebar (dr)¶
Direction Conversions:
drs: Left/Right toggledrq: Face selection (L/R)
Ledger Beam (lb) & Tilt Panel (tp)¶
Beam Size Selection:
; Extract from beam size lists
(set (read (car n)) (nth (atoi (get_tile (car n))) bxl)) ; X dimension
(set (read (car n)) (strcat (nth ... byl) " X " (nth ... bzl))) ; Y x Z
Weld Connection Type:
; Lookup weld connection ID from type name
(if (assoc (nth (atoi (get_tile (car n))) wctl) wczl)
(set (read (car n)) (itoa (cadr (assoc ... wczl))))
(set (read (car n)) "0"))
Embed Array Validation:
If no weld type + embed array: Turn off ledger
Alert: “No Embed Type selected for Ledger Array #X\nLedger has been turned OFF”
Direction Toggles:
lbs/tps: Up/Down based onvtogglelbp/tpp: Up/Down based onutogglelbh: Down/Norm based on checkbox
Foundation Head (fh)¶
Multi-Selection Logic:
(set (read (car n)) "")
(if (= (get_tile (strcat "l" (substr (car n) 4))) "1")
(set (read (car n)) (strcat (eval (read (car n))) "L")))
(if (= (get_tile (strcat "r" (substr (car n) 4))) "1")
(set (read (car n)) (strcat (eval (read (car n))) "R")))
; Result: "", "L", "R", or "LR"
Direction Controls:
fho: Up/Down ? “U”, “D”, “UD”, or default “D”fhq: Left/Right facefhi: Include/Exclude ? “N”/“Y”
Size Lists:
fhx: Fromfxl(foundation X dimensions)fhz: Fromfsl(foundation slopes/sizes)
Chamfer (ch)¶
Direction Selection:
(cond ((= (get_tile (strcat "u" (substr (car n) 4))) "1") (set (read (car n)) "up"))
((= (get_tile (strcat "d" (substr (car n) 4))) "1") (set (read (car n)) "down"))
((= (get_tile (strcat "b" (substr (car n) 4))) "1") (set (read (car n)) "both")))
Size Selection:
(cond ((= (get_tile (strcat "2" (substr (car n) 4))) "1") (set (read (car n)) "1/2\""))
((= (get_tile (strcat "4" (substr (car n) 4))) "1") (set (read (car n)) "3/4\""))
((= (get_tile (strcat "1" (substr (car n) 4))) "1") (set (read (car n)) "1\"")))
Slab Base (sb)¶
Dimension Validation:
(if (not (distof (eval (read (car n)))))
(set (read (car n)) "0\""))
Edge Multi-Selection:
sbs: L, R, T, B combinations ? “L R T B” or “N”
Position:
sbp: Up/Downsbi: Include/Exclude ? “0”/“1”
Material:
sbm: Material/Embed ? “L”/“E”/” “
Note Block (nb)¶
Block Type:
nbb: Circle/Angle/Triangle ? “C”/“A”/“T”
Material/Position:
Same as Slab Base (
sbm,sbp,sbq)
Base Plate/Panel Parameters (bp, pp)¶
Face Direction:
bpq/ppq: Left/Right face
Default Handling:
If
bpr/pprorbpc/ppcnil: Set to “0”
Weld Connection Cancel (wccan)¶
Special Restore Logic:
(set (read(car n))(cdr n)) ; Restore from saved values
(set 'wcl wclold) ; Restore weld connection list
(set 'wcxl wcxlold) ; Restore weld X list
(set 'wczl wczlold) ; Restore weld Z list
(set 'wctl wctlold) ; Restore weld control list
File Operations¶
Weld Connection File Save¶
When: ok = “mp” (mix profile) triggers ok = “ok”
Files Updated:
wcl.txt- Current session weld connections(set 'f (open (strcat curdir "wcl.txt") "w")) (while (<= n wcxn) (if (assoc n wcl) (print (assoc n wcl) f)))
wclsav.txt- Saved weld connections library; Merge current wcl with wclsav ; Update existing, add new ; Write consolidated list
Purpose: Persist user-defined weld connections for reuse across sessions.
Global Variables Used¶
Input (Read)¶
ok- Dialog type identifier (“mp”, “ro”, “wd”, etc.)panelvar- List of control specifications for dialog typeControl-specific lists:
bxl,byl,bzl- Beam size listsfxl,fsl- Foundation size listswcl,wczl,wctl- Weld connection listsscl- Scale list
Output (Modified)¶
All control variables (e.g.,
mptp,roq1,wct1, etc.)wcl.txtandwclsav.txtfileswclsav,wclnew- Temporary weld connection processing
Saved for Restoration¶
wclold,wcxlold,wczlold,wctlold- Weld connection state for cancel
Control Naming Patterns¶
Pattern Analysis¶
Control Name: [prefix][type][number]
Common Types (3rd character):
s- Side/Edge selection (multi)q- Left/Right faceo- Up/Down orientationp- Position (up/down)i- Include/Excludex,y,z- Dimensional coordinatesd- Directione- Elevationm- Materialh- Heightc- Connection typeb- Block type
Performance Considerations¶
Complexity¶
Time Complexity: O(n×d) where n = controls, d = dialog-specific logic depth
Typical Runtime: 10-50ms depending on dialog type
Bottleneck: File I/O for weld connection save
Optimization Opportunities¶
Limited:
File operations only when needed (wcl save on specific dialogs)
Most logic is unavoidable conversion/validation
Could cache dialog type checks
Known Issues & Limitations¶
Issue 1: Massive Switch Statement¶
Problem: 15+ separate cond branches for dialog types
Impact: Difficult to maintain, high cyclomatic complexity
Architectural Decision: Acceptable for v3.60 era (no OOP available)
Issue 2: No Error Handling¶
Problem: Assumes all controls and lists exist
Impact: Can fail silently if dialog/variable mismatch
Mitigation: Careful dialog/LSP synchronization required
Issue 3: Magic String Comparisons¶
Problem: Dialog types identified by 2-character strings
Impact: Typos cause silent failures
Example: (= ok "mp") vs (= ok "MP") - case sensitive!
Testing & Validation¶
Test Scenarios¶
Test 1: Basic Variable Update
1. Open panel parameters dialog
2. Enter values in fields
3. Click OK
4. Verify: Global variables updated
5. Verify: Values match input
Test 2: Weld Connection Save
1. Open mix profile dialog
2. Modify weld connections
3. Click OK
4. Verify: wcl.txt created/updated
5. Verify: wclsav.txt appended
Test 3: Cancel Restoration
1. Open weld connection dialog
2. Modify values
3. Set ok = "wccan"
4. Run (updvar)
5. Verify: Original values restored
Test 4: Embed Array Validation
1. Mix profile: Arch top + embed array
2. Click OK
3. Verify: Alert displayed
4. Verify: mptp reset to "0"
Version Differences¶
v3.60 vs v7.0¶
Aspect |
v3.60 |
v7.0 |
Notes |
|---|---|---|---|
File Exists |
? Yes |
Likely yes |
Core functionality |
Size |
383 lines |
Unknown |
May have new dialogs |
Dialog Types |
15+ types |
Unknown |
v7.0 adds rebar, site |
Weld File Save |
wcl.txt |
Unknown |
May use different format |
Speculation: v7.0 likely adds branches for new dialogs (rb_dlg, site_dlg) and may consolidate some logic.
Document Metadata¶
Status: Comprehensive analysis from source code
Last Updated: 2026-01-20
Analysis Method: Source code review + pattern analysis
Completeness: 90% (all dialog types documented, some list structures inferred)
End of Document