Skip to content

Instantly share code, notes, and snippets.

@jbinkleyj
Forked from mick001/dwg_to_pdf_printing_bot.py
Created January 13, 2020 00:36
Show Gist options
  • Save jbinkleyj/5e30c144f68fce9a41653d3470d010e0 to your computer and use it in GitHub Desktop.
Save jbinkleyj/5e30c144f68fce9a41653d3470d010e0 to your computer and use it in GitHub Desktop.
Dwg to pdf printing bot.
# Imports
import os
import sys
import time
import psutil
import logging
import pyautogui as pgui
from datetime import datetime
VERSION = '1.0'
#-------------------------------------------------------------------------------
# Functions
def extract_selected_format(directory_path, file_extension='dwg'):
# This function extracts all the files of the selected format from the
# directory specified in the variable data_wd. Format is recognized through
# the extension.
#
# Arguments:
# directory_path - string - path from where to extract files.
# file_extension - string - extension of the file. Example: 'dwg'
#
# Returns: List of complete path to each file.
#
files = os.listdir(directory_path)
files = [file for file in files if file.split('.')[1] == file_extension]
files = [os.path.join(directory_path, file) for file in files]
return files
def check_program_running(p_name):
# Checks if the program p_name is currently running.
#
# Arguments:
# p_name - string - name of the program. Example: 'acad.exe'
#
# Returns: True if the program is running, False otherwise.
#
processes = [psutil.Process(p) for p in psutil.pids()]
processes = [p.name().lower() for p in processes]
if p_name in processes:
return True
else:
return False
def check_file_exist(directory_path ,file_name):
# Checks if the file file_name exists
#
# Arguments:
# directory_path - string - directory where to check.
# file_name - string - name of the file to be checked.
#
# Returns: True if it exists, False otherwise
#
files = os.listdir(directory_path)
printed = file_name in files
return printed
def print_file_pdf(file_path, directory_path, logger):
# Prints to pdf all the dwg files in the path specified
#
# Arguments:
# file_path - string - path containing the dwg files.
# directory_path - string - directory where the file is.
# logger - a logger.
#
# Returns: exit_status - int - 1 if Critical error occurred, 0 otherwise
#
#
file_name = file_path.split("\\")[-1] # Get name of the file
file_name_pdf = file_name.replace("dwg", "pdf") # Get name of the output file
is_printed = check_file_exist(directory_path, file_name_pdf) # Check if already existing
exit_status = 0 # 1 only if critical error occurs
if not is_printed:
program_runs = check_program_running("acad.exe")
# Opens file with default program (Autocad for .dwg files).
# If opening fails, returns 1, else 0.
exit_status = os.system(" ".join(["start", file_path]))
if exit_status == 0:
if program_runs:
time.sleep(5)
else:
# Autocad is slow to start up if it is not already running.
time.sleep(30)
print(" ".join(["Now printing file", file_name]))
# Starting printing sequence
pgui.hotkey("ctrl","p")
pgui.typewrite("mi")
pgui.keyDown("enter")
pgui.keyUp("enter")
time.sleep(1)
pgui.typewrite(file_name_pdf)
pgui.keyDown("enter")
pgui.keyUp("enter")
time.sleep(3)
# Closing current drawing
pgui.hotkey("ctrl", "F4")
pgui.keyDown("n")
pgui.keyUp("n")
is_printed = check_file_exist(directory_path, file_name_pdf)
if is_printed:
logger.log(logging.INFO, " ".join(["Printed", file_name]))
else:
logger.log(logging.CRITICAL, " ".join(["NOT Printed", file_name]))
exit_status = 1
else:
logger.log(logging.ERROR, "".join(["Could not open ", file_name]))
logger.log(logging.ERROR, " ".join(["NOT Printed", file_name]))
else:
logger.log(logging.INFO, " ".join(["Already printed", file_name]))
time.sleep(1)
return exit_status
def handle_critical_errors(error_count, check_at_count=2):
# Two or more critical errors may indicate a severe malfunctioning in the
# program. This function displays a confirmation box asking the user if
# they want to continue or stop the program after check_at_count critical
# errors occurred.
#
# Arguments:
# error_count - string - count of the critical errors.
# check_at_count - int - check after check_at_count critical errors occurred.
#
# Returns: void
#
if error_count >= check_at_count:
value = pgui.confirm("""2 or more critical errors have occurred.
Would you like to continue (click "ok")
or cancel?""")
if value == 'Cancel':
sys.exit()
#-------------------------------------------------------------------------------
# Main
if __name__ == '__main__':
# Setting input data directory
data_wd = "C:\\Users\\Michy\\Desktop\\autocad_tutorial"
full_file_path = extract_selected_format(data_wd)
print("\nFollowing files will be printed: {}".format([full_file_path]))
pgui.PAUSE = 0.5
time_stamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
error_count = 0
logging.basicConfig(filename = 'logfile.log', level=logging.DEBUG)
logger = logging.getLogger('DWG Printer bot V. {}'.format(VERSION))
logger.log(logging.INFO,
"Program ran at {}. Directory chosen: {}".format(time_stamp, data_wd))
# Start printing
for file in full_file_path:
try:
error_count += print_file_pdf(file, data_wd, logger)
print("Exiting current printing call...\n")
handle_critical_errors(error_count, 2)
except Exception as e:
print(str(e))
final_time_stamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
logger.log(logging.INFO, "Program ended at {}\n\n".format(final_time_stamp))
pgui.alert("Job ended!")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment