-
-
Save jbinkleyj/5e30c144f68fce9a41653d3470d010e0 to your computer and use it in GitHub Desktop.
Dwg to pdf printing bot.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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