Jump to content

Batch processing of script files on drawing files with matching names


Recommended Posts

PipelinerUSA

I have a directory populated with several hundreds of drawings and scripts. For every drawing "A.dwg" there is a script "A.scr":

 

A.dwg  A.scr
B.dwg  B.scr
C.dwg  C.scr
D.dwg  D.scr
...

 

Every script is unique.  What I am looking to do is figure out a way to run every script on its associated drawing.  Tools like ScriptPro.exe and the Civil 3D out-of-the-box Batch Save Utility work by running 1 script on many drawings in a folder, but in my case there is one unique script to be ran on one unique drawing.  Any ideas would be appreciated.

Link to post
Share on other sites
dan20047

have a single script with this content? then each drawing will run a script with same file name

 

(command "script" (strcat (vl-filename-base (getvar "dwgname")) ".scr"))

 

  • Agree 1
Link to post
Share on other sites

written between diner & tea-time (and totally untested)

 

t1 uses multi thread (set time in wait to match time it takes for script to process one drawing)

t2 uses single thread and creates a bat file in c:\temp\tmp.bat

 

but I like dan20047's approach in case you already have a mother script 👍

 

ok , tea time now 🍵

 

;;; rlx 22-nov-2021
(defun c:t1 ( / f l s)
  (if (and (setq f (Select-a-Folder "Select Folder with drawings & scripts"))(setq l (alf f "*.dwg" t)))
    (foreach d l (setq s (strcat (car (fnsplitl d)) (cadr (fnsplitl d)) ".scr"))
      (command "start" (strcat "accoreconsole.exe /i " "\"" d "\"" " /s " "\"" s "\"" " /l en-us"))(wait 3))))

(defun c:t2 ( / f l s n p)
  (if (and (setq f (Select-a-Folder "Select Folder with drawings & scripts"))
           (setq l (alf f "*.dwg" t))(setq p (open (setq n "c:\\temp\\tmp.bat") "w")))
    (foreach d l (setq s (strcat (car (fnsplitl d)) (cadr (fnsplitl d)) ".scr"))
      (write-line (strcat "accoreconsole.exe /i " "\"" d "\"" " /s " "\"" s "\"" " /l en-us") p)
	(write-line "timeout /t 1 /nobreak" p)))(if p (progn (write-line "exit" p)(close p)(gc)(command "start" n))))

(defun wait  (sec / stop) (setq stop (+ (getvar "DATE") (/ sec 86400.0))) (while (> stop (getvar "DATE"))))

;;; generic getfolder routine with possibility to create a new subfolder (Select-a-Folder "select path")
(defun Select-a-Folder ( m / f s) (if (and (setq s (vlax-create-object "Shell.Application"))
  (setq f (vlax-invoke s 'browseforfolder 0 m 0 "")))(setq f (vlax-get-property (vlax-get-property f 'self) 'path))
     (setq f nil))(vl-catch-all-apply 'vlax-release-object (list s)) (if f (vl-string-translate "/" "\\" f)))

;;; d = directory , e = extension like "*.dwg" , f = flag include subfolders (any value or nil)
;;; test : (alf "d:/temp/lisp" "*.*" t)  (alf "d:/temp/lisp" "*.dwg" nil)
(defun alf (d e f) (setq d (vl-string-right-trim "\\" (vl-string-translate "/" "\\" d)))
  (if f (apply 'append (cons (if (vl-directory-files d e)(mapcar '(lambda (x)(strcase (strcat d "\\" x)))(vl-directory-files d e)))
    (mapcar '(lambda (x) (alf (strcase (strcat d "\\" x)) e f))(vl-remove ".." (vl-remove "." (vl-directory-files d nil -1))))))
      (mapcar '(lambda (x)(strcase (strcat d "\\" x))) (vl-directory-files d e 1))))

 

🐉

Link to post
Share on other sites

There has been a lot of  process multiple dwgs this may be useful to create a bat file using RLX code as a start but processing a file of dwg names, you would replace the hard code path with the path from select a folder. Adding /S will give subfolders as well.

 

(command "shell" "dir D:\\acadtemp\\*.dwg /b >d:\\acadtemp\\dirdwg.txt" )

 

Also Pairing scripts to be run on associated drawings and batch processing (theswamp.org)

  • Agree 1
Link to post
Share on other sites
21 hours ago, dan20047 said:

have a single script with this content? then each drawing will run a script with same file name

 


(command "script" (strcat (vl-filename-base (getvar "dwgname")) ".scr"))

 

My project is for a bunch of comm. towers that all have different assets attached to them.  Those assets exist in a block catalog.  I have a script for each tower that inserts those blocks at the appropriate location.  Each tower is 1 drawing, and they are all unique.  Also included in the script is the creation of property filters and their definitions (wildcard criteria), layer color assignments, etc.  Would this work for what I need to do?  Thanks

Link to post
Share on other sites

You mentioned ScriptPro, while I haven't used it, I assumed you had tested it. I also assume ScriptPro works by opening each drawing and then running the selected script.

My thought is that you could run a single script with the line above, and that script would use the active drawing name to call another script you already have in the same folder as the drawing being opened.

 

If you don't have ScriptPro, there are other solutions, such as RLX posted.

Are you familiar with the basics of lisp coding?

Link to post
Share on other sites
2 hours ago, dan20047 said:

You mentioned ScriptPro, while I haven't used it, I assumed you had tested it. I also assume ScriptPro works by opening each drawing and then running the selected script.

My thought is that you could run a single script with the line above, and that script would use the active drawing name to call another script you already have in the same folder as the drawing being opened.

 

If you don't have ScriptPro, there are other solutions, such as RLX posted.

Are you familiar with the basics of lisp coding?

I have used ScriptPro.  It executes one script across a number of drawings.  I seek out LISP routines and use them regularly, but I have not written my own.  I am familiar with the syntax though.  But I am not experienced in making my own.    

Link to post
Share on other sites

The code I gave you is lisp, but you can put it into a script file, and it should work, say call it PS.scr. The concept is scriptPro runs PS.scr on each drawing:

Open A.dwg

  Run PS.scr (scriptPro does this)

   PS.scr > runs A.scr

    Close A.dwg (scriptPro does this)

Open B.dwg

  Run PS.scr

    PS.scr > runs B.scr

etc..

 

I added a check to be sure the script can be found. You can test this script by opening drawing A, type script, then select the file. It should then also run script A.scr for you. If you have problems, post the command history to show the error message.

 

;;; create variable for script based on drawing filename, example "A.scr"
(setq scrFileName (strcat (vl-filename-base (getvar "dwgname")) ".scr"))
;;; run script if it can be found
(if (findfile scrFileName) (command ".script" scrFileName))

 

Link to post
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...