modifications in some codes. feat: made new lsp that will take the data from the sorter file and do all the stuff in the autocad

This commit is contained in:
Salijoghli 2025-10-06 11:34:28 +04:00
parent 22c335e06e
commit c042a34879
9 changed files with 2295 additions and 638 deletions

934
BNA8/automation-master.lsp Normal file
View File

@ -0,0 +1,934 @@
;;; automation-master-sequential.lsp
;;; Sequential CSV reading by TAGNAME, place blocks and populate attributes immediately.
;;; devlay_update section starts here
(defun disable-snap-states ()
"Turn OFF Osnap, Ortho, and Object Snap Tracking"
;; Turn OFF Osnap using system variable
(setvar "OSMODE" 0)
(princ "\n<Osnap off>")
;; Turn OFF Ortho
(command "ORTHO" "OFF")
(princ "\n<Ortho off>")
;; Turn OFF Object Snap Tracking using system variable
(setvar "AUTOSNAP" (boole 6 (getvar "AUTOSNAP") 2)) ; Turn off tracking bit
(princ "\n<Object Snap Tracking off>")
(princ "\nSnap states disabled...")
)
(defun enable-snap-states ()
"Turn ON Osnap, Ortho, and Object Snap Tracking"
;; Turn ON Osnap using system variable (common snap modes)
(setvar "OSMODE" 4133) ; Common snap modes: endpoint, midpoint, center, intersection, etc.
(princ "\n<Osnap on>")
;; Turn ON Ortho
(command "ORTHO" "ON")
(princ "\n<Ortho on>")
;; Turn ON Object Snap Tracking using system variable
(setvar "AUTOSNAP" (boole 7 (getvar "AUTOSNAP") 2)) ; Turn on tracking bit
(princ "\n<Object Snap Tracking on>")
(princ "\nSnap states enabled...")
)
;; Function to get attribute value by tag from a list of attributes
(defun getAttVal (attList tag)
(setq tag (strcase tag))
(setq a (vl-some
(function
(lambda (a)
(if (= (strcase (vla-get-tagstring a)) tag)
a
)
)
)
attList
))
(if a
(strcase (vl-string-trim " " (vla-get-textstring a)))
""
)
)
;; Function to get attribute object by tag from a list of attributes
(defun getAttObj (attList tag)
(setq tag (strcase tag))
(vl-some
(function
(lambda (a)
(if (= (strcase (vla-get-tagstring a)) tag)
a
)
)
)
attList
)
)
;; Function to move TAG1 attribute up and left by 0.5 units
(defun moveTag1UpLeft (block / att basePt newPt)
(foreach att (vlax-invoke block 'GetAttributes)
(if (= (strcase (vla-get-tagstring att)) "TAG1")
(progn
(setq basePt (vlax-get att 'InsertionPoint))
(setq newPt (list (+ (car basePt) 0.5) (+ (cadr basePt) 0.5) (caddr basePt)))
(vlax-put att 'InsertionPoint newPt)
(if (vlax-property-available-p att 'AlignmentPoint)
(vlax-put att 'AlignmentPoint newPt)
)
(if (vlax-property-available-p att 'TextAlignmentPoint)
(vlax-put att 'TextAlignmentPoint newPt)
)
(vlax-put att 'Color 2)
)
)
)
)
;; Function to set attribute value in a block
(defun setBlockAttr (block tag value)
(foreach att (vlax-invoke block 'GetAttributes)
(if (= (strcase (vla-get-tagstring att)) (strcase tag))
(vla-put-textstring att value)
)
)
)
;; Function to build pairs of DESCA blocks
(defun build-pairs (maxNum)
(setq result '())
(setq n 1)
(while (<= n maxNum)
(setq a (strcat "DESCA" (if (< n 10) (strcat "0" (itoa n)) (itoa n))))
(setq next (+ n 1))
(if (<= next maxNum)
(setq b (strcat "DESCA" (if (< next 10) (strcat "0" (itoa next)) (itoa next))))
(setq b "")
)
(setq result (append result (list (list a b))))
(setq n (+ n 2))
)
result
)
;; Function to delete existing blocks
(defun delete-existing-devlay-blocks ( / blockNames ss i ent obj)
(setq blockNames '(
"HC01_CORDSET_STR-STR_STRAIGHT"
"CORDSET_STR-STR_1DEVICE PER PORT"
"HC01_SPLITTER"
"HC01_SPLITTER(RIGHT)"
))
(foreach blkName blockNames
(setq ss (ssget "X" (list (cons 0 "INSERT") (cons 2 blkName))))
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq obj (vlax-ename->vla-object ent))
(vla-delete obj)
(setq i (1+ i))
)
)
)
)
;; Delete all red circles (used as error indicators)
(setq ss (ssget "_X" '((0 . "CIRCLE") (62 . 1)))) ; 62=1 → red
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq obj (vlax-ename->vla-object ent))
(vla-delete obj)
(setq i (1+ i))
)
)
)
)
;; Function to process each block type
(defun process-block-type (blkName maxDesca)
(setq filter (list (cons 0 "INSERT") (cons 2 blkName)))
(setq sioLikeBlocks '("PLCIO_ARMORBLOCK_SIO" "PLCIO_ARMBLOCK_FIOM" "PLCIO_ARMORBLOCK_FIOH"))
(setq mirrorThreshold (if (member blkName sioLikeBlocks) 9 7))
(setq ss (ssget "X" filter))
;; Initialize pairs of attributes for DESCA blocks
(if ss
(progn
(princ (strcat "\n[devlay_update] Found blocks named \"" blkName "\"."))
(setq pairs (build-pairs maxDesca))
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq attList (vlax-invoke (vlax-ename->vla-object ent) 'GetAttributes))
(foreach pair pairs
(setq val1 (getAttVal attList (car pair)))
(setq val2 (getAttVal attList (cadr pair)))
;; Treat "SPARE" as empty
(if (= val1 "SPARE") (setq val1 ""))
(if (= val2 "SPARE") (setq val2 ""))
;; Case 1: both have values (pairs)
(if (and (/= val1 "") (/= val2 ""))
(progn
(setq att1 (getAttObj attList (car pair)))
(setq att2 (getAttObj attList (cadr pair)))
(if (and att1 att2)
(progn
(setq oldAttdia (getvar "ATTDIA"))
(setq oldAttreq (getvar "ATTREQ"))
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 0)
(setq pt1 (vlax-get att1 'InsertionPoint))
(setq pt2 (vlax-get att2 'InsertionPoint))
(setq tagNum (atoi (substr (car pair) 6)))
(setq xOffset (if (< tagNum mirrorThreshold) 4.5 -0.7))
(setq shiftRightX (if (= tagNum 7) 2.0 0.0))
(setq x1 (+ (car pt1) xOffset shiftRightX))
(setq xCordset (if (>= tagNum mirrorThreshold) (- x1 0.13) x1))
(setq y1 (+ (cadr pt1) 0.1))
(setq newPt1 (list xCordset y1 0.0))
;; NEW: Check if block is FIO or FIOH
(if (or (= blkName "PLCIO_ARMBLOCK_FIOM") (= blkName "PLCIO_ARMORBLOCK_FIOH"))
(progn
(setq newPt1Adjusted
(if (>= tagNum mirrorThreshold)
;; Right side
(list (- (car newPt1) 1.4571) (- (cadr newPt1) 0.6375) (caddr newPt1))
;; Left side
(list (+ (car newPt1) 0.7) (- (cadr newPt1) 0.6375) (caddr newPt1))
)
)
;; Additional shift if TAG7 or TAG8
(if (or (= tagNum 7) (= tagNum 8))
(setq newPt1Adjusted
(list
(- (car newPt1Adjusted) 2.0)
(cadr newPt1Adjusted)
(caddr newPt1Adjusted)
)
)
)
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1Adjusted 1 1 0)
(setq newBlock1 (vlax-ename->vla-object (entlast)))
(setq tagnumStr (substr (car pair) 6))
(setq tagnum (atoi tagnumStr))
(setq taga1
(if (= blkName "PLCIO_ARMORBLOCK_FIOH")
(progn
(setq evenNum (if (= (rem tagnum 2) 0) tagnum (+ tagnum 1)))
(setq evenTagStr (if (< evenNum 10) (strcat "0" (itoa evenNum)) (itoa evenNum)))
;; Remove last two chars from TAGA value
(setq val (getAttVal attList (strcat "TAGA" evenTagStr)))
(substr val 1 (- (strlen val) 2))
)
(getAttVal attList (strcat "TAGA" tagnumStr))
)
)
(setBlockAttr newBlock1 "TAG1" taga1)
)
(progn
;; EXISTING CODE for all other blocks
(if (and val1 val2
(or (and (vl-string-search "SEL" val1) (vl-string-search "SEL" val2))
(and (vl-string-search "DPM" val1) (vl-string-search "DPM" val2))
;; NEW: Additional conditions for single straight block
(and (vl-string-search "VFD" val1) (vl-string-search "STO" val1)
(vl-string-search "VFD" val2) (vl-string-search "STO" val2))
(and (vl-string-search "JR" val1) (vl-string-search "_PB" val1) (vl-string-search "JR" val2) (vl-string-search "_PB_LT" val2))
(and (vl-string-search "EPC" val1) (vl-string-search "EPC" val2))
(and (vl-string-search "SSP" val1) (vl-string-search "SSP" val2))))
(progn
;; Insert single straight block
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1 1 1 0)
(setq newBlock (vlax-ename->vla-object (entlast)))
;; Set TAG1 attribute
(setq tagnumStr (substr (car pair) 6))
(setq taga (getAttVal attList (strcat "TAGA" tagnumStr)))
(setBlockAttr newBlock "TAG1" taga)
;; Mirror if needed
(setq tagNum (atoi tagnumStr))
(setq finalBlock newBlock) ; assume no mirror
(if (>= tagNum mirrorThreshold)
(progn
(command "_MIRROR" (vlax-vla-object->ename newBlock) "" newPt1 (list (car newPt1) (+ (cadr newPt1) 0.1)) "N")
(entdel (vlax-vla-object->ename newBlock))
(setq finalBlock (vlax-ename->vla-object (entlast))) ; update to mirrored block
)
)
;; === NEW: Move single straight block left/right depending on side ===
(if (or (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(and (member blkName sioLikeBlocks) (>= tagNum 8)))
;; Right side: move left 1 unit
(progn
(setq basePt (vlax-get finalBlock 'InsertionPoint))
(setq targetPt (list (- (car basePt) 0.5) (cadr basePt) (caddr basePt)))
(vla-move finalBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
;; Left side: move right 0.5 unit
(if (or (and (= blkName "PLCIO_ARMORPOWERFLEX") (<= tagNum 7))
(and (member blkName sioLikeBlocks) (< tagNum 8)))
(progn
(setq basePt (vlax-get finalBlock 'InsertionPoint))
(setq targetPt (list (+ (car basePt) 1.0) (cadr basePt) (caddr basePt)))
(vla-move finalBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
)
)
;; === END NEW ===
;; Move all SEL blocks 1 unit down. Also move 4 units left for DESCA07 - 09 (SIO)
(setq shiftX (if (>= tagNum mirrorThreshold) -3 0))
(setq shiftY -0.5)
;; Get current position of block (not assuming newPt1 anymore)
(setq basePt (vlax-get finalBlock 'InsertionPoint))
(setq targetPt (list (+ (car basePt) shiftX)
(+ (cadr basePt) shiftY)
(caddr basePt)))
(vla-move finalBlock
(vlax-3d-point basePt)
(vlax-3d-point targetPt))
)
(progn
;; ELSE part: Insert two straight blocks + splitter
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1 1 1 0)
(setq newBlock1 (vlax-ename->vla-object (entlast)))
(setq taga1 (getAttVal attList (strcat "TAGA" (substr (car pair) 6))))
(setBlockAttr newBlock1 "TAG1" taga1)
(setq y2 (+ (cadr pt2) 0.1))
(setq newPt2 (list xCordset y2 0.0))
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt2 1 1 0)
(setq newBlock2 (vlax-ename->vla-object (entlast)))
(setq taga2 (getAttVal attList (strcat "TAGA" (substr (cadr pair) 6))))
(setBlockAttr newBlock2 "TAG1" taga2)
(setq x3 (+ x1 (if (< tagNum mirrorThreshold) 1.25 -1.25)))
(setq y3 (/ (+ y1 y2) 2.0))
(setq newPt3 (list x3 y3 0.0))
(if (< tagNum mirrorThreshold)
(command "_-INSERT" "HC01_SPLITTER" newPt3 1 1 0)
(progn
(command "_-INSERT" "HC01_SPLITTER(RIGHT)" newPt3 1 1 0)
(setq splitterEnt (vlax-ename->vla-object (entlast)))
(setq newPos (list (- x3 2.2) (+ y3 0.0) 0.0))
(vla-move splitterEnt (vlax-3d-point newPt3) (vlax-3d-point newPos))
)
)
;; Extra adjustment for Powerflex DESCA07+ (move all 3 blocks left, splitter up)
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(progn
(setq newX1 (- (car newPt1) 1.8))
(setq newX2 (- (car newPt2) 1.8))
(setq newX3 (- (car newPt3) 1.8))
(setq newY3 (+ (cadr newPt3) 0.0)) ; splitter up
(vla-move newBlock1 (vlax-3d-point newPt1) (vlax-3d-point newX1 (cadr newPt1) (caddr newPt1)))
(vla-move newBlock2 (vlax-3d-point newPt2) (vlax-3d-point newX2 (cadr newPt2) (caddr newPt2)))
(vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point newPt3) (vlax-3d-point newX3 newY3 (caddr newPt3)))
)
)
;; If this is the second block type, shift blocks closer together
(if (member blkName sioLikeBlocks)
(progn
(setq moveVecX
(if (or (= tagNum 7) (= tagNum 8))
-1.5
(if (< tagNum mirrorThreshold) 0.5 -1.4)
)
) ; inward move
;; Additional right shift of 0.5 for SIO-like blocks on right side (tagNum >= 9)
(setq rightShift (if (and (member blkName sioLikeBlocks) (>= tagNum 9)) 0.5 0.0))
;; Additional downward shift of 0.5 for SIO-like blocks on right side (tagNum >= 9)
(setq downShift (if (and (member blkName sioLikeBlocks) (>= tagNum 9)) 0.1 0.0))
(setq newX1 (+ (car newPt1) moveVecX rightShift))
(setq newX2 (+ (car newPt2) moveVecX rightShift))
(setq newX3
(if (or (= tagNum 7) (= tagNum 8))
(+ (car newPt3) -1.5 rightShift)
(+ (car newPt3) moveVecX rightShift)
)
)
(setq newY1 (- (cadr newPt1) downShift))
(setq newY2 (- (cadr newPt2) downShift))
(setq newY3
(if (or (= tagNum 7) (= tagNum 8))
(+ (cadr newPt3) -0.015 downShift)
(- (cadr newPt3) downShift)
)
)
(vla-move newBlock1 (vlax-3d-point newPt1) (vlax-3d-point newX1 newY1 (caddr newPt1)))
(vla-move newBlock2 (vlax-3d-point newPt2) (vlax-3d-point newX2 newY2 (caddr newPt2)))
(vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point newPt3) (vlax-3d-point newX3 newY3 (caddr newPt3)))
)
)
)
)
)
)
(setvar "ATTDIA" oldAttdia)
(setvar "ATTREQ" oldAttreq)
)
)
)
)
;; Case 2: single value only
(if (and (/= val1 "") (= val2 ""))
(progn
(setq attTag (if (/= val1 "") (car pair) (cadr pair)))
(setq attObj (getAttObj attList attTag))
(if attObj
(progn
(setq oldAttdia (getvar "ATTDIA"))
(setq oldAttreq (getvar "ATTREQ"))
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 0)
(setq pt (vlax-get attObj 'InsertionPoint))
(setq tagNum (atoi (substr attTag 6)))
(setq xOffset (if (< tagNum mirrorThreshold) 5.5 -5.0))
(setq x (+ (car pt) xOffset))
(setq y (- (cadr pt) 0.5))
(setq xAdjust
(if (and (member blkName sioLikeBlocks) (>= tagNum 9))
0.0 ; right side → move slightly left
(if (member blkName sioLikeBlocks)
0.7 ; left side → move slightly right
0.0 ; other blocks → no change
)
)
)
;; Extra right shift for Powerflex DESCA07+
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(setq xAdjust (+ xAdjust 1.0))
)
(setq insPt (list (+ x xAdjust) y 0.0))
;; For PLCIO_ARMORPOWERFLEX, special DESCA11 block placement
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11))
(setq insPt (list (+ x 2.0) (+ y 0.5) 0.0))
)
;; Insert proper block based on conditions
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11))
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" insPt 1 1 0) ; old block special single
(command "_-INSERT" "CORDSET_STR-STR_1DEVICE PER PORT" insPt 1 1 0) ; other singles
)
(setq newEnt (entlast))
(setq newBlock (vlax-ename->vla-object newEnt))
;; FIX: Keep string version for TAGA, convert to int for comparisons
(setq tagnumStr (substr attTag 6))
(setq tagnum (atoi tagnumStr))
(setq taga
(if (= blkName "PLCIO_ARMORBLOCK_FIOH")
(progn
(setq evenNum (if (= (rem tagnum 2) 0) tagnum (+ tagnum 1)))
(setq evenTagStr (if (< evenNum 10) (strcat "0" (itoa evenNum)) (itoa evenNum)))
(getAttVal attList (strcat "TAGA" evenTagStr))
)
(getAttVal attList (strcat "TAGA" tagnumStr))
)
)
(setBlockAttr newBlock "TAG1" taga)
;; For non-special single blocks, move attribute
(if (not (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11)))
(moveTag1UpLeft newBlock)
)
; Mirror blocks for DESCA07 and above except special single DESCA11
; FIX: Use tagnum (integer) instead of comparing with string
(if (and (>= tagnum mirrorThreshold)
(not (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagnum 11))))
(progn
(command "_MIRROR" newEnt "" insPt (list (car insPt) (+ (cadr insPt) 0.1)) "N")
(entdel newEnt)
(setq newBlock (vlax-ename->vla-object (entlast)))
)
)
;; === NEW: Move single straight block left/right depending on side ===
(if (or (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagnum 7))
(and (member blkName sioLikeBlocks) (>= tagnum 8) (= tagnum 15)))
;; Right side: move left 1 unit (only for last DESCA in SIO-like blocks)
(progn
(setq basePt (vlax-get newBlock 'InsertionPoint))
(setq targetPt (list (+ (car basePt) 0.5) (cadr basePt) (caddr basePt)))
(vla-move newBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
)
;; === NEW: Move SIO-like single blocks on left side to the left ===
(if (and (member blkName sioLikeBlocks) (< tagnum 8))
;; Left side SIO-like blocks: move left 0.5 unit
(progn
(setq basePt (vlax-get newBlock 'InsertionPoint))
(setq targetPt (list (- (car basePt) 0.7) (cadr basePt) (caddr basePt)))
(vla-move newBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
)
;; === END NEW ===
(setvar "ATTDIA" oldAttdia)
(setvar "ATTREQ" oldAttreq)
)
)
)
)
;; ELSE branch: val1 is empty, val2 has value → print warning
(if (and (= val1 "") (/= val2 ""))
(progn
(setq attTag (car pair)) ; Always expect the first attribute to be filled
(setq attObj (getAttObj attList attTag))
(if attObj
(progn
;; Insertion point of the attribute itself
(setq insPt (vlax-get attObj 'InsertionPoint))
;; Draw red circle to mark the issue
(entmakex
(list
(cons 0 "CIRCLE")
(cons 8 "0") ; Layer
(cons 10 insPt) ; Center at attribute
(cons 40 1.3) ; Radius
(cons 62 1) ; Red color
)
)
)
)
)
)
)
(setq i (1+ i))
)
)
(princ (strcat "\n[devlay_update] No blocks named \"" blkName "\" found."))
)
)
(defun devlay_update ()
(delete-existing-devlay-blocks)
(process-block-type "PLCIO_ARMORPOWERFLEX" 11)
(process-block-type "PLCIO_ARMORBLOCK_SIO" 16)
(process-block-type "PLCIO_ARMBLOCK_FIOM" 16)
(process-block-type "PLCIO_ARMORBLOCK_FIOH" 16)
(princ)
)
;;; devlay_update section ends here
;;; -----------------------
;;; Utilities
;;; -----------------------
(defun trim (s) (vl-string-trim " \t\n\r" s) )
(defun csv-first-field (line / pos)
(if (null line) ""
(progn
(setq pos (vl-string-search "," line))
(if pos (trim (substr line 1 pos)) (trim line))
)
)
)
(defun split-csv-line (line / start pos cols len cell)
(setq cols '())
(setq start 0)
(setq len (strlen line))
(while (and (< start len) (setq pos (vl-string-search "," line start)))
(setq cell (trim (substr line (+ start 1) (- pos start))))
;; remove surrounding double quotes if present
(if (and (> (strlen cell) 1)
(= (substr cell 1 1) "\"")
(= (substr cell (strlen cell) 1) "\""))
(setq cell (substr cell 2 (- (strlen cell) 2))))
(setq cols (append cols (list cell)))
;; move start to the character after the comma (pos is 0-based index of comma)
(setq start (+ pos 1))
)
;; handle last column: if start == len then last column is empty string
(if (<= start len)
(progn
(if (< start len)
(setq cell (trim (substr line (+ start 1) (- len start))))
(setq cell "") ; trailing comma -> empty last column
)
;; remove surrounding quotes on last cell too
(if (and (> (strlen cell) 1)
(= (substr cell 1 1) "\"")
(= (substr cell (strlen cell) 1) "\""))
(setq cell (substr cell 2 (- (strlen cell) 2))))
(setq cols (append cols (list cell)))
)
)
cols
)
(defun my-subseq (lst start end / result i len)
(setq result '())
(setq len (length lst))
(setq end (min end len))
(setq i start)
(while (< i end)
(setq result (append result (list (nth i lst))))
(setq i (1+ i))
)
result
)
;;; -----------------------
;;; Block helpers
;;; -----------------------
(defun insertBlockAt (blockName basePt targetPt)
(command "_.-INSERT" blockName basePt 1 1 0)
(setq ent (entlast))
(if ent
(progn
(vla-move (vlax-ename->vla-object ent)
(vlax-3d-point basePt)
(vlax-3d-point targetPt))
)
)
ent
)
(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"))
)
)
;;; -----------------------
;;; Attribute population (dynamic rows)
;;; csvData: list of rows belonging to this block (each row = list of columns)
;;; columns: 0=TAGNAME,1=ADDR,2=TERM,3=TERMDESC,4=DESCA,5=DESCB
;;; -----------------------
(defun populateBlockAttributes (block csvData / att tag1Attr attr attrName row i rowIndex numRows fmtIdx fldVal targetTag firstTag)
(setq att (vlax-invoke block 'GetAttributes))
(if (not att)
(progn (princ "\nWarning: block has no attributes.") )
(progn
;; TAG1 or TAG1F using first row's TAGNAME
(setq firstTag (if (and csvData (> (length csvData) 0)) (nth 0 (nth 0 csvData)) ""))
(setq tag1Attr (vl-some
(function (lambda (a)
(setq attrName (strcase (vla-get-tagstring a)))
(if (equal attrName "TAG1") a nil)))
att))
(if tag1Attr
(vla-put-textstring tag1Attr (strcase firstTag))
(progn
(setq tag1Attr (vl-some
(function (lambda (a)
(setq attrName (strcase (vla-get-tagstring a)))
(if (equal attrName "TAG1F") a nil)))
att))
(if tag1Attr (vla-put-textstring tag1Attr (strcase firstTag)))
)
)
;; dynamic number of rows for indexing
(setq numRows (length csvData))
(setq i 0)
(while (< i numRows)
(setq row (nth i csvData))
(setq rowIndex (1+ i))
;; format index as 01,02...09,10...
(setq fmtIdx (if (< rowIndex 10) (strcat "0" (itoa rowIndex)) (itoa rowIndex)))
;; ADDR -> TAGA##
(setq targetTag (strcat "TAGA" fmtIdx))
(setq attr (vl-some (function (lambda (a) (if (equal (strcase (vla-get-tagstring a)) targetTag) a nil))) att))
(setq fldVal (if (and row (>= (length row) 2)) (nth 1 row) ""))
(if attr (vla-put-textstring attr fldVal))
;; TERM -> TERM##
(setq targetTag (strcat "TERM" fmtIdx))
(setq attr (vl-some (function (lambda (a) (if (equal (strcase (vla-get-tagstring a)) targetTag) a nil))) att))
(setq fldVal (if (and row (>= (length row) 3)) (nth 2 row) ""))
(if attr (vla-put-textstring attr fldVal))
;; DESCA -> DESCA##
(setq targetTag (strcat "DESCA" fmtIdx))
(setq attr (vl-some (function (lambda (a) (if (equal (strcase (vla-get-tagstring a)) targetTag) a nil))) att))
(setq fldVal (if (and row (>= (length row) 5)) (nth 4 row) ""))
(if attr (vla-put-textstring attr fldVal))
;; DESCB -> DESCB##
(setq targetTag (strcat "DESCB" fmtIdx))
(setq attr (vl-some (function (lambda (a) (if (equal (strcase (vla-get-tagstring a)) targetTag) a nil))) att))
(setq fldVal (if (and row (>= (length row) 6)) (nth 5 row) ""))
(if attr (vla-put-textstring attr fldVal))
(setq i (1+ i))
)
;; update block to refresh attributes
(vlax-invoke (vlax-ename->vla-object (entlast)) 'Update)
)
)
)
;;; -----------------------
;;; Device placement — sequential TAGNAME grouping approach
;;; layoutDevices not precomputed: we use csvRows + csvIndex and group rows by TAGNAME
;;; -----------------------
(defun placeSequentialDevices (layoutStartX posIndex deviceTag blockRows / blk ent vlaEnt pos)
;; deviceTag = group TAGNAME (string)
;; blockRows = list of rows belonging to this block
;; choose block type by searching TAGNAME (case-insensitive)
(setq devUpper (strcase deviceTag))
(setq blk
(cond
((vl-string-search "APF" devUpper) "PLCIO_ARMORPOWERFLEX")
((vl-string-search "SIO" devUpper) "PLCIO_ARMORBLOCK_SIO")
((vl-string-search "FIOH" devUpper) "PLCIO_ARMORBLOCK_FIOH")
((vl-string-search "FIO" devUpper) "PLCIO_ARMBLOCK_FIOM")
(T nil)
)
)
;; positions arrays
(setq positions (list
(list 9.63 9.5 0.0)
(list 9.63 -1.5 0.0)
(list 28.88 9.5 0.0)
(list 28.88 -1.5 0.0)))
(setq positionsB (list
(list 9.6 9.5 0.0)
(list 9.6 -1.5 0.0)
(list 28.9666 9.5 0.0)
(list 28.9666 -1.5 0.0)))
(if blk
(progn
;; compute insertion pos using posIndex and layoutStartX
(setq pos (if (or (vl-string-search "FIOH" devUpper) (vl-string-search "FIO" devUpper))
(mapcar '+ (nth posIndex positionsB) (list layoutStartX 0 0))
(mapcar '+ (nth posIndex positions) (list layoutStartX 0 0))))
;; insert and fill
(insertBlockAt blk '(0 0 0) pos)
(setq ent (entlast))
(if ent
(progn
(setq vlaEnt (vlax-ename->vla-object ent))
(setDESCAtoSpare vlaEnt)
(populateBlockAttributes vlaEnt blockRows)
)
(princ (strcat "\nFailed to insert block: " blk))
)
)
(princ (strcat "\nWarning: could not determine block type for: " deviceTag))
)
)
;;; -----------------------
;;; 20_zone helpers (unchanged logic)
;;; -----------------------
(defun labelBlockLines (block startNum)
(setq counter 0)
(foreach att (vlax-invoke block 'GetAttributes)
(setq tag (strcase (vla-get-tagstring att)))
(if (wcmatch tag "LINE*")
(progn
(setq labelNum (+ startNum counter))
(setq labelStr (if (< labelNum 10) (strcat "0" (itoa labelNum)) (itoa labelNum)))
(setq basePt (vlax-get att 'InsertionPoint))
(setq blockPos (vlax-get block 'InsertionPoint))
(setq labelPt (list (+ (car blockPos) 0.12) (- (cadr basePt) 0.053) (caddr basePt)))
(entmakex (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)))
(setq counter (1+ counter))
)
)
)
)
(defun update20ZoneBlockAttributes (blockEnt layoutIndex startValue sideOffset / blockObj attrList attr attrName idx newValue formattedValue)
(setq blockObj (vlax-ename->vla-object blockEnt))
(setq attrList (vlax-invoke blockObj 'GetAttributes))
(foreach attr attrList
(setq attrName (vlax-get-property attr 'TagString))
(if (and (>= (strlen attrName) 5)
(= (substr attrName 1 4) "LINE")
(>= (atoi (substr attrName 5)) 1)
(<= (atoi (substr attrName 5)) 20))
(progn
(setq idx (atoi (substr attrName 5)))
(setq newValue (+ (atoi startValue) layoutIndex (- idx 1) sideOffset))
(setq formattedValue (strcat (itoa newValue) "."))
(vlax-put-property attr 'TextString formattedValue)
(vlax-invoke attr 'Update)
)
)
)
(vlax-invoke blockObj 'Update)
)
;;; -----------------------
;;; MAIN FUNCTION
;;; -----------------------
(defun c:init_layout ( / csvFile csvRows file line cols headerSkipped csvIndex totalRows layoutNum layoutStartX posIndex blocksLeft numBlocksInLayout layoutDevices firstTag currentTag blockRows)
(disable-snap-states)
;; select CSV
(setq csvFile (getfiled "Select source CSV file" "" "csv" 0))
(if (not csvFile) (progn (princ "\nNo CSV file selected. Aborting.") (princ))
(progn
;; read CSV lines into list, skipping header (first non-empty line)
(setq csvRows '())
(setq file (open csvFile "r"))
(setq headerSkipped nil)
(while (setq line (read-line file))
(if (not (= line ""))
(progn
(if headerSkipped
(progn
(setq cols (split-csv-line line))
(setq csvRows (append csvRows (list cols)))
)
(setq headerSkipped T) ; first non-empty row considered header and skipped
)
)
)
)
(close file)
;; prepare drawing
(setq oldAttReq (getvar "ATTREQ")) (setvar "ATTREQ" 0)
(setq offsetX 38.5)
;; user start index (keeps old behavior for 20_zone)
(setq startIndex (getstring "\nEnter starting line index (e.g. 01600): "))
;; sequential processing
(setq csvIndex 0)
(setq totalRows (length csvRows))
(setq layoutNum 0)
(setq posIndex 0) ; position within current layout (0..3)
(while (< csvIndex totalRows)
;; if starting a new layout (posIndex == 0) draw the layout box and 20_zone blocks
(if (= posIndex 0)
(progn
(setq layoutStartX (* layoutNum offsetX))
;; draw outer box and lines (same as before)
(command "_.PLINE" (list (+ 0 layoutStartX) -11.0))
(command (list (+ 38.5 layoutStartX) -11.0))
(command (list (+ 38.5 layoutStartX) 11.0))
(command (list (+ 0 layoutStartX) 11.0))
(command "C")
(command "_.PLINE" (list (+ 0 layoutStartX) -11.0) (list (+ 0 layoutStartX) 11.0) "")
(command "_.PLINE" (list (+ 38.5 layoutStartX) -11.0) (list (+ 38.5 layoutStartX) 11.0) "")
(command "_.PLINE" (list (+ 19.25 layoutStartX) -11.0) (list (+ 19.25 layoutStartX) 11.0) "")
;; Insert 20_zone left & right and label them
(setq basePt '(0 0 0))
(setq ptLeft (list (+ 0.75 layoutStartX) 9.5 0))
(setq ptRight (list (+ 20.0 layoutStartX) 9.5 0))
(setq leftEnt (insertBlockAt "20_zone" basePt ptLeft))
(if leftEnt
(progn
(setq leftBlock (vlax-ename->vla-object leftEnt))
(update20ZoneBlockAttributes leftEnt layoutNum startIndex 0)
(labelBlockLines leftBlock 1)
)
)
(setq rightEnt (insertBlockAt "20_zone" basePt ptRight))
(if rightEnt
(progn
(setq rightBlock (vlax-ename->vla-object rightEnt))
(update20ZoneBlockAttributes rightEnt layoutNum startIndex 0)
(labelBlockLines rightBlock 21)
)
)
;; layout label
(setq labelPt (list (+ layoutStartX 14.0) 16.0 0.0))
(command "_.text" labelPt 1.5 0 (strcat "Layout " (itoa (1+ layoutNum))))
)
) ; end layout start
;; read current row TAGNAME
(setq firstTag (nth 0 (nth csvIndex csvRows)))
(setq currentTag firstTag)
(setq blockRows (list (nth csvIndex csvRows)))
(setq csvIndex (1+ csvIndex))
;; collect following rows with same TAGNAME
(while (and (< csvIndex totalRows)
(equal (nth 0 (nth csvIndex csvRows)) currentTag))
(setq blockRows (append blockRows (list (nth csvIndex csvRows))))
(setq csvIndex (1+ csvIndex))
)
;; now we have blockRows (one or more rows) for currentTag
;; place block at current layoutStartX and posIndex
(placeSequentialDevices layoutStartX posIndex currentTag blockRows)
;; advance posIndex; if it reaches 4 start new layout
(setq posIndex (1+ posIndex))
(if (>= posIndex 4)
(progn (setq posIndex 0) (setq layoutNum (1+ layoutNum)))
)
) ; end while csvIndex < totalRows
;; cleanup
(setvar "ATTREQ" oldAttReq)
(command "_.color" "BYLAYER")
(princ (strcat "\nDone. Processed " (itoa layoutNum) " full layouts (plus partial last layout if any)."))
(princ)
)
)
(devlay_update)
(enable-snap-states)
(princ)
)

557
BNA8/devlay-v2.lsp Normal file
View File

@ -0,0 +1,557 @@
(defun disable-snap-states ()
"Turn OFF Osnap, Ortho, and Object Snap Tracking"
;; Turn OFF Osnap using system variable
(setvar "OSMODE" 0)
(princ "\n<Osnap off>")
;; Turn OFF Ortho
(command "ORTHO" "OFF")
(princ "\n<Ortho off>")
;; Turn OFF Object Snap Tracking using system variable
(setvar "AUTOSNAP" (boole 6 (getvar "AUTOSNAP") 2)) ; Turn off tracking bit
(princ "\n<Object Snap Tracking off>")
(princ "\nSnap states disabled...")
)
(defun enable-snap-states ()
"Turn ON Osnap, Ortho, and Object Snap Tracking"
;; Turn ON Osnap using system variable (common snap modes)
(setvar "OSMODE" 4133) ; Common snap modes: endpoint, midpoint, center, intersection, etc.
(princ "\n<Osnap on>")
;; Turn ON Ortho
(command "ORTHO" "ON")
(princ "\n<Ortho on>")
;; Turn ON Object Snap Tracking using system variable
(setvar "AUTOSNAP" (boole 7 (getvar "AUTOSNAP") 2)) ; Turn on tracking bit
(princ "\n<Object Snap Tracking on>")
(princ "\nSnap states enabled...")
)
;; Function to get attribute value by tag from a list of attributes
(defun getAttVal (attList tag)
(setq tag (strcase tag))
(setq a (vl-some
(function
(lambda (a)
(if (= (strcase (vla-get-tagstring a)) tag)
a
)
)
)
attList
))
(if a
(strcase (vl-string-trim " " (vla-get-textstring a)))
""
)
)
;; Function to get attribute object by tag from a list of attributes
(defun getAttObj (attList tag)
(setq tag (strcase tag))
(vl-some
(function
(lambda (a)
(if (= (strcase (vla-get-tagstring a)) tag)
a
)
)
)
attList
)
)
;; Function to move TAG1 attribute up and left by 0.5 units
(defun moveTag1UpLeft (block / att basePt newPt)
(foreach att (vlax-invoke block 'GetAttributes)
(if (= (strcase (vla-get-tagstring att)) "TAG1")
(progn
(setq basePt (vlax-get att 'InsertionPoint))
(setq newPt (list (+ (car basePt) 0.5) (+ (cadr basePt) 0.5) (caddr basePt)))
(vlax-put att 'InsertionPoint newPt)
(if (vlax-property-available-p att 'AlignmentPoint)
(vlax-put att 'AlignmentPoint newPt)
)
(if (vlax-property-available-p att 'TextAlignmentPoint)
(vlax-put att 'TextAlignmentPoint newPt)
)
(vlax-put att 'Color 2)
)
)
)
)
;; Function to set attribute value in a block
(defun setBlockAttr (block tag value)
(foreach att (vlax-invoke block 'GetAttributes)
(if (= (strcase (vla-get-tagstring att)) (strcase tag))
(vla-put-textstring att value)
)
)
)
;; Function to build pairs of DESCA blocks
(defun build-pairs (maxNum)
(setq result '())
(setq n 1)
(while (<= n maxNum)
(setq a (strcat "DESCA" (if (< n 10) (strcat "0" (itoa n)) (itoa n))))
(setq next (+ n 1))
(if (<= next maxNum)
(setq b (strcat "DESCA" (if (< next 10) (strcat "0" (itoa next)) (itoa next))))
(setq b "")
)
(setq result (append result (list (list a b))))
(setq n (+ n 2))
)
result
)
;; Function to delete existing blocks
(defun delete-existing-devlay-blocks ( / blockNames ss i ent obj)
(setq blockNames '(
"HC01_CORDSET_STR-STR_STRAIGHT"
"CORDSET_STR-STR_1DEVICE PER PORT"
"HC01_SPLITTER"
"HC01_SPLITTER(RIGHT)"
))
(foreach blkName blockNames
(setq ss (ssget "X" (list (cons 0 "INSERT") (cons 2 blkName))))
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq obj (vlax-ename->vla-object ent))
(vla-delete obj)
(setq i (1+ i))
)
)
)
)
;; Delete all red circles (used as error indicators)
(setq ss (ssget "_X" '((0 . "CIRCLE") (62 . 1)))) ; 62=1 → red
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq obj (vlax-ename->vla-object ent))
(vla-delete obj)
(setq i (1+ i))
)
)
)
)
;; Function to process each block type
(defun process-block-type (blkName maxDesca)
(setq filter (list (cons 0 "INSERT") (cons 2 blkName)))
(setq sioLikeBlocks '("PLCIO_ARMORBLOCK_SIO" "PLCIO_ARMBLOCK_FIOM" "PLCIO_ARMORBLOCK_FIOH"))
(setq mirrorThreshold (if (member blkName sioLikeBlocks) 9 7))
(setq ss (ssget "X" filter))
;; Initialize pairs of attributes for DESCA blocks
(if ss
(progn
(princ (strcat "\n[devlay_update] Found blocks named \"" blkName "\"."))
(setq pairs (build-pairs maxDesca))
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq attList (vlax-invoke (vlax-ename->vla-object ent) 'GetAttributes))
(foreach pair pairs
(setq val1 (getAttVal attList (car pair)))
(setq val2 (getAttVal attList (cadr pair)))
;; Treat "SPARE" as empty
(if (= val1 "SPARE") (setq val1 ""))
(if (= val2 "SPARE") (setq val2 ""))
;; Case 1: both have values (pairs)
(if (and (/= val1 "") (/= val2 ""))
(progn
(setq att1 (getAttObj attList (car pair)))
(setq att2 (getAttObj attList (cadr pair)))
(if (and att1 att2)
(progn
(setq oldAttdia (getvar "ATTDIA"))
(setq oldAttreq (getvar "ATTREQ"))
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 0)
(setq pt1 (vlax-get att1 'InsertionPoint))
(setq pt2 (vlax-get att2 'InsertionPoint))
(setq tagNum (atoi (substr (car pair) 6)))
(setq xOffset (if (< tagNum mirrorThreshold) 4.5 -0.7))
(setq shiftRightX (if (= tagNum 7) 2.0 0.0))
(setq x1 (+ (car pt1) xOffset shiftRightX))
(setq xCordset (if (>= tagNum mirrorThreshold) (- x1 0.13) x1))
(setq y1 (+ (cadr pt1) 0.1))
(setq newPt1 (list xCordset y1 0.0))
;; NEW: Check if block is FIO or FIOH
(if (or (= blkName "PLCIO_ARMBLOCK_FIOM") (= blkName "PLCIO_ARMORBLOCK_FIOH"))
(progn
(setq newPt1Adjusted
(if (>= tagNum mirrorThreshold)
;; Right side
(list (- (car newPt1) 1.4571) (- (cadr newPt1) 0.6375) (caddr newPt1))
;; Left side
(list (+ (car newPt1) 0.7) (- (cadr newPt1) 0.6375) (caddr newPt1))
)
)
;; Additional shift if TAG7 or TAG8
(if (or (= tagNum 7) (= tagNum 8))
(setq newPt1Adjusted
(list
(- (car newPt1Adjusted) 2.0)
(cadr newPt1Adjusted)
(caddr newPt1Adjusted)
)
)
)
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1Adjusted 1 1 0)
(setq newBlock1 (vlax-ename->vla-object (entlast)))
(setq tagnumStr (substr (car pair) 6))
(setq tagnum (atoi tagnumStr))
(setq taga1
(if (= blkName "PLCIO_ARMORBLOCK_FIOH")
(progn
(setq evenNum (if (= (rem tagnum 2) 0) tagnum (+ tagnum 1)))
(setq evenTagStr (if (< evenNum 10) (strcat "0" (itoa evenNum)) (itoa evenNum)))
;; Remove last two chars from TAGA value
(setq val (getAttVal attList (strcat "TAGA" evenTagStr)))
(substr val 1 (- (strlen val) 2))
)
(getAttVal attList (strcat "TAGA" tagnumStr))
)
)
(setBlockAttr newBlock1 "TAG1" taga1)
)
(progn
;; EXISTING CODE for all other blocks
(if (and val1 val2
(or (and (vl-string-search "SEL" val1) (vl-string-search "SEL" val2))
(and (vl-string-search "DPM" val1) (vl-string-search "DPM" val2))
;; NEW: Additional conditions for single straight block
(and (vl-string-search "VFD" val1) (vl-string-search "STO" val1)
(vl-string-search "VFD" val2) (vl-string-search "STO" val2))
(and (vl-string-search "JR" val1) (vl-string-search "_PB" val1) (vl-string-search "JR" val2) (vl-string-search "_PB_LT" val2))
(and (vl-string-search "EPC" val1) (vl-string-search "EPC" val2))
(and (vl-string-search "SSP" val1) (vl-string-search "SSP" val2))))
(progn
;; Insert single straight block
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1 1 1 0)
(setq newBlock (vlax-ename->vla-object (entlast)))
;; Set TAG1 attribute
(setq tagnumStr (substr (car pair) 6))
(setq taga (getAttVal attList (strcat "TAGA" tagnumStr)))
(setBlockAttr newBlock "TAG1" taga)
;; Mirror if needed
(setq tagNum (atoi tagnumStr))
(setq finalBlock newBlock) ; assume no mirror
(if (>= tagNum mirrorThreshold)
(progn
(command "_MIRROR" (vlax-vla-object->ename newBlock) "" newPt1 (list (car newPt1) (+ (cadr newPt1) 0.1)) "N")
(entdel (vlax-vla-object->ename newBlock))
(setq finalBlock (vlax-ename->vla-object (entlast))) ; update to mirrored block
)
)
;; === NEW: Move single straight block left/right depending on side ===
(if (or (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(and (member blkName sioLikeBlocks) (>= tagNum 8)))
;; Right side: move left 1 unit
(progn
(setq basePt (vlax-get finalBlock 'InsertionPoint))
(setq targetPt (list (- (car basePt) 0.5) (cadr basePt) (caddr basePt)))
(vla-move finalBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
;; Left side: move right 0.5 unit
(if (or (and (= blkName "PLCIO_ARMORPOWERFLEX") (<= tagNum 7))
(and (member blkName sioLikeBlocks) (< tagNum 8)))
(progn
(setq basePt (vlax-get finalBlock 'InsertionPoint))
(setq targetPt (list (+ (car basePt) 1.0) (cadr basePt) (caddr basePt)))
(vla-move finalBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
)
)
;; === END NEW ===
;; Move all SEL blocks 1 unit down. Also move 4 units left for DESCA07 - 09 (SIO)
(setq shiftX (if (>= tagNum mirrorThreshold) -3 0))
(setq shiftY -0.5)
;; Get current position of block (not assuming newPt1 anymore)
(setq basePt (vlax-get finalBlock 'InsertionPoint))
(setq targetPt (list (+ (car basePt) shiftX)
(+ (cadr basePt) shiftY)
(caddr basePt)))
(vla-move finalBlock
(vlax-3d-point basePt)
(vlax-3d-point targetPt))
)
(progn
;; ELSE part: Insert two straight blocks + splitter
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1 1 1 0)
(setq newBlock1 (vlax-ename->vla-object (entlast)))
(setq taga1 (getAttVal attList (strcat "TAGA" (substr (car pair) 6))))
(setBlockAttr newBlock1 "TAG1" taga1)
(setq y2 (+ (cadr pt2) 0.1))
(setq newPt2 (list xCordset y2 0.0))
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt2 1 1 0)
(setq newBlock2 (vlax-ename->vla-object (entlast)))
(setq taga2 (getAttVal attList (strcat "TAGA" (substr (cadr pair) 6))))
(setBlockAttr newBlock2 "TAG1" taga2)
(setq x3 (+ x1 (if (< tagNum mirrorThreshold) 1.25 -1.25)))
(setq y3 (/ (+ y1 y2) 2.0))
(setq newPt3 (list x3 y3 0.0))
(if (< tagNum mirrorThreshold)
(command "_-INSERT" "HC01_SPLITTER" newPt3 1 1 0)
(progn
(command "_-INSERT" "HC01_SPLITTER(RIGHT)" newPt3 1 1 0)
(setq splitterEnt (vlax-ename->vla-object (entlast)))
(setq newPos (list (- x3 2.2) (+ y3 0.0) 0.0))
(vla-move splitterEnt (vlax-3d-point newPt3) (vlax-3d-point newPos))
)
)
;; Extra adjustment for Powerflex DESCA07+ (move all 3 blocks left, splitter up)
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(progn
(setq newX1 (- (car newPt1) 1.8))
(setq newX2 (- (car newPt2) 1.8))
(setq newX3 (- (car newPt3) 1.8))
(setq newY3 (+ (cadr newPt3) 0.0)) ; splitter up
(vla-move newBlock1 (vlax-3d-point newPt1) (vlax-3d-point newX1 (cadr newPt1) (caddr newPt1)))
(vla-move newBlock2 (vlax-3d-point newPt2) (vlax-3d-point newX2 (cadr newPt2) (caddr newPt2)))
(vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point newPt3) (vlax-3d-point newX3 newY3 (caddr newPt3)))
)
)
;; If this is the second block type, shift blocks closer together
(if (member blkName sioLikeBlocks)
(progn
(setq moveVecX
(if (or (= tagNum 7) (= tagNum 8))
-1.5
(if (< tagNum mirrorThreshold) 0.5 -1.4)
)
) ; inward move
;; Additional right shift of 0.5 for SIO-like blocks on right side (tagNum >= 9)
(setq rightShift (if (and (member blkName sioLikeBlocks) (>= tagNum 9)) 0.5 0.0))
;; Additional downward shift of 0.5 for SIO-like blocks on right side (tagNum >= 9)
(setq downShift (if (and (member blkName sioLikeBlocks) (>= tagNum 9)) 0.1 0.0))
(setq newX1 (+ (car newPt1) moveVecX rightShift))
(setq newX2 (+ (car newPt2) moveVecX rightShift))
(setq newX3
(if (or (= tagNum 7) (= tagNum 8))
(+ (car newPt3) -1.5 rightShift)
(+ (car newPt3) moveVecX rightShift)
)
)
(setq newY1 (- (cadr newPt1) downShift))
(setq newY2 (- (cadr newPt2) downShift))
(setq newY3
(if (or (= tagNum 7) (= tagNum 8))
(+ (cadr newPt3) -0.015 downShift)
(- (cadr newPt3) downShift)
)
)
(vla-move newBlock1 (vlax-3d-point newPt1) (vlax-3d-point newX1 newY1 (caddr newPt1)))
(vla-move newBlock2 (vlax-3d-point newPt2) (vlax-3d-point newX2 newY2 (caddr newPt2)))
(vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point newPt3) (vlax-3d-point newX3 newY3 (caddr newPt3)))
)
)
)
)
)
)
(setvar "ATTDIA" oldAttdia)
(setvar "ATTREQ" oldAttreq)
)
)
)
)
;; Case 2: single value only
(if (and (/= val1 "") (= val2 ""))
(progn
(setq attTag (if (/= val1 "") (car pair) (cadr pair)))
(setq attObj (getAttObj attList attTag))
(if attObj
(progn
(setq oldAttdia (getvar "ATTDIA"))
(setq oldAttreq (getvar "ATTREQ"))
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 0)
(setq pt (vlax-get attObj 'InsertionPoint))
(setq tagNum (atoi (substr attTag 6)))
(setq xOffset (if (< tagNum mirrorThreshold) 5.5 -5.0))
(setq x (+ (car pt) xOffset))
(setq y (- (cadr pt) 0.5))
(setq xAdjust
(if (and (member blkName sioLikeBlocks) (>= tagNum 9))
0.0 ; right side → move slightly left
(if (member blkName sioLikeBlocks)
0.7 ; left side → move slightly right
0.0 ; other blocks → no change
)
)
)
;; Extra right shift for Powerflex DESCA07+
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(setq xAdjust (+ xAdjust 1.0))
)
(setq insPt (list (+ x xAdjust) y 0.0))
;; For PLCIO_ARMORPOWERFLEX, special DESCA11 block placement
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11))
(setq insPt (list (+ x 2.0) (+ y 0.5) 0.0))
)
;; Insert proper block based on conditions
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11))
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" insPt 1 1 0) ; old block special single
(command "_-INSERT" "CORDSET_STR-STR_1DEVICE PER PORT" insPt 1 1 0) ; other singles
)
(setq newEnt (entlast))
(setq newBlock (vlax-ename->vla-object newEnt))
;; FIX: Keep string version for TAGA, convert to int for comparisons
(setq tagnumStr (substr attTag 6))
(setq tagnum (atoi tagnumStr))
(setq taga
(if (= blkName "PLCIO_ARMORBLOCK_FIOH")
(progn
(setq evenNum (if (= (rem tagnum 2) 0) tagnum (+ tagnum 1)))
(setq evenTagStr (if (< evenNum 10) (strcat "0" (itoa evenNum)) (itoa evenNum)))
(getAttVal attList (strcat "TAGA" evenTagStr))
)
(getAttVal attList (strcat "TAGA" tagnumStr))
)
)
(setBlockAttr newBlock "TAG1" taga)
;; For non-special single blocks, move attribute
(if (not (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11)))
(moveTag1UpLeft newBlock)
)
; Mirror blocks for DESCA07 and above except special single DESCA11
; FIX: Use tagnum (integer) instead of comparing with string
(if (and (>= tagnum mirrorThreshold)
(not (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagnum 11))))
(progn
(command "_MIRROR" newEnt "" insPt (list (car insPt) (+ (cadr insPt) 0.1)) "N")
(entdel newEnt)
(setq newBlock (vlax-ename->vla-object (entlast)))
)
)
;; === NEW: Move single straight block left/right depending on side ===
(if (or (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagnum 7))
(and (member blkName sioLikeBlocks) (>= tagnum 8) (= tagnum 15)))
;; Right side: move left 1 unit (only for last DESCA in SIO-like blocks)
(progn
(setq basePt (vlax-get newBlock 'InsertionPoint))
(setq targetPt (list (+ (car basePt) 0.5) (cadr basePt) (caddr basePt)))
(vla-move newBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
)
;; === NEW: Move SIO-like single blocks on left side to the left ===
(if (and (member blkName sioLikeBlocks) (< tagnum 8))
;; Left side SIO-like blocks: move left 0.5 unit
(progn
(setq basePt (vlax-get newBlock 'InsertionPoint))
(setq targetPt (list (- (car basePt) 0.7) (cadr basePt) (caddr basePt)))
(vla-move newBlock (vlax-3d-point basePt) (vlax-3d-point targetPt))
)
)
;; === END NEW ===
(setvar "ATTDIA" oldAttdia)
(setvar "ATTREQ" oldAttreq)
)
)
)
)
;; ELSE branch: val1 is empty, val2 has value → print warning
(if (and (= val1 "") (/= val2 ""))
(progn
(setq attTag (car pair)) ; Always expect the first attribute to be filled
(setq attObj (getAttObj attList attTag))
(if attObj
(progn
;; Insertion point of the attribute itself
(setq insPt (vlax-get attObj 'InsertionPoint))
;; Draw red circle to mark the issue
(entmakex
(list
(cons 0 "CIRCLE")
(cons 8 "0") ; Layer
(cons 10 insPt) ; Center at attribute
(cons 40 1.3) ; Radius
(cons 62 1) ; Red color
)
)
)
)
)
)
)
(setq i (1+ i))
)
)
(princ (strcat "\n[devlay_update] No blocks named \"" blkName "\" found."))
)
)
(defun c:devlay_update ()
(disable-snap-states)
(delete-existing-devlay-blocks)
(process-block-type "PLCIO_ARMORPOWERFLEX" 11)
(process-block-type "PLCIO_ARMORBLOCK_SIO" 16)
(process-block-type "PLCIO_ARMBLOCK_FIOM" 16)
(process-block-type "PLCIO_ARMORBLOCK_FIOH" 16)
(enable-snap-states)
)

View File

@ -9,59 +9,6 @@
)
)
(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)))
@ -70,6 +17,8 @@
(cond
((wcmatch (strcase (vla-get-effectivename vlaBlock)) "*POWERFLEX*") "APF")
((wcmatch (strcase (vla-get-effectivename vlaBlock)) "*SIO*") "SIO")
((wcmatch (strcase (vla-get-effectivename vlaBlock)) "*FIOM*") "FIO")
((wcmatch (strcase (vla-get-effectivename vlaBlock)) "*FIOH*") "FIOH")
(T "")
)
)
@ -96,6 +45,65 @@
)
)
(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)
(setq counter 0) ; Add a counter to track which attribute we're processing
(foreach att (vlax-invoke block 'GetAttributes)
(setq tag (strcase (vla-get-tagstring att)))
(if (wcmatch tag "LINE*")
(progn
; Use counter instead of extracting from tag
(setq labelNum (+ startNum counter))
(setq labelStr (if (< labelNum 10)
(strcat "0" (itoa labelNum))
(itoa labelNum)))
;; Use the block's X position + 0.12, and Y from the attribute - 0.053
(setq basePt (vlax-get att 'InsertionPoint))
(setq blockPos (vlax-get block 'InsertionPoint)) ; block base point
;; X from block + 0.12, Y from attribute - 0.053
(setq labelPt (list (+ (car blockPos) 0.12) (- (cadr basePt) 0.053) (caddr basePt)))
(entmakex
(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")
)
)
(setq counter (1+ counter)) ; Increment counter after processing each LINE attribute
)
)
)
)
(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")
)
)
)
;; 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
@ -125,31 +133,66 @@
)
;; Function to read device list from file and return as a list
(defun placeDevicesInLayout (layoutStartX devices / basePt positions i blk pos ent)
(defun placeDevicesInLayout (layoutStartX devices / basePt positions i device blk pos ent vlaEnt)
(setq basePt "0,0,0")
;; TODO: these cordinates are for the new SIO BLOCK coming from the amazon
;; They are not used in the current layout, but can be used for future reference.
; (setq positions (list
; (list 3.57 5.06 0.0) ;; A
; (list 3.57 -5.95 0.0) ;; B
; (list 22.84 5.06 0.0) ;; C
; (list 22.84 -5.95 0.0) ;; D
; ))
;; Ordered list of positions: always A, B, C, D
(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
(list 9.63 9.5 0.0) ;; A
(list 9.63 -1.5 0.0) ;; B
(list 28.88 9.5 0.0) ;; C
(list 28.88 -1.5 0.0) ;; D
))
;; Alternate layout for FIO/FIOH
(setq positionsB (list
(list 9.6 9.5 0.0) ;; A
(list 9.6 -1.5 0.0) ;; B
(list 28.9666 9.5 0.0) ;; C
(list 28.9666 -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")
((vl-string-search "FIOH" device) "PLCIO_ARMORBLOCK_FIOH")
((vl-string-search "FIO" device) "PLCIO_ARMBLOCK_FIOM")
(T nil)
)
)
(if blk
(progn
(setq pos (nth i positions))
;; Pick the correct layout based on device type and position index
(if (< i (length positions)) ; avoid overflow
(setq pos
(cond
((or (vl-string-search "FIOH" device) (vl-string-search "FIO" device))
(mapcar '+ (nth i positionsB) (list layoutStartX 0 0))
)
(T
(mapcar '+ (nth i positions) (list layoutStartX 0 0))
)
)
)
(setq pos (list layoutStartX 0 0)) ; fallback if too many devices
)
;; Insert and move
(command "_.-INSERT" blk basePt 1 1 0)
(setq ent (entlast))
(if ent
@ -157,7 +200,7 @@
(setq vlaEnt (vlax-ename->vla-object ent))
(vla-move vlaEnt (vlax-3d-point 0 0 0) (vlax-3d-point pos))
(setDESCAtoSpare vlaEnt)
(placeDeviceLabel vlaEnt)
; (placeDeviceLabel vlaEnt)
)
(princ (strcat "\nFailed to insert block: " blk))
)
@ -169,10 +212,46 @@
)
(defun update20ZoneBlockAttributes (blockEnt layoutIndex startValue sideOffset / blockObj attrList attr attrName idx newValue formattedValue)
(setq blockObj (vlax-ename->vla-object blockEnt))
(setq attrList (vlax-invoke blockObj 'GetAttributes))
(foreach attr attrList
(setq attrName (vlax-get-property attr 'TagString))
(if (and (>= (strlen attrName) 5)
(= (substr attrName 1 4) "LINE")
(>= (atoi (substr attrName 5)) 1)
(<= (atoi (substr attrName 5)) 20))
(progn
;; Convert string to number; compute base as start + layoutIndex
;; then add per-line index (0-19) and side offset (0 for left, 20 for right)
(setq idx (atoi (substr attrName 5)))
(setq newValue (+ (atoi startValue)
layoutIndex
(- idx 1)
sideOffset))
;; Format as string with period, no leading zeros
(setq formattedValue (strcat (itoa newValue) "."))
;; Apply value
(vlax-put-property attr 'TextString formattedValue)
(vlax-invoke attr 'Update)
)
)
)
(vlax-invoke blockObj 'Update)
)
(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 layoutData (readDeviceListFromFile)) ;
(setq groupedData (chunk-list layoutData 4))
(setq layoutCount (length groupedData))
@ -182,6 +261,9 @@
(setvar "ATTREQ" 0)
(setq offsetX 38.5)
;; prompt user for starting indexes
(setq startIndex (getstring "\nEnter starting line index (e.g. 01600): "))
;; Layout loop
(setq i 0)
(while (< i layoutCount)
@ -204,12 +286,16 @@
(setq ptLeft (list (+ 0.75 currentOffset) 9.5 0))
(setq ptRight (list (+ 20.0 currentOffset) 9.5 0))
;;todo fix the naming
(setq leftEnt (insertBlockAt "20_zone" basePt ptLeft))
(setq leftBlock (vlax-ename->vla-object leftEnt))
(update20ZoneBlockAttributes leftEnt i startIndex 0)
(labelBlockLines leftBlock 1)
(setq rightEnt (insertBlockAt "20_zone" basePt ptRight))
(setq rightBlock (vlax-ename->vla-object rightEnt))
(update20ZoneBlockAttributes rightEnt i startIndex 0)
(labelBlockLines rightBlock 21)
;; Add layout label

370
BNA8/network-diagram-v3.lsp Normal file
View File

@ -0,0 +1,370 @@
no (defun clearDrawing ( / ss)
(setq ss (ssget "_X" '((0 . "*"))))
(if ss (command "_.erase" ss ""))
(princ "\nDrawing cleared.")
)
(defun getVisibilityFromName (deviceName)
(cond
((wcmatch (strcase deviceName) "*APF*") "APF")
((wcmatch (strcase deviceName) "*VFD*") "VFD")
((wcmatch (strcase deviceName) "*SIO*") "SIO")
((wcmatch (strcase deviceName) "*FIO*") "FIO")
((wcmatch (strcase deviceName) "*EX*") "EX")
((wcmatch (strcase deviceName) "*SPARE*") "")
(T "DEFAULT") ;; fallback
)
)
(defun str-trim (s)
(vl-string-trim " \t\n\r" s)
)
(defun setDeviceAttributes (blk ip device port / tag2 tag3 isVFD spacePos slashPos baseName part2 tag ip1 ip2 spacePosIP)
;; Default values
(setq tag2 device)
(setq tag3 "")
(setq ip1 ip)
(setq ip2 "")
;; === VFD logic for tag2 and tag3 ===
(if (and device (vl-string-search "VFD" (strcase device)))
(progn
(setq spacePos (vl-string-search " " device))
(if spacePos
(progn
(setq part1 (substr device 1 spacePos))
(setq part2 (substr device (+ spacePos 2)))
(setq slashPos (vl-string-search "/VFD" part1))
(if slashPos
(setq baseName (substr part1 1 slashPos))
(setq baseName part1)
)
(setq tag2 (str-trim part1))
(setq tag3 (strcat (str-trim baseName) "/" (str-trim part2)))
)
)
)
)
;; === IP splitting logic for ip1 and ip2 ===
(setq spacePosIP (vl-string-search " " ip))
(if spacePosIP
(progn
(setq ip1 (str-trim (substr ip 1 spacePosIP)))
(setq ip2 (str-trim (substr ip (+ spacePosIP 2))))
)
;; else no space, ip2 stays ""
)
;; Set attributes
(foreach att (vlax-invoke blk 'GetAttributes)
(setq tag (strcase (vla-get-tagstring att)))
(cond
((= tag "IP") (vla-put-textstring att ip1))
((= tag "IP2") (vla-put-textstring att ip2))
((= tag "TAG2") (vla-put-textstring att tag2))
((= tag "PORT") (vla-put-textstring att port))
((= tag "TAG3") (if (> (strlen tag3) 0) (vla-put-textstring att tag3)))
)
)
)
(defun place-enet-devices (originX originY deviceGroup / blockName width count i x y basePt lastEnt targetPt blk visibilityValue deviceName device ip fullBlockName port)
(setq blockName "HDV2_ENET_DEVICE_")
(setq width 1.2)
(setq count (length deviceGroup))
(setq i 0)
(setq y 20.4718)
(while (< i count)
(setq count (length deviceGroup))
(setq blockSpacing 1.2)
(setq groupWidth (* blockSpacing (1- count)))
(setq centerX 21.2)
(setq startX (- centerX (/ groupWidth 2.0)))
(setq x (+ startX (* i blockSpacing) 0.3))
(setq basePt '(0 0 0))
(setq targetPt (list (+ originX x) (+ originY y) 0))
(setq devicePair (nth i deviceGroup))
(setq device (cdr (assoc "NAME" devicePair)))
(setq ip (cdr (assoc "IP" devicePair)))
(setq port (cdr (assoc "PORT" devicePair)))
;; Create block name based on device visibility
(setq deviceName (getVisibilityFromName device))
(setq fullBlockName (strcat blockName deviceName))
(command "_.-INSERT" fullBlockName basePt 0.8 0.8 0.8 0)
;; Process the inserted block
(if (setq lastEnt (entlast))
(progn
;; Convert to VLA object
(setq blk (vlax-ename->vla-object lastEnt))
;; Move the block to target point
(vla-move blk
(vlax-3d-point basePt)
(vlax-3d-point targetPt)
)
(vla-put-rotation blk 0.0)
(setDeviceAttributes blk ip device port)
)
(princ "\nFailed to get last entity.")
)
(setq i (1+ i))
)
)
(defun labelZone32Lines (ent / vlaBlock att basePt labelPt labelStr height index rotation)
(if (and ent (eq (cdr (assoc 0 (entget ent))) "INSERT"))
(progn
(setq vlaBlock (vlax-ename->vla-object ent))
(setq index 1)
(foreach att (vlax-invoke vlaBlock 'GetAttributes)
(if (wcmatch (strcase (vla-get-tagstring att)) "LINE*")
(progn
(setq labelStr (if (< index 10) (strcat "0" (itoa index)) (itoa index)))
(setq basePt (vlax-get att 'InsertionPoint))
(setq height (vla-get-height att))
(setq rotation (vla-get-rotation att))
(setq labelPt
(list (- (car basePt) 0.05) ; left
(+ (cadr basePt) 0.65) ; up
(caddr basePt)))
;; Create label text
(entmake
(list
(cons 0 "TEXT")
(cons 8 "0")
(cons 7 "WD")
(cons 62 7)
(cons 10 labelPt)
(cons 11 labelPt)
(cons 40 height)
(cons 72 1)
(cons 73 2)
(cons 1 labelStr)
(cons 50 rotation)
(cons 100 "AcDbEntity")
(cons 100 "AcDbText")
)
)
(setq index (1+ index))
)
)
)
)
(princ "\nInvalid entity passed to labelZone32Lines.")
)
(princ)
)
(defun parseCSVLine (line / pos result)
(setq result '())
(while (setq pos (vl-string-search "," line))
(setq result (append result (list (substr line 1 pos))))
(setq line (substr line (+ pos 2)))
)
(append result (list line))
)
(defun getDPMDataFromCSV ( / file filename line headers row dpm ip name deviceIP port dpmList deviceGroups currentGroup)
(setq filename (getfiled "Select CSV File" (strcat (getenv "USERPROFILE") "\\Desktop\\") "csv" 0))
(if (not filename)
(progn (princ "\nNo file selected.") (exit))
)
(setq file (open filename "r"))
(if (not file)
(progn (princ "\nFailed to open file.") (exit))
)
;; Read header line
(read-line file)
(setq dpmList '())
(setq deviceGroups '())
(setq currentGroup '())
(while (setq line (read-line file))
(setq row (parseCSVLine line))
(setq dpm (nth 0 row)) ; DPM name (can be empty)
(setq ip (nth 1 row))
(setq name (nth 2 row))
(setq deviceIP (nth 4 row))
(setq port (nth 6 row))
;; If a new DPM is found
(if (and dpm (/= dpm ""))
(progn
;; If current group is not empty, pad and save it
(if (> (length currentGroup) 0)
(progn
(while (< (length currentGroup) 24)
(setq currentGroup
(append currentGroup
(list (list
(cons "NAME" "SPARE")
(cons "IP" "")
(cons "PORT" "")
))
)
)
)
(setq deviceGroups (append deviceGroups (list currentGroup)))
(setq currentGroup '())
)
)
;; Register new DPM
(if (not (assoc dpm dpmList))
(setq dpmList (append dpmList (list (cons dpm ip))))
)
)
)
;; Add valid device (skip blank names)
(if (and name (/= name ""))
(setq currentGroup
(append currentGroup
(list (list
(cons "NAME" name)
(cons "IP" deviceIP)
(cons "PORT" port)
))
)
)
)
;; If group reaches 24 devices — finalize
(if (= (length currentGroup) 24)
(progn
(setq deviceGroups (append deviceGroups (list currentGroup)))
(setq currentGroup '())
)
)
)
;; Handle final group if file ends before 24
(if (> (length currentGroup) 0)
(progn
(while (< (length currentGroup) 24)
(setq currentGroup
(append currentGroup
(list (list
(cons "NAME" "SPARE")
(cons "IP" "")
(cons "PORT" "")
))
)
)
)
(setq deviceGroups (append deviceGroups (list currentGroup)))
)
)
(close file)
(list dpmList deviceGroups)
)
(defun c:init-diagrams ( / blockName count offsetX i x y)
(clearDrawing)
(setq blockName "layout")
(setq csvData (getDPMDataFromCSV))
(setq dpmList (car csvData))
(setq deviceGroups (cadr csvData))
(setq count (length dpmList))
(setq userInput (getstring "\nEnter zone number (e.g., 01, 02): "))
(if (and blockName (> count 0))
(progn
(setq offsetX 43.5)
(setq i 0)
(while (< i count)
(setq x (* i offsetX))
(setq y 0)
(setq basePt '(0 0 0))
(setq targetPt (list x y 0))
;; Insert layout
(command "_.-INSERT" blockName basePt 1 1 0)
(setq lastEnt (entlast))
(if lastEnt
(vla-move
(vlax-ename->vla-object lastEnt)
(vlax-3d-point basePt)
(vlax-3d-point targetPt)
)
)
;; Insert DPM-UPS at fixed offset inside layout
(setq dpmPair (nth i dpmList))
(setq dpmName (car dpmPair))
(setq dpmIP (cdr dpmPair))
(setq deviceGroup (nth i deviceGroups))
(setq dpmUpsPt (list (+ x 16.1) (+ y 2.1173) 0))
(command "_.-INSERT" "DPM-UPS" dpmUpsPt 1 1 0)
;; Set IPADDRESS attribute if found
(setq lastEnt (entlast))
(if lastEnt
(progn
(setq dpmUpsObj (vlax-ename->vla-object lastEnt))
(foreach att (vlax-invoke dpmUpsObj 'GetAttributes)
(setq tag (strcase (vla-get-tagstring att)))
(cond
((= tag "IPADDRESS")
(vla-put-textstring att dpmIP)
)
((= tag "TAG2")
(vla-put-textstring att dpmName)
)
)
)
)
)
;; Calculate insertion point
(setq desiredX (+ x 0.7658))
(setq desiredY (+ y 25.6873))
;; Insert ZONE_32H at origin
(command "_.-INSERT" "ZONE_32H" '(0 0 0) 1 1 0)
;; Get the last inserted entity
(setq ent (entlast))
;; Move the inserted block from (0,0,0) to desired point
(if ent
(progn
(setq vlaObj (vlax-ename->vla-object ent))
(vla-move vlaObj (vlax-3d-point 0 0 0) (vlax-3d-point desiredX desiredY 0))
;; Set ALL attributes in the ZONE_32H block to E8912., E8913., etc.
(setq zoneName (strcat userInput (itoa (+ 702 i)) "."))
(foreach att (vlax-invoke vlaObj 'GetAttributes)
(vla-put-textstring att zoneName)
)
;; Label the ZONE_32H lines
(labelZone32Lines ent)
)
)
;; Insert ENETs
(place-enet-devices x y deviceGroup)
(setq i (1+ i))
)
(princ (strcat "\nInserted " (itoa count) " layouts side-by-side."))
)
(princ "\nInvalid input.")
)
(princ)
)

256
BNA8/network-v2.lsp Normal file
View File

@ -0,0 +1,256 @@
(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"))
(setq result '()) ;; initialize empty list before appending
(while (setq line (read-line file))
(setq result (append result (list (strcase (vl-string-trim " \t\r\n" line)))))
)
(close file)
result
)
nil
)
)
(defun updateTagAttribute (ent tagValue / obj attribs att)
;; Convert entity to VLA object
(setq obj (vlax-ename->vla-object ent))
(if (and obj (eq (vla-get-hasattributes obj) :vlax-true))
(progn
(setq attribs (vlax-invoke obj 'GetAttributes))
(foreach att attribs
(if (eq (strcase (vla-get-TagString att)) "TAG1")
(vla-put-TextString att tagValue)
)
)
)
)
)
(defun c:Init_Network ( / dpmCount rowCount colCount i row col x y spacingX spacingY blkName scaleFactor
startPt endPt zigzagStart secondCableEnds zigzagStarts )
(setq blkName "DPM") ; Block name
(setq hdvBlkName "HDV2_1756-EN4TR_CHILD") ; HDV block name
(setq scaleFactor 0.45) ; Scale of each block
(setq spacingX 15.0) ; Horizontal spacing between blocks
(setq spacingY 9.0) ; Vertical spacing between rows
(setq dpmOffsetX 5.0) ; X offset for DPM blocks
(setq hdvY 4.0) ; Y position for HDV block
(setq secondCableEnds '()) ; Store vertical line tops
(setq zigzagStarts '()) ; Store zigzag start points
(command "_.ERASE" "ALL" "")
(setq devices (readDeviceListFromFile))
(if (not devices)
(progn
(princ "\nNo device file selected or file was empty.")
(exit)
)
)
(setq dpmCount (length devices))
;; Calculate grid size
(setq colCount (fix (sqrt dpmCount)))
(if (< (* colCount colCount) dpmCount)
(setq colCount (+ colCount 1))
)
(setq rowCount (fix (/ (+ dpmCount colCount -1) colCount)))
;; Calculate centering offset for DPM blocks
(setq gridWidth (* (- colCount 1) spacingX))
(setq centerOffsetX (- (/ gridWidth 2.0)))
;; Insert HDV block at (0, hdvY) on layer 0
(command "_.LAYER" "S" "0" "")
(command "_.INSERT" hdvBlkName (list 0 hdvY) scaleFactor scaleFactor 0)
;; Loop to place blocks and draw lines
(setq i 0)
(repeat dpmCount
(setq row (fix (/ i colCount)))
(setq col (rem i colCount))
(setq x (+ (* col spacingX) dpmOffsetX)) ; Use variable
(setq y (* -1 row spacingY)) ; No Y offset
(setq dpmName (nth i devices)) ;; get line content
;; Insert DPM block on layer 0
(command "_.LAYER" "S" "0" "")
(command "_.INSERT" blkName (list x y) scaleFactor scaleFactor 0)
;; Get the last inserted entity
(setq ent (entlast))
;; Call the function
(updateTagAttribute ent dpmName)
;; First cable: vertical up
(setq startPt (list (+ x 7.3656) (+ y 4.4406)))
(setq endPt (list (car startPt) (+ (cadr startPt) 2.0)))
(entmakex (list '(0 . "LINE") (cons 10 startPt) (cons 11 endPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
(setq secondCableEnds (append secondCableEnds (list endPt)))
;; Check if last block in row OR last block in entire drawing
(if (or (= (rem (1+ i) colCount) 0) (= i (- dpmCount 1)))
(progn
;; Last block in row or last block overall — elbow and downward
(setq startPt (list (+ x 7.2677) (+ y 3.6094)))
(setq elbowPt (list (- (car startPt) 0.2) (- (cadr startPt) 0.2)))
(entmakex (list '(0 . "LINE") (cons 10 startPt) (cons 11 elbowPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
(setq endPt (list (car elbowPt) (- (cadr elbowPt) 4.5)))
(entmakex (list '(0 . "LINE") (cons 10 elbowPt) (cons 11 endPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
(setq zigzagStarts (append zigzagStarts (list nil))) ; Placeholder
)
(progn
;; Zigzag jump
(setq zigzagStart (list (+ x 7.3656) (+ y 3.7852)))
(setq elbowPt (list (+ x 7.8585) (+ y 5.1262)))
(entmakex (list '(0 . "LINE") (cons 10 zigzagStart) (cons 11 elbowPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Upward line
(setq startPt elbowPt)
(setq endPt (list (car startPt) (+ (cadr startPt) 1.3144)))
(entmakex (list '(0 . "LINE") (cons 10 startPt) (cons 11 endPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Store the end point of the upward line (second cable's end)
(setq zigzagStarts (append zigzagStarts (list endPt)))
)
)
(setq i (1+ i))
)
;; Connect second cable end to next block's first cable end (if not last in row)
(setq i 0)
(repeat (- dpmCount 1)
(if (/= (rem (1+ i) colCount) 0) ; Only if not last in row
(progn
(setq pt1 (nth i zigzagStarts)) ; Current block's second line end
(setq pt2 (nth (1+ i) secondCableEnds)) ; Next block's first line end
(if (and pt1 pt2 (listp pt1) (listp pt2)) ; Enhanced check
(entmakex
(list
'(0 . "LINE")
(cons 10 pt1)
(cons 11 pt2)
'(62 . 256)
'(8 . "AS_ENET_CABLE")
)
)
)
)
)
(setq i (1+ i))
)
;; Connect last block in row to first block in next row
(setq i 0)
(repeat rowCount
(setq lastInRowIndex (- (* (1+ i) colCount) 1)) ; Last block index in current row
(setq firstInNextRowIndex (* (1+ i) colCount)) ; First block index in next row
(if (and (< lastInRowIndex dpmCount) (< firstInNextRowIndex dpmCount))
(progn
;; Get the downward line end point from last block in row
(setq row i)
(setq col (- colCount 1)) ; Last column
(setq x (+ (* col spacingX) dpmOffsetX)) ; Use variable
(setq y (* -1 row spacingY)) ; Use variable
(setq downwardEndPt (list (- (+ x 7.2677) 0.2) (- (- (+ y 3.6094) 0.2) 4.5)))
;; Get first block coordinates in next row
(setq nextRow (1+ i))
(setq nextCol 0) ; First column
(setq nextX (+ (* nextCol spacingX) dpmOffsetX)) ; Use variable
(setq nextY (* -1 nextRow spacingY)) ; Use variable
(setq nextBlockFirstLineEnd (list (+ nextX 7.3656) (+ (+ nextY 4.4406) 2.0)))
;; Draw horizontal line from downward end to next block's X coordinate
(setq horizontalEndPt (list (car nextBlockFirstLineEnd) (cadr downwardEndPt)))
(entmakex (list '(0 . "LINE") (cons 10 downwardEndPt) (cons 11 horizontalEndPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Draw vertical line up to next block's first line end
(entmakex (list '(0 . "LINE") (cons 10 horizontalEndPt) (cons 11 nextBlockFirstLineEnd) '(62 . 256) '(8 . "AS_ENET_CABLE")))
)
)
(setq i (1+ i))
)
;; Connect first block to HDV block
(if (> dpmCount 0)
(progn
;; First block coordinates
(setq firstX (+ (* 0 spacingX) dpmOffsetX)) ; First block X
(setq firstY (* -1 0 spacingY)) ; First block Y (row 0)
;; First block's first line end point
(setq firstBlockEnd (list (+ firstX 7.3656) (+ (+ firstY 4.4406) 2.0)))
;; HDV connection end point
(setq hdvEndPt (list (+ 0 1.4) (- hdvY 2.8))) ; HDV is at (0, hdvY)
;; Step 1: Horizontal line to X destination - 0.5
(setq horizontalEnd (list (+ (car hdvEndPt) 0.5) (cadr firstBlockEnd)))
(entmakex (list '(0 . "LINE") (cons 10 firstBlockEnd) (cons 11 horizontalEnd) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Step 2: Vertical line to Y destination - 0.5
(setq verticalEnd (list (car horizontalEnd) (+ (cadr hdvEndPt) 0.5)))
(entmakex (list '(0 . "LINE") (cons 10 horizontalEnd) (cons 11 verticalEnd) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Step 3: Final line to HDV end point
(entmakex (list '(0 . "LINE") (cons 10 verticalEnd) (cons 11 hdvEndPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
)
)
;; Connect last block to HDV block
(if (> dpmCount 0)
(progn
;; Last block index and coordinates
(setq lastBlockIndex (- dpmCount 1))
(setq lastRow (fix (/ lastBlockIndex colCount)))
(setq lastCol (rem lastBlockIndex colCount))
(setq lastX (+ (* lastCol spacingX) dpmOffsetX))
(setq lastY (* -1 lastRow spacingY))
;; HDV connection end point for last block
(setq hdvLastEndPt (list (+ 0 0.1) (- hdvY 5.83))) ; HDV is at (0, hdvY)
;; Check if we have only one row
(if (= rowCount 1)
(progn
;; Single row: extend vertical line down by 1.5 units below destination Y, keeping same X
(setq startPt (list (- (+ lastX 7.2677) 0.2) (- (+ lastY 3.6094) 0.2)))
(setq extendedVerticalEnd (list (car startPt) (- (cadr hdvLastEndPt) 1.5)))
(entmakex (list '(0 . "LINE") (cons 10 startPt) (cons 11 extendedVerticalEnd) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Horizontal line LEFT to final destination X
(setq horizontalEnd (list (car hdvLastEndPt) (cadr extendedVerticalEnd)))
(entmakex (list '(0 . "LINE") (cons 10 extendedVerticalEnd) (cons 11 horizontalEnd) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Vertical line UP to final destination
(entmakex (list '(0 . "LINE") (cons 10 horizontalEnd) (cons 11 hdvLastEndPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
)
(progn
;; Multiple rows: use original 2-segment path
;; Last block's vertical line end point (downward line end)
(setq lastBlockVerticalEnd (list (- (+ lastX 7.2677) 0.2) (- (- (+ lastY 3.6094) 0.2) 4.5)))
;; Step 1: Horizontal line LEFT to X destination
(setq horizontalEnd (list (car hdvLastEndPt) (cadr lastBlockVerticalEnd)))
(entmakex (list '(0 . "LINE") (cons 10 lastBlockVerticalEnd) (cons 11 horizontalEnd) '(62 . 256) '(8 . "AS_ENET_CABLE")))
;; Step 2: Vertical line to final destination
(entmakex (list '(0 . "LINE") (cons 10 horizontalEnd) (cons 11 hdvLastEndPt) '(62 . 256) '(8 . "AS_ENET_CABLE")))
)
)
)
)
(princ)
)

View File

@ -1,391 +0,0 @@
;; Function to get attribute value by tag from a list of attributes
(defun getAttVal (attList tag)
(setq tag (strcase tag))
(setq a (vl-some
(function
(lambda (a)
(if (= (strcase (vla-get-tagstring a)) tag)
a
)
)
)
attList
))
(if a
(strcase (vl-string-trim " " (vla-get-textstring a)))
""
)
)
;; Function to get attribute object by tag from a list of attributes
(defun getAttObj (attList tag)
(setq tag (strcase tag))
(vl-some
(function
(lambda (a)
(if (= (strcase (vla-get-tagstring a)) tag)
a
)
)
)
attList
)
)
;; Function to move TAG1 attribute up and left by 0.5 units
(defun moveTag1UpLeft (block / att basePt newPt)
(foreach att (vlax-invoke block 'GetAttributes)
(if (= (strcase (vla-get-tagstring att)) "TAG1")
(progn
(setq basePt (vlax-get att 'InsertionPoint))
(setq newPt (list (+ (car basePt) 0.5) (+ (cadr basePt) 0.5) (caddr basePt)))
(vlax-put att 'InsertionPoint newPt)
(if (vlax-property-available-p att 'AlignmentPoint)
(vlax-put att 'AlignmentPoint newPt)
)
(if (vlax-property-available-p att 'TextAlignmentPoint)
(vlax-put att 'TextAlignmentPoint newPt)
)
(vlax-put att 'Color 2)
)
)
)
)
;; Function to set attribute value in a block
(defun setBlockAttr (block tag value)
(foreach att (vlax-invoke block 'GetAttributes)
(if (= (strcase (vla-get-tagstring att)) (strcase tag))
(vla-put-textstring att value)
)
)
)
;; Function to build pairs of DESCA blocks
(defun build-pairs (maxNum)
(setq result '())
(setq n 1)
(while (<= n maxNum)
(setq a (strcat "DESCA" (if (< n 10) (strcat "0" (itoa n)) (itoa n))))
(setq next (+ n 1))
(if (<= next maxNum)
(setq b (strcat "DESCA" (if (< next 10) (strcat "0" (itoa next)) (itoa next))))
(setq b "")
)
(setq result (append result (list (list a b))))
(setq n (+ n 2))
)
result
)
;; Function to delete existing blocks
(defun delete-existing-devlay-blocks ( / blockNames ss i ent obj)
(setq blockNames '(
"HC01_CORDSET_STR-STR_STRAIGHT"
"CORDSET_STR-STR_1DEVICE PER PORT"
"HC01_SPLITTER"
"HC01_SPLITTER(RIGHT)"
))
(foreach blkName blockNames
(setq ss (ssget "X" (list (cons 0 "INSERT") (cons 2 blkName))))
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq obj (vlax-ename->vla-object ent))
(vla-delete obj)
(setq i (1+ i))
)
)
)
)
;; Delete all red circles (used as error indicators)
(setq ss (ssget "_X" '((0 . "CIRCLE") (62 . 1)))) ; 62=1 → red
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq obj (vlax-ename->vla-object ent))
(vla-delete obj)
(setq i (1+ i))
)
)
)
)
;; Function to process each block type
(defun process-block-type (blkName maxDesca)
(setq filter (list (cons 0 "INSERT") (cons 2 blkName)))
(setq mirrorThreshold (if (= blkName "PLCIO_ARMORBLOCK_SIO") 9 7))
(setq ss (ssget "X" filter))
;; Initialize pairs of attributes for DESCA blocks
(if ss
(progn
(princ (strcat "\n[devlay_update] Found blocks named \"" blkName "\"."))
(setq pairs (build-pairs maxDesca))
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq attList (vlax-invoke (vlax-ename->vla-object ent) 'GetAttributes))
(foreach pair pairs
(setq val1 (getAttVal attList (car pair)))
(setq val2 (getAttVal attList (cadr pair)))
;; Treat "SPARE" as empty
(if (= val1 "SPARE") (setq val1 ""))
(if (= val2 "SPARE") (setq val2 ""))
;; Case 1: both have values (pairs)
(if (and (/= val1 "") (/= val2 ""))
(progn
(setq att1 (getAttObj attList (car pair)))
(setq att2 (getAttObj attList (cadr pair)))
(if (and att1 att2)
(progn
(setq oldAttdia (getvar "ATTDIA"))
(setq oldAttreq (getvar "ATTREQ"))
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 0)
(setq pt1 (vlax-get att1 'InsertionPoint))
(setq pt2 (vlax-get att2 'InsertionPoint))
(setq tagNum (atoi (substr (car pair) 6)))
(setq xOffset (if (< tagNum mirrorThreshold) 4.5 -0.7))
(setq shiftRightX (if (= tagNum 7) 2.0 0.0))
(setq x1 (+ (car pt1) xOffset shiftRightX))
(setq xCordset (if (>= tagNum mirrorThreshold) (- x1 0.13) x1))
(setq y1 (+ (cadr pt1) 0.1))
(setq newPt1 (list xCordset y1 0.0))
(if (and val1 val2
(or (and (vl-string-search "SEL" val1) (vl-string-search "SEL" val2))
(and (vl-string-search "DPM" val1) (vl-string-search "DPM" val2))))
(progn
;; Insert single straight block
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1 1 1 0)
(setq newBlock (vlax-ename->vla-object (entlast)))
;; Set TAG1 attribute
(setq tagnumStr (substr (car pair) 6))
(setq taga (getAttVal attList (strcat "TAGA" tagnumStr)))
(setBlockAttr newBlock "TAG1" taga)
;; Mirror if needed
(setq tagNum (atoi tagnumStr))
(setq mirrorThreshold (if (= blkName "PLCIO_ARMORBLOCK_SIO") 9 7))
(setq finalBlock newBlock) ; assume no mirror
(if (>= tagNum mirrorThreshold)
(progn
(command "_MIRROR" (vlax-vla-object->ename newBlock) "" newPt1 (list (car newPt1) (+ (cadr newPt1) 0.1)) "N")
(entdel (vlax-vla-object->ename newBlock))
(setq finalBlock (vlax-ename->vla-object (entlast))) ; update to mirrored block
)
)
;; Move all SEL blocks 1 unit down. Also move 4 units left for DESCA07 - 09 (SIO)
(setq shiftX (if (>= tagNum mirrorThreshold) -3 0))
(setq shiftY -0.5)
;; Get current position of block (not assuming newPt1 anymore)
(setq basePt (vlax-get finalBlock 'InsertionPoint))
(setq targetPt (list (+ (car basePt) shiftX)
(+ (cadr basePt) shiftY)
(caddr basePt)))
(vla-move finalBlock
(vlax-3d-point basePt)
(vlax-3d-point targetPt))
)
(progn
;; ELSE part: Insert two straight blocks + splitter (old behavior)
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt1 1 1 0)
(setq newBlock1 (vlax-ename->vla-object (entlast)))
(setq taga1 (getAttVal attList (strcat "TAGA" (substr (car pair) 6))))
(setBlockAttr newBlock1 "TAG1" taga1)
(setq y2 (+ (cadr pt2) 0.1))
(setq newPt2 (list xCordset y2 0.0))
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" newPt2 1 1 0)
(setq newBlock2 (vlax-ename->vla-object (entlast)))
(setq taga2 (getAttVal attList (strcat "TAGA" (substr (cadr pair) 6))))
(setBlockAttr newBlock2 "TAG1" taga2)
(setq x3 (+ x1 (if (< tagNum mirrorThreshold) 1.25 -1.25)))
(setq y3 (/ (+ y1 y2) 2.0))
(setq newPt3 (list x3 y3 0.0))
(if (< tagNum mirrorThreshold)
(command "_-INSERT" "HC01_SPLITTER" newPt3 1 1 0)
(progn
(command "_-INSERT" "HC01_SPLITTER(RIGHT)" newPt3 1 1 0)
(setq splitterEnt (vlax-ename->vla-object (entlast)))
(setq newPos (list (- x3 2.2) y3 0.0))
(vla-move splitterEnt (vlax-3d-point newPt3) (vlax-3d-point newPos))
)
)
;; Extra adjustment for Powerflex DESCA07+ (move all 3 blocks left, splitter up)
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(progn
(setq newX1 (- (car newPt1) 1.8))
(setq newX2 (- (car newPt2) 1.8))
(setq newX3 (- (car newPt3) 1.8))
(setq newY3 (+ (cadr newPt3) 0.0)) ; splitter up
(vla-move newBlock1 (vlax-3d-point newPt1) (vlax-3d-point newX1 (cadr newPt1) (caddr newPt1)))
(vla-move newBlock2 (vlax-3d-point newPt2) (vlax-3d-point newX2 (cadr newPt2) (caddr newPt2)))
(vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point newPt3) (vlax-3d-point newX3 newY3 (caddr newPt3)))
)
)
;; If this is the second block type, shift blocks closer together
(if (= blkName "PLCIO_ARMORBLOCK_SIO")
(progn
(setq moveVecX (if (< tagNum mirrorThreshold) 0.5 -1.4)) ; inward move
(setq newX1 (+ (car newPt1) moveVecX))
(setq newX2 (+ (car newPt2) moveVecX))
(setq newX3 (+ (car newPt3) moveVecX))
(vla-move newBlock1 (vlax-3d-point newPt1) (vlax-3d-point newX1 (cadr newPt1) (caddr newPt1)))
(vla-move newBlock2 (vlax-3d-point newPt2) (vlax-3d-point newX2 (cadr newPt2) (caddr newPt2)))
(vla-move (vlax-ename->vla-object (entlast)) (vlax-3d-point newPt3) (vlax-3d-point newX3 (cadr newPt3) (caddr newPt3)))
)
)
)
)
(setvar "ATTDIA" oldAttdia)
(setvar "ATTREQ" oldAttreq)
)
)
)
)
;; Case 2: single value only
(if (and (/= val1 "") (= val2 ""))
(progn
(setq attTag (if (/= val1 "") (car pair) (cadr pair)))
(setq attObj (getAttObj attList attTag))
(if attObj
(progn
(setq oldAttdia (getvar "ATTDIA"))
(setq oldAttreq (getvar "ATTREQ"))
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 0)
(setq pt (vlax-get attObj 'InsertionPoint))
(setq tagNum (atoi (substr attTag 6)))
(setq xOffset (if (< tagNum mirrorThreshold) 5.5 -5.0))
(setq x (+ (car pt) xOffset))
(setq y (- (cadr pt) 0.5))
(setq xAdjust
(if (and (= blkName "PLCIO_ARMORBLOCK_SIO") (>= tagNum 9))
0.5 ; right side → move slightly left
(if (= blkName "PLCIO_ARMORBLOCK_SIO")
0.7 ; left side → move slightly right
0.0 ; other blocks → no change
)
)
)
;; Extra right shift for Powerflex DESCA07+
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (>= tagNum 7))
(setq xAdjust (+ xAdjust 1.0))
)
(setq insPt (list (+ x xAdjust) y 0.0))
;; For PLCIO_ARMORPOWERFLEX, special DESCA11 block placement
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11))
(setq insPt (list (+ x 2.0) (+ y 0.5) 0.0))
)
;; Insert proper block based on conditions
(if (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11))
(command "_-INSERT" "HC01_CORDSET_STR-STR_STRAIGHT" insPt 1 1 0) ; old block special single
(command "_-INSERT" "CORDSET_STR-STR_1DEVICE PER PORT" insPt 1 1 0) ; other singles
)
(setq newEnt (entlast))
(setq newBlock (vlax-ename->vla-object newEnt))
;; FIX: Keep string version for TAGA, convert to int for comparisons
(setq tagnumStr (substr attTag 6))
(setq tagnum (atoi tagnumStr))
(setq taga (getAttVal attList (strcat "TAGA" tagnumStr)))
(setBlockAttr newBlock "TAG1" taga)
;; For non-special single blocks, move attribute
(if (not (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagNum 11)))
(moveTag1UpLeft newBlock)
)
;; Mirror blocks for DESCA07 and above except special single DESCA11
;; FIX: Use tagnum (integer) instead of comparing with string
(if (and (>= tagnum mirrorThreshold)
(not (and (= blkName "PLCIO_ARMORPOWERFLEX") (= tagnum 11))))
(progn
(command "_MIRROR" newEnt "" insPt (list (car insPt) (+ (cadr insPt) 0.1)) "N")
(entdel newEnt)
)
)
(setvar "ATTDIA" oldAttdia)
(setvar "ATTREQ" oldAttreq)
)
)
)
)
;; ELSE branch: val1 is empty, val2 has value → print warning
(if (and (= val1 "") (/= val2 ""))
(progn
(setq attTag (car pair)) ; Always expect the first attribute to be filled
(setq attObj (getAttObj attList attTag))
(if attObj
(progn
;; Insertion point of the attribute itself
(setq insPt (vlax-get attObj 'InsertionPoint))
;; Draw red circle to mark the issue
(entmakex
(list
(cons 0 "CIRCLE")
(cons 8 "0") ; Layer
(cons 10 insPt) ; Center at attribute
(cons 40 1.3) ; Radius
(cons 62 1) ; Red color
)
)
)
)
)
)
)
(setq i (1+ i))
)
)
(princ (strcat "\n[devlay_update] No blocks named \"" blkName "\" found."))
)
)
(defun c:devlay_update ()
(delete-existing-devlay-blocks)
(process-block-type "PLCIO_ARMORPOWERFLEX" 11)
(process-block-type "PLCIO_ARMORBLOCK_SIO" 16)
(princ)
)

View File

@ -167,6 +167,28 @@
(princ)
)
(defun setLayoutWireNumbers (layoutEnt zoneNumber layoutIndex / vlaBlock att tag wireNumber cblIndex)
(if (and layoutEnt (eq (cdr (assoc 0 (entget layoutEnt))) "INSERT"))
(progn
(setq vlaBlock (vlax-ename->vla-object layoutEnt))
(setq cblIndex 5) ; Start from CBL05
(foreach att (vlax-invoke vlaBlock 'GetAttributes)
(setq tag (strcase (vla-get-tagstring att)))
(if (= tag "WIRENO")
(progn
(setq wireNumber (strcat zoneNumber (itoa (+ 702 layoutIndex)) "-CBL" (if (< cblIndex 10) (strcat "0" (itoa cblIndex)) (itoa cblIndex))))
(vla-put-textstring att wireNumber)
(setq cblIndex (1+ cblIndex))
)
)
)
)
(princ "\nInvalid layout entity passed to setLayoutWireNumbers.")
)
(princ)
)
(defun parseCSVLine (line / pos result)
(setq result '())
(while (setq pos (vl-string-search "," line))
@ -274,9 +296,6 @@
(list dpmList deviceGroups)
)
(defun c:init-diagrams ( / blockName count offsetX i x y)
(clearDrawing)
(setq blockName "layout")
@ -302,10 +321,14 @@
(command "_.-INSERT" blockName basePt 1 1 0)
(setq lastEnt (entlast))
(if lastEnt
(vla-move
(vlax-ename->vla-object lastEnt)
(vlax-3d-point basePt)
(vlax-3d-point targetPt)
(progn
(vla-move
(vlax-ename->vla-object lastEnt)
(vlax-3d-point basePt)
(vlax-3d-point targetPt)
)
;; Set WIRENO attributes in layout block
(setLayoutWireNumbers lastEnt userInput i)
)
)

View File

@ -274,9 +274,6 @@ no (defun clearDrawing ( / ss)
(list dpmList deviceGroups)
)
(defun c:init-diagrams ( / blockName count offsetX i x y)
(clearDrawing)
(setq blockName "layout")

View File

@ -1,175 +0,0 @@
(defun parseCSVLine (line / pos result)
(setq result '())
(while (setq pos (vl-string-search "," line))
(setq result (append result (list (substr line 1 pos))))
(setq line (substr line (+ pos 2)))
)
(append result (list line))
)
(defun getDPMDataFromCSV ( / file filename line headers row dpm ip name dpmList deviceGroups currentGroup)
(setq filename (getfiled "Select CSV File" (strcat (getenv "USERPROFILE") "\\Desktop\\") "csv" 0))
(if (not filename)
(progn (princ "\nNo file selected.") (exit))
)
(setq file (open filename "r"))
(if (not file)
(progn (princ "\nFailed to open file.") (exit))
)
;; Read header line
(read-line file)
(setq dpmList '())
(setq deviceGroups '())
(setq currentGroup '())
(while (setq line (read-line file))
(setq row (parseCSVLine line))
;; DPM name and IP
(setq dpm (nth 0 row))
(setq ip (nth 1 row))
;; Debug output
(princ (strcat "\nProcessing: DPM=" (if dpm dpm "NIL") " IP=" (if ip ip "NIL")))
;; Add unique DPM to list
(if (and dpm (/= dpm "") (not (assoc dpm dpmList)))
(progn
(setq dpmList (append dpmList (list (cons dpm ip))))
(princ (strcat "\nAdded new DPM: " dpm " with IP: " ip))
)
)
;; Device NAME (column 2)
(setq name (nth 2 row))
(if (and name (/= name ""))
(progn
(setq currentGroup (append currentGroup (list name)))
(princ (strcat "\nAdded device: " name " (Group size: " (itoa (length currentGroup)) ")"))
)
)
;; Once 8 devices are collected, add to deviceGroups
(if (= (length currentGroup) 8)
(progn
(setq deviceGroups (append deviceGroups (list currentGroup)))
(princ (strcat "\nCompleted group " (itoa (length deviceGroups)) " with 8 devices"))
(setq currentGroup '())
)
)
)
(close file)
(list dpmList deviceGroups)
)
(defun printDPMData (dpmList deviceGroups / i dpm ip devices device)
(princ "\n--- DPM Data ---")
(princ (strcat "\nTotal DPMs: " (itoa (length dpmList))))
(princ (strcat "\nTotal Device Groups: " (itoa (length deviceGroups))))
(setq i 0)
(foreach dpm dpmList
(princ (strcat "\n\nDPM: " (car dpm)))
(princ (strcat "\nIP: " (cdr dpm)))
(princ "\nDevices:")
(if (< i (length deviceGroups))
(progn
(setq devices (nth i deviceGroups))
(foreach device devices
(princ (strcat "\n - " device))
)
)
(princ "\n No devices found for this DPM")
)
(setq i (1+ i))
)
(princ "\n--- End of Data ---")
)
(defun createTextObjects (dpmList deviceGroups / i dpm ip devices device yPos xPos textContent startY row col)
(setq yPos 0)
(setq xPos 0)
(setq i 0)
(princ "\nCreating text objects...")
(foreach dpm dpmList
(setq startY yPos)
;; Create text for DPM name
(setq textContent (strcat "DPM: " (car dpm)))
(command "TEXT" (list xPos yPos) "2.5" "0" textContent)
(setq yPos (- yPos 5))
;; Create text for IP
(setq textContent (strcat "IP: " (cdr dpm)))
(command "TEXT" (list xPos yPos) "2.0" "0" textContent)
(setq yPos (- yPos 4))
;; Create text for devices in 4x2 grid
(if (< i (length deviceGroups))
(progn
(setq devices (nth i deviceGroups))
(setq row 0)
(setq col 0)
(foreach device devices
;; Calculate position: 4 rows, 2 columns
;; Devices 1,2,3,4 go in left column (col 0)
;; Devices 5,6,7,8 go in right column (col 1)
(if (< row 4)
(setq col 0)
(progn
(setq col 1)
(setq row (- row 4))
)
)
;; Position: left column at xPos, right column at xPos + 40
;; Each row is 3 units apart
(setq textContent device)
(command "TEXT"
(list (+ xPos (* col 40)) (- yPos (* row 3)))
"1.5"
"0"
textContent
)
(setq row (1+ row))
)
)
)
;; Move down for next DPM (leave space for 4 rows + extra spacing)
(setq yPos (- yPos 20))
;; Move to next column if too many entries
(if (< yPos -200)
(progn
(setq xPos (+ xPos 120))
(setq yPos 0)
)
)
(setq i (1+ i))
)
(princ "\nText objects created successfully!")
)
(defun c:getDPMsWithNamesFromCSV ( / result dpmList deviceGroups)
(setq result (getDPMDataFromCSV))
(setq dpmList (nth 0 result))
(setq deviceGroups (nth 1 result))
;; Print the data
(printDPMData dpmList deviceGroups)
;; Create text objects
(createTextObjects dpmList deviceGroups)
(princ)
)