B
    3Rc/.                 @   sR  d Z ddlZddlZddlZy<ddlZddlmZmZmZ ddl	Z
e
jjddddZW n$ ek
r|   dZdZedY nX dZerddlmZ ddlZddlZdadadadadadadEd
dZdFddZdd Zdd ZdGddZdHddZdd Zdd Z dIddZ!d d! Z"d"d# Z#d$d% Z$y.dd&l%m&Z& dd'l'm(Z( d(d) Z)dJd,d-Z*W n( ek
rz   d.d) Z)dKd/d-Z*Y nX da+dLd0d1Z,d2d3 Z-d4Z.i fd5d6Z/dMd9d:Z0e1d;krNd<Z2e)e2Z3e34d= ee2d>d>Z5e6d?e2 e6d@e5 ee2d>dZ5e6d?e2 e6d@e5 ee5ddZ7e6dAe7 dBZ2ee2d>dZ5e8dCdDZ9e9:e5 e9;  dS )Nz& tools for interacting with chemdraw

    N)gencacheDispatch	constantsz&{5F646AAB-3B56-48D2-904C-A68D7989C251}   z0ChemDraw version (at least version 7) not found.)r   TFc             C   s   t dk	r$d}dadadadadada tda |rBt j atj	andat 
dddat 
dddatdkrt 
dddant 
ddd	a| rdt _tr|rt  dS )
z launches chemdraw NzChemDraw.Application                  r   )cdApp
selectItem	cleanItem
centerItemtheObjstheDocr   	DocumentsAddObjectsZMenuBarsZMenusZ	MenuItems_cdxVersionVisibleActivate)visibleopenDocshowDocZholder r   3lib/python3.7/site-packages/rdkit/utils/chemdraw.pyStartChemDraw+   s,    
r   c             C   s.   dt _| r*t j atr$|r$t  tjad S )Nr   )r   r   r   r   r   r   r   r   )r   r   r   r   r   ReactivateChemDrawJ   s    
r   c             C   sT   t dkrt  tdkr.tdkr(t j atjat|| tj	 t
|}t  |S )a  converts the data passed in from one format to another

    inFormat should be one of the following:
       chemical/x-cdx                   chemical/cdx 
       chemical/x-daylight-smiles       chemical/daylight-smiles 
       chemical/x-mdl-isis              chemical/mdl-isis 
       chemical/x-mdl-molfile           chemical/mdl-molfile 
       chemical/x-mdl-rxn               chemical/mdl-rxn 
       chemical/x-mdl-tgf               chemical/mdl-tgf 
       chemical/x-questel-F1  
       chemical/x-questel-F1-query 

    outFormat should be one of the preceding or:
       image/x-png                      image/png 
       image/x-wmf                      image/wmf 
       image/tiff  
       application/postscript  
       image/gif  
  N)r   r   r   r   r   r   r   SetData	pythoncomMissingGetDataClear)inDatainFormat	outFormatoutDr   r   r   
CDXConvertW   s    

r(   c             C   sd   t dkrt  tdkr.tdkr(t j atjat|| tj	 t
  t  t|}t  |S )a  calls the CDXLib Clean function on the data passed in.

    CDXLib_Clean attempts to clean (prettify) the data before
    doing an output conversion.  It can be thought of as CDXConvert++.

    CDXClean supports the same input and output specifiers as CDXConvert
    (see above)

  N)r   r   r   r   r   r   r   r   r    r!   ZSelectr   ZExecuter"   r#   )r$   r%   r&   r'   r   r   r   CDXCleanx   s    

r)   chemical/cdxr   c             C   s\   t dkrt  yt  W n  tk
r:   t  tjaY nX |rHt  t	|| t
j dS )z displays the data in Chemdraw N)r   r   r   r   	Exceptionr   r   r   r#   r   r    r!   )r$   r%   clearr   r   r   
CDXDisplay   s    r-   chemical/x-mdl-molfilec             C   sP   t dkrd}n>dt _t js t  yt jj| }W n tk
rJ   d}Y nX |S )z9 returns the contents of the active chemdraw document

  N r   )r   r   ActiveDocumentr   r   r"   r+   )r&   resr   r   r   CDXGrab   s    
r2   c               C   s,   yt   W n tk
r    Y nX t  dS )z shuts down chemdraw

  N)r   Quitr+   Exitr   r   r   r   CloseChemdraw   s
    r5   c               C   s   da dS )z" destroys our link to Chemdraw

  N)r   r   r   r   r   r4      s    r4   save.cdxc             C   s   t j}||  dS )zforce chemdraw to save the active document

  NOTE: the extension of the filename will determine the format
   used to save the file.
  N)r   r0   SaveAs)ZfileNamedr   r   r   SaveChemDrawDoc   s    r9   c              C   s   t j} |   dS )zforce chemdraw to save the active document

  NOTE: the extension of the filename will determine the format
   used to save the file.
  N)r   r0   Close)r8   r   r   r   CloseChemDrawDoc   s    r;   c             C   sf   dd }g }t || d}x&|D ]}t |}| |r"|}P q"W |dkrbt |d t | d S )Nc             S   s
   | | S )N)append)xyr   r   r   <lambda>       z"RaiseWindowNamed.<locals>.<lambda>r   r   )win32guiZEnumWindowsZGetWindowTextmatchZ
ShowWindowZBringWindowToTop)ZnameRecbZwinsZtgtWinwinZtxtr   r   r   RaiseWindowNamed   s    


rF   c              C   s   t d} t|  d S )Nz	^ChemDraw)recompilerF   )er   r   r   RaiseChemDraw   s    
rJ   )Image)StringIOc             C   s   t | dddS )zBtakes a SMILES string and returns a PIL image using chemdraw

    zchemical/daylight-smilesz	image/gif)r%   r&   )MolToPilImage)	smilesStrr   r   r   SmilesToPilImage   s    rO   chemical/daylight-smiles	image/gifc             C   s,   t | ||}tt|}t|d}|S )zDtakes a molecule string and returns a PIL image using chemdraw

    ZRGB)r(   rL   strrK   openZconvert)dataStrr%   r&   r1   ZdataFileimgr   r   r   rM      s    rM   c             C   s   t d d S )Nz8You need to have PIL installed to use this functionality)print)rN   r   r   r   rO     s    c             C   s   t d d S )Nz8You need to have PIL installed to use this functionality)rV   )rT   r%   r&   r   r   r   rM     s    c             C   s   t datjs| t_dS )z launches Chem3D zChem3D.ApplicationN)r   c3dAppr   )r   r   r   r   StartChem3D  s    rX   c               C   s   t   da dS )z shuts down Chem3D N)rW   r3   r   r   r   r   CloseChem3D  s    rY   )ZDipoleMomentZ
BendEnergyZNon14VDWEnergyZStericEnergyZStretchBendEnergyZStretchEnergyZTorsionEnergyZVDW14Energyc          	   C   sD  t dkrt  |dkr$t| |d}n| }tjddd}|| W dQ R X t j|j}|snt	d t
dtd}d	|_d
|_d
|_|| x|jdkrqW t d }|| xtD ]}td| ||< qW |d
 t|j t|d }	d
}
x@|
s>yt| W n  tk
r4   td Y nX d	}
q W |	S )a   adds 3D coordinates to the data passed in using Chem3D

    **Arguments**

      - data: the molecular data

      - format: the format of _data_.  Should be something accepted by
        _CDXConvert_

      - props: (optional) a dictionary used to return calculated properties
  
  Nzchemical/mdl-molfilez.molF)suffixdeletezcannot open moleculezNo MoleculezChem3D.MM2Jobr   r   )iPMOCiDNEPz	/to3d.molzdoc.%srg      ?)rW   rX   r)   tempfileZNamedTemporaryFilewriter   ZOpennamerV   
ValueErrorr   ZTypeZDisplayEveryIterationZRecordEveryIterationZ
MM2ComputeZComputeStatusosgetcwdr7   availChem3DPropsevalr:   unlinkrS   readr+   timeZsleep)dataformatpropsZmolDataZmolFdocZjobZoutFNamepropZc3dDataZgoner   r   r   Add3DCoordsToMol)  sB    




rm   problems.sdf   c             C   s  t | d}t |d}d}i }g }| }	d}
d}t }x|	dkr|	ddkr||	 d|}yt|d|d	}W n  tk
r   |}d
}
g }Y nX d}
|g}n|	ddkrt }|d
7 }td|t | f  t }|| dkrt	  t
  |  t |d}|
sfx(| D ]}|d||| f  q&W ||	 |d| g }n@d}
||	 |dkrt |d}|| |d| g }n
||	 | }	q<W |  |dk	r|  dS )a    optimizes the structure of every molecule in the input SD file

    **Arguments**

      - inFileName: name of the input SD file

      - outFileName: name of the output SD file

      - problemFileName: (optional) name of the SD file used to store molecules which
        fail during the optimization process

      - restartEvery: (optional)  Chem3D will be shut down and restarted
        every _restartEvery_ molecules to try and keep core leaks under control

  r\   zw+Nr   r/   zM  ENDrA   zchemical/mdl-molfile)rj   r   z$$$$z"finished molecule %d in %f secondsaz> <%s>
%f

)rS   readlinerg   findr<   joinrm   r+   rV   rY   rX   closekeysr^   )
inFileNameoutFileNameZproblemFileNameZrestartEveryZinFileZoutFileZproblemFilerj   linesZnextLineskipZnDoneZt1ZmolBlockZnewMolBlockZbadBlockZt2rl   r   r   r   OptimizeSDFileh  sb    













rz   __main__zCCC(C=O)CCCzfoo.jpgzchemical/x-daylight-smileszin:zout:zout2:z7COc1ccc(c2onc(c2C(=O)NCCc3ccc(F)cc3)c4ccc(F)cc4)c(OC)c1ztest.molzw+)TFF)TT)r*   r   )r.   )r6   )rP   rQ   )rP   rQ   )r   )rn   ro   )<__doc__r]   ra   rg   r    Zwin32com.clientr   r   r   Zwin32com.client.gencacheZwin32comZclientZEnsureModuleZ	cdxModuler+   r   ImportErrorrB   rG   r   r   r   r   r   r   r   r   r(   r)   r-   r2   r5   r4   r9   r;   rF   rJ   ZPILrK   iorL   rO   rM   rW   rX   rY   rc   rm   rz   __name__ZinStrrU   ZsaveZconvStrrV   ZconvStr2rS   outr^   rt   r   r   r   r   <module>   s   


!




	
?
G








