If you've ever worked with a large collection of ChemDraw™ (.cdx) files, you may have needed to convert them into images for publication on the web or elsewhere. You may have concluded that the only way to do this would be by through liberal application of elbow grease, or finding someone willing to do it.
If you're working on a Mac, I have good news for you. As part of an iPhone chemistry application my company is helping to develop, we needed to convert a large number of CDX files into PNGs. Read on to find out how we automated this process and saved a bunch of time.
Downloading and Running ChemBot
ChemBot is a small Mac application written in AppleScript. It can be downloaded from GitHub, and the source code is also available there. ChemBot requires ChemDraw Ultra 12.
To run ChemBot:
- Open ChemDraw Ultra 12.0 or later.
- Double-click on the ChemBotApp icon and follow the prompts.
Faster execution is possible by launching ChemBot through the AppleScript editor:
- Open ChemDraw Ultra 12.0 or later.
- Double-click on the ChemBotScript icon.
- Click the "Run" button and follow the prompts.
How It Works
ChemBot is written in AppleScript, Apple's built-in application scripting language for Mac. Although conceptually a very simple piece of software, one of the hard things about creating ChemBot was the surprising scarcity of real-world AppleScript examples.
Our starting point was Chris Swain's excellent AppleScript tutorial series. One of his tutorials proved especially useful: Convert ChemDraw to TIFF. Although it wasn't quite what we were looking for, it was a start.
After some experimentation, we hit a major problem. Although we could get ChemDraw to open CDX files automatically and recurse folders, we couldn't get PNG files to be saved. Chris Swain very quickly came back with an answer to my email: ChemDraw apparently can only save images files to an existing alias. Attempting to save to a filename that doesn't exist won't work.
Making the needed change allowed us to finish ChemBot and solve the problem of automatically converting CDX files into PNG images.
ChemBot is distributed under the MIT License. For completeness sake, here is the source code:
my process_folder(choose folder with prompt "ChemBot - Choose a Folder to Make PNGs from CDX") on process_folder(root_folder) my create_images(root_folder) tell application "Finder" set subfolders to every folder in root_folder repeat with i from 1 to number of items in subfolders set subfolder to (item i of subfolders) my process_folder(subfolder) end repeat end tell end process_folder on create_images(root_folder) tell application "Finder" set fileset to every file in root_folder repeat with i from 1 to number of items in fileset set filename to item i of fileset as text if filename ends with ".cdx" then my cdx_to_png(filename) end if end repeat end tell end create_images on cdx_to_png(filename) set slug to text 1 thru -5 of filename as text set cdx_path to slug & ".cdx" set png_path to slug & ".png" my create_alias(png_path) my chemdraw(cdx_path, png_path) end cdx_to_png -- Apparently, ChemDraw can only save to an alias, so we create one. on create_alias(target_path) set open_target_file to open for access file target_path with write permission close access open_target_file end create_alias on chemdraw(cdx_path, png_path) tell application "CS ChemDraw Ultra" activate open (cdx_path as alias) save first document in (png_path as alias) as "PNG" close first document end tell end chemdraw
Other Ways to Automate ChemDraw
Although I didn't find many other examples of ChemDraw automation, one worth noting is Rajarshi Guha's use of Python in ChemDraw scripting. This approach has the advantage of working on Windows. Finally, CambridgeSoft (now Perkin-Elmer) also offers a scripting language for ChemDraw called ChemScript.
AppleScript is a useful piece of technology, although good examples of its use are in short supply. In addition to solving our specific problem of converting CDX files into PNGs, ChemBot could be used as a starting point for more complex ChemDraw automation workflows.