def write_3d_pdf(self, filename, verbose=False, quiet=False, **kwargs): """ Write interactive 3D pictures of the molecules to a pdf file, one per page. @param filename: File to write @param kwargs: Keywords to pass to JMolRenderer.write_3d_pdf """ latex_out = path_join(self.tempdir, "output.tex") #----------------------------------------# pbar = ProgressBar(len(self.molecules)) if not quiet: pbar.update(0) with open(latex_out, "w+") as f: f.write(pdf_3d_header) for mol in self.molecules: renderer = JmolRenderer(mol) if mol.description is not None: f.write( pdf_description_template.replace( "@@@LABEL@@@", mol.description)) renderer.write_3d_pdf(filename=None, verbose=verbose, latex_file_handler=f, **kwargs) if mol is not self.molecules[-1]: f.write(r"\clearpage") if not quiet: pbar += 1 f.write(pdf_3d_footer) #----------------------------------------# pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"] with working_directory(self.tempdir): # Run 3 times to get references right JmolRenderer._safe_run(pdflatex_cmd_list, "pdflatex", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 1 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 2 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 3 complete") #----------------------------------------# move(path_join(self.tempdir, "output.pdf"), filename)
def write_3d_pdf(self, filename, verbose=False, quiet=False, **kwargs ): """ Write interactive 3D pictures of the molecules to a pdf file, one per page. @param filename: File to write @param kwargs: Keywords to pass to JMolRenderer.write_3d_pdf """ latex_out = path_join(self.tempdir, "output.tex") #----------------------------------------# pbar = ProgressBar(len(self.molecules)) if not quiet: pbar.update(0) with open(latex_out, "w+") as f: f.write(pdf_3d_header) for mol in self.molecules: renderer = JmolRenderer(mol) if mol.description is not None: f.write(pdf_description_template.replace("@@@LABEL@@@", mol.description)) renderer.write_3d_pdf( filename=None, verbose=verbose, latex_file_handler=f, **kwargs ) if mol is not self.molecules[-1]: f.write(r"\clearpage") if not quiet: pbar += 1 f.write(pdf_3d_footer) #----------------------------------------# pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"] with working_directory(self.tempdir): # Run 3 times to get references right JmolRenderer._safe_run(pdflatex_cmd_list, "pdflatex", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 1 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 2 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 3 complete") #----------------------------------------# move(path_join(self.tempdir, "output.pdf"), filename)
def write_3d_pdf(self, filename, verbose=False, extra_latex_before="", extra_latex_after="", latex_file_handler=None, toolbar=False, quiet=False, **kwargs): self._ensure_tmp_xyz() #----------------------------------------# if not _have_meshlab: raise RuntimeError( "You need to have meshlab.app installed (currently it must be installed in /Applications/ to work...) to do make 3D pdfs. Get it from Sourceforge" ) #----------------------------------------# new_kw = JmolRenderer.default_keywords.copy() # 3d keywords are higher priority new_kw.update(JmolRenderer.default_3d_keywords) # user preferences always have veto power new_kw.update(kwargs) extra_lines = self._get_kwarg_script_lines(**new_kw) #----------------------------------------# if verbose: print("Generating idtf file with Jmol...") jscript = """ load "{molfile}" {extra_lines} write "{tempdir}/output.idtf" """.format(molfile=self._geom_path, tempdir=self.tempdir, extra_lines=extra_lines) self._run_jmol_script(jscript) idtf_path = path_join(self.tempdir, "output.idtf") if not exists(idtf_path): raise RuntimeError("Jmol command failed to produce " "file '{}'. Script was:\n{}".format( idtf_path, indent(jscript))) #----------------------------------------# # now convert to u3d format # TODO make this portable if verbose: print("Converting idtf file to u3d file...") idtf_cmd = _idtf_to_u3d_template.format( input=path_join(self.tempdir, "output.idtf"), output=path_join(self.tempdir, "output.u3d")) JmolRenderer._safe_run(shlex.split(idtf_cmd), descr="IDTF to u3d conversion") #shlex.os.system(idtf_cmd) #----------------------------------------# # Now embed in a latex document and run PDFLatex if verbose: print("Constructing latex document...".format( pdflatex_path, self.tempdir)) with open(path_join(self.tempdir, "output.idtf.tex")) as f: jmol_latex_data = f.read() stuff3d = jmol_latex_data.split("toolbar=false,")[1].split( "inline=true,")[0].strip() if latex_file_handler is None: f = open(path_join(self.tempdir, "output.tex"), "w+") run_pdflatex = True else: f = latex_file_handler run_pdflatex = False if run_pdflatex: f.write(pdf_3d_header) pdf3d_section = pdf_3d_entry_template\ .replace("@@@LABEL@@@", "molecule")\ .replace("@@@3DSTUFF@@@", stuff3d)\ .replace("@@@FNAME@@@", path_join(self.tempdir, "output.u3d")) if toolbar: pdf3d_section = pdf3d_section.replace("toolbar=false", "toolbar=true") f.write(extra_latex_before) f.write(pdf3d_section) f.write(extra_latex_after) if run_pdflatex: f.write(pdf_3d_footer) #- - - - - - - - - - - - - - - - - - - - # if run_pdflatex: if verbose: print("Running '{} {} output' in directory {}...".format( pdflatex_path, " ".join(pdflatex_args), self.tempdir)) pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"] with working_directory(self.tempdir): # Run 3 times to get references right JmolRenderer._safe_run(pdflatex_cmd_list, "pdflatex", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 1 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 2 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 3 complete") #----------------------------------------# # Finally, copy back the temporary output to the requested file path # but only if we wrote the file move(path_join(self.tempdir, "output.pdf"), filename)
def write_3d_pdf(self, filename, verbose=False, extra_latex_before="", extra_latex_after="", latex_file_handler=None, toolbar=False, quiet=False, **kwargs ): self._ensure_tmp_xyz() #----------------------------------------# if not _have_meshlab: raise RuntimeError("You need to have meshlab.app installed (currently it must be installed in /Applications/ to work...) to do make 3D pdfs. Get it from Sourceforge") #----------------------------------------# new_kw = JmolRenderer.default_keywords.copy() # 3d keywords are higher priority new_kw.update(JmolRenderer.default_3d_keywords) # user preferences always have veto power new_kw.update(kwargs) extra_lines = self._get_kwarg_script_lines(**new_kw) #----------------------------------------# if verbose: print("Generating idtf file with Jmol...") jscript = """ load "{molfile}" {extra_lines} write "{tempdir}/output.idtf" """.format( molfile=self._geom_path, tempdir=self.tempdir, extra_lines=extra_lines ) self._run_jmol_script(jscript) idtf_path = path_join(self.tempdir, "output.idtf") if not exists(idtf_path): raise RuntimeError("Jmol command failed to produce " "file '{}'. Script was:\n{}".format( idtf_path, indent(jscript) )) #----------------------------------------# # now convert to u3d format # TODO make this portable if verbose: print("Converting idtf file to u3d file...") idtf_cmd = _idtf_to_u3d_template.format( input=path_join(self.tempdir, "output.idtf"), output=path_join(self.tempdir, "output.u3d") ) JmolRenderer._safe_run(shlex.split(idtf_cmd), descr="IDTF to u3d conversion") #shlex.os.system(idtf_cmd) #----------------------------------------# # Now embed in a latex document and run PDFLatex if verbose: print("Constructing latex document...".format(pdflatex_path, self.tempdir)) with open(path_join(self.tempdir, "output.idtf.tex")) as f: jmol_latex_data = f.read() stuff3d = jmol_latex_data.split("toolbar=false,")[1].split("inline=true,")[0].strip() if latex_file_handler is None: f = open(path_join(self.tempdir, "output.tex"), "w+") run_pdflatex = True else: f = latex_file_handler run_pdflatex = False if run_pdflatex: f.write(pdf_3d_header) pdf3d_section = pdf_3d_entry_template\ .replace("@@@LABEL@@@", "molecule")\ .replace("@@@3DSTUFF@@@", stuff3d)\ .replace("@@@FNAME@@@", path_join(self.tempdir, "output.u3d")) if toolbar: pdf3d_section = pdf3d_section.replace("toolbar=false", "toolbar=true") f.write(extra_latex_before) f.write(pdf3d_section) f.write(extra_latex_after) if run_pdflatex: f.write(pdf_3d_footer) #- - - - - - - - - - - - - - - - - - - - # if run_pdflatex: if verbose: print("Running '{} {} output' in directory {}...".format(pdflatex_path, " ".join(pdflatex_args), self.tempdir)) pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"] with working_directory(self.tempdir): # Run 3 times to get references right JmolRenderer._safe_run(pdflatex_cmd_list, "pdflatex", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 1 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 2 complete") JmolRenderer._safe_run(pdflatex_cmd_list, "output", require_empty_stderr=True, require_zero_exit=False) if verbose: print(" ...run 3 complete") #----------------------------------------# # Finally, copy back the temporary output to the requested file path # but only if we wrote the file move(path_join(self.tempdir, "output.pdf"), filename)
def __input_check(self): with working_directory(self.directory): if not self.input_generator.generated: self.input_generator.generate(self.runner.input_file)