autocad/layout-base.lsp
2025-07-23 20:57:16 +04:00

232 lines
6.5 KiB
Common Lisp

(defun clearDrawing ( / ss)
;; Select all non-locked, visible entities and delete them
(setq ss (ssget "_X" '((0 . "*")))) ; select all
(if ss
(progn
(command "_.erase" ss "")
(princ "\nDrawing cleared.")
)
)
)
(defun insertBlockAt (blockName basePt targetPt)
(command "_.-INSERT" blockName basePt 1 1 0)
(setq ent (entlast))
(vla-move (vlax-ename->vla-object ent)
(vlax-3d-point basePt)
(vlax-3d-point targetPt))
ent
)
(defun labelBlockLines (block startNum)
(foreach att (vlax-invoke block 'GetAttributes)
(setq tag (strcase (vla-get-tagstring att)))
(if (wcmatch tag "LINE*")
(progn
(setq idx (atoi (substr tag 5)))
(setq labelNum (+ startNum (- idx 1)))
(setq labelStr (if (< labelNum 10)
(strcat "0" (itoa labelNum))
(itoa labelNum)))
(setq basePt (vlax-get att 'InsertionPoint))
(setq labelPt (list (+ (car basePt) 0.55) (- (cadr basePt) 0.05) (caddr basePt)))
(entmake
(list
(cons 0 "TEXT")
(cons 8 "0")
(cons 7 "WD")
(cons 62 7)
(cons 10 labelPt)
(cons 11 labelPt)
(cons 40 0.13)
(cons 72 1)
(cons 73 1)
(cons 1 labelStr)
(cons 50 0.0)
(cons 100 "AcDbEntity")
(cons 100 "AcDbText")
(cons 100 "AcDbText")
)
)
)
)
)
)
(defun setDESCAtoSpare (block)
(foreach att (vlax-invoke block 'GetAttributes)
(setq tag (strcase (vla-get-tagstring att)))
(if (wcmatch tag "DESCA*")
(vla-put-textstring att "SPARE")
)
)
)
(defun placeDeviceLabel (vlaBlock / insPt labelText labelPt ent)
(setq insPt (vlax-get vlaBlock 'InsertionPoint))
(setq labelPt (list (+ (car insPt) 3.6) (+ (cadr insPt) 1.2) (caddr insPt)))
(setq labelText
(cond
((wcmatch (strcase (vla-get-effectivename vlaBlock)) "*POWERFLEX*") "APF")
((wcmatch (strcase (vla-get-effectivename vlaBlock)) "*SIO*") "SIO")
(T "")
)
)
(if (/= labelText "")
(progn
;; Create text entity with alignment point for justification
(setq ent (entmakex
(list
(cons 0 "TEXT")
(cons 8 "0")
(cons 7 "WD")
(cons 62 7) ;; white color
(cons 10 labelPt) ;; insertion point
(cons 11 labelPt) ;; alignment point (required for vertical just >0)
(cons 40 0.5)
(cons 72 0) ;; Horizontal Left
(cons 73 3) ;; Vertical Top
(cons 1 labelText)
(cons 50 0.0) ;; rotation angle
)
))
)
)
)
;; Function to read device list from a text file
(defun readDeviceListFromFile ( / file filePath line result)
;; Open file dialog for user to pick device list text file
(setq filePath (getfiled "Select Device List File" "" "txt" 0))
(if filePath
(progn
(setq file (open filePath "r"))
(while (setq line (read-line file))
(setq result (append result (list (strcase (vl-string-trim " \t\r\n" line)))))
)
(close file)
result
)
nil
)
)
;; Function to chunk a list into sublists of specified size
(defun chunk-list (lst size / result chunk)
(while lst
(setq chunk (vl-remove-if 'null (list (nth 0 lst) (nth 1 lst) (nth 2 lst) (nth 3 lst))))
(setq result (append result (list chunk)))
(setq lst (cddddr lst))
)
result
)
;; Function to read device list from file and return as a list
(defun placeDevicesInLayout (layoutStartX devices / basePt positions i blk pos ent)
(setq basePt "0,0,0")
(setq positions (list
(list (+ layoutStartX 9.63) 9.5 0.0) ;; A
(list (+ layoutStartX 9.63) -1.5 0.0) ;; B
(list (+ layoutStartX 28.88) 9.5 0.0) ;; C
(list (+ layoutStartX 28.88) -1.5 0.0) ;; D
))
(setq i 0)
(while (< i (length devices))
(setq device (nth i devices))
(setq blk
(cond
((vl-string-search "APF" device) "PLCIO_ARMORPOWERFLEX")
((vl-string-search "SIO" device) "PLCIO_ARMORBLOCK_SIO")
(T nil)
)
)
(if blk
(progn
(setq pos (nth i positions))
(command "_.-INSERT" blk basePt 1 1 0)
(setq ent (entlast))
(if ent
(progn
(setq vlaEnt (vlax-ename->vla-object ent))
(vla-move vlaEnt (vlax-3d-point 0 0 0) (vlax-3d-point pos))
(setDESCAtoSpare vlaEnt)
(placeDeviceLabel vlaEnt)
)
(princ (strcat "\nFailed to insert block: " blk))
)
)
)
(setq i (1+ i))
)
)
(defun c:init_layout_base ( / layoutData groupedData layoutCount offsetX i currentOffset basePt ptLeft ptRight leftEnt rightEnt leftBlock rightBlock labelPt)
;; Read layout from file
(setq layoutData (readDeviceListFromFile)) ; from previous step
(setq groupedData (chunk-list layoutData 4))
(setq layoutCount (length groupedData))
;; Clear drawing and setup
(clearDrawing)
(setq oldAttReq (getvar "ATTREQ"))
(setvar "ATTREQ" 0)
(setq offsetX 38.5)
;; Layout loop
(setq i 0)
(while (< i layoutCount)
(setq currentOffset (* i offsetX))
;; Draw outer box
(command "_.PLINE" (list (+ 0 currentOffset) -11.0))
(command (list (+ 38.5 currentOffset) -11.0))
(command (list (+ 38.5 currentOffset) 11.0))
(command (list (+ 0 currentOffset) 11.0))
(command "C")
;; Side and center lines
(command "_.PLINE" (list (+ 0 currentOffset) -11.0) (list (+ 0 currentOffset) 11.0) "")
(command "_.PLINE" (list (+ 38.5 currentOffset) -11.0) (list (+ 38.5 currentOffset) 11.0) "")
(command "_.PLINE" (list (+ 19.25 currentOffset) -11.0) (list (+ 19.25 currentOffset) 11.0) "")
;; Insert 20_zone blocks
(setq basePt '(0 0 0))
(setq ptLeft (list (+ 0.75 currentOffset) 9.5 0))
(setq ptRight (list (+ 20.0 currentOffset) 9.5 0))
(setq leftEnt (insertBlockAt "20_zone" basePt ptLeft))
(setq leftBlock (vlax-ename->vla-object leftEnt))
(labelBlockLines leftBlock 1)
(setq rightEnt (insertBlockAt "20_zone" basePt ptRight))
(setq rightBlock (vlax-ename->vla-object rightEnt))
(labelBlockLines rightBlock 21)
;; Add layout label
(setq labelPt (list (+ currentOffset 14.0) 16.0 0.0))
(command "_.text" labelPt 1.5 0 (strcat "Layout " (itoa (1+ i))))
;; Insert actual devices from group
(placeDevicesInLayout currentOffset (nth i groupedData))
(setq i (1+ i))
)
;; Reset
(command "_.color" "BYLAYER")
(setvar "ATTREQ" oldAttReq)
(princ (strcat "\n" (itoa layoutCount) " layouts created from file."))
(princ)
)