232 lines
6.5 KiB
Common Lisp
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)
|
|
)
|
|
|