post processing LISP problem

post processing LISP problem

userlevel6
Advocate Advocate
1,124 Views
6 Replies
Message 1 of 7

post processing LISP problem

userlevel6
Advocate
Advocate

Hopefully someone will be able to see where I'm going wrong here.

I'm trying to modify the pnlcomp.lsp to add data to the USER3 field during report generation.  I've been successful replacing the empty data with the word "TAGTYPE" but I can't get it to return to the report dialog.

My code appears to be working until I try to send the data back using the C:WD_RTRN_2WD function.  Every time I enable the line that should do the work, my report dialog reports "processing . . ." and never returns to my control.

 

Here is the section of code I'm working with from the pnlcomp.lsp...

 

(progn ; user didn't cancel out of dialog, okay to continue
(if (= user_1 "1")
(progn
(setq TMPCOUNT 0 TEMPDATA1 nil TEMPDATA2 nil TEMPDATA3 nil)
(setq TEMPDATA1 wd_rdata)
(repeat (length wd_rdata)
; each item is a list in the list of lists named wd_rdata
; 6th item in the first list is the catalog number of the first component in the overall report.
; 32nd item in the first list is the SBT number of the first component in the overall report.
(setq LST (nth TMPCOUNT TEMPDATA1))
(setq TEMPDATA2 (wd_nth_subst 34 "TAGTYPE" LST)) ; replace USER3 field with "TAGTYPE"

(setq LST TEMPDATA2)
(setq TEMPDATA3 (subst LST (nth TMPCOUNT TEMPDATA1) TEMPDATA1))

(setq TEMPDATA1 TEMPDATA3)
(setq TMPCOUNT (1+ TMPCOUNT))
);end repeat
(setq OUTFL1 (open "G:\\jobs\\2018\\21807\\21807A Equipment\\ELEC\\TAGS\\TEST1.txt" "w"))
(princ wd_rdata OUTFL1)(PRINC "\n" OUTFL1)(close OUTFL1)(setq OUTFL1 nil)
(setq OUTFL2 (open "G:\\jobs\\2018\\21807\\21807A Equipment\\ELEC\\TAGS\\TEST2.txt" "w"))
(princ TEMPDATA1 OUTFL2)(PRINC "\n" OUTFL2)(close OUTFL2)(setq OUTFL2 nil)
(setq rtrn TEMPDATA1)
; (princ
; (strcat "\n " (c:wd_msg "WLAY031" (list "1" "pnlcomp.lsp") "Nothing defined for user%1 option (see %2)"))
) ) 😉
(if (= user_2 "1")
(progn
(princ
(strcat "\n " (c:wd_msg "WLAY031" (list "2" "pnlcomp.lsp") "Nothing defined for user%1 option (see %2)"))
) ) )
(if (= user_3 "1")
(progn
(princ
(strcat "\n " (c:wd_msg "WLAY031" (list "3" "pnlcomp.lsp") "Nothing defined for user%1 option (see %2)"))
) ) )
)
)
(c:wd_rtrn_2wd rtrn) ; return post-processed list back to AutoCAD Electrical's report dialog

 

I'm stumped... beginning to think the error is in the dialog itself, because the test files I'm outputting (TEST1.txt and TEST2.txt) appear to show everything works... until I try to apply the updated data to the "rtrn" variable.

0 Likes
Accepted solutions (1)
1,125 Views
6 Replies
Replies (6)
Message 2 of 7

rhesusminus
Mentor
Mentor

I guess @PatMurnen_Adsk should have a look at this.

 

I've spent too much time trying to figure this one out, without success. AcadE just hangs when the list is returned to the reportgenerator. AEONLISPDEBUG does not give any hints on what's wrong either.

 

Here's my take on doing the same as you:

 

      (if (= user_1 "1")
        (progn
          (setq rtrn '() row nil newrow nil)
          (foreach row wd_rdata
            (setq newrow (wd_nth_subst 34 "TAGTYPE" row))
            (setq rtrn (cons newrow rtrn))
          )
          (setq rtrn (reverse rtrn))
        )
      )

Trond Hasse Lie
EPLAN Expert and ex-AutoCAD Electrical user.
Ctrl Alt El
Please select "Accept Solution" if this post answers your question. 'Likes' won't hurt either. 😉
0 Likes
Message 3 of 7

PatMurnen_Adsk
Alumni
Alumni
Accepted solution

It looks to me like the pnlcomp.lsp file as provided is not correct. Even if you return the data as passed to the user post it locks up on return.

 

The Panel Component report is pretty similar to the Schematic Component report so I took a look at the comp.lsp file to see how it handled the data. I can see a difference right away.

 

At the top pnlcomp.lsp uses only the first element of the data passed. 

 (if (AND wd_rdata (car wd_rdata) (listp (car wd_rdata)))
   (setq wd_rdata (car wd_rdata))) ; just go with first list of lists (report data)

And when returning it only passes that same list back.

(c:wd_rtrn_2wd rtrn)

But, in comp.lsp it assignsthe 2nd element of the data passed in to variable rtrn_part2-

  (if (AND wd_rdata (car wd_rdata) (listp (car wd_rdata)))
    (progn ; Data comes across as two parallel lists. The first
           ; list (car wd_data) carries a sublist of data for each line of the 
           ; report. The parallel list (cadr wd_data) carries a flag for each
           ; line in the first list. A '1' means that the line in the first list
           ; represents the first or only line of data for a given component.
           ; A '2" means that this line of data is a "subassy" line of data and
           ; goes with the previous '1" entry. For example, a component that has
           ; one main line and three subassy lines of data would have parallel
           ; flags in the 2nd list of ...1 2 2 2.... If you insert extra lines
           ; into the first list or remove lines from the first list, you need
           ; to add or remove corresponding entries from the 2nd list to keep
           ; the two lists synchronized. 
      (setq rtrn (car wd_rdata)) ; this is the 1st list, the data sublist list
      (setq rtrn_part2 (cadr wd_rdata)) ; this is the "flag" list of 1's and 2's
  ) )    

And when it returns data back it returns both parts; rtrn which carries the updated report data and rtrn_part2 which is unchanged in this case.

(c:wd_rtrn_2wd (list rtrn rtrn_part2))

So if those changes are made to pnlcomp.lsp and then the code when option 1 is selected can be very similar to what Trond had (just using a different variable to create the new list of data) -

	  (if (= user_1 "1")
	    (progn
          (setq newdatalst '() row nil newrow nil)
          (foreach row rtrn
            (setq newrow (wd_nth_subst 34 "TAGTYPE" row))
            (setq newdatalst (cons newrow newdatalst))
          )
          (setq rtrn (reverse newdatalst))
      ) )		

I have attached my test pnlcomp.lsp file if you want to take a look.

 

Sorry for this and I will make sure it gets logged.

 

I didn't try this with the option to have a user post run automatically but my guess is some changes need to be made for that to work. Did you eventually intend to have this user post run automatically (as defined by a report format file .set file)? If so, I will spend some time to see if that works.

 

Regards,

Pat Murnen



Pat Murnen
Principal Content Developer
Product Development – AutoCAD Product Line Group

Autodesk, Inc.

Message 4 of 7

userlevel6
Advocate
Advocate

yeah, I spent much of the day yesterday trying a couple different methods.  Here's another...

 

(setq TMPCOUNT 0 TEMPDATA1 nil TEMPDATA2 nil TEMPDATA3 nil)
(setq TEMPDATA1 wd_rdata)
(repeat (length wd_rdata)
; each item is a list in the list of lists named wd_rdata
; 6th item in the first list is the catalog number of the first component in the overall report.
; 32nd item in the first list is the USER1 field of the first component in the overall report.
 (setq LST (nth TMPCOUNT TEMPDATA1))
 (setq TEMPDATA2 (wd_nth_subst 34 "TAGTYPE" LST)) ; replace USER3 field with "TAGTYPE"

 (setq LST TEMPDATA2)
 (setq TEMPDATA3 (subst LST (nth TMPCOUNT TEMPDATA1) TEMPDATA1))

 (setq TEMPDATA1 TEMPDATA3)
 (setq TMPCOUNT (1+ TMPCOUNT))
);end repeat

; output test files
(setq OUTFL1 (open "C:\\scrap\\TEST1.txt" "w"))
(princ wd_rdata OUTFL1)(PRINC "\n" OUTFL1)(close OUTFL1)(setq OUTFL1 nil)
(setq OUTFL2 (open "C:\\scrap\\TEST2.txt" "w"))
(princ TEMPDATA1 OUTFL2)(PRINC "\n" OUTFL2)(close OUTFL2)(setq OUTFL2 nil)
(setq rtrn TEMPDATA1)

 

... and it ends with exactly the same "processing . . ." hang.

It appears to me the list isn't in the correct format when returned.  I suspect the c:wd_rtrn_2wd is expecting the items in the list to be quoted, but then how are quotes handled by the report function(s)... so I tested with some items that have no quotes in the descriptions, still no joy.

0 Likes
Message 5 of 7

userlevel6
Advocate
Advocate

I see Pat M. has posted what should be my solution while I was posting my last message... thanks in advance!

0 Likes
Message 6 of 7

userlevel6
Advocate
Advocate

In case anyone is interested in where I was headed with this, I started a routine to apply Murrplastik tag types to the report and do some formatting.  Here's what I've got so far.  Sorry for the lack of formatting.  I named this MURRTagsAE.lsp, and it's called using a (load "MURRTagsAE") statement as the User1 post-processing routine.

 

; This is a splice used by AutoCAD Electrical for
; identifying MURR tag types to include in report functions.
; This file is called by pnlcomp.lsp and comp.lsp routines which
; should be located in the same folder where this file is found.

; note PNLCOMP table references must bump up 2 fields (after LOC field 12) vs COMP
; table references due to MOUNT and GROUP
; being added to the PNLCOMP format definition.
; This means for example COMP's (nth 34 row) is PNLCOMP's (nth 36 row)
; this applies ONLY AFTER field 12!!

(setq newdatalst '() row nil newrow nil)
(foreach row rtrn
(setq TAGTYPE "TAGTYPE" TAGSTRING (nth 1 row) DESCTEMP nil CONTACTOR nil)
(setq CATTEMP (nth 6 row)) ; get catalog number
(setq DESC1 (nth 7 row) DESCTEMP DESC1 DESC2 (nth 8 row) DESC3 (nth 9 row)) ; get DESCRIPTION fields
(if DESC2
(progn
(if (eq DESC2 "AC MOTOR CONTROLLER")(setq CONTACTOR "AC MOTOR CONTROLLER")(setq DESCTEMP (strcat DESC1 " " DESC2)))
(if (eq DESC2 "BRAKE RELEASE")(setq CONTACTOR "BRAKE RELEASE")(setq DESCTEMP (strcat DESC1 " " DESC2)))
)
)
(if DESC3
(progn
(if (eq DESC3 "CONTACTOR")(setq CONTACTOR (strcat CONTACTOR " " "CONTACTOR"))(setq DESCTEMP (strcat DESC1 " " DESC2 " " DESC3)))
(if (eq DESC3 "AC MOTOR CONTROLLER")(setq CONTACTOR "AC MOTOR CONTROLLER")(setq DESCTEMP (strcat DESC1 " " DESC2 " " DESC3)))
)
)
(if (and (not (eq CONTACTOR "BRAKE RELEASE"))(not (eq (nth 8 row) "")))(setq DESC2 (nth 8 row))(setq DESCTEMP (strcat DESCTEMP " " (nth 8 row))))
(if (and (not (eq CONTACTOR "BRAKE RELEASE"))(not (eq (nth 9 row) "")))(setq DESC3 (nth 9 row))(setq DESCTEMP (strcat DESCTEMP " " (nth 9 row))))
(setq IDTAGTEMP (nth 1 row)) ; get device ID
(if (eq REPORTYPE "COMP")
(setq FAMILYTEMP (nth 43 row)) ; COMP report get device FAMILY CODE
(setq FAMILYTEMP (nth 45 row)) ; PNLCOMP report get device FAMILY CODE
)
; (PRINC FAMILYTEMP)(PRINC "\n")(PRINC REPORTYPE)(PRINC "\n")
(cond
((= (substr CATTEMP 1 5) "100-K") (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -" (if DESCTEMP DESCTEMP "") "\\\\" (if CONTACTOR CONTACTOR "") "\\\\")))
((= (substr CATTEMP 1 5) "104-C") (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -" (if DESCTEMP DESCTEMP "") "\\\\" (if CONTACTOR CONTACTOR "") "\\\\")))
((= (substr CATTEMP 1 5) "25B-D") (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -" (if DESCTEMP DESCTEMP "") "\\\\" (if CONTACTOR CONTACTOR "") "\\\\")))

; ((AND (= (SUBSTR IDTAGTEMP 1 1) "C")
; (numberp (SUBSTR IDTAGTEMP 2 1))
; ) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\" (nth 8 row) "\\AC MOTOR CONTROLLER\\")))
((= (SUBSTR FAMILYTEMP 1 2) "AM") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "AN") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "CB") (setq TAGTYPE "84"))
((= (SUBSTR FAMILYTEMP 1 2) "C0") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "CR") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "DN") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "DR") (setq TAGTYPE "86"))
((= (SUBSTR FAMILYTEMP 1 2) "DS") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "EN") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "FM") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "FS") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((AND (= (SUBSTR FAMILYTEMP 1 2) "FU")(= (SUBSTR CATTEMP 1 6) "1492-F")) (setq TAGTYPE "46Z"))
((AND (= (SUBSTR FAMILYTEMP 1 2) "FU")(= (SUBSTR CATTEMP 1 6) "1492-H")) (setq TAGTYPE "54"))
((AND (= (SUBSTR FAMILYTEMP 1 2) "XF")(= (SUBSTR CATTEMP 1 5) "1321-")) (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "LS") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((= (SUBSTR FAMILYTEMP 1 2) "LT") (setq TAGTYPE "85 OR PB3"))
((= (SUBSTR FAMILYTEMP 1 4) "MISC") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "MO") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\MOTOR " IDTAGTEMP "\\\\")))
((= (SUBSTR FAMILYTEMP 1 3) "MTR") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\MOTOR " IDTAGTEMP "\\\\")))
((= (SUBSTR FAMILYTEMP 1 2) "MS") (setq TAGTYPE "86"))
((= (SUBSTR FAMILYTEMP 1 2) "NP") (setq TAGTYPE "PB3"))
((= (SUBSTR FAMILYTEMP 1 2) "OL") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "PB") (setq TAGTYPE "PB3"))
((= (SUBSTR FAMILYTEMP 1 2) "PE") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((= (SUBSTR FAMILYTEMP 1 5) "PLCIO") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "PM") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "PS") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((= (SUBSTR FAMILYTEMP 1 2) "PW") (setq TAGTYPE "86"))
((= (SUBSTR FAMILYTEMP 1 2) "PX") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((= (SUBSTR FAMILYTEMP 1 2) "RE") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "SS") (setq TAGTYPE "PB3"))
((= (SUBSTR FAMILYTEMP 1 2) "SU") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "SW") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "TD") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "TS") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "VM") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "W0") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "WW") (setq TAGTYPE "NO TAG"))
((AND (= (SUBSTR FAMILYTEMP 1 2) "XF")(= (SUBSTR CATTEMP 1 5) "35-10")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL XFMR\\\\480VAC PRI/240VAC SEC\\\\")))
((AND (= (SUBSTR FAMILYTEMP 1 2) "XF")(= (SUBSTR CATTEMP 1 5) "80-10")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL XFMR\\\\480VAC PRI/240VAC SEC\\\\")))
((AND (= (SUBSTR FAMILYTEMP 1 2) "XF")(= (SUBSTR CATTEMP 1 5) "CE06-")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL XFMR\\\\480VAC PRI/240VAC SEC\\\\")))
((AND (= (SUBSTR FAMILYTEMP 1 2) "XF")(= (SUBSTR CATTEMP 1 5) "FS-2-")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL XFMR\\\\480VAC PRI/240VAC SEC\\\\")))
((AND (= (SUBSTR FAMILYTEMP 1 2) "XF")(= (SUBSTR CATTEMP 1 5) "T-1-8")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -HOT WIRE XFMR\\\\240VAC PRI/32VAC SEC\\\\")))
((= (SUBSTR FAMILYTEMP 1 4) "TRMS") (setq TAGTYPE "51"))
((= (SUBSTR FAMILYTEMP 1 2) "DI") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "CA") (setq TAGTYPE "85"))
((= (SUBSTR FAMILYTEMP 1 2) "SD") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((= (SUBSTR FAMILYTEMP 1 2) "SV") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
(t nil)
) ;end cond
(cond
((= (SUBSTR IDTAGTEMP 1 2) "AB") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 2) "AC") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 2) "AH") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 2) "AN") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 2) "AM") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 3) "AMP") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 3) "APS") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((= (SUBSTR IDTAGTEMP 1 3) "ASV") (setq TAGTYPE "580" TAGSTRING (strcat "\\\\" DESCTEMP "\\\\" IDTAGTEMP " ADDR\\\\")))
((= (SUBSTR IDTAGTEMP 1 2) "DB") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 3) "ESW") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 3) "IND") (setq TAGTYPE "85"))
((= (SUBSTR IDTAGTEMP 1 3) "PLC") (setq TAGTYPE "85"))
((AND (= (SUBSTR IDTAGTEMP 1 3) "RPS")(= (SUBSTR CATTEMP 1 8) "1606-XLE")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL PWR SPLY\\\\240VAC PRI-24VDC SEC\\\\")))
((AND (= (SUBSTR IDTAGTEMP 1 3) "RPS")(= (SUBSTR CATTEMP 1 9) "1606-XLSD")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL PWR SPLY\\\\240VAC PRI-24VDC SEC\\\\")))
((AND (= (SUBSTR IDTAGTEMP 1 3) "RPS")(= (SUBSTR CATTEMP 1 9) "1606-XLS4")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL PWR SPLY\\\\240VAC PRI-24VDC SEC\\\\")))
((AND (= (SUBSTR IDTAGTEMP 1 3) "RPS")(= (SUBSTR CATTEMP 1 9) "1606-XLS9")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL PWR SPLY\\\\480VAC PRI-24VDC SEC\\\\")))
((AND (= (SUBSTR IDTAGTEMP 1 3) "RPS")(= (SUBSTR CATTEMP 1 7) "1606-XL")) (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -CTRL PWR SPLY\\\\480VAC PRI-24VDC SEC\\\\")))
((= (substr IDTAGTEMP 1 4) "RECP") (setq TAGTYPE "86" TAGSTRING (STRCAT "\\\\" IDTAGTEMP " -115VAC GFCI OUTLET\\\\FOR PLC PERIPHERAL USE ONLY\\\\")))
(t nil)
) ;end cond
(if (eq REPORTYPE "COMP")
(progn
(setq NEWROW (wd_nth_subst 31 TAGSTRING row)) ;replaces USER2 with text to go on the plastic tag
(setq NEWROW (wd_nth_subst 32 TAGTYPE NEWrow)) ;replaces USER3 with tagtype
)
)
(if (eq REPORTYPE "PNLCOMP")
(progn
(setq NEWROW (wd_nth_subst 33 TAGSTRING row)) ;replaces USER2 with text to go on the plastic tag
(setq NEWROW (wd_nth_subst 34 TAGTYPE NEWrow)) ;replaces USER3 with tagtype
)
)
(setq NEWDATALST (cons NEWROW NEWDATALST))
)
(setq rtrn (reverse newdatalst))

 

Message 7 of 7

yuvaraj_jaganathan
Autodesk
Autodesk

Hi,

This issue is resolved in the newly released AutoCAD Electrical 2021.

Details on the new features is available the following link:

http://help.autodesk.com/view/ACAD_E/2021/ENU/?guid=GUID-AA86AADC-A7AC-43FF-94F8-0593B43C85B2

Regards,
Yuvaraj Jaganathan
Senior QA Analyst
www.autodesk.com


0 Likes