Dude_Guy Posted June 26, 2017 Posted June 26, 2017 Hello. I am wondering if it would be possible to modify this code to pull the prompt, rather than the tag name? It works with two other files, and I can attach them if necessary. (defun TE3 (ent / DCLID entg cnt CNT2 chk lisn lism lisd goval entf entn) ; (setq olderr *error* ; *error* TE3ERR ; ) (COMMAND "_.UNDO" "_GROUP") ; (SETQ ENT (CAR (ENTSEL))) (setq entf ent) (setq chk nil cnt 0 lisn '() lism '() lisd '() ) (while (and (/= ent nil) (= chk nil)) (setq entg (entget ent)) (if (= (strcase (cdr (assoc 0 entg))) "ATTRIB") (PROGN (setq cnt (1+ cnt)) (SETQ LISN (CONS CNT LISN)) (SETQ LISM (CONS (CDR (ASSOC 1 entg)) lism)) (SETQ LISD (CONS (CDR (ASSOC 2 entg)) lisd)) ) ) (if (/= (assoc -2 entg) nil) (setq chk 1) ) (setq ent (entnext ent)) ) (if (and (> cnt 0) (< cnt 18)) ;ADDED A 17TH LINE AET 5/18/15 (progn (setq lisn (reverse lisn)) (setq lism (reverse lism)) (setq lisd (reverse lisd)) (SETQ DCLID (LOAD_DIALOG "TE3")) (if (not (new_dialog "TE3" dclid)) (exit) ) (ACTION_TILE "edit_1" "(SETQ edit_1 $VALUE)(MODT \"edit_2\")" ) (ACTION_TILE "edit_2" "(SETQ edit_2 $VALUE)(MODT \"edit_3\")" ) (ACTION_TILE "edit_3" "(SETQ edit_3 $VALUE)(MODT \"edit_4\")" ) (ACTION_TILE "edit_4" "(SETQ edit_4 $VALUE)(MODT \"edit_5\")" ) (ACTION_TILE "edit_5" "(SETQ edit_5 $VALUE)(MODT \"edit_6\")" ) (ACTION_TILE "edit_6" "(SETQ edit_6 $VALUE)(MODT \"edit_7\")" ) (ACTION_TILE "edit_7" "(SETQ edit_7 $VALUE)(MODT \"edit_8\")" ) (ACTION_TILE "edit_8" "(SETQ edit_8 $VALUE)(MODT \"edit_9\")" ) (ACTION_TILE "edit_9" "(SETQ edit_9 $VALUE)(MODT \"edit_10\")" ) (ACTION_TILE "edit_10" "(SETQ edit_10 $VALUE)(MODT \"edit_11\")" ) (ACTION_TILE "edit_11" "(SETQ edit_11 $VALUE)(MODT \"edit_12\")" ) (ACTION_TILE "edit_12" "(SETQ edit_12 $VALUE)(MODT \"edit_13\")" ) (ACTION_TILE "edit_13" "(SETQ edit_13 $VALUE)(MODT \"edit_14\")" ) (ACTION_TILE "edit_14" "(SETQ edit_14 $VALUE)(MODT \"edit_15\")" ) (ACTION_TILE "edit_15" "(SETQ edit_15 $VALUE)(MODT \"edit_16\")" ) (ACTION_TILE "edit_16" "(SETQ edit_16 $VALUE)(MODT \"edit_17\")" ;ADDED A 17TH LINE AET 5/18/15 ) (ACTION_TILE "edit_17" "(SETQ edit_16 $VALUE)(MODT \"OK\")") (ACTION_TILE "OK" "(setq lism (get_vals cnt))(setq goval 1)(DONE_DIALOG)") (ACTION_TILE "CANCEL" "(DONE_DIALOG)") (SETQ CNT2 0) (WHILE (/= (NTH CNT2 LISM) NIL) (SET_TILE (STRCAT "edit_" (ITOA (NTH CNT2 LISN))) (nth CNT2 lism)) (SET_TILE (STRCAT "prompt_" (ITOA (NTH CNT2 LISN))) (nth CNT2 lisd)) (SETQ CNT2 (1+ CNT2)) ) (SETQ CNT2 (+ 1 CNT)) (WHILE (<= CNT2 17) (MODE_TILE (STRCAT "edit_" (ITOA CNT2)) 1) (SETQ CNT2 (1+ CNT2)) ) (MODE_TILE "edit_1" 2) (start_dialog) ;***main part (if (= goval 1) (progn (setq cnt2 0 entn entf chk nil) (while (and (/= entn nil) (= chk nil) (< CNT2 CNT)) (setq entg (entget entn)) (if (= (strcase (cdr (assoc 0 entg))) "ATTRIB") (PROGN (SETQ ENTG (SUBST (CONS 1 (nth cnt2 lism)) (ASSOC 1 entg) entg)) (setq cnt2 (1+ cnt2)) (ENTMOD ENTG)(ENTUPD ENTF) ) ) (if (/= (assoc -2 entg) nil) (setq chk 1) ) (setq entn (entnext entn)) ) ) ) ) ) ; (setq *error* olderr) ; Restore old *error* handler (command "_.UNDO" "_end") (prin1) ) (DEFUN MODT (TG) (IF (= $REASON 1) (MODE_TILE TG 2) ) ) (defun get_vals (cnt / cnt2 lism) (setq lism '() cnt2 0) (while (< cnt2 cnt) (SETQ LISM (CONS (GET_TILE (STRCAT "edit_" (ITOA (NTH CNT2 LISN)))) lism)) (SETQ cnt2 (1+ cnt2)) ) (setq lism (reverse lism)) lism ) Quote
Tharwat Posted June 26, 2017 Posted June 26, 2017 Hi, In DXF codes as per your way; (defun promptstring (blockname tagstring / obj ent lst) ;; Tharwat - Date: 26.Jun.2017 ;; (if (and (tblsearch "BLOCK" blockname) (setq obj (tblobjname "BLOCK" blockname)) ) (while (setq obj (entnext obj)) (and (= (cdr (assoc 0 (setq ent (entget obj)))) "ATTDEF") (= (cdr (assoc 2 ent)) tagstring) (setq lst (cons (cdr (assoc 3 ent)) lst)) ) ) ) lst ) Quote
Dude_Guy Posted June 26, 2017 Author Posted June 26, 2017 Sorry, I'm kind of new to LISP and these programs were written by an engineer in my company quite a while ago (he is no longer with us). Would I just put that code at the top of my lisp file and then use assoc 3 to pull the prompt? Quote
Tharwat Posted June 26, 2017 Posted June 26, 2017 How do you select Attributed block(s) ? because I see you commented the codes that asks the user to pick an object. Quote
Dude_Guy Posted June 26, 2017 Author Posted June 26, 2017 ;TE.LSP VER2008.1 ;Universal text editor (text, mtext, dimensions, leader text, title blocks, tags, etc..) (defun TEERR (s) (if (/= s "Function cancelled") ; If an error (such as CTRL-C) occurs (princ (strcat "\nError: " s)) ; while this command is active... ) (setvar "attdia" attd) (command "_.UNDO" "_end") (setq *error* olderr) ; Restore old *error* handler (princ) ) (DEFUN C:te (/ z1 z2 lis ENT CLA FRAC ENTl entg cmde bnm NNT1 NNT2 DOD ATTD) (setq olderr *error* *error* TEERR) (COMMAND "_.UNDO" "_GROUP") (SETQ ATTD (GETVAR "ATTDIA")) (SETVAR "ATTDIA" 0) (SETQ CHKSTAT 1) (WHILE (NOT ENT) (SETQ ENT (CAR (ENTSEL))) ) (IF (= (CDR (ASSOC 0 (ENTGET ENT))) "DIMENSION") (PROGN (SETQ NNT (SERD ENT)) (SETQ NNT (FILT NNT)) (DEFTIL) (IF (= CHKSTAT 1) (COMMAND "DIM1" "NEWTEXT" NNT ENT "")) ) ) (IF (= (CDR (ASSOC 0 (ENTGET ENT))) "TEXT") (PROGN (SETQ NNT (CDR (ASSOC 1 (ENTGET ENT)))) (DEFTIL) (IF (= CHKSTAT 1) (PROGN (SETQ ENTG (ENTGET ENT)) (SETQ entg (SUBST (CONS 1 nnt) (ASSOC 1 entg) entg)) (entmod entg) ) ) ) ) (IF (= (CDR (ASSOC 0 (ENTGET ENT))) "MTEXT") (progn (COMMAND "_ddedit" ent) (command "") ) ) (IF (and (= (CDR (ASSOC 0 (ENTGET ENT))) "INSERT") (/= (CDR (ASSOC 2 (ENTGET ENT))) "DTAG") (/= (CDR (ASSOC 2 (ENTGET ENT))) "DTAG2")) (progn (load "te3") (te3 ent) ) ) (IF (and (= (CDR (ASSOC 0 (ENTGET ENT))) "INSERT") (OR (= (CDR (ASSOC 2 (ENTGET ENT))) "DTAG") (= (CDR (ASSOC 2 (ENTGET ENT))) "DTAG2"))) (PROGN (SETQ DOD 1) (SETQ Z1 (ENTGET (ENTNEXT ENT))) (SETQ Z2 (ENTGET (ENTNEXT (ENTNEXT ENT)))) (SETQ NNT1 (CDR (ASSOC 1 Z1))) (SETQ NNT2 (CDR (ASSOC 1 Z2))) (DEFTIL2) (SETQ NNT2 (FTAG NNT2)) (IF (= DOD 1) (PROGN (SETQ Z1 (ENTGET (ENTNEXT ENT))) (SETQ Z2 (ENTGET (ENTNEXT (ENTNEXT ENT)))) (SETQ Z1 (SUBST (CONS 1 nnt1) (ASSOC 1 Z1) Z1)) (SETQ Z2 (SUBST (CONS 1 nnt2) (ASSOC 1 Z2) Z2)) (ENTMOD Z1)(ENTMOD Z2) (SETQ Z2 (SUBST (CONS 41 0.75) (ASSOC 41 Z2) Z2)) (ENTMOD Z2) (IF (> (STRLEN NNT2) 0) ;LINES FOR WIDTH FACTOR REDUCTION OF BOTTOM TEXT (IF (> (STRLEN NNT2) 6) (PROGN (SETQ Z2 (SUBST (CONS 41 (* (/ 6.0 (STRLEN NNT2)) 0.75)) (ASSOC 41 Z2) Z2)) (ENTMOD Z2) ) ) ) (ENTUPD ENT) ) ) ) ) (SETQ ENT NIL NNT NIL NNT1 NIL NNT2 NIL) (setvar "attdia" attd) (command "_.undo" "_end") (setq *error* olderr) ; Restore old *error* handler (prin1) ) (defun deftil (/ DCL_ID) (IF (< (SETQ DCL_ID (LOAD_DIALOG "TE.DCL")) 0) (EXIT)) (NEW_DIALOG "TE" DCL_ID) (set_tile "TXT" nnt) (SETQ NNTOLD NNT) ; (action_tile "TXT" "(setq nnt $value)(MODT \"OK\")") ; (action_tile "OK" "(done_dialog)") (action_tile "CANCEL" "(SETQ CHKSTAT NIL)(setq nnt NIL)(done_dialog)") (action_tile "TXT" "(setq nnt $value)") (start_dialog) (DONE_DIALOG) ) (DEFUN MODT (TG) (IF (= $REASON 1) (MODE_TILE TG 2) ) ) (defun deftil2 (/ DCL_ID) (IF (< (SETQ DCL_ID (LOAD_DIALOG "TE2.DCL")) 0) (EXIT)) (NEW_DIALOG "TE2" DCL_ID) (set_tile "TXT1" nnt1) (set_tile "TXT2" nnt2) (action_tile "TXT1" "(setq nnt1 $value)(MODT \"TXT2\")") (action_tile "TXT2" "(setq nnt2 $value)(MODT \"DONE\")") (action_tile "DONE" "(done_dialog)") (action_tile "CANCEL" "(SETQ DOD NIL)(done_dialog)") (MODE_TILE "TXT1" 2) (start_dialog) (DONE_DIALOG) ) ;; SERD >DIMENSION >returns nested text string(s) IN DIMENSION (DEFUN SERD (ENT / BOOL ENTL ENTG ENT2 ENTG2 DEF DEF2 TB) (SETQ BOOL "T" ENTL ENT ENTG NIL DEF "" DEF2 "" ENT2 NIL ENTG2 NIL tb nil) (IF (= (CDR (ASSOC 0 (ENTGET ENT))) "DIMENSION") (PROGN (SETQ TB (TBLSEARCH "BLOCK" (CDR (ASSOC 2 (ENTGET ENT))))) (SETQ ENTL (CDR (ASSOC -2 TB))) (WHILE (= BOOL "T") (SETQ ENTG (ENTGET ENTL)) ; (IF (AND (= (CDR (ASSOC 0 ENTG)) "TEXT") ; (/= (CDR (ASSOC 1 ENTG)) "") ; ) (IF (OR (AND (= (CDR (ASSOC 0 ENTG)) "TEXT") (/= (CDR (ASSOC 1 ENTG)) "") ) (AND (= (CDR (ASSOC 0 ENTG)) "MTEXT") (/= (CDR (ASSOC 1 ENTG)) "") ) ) (PROGN (SETQ BOOL NIL) (SETQ DEF (CDR (ASSOC 1 ENTG))) ; (IF (= (CDR (ASSOC 0 (ENTGET (ENTNEXT ENTL)))) "TEXT") (IF (OR (= (CDR (ASSOC 0 (ENTGET (ENTNEXT ENTL)))) "TEXT") (= (CDR (ASSOC 0 (ENTGET (ENTNEXT ENTL)))) "MTEXT")) (PROGN (SETQ ENT2 (ENTNEXT ENTL)) (SETQ ENTG2 (ENTGET ENT2)) (IF (OR (= (CDR (ASSOC 0 ENTG2)) "TEXT") (= (CDR (ASSOC 0 ENTG2)) "MTEXT")) (SETQ DEF2 (CDR (ASSOC 1 ENTG2))) ) ) ) ) (PROGN (SETQ ENTL (ENTNEXT ENTL)) (SETQ ENTG NIL) ) ) ) ) (SETQ DEF (CDR (ASSOC 1 (ENTGET ENT))) DEF2 "") ) (STRCAT DEF2 DEF) ) (DEFUN FTAG (STRNG / CHK NSTRNG SIG) (SETQ NSTRNG STRNG SIG "\"") (IF (> (STRLEN STRNG) 0) (SETQ CHK (SUBSTR STRNG (STRLEN STRNG) 1)) (SETQ CHK "\"") ) (IF (/= CHK "\"") (PROGN (IF (= STRNG "") (SETQ SIG "")) (IF (> (STRLEN STRNG) 2) (PROGN (IF (OR (= (SUBSTR STRNG (1- (STRLEN STRNG))) "mm") (= (SUBSTR STRNG (- (STRLEN STRNG) 2)) "npt")) (SETQ NSTRNG STRNG) (SETQ NSTRNG (STRCAT STRNG SIG)) ) ) (IF (OR (= STRNG "-") (= STRNG "")) (SETQ NSTRNG STRNG) (SETQ NSTRNG (STRCAT STRNG SIG)) ) ) ) ) NSTRNG ) (DEFUN FILT (NNT / SLEN TXT CNT) (SETQ SLEN (STRLEN NNT)) (SETQ TXT "") (IF (> SLEN 1) (PROGN (SETQ CNT SLEN) (WHILE (> CNT 0) (IF (= (SUBSTR NNT CNT 1) ";") (PROGN (SETQ TXT (SUBSTR NNT (1+ CNT) (- SLEN CNT))) (SETQ CNT 0) ) (SETQ CNT (1- CNT)) ) ) ) ) TXT ) Quote
Tharwat Posted June 26, 2017 Posted June 26, 2017 Regardless of all your posted codes so here I am trying to help you with a specific task. Just ignore my above posted function and consider the following and just add it at the top of TE3 function; (defun promptstring (blockname / obj ent lst) ;; Tharwat - Date: 26.Jun.2017 ;; (if (and (tblsearch "BLOCK" blockname) (setq obj (tblobjname "BLOCK" blockname)) ) (while (setq obj (entnext obj)) (and (= (cdr (assoc 0 (setq ent (entget obj)))) "ATTDEF") (setq lst (cons (cdr (assoc 3 ent)) lst)) ) ) ) (if lst (car lst)) ) And in the funciton TE3 just replace this; (SETQ LISD (CONS (CDR (ASSOC 2 entg)) lisd)) With this; (SETQ LISD (CONS (promptstring (cdr (assoc 2 (entget ent)))) lisd)) NOTE: The Attributed Block must be regular one and not Dynamic otherwise you need to get the name of the block with vla-get-effectivename funciton. Quote
Dude_Guy Posted June 26, 2017 Author Posted June 26, 2017 I have done this, and autocad just crashes when trying to load the editor? I don't think there was much I could mess up, and I don't think this block is dynamic? I shouldn't have to edit the .DCL right? ;ADDED A 17TH LINE AET 5/18/15 ;EDITED TO PULL PROMPTS INSTEAD OF TAGS AET 6/26/17 ;Used by TE.LSP for editing blocks with attributes ; Program to pull prompts: (defun promptstring (blockname / obj ent lst) ;; Tharwat - Date: 26.Jun.2017 ;; (if (and (tblsearch "BLOCK" blockname) (setq obj (tblobjname "BLOCK" blockname)) ) (while (setq obj (entnext obj)) (and (= (cdr (assoc 0 (setq ent (entget obj)))) "ATTDEF") (setq lst (cons (cdr (assoc 3 ent)) lst)) ) ) ) (if lst (car lst)) ) (defun TE3 (ent / DCLID entg cnt CNT2 chk lisn lism lisd goval entf entn) ; (setq olderr *error* ; *error* TE3ERR ; ) (COMMAND "_.UNDO" "_GROUP") ; (SETQ ENT (CAR (ENTSEL))) (setq entf ent) (setq chk nil cnt 0 lisn '() lism '() lisd '() ) (while (and (/= ent nil) (= chk nil)) (setq entg (entget ent)) (if (= (strcase (cdr (assoc 0 entg))) "ATTRIB") (PROGN (setq cnt (1+ cnt)) (SETQ LISN (CONS CNT LISN)) (SETQ LISM (CONS (CDR (ASSOC 1 entg)) lism)) (SETQ LISD (CONS (promptstring (cdr (assoc 2 (entget ent)))) lisd)) ; gets prompts using above fcn ; (SETQ LISD (CONS (CDR (ASSOC 2 entg)) lisd)) ) ) (if (/= (assoc -2 entg) nil) (setq chk 1) ) (setq ent (entnext ent)) ) (if (and (> cnt 0) (< cnt 18)) ;ADDED A 17TH LINE AET 5/18/15 (progn (setq lisn (reverse lisn)) (setq lism (reverse lism)) (setq lisd (reverse lisd)) (SETQ DCLID (LOAD_DIALOG "TE3")) (if (not (new_dialog "TE3" dclid)) (exit) ) (ACTION_TILE "edit_1" "(SETQ edit_1 $VALUE)(MODT \"edit_2\")" ) (ACTION_TILE "edit_2" "(SETQ edit_2 $VALUE)(MODT \"edit_3\")" ) (ACTION_TILE "edit_3" "(SETQ edit_3 $VALUE)(MODT \"edit_4\")" ) (ACTION_TILE "edit_4" "(SETQ edit_4 $VALUE)(MODT \"edit_5\")" ) (ACTION_TILE "edit_5" "(SETQ edit_5 $VALUE)(MODT \"edit_6\")" ) (ACTION_TILE "edit_6" "(SETQ edit_6 $VALUE)(MODT \"edit_7\")" ) (ACTION_TILE "edit_7" "(SETQ edit_7 $VALUE)(MODT \"edit_8\")" ) (ACTION_TILE "edit_8" "(SETQ edit_8 $VALUE)(MODT \"edit_9\")" ) (ACTION_TILE "edit_9" "(SETQ edit_9 $VALUE)(MODT \"edit_10\")" ) (ACTION_TILE "edit_10" "(SETQ edit_10 $VALUE)(MODT \"edit_11\")" ) (ACTION_TILE "edit_11" "(SETQ edit_11 $VALUE)(MODT \"edit_12\")" ) (ACTION_TILE "edit_12" "(SETQ edit_12 $VALUE)(MODT \"edit_13\")" ) (ACTION_TILE "edit_13" "(SETQ edit_13 $VALUE)(MODT \"edit_14\")" ) (ACTION_TILE "edit_14" "(SETQ edit_14 $VALUE)(MODT \"edit_15\")" ) (ACTION_TILE "edit_15" "(SETQ edit_15 $VALUE)(MODT \"edit_16\")" ) (ACTION_TILE "edit_16" "(SETQ edit_16 $VALUE)(MODT \"edit_17\")" ;ADDED A 17TH LINE AET 5/18/15 ) (ACTION_TILE "edit_17" "(SETQ edit_16 $VALUE)(MODT \"OK\")") (ACTION_TILE "OK" "(setq lism (get_vals cnt))(setq goval 1)(DONE_DIALOG)") (ACTION_TILE "CANCEL" "(DONE_DIALOG)") (SETQ CNT2 0) (WHILE (/= (NTH CNT2 LISM) NIL) (SET_TILE (STRCAT "edit_" (ITOA (NTH CNT2 LISN))) (nth CNT2 lism)) (SET_TILE (STRCAT "prompt_" (ITOA (NTH CNT2 LISN))) (nth CNT2 lisd)) (SETQ CNT2 (1+ CNT2)) ) (SETQ CNT2 (+ 1 CNT)) (WHILE (<= CNT2 17) (MODE_TILE (STRCAT "edit_" (ITOA CNT2)) 1) (SETQ CNT2 (1+ CNT2)) ) (MODE_TILE "edit_1" 2) (start_dialog) ;***main part (if (= goval 1) (progn (setq cnt2 0 entn entf chk nil) (while (and (/= entn nil) (= chk nil) (< CNT2 CNT)) (setq entg (entget entn)) (if (= (strcase (cdr (assoc 0 entg))) "ATTRIB") (PROGN (SETQ ENTG (SUBST (CONS 1 (nth cnt2 lism)) (ASSOC 1 entg) entg)) (setq cnt2 (1+ cnt2)) (ENTMOD ENTG)(ENTUPD ENTF) ) ) (if (/= (assoc -2 entg) nil) (setq chk 1) ) (setq entn (entnext entn)) ) ) ) ) ) ; (setq *error* olderr) ; Restore old *error* handler (command "_.UNDO" "_end") (prin1) ) (DEFUN MODT (TG) (IF (= $REASON 1) (MODE_TILE TG 2) ) ) (defun get_vals (cnt / cnt2 lism) (setq lism '() cnt2 0) (while (< cnt2 cnt) (SETQ LISM (CONS (GET_TILE (STRCAT "edit_" (ITOA (NTH CNT2 LISN)))) lism)) (SETQ cnt2 (1+ cnt2)) ) (setq lism (reverse lism)) lism ) Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.