fromMlm Posted February 28 Posted February 28 Hi Is there a way to update a letter tag "incremental" in a block in multiple drawings? "5053 a" is going in one drawing, "5053 b" in another and so on.... betblock.dwg Kind Regards Quote
GLAVCVS Posted February 28 Posted February 28 (edited) Hi How do I know which letter corresponds to each drawing or what the order is between the drawings? It doesn't matter? Edited February 28 by GLAVCVS Quote
fromMlm Posted February 28 Author Posted February 28 Thanks for the reply. Tried it, but don't seem to work with letters. Can't get a to turn to b on the next drawing. Am I missing something? Quote
fromMlm Posted February 28 Author Posted February 28 GLAVCVS I just want the drawings updated in the order of drawing number order. So drawing 1 should have "a", no2 "b" ........ Quote
BIGAL Posted February 28 Posted February 28 You need a Excel or a CSV file with dwg name and desired letter, this can be converted into a script that opens a dwg, runs a lisp, close & save, do next dwg. This will get you a list of dwg names sorted. (setq dwgs (vl-directory-files "D:\\acadtemp" "*.dwg" 1)) (setq dwgs (acad_strlsort dwgs)) You can then write a script. You can use (chr x) eg (chr 65) = "A" so could do (1+ x) for each dwg note though only 26. If more than 26 then would A-Z. AA-AZ etc be ok. Quote
GLAVCVS Posted March 1 Posted March 1 I'm not sure how the code is supposed to work: is it that when inserting the block in each drawing the letter is automatically changed based on an index that appears in the name of the drawing (for example: 'drawing_1'), so that in the drawing with index 1 the block uses the letter 'a', with index 2 the 'b', etc...? Quote
GLAVCVS Posted March 1 Posted March 1 Or the drawings already have the block inserted and you want to change them without opening the drawings? Quote
BIGAL Posted March 2 Posted March 2 This will give you AA when X=28 , Note x=65 is "A" ; Number2Alpha - Converts Number into Alpha string ; Function By: Gilles Chanteau from Marseille, France ; Arguments: 1 ; Num# = Number to convert ; Syntax example: (Number2Alpha 731) = "ABC" ;------------------------------------------------------------------------------- (defun Number2Alpha (Num# / Val#) (if (< Num# 27) (chr (+ 64 Num#)) (if (= 0 (setq Val# (rem Num# 26))) (strcat (Number2Alpha (1- (/ Num# 26))) "Z") (strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#))) ) ) );defun Number2Alpha Quote
fromMlm Posted March 3 Author Posted March 3 Thanks for the replies! I will look into it. Yes, the block is already in the drawings and I want to change them without opening them. No, the drawings doesn't necessarly have corrosponding number/letter. Letter "a" can be assigned to drawingnumber -125, "b" to -131...., but mostly the are at least in a streak. Quote
BIGAL Posted March 3 Posted March 3 Two comments use Aeccorconsole very fast to update the dwg. It changes a dwg but does not open it visually. Can do multiple dwgs etc. Still need some way to set starting seed eg "a" you could make a file with just "a" in it when you update the block the value is increased and saved in the file for the next dwg. Not sure if Aeccoreconsole supports read/write file, but there may be other ways to save a value like blackboard, or clipboard. Ok maybe a 3rd how do we find that block ? Is it the only one in the entire dwg ? Quote
fromMlm Posted Thursday at 03:32 PM Author Posted Thursday at 03:32 PM Hi Thanks for the tip. I'm still looking in to it... Glad that you just pointing me in some directions. How do you mean "find" the block? Yes, there is just one of this "betblock" with the attribute BET in the entire dwg. Quote
BIGAL Posted Thursday at 10:12 PM Posted Thursday at 10:12 PM Question 1 answered re Block. Question 2 how do you propose to get the dwg name list and in what order ? You can get a list of dwg names using (setq files (vl-directory-files dir typ 1)) Quote
fromMlm Posted 17 hours ago Author Posted 17 hours ago What do you think of this approach? I found this lisp "UpdateTitleblockV1-9.lsp" from Lee Mac and thinking of putting it into a script tilemode 0 ze (LOAD "C:/Lisps/UpdateTitleblockV1-9.lsp") qsave using ScriptPro for multiple drawings. I arrange the drawings according to the instructions...See table When I run it I have to write the file search path for the .csv file each time. Is there a way to choose the file search path automatically? To write in the path in the lisp code? ;;-----------------------=={ Update Attributes }==----------------------;; ;; ;; ;; Reads a CSV file containing attribute data, and, should the drawing ;; ;; name of the current drawing appear in the first column of the CSV ;; ;; Drawing List, the program will proceed to update block attributes. ;; ;; ;; ;; The attributes updated will be those with tags corresponding to the ;; ;; CSV column headings. These will be updated with values from the ;; ;; row in which the drawing file is listed. ;; ;; ;; ;; ------------------------------------- ;; ;; Example of CSV format: ;; ;; ------------------------------------- ;; ;; ;; ;; +------------+-----------+-----------+----------+-----+----------+ ;; ;; | DWG | Layout* | Block* | TAG1 | ... | TAGN | ;; ;; +------------+-----------+-----------+----------+-----+----------+ ;; ;; | Drawing1 | Layout1 | Block1 | Value1 | ... | ValueN | ;; ;; +------------+-----------+-----------+----------+-----+----------+ ;; ;; | Drawing1 | Layout2 | Block1 | Value1 | ... | ValueN | ;; ;; +------------+-----------+-----------+----------+-----+----------+ ;; ;; | Drawing2 | Layout1 | Block2 | Value1 | ... | ValueN | ;; ;; +------------+-----------+-----------+----------+-----+----------+ ;; ;; | ... | ... | ... | ... | ... | ... | ;; ;; +------------+-----------+-----------+----------+-----+----------+ ;; ;; ;; ;; *Layout & Block Name columns are optional. ;; ;; ;; ;; ------------------------------------- ;; ;; Possible Warnings: ;; ;; ------------------------------------- ;; ;; - Without a block filter or block name column the code will ;; ;; update ALL attributed blocks with tags listed in the CSV ;; ;; headings. ;; ;; ;; ;; - Currently designed to run on startup - add to either ;; ;; Startup-Suite or ACADDOC.lsp to update blocks when drawing is ;; ;; opened. To disable code running when loaded, remove (c:utb) ;; ;; from the bottom of the code. ;; ;; ;; ;;----------------------------------------------------------------------;; ;; Author: Lee Mac, Copyright 2011 - www.lee-mac.com ;; ;;----------------------------------------------------------------------;; ;; Version 1.0 - 2011-01-12 ;; ;; ;; ;; - First release. ;; ;;----------------------------------------------------------------------;; ;; Version 1.1 - 2011-01-13 ;; ;; ;; ;; - Added optional 'Layout' column (next to DWG Column) to allow ;; ;; multiple titleblocks to be updated with different information ;; ;; within a single drawing. ;; ;;----------------------------------------------------------------------;; ;; Version 1.2 - 2011-08-28 ;; ;; ;; ;; - Removed case-sensitivity of drawing file column in CSV. ;; ;;----------------------------------------------------------------------;; ;; Version 1.3 - 2011-12-27 ;; ;; ;; ;; - Revised the code to correctly process CSV files generated using ;; ;; OpenOffice software. ;; ;;----------------------------------------------------------------------;; ;; Version 1.4 - 2012-01-16 ;; ;; ;; ;; - Updated the 'ReadCSV' local function to correctly read CSV cells ;; ;; containing commas and quotes. ;; ;;----------------------------------------------------------------------;; ;; Version 1.5 - 2012-09-19 ;; ;; ;; ;; - Updated CSV file parser function to account for the use of ;; ;; alternative cell delimiter characters in CSV file (such as a ;; ;; semi-colon). ;; ;;----------------------------------------------------------------------;; ;; Version 1.6 - 2013-05-22 ;; ;; ;; ;; - Removed the need for file extension in first column of CSV file. ;; ;; - Updated CSV file parser function to correct bug. ;; ;;----------------------------------------------------------------------;; ;; Version 1.7 - 2014-11-01 ;; ;; ;; ;; - Fixed bug causing filenames containing ASCII character 46 (point) ;; ;; to not be found in the first column of the CSV file. ;; ;;----------------------------------------------------------------------;; ;; Version 1.8 - 2015-04-13 ;; ;; ;; ;; - Added support for duplicate attribute tags. ;; ;; - Added support for optional 'Block Name' column in CSV file. ;; ;; - Added inclusion of anonymous block names to optional block name ;; ;; filter to enable dynamic block support. ;; ;;----------------------------------------------------------------------;; ;; Version 1.9 - 2016-09-18 ;; ;; ;; ;; - Fixed implementation of block filter when processing attributed ;; ;; dynamic blocks. ;; ;;----------------------------------------------------------------------;; (defun c:utb ( / *error* ano bln bno csv ent flg fnb:fun inc lst sel str tag utb:blk utb:csv utb:ftr utb:lay val ) ;;----------------------------------------------------------------------;; ;; Location of CSV Drawing List (set to nil for prompt) ;; ;; ;; ;; If the CSV file resides in the same directory as the drawing, omit ;; ;; the filepath from the location of the CSV file, and only include ;; ;; the filename, e.g. "myfile.csv" ;; ;; ;; ;; If only a filename is specified, AutoCAD will first search the ;; ;; working directory for this file before searching the Support Paths. ;; ;;----------------------------------------------------------------------;; (setq utb:csv nil) ;; e.g. (setq utb:csv "C:/myfolder/myfile.csv") ;;----------------------------------------------------------------------;; ;; Block Filter (may use wildcards and may be nil) ;; ;;----------------------------------------------------------------------;; (setq utb:ftr nil) ;; e.g. (setq utb:ftr "*BORDER") ;;----------------------------------------------------------------------;; ;; Layout Column (t or nil) ;; ;;----------------------------------------------------------------------;; (setq utb:lay t) ;; set to t if CSV file contains Layout Column ;;----------------------------------------------------------------------;; ;; Block Name Column (t or nil) ;; ;;----------------------------------------------------------------------;; (setq utb:blk nil) ;; set to t if CSV file contains Block Name Column ;;----------------------------------------------------------------------;; (defun *error* ( msg ) (LM:endundo (LM:acdoc)) (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")) (princ (strcat "\nError: " msg)) ) (princ) ) (setq fnb:fun (lambda ( s ) (if (wcmatch (strcase s t) "*.dwg,*.dxf,*.dwt,*.dws") (vl-filename-base s) s ) ) ) (cond ( (not (setq sel (ssget "_X" (vl-list* '(0 . "INSERT") '(66 . 1) (if utb:ftr (list (cons 2 (strcat "`*U*," utb:ftr)))))))) (princ "\nNo Attributed Blocks found in drawing.") ) ( (and utb:csv (not (setq csv (findfile utb:csv)))) (princ (strcat "\n" (vl-filename-base utb:csv) (vl-filename-extension utb:csv) " not found." ) ) ) ( (and csv (/= ".CSV" (strcase (vl-filename-extension csv)))) (princ "\nAttribute data file must be in CSV format.") ) ( (not (or csv (setq csv (getfiled "Select CSV File" "" "csv" 16)))) (princ "\n*Cancel*") ) ( (not (setq lst (mapcar '(lambda ( x ) (cons (strcase (fnb:fun (car x))) (cdr x))) (LM:readcsv csv)))) (princ (strcat "\nNo data found in " (vl-filename-base csv) ".csv file." ) ) ) ( (not (setq tag (mapcar 'strcase (cdar lst)) lst (LM:massoc (strcase (fnb:fun (getvar 'dwgname))) lst) ) ) (princ (strcat "\n" (fnb:fun (getvar 'dwgname)) " not found in first column of CSV file.")) ) ( t (setq lst (mapcar '(lambda ( x ) (mapcar 'cons tag x)) lst) ano 0 bno 0 ) (LM:startundo (LM:acdoc)) (repeat (setq inc (sslength sel)) (setq ent (ssname sel (setq inc (1- inc))) bln (strcase (LM:al-effectivename ent)) val lst flg nil ) (if (or (null utb:ftr) (wcmatch bln (strcase utb:ftr))) (progn (if utb:lay (setq val (mapcar '(lambda ( x ) (cons (strcase (cdar x)) (cdr x))) val) val (LM:massoc (strcase (cdr (assoc 410 (entget ent)))) val) ) ) (if utb:blk (setq val (mapcar '(lambda ( x ) (cons (strcase (cdar x)) (cdr x))) val) val (cdr (assoc bln val)) ) (setq val (car val)) ) (if val (foreach att (vlax-invoke (vlax-ename->vla-object ent) 'getattributes) (if (and (setq str (assoc (strcase (vla-get-tagstring att)) val)) (progn (setq val (LM:remove1st str val)) (/= (vla-get-textstring att) (cdr str)) ) ) (progn (vla-put-textstring att (cdr str)) (setq flg t ano (1+ ano) ) ) ) ) ) (if flg (setq bno (1+ bno))) ) ) ) (if (zerop ano) (princ "\nAll attributes are up-to-date.") (princ (strcat "\n" (itoa ano) " attribute" (if (= 1 ano) "" "s") " updated in " (itoa bno) " block" (if (= 1 bno) "" "s") "." ) ) ) (LM:endundo (LM:acdoc)) ) ) (princ) ) ;; Effective Block Name - Lee Mac ;; ent - [ent] Block Reference entity (defun LM:al-effectivename ( ent / blk rep ) (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**") (if (and (setq rep (cdadr (assoc -3 (entget (cdr (assoc 330 (entget (tblobjname "block" blk) ) ) ) '("AcDbBlockRepBTag") ) ) ) ) (setq rep (handent (cdr (assoc 1005 rep)))) ) (setq blk (cdr (assoc 2 (entget rep)))) ) ) blk ) ;; Read CSV - Lee Mac ;; Parses a CSV file into a matrix list of cell values. ;; csv - [str] filename of CSV file to read (defun LM:readcsv ( csv / des lst sep str ) (if (setq des (open csv "r")) (progn (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (","))) (while (setq str (read-line des)) (setq lst (cons (LM:csv->lst str sep 0) lst)) ) (close des) ) ) (reverse lst) ) ;; CSV -> List - Lee Mac ;; Parses a line from a CSV file into a list of cell values. ;; str - [str] string read from CSV file ;; sep - [str] CSV separator token ;; pos - [int] initial position index (always zero) (defun LM:csv->lst ( str sep pos / s ) (cond ( (not (setq pos (vl-string-search sep str pos))) (if (wcmatch str "\"*\"") (list (LM:csv-replacequotes (substr str 2 (- (strlen str) 2)))) (list str) ) ) ( (or (wcmatch (setq s (substr str 1 pos)) "\"*[~\"]") (and (wcmatch s "~*[~\"]*") (= 1 (logand 1 pos))) ) (LM:csv->lst str sep (+ pos 2)) ) ( (wcmatch s "\"*\"") (cons (LM:csv-replacequotes (substr str 2 (- pos 2))) (LM:csv->lst (substr str (+ pos 2)) sep 0) ) ) ( (cons s (LM:csv->lst (substr str (+ pos 2)) sep 0))) ) ) (defun LM:csv-replacequotes ( str / pos ) (setq pos 0) (while (setq pos (vl-string-search "\"\"" str pos)) (setq str (vl-string-subst "\"" "\"\"" str pos) pos (1+ pos) ) ) str ) ;; MAssoc - Lee Mac ;; Returns all associations of a key in an association list (defun LM:massoc ( key lst / item ) (if (setq item (assoc key lst)) (cons (cdr item) (LM:massoc key (cdr (member item lst)))) ) ) ;; Remove 1st - Lee Mac ;; Removes the first occurrence of an item from a list (defun LM:remove1st ( itm lst / f ) (setq f equal) (vl-remove-if '(lambda ( a ) (if (f a itm) (setq f (lambda ( a b ) nil)))) lst) ) ;; Start Undo - Lee Mac ;; Opens an Undo Group. (defun LM:startundo ( doc ) (LM:endundo doc) (vla-startundomark doc) ) ;; End Undo - Lee Mac ;; Closes an Undo Group. (defun LM:endundo ( doc ) (while (= 8 (logand 8 (getvar 'undoctl))) (vla-endundomark doc) ) ) ;; Active Document - Lee Mac ;; Returns the VLA Active Document Object (defun LM:acdoc nil (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object)))) (LM:acdoc) ) ;;----------------------------------------------------------------------;; (vl-load-com) (princ (strcat "\n:: UpdateTitleblock.lsp | Version 1.9 | \\U+00A9 Lee Mac " (menucmd "m=$(edtime,0,yyyy)") " www.lee-mac.com ::" "\n:: Type \"utb\" to run manually ::\n" ) ) (princ) ;;----------------------------------------------------------------------;; (c:utb) ;; Remove or comment this line to disable autorun ;;----------------------------------------------------------------------;; ;; End of File ;; ;;----------------------------------------------------------------------;; Quote
fromMlm Posted 14 hours ago Author Posted 14 hours ago I found the answer here: The script now works, but a bit slow. Is there a smarter way to do this? Quote
Lee Mac Posted 14 hours ago Posted 14 hours ago 19 minutes ago, fromMlm said: I found the answer here: That's not correct - you should use the utb:csv parameter defined at line 126 of the program: ;;----------------------------------------------------------------------;; ;; Location of CSV Drawing List (set to nil for prompt) ;; ;; ;; ;; If the CSV file resides in the same directory as the drawing, omit ;; ;; the filepath from the location of the CSV file, and only include ;; ;; the filename, e.g. "myfile.csv" ;; ;; ;; ;; If only a filename is specified, AutoCAD will first search the ;; ;; working directory for this file before searching the Support Paths. ;; ;;----------------------------------------------------------------------;; (setq utb:csv nil) ;; e.g. (setq utb:csv "C:/myfolder/myfile.csv") Quote
BIGAL Posted 5 hours ago Posted 5 hours ago Just a comment it looks like in the image you have the values in Excel so you can read current open Excel Cells directly without having to make a CSV. In Lee's code you read a line, in a Excel code you would read 3 Cells via a Row & Column values. Yes can hard code the lisp to open the correct Excel. 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.