pax_global_header00006660000000000000000000000064137146624560014530gustar00rootroot0000000000000052 comment=53047f64b571b5f01623bf897eb9e2b212778031 xdrawchem-v1.11.0/000077500000000000000000000000001371466245600137605ustar00rootroot00000000000000xdrawchem-v1.11.0/.clang-format000066400000000000000000000000621371466245600163310ustar00rootroot00000000000000BasedOnStyle: LLVM IndentWidth: 4 ColumnLimit: 100xdrawchem-v1.11.0/.gitignore000066400000000000000000000020611371466245600157470ustar00rootroot00000000000000/bin /.clangd # Created by https://www.toptal.com/developers/gitignore/api/qt,c++ # Edit at https://www.toptal.com/developers/gitignore?templates=qt,c++ ### C++ ### # Prerequisites *.d # Compiled Object files *.slo *.lo *.o *.obj # Precompiled Headers *.gch *.pch # Compiled Dynamic libraries *.so *.dylib *.dll # Fortran module files *.mod *.smod # Compiled Static libraries *.lai *.la *.a *.lib # Executables *.exe *.out *.app ### Qt ### # C++ objects and libs *.so.* # Qt-es object_script.*.Release object_script.*.Debug *_plugin_import.cpp /.qmake.cache /.qmake.stash *.pro.user *.pro.user.* *.qbs.user *.qbs.user.* *.moc moc_*.cpp moc_*.h qrc_*.cpp ui_*.h *.qmlc *.jsc Makefile* *build-* *.qm *.prl # Qt unit tests target_wrapper.* # QtCreator *.autosave # QtCreator Qml *.qmlproject.user *.qmlproject.user.* # QtCreator CMake CMakeLists.txt.user* # QtCreator 4.8< compilation database compile_commands.json # QtCreator local machine specific files for imported projects *creator.user* # End of https://www.toptal.com/developers/gitignore/api/qt,c++ xdrawchem-v1.11.0/COPYRIGHT.txt000066400000000000000000000021351371466245600160720ustar00rootroot00000000000000Contains non-Free header file: CDXConstants.h Contains non-Free code: goldman_rotate.cpp Portions copyright by Christoph Steinbeck, the JChemPaint project and others. All source files contain copyright and licensing information. -- XDrawChem copyright begins here -- XDrawChem Copyright (C) 2004-2005 Bryan Herger Copyright (C) 2020 Yaman Qalieh This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . (Author's note: the license is in the file LICENSE.txt, which is included in the source directory.) xdrawchem-v1.11.0/Doxyfile000066400000000000000000000237401371466245600154740ustar00rootroot00000000000000# Doxyfile 1.4.1-KDevelop #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = xdrawchem2.kdevelop PROJECT_NUMBER = $VERSION$ OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = /home/gerd/prog/svn/klinpopup/ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = YES FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = /other/video/kde4/xdrawchem-qt4 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM \ *.C \ *.H \ *.tlh \ *.diff \ *.patch \ *.moc \ *.xpm \ *.dox RECURSIVE = yes EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = yes XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = xdrawchem2.tag ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO xdrawchem-v1.11.0/HISTORY.txt000066400000000000000000000441311371466245600156650ustar00rootroot00000000000000version 1.11.0: - Bumped to OpenBabel3 - Changed license to GPLv3+ from GPLv2+ - Changed some shortcuts - Added more font options - Added zooming with control keys - Added redo - Fixed cut/paste - Fixed undo - Fixed lasso tool - Fixed grid - Fixed custom rings - Fixed rounding issues with drawings - Fixed many other bugs and segmentation faults version 1.10.2: Fixes as noted in Git commits: build script, open/save, molecule joining. version 1.10.1: Fixes as noted in Git commits. Slack build, PNG image save. version 1.10.0: First release based on Qt5. Significant contributed code, bug fixes. version 1.9.11: Bug fixes. Migration to Qt5. version 1.9.10: Bug fixes. version 1.9.9: Updated code to use OpenBabel 2.0 (or later). Fixed a bug when loading files with OpenBabel. Atoms are now labeled correctly. Fixed bug #1255229, relating to correct rendering of super- and subscripts. Added a feature to send 3-D structures to external programs ghemical and KryoMol. More programs will be added on request. Removed canonical SMILES generation. This feature was dependent on a cgi-bin script that will not run on xdrawchem.org's new host. InChI, the new NIST- IUPAC standard, should be used for canonicalization. version 1.9.8: Worked on bug #1236716 and #1255229, regarding XDrawChem's rendering of text typed into the QTextEdit mini text editor. Fixed bug #1254917, relating to segfaults when drawing symbols. Updated database back-end to use data parsed from the PubChem Compounds database, and updated XDrawChem to link to PubChem compound records where available. version 1.9.7: Fixed sf.net bug #1221480 pertaining to QPainter errors. Added antibody (Symbol) and biotin (pre-defined functional group). Added support for InChI output (Tools menu; Internet access required). Fixed a bug where drawing temporarily goes blank after certain tools or functions are used. version 1.9.6: Resolved sf.net bug #1200630 relating to loading and saving formatted text. Resolved sf.net bug #1198595, relating to segfaults in the IR tool. Updated to use newer Qt classes (e.g., QPtrLst instead of QList). Many thanks to Gerd Fleischer for contributing a very large patch. Added text shape options. Fill color can be set for ellipse/rectangle bracket types. Updated paint/print functions to use a single global painter object. Print and images should look the same as what you drew on screen now! Image size is now passed to ImageMagick (if available) so images should be same size as on-screen. version 1.9.5: Removed m4 / autom4te stuff from CVS and distributions! Added arrow, symbol, ring drawing change suggested in tracker #1175966. Resolved Edit > Cut bug, tracker #1178101. Fixed some oddities with point moves and double bond spacing. Tinkered with PNG output to produce nicer looking images. -- This feature is implemented two ways, and works better if ImageMagick -- is installed. Added a "hot key" function for quick editing of atoms and labels. version 1.9.4: (contributed) Fixed buggy pointer references related to bug #1158842. Added Edit > Insert symbol dialog. Improvements to BUILD3D code now yield better results for fused rings, aromtics, and other double bonds. Updated Polish language file. Releases will be made using "cvs export" rather than "cvs checkout"; see sf.net bug #1169699. version 1.9.3: Fixed issue with color selection and color in EPS files. Aliphatic chains are now consistently drawn correctly. Undo and load/save correctly handle explicit "C" labels on carbons. BUILD3D is now accessed as a CGI script, which means it is accessible for all platforms with an Internet connection. (contributed) Updated Polish language file. version 1.9.2: Fixed some small bugs in drawing behavior. When a Tool menu option is chosen, the target molecule is now highlighted on mouse over. Added more options to right-click menu. Added reverse reaction prediction. Double clicking on text allows edit. XDrawChem can produce 3-D structures using the external program BUILD3D. Fixed issues with coordinate system. version 1.9.1: Updated German translation. Thanks to Daniel Leidert for this work. Fixed some keyboard and text input issues. Mainly, it's possible to label carbons again, and type characters that are not US-English letters and numbers. This should also fix some format issues. You can now change font settings within XDrawChem and have them saved between sessions. Fixed arrow behavior. All arrow types render correctly, and it's possible to change the thickness of some arrow types. Fixed custom rings dialog. Custom rings saved to user's home directory now appear on menu correctly. Menu is also dynamically updated, so new structures appear immediately without need to restart XDrawChem. version 1.9: Added Russian language translation file. Thanks to Vitaly Lipatov and Roman Borisyuk for conributing this work. Fixed dialogs that display Help. It's now possible to use the Help dialog, and close it without closing the tool you are using. Eliminated Elemental analysis dialog. This feature is now part of Molecule Information. Fixed a bug in the text tool that caused a segfault when clicking off of an empty text field. Also updated text toopl behavior to more accurately show what would be selected, moved, etc. on mouse click. Fixed a bug where aromatic and other rings would have infinite scale and random rotation if attached to an existing bond. Rings now attach correctly, even to vertical bonds. Keyboard input for non-English users is fixed. You can finally type letters with umlauts (e.g., "Säure") and other accents. You can paste text from other applications with Ctrl+V. However, you must select the Text tool first and create a new text box. The width of any bond (double, triple, dashed, ...) may be changed now. version 1.8.5: Fixed EPS output by using "ps2epsi" script supplied with GhostScript to process the file. Updated some deprecated functions to current version and fixed some warnings. (contributed) Made some pixmaps transparent to improve print quality. version 1.8.4: Names retrieved from the database are correctly displayed now. Right-clicking on a molecule brings up a popup list of actions. Currently, select molecule, cut, copy and molecule info are available this way. version 1.8.3: Updated Polish translation. Pressing Escape now puts you back in select mode, regardless of current state. Moved XDrawChem database, and eliminated dependency of frowns, sort of. Canonical SMILES is now found by querying a cgi-bin script, so if you have net access, you can access all DB features now. version 1.8.2: Zoom/magnify tools now exist. Double bond alignment fixes. You can set a specific double bond style by right-clicking on the double bond. Updated configure script with Geoffrey Wossum's excellent macro for finding Qt and setting variables. http://autoqt.sf.net/ version 1.8.1: Improved Undo feature. Code cleanup and arrangement: compiles much faster now. version 1.8: Added circle and square tools. Changed menu structure a bit. Added Italian language file. Improved database -- it's now possible to get CAS number and sometimes name from a molecule structure. Database back-end changes have also improved lookup based on name and CAS. Fixed some bugs, see SourceForge bug tracker. version 1.7.8: Added lasso tool. Fixed bug 900782. Updated to use OpenBabel 1.100.2 (and later) version 1.7.7: Bug fix release -- fixed EPS bounds and buggy text alignment. Administrative: moved everything to SourceForge.net, put source in CVS. version 1.7.6: Bug fix release -- fixed null pointer bug in file save. XDrawChem can now draw hex grid. version 1.7.5: EPS output should now draw text better. A "Did You Know?" dialog was added. configure script updated to use latest autoconf/automake. OpenBabel is no longer bundled. You will need to download it separately. --(from http://openbabel.sourceforge.net/ ; OB version must be 1.100.1) Translation .po and .pot files were updated (sorry that I forgot these!) version 1.7.4: Program now supports English and metric units. version 1.7.3: Added ruler and square grid. Added octanol-water partition (Kow) calculator. Updated OB source directory. version 1.7.2: Fixed an issue with EPS/PostScript output. Added new Danish and Polish translations. version 1.7.1: Improved p orbital symbols. (Hopefully) fixed bug with saving pictures. version 1.7: Added half and full arrowheads for Bezier curves. Updated documentation. Fixed double->int conversions so that rounding is done rather than truncation. (should improve drawing appearance) Generated an xdrawchem.pot file for translation. version 1.6.10: Fixed a printing bug where lines were drawn over text. Added pKa estimation. version 1.6.9: Added "wavy" bond type. Page setup preferences (page size, orientation, etc.) are now saved. version 1.6.8: Bug fix release. No significant new features. version 1.6.7: Added file type auto-detect. Added aliphatic chain tool. Added Newman projection. version 1.6.6: Added option to not add hydrogens and format. New text options: left, center, right justify. version 1.6.5: Fixed CDX/CDXML open and save operations. Added new drawing options: box, ellipse, cubic bezier, new arrow style. version 1.6.4: Added new spectrum dialog. Fixed text behaviors -- backspace and delete behavior and display of carbon. Added option to put subscript on brackets. version 1.6.3: Combined open and save menus, eliminated import/export options. Command line conversion (molecule -> image) is now possible. version 1.6.2: Fixed compilation to work on newer gcc. Updated OpenBabel library code. Updated Windows version to include OpenBabel. version 1.6.1: Added translation files for Danish (dk) and Japanese (jp). Patched SMILES dialog to use OpenBabel. (contributed by Brett Saunders) Fixed several memory leaks. Fixed Delete key behavior. Added symbol font. Re-implemented (some) event handling to use Qt signal-slot architecture. version 1.6: Latest stable release. Clipboard works again, and works with curve arrows and symbols correctly. Added help to some dialogs. version 1.5.5: Code cleanup. Automatic scaling on file read or import operation. Changed behavior of select tool when moving bonds. version 1.5.4: File export via OpenBabel is implemented. Fixed some namespace issues. version 1.5.3: Added configure switch to control whether OpenBabel is built. Added configure switch to specify which flavor of Qt to use. File import via OpenBabel is implemented. version 1.5.2: New HTML-based manual. autoconf/automake build implemented. See INSTALL.txt version 1.5.1: Partial OpenBabel integration. Numerous usability and file format fixes. Save custom ring dialog added. version 1.5: (UNIX) Stereo bonds now print correctly. The annoying ring placement bug has been fixed :) Improved 1H NMR prediction -- chiral centers, better shift prediction. version 1.4.2: Limited 1H NMR prediction ability. Fixed bug with deleting labels (again). MDL Molfile now saved correctly. (Windows) Stereo-down bonds are drawn correctly. version 1.4.1: Fixed parentheses printing (EPS mode) Fixed bug with saving/restoring where element name saved incorrectly Delete key on highlighted text behaves correctly now. Ctrl+B, Ctrl+I, Ctrl+U, Ctrl-Plus, Ctrl-Minus shortcuts on text. (Bold, Italic, Underline, Superscript, Subscript, respectively) Fixed hydrogen calc and attach point for more groups: "CO", "SO" Fixed printing of symbols (i.e., learn to print bitmaps) version 1.4: Bug fixes: redraw, text placement, etc. Added some templates. Smart placement. Automatic attachment of amino acids and rings. version 1.3.2: Bug fix release: pointers, getenv(), -lqt vs. -lqt-mt, fonts, etc. Really fixed EPS bug this time, I hope. version 1.3.1: Added pictures to menus for "standard" items. Fixed EPS export bug. version 1.3: Preferences are now saved. (The directory is platform-dependent) Simple reaction analysis: Free energy change estimate, 13C NMR comparison. version 1.2: Consolidated all molecule info stuff into one dialog. Added features to group molecules into reactants and products. Switched to GPL (woo hoo!) version 1.1.1: Fixed a bug with screen clearing and double buffering. Code cleanup. version 1.1: Structure cleanup has improved -- aliphatics no longer drawn as straight lines. Changed drawing of carbonyl and imine double bonds. New CML parser - used Qt's XML parsing functions. version 1.0.2: Molecular weight and empirical formula are displayed on the status line before pasting. Can paste elemental analysis data into the drawing. Moving towards using a Preferences class to store user settings. version 1.0.1: Rings are not placed automatically; click to place rings. Screen drawing is now double-buffered. Flicker should be reduced. More intelligent text placement. Automatically adds hydrogens. Added symbol: stereochemical ring hydrogen. Added ring templates: indole, purine, pyrimidine, steroid backbone. version 1.0: First "stable" release. Fixed some things: memory allocation, selection issues. Shift-drag over part of a molecule selects the entire molecule. IR spectrum prediction improved. Export Peak Lists from 13C NMR and IR copies peak list to clipboard. Fixed length and angle of bond and arrow are now controlled separately. XDrawChem can now use Babel. Added features if Babel is installed: Can read and write PDB files. Can output SMILES strings. version 0.99.9: Fixed more behavior bugs. Double and triple bonds are drawn a little better now. Same code compiles on Windows and UNIX. Visual C++ project file now included. Hydrogens added automatically in SMILES and structure cleanup. Title bar now says "XDrawChem". version 0.99.8: Fixed some behavior bugs. Fixed some code incompatibility between Windows and UNIX with conditional compile statements. Added SVG export support. (Under "Save picture") Added ChemDraw(TM) XML export support. (Under "Save as...") version 0.99.7: Make text placement slightly smarter. Implemented copy to system clipboard and drag and drop. This uses the Qt library objects QImageDrag and QClipboard; I am not sure what applications can interact with items from Qt applications. Received (or created from old language_*.h) new translation files. Dutch, French, German and English now supported. Created mailing list: xdrawchem-announce@lists.sourceforge.net version 0.99.6: Bugfix release - conditional compiling should still allow compilation with Qt 2.3.x, and fixed elemental analysis and EPS output. Added translation sources (.ts files) for French (fr), German (de), Italian (it), Dutch (nl), Spanish (es), and Portugese (pt and br - Brazil). The text is still in English and needs translating with Qt Linguist :) version 0.99.5: Default print resolution is 100 dpi -- so 25 point lines on screen equal 1/4 inch on paper, etc. Now using Qt 3.0 langauge support - no more language_*.h files. Network access now uses Qt 3.0 HTTP support, eliminating curl dependency. version 0.99.4: Implemented structural diagram generation based on JMDraw. Added SMILES interpreter. Added molecule clean-up function. version 0.99.3: Fixed problem with text rendering when printing. version 0.99.2: Split ring menu into categories. Added automatic text placement. Added German manual. version 0.99.1: Fixed compile bug(s). version 0.99: Added edit functions. Added more help strings. Started to fix localization. version 0.98: Added database access components. version 0.97: Added French, German, and Polish languages. version 0.96: Added some language support. Changed the way double bonds are handled. Aromatics etc. look nicer. Added arrow styles - dashed, bidirectional, retrosynthetic, 90 and 270 degree curve arrows. version 0.95: Added colors and background. Added bold, italic, and underline options for text. Added page setup and tinkered with printing. version 0.94: Implemented Undo. First Windows build released. version 0.93: Added bracket styles. Import of binary ChemDraw (CDX) files. (not perfect, of course :) Basic IR prediction. version 0.92: Finally, you can do "make install"! Improved handling of CDXML [ChemDraw(TM) XML text] file types. version 0.91: Added empirical formula calculation. Added elemental analysis. Fixed some behaviors (text and selection). version 0.9: Rewrote nearly everything. UI changes. Added curve arrow. Improved symbols. 13C NMR prediction. version 0.85: Added Rotate functions (under Edit menu). Consolidated Flip functions (under Edit menu). Added Insert menu under Edit menu; can now insert CML/XML files. Started to migrate pre-defined rings to CML format. Can read simple ChemDraw XML (text only!) files. Can write simple Encapsulated PostScript (EPS) files. version 0.84: Added Info window and functions. Fixed MW calculator. Fixed some things in Format menu. Changed Alignment functions; now under Tools menu. Alignment functions now collected as Auto Layout. Better support for XML documents. (Auto scale and placement) Changed ring dialog; added all common amino acids and nucleic acids. version 0.83: Bug fixes, add more rings, update manual, etc. Improved MDL Molfile support (still doesn't meet spec, but closer now) Improved XDrawChem file format to store element info. Added Undo (may not be able to undo everything!). Added Mass Calculator. Changed and improved text editor - now can properly do super- and subscript, and support multi-line entry. Added some support for 2-D CML (Chemical Markup Language) files. version 0.82: Added support for PNG image files. Ability to flip horizontal/vertical. Dashed line support. Symbol support. Changed install procedure and Makefile to point to correct ring file location. version 0.81: Added more rings. (This will probably happen every release.) Wrote more manual pages. (This will also probably happen every release.) Bug fixes. (I really hope to do this every release too.) Added color. Changed ring dialog so "tool tips" appear to identify each ring. Line drawing now tells length and angle of the line being drawn. Manual is not modal anymore, so you can continue working with the manual open. There is now a user-defined page size which allows you to specify the pixel size of the drawing widget (this is most useful for creating images). You can now set the fixed angle used in fixed length/angle mode. version 0.8: First public release. xdrawchem-v1.11.0/INSTALL.txt000066400000000000000000000015141371466245600156300ustar00rootroot00000000000000To install XDrawChem: 1) Install recent Qt and OpenBabel from packages or source. If installing from packages, please also install the "devel" packages as well, e.g. qt5-qtbase-devel and openbabel-devel. XDrawChem is built with Qt 5.6 and OpenBabel 3 or later Please file an issue on GitHub if these versions or newer fail. 2) Type "qmake". This will generate the XDrawChem Makefiles. Then type "make" to build the program Finally, if you would also like to install the program, type "make install" (as root). After installation: 3) Type "xdrawchem" to run the program. Also, you may wish to type "xdrawchem --help", as XDrawChem supports some command line functions. 4) Setting the environment variable XDC_SERVER will override the XDC_SERVER set in the Makefile. Enjoy! -- Bryan Herger bherger@users.sourceforge.net xdrawchem-v1.11.0/LICENSE.txt000066400000000000000000001045151371466245600156110ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . xdrawchem-v1.11.0/README.md000066400000000000000000000005771371466245600152500ustar00rootroot00000000000000# XDrawChem This is a fork of the [original xdrawchem project][http://xdrawchem.sourceforge.net/] that fixes many bugs and adds some convenience features. See HISTORY.txt for details. Requires OpenBabel 3 and Qt5 (5.6 or later, again get all devel packages!) ## Building from source ``` $ qmake $ make ``` To install after building from source, also run: ``` $ make install ``` xdrawchem-v1.11.0/README.txt000066400000000000000000000041411371466245600154560ustar00rootroot00000000000000Welcome to XDrawChem! (version 1.11.0) Mostly written by Bryan Herger, bherger@users.sourceforge.net See acknowledgements below for specific contributions. This fork of XDrawChem is hosted at https://gitlab.com/yamanq/xdrawchem Please report bugs and suggest features here. The original XDrawChem web site is http://xdrawchem.sourceforge.net/ This program is released under the terms of the GNU General Public License. Portions of the source code are copyright by others. Please see the files COPYRIGHT.txt and LICENSE.txt included in this package. NOTE: This is a mostly stable version, but probably still has bugs! See LICENSE.txt for copyright and limitation of liability. XDrawChem is a two-dimensional molecule drawing program for Unix operating systems. It is similar in functionality to other molecule drawing programs such as ChemDraw (TM, CambridgeSoft). It can read and write MDL Molfiles and CML files to allow sharing between XDrawChem and other chemistry applications. XDrawChem has been tested on Linux, Sun Solaris and SGI IRIX. XDrawChem was designed with Qt 3.0 or later, available free from https://www.qt.io XDrawChem also depends on the OpenBabel library, http://openbabel.sf.net/ Please read INSTALL.txt which gives instructions on how to install XDrawChem. XDrawChem features a limited manual. Run the program and press F1 (or select Manual under the Help menu) for instructions. The HISTORY.txt file lists changes made in each revision. Acknowledgements and many thanks to the following people who have contributed: Yaman Qalieh Thomas LeClerc Masao Kawamura Guy Brand Sven Bornemann Kuznik Nikodem Ralf Ahlbrink Eduardo Sanchez Ronald Bialozyt Egon Willighagen Armando Navarro Bojan Ivancic Brett Saunders Geoffrey Wossum (for autoconf macros, http://autoqt.sf.net/) Brian Kelley (for Frowns project, http://frowns.sf.net/) Christian Becke (for pixmaps) Everyone who works on OpenBabel (http://openbabel.sf.net/) Vitaly Lipatov and Roman Borisyuk (for Russian language translation) Daniel Leidert (for German language translation) Thomas Shattuck Gerd Fleischer ...and others not listed yet... xdrawchem-v1.11.0/SPECS/000077500000000000000000000000001371466245600146355ustar00rootroot00000000000000xdrawchem-v1.11.0/SPECS/xdrawchem.spec000066400000000000000000000026621371466245600175010ustar00rootroot00000000000000Summary: XDrawChem is an application for drawing and analyzing chemical structures and reactions. Name: xdrawchem Version: 1.10.2 Release: 1 License: GPL Group: Applications/Productivity URL: http://www.woodsidelabs.com/chemistry/xdrawchem.php Source0: https://sourceforge.net/projects/%{name}/files/%{name}/%{version}/%{name}-%{version}-%{release}.rpmsrc.tar.gz Requires: openbabel qt5-qtbase BuildRequires: openbabel openbabel-devel qt5-qtbase qt5-qtbase-devel BuildRoot: /var/tmp/%{name}-buildroot %description XDrawChem is an application for drawing and analyzing chemical structures and reactions. %prep %setup -q %build [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT qmake-qt5 PREFIX="/usr/local" make %install install -D -m 0755 bin/xdrawchem $RPM_BUILD_ROOT/usr/local/bin/xdrawchem mkdir -p $RPM_BUILD_ROOT/usr/local/share/xdrawchem chmod 0755 $RPM_BUILD_ROOT/usr/local/share/xdrawchem cp ring/* $RPM_BUILD_ROOT/usr/local/share/xdrawchem mkdir -p $RPM_BUILD_ROOT/usr/local/share/xdrawchem/doc chmod 0755 $RPM_BUILD_ROOT/usr/local/share/xdrawchem/doc cp doc/* $RPM_BUILD_ROOT/usr/local/share/xdrawchem/doc %clean make clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc README.txt INSTALL.txt TODO.txt COPYRIGHT.txt /usr/local/bin/xdrawchem /usr/local/share/xdrawchem/* %changelog * Sun Dec 11 2016 Bryan Herger - initial version of spec file xdrawchem-v1.11.0/TODO.txt000066400000000000000000000013511371466245600152660ustar00rootroot00000000000000to fix immediately: Improve printing of diagrams. (Improve) Compute pKa's of functional groups. Add more lone pair/orbital symbols. Longer term: - Improve interoperability with OpenBabel (perhaps abolishing my custom Molecule classes in favor of OBMol) - Browser plugin (Mozilla for Linux/MacOSX, .NET on Windows) - Retrosynthesis - Implement Convert to 3D. - Link to 3-D visualization programs of some sort - Improved XML support -- standards like SAX and DOM... For Qt4 - antialias option - cmake, qmake or autotools? - use Qt resource system instead of RingDir? - find a way to replace Q3PointArray (beziers) - use more pass by reference (const QString &) - make use of Qt's Postscript and SVG output capabilities? - improve previewwidgetxdrawchem-v1.11.0/doc/000077500000000000000000000000001371466245600145255ustar00rootroot00000000000000xdrawchem-v1.11.0/doc/COPYRIGHT.txt000066400000000000000000000021521371466245600166360ustar00rootroot00000000000000
Contains non-Free header file: CDXConstants.h
Contains non-Free code: goldman_rotate.cpp

Portions copyright by Christoph Steinbeck, the JChemPaint project and
others. All source files contain copyright and licensing information.

-- XDrawChem copyright begins here --

XDrawChem
Copyright (C) 2004-2005  Bryan Herger 
Copyright (C) 2020  Yaman Qalieh 

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see .

(Author's note: the license is in the file LICENSE.txt, which is included in the source directory.)
xdrawchem-v1.11.0/doc/HISTORY.txt000066400000000000000000000361101371466245600164300ustar00rootroot00000000000000version 1.9.4: (contributed) Fixed buggy pointer references related to bug #1158842. Added Edit > Insert symbol dialog. Improvements to BUILD3D code now yield better results for fused rings, aromtics, and other double bonds. Updated Polish language file. version 1.9.3: Fixed issue with color selection and color in EPS files. Aliphatic chains are now consistently drawn correctly. Undo and load/save correctly handle explicit "C" labels on carbons. BUILD3D is now accessed as a CGI script, which means it is accessible for all platforms with an Internet connection. (contributed) Updated Polish language file. version 1.9.2: Fixed some small bugs in drawing behavior. When a Tool menu option is chosen, the target molecule is now highlighted on mouse over. Added more options to right-click menu. Added reverse reaction prediction. Double clicking on text allows edit. XDrawChem can produce 3-D structures using the external program BUILD3D. Fixed issues with coordinate system. version 1.9.1: Updated German translation. Thanks to Daniel Leidert for this work. Fixed some keyboard and text input issues. Mainly, it's possible to label carbons again, and type characters that are not US-English letters and numbers. This should also fix some format issues. You can now change font settings within XDrawChem and have them saved between sessions. Fixed arrow behavior. All arrow types render correctly, and it's possible to change the thickness of some arrow types. Fixed custom rings dialog. Custom rings saved to user's home directory now appear on menu correctly. Menu is also dynamically updated, so new structures appear immediately without need to restart XDrawChem. version 1.9: Added Russian language translation file. Thanks to Vitaly Lipatov and Roman Borisyuk for conributing this work. Fixed dialogs that display Help. It's now possible to use the Help dialog, and close it without closing the tool you are using. Eliminated Elemental analysis dialog. This feature is now part of Molecule Information. Fixed a bug in the text tool that caused a segfault when clicking off of an empty text field. Also updated text toopl behavior to more accurately show what would be selected, moved, etc. on mouse click. Fixed a bug where aromatic and other rings would have infinite scale and random rotation if attached to an existing bond. Rings now attach correctly, even to vertical bonds. Keyboard input for non-English users is fixed. You can finally type letters with umlauts (e.g., "Säure") and other accents. You can paste text from other applications with Ctrl+V. However, you must select the Text tool first and create a new text box. The width of any bond (double, triple, dashed, ...) may be changed now. version 1.8.5: Fixed EPS output by using "ps2epsi" script supplied with GhostScript to process the file. Updated some deprecated functions to current version and fixed some warnings. (contributed) Made some pixmaps transparent to improve print quality. version 1.8.4: Names retrieved from the database are correctly displayed now. Right-clicking on a molecule brings up a popup list of actions. Currently, select molecule, cut, copy and molecule info are available this way. version 1.8.3: Updated Polish translation. Pressing Escape now puts you back in select mode, regardless of current state. Moved XDrawChem database, and eliminated dependency of frowns, sort of. Canonical SMILES is now found by querying a cgi-bin script, so if you have net access, you can access all DB features now. version 1.8.2: Zoom/magnify tools now exist. Double bond alignment fixes. You can set a specific double bond style by right-clicking on the double bond. Updated configure script with Geoffrey Wossum's excellent macro for finding Qt and setting variables. http://autoqt.sf.net/ version 1.8.1: Improved Undo feature. Code cleanup and arrangement: compiles much faster now. version 1.8: Added circle and square tools. Changed menu structure a bit. Added Italian language file. Improved database -- it's now possible to get CAS number and sometimes name from a molecule structure. Database back-end changes have also improved lookup based on name and CAS. Fixed some bugs, see SourceForge bug tracker. version 1.7.8: Added lasso tool. Fixed bug 900782. Updated to use OpenBabel 1.100.2 (and later) version 1.7.7: Bug fix release -- fixed EPS bounds and buggy text alignment. Administrative: moved everything to SourceForge.net, put source in CVS. version 1.7.6: Bug fix release -- fixed null pointer bug in file save. XDrawChem can now draw hex grid. version 1.7.5: EPS output should now draw text better. A "Did You Know?" dialog was added. configure script updated to use latest autoconf/automake. OpenBabel is no longer bundled. You will need to download it separately. --(from http://openbabel.sourceforge.net/ ; OB version must be 1.100.1) Translation .po and .pot files were updated (sorry that I forgot these!) version 1.7.4: Program now supports English and metric units. version 1.7.3: Added ruler and square grid. Added octanol-water partition (Kow) calculator. Updated OB source directory. version 1.7.2: Fixed an issue with EPS/PostScript output. Added new Danish and Polish translations. version 1.7.1: Improved p orbital symbols. (Hopefully) fixed bug with saving pictures. version 1.7: Added half and full arrowheads for Bezier curves. Updated documentation. Fixed double->int conversions so that rounding is done rather than truncation. (should improve drawing appearance) Generated an xdrawchem.pot file for translation. version 1.6.10: Fixed a printing bug where lines were drawn over text. Added pKa estimation. version 1.6.9: Added "wavy" bond type. Page setup preferences (page size, orientation, etc.) are now saved. version 1.6.8: Bug fix release. No significant new features. version 1.6.7: Added file type auto-detect. Added aliphatic chain tool. Added Newman projection. version 1.6.6: Added option to not add hydrogens and format. New text options: left, center, right justify. version 1.6.5: Fixed CDX/CDXML open and save operations. Added new drawing options: box, ellipse, cubic bezier, new arrow style. version 1.6.4: Added new spectrum dialog. Fixed text behaviors -- backspace and delete behavior and display of carbon. Added option to put subscript on brackets. version 1.6.3: Combined open and save menus, eliminated import/export options. Command line conversion (molecule -> image) is now possible. version 1.6.2: Fixed compilation to work on newer gcc. Updated OpenBabel library code. Updated Windows version to include OpenBabel. version 1.6.1: Added translation files for Danish (dk) and Japanese (jp). Patched SMILES dialog to use OpenBabel. (contributed by Brett Saunders) Fixed several memory leaks. Fixed Delete key behavior. Added symbol font. Re-implemented (some) event handling to use Qt signal-slot architecture. version 1.6: Latest stable release. Clipboard works again, and works with curve arrows and symbols correctly. Added help to some dialogs. version 1.5.5: Code cleanup. Automatic scaling on file read or import operation. Changed behavior of select tool when moving bonds. version 1.5.4: File export via OpenBabel is implemented. Fixed some namespace issues. version 1.5.3: Added configure switch to control whether OpenBabel is built. Added configure switch to specify which flavor of Qt to use. File import via OpenBabel is implemented. version 1.5.2: New HTML-based manual. autoconf/automake build implemented. See INSTALL.txt version 1.5.1: Partial OpenBabel integration. Numerous usability and file format fixes. Save custom ring dialog added. version 1.5: (UNIX) Stereo bonds now print correctly. The annoying ring placement bug has been fixed :) Improved 1H NMR prediction -- chiral centers, better shift prediction. version 1.4.2: Limited 1H NMR prediction ability. Fixed bug with deleting labels (again). MDL Molfile now saved correctly. (Windows) Stereo-down bonds are drawn correctly. version 1.4.1: Fixed parentheses printing (EPS mode) Fixed bug with saving/restoring where element name saved incorrectly Delete key on highlighted text behaves correctly now. Ctrl+B, Ctrl+I, Ctrl+U, Ctrl-Plus, Ctrl-Minus shortcuts on text. (Bold, Italic, Underline, Superscript, Subscript, respectively) Fixed hydrogen calc and attach point for more groups: "CO", "SO" Fixed printing of symbols (i.e., learn to print bitmaps) version 1.4: Bug fixes: redraw, text placement, etc. Added some templates. Smart placement. Automatic attachment of amino acids and rings. version 1.3.2: Bug fix release: pointers, getenv(), -lqt vs. -lqt-mt, fonts, etc. Really fixed EPS bug this time, I hope. version 1.3.1: Added pictures to menus for "standard" items. Fixed EPS export bug. version 1.3: Preferences are now saved. (The directory is platform-dependent) Simple reaction analysis: Free energy change estimate, 13C NMR comparison. version 1.2: Consolidated all molecule info stuff into one dialog. Added features to group molecules into reactants and products. Switched to GPL (woo hoo!) version 1.1.1: Fixed a bug with screen clearing and double buffering. Code cleanup. version 1.1: Structure cleanup has improved -- aliphatics no longer drawn as straight lines. Changed drawing of carbonyl and imine double bonds. New CML parser - used Qt's XML parsing functions. version 1.0.2: Molecular weight and empirical formula are displayed on the status line before pasting. Can paste elemental analysis data into the drawing. Moving towards using a Preferences class to store user settings. version 1.0.1: Rings are not placed automatically; click to place rings. Screen drawing is now double-buffered. Flicker should be reduced. More intelligent text placement. Automatically adds hydrogens. Added symbol: stereochemical ring hydrogen. Added ring templates: indole, purine, pyrimidine, steroid backbone. version 1.0: First "stable" release. Fixed some things: memory allocation, selection issues. Shift-drag over part of a molecule selects the entire molecule. IR spectrum prediction improved. Export Peak Lists from 13C NMR and IR copies peak list to clipboard. Fixed length and angle of bond and arrow are now controlled separately. XDrawChem can now use Babel. Added features if Babel is installed: Can read and write PDB files. Can output SMILES strings. version 0.99.9: Fixed more behavior bugs. Double and triple bonds are drawn a little better now. Same code compiles on Windows and UNIX. Visual C++ project file now included. Hydrogens added automatically in SMILES and structure cleanup. Title bar now says "XDrawChem". version 0.99.8: Fixed some behavior bugs. Fixed some code incompatibility between Windows and UNIX with conditional compile statements. Added SVG export support. (Under "Save picture") Added ChemDraw(TM) XML export support. (Under "Save as...") version 0.99.7: Make text placement slightly smarter. Implemented copy to system clipboard and drag and drop. This uses the Qt library objects QImageDrag and QClipboard; I am not sure what applications can interact with items from Qt applications. Received (or created from old language_*.h) new translation files. Dutch, French, German and English now supported. Created mailing list: xdrawchem-announce@lists.sourceforge.net version 0.99.6: Bugfix release - conditional compiling should still allow compilation with Qt 2.3.x, and fixed elemental analysis and EPS output. Added translation sources (.ts files) for French (fr), German (de), Italian (it), Dutch (nl), Spanish (es), and Portugese (pt and br - Brazil). The text is still in English and needs translating with Qt Linguist :) version 0.99.5: Default print resolution is 100 dpi -- so 25 point lines on screen equal 1/4 inch on paper, etc. Now using Qt 3.0 langauge support - no more language_*.h files. Network access now uses Qt 3.0 HTTP support, eliminating curl dependency. version 0.99.4: Implemented structural diagram generation based on JMDraw. Added SMILES interpreter. Added molecule clean-up function. version 0.99.3: Fixed problem with text rendering when printing. version 0.99.2: Split ring menu into categories. Added automatic text placement. Added German manual. version 0.99.1: Fixed compile bug(s). version 0.99: Added edit functions. Added more help strings. Started to fix localization. version 0.98: Added database access components. version 0.97: Added French, German, and Polish languages. version 0.96: Added some language support. Changed the way double bonds are handled. Aromatics etc. look nicer. Added arrow styles - dashed, bidirectional, retrosynthetic, 90 and 270 degree curve arrows. version 0.95: Added colors and background. Added bold, italic, and underline options for text. Added page setup and tinkered with printing. version 0.94: Implemented Undo. First Windows build released. version 0.93: Added bracket styles. Import of binary ChemDraw (CDX) files. (not perfect, of course :) Basic IR prediction. version 0.92: Finally, you can do "make install"! Improved handling of CDXML [ChemDraw(TM) XML text] file types. version 0.91: Added empirical formula calculation. Added elemental analysis. Fixed some behaviors (text and selection). version 0.9: Rewrote nearly everything. UI changes. Added curve arrow. Improved symbols. 13C NMR prediction. version 0.85: Added Rotate functions (under Edit menu). Consolidated Flip functions (under Edit menu). Added Insert menu under Edit menu; can now insert CML/XML files. Started to migrate pre-defined rings to CML format. Can read simple ChemDraw XML (text only!) files. Can write simple Encapsulated PostScript (EPS) files. version 0.84: Added Info window and functions. Fixed MW calculator. Fixed some things in Format menu. Changed Alignment functions; now under Tools menu. Alignment functions now collected as Auto Layout. Better support for XML documents. (Auto scale and placement) Changed ring dialog; added all common amino acids and nucleic acids. version 0.83: Bug fixes, add more rings, update manual, etc. Improved MDL Molfile support (still doesn't meet spec, but closer now) Improved XDrawChem file format to store element info. Added Undo (may not be able to undo everything!). Added Mass Calculator. Changed and improved text editor - now can properly do super- and subscript, and support multi-line entry. Added some support for 2-D CML (Chemical Markup Language) files. version 0.82: Added support for PNG image files. Ability to flip horizontal/vertical. Dashed line support. Symbol support. Changed install procedure and Makefile to point to correct ring file location. version 0.81: Added more rings. (This will probably happen every release.) Wrote more manual pages. (This will also probably happen every release.) Bug fixes. (I really hope to do this every release too.) Added color. Changed ring dialog so "tool tips" appear to identify each ring. Line drawing now tells length and angle of the line being drawn. Manual is not modal anymore, so you can continue working with the manual open. There is now a user-defined page size which allows you to specify the pixel size of the drawing widget (this is most useful for creating images). You can now set the fixed angle used in fixed length/angle mode. version 0.8: First public release. xdrawchem-v1.11.0/doc/LICENSE.txt000066400000000000000000001045151371466245600163560ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . xdrawchem-v1.11.0/doc/arrowtool.png000066400000000000000000000002421371466245600172610ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆYIDATxœ¥ÒA@ ÐÆ¸ÿ•óWLÕ§AWòF’´‡)§o@D®\íêR vöa 9 ñѤ ñSÛbµÁ€éÈþÓ_ØL¬° KÀ.,Yµµ—%MÒïÈIEND®B`‚xdrawchem-v1.11.0/doc/boldtool.png000066400000000000000000000002401371466245600170450ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆWIDATxœÅRI1‚fþÿezjbZºãÍ ‘@A¨D+møæÁ-%A¼2ˆC‚sþô‚»œ—Т[<±82ˆÔÿØÞìĬ€l”­Üy$# ÐIEND®B`‚xdrawchem-v1.11.0/doc/brackettool.png000066400000000000000000000002331371466245600175420ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆRIDATxœÝ“1 ©áÿ_®¦€ÍNRÃ¥IZCËTæéØî‡ÒHÚèæ)td2 R•Ïd›Ë >¸±Û×K¼ Ý¿0À) íI-€IEND®B`‚xdrawchem-v1.11.0/doc/cb.png000066400000000000000000000002401371466245600156130ustar00rootroot00000000000000‰PNG  IHDR(ˆ@LóPLTEÿÿÿ¥ÙŸÝUIDATxœUÍ» €0 „á+{Ñ"¹¤d„ŒÂŒ‚R)Ãqa‰+¾îôƒkèr¼æž–ÁÊÛÌTS؈IwÃN‚^P3»5¬(¡â4ŸŸ^ÿw±dø3OâIEND®B`‚xdrawchem-v1.11.0/doc/cbf.png000066400000000000000000000002551371466245600157670ustar00rootroot00000000000000‰PNG  IHDR*ŒµœÎPLTEÿÿÿ¥ÙŸÝbIDATxœEΡ€0À/+’žf"‘”.°|(tD†™ÿy‘3«nî¦Ïo¯²ºÎ ' áR²âQ„T£ UÚž© N¦,#2¥AbŠÂ2u¦]¸ÇÈ2Ô/ýŠªsÝþAþIEND®B`‚xdrawchem-v1.11.0/doc/cbh.png000066400000000000000000000002531371466245600157670ustar00rootroot00000000000000‰PNG  IHDR*ŒµœÎPLTEÿÿÿ¥ÙŸÝ`IDATxœEα€ À/‹ÐžL!4´Jñ;°J pgÎ>à’nî¦Ïﯲ¹Á ' áRŠâQ…4£ MÚž©NN¦"#2¥IbŠÊ2x˜!·Qdh\ú§btÅ8¤y+IEND®B`‚xdrawchem-v1.11.0/doc/cinna.png000066400000000000000000000013001371466245600163150ustar00rootroot00000000000000‰PNG  IHDRŽZá0ùf‡IDATxœíœÑr„ E¥Óÿÿeû°ÇQªBâ­ç3WËŠÄt¿Ë’-®ËÑœ€eYñÉ8å‰gVè-âóKkã3ÎzÀ*ï«d@• ¨J¦zÅ©D• ¨’U2 JTÉ€*P%ªd@• ¨’U2 JTÉ€*P%ªd@• ùªž¿Uè!U±è±T6—m›ßƒax]ó¬Ð±t©ïÂ]¢„!©úÞã[Hêåj›ø XDrawChem documentation - Drawing

Drawing

The toolbar has bond, arrow, bracket, text ring, and symbol tools for drawing. The use of these tools is summarized in the Toolbar reference.

Tutorial exercise: Cinnamaldehyde

Draw the benzene ring first. Click and hold the Ring tool. Go into the Rings submenu. Select benzene. Left-click in the drawing area to draw a benzene ring.

Now draw the side chain. Click on the Bond tool. Move the mouse over an atom in the benzene ring and left-click to start drawing. Drag the bond into place and release the button. Repeat this process until you've drawn all the single bonds necessary for cinnamaldehyde.

We need to insert two double bonds. You can do this two ways, so we'll do each double bond differently. Use the Bond toll to draw over the existing bond to form the alkene double bond. Then choose the Select tool and right-click on the aldehyde C=O bond. Choose double bond in the dialog and press OK. Note you can also change other properties of the bond this way.

Now we need to label the aldehyde O and H so it's clear that this is cinnamaldehyde. Choose the Text tool and click on the end of the double bond -- make sure the end point is highlighted. Type "O" and press return. Then click where the H should be and type "H" and press return.

And there you have it -- cinnamaldehyde!

Main help page xdrawchem-v1.11.0/doc/edit.html000066400000000000000000000045701371466245600163460ustar00rootroot00000000000000 XDrawChem documentation - Editing

Editing

Modifying bonds, arrows, brackets

To change the style of a bond, arrow, or bracket, choose the Select tool from the toolbar and right-click on the object. A dialog will appear allowing you to change properties of the arrow, bond, or bracket. For example, it's possible to change the style of an arrow, the color or thickness of a bond, even to change from a single bond to a stereo bond.

Selecting

Use the Select tool to select objects. Drag with the left mouse button to draw a box around objects you wish to select. You may select all objects by choosing "Select all" from the Edit menu or by pressing Ctrl+A.

Cut, Copy, Paste

After selecting objects, you may cut, copy, and paste them. You may also delete a selection.

Changing objects

It's possible to change the type, appearance, and color of an object after it has been drawn. Choose the select tool, then right-click on a highlighted object. A dialog will appear allowing changes to certain properties of the object. For example, it is possible to change a single bond into a stereochemical bond, or change black curved brackets into green square brackets.

Moving objects

To move a single object, move the mouse over it until it is highlighted and the mouse pointer changes. Press the left button and drag to move the object.

To move a selection, place the mouse anywhere inside the selection. The mouse pointer will change to the four-way arrow move pointer. Press the left button and drag to move the selection.

Rotating and mirroring objects

To rotate a selection, move the mouse over the square in the top right corner of the selection. The mouse pointer will change to the rotate pointer. Press the left button and drag to rotate.

You may also rotate by exact angles using the Rotate submenu under the Edit menu.

To flip (mirror image) the object, select Flip Horizontal or Vertical from the Flip submenu of the Edit menu.

Resizing objects

To resize a selection, move the mouse pointer over the square in the bottom right corner of the selection. The mouse pointer will change to the resize pointer. Press the left button and drag to resize.

Main help page xdrawchem-v1.11.0/doc/editmenu.html000066400000000000000000000016561371466245600172350ustar00rootroot00000000000000 XDrawChem documentation - Edit menu

Edit menu

Undo (Ctrl+Z):Undo the last operation. It is possible to undo the last 16 actions.

Cut (Ctrl+X):Cut a selection to the clipboard.

Copy (Ctrl+C):Copy a selection to the clipboard.

Paste (Ctrl+V):Paste a selection from the clipboard.

Clear (Del):Delete selected items.

Select all (Ctrl+A): Select all items in the current window.

Rotate menu: These menu items rotate a selection by 90 or 180 degrees.

Flip menu: These menu items flip a selection across a horizontal or vertical line.

Zoom menu: Zoom in and out on the drawing. Ctrl+1 zooms out, Ctrl+0 zooms in, Ctrl+5 returns to normal (100%).

Main help page xdrawchem-v1.11.0/doc/erasetool.png000066400000000000000000000002371371466245600172320ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆVIDATxœ­RË káÿÿ²„°ÙÛuw÷ÑÀ옿XE¸£9 0ªÓäࣂ2gn*âl°aÎAÆDlúS…d…}Cµ)BûÁ3+%?dÐÚIEND®B`‚xdrawchem-v1.11.0/doc/filemenu.html000066400000000000000000000023251371466245600172210ustar00rootroot00000000000000 XDrawChem documentation - File menu

File menu

New (Ctrl+N): Create a new, blank XDrawChem window.

Open (Ctrl+O): Open a native XDrawChem file, CML file, or MDL Molfile.

Find on Internet: Search the XDrawChem network database for compounds. Search by CAS number, name, or formula.

Save (Ctrl+S): Save the current document. If it is a new document, you will be prompted for a file name and format.

Save as: Save the document to a new file.

Save picture: Save the current drawing as an image. Use this option to save as EPS (PostScript), BMP (Windows Bitmap), PNG, or SVG.

For UNIX versions:

Import via OpenBabel: Import any file type supported by OpenBabel. OpenBabel cannot read XDrawChem XDC files, use Open (Ctrl+O) for these.

Export via OpenBabel: Not yet implemented. Sorry. :)

Page setup: Specify page size and orientation.

Print (Ctrl+P): Print the current document.

Close (Ctrl+W): Close the current XDrawChem window.

Quit (Ctrl+Q): Close all XDrawChem windows.

Main help page xdrawchem-v1.11.0/doc/fileopen.png000066400000000000000000000003241371466245600170330ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆ‹IDATxœ’1 Ã0 EŸ‹2fÐ} %ÐûzÈè€:Ø)Èq°<|„ô„¾p2ŒQ,²ü›ÊQ’+Úà‰ˆEù©éɽÊQ’ W¼±DÄòE×> —*†LÞÕå§êªáÐW•òG³à›ïlt,xøýƒß­Þ¤Y˜ƒárƒÚ `vžDô~Pû`”£…©rIEND®B`‚xdrawchem-v1.11.0/doc/fileprint.png000066400000000000000000000003621371466245600172300ustar00rootroot00000000000000‰PNG  IHDR&/œŠsBIT|dˆ©IDATxœ•“Áà Cíi?5´ÖïLì³¼MÖ¥ÔJT‘¼Ô¡Áúc!A€{«Xêדô¼jÐÚäT $^5ØÒϦèNУÈ>ÜŽèå2¥˜<ÖSÐÈJ1í"Íu=S˜RL»ÈµÓ%0L!›x4Áò^<Ÿ_³YÄî/<žÁóïçO5Ù}2 3ås 8däÖ<£ÓÓÈ*G€¹ Œ` ·[IEND®B`‚xdrawchem-v1.11.0/doc/files.html000066400000000000000000000024521371466245600165200ustar00rootroot00000000000000 XDrawChem documentation - Files

Working with files

Opening a file

Select Open from the File menu to open a file. Use the filter list and the bottom to limit the types of files which are displayed. File formats are determined by the DOS-style extension -- e.g., foo.cml is assumed to be a CML-format file.

Saving a file

Press Ctrl+S to save the current drawing. You will be prompted for a file name if no name was previously specified. To save the drawing to a new file or format, select Save as... from the File menu. File format is determined by the extension, not the file type box -- e.g., a file ending in .mol will be saved as an MDL Molfile, regardless of file type box selection.

Making images

XDrawChem can save images in a number of formats for use by other applications. Use the "Save picture..." option under the File menu. Currently, XDrawChem can save to EPS (PostScript), Windows bitmap (.bmp), PNG, and SVG.

Printing

Use the Page Setup dialog to specify paper size and orientation, and Print to make a hard copy of the current drawing. It's possible to print to a printer or to a file.

Main help page xdrawchem-v1.11.0/doc/filesave.png000066400000000000000000000002631371466245600170320ustar00rootroot00000000000000‰PNG  IHDRH-ÑsBIT|dˆjIDATxœ½’] €0 ƒ¿Iw±Ao5‚·*ìjóA†¨øÓ=˜§BBÒi @re«öx¬I±jhR&¯’&ðsaŒØñ?QúËnüÝßx^|V„í—op¥jÕ.åø?ÕÐhD‰î¢¯ 8%§ø¬IEND®B`‚xdrawchem-v1.11.0/doc/font_pulldown.png000066400000000000000000000012631371466245600201270ustar00rootroot00000000000000‰PNG  IHDRƒ(jü3sBIT|dˆjIDATxœíYAªƒ0¡ÛbED BÏÓw×ct­<$EÄAèÆü•¢6Ñhµý)Î*y/N&Ó$ÆÆ*ËR`ûªªp¿ß†á·µüˆ‡ÃÁ8O‰VQb¿ßCˆmƒX–e¡( ˜æ©eYص?ŸÏ/Ê1—Ë`š§µîÎd¨ªê[z~ ¦zºk‹5Iø†©žn;à 0ÕÓÎdxlÛÆãñÐŽÏm§Ë±ßÚó´Æ·5>9V­aj|n;Ž<ÏÿýjóÔqeÞqäyÞÔmÛîÔׄ֙A'îºnSβLÚÎuÝNNVïsÔ1Çqe™Ö3:¹51æi{lý|–e/±OMþEvÏó¦iw]·S2gŒ#MÓ&W·ÕéwL“<ÏÌ«ø¦œ†òýqëb®n­É "×ù‘ç¶Óåh—o·[So—UüïBÅ·Ädð}_:†% â=@çü%A§½ïû¼Œ—sß÷Á9GàœOæ*Ë4ªøtPëTåT|ºúTy™7S0W÷bg†$I”9Õ íÇu9t43Æ:|Œ±Y«,I0Æ^bC\SþgèçkÝïîst/ö5Ñ.‡a"’戌1Ñà6>Ä1§ß¡qŒˆšK'™î>Þ}M,õj˜ª{‘ÉÇqç†.ŽãÑÕÑq„aˆ8޵û•åÚSÑï{ïN†þmç\Íígut[Q‰ãñ!¢(šÝéàz½ât:!Š"˜äi­[ë¹aLõt»›X¦zºM†`ª§Ûö 0ÕÓfg8ŸÏ_–ò;0ÕÓ¢ó=ºá=ʲ4ÎS"¨ßoiþIEND®B`‚xdrawchem-v1.11.0/doc/formatmenu.html000066400000000000000000000017711371466245600175760ustar00rootroot00000000000000 XDrawChem documentation - Format menu

Format menu

Bond - fixed length and angle: If this menu item is checked, bonds will be drawn to specific lengths and angles.

Arrow - fixed length and angle: If this menu item is checked, arrows will be drawn to specific lengths and angles.

Set background color: This menu item allows you to change the background color of the drawing area.

Toggle grid (Ctrl+G): Draw a square or hexagonal grid in the background. It's also possible to snap to grid, but that is set in Drawing settings, below.

Drawing settings... This item opens a dialog where you can set the lengths and angles of bonds and arrows and specify other format settings, such as double bond spacing.

XDC settings... This option allows you to set menu and ruler fonts, in the event the system defaults are unusable.

Main help page xdrawchem-v1.11.0/doc/functions.html000066400000000000000000000011041371466245600174170ustar00rootroot00000000000000 XDrawChem documentation - Formatting and Tools

Formatting

The format menu controls drawing options such as fixed length and fixed angle drawing. Refer to the Format reference for details.

Structure cleanup and reaction layout are under the Tools menu.

Tools

XDrawChem has a number of functions for analyzing structures. Tools are described in the Tool reference.

Main help page xdrawchem-v1.11.0/doc/groupmenu.html000066400000000000000000000011071371466245600174330ustar00rootroot00000000000000 XDrawChem documentation - Group menu

Group menu

Select reactant: Select this item and click on a molecule to mark it as a reactant.

Select product: Select this item and click on a molecule to mark it as a product.

Clear group: Select this item and click on a molecule to remove its group assignment.

Clear all groups: Select this item to remove group assignments from all molecules in the current window.

Main help page xdrawchem-v1.11.0/doc/helpmenu.html000066400000000000000000000010621371466245600172270ustar00rootroot00000000000000 XDrawChem documentation - Help menu

Help menu

Manual (F1): Displays this manual.

About: Displays author and copyright information.

Support: Lists contact information and mailing list information.

References: Lists books, articles, and other published works used in the creation of XDrawChem.

What's this? (Shift+F1): Point-and-click help for toolbar buttons and menu items.

Main help page xdrawchem-v1.11.0/doc/index.html000066400000000000000000000015061371466245600165240ustar00rootroot00000000000000 XDrawChem documentation home

Welcome to XDrawChem!

Bryan Herger

herger@chemistry.gatech.edu

Changes - Copyright - License

Sections:

  • Files
  • Drawing
  • Editing
  • Text
  • Formatting and Tools

    Reference:

  • Toolbars
  • File menu
  • Edit menu
  • Group menu
  • Format menu
  • Tools menu
  • Help menu xdrawchem-v1.11.0/doc/italictool.png000066400000000000000000000002101371466245600173670ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆ?IDATxœÅÒ1 0CÑüÞÿÎéÔ¥ BÑ5"–•ÌŠ¶_ F”ÌXÀ×tü¶ D‡n™Á-)óñWÞr‘JÏIEND®B`‚xdrawchem-v1.11.0/doc/linetool.png000066400000000000000000000002671371466245600170650ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆnIDATxœ¥“Ý € ƒgœ½uaoíźɠüIí»¶³ t’„,³B’sûADŒqÜ ]Mb€:ñÁdfÙûg‚9»|aÑ_TĺµÅʘ™|Èû–xÔ†jqoÐÓ·ºAwßNú÷N ѳ5ì`IEND®B`‚xdrawchem-v1.11.0/doc/molinfo.html000066400000000000000000000005741371466245600170640ustar00rootroot00000000000000 XDrawChem documentation - Molecule information

    Molecule information dialog

    This window shows data about the selected molecule.

    Check a box and press OK to paste certain information into the drawing.

    Click Cancel to close the dialog.

    Main help page xdrawchem-v1.11.0/doc/pastetool.png000066400000000000000000000004571371466245600172530ustar00rootroot00000000000000‰PNG  IHDR/\sBIT|dˆæIDATxœ­TÁµÃ }YÀVðn¬fÉ*YFÀ#ü2 mÕÅNÀ’lH\Îù?À±[! Ï9çïˆæB+&"0óGâÃHbŒ "¨*RJÈ9·bËÏ󄪂ˆBÈš#"¤”pß7TµEËE1F¨ê¾µ~QD¶³0Á-‘¡·¿Š³è’ˆˆPJ÷¥\×µu¶%2Eï}‹Pk})bæ—–̶Wö{ÔZ‡Y>æ ¦Ô+23œs`æáð<˜·3êÕg73áÇõ›WíÃ-^µ¹øŒæhõQŠÈÖÍ ÷«ßÈ?©ÃŒn`p)IEND®B`‚xdrawchem-v1.11.0/doc/ringtool.png000066400000000000000000000002521371466245600170670ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆaIDATxœ•‘A! ¡ÿÿ3žLV·ö¨I ”$lCæÙþUZ isÇ ¾pWR Ð’T‚;q$­Rq ^"¼Ìõ /ð!¸–¦¦Õ抵‚$ùƒ»¤s•£ÄbXÄóU.IEND®B`‚xdrawchem-v1.11.0/doc/ringtoolbar.png000066400000000000000000000063761371466245600175710ustar00rootroot00000000000000‰PNG  IHDRø!{‚ñ»gAMA± üa8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2)Ý.I ^IDATxœíœP“õÀß#Pbº‰;a¢6îÜäL ŠG!°ŠY·â O¥‹Õ™Kz ?Ô3@“Ð’~ b‰A1‘ÀË¿N~DÁۀ܀\ÉÐ5b Ù÷§[ûöìÏ&|ýîõnÏ>{íý¼÷Þçy?Ï>Ž P(7r¹<66¿Ç;á þþþ8-ø ؉„„„3gÎ8#w´ZíâFãÀ]ù§ÐõzýâÆáÀ]±¢ÐŸ|òI<¯tòäI@ð(Í‹ðÌÌÌÄÄ„»»;v³#Ãö3;!ÿÌbÏ £¿ŠÌXž8==ý믿Ú6àþþ~™LvãÆ·ÞzkxxØV÷÷÷[Ú›¥˜a{lU*»ÿÎè+V¬¨¯¯5ü}î¹çpî† ök`¾yóæßÿ=::ZWWwðàA‹…S+“ÉT*œ:ujjjÊ××÷ðáÃyyyï¾û.ƒÁÀcîîîÖh4§N:tè‘H 27rIeØÚ§­uAB*•ºººÒétìQZÜ«ááá¶¶6Œ¶ÐÐPŒf­­­###PSS£Õj}||8páÂ…;vlÙ²ÅÚ€@¡Ptuu@{{;bþꫯH$òhxxxaaáG}´³!ಲ2•JuåÊ•””‰4999ïàǻР©HLL<þ¼U©Xx¡WVVöõõ±Ùl.—K¥R±jq¯ÚÚÚŽ?Îf³-ªššš²³³±ºD"inn€‘‘‘ññq(**Z±bòè3Ïÿüs@%èã±tul6ûã?¶8,55£yhhèÒ¥K@ `çÎL&ÓdÌÆûúúM¦ô€åryQQQ~~~||¼¹1[·n}øðamm-×:ºY&“}óÍ7HÌ;wî4î|¼½½ù|þ_|!‹Åb1‡ÃÁ®ÅƒÌµó¦"77÷رc@$ÇÆÆ°¤bá3:ÄÇÇóùüêêj¥RyäÈ‘³gÏ¢_”ùæ·ß~«©©)((@9P°X¬ÙÙÙÊÊJ'''ãaf2™D"±¶¶–Ãᘠ"‘ÈÙÙyóæÍèf¥RyâÄ ‰´nݺ   y{P__߬¬,‰DÒÒÒ"‰.^¼( X” ߺu«¹¹yïÞ½%×®]#‘H3Œ’ ••uïÞ½’’’¡¡¡Õ«W{{{£§Â åõôÿ¹€¸\.ŸÏŽŽæñxï½÷Ê~êÍ€òŒ kýýý-¶C¯½öÚ÷ßßÞÞnUÀR©ô§Ÿ~B—ß»wo``ÀbÀjµº¹¹9!!Ï磜i!óùüíÛ·wuuýþûïØ®¯¯çñxׯ_G>øà‡œx h•JeNNÇC¦^sÔÕÕ …B™Lf¼%`$ eÙ²eó¦ÂÃÃ#999**ÊÍÍ­¡¡H$Λ ä.®ݘ—_~yÕªU£££‘‘‘QQQYYY8…Va3‹ÅÒh4ÈûjC-‚@ øðà ƦM›ÐÍžžž¡¡¡µ[·n]»v­á®Å€Äbñ;ï¼síÚµ÷ßÙX]]½jÕ*ÀœœävoooFFòUº™N§S©T¡PèââÂårç300Ð××g²]ëéé¹víÚ¦¦&s( Ç»sçγÏ>Ë`0~þùgsf\=º1!""bzzšÅbµ¶¶²X¬·ß~›Ïç/Xh¶2gfffddÐh´§Ÿ~Ú†Z8räˆ@ ÈÏÏ·­Ù‹Z•J599 V«‘qqqÈ :„……?¹½ÿþ§žz 9õB1%%%õööÖÖÖ§§§—––šÌÁõõõCCC&gVXÆ•J{9Ä–=ú\\]]™L¦ŸŸ_BB¹sç(Ê… ^zé¥ 1b+³——×™3g m¨ÕëõB¡Íf«T*dY‘R¢Õëõ7oÞ¬©©AêØËËËËË _SScxâòåËI$prrrHHˆE3‘H$‘HZ­–Édæää ÄÄÄ´··Æh4­Vëéé‰=`œÌ?£ÛªÐ ÌÎ΄üü|C•ã¢cC³^¯G®ÏØJ;55•——·nݺòòòÜÜÜ 6|÷Ýw¾Ð{{{=ÚÐÐ<˜œœ€Ý»w§§§ûûû;99Wavv¶ŸŸ_RR³1+W®‰D~ëÖ-d£N§û믿Èd²P(4™ÔÿW }zzZ¡P´µµ={–ÏçïÚµ §#¶2+•Ê£G;v ™ðk5Mqqñš5kzzz¶oßnh¾q¡ÏÌÌ S(©T •••ß~û-”””œ8qbppL&òÉ'@"‘^eõêÕXÌd2ÙÕÕutt”B¡ [ZZZÓÓÓ"‘¨³³óôéÓØƽztÐét"‘èÓO?ŒŒ”H$ø…ر•ùøñãqqqHƒŽ_«V«ËÊÊ\\\bcc E€ßlsÚû÷罹¦fffîÛ·’““ o2«ÕêW_}˜LæO<áááñúë¯c1#lÛ¶M¡P™\„ÐétW®\¹|ù²X,¶*`üØ«G¯®®ïéé1·KÖ ­Â&f©TJ&“­ºˆt:ݸ‚ h4š²²²™™‡SZZú /Xu…~a˜Ó._¾<88øöíÛæÞwwwä¡ÖÖÖÂÂÂððpŒfc¤RiEE…ñF# Q.:Û*È‚³ ½ªªJ©TÊår77·yOÖ ~sOOOUU‡Ã1œ~aÔnÛ¶mîÆ©©©ââbggg‡S^^cÛ€çÅœ–L&›” 9°› öõõ:‡JOO7÷,‹Z‹‹©ärùõë×ÇÆÆ¢££QÌx[—ŠŠŠþþ~pòäI›,X8ÍR©´ªª***Êd&C×Òh4‹…¬9ò (ÂÄÄDii©D"©¨¨¸{÷n\\Æ€===###³²²‚ƒƒQ¾mE‹ÅMMMëׯÇ0,šÙl6–EJصH*D"‘qbM*++srr€7n ¤׌^^^Ÿ’’âíí>£šššæ^mKKK‹ñ'ÅÌ`06oÞŒ8#""掑ÉdcccsB˜F£%%%ýðÃpõêÕ‹/@ff¦——×Ê•+322~ùå—îîn“fÝL¡PöîÝ{õêÕîîn½^ÿâ‹/š{õÆÆÆæææ5kÖÄÄÄÞÝ¥|Ì´V‹žŠñññ´´4"‘³lÙ²ÆÆFôT,¼Ðy<ÞÆCBB0V¹E!„††fggcQEGGcì1¨TêŽ;::: ®®îܹsPPP`Xù(•J;::öìÙ³€€ét:rlíêê€ôôôññq2™œ•••››ûÆolj1àÔÔT…BqùòåÒÒÒ˜|Q*•J³³³ ÆÜjS¡ƒùTìÞ½[§Óq¹Ü»wï~öÙgXR±ðBg±Xóþg,&ËÇÇÇP64´›6mBÖB•Jåîî^PPpúôé´´´ 6, `[¶lAÖèÒh´©©©¼òÊ+$iÞ*Çb¦Óé»víº}ûö—_~yøðáK—.Ñh4µZÍår}}}÷íÛçíí=·}Ì an*RRRÔju^^öTØòò¢E½Gg0ÈÒ6*•ªÓéþüóÏçŸ~ýúõóV9v­1ȥə™___777<Óh4æçç711ñæ›oŽŒŒÉä’’777ÃÀY¬5 øSñP(ètºñ_›ˆ—Î|ƒüÍììlGG‡‹‹‹­´œÍ}x¬5#—;+**>|H <<«IEND®B`‚xdrawchem-v1.11.0/doc/selecttool.png000066400000000000000000000002341371466245600174070ustar00rootroot00000000000000‰PNG  IHDR&”N:sBIT|dˆSIDATxœÒ; 0ЦôþW¶“Pê/ê"!""k0û=Ì`Èb28„Na†Ka zøT ê‡û‘)“ŠtSátj›†“}¥Sýgœê5Ž)ÿCíÙIEND®B`‚xdrawchem-v1.11.0/doc/spectra.html000066400000000000000000000007551371466245600170630ustar00rootroot00000000000000 XDrawChem documentation - File menu

    Working with spectra

    This window shows 1H, 13C and IR spectra.

    Select Print to print the contents of the window.

    Select Export Peak List to copy the peak list to the clipboard. You will be able to paste the peak list into any application as text.

    Select Close to close the spectrum and return to XDrawChem.

    Main help page xdrawchem-v1.11.0/doc/subscript.png000066400000000000000000000002611371466245600172500ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆhIDATxœ¥’Q€ C_½ÿë‡ÇdJæ>Xè£+Ș?µÅДVõcåÃB6Ö C¾Äª2XODñÛì% Þ<‡È„Þã²í"ƒu¬3§Þ?¸@E«â†ƒœ‡Õá®ÆcíäÓ7\™e”IEND®B`‚xdrawchem-v1.11.0/doc/superscript.png000066400000000000000000000002601371466245600176140ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆgIDATxœ¥’IÀ ÇýÿŸÝ%"@YrÉc; cnæÙ,ªë@`ƒ *T( í­8„ºqÊý;ì!U²±FçvRcUǹ¸›`Õy˜ ŠG;™¢ó $½Bûrô‘â¼hþ8eN®IEND®B`‚xdrawchem-v1.11.0/doc/symboltool.png000066400000000000000000000002521371466245600174350ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆaIDATxœµS[À ³û_¿HL­.Y”}’`ì)3tÒ{$‚T:’§²ÛUàí€dTuXÛ±WDr÷©í0Ý•'ñê>™†ãžÜí‚]¤›ï±Rz1 oúcÏIEND®B`‚xdrawchem-v1.11.0/doc/text.html000066400000000000000000000024401371466245600163770ustar00rootroot00000000000000 XDrawChem documentation - Text

    Text

    Drawing text

    XDrawChem has two general text drawing modes: text boxes and point labels. Text boxes are freely placed text, while point labels are atatched to a point in a drawing (e.g., the Cl label indicating a chlorine).

    Text boxes may be placed anywhere and may contain multiple lines. Point labels are one line and centered on the point. To draw text, select the text tool. Click anywhere except a point to draw a text box. To draw a point label, highlight a point by moving over it and left click.

    Working with text

    Buttons appear on the format toolbar to make text bold, italic, underlined, superscript, or subscript. Note that text may be only one of these, or plain text. Type your text first. To format regions of text, highlight the text with the mouse or with Shift+Arrow keys. Click a toolbar button or use standard keys to fromat the selected text.

    XDrawChem will attempt to add hydrogens and adjust subscripts where appropriate. The author apologizes for any inconvenience ths may cause. Please submit bug reports if XDrawChem is mangling your text labels.

    Main help page xdrawchem-v1.11.0/doc/texttool.png000066400000000000000000000002231371466245600171120ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆJIDATxœÝRA Òèÿ_¶Så"Ø!ÈÓ'âFIB%³ u%H†bÖ&4Äóì°DâˆOwð³A?ç鬀ùƒŽÛ}ßA¢ S^™IEND®B`‚xdrawchem-v1.11.0/doc/thick_pulldown.png000066400000000000000000000005111371466245600202560ustar00rootroot00000000000000‰PNG  IHDR0¼ý~ÜsBIT|dˆIDATxœÝ—= „0…_–´""6âýÏ`ç9lDD$ "6ºÅ²‹¬‰$1ãÉÌ{LÆ2Žã‡!œ6@—Åiý 0M“mZdYö10ϳm-Ú<Ó€çyJI†a0§H G™·ß÷}ô}(¯ FŽÐzÜøY7Ðu C7 ÈÄEDQ´{¿mÛMìVt꼀Ϯ—*ÿû¿9xñ½ÅÖ`Œqk;@‘o²MÓ ŽãML”Kh@¥¦P]×H’äw½—ç¶3PU•TŽÓ ”eyÝcôŒ7ñUp;P…1:<ókÔ%hš¦¶5ÂýŸú<Ïmk8ÄÏùÈ út8IEND®B`‚xdrawchem-v1.11.0/doc/toolbar.html000066400000000000000000000077421371466245600170670ustar00rootroot00000000000000 XDrawChem documentation - Toolbars

    Toolbars

    File/edit/format toolbar (starts at top of window)

    Open file (Ctrl+O)

    Save file (Ctrl+S)

    Print file (Ctrl+P)

    Cut (Ctrl+X):Cut a selection to the clipboard.

    Copy (Ctrl+C):Copy a selection to the clipboard.

    Paste (Ctrl+V):Paste a selection from the clipboard.

    Color selector:Select the color to use for drawing.

    Line width selector:Select the line width (in pixels) to use for drawing.

    Font face and size selection Select font face and size from these pulldown menus.

    When text is being edited, the following buttons appear:

    Bold (Ctrl+B): Draw bold text.

    Italic (Ctrl+I): Draw italic text.

    Underline (Ctrl+U): Draw underlined text.

    Superscript (Ctrl+Plus): Superscript text.

    Subscript (Ctrl+Minus): Subscript text.

    Drawing toolbar (starts at left)

    Select tool The select tool is described in the Editing section.

    Erase tool Left click to delete highlighted objects. Left clicking on a triple bond reduces it to a dobule bond, also double bond to single bond.

    Bond tool Left click and drag to draw bonds. Drag the endpoint of the bond near another endpoint to connect bonds. Draw over existing bonds to create double and triple bonds. Right click on a bond to edit it.

    Dashed line tool Left click and drag to draw dashed lines. Drag the endpoint of the bond near another endpoint to connect bonds. Draw over existing bonds to create partial or resonant bonds. Right click on a bond to edit it.

    Stereo bond tools Left click and drag to draw stereo bonds. Drag the endpoint of the bond near another endpoint to connect bonds. Right click on a bond to edit it.

    Arrow tool Press and hold the tool button to select an arrow style, then left click and drag to draw arrows.

    Curved arrow tool Select an arrow style. Left click and drag to draw curved arrows. To draw a Bezier curve, click four times to place four control points. The curve will be drawn along the control points.

    Bracket tool Press and hold the tool button to select an bracket or closed figure style, then left click and drag to draw brackets.

    Text tool The text tool is described in the Text section.

    Ring tool Press and hold the ring tool to open the menu of predefined structures. Select a structure from the menu, then left click to insert into the drawing. Structures marked with a [*] may be attached to another structure by clicking on the atom to attach to.

    Symbol tool Press and hold to select a symbol, then left click to place it in the drawing. Newman projections are actually a template for six bonds and the Newman projection symbol, so it is possible to attach text or structures to the Newman projection.

    Ring toolbar (position varies depending on screen size)

    The ring toolbar provides common rings used in chemical drawings. Allow the mouse to remain over the button and a tool tip will appear identifying the ring. Click on a ring then left click in the drawing to place the ring.

    Main help page xdrawchem-v1.11.0/doc/toolmenu.html000066400000000000000000000042761371466245600172660ustar00rootroot00000000000000 XDrawChem documentation - Tools menu

    Tools menu

    Clean up molecule: Automatically place atoms in a molecule.

    Auto layout (Ctrl+L): Automatically place molecules, arrows, and some labels in a reaction scheme.

    Create custom ring: Save a molecule to the custom ring folder. This molecule will appear in the ring menu when the program is restarted.
    Note: Custom rings are saved in your home directory in a subdirectory called ".xdrawchem".

    Molecule information... Displays molecular weight, formula, and elemental analysis for a selected molecule. Molecular weight and formula may be pasted to the drawing from this dialog by checking the boxes in the dialog.
    Note: You may also find this information by Ctrl+Left-Clicking on a molecule while in select mode.

    Predict 1H NMR, Predict 13C NMR, Predict IR: the spectrum and peak list for the selected molecule will be computed and displayed in a separate window.

    Predict pKa: a dialog will appear with a list of predicted pKa values.

    Predict octanol-water partition (Kow): the predicted partition coefficient will be displayed in a dialog.

    Group submenu: select reactants and products using the Group menu to use these tools.

    Group > Calculate gas-phase enthalpy change: calculate enthalpy of reaction based on total bond energies.

    Group > Compare 1H or 13C NMR: compare spectra to help identify peaks which change.

    Group > Reverse reactions: A rudimentary retrosynthesis function. Predict what reactions might lead to the selected molecle. List reactions and highlight affected bonds. Note: Undo (Ctrl+Z) will un-highlight bonds.

    Input SMILES: A dialog box will appear in whcih you can type or paste a SMILES string.

    Output SMILES: The SMILES string representing the selected molecule will be displayed.

    Build 3D model of molecule: Internet connection required. Returns a 3-D model of the selected structure via Web CGI script.

    Main help page xdrawchem-v1.11.0/doc/underlinetool.png000066400000000000000000000002141371466245600201130ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆCIDATxœcüÏðŸÀD‘nšÀÈÀøŸ‘ñ?:›~.<àó;^þ3ügDgã2Œ‘Ò„Ä‚ÕT¶!»Œj. 8jA—שVIEND®B`‚xdrawchem-v1.11.0/doc/uptool.png000066400000000000000000000002361371466245600165560ustar00rootroot00000000000000‰PNG  IHDR  »î$sBIT|dˆUIDATxœ¥’A Üñÿ_Æ“e75m DD­^Ÿþ ¶$W†ô9xß–÷®Àƒõûx…õÖGUÙÎö‹Ò ñ·Ñå*O*Ü6Nx¯ºIEND®B`‚xdrawchem-v1.11.0/icons/000077500000000000000000000000001371466245600150735ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/6ring_boat.png000066400000000000000000000006621371466245600176370ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<DIDAT8ÕÔ±KÕaÆñÏs B‚lÐ¥¡Aì/¨MšZ ¥IP\Іîà  ­õ?Ô-áæ˜µ)D ­ E«µXC§Áß­‹^ð§\‡{à /Ïû~ßóžsÞ“ªrÖ9êh‚“L ˜d,É\ËI^$¹0$öc\…Û(ìâNU9­c¿Ð…‹Íb _±†+§o`ÝNUíá3¾ávð)Ér’smߟd“xËÿ®ØÄlUý¨ªG¸‰{ØJr£tÏq¿¡Ñ&V{«j;Éu<Àz’7xÚ¤l=Ã{|ÁX—šCãò6‰× ÜÖ»ý€¸uÂbo¢\8¬õÿ¼ Ì—ÏC¶‚ïUõêˆÒwû]|8A´ÓØÃÌ =½±™ä²ƒ>^ÄŸÑ>Ä»ªz2Hünà/1Õ2 ?1_UûÇ‚‡i#8GüN‘$— -°yIEND®B`‚xdrawchem-v1.11.0/icons/6ring_chair.png000066400000000000000000000006041371466245600177740ustar00rootroot00000000000000‰PNG  IHDR 64ÜusBIT|dˆtEXtSoftwarewww.inkscape.org›î<IDAT(‘Ò+,Æaðßß>³¹%I d#˜MÑU‘…Âfª`C' H®C¢}3YP\æ¶W9Ÿ½¾aÎv¶syÎóžË[¤”T¤(ŠÊáîa)¥;HQèÃ@h·”Ò—b ;¸ ûXÂP‡~Ìáo}ÿªÏH›pƒ­ðkЃIìâ!Š^ñö Ž1/F#]9ñ|¼Ø‘O‘åkÑ‹,`õY¾XO)©®þDúÅZp´æÄëß‚4c›¸Ç ¦Ðý igL;ŸÅtÅ^Ö0‡{‰^bgI¸Æ †+«Àvܧ)'Þ‰‚ŠžcíU]µ`1EÂ3ïÂûÀ&ÐöÏ}–²_PÆJ9æ/…àçÇÜOIEND®B`‚xdrawchem-v1.11.0/icons/back.xpm000066400000000000000000000010371371466245600165220ustar00rootroot00000000000000/* XPM */ /* Drawn by Mark Donohoe for the K Desktop Environment */ /* See http://www.kde.org */ static const char *back_xpm[]={ "16 16 5 1", "# c #000000", "a c #ffffff", "c c #808080", "b c #c0c0c0", ". c None", "................", ".......#........", "......##........", ".....#a#........", "....#aa########.", "...#aabaaaaaaa#.", "..#aabbbbbbbbb#.", "...#abbbbbbbbb#.", "...c#ab########.", "....c#a#ccccccc.", ".....c##c.......", "......c#c.......", ".......cc.......", "........c.......", "................", "......................"}; xdrawchem-v1.11.0/icons/benzene.svg000066400000000000000000000010161371466245600172400ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/bidirectionalarrow1.svg000066400000000000000000000005111371466245600215550ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/bidirectionalarrow2.svg000066400000000000000000000003141371466245600215570ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/boldtool.png000066400000000000000000000017451371466245600174260ustar00rootroot00000000000000‰PNG  IHDRB •sBIT|dˆtEXtSoftwarewww.inkscape.org›î<wIDAT8•Mh\UÇç¾73o¾’‘J¾v‘&HÍF‚…Ip"YÙMÑ…©B‘ ¸p‘EqãÂ…6›â¦ÁºjÀ4V’P Afi‚Ph‚DRI§Éܹ.æ½ùhèýïòîÿž{~çpÅ{Ïí^—7®m]J¥í5!¸€#‹ƒSÜãüiëë¶œ‘oïýôÊò•¯~÷â½ç¿?»>KGæ:ub“üã)‡[­n›~ò¡üóGi<_ªÝ÷Ž@R—AŠ4Í'£?±æ½Ggqï!ÿÞB¬¦^ ÞÓ‘yG áe2/Ý@è4ÏÙæœÃjM=ý*þèˆhïkqï)ñœÇÊŽwµûYfŒ¡Z­R¯×|×xœy9Ä‘jä­Ðº²»»»¬­­Q×§¡««‹ÁÁA†††ÈFZk”RÍ}>H'\‚¬¶Ð’{{{™˜˜à‡»wYYY¡¯¯ÉÉI¨T*|yãJ©QMˆ*!ïñxï[Qxï±ÖEår™J¥ÂÎÎóóócP" W QªY-a³Tž.1õ\.G­VÃZ‹÷žjµJEôôôÎdP"m{¤1qbu’R}±X$¬µloo³ººÊðð0sssAЬ (¤-â¶¢OÄDZW,666XZZboo÷¯^¥R©´ÀÅ7T9N:錺Êçó FFFøfq‘ÙÙY¾_^fff†jµÚ‘6á8bïÛàµÌåräóy¥˜žž¦T*†!w–—[Â1ÀD¸OèhÝd*qÄÆ´ÖÐÝÝM¹\ÆÃÁáa3I{·„m¬àâˆE:Z:•Ja­Å"lnnR(¦¦¦žŽáÙž‹ÁÅÂÞ{ŽŽŽX__ÇC±XdŸÅÅEŒ1Œ1::JèF€Û‡ÞrŒö u²Q&Ã[SSH{w‰t|Ÿ0SKZÚ(¬láÀ=^£¦5ZkjÇÇh­; ¥-÷Ä ½s¸6·~ŒoϦ ܺyñâÃßr™ÚÃ8Ÿ}žg¨õhoù«^¿{°sþ—+ÀÿüBé5Ó­X]IEND®B`‚xdrawchem-v1.11.0/icons/chaintool.svg000066400000000000000000000003051371466245600175720ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/clockwise180arrow.svg000066400000000000000000000051461371466245600211110ustar00rootroot00000000000000180°xdrawchem-v1.11.0/icons/clockwise270arrow.svg000066400000000000000000000055521371466245600211120ustar00rootroot00000000000000270°xdrawchem-v1.11.0/icons/clockwise90arrow.svg000066400000000000000000000033671371466245600210340ustar00rootroot0000000000000090°xdrawchem-v1.11.0/icons/copytool.png000066400000000000000000000007731371466245600174600ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÔ 0®gšˆIDATxÚ¥•ÁJÃ@†ÿ™lñA<– Ï=û¾]{·"l{ô D¤šÆ°›ù=ÄÄÆnÒD–†ý÷ŸÙo'BÛí3ÑiºÆíí`LÄfóÄÃð¾dž{¾¼¼ñõuÇÍæ‰‹ÅIbèÒØaI"HêOúòòËåŠC kWBD$IÓŠûû,îzOUEY–¸¾¾Ân÷÷÷ Ûí#þ,\¹­¾ªŠ,Ë‘çE«5ÿr,B˜öûO¨*Tóù숢5Qá !²,GQxÀtzÉgßṴ\®x(®1üÌ EQ€$&“äOÔ —%—ι†Œ±Ô¸ßn½÷‘fõ]X5-a³JüT ¡¦eÇû²µù^55Þ—pNᜋSa@ Hk.q5gg!رpÝBD:[ÒE Yík §éiºî,y>ŸuRSW‚ ŸšµõKë¢ÆÌBNN·XtQS€–ãQÂc¨鸦†-jbUè˜_Ø!5¿[1jlŽÅ>jbñÌ,U¡!hIEND®B`‚xdrawchem-v1.11.0/icons/counterclockwise180arrow.svg000066400000000000000000000051431371466245600225060ustar00rootroot00000000000000180°xdrawchem-v1.11.0/icons/counterclockwise270arrow.svg000066400000000000000000000055241371466245600225110ustar00rootroot00000000000000270°xdrawchem-v1.11.0/icons/counterclockwise90arrow.svg000066400000000000000000000033641371466245600224310ustar00rootroot0000000000000090°xdrawchem-v1.11.0/icons/cuttool.png000066400000000000000000000022541371466245600172750ustar00rootroot00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<>IDATxÚbüÿÿ?0222[·âÛÿïßkk]¬`æi`¾¹¹¶Ð`‚ ˆ…S® yìë×ïr[¶Màà`¯2A|€"É`&&ˆ¿|A5xþü­ ’’¢óÃň¤ øòåï_>þ ëéY– ¨(5ßÈH•áÇÏpq€"Ñàï ß¾}[Ó ÕçÛÛ0|úôáüù› `jˆ¤ øüù;0| ùÊ’Ò–àâb:ßÄDƒáÉ“× 7ºÀÄÄXS @$Å·o?Á»»[ÎWW—gxôè%üy›/¼{÷É1++øL-@‘äâoß~0=z‘d ––Ã/V¯Þs(å8iRÑdµ„Õà}2쬌l¬ l, ô«ƒÃîéý; ?J0xxX€ ]¶lÇ`~p\¶¬ñº„bðš,>†õºV "@SùY¾Üg`¸>A.Ÿù/ÃÄSœL ªÆV 6d¸{÷É…ïß:nÞÜó›ãˆ–$ÊH‹ý»ïêù[àõk6†oŸ˜%™øôÙ¾<¦af†ƒŒΜ6cxÿà,â‚Ø …™@pƒgÇÈÌvÿ”pã ë·¬‰ž½OÜî“s6`ÚÏ©ÍÆÀÀ Ä_ž¦åïÿ¾¼ø J€º7è–?þ€n0@ÁS…¬Ð÷Ö?¿Î\e™2$öúÃÿ ß?ýÆÚ†2ÜÝñ™AÒ‘ABŸ…AÝ—«_Ås>»ÓýÓM²è. ¸ÁÂì?Þ½ùÏðáóÿ‡0±_ÿ÷ssýaøýä7ÃÉ5?.p‹ÿf`ûÏÀò÷/;ÏU7VNÆõè<ò@™Iœ÷ƒ¬àú.)y)}Íï ¿˜ìa¾ÀŒý?ßþ¾gøòáÙq†?Þ3þýÇà/oÌ §ù_aw©L€k÷“ 0ónðÙÇ<Œ$¾:DZ¼`àd(`àde¸ó”‡áÔ%öþ0†L{òáÞ\)†¿ÿ3<¸ËÒhÝN‚ .÷ÉÜ×6ú£ðý' (8àÜàÏ?˜'•ê7ùÀÅÁ ðò;Ç…o¿X&¦-y Ïÿ_?þeøþîÃë÷Ì`bwï3<Ð1ú 4˜%(npÓîg ˜M„bPc¤ÍׯhJýPxóž#È=05\Z@€ç§Á·Ç¾ÿDU @$•7²øÿå7ƒ¹ò§„Vo©õ¬LÎÉ|¸}‡‰áû/D0€@1’RçõK)ˆóý:iòF€Vâ12Ì9&¹¡hݳ@ät @$ m¾R‚¿×ë‹Vxÿ•áÂKÞÌŒ …›ÁA 7 Àu\´HŸùÖIEND®B`‚xdrawchem-v1.11.0/icons/cyclobutane.svg000066400000000000000000000005651371466245600201320ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/cyclohexane.svg000066400000000000000000000006661371466245600201260ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/cyclopentadiene.svg000066400000000000000000000007431371466245600207660ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/cyclopentane.svg000066400000000000000000000006251371466245600203030ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/cyclopropane.svg000066400000000000000000000005721371466245600203160ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/dashedarrow.svg000066400000000000000000000004771371466245600201270ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/dashtool.svg000066400000000000000000000003641371466245600174340ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/downharpoonarrow.svg000066400000000000000000000002561371466245600212300ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/downtool.svg000066400000000000000000000007731371466245600174700ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/editcut.png000066400000000000000000000022541371466245600172450ustar00rootroot00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<>IDATxÚbüÿÿ?0222[·âÛÿïßkk]¬`æi`¾¹¹¶Ð`‚ ˆ…S® yìë×ïr[¶Màà`¯2A|€"É`&&ˆ¿|A5xþü­ ’’¢óÃň¤ øòåï_>þ ëéY– ¨(5ßÈH•áÇÏpq€"Ñàï ß¾}[Ó ÕçÛÛ0|úôáüù› `jˆ¤ øüù;0| ùÊ’Ò–àâb:ßÄDƒáÉ“× 7ºÀÄÄXS @$Å·o?Á»»[ÎWW—gxôè%üy›/¼{÷É1++øL-@‘äâoß~0=z‘d ––Ã/V¯Þs(å8iRÑdµ„Õà}2쬌l¬ l, ô«ƒÃîéý; ?J0xxX€ ]¶lÇ`~p\¶¬ñº„bðš,>†õºV "@SùY¾Üg`¸>A.Ÿù/ÃÄSœL ªÆV 6d¸{÷É…ïß:nÞÜó›ãˆ–$ÊH‹ý»ïêù[àõk6†oŸ˜%™øôÙ¾<¦af†ƒŒΜ6cxÿà,â‚Ø …™@pƒgÇÈÌvÿ”pã ë·¬‰ž½OÜî“s6`ÚÏ©ÍÆÀÀ Ä_ž¦åïÿ¾¼ø J€º7è–?þ€n0@ÁS…¬Ð÷Ö?¿Î\e™2$öúÃÿ ß?ýÆÚ†2ÜÝñ™AÒ‘ABŸ…AÝ—«_Ås>»ÓýÓM²è. ¸ÁÂì?Þ½ùÏðáóÿ‡0±_ÿ÷ssýaøýä7ÃÉ5?.p‹ÿf`ûÏÀò÷/;ÏU7VNÆõè<ò@™Iœ÷ƒ¬àú.)y)}Íï ¿˜ìa¾ÀŒý?ßþ¾gøòáÙq†?Þ3þýÇà/oÌ §ù_aw©L€k÷“ 0ónðÙÇ<Œ$¾:DZ¼`àd(`àde¸ó”‡áÔ%öþ0†L{òáÞ\)†¿ÿ3<¸ËÒhÝN‚ .÷ÉÜ×6ú£ðý' (8àÜàÏ?˜'•ê7ùÀÅÁ ðò;Ç…o¿X&¦-y Ïÿ_?þeøþîÃë÷Ì`bwï3<Ð1ú 4˜%(npÓîg ˜M„bPc¤ÍׯhJýPxóž#È=05\Z@€ç§Á·Ç¾ÿDU @$•7²øÿå7ƒ¹ò§„Vo©õ¬LÎÉ|¸}‡‰áû/D0€@1’RçõK)ˆóý:iòF€Vâ12Ì9&¹¡hݳ@ät @$ m¾R‚¿×ë‹Vxÿ•áÂKÞÌŒ …›ÁA 7 Àu\´HŸùÖIEND®B`‚xdrawchem-v1.11.0/icons/editpaste.png000066400000000000000000000015611371466245600175660ustar00rootroot00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbdÀ:;ö)d±ÿÿ.TTÄ¢«ý”ÀÕÕ͘?cÆÚÿè`úô5ÿkk§ÏG7 Ækµ˜ê ¾±øÈcmPRÍðíÛ üøÉ0oÞ&¾ÏÇ.8ˆþòzî•B\ –o?þï—±u4à‘•cø¸ä?ƒ¥¥Ó'¯°*¶´Ôc8vè©t€"×Ç7Îvi;—]5Ħ €Xø„ ÄÌÀœ_¿é‡Ÿã ª_2pIr3p‰©3<9w×:€bùõŸ…áÿ/ˆ·íÿ1ì=°o¸8ü‡¨ÿù›á×&œêˆqw¯í‡d{¼†]}ŒWþÌ™ë ÉÉžŒÈbÄòíÛ?†¿L-úú ˆàøõŸáÏŸ _¾|c`b‚¸zîÜíÿ‘  ¦oßÿ‚½†£ffF fc07×ãÐ` ‹šña¬aÈÈ7'O^…»D˟ĺ¡`Wƒáƒ——ÃÇ_>}úÊpùò°@±üÿ÷Å»ÿ¿ÿf`øÄþõ@}&ŠÍµŒ@šL¿ÿáû÷`6 Ëÿÿ  ø 6äÿ»¯ ¿ÿíbý÷ï†ß¿ÿ2°°03üû‡s€bòþýüÎðÿ-0s 2ç÷oXªøÎðóçvvV 8 Є£ââ÷ŸþýI”¡ råÏŸ?ÁlVVf°Ü? A@ kþ½ýDt¤\ûë×/ˆf°÷!®ù€‰ a0@±üzå߯ßD 2ã÷ï?`—Á0(e€\ Џ?e3@ h䀞ÃZ°ƒ|³ˆåÕ&†ï_1°³N ¿‘"–Ô]‰ ˆ¥eÛ-Æ/Õÿ¢¼pè` Š¿Ð„Ôÿ é[í@, ¢eÛmF|.½xñÁÿ¿Q½ 1!†n8@±¶ ²„I%y­±AqMIEND®B`‚xdrawchem-v1.11.0/icons/erasetool.svg000066400000000000000000000006001371466245600176050ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/filenew.png000066400000000000000000000014711371466245600172350ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ79ùHwÆIDAT8˵“[Ha†ŸæŸu77-×ÒÜŠˆXŸíx&\)Hl½E°û=âãüehJ *5Áë«íéPÒÛô³·ýîü9άj“éÏu¼´dÚP'…ÇËÈŒŒ’ê  {½¨T†çJíZ[yc—êײºÆdöRBúÛ3&‡ù1z 4%4"Þ³Äß~V%+Tí¢7Oç'¾ÆfRfØÓ[hñ…u[¸ñ¢^¸Åè¥3¹¬4€.%K–ùœžl»Â¸%ßå\ÞSèK‘+x¦òý•äg‹ÿ¤ÿžEó{ÿüþS!=p~/IEND®B`‚xdrawchem-v1.11.0/icons/fileopen.png000066400000000000000000000025141371466245600174040ustar00rootroot00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÞIDATxÚbüÿÿ?-@1ÒÊ`€b$UCyãI…þÏgec2øüù·âä.ëØÔI¨¢édAç„‹ï¯ßúòÿÎýoÿ³J¯Ç¥ €@A Ã@më)ƒªæSç÷xñÿë×ÿÿ_½úýÿýû¿ÿ§Ï»õ?9÷P6sˆQ>ñúÿ1†ÿ~ýe`øýçï? k¶?ýð}‹¾`Cç™zW'y~^V†?þ3üþýLsp03Ô´üðñÓOÅ¥³Q‚ €mËîýï¯Wöh0ˆþù›áéï ßbr‘e01”ûÅÀð÷/Â`¯î>þÂÐ<éÒ†ÝW .9<€ @,è©âPó³SOxÿü`¨ËÓgàâ†=ÿýûÏ £&À`k(ðïßÛ…{/1À  –¿ÿxôáéÙ >. rœx#òý—? 7¼d:èn†[ïÞ÷3è4‡)P €X]óéÅ'+SI‚†~øúÁ»öƒ‹ƒ’,Ø,u …Ï_ÿýþÃðabï^€º¡IZŒ¡jÞsÓ ÿþý÷ ÿ€é–á0lÿ@Ù[O¼cñ”g``8øl0;ÃÅóyï½ó hÔ€B Šõ{^3(¨Š2èI³0Šp1|Ê}ÿ ß~ügøöûà éj ?YYN݃ÊÈÄÀðöáw†WÇüeø÷Eñ @¡¼çð+†[KtÞ¾úÍÀ/ÌÂð‡áõg†7@üð9×÷@öO ºé݇¿ o^ÿdøöö Ãó«¯><ûúáãcÞ¿ê LÿËŸ?C÷ŸúÎ`«ËÇÀ ô«+Ãù[ŸDåøn=a`¸ôî‹×^¿ùËðò ˆþÃðíÃw†ï¾ |Ïðè+†o ¯Xþ²ðÃ-·ÄòšÜž|Çd-ÄŒ†—@W½bâc¸qè³ÿÌà`¥á¿þ1üòãç? k¿1üþLÜÜÜ@³€€˜ù—Ãÿ³@æÓ?`„|úÊÀpùÚ†p`²a`xÄÀ dx÷ùÃÇ/@Ã~ ø h·¿^¼øÆð—…‰ƒ5¹0ÿágøË°Ä pªØsü3ƒ?Ë/ <@ÏHƒƒ˜*ø$Y>¾ûÅð‡…‘Aèß¾ß?xÅ1( 03üûù“áß·Ÿ €Ùôû7`ð¼ý'üðñïW a¢1¢O>ÙÞ¬´„²¤,PíeÓÒ­,ÝËï×ß\|è¶írù&“Éœsæ3'3gޠІ‡SÙd2‘¨æ¸s'“:y²ï“Í|NµMÛ¶%“ííoZëíJ´1ss¹€ÌKƒÙ‹Ò¥ Ri„h­ªm¯VJV…*m„aøê`)Ÿ‚×C¥2ئ2æ2VU¡Jk´6H¹T¼áqzzzÚ¥ «B}?DK…ïûÑÎÎκçfÜÛÛû™RêÃãÇO|ÞÜÜܦµ¶V¡òhà‡()QÂÆóÜÄÙ³çæoݽ12ò÷_–eý><<|@ô÷÷Ûû÷4>0ðõ.Ïó˜™ù‡¢{Þ{‡P­B ~° µžÃ•ËC=|!lŒ1äóyÏÿ28øÃWvKKËé3g¾=‰Ô`Y–eqïá»:Þ¥¼¤ BM(5J„X¶ãº(,ˆ7£ ³a±Tµ=ÚÚ:ºÆÆF†œºOG"5÷ó°¡Ñ®­¥†bh(Ið•Aêe{àzˆÿîÓøú®gïñ~c D£Ñ/œ®®®·Ç^©M¹ì“ 8óÅÆó†Ù,°õ²Ù¿`8ñ†Çá{Ö¬Û·ïØíÁ’çºRJ‚` Ïs™Ð¯qãžàú\5àS 1NEܵµëÚ$“ÉF'• #‘$MM ’ÉŽÿÎ×qûþsykš··F(ÊÌÌ,Ë=ann^9BPTJ×OM嘚Ê!„àü¾8=OQ:<ö¹’!óH«ìHµPZâ©W¯ÎV¦µzìA9Fš—M†¡¡?7ͬaežY¾†ûö}¼L0š|~aÆ)ŸLE£µ]KK>×®]¡µµ•ÖÖÖ—ºŠT*E]]œC‡Ž°¸øß÷'\îÑÏB¨¾X,Žïúúú9räS¶nmxrY]d³Yâñ`1=ýÀLNNþáÄb±_ÇÇoÿØÝ}´¦¾>ÊÁƒ}ìÝû6âùÅ€”Šd²‰»w'¨¯Nf2™LÚ¹xñb˜N§ÛnÞý.‹í>vlà!6oNë¡R*ÇæÁƒûþ¥K?]Ïf§Ç._þ¨ì§.üÖ»¸X2/RJS.¦P(›|¾hÒéqÓÝÝßù,«¢×ÕyßÌÎ.0[Y=dŒAJ‰RË# C\×ý8·ó?…׆â/äêIEND®B`‚xdrawchem-v1.11.0/icons/filesave.png000066400000000000000000000014651371466245600174050ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÓ/§â×ÂIDATxœÕ”=E†ŸÙ5w>ðÇÈ2’‚€ˆ?1"uÑEübH@ A‚!sB2úddɾw»3»ÓÝUÕÕ3;ÇÉk;vK­ªî½ýôÛÕ O[«6É?þúQ]OT3³zBÓvĤdËÌê)fÅ,£j¨n¢qçŸ9ó£ÅwÍbõñÏ7>_Ôẞ¼ôʵKPqíê>Ÿ~ñ Ë&pá¹]>ûäýÇÒ}ãÞºýÁ·_ýðáá””. Õ°‰›¿rùÂyêzòÄm/šÜó»#è&‘a{UÕ ï_Üãå¯ð•ËO1–Ë)É8w*,Ѝ1©z·ßx•«Ï_dÿÒ³u/,›–å¢Á,?,œÄÍ”bœ4ï½õ:¥Jùq;äýxÍŒ““–£Çt!bfÛˆ{+º˜øí;¨eÌ2–}Ƚ¯ˆœ1bH4Ë–õ:p|Ò£<ŠXUBJÊr_R–ÿ˜”…¶]ºHJBJŠˆc$ç-Â:Xáîœß=‡ejרŠã“’™–ÌÎlÊd÷³IÅl:á(RröG;ÏÌxçÍ×pwBBH¤¤¨Ú`—õ-6ö/¿þ‰yH÷À,B"AÕ¶Ÿ] ‰ ¢Û­HI͘wïþËýû ª6\a®°Žö˜õâ;;5) IÒvaÈL•ª*ìíÕˆ€*Ôu¡®a:-˜ÁdRP-TUˆÝ·yœ”Õº#›±ZE‹n¤ê O!¡Ù¬¬íÄ1$Öë@qGÕpÏäüp7룻BýB²8ÄD ¼`f”â¸÷½Ïó0îcΛ¼ "¨(î[ˆÃ:²^´äl¬VËñäO«àì!ªæñŸuÛº5¾­Žç‹ë÷þ~pSâö_‡ä\F✠¥øÿæN¿¹îÎé‚âÎužÚöàÿßyK¼IEND®B`‚xdrawchem-v1.11.0/icons/forward.xpm000066400000000000000000000010601371466245600172620ustar00rootroot00000000000000/* XPM */ /* Drawn by Mark Donohoe for the K Desktop Environment */ /* See http://www.kde.org */ static const char *forward_xpm[]={ "16 16 5 1", "# c #000000", "a c #ffffff", "c c #808080", "b c #c0c0c0", ". c None", "................", "................", ".........#......", ".........##.....", ".........#a#....", "..########aa#...", "..#aaaaaaabaa#..", "..#bbbbbbbbbaa#.", "..#bbbbbbbbba#..", "..########ba#c..", "..ccccccc#a#c...", "........c##c....", "........c#c.....", "........cc......", "........c.......", "................", "................"}; xdrawchem-v1.11.0/icons/home.xpm000066400000000000000000000010361371466245600165510ustar00rootroot00000000000000/* XPM */ /* Drawn by Mark Donohoe for the K Desktop Environment */ /* See http://www.kde.org */ static const char *home_xpm[]={ "16 16 4 1", "# c #000000", "a c #ffffff", "b c #c0c0c0", ". c None", "........... ....", " ....##.......", "..#...####......", "..#..#aabb#.....", "..#.#aaaabb#....", "..##aaaaaabb#...", "..#aaaaaaaabb#..", ".#aaaaaaaaabbb#.", "###aaaaaaaabb###", "..#aaaaaaaabb#..", "..#aaa###aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#####.######..", "................"}; xdrawchem-v1.11.0/icons/italictool.png000066400000000000000000000015541371466245600177510ustar00rootroot00000000000000‰PNG  IHDRB •sBIT|dˆtEXtSoftwarewww.inkscape.org›î<þIDAT8•1ˆUÇß›¹¹[³fW»w¹b¹B¢ˆ¹ÆÂ4‡±±2MÐÂB‚…¥ØXXX›p6  œÂB -lõA”»ÍáöÈ™Ý7ï}ŸÅÎÌÎäö0|¼Ç̼ïû¿ÿÿÿ扙qóƒWåµk»—²xMH^Fi¡0' µyÏ=Qw5ÈW·w^úæê¿˜˜¿ý4[ £¸‹"`§ŒsšGïnœ{óÑûò÷¯Ý3ÝÉSYx׺ò,UX9Ú‰gf†Çèámdx‰ž|’¼•fKám”DÒ+,ö¯ 4Ã8=T•è=yv{ü˜¥¾$}׉q×Úhª'Àöö6[[[¢!ŽÉóÁÎn”ÈóeaÊ[ûä–‹ˆ!°¹¹ÉÎÎNµ›Ü{&ã1ιiŠà’¬Ô%IÑ&4›CŃƒbŒôz=!†@Î9©©¸JÄ´TÞ0Ì*U öööˆ1²²²‚ª’{s® @q®rKZYå Ñ…Buö÷÷I’„ÕÕU4FÄ9¤h,52(¤DÀqBz«qý`8¤Ýn³¼¼LT¡ivH qÍôe±M‡Òn·év»8‘éûr,™\ƒãS×ãh4"Ë2VÏŸ¯h' —<Ï ˆÍ¬â´à¢pâ="B¯ßGD¦¨kt”ß;çІ+„ÆÑ-§ŒF#œst:¤ iêòx7©@ »Õ‡„è÷û¯eºš;¦… ñbI…Â…«îÂõõuƒA£á\ž…ʺ©EÆfEPUB ÖÖÖ¦§ìÿ"LÊ#QvQÐÃï™x/þÞû¦QjÜSmªh-ãýïŠÝó»Ü¿uî•N÷ߟDY g^G;—!}nÆ#SÏ:qÅö§2RÎÈþú½w":öÙbfì}Ûý°µä?%;åJzªÄ"šçég½Ž>IîÞyáú¥K÷~~fqòžÀ‹¨µžæš}#Þ"äyúõÝ?/üxøÍ´¼Zl”ýÿIEND®B`‚xdrawchem-v1.11.0/icons/justifycentertool.png000066400000000000000000000011171371466245600213750ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDùC» pHYs  ÒÝ~ütIMEÓ9C¶·ÏÜIDATxœ­”»ŽÔ0†?;áR€ÐJˆž$z ^ ZQðB[Ьhv«Z10ìffœœ Eâd.É0;â4'Žíߟÿc;œ~>÷ÿŠºšºAÕöŽ{óúe(sãÕ‹ç“p3P5GÔhDѵ\-Ÿ>~ B{×ˆÇ !€ j‘¨–uß.™tLœž]áîÓÂëý?Àh}N5¤ZHuÓea•Ú‚–Ű·á»Ðù:£n€¢ˆ§eRX’8f±™³L5·U¢ÅÌ[ŸcÛWì#6 ¸£Ïg?±`Ø”Ç@ºî ªDª7ÇÜ1󾢆{G;eEXËXÔðèá8ýù÷9îNYD¤ÜkE®VÎrÕðc¶Ú ËÛ5s̬õ9Ì|£Ø£Â«êFyvò`”6ÇÅå|°`kc; ¬R{„f7 "©ªB@Ízj÷–4n]ÏáòÈ›—=‡y¥˜UW5ÜÙñ7·ûï}7Ò=0îœ<¾wé·«›V02}óTÛÕøu+=IÎÀ5€ˆöóG‰eëíÉV<}r”ôòz™bÀ»EÖËÓ «îÌÅ̹þÈ5É‹åäwYȃòAý1QB{ß¾{ÿ_…ÿ9g˜jØ÷3IEND®B`‚xdrawchem-v1.11.0/icons/justifylefttool.png000066400000000000000000000007671371466245600210610ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœ—IDATxÚÍ”=nA„«8¹Y!!pàSpî`$DÀȲX°Z{-ïæäX–ñN÷«r0Ócw°{µ²ä—L·ÔSó½êzÔR-때BÎ)87Þe¬ñ+aF¤LЄ&e‚÷ÏbD¾Nx2™Œ~`:›#%Â{’½…N•ÂËårÍg3ÂLíwíÿþó·¥—¶#«Ï_¾‚µÂw‰Í8š„&%ˆØŽx:›¯%!†ÀÈ͉)áò²ÁÕU³–3Bÿ[y|xôs„rL ç‹àz•AªOƒ#zÂ(¨ˆÛªÉx»ûº*ß¾ôð¡‚ØÁavrÖÓ·¤jo^í’·Þ:·Áå½Ù}5Øÿ˜žBºý–É+þzW9y…XDŒÀCUE|_B6 ²¥Î¹õ³ø\-X¹çÝûOýr<߈é,á^çõätŒ™ã~å´u=â6+Óòäeà.ŸÜ_ø0—§d×~¶6nhÍÃÝëÆB3êkš—e‘gÏ_ð߯¿–m1_Qè«PIEND®B`‚xdrawchem-v1.11.0/icons/lassotool.svg000066400000000000000000000007451371466245600176410ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/line1.png000066400000000000000000000002631371466245600166120ustar00rootroot00000000000000‰PNG  IHDRísO/bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ &æc3‚tEXtCommentCreated with The GIMPïd%nIDAT(Ïc`Ã0200ü †ñ!‹ó`IEND®B`‚xdrawchem-v1.11.0/icons/line2.png000066400000000000000000000002711371466245600166120ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIMEÕ &,JßÊÂtEXtCommentCreated with The GIMPïd%nIDAT8Ëc`Ã0200ü§Ä¦Ñ0 MB&’i•IEND®B`‚xdrawchem-v1.11.0/icons/line3.png000066400000000000000000000002721371466245600166140ustar00rootroot00000000000000‰PNG  IHDRísO/bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ '#Ã{ætEXtCommentCreated with The GIMPïd%nIDAT(Ïc`þSb¥.`„áPùÈòIEND®B`‚xdrawchem-v1.11.0/icons/line4.png000066400000000000000000000002731371466245600166160ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIMEÕ '7Ù¡2otEXtCommentCreated with The GIMPïd%nIDAT8Ëc`þSb¥.xFÁ`–b í|yIEND®B`‚xdrawchem-v1.11.0/icons/line5.png000066400000000000000000000002731371466245600166170ustar00rootroot00000000000000‰PNG  IHDRísO/bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ (…‚çvtEXtCommentCreated with The GIMPïd%nIDAT(Ïc`F†ÿ”ÀD© †£€ ™- 3ËèaIEND®B`‚xdrawchem-v1.11.0/icons/linetool.svg000066400000000000000000000003131371466245600174360ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/mag_minus.png000066400000000000000000000020701371466245600175570ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÔg̨ ÅIDATxÚ­Ô]ˆ”UÇñïs^ž×™ÙÇM··bÈP2“±Ú,è"I‹jƒ4¨™(ºð¢6Hº(¥ BJÉê˜]‚ðªÕìF1 •؛ݛ¶qt]ue×Ý™qž™yžÓ…/$ådÒÎÝùøŸÃïËõڳç@^ëdK«×&´0(iabFLlÖ­{ú3n±¬kðÀÀ`1VÖ§~à†~*…ç9!hµZÔ+ª³³#QR©ôÂÈ-Á»v}[Ô¾(ÏÏeI§l[!¥ nÅh[#¥¤Z©21~bæÒtkÅÆN¶ƒ¥ëæóÒc0ww·†:2é´ï¹h­‰“„V³…RŠL&…v\wêüd¡ç‘Â@;XÄqõ­°3Gxd2):2iÂtЏ³`þ<|ßŶÙ\óÃ'·ný¼ÐŽâFoxG'Zk\ׯsÒžGG$ ¶Rø¾Kà{x®ƒ­ùEyšÍ¹WÛÁJ“wlRa……”’Ùj ÇuplMb„X–…1†l.K½^k;±Ò¶DJ‰eY\š­R©Ö¹è:Hi‘I§ÐR+uH’„(ºÜ6jn¶z½Ás”V “J8õF¥J„ch% µZ½-,λx2Žc„LÏÌÑl4‘J'1µF)%ZJ´ÖØJa+Åä™ *•FÛ,‹©É™½§NŒà8šVœ'W……¸:©–Gk”R bn.n·JÅúðð¡#3QÔÄs¤°ÚqüÄ8£#ctwß;Ó>th÷ÌäéJé‡Áï‰M\×¾òâƒÁ$ I’ÐŒc~ýý8;w|ÁâÅ2™ pKÅêÕ¥Þ»òåµÏ<.]¾ ×±ÑêÊý*¥8x`ˆƒC?±dIlöNÌ¥ãÜszõËþµ;Ï”n ¬ZõzhÛÍ- ²éÞÎy~^J üñÛ©›M=ÐÓ³r$Š¢0çË‹kƒùG i¦Ç3vÖë_ÿõĸ1æ?¯¯Öç¦/ ¿ojcŸ˜©=›Ÿ7…æË—rå¿îÜFU/Ówlpμùó,zè~–-¬?~naùúUxG1ÿØ} jFdóš\ñ”_ÜÔGtñµÑ½Œcè¿ÛÁ³%Ë;ŠÙßæ¿5>ûÍGma€·ŸÈ +ºÊ¯|ÐG45AmtÃ‡ÇØ?ô[Þö›L ÿ ¼öp¶¸²'[~ckÑäi¦†¿cÛî 7¦âv«¸"[|le¶üò»o²ý½ÝT»Öü?ðU¼ìy¢¨–n`|²¾÷OÖ<¤ãP1lIEND®B`‚xdrawchem-v1.11.0/icons/mag_plus.png000066400000000000000000000021711371466245600174110ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÔ8+¥¸RIDATxÚ”]ˆ”UÇï9çýšwföuýšÕ¬!ESÄFi-¢‹Do,²¼I¢f(¨ð¢Ö» ”‹ dS2*Ò™%(!h5#M #5,Yébû0WE·ñ‹]wgÆùzÏéÂÜÖÒÑ?œ‹óÀó;Ïyø?eŒáºvíÚ—¶m½©Õe Z”´0&2½k×>öw(ë:¸··/)«'xa,Ç÷]„4›Mª¥å±±Z…\.÷ÔÀ·oÿ,kÇD~ZGŠD"ÀqRJ¢f„íØH))—Ê ½2Ò\º~ýºS­ÀÒóÒiéÓ×1g¶†IÚ’‰DŒ˜ïaÛ6‘Ö4M”R$“ql×ó.](f:Èô¶‹(*¿¶'à ð Ÿd2N[2A˜ˆ5#¦O›B,æá8 €TÇ Ú§…nÞü~¦%¸Õ»Â©íضç9øžKÂ÷i ´Ö8J‹y1ßsqlEznšFcüùV`%„I»ŽRa……”’±r×sqm4B,ËÂCª#EµZiY±²‰”˲¸2V¦T®rÙs‘Ò"™ˆcKI¤Ô@kM­vµ¥+ÔøXy"Á÷\”­@2'p]ªõ:J)”!0ÆÐÔšJ¥Ú,Ο¿|*Š"„ŒŒŽÓ¨7JéˆJ½Ž”[JlÛÆQ G)Šç†)•ê-½,.GwŸ>9€ëÚ4#M¤¯ ……ø§R[J\ÛF)Eÿ¾~ÆÇ£Öv+•¬·øa´Vkà{.RX-¿8trˆãƒÌž}ïhKðŸŒÏ–r_÷}E­ÞÀóœk§ ƒÖ­5(â×ßO°mëÌŸŸ!™ 2w´+V­ÊuÝ•n˯~|e¸hÉb<×ÁV×ú«”bÿ¾~ö÷Ï‚R©™˜+'¸ûìVªWë…ÕÛÎån X±âÅÐq›¦§]íSbi)-@ðÇo§¿k4ìÞÎÎjµZŠ ùù•¾ôòL‚‘¡ þåžÙ1|ÜÒZ/”Ò0aÃÿê£u³FžÞðBÄÛ¨ÿ’? rìŒ_xùóábrÂÞyáðíwmù*݇ûöàN ‰-y’¹Ë²xV%ûΚYù ppD˜ÉÕ=Â=7Æ&kCßpáèOs_¼» wê bKÖ°°ó>–ßSξ¾²#`ù‡0{çmü_òŸ¾Meƒié½×éÈf–ÎÈ?÷f7µKÃTŽïáèÁAöü- Æ?„ùöÂF3qß‚1Æp»“[63ûáK÷›èbÁT~ÙlÎì\f^yxŽånm•»õ •Ý,v+íü¹X8üc1÷ñ=4ývv|AæÙI®˜ÔÓëÐ[¹âfÊ.Må}_dÕ¢u «»ÿcn¯£‹… IEND®B`‚xdrawchem-v1.11.0/icons/middlearrow.svg000066400000000000000000000003141371466245600201230ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/negationarrow.svg000066400000000000000000000005541371466245600204770ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/pastetool.png000066400000000000000000000015611371466245600176160ustar00rootroot00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbdÀ:;ö)d±ÿÿ.TTÄ¢«ý”ÀÕÕ͘?cÆÚÿè`úô5ÿkk§ÏG7 Ækµ˜ê ¾±øÈcmPRÍðíÛ üøÉ0oÞ&¾ÏÇ.8ˆþòzî•B\ –o?þï—±u4à‘•cø¸ä?ƒ¥¥Ó'¯°*¶´Ôc8vè©t€"×Ç7Îvi;—]5Ħ €Xø„ ÄÌÀœ_¿é‡Ÿã ª_2pIr3p‰©3<9w×:€bùõŸ…áÿ/ˆ·íÿ1ì=°o¸8ü‡¨ÿù›á×&œêˆqw¯í‡d{¼†]}ŒWþÌ™ë ÉÉžŒÈbÄòíÛ?†¿L-úú ˆàøõŸáÏŸ _¾|c`b‚¸zîÜíÿ‘  ¦oßÿ‚½†£ffF fc07×ãÐ` ‹šña¬aÈÈ7'O^…»D˟ĺ¡`Wƒáƒ——ÃÇ_>}úÊpùò°@±üÿ÷Å»ÿ¿ÿf`øÄþõ@}&ŠÍµŒ@šL¿ÿáû÷`6 Ëÿÿ  ø 6äÿ»¯ ¿ÿíbý÷ï†ß¿ÿ2°°03üû‡s€bòþýüÎðÿ-0s 2ç÷oXªøÎðóçvvV 8 Є£ââ÷ŸþýI”¡ råÏŸ?ÁlVVf°Ü? A@ kþ½ýDt¤\ûë×/ˆf°÷!®ù€‰ a0@±üzå߯ßD 2ã÷ï?`—Á0(e€\ Џ?e3@ h䀞ÃZ°ƒ|³ˆåÕ&†ï_1°³N ¿‘"–Ô]‰ ˆ¥eÛ-Æ/Õÿ¢¼pè` Š¿Ð„Ôÿ é[í@, ¢eÛmF|.½xñÁÿ¿Q½ 1!†n8@±¶ ²„I%y­±AqMIEND®B`‚xdrawchem-v1.11.0/icons/regulararrow.svg000066400000000000000000000003151371466245600203270ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/retrosynthesisarrow.svg000066400000000000000000000003341371466245600217740ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/selecttool.svg000066400000000000000000000003151371466245600177700ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/subscript.png000066400000000000000000000020641371466245600176210ustar00rootroot00000000000000‰PNG  IHDRB •sBIT|dˆtEXtSoftwarewww.inkscape.org›î<ÆIDAT8•Mh\UÅÿ;ßé³ÍGi 0Ì"H ¢»id¢•Xã@B°(Ñ…P\\Xq‘…»”€-d£«0 ƒ‹˜°0›4Lš4FÛˆÍ0ùt’÷q¯‹÷æÍŒM .wæòÞùŸÿ9ç¾+Æn½ÿ‚¼xuéR,î]"Ï¡I¡á˜iÐæ¸}O/iW¾¸ýí³__ûÙˆ1†~=ýi<é~ŒF=ö’˜ÖcŠ{¶ºÙðÚþ{ò×/µOÕÍMDbo¡Rý OSZÍc{ÆÐÞ!:ùû&âÙ8G‘¾h<龉&"Ñ~ת‡á䡵Ƴmœøó˜b‘äÖ8Ñï(1œGƒJ]¬ªœ' ×u988ÀqDsúb ‰<Eóu³Ê-Ëÿ8WìIP̱mlÛF)>c"ñ’/‘(ºšš ^ÞØØ`}}˲hkk+Ás]×õAK$ŒA‹ MŒ–œ7Œ ]a}}B¡ÀþÞŽã‹Å´Ö8Óª¾D¥Â´”ãU!æþÁÛÛÛh­ÙÞÙaeeÅ—À´ç!JùÀÁZú-ˆ£A…y¬^ZZ¢X,ÒÑÑA,cey9lÙÓÚ AÉ„Œ£•¡7Æ—css“D"ASS555lnnR(°,‹üÖ]»F:fgg˲AU¥±¨2ã‡ÏçI§Óìíî’ÉdX]]evv–×{{9רH.—cppúúzæææÊÉ©—Ø.ܽËáá!«««,//ãº.Åb‘‰‰ z{{Q"ô÷õ±¸¸HgGét:4\)…®JENÛ¶ÙzôˆT*E&“Ak1†ùùyfffønzšW/_F”bxxAíKǻĸlž6,,,°•ÏÓÜÜLWWÙl–îînzzzH&“|~ã"Âää$tvv2::ZNFÉ<¯$…ö+ êêêhmm ?:ŽëÒÒÒB{{;Åb€þþ~ÖÖÖ°,‹¡¡¡µÿEò»Cðvy©;ç=8®ëúù Xª`llŒññq²Ù,SSSär9Ø=*i7Š'K(ºu~š£ú7üê[©<]Æ`DàíÁÁÐȆ³gC/¼ûßÝó›Üÿª¡ýLí¿?Š&ážz}æDëBc"(ñ5_KÿŸ_ØÙÇýó{ô½[à¡íø+bŒáádí©¤ý™hâ'\IOtƒí8Ñ‘sî~¸3ûÌõ îýT“8zW mROr •ŸÛxüî8Ñ/ïüqþ‡+Àò÷ÐÚ†IEND®B`‚xdrawchem-v1.11.0/icons/superscript.png000066400000000000000000000020651371466245600201670ustar00rootroot00000000000000‰PNG  IHDRB •sBIT|dˆtEXtSoftwarewww.inkscape.org›î<ÇIDAT8•OH\WÆçε‰&`Q,¤:Z»i6¦hL h Í&ÔÔ ÒE¡‹.K¡é¢‹n„P0nÚU¨‹BÖT¨¡¸0D©Ñj£¥3Ãc:3ïÏ=]¼™7cLJî»—÷¾sÎ÷ó®¨*7?|M^Ÿ\=‹û“Bäe,),<Å«O;wðíªõä›Û?žþþÒWwTT•îû<žô>ÁbŽ|äúŒõ)Á}ÇÜ89zðüõ{ó`csy^-‰cRA^ 4­®zäLUÀú%lþ6ò÷ ÄwpË‘·£ñ¤÷–ˆD/’xñÂaÓ'öÛÛÛìììL&I§Ó¨*nü´X$™ûšˆØ÷Œ(ÝX0©ÁC@õþ¤566òj_›››LOOãº."‚¬P"/,±€·¦£%‡‘jgœ8q‚{++LMM1::Š1#‚‰Ä«ºD±êR«Blmm±°°ÀÒÒH9",..2>>ÎÈÈÙl66Š­*¯(ª¡*lnnR(8xô×u‰ÅbˆÖZrÙ,“““à:FDcÂn‰†­RÇÀÁãÇìíía­eïáC2™ §{{QU¬ïsnd„h,F:¦½­-¬TàÁ‚ û±xuu•b±ÈÀÀ±XŒÌÚZH‡o-™L†‰‰ ®\¹‚µ6¤Â aƦ¾éUk-»»»$ ÚÛÛihh ›ËQ(ð<‡{{¼{ù2mmmlllðÙÕ«HøÇ>`j££ƒGûûœ:uŠõõuæççyslŒD2ÉÅEâñ8"B.—à [®d¬ˆ·|÷.¥R‰õõuÖÖÖð=i¿_¹èÁ—Ï=Çsï»{s\J)®¢ ] õ2p’üWp’õ${8Nò"É'YÅcÜÃâu’^_äRʹÂŽð¨1¶„í/ª.ð¾âî÷»\áë®÷03¸Ëñ,žá9zx“än_~ÛŽ±Œ,ÔïEœ`g`Á>^¶ÛDÁÒ *0÷­CmÕœ¯ª¶“|æ¤áF¬æi ¼[s´æ¦:¬Žü ü¥æLkÂ횟 ”ò´ú{kù|‹ŸoŒ­ãzßcLâ#Þ9s¾†˜ë÷V¤ý'¹…Lã;^•RŽÿêøMÎõzèoø Y“HŽ®æIEND®B`‚xdrawchem-v1.11.0/icons/sym_delta_plus.png000066400000000000000000000007271371466245600206330ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<iIDAT8åÔ¿«ÏqÇñÇKò#Ó%¥A¹HÊâÞ”»¬±X,w°ÈßpÙLF)‹lLÖ›nw’‹"åv „.ƒcðÆ÷~|¿ßÛ7÷fpêÝë}Þçœg§÷ûôNUY [·&Ô•ÀI²ªà$ÓI°”äN’ NrG°Gñ’l‰\UË.ã#õœMá@7wØêÃK¼Á¾Q`CÁ ~°u½€ñUc?nâÞa»4pÓ+‚qo1Ùücø‚Ùà+¸Ú/ök*’lÄí™o;‡8ždj”¡Xß³ŸÄ<êäÜÂ%L`6ÉŒ·Ø6'™iþbU]ï‚Çš~í€_4ÝÒô3>´ýÒãê×ñó¦ã–Ûö¦Ï ªîþ $ù†mU5Ó©ù}ÇUõq&ÉÖžœ“x…{Ýâ¡ÖyåÝx‚9?îüãð€©8‹‹ýbéþÇI6àöâ5îWÕÒHÝò'xµìß|ôÿø;ÿªjö¡˜@yIEND®B`‚xdrawchem-v1.11.0/icons/sym_minus.png000066400000000000000000000003071371466245600176240ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<YIDAT8íÔ± €@ CÑÄÌë²+0Â-`¸œ”殲%7.^‘"!‰Ù¦¨† ¯…÷lŒˆ8‹Æ#éëVI]P±Wf¬=Ѐ·h´l ?!ÆÇùÙ 6KE$õËIEND®B`‚xdrawchem-v1.11.0/icons/sym_plus.png000066400000000000000000000004131371466245600174520ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<IDAT8í”1 Â@DßD[µ°ð^+§ð‚µçðÄÞÆ*u2) b`W?‚LûwÃüÙ•mJ¨*B- ^FIp:Û§ÐHÆ’* À‹xzÏà—Fu“têOF$Ý3³‹íC ¬Ý3¹ùfdò½Ç’¶À*帰πÛ$8§ùü'8ômºò\`H¡Vü¢éeÜz-*Œ`šIEND®B`‚xdrawchem-v1.11.0/icons/symboltool.png000066400000000000000000000007141371466245600200060ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<^IDAT8­Ó±KUaÇñÏÑÈÁÆDÃ6'Q‘jophPÁAÄUjZsp°ÁÀÍÁÕIAš¤ÖÀœÌ¥(R|îƒÜ®çÞs½÷|¡Ü‘sƒærP]Lúz¤/ëܾÛÈ„^äôNBû[ÿ}šÓë ýÕ ø(t,§÷xdrawchem-v1.11.0/icons/underlinetool.png000066400000000000000000000017151371466245600204700ustar00rootroot00000000000000‰PNG  IHDRB •sBIT|dˆtEXtSoftwarewww.inkscape.org›î<_IDAT8}•AH\GÆÿÙ·nwq÷©zēԠ÷\±”ôâ!M1)%½…â¡—Hzk@r*E<${ê¡!Þ Ø‹±R­BUBvÑj»îÎÌ¿‡·ïùžÆÌ2Ìì{;ß|ÿïûvFT••¯®Éø—›yOT®â¥Eq€ÂÅQÏ?o©×W¶a¿XZ»óý/*ªÊëW•¹|ÁÞÇcðé—‚Ÿûõ¨m®L=¿ o;›ÏÔc$ÿ9¹âǨ¢Åõì»’y¯®ó ^/ƒÃ7þí¸äóî.#ÁgÞÿ!۔˛÷žf³I«T…ÿNé¨ÿ`òÆÝ5¢:„S¼ž:OìmÍZËÉÉ ­V TÑ®Áƒ¨ê p tž•,ÂÎÎ 8ç°ÖÒ××Çìì,Fƒ™™ØßÛãÛ‡U|®ií"³RÔb†ýýýLOO³µµ•€‹EæççY__gqq‘±j#‚1Ä$Fiç51(b*"BWWW¤½Þ{‚\Ž0 ÎH#"IZ"àsniûÑÞþ>år™R©„ml­Å:G¹\FŒI–*`ÄDO¤ï…´Ajµ•J…R©”T ªÒÝÝ•³Iªâ°«×D ‘h§F£A†tvv&lõZžžž p´ŽäOu)cc af´cøõåK/ Ú6Ï$ŒõŒq ÒÛÛK¥R¡^¯c­4a{{›‘‘‘$ ÆŒHÄ/I…K©ßŒ§ccclllp||ÌÒÒ…BÝÝ]D„‰‰‰d£ØIÅ-{è¤@c­§¦¦(•JäÚ̪Õ*sssäóù3¶íž˜çcó|]mç6QÅ;Çääd¦äxÓ¸§‰$RˆÃàR% ËËˬ®®R¯×3II °²²rfKóŸè¬ðØ@½l"\óožsÞăªòÉ­[|zû6’6']vÛ8JÅ«âv×Úç²l­ÓÜ“\Á}‘«=5͖dž7Ü{ˆ1x ‚ŠÁÍEDH>"`Ø¿~Âÿ± mµrO¢äÇÊ\Øûò¶ä]7Éùġ֮|}ô x¾võ›ññÍŸãï‰êøöò.àì{«N~·Ö<~ñçÐÚà®>ÜÇ çIEND®B`‚xdrawchem-v1.11.0/icons/upharpoonarrow.svg000066400000000000000000000002571371466245600207060ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/uptool.svg000066400000000000000000000002361371466245600171370ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/wavytool.svg000066400000000000000000000004771371466245600175100ustar00rootroot00000000000000xdrawchem-v1.11.0/icons/xdrawchem-icon.png000066400000000000000000000061221371466245600205120ustar00rootroot00000000000000‰PNG  IHDR00Ø`nÐ pHYsgŸÒRtRNSÿÿÿ7X} òIDATxœ´™gsK†õ›×á®wË¾Ž²¬håœsBPB P![å€rtЕC¹\¶ï>ÝšAÁu¿,u<5f¦ŸyÏ{N÷àŒ¿Ó?s‘ˆÍÞ×ÐÜÔÙÓÝÛgëíëãO[¿èëï·;WÂár:\.Â9àr°u ¸†‡†“148L «îë·³šž¾¼¼¼aöÞ½{WRVê|]\ŒÅ¢KK±åååÕ••µÕÕõµÕõµõõ­Mbc{k3¾½¥#¾»ßÛÝÙÛÛ;Øß?< ŽNŽONO%NÏÎNÏÏÏÞ½;c{~~ªãäìôøäd+ïsôφB7œœØìö™Ð,4 ,­¬,¯*ŽµÍ !ØÚ‰oïîììíîî'Æ>8:<;c°sžéýû÷>|¼PŸ¿ø À§T|ÒŸKýáë?‚ŠÌy}¾4 îCvÂóÑaVÖÖ YßÜ1âIÍqtx|ÌN-) !þò9-’ŸÄ·ì|þÄù܇…Ã) ®žîÉ`p~á­ˆÁ´½7Ú(a,@Va>ðÈI¦Ë$–’äÓå_"ÉÅ…ˆÇ¾Pm¹ðèøxÜë!í èàà §Ï𛋼}ófqAR¦Ý£S“Ö‰”¡“ÉL’¬ë: –]èçY/!x<Æê±Ùuœ™ž ‡çæ#´‹þ†ézîN,XV2Ùáßrçó0ñÝÝ”¹‡~°ýÃCR1:>~xx˜ÑÝÛ;=;; …#ssoæMâ„IÌdrgõ“Iw<ÒX"€ÉfgHű·Ëµ<-…<ÿö­òƒ~H)îÉsóó`0£¦®…`B$+“è”*7­X”úvZúÁâé´Z"رF„!ock“®GEUepzª¶¾Ž±¸?Ì7t+¡¿Ò¥€&§‚„“ “äN¤ë7R2 wÄ–?w÷ÉÎÎæöÖêú:7™š™†&¾Ç옷ª¦Úë÷3£Èý9'4v TëÓSS33$Ž“ÄLF'©;tJ1%ÛÕU‚%;;:A$…ç^ˆF'ƒ/_.¯,_&?«kkYÙ¯&¼†c Îa;šuº\Õµµ¾À$L"RÂLókî„)M'Íd¦ôk¶ì“Ó %ÌZty ÈQiyy45-‘@0WP0ìvó­8]08=-@5^¿&‡H)3%u2¹N,•hQÉ&.jÉAá´…è"-xÂë-­(ßÞÞ6ÚÐ'âÒ’~—sxÔMâ&‚^Èœ˜QU[ãñy}“~É$ÎÊĬùº¸(7?¯¹µyÓl®±TlnpV<:—MŒ¿x™[Zº´|‚SSÙ¹9ݽ=v§ƒ¹vÂçÅ-³áƒÀTQU£€ŒH„H¦è˜º‹JK|““ä˜U@^A>õ":™ ²åˆx“gàZ´¡Â¡1™âãñz_¾zÕÔÒÌÜÀÚUÀ¸Ç4 Ž‘LŲss9Nâ$ò_ÐRÅR@ªœ..bžÇ=6M|gǪ̈́ÇÃÃ4¶4·¶·u ÐðPR¡0#z'ý ¨²ºzlb&I*ÎÊôìÅóp$y3/ékïê¬m¨—.%±¸” Ç˜Ãî2…‹­¾a‘™•ÕÐÔØÔÒÒÖÑÞÕÛ£<äAí¡2uEuÕèÄ8Lˆ|‰xò쩱9äùêêeÖc ¢ª‘H„3QmÈïbt1½¦‚™Y/©žz€Zê`qÜãctyl PUåÈØ(ßy’LÉÜIàÁ¡‘.‹§áéYUA†$ ŠÚœFÒE%ÅñxÜš)ŸßOÒ«ëjѵ±¹‰çÁ@ýNç{„|I‰Éóxü>T^Y92ê† HLô+÷Ø(w·;Ôš=hbŽ_Ñañq=6GKDeñ@Õ<ÏÌ\ZN«)*œÀ¦Ìõ Í­-]½ö>ìLNxlêK ?¯€¼èQ0Ñ`dz̸Ë.fKk åæçkúQô€ƒ-"ó”ÌÒôúÂÒ•šòx )«(y¨Ð¶ÎŽn[/îa,†ÇaÝYÐ{jvFi PYEý€ŒöØz;ºº:»»»zzMI´wv¶¶·³àÇ’h4^QBŽñ0¼îìýúÕ¸˜L¡+~À£ÌNõ-mm¦ý h`J—Ìd8n˜â€Ú¹Nƒ<T"V嫜¼<–Þ"X<OLFc±_¿~}ûöM\LM=Ï|ÁBžºÆ¼ÜÙÝ…ùHŠú“2—KåÎéyƒ$* Ââ"”è6šPI1'ääåòçp&nhioq1ýñã@l¿|ùÂ<baI1ɪ¨Rò467SY8ÕÇ‹Ò ñr²H™7è­ú¹y#‘&[¯A=D¡Žî.*N¡twñ -m­……ÿ}økÿþý—þø'ýø¦¨¤„ÆXFºjU²Z;Úy†~§§Ž{”—¥¸dj"fÂ!fXPaqqJíá0a NÆR?ýùäÉ{÷þxð€÷§Ÿ?2O=yþìuQ!@¥åe\U×ÐÀiÜ\& ’EP ’/ilÉ󃫀éz¦¸Þ „1ánïìx•“-gàà½?ît÷þý‡>ârZ(•Pq©’‡R—dQ 4Æ#Y¸;›Å ÁŽ8š—Z*142<[J &Áâ8ÞTVëèÈÊɦñ3çÓs1Ê{wu(‘ž¾xMþë׸Gä‘dñ´ýº²FÇÇ(l”\ Jq’HdMáp:3XšmB^Úe‡­RH! •L«% tHäù×Ý;ÿþÏVƒtK&],Åi%eÐT‘¬æ¶V&Q‰bDŠˆ^læo˜dùÅ>­UhÀ%@¥Æ7V #’ª2@âeçG³²³¹¼¸¬”¼sÆ×ÚTÕÖ×s…¢ºƒË‰ icons/line1.png icons/erasetool.svg icons/mag_minus.png icons/sym_delta_minus.png icons/back.xpm icons/6ring_chair.png icons/filenew.png icons/editcut.png icons/cuttool.png icons/underlinetool.png icons/fileopen.png icons/sym_minus.png icons/uptool.svg icons/xdrawchem-icon.png icons/boldtool.png icons/editpaste.png icons/pastetool.png icons/line2.png icons/wavytool.svg icons/sym_2e_line.png icons/texttool.svg icons/chaintool.svg icons/justifycentertool.png icons/cyclopentadiene.svg icons/cyclopentane.svg icons/sym_2e.png icons/cyclopropane.svg icons/cyclobutane.svg icons/benzene.svg icons/dashtool.svg icons/sym_plus.png icons/italictool.png icons/linetool.svg icons/home.xpm icons/filesave.png icons/lassotool.svg icons/superscript.png icons/sym_1e.png icons/cyclohexane.svg icons/mag_plus.png icons/symboltool.png icons/line5.png icons/fileprint.png icons/justifyrighttool.png icons/forward.xpm icons/justifylefttool.png icons/line4.png icons/copytool.png icons/line3.png icons/selecttool.svg icons/subscript.png icons/sym_delta_plus.png icons/6ring_boat.png icons/downtool.svg icons/regulararrow.svg icons/middlearrow.svg icons/negationarrow.svg icons/dashedarrow.svg icons/upharpoonarrow.svg icons/downharpoonarrow.svg icons/bidirectionalarrow1.svg icons/bidirectionalarrow2.svg icons/retrosynthesisarrow.svg icons/clockwise90arrow.svg icons/counterclockwise90arrow.svg icons/clockwise180arrow.svg icons/counterclockwise180arrow.svg icons/clockwise270arrow.svg icons/counterclockwise270arrow.svg xdrawchem-v1.11.0/ring/000077500000000000000000000000001371466245600147175ustar00rootroot00000000000000xdrawchem-v1.11.0/ring/COPYRIGHT.txt000066400000000000000000000021521371466245600170300ustar00rootroot00000000000000

    Contains non-Free header file: CDXConstants.h
    Contains non-Free code: goldman_rotate.cpp
    
    Portions copyright by Christoph Steinbeck, the JChemPaint project and
    others. All source files contain copyright and licensing information.
    
    -- XDrawChem copyright begins here --
    
    XDrawChem
    Copyright (C) 2004-2005  Bryan Herger 
    Copyright (C) 2020  Yaman Qalieh 
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see .
    
    (Author's note: the license is in the file LICENSE.txt, which is included in the source directory.)
    
    xdrawchem-v1.11.0/ring/LICENSE.txt000066400000000000000000001045151371466245600165500ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . xdrawchem-v1.11.0/ring/retro.txt000066400000000000000000000012001371466245600166040ustar00rootroot00000000000000<-R>C=C<-R>;;Horner-Wittig reaction (C=C double bond) <-R><-R><-R>C-O;;Grignard reaction (tertiary alcohol) <-R><=O>C-N<-R>;;amide condensation <-R><=O>C-O<-R>;;ester condensation <-C(-R)><=O>Cr-Or<-C(-R)(-R)>;;Bayer-Villiger oxidation <-C(=C[-C])><-C(=C[-C])>Cr-C<-N(-R)><=O>;;Birch reduction <-C(=C[-C])><-C(=C[-C])>Cr-C<-O(-R)><=O>;;Birch reduction <-C(-C[-C])(-N[-C][-C])><-N(-C[*C][*C])>Cr=Cr<-C(*C[*C])(*C[*C][-N])><-C(-C[-N])>;;Bischler-Napieralski reaction <-C><-O>C=C<-C(-O[-C])(=O)><-O>;;Chan rearrangement <-C><-O>C-C<-C(-R)(=O)>;;Claisen condensation <-C(-C)(-O[-C])><-O(-C[-C][-C])>Cr-C<-C><=O>;;Darzen condensation (epoxide) xdrawchem-v1.11.0/ring/xdrawchem_da.qm000066400000000000000000001576401371466245600177210ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝBP;'þJxk*ߎIh´JÄÜ´ÇŒ¯+–DR¦y‡§Ô´»ßì0ö5;ÏdŒØÙ¼‹téå@ ra*¦y±*»á*Ð%*Ó=*ì0k*ö5™+f¾Å+”ƒï+˜Å8+įb,]”1†éÀ:0Õ?±gLAîF|ÅÝH™g6J+‚dJ6•ŒJcb´Lˆ•àLÚå VŠ¥ RWT €Xýô °Yã Ü\K nÁl :„¼Ã o‡æ °ŠÖ· G P–›… ˜ª¼õ ˲jt þ¶œõ O¹_ù ‚ÁèÞ âÅQ• –Ùô ÔÝ´è°cñÐþŸõ)ãýmŠÄhÄ ü’ Ü,× Ÿ¿NÅ$•‰zÝ(QNH/ßãÿ=c;?#JGÉd“jÑ„èˆRJ*º„e}æuÝñ’>s %ôØþE(€’„*%Ó/úÕ4ò]id³œn‘tÓqÎU—† N‘í~r™6Ô°§–Ä÷ª6• ®–ÀK¶Š¥|·T­¹YBàÀ× *Ë  iÌ05 ™Ζ% Ûä×!ëw£!eð‡Î!±,ù"é9Å%#u:Rµ#´<:Õ$d>ì$¯Nºä$ø^Æ”%B^è)%ˆ{ØÒ&ˆË½&r‹¹M&¼¬Èn' ·² (މÄ)_½¸)ÎÀnY* ÃÖà*©ʼ“+ Ì`+QÕl +§Ø„ó+àò†¥,Oô T,Ê I- Iñ-‚+|£-æ0–J./=yµ.u=¿z.ÕB¶ž/$R$þ0M[Qc1‰[sc1Ú^›x2+hžW2”s«ž2Å{0¹3Ï€§,4L€·,4‡ç,4ÂŽg®5C˜ \5˜I¼5Ù§Ý>6 ¶¹%6â¹Êå7Á,¾7IƸÞ8Æå`8€Úš‘8¹ÝY©9iÞº#9Âà—p?CáDI?€¶%AGßòAt³€AÁ@ tB@ EBhO€ÔB•P~DBÛ`N’Cc·%CXmf3C™|ECЖ•Cý–jD,›ˆ˜D{œ+¤D¤œÞDÏœEFSœ©F€´FÑ N%G=¦uGl«Ø“G¨¬ŠGå°9\H°µtHO±bH†¶ögHï¹%IoÁ¹*IžÅ jJÈ0EJCÈyüJpÖ^uJŸÖ¥:JÛ÷Œ^Kø(>K¹øAL—ú”ILÓ¥M_éÎM³"NG…N]^?O öJOQ¦åO¨MÂOú+¯eP¡5ŽÀPà5þWQX•žQgkºåQ±lN€RFx?ÞR…‰x Rå–±S›ƒtS[¥vŠS޶ÀSï·éÂT&ĘžT¾ľ¬TóÅ/õU®Ç>…V äLVˆñvWôoXšôþXà|YžÃYl"5Y›!È:Yò-ÊZ@/÷Z‘35êZÕHO´[%VÑ[ƒpì3\|¬\F‰ÇÊ\‡_º\Å•»ô]–0]H¢Ü]x¢ò]«¬P]á³Ô~^¹P4^L¿W.^ÿÐæ_GÑ©>_ŠÑø`üÖÐ.aRå±ÌdîƒTd>ððdæ÷Áîe(x'e¤Ðf‘fd(Pf³HQnfã\áh k)eišl·j5€Ék!ƒV%ks‰¹k¬Š¿Il —eÅlX—ÅÇl’Æ lÊÆµlúÇiÓm0ËÉÞm€àLÅmôí$.n'ùõofûXÒo¢ VNoü 2v¥pé 2…qD 2†Uq¢ 9¤°r ?¬ÜrN Køàr³ Tàns0 l!çt? vÉ.tv „ÀÚvD †¦µv­ ‡¡„we ™mŽwÁ ™ùšyy ZjyÏ ¤Wäz- ¤Ánzl ¦Òòz© ¾åEzô Â{/ ÉK^{õ äžq}i óÑ×}Ñ úCÕ~Œ )•~ê ,ÍÒv 3¶ 9Òö ;fœ€N RíÀŒ j¤^H múåƒ? t·ÃƒŠ wˆ¹ƒÒ {áò„v }Ò“„Ü ’n…Œ ü#‡i ¨°ˆ ¯áEˆM ´®µˆƒ ¼Œtˆ» ¾‹£ˆï ¿‰ Å‹î‰b Çt$‰Ù ͔ʊ Ö¥Šâ ÛÔÇ‹* 棾‹x 죞Œ û ÄŽ ÿR޽ ÿø @@ I©p ¥û ÐC Ø® ,1Ù -§¥‘œ 5ô‘Þ 58.’R 8[\’« 9¨ž’Ý <ª”C P”p”š z£Ô”ø z«Þ•- }Þ7•b ‚² – ‰@²–¢ “ñ$–î –¨…—¨ š>9—Ø ºBa˜J ¼”™ Ŕᙉ Òhuš, Øš  àÎ2šÝ ãB›& ò$ øV„›Æ ûUjœS šEœÚ èž %vpk 3Õ÷ 9ZÕž' TŒdžj Y^ŸH dÑÄŸ| f¾Ÿ½ fÑÄ * mjt k v5 ¯ v—¥ ù >¡1 Œ^`¡† •ÓÅ¡¶ ¡Â¢ ¢¢H £î¢˜ ¨ru¢è ö€@£ ÷ä£U ©d£¥ >þ£á ²^¦ ÉÙ§o 7ݤ§í ?(¤© Vž©k gåª i3”ªe iLaª› iØÄªË iÚ$ª÷ xÕó«& Ž ®«t ©¤”«Í ¬/>¬ß ¯®ä®u º Ò®ë ºáŒ¯/ Æñt¯ˆ È(o°ƒ È6°Ê ЕN± Ô•e±¿ Ý,‰² ã`t¶ ÿGc·)Í ·u yå¸*ÛB¸jL'¸°1?¹"2ôe¹ù4 ºM;᥺ª? ºâeR#»}»Pƒ-ú»ôj7¼BŸÖ´¼…¸P¼â¿VN½Á’½oÉ)Ô½Òäôù¾}ûͲ¿ùtåÀJ,ÓÄÀƒ;0 Á‘IÙÃÁôee^Â,uA„Ä66¢ÄƒåÅ4“ÚµÅm˜ÐlÅÁ𮹯¡˜¹Æ©fÆä­#Ðǵ†GÇvÐ~ǺÓÞÈ¡ؽtÈÞÚÄ’Ï¿áŽÐ âJÐPò±Ð‘ôµãÐÏiÑ6O.k.OK;cmcmiinþpxpxx&Gå&Go*ßBoksBoxIhKlipCutJÄ&Ny&New´Ç&OmAutoŒ¯ bindingerBond–D KopiérCopy¦y K&lipCu&t§Ô&RedigérEdit» HjælpHelpì0HjemHomeö5 IndolInfoÏ AfslutQuitŒ BølgetWavyØÙ dråbebead‹t Indlæst dokumentLoaded document å@$Sammenlign 13C NMRCompare 13C NMR r&Kopiér&Copy*¦y&Redigér&Edit*»&Fil&File*Ð% &Spejl&Flip*Ó &Hjælp&Help*ì0 &Hjem&Home*ö5&Åbn&Open+f¾640x480 pixeler640x480 pixels+”ƒ&Gem&Save+˜ÅFo&rtryd&Undo+į &Hjem&Zoom,]$Legal (8.5" x 14")Legal (8.5" x 14")1†épyrimidin Pyrimidine:0ÕAlmindelig pil Plain arrow?±gÐBindingernes længde, bindingsvinklen og enhederne er angivet under tegneindstillinger i Formatér-menuen.aBond length, bond angle, and units are set in the Drawing Settings option under the Format menu.Aî*Kunne ikke åbne filenCouldn't open fileF|Å NR pilArrowH™gRydClearJ+‚LukCloseJ6• FarveColorJcbSletEraseLˆ•cyclepentadienCyclopentadieneLÚå IndsætPasteVŠ¥UdskrivPrintWT RingeRightXýô RingeRingsYãFortryd!Undo!\KBiphenyl BiphenylnÁlInput SMILES Input SMILES„¼Ã4Cylenderformede struktorerCanned Structures‡æDobbeltpilTwo-way arrowŠÖ·Tegn krum pilDraw curved arrowGtyrosin Tyrosine–›…cystein Cysteineª¼õ(Fastgør til gitteret Snap to grid²jtCytosin Cytosine¶œõ,--Vælg et filter-- (*)--Select a filter-- (*)¹_ùjIngen molekyler i databasen passer med forespørgslen..No molecules in the database match the query.ÁèÞDeoxyribose DeoxyriboseÅQ•Vælg &reaktantSelect &ReactantÙôNucleotidsyrerNucleic acidsÝ´Analyse =  Analysis = è°BDu kan bestemme om gitteret skal vises eller skjules ved at trykke Ctrl+G. Om man slår gitteret til eller fra påvirker ikke om objekter fastgør sig til gitteret.‚You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid.ñÐþHvad er &dette What's &Thisõ)ã(Fast bindingsvinkel:Bond fixed angle:ýmŠ@Manglende reaktant eller produktMissing reactant or producthÄVis gitteretShow square grid üMarkér &alt&Deselect All Ü,dTegn pil tilstand: venstreklik for at tegne en pil.Lasso mode: left click and hold to draw lasso ŸlVælg kun en reaktant og et produkt til at sammenligne.<br> Brug linjeværktøjet til at tegne bindinger. Tegn ovenpå eksisterende bindinger for at lave dobbeltbindinger og tripelbindinger.oLine tool

    Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds.(QNAminosyrer Amino acids/ßãªTegn 3D-ind linje tilstand: venstreklik for at tegne linje, højreklik for at redigereIDraw Stereo-Down Line mode: left click to draw line, right click to edit=cKantet parentesSquare bracket?#(Eksportér top listenExport Peak ListGÉdglutaminsyreGlutamic acidjÑ„$Produktets toppe: Peaks of product: ˆRJ,Delvis positiv ladningPartial positive chargeº„eTKlik på et molekyle for at beregne dets IR&Click on a molecule to guess its nameæuDKunne ikke skrive den angivne fil.!Cannot write the specified file.ñ’>$Tegn stiplet linjeDraw dashed line %Sidebredde: Please wait.Øþ&Kubisk bezier-kurve Cubic bezier(€’Cyclopentan Cyclopentane*%[*] Cyclopentan[*] Cyclopentane/úÕPile-editor Arrow editor4ò bindinger bondsid³~Tekst tilstand: venstreklik for at tilføje eller redigere tekst*Text mode: left click to add or edit textn‘t0Rotér 90 grader mod uret#Rotate 90 degrees counterclockwiseqÎUÔKlik her for at gemme den fil du har åben.<br><br>Du kan også bruge menupunktet Gem på Fil-menuen.<br><br>|Click this button to save the file you are editing.

    You can also select the Save command from the File menu.

    † NGem &som... Save &as...‘í~&Gitter Til/Fra Toggle &grid™6Ô&Om&About§–Ä&Luk&Closeª6•&Gruppe&Group®–À&Indsæt&Paste¶Š¥&Udskriv&Print·TSæt tegnefarveSet drawing color¹YBStiplet pil Dashed arrowÀ× leucinLeucineË phenylalaninPhenylalanineÌ05isolucin IsoleucineΖ%*Editor af krumme pile Curved Arrowä× 1024x768 pixeler1024x768 pixelsëw£ºVærktøjet 3D-ind<br><br> Brug linjeværktøjet til at tegne 3D-ind linjer, som vist på knappen.bStereo Down Line tool

    Use the Line tool to draw stereo-down lines, as shown on the button.ð‡ÎRSteroid (skabelon for kondenserede ringe)Steroid (fused ring template),ùCyclopropan Cyclopropane9Å%fVenstre-klik for a tegne Newman-projektionsskabelon.Left-click to draw Newman projection template:Rµ[*] Cyclopropan[*] Cyclopropane<:ÕSpejl &vandretFlip &horizontal>ì Krøllet parentesCurly bracketNºäSænket skriftEnter subscript^Æ”FNewman-projektion - forskudt (anti)%Newman projection - staggered (anti)^è)21H NMR sammenligningsfejl1H NMR compare error{ØÒ1H NMR spektrum1H NMR spectrumˆË½ 13C NMR spektrum13C NMR spectrum‹¹MEn række skabeloner til ringe og molekyler er tilgængelige i ringværktøjet, incl. enkelt- og kondenserede ringe, aminosyrer og nucleotider.ŠA number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides.¬ÈnVGør den markerede tekst<b> fed</b> (Ctrl+B)(Make selected text bold (Ctrl+B)·² 8Venstrejustér markeret tekstLeft-justify selected text½‰ÄForrige tip Previous tip½¸X<i>Kursivér</i> den markerede tekst (Ctrl+I)(Italicize selected text (Ctrl+I)ÀnY.Kunne ikke åbne filen: Could not open the file: ÃÖàOutput SMILESOutput SMILESʼ“(&Find på internettet&Find on InternetÌ` Guanin10.5 (Guanidine)Õl 6Tilføj automatisk &hydrogenAutomatically Add &hydrogensØ„ó@&Binding - Fast længde og vinkel&Bond - Fixed length and angleò†¥Vis gitteretDo not show gridô T2Sænket tekst (Ctrl+Minus)%Subscript selected text (Ctrl-Minus) I0Kan ikke gemme billedet!Unable to save picture! Iñ800x600 pixeler800x600 pixels+|£Papirstørrelse: Paper size:0–J,Delvis negativ ladningPartial negative charge=yµ Fast pilevinkel:Arrow fixed angle:=¿z´Det er muligt at tilknytte ringe til strukturer ved at vælge en ring og klikke på et atom.YIt's possible to attach rings to structures by selecting a ring and clicking on an atom.B¶žÂVærktøjet 3D-ud linje<br><br> Brug linjeværktøjet til at tegne 3D-ud linjer, som vist på knappen.^Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as shown on the button.R$þ"Sæt linjetykkelseSet line thickness[Qc"Sæt linjetykkelseSet Line Thickness[sc2Sæt fast vinkel og længdeSet fixed angle and length^›x NR pil NR arrowhžW¤I markeringstilstanden kan de fleste objekter redigeres ved at højreklikke på dem.JWhen in select mode, you can edit most objects by right-clicking on them.s«ž@CDX - ChemDraw binært format (*)!CDX - ChemDraw binary format (*){0¹[*] DABSYL [*] DABSYL€§,[*] DABCYL [*] DABCYL€·,ZDANSYL [1-(dimethylanimo)-5-naphthylsulfonyl] [*] DANSYLç,.Molekyle information...No information.Žg®Ringværktøj Ring tool˜ \AnnullérCancel˜I¼zVærktøjet Slet<br><br> Brug Slet til at fjerne enkelte emner.@Erase tool

    Use the Erase tool to erase individual items.§Ý>DobbeltDouble¶¹%Liggende Landscape¹ÊåxHusk at angive en filtype når du åbner og gemmer dokumenter.ARemember to select a file type when opening or saving documents.Á,¾.Molekyle information...Molecule information...ƸÞFormel =  Formula = Æå`dGenvej: Hold 'Alt' nede og skriv et-bogstavskoder!0Shortcut: Hold 'Alt' and type one-letter codes!Úš‘(A4 (210 mm x 297 mm)A4 (210 mm x 297 mm)ÝY©œ Bryan Herger herger@chemistry.gatech.edu Tilmeld dig til postlisten, hvis du vil have oplysninger om fremtidige udgivelser. Send en mail til: xdrawchem-announce-request@lists.sourceforge.net med 'subscribe' i emnefeltet. XDrawChem is copyright (C) 2002 Bryan Herger. Enkeltdele copyright (C) 1997-2000 Dr. Christoph Steinbeck og the JChemPaint project OpenBabel-koden copyright (C) 2003 by the OpenBabel project team. Se filen COPYRIGHT.txt for flere detaljerÉ Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more detailsÞº#, Vinkel =  , Angle = à—p4Tekstværktøjet<br><br>Brug tekstværktøjet til at skrive tekst og til at navngive atomer og punkter.<br>(Se manualen for informationer om tekstformatering)wText tool

    Use the Text tool to add text and label atoms and points.
    (See manual for info on formatting text)áDI IndolIndole¶%"Sammenlign 1H NMRCompare 1H NMRßò*Hvordan man får hjælpHow to get help³€&Tegn bølget bindingDraw wavy bond@ t LysinLysine@ EVælg &ProduktSelect &ProductO€ÔVis gitteretShow hex gridP~DCAS-nummer CAS Number`N’Udskriv filen Print filec·%Værk&tøjerT&oolsmf3 purinPurine|E RiboseRibose–• Gem filen som...Save 3D file as...–jSøgSearch›ˆ˜VælgSelectœ+¤XDrawChem kan startes fra komandolinjen for at lave et billede ud fra en inputfil. Skriv "xdrawchem --help" for flere oplysninger.dXDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details.œÞ serinSerineœE"nitrophenylalaninNitrophenylalanineœ©4Højrejustér markeret tekstRight-justify selected text´ EnkeltSingle N%Cyclohexan Cyclohexane¦uSukkerstofferSugars«Ø“ Stil:Style:¬ŠSymbol-editorSymbol°9\uden navn untitled°µt4Enkelt/dobbelt (aromatisk)Single/double (aromatic)±bF, klik for at indsætte på tegningen, click to paste into drawing¶ög TripelTriple¹%8Vælg en struktur fra listen:Choose a structure from list:Á¹*Enheder:Units:Å j valinValineÈ0E UracilUracilÈyüCyclobutan CyclobutaneÖ^uKig efter: Look for:Ö¥:dKlik på et molekyle for at få informationer om det$Click on a molecule for information÷Œ^‚Der opstod en fejl. Serveren kan ikke finde det valgte molekyle.@No reactions in the database could yield the selected molecule.ø(>Parenteser ParenthesesøAJForudse octanol-vand skilningen (Kow)&Predict octanol-water partition (Kow)ú”I$Ryd op i molekyletClick on a molecule¥$Gem som billede...Save as picture...éÎ&180 grader med uret180 degree clockwise"fKlik på et molekyle for at rydde op i dets struktur.Click on a molecule to clean up its structureG…Molekyle-infoMolecule Info^?&XDC databaseserver:XDC database server:öJ$Ryd op i molekyletClean up molecule¦å^Klik på et molekyle for at beregne dets 13C NMR-Click on a molecule to calculate its 13C NMRMÂMolekyle-info Molecule+¯eGemt fil  Saved file 5ŽÀOpret egen ringCreate custom ring5þWEnkelt elektronSingle electronX•žZDer opstod et problem under åbningen af filenProblem while opening the filekºåRyd &gruppe Clear &grouplN€,Octanol-vand forholdetOctanol-water partitionx?Þp orbital p orbital‰x Vis gitteret Show grid–±Stående Portrait›ƒt.Reaktanter = %1 kJ/mol Reactants = %1 kJ/mol ¥vŠp dobbelt p double¶ÀTKlik på et molekyle for at beregne dets IR(Click on a molecule to calculate its IR·éÂ&Om ... &About ...ĘžtTegn symbol tilstand: venstreklik for at tilføje et symbol+Draw Symbol mode: left click to add symbolľ¬8Kunne ikke genkende filtypenCould not determine file typeÅ/õ0Rotér 90 grader med uretRotate 90 degrees clockwiseÇ>…6Vælg en filtype fra listen.)Please select a file type from the list.äLKædeværktøjet<br><br>Brug kædeværktøjet til at tegne aliphatiske kæder. længden af hvert sekment er den nuværende bindingslængde.wChain tool

    Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length.ñvBindings-editor Bond editorôoIR spektrum IR spectrumôþ"Kan ikke indlæse Unable to load | tommerinchesžÃ&270 grader med uret270 degree clockwise"5&Bindingsrækkefølge: Bond order:!È: GrundstofanalyseElemental analysis: -ÊSide&opsætning Pa&ge setup/÷ Fast pilelængde:Arrow fixed length:35ê0Tegn eller rediger tekstDraw or edit textHO´VTegn et grafisk objekt: kubisk bezier-kurve"Draw graphic object: cubic bezierVÑ pixlerpixelspì3Sideopsætning Page setup|¬Sidebredde: Page width:‰ÇÊ$Estimerede pKa'er:Estimated pKa's:_ºProduktProduct•»ô prolinProline–0Tilbage Backward¢Ü&Tilbage &Backward¢ò AdeninAdenine¬Ptryptophan Tryptophan³Ô~fKlik på et molekyle for at fjerne gruppemarkeringen1Click on a molecule to clear it group assignment¹P4Gem billede...Save picture...¿W., intensitet  Intensity: ÐæÜKlik her for at indsætte.<br><br>Du kan også indsætte med menupunktet Indsæt fra Redigér-menuen, eller Ctrl+V.zClick this button to paste a selection.

    You can also select the Paste command from the Edit menu, or press Ctrl+V.Ñ©>&Letter (8.5" x 11")Letter (8.5" x 11")ÑøàVærktøjet Kantede patenteser<br><br>Brug værktøjet Kantede patenteser til at tegne kantede parenteser.<br><br>Klik for at tegne almindelige til kantede parenteser.<br><br>Klik og hold nede for at vælge fra en billedmenu over parentesformer.²Bracket tool

    Use the Bracket tool to draw brackets and parentheses.

    Click to draw square brackets.

    Click and hold to select from a picture menu of brackets.ÖÐ.Tegn symbol Draw symbolå±Ì^Klik på et molekyle for markere det som produkt.Click on a molecule to assign it as a productîƒTAsparginsyreAspartic acidðð@Kunne ikke åbne den angivne fil. Cannot open the specified file.÷Áî<Kubisk bezier-kurve - halv pilCubic bezier - half arrowx'Gemt billedfil Saved picture file Ð Rotér 180 graderRotate 180 degrees‘ alininAlanine(P¸I markeringstilstanden kan du trykke på Ctrl+venstre musetast for at få molekyleinformation.VWhen in select mode, press Ctrl+LeftButton on a molecule to get molecule information.HQnúIndstillingen "Ryd op i molekylet" under Værktøjsmenuen kan bruges til at rafinere strukturer som fx ringe og makromolekyler.wThe option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules.\á`Der opstod et problem under skrivningen af filenProblem while writing the filek)e’Kunne ikke konvertere molekylet. Konverteringen mislykkedes i ioiface.cpp>Cannot convert the molecule. Conversion failed in ioiface.cppl·"cyclehexan (stol)Cyclohexane (chair)€Éasparagin AsparagineƒV%*[*] cyclohexan (flad)[*] Cyclohexane (flat)‰¹ cyclehexan (båd)Cyclohexane (boat)Š¿ITegn linje Draw line—eÅTegn ring Draw ring—ÅÇ BenzenBenzeneÆ threonin ThreonineƵ"Ryd &alle grupperClear all &groupsÇiÓ8cyclohexan - bådkonformation Cyclohexane - boat conformationËÉÞarginin ArginineàLÅÊBølgelinjeværktøjet<br><br>Brug bølgelinjeværktøjet til at tegne bølgede linjer, som vist på knappen.YWavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on the button.í$.[*] Benzen [*] Benzeneùõ*Editor af krumme pileCurved Arrow editorûXÒ”Klik på et molekyle for at beregne dets octanol-vand fordelingskoefficient=Click on a molecule to calculate its octanol-water partition VN$90 grader mod uret90 degree counterclockwise 2v¥&270 grader mod uret270 degree counterclockwise 2…&180 grader mod uret180 degree counterclockwise 2†UMolekylevægt = Molecular weight =  9¤°0Newman-projektionssymbolNewman projection symbol ?¬Ü@Tegn aliphatisk kæde - Længde = !Draw aliphatic chain - Length =  Køà¤Når du tegner bindinger, kan bindingstypen ændres ved at højreklikke på bindingen.OWhen drawing bonds, you can edit the bond style by right-clicking on the bond. TànTegn pil Draw arrow l!çVærktøjet Vælg<br><br>Brug Vælg til at udvælge og flytte udsnit.<br><br>Du kan markere flere udsnit og klippe, kopiere, flytte og rotere dem.˜Select tool

    Use the Select tool to select and move items inside a box.

    You can select multiple items and cut, copy, move and rotate them. vÉ.8Dobbeltbindingers mellemrum:Double bond spacing: „ÀÚrVælg tilstand: venstreklik på et objekt for at flytte det*Select mode: left click on object to move †¦µ8Editor af kantede parenteserBracket ‡¡„Symbolværktøjet<br><br>Brug symbolværktøjet til at indsætte symboler.<br><br>Klik og hold nede for at vælge fra en billedmenu med synboler.<br>~Symbol tool

    Use the Symbol tool to insert symbols.

    Click and hold to select from a picture menu of symbols.
     ™mŽ&Reaktantens toppe: Peaks of reactant:  ™ùš,Produkter = %1 kJ/mol Products = %1 kJ/mol  ZjAuto&layout Auto &layout ¤WäÅbn fil... Open file... ¤ÁnForudse 13C NMRPredicted 1H-NMR ¦ÒòD-fruktose D-fructose ¾åEzKlik på et molekyle for at gemme det som brugerdefineret ring0Click on a molecule to save it as a custom ring ÂöDu kan skrive et sænket tal efter en kantet parantes, ved at vælge tekstværktøjet og derefter markere den kantede parantes.bYou can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. ÉK^8Kan desværre ikke fortrydes!Cannot undo, sorry! äžqlKlik på et molekyle for at bestemme dets SMILES streng3Click on a molecule to determine its SMILES string óÑ×0Selvvalgt papirstørrelseCustom paper size úCÕLEstimér ændringen i gasfasens enthalpi$Estimate gas-phase enthalphy change )•ElektronparElectron pair ,ÍÒGennemsigtig Transparent 3&Sæt &baggrundsfarveSet background &color 9ÒMarkér &alt Select &All ;fœpKlik på et molekyle for at generere dets 3-D koordinater0Click on a molecule to generate 3-D coordinates RíÃPVærktøjet Krum pil<br><br>Brug værktøjet Krum pil til at indsætte krumme pile.<br><br>Klik og hold knappen nede for at se billeder af de pileformer der er tilgængelige.‹Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows.

    Click and hold to select from a picture menu of arrows. j¤^[*] Cycloheptan[*] Cycloheptane múåNyttige grupperUseful groups t·Ã\Klik på et molekyle for at beregne dets pKa(s),Click on a molecule to calculate its pKa(s) wˆ¹413C NMR sammenligningsfejl13C NMR compare error {áòdKlik på et molekyle for at få informationer om det0Click on a molecule for possible retrosynthesis }Ò“Værktøjet Vælg<br><br>Brug Vælg til at udvælge og flytte udsnit.<br><br>Du kan markere flere udsnit og klippe, kopiere, flytte og rotere dem.§Lasso tool

    Use the Lasso tool to select and move items by drawing a loop around them.

    You can select multiple items and cut, copy, move and rotate them. ’n`Klik på et molekyle for lave en grundstofanalyse8Click on a molecule to calculate its elemental analysis ü# StatinStatine ¨°histidin Histidine ¯áENaftalen Naphthalene ´®µStandardDefault ¼Œt graderdegrees ¾‹£, intensitet  , intensity  ¿:cyclohexan - stolkonformation!Cyclohexane - chair conformation Å‹î&Support &Support Çt$„Skriv eller rediger den sænkede skrift for denne kantede parentes:4Please type or edit the subscript for this bracket: Í”Ê[*] Cyclobutan[*] Cyclobutane Ö¥Delt dobbeltpilSplit two-way arrow ÛÔÇšKlik her for at åbne en fil<br><br>Du kan også menupunktet Åbn på Fil-menuen.bClick this button to open a file.

    You can also select the Open command from the File menu. 棾ôKlik her for at klippe det markerede ud.<br>Du kan også bruge menupunktet Klip fra Redigér-menuen, eller trykke på Ctrl+X.vClick this button to cut a selection.

    You can also select the Cut command from the Edit menu, or press Ctrl+X. 죞dSlet tilstand: venstreklik for at slette et objekt'Erase mode: left click to erase object û ÄForudse IR Predict IR ÿRFiloperationerFile Operations ÿï“ ThyminThymine @NUnderstreg den markerede tekst (Ctrl+U)!Underline selected text (Ctrl+U) I©[*] Cyclooctan[*] Cyclooctane ¥Negativ ladningNegative charge Ð Gem filen som...Save file as... Ø®pKlik på et molekyle for at beregne dets empiriske formel7Click on a molecule to calculate its empirical formula ,1Stiplet linje Dashed line -§¥BDatabaseforespørgslen mislykkedesDatabase query failed 5ô,&Tegneindstillinger...&XDC settings... 58.&Manual&Manual 8[\ÔKlik her for at udskrive den fil du har åben.<br><br>Du kan også bruge menupunktet Udskriv fra Fil-menuen.vClick this button to print the file you are editing.

    You can also select the Print command from the File menu. 9¨ž(Fast bindingslængde:Bond fixed length: <ª,Tegn linje - Længde = Draw Line - Length =  P”pReaktant Reactant z£ÔReaktion Reaction z«ÞdTegn pil tilstand: venstreklik for at tegne en pil*Draw Arrow mode: left click to draw arrow }Þ7TEstimér ændringen af enthalpi i gasfasen: &Estimated gas-phase enthalpy change:  ‚² Forudse 13C NMRPredicted 13C-NMR ‰@²hKlik på et molekyle for at beregne dets molekylevægt6Click on a molecule to calculate its molecular weight “ñ$ &Rotér&Rotate –¨…0Hævet skrift (Ctrl+Plus)&Superscript selected text (Ctrl-Plus) š>9pBeregn octanol-vand fordelingskoefficient (log Kow) = %1:Estimated octanol-water partition constant (log Kow) = %1 ºBa@Newman-projektion - elipseformetNewman projection - eclipsed ¼”bTegn ring tilstand: venstreklik for at tilføje %1%Draw Ring mode: left click to add %1 Å”á8&Pil - Fast længde og vinkel &Arrow - Fixed length and angle ÒhuSidehøjde: Page height: ØForudse 13C NMRPredict 1H NMR àÎ2*Indtast SMILES strengEnter SMILES string ãBUdskriv filenOverwrite file? ò$ïTTilføj brugerdefineret ring til menulistenAdd custom ring to menu list øV„FSMILES streng for udvalgt molekyle:%SMILES string for selected molecule: ûUjÅbn fil Open file šE.Molekyle information...Object information èžNVis ikke denne dialogboks under opstart"Don't show this dialog at startup %vp ElipseEllipse 3ÕTesttilstandTool test mode 9ZÕ”Tegn kantet parentes tilstand: venstreklik for at tegne kantede parenteser.Draw Bracket mode: left click to draw bracket TŒd 3D-ind Stereo-down Y^Sæt skrifttype Set Font dÑÄ4Stereokemisk ring-hydrogenStereochemical ring hydrogen f¾Sæt skrifttype Set font fÑÄSæt skrifttype &Ruler font mjtEnthalpiændringEnthalpy change v5Gem filen Save file v—¥$Retrosyntetisk pilRetrosynthetic arrow > 3D-ud Stereo-up Œ^`Positiv ladningPositive charge •ÓÅ &Litteraturliste &References ¡Â&Sæt skriftstørrelseSet font size ¢&Sæt skriftstørrelseSet Font Size £îglutamin Glutamine ¨ruNæste tip Next tip ö€@$Produktets toppe: Blue is product ÷äReaktantRed is reactant ©dvPileværktøjet<br><br>Brug pileværktøjet til at tegne lige pile.<br><br>Klik for at tegne en lige pil.<br><br>Klik og hold nede for at vælge en pil fra listen over tilgængelige pileformer.¤Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click to draw a straight arrow.

    Click and hold to pick from a list of available arrows. >þÐI markeringstilstanden kan du holde Shift+venstre musetast nede og trække for at markere hele molekylet.lWhen in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. ²^@XDC - XDrawChems eget format (*)"XDC - XDrawChem native format (*) ÉÙÈVælg tilstand: venstreklik på et objekt for at flytte det, højreklik på objektet for at redigere detISelect mode: left click on object to move, right click on object to edit 7ݤ(Tegn kantet parentes Draw bracket ?(¤XDer er ingen sites with pKa mellem -1 og 15.6There seem to be no sites with pKa between -1 and 15. Vž Tegn 3d-ud linjeDraw stereo-up line gå&FormatérForma&t i3” FormelFormula iLaFremForward iØÄ &Frem &Forward iÚ$"Estimerede pKa'erEstimated pKa's xÕó(Tegn aliphatisk kædeDraw aliphatic chain Ž ®²Tegn stiplet linje tilstand: venstreklik for at tegne en linje, højreklik for at redigereDDraw Dashed Line mode: left click to draw line, right click to edit ©¤”Klik her for at kopiere det markerede.<br><br>Du kan også kopiere med menupunktet Kopiér fra Redigér-menuen, eller trykke Ctrl+C.xClick this button to copy a selection.

    You can also select the Copy command from the Edit menu, or press Ctrl+C. ¬/>>Find strukturen via internettetFind structure via Internet ¯®äSymbol-editorSymbol editor º Ò(Reaktion = %1 kJ/molReaction = %1 kJ/mol ºáŒ¢Tegn linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere=Draw Line mode: left click to draw line, right click to edit Æñt&Vidste du at?&Did You Know? È(oVidste du det?Did You Know? È6\Du skal vælge mindst en reaktant og et produkt7You must select at least one reactant and one product. ЕNDobbelt/tripelDouble/triple Ô•eÀRingværktøjet<br><br>Brug ringværktøjet til at indsætte færdiglavede ringe og strukturer.<br><br>Klik for at åbne dialogboksen ringe. Der kan du vælge mellem alle programmets indbyggede ringe og strukturer.<br><br>Klik og hold nede for at vælge fra en billedmenu over ringene.<br>(Se manualen for flere informationer om hvordan du tilpasser denne menu)7Ring tool

    Use the Ring tool to insert ready-made rings and structures.

    Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.

    Click and hold to select from a picture menu of select rings.
    (See manual for more info on modifying this menu) Ý,‰®Tegn 3D-ud linje tilstand: venstreklik for at tegne en linje, højreklik for at redigereGDraw Stereo-Up Line mode: left click to draw line, right click to edit ã`t(BOC [butoxycarbonyl][*] BOC ÿGcdSkriv peptid-sekvens - forkortelse på 3 bogstaver:5Enter peptide sequence - three-letter abbreviations:Í Kemisk navnChemical name yåPeptidbygningPeptide BuilderÛB<Kubisk bezier-kurve - fuld pilCubic bezier - full arrowL'†Vælg tilstand: venstreklik for at flytte, højreklik for at redigere5Select mode: left click to move, right click to edit1?"Tegn 3D-ind linjeDraw stereo-down line2ôe,Indtast SMILES streng:Enter SMILES string:4 D-glukose D-glucose;ᥠglycinGlycine? ReaktionReverse reactionseR#\Klik på et molekyle for at beregne dets 1H NMR,Click on a molecule to calculate its 1H NMR}Â"Sæt linjetykkelseBond thickness:ƒ-úGitterafstand Grid spacingj7,Centrér markeret tekstCenter selected textŸÖ´ GuaninGuanine¸P,&Tegneindstillinger...&Drawing settings...¿VN8Editor af kantede parenteserBracket editorÁ’`Klik på et molekyle for markere det som reaktant/Click on a molecule to assign it as a reactantÉ)ÔìXDrawChem kan automatisk tilknytte aminosyrer fra N-terminal til C-terminal (men resultatet er ikke altid lige kønt :)tXDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :)äôù"IOIface Data fejlIOIface Data errorûͲmethionin Methioninetå°Tegn bølget linje tilstand: venstreklik for at tegne en linje, højreklik for at redigereBDraw Wavy Line mode: left click to draw line, right click to edit,ÓÄ(Tegn aliphatisk kæde11 (aliphatic secondary amine);0 [*] EDANS [*] EDANSIÙÃZVærktøjet Stiplet linje<br><br>Brug Stiplet linje til at tegne stiplede linjer. Tegn ovenpå eksisterende bindinger for at tilføje en stiplet linje (for at vise resonans ol.)”Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.).ee^ Brugerdefinerede User-defineduA„fKlik på et molekyle for at fjerne gruppemarkeringen3Click on a molecule to display its bond identifier6¢anthracen Anthraceneƒå$[*] cyclepentadien[*] Cyclopentadiene“ÚµSpejl &lodretFlip &vertical˜ÐlHCDXML - ChemDraw text/XML format (*)%CDXML - ChemDraw text/XML format (*)š®¹&Kun nøjagtige matchExact matches only¡˜¹imidazol Imidazole©f,Kunne ikke skrive til Could not write to ­#ÐSMILES strengSMILES stringµ†GŽTegn kæde tilstand: venstreklik og træk for at tegne en aliphatisk kæde=Draw Chain mode: left click and drag to draw aliphatic chainÐ~Forudse IR Predicted IRÓÞ"Aktuel information om XDrawChem kan altid findes på http://www.prism.gatech.edu/~gte067k/xdrawchem/ Den seneste version vil altid kunne findes her. Der er to postlister: xdrawchem-announce, hvor nye versionerannonceres, og xdrawchem-user, for åben diskussion blandt brugere af XDrawChem. Tilmeld dig ved at sende en blank e-mail med emnet "subscribe" til "xdrawchem-announce-request@lists.sourceforge.net" eller "xdrawchem-user-request@lists.sourceforge.net" Du kan kontakte forfatteren direkte via herger@chemistry.gatech.edu£Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.netؽtForudse 13C NMRPredict 13C NMRÚÄ’Søg efter type: Search type:áŽOrientering: Orientation:âJForudse pKa Predict pKaò±BFMOC [9-fluorenylmethoxycarbonyl] [*] FMOCôµãxdrawchem-v1.11.0/ring/xdrawchem_de.qm000066400000000000000000002211631371466245600177150ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝB;#þFxm*ß–Ih¾JÄî´Ç&vjO‡ÔxŒ¯¹–Dð¦y#§ÔT»Ð,Äì0ñö5ÏQ+Ô˜ŒÃ¬ôòØÙ‹tTå@} rÐ%Š8*¦yÄ*»ø*Ð%0*Ó^*ì0’*ö5À+f¾ø+”ƒ(+˜Åm+į£,]Û-1†éf:0Õ¹?±gòAî 6D¬, ƒF|Å ÎGfÀ =H™g iJ+‚ •J6• ÃJcb ÷Lˆ• #LÚå UMez RŠŸ ÕTƒŠ VŠ¥ -WT _Xýô Yã ½\K ûnÁlU„¼ÃЇæߊַ9G–›…ߪ¼õ²jtE¶œõ’¹_ùÅÁèÞ#ÅQ•õÒ-µ5Ùô•Ý´âè°$ñÐþ`õ)ã^ýmŠ·é¢hÄP ü¸ Ü,/ Ÿ{¿N;$•9z‘(QNü-½~É/ßãû=c9?# nGÉd Áeôž!eöž!\jÑ„!–yí5!ÚˆRJ"¡úy"lº„e# æu#mñ’>$C %$Ú U%AØþ%¶%±Y%ÿ(€’&^*%&¯/úÕ&î4ò'9D°o'xid³(~n‘t(µqÎU)† N*‘í~+x™6Ô+Ƨ–Ä,)©÷,Vª6•,—®–À,α…„-¶Š¥-Ž·T-ùYB-ö½/.<À×.›Ë .êÌ05/Ζ%/\ãWÎ/•ä×1|ëw£1Åí€2 ð‡Î2K$ž 3,ù3Ô9Å%4F:Rµ4…<:Õ5I>ì5”Nºä5é^Æ”6;^è)6ƒ{ØÒ7ˆË½7‘‹¹M7Û“æÕ8(Ÿù8f¬Èn8¥·² :½»˜ ;G½‰Ä;“½¸;ôÀnY<-ÃÖà<¿ʼ“=9Ì`=Õl =ãò†¥>.ô T>© I? Iñ?•¹©@+|£@³.Ð*@ø0–JA3=yµAs=¿zAÓB¶žB*R$þC¯[QcDÙ[scE ^›xEuhžWFh½ÉFMs«žF¸{0¹G䀧,Ha€·,Hœç,H׋µIŽg®IM–ŠÂI›˜ \IʘI¼JœZÂJI Š%J~§Ý>J«¶¹%Ko¹ÊåK¢Á,¾KÜƸÞLûÆå`M[Úš‘M ÝY©NjÞº#NÃà—pUdáDIU¡çÍùW,¶%WÐ|WÊßòX³€XmÁoX»@ tY@ EYlH8ÀY™O€ÔYÈP~DZY ¤Zˆ`N’Z·c·%Zòmf3[3|E[j–•[—–j[Æ›ˆ˜\+œ+¤\ZœÞ\œE]眩^´^e N%^ɦu^ú¨¸…_6«Ø“_g¬Š_–­Án_Á¯‘9` °9\`D°µt`s±b`ª¶öga¹%a­Á¹*aàÅ jbhÈ0EbŸÈyübÌÉßibûÖ^ucjÖ¥:c¦ߺºcâñWÎd÷Œ^gkø(>hEøAiOú”Ii“¥j;éÎj¡ ¼)jú S¹ks"k¿G…l^?lÜöJm,¦åm‡%mÙMÂn++¯eo5ŽÀo95þWo…X•žoþ_PÔp:_pÔpkºåp¸lN€q=x?Þq‰x r–±rT›ƒtrœ¥vŠrÕ¶Às2·éÂsiĘžt5ľ¬tnÅ/õuMÇ>…uÏäLvEñvvèôox©ôþxí|y+žÃy‹"5y¶!È:z-oúzW-ÊzÌ/÷{!35ê{qHO´{ÁHûn| O!é|RVÑ|ÊjÏÉ}fpì3~|¬~>}v8~‹‰ÇÊ~ú_º<‘É…”W$í•»ô€O–0€˜ö¤€±¢Ü¢òI¬Pƒ³Ô~³¹P4î¿W.‚ÁÎ}ƒÐ惟ѩ>ƒâÑø…€ÖÐ.…ÖÝɈ:å±Ìˆ~îƒTˆÄðð‰Š÷Áî‰Ð÷òlŠ`{Ѝx'‹Ћ’‘‹ä(PŒ1HQnŒa\áåk)ezl·ÿ€Éý‚Gž‘SƒV%‘Ɖ¹‘ÿŠ¿I’^—eÅ’¯—ÅÇ“Æ “sƵ“£ÇiÓ“ÙËÉÞ”?àLÅ”µí$.”èùõ–'ûXÒ–c VN–© %}—â 2v¥˜j 2…˜Õ 2†U™C 4·î™± 9¤°™ó ?¬ÜšE Køàšœ Tàn›1 l!眆 r±sœÉ vÉ. „ÀÚŸ †¦µŸ} ‡¡„ / —vÙ a ™mŽ ¹ ™ùš¢} Zj¢Ó ¤Wä£3 ¤Án£t ¦Òò£» ¼îϤ ½ó)¤n ¾åE¤ÿ Â¥: ÉK^¦$ äžq§† æJ`¨ óÑרw úCÕ©^ )•©® ,ÍÒªH 3ªŽ 4|ùªÌ 9Ò«Z ;fœ«¼ Ríì j¤^¬Î múå®á t·Ã¯, wˆ¹¯~ {áò°^ }Ò“°ä ’n±Ð ü#´C ždªµ ¨•µo ¨°µ£ ­yµÓ ¯áE¶L ´®µ¶‚ ¼Œt¶¾ ¾‹£¶ò ¿· Å‹î·a Çt$·Þ ʇٸ ͔ʸq Ö¥¹! ÛÔǹi 棾¹¿ 죞ºã û ļ ÿR½8 ÿ‡ @½Ç I©½÷ ¥¾t о¼ Ø®¿ &õ‰¿b ,1¿Þ -§¥À¯ 5ôÀí 58.Áe 8[\Á¼ 9¨žÁò <ªÃJ P”pá z£ÔÄ z«ÞÄ8 }Þ7Äm ‚² ÅI ‰@²Åñ “ñ$ÆW –¨…Ç- š>9Ç_ ºBaÇá ¼”È» Å”áÉ, ÒhuÉÕ ØÊM àÎ2ÊŒ ãBÊç ð0²ËC ò$ïËœ øV„Ëð ûUjÌ— šEÍ& \bÍd èžÍÚ %vpÎ- 3ÕΫ 9ZÕÎÝ >}Ï A„HÏm BIHÏÀ TŒdÐ W9Ð÷ Y^ÑF dÑÄÑœ f¾Ñã fÑÄÒN mjtÒ… v5ÒË v—¥Ó >Ó_ Œ^`Ó´ •ÓÅÔ ¡ÂÔN ¢ÔŒ £îÔÎ ¨ruÕ Η ÕT ö€@Õ§ ÷äÕà ©dÖ@ >þÖš ²^Ù [iÚ® ç‰Û* ÉÙÛŸ 7ݤÜ! ?(¤ÝN A÷ÈÝ™ MàIÞ VžÞ— gåß i3”à iLaàI iØÄà… iÚ$๠xÕóàð Ž ®á6 ©¤”á ¬/>âµ ¯®ääk º ÒäÛ ºáŒå ¾XHåv ÆñtåÉ È(oæÒ È6ç) ЕNç Ô•eèF Ý,‰è’ ã`tìà çÓùíò çäyî ÿGcïÍ ïE yåïúÛBðB;ðŽL'ðæ1?ñb2ôeòO4 òÝ;á¥ó<? ótBŒó¤eR#ô*n“BôŽ}Âôǃ-úõŸ††žõéj7ö*ŸÖ´ök¸Pöº¿VNöê¿ß:÷7Á’÷eÉ)Ô÷ªäôùømíÄÎùóñ2Îú=ûͲúÜtåû?Õ ûx,ÓÄüK;0 ýcIÙÃýâ\õiþee^þ°uA„Ü6¢'ƒåúˆ¾3“Úµ£˜Ðl÷š®¹F¡˜¹Ï©f­#ÐLµ†G®Ð~òÓÞñؽtPÚÄ’ÝáŽ;âJtò±·ôµã÷å9HiÉOKOK;cmcmInchinþ Pixelpxx&Los&Go*ßRechteckBoxIhAusschneidenCutJÄ&Neu&New´ÇCAS:CAS:vj&Menü Schrift &Main font‡ÔAutomatischAutoŒ¯BindungenBond–DKopierenCopy¦y&AusschneidenCu&t§ÔBearbeitenEdit» FüllenFillÐ, HilfeHelpì0StartseiteHomeö5&Molekül-InformationInfoÏ linksLeft+ÔBeendenQuitŒTextText¬ôunspezifischWavyØÙAtombead‹t&Geladenes Dokument Loaded document å@<Vergleich der 13C-NMR-SpektrenCompare 13C NMR rLInChI-String für das gewählte Molekül:$InChI string for selected molecule:%Š&Kopieren&Copy*¦y&Bearbeiten&Edit*» &Datei&File*Ð%&Rotieren&Flip*Ó &Hilfe&Help*ì0&Startseite&Home*ö5&Öffnen&Open+f¾640x480 Pixel640x480 pixels+”ƒ&Speichern&Save+˜Å&Rückgängig&Undo+į &Zoom&Zoom,],~2125 (schmal), -N=C=S~2125 (narrow), -N=C=S-$Legal (8.5" x 14")Legal (8.5" x 14")1†éPyrimidin Pyrimidine:0ÕReaktionspfeil Plain arrow?±gÐBindungslängen, Bindungswinkel und Maßeinheiten legen Sie im Menü unter 'Format' > 'Eigenschaften' fest.aBond length, bond angle, and units are set in the Drawing Settings option under the Format menu.Aî S&ymbol einfügenInsert s&ymbolD¬,@Datei kann nicht geöffnet werdenCouldn't open fileF|Å CAS: CAS: GfÀ PfeilArrowH™g LeerenClearJ+‚SchließenCloseJ6• FarbeColorJcbRadiererEraseLˆ•CyclopentadienCyclopentadieneLÚåSchriftart:Font:Mez LassoLassoRŠŸ Name:Name:TƒŠEinfügenPasteVŠ¥DruckenPrintWT rechtsRightXýôRingstrukturenRingsYã8Änderung rückgängig gemacht!Undo!\KBiphenyl BiphenylnÁl,SMILES-String eingeben Input SMILES„¼Ã,Vorgegebene StrukturenCanned Structures‡æMesomeriepfeilTwo-way arrowŠÖ·2Gekrümmten Pfeil zeichnenDraw curved arrowGTyrosin Tyrosine–›…Cystein Cysteineª¼õ$Raster als Vorlage Snap to grid²jtCytosin Cytosine¶œõ*--Filter wählen-- (*)--Select a filter-- (*)¹_ùˆKein auf die Anfrage zutreffendes Molekül in der Datenbank gefunden..No molecules in the database match the query.ÁèÞDesoxyribose DeoxyriboseÅQ•,~2250 (schmal), Nitril~2250 (narrow), nitrileÒ-µ &Edukt auswählenSelect &ReactantÙôNukleinbasenNucleic acidsÝ´Analyse =  Analysis = è°`Um zwischen den verschiedenen Hintergrundrastern umzuschalten, drücken Sie einfach 'Strg'+'G'. Das Ein-/Ausschalten des Rasters hat keinen Einfluss auf die Lage Ihrer Moleküle.‚You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid.ñÐþ0What's &This - Assistent What's &Thisõ)ã,Fester Bindungswinkel:Bond fixed angle:ýmŠRahmenfarbe Border coloré¢0Edukt oder Produkt fehltMissing reactant or producthÄJquadratische Hintergrundraster zeigenShow square grid ü"Auswahl auf&heben&Deselect All Ü,vLasso-Modus: 'linkeMaustaste' gedrückt halten zum Markieren.Lasso mode: left click and hold to draw lasso Ÿ¦Bitte wählen Sie nur ein Edukt und ein Produkt aus, um die Spektren zu vergleichen.<br>Damit zeichnen Sie Einfachbindungen. Wenn Sie dieses Werkzeug auf bereits bestehende Bindungen anwenden, erzeugen Sie Doppel- und Dreifachbindungen.oLine tool

    Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds.(QN>XDrawChem ist in der Lage, Verbindungen nach der CAS-Nummer und teilweise nach dem Namen zu identifizieren. Wählen Sie 'Werkzeuge' > 'Molekül-Information...' und markieren Sie dann ein Molekül per Doppelklick. Dies funktioniert jedoch nur, wenn das Molekül in der Datenbank gelistet ist.ØXDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database.-½~Aminosäuren Amino acids/ßãÐBindungs-Modus (stereospez. nach hinten): 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum EditierenIDraw Stereo-Down Line mode: left click to draw line, right click to edit=c(rechteckige KlammernSquare bracket?#,Peak-Liste exportierenExport Peak ListGÉdZoom vergrößernZoom IneôžVerkleinernZoom ineöžGlutaminsäureGlutamic acidjÑ„Keine Form No shapeyí5*Peaks des Produktes: Peaks of product: ˆRJ^11 (a-Carbonyl zwischen Keton- und Estergruppe)'11 (a-carbon between ketone and ester)¡úy,Positive PartialladungPartial positive chargeº„e”Klicken Sie auf ein Molekül, um dessen wahrscheinlichen Namen zu ermitteln&Click on a molecule to guess its nameæuZGewählte Datei kann nicht geschrieben werden.!Cannot write the specified file.ñ’>:Gestrichelte Bindung zeichnenDraw dashed line %>Erstelle 3D-Modell des MolekülsBuild 3D model of molecule U Bitte warten ... Please wait.Øþ,14.4 (sekundäres Amin)14.4 (secondary amine)%±Y(Kubische Bezierkurve Cubic bezier(€’Cyclopentan Cyclopentane*%[*] Cyclopentan[*] Cyclopentane/úÕPfeileditor Arrow editor4ò¨Nutzen Sie die aktuellste Version? Schauen Sie auf http://xdrawchem.sourceforge.net/BBe sure to check for updates at http://xdrawchem.sourceforge.net/D°o Bindungen bondsid³„Text-Modus: 'linkeMaustaste' zum Einfügen oder Bearbeiten von Text*Text mode: left click to add or edit textn‘tRDrehung um 90° entgegen dem Uhrzeigersinn#Rotate 90 degrees counterclockwiseqÎUÐSpeichert die Datei, die Sie gerade bearbeiten.<br><br>Entspricht dem Menüpunkt Speichern im Datei-Menü.|Click this button to save the file you are editing.

    You can also select the Save command from the File menu.

    † N&Speichern &unter... Save &as...‘í~:Hintergrund&raster umschalten Toggle &grid™6Ô &Über&About§–ÄInChI-String InChI string©÷&Schließen&Closeª6•&Gruppieren&Group®–ÀTListe der Reaktionen für die RetrosyntheseReverse reactions list±…„&Einfügen&Paste¶Š¥&Drucken&Print·TZeichenfarbeSet drawing color¹YB,~2270 (schmal), -N=C=O~2270 (narrow), -N=C=O½/&Gestrichelter Pfeil Dashed arrowÀ× LeucinLeucineË PhenylalaninPhenylalanineÌ05Isoleucin IsoleucineΖ%>XDrawChem kann über seine Internet-Datenbank mehr als 100,000 Substanzen darstellen. Wählen Sie 'Datei' > 'Im Internet finden', um nach Verbindungen zu suchen.XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds.ãWÎ Gekrümmter Pfeil Curved Arrowä×1024x768 Pixel1024x768 pixelsëw£Synonyme: Other names: í€ÆKeil gestrichelt<br><br>Damit zeichen Sie eine stereospezifische Bindung in die Papierebene hinein.bStereo Down Line tool

    Use the Line tool to draw stereo-down lines, as shown on the button.ð‡ÎInChI ausgeben Output InChI$ž 8Steroid (geschlossener Ring)Steroid (fused ring template),ùCyclopropan Cyclopropane9Å%z'linkeMaustaste' zum Einfügen des Newman-Projektion-Templates.Left-click to draw Newman projection template:Rµ[*] Cyclopropan[*] Cyclopropane<:Õ(Rotation &horizontalFlip &horizontal>ì(geschweifte KlammernCurly bracketNºäIndex eingebenEnter subscript^Æ”JNewman-Projektion - gestaffelt (anti)%Newman projection - staggered (anti)^è)RFehler beim Vergleich der 1H-NMR-Spektren1H NMR compare error{ØÒ1H-NMR-Spektrum1H NMR spectrumˆË½ 13C-NMR-Spektrum13C NMR spectrum‹¹MZoom = %1 % Zoom = %1 %“æÕ-4 (Pyrrol) -4 (pyrrole)ŸùrÜber die Schaltfläche 'Templates' stehen Ihnen viele verschiedene fertige Strukturen zur Verfügung - z.B. einfache und komplizierte Ringstrukturen, Aminosäuren, Nukleinbasen und Zucker.ŠA number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides.¬ÈnFText <b>fett</b> drucken ('Strg'-B)(Make selected text bold (Ctrl+B)·²  Multiplizität:  Multiplicity: »˜ *Text links ausrichtenLeft-justify selected text½‰ÄNächster Previous tip½¸NText <i>kursiv</i> drucken ('Strg'+'I')(Italicize selected text (Ctrl+I)ÀnYDKann folgende Datei nicht öffnen: Could not open the file: ÃÖà,SMILES-String ausgebenOutput SMILESʼ“&Im &Internet finden&Find on InternetÌ`10.5 (Guanidin)10.5 (Guanidine)Õl @&Bindung - Länge und Winkel fest&Bond - Fixed length and angleò†¥<Hintergrundraster nicht zeigenDo not show gridô TBText tiefstellen ('Strg'+'Minus')%Subscript selected text (Ctrl-Minus) IFBild kann nicht gespeichert werden!Unable to save picture! Iñ\1.3 (aliphatische Carbonsäure, 2 a-Halogenide),1.3 (Aliphatic carboxylic acid, 2 a-halide)¹©800x600 Pixel800x600 pixels+|£Synonyme: Other names:.Ð*Papiergröße: Paper size:0–J,Negative PartialladungPartial negative charge=yµ(Feste PfeilwinkelungArrow fixed angle:=¿zUm ein Template (z.B Ring) an eine bestehende Struktur anzuhängen, wählen Sie das Template und klicken Sie dann auf das Verbindungsatom.YIt's possible to attach rings to structures by selecting a ring and clicking on an atom.B¶ž°Keil<br><br>Damit zeichen Sie eine stereospezifische Bindung aus der Papierebene heraus.^Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as shown on the button.R$þLinienbreiteSet line thickness[Qc&Linienbreite wählenSet Line Thickness[scVFeste Bindungslängen und -winkel einrichtenSet fixed angle and length^›x&'No-Reaction'-Pfeil NR arrowhžW<7.8 (-SH am aromatischen Ring)7.8 (Aromatic -SH)h½ÉÆMit dem 'Auswahl'-Werkzeug genügt häufig 'rechteMaustaste' auf ein Objekt, um dieses zu bearbeiten.JWhen in select mode, you can edit most objects by right-clicking on them.s«ž@CDX - ChemDraw Binary Format (*)!CDX - ChemDraw binary format (*){0¹[*] DABSYL [*] DABSYL€§,[*] DABCYL [*] DABCYL€·,[*] DANSYL [*] DANSYLç,[*] Biotin [*] Biotin‹µ"Keine InformationNo information.Žg® RahmenBorder–ŠÂ$Teemplate-Werkzeug Ring tool˜ \AbbrechenCancel˜I¼zentriertCenterœZ KreisCircle Š%hRadierer<br><br>Damit löschen Sie einzelne Elemente.@Erase tool

    Use the Erase tool to erase individual items.§Ý>zweifachDouble¶¹%Querformat Landscape¹ÊåÂVergessen Sie nicht, einen Datei-Typ anzugeben, wenn Sie eine Datei öffnen oder speichern wollen.ARemember to select a file type when opening or saving documents.Á,¾,Molekül-Information...Molecule information...ƸÞSummenformel =  Formula = Æå`~Kürzel: 'Alt' gedrückt halten und Ein-Buchstaben-Code eingeben!0Shortcut: Hold 'Alt' and type one-letter codes!Úš‘(A4 (210 mm x 297 mm)A4 (210 mm x 297 mm)ÝY©¼ Bryan Herger bherger@users.sourceforge.net Bitte tragen Sie sich in die Mailing-Liste (nur in Englisch) ein, um Informationen über zukünftige Veröffentlichungen zu erhalten. Dazu senden Sie eine E-Mail an xdrawchem-announce-request@lists.sourceforge.net mit dem Betreff: 'subscribe' XDrawChem Copyright (C) 2004 Bryan Herger (http://xdrawchem.sourceforge.net) Anteilig Copyright (C) 1997-2000 Dr. Christoph Steinbeck und das JChemPaint Projekt (http://jchempaint.sourceforge.net) OpenBabel Copyright (C) 2003 OpenBabel Projekt-Team (http://openbabel.sourceforge.net) Siehe COPYRIGHT.txt für mehr DetailsÉ Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more detailsÞº#, Winkel =  , Angle = à—pøText<br><br>Damit fügen Sie Text oder bezeichnen Atome.<br><br>Formatierungsanweisungen für den Text finden Sie im Handbuch.wText tool

    Use the Text tool to add text and label atoms and points.
    (See manual for info on formatting text)áDI:5 (aromatische primäres Amin)5 (Aromatic primary amine)çÍù IndolIndole¶%Keine FüllungNo fillÐ|:Vergleich der 1H-NMR-SpektrenCompare 1H NMRßò"Wo gibt es Hilfe?How to get help³€~1300-1000, C-O~1300-1000, C-OÁo<Unspezifische Bindung zeichnenDraw wavy bond@ t LysinLysine@ E Name: Name: H8À$&Produkt auswählenSelect &ProductO€ÔFhexagonale Hintergrundraster zeigenShow hex gridP~D ObjektObjectY ¤CAS-Nummer CAS Number`N’Datei drucken Print filec·%&WerkzeugeT&oolsmf3 PurinPurine|E RiboseRibose–•63D-Datei speichern unter...Save 3D file as...–j SuchenSearch›ˆ˜AuswählenSelectœ+¤ØXDrawChem kann über die Kommandozeile Bilder produzieren. Geben Sie 'xdrawchem --help' für mehr Details ein.dXDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details.œÞ SerinSerineœE"NitrophenylalaninNitrophenylalanineœ©,Text rechts ausrichtenRight-justify selected text´einfachSingle N%Cyclohexan Cyclohexane¦uViereckSquare¨¸… ZuckerSugars«Ø“Art:Style:¬Š~1350-1000, C-N~1350-1000, C-N­ÁnAntikörper Antibody¯‘9 SymbolSymbol°9\unbenannt untitled°µt:einfach/zweifach (aromatisch)Single/double (aromatic)±bZ, anklicken, um es in das Dokument einzufügen, click to paste into drawing¶ögdreifachTriple¹%NWählen Sie eine Struktur aus der Liste:Choose a structure from list:Á¹*Einheiten:Units:Å j ValinValineÈ0E UracilUracilÈyü64 (aromatische Carbonsäure)4 (Aromatic carboxylic acid)ÉßiCyclobutan CyclobutaneÖ^uSuche nach: Look for:Ö¥:Breite:Width:ߺºr Zielbindungen werden in Grün hervorgehoben. Zum Anzeigen einer Liste möglicher Reaktionen, die eine markierte Bindung beeinflussen bzw. ergeben können, RechteMaustaste auf diese Bindung und Info auswählen. Zum Löschen aller Markierungen, die Rückgängig-Funktion des Bearbeiten-Menüs aufrufen oder Ctrl+Z drücken.Ê Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z.ñWΚKlicken Sie auf ein Molekül, um Informationen über dieses Molekül zu erhalten$Click on a molecule for information÷Œ^®In der Datenbank wurden keine Reaktionen gefunden, die zu dem gewählten Molekül führen.@No reactions in the database could yield the selected molecule.ø(>runde Klammern ParenthesesøAfSchätze Octanol-Wasser-Verteilungskoeffizient (Kow)&Predict octanol-water partition (Kow)ú”I6Klicken Sie auf ein MolekülClick on a molecule¥*Als Bild speichern...Save as picture...éÎ@5 (aromatisches sekundäres Amin)5 (aromatic secondary amine) ¼) 8 (Peroxidsüure)8 (Peroxy acid) S¹*180° im Uhrzeigersinn180 degree clockwise"xKlicken Sie auf ein Molekül, um seine Struktur zu bereinigen.Click on a molecule to clean up its structureG…&Molekül-InformationMolecule Info^?*XDC Datenbank-Server:XDC database server:öJ$Molekül bereinigenClean up molecule¦å&Textform bearbeitenEdit text shape%’Klicken Sie auf ein Molekül, um sein 13C-NMR-Spektrum berechnen zu lassen-Click on a molecule to calculate its 13C NMRMÂMolekül Molecule+¯e$Datei gespeichert  Saved file 5ŽÀJBenutzerdefinierte Struktur erstellenCreate custom ring5þWElektronSingle electronX•ž Zoom verkleinern Zoom Out_PÔVergrößern Zoom out_pÔJProblem während des Öffnens der DateiProblem while opening the filekºå*&Gruppierung aufheben Clear &grouplN€JOctanol-Wasser-VerteilungskoeffizientOctanol-water partitionx?Þ p-Orbital (halb) p orbital‰x "Hintergrundraster Show grid–±Hochformat Portrait›ƒt*Edukt(e) = %1 kJ/mol Reactants = %1 kJ/mol ¥vŠp-Orbital p double¶ÀˆKlicken Sie auf ein Molekül, um sein IR-Spektrum berechnen zu lassen(Click on a molecule to calculate its IR·éÂ&Über ... &About ...Ęž˜Symbol-Modus: 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum Editieren+Draw Symbol mode: left click to add symbolľ¬HDatei-Typ kann nicht bestimmt werdenCould not determine file typeÅ/õ>Drehung um 90° im UhrzeigersinnRotate 90 degrees clockwiseÇ>…^Bitte wählen Sie einen Datei-Typ von der Liste.)Please select a file type from the list.äL.Aliphatische Ketten<br><br>Nutzen Sie dieses Werkzeug, um aliphatische Ketten zu zeichnen. Die Länge eines jeden Segments entspricht der Bindungslänge.wChain tool

    Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length.ñvBindungseditor Bond editorôoIR-Spektrum IR spectrumôþ4Kann nicht geladen werden Unable to load |InchinchesžÃ*270° im Uhrzeigersinn270 degree clockwise"5Bindungsordnung Bond order:!È:>Ändere XDrawChem-Einstellungen:Change XDrawChem settings:-oú$Elementaranalyse: Elemental analysis: -Ê(Seiten&einstellungen Pa&ge setup/÷ Feste PfeillängeArrow fixed length:35êText einfügenDraw or edit textHO´"Neu hinzufügen... Add new...Hûn<4.5 (aliphatische Carbonsäure) 4.5 (Aliphatic carboxylic acid)O!é^Zeichne grafisches Objekt: Kubische Bezierkurve"Draw graphic object: cubic bezierVÑ`~1660-1600, C=C (cis/vinyl stark; trans schwach)/~1660-1600, C=C (cis/vinyl strong; trans weak)jÏÉ Pixelpixelspì3&Seiteneinstellungen Page setup|¬6~3300 (breit), sekundär N-H~3300 (broad), secondary N-H}v8Seitenbreite: Page width:‰ÇÊGeschätze pKs:Estimated pKa's:_º:10 (-OH am aromatischen Ring)10 (Aromatic -OH)‘É4In Zwischenablage kopierenCopy to clipboard”W$ProduktProduct•»ô ProlinProline–02Keine Reaktionen gefundenNo reactions found˜ö¤Rückwärts Backward¢Ü&Rückwärts &Backward¢ò AdeninAdenine¬PTryptophan Tryptophan³Ô~†Klicken Sie auf ein Molekül, um seine Gruppenzugehörigkeit zu lösen1Click on a molecule to clear it group assignment¹P4*Als Bild speichern...Save picture...¿W.J~1475 (schmal), aromatischer Ring C=C"~1475 (narrow), aromatic ring C=CÎ} Intensität:  Intensity: ÐæFügt Inhalte aus der Zwischenablage ein.<br><br>Entspricht dem Menüpunkt Einfügen im Bearbeiten-Menü. Tastenkombination: 'Strg'+'V'.zClick this button to paste a selection.

    You can also select the Paste command from the Edit menu, or press Ctrl+V.Ñ©>&Letter (8.5" x 11")Letter (8.5" x 11")Ñø–Klammern<br><br>Damit fügen Sie Klammer-Ausdrücke ein.<br><br>Wenn Sie die Schaltfläche gedrückt halten, erscheint eine Auswahlliste mit verschiedenen Klammern (geschweifte, eckige, runde, ... Klammern).²Bracket tool

    Use the Bracket tool to draw brackets and parentheses.

    Click to draw square brackets.

    Click and hold to select from a picture menu of brackets.ÖÐ.Normal (100%)Normal (100%)ÝÉSymbol einfügen Draw symbolå±Ì|Klicken Sie auf ein Molekül, um es als Produkt zu kennzeichnen.Click on a molecule to assign it as a productîƒTAsparaginsäureAspartic acidððTGewählte Datei kann nicht geöffnet werden. Cannot open the specified file.÷ÁîSymbol einfügenInsert symbol÷òl8Biochemische ZeichenwerkeugeBiochemical drawing tools{FKubische Bezierkurve - halber PfeilCubic bezier - half arrowx'"Bild gespeichert Saved picture file ÐDrehung um 180°Rotate 180 degrees‘ AlaninAlanine(PMit dem Auswahl-Werkzeug können Sie Informationen über ein Molekül abfragen, indem Sie mit 'Strg'+'linkeMaustaste' das Molekül markieren.VWhen in select mode, press Ctrl+LeftButton on a molecule to get molecule information.HQnDie Option 'Molekül bereinigen' kann dazu benutzt werden, die Struktur vor allem großer Moleküle zu verfeinern und zu optimieren.wThe option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules.\áJProblem während des Schreibvorganges.Problem while writing the filek)e¤Molekül kann nicht konvertiert werden.Konvertierung fehlgeschlagen in ioiface.cpp.>Cannot convert the molecule. Conversion failed in ioiface.cppl·&Cyclohexan (Sessel)Cyclohexane (chair)€É8Verkleinert den Zoom-Faktor.Click this button to zoom out.‚GžAsparagin AsparagineƒV%,[*] Cyclohexan (flach)[*] Cyclohexane (flat)‰¹"Cyclohexan (Boot)Cyclohexane (boat)Š¿I0Normale Bindung zeichnen Draw line—eÅHRinge und andere Strukturen einfügen Draw ring—ÅÇ BenzenBenzeneÆ Threonin ThreonineƵ8&Alle Gruppierungen aufhebenClear all &groupsÇiÓ:Cyclohexan - Bootkonformation Cyclohexane - boat conformationËÉÞArginin ArginineàLÅÊUnspezifische Bindung<br><br>Damit zeichnen Sie eine unspezifische Stereobindung (z.B. für Racemate).YWavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on the button.í$.[*] Benzen [*] BenzeneùõPfeileditorCurved Arrow editorûXÒàKlicken Sie auf ein Molekül, um den wahrscheinlichen Octanol-Wasser-Verteilungskoeffizienten berechnen zu lassen=Click on a molecule to calculate its octanol-water partition VNJ~1600 (schmal), aromatischer Ring C=C"~1600 (narrow), aromatic ring C=C %}490° entgegen Uhrzeigersinn90 degree counterclockwise 2v¥6270° entgegen Uhrzeigersinn270 degree counterclockwise 2…6180° entgegen Uhrzeigersinn180 degree counterclockwise 2†UFüllfarbe...Fill color... 4·î"Molekülgewicht = Molecular weight =  9¤°"Newman-ProjektionNewman projection symbol ?¬ÜXAliphatische Kette zeichnen - Kettenlänge = !Draw aliphatic chain - Length =  KøàêWenn Sie eine Bindung gezeichnet haben, können Sie mit 'rechteMaustaste' auf die Bindung den Bindungseditor aufrufen.OWhen drawing bonds, you can edit the bond style by right-clicking on the bond. TànPfeil zeichnen Draw arrow l!ç"XDC Einstellungen XDC Settings r±sNAuswahl<br><br>Damit markieren und verschieben Sie Elemente innerhalb der Box.<br><br>Sie können auch mehrere Elemente ausschneiden, kopieren, verschieben oder drehen.˜Select tool

    Use the Select tool to select and move items inside a box.

    You can select multiple items and cut, copy, move and rotate them. vÉ.6Breite einer Doppelbindung:Double bond spacing: „ÀÚlAuswahl-Modus: 'linkeMaustaste' auf Objekt zum Bewegen*Select mode: left click on object to move †¦µKlammerBracket ‡¡„(MDL Moldatei (*.mol)MDL molfile (*.mol) —vÙ*Symbole<br><br>Damit fügen Sie Symbole ein.<br><br>Wenn Sie die Schaltfläche gedrückt halten, erscheint eine Auswahlliste mit verschiedenen Symbolen.~Symbol tool

    Use the Symbol tool to insert symbols.

    Click and hold to select from a picture menu of symbols.
     ™mŽ&Peaks des Eduktes: Peaks of reactant:  ™ùš.Produkt(e) = %1 kJ/mol Products = %1 kJ/mol  ZjAuto &Layout Auto &layout ¤WäDatei öffnen... Open file... ¤Án0Vorausberechnetes 1H-NMRPredicted 1H-NMR ¦Òò&~1700 (schmal), C=O~1700 (narrow), C=O ¼îÏT13 (a-Carbonyl zwischen zwei Estergruppen)!13 (a-carbon between two esters) ½ó)D-Fructose D-fructose ¾åEžKlicken Sie auf ein Molekül, um es als benutzerdefinierte Struktur zu speichern0Click on a molecule to save it as a custom ring ÂäSie können eine Klammer mit einem Index versehen, indem Sie das Text-Werkzeug auswählen und die Klammer anklicken.bYou can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. ÉK^jÄnderung kann nicht rückgängig gemacht werden, sorry!Cannot undo, sorry! äžq(PubChem-Verbindung: PubChem compound:  æJ`˜Klicken Sie auf ein Molekül, um sich dessen SMILES-String ausgeben zu lassen3Click on a molecule to determine its SMILES string óÑ×"BenutzerdefiniertCustom paper size úCÕZReaktionsenthalpie in der Gasphase abschätzen$Estimate gas-phase enthalphy change )•ElektronenpaarElectron pair ,ÍÒTransparent Transparent 3L~1350-1300, S=O (~1050 bei R-(S=O)-R')&~1350-1300, S=O (~1050 if R-(S=O)-R') 4|ù0Hinter&grundfarbe setzenSet background &color 9Ò &Alles auswählen Select &All ;fœ~Klicken Sie auf ein Molekül, um die 3D-Koordinaten zu erstellen0Click on a molecule to generate 3-D coordinates RíÃlGekrümmter Pfeil<br><br>Damit fügen Sie einen gekrümmten Pfeil ein.<br><br>Wenn Sie die Schaltfläche gedrückt halten, erscheint eine Auswahlliste mit verschiedenen gekrümmten Pfeile.‹Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows.

    Click and hold to select from a picture menu of arrows. j¤^[*] Cycloheptan[*] Cycloheptane múå(Funktionelle GruppenUseful groups t·Ã˜Klicken Sie auf ein Molekül, um den wahrscheinlichen pKs berechnen zu lassen,Click on a molecule to calculate its pKa(s) wˆ¹TFehler beim Vergleich der 13C-NMR-Spektren13C NMR compare error {áò Klicken Sie auf ein Molekül, um eine mögliche Retrosysnthese erstellen zu lassen0Click on a molecule for possible retrosynthesis }Ò“°Lasso<br><br>Damit markieren und verschieben Sie Elemente innerhalb der Box, indem Sie den Auswahl-Bereich freihändig zeichnen.<br><br>Sie können auch mehrere Elemente ausschneiden, kopieren, verschieben oder drehen.§Lasso tool

    Use the Lasso tool to select and move items by drawing a loop around them.

    You can select multiple items and cut, copy, move and rotate them. ’n„Klicken Sie auf ein Molekül, um eine Elementaranalyse zu erstellen8Click on a molecule to calculate its elemental analysis ü#&PubChem-Verbindung:PubChem compound: ždªDreieck Rectangle ¨• StatinStatine ¨°@11 (aliphatisches primäres Amin)11 (Aliphatic primary amine) ­yHistidin Histidine ¯áENaphthalen Naphthalene ´®µStandardDefault ¼ŒtGraddegrees ¾‹£, Intensität  , intensity  ¿@Cyclohexane - Sesselkonformation!Cyclohexane - chair conformation Å‹î&Support &Support Çt$*1-3 (Purin/Pyrimidin)1-3 (purine/pyrimidine) ʇÙ`Bitte geben Sie den Index für diese Klammer ein:4Please type or edit the subscript for this bracket: Í”Ê[*] Cyclobutan[*] Cyclobutane Ö¥&GleichgewichtspfeilSplit two-way arrow ÛÔǦÖffnet eine bestehende Datei.<br><br>Entspricht dem Menüpunkt Öffnen im Datei-Menü.bClick this button to open a file.

    You can also select the Open command from the File menu. 棾 Schneidet den markierten Bereich aus.<br><br>Entspricht dem Menüpunkt Ausschneiden im Bearbeiten-Menü. Tastenkombination: 'Strg'+'X'.vClick this button to cut a selection.

    You can also select the Cut command from the Edit menu, or press Ctrl+X. 죞vRadierer-Modus: 'linkeMaustaste' zum Löschen eines Objektes'Erase mode: left click to erase object û Ä(Berechne IR-Spektrum Predict IR ÿRDatei-MenüFile Operations ÿï“ ThyminThymine @@Text unterstreichen ('Strg'+'U')!Underline selected text (Ctrl+U) I©[*] Cyclooctan[*] Cyclooctane ¥Negative LadungNegative charge Ð0Datei speichern unter...Save file as... Ø®D9-10 (ungesättigtes primäres Amin)9-10 (Alkene-primary amine) &õ‰~Klicken Sie auf ein Molekül, um seine Summenformel zu ermitteln7Click on a molecule to calculate its empirical formula ,1gestrichelt Dashed line -§¥FAnfrage an Datenbank fehlgeschlagenDatabase query failed 5ô*&XDC Einstellungen...&XDC settings... 58.Hand&buch&Manual 8[\ÆDruckt die Datei, die Sie gerade bearbeiten.<br><br>Entspricht dem Menüpunkt Drucken im Datei-Menü.vClick this button to print the file you are editing.

    You can also select the Print command from the File menu. 9¨ž(Feste Bindungslänge:Bond fixed length: <ª6Bindung einfügen - Länge = Draw Line - Length =  P”p Edukt Reactant z£ÔReaktion Reaction z«Þ–Pfeil-Modus: 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum Editieren*Draw Arrow mode: left click to draw arrow }Þ7fBerechnung der Reaktionsenthalpie in der Gasphase: &Estimated gas-phase enthalpy change:  ‚² 8Berechnetes 13C-NMR-SpektrumPredicted 13C-NMR ‰@²„Klicken Sie auf ein Molekül, um sein Molekülgewicht zu kalkulieren6Click on a molecule to calculate its molecular weight “ñ$&Drehen&Rotate –¨…@Text hochstellen ('Strg'+'Plus')&Superscript selected text (Ctrl-Plus) š>9„Abgeschätzter Octanol-Wasser-Verteilungskoeffizient (log Kow) = %1:Estimated octanol-water partition constant (log Kow) = %1 ºBa8Newman-Projektion - verdecktNewman projection - eclipsed ¼”hTemplate-Modus: 'linkeMaustaste' zum Einfügen von %1%Draw Ring mode: left click to add %1 Å”á<&Pfeil - Länge und Winkel fest &Arrow - Fixed length and angle ÒhuSeitenhöhe: Page height: Ø0Berechne 1H-NMR-SpektrumPredict 1H NMR àÎ2,SMILES-String eingebenEnter SMILES string ãB(~1525 (schmal), -NO2~1525 (narrow), -NO2 ð0²(Datei überschreiben?Overwrite file? ò$ïnBenutzerdefinierte Struktur der Auswahlliste hinzufügenAdd custom ring to menu list øV„NSMILES-String für das gewählte Molekül:%SMILES string for selected molecule: ûUjDatei öffnen Open file šEFIdentifikator der Bindung bestimmenGet bond identifier \b$Objekt-InformationObject information èž@Dialog beim Start nicht anzeigen"Don't show this dialog at startup %vpEllipseEllipse 3ÕTest-ModusTool test mode 9ZÕ&PubChem durchsuchenSearch PubChem >}$~3000 (breit), C-H~3000 (broad), C-H A„H$~2550 (breit), S-H~2550 (broad), S-H BIHšKlammer-Modus: 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum Editieren.Draw Bracket mode: left click to draw bracket TŒd -1 (Sulfonsäure)-1 (sulfonic acid) W9.stereospezifisch hinten Stereo-down Y^"Schriftart wählen Set Font dÑÄ2Stereospezifisches H-AtomStereochemical ring hydrogen f¾Schrifart Set font fÑÄ&Lineal Schrift &Ruler font mjt$ReaktionsenthalpieEnthalpy change v5Datei speichern Save file v—¥$RetrosynthesepfeilRetrosynthetic arrow >*stereospezifisch vorn Stereo-up Œ^`Positive LadungPositive charge •ÓÅ&Referenzen &References ¡ÂSchriftgrößeSet font size ¢&Schriftgröße wählenSet Font Size £îGlutamin Glutamine ¨ru$4 (tertiäres Amin)4 (tertiary amine) Η Vorheriger Next tip ö€@4Produkt ist blau markiert.Blue is product ÷ä.Edukt ist rot markiert.Red is reactant ©d²Gerader Pfeil<br><br>Damit fügen Sie einen geraden Pfeil ein.<br><br>Wenn Sie die Schaltfläche gedrückt halten, erscheint eine Auswahlliste mit verschiedenen geraden Pfeilen (Reaktionspfeil, Gleichgewichtspfeil, ...).¤Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click to draw a straight arrow.

    Click and hold to pick from a list of available arrows. >þMit dem Auswahl-Werkzeug können Sie ein ganzes Molekül selektieren, indem Sie mit 'Shift'+'linkeMaustaste' einen Teil des Moleküls markieren.lWhen in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. ²^B10 (aliphatisches tertiäres Amin)10 (aliphatic tertiary amine) [iF16 (-OH an der aliphatischen Kette)16 (Aliphatic -OH) ç‰DXDC - natives XDrawChem Format (*)"XDC - XDrawChem native format (*) ÉÙÈAuswahl-Modus: 'linkeMaustaste' auf Objekt zum Bewegen, 'rechteMaustaste' auf Objekt zum Bearbeiten.ISelect mode: left click on object to move, right click on object to edit 7ݤ"Klammern einfügen Draw bracket ?(¤B2 Peaks: ~3400, ~3300, primär N-H%two peaks: ~3400, ~3300, primary N-H A÷ÈJ10.6 (-SH an der aliphatischen Kette)10.6 (Aliphatic -SH) MàI¤Es gibt offenbar keine Stellen in diesem Molekül mit einem pKs zwischen -1 und 15.6There seem to be no sites with pKa between -1 and 15. VžZStereospezifische Bindung nach vorne zeichnenDraw stereo-up line gå&FormatForma&t i3”SummenformelFormula iLaVorwärtsForward iØÄ&Vorwärts &Forward iÚ$Geschätze pKsEstimated pKa's xÕó6Aliphatische Kette zeichnenDraw aliphatic chain Ž ®¸Bindungs-Modus (gestrichelt): 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum EditierenDDraw Dashed Line mode: left click to draw line, right click to edit ©¤”"Kopiert den markierten Bereich in die Zwischenablage.<br><br>Entspricht dem Menüpunkt Kopieren im Bearbeiten-Menü. Tastenkombination: 'Strg'+'C'.xClick this button to copy a selection.

    You can also select the Copy command from the Edit menu, or press Ctrl+C. ¬/>8Struktur via Internet findenFind structure via Internet ¯®äSymboleditorSymbol editor º Ò(Reaktion = %1 kJ/molReaction = %1 kJ/mol ºáŒ$~3400 (breit), O-H~3400 (broad), O-H ¾XH°Bindungs-Modus (einfach): 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum Editieren=Draw Line mode: left click to draw line, right click to edit Æñt,&Wussten Sie schon...?&Did You Know? È(o,Wussten Sie schon ...?Did You Know? È6tSie müssen mindestens ein Edukt und ein Produkt auswählen.7You must select at least one reactant and one product. ЕN"zweifach/dreifachDouble/triple Ô•eÞTemplates<br><br>Damit fügen Sie fertige Ringe und Strukturen ein.<br><br>Wenn Sie die Schaltfläche anklicken, erscheint ein Auswahldialog mit verschiedenen Ringen und Strukturen.<br><br>Wenn Sie die Schaltfläche gedrückt halten, erscheint eine Auswahlliste mit verschiedenen Ringen und Strukturen.<br>Anweisungen zum Modifizieren dieses Menüs finden Sie im Handbuch.7Ring tool

    Use the Ring tool to insert ready-made rings and structures.

    Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.

    Click and hold to select from a picture menu of select rings.
    (See manual for more info on modifying this menu) Ý,‰ÌBindungs-Modus (stereospez. nach vorn): 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum EditierenGDraw Stereo-Up Line mode: left click to draw line, right click to edit ã`tR9 (a-Carbonyl zwischen zwei Ketongruppen)!9 (a-carbon between two ketones) çÓùT11 (a-Carbonyl zwischen zwei Ketongruppen)"11 (a-carbon between two ketones) çäy[*] BOC[*] BOC ÿGcdEingabe der Peptid-Sequenz - Drei-Buchstaben-Code:5Enter peptide sequence - three-letter abbreviations:Í ChemikaliennameChemical name yå Peptid-BaukastenPeptide BuilderÛB*Verbinde mit NetzwerkAccessing network;FKubische Bezierkurve - voller PfeilCubic bezier - full arrowL'œAuswahl-Modus: 'linkeMaustaste' zum Bewegen, 'rechteMaustaste' zum Bearbeiten.5Select mode: left click to move, right click to edit1?\Stereospezifische Bindung nach hinten zeichnenDraw stereo-down line2ôe.SMILES-String eingeben:Enter SMILES string:4 D-Glucose D-glucose;ᥠGlycinGlycine? LExistierende Datei überschreiben: %1 ?Overwrite existing file: %1 ?BŒ6Vorschlag für RetrosyntheseReverse reactionseR#Füllfarbe Fill colorn“BKlicken Sie auf ein Molekül, um sein 1H-NMR-Spektrum berechnen zu lassen,Click on a molecule to calculate its 1H NMR}ÂBindungsbreite:Bond thickness:ƒ-úModellieren... Shape...††žRasterbreite Grid spacingj7Text zentrierenCenter selected textŸÖ´ GuaninGuanine¸P&Einstellungen&Drawing settings...¿VN Höhe:Height:¿ß:KlammereditorBracket editorÁ’xKlicken Sie auf ein Molekül, um es als Edukt zu kennzeichnen/Click on a molecule to assign it as a reactantÉ)ÔöXDrawChem kann Aminosäuren automatisch vom N-Terminus zum C-Terminus anhängen. Das Resultat ist jedoch nicht immer schön :)tXDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :)äôù~1690-1640, C=N~1690-1640, C=NíÄÎ`Konnte nicht in InChI-String konvertiert werden.#Could not convert to InChI string.ñ2Î4Fehler: IOIface Data errorIOIface Data errorûͲMethionin MethioninetåxDie folgenden Reaktionen könnten zu diesem Produkt führen: ?The following reactions could have resulted in this product: Õ ºBindungs-Modus (unspezifisch): 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum EditierenBDraw Wavy Line mode: left click to draw line, right click to edit,ÓÄD11 (aliphatisches sekundäres Amin)11 (aliphatic secondary amine);0 [*] EDANS [*] EDANSIÙÃR3 (aliphatische Carbonsäure, a-Halogenid)(3 (Aliphatic carboxylic acid, a-halide)\õi|Gestrichelte Linie<br><br>Damit zeichnen Sie gestrichelte Linien oder Bindungen. Wenden Sie diese Werkzeug auf bereits bestehende Bindungen an, um Resonanz, Bindungsbruch, u.ä. darzustellen.”Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.).ee^"Benutzerdefiniert User-defineduA„„Klicken Sie auf ein Molekül, um den Bindungs-Identifier anzuzeigen3Click on a molecule to display its bond identifier6¢Anthracen Anthraceneƒå6Vergrößert den Zoom-Faktor.Click this button to zoom in.ˆ¾$[*] Cyclopentadien[*] Cyclopentadiene“Úµ$Rotation &vertikalFlip &vertical˜ÐlHCDXML - ChemDraw Text/XML Format (*)%CDXML - ChemDraw text/XML format (*)š®¹Exakte SucheExact matches only¡˜¹Imidazol Imidazole©f2Kann nicht zugreifen auf Could not write to ­#ÐSMILES-StringSMILES stringµ†G¦Ketten-Modus: 'linkeMaustaste' gedrückt halten, bis gewünschte Kettenlänge erreicht=Draw Chain mode: left click and drag to draw aliphatic chainÐ~6Berechnetes 1H-NMR-Spektrum Predicted IRÓÞÎAktuelle Informationen zu XDrawChem befinden sich immer unter http://xdrawchem.sourceforge.net/ Hier gibt es den aktuellsten Release und Links zu den Mailing-Listen und dem Bug-Tracker. Bitte teilen Sie gefundene Fehler (Bugs) über den SourceForge-Tracker: http://www.sourceforge.net/tracker/?group_id=34518 mit. Es gibt 2 Mailing-Listen: xdrawchem-announce - Ankündigung neuer Veröffentlichungen xdrawchem-user - offene Diskussion unter den Anwendern von XDrawChem Sie können sich eintragen, indem Sie eine leere E-Mail mit dem Betreff: 'subscribe' an 'xdrawchem-announce-request@lists.sourceforge.net' oder 'xdrawchem-user-request@lists.sourceforge.net' senden. Den Autor können Sie direkt erreichen unter: bherger@users.sourceforge.net£Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.netؽt2Berechne 13C-NMR-SpektrumPredict 13C NMRÚÄ’Suchtyp: Search type:áŽOrientierung: Orientation:âJ4Schätze Säurekonstante pKs Predict pKaò±[*] FMOC [*] FMOCôµãD6.8 (konjugiertes sekundäres Amin)!6.8 (conjugated secondary amine)÷å9xdrawchem-v1.11.0/ring/xdrawchem_en.qm000066400000000000000000000005211371466245600177200ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝBi/2—xdrawchem-v1.11.0/ring/xdrawchem_es.qm000066400000000000000000000005211371466245600177250ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝBi/2—xdrawchem-v1.11.0/ring/xdrawchem_fr.qm000066400000000000000000000124521371466245600177330ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝBðJĴǦy2§ÔIŒb*¦y}*»–*Ð%¯*ÓÊ*ì0ç+f¾ü+˜Å+į8J+‚SJ6•nLˆ•‡VŠ¥ G·­õBî %/ZanqÎU©‘í~ä“©äª6•Z´Iêq¶Š¥”·T­¹YBÊ>ì Ì`H[Qc[scÂ^›x˜ \R˜I¼s˜I¼˜I¼Ë˜I¼ó˜I¼!Ïb®:'-ÃW`N’ˆc·%§mf3Ò›ˆ˜éœ+¤œ+¤BÁ¹*eÖ¥:ÀøîãöJ.Ç>…c/÷–HO´Á|¬ü¿W. å±Ì TÙ´ ‘ À—eÅ å—ÅÇ l!ç 3 l[~ \ ¤Wä  ;fœ ¼ ÿR ë 2í³ 8[\ C –¨… \ ±ä y šE À « ç dÑÄ  fÑÄ 3 v—¥ ^ ¢ £î Î ?(¤ gå 8 i3” s iLa Œ ¯®ä ¥ yå ú-Ñ„2—„X2ôe«°•ê˜Ðl%¡˜¹^Ê\Š­ÍûUÖÚÄ’!áŽPi CouperJÄ&Nouveau´Ç Copier¦yCou&per§Ô&QuitterŒ&Copier*¦y&Editer*»&Fichier*Ð%&Basculer*Ó &Aide*ì0&Ouvrir+f¾&Enregistrer+˜Å&Annuler+į&EffacerJ+‚&FermerJ6•EffacerLˆ• CollerVŠ¥,Dessiner flèche courbeG6Choisir la &couleur du fond­õB4Dessiner ligne pointilliée %0Calcul formule empiriqueZa0Rotation 90° antihoraireqÎU&Enregistrer sous...‘í~:Texte sélectionné en exposant“©ä Fermerª6•Angle fixe :´Iê&Coller¶Š¥&Imprimer·T6Spécifier couleur de dessin¹YB2Basculer &horizontalement>ì,&Chercher via InternetÌ`8Spécifier épaisseur du trait[Qc8Spécifier épaisseur du trait[scBSpécifier longueur et angle fixes^›xOutil cycle˜ \Annuler FixedDialog˜I¼AnnulerNetChooseDialog˜I¼Annuler NetDialog˜I¼AnnulerPageSetupDialog˜I¼Annuler˜I¼& Next >>Ïb®&Analyse élémentaire'-ÃCAS Number`N’ Imprimer fichierc·% Outilsmf3Rechercher›ˆ˜SélectionnerApplicationWindowœ+¤Sélectionnerœ+¤PChoisissez une structure dans la liste :Á¹*Rechercher :Ö¥:@Texte sélectionné en <b>gras</b>øî*Serveur de base XDC :öJ(Rotation 90° horaireÇ>… Mise en pa&ge.../÷0Dessiner ou éditer texteHO´Mise en page|¬*Exporter une image...¿W. Dessiner symboleå±Ì6Texte sélectionné en indiceÙ´Rotation 180°‘Dessiner ligne—eÅDessiner cycle—ÅÇDessiner flèche l!ç&A propos... l[~2Mise en place automatique ¤Wä$Tout &sélectionner ;fœ*Prédiction Infrarouge ÿR<< &Previous 2í³&Manuel 8[\&Rotation –¨…<Souligner le texte sélectionné ±äOuvrir fichier šE&Références « Spécifier police dÑÄ Spécifier police fÑÄ&Enregistrer fichier v—¥4Spécifier taille de police ¢4Spécifier taille de police £î Dessiner crochet ?(¤0Dessiner ligne stereo-up gåForma&t i3”Formule iLaJRechercher une structure via Internet ¯®äNom chimique yå0Calcul masse moléculaire-Ñ„HTexte sélectionné en <i>italique</i>2—„4Dessiner ligne stereo-down2ôe0Longueur et &angle fixes°•.Basculer &verticalement˜ÐlDCorrespondances exactes uniquement¡˜¹Longueur fixe :Ê\Š@&Choisir longueur et angle fixesÍûU$Prédiction RMN C13ÚÄ’&Type de recherche :áŽ/š— "(.PageSetupDialogApplicationWindowXManualNetChooseDialog RingDialog NetDialog FixedDialogxdrawchem-v1.11.0/ring/xdrawchem_it.qm000066400000000000000000001724461371466245600177520ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝB ;#þFxi*ߌIh¼JÄì´ÇŒ¯E–D†¦yµ§Ôà»ì0Bö5mÏšŒÇØÙð‹t!å@R r¥*¦y *»9*Ð%m*Ó™*ì0Ë*ö5ù+f¾)+”ƒU+˜Åš+įÈ,]ú1†é*:0Õ?±gºAîF|ÅiH™gÌJ+‚ J6• NJcb |Lˆ• ªLÚå ÜVŠ¥ &WT VXýô „Yã ²\K ànÁl „¼Ã G‡æ ŠÖ· èG <–›… ”ª¼õ ɲjt þ¶œõ M¹_ù ‚ÁèÞ ðÅQ•ªÙôîÝ´Gè°ñÐþÉõ)ãËýmŠhÄr üâ Ü,1 Ÿ{¿N$•Uzµ(QN /ßãÉ=c?#zGÉdÅjÑ„(ˆRJpº„eÉæu-ñ’>Ó %bØþÃ(€’*%[/úÕœ4òéid³8n‘tiqÎUg† Nð‘í~!²™6Ô!ö§–Ä"Cª6•"†®–À"·¶Š¥"è·T#¹YB#LÀ×#´Ë $Ì05$7Ζ%$yä×$´ëw£%ð‡Î%W,ù&ï9Å%'w:Rµ'¸<:Õ(¾>ì) Nºä)h^Æ”)²^è))þ{ØÒ*‹ˆË½*ò‹¹M+:¬Èn+…·² -Y½‰Ä.½¸.ŠÀnY.áÃÖà/‰ʼ“/÷Ì`0=Õl 0Ø„ó0Êò†¥1Gô T1Æ I2 Iñ2´+|£3&0–J3k=yµ3¿=¿z4#B¶ž4R$þ5Ë[Qc7W[sc7Ä^›x81hžW8¨s«ž8û{0¹:oŽg®:ð˜ \;X˜I¼;ž§Ý>;϶¹%<í¹Êå=Á,¾=XƸÞ>aÆå`>ÑÚš‘? ÝY©?èÞº#@Aà—pEäáDIF!¶%GþßòH-³€H@ tHà@ EI9O€ÔIhP~DIÀ`N’J c·%JMmf3JŠ|EJÁ–•Jð–jK!›ˆ˜Ktœ+¤K¡œÞKÖœEM>œ©Mm´M¾ N%N@¦uNq«Ø“N­¬ŠNà°9\O°µtOV±bO“¶ögOü¹%PœÁ¹*PËÅ jQMÈ0EQ|ÈyüQ«Ö^uQÜÖ¥:R÷Œ^RLø(>RâøASÂú”IT¥TÂéÎUN"U©G…V ^?VìöJWL¦åW«MÂX5+¯eXì5ŽÀYG5þWY‰X•žYìkºåZ:lN€Z³x?Þ[‰x [l–±[¦›ƒt[î¥vŠ\%¶À\‚·éÂ\ÉĘž]qľ¬]²Å/õ^µÇ>…_=äL_·ñv`Lôob ôþbW|b“žÃbé"5c!È:c}-ÊcÇ/÷d35êdbHO´dÖVÑe2pì3e¼|¬eé‰ÇÊf6_ºfŠ•»ôfÓ–0g¢Üg9¢ògn¬Pg¦³Ô~gعP4h¿W.hÖÐæi$Ñ©>icÑøk%ÖÐ.k}å±ÌmÿîƒTnEððnû÷ÁîoCx'oÍÐp=‘p™(PpìHQnq\árbk)et l·t†€ÉujƒV%u¾‰¹uùŠ¿IvZ—eÅv­—ÅÇvíÆ w/ƵwaÇiÓw—ËÉÞwõàLÅxuí$.xªùõzûXÒzW VNz¹ 2v¥{¨ 2…| 2†U|‰ 9¤°|û ?¬Ü}O Køà}¼ Tàn~G l!ç¼ vÉ.€ „ÀÚ‚! †¦µ‚Š ‡¡„ƒf ™mŽƒ¶ ™ùš…x Zj…Ò ¤Wä†. ¤Án†‡ ¦Òò†È ¾åE‡) ‡f ÉK^ˆ6 äžq‰¼ óÑ׊ úCÕŠç )•‹_ ,ÍÒ‹õ 3ŒI 9ÒŒ‡ ;fœŒ÷ RíÃ? j¤^Ž múåî t·Ã9 wˆ¹{ {áò‘/ }Ò“‘™ ’n’; ü#”j ¨°•B ¯áE•t ´®µ•ª ¼Œt•ä ¾‹£– ¿–L ŋ Çt$— ͔ʗC Ö¥—ý ÛÔǘG 棾˜¯ 죞š û Ä›Í ÿRœ¼ ÿï“ @_ I© ¥ž Оd Ø®ž® ,1žþ -§¥ŸÑ 5ô  58. • 8[\ ú 9¨ž¡. <ª¢Þ P”p£I z£Ô£³ z«Þ£è }Þ7¤ ‚² ¥ ‰@²¥¿ “ñ$¦! –¨…¦ñ š>9§! ºBa§¿ ¼”¨‘ Ŕ᩠Òhu©õ تw àÎ2ªÈ ãB«' ò$ï« øV„«Ï ûUj¬l šE­ èž­; %vp­¦ 3Õ®. 9ZÕ®` TŒd®¹ Y^¯Å dÑİ f¾°^ fÑÄ°Û mjt±8 v5±˜ v—¥±ð >²* Œ^`²‡ •ÓŲ¿ ¡Â³ ¢³I £î³É ¨ru´I ö€@´ ÷ä´Ô ©dµ* >þµf ²^·Æ ÉÙ¹Z 7ݤ¹Ü ?(¤»= Vž»ˆ gå¼L i3”¼ª iLa¼à iØÄ½ iÚ$½B xÕó½u Ž ®½· ©¤”¾ ¬/>¿Š ¯®äÁB º ÒÁ¸ ºáŒÂ ÆñtÂ_ È(oð È6Ã÷ ЕNÄ; Ô•eÅ Ý,‰ÅH ã`tÉ¿Í Ë. yåËÿÛBÌAL'Ì™1?Í 2ôeÎ64 Θ;á¥Ï? Ï;eR#Ïm}ÂÏ«ƒ-úÐ_j7ÐÉŸÖ´Ñ"¸Pщ¿VNÑ»Á’Ò$É)ÔÒ{äôùÓ2ûͲԮtåÕ ,ÓÄÕB;0 Öªee^×uA„Ùi6¢Ù®ƒåÚs“ÚµÚ¬˜ÐlÛš®¹ÛY¡˜¹Ûä©fÜG­#Ðܵ†GÜßÐ~Ý%ÓÞÞfؽtÞ¹ÚÄ’å¾áŽæâJægò±æ¨iæìOKOK;cmcmininþpxpxx&Procede&Go*ßRiquadroBoxIh TagliaCutJÄ &Nuovo&New´Ç &Informazioni suAutoŒ¯ legamiBond–D CopiaCopy¦y&TagliaCu&t§Ô&ModificaEdit» AiutoHelpì0 InizioHomeö5 IndoloInfoÏEsciQuitŒOndulatoWavyØÙsferettabead‹t&Documento caricato Loaded document å@:Confronta gli spettri NMR C13Compare 13C NMR r &Copia&Copy*¦y&Modifica&Edit*» &File&File*Ð%&Inverti&Flip*Ó &Aiuto&Help*ì0&Inizio&Home*ö5 &Apri&Open+f¾640x480 pixel640x480 pixels+”ƒ &Salva&Save+˜Å&Annulla&Undo+į&Inizio&Zoom,]&Legale (8.5" x 14")Legal (8.5" x 14")1†éPirimidina Pyrimidine:0ÕFreccia normale Plain arrow?±gìLunghezza di legame, angolo di legame, ed unità sono impostate nell'opzione Impostazioni del Disegno nel menù Formato.aBond length, bond angle, and units are set in the Drawing Settings option under the Format menu.Aî4Impossibile aprire il fileCouldn't open fileF|Å.Freccia di non reazioneArrowH™gCancellaClearJ+‚ ChiudiCloseJ6• ColoreColorJcbCancellaEraseLˆ•CiclopentadieneCyclopentadieneLÚåIncollaPasteVŠ¥ StampaPrintWT AnelliRightXýô AnelliRingsYãAnnulla!Undo!\KBifenile BiphenylnÁl Inserisce SMILES Input SMILES„¼Ã*Strutture PredefiniteCanned Structures‡æ*Freccia bidirezionaleTwo-way arrowŠÖ·*Disegna freccia curvaDraw curved arrowGTirosina Tyrosine–›…Cisteina Cysteineª¼õ&Ancora alla griglia Snap to grid²jtCitosina Cytosine¶œõ:--Selezionare un filtro-- (*)--Select a filter-- (*)¹_ùpNessuna molecola del database soddisfa l'interrogazione..No molecules in the database match the query.ÁèÞDesossiribosio DeoxyriboseÅQ•,Seleziona il &ReagenteSelect &ReactantÙôAcidi nucleiciNucleic acidsÝ´Analisi =  Analysis = è°dÈ possibile alternare la visualizzazione della griglia premendo Ctrl+G.Il fatto che la visualizzazione sia attivata o meno, non influenza l'ancoraggio degli oggetti alla griglia.‚You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid.ñÐþCos'è &Questo What's &Thisõ)ã6Angolo di legame impostato:Bond fixed angle:ýmŠ8Reagente o prodotto mancanteMissing reactant or producthÄ"Mostra la grigliaShow square grid ü &Seleziona Tutto&Deselect All Ü,ºModalità disegna freccia, fare click con il tasto sinistro del mouse per disegnare la freccia.Lasso mode: left click and hold to draw lasso Ÿ~Selezionare solamente un reagente ed un prodotto da confrontare<br>Usare lo strumento "Linea" per disegnare i legami.Per creare i legami doppi e tripli disegnare sopra i legami esistenti.oLine tool

    Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds.(QNAmminoacidi Amino acids/ßãModalità disegna linea stereo-giù: fare click con il tasto sinistro del mouse per disegnare la linea, con quello destro per modificarlaIDraw Stereo-Down Line mode: left click to draw line, right click to edit=c Parentesi quadreSquare bracket?#6Esporta l'elenco dei picchiExport Peak ListGÉdAcido glutamicoGlutamic acidjÑ„*Picchi del prodotto: Peaks of product: ˆRJ0Carica positiva parzialePartial positive chargeº„edFare click su una molecola per calcolare il suo IR&Click on a molecule to guess its nameæuRImpossibile scrivere il file specificato.!Cannot write the specified file.ñ’>4Disegna linea tratteggiataDraw dashed line %,Larghezza della carta: Please wait.ØþBezier cubica Cubic bezier(€’Ciclopentano Cyclopentane*% [*] Ciclopentano[*] Cyclopentane/úÕ&Editor delle frecce Arrow editor4ò legami bondsid³¸Modalità testo: fare click con il tasto sinistro del mouse per aggiungere o modificare testo*Text mode: left click to add or edit textn‘tJRuota di 90 gradi in senso antiorario#Rotate 90 degrees counterclockwiseqÎU*Fare click su questo pulsante per salvare il file che si sta modificando.<br><br>Si può anche selezionare il comando "Salva" dal menù "File."<br><br>|Click this button to save the file you are editing.

    You can also select the Save command from the File menu.

    † NSa&lva come... Save &as...‘í~$Attiva la &griglia Toggle &grid™6Ô &Informazioni su&About§–Ä&Chiudi&Closeª6•&Gruppo&Group®–À&Incolla&Paste¶Š¥Stam&pa&Print·T:Imposta il colore del disegnoSet drawing color¹YB(Freccia tratteggiata Dashed arrowÀ×LeucinaLeucineË FenilalaninaPhenylalanineÌ05Isoleucina IsoleucineΖ%2Editor delle frecce curve Curved Arrowä×1024x768 pixel1024x768 pixelsëw£Strumento Linea Stereo Giù<br><br>Usare lo strumento "Linea Stereo Giù" per disegnare linee stereo verso il basso,come mostrato sul pulsante.bStereo Down Line tool

    Use the Line tool to draw stereo-down lines, as shown on the button.ð‡ÎNSteroide (modello ad anelli condensati)Steroid (fused ring template),ùCiclopropano Cyclopropane9Å%¼Fare click con il tasto sinistro del mouse per disegnare un modello della proiezione di Newman.Left-click to draw Newman projection template:Rµ [*] Ciclopropano[*] Cyclopropane<:Õ0Inverti &orizzontalmenteFlip &horizontal>ì Parentesi quadreCurly bracketNºä Immettere pediceEnter subscript^Æ”LProiezione di Newman - sfalsata (anti)%Newman projection - staggered (anti)^è)6Errore nel confronto NMR 1H1H NMR compare error{ØÒspettro NMR 1H1H NMR spectrumˆË½Spettro NMR C1313C NMR spectrum‹¹M.Vari modelli di anelli e molecole sono disponibili tramite lo strumento "Anello", che comprende anelli signoli e condensati, amminoacidi, e nucleosidi.ŠA number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides.¬ÈnhRende il testo selezionato <b>maiuscolo</b> (Ctrl+B)(Make selected text bold (Ctrl+B)·² NAllinea a sinistra il testo selezionatoLeft-justify selected text½‰Ä.Suggerimento precedente Previous tip½¸dRende il testo selezionato <i>Corsivo</i> (Ctrl+I)(Italicize selected text (Ctrl+I)ÀnY8Impossibile aprire il file: Could not open the file: ÃÖàCalcola SMILESOutput SMILESʼ“$Tr&ova su Internet&Find on InternetÌ`Guanina10.5 (Guanidine)Õl DAggiunge automaticamente &idrogeniAutomatically Add &hydrogensØ„óD&Legame - Angolo e lunghezza fissi&Bond - Fixed length and angleò†¥"Mostra la grigliaDo not show gridô T^Rende il testo selezionato come pedice (Ctrl -)%Subscript selected text (Ctrl-Minus) I>Impossibile salvare l'immagine!Unable to save picture! Iñ800x600 pixel800x600 pixels+|£,Dimensioni della carta Paper size:0–J0Carica negativa parzialePartial negative charge=yµ>Angolo della freccia impostato:Arrow fixed angle:=¿zÆÈ possibile attaccare gli anelli alle strutture selezionando un anello e facendo click su un atomo.YIt's possible to attach rings to structures by selecting a ring and clicking on an atom.B¶žStrumento Linea Stereo Su<br><br>Usare lo strumento "Linea Stereo Su" per disegnare linee stereo verso l'alto,come mostrato sul pulsante.^Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as shown on the button.R$þ>Imposta lo spessore della lineaSet line thickness[Qc>Imposta lo Spessore della LineaSet Line Thickness[sc@Imposta angolo e lunghezza fissiSet fixed angle and length^›x.Freccia di non reazione NR arrowhžWIn modalità selezione, è possibile modificare la maggior parte degli oggetti facendo click su di essi con il pulsante destro del mouse.JWhen in select mode, you can edit most objects by right-clicking on them.s«žDCDX - formato binario ChemDraw (*)!CDX - ChemDraw binary format (*){0¹<Informazioni sulla molecola...No information.Žg® Strumento Anello Ring tool˜ \AnnullaCancel˜I¼ÂStrumento Cancella<br><br>Usare lo strumento "Cancella" per cancellare i singoli oggetti.<br><br>@Erase tool

    Use the Erase tool to erase individual items.§Ý> DoppioDouble¶¹%Orizzontale Landscape¹Êå¬Ricordarsi di selezionare il tipo di file quando i documenti vengono aperti o salvati ARemember to select a file type when opening or saving documents.Á,¾<Informazioni sulla molecola...Molecule information...ƸÞFormula =  Formula = Æå`Scorciatoia: Tenere premuto 'Alt' e digitare i codici a lettera singola!0Shortcut: Hold 'Alt' and type one-letter codes!Úš‘(A4 (210 mm x 297 mm)A4 (210 mm x 297 mm)ÝY©¾ Bryan Herger herger@chemistry.gatech.edu Per informazioni sulle successive release iscriversi alla mailing list Inviare un messaggio a xdrawchem-announce-request@lists.sourceforge.net con 'subscribe' nel soggetto Il copyright (C) 2002 su XDrawChem è di Bryan Herger. Copyright parziale (C) 1997-2000 di Christoph Steinbeck e del progetto JChemPaint Il copyright (C) 2003 sul codice di OpenBabel è del team di progetto OpenBabel Per maggiori dettagli vedi il file COPYRIGHT.txtÉ Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more detailsÞº#, Angolo =  , Angle = à—pJStrumento Testo<br><br>Usare lo strumento "Testo" per aggiungere testo e atomi marcati e punti.<br>(Vedere il manuale per informazioni sulla formattazione del testo)wText tool

    Use the Text tool to add text and label atoms and points.
    (See manual for info on formatting text)áDI IndoloIndole¶%8Confronta gli spettri NMR H1Compare 1H NMRßò$Dove trovare aiutoHow to get help³€.Disegna legame ondulatoDraw wavy bond@ t LisinaLysine@ E,Seleziona il &ProdottoSelect &ProductO€Ô"Mostra la grigliaShow hex gridP~DNumero di CAS CAS Number`N’Stampa file Print filec·%S&trumentiT&oolsmf3 PurinaPurine|ERibosioRibose–•$Salva file come...Save 3D file as...–j CercaSearch›ˆ˜SelezionaSelectœ+¤èXDrawChem può essere lanciato dalla riga di comando per produrre immagini. Digitare "xdrawchem --help" per dettagli.dXDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details.œÞ SerinaSerineœE"NitrofenilalaninaNitrophenylalanineœ©JAllinea a destra il testo selezionatoRight-justify selected text´SingoloSingle N%Cicloesano Cyclohexane¦uZuccheriSugars«Ø“ Stile:Style:¬Š$Editor dei simboliSymbol°9\senza titolo untitled°µt4Singolo/doppio (aromatico)Single/double (aromatic)±bf, fare click con il mouse per incollare nel disegno, click to paste into drawing¶ög TriploTriple¹%HScegliere una struttura dalla lista:Choose a structure from list:Á¹* Unità:Units:Å j ValinaValineÈ0EUracileUracilÈyüCiclobutano CyclobutaneÖ^u Cerca: Look for:Ö¥:VFare click su una molecola per informazioni$Click on a molecule for information÷Œ^„Si è avuto un errore. Il server non trova la molecola selezionata.@No reactions in the database could yield the selected molecule.ø(>Parentesi tonde ParenthesesøAxPrevede il coefficiente di ripartizione ottanolo-acqua (Kow)&Predict octanol-water partition (Kow)ú”I\Riduci a scheletro la struttura della molecolaClick on a molecule¥,Salva come immagine...Save as picture...éÎ2180 gradi in senso orario180 degree clockwise"–Fare click su una molecola per la riduzione a scheletro della sua struttura.Click on a molecule to clean up its structureG…6Informazioni sulla molecolaMolecule Info^?.server del database XDCXDC database server:öJ\Riduci a scheletro la struttura della molecolaClean up molecule¦ånFare click su una molecola per calcolare il suo NMR C13-Click on a molecule to calculate its 13C NMRMÂ6Informazioni sulla molecola Molecule+¯eFile salvato  Saved file 5ŽÀ4Crea anello personalizzatoCreate custom ring5þW"Elettrone spaiatoSingle electronX•ž>Problema nell'apertura del fileProblem while opening the filekºå&Cancella il &gruppo Clear &grouplN€6Ripartizione ottanolo-acquaOctanol-water partitionx?Þorbitale p p orbital‰x "Mostra la griglia Show grid–±Verticale Portrait›ƒt*Reagenti = %1 kJ/mol Reactants = %1 kJ/mol ¥vŠ"orbitale p doppio p double¶ÀdFare click su una molecola per calcolare il suo IR(Click on a molecule to calculate its IR·éÂ&Informazioni &About ...Ęž¼Modalità disegna simbolo: fare click con il tasto sinistro del mouse per aggiungere un simbolo+Draw Symbol mode: left click to add symbolľ¬NImpossibile determinare il tipo di fileCould not determine file typeÅ/õBRuota di 90 gradi in senso orarioRotate 90 degrees clockwiseÇ>…PSelezionare un tipo di file dalla lista.)Please select a file type from the list.äL.Strumento Catena<br><br>Usare lo strumento "Catena" per disegnare catene alifatiche.La lunghezza di ciascun segmento è la lunghezza di legame corrente.wChain tool

    Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length.ñv"Editor dei legami Bond editorôospettro IR IR spectrumôþ*Impossibile caricare Unable to load |polliciinchesžÃ2270 gradi in senso orario270 degree clockwise"5"Ordine di legame: Bond order:!È:$Analisi elementareElemental analysis: -Ê&Imposta Pagina Pa&ge setup/÷DLunghezza della freccia impostata:Arrow fixed length:35ê.Scrivi o modifica testoDraw or edit textHO´LDisegna oggetto grafico: bezier cubica"Draw graphic object: cubic bezierVÑ pixelpixelspì3&Impostazione pagina Page setup|¬,Larghezza della carta: Page width:‰ÇÊStima del pKa:Estimated pKa's:_ºProdottoProduct•»ôProlinaProline–0Indietro Backward¢Ü&Indietro &Backward¢òAdeninaAdenine¬PTriptofano Tryptophan³Ô~vFare click su una molecola per annullare la sua definizione1Click on a molecule to clear it group assignment¹P4"Salva immagine...Save picture...¿W., intensità Intensity: Ðæ,Fare click su questo pulsante per incollare una selezione.<br><br>Si può anche selezionare il comando "Incolla" dal menù "Modifica", o premere Ctrl+V.zClick this button to paste a selection.

    You can also select the Paste command from the Edit menu, or press Ctrl+V.Ñ©>(Lettera (8.5" x 11")Letter (8.5" x 11")Ñø´Strumento Parentesi<br><br>Usare lo strumento "Parentesi" per disegnare parentesi tonde e quadre.<br><br>Fare click per disegnare parentesi quadre.<br><br>Tenere premuto per selezionare da un menù grafico di parentesi.²Bracket tool

    Use the Bracket tool to draw brackets and parentheses.

    Click to draw square brackets.

    Click and hold to select from a picture menu of brackets.ÖÐ.Disegna simbolo Draw symbolå±ÌlFare click su una molecola per definirla come prodotto.Click on a molecule to assign it as a productîƒTAcido AsparticoAspartic acidððNImpossibile aprire il file specificato. Cannot open the specified file.÷Áî:Bezier cubica - mezza frecciaCubic bezier - half arrowx',File immagine salvato Saved picture file Ð$Ruota di 180 gradiRotate 180 degrees‘AlaninaAlanine(PÒIn modalità selezione, premere Ctrl+FrecciaSin su una molecola, per ottenere informazioni sulla molecola.VWhen in select mode, press Ctrl+LeftButton on a molecule to get molecule information.HQnL'opzione "Riduci a scehletro la molecola" nel menù Strumenti, puo' essere usata per perfezionare le strutture come anelli e macromolecole.wThe option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules.\á@Probema nella scrittura del fileProblem while writing the filek)eŠImpossibile convertire la molecola Conversione fallita in ioiface.cpp>Cannot convert the molecule. Conversion failed in ioiface.cppl·$Cicloesano (sedia)Cyclohexane (chair)€ÉAsparagina AsparagineƒV%.[*] Cicloesano (piatto)[*] Cyclohexane (flat)‰¹$Cicloesano (barca)Cyclohexane (boat)Š¿IDisegna linea Draw line—eÅDisegna anello Draw ring—ÅÇBenzeneBenzeneÆ Treonina ThreonineƵ0Cancella tutti i &gruppiClear all &groupsÇiÓDCicloesano - conformazione a barca Cyclohexane - boat conformationËÉÞArginina ArginineàLÅúStrumento Linea Ondulata<br><br>Usare lo strumento "Linea Ondulata" per disegnare linee ondulate, come mostrato sul pulsante.YWavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on the button.í$.[*] Benzene [*] Benzeneùõ2Editor delle frecce curveCurved Arrow editorûXÒ–Fare click su una molecola per calcolare la sua ripartizione ottanolo-acqua=Click on a molecule to calculate its octanol-water partition VN890 gradi in senso antiorario90 degree counterclockwise 2v¥:180 gradi in senso antiorario270 degree counterclockwise 2…:180 gradi in senso antiorario180 degree counterclockwise 2†U$Peso molecolare = Molecular weight =  9¤°8Simbolo proiezione di NewmanNewman projection symbol ?¬ÜNDisegna catena alifatica - Lunghezza = !Draw aliphatic chain - Length =  Køà Durante il disegno dei legami, è possibile modificare lo stile del legame facendo click su di esso con il pulsante destro del mouse.OWhen drawing bonds, you can edit the bond style by right-clicking on the bond. TànDisegna freccia Draw arrow l!çlStrumento Selezione<br><br>Usare lo strumento "Selezione" per selezionare e muovere gli oggetti.<br><br>Si possono selezionare più oggetti e tagliarli, copiarli, muoverli e ruotarli.˜Select tool

    Use the Select tool to select and move items inside a box.

    You can select multiple items and cut, copy, move and rotate them. vÉ.8Spaziatura del doppio legameDouble bond spacing: „ÀÚ–Modalità selezione: fare click con il tasto sinistro del mouse per muoversi*Select mode: left click on object to move †¦µ,Editor delle parentesiBracket ‡¡„(Strumento Simbolo<br><br>Usare lo strumento "Simbolo" per inserire simboli.<br><br>Tenere premuto per selezionare da un menù grafico di simboli.<br>~Symbol tool

    Use the Symbol tool to insert symbols.

    Click and hold to select from a picture menu of symbols.
     ™mŽ*Picchi del reagente: Peaks of reactant:  ™ùš*Prodotti = %1 kJ/mol Products = %1 kJ/mol  Zj0Disposizione &automatica Auto &layout ¤WäApri file... Open file... ¤Án4Prevede lo spettro NMR C13Predicted 1H-NMR ¦ÒòD-fruttosio D-fructose ¾åE„Fare click su una molecola per salvarla come anello personalizzato0Click on a molecule to save it as a custom ring ÂÈ possibile incollare un pedice ad una parentesi selezionando lo strumento "Testo", e facendo successivamente click sulla parentesi.bYou can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. ÉK^,Impossibile annullare!Cannot undo, sorry! äžq€Fare click su una molecola per determinare la sua stringa SMILES3Click on a molecule to determine its SMILES string óÑ×JDimensioni della carta personalizzateCustom paper size úCÕVStima la variazione di entalpia in fase gas$Estimate gas-phase enthalphy change )•*Doppietto elettronicoElectron pair ,ÍÒTrasparente Transparent 3>Imposta il &colore dello sfondoSet background &color 9Ò &Seleziona Tutto Select &All ;fœ|Fare click su una molecola per calcolare le sue coordinate 3-D0Click on a molecule to generate 3-D coordinates RíÃ@Strumento Freccia Curva<br><br>Usare lo strumento "Freccia Curva" per inserire frecce curve.<br><br>Tenere premuto per selezionare da un menù grafico di frecce.‹Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows.

    Click and hold to select from a picture menu of arrows. j¤^[*] Cicloeptano[*] Cycloheptane múåGruppi utiliUseful groups t·ÃlFare click su una molecola per calcolare il suo pKa(s),Click on a molecule to calculate its pKa(s) wˆ¹8Errore nel confronto NMR C1313C NMR compare error {áòVFare click su una molecola per informazioni0Click on a molecule for possible retrosynthesis }Ò“lStrumento Selezione<br><br>Usare lo strumento "Selezione" per selezionare e muovere gli oggetti.<br><br>Si possono selezionare più oggetti e tagliarli, copiarli, muoverli e ruotarli.§Lasso tool

    Use the Lasso tool to select and move items by drawing a loop around them.

    You can select multiple items and cut, copy, move and rotate them. ’n„Fare click su una molecola per calcolare la sua analisi elementare8Click on a molecule to calculate its elemental analysis ü#StatinaStatine ¨°Istidina Histidine ¯áENaftalene Naphthalene ´®µPredefinitiDefault ¼Œt gradidegrees ¾‹£, intensità , intensity  ¿DCicloesano - conformazione a sedia!Cyclohexane - chair conformation Å‹î&Supporto &Support Çt$jDigitare o modificare il pedice per questa parentesi:4Please type or edit the subscript for this bracket: Í”Ê[*] Ciclobutano[*] Cyclobutane Ö¥8Freccia doppia bidirezionaleSplit two-way arrow ÛÔÇæFare click su questo pulsante per aprire un file.<br><br>Si può anche selezionareil comando "Apri" dal menù "File."bClick this button to open a file.

    You can also select the Open command from the File menu. 棾(Fare click su questo pulsante per tagliare una selezione.<br><br>Si può anche selezionare il comando "Taglia" dal menù "Modifica", o premere Ctrl+X.vClick this button to cut a selection.

    You can also select the Cut command from the Edit menu, or press Ctrl+X. 죞¬Modalità cancella: fare click con il tasto sinistro del mouse per cancellare l'oggetto'Erase mode: left click to erase object û Ä*Prevede lo spettro IR Predict IR ÿR&Operazioni sui fileFile Operations ÿï“ TiminaThymine @NSottolinea il testo selezionato (Ctrl+U!Underline selected text (Ctrl+U) I©[*] Cicloottano[*] Cyclooctane ¥Carica negativaNegative charge Ð$Salva file come...Save file as... Ø®€Fare click su una molecola per calcolare la sua formula empirica7Click on a molecule to calculate its empirical formula ,1$Linea tratteggiata Dashed line -§¥FInterrogazione del database fallitaDatabase query failed 5ô8Impostazioni del &Disegno...&XDC settings... 58.&Manuale&Manual 8[\Fare click su questo pulsante per stampare il file che si sta modificando.<br><br>Si può anche selezionare il comando "Stampa" dal menù "File."vClick this button to print the file you are editing.

    You can also select the Print command from the File menu. 9¨ž<Lunghezza di legame impostato:Bond fixed length: <ª8Disegna Linea - Lunghezza = Draw Line - Length =  P”pReagente Reactant z£ÔReazione Reaction z«ÞºModalità disegna freccia, fare click con il tasto sinistro del mouse per disegnare la freccia*Draw Arrow mode: left click to draw arrow }Þ7`Stima della variazione di entalpia in fase gas: &Estimated gas-phase enthalpy change:  ‚² 4Prevede lo spettro NMR C13Predicted 13C-NMR ‰@²~Fare click su una molecola per calcolare il suo peso molecolare6Click on a molecule to calculate its molecular weight “ñ$ &Ruota&Rotate –¨…\Rende il testo selezionato come apice (Ctrl +)&Superscript selected text (Ctrl-Plus) š>9|Costante di ripartizione ottanolo-acqua stimata (log Kow) = %1:Estimated octanol-water partition constant (log Kow) = %1 ºBa@Proiezione di Newman - eclissataNewman projection - eclipsed ¼”ªModalità disegna anello: fare click con il tasto sinistro del mouse per aggiungere %1%Draw Ring mode: left click to add %1 Å”áF&Freccia - Angolo e lunghezza fissi &Arrow - Fixed length and angle Òhu(Altezza della carta: Page height: Ø4Prevede lo spettro NMR C13Predict 1H NMR àÎ26Immettere la stringa SMILESEnter SMILES string ãBStampa fileOverwrite file? ò$ïdAggiunge anelli personalizzati alla lista del menuAdd custom ring to menu list øV„VStringa SMILES per la molecola selezionata:%SMILES string for selected molecule: ûUjApri file Open file šE<Informazioni sulla molecola...Object information èžJNon mostrare questo dialogo all'avvio"Don't show this dialog at startup %vpEllisseEllipse 3Õ.Strumento modalità testTool test mode 9ZÕÂModalità disegna parentesi: fare click con il tasto sinistro del mouse per disegnare la parentesi.Draw Bracket mode: left click to draw bracket TŒdStereo-giù Stereo-down Y^8Imposta il Tipo di Carattere Set Font dÑÄDAnello stereochimico dell'idrogenoStereochemical ring hydrogen f¾8Imposta il tipo di carattere Set font fÑÄ8Imposta il tipo di carattere &Ruler font mjt,Variazione di entalpiaEnthalpy change v5Salva file Save file v—¥,Freccia retrosinteticaRetrosynthetic arrow >Stereo-su Stereo-up Œ^`Carica positivaPositive charge •ÓÅ&Riferimenti &References ¡ÂVImposta la dimensione del tipo di carattereSet font size ¢VImposta la Dimensione del Tipo di CarattereSet Font Size £îGlutamina Glutamine ¨ru.Suggerimento successivo Next tip ö€@*Picchi del prodotto: Blue is product ÷äReagenteRed is reactant ©d Strumento Freccia<br><br>Usare lo strumento "Freccia" per disegnare frecce dritte.<br><br>Fare click per disegnare una freccia dritta<br><br>Tenere premuto per scegliere tra la lista delle frecce disponibili.¤Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click to draw a straight arrow.

    Click and hold to pick from a list of available arrows. >þ In modalità selezione, premere Shift+FrecciaSin trascinando il mouse sopra una parte della molecola per selezionare l'intera molecola.lWhen in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. ²^DXDC - formato nativo XDrawChem (*)"XDC - XDrawChem native format (*) ÉÙüModalità selezione: fare click con il tasto sinistro del mouse su un oggetto per muoverlo, con quello sinistro per modificarloISelect mode: left click on object to move, right click on object to edit 7ݤ"Disegna parentesi Draw bracket ?(¤rSembra che non ci siano siti con pKa compreso tra -1 e 156There seem to be no sites with pKa between -1 and 15. Vž.Disegna linea stereo-suDraw stereo-up line gåForma&ttaForma&t i3”FormulaFormula iLa AvantiForward iØÄ&Avanti &Forward iÚ$pKa stimatoEstimated pKa's xÕó0Disegna catena alifaticaDraw aliphatic chain Ž ®Modalità disegna linea tratteggiata: fare click con il tasto sinistro del mouse per disegnare la linea, con quello destro per modificarlaDDraw Dashed Line mode: left click to draw line, right click to edit ©¤”$Fare click su questo pulsante per copiare una selezione.<br><br>Si può anche selezionare il comando "Copia" dal menù "Modifica", o premere Ctrl+C.xClick this button to copy a selection.

    You can also select the Copy command from the Edit menu, or press Ctrl+C. ¬/>>Trova la struttura via InternetFind structure via Internet ¯®ä$Editor dei simboliSymbol editor º Ò(Reazione = %1 kJ/molReaction = %1 kJ/mol ºáŒøModalità disegna linea: fare click con il tasto sinistro del mouse per disegnare la linea, con quello destro per modificarla=Draw Line mode: left click to draw line, right click to edit Æñt&Sapevate che?&Did You Know? È(oSapevate che?Did You Know? È6vÈ necessario selezionare almeno un reagente ed un prodotto.7You must select at least one reactant and one product. ЕNDoppio/triploDouble/triple Ô•e$Strumento Anello<br><br>Usare lo strumento "Anello" per inserire anelli e strutture già pronti.<br><br>Fare click per aprire la finestra di dialogo anelli, che permette la selezione da una lista di tutte gli anelli e le strutture predefinite.<br><br>Tenere premuto per selezionare da un menù grafico di anelli selezionati.<br>(Vedere il manuale per maggiori informazioni su come modificare questo menu)7Ring tool

    Use the Ring tool to insert ready-made rings and structures.

    Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.

    Click and hold to select from a picture menu of select rings.
    (See manual for more info on modifying this menu) Ý,‰ Modalità disegna linea stereo-su: fare click con il tasto sinistro del mouse per disegnare la linea, con quello destro per modificarlaGDraw Stereo-Up Line mode: left click to draw line, right click to edit ã`t€Inserire la sequenza del peptide - abbreviazione di tre lettere:5Enter peptide sequence - three-letter abbreviations:Í Nome chimicoChemical name yå,Costruttore di peptidiPeptide BuilderÛB<Bezier cubica - freccia interaCubic bezier - full arrowL'ÚModalità selezione: fare click con il tasto sinistro del mouse per muoversi, con quello destro per modificare5Select mode: left click to move, right click to edit1?0Disegna linea stereo-giùDraw stereo-down line2ôe8Immettere la stringa SMILES:Enter SMILES string:4 D-glucosio D-glucose;á¥GlicinaGlycine? ReazioneReverse reactionseR#lFare click su una molecola per calcolare il suo NMR 1H,Click on a molecule to calculate its 1H NMR}Â>Imposta lo spessore della lineaBond thickness:ƒ-ú0Spaziatura della griglia Grid spacingj76Centra il testo selezionatoCenter selected textŸÖ´GuaninaGuanine¸P8Impostazioni del &Disegno...&Drawing settings...¿VN,Editor delle parentesiBracket editorÁ’lFare click su una molecola per definirla come reagente/Click on a molecule to assign it as a reactantÉ)ÔìXDrawChem può legare automaticamente gli amminoacidi tramite il ponte ammidico (il risultato non è sempre piacevole :)tXDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :)äôù,Errore dati di IOIfaceIOIface Data errorûͲMetionina Methioninetå Modalità disegna linea ondulata: fare click con il tasto sinistro del mouse per disegnare la linea, con quello destro per modificarlaBDraw Wavy Line mode: left click to draw line, right click to edit,ÓÄ0Disegna catena alifatica11 (aliphatic secondary amine);0 ¤Strumento Linea Tratteggiata<br><br>Usare lo strumento "Linea Tratteggiata" per disegnare righe tratteggiate.Per aggiungere righe tratteggiate, disegnare sopra i legami esistenti (per indicare risonanza, ecc.).”Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.).ee^Personalizzati User-defineduA„vFare click su una molecola per annullare la sua definizione3Click on a molecule to display its bond identifier6¢Antracene Anthraceneƒå&[*] Ciclopentadiene[*] Cyclopentadiene“Úµ,Inverti &verticalmenteFlip &vertical˜ÐlJCDXML - formato testo/XML ChemDraw(*)%CDXML - ChemDraw text/XML format (*)š®¹4Solo corrispondenze esatteExact matches only¡˜¹Imidazolo Imidazole©f0Impossibile scrivere in Could not write to ­#ÐStringa SMILESSMILES stringµ†GèModalità disegna catena: fare click con il tasto sinistro del mouse e trascinarlo per disegnare la catena alifatica.=Draw Chain mode: left click and drag to draw aliphatic chainÐ~*Prevede lo spettro IR Predicted IRÓÞFInformazioni aggiornate su XDrawChem possono sempre trovarsi a http://www.prism.gatech.edu/~gte067k/xdrawchem/ L'ultima release sarà annunciata lì. Ci sono due mailng lists: xdrawchem-announce, dove saranno annunciate le nuove release, e xdrawchem-user, per la discussione tra gli utenti di xdrawchem. Per iscriversi, mandare una e-mail vuota con soggetto "subscribe" a "xdrawchem-announce-request@lists.sourceforge.net" o "xdrawchem-user-request@lists.sourceforge.net" L'autore puo' essere contattato direttamente a herger@chemistry.gatech.edu£Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.netؽt4Prevede lo spettro NMR C13Predict 13C NMRÚÄ’ Tipo di ricerca: Search type:áŽOrientazione Orientation:âJPrevede il pKa Predict pKaò±xdrawchem-v1.11.0/ring/xdrawchem_nl.qm000066400000000000000000000514461371466245600177430ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝB¨;;#;CJÄR´Çk¦y‚§ÔŒ¸ ÕÕå@@*¦yi*»†*Ð%Ÿ*Óº*ì0Ù+f¾î+”ƒ+˜Å.+įI1†ér?±g¡F|ÅÄJ+‚ýJ6•Jcb-Lˆ•BLÚåSVŠ¥|\K•„¼Ã¼‡æãŠÖ·GKÁèÞ|õ)ãÏ$•ð(QN-=c^?#E­õBhº„e­ %ê*%'4òJZaon‘t®qÎU '† N r‘í~ m“©ä –™Þ éª6• :´Iê S¶Š¥ t·T ¹YB ªÀ× Óëw£ üð‡Î %9Å%(>ìKNºä~ÃÖà›Ì`ò Iñ'+|£d0–J‹=yµ´R$þñ[Qcô[sc^›xB˜ \…˜I¼®˜I¼Ý˜I¼ ˜I¼9˜I¼c˜I¼“§Ý>®¶¹%M¹ÊådÏb®}ÝY©˜áDIË'-Ã`N’=c·%\mf3‰›ˆ˜®œ+¤Åœ+¤ù N%¦u9¬ŠZ±bq¹%Á¹*¯Ö^uúÖ¥:øA:øî_éή"ùG…8öJ«¦åÞMÂ5ŽÀŒX•ž»›ƒtâ·éÂùľ¬zÇ>…ñôo@|k"5”!È:Ó/÷øHO´|¬V¿W.{Ñ©>²ÑøÃÖÐ.ôå±ÌÙ´&Ðu‘œ—eÅÉ—ÅÇèÆ  ËÉÞ ûXÒ g û~ ž 2v¥! 2…!Ì 2†U" Sæ"N l!ç(y l[~(˜ ™mŽ(½ ¤Wä)ö äžq* óÑ×*t ,ÍÒ*å ;fœ+ j¤^+7 ü#,v ¼Œt,é Å‹î- ÛÔÇ-O 죞-˜ û Ä.± ÿR/ ÿï“// Ð/Z Ø®/… ,1/¼ -§¥0; 2í³0d 5ô0‡ 8[\0Ò 9¨ž0õ }Þ71è “ñ$2M –¨…2Î ­Þ2é ±ä3r ±€î3Á šE8ü «9 TŒd9H Y^9­ dÑÄ9Ú fÑÄ: v—¥:, >:S Œ^`:‚ •ÓÅ:¯ ¢:Ú £î; >þ;8 7ݤ<· ?(¤=’ gå=± i3”=ø iLa> ©¤”>, ¬/>? ¯®ä@ º Ò@g Æñt@’ Ô•eAY Ý,‰A† ã`tD! yåE-Ñ„E/1?En2—„F2ôeFr}ÂF¹°•G<Á’Gwee^Gœ˜ÐlI!¡˜¹IP­#ÐI‡Ê\ŠI¶ÍûUIÛÚÄ’J2áŽJ]âJJŒiJ­OKBondEditDialog;OK FixedDialog;OK;KnippenJÄ &Nieuw´ÇKopiëren¦y&Knippen§ÔAfsluitenŒ`Klik op een molecuul om de IUPAC naam te bepalen ÕBestand geladenå@Ko&piëren*¦y&Bewerk*»&Bestand*Ð%&Spiegelen*Ó &Help*ì0&Openen+f¾640x480 punten+”ƒOps&laan+˜Å&Ongedaan maken+į$Legal (8.5" x 14")1†éNormale pijl?±g.Kan bestand niet openenF|Å WissenJ+‚SluitenJ6• KleurJcbWisLˆ•CyclopentadieenLÚåPlakkenVŠ¥Maak ongedaan!\KVoer SMILES in„¼Ã.Voorgebakken Structuren‡æ$Twee-richtingspijlŠÖ·&Teken gekromde pijlGHGeen moleculen gevonden in database.ÁèÞWat is &Ditõ)ã290 graden met de klok mee$•&Lijn tool<br><br>U kunt de Lijn tool gebruiken om bindingen te tekenen. Teken over een reeds aanwezige binding om die twee- of drievoudig te maken.(QNÜTeken Stereobinding Omlaag modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken=cRechte haken?#:Stel de &achtergrond kleur in­õB2Partiële positieve ladingº„e2Teken een gestreepte lijn %Cyclopentaan*%Pijl bewerker4ò4Bereken verhoudingsformuleZanTekst modus: linker muisknop bewerkt of voegt tekst toen‘t@Roteer 90 graden (tegen klok in)qÎUðDruk op deze knop om het bestand op te slaan.<br><br>U kunt ook het commando Opslaan in het Bestand menu kiezen.<br><br>† NOpslaan &als...‘í~HMaak geselecteerde tekst superscript“©äFSelectie tool<br><br>U kunt de Selectie tool kiezen en objecten bewegen.<br><br>U kunt meerdere objecten selecten en verwijderen, kopieren, verplaatsen en roteren.™ÞSluitenª6•Vaste hoek:´Iê&Plakken¶Š¥&Printen·TKies tekenkleur¹YBGestreepte pijlÀ×1024x768 puntenëw£øStereo Lijn Omlaag tool<br><br>Gebruik deze Lijn tool om stereobindingen die omlaag staan te maken, zoals het knop aangeeft.ð‡ÎCyclopropaan9Å%(Spiegel &horizontaal>ìAccoladenNºäLKan het volgende bestand niet openen: ÃÖà*&Zoek op het internetÌ`2Kan plaatje niet opslaan! Iñ800x600 punten+|£Pagine grootte:0–J2Partiële negatieve lading=yµøStereo Lijn Omhoog tool<br><br>Gebruik deze Lijn tool om stereobindingen die omhoop staan te maken, zoals het knop aangeeft.R$þKies lijndikte[QcKies Lijndikte[sc8Stel vaste hoek en lengte in^›xRing hulpmiddel˜ \AfbrekenBondEditDialog˜I¼Afbreken FixedDialog˜I¼AfbrekenNetChooseDialog˜I¼Afbreken NetDialog˜I¼AfbrekenPageSetupDialog˜I¼Afbreken˜I¼”Wissen tool<br><br>U kunt the Wissen tool gebruiken om objecten te wissen.§Ý> dubbel¶¹%Liggend¹Êå&Next >>Ïb®(A4 (210 mm x 297 mm)ÝY©0Tekst tool<br><br>Gebruik de Tekst tool om tekst toe te voegen en atomen en punten te benoemen.<br>(Informatie over tekstopmaak vindu in de handleiding)áDI,Bereken elementanalyse'-ÃCAS-nummer`N’"Bestand afdrukkenc·%H&ulpmiddelenmf3 Zoeken›ˆ˜SelecteerApplicationWindowœ+¤Selecterenœ+¤Enkelvoudig N%Cyclohexaan¦u Stijl:¬Šaromatisch±bdrievoudig¹%@Kies een structuur uit de lijst:Á¹*CyclobutaanÖ^uZoek naar:Ö¥:Normale hakenøADMaak geselecteerde text <b>vet</b>øî@Bestand uitvoeren als plaatje...éÎ4180 graden met de klok mee"hKlik op een molecuul om de structuur netter te makenG…(XDC database server:öJ&Molecuul verfraaien¦årKlik op een molecuul om het 13C NMR spectrum te berekenenMÂ$Bestand opgeslagen5ŽÀEnkel elektronX•ž Staand›ƒtvKlik op een molecuul om het infrarood spectrum te berekenen·éÂlTeken symbool modus: linker muisknop voegt symbool toeľ¬DRoteer 90 graden (met de klok mee)Ç>… Binding bewerkerôoKan niet openen|4270 graden met de klok mee"5Bindingsorde:!È:Pa&gina opmaak/÷,Plaats of bewerk tekstHO´Pagina layout|¬,Opslaan als plaatje...¿W.Druk op deze knop om een selectie te plakken.<br><br>U kunt ook het commando Plakken uit het Bewerk menu kiezen, of Ctrt+V drukken.Ñ©>&Letter (8.5" x 11")ÑøHaken tool<br><br>Gebruik de Haken tool om haken te tekenen.<br><br>Door te klikken en vast te houden kunt u andere haken kiezen.ÖÐ.Teken symboolå±ÌDMaak geselecteerde tekst subscriptÙ´Sla plaatje opÐ"Roteer 180 graden‘Teken lijn—eÅTeken ring—ÅÇbenzeenÆ <Cyclohexaan - boot conformatieËÉÞ,Gekromde pijl bewerkerûXÒäDruk op deze knop om een bestand te openen. <br><br>U kunt ook het commando Openen uit het Bestand menu gebruiken. û~490 graden tegen de klok in 2v¥6270 graden tegen de klok in 2…6180 graden tegen de klok in 2†U <b>Overzicht</b><p>Het programmascherm bestaat uit vijf belangrijke elementen:<br>Het menu boven aan het scherm;<br>Het bestands- en bewerktoolbar onder het menu;<br>De tekentoolbar aan de linker kant;<br>De statusbar onderaan het scherm;<br>en het tekengedeelte in het midden.<p>De bestands- en bewerktoolbar geeft u veel gebruikte acties die ook in het menu onder Bestand en Bewerk gevonden kunnen worden.<p>De tekentoolbar geeft u verschillende tekenmodussen.<p> Om informatie over de knoppen te krijgen, druk u de <img source="whatsthisicon"><b>Wat is dit?</b> knop in, en klikt daarna op de knop waarover u informatie wilt.<p>De statusbar geeft u foutmeldingen, informatie en vaak een tip over de huidige tekenmodus.<p>De volgende paginas beschrijven alle knoppen en menu opties. SæTeken pijl l!ç&Info over... l[~.Symbool tool<br><br>Gebruik het Symbool tool om symbolen toe te voegen.<br><br>Door klikken en vasthouden kunt u uit een lijst van symbolen kiezen.<br> ™mŽAuto &opmaak ¤WäPKan de actie niet ongedaan maken, sorry! äžqfKlik op een molecuul om de SMILES string te bepalen óÑ×Elektronenpaar ,ÍÒ Selectaar &Alles ;fœ4Gekromde Pijl tool<br><br>Gebruik de Gekromde Pijl tool om kromme pijlen te tekenen.<br><br>Door te klikken en vast te houden kunt u andere pijlen kiezen. j¤^hKlik op een molecuul om de elementanalyse te bepalen ü#Standaard ¼Œt>Cyclohexaan - stoel conformatie Å‹î>Opgesplitste twee-richtingspijl ÛÔÇDruk op deze knop om een selectie te verwijderen.<br><br>U kunt ook het commando Knippen uit het Bewerk menu kiezen, of Ctrt+X drukken. 죞RWissen modus: linker muisknop wist object û ÄVoorspel IR ÿR Bestandoperaties ÿï“ Negatieve lading Ð,Bestand opslaan als... Ø®tKlik op een molecuul om de verhoudingsformule te berekenen ,1Gestreepte lijn -§¥<< &Previous 2í³@Database zoekopdracht is gefaald 5ô&Handleiding 8[\èDruk op deze knop om het bestand af te drukken.<br><br>U kunt ook het commando Afdrukken in het Bestand menu kiezen. 9¨žZTeken pijl modus: linker muisknop tekent pijl }Þ7vKlik op een molecuul om het moleculair gewicht te berekenen “ñ$&Roteren –¨…~Een fout is opgetreden. De server kan het molecuul niet vinden. ­ÞDOnderstreep de geselecteerde tekst ±ä0<center><b>Welkom bij XDrawChem!</b><br>Bryan Herger<br>herger@chemistry.gatech.edu<br></center> <p><b>Bladeren in de handleiding:</b> <p>Onderaan het scherm staan drie knoppen: <p>Sluiten - afsluiten van de handleiding. <br>Terug - ga naar de vorige pagina. <br>Verder - ga naar de volgende pagina. <p>Het aantal tussen de Terug en Verder knoppen geeft aan welke pagina u nu bekijkt. <br>U kunt naar elke pagina gaan door de titel van de pagina te kiezen in de lijst bovenaan het scherm. <p>Een kort overzicht van de toetsencombinaties: toetsen zijn afgekort. Een voorbeeld: "Ctrl+O" betekent dat u de control toets (Ctrl) ingedrukd houdt terwijl u de 0 indrukt. ±€îOpen bestand šE&Referenties... «ZTeken haak modus: linker muisknop tekent haak TŒd"Stereopijl omlaag Y^Kies Lettertype dÑÄKies lettertype fÑÄBewaar bestand v—¥$Retrosynthese pijl >"Stereopijl omhoog Œ^` Positieve lading •ÓÅ$Kies lettergrootte ¢$Kies Lettergrootte £îtPijl tool<br><br>Gebruik de Pijl tool om rechte pijlen te tekenen. <br><br>Druk deze knop in om een pijl te tekenen.<br><br>Door te klikken en vast te houden kunt u andere pijlen kiezen. >þÐSelectie modus: linker muisknop om een object te verplaatsen, rechter muisknop om een object te bewerken 7ݤTeken haak ?(¤<Teken een stereobinding omhoog gåOpmake&n i3”Formule iLaÒTeken Gestreepte Lijn modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken ©¤” Druk op deze knop om een selectie te kopieren.<br><br>U kunt ook het commando Kopieren uit het Bewerk menu kiezen, of Ctrt+C drukken. ¬/>>Zoek structuur via het internet ¯®ä Symbool bewerker º Ò¼Teken Lijn modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken Æñt"dubbel/drievoudig Ô•eRing tool<br><br>Gebruik de Ring tool om voorgebakken ringen en structuren toe te voegen.<br><br>Klikken opent een scherm waarin u uit een lijst structuren kan kiezen.<br><br>Met klikken en vast houden kunt u kiezen welke structuur of ring u wilt tekenen.<br>(Informatie over het aanpassen van dit menu vind u in de handleiding) Ý,‰ÜTeken Stereobinding Omhoog modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken ã`tChemische naam yå4Bereken moleculair gewicht-Ñ„œSelecteer modus: linker muisknop verplaatst molecuul, rechter bewerkt molecuul1?RMaak de geselecteerde tekst <i>schuin</i>2—„<Teken een stereobinding omlaag2ôexKlik op een molecuul om het proton NMR spectrum te berekenen}Â0Vaste &lengtes en hoeken°•Haak bewerkerÁ’zGestreepte Lijn tool<br><br>Gebruik de Gestreepte Lijn tool om gestreepte lijnen te tekenen. Teken over een reeds aanwezige lijn om ze gestreept te maken (om resonantie aan te geven, etc.).ee^$Spiegel &verticaal˜Ðl,Alleen exacte vondsten¡˜¹$Kan het opslaan op­#ÐVaste lengte:Ê\ŠL&Stel vaste bindingslengte en -hoek inÍûU Voorspel 13C NMRÚÄ’$Type zoekopdracht:áŽOriëntatie:âJ/²— !*0:PageSetupDialogBondEditDialogApplicationWindowXManualNetChooseDialog RingDialogRender2D NetDialog FixedDialogxdrawchem-v1.11.0/ring/xdrawchem_pl.qm000066400000000000000000002146341371466245600177450ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝB¨;#þFxm*ßIh¸JÄê´ÇvjA‡ÔjŒ¯¹–Dô¦y%§ÔR»ì0®ö5ÙÏ+Ô+Œ\¬ô‹ØÙ¶‹tçå@ re*¦yµ*»å*Ð%*ÓA*ì0o*ö5+f¾É+”ƒù+˜ÅB+įr,]¢-Þ1†é=:0Õ?±gËAîÿF|Å |GfÀ ÛH™g J+‚ 9J6• iJcb ™Lˆ• ÅLÚå RŠŸ UTƒŠ •VŠ¥ ÃWT ïXýô Yã Q\K ‰nÁl ¹„¼Ã ì‡æ 5ŠÖ· ‰G Ç–›…Iª¼õ~²jt³¶œõ¹_ù;ÁèÞ™ÅQ•5Ò-µuÙôÕÝ´$è°nñÐþÂõ)ã–ýmŠ×hÄ1 üŸ Ü,ú ŸF¿N$•úz`(QNÓ-½~²/ßãÚ=c?#KGÉdŠeôžáeöžjÑ„IˆRJ“¡úy溄e wæu Ýñ’>!y %!ø U"sØþ"Ð%±Y#(€’#x*%#½/úÕ#ü4ò$GD°o$Žid³%°n‘t%åqÎU&Á† N'L‘í~(è™6Ô).§–Ä)ª6•)º®–À)í±…„*¶Š¥*ƒ·T*²¹YB*é½/+IÀ×+¨Ë +åÌ05,Ζ%,[ãWÎ,–ä×.¡ëw£.òð‡Î/>,ù19Å%1–:Rµ1Õ<:Õ2§>ì2òNºä3;^Æ”3…^è)3Û{ØÒ4pˆË½4Í‹¹M5“æÕ5XŸù5¦¬Èn5ã·² 7默 8½‰Ä8뽸9fÀnY9±ÃÖà:_ʼ“:ÉÌ`;Õl ;kØ„ó;¸ò†¥<+ô T<¾ I= Iñ=¾¹©>$+|£>Ð0–J?=yµ?a=¿z?ÅB¶ž@ R$þAã[QcC«[scD ^›xDmhžWDèh½ÉE%s«žEˆ{0¹F΀§,GM€·,Gˆç,GÃŽg®Gþ˜ \HR˜I¼H´œZÂHã§Ý>I¶¹%J&¹ÊåJYÁ,¾J‹ƸÞKˆÆå`KöÚš‘L+ÝY©LóÞº#MLà—pSeáDISœçÍùUe¶%UæßòV³€V`ÁoV®@ tVø@ EWmH8ÀWœO€ÔWÍP~DXY ¤Xu`N’X¤c·%XÝmf3Y|EYQ–•Y€–jY¯›ˆ˜Z œ+¤Z9œÞZ†œE[Ìœ©[û´\N N%\̦u]«Ø“]A¬Š]n­Án]›°9\]å°µt^±b^K¶ög^–¹%_Á¹*_EÅ j_±È0E_èÈyü`Éßi`FÖ^u`ÁÖ¥:`ýñWÎaA÷Œ^d;ø(>dáøAeµú”Ieó¥f‰éÎfÝ ¼)g4 S¹g±"hG…hl^?hüöJiZ¦åi¹MÂj +¯ejÀ5ŽÀjù5þWkEX•žkž_PÔkð_pÔl'kºål^lN€lÓx?Þm‰x m˜–±mЛƒtn¥vŠnA¶Àn ·éÂnÙĘžo}ľ¬oØÅ/õpŸÇ>…qäLq“ñvr ôosóôþt5|tmžÃtÁ"5tì!È:uU-oúu™-Êv/÷v_35êv±HO´wHûnweO!éw¦VÑx(jÏÉxÖpì3y}|¬y®}v8y÷‰ÇÊzt_ºz¾‘É{ •»ô{i–0{›˜ö¤{Í¢Ü|(¢ò|Y¬P|³Ô~|¿¹P4|ø¿W.}¹Î}~Ðæ~“Ñ©>~ØÑø€ˆÖÐ.€ÞÝɃ*å±ÌƒrîƒTƒÐðð„z÷Áî„Æx'…FÐ…¶‘†(P†WHQn†‰\áˆ7k)eŠ*l·Š¡€É‹‚Gž‹çƒV%Œn‰¹Œ©Š¿I —eÅa—ÅÇ»Æ ŽÆµŽMÇiÓŽƒËÉÞŽåàLÅcí$.˜ùõ‘/ûXÒ‘k VN‘Õ %}’® 2v¥“> 2…“± 2†U”' 9¤°” ?¬Ü”õ Køà•Z Tàn•ã l!ç—, r±s—‹ vÉ.—Ð „Àڙ⠆¦µšM ‡¡„›M —vÙ›} ™mŽ›ã ™ùšµ Zjž ¤Wäžg ¤Ánž¼ ¦ÒòŸ ¼îÏŸN ½ó)Ÿ¤ ¾åE )  d ÉK^¡ äžq¢Œ óÑ×¢Þ úCÕ£™ )•£ï ,ÍÒ¤ 3¤Ë 4|ù¥ 9Ò¥Ÿ ;fœ¥ý RíæG j¤^§ múå© t·Ã©[ wˆ¹©£ {áòªC }Ò“ª£ ’n«i ü#­Œ ¨°®P ­y®‚ ¯áE¯ ´®µ¯? ¼Œt¯w ¾‹£¯« ¿¯Û Å‹î°" Çt$°¥ ʇٰê ͔ʱL Ö¥² ÛÔDzV 棾²¬ 죞´ û ÄµÔ ÿR¶ ÿï“¶Î @· I©·P ¥·ß и' Ø®¸o &õ‰¸Á ,1¹C -§¥¹þ 5ôº: 58.º¾ 8[\» 9¨ž»] <ª¼é P”p½: z£Ô½¢ z«Þ½× }Þ7¾ ‚² ¿ ‰@²¿¦ “ñ$¿ö –¨…À´ š>9Àä ºBaÁ’ ¼”ÂP Å”áÂÍ ÒhuÃ’ ØÄ& àÎ2Äo ãBĺ ð0²Å ò$ïÅq øV„ÅÁ ûUjÆ> šEÆÓ \bÇ èžÇo %vpÇÈ 3ÕÈH 9ZÕÈx A„HÈÓ BIHÉ, TŒdÉ… W9ÊY Y^Ê® dÑÄÊô f¾Ë? fÑÄËž mjtËé v5Ì3 v—¥Ì} >̹ Œ^`Í •ÓÅÍF ¡ÂÍ ¢Íæ £îÎH ¨ruΪ Η Îâ ö€@ÏA ÷äÏ„ ©dÏÜ >þÐ2 ²^Ò> [iÔ ç‰Ô† ÉÙÔç 7ݤÕi ?(¤Öˆ A÷ÈÖé MàI׆ Vž×í g娥 i3”Ù# iLaÙU iØÄÙ iÚ$Ùµ xÕóÙì Ž ®Ú4 ©¤”Ú» ¬/>Ûõ ¯®äÝÁ º ÒÞ7 ºáŒÞ} ¾XHÞÔ Æñtß- È(oàF È6à• Ð•Nàá Ô•eᦠÝ,‰áò ã`tåý çÓùç0 çäyç± ÿGcè5Í èg yåéÛBé`;é´L'ê1?ên2ôeë/4 ë¯;á¥ì? ìHBŒìzeR#ìø}ÂíHƒ-úíøj7îZŸÖ´î«¸Pï¿VNïBÁ’ïŸÉ)Ôïèäôùð•íÄÎñÍûͲòtåòhÕ ò¡,ÓÄóh;0 ô¨IÙÃõ)\õiõaee^öuA„ø}6¢øÈƒåùˆ¾ù¸“Úµú>˜Ðlú’š®¹úÙ¡˜¹ûj©fûÍ­#Ðüµ†Gü]Ð~ü£ÓÞý¨ؽtýéÚÄ’áŽTâJ£ò±âôµã$÷å9YiÚOKOK;cmcmcaliinþpxpxx&Idz&Go*ßProstoktBoxIh WytnijCutJÄ &Nowy&New´ÇCAS:CAS:vj(Czcionka &podstawowa &Main font‡ÔAutomatycznieAutoŒ¯WizanieBond–D KopiujCopy¦yWy&tnijCu&t§Ô EdycjaEdit» PomocHelpì0HomeHomeö5InfoInfoÏDo lewejLeft+ÔZakoDczQuitŒ TekstText¬ôFalowaneWavyØÙkulabead‹t(ZaBadowano dokument Loaded document å@$Porównanie 13C NMRCompare 13C NMR r&Kopiuj&Copy*¦y&Edycja&Edit*» &Plik&File*Ð% &Odbij&Flip*Ó Pomo&c&Help*ì0 &Home&Home*ö5&Otwórz&Open+f¾640x480 pikseli640x480 pixels+”ƒ&Zapisz&Save+˜Å&Cofnij&Undo+į&Powikszenie&Zoom,],~2125 (wskie), -N=C=S~2125 (narrow), -N=C=S-$Legal (8.5" x 14")Legal (8.5" x 14")1†éPirymidyna Pyrimidine:0Õ ZwykBa Plain arrow?±gDBugo[ wizaD, kt miedzy wizaniami oraz stosowane jednostki mo|na zmienia w 'Ustawieniach rysunku' dostpnych z menu Format.aBond length, bond angle, and units are set in the Drawing Settings option under the Format menu.Aî0Nie mo|na otworzy plikuCouldn't open fileF|Å CAS: CAS: GfÀStrzaBkaArrowH™gWyczy[ClearJ+‚ZamknijCloseJ6• KolorColorJcb&Narzdzie gumowaniaEraseLˆ•CyklopentadienCyclopentadieneLÚåNarzdzie lassoLassoRŠŸ Nazwa:Name:TƒŠ WklejPasteVŠ¥ DrukujPrintWTDo prawejRightXýôPier[cienieRingsYãCofnij!Undo!\KBifenyl BiphenylnÁl SMILES wej[ciowy Input SMILES„¼Ã&Wbudowane szkieletyCanned Structures‡æDwustronnaTwo-way arrowŠÖ·TNarzdzie rysowania strzaBek zakrzywionychDraw curved arrowGTyrozyna Tyrosine–›…Cysteina Cysteineª¼õ*Przecignij do siatki Snap to grid²jtCytozyna Cytosine¶œõ*--Wybierz filtr-- (*)--Select a filter-- (*)¹_ùRBrak dopasowaD czsteczki w bazie danych..No molecules in the database match the query.ÁèÞDeoksyryboza DeoxyriboseÅQ•,~2250 (wskie), nitryl~2250 (narrow), nitrileÒ-µ"Zaznacz &substratSelect &ReactantÙô Kwasy nukleinoweNucleic acidsÝ´,SkBad pierwiastkowy =  Analysis = è°6Mo|na przeBcza midzy trybami wy[wietlania siatki poprzez naci[nicie Ctrl+G. Obecno[ siatki lub jej brak nie wpBywa na funkcj 'Przecignij do siatki'.‚You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid.ñÐþCo &to jest? What's &Thisõ)ã,Kt midzy wizaniami:Bond fixed angle:ýmŠ6Brak substratu lub produktuMissing reactant or producthÄ.Poka| siatk kwadratowShow square grid ü"&Odznacz wszystko&Deselect All Ü,ŽTryb lasso: naci[nij i przytrzymaj lewy przycisk, aby zaznaczy lassem..Lasso mode: left click and hold to draw lasso Ÿ„Prosz wybra tylko jeden substrat i jeden produkt dla porównania.<br> Narzdzie to jest u|ywane do rysowania wizaD. Rysowanie kolejnego wizania na istniejcym ju| powoduje tworzenie wizaD wielokrotnych.oLine tool

    Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds.(QN4Program XDrawChem mo|e identyfikowa zwizki po ich numerze CAS oraz po nazwie w niektórych przypadkach. Wybierz komend Charakterystyka czsteczki z menu Narzdzia i kliknij czsteczk. Jest to jednak skuteczne tylko w przypadku, je[li dany zwizek znajduje si ju| w bazie danych.ØXDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database.-½~Aminokwasy Amino acids/ßãÐTryb rysowania klina przerywanego: naci[nij lewy przycisk, aby narysowa klin lub prawy, aby go edytowaIDraw Stereo-Down Line mode: left click to draw line, right click to edit=cKwadratowySquare bracket?#*Eksportuj list pikówExport Peak ListGÉdPowikszZoom IneôžPowikszZoom ineöž Kwas glutaminowyGlutamic acidjÑ„$SygnaBy produktu: Peaks of product: ˆRJN11 (atom wgla midzy ketonem i estrem)'11 (a-carbon between ketone and ester)¡úy2Cz[ciowy Badunek dodatniPartial positive chargeº„eZKliknij czsteczk, aby wygenerowa jej nazw&Click on a molecule to guess its nameæuBNie mo|na zapisa podanego pliku.!Cannot write the specified file.ñ’>NNarzdzie rysowania wizaD przerywanychDraw dashed line %&Wygeneruj model 3D Build 3D model of molecule UProsz czeka Please wait.Øþ214,4 (amina drugorzdowa)14.4 (secondary amine)%±YKrzywa Beziera Cubic bezier(€’Cyklopentan Cyclopentane*%[*] Cyklopentan[*] Cyclopentane/úÕEdytor strzaBek Arrow editor4òÄZawsze warto sprawdzi czy s uaktualnienia programu na stronie: http://xdrawchem.sourceforge.net/BBe sure to check for updates at http://xdrawchem.sourceforge.net/D°o wizania bondsid³–Tryb dodawania tekstu: naci[nij lewy przycisk, aby doda lub edytowa tekst*Text mode: left click to add or edit textn‘tLObró o 90 stopni przeciwnie do zegara#Rotate 90 degrees counterclockwiseqÎUNaci[nij ten przycisk, aby zapisa aktualny dokument.<br><br> W tym celu mo|esz równie| wybra komend Zapisz z menu Plik.<br><br>|Click this button to save the file you are editing.

    You can also select the Save command from the File menu.

    † NZapisz &jako... Save &as...‘í~*PrzeBcz tryb &siatki Toggle &grid™6Ô&Informacje&About§–ÄZ&amknij&Closeª6•&Grupuj&Group®–À2Lista reakcji przeciwnychReverse reactions list±…„ &Wklej&Paste¶Š¥&Drukuj...&Print·T2Ustawienie koloru rysunkuSet drawing color¹YB,~2270 (wskie), -N=C=O~2270 (narrow), -N=C=O½/Przerywana Dashed arrowÀ×LeucynaLeucineË FenyloalaninaPhenylalanineÌ05Izoleucyna IsoleucineΖ%bProgram XDrawChem jest w stanie narysowa ponad 100 000 zwizków wykorzystujc baz internetow. Wybierz komend Wyszukaj w internecie z menu Plik, aby przeszuka baz zwizków.XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds.ãWÎ(StrzaBka zakrzywiona Curved Arrowä× 1024x768 pikseli1024x768 pixelsëw£JNarzdzie rysowania klina przerywanego<br><br> Narzdzie to jest u|ywane do rysowanie wizania skierowanego od obserwatora tak, jak to wida na oznaczeniu przycisku.bStereo Down Line tool

    Use the Line tool to draw stereo-down lines, as shown on the button.ð‡ÎVSteroid (szkielet skumulowanych pier[cieni)Steroid (fused ring template),ùCyklopropan Cyclopropane9Å%ˆKliknij lewym przyciskiem, aby narysowa szkielet projekcji Newmana..Left-click to draw Newman projection template:Rµ[*] Cyklopropan[*] Cyclopropane<:ÕOdbij po&ziomoFlip &horizontal>ì Zawinity nawiasCurly bracketNºä*Wprowadz indeks dolnyEnter subscript^Æ”TProjekcja Newmana - naprzemianlegBa (anti)%Newman projection - staggered (anti)^è),BBd porównania 1H NMR1H NMR compare error{ØÒWidmo 1H NMR1H NMR spectrumˆË½Widmo 13C NMR13C NMR spectrum‹¹M&Powikszenie = %1 % Zoom = %1 %“æÕ-4 (pirol) -4 (pyrrole)Ÿù`Jest dostpnych wiele szkieletów czsteczek poprzez 'Narzdzie rysowania pier[cieni'. S dostpne midzy innymi: proste i skondensowane pier[cienie, aminokwasy oraz nukleozydy.ŠA number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides.¬ÈnpZmiana zaznaczonego tekstu na <b>pogrubiony</b> (Ctrl+B)(Make selected text bold (Ctrl+B)·² " Multipletowo[:  Multiplicity: »˜ DWyrównaj do lewej zaznaczony tekstLeft-justify selected text½‰Ä"Poprzednia porada Previous tip½¸jZmiana zaznaczonego tekstu na <i>kursyw</i> (Ctrl+I)(Italicize selected text (Ctrl+I)ÀnY4Nie mo|na otworzy pliku: Could not open the file: ÃÖàSMILES wynikowyOutput SMILESʼ“,Wyszukaj w &internecie&Find on InternetÌ` 10,5 (guanidyna)10.5 (Guanidine)Õl :Automatycznie dodawaj &wodoryAutomatically Add &hydrogensØ„óX&Wizanie - dBugo[ i kt jak w ustawieniach&Bond - Fixed length and angleò†¥$Nie pokazuj siatkiDo not show gridô TnZmiana zaznaczonego tekstu na indeks dolny (Ctrl-Minus)%Subscript selected text (Ctrl-Minus) I2Nie mo|na zapisa obrazu!Unable to save picture! Iñd1,3 (alifatyczny kwas karboksylowy, 2-a-halogenek),1.3 (Aliphatic carboxylic acid, 2 a-halide)¹©800x600 pikseli800x600 pixels+|£ Rozmiar papieru: Paper size:0–J0Cz[ciowy Badunek ujemnyPartial negative charge=yµ,Kt midzy strzaBkami:Arrow fixed angle:=¿zNMo|na doBczy pier[cieD lub fragment struktury do narysowanego wcze[niej atomu.W tym celu nale|y wybra pier[cieD lub struktur, a nastpnie klikn na po|dany atom.YIt's possible to attach rings to structures by selecting a ring and clicking on an atom.B¶žNNarzdzie rysowania klina wypeBnionego<br><br> Narzdzie to jest u|ywane do rysowanie wizania skierowanego ku obserwatorowi tak, jak to wida na oznaczeniu przycisku.^Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as shown on the button.R$þ2Ustawienie grubo[ci liniiSet line thickness[Qc2Ustawienie grubo[ci liniiSet Line Thickness[scDUstawienie dBugo[ci wizaD i któwSet fixed angle and length^›xBrak reakcji NR arrowhžW47,8 (aromatyczna grupa SH)7.8 (Aromatic -SH)h½ÉàW trybie zaznaczania mo|na edytowa wikszo[ obiektów poprzez kliknicie danego obiektu prawym klawiszem myszy.JWhen in select mode, you can edit most objects by right-clicking on them.s«žBCDX - binarny format ChemDraw (*)!CDX - ChemDraw binary format (*){0¹[*] DABSYL [*] DABSYL€§,[*] DABCYL [*] DABCYL€·,[*] DANSYL [*] DANSYLç,(Brak charakterystykiNo information.Žg®<Narzdzie rysowania pier[cieni Ring tool˜ \ AnulujCancel˜I¼Po [rodkuCenterœZ²Narzdzie gumowania<br><br> Narzdzie to jest u|ywane do usuwania pojedynczych elementów.@Erase tool

    Use the Erase tool to erase individual items.§Ý>PodwójneDouble¶¹% Pejza| Landscape¹Êå Nale|y pamita o wybraniu typu pliku przy otwieraniu lub zapisywaniu dokumentu.ARemember to select a file type when opening or saving documents.Á,¾:Charakterystyka czsteczki...Molecule information...ƸÞWzór =  Formula = Æå`|Usprawnienie: Przytrzymaj 'Alt' i wprowadz kody jednoliterowe!0Shortcut: Hold 'Alt' and type one-letter codes!Úš‘(A4 (210 mm x 297 mm)A4 (210 mm x 297 mm)ÝY©4 Bryan Herger bherger@users.sourceforge.net Prosz subskrybowa list dyskusyjn w celu uzyskania informacji o nowych wersjach Wy[lij wiadomo[ do xdrawchem-announce-request@lists.sourceforge.net umieszczajc sBowo 'subscribe' w tytule wiadomo[ci. XDrawChem - prawa autorskie (C) 2004 Bryan Herger. Cz[ciowe prawa autorskie (C) 1997-2000 Dr Christoph Steinbeck oraz projekt JChemPaint Kod OpenBabel - prawa autorskie (C) 2003 Grupa projektu OpenBabel. TBumaczenie Nikodem Kuznik. http://chemlix.linux.pl SzczegóBy w pliku COPYRIGHT.txtÉ Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more detailsÞº#, Kt =  , Angle = à—p6Narzdzie dodawania tekstu<br><br>Narzdzie to u|ywane jest do dodawania tekstu i oznaczania tekstem atomów i punktów.<br>(Wicej informacji w podrczniku)wText tool

    Use the Text tool to add text and label atoms and points.
    (See manual for info on formatting text)áDIJ5 (pierwszorzdowa amina aromatyczna)5 (Aromatic primary amine)çÍù IndolIndole¶%"Porównanie 1H NMRCompare 1H NMRßò"Jak uzyska pomocHow to get help³€~1300-1000, C-O~1300-1000, C-OÁoJNarzdzie rysowania wizaD falowanychDraw wavy bond@ t LizynaLysine@ ENazwa: Name: H8À Zaznacz &produktSelect &ProductO€Ô2Poka| siatk sze[cioktnShow hex gridP~D ObiektObjectY ¤Numer CAS CAS Number`N’Drukuj plik Print filec·%&NarzdziaT&oolsmf3 PurynaPurine|E RybozaRibose–•,Zapisz 3D plik jako...Save 3D file as...–j SzukajSearch›ˆ˜*Narzdzie zaznaczaniaSelectœ+¤ÆXDrawChem mo|e utworzy obrazy z wiersza poleceD. Wicej informacji po wpisaniu "xdrawchem --help".dXDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details.œÞ SerynaSerineœE$NitrofenyloalaninaNitrophenylalanineœ©FWyrównaj do prawej zaznaczony tekstRight-justify selected text´PojedynczeSingle N%Cykloheksan Cyclohexane¦u CukrySugars«Ø“ Styl:Style:¬Š~1350-1000, C-N~1350-1000, C-N­Án SymbolSymbol°9\bez_nazwy untitled°µtAromatyczneSingle/double (aromatic)±bB, naci[nij, aby wklei do rysunku, click to paste into drawing¶ögPotrójneTriple¹%2Wybierz fragment z listy:Choose a structure from list:Á¹*Jednostki:Units:Å j WalinaValineÈ0E UracylUracilÈyüB4 (aromatyczny kwas karboksylowy)4 (Aromatic carboxylic acid)ÉßiCyklobutan CyclobutaneÖ^uSzukaj zwizku: Look for:Ö¥: Docelowe wizania bd oznaczone kolorem zielonym. Aby uzyska informacje dotyczce reakcji wpBywajcych na oznaczone wiznie, kliknij na to wizanie prawym klawiszem i wybierz Info. Aby usun oznaczenie, wybierz komend Cofnij z menu Edycja lub naci[nij Ctrl + Z.Ê Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z.ñWÎfKliknij czsteczk, aby uzyska jej charakterystyk$Click on a molecule for information÷Œ^x{adna reakcja z bazy nie prowadzi do zaznaczonej czsteczki.@No reactions in the database could yield the selected molecule.ø(>Zaokrglony ParenthesesøATSymulacja wsp. podziaBu oktanol-woda (Kow)&Predict octanol-water partition (Kow)ú”I$Kliknij czsteczkClick on a molecule¥(Zapisz jako obraz...Save as picture...éÎD5 (aromatyczna amina drugorzdowa)5 (aromatic secondary amine) ¼)&8 (kwas nadtlenowy)8 (Peroxy acid) S¹8180 stopni zgodnie z zegarem180 degree clockwise"FKliknij czsteczk, aby j wyrówna.Click on a molecule to clean up its structureG…4Charakterystyka czsteczkiMolecule Info^?.Serwer bazy danych XDC:XDC database server:öJ&Wyrównaj czsteczkClean up molecule¦åjKliknij czsteczk, aby wygenerowa jej widmo 13C NMR-Click on a molecule to calculate its 13C NMRMÂCzsteczka Molecule+¯e$Zapisano dokument  Saved file 5ŽÀ*Utwórz nowy pier[cieDCreate custom ring5þW&Pojedynczy elektronSingle electronX•žPomnijesz Zoom Out_PÔPomnijesz Zoom out_pÔ:BBd podczas otwierania plikuProblem while opening the filekºå &UsuD grupowanie Clear &grouplN€HWspóBczynnik podziaBu oktanol - wodaOctanol-water partitionx?ÞOrbital p p orbital‰x Poka| siatk Show grid–±Portret Portrait›ƒt,Substraty = %1 kJ/mol Reactants = %1 kJ/mol ¥vŠp podwójny p double¶À`Kliknij czsteczk, aby wygenerowa jej widmo IR(Click on a molecule to calculate its IR·éÂ4&O programie XDrawChem ... &About ...Ęž€Tryb dodawania symboli: naci[nij lewy przycisk, aby doda symbol+Draw Symbol mode: left click to add symbolľ¬<Nie mo|na rozpozna typu plikuCould not determine file typeÅ/õFObró o 90 stopni zgodnie z zegaremRotate 90 degrees clockwiseÇ>…4Wybierz typ pliku z listy.)Please select a file type from the list.äLTNarzdzie rysowania BaDcuchów<br><br> Narzdzie to jest u|ywane do rysowania BaDcuchów alifatycznych. Ka|de przesunicie powoduje utworzenie kolejnego fragmentu Bancucha.wChain tool

    Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length.ñvEdytor wizaD Bond editorôoWidmo IR IR spectrumôþ(Nie mo|na zaBadowa Unable to load |caleinchesžÃ8270 stopni zgodnie z zegarem270 degree clockwise"5Rzd wizania: Bond order:!È:4ZmieD ustawienia programu:Change XDrawChem settings:-oú*Analiza elementarna: Elemental analysis: -Ê*Ustawienia stron&y... Pa&ge setup/÷"DBugo[ strzaBki:Arrow fixed length:35ê4Narzdzie dodawania tekstuDraw or edit textHO´Dodaj nowe... Add new...HûnF4.5 (alifatyczny kwas karboksylowy) 4.5 (Aliphatic carboxylic acid)O!épNarzdzie rysowania obiektów graficznych: krzywa Beziera"Draw graphic object: cubic bezierVÑ\~1660-1600, C=C (cis/winyl silne; trans sBabe)/~1660-1600, C=C (cis/vinyl strong; trans weak)jÏÉpikselepixelspì3"Ustawienia strony Page setup|¬D~3300 (szerokie), drugorzdowe N-H~3300 (broad), secondary N-H}v8"Szeroko[ strony: Page width:‰ÇÊOszacowane pKa:Estimated pKa's:_º210 (aromatyczna grupa OH)10 (Aromatic -OH)‘ÉProduktProduct•»ôProlinaProline–0,Nie znaleziono reakcjiNo reactions found˜ö¤ Wstecz Backward¢Ü&Wstecz &Backward¢òAdeninaAdenine¬PTryptofan Tryptophan³Ô~tKliknij czsteczk, aby wykasowa jej przypisanie do grupy1Click on a molecule to clear it group assignment¹P4Zapisz obraz...Save picture...¿W.R~1475 (wskie), C=C pier[cieD aromatyczny"~1475 (narrow), aromatic ring C=CÎ}Intensywno[:  Intensity: ÐæNaci[nij ten przycisk, aby wklei fragment.<br><br>W tym celu mo|esz równie| wybra komend Wklej z menu Edycja lub nacisn klawisze Ctrl+V.zClick this button to paste a selection.

    You can also select the Paste command from the Edit menu, or press Ctrl+V.Ñ©>&Letter (8.5" x 11")Letter (8.5" x 11")Ñø~Narzdzie rysowania nawiasów<br><br>Narzdzie to u|ywane jest do rysowania nawiasów okrgBych i kwadratowych.<br><br>Naci[nij i przytrzymaj, aby wybra z listy dostpnych dostpnych nawiasów.²Bracket tool

    Use the Bracket tool to draw brackets and parentheses.

    Click to draw square brackets.

    Click and hold to select from a picture menu of brackets.ÖÐ.Normalne (100%)Normal (100%)ÝÉ6Narzdzie dodawania symboli Draw symbolå±Ì`Kliknij czsteczk, aby oznaczy j jako produkt.Click on a molecule to assign it as a productîƒT"Kwas asparaginowyAspartic acidððDNie mo|na otworzy podanego pliku. Cannot open the specified file.÷Áî:Krzywa Beziera - poBowa grotaCubic bezier - half arrowx'Zapisano obraz Saved picture file Ð$Obró o 180 stopniRotate 180 degrees‘AlaninaAlanine(P<W trybie zaznaczania mo|na uzyska charakterystyk czsteczki poprzez kliknicie czsteczki lewym przyciskiem myszy nad jej fragmentem trzymajc klawisz Ctrl.VWhen in select mode, press Ctrl+LeftButton on a molecule to get molecule information.HQn`Komenda "Wyrównaj czsteczk" z menu Narzdzia jest przydatna do polepszenia wygldu rysunku, np. wyrównanie pier[cieni do foremnych czy lepsze uBo|enie atomów makroczsteczki.wThe option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules.\á<BBd podczas zapisywania plikuProblem while writing the filek)e’Nie mo|na przekonwertowa pliku. Konwersja nie powiodBa si w ioiface.cpp>Cannot convert the molecule. Conversion failed in ioiface.cppl·*Cykloheksan (krzesBo)Cyclohexane (chair)€ÉLNaci[nij ten przycisk, aby pomniejszyClick this button to zoom out.‚GžAsparagina AsparagineƒV%0[*] Cykloheksan (pBaski)[*] Cyclohexane (flat)‰¹&Cykloheksan (Bódka)Cyclohexane (boat)Š¿I4Narzdzie rysowania wizaD Draw line—eÅ<Narzdzie rysowania pier[cieni Draw ring—ÅÇ BenzenBenzeneÆ Treonina ThreonineƵ4UsuD &wszystkie grupowaniaClear all &groupsÇiÓBCykloheksan - konformacja Bódkowa Cyclohexane - boat conformationËÉÞArginina ArginineàLÅ"Narzdzie rysowania wizaD falowanych<br><br> Narzdzie to jest u|ywane do rysowania wizaD falowanych, np. dla wizaD o nieoznaczonej geometrii.YWavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on the button.í$.[*] Benzen [*] Benzeneùõ:Edytor zakrzywionych strzaBekCurved Arrow editorûXÒ€Kliknij czsteczk, aby oszacowa jej wsp. podziaBu oktanol-woda=Click on a molecule to calculate its octanol-water partition VNR~1600 (wskie), C=C pier[cieD aromatyczny"~1600 (narrow), aromatic ring C=C %}<90 stopni przeciwnie do zegara90 degree counterclockwise 2v¥>270 stopni przeciwnie do zegara270 degree counterclockwise 2…>180 stopni przeciwnie do zegara180 degree counterclockwise 2†U(Masa czsteczkowa = Molecular weight =  9¤°0Symbol projekcji NewmanaNewman projection symbol ?¬ÜLRysuj BaDcuch alifatyczny - DBugo[ = !Draw aliphatic chain - Length =  KøàÞW trybie rysowania wizaD mo|na edytowa typ wizania po klikniciu prawym klawiszem myszy nad danym wizaniem.OWhen drawing bonds, you can edit the bond style by right-clicking on the bond. Tàn8Narzdzie rysowania strzaBek Draw arrow l!çUstawienia XDC XDC Settings r±s^Narzdzie zaznaczania<br><br>To narzdzie jest u|ywane do zaznaczania i przesuwania elementów.<br><br> Mo|na wybra kilka elementów, skopiowa je, wyci, przesuwa i obraca.˜Select tool

    Use the Select tool to select and move items inside a box.

    You can select multiple items and cut, copy, move and rotate them. vÉ.:Rozstaw wizania podwójnego: Double bond spacing: „ÀÚºTryb zaznaczania: naci[nij lewy przycisk, aby przesun obiekt lub prawy, aby obiekt edytowa*Select mode: left click on object to move †¦µ NawiasBracket ‡¡„6Plik czsteczki MDL (*.mol)MDL molfile (*.mol) —vÙ8Narzdzie dodawania symboli<br><br>Narzdzie to u|ywane jest do dodawania symboli.<br><br>Naci[nij i przytrzymaj, aby wybra z listy dostpnych symboli.<br>~Symbol tool

    Use the Symbol tool to insert symbols.

    Click and hold to select from a picture menu of symbols.
     ™mŽ&SygnaBy substratu: Peaks of reactant:  ™ùš*Produkty = %1 kJ/mol Products = %1 kJ/mol  Zj,A&utomatyczne uBo|enie Auto &layout ¤WäOtwórz plik... Open file... ¤Án Symulacja 1H NMRPredicted 1H-NMR ¦Òò&~1700 (wskie), C=O~1700 (narrow), C=O ¼îÏH13 (atom wgla midzy dwoma estrami)!13 (a-carbon between two esters) ½ó)D-Fruktoza D-fructose ¾åElKliknij czsteczk, aby zapisa j jako nowy pier[cieD0Click on a molecule to save it as a custom ring ÂòMo|na doBczy indeks dolny do nawiasów kwadratowych poprzez u|ycie 'Narzdzia dodawania tekstu' po klikniciu na nawias.bYou can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. ÉK^"Nie mo|na cofn!Cannot undo, sorry! äžqlKliknij czsteczk, aby wygenerowa jej BaDcuch SMILES3Click on a molecule to determine its SMILES string óÑ×(Inny rozmiar papieruCustom paper size úCÕRSzacowana zmiana entalpii w fazie gazowej$Estimate gas-phase enthalphy change )• Para elektronowaElectron pair ,ÍÒPrzezroczysty Transparent 3P~1350-1300, S=O (~1050 je[li R-(S=O)-R')&~1350-1300, S=O (~1050 if R-(S=O)-R') 4|ù,Ustawienie koloru &tBaSet background &color 9Ò"&Zaznacz wszystko Select &All ;fœnKliknij czsteczk, aby wygenerowa jej wspóBrzdne 3-D0Click on a molecule to generate 3-D coordinates RíÃhNarzdzie rysowania zakrzywionych strzaBek<br><br> Narzdzie to jest u|ywane do rysowania prostych strzaBek.<br><br> Naci[nij i przytrzymaj, aby wybra z listy dostpnych strzaBek.‹Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows.

    Click and hold to select from a picture menu of arrows. j¤^[*] Cykloheptan[*] Cycloheptane múåU|yteczne grupyUseful groups t·ÃXKliknij czsteczk, aby oszacowa jej pKa(s),Click on a molecule to calculate its pKa(s) wˆ¹.BBd porównania 13C NMR13C NMR compare error {áòzKliknij czsteczk, aby wygenerowa jej mo|liw retrosyntez.0Click on a molecule for possible retrosynthesis }Ò“`Narzdzie lasso<br><br>To narzdzie jest u|ywane do zaznaczania lassem i przesuwania elementów.<br><br> Mo|na wybra kilka elementów, skopiowa je, wyci, przesuwa i obraca.§Lasso tool

    Use the Lasso tool to select and move items by drawing a loop around them.

    You can select multiple items and cut, copy, move and rotate them. ’npKliknij czsteczk, aby obliczy jej skBad pierwiastkowy8Click on a molecule to calculate its elemental analysis ü#StatynaStatine ¨°L11 (pierwszorzdowa amina alifatyczna)11 (Aliphatic primary amine) ­yHistydyna Histidine ¯áENaftalen Naphthalene ´®µDomy[lneDefault ¼Œt stopnidegrees ¾‹£, intensywno[  , intensity  ¿FCykloheksan - konformacja krzesBowa!Cyclohexane - chair conformation Å‹î &Lista kontaktów &Support Çt$.1-3 (puryna/pirymidyna)1-3 (purine/pyrimidine) ʇÙrWprowadz lub edytuj indeksy dolny dla wybranego nawiasu: 4Please type or edit the subscript for this bracket: Í”Ê[*] Cyklobutan[*] Cyclobutane Ö¥&Podwójna dwustronnaSplit two-way arrow ÛÔÇäNaci[nij ten przycisk, aby otworzy dokument.<br><br> W tym celu mo|esz równie| wybra komend Otwórz z menu Plik.bClick this button to open a file.

    You can also select the Open command from the File menu. 棾4Naci[nij ten przycisk, aby wyci zaznaczony fragment.<br><br> W tym celu mo|esz równie| wybra komend Wytnij z menu Edycja lub nacisn klawisze Ctrl+X.vClick this button to cut a selection.

    You can also select the Cut command from the Edit menu, or press Ctrl+X. 죞xTryb gumowania: naci[nij lewy przycisk, aby wygumowa obiekt'Erase mode: left click to erase object û ÄSymulacja IR Predict IR ÿR&Operacje na plikachFile Operations ÿï“ TyminaThymine @RPodkre[lenie zaznaczonego tekstu (Ctrl+U)!Underline selected text (Ctrl+U) I©[*] Cyklooktan[*] Cyclooctane ¥Aadunek ujemnyNegative charge Ð&Zapisz plik jako...Save file as... Ø®J9-10 (pierwszorzdowa amina alkenowa)9-10 (Alkene-primary amine) &õ‰hKliknij czsteczk, aby obliczy jej wzór empiryczny7Click on a molecule to calculate its empirical formula ,1Przerywane Dashed line -§¥RZapytanie do bazy danych nie powiodBo siDatabase query failed 5ô$Ustawienia &XDC...&XDC settings... 58.*Podrcznik XDrawChe&m&Manual 8[\úNaci[nij ten przycisk, aby wydrukowa aktualny dokument.<br><br> W tym celu mo|esz równie| wybra komend Drukuj z menu Plik.vClick this button to print the file you are editing.

    You can also select the Print command from the File menu. 9¨ž"DBugo[ wizania:Bond fixed length: <ª6Rysuj wizanie - DBugo[ = Draw Line - Length =  P”pSubstrat Reactant z£ÔReakcja Reaction z«ÞÄTryb rysowania strzaBek: naci[nij lewy przycisk, aby narysowa strzaBk lub prawy, aby j edytowa*Draw Arrow mode: left click to draw arrow }Þ7PSzacowana zmiana entalpii fazy gazowej: &Estimated gas-phase enthalpy change:  ‚² "Symulacja 13C NMRPredicted 13C-NMR ‰@²lKliknij czsteczk, aby obliczy jej mas czsteczkow6Click on a molecule to calculate its molecular weight “ñ$ &Obró&Rotate –¨…lZmiana zaznaczonego tekstu na indeks górny (Ctrl-Plus)&Superscript selected text (Ctrl-Plus) š>9hSzacunkowy wsp. podziaBu oktanol-woda (log Kow) = %1:Estimated octanol-water partition constant (log Kow) = %1 ºBaDProjekcja Newmana - naprzeciwlegBaNewman projection - eclipsed ¼”„Tryb rysowania pier[cieni: kliknij lewym przyciskiem, aby doda %1%Draw Ring mode: left click to add %1 Å”áX&StrzaBka - dBugo[ i kt jak w ustawieniach &Arrow - Fixed length and angle Òhu Wysoko[ strony: Page height: Ø Symulacja 1H NMRPredict 1H NMR àÎ2.Wprowadz BaDcuch SMILESEnter SMILES string ãB(~1525 (wskie), -NO2~1525 (narrow), -NO2 ð0²$Czy nadpisa plik?Overwrite file? ò$ïDDodaj nowy pier[cieD do listy menuAdd custom ring to menu list øV„TAaDcuch SMILES dla zaznaczonej czsteczki:%SMILES string for selected molecule: ûUjOtwórz plik Open file šE0Wy[wietl rodzaj wizaniaGet bond identifier \b*Informacja o obiekcieObject information èžBNie pokazuj porad po uruchomieniu"Don't show this dialog at startup %vp ElipsaEllipse 3Õ0Tryb narzdzia testowegoTool test mode 9ZÕ*~3000 (szerokie), C-H~3000 (broad), C-H A„H*~2550 (szerokie), S-H~2550 (broad), S-H BIHŠTryb rysowania nawiasów: naci[nij lewy przycisk, aby narysowa nawias.Draw Bracket mode: left click to draw bracket TŒd&-1 (kwas sulfonowy)-1 (sulfonic acid) W9Klin przerywany Stereo-down Y^&Ustawienie czcionki Set Font dÑÄ&Wodór w pier[cieniuStereochemical ring hydrogen f¾&Ustawienie czcionki Set font fÑÄ"Czcionka &linijki &Ruler font mjtZmiana entalpiiEnthalpy change v5Zapisz plik Save file v—¥RetrosyntezaRetrosynthetic arrow >Klik wypeBniony Stereo-up Œ^`Aadunek dodatniPositive charge •ÓÅ.&Odno[niki literaturowe &References ¡Â8Ustawienie rozmiaru czcionkiSet font size ¢8Ustawienie rozmiaru czcionkiSet Font Size £îGlutamina Glutamine ¨ru04 (amina trzeciorzdowa)4 (tertiary amine) Η Nastpna porada Next tip ö€@,Niebieskie, to produktBlue is product ÷ä*Czerwone, to substratRed is reactant ©dLNarzdzie rysowania strzaBek<br><br> Narzdzie to jest u|ywane do rysowania prostych strzaBek.<br><br> Naci[nij i przytrzymaj, aby wybra z listy dostpnych strzaBek.¤Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click to draw a straight arrow.

    Click and hold to pick from a list of available arrows. >þ<W trybie zaznaczania mo|na zaznaczy caB czsteczk poprzez przecignicie kursorem myszynad jej fragmentem trzymajc klawisz Shift oraz lewy przycisk myszy.lWhen in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. ²^J10 (trzeciorzdowa amina alifatyczna)10 (aliphatic tertiary amine) [i216 (alifatyczna grupa OH)16 (Aliphatic -OH) ç‰DXDC - rodzimy format XDrawChem (*)"XDC - XDrawChem native format (*) ÉÙºTryb zaznaczania: naci[nij lewy przycisk, aby przesun obiekt lub prawy, aby obiekt edytowaISelect mode: left click on object to move, right click on object to edit 7ݤ8Narzdzie rysowania nawiasów Draw bracket ?(¤\dwa sygnaBy: ~3400, ~3300, pierwszorzdowe N-H%two peaks: ~3400, ~3300, primary N-H A÷È610,6 (alifatyczna grupa SH)10.6 (Aliphatic -SH) MàIfBrak fragmentów o warto[ciach pKa pomidzy -1 i 15.6There seem to be no sites with pKa between -1 and 15. VžNNarzdzie rysowania klinów wypeBnionychDraw stereo-up line gåForma&tForma&t i3”WzórFormula iLaNastpneForward iØÄ&Nastpne &Forward iÚ$Oszacowane pKaEstimated pKa's xÕóVNarzdzie rysowania BaDcuchów alifatycznychDraw aliphatic chain Ž ®ÚTryb rysowania wizaD przerywanych: naci[nij lewy przycisk, aby narysowa wizanie lub prawy, aby je edytowaDDraw Dashed Line mode: left click to draw line, right click to edit ©¤”8Naci[nij ten przycisk, aby skopiowa zaznaczony fragment.<br><br>W tym celu mo|esz równie| wybra komend Kopiuj z menu Edycja lub nacisn klawisze Ctrl+C.xClick this button to copy a selection.

    You can also select the Copy command from the Edit menu, or press Ctrl+C. ¬/>>Wyszukaj struktur w internecieFind structure via Internet ¯®äEdytor symboliSymbol editor º Ò&Reakcja = %1 kJ/molReaction = %1 kJ/mol ºáŒ*~3400 (szerokie), O-H~3400 (broad), O-H ¾XHÀTryb rysowania wizaD: naci[nij lewy przycisk, aby narysowa wizanie lub prawy, aby je edytowa=Draw Line mode: left click to draw line, right click to edit Æñt$C&zy wiesz, |e...?&Did You Know? È(o"Czy wiesz, |e...?Did You Know? È6rNale|y wybra co najmniej jeden substrat i jeden produkt.7You must select at least one reactant and one product. ЕN"Podwójne/potrójneDouble/triple Ô•e¸Narzdzie rysowania pier[cieni<br><br>Narzdzie to u|ywane jest do dodawania gotowych pier[cieni i struktur .<br><br>Naci[nij, aby przywoBa okno dialogowe pozwalajce wybra po|dana struktur.<br><br>Naci[nij i przytrzymaj, aby wybra z listy symbol po|danego pier[cienia.<br>(Informacje na temat modyfikacji tej list znajduj si w podrczniku)7Ring tool

    Use the Ring tool to insert ready-made rings and structures.

    Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.

    Click and hold to select from a picture menu of select rings.
    (See manual for more info on modifying this menu) Ý,‰ÐTryb rysowania klina wypeBnionego: naci[nij lewy przycisk, aby narysowa klin lub prawy, aby go edytowaGDraw Stereo-Up Line mode: left click to draw line, right click to edit ã`tD9 (a-wgiel midzy dwoma ketonami)!9 (a-carbon between two ketones) çÓùF11 (a-wgiel midzy dwoma ketonami)"11 (a-carbon between two ketones) çäy[*] BOC[*] BOC ÿGc`Wprowadz sekwencj peptydu - skróty trójliterowe5Enter peptide sequence - three-letter abbreviations:Í Nazwa chemicznaChemical name yå(Konstruktor peptydówPeptide BuilderÛB"Aczenie z sieciAccessing network;4Krzywa Beziera - caBy grotCubic bezier - full arrowL'pTryb zaznaczania: kliknij obiekt, który chcesz przesun5Select mode: left click to move, right click to edit1?NNarzdzie rysowania klinów przerywanychDraw stereo-down line2ôe0Wprowadz BaDcuch SMILES:Enter SMILES string:4 D-Glukoza D-glucose;á¥GlicynaGlycine? DCzy nadpisa istniejcy plik: %1 ?Overwrite existing file: %1 ?BŒ"Reakcje przeciwneReverse reactionseR#hKliknij czsteczk, aby wygenerowa jej widmo 1H NMR,Click on a molecule to calculate its 1H NMR}Â6Ustawienie grubo[ci wizaD:Bond thickness:ƒ-ú(Rozstaw linii siatki Grid spacingj74Wycentruj zaznaczony tekstCenter selected textŸÖ´GuaninaGuanine¸P,Ustawienia &rysunku...&Drawing settings...¿VNEdytor nawiasówBracket editorÁ’bKliknij czsteczk, aby oznaczy j jako substrat/Click on a molecule to assign it as a reactantÉ)Ô¨XDrawChem mo|e automatycznie doBcza aminokwasy z N-terminalnych do C-terminalnych.tXDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :)äôù~1690-1640, C=N~1690-1640, C=NíÄÎ"BBd danych We/WyIOIface Data errorûͲMetionina MethioninetålPoni|sze reakcje mog prowadzi do takiego produktu: ?The following reactions could have resulted in this product: Õ âTryb rysowania wizaD falowanych: naci[nij lewy przycisk, aby narysowa takie wizanie lub prawy, aby je edytowaBDraw Wavy Line mode: left click to draw line, right click to edit,ÓÄF11 (drugorzdowa amina alifatyczna)11 (aliphatic secondary amine);0 [*] EDANS [*] EDANSIÙÃ\3 (alifatyczny kwas karboksylowy, a-halogenek)(3 (Aliphatic carboxylic acid, a-halide)\õiÌNarzdzie rysowania wizaD przerywanych<br><br> Narzdzie to jest u|ywane do rysowania wizaD przerywanych. Rysowanie wizania przerywanego na istniejcym ju| wizaniu powoduje dodanie linii przerywanej (np. obrazujcej rezonans).”Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.).ee^"Grupy u|ytkownika User-defineduA„jKliknij czsteczk, aby wy[wietli rodzaje jej wizaD3Click on a molecule to display its bond identifier6¢Antracen AnthraceneƒåLNaci[nij ten przycisk, aby powikszy.Click this button to zoom in.ˆ¾$[*] Cyklopentadien[*] Cyclopentadiene“ÚµOdbij pio&nowoFlip &vertical˜ÐlPCDXML - format XML/tekstowy ChemDraw (*)%CDXML - ChemDraw text/XML format (*)š®¹4Tylko dokBadne dopasowaniaExact matches only¡˜¹Imidazol Imidazole©f*Nie mo|na zapisa do Could not write to ­#ÐAaDcuch SMILESSMILES stringµ†G¬Tryb rysowania BaDcuchów: naci[nij lewy przycisk i przecigniej, aby narysowa BaDcuch=Draw Chain mode: left click and drag to draw aliphatic chainÐ~Symulacja IR Predicted IRÓÞ^Aktualne informacje o programie XDrawChem s zawsze umieszczone na stronie http://xdrawchem.sourceforge.net/ Tam te| znajduje si zawsze ostatnia, aktualna wersja programu. Wszelkie bBdy nale|y zgBasza na SourceForge: http://www.sourceforge.net/tracker/?group_id=34518 S dwie listy dyskusyjne: xdrawchem-announce, w której ogBaszana jest kolejna, nowa wersja, oraz lista xdrawchem-user, na temat u|ytkowania programu XDrawChem. Subskrypcja ka|dej z listy polega na wysBaniu pustej wiadomo[ci z tematem: "subscribe" do "xdrawchem-announce-request@lists.sourceforge.net" lub "xdrawchem-user-request@lists.sourceforge.net" Mo|liwy jest konatakt bezpo[redni (w j. angielskim) z autorem poprzez: bherger@users.sourceforge.net Kontakt w sprawie polskiego tBumaczenia: http://chemlix.linux.pl oraz nkuznik@yahoo.com£Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.netؽt"Symulacja 13C NMRPredict 13C NMRÚÄ’&Typ przeszukiwania: Search type:áŽOrientacja: Orientation:âJSymulacja pKa Predict pKaò±[*] FMOC [*] FMOCôµãD6.8 (sprz|ona amina drugorzdowa)!6.8 (conjugated secondary amine)÷å9xdrawchem-v1.11.0/ring/xdrawchem_ru.qm000066400000000000000000001122201371466245600177440ustar00rootroot00000000000000<¸dÊÍ!¿`¡½ÝB °;#þF*ßmIhJÄ×´ÇŒ¯8¦ys§Ô¦»Ùì0ö55Ï~+Ô©ŒÔØÙÿå@2 rƒ*¦yÏ*»*Ð%5*Óa*ì0•*ö5Ã+f¾ +”ƒ?+˜Å„+įº,]ì:0Õ?±gWAî±F|ÅðJ+‚OJ6•Jcb±Lˆ•ÛLÚå RŠŸ STƒŠ VŠ¥ µWT çXýô Yã K\K —nÁl É„¼Ã ü‡æ ?G ³–›… 1ª¼õ d²jt —¶œõ ¹_ù õÁèÞ EÙô ÝÝ´.è°~ñÐþ¸õ)ã\ýmŠ•hÄ üw Ü,Ö Ÿ.¿N$•è/ßãT=c”?#ûGÉdHeôžŸeöžÕjÑ„ º„e_ñ’>Ë %NØþ¯(€’ò*%;/úÕz4òÅqÎU0† NË‘í~u™6Ô¿§–Ī6•=®–Àp¶Š¥¡·TÖ¹YBÀ×gË ÆÌ05öΖ%6ä×oëw£è,ù09Å%z:Rµ¹<:Õ>ìPNºä­^Æ”÷“æÕ =¬Èn s·² "‹½‰Ä#5½¸#¾ÀnY#ûÃÖà$£ʼ“% Ì`%?Õl %Ø„ó%Êò†¥&Oô T&Ø I'+ Iñ'Ö+|£(N0–J(“=yµ(×=¿z)C[Qc)À[sc*^›x*~s«ž+ Žg®,O˜ \,©˜I¼-œZÂ-D¶¹%-y¹Êå-ªÁ,¾-ÖƸÞ.ÉÆå`/+à—p/f¶%/ßò/ʳ€0@ t0e@ E0ÂH8À0ïO€Ô1&`N’1rc·%1«mf31ð|E2)–j2V›ˆ˜2¯œ+¤2ÞœE3œ©3<´3‹ N%4¦u4J«Ø“4ˆ¬Š4·°9\4ä±b5)¶ög5€¹%5¼Å j5íÈ0E6 Èyü6MÖ^u6|ú”I6¸¥7VéÎ7¨"8G…8~^?8ÊöJ9¦å9oMÂ9¿+¯e: 5ŽÀ:Y5þW:›X•ž;_PÔ;d_pÔ;›kºå;ÐlN€%Ç>…>äL?)ôo?À|@žÃ@†"5@³-ÊA"/÷Aq35êA¿HO´B/pì3B§|¬BÚ‰ÇÊC%_ºCg•»ôCº–0Cì¢ÜD¢òDK¬PD}³Ô~D­¿W.DæÑøEBÝÉE˜å±ÌEäîƒTFððFj÷ÁîF¼x'G>ÐGΑH0(PHHQnH¿\áIýk)eKŒl·Kù€ÉLïƒV%MQ‰¹MŠŠ¿IMÛ—eÅNF—ÅÇNŠÆ NòƵO"ÇiÓOVËÉÞO¬àLÅP0ùõPcûXÒPŸ VNQ 2v¥Qz 2…Qõ 2†URs 9¤°Rñ KøàSE TànS„ l!çT· †¦µU ‡¡„U` ZjUÌ ¤WäV* ¤ÁnV} ¦ÒòVÄ ¾åEW ÂWV ÉK^W¨ äžqXø óÑ×YN úCÕYŸ )•Z ,ÍÒZ› 3Zã 9Ò[# ;fœ[q múå[³ t·Ã[þ ü#\F ¨°\œ ¯áE\Ì ´®µ] ¼Œt]: ¾‹£]v Å‹î]¨ Çt$^# Ö¥^Z ÛÔÇ^¢ û Ä^ä ÿR_­ ÿï“_ô @`D I©`r ¥a ÐaS Ø®a¥ ,1aû -§¥bP 5ôb– 58.bê 8[\cA 9¨žc{ <ªdU P”pd¬ z£Ôdà z«Þe ‚² eP ‰@²eæ “ñ$f> –¨…f’ š>9fÊ Òhugv Øh àÎ2hO ò$ïh¤ øV„hô šEi} \bi» èžj' %vpj„ 3Õk TŒdkJ dÑÄk– v5kÛ v—¥l- >lo •ÓÅlî ¡Âm@ ¢mt £îmÎ ¨run( ö€@n^ ÷än• ©dná ²^o# 7ݤp ?(¤pö i3”q] iLaq iØÄqÁ iÚ$qñ xÕór$ Ž ®rv ©¤”rå ¯®äsG º Òs» ºáŒt È(ot` È6tŸ ЕNtÝ Ô•eu¦ ã`tuî yåvSL'v£1?w/;á¥w‚? wºBŒwêeR#xl}Âxªƒ-úxôŸÖ´yF¸Py±¿VNyãÁ’z>É)Ôz±ûͲzþtå{W,ÓÄ{Ž;0 {îuA„|g6¢|¼ƒå} ˆ¾}D“Úµ}€˜Ðl}Ô©f~+­#Ð~aÐ~~·ÓÞؽt[ÚÄ’‡¤áއúâJˆ9ò±ˆ|iˆÆOKOK;A<cm4N9<inþ&5@59B8&Go*ß@O<>C3>;L=8:BoxIhK@570BLCutJÄ&!>740BL&New´Ç2B><0B8G5A:8AutoŒ¯0?><=8BLCopy¦y&K@570BLCu&t§Ô&@02:0Edit» ><>ILHelpì0(5@A>=0;L=K9 :0B0;>3Homeö5 =4>;InfoÏ !;520Left+Ô K9B8QuitŒ>;=8AB0OWavyØÙ$>:C<5=B 703@C65= Loaded document å@ !@02=8BL 13C NMRCompare 13C NMR r&0?><=8BL&Copy*¦y&@02:0&Edit*» &$09;&File*Ð%&B@078BL&Flip*Ó ><>IL&Help*ì0(5@A>=0;L=K9 :0B0;>3&Home*ö5&B:@KBL&Open+f¾640x480 B>G5:640x480 pixels+”ƒ&!>E@0=8BL&Save+˜ÅB<5=8BL&Undo+į&0AHB01&Zoom,]8@8<848= Pyrimidine:0Õ21KG=0O AB@5;:0-C:070B5;L Plain arrow?±gÂ48=8FK 87<5@5=8O 4;8=K ;8=88, C3;0 =0:;>=0 =0AB@0820NBAO 2 @0D8G5A:8E 0AB@>9:0E 2 <5=N $>@<0B.aBond length, bond angle, and units are set in the Drawing Settings option under the Format menu.Aî05 2>7<>6=> >B:@KBL D09;Couldn't open fileF|ÅG8AB8BLClearJ+‚0:@KBLCloseJ6•&25BColorJcb!B5@5BLEraseLˆ•&8:;>?5=B0485=CyclopentadieneLÚå 0AA>LassoRŠŸ0720=85: Name:TƒŠAB028BLPasteVŠ¥0?5G0B0BLPrintWT !?@020RightXýô*&8:;8G5A:85 AB@C:BC@KRingsYãB<5=8BLUndo!\K8D5=8; BiphenylnÁlAB028BL D09; Input SMILES„¼ÃF>B>2K5 AB@C:BC@=K5 D>@<C;K 25I5AB2Canned Structures‡æP1>7=0G5=85 87>3=CB>9 AB@5;:8-C:070B5;O Draw curved arrowG"8@>78= Tyrosine–›…&8AB58= Cysteineª¼õ  Snap to grid²jt&8B>78= Cytosine¶œõK1@0BL D8;LB@--Select a filter-- (*)¹_ùN5B 70?@0H8205<KE <>;5:C; 2 1075 40==KE.No molecules in the database match the query.ÁèÞ$K1@0BL &>2B>@8BLSelect &ReactantÙô&C:;58=>2K5 :8A;>BKNucleic acidsÝ´=0;87 =  Analysis = è° .‚You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid.ñÐþ'B> MB>? What's &Thisõ)ãD#:070BL D8:A8@>20==K9 C3>; =0:;>=0Bond fixed angle:ýmŠ8@>?CI5= @5035=B 8;8 ?@>4C:BMissing reactant or producthÄ2>:070BL :204@0B=CN A5B:CShow square grid ü.&B<5=8BL 2AQ 2K45;5=85&Deselect All Ü,Œ 568< 0AA>: 06<8B5 ;52CN :=>?:C <KH8 8 45@68B5 GB>1K 2K45;8BL ;0AA> .Lasso mode: left click and hold to draw lasso ŸŒ>609;CAB0, 2K15@8B5 B>;L:> >48= @5035=B 8 >48= ?@>4C:B 4;O A@02=5=8O.2 ?> G0A>2>9 AB@5;:890 degree clockwise$•<8=>:8A;>BK Amino acids/ßã IDraw Stereo-Down Line mode: left click to draw line, right click to edit=c"204@0B=K5 A:>1:8Square bracket?#*-:A?>@B8@>20BL !?8A>:Export Peak ListGÉd#25;8G8BLZoom Ineôž@81;878BLZoom ineöž(;NB0<8=>20O :8A;>B0Glutamic acidjÑ„8'0AB8G=> ?>;>68B5;L=K9 70@O4Partial positive chargeº„eF52>7<>6=> 70?8A0BL C:070==K9 D09;.!Cannot write the specified file.ñ’>4 8A>20=85 ?C=:B8@=>9 ;8=88Draw dashed line %(8@8=0 1C<038 Please wait.Øþ C18G5A:>5 57L5 Cubic bezier(€’&8:;>?5=B0= Cyclopentane*%[*] &8:;>?5=B0=[*] Cyclopentane/úÕB 540:B8@>20=85 AB@5;>:-C:070B5;59 Arrow editor4ò\@0I5=85 =0 90 3@04CA>2 ?@>B82 G0A>2>9 AB@5;:8#Rotate 90 degrees counterclockwiseqÎU06<8B5 MBC :=>?:C, GB>1K A>E@0=8BL D09;, :>B>@K9 2K @540:B8@C5B5. <br><br> K B0:65 <>65B5 2K1@0BL :><0=4C A>E@0=8BL 2 <5=N $09;<br><br>|Click this button to save the file you are editing.

    You can also select the Save command from the File menu.

    † N"!>E@0=8BL &:0:... Save &as...‘í~:;NG8BL A5B:C Toggle &grid™6Ô ?@>3@0<<5&About§–Ä&0:@KBL&Closeª6•&@C??0&Group®–À&AB028BL&Paste¶Š¥&5G0BL&Print·T2#AB0=>28BL F25B @8A>20=8OSet drawing color¹YB6(B@8E>20O AB@5;:0-C:070B5;L Dashed arrowÀ× 59F8=LeucineË $5=8;0;0=8=PhenylalanineÌ057>;59F8= IsoleucineΖ%P 540:B>@ 4;O 2K3=CBKE AB@5;>:-C:070B5;59 Curved Arrowä×1024x768 B>G5:1024x768 pixelsëw£!B5@>84 Steroid (fused ring template),ù&8:;>?@>?0= Cyclopropane9Å% .Left-click to draw Newman projection template:Rµ[*] &8:;>?@>?0=[*] Cyclopropane<:Õ0B>1@078BL 3>@87>=B0;L=>Flip &horizontal>ì >;=8ABK5 A:>1:8Curly bracketNºä25AB8 8=45:AEnter subscript^Æ”0AHB01 Zoom = %1 %“æÕr(01;>=K 0@><0B8G5A:>3> :>;LF0 8 <>;5:C;K 4>ABC?=K 2 8=AB@C<5=B0E 0@><0B8G5A:>3> :>;LF0,2:;NG0NI8E :0: >48=>G=K5, B0: 1>;LH53> :>;8G5AB20 0@><0B8G5A:85 :>;LF0, 0<8=>:8A;>BK 8 =C:;5>B84K.ŠA number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides.¬Ènf!45;0BL 2K45;5==K9 B5:AB <b>?>;C68@=K<</b> (Ctrl+B)(Make selected text bold (Ctrl+B)·² RK@>2=OBL 2K45;5==K9 B5:AB ?> ;52><C :@0NLeft-justify selected text½‰Ä@54K4CI89 Previous tip½¸d<i>!45;0BL :C@A82=K<</i> 2K45;5==K9 B5:AB (Ctrl-I)(Italicize selected text (Ctrl+I)ÀnY25 2>7<>6=> >B:@KBL D09; Could not open the file: ÃÖà KE>4Output SMILESʼ“"&09B8 2 =B5@=5B&Find on InternetÌ`<848=>10.5 (Guanidine)Õl L2B><0B8G5A:8 >102;OBL &8>=K 2>4>@>40Automatically Add &hydrogensØ„óN&8=88 A2O78 D8:A8@CNBAO 4;8=>9 8 C3;><&Bond - Fixed length and angleò†¥&5 ?>:07K20BL A5B:CDo not show gridô Tj!45;0BL 2K45;5==K9 B5:AB =86=8< 8=45:A>< (Ctrl-Minus)%Subscript selected text (Ctrl-Minus) ID52>7<>6=> A>E@0=8BL 87>1@065=85 !Unable to save picture! Iñ800x600 B>G5:800x600 pixels+|£ 07<5@ 1C<038: Paper size:0–J8'0AB8G=> >B@8F0B5;L=K9 70@O4Partial negative charge=yµN#:070BL C3>; =0:;>=0 AB@5;:8-C:070B5;O:Arrow fixed angle:=¿z0#AB0=>28BL B>;I8=C ;8=88Set line thickness[Qc0#AB0=>28BL B>;I8=C ;8=88Set Line Thickness[scT#:070BL D8:A8@>20==CN 4;8=C 8 C3>; =0:;>=0Set fixed angle and length^›xàK <>65B5 @540:B8@>20BL 1>;LH8=AB2> >1J5:B>2 =060B85< ?@02>9 :=>?:8 <KH8 =0 =8E, :>340 2:;NG5= 2K45;O5<K9 @568<.JWhen in select mode, you can edit most objects by right-clicking on them.s«ž.>;5:C;O@=0O 8=D>@<0F8ONo information.Žg®B=AB@C<5=BK 0@><0B8G5A:>3> :>;LF0 Ring tool˜ \B<5=8BLCancel˜I¼> F5=B@CCenterœZÂ2>9=0ODouble¶¹%84 Landscape¹Êå–0?><=8B5 2K1@0==K9 B8? D09;0, :>340 >B:@K20NBAO 8;8 A>E@0=ONBAO 4>:C<5=BK.ARemember to select a file type when opening or saving documents.Á,¾.>;5:C;O@=0O 8=D>@<0F8OMolecule information...ƸÞ$>@<C;0 =  Formula = Æå`, 0:;>= , Angle = à—p =4>;Indole¶%!@02=8BL 1H NMRCompare 1H NMRßò&0: ?>;CG8BL ?><>ILHow to get help³€2 8A>20=85 2>;=8AB>9 ;8=88Draw wavy bond@ t 878=Lysine@ E0720=85: Name: H8À K1@0BL &@>4C:BSelect &ProductO€ÔCAS =><5@ CAS Number`N’0?5G0B0BL D09; Print filec·%=AB@C<5=BKT&oolsmf3 C@8=Purine|E*!>E@0=8BL D09; :0:...Save 3D file as...–j A:0BLSearch›ˆ˜K1@0BLSelectœ+¤ !5@8=SerineœE 8B@>D5=8;0;0=8=Nitrophenylalanineœ©RK@>2=OBL 2K1@0==K9 B5:AB ?> ?@02><C :@0NRight-justify selected text´48=0@=0OSingle N%&8:;>35:A0= Cyclohexane¦u !0E0@0Sugars«Ø“ !B8;LStyle:¬Š" 540:B>@ A8<2>;>2Symbol°9\"48=0@=0O/2>9=0OSingle/double (aromatic)±b , click to paste into drawing¶ög"@>9=0OTriple¹%48=8FK:Units:Å j 0;8=ValineÈ0E #@0A8;UracilÈyü&8:;>1CB0= CyclobutaneÖ^u\@54CA<>B@5BL :>=AB0=BC 48AA>F80F88 2>4K (Kow)&Predict octanol-water partition (Kow)ú”I"G8AB8BL <>;5:C;CClick on a molecule¥8!>E@0=8BL :0: 87>1@065=85...Save as picture...éÎ>180 3@04CA>2 ?> G0A>2>9 AB@5;:5180 degree clockwise" .Click on a molecule to clean up its structureG…*=D>@<0F8O > <>;5:C;5Molecule Info^? XDC 1070 A5@25@0XDC database server:öJ"G8AB8BL <>;5:C;CClean up molecule¦å -Click on a molecule to calculate its 13C NMRMÂ*=D>@<0F8O > <>;5:C;5 Molecule+¯e$09; A>E@0=5= Saved file 5ŽÀT!>740BL A>1AB25==CN F8:;8G5A:CN AB@C:BC@C Create custom ring5þW48= M;5:B@>=Single electronX•ž#<5=LH8BL Zoom Out_PÔB40;8BL Zoom out_pÔ6@>1;5<0 ?@8 >B:@KB88 D09;0Problem while opening the filekºå G8AB8BL &3@C??C Clear &grouplN€p >@18B0;L p orbital‰x >:070BL A5B:C Show grid–±>@B@5B Portrait›ƒt, 5035=BK= = %1 kJ/mol Reactants = %1 kJ/mol ¥vŠ (Click on a molecule to calculate its IR·é & ?@>3@0<<5 ... &About ...Ęž>52>7<>6=> >?@545;8BL B8? D09;0Could not determine file typeÅ/õT@0I5=85 =0 90 3@04CA>2 ?> G0A>2>9 AB@5;:5Rotate 90 degrees clockwiseÇ>…R>609;CAB0, 2K15@8B5 B8? D09;0 87 A?8A:0.)Please select a file type from the list.äL4 540:B8@>20=85 ;8=88 A2O78 Bond editorôo>52>7<>6=> ?@>8725AB8 703@C7:C Unable to load | 4N9<KinchesžÃ>270 3@04CA>2 ?> G0A>2>9 AB@5;:8270 degree clockwise"5A=>2=>9 0=0;87Elemental analysis: -Ê&0@0<&5B@K AB@0=8FK Pa&ge setup/÷@#:070BL 4;8=C AB@5;:8-C:070B5;O:Arrow fixed length:35êJ!>AB02;5=85 8;8 @540:B8@>20=85 B5:AB0Draw or edit textHO´?8:A5;59pixelspì3$0AB@>9:0 AB@0=8FK Page setup|¬(8@8=0 1C<038 Page width:‰ÇÊ& 0AAG8B0==K9 pKa's:Estimated pKa's:_º@>4C:BProduct•»ô @>;8=Proline–0 0704 Backward¢Ü &0704 &Backward¢ò 45=8=Adenine¬P"@8?B>D0= Tryptophan³Ô~0!>E@0=8BL 87>1@065=85...Save picture...¿W.&Letter (8.5" x 11")Letter (8.5" x 11")Ñø">@<0;L=K9 (100%)Normal (100%)ÝÉ 8A>20=85 Draw symbolå±Ì .Click on a molecule to assign it as a productîƒT(A?0@38=>20O :8A;>B0Aspartic acidððF5 2>7<>6=> >B:@KBL C:070==K9 D09;. Cannot open the specified file.÷ÁîZC18G5A:>5 57L5 - ?>;>28=0 AB@5;:8-C:070B5;OCubic bezier - half arrowx'2@0D8G5A:89 D09; A>E@0=5=Saved picture file Ð0@0I5=85 =0 180 3@04CA>2Rotate 180 degrees‘ ;0=8=Alanine(PÌ K45;O5<>< @568<5, =06<8B5 Ctrl+52CN :=>?:C <KH8 =0 <>;5:C;5, GB>1K ?>;CG8BL 8=D>@<0F8N > <>;5:C;5.VWhen in select mode, press Ctrl+LeftButton on a molecule to get molecule information.HQnü?F8O "G8AB8BL <>;5:C;C" 2 <5=N =AB@C<5=BK <>65B 1KBL 8A?>;L7>20=0 4;O C40;5=8O AB@C:BC@ B0:8E :0: :>;LF0 8;8 <0:@><>;5:C;K.wThe option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules.\á2@>1;5<0 ?@8 70?8A8 D09;0Problem while writing the filek)eœ@52@0I5=85 <>;5:C;K =52>7<>6=>. @5>1@07>20=85 =0@CH8;>AL 2 D09;5 ioiface.cpp>Cannot convert the molecule. Conversion failed in ioiface.cppl·2&8:;>35:A0= (D@>=B0;L=K9)Cyclohexane (chair)€ÉA?0@038= AsparagineƒV%[*] &8:;>35:A0=[*] Cyclohexane (flat)‰¹<&8:;>35:A0= (?@>AB@0=AB25==K9)Cyclohexane (boat)Š¿I 8A>20=85 ;8=88 Draw line—eÅB1>7=0G5=85 F8:;8G5A:>9 AB@C:BC@K Draw ring—ÅÇ 5=7>;BenzeneÆ $@5>=8= ThreonineƵ(G8AB8BL 2A5 &3@C??KClear all &groupsÇiÓH&8:;>35:A0= - ?@>AB@0=AB25==0O D>@<0 Cyclohexane - boat conformationËÉÞ@38=8= ArginineàLÅ[*] 5=7>; [*] BenzeneùõP 540:B>@ 4;O 2K3=CBKE AB@5;>:-C:070B5;59Curved Arrow editorûXÒ =Click on a molecule to calculate its octanol-water partition VND90 3@04CA>2 ?@>B82 G0A>2>9 AB@5;:890 degree counterclockwise 2v¥F270 3@04CA>2 ?@>B82 G0A>2>9 AB@5;:8270 degree counterclockwise 2…F180 3@04CA>2 ?@>B82 G0A>2>9 AB@5;:8180 degree counterclockwise 2†U$>;5:C;O@=0O <0AA0Molecular weight =  9¤° !Draw aliphatic chain - Length =  KøàÈ>340 @8ACNBAO ;8=88-A2O78, K <>65B5 @540:B8@>20BL AB8;L ;8=88 =060B85< ?@02>9 :=>?:8 <KH8 =0 =59 .OWhen drawing bonds, you can edit the bond style by right-clicking on the bond. Tàn:1>7=0G5=85 AB@5;:8-C:070B5;O Draw arrow l!ç *Select mode: left click on object to move †¦µH 540:B8@>20=85 @0745;8B5;L=KE A:>1>:Bracket ‡¡„,@>4C:BK= = %1 kJ/mol Products = %1 kJ/mol  Zj*2B><0B8G5A:89 &<0:5B Auto &layout ¤WäB:@KBL D09;... Open file... ¤Án*@54CA<>B@5BL 13C NMRPredicted 1H-NMR ¦ÒòD-D@C:B>70 D-fructose ¾åE4> 0Click on a molecule to save it as a custom ring ÂÒK <>65B5 ?@8A>548=8BL 8=45:A : @0745;8B5;L=K< A:>1:0< 2K1@02 B5:AB>2K5 =0AB@>9:8, 70B5< =0602 =0 A:>1:C bYou can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. ÉK^&52>7<>6=> >B<5=8BLCannot undo, sorry! äžq 3Click on a molecule to determine its SMILES string óÑ×<>;L7>20B5;LA:89 @07<5@ 1C<038Custom paper size úCÕRF5=8BL 87<5=5=8O 307>2>9 D>@<K M=B0;L?88$Estimate gas-phase enthalphy change )•0@0 M;5:B@>=>2Electron pair ,ÍÒ@>7@0G=>ABL Transparent 30AB@>9:0 D>=0Set background &color 9ÒK45;8BL &2AQ Select &All ;fœ[*] &8:;>35?B0=[*] Cycloheptane múå>;57=K5 3@C??KUseful groups t·Ã 8Click on a molecule to calculate its elemental analysis ü# !B0B8=Statine ¨°8AB848= Histidine ¯áE0DB0;8= Naphthalene ´®µ> C<>;G0=8NDefault ¼Œt3@04CAKdegrees ¾‹£>&8:;>35:A0= - D@>=B0;L=0O D>@<0!Cyclohexane - chair conformation Å‹î>445@6:0 &Support Çt$[*] &8:;>1CB0=[*] Cyclobutane Ö¥> G0ABO<Split two-way arrow ÛÔdž!B8@0B5;L=K9 @568<: 06<8B5 ;52CN :=>?:C <KH8, GB>1K C40;8BL >1J5:B'Erase mode: left click to erase object û Ä @54CA<>B@5BL IR Predict IR ÿR$?5@0F88 A D09;0<8File Operations ÿï“ $8<8=Thymine @\!45;0BL 2K45;5==K9 B5:AB ?>4GQ@:=CBK< (Ctrl+U)!Underline selected text (Ctrl+U) I©[*] &8:;>>:B0=[*] Cyclooctane ¥&B@8F0B5;L=K9 70@O4Negative charge Ð*!>E@0=8BL D09; :0:...Save file as... Ø® 7Click on a molecule to calculate its empirical formula ,1(B@8E>20O ;8=8O Dashed line -§¥"0?@>A =52>7<>65=Database query failed 5ô*@0D8G5A:85 =0AB@>9:8&XDC settings... 58. C:>2>4AB2>&Manual 8[\H4> <br><br> 0?5G0B0BL :><0=40 $09;.vClick this button to print the file you are editing.

    You can also select the Print command from the File menu. 9¨ž(#:070BL 4;8=C ;8=88:Bond fixed length: <ª Draw Line - Length =  P”p 5038@>20BL Reactant z£Ô59AB285 Reaction z«ÞTF5=5=K 87<5=5=8O 307>2>9 D07K M=B0;L?88: &Estimated gas-phase enthalpy change:  ‚² *@54CA<>B@5BL 13C NMRPredicted 13C-NMR ‰@² 6Click on a molecule to calculate its molecular weight “ñ$&>25@=CBL&Rotate –¨…j!45;0BL 2K45;5==K9 B5:AB 25@E=8< 8=45:A>< (Ctrl-Plus)&Superscript selected text (Ctrl-Plus) š>9Z&!B@5;:8-C:070B5;8 D8:A8@CNBAO 4;8=>9 8 C3;>< &Arrow - Fixed length and angle ÒhuKA>B0 1C<038 Page height: Ø*@54CA<>B@5BL 13C NMRPredict 1H NMR àÎ2$5@570?8A0BL D09;?Overwrite file? ò$ïP>1028BL 2 A?8A>: F8:;8G5A:>5 A>548=5=85Add custom ring to menu list øV„B:@KBL D09; Open file šE<>;CG8BL A2O7=>9 845=B8D8:0B>@Get bond identifier \b.>;5:C;O@=0O 8=D>@<0F8OObject information èžX5 ?>:07K20BL MB> >:=> ?@8 A;54CNI5< 70?CA:5"Don't show this dialog at startup %vp -;;8?AEllipse 3Õ .Draw Bracket mode: left click to draw bracket TŒd #AB0=>28BL H@8DB Set Font dÑÄ&7<5=5=8O M=B0;L?88Enthalpy change v5!>E@0=8BL D09; Save file v—¥N!B@5;:0-C:070B5;L 4;O >1@0B=>3> A8=B570Retrosynthetic arrow >&>;>68B5;L=K9 70@O4Positive charge •ÓÅ !AK;:8 &References ¡Â0#AB0=>28BL @07<5@ H@8DB0Set font size ¢0#AB0=>28BL @07<5@ H@8DB0Set Font Size £î;NB0<8= Glutamine ¨ru!;54CNI89 Next tip ö€@ K1@0BL &@>4C:BBlue is product ÷ä 5038@>20BLRed is reactant ©dä K45;O5<>< @568<5, =06<8B5 Shift + 52CN :=>?:C <KH8 8 2K15@5B5 G0AB8 <>;5:C;K, GB>1K 2K45;8BL F5;CN <>;5:C;C .lWhen in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. ²^ ISelect mode: left click on object to move, right click on object to edit 7ݤ>1>7=0G5=85 A:>1>:-@0745;8B5;59 Draw bracket ?(¤$>@<0&BForma&t i3”$>@<C;0Formula iLa ?5@54Forward iØÄ&?5@54 &Forward iÚ$& 0AAG8B0==K9 pKa's:Estimated pKa's xÕó> 8A>20=85 783703>>1@07=>9 ;8=88Draw aliphatic chain Ž ® DDraw Dashed Line mode: left click to draw line, right click to edit ©¤”<09B8 AB@C:BC@C G5@57 =B5@=5BFind structure via Internet ¯®ä" 540:B>@ A8<2>;>2Symbol editor º Ò( 5035=B= = %1 kJ/molReaction = %1 kJ/mol ºáŒK 7=0;8 ?&Did You Know? È(oK 7=0;8 ?Did You Know? È6vK 4>;6=K 2K1@0BL ?> :@09=59 <5@5 >48= @5035=B 8;8 ?@>4C:B.7You must select at least one reactant and one product. ЕN2>9=0O/"@>9=0ODouble/triple Ô•e GDraw Stereo-Up Line mode: left click to draw line, right click to edit ã`t&%8<8G5A:>5 =0720=85Chemical name yåVC18G5A:>5 57L5 - ?>;=0O AB@5;:0-C:070B5;LCubic bezier - full arrowL' 5Select mode: left click to move, right click to edit1?D-3;N:>70 D-glucose;ᥠ;8F8=Glycine? H5@570?8A0BL ACI5AB2CNI89 D09;: %1 ?Overwrite existing file: %1 ?BŒ59AB285Reverse reactionseR# ,Click on a molecule to calculate its 1H NMR}Â&">;I8=0 ;8=89 A2O78Bond thickness:ƒ-ú:&5=B@8@>20BL 2K45;5==K9 H@8DBCenter selected textŸÖ´<848=>Guanine¸P*@0D8G5A:85 =0AB@>9:8&Drawing settings...¿VNH 540:B8@>20=85 @0745;8B5;L=KE A:>1>:Bracket editorÁ’ /Click on a molecule to assign it as a reactantÉ)Ô*IOIface >H81:0 40==KEIOIface Data errorûͲ5B8>=8; Methioninetå BDraw Wavy Line mode: left click to draw line, right click to edit,ÓÄ> 8A>20=85 783703>>1@07=>9 ;8=8811 (aliphatic secondary amine);0 ,>;L7>20B5;LA:89 2K1>@ User-defineduA„ 3Click on a molecule to display its bond identifier6¢=B@0F5= Anthraceneƒå.Click this button to zoom in.ˆ¾$[*] &8:;>?5=B0485=[*] Cyclopentadiene“Úµ,B>1@078BL 25@B8:0;L=>Flip &vertical˜Ðl<8407>; Imidazole©f&0?8AL =52>7<>6=0 Could not write to ­#Ð =Draw Chain mode: left click and drag to draw aliphatic chainÐ~ @54CA<>B@5BL IR Predicted IRÓÞŠK <>65B5 =09B8 ?>A;54=NN 8=D>@<0F8N ?> XDrawChem =0 A09B5 http://xdrawchem.sourceforge.net/ "0< ?C1;8:C5BAO 8=D>@<0F8O > ?>A;54=8E @5;870E, B0: 65 :0: AAK;:8 =0 A?8A:8 @0AAK;:8 8 A8AB5<C A>>1I5=8O > =0945==KE >H81:0E. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" K <>65B5 A2O70BLAO =0?@O<CN A 02B>@><: bherger@users.sourceforge.net£Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.netؽt*@54CA<>B@5BL 13C NMRPredict 13C NMRÚÄ’A:0BL B8?: Search type:Ꭰ0A?>;>65=85: Orientation:âJ"@54CA<>B@5BL pKa Predict pKaò±xdrawchem-v1.11.0/ring/xdrawchemrc000066400000000000000000000002011371466245600171420ustar00rootroot00000000000000FIXED_ARROW false FIXED_BOND true FIX_HYDROGENS false ARROW_LENGTH 50 ARROW_ANGLE 15 BOND_LENGTH 25 BOND_ANGLE 15 DBOND_OFFSET 1 xdrawchem-v1.11.0/ring_cml/000077500000000000000000000000001371466245600155525ustar00rootroot00000000000000xdrawchem-v1.11.0/ring_cml/6ring_boat.cml000066400000000000000000000035121371466245600203020ustar00rootroot00000000000000 Wed Sep 19 16:40:28 2001 XDrawChem 0.9 C 130.304 88.1924 0 C 130.304 71.5173 0 C 98.5273 88.1924 0 C 79.3101 102.068 0 C 71.7896 71.3962 0 C 111.132 102.159 0 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/6ring_chair.cml000066400000000000000000000034651371466245600204520ustar00rootroot00000000000000 Sun Sep 16 21:28:24 2001 XDrawChem 0.9 C 62.4751 50 0 C 50 71.6062 0 C 73.9972 64.7449 0 C 98.133 71.6062 0 C 110.608 50 0 C 86.6109 56.8613 0 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/adenine.cml000066400000000000000000000056671371466245600176700ustar00rootroot00000000000000 Fri May 25 17:45:28 2001 XDrawChem 0.9 C 163.303 106.002 0 C 206.604 131.002 0 C 206.604 181.002 0 N 163.303 206.002 0 C 120.001 181.002 0 N 120.001 131.002 0 N 254.9 118.061 0 N 254.9 193.943 0 C 290.255 153.416 0 N 163.303 56.0016 0 1 2 1 2 1 2 1 1 2 1 1 xdrawchem-v1.11.0/ring_cml/alanine.cml000066400000000000000000000033271371466245600176630ustar00rootroot00000000000000 Fri May 25 17:55:45 2001 XDrawChem 0.9 N 104 133 0 C 147.301 108 0 C 190.603 133 0 O 190.603 183 0 O 233.904 108 0 C 147.301 58 0 1 1 2 1 1 xdrawchem-v1.11.0/ring_cml/anthracene.cml000066400000000000000000000102761371466245600203650ustar00rootroot00000000000000 Mon Jun 10 15:16:33 2002 XDrawChem 1.3.2 C 57.3209 40 C 74.641 50 C 74.641 70 C 57.3209 80 C 40 70 C 40 50 C 91.9612 40 C 109.282 50 C 109.282 70 C 91.9612 80 C 126.602 40 C 143.923 50 C 143.923 70 C 126.602 80 a0 a1 1 a1 a2 2 a2 a3 1 a3 a4 2 a4 a5 1 a5 a0 2 a1 a6 1 a6 a7 2 a7 a8 1 a8 a9 2 a9 a2 1 a7 a10 1 a10 a11 2 a11 a12 1 a12 a13 2 a13 a8 1 xdrawchem-v1.11.0/ring_cml/arginine.cml000066400000000000000000000064211371466245600200460ustar00rootroot00000000000000 Fri May 25 18:07:39 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 221.657 182.645 0 C 186.301 147.289 0 N 221.657 111.934 0 C 186.301 76.5786 0 NH2+ 221.657 41.2233 0 N 150.946 41.2233 0 1 1 1 2 1 1 1 1 1 2 1 xdrawchem-v1.11.0/ring_cml/asparagine.cml000066400000000000000000000047631371466245600203730ustar00rootroot00000000000000 Fri May 25 18:04:05 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 211.301 174.699 0 N 186.301 131.397 0 O 261.301 174.699 0 1 1 1 2 1 1 1 2 xdrawchem-v1.11.0/ring_cml/aspartic_acid.cml000066400000000000000000000047661371466245600210520ustar00rootroot00000000000000 Fri May 25 18:09:20 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 221.657 182.645 0 O 186.301 147.289 0 O 271.657 182.645 0 1 1 1 2 1 1 1 2 xdrawchem-v1.11.0/ring_cml/benzene.cml000066400000000000000000000034651371466245600177050ustar00rootroot00000000000000 Sun Feb 25 18:00:44 2001 XDrawChem 0.84alpha C 223.651 252 0 C 245.301 264.5 0 C 245.301 289.5 0 C 223.651 302 0 C 202 289.5 0 C 202 264.5 0 1 2 1 2 1 2 xdrawchem-v1.11.0/ring_cml/biotin.cml000066400000000000000000000125141371466245600175360ustar00rootroot00000000000000 Wed Jul 6 20:56:22 2005 XDrawChem 1.9.7 C 94.0001 175 C 144 175 N 159.451 127.447 N 78.5493 127.447 C 119 98.0581 C 69.0001 218.301 C 169 218.301 S 117.699 248.301 C 212.301 243.301 C 255.603 218.301 C 298.904 243.301 C 342.205 218.301 C 385.506 243.301 O 428.808 218.301 O 385.506 293.301 O 119 48.0581 H 44.0001 175 H 194 175 a0 a1 1 a1 a2 1 a0 a3 1 a3 a4 1 a2 a4 1 a0 a5 1 a1 a6 1 a6 a7 1 a5 a7 1 a6 a8 7 H a8 a9 1 a9 a10 1 a10 a11 1 a11 a12 1 a12 a13 1 a12 a14 2 a4 a15 2 a0 a16 5 W a1 a17 5 W xdrawchem-v1.11.0/ring_cml/biphenyl.cml000066400000000000000000000071431371466245600200660ustar00rootroot00000000000000 Mon Jun 10 15:29:32 2002 XDrawChem 1.3.2 C 103.399 238.921 C 93.3993 256.241 C 73.3993 256.241 C 63.3992 238.921 C 73.3993 221.601 C 93.3993 221.601 C 123.399 238.921 C 133.399 221.601 C 153.399 221.601 C 133.399 256.242 C 163.399 238.922 C 153.399 256.242 a0 a1 1 a1 a2 2 a2 a3 1 a3 a4 2 a4 a5 1 a5 a0 2 a0 a6 1 a6 a7 2 a7 a8 1 a6 a9 1 a8 a10 2 a10 a11 1 a11 a9 2 xdrawchem-v1.11.0/ring_cml/boc.cml000066400000000000000000000043031371466245600170120ustar00rootroot00000000000000 Thu Jun 13 13:33:03 2002 XDrawChem 1.3.3 C 62 37 C 62 52 C 47 52 C 62 67 O 77 52 C 92 52 O 92 37 Cl 107 52 a0 a1 1 a1 a2 1 a1 a3 1 a1 a4 1 a4 a5 1 a5 a6 2 a5 a7 1 xdrawchem-v1.11.0/ring_cml/cyclobutane.cml000066400000000000000000000024231371466245600205600ustar00rootroot00000000000000 Sun Sep 16 22:27:34 2001 XDrawChem 0.9 C 40 32 0 C 40 57 0 C 65 32 0 C 65 57 0 1 1 1 1 xdrawchem-v1.11.0/ring_cml/cycloheptane.cml000066400000000000000000000042201371466245600207230ustar00rootroot00000000000000 Tue Jul 2 17:01:58 2002 XDrawChem 1.3.3 C 114.939 147.975 C 99.4888 167.629 C 74.4894 167.804 C 109.206 123.641 C 86.6066 112.952 C 64.1587 123.956 C 58.766 148.367 a0 a1 1 a1 a2 1 a3 a4 1 a4 a5 1 a5 a6 1 a6 a2 1 a3 a0 1 xdrawchem-v1.11.0/ring_cml/cyclohexane.cml000066400000000000000000000034711371466245600205560ustar00rootroot00000000000000 Sun Feb 25 18:04:28 2001 XDrawChem 0.84alpha C 223.651 252 0 C 245.301 264.5 0 C 245.301 289.5 0 C 223.651 302 0 C 202 289.5 0 C 202 264.5 0 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/cyclooctane.cml000066400000000000000000000046121371466245600205550ustar00rootroot00000000000000 Tue Jul 2 17:01:17 2002 XDrawChem 1.3.3 C 121.664 143 C 112.097 166.097 C 89 175.664 C 112.097 119.903 C 89 110.336 C 65.903 119.903 C 56.3359 143 C 65.903 166.097 a0 a1 1 a1 a2 1 a0 a3 1 a3 a4 1 a4 a5 1 a5 a6 1 a6 a7 1 a7 a2 1 xdrawchem-v1.11.0/ring_cml/cyclopentadiene-sp.cml000066400000000000000000000031731371466245600220410ustar00rootroot00000000000000 Tue Jul 2 18:25:27 2002 XDrawChem 1.3.3 C 29.0001 78.0001 C 54.0001 78.0001 C 61.7255 54.2237 C 21.2747 54.2237 C 41.5001 39.5291 a0 a1 2 a1 a2 1 a0 a3 1 a3 a4 2 a2 a4 1 xdrawchem-v1.11.0/ring_cml/cyclopentadiene.cml000066400000000000000000000030541371466245600214170ustar00rootroot00000000000000 Wed Oct 3 14:26:31 2001 XDrawChem 0.9 C 63 102 0 C 88 102 0 C 95.7254 78.2236 0 C 55.2746 78.2236 0 C 75.5 63.529 0 1 2 2 1 1 xdrawchem-v1.11.0/ring_cml/cyclopentane.cml000066400000000000000000000030461371466245600207360ustar00rootroot00000000000000 Wed Oct 3 14:25:46 2001 XDrawChem 0.9 C 63 102 0 C 88 102 0 C 95.7254 78.2236 0 C 55.2746 78.2236 0 C 75.5 63.529 0 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/cyclopropane.cml000066400000000000000000000020351371466245600207450ustar00rootroot00000000000000 Sun Sep 16 22:27:52 2001 XDrawChem 0.9 C 36 24 0 C 36 49 0 C 57.6506 36.5 0 1 1 1 xdrawchem-v1.11.0/ring_cml/cysteine.cml000066400000000000000000000037351371466245600201020ustar00rootroot00000000000000 Fri May 25 18:03:15 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 S 229.603 193 0 1 1 1 2 1 1 xdrawchem-v1.11.0/ring_cml/cytosine.cml000066400000000000000000000045251371466245600201120ustar00rootroot00000000000000 Fri May 25 17:52:59 2001 XDrawChem 0.9 C 176.303 97.0016 0 C 219.604 122.002 0 C 219.604 172.002 0 N 176.303 197.002 0 C 133.001 172.002 0 N 133.001 122.002 0 N 176.303 47.0016 0 O 89.7 197.002 0 1 2 1 1 1 2 1 2 xdrawchem-v1.11.0/ring_cml/d-fructose.cml000066400000000000000000000071111371466245600203220ustar00rootroot00000000000000 Wed Oct 3 14:35:20 2001 XDrawChem 0.9 C 63 99 0 C 88 99 0 C 100.5 77.3494 0 C 50.5 77.3494 0 O 75.1506 64.8494 0 O 88 84 0 H 88 114 0 H 63 84 0 O 63 114 0 H 50.5 92.3494 0 HOH2C 50.5 62.3494 0 CH2OH 100.5 62.3494 0 O 100.5 92.3494 0 1 1 1 1 1 1 1 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/d-glucose.cml000066400000000000000000000105561371466245600201400ustar00rootroot00000000000000 Wed Oct 3 14:41:11 2001 XDrawChem 0.9 C 124 112 0 C 149 112 0 C 166.678 94.3223 0 C 106.322 94.3223 0 C 124 76.6447 0 C 149 76.6447 0 O 149 127 0 H 124 127 0 O 106.322 109.322 0 H 106.322 79.3223 0 H 166.678 79.3223 0 O 166.678 109.322 0 CH2OH 124 61.6447 0 H 124 88.6447 0 O 124 100 0 H 149 100 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/dabcyl.cml000066400000000000000000000131751371466245600175140ustar00rootroot00000000000000 Tue Jul 2 16:57:25 2002 XDrawChem 1.3.3 C 95.5 195 C 83 216.65 C 58 216.65 C 45.5 195 C 58 173.349 C 83 173.349 N 120.5 195 N 145.5 195 C 170.5 195 C 183 173.35 C 208 173.35 C 220.5 195 C 208 216.651 C 183 216.651 N 20.5 195 C 8 173.349 C 8 216.651 C 245.5 195 O 245.5 170 Cl 270.5 195 a0 a1 1 a1 a2 2 a2 a3 1 a3 a4 2 a4 a5 1 a5 a0 2 a0 a6 1 a6 a7 2 a7 a8 1 a9 a10 2 a10 a11 1 a11 a12 2 a12 a13 1 a9 a8 1 a13 a8 2 a3 a14 1 a14 a15 1 a14 a16 1 a11 a17 1 a17 a18 2 a17 a19 1 xdrawchem-v1.11.0/ring_cml/dabsyl.cml000066400000000000000000000140011371466245600175210ustar00rootroot00000000000000 Mon Jul 1 11:17:33 2002 XDrawChem 1.3.3 C 213.499 147.002 C 238.499 147.002 C 250.999 168.652 C 238.499 190.303 C 213.499 190.303 C 200.999 168.652 C 125.999 168.652 C 113.499 190.302 C 88.4991 190.302 C 75.9991 168.652 C 88.4991 147.001 C 113.499 147.001 N 150.999 168.652 N 175.999 168.652 N 50.9991 168.652 C 38.4991 147.001 C 38.4991 190.303 S 275.999 168.652 O 275.999 143.652 O 275.999 193.652 Cl 300.999 168.652 a0 a1 2 a1 a2 1 a2 a3 2 a3 a4 1 a0 a5 1 a6 a7 1 a7 a8 2 a8 a9 1 a9 a10 2 a10 a11 1 a11 a6 2 a6 a12 1 a12 a13 2 a13 a5 1 a4 a5 2 a9 a14 1 a14 a15 1 a14 a16 1 a2 a17 1 a17 a18 2 a17 a19 2 a17 a20 1 xdrawchem-v1.11.0/ring_cml/dansyl.cml000066400000000000000000000115571371466245600175520ustar00rootroot00000000000000 Sun Jun 30 15:03:07 2002 XDrawChem 1.3.3 C 108 133.651 C 95.5 155.301 C 70.5 155.301 C 58 133.651 C 70.5 112 C 95.5 112 C 108 176.951 C 95.5 198.602 C 70.5 198.602 C 58 176.951 N 33 133.651 C 20.5 112 C 20.5 155.302 S 133 176.951 O 133 201.951 O 133 151.951 Cl 158 176.951 a0 a1 1 a1 a2 2 a2 a3 1 a3 a4 2 a4 a5 1 a5 a0 2 a1 a6 1 a6 a7 2 a7 a8 1 a8 a9 2 a9 a2 1 a3 a10 1 a10 a11 1 a10 a12 1 a6 a13 1 a13 a14 2 a13 a15 2 a13 a16 1 xdrawchem-v1.11.0/ring_cml/deoxyribose.cml000066400000000000000000000052611371466245600206070ustar00rootroot00000000000000 Wed Oct 3 14:29:49 2001 XDrawChem 0.9 C 61.0001 92.0001 0 C 86.0001 92.0001 0 C 93.7255 68.2237 0 C 53.2747 68.2237 0 O 73.5001 53.5291 0 C 53.2747 43.2237 0 O 28.2747 43.2237 0 O 61.0001 117 0 O 93.7255 43.2237 0 1 1 1 1 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/edans.cml000066400000000000000000000105321371466245600173420ustar00rootroot00000000000000 Tue Jul 2 17:32:00 2002 XDrawChem 1.3.3 C 52.6511 107 C 74.3012 119.5 C 74.3012 144.5 C 52.6511 157 C 31 144.5 C 31 119.5 C 95.9515 107 C 117.602 119.5 C 117.602 144.5 C 95.9515 157 SO3H 52.6511 182 N 95.9515 82 C 117.602 69.5 C 139.253 82 N 164.253 82 a0 a1 1 a1 a2 2 a2 a3 1 a3 a4 2 a4 a5 1 a5 a0 2 a1 a6 1 a6 a7 2 a7 a8 1 a8 a9 2 a9 a2 1 a3 a10 1 a6 a11 1 a11 a12 1 a12 a13 1 a13 a14 1 xdrawchem-v1.11.0/ring_cml/fmoc.cml000066400000000000000000000125171371466245600172010ustar00rootroot00000000000000 Sat Jun 29 12:50:04 2002 XDrawChem 1.3.3 C 167.82 122.516 C 186.361 139.286 C 173.072 98.074 C 210.154 131.614 C 186.305 164.286 C 196.866 90.4018 C 215.407 107.172 C 224.804 151.872 C 167.689 180.972 C 210.064 172.064 C 249.804 151.928 C 172.832 205.438 C 215.207 196.53 C 196.591 213.216 O 271.455 164.428 C 293.105 151.928 Cl 314.756 164.428 O 293.105 126.928 a0 a1 1 a2 a0 2 a1 a3 2 a1 a4 1 a5 a2 1 a3 a6 1 a3 a7 1 a4 a8 1 a4 a9 2 a6 a5 2 a9 a7 1 a7 a10 1 a8 a11 2 a9 a12 1 a11 a13 1 a13 a12 2 a10 a14 1 a14 a15 1 a15 a16 1 a15 a17 2 xdrawchem-v1.11.0/ring_cml/glutamic_acid.cml000066400000000000000000000053761371466245600210470ustar00rootroot00000000000000 Fri May 25 18:09:47 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 221.657 182.645 0 C 186.301 147.289 0 O 221.657 111.934 0 O 136.301 147.289 0 1 1 1 2 1 1 1 1 2 xdrawchem-v1.11.0/ring_cml/glutamine.cml000066400000000000000000000053721371466245600202430ustar00rootroot00000000000000 Fri May 25 18:04:47 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 221.657 182.645 0 C 186.301 147.289 0 N 221.657 111.934 0 O 136.301 147.289 0 1 1 1 2 1 1 1 1 2 xdrawchem-v1.11.0/ring_cml/glycine.cml000066400000000000000000000027241371466245600177060ustar00rootroot00000000000000 Fri May 25 17:55:33 2001 XDrawChem 0.9 N 104 133 0 C 147.301 108 0 C 190.603 133 0 O 190.603 183 0 O 233.904 108 0 1 1 2 1 xdrawchem-v1.11.0/ring_cml/guanine.cml000066400000000000000000000062771371466245600177110ustar00rootroot00000000000000 Fri May 25 17:46:26 2001 XDrawChem 0.9 C 163.303 106.002 0 C 206.604 131.002 0 C 206.604 181.002 0 N 163.303 206.002 0 C 120.001 181.002 0 N 120.001 131.002 0 N 254.9 118.061 0 N 254.9 193.943 0 C 290.255 153.416 0 O 163.303 56.0016 0 N 76.7 206.002 0 1 2 1 2 1 1 1 1 2 1 2 1 xdrawchem-v1.11.0/ring_cml/histidine.cml000066400000000000000000000061311371466245600202300ustar00rootroot00000000000000 Fri May 25 18:08:43 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 221.657 182.645 0 N 178.355 157.645 0 C 264.958 157.645 0 N 252.017 109.348 0 C 191.296 109.348 0 1 1 1 2 1 1 1 2 1 1 2 xdrawchem-v1.11.0/ring_cml/imidazole.cml000066400000000000000000000030521371466245600202240ustar00rootroot00000000000000 Wed Oct 3 14:27:10 2001 XDrawChem 0.9 C 63 102 0 N 88 102 0 C 95.7254 78.2236 0 C 55.2746 78.2236 0 N 75.5 63.529 0 1 2 2 1 1 xdrawchem-v1.11.0/ring_cml/indole.cml000066400000000000000000000052571371466245600175320ustar00rootroot00000000000000 Wed Mar 20 10:49:21 2002 XDrawChem 0.9 C 58.2942 56.6582 0 C 36.7493 69.3397 0 C 14.9944 57.0221 0 C 14.7843 32.023 0 C 36.3291 19.3415 0 C 58.084 31.6591 0 C 81.7947 23.7341 0 C 96.6588 43.8353 0 N 82.1347 64.1835 0 1 2 1 2 1 2 1 2 1 1 xdrawchem-v1.11.0/ring_cml/isoleucine.cml000066400000000000000000000047401371466245600204130ustar00rootroot00000000000000 Fri May 25 17:56:39 2001 XDrawChem 0.9 N 110 192 0 C 153.301 167 0 C 196.603 192 0 O 196.603 242 0 O 239.904 167 0 C 153.301 117 0 C 110 92 0 C 196.603 92 0 C 196.603 42 0 1 1 2 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/leucine.cml000066400000000000000000000047421371466245600177020ustar00rootroot00000000000000 Fri May 25 17:56:59 2001 XDrawChem 0.9 N 110 192 0 C 153.301 167 0 C 196.603 192 0 O 196.603 242 0 O 239.904 167 0 C 153.301 117 0 C 196.603 92 0 C 196.603 42 0 C 239.904 117 0 1 1 2 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/lysine.cml000066400000000000000000000053721371466245600175610ustar00rootroot00000000000000 Fri May 25 18:06:00 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 221.657 182.645 0 C 186.301 147.289 0 C 221.657 111.934 0 NH3+ 186.301 76.5786 0 1 1 1 2 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/methionine.cml000066400000000000000000000047451371466245600204200ustar00rootroot00000000000000 Fri May 25 17:57:30 2001 XDrawChem 0.9 N 125 246 0 C 168.301 221 0 C 211.603 246 0 O 211.603 296 0 O 254.904 221 0 C 168.301 171 0 C 211.603 146 0 S 211.603 96 0 C 168.301 71 0 1 1 2 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/naphthalene.cml000066400000000000000000000061021371466245600205350ustar00rootroot00000000000000 Mon Jun 10 15:13:25 2002 XDrawChem 1.3.2 C 68.6517 184.001 C 90.3018 196.501 C 90.3018 221.501 C 68.6517 234.001 C 47.0006 221.501 C 47.0006 196.501 C 111.952 184.001 C 133.603 196.501 C 133.603 221.501 C 111.952 234.001 a0 a1 1 a1 a2 2 a2 a3 1 a3 a4 2 a4 a5 1 a5 a0 2 a1 a6 1 a6 a7 2 a7 a8 1 a8 a9 2 a9 a2 1 xdrawchem-v1.11.0/ring_cml/nitrophenylalanine.cml000066400000000000000000000073251371466245600221610ustar00rootroot00000000000000 Tue Jun 11 12:53:14 2002 XDrawChem 1.3.2 N 119.5 194 C 141.15 181.5 C 162.801 194 C 141.15 156.5 O 162.801 219 O 184.452 181.5 C 162.801 144 C 141.15 131.5 C 141.15 106.5 C 162.801 93.9999 C 184.452 106.5 C 184.452 131.5 NO2 162.801 68.9999 a0 a1 1 a1 a2 1 a1 a3 1 a2 a4 2 a2 a5 1 a3 a6 1 a6 a7 2 a7 a8 1 a8 a9 2 a9 a10 1 a10 a11 2 a11 a6 1 a9 a12 1 xdrawchem-v1.11.0/ring_cml/phenylalanine.cml000066400000000000000000000065161371466245600211060ustar00rootroot00000000000000 Fri May 25 18:00:01 2001 XDrawChem 0.9 N 125 246 0 C 168.301 221 0 C 211.603 246 0 C 168.301 171 0 O 211.603 296 0 O 254.904 221 0 C 211.603 146 0 C 168.301 121 0 C 168.301 71 0 C 211.603 46 0 C 254.904 71 0 C 254.904 121 0 1 1 1 2 1 1 2 1 2 1 2 1 xdrawchem-v1.11.0/ring_cml/proline.cml000066400000000000000000000052411371466245600177210ustar00rootroot00000000000000 Fri Jun 7 13:21:12 2002 XDrawChem 1.3.2 C 108.992 157.768 C 94.2965 137.542 C 70.5208 145.267 C 70.5208 170.268 N 94.2965 177.993 C 126.67 140.09 H 126.67 175.445 O 148.32 152.59 O 126.67 115.09 a0 a1 1 a1 a2 1 a2 a3 1 a3 a4 1 a4 a0 1 a0 a5 1 a0 a6 1 a5 a7 1 a5 a8 2 xdrawchem-v1.11.0/ring_cml/purine.cml000066400000000000000000000052571371466245600175620ustar00rootroot00000000000000 Wed Mar 20 10:54:13 2002 XDrawChem 0.9 C 32.6591 17.1562 0 C 54.4462 29.4168 0 C 54.7218 54.4153 0 N 33.2103 67.1532 0 C 11.4232 54.8926 0 N 11.1476 29.8941 0 N 78.1361 21.4297 0 C 93.0527 41.492 0 N 78.582 61.8781 0 1 2 1 2 1 2 1 2 1 1 xdrawchem-v1.11.0/ring_cml/pyrimidine.cml000066400000000000000000000035121371466245600204210ustar00rootroot00000000000000 Wed Mar 20 10:55:10 2002 XDrawChem 0.9 C 50.6517 22.0008 0 C 72.3018 34.5008 0 C 72.3018 59.5009 0 N 50.6517 72.0009 0 C 29.0006 59.5009 0 N 29.0006 34.5008 0 1 2 1 2 1 2 xdrawchem-v1.11.0/ring_cml/ribose.cml000066400000000000000000000056611371466245600175420ustar00rootroot00000000000000 Wed Oct 3 14:29:34 2001 XDrawChem 0.9 C 61.0001 92.0001 0 C 86.0001 92.0001 0 C 93.7255 68.2237 0 C 53.2747 68.2237 0 O 73.5001 53.5291 0 C 53.2747 43.2237 0 O 28.2747 43.2237 0 O 61.0001 117 0 O 86.0001 117 0 O 93.7255 43.2237 0 1 1 1 1 1 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/serine.cml000066400000000000000000000037331371466245600175420ustar00rootroot00000000000000 Fri May 25 18:02:39 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 O 229.603 193 0 1 1 1 2 1 1 xdrawchem-v1.11.0/ring_cml/statine.cml000066400000000000000000000064431371466245600177250ustar00rootroot00000000000000 Tue Jun 11 12:58:29 2002 XDrawChem 1.3.2 N 70 116 C 91.6506 103.5 C 113.301 116 C 134.952 103.5 C 156.603 116 O 156.603 141 O 178.253 103.5 O 113.301 141 C 91.6506 78.5 C 113.301 66 C 113.301 41 C 134.952 78.5 a0 a1 1 a1 a2 1 a2 a3 1 a3 a4 1 a4 a5 2 a4 a6 1 a2 a7 1 a1 a8 1 a8 a9 1 a9 a10 1 a9 a11 1 xdrawchem-v1.11.0/ring_cml/steroid.cml000066400000000000000000000116711371466245600177260ustar00rootroot00000000000000 Wed Mar 20 11:10:54 2002 XDrawChem 0.9 C 45.6517 116.001 0 C 67.3018 128.501 0 C 67.3018 153.501 0 C 45.6517 166.001 0 C 24.0006 153.501 0 C 24.0006 128.501 0 C 88.9524 116.001 0 C 110.603 128.501 0 C 110.603 153.501 0 C 88.9524 166.001 0 C 88.9524 91.0008 0 C 110.603 78.5008 0 C 132.254 91.0008 0 C 132.254 116.001 0 C 153.904 78.5008 0 C 175.555 91.0008 0 C 175.555 116.001 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 xdrawchem-v1.11.0/ring_cml/threonine.cml000066400000000000000000000043361371466245600202500ustar00rootroot00000000000000 Fri May 25 18:02:54 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 O 229.603 193 0 C 143 193 0 1 1 1 2 1 1 1 xdrawchem-v1.11.0/ring_cml/thymine.cml000066400000000000000000000051351371466245600177300ustar00rootroot00000000000000 Fri May 25 17:54:16 2001 XDrawChem 0.9 C 203.303 109.002 0 C 246.604 134.002 0 C 246.604 184.002 0 N 203.303 209.002 0 C 160.001 184.002 0 N 160.001 134.002 0 O 203.303 59.0016 0 O 116.7 209.002 0 C 289.905 109.002 0 1 2 1 1 1 1 2 2 1 xdrawchem-v1.11.0/ring_cml/tryptophan.cml000066400000000000000000000103361371466245600204620ustar00rootroot00000000000000 Fri May 25 18:02:10 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 211.301 174.699 0 C 211.301 124.699 0 C 261.301 124.699 0 C 261.301 174.699 0 N 304.603 149.699 0 C 296.657 89.3434 0 C 261.301 53.9881 0 C 211.301 53.9881 0 C 175.946 89.3434 0 1 1 1 2 1 1 1 1 2 1 1 2 1 2 1 2 xdrawchem-v1.11.0/ring_cml/tyrosine.cml000066400000000000000000000071211371466245600201240ustar00rootroot00000000000000 Fri May 25 18:00:25 2001 XDrawChem 0.9 N 143 293 0 C 186.301 268 0 C 229.603 293 0 C 186.301 218 0 O 229.603 343 0 O 272.904 268 0 C 229.603 193 0 C 186.301 168 0 C 186.301 118 0 C 229.603 93 0 C 272.904 118 0 C 272.904 168 0 O 229.603 43 0 1 1 1 2 1 1 2 1 2 1 2 1 1 xdrawchem-v1.11.0/ring_cml/uracil.cml000066400000000000000000000045241371466245600175330ustar00rootroot00000000000000 Fri May 25 17:54:02 2001 XDrawChem 0.9 C 203.303 109.002 0 C 246.604 134.002 0 C 246.604 184.002 0 N 203.303 209.002 0 C 160.001 184.002 0 N 160.001 134.002 0 O 203.303 59.0016 0 O 116.7 209.002 0 1 2 1 1 1 1 2 2 xdrawchem-v1.11.0/ring_cml/valine.cml000066400000000000000000000043301371466245600175250ustar00rootroot00000000000000 Fri May 25 17:56:17 2001 XDrawChem 0.9 N 104 133 0 C 147.301 108 0 C 190.603 133 0 O 190.603 183 0 O 233.904 108 0 C 147.301 58 0 C 104 33 0 C 190.603 33 0 1 1 2 1 1 1 1 xdrawchem-v1.11.0/rings.qrc000066400000000000000000000044421371466245600156150ustar00rootroot00000000000000 ring_cml/statine.cml ring_cml/isoleucine.cml ring_cml/cytosine.cml ring_cml/serine.cml ring_cml/deoxyribose.cml ring_cml/biphenyl.cml ring_cml/cycloheptane.cml ring_cml/cysteine.cml ring_cml/thymine.cml ring_cml/histidine.cml ring_cml/6ring_chair.cml ring_cml/naphthalene.cml ring_cml/dabcyl.cml ring_cml/fmoc.cml ring_cml/cyclooctane.cml ring_cml/guanine.cml ring_cml/nitrophenylalanine.cml ring_cml/lysine.cml ring_cml/cyclopentadiene-sp.cml ring_cml/anthracene.cml ring_cml/pyrimidine.cml ring_cml/d-fructose.cml ring_cml/uracil.cml ring_cml/glutamine.cml ring_cml/leucine.cml ring_cml/edans.cml ring_cml/cyclobutane.cml ring_cml/threonine.cml ring_cml/aspartic_acid.cml ring_cml/tryptophan.cml ring_cml/phenylalanine.cml ring_cml/purine.cml ring_cml/indole.cml ring_cml/6ring_boat.cml ring_cml/proline.cml ring_cml/tyrosine.cml ring_cml/arginine.cml ring_cml/cyclopropane.cml ring_cml/steroid.cml ring_cml/d-glucose.cml ring_cml/biotin.cml ring_cml/dabsyl.cml ring_cml/glutamic_acid.cml ring_cml/alanine.cml ring_cml/ribose.cml ring_cml/glycine.cml ring_cml/adenine.cml ring_cml/dansyl.cml ring_cml/boc.cml ring_cml/cyclopentane.cml ring_cml/imidazole.cml ring_cml/benzene.cml ring_cml/asparagine.cml ring_cml/valine.cml ring_cml/cyclopentadiene.cml ring_cml/methionine.cml ring_cml/cyclohexane.cml xdrawchem-v1.11.0/translation/000077500000000000000000000000001371466245600163165ustar00rootroot00000000000000xdrawchem-v1.11.0/translation/ChangeLog000066400000000000000000000030431371466245600200700ustar00rootroot00000000000000# utf-8 2005-08-10 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated (fixed 1 fuzzy and 4 untranslated messages) 2005-07-20 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated (fixed 1 untranslated message) 2005-07-16 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated (fixed 4 fuzzy messages) 2005-07-07 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated (fixed 2 untranslated messages) 2005-06-11 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated 2005-06-08 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated 2005-05-22 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated 2005-05-16 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated 2005-05-03 Daniel Leidert - xdrawchem.pot: updated - xdrawchem-de.po: updated 2005-03-23 Daniel Leidert - xdrawchem-de.po: updated, fuzzy translations fixed - xdrawchem.pot: updated 2005-03-18 Daniel Leidert - added this ChangeLog for better overview (hopefully also for Bryan) - xdrawchem.pot: updated - xdrawchem-{da|de|it|pl|ru}.po: updated from xdrawchem.pot - xdrawchem-de.po: updated, fuzzy translations fixed xdrawchem-v1.11.0/translation/xdrawchem-da.po000066400000000000000000001602231371466245600212260ustar00rootroot00000000000000# Translation of xdrawchem-da.po to Dansk # Translation of xdrawchem.po to Dansk # This file is distributed under the same license as the xdrawchem package. # Copyright (C) 2003, Gunner Poulsen , 2003, 2004. # msgid "" msgstr "" "Project-Id-Version: xdrawchem-da\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-03-18 03:20+0100\n" "PO-Revision-Date: 2004-02-10 00:07+0100\n" "Last-Translator: Gunner Poulsen \n" "Language-Team: Dansk \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0.2\n" #: application.cpp:159 msgid "" "Click this button to open a file.

    You can also select the Open " "command from the File menu." msgstr "" "Klik her for at åbne en fil

    Du kan også menupunktet Åbn på Fil-menuen." #: application.cpp:160 msgid "" "Click this button to save the file you are editing.

    You can also " "select the Save command from the File menu.

    " msgstr "" "Klik her for at gemme den fil du har åben.

    Du kan også bruge " "menupunktet Gem på Fil-menuen.

    " #: application.cpp:161 msgid "" "Click this button to print the file you are editing.

    You can also " "select the Print command from the File menu." msgstr "" "Klik her for at udskrive den fil du har åben.

    Du kan også bruge " "menupunktet Udskriv fra Fil-menuen." #: application.cpp:162 msgid "" "Click this button to cut a selection.

    You can also select the Cut " "command from the Edit menu, or press Ctrl+X." msgstr "" "Klik her for at klippe det markerede ud.
    Du kan også bruge menupunktet " "Klip fra Redigér-menuen, eller trykke på Ctrl+X." #: application.cpp:163 msgid "" "Click this button to copy a selection.

    You can also select the Copy " "command from the Edit menu, or press Ctrl+C." msgstr "" "Klik her for at kopiere det markerede.

    Du kan også kopiere med " "menupunktet Kopiér fra Redigér-menuen, eller trykke Ctrl+C." #: application.cpp:164 msgid "" "Click this button to paste a selection.

    You can also select the Paste " "command from the Edit menu, or press Ctrl+V." msgstr "" "Klik her for at indsætte.

    Du kan også indsætte med menupunktet Indsæt " "fra Redigér-menuen, eller Ctrl+V." #: application.cpp:165 msgid "Click this button to zoom in." msgstr "" #: application.cpp:166 msgid "Click this button to zoom out." msgstr "" #: application.cpp:169 #, fuzzy msgid "" "Select tool

    Use the Select tool to select and move items inside a box." "

    You can select multiple items and cut, copy, move and rotate them." msgstr "" "Værktøjet Vælg

    Brug Vælg til at udvælge og flytte udsnit.

    Du " "kan markere flere udsnit og klippe, kopiere, flytte og rotere dem." #: application.cpp:170 #, fuzzy msgid "" "Lasso tool

    Use the Lasso tool to select and move items by drawing a " "loop around them.

    You can select multiple items and cut, copy, move " "and rotate them." msgstr "" "Værktøjet Vælg

    Brug Vælg til at udvælge og flytte udsnit.

    Du " "kan markere flere udsnit og klippe, kopiere, flytte og rotere dem." #: application.cpp:171 msgid "Erase tool

    Use the Erase tool to erase individual items." msgstr "Værktøjet Slet

    Brug Slet til at fjerne enkelte emner." #: application.cpp:172 msgid "" "Line tool

    Use the Line tool to draw bonds. Draw over existing bonds " "to create double and triple bonds." msgstr "" "Linjeværktøjet

    Brug linjeværktøjet til at tegne bindinger. Tegn " "ovenpå eksisterende bindinger for at lave dobbeltbindinger og " "tripelbindinger." #: application.cpp:173 msgid "" "Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw " "over existing bonds to add dashed lines (to indicate resonance, etc.)." msgstr "" "Værktøjet Stiplet linje

    Brug Stiplet linje til at tegne stiplede " "linjer. Tegn ovenpå eksisterende bindinger for at tilføje en stiplet linje " "(for at vise resonans ol.)" #: application.cpp:174 msgid "" "Chain tool

    Use the Chain tool to draw aliphatic chains. The length " "of each segment is the current bond length." msgstr "" "Kædeværktøjet

    Brug kædeværktøjet til at tegne aliphatiske kæder. " "længden af hvert sekment er den nuværende bindingslængde." #: application.cpp:175 msgid "" "Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as " "shown on the button." msgstr "" "Værktøjet 3D-ud linje

    Brug linjeværktøjet til at tegne 3D-ud linjer, " "som vist på knappen." #: application.cpp:176 msgid "" "Stereo Down Line tool

    Use the Line tool to draw stereo-down lines, as " "shown on the button." msgstr "" "Værktøjet 3D-ind

    Brug linjeværktøjet til at tegne 3D-ind linjer, som " "vist på knappen." #: application.cpp:177 msgid "" "Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on " "the button." msgstr "" "Bølgelinjeværktøjet

    Brug bølgelinjeværktøjet til at tegne bølgede " "linjer, som vist på knappen." #: application.cpp:178 msgid "" "Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click " "to draw a straight arrow.

    Click and hold to pick from a list of " "available arrows." msgstr "" "Pileværktøjet

    Brug pileværktøjet til at tegne lige pile.

    Klik " "for at tegne en lige pil.

    Klik og hold nede for at vælge en pil fra " "listen over tilgængelige pileformer." #: application.cpp:179 msgid "" "Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows." "

    Click and hold to select from a picture menu of arrows." msgstr "" "Værktøjet Krum pil

    Brug værktøjet Krum pil til at indsætte krumme " "pile.

    Klik og hold knappen nede for at se billeder af de pileformer " "der er tilgængelige." #: application.cpp:180 msgid "" "Bracket tool

    Use the Bracket tool to draw brackets and parentheses." "

    Click to draw square brackets.

    Click and hold to select from " "a picture menu of brackets." msgstr "" "Værktøjet Kantede patenteser

    Brug værktøjet Kantede patenteser til at " "tegne kantede parenteser.

    Klik for at tegne almindelige til kantede " "parenteser.

    Klik og hold nede for at vælge fra en billedmenu over " "parentesformer." #: application.cpp:181 msgid "" "Text tool

    Use the Text tool to add text and label atoms and points." "
    (See manual for info on formatting text)" msgstr "" "Tekstværktøjet

    Brug tekstværktøjet til at skrive tekst og til at " "navngive atomer og punkter.
    (Se manualen for informationer om " "tekstformatering)" #: application.cpp:182 msgid "" "Ring tool

    Use the Ring tool to insert ready-made rings and structures." "

    Click to open the ring dialog, which allows selection from a list of " "all built-in rings and structures.

    Click and hold to select from a " "picture menu of select rings.
    (See manual for more info on modifying this " "menu)" msgstr "" "Ringværktøjet

    Brug ringværktøjet til at indsætte færdiglavede ringe " "og strukturer.

    Klik for at åbne dialogboksen ringe. Der kan du vælge " "mellem alle programmets indbyggede ringe og strukturer.

    Klik og hold " "nede for at vælge fra en billedmenu over ringene.
    (Se manualen for flere " "informationer om hvordan du tilpasser denne menu)" #: application.cpp:183 msgid "" "Symbol tool

    Use the Symbol tool to insert symbols.

    Click and " "hold to select from a picture menu of symbols.
    " msgstr "" "Symbolværktøjet

    Brug symbolværktøjet til at indsætte symboler." "

    Klik og hold nede for at vælge fra en billedmenu med synboler.
    " #: application.cpp:218 msgid "File Operations" msgstr "Filoperationer" #: application.cpp:223 msgid "Open file" msgstr "Åbn fil" #: application.cpp:230 msgid "Save file" msgstr "Gem filen" #: application.cpp:237 msgid "Print file" msgstr "Udskriv filen" #: application.cpp:244 render2d_event.cpp:213 msgid "Cut" msgstr "Klip" #: application.cpp:251 render2d_event.cpp:214 msgid "Copy" msgstr "Kopiér" #: application.cpp:258 msgid "Paste" msgstr "Indsæt" #: application.cpp:265 msgid "Zoom In" msgstr "" #: application.cpp:272 msgid "Zoom Out" msgstr "" #: application.cpp:286 msgid "Set drawing color" msgstr "Sæt tegnefarve" #: application.cpp:290 msgid "Set line thickness" msgstr "Sæt linjetykkelse" #: application.cpp:291 msgid "Set Line Thickness" msgstr "Sæt linjetykkelse" #: application.cpp:305 msgid "Set font" msgstr "Sæt skrifttype" #: application.cpp:306 msgid "Set Font" msgstr "Sæt skrifttype" #: application.cpp:315 msgid "Set font size" msgstr "Sæt skriftstørrelse" #: application.cpp:316 msgid "Set Font Size" msgstr "Sæt skriftstørrelse" #: application.cpp:330 msgid "Left-justify selected text" msgstr "Venstrejustér markeret tekst" #: application.cpp:338 msgid "Center selected text" msgstr "Centrér markeret tekst" #: application.cpp:346 msgid "Right-justify selected text" msgstr "Højrejustér markeret tekst" #: application.cpp:354 msgid "Make selected text bold (Ctrl+B)" msgstr "Gør den markerede tekst fed (Ctrl+B)" #: application.cpp:364 msgid "Italicize selected text (Ctrl+I)" msgstr "Kursivér den markerede tekst (Ctrl+I)" #: application.cpp:374 msgid "Underline selected text (Ctrl+U)" msgstr "Understreg den markerede tekst (Ctrl+U)" #: application.cpp:384 msgid "Superscript selected text (Ctrl-Plus)" msgstr "Hævet skrift (Ctrl+Plus)" #: application.cpp:395 msgid "Subscript selected text (Ctrl-Minus)" msgstr "Sænket tekst (Ctrl+Minus)" #: application.cpp:411 netchoosedialog.cpp:83 render2d_event.cpp:212 msgid "Select" msgstr "Vælg" #: application.cpp:418 msgid "Lasso" msgstr "" #: application.cpp:425 msgid "Erase" msgstr "Slet" #: application.cpp:432 msgid "Draw line" msgstr "Tegn linje" #: application.cpp:440 msgid "Draw dashed line" msgstr "Tegn stiplet linje" #: application.cpp:448 msgid "Draw aliphatic chain" msgstr "Tegn aliphatisk kæde" #: application.cpp:456 msgid "Draw stereo-up line" msgstr "Tegn 3d-ud linje" #: application.cpp:464 msgid "Draw stereo-down line" msgstr "Tegn 3D-ind linje" #: application.cpp:472 msgid "Draw wavy bond" msgstr "Tegn bølget binding" #: application.cpp:480 msgid "Draw arrow" msgstr "Tegn pil" #: application.cpp:490 msgid "Draw curved arrow" msgstr "Tegn krum pil" #: application.cpp:500 msgid "Draw bracket" msgstr "Tegn kantet parentes" #: application.cpp:510 msgid "Draw or edit text" msgstr "Tegn eller rediger tekst" #: application.cpp:518 msgid "Draw ring" msgstr "Tegn ring" #: application.cpp:529 msgid "Draw symbol" msgstr "Tegn symbol" #: application.cpp:537 msgid "Canned Structures" msgstr "Cylenderformede struktorer" #: application.cpp:545 msgid "Cyclopropane" msgstr "Cyclopropan" #: application.cpp:553 msgid "Cyclobutane" msgstr "Cyclobutan" #: application.cpp:561 msgid "Cyclopentane" msgstr "Cyclopentan" #: application.cpp:569 msgid "Cyclopentadiene" msgstr "cyclepentadien" #: application.cpp:577 msgid "Cyclohexane" msgstr "Cyclohexan" #: application.cpp:585 msgid "Cyclohexane - chair conformation" msgstr "cyclohexan - stolkonformation" #: application.cpp:593 msgid "Cyclohexane - boat conformation" msgstr "cyclohexan - bådkonformation" #: application.cpp:601 msgid "Benzene" msgstr "Benzen" #: application.cpp:611 helpwindow.cpp:89 msgid "&File" msgstr "&Fil" #: application.cpp:613 msgid "&New" msgstr "&Ny" #: application.cpp:615 msgid "&Open" msgstr "&Åbn" #: application.cpp:620 msgid "&Find on Internet" msgstr "&Find på internettet" #: application.cpp:624 msgid "&Save" msgstr "&Gem" #: application.cpp:628 msgid "Save &as..." msgstr "Gem &som..." #: application.cpp:630 msgid "Save picture..." msgstr "Gem billede..." #: application.cpp:633 msgid "Pa&ge setup" msgstr "Side&opsætning" #: application.cpp:634 helpwindow.cpp:68 msgid "&Print" msgstr "&Udskriv" #: application.cpp:638 graphdialog.cpp:42 tool_13c_nmr.cpp:41 #: tool_1h_nmr.cpp:41 tool_ir.cpp:41 msgid "Close" msgstr "Luk" #: application.cpp:639 msgid "Quit" msgstr "Afslut" #: application.cpp:642 msgid "Rotate 90 degrees clockwise" msgstr "Rotér 90 grader med uret" #: application.cpp:644 msgid "Rotate 180 degrees" msgstr "Rotér 180 grader" #: application.cpp:645 msgid "Rotate 90 degrees counterclockwise" msgstr "Rotér 90 grader mod uret" #: application.cpp:649 msgid "Flip &horizontal" msgstr "Spejl &vandret" #: application.cpp:650 msgid "Flip &vertical" msgstr "Spejl &lodret" #: application.cpp:653 msgid "Normal (100%)" msgstr "" #: application.cpp:655 msgid "Zoom out" msgstr "" #: application.cpp:656 msgid "Zoom in" msgstr "" #: application.cpp:670 msgid "&Edit" msgstr "&Redigér" #: application.cpp:672 msgid "&Undo" msgstr "Fo&rtryd" #: application.cpp:673 #, fuzzy msgid "&Insert symbol" msgstr "Tegn symbol" #: application.cpp:677 msgid "Cu&t" msgstr "K&lip" #: application.cpp:678 msgid "&Copy" msgstr "&Kopiér" #: application.cpp:679 msgid "&Paste" msgstr "&Indsæt" #: application.cpp:680 msgid "Clear" msgstr "Ryd" #: application.cpp:682 msgid "Select &All" msgstr "Markér &alt" #: application.cpp:683 #, fuzzy msgid "&Deselect All" msgstr "Markér &alt" #: application.cpp:685 msgid "&Rotate" msgstr "&Rotér" #: application.cpp:686 msgid "&Flip" msgstr "&Spejl" #: application.cpp:688 #, fuzzy msgid "&Zoom" msgstr "&Hjem" #: application.cpp:691 msgid "&Group" msgstr "&Gruppe" #: application.cpp:692 msgid "Select &Reactant" msgstr "Vælg &reaktant" #: application.cpp:694 msgid "Select &Product" msgstr "Vælg &Produkt" #: application.cpp:696 msgid "Clear &group" msgstr "Ryd &gruppe" #: application.cpp:698 msgid "Clear all &groups" msgstr "Ryd &alle grupper" #: application.cpp:703 msgid "Forma&t" msgstr "&Formatér" #: application.cpp:705 msgid "&Bond - Fixed length and angle" msgstr "&Binding - Fast længde og vinkel" #: application.cpp:708 msgid "&Arrow - Fixed length and angle" msgstr "&Pil - Fast længde og vinkel" #: application.cpp:711 msgid "Automatically Add &hydrogens" msgstr "Tilføj automatisk &hydrogen" #: application.cpp:715 msgid "Set background &color" msgstr "Sæt &baggrundsfarve" #: application.cpp:717 msgid "Toggle &grid" msgstr "&Gitter Til/Fra" #: application.cpp:719 msgid "&Drawing settings..." msgstr "&Tegneindstillinger..." #: application.cpp:721 #, fuzzy msgid "&XDC settings..." msgstr "&Tegneindstillinger..." #: application.cpp:726 msgid "Estimate gas-phase enthalphy change" msgstr "Estimér ændringen i gasfasens enthalpi" #: application.cpp:728 msgid "Compare 1H NMR" msgstr "Sammenlign 1H NMR" #: application.cpp:730 msgid "Compare 13C NMR" msgstr "Sammenlign 13C NMR" #: application.cpp:737 #, fuzzy msgid "Reverse reactions" msgstr "Reaktion" #: application.cpp:743 msgid "Get bond identifier" msgstr "" #: application.cpp:747 msgid "T&ools" msgstr "Værk&tøjer" #: application.cpp:748 msgid "Clean up molecule" msgstr "Ryd op i molekylet" #: application.cpp:749 msgid "Auto &layout" msgstr "Auto&layout" #: application.cpp:750 msgid "Create custom ring" msgstr "Opret egen ring" #: application.cpp:753 msgid "Molecule information..." msgstr "Molekyle information..." #: application.cpp:755 #, fuzzy msgid "Predict 1H NMR" msgstr "Forudse 13C NMR" #: application.cpp:756 msgid "Predict 13C NMR" msgstr "Forudse 13C NMR" #: application.cpp:757 msgid "Predict IR" msgstr "Forudse IR" #: application.cpp:758 msgid "Predict pKa" msgstr "Forudse pKa" #: application.cpp:759 msgid "Predict octanol-water partition (Kow)" msgstr "Forudse octanol-vand skilningen (Kow)" #: application.cpp:760 msgid "Reaction" msgstr "Reaktion" #: application.cpp:762 msgid "Input SMILES" msgstr "Input SMILES" #: application.cpp:763 msgid "Output SMILES" msgstr "Output SMILES" #: application.cpp:765 msgid "Build 3D model of molecule" msgstr "" #: application.cpp:771 helpwindow.cpp:92 msgid "&Help" msgstr "&Hjælp" #: application.cpp:773 msgid "&Manual" msgstr "&Manual" #: application.cpp:774 msgid "&Did You Know?" msgstr "&Vidste du at?" #: application.cpp:775 msgid "&About" msgstr "&Om" #: application.cpp:776 msgid "&Support" msgstr "&Support" #: application.cpp:777 msgid "&References" msgstr "&Litteraturliste" #: application.cpp:779 msgid "What's &This" msgstr "Hvad er &dette" #: application.cpp:857 msgid "Newman projection symbol" msgstr "Newman-projektionssymbol" #: application.cpp:858 msgid "Newman projection - staggered (anti)" msgstr "Newman-projektion - forskudt (anti)" #: application.cpp:859 msgid "Newman projection - eclipsed" msgstr "Newman-projektion - elipseformet" #: application.cpp:914 msgid "Cubic bezier" msgstr "Kubisk bezier-kurve" #: application.cpp:917 msgid "Cubic bezier - half arrow" msgstr "Kubisk bezier-kurve - halv pil" #: application.cpp:920 msgid "Cubic bezier - full arrow" msgstr "Kubisk bezier-kurve - fuld pil" #: application.cpp:966 application_ring.cpp:347 msgid "User-defined" msgstr "Brugerdefinerede" #: application.cpp:1152 application_ob.cpp:95 msgid "Couldn't open file" msgstr "Kunne ikke åbne filen" #: application.cpp:1152 application_ob.cpp:95 msgid "Could not open the file: " msgstr "Kunne ikke åbne filen: " #: application.cpp:1153 application.cpp:1161 application_ob.cpp:96 #: application_ob.cpp:104 msgid "Unable to load " msgstr "Kan ikke indlæse " #: application.cpp:1167 application_ob.cpp:110 application_ob.cpp:137 msgid "Loaded document " msgstr "Indlæst dokument" #: application.cpp:1191 application_ob.cpp:187 application_ob.cpp:198 msgid "Could not write to " msgstr "Kunne ikke skrive til " #: application.cpp:1197 application_ob.cpp:191 application_ob.cpp:202 #: application_ob.cpp:235 msgid "Saved file " msgstr "Gemt fil " #: application.cpp:1249 msgid "Save as picture..." msgstr "Gem som billede..." #: application.cpp:1284 application.cpp:1296 application.cpp:1302 msgid "Saved picture file " msgstr "Gemt billedfil " #: application.cpp:1286 application.cpp:1298 application.cpp:1304 msgid "Unable to save picture!" msgstr "Kan ikke gemme billedet!" #: application.cpp:1358 #, fuzzy msgid "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Please subscribe to the mailing list for information about future releases.\n" "Send a message to xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n" "\n" "XDrawChem is copyright (C) 2004 Bryan Herger.\n" "Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint " "project\n" "OpenBabel code copyright (C) 2003 by the OpenBabel project team.\n" "See file COPYRIGHT.txt for more details" msgstr "" "\n" "Bryan Herger\n" "herger@chemistry.gatech.edu\n" "\n" "Tilmeld dig til postlisten, hvis du vil have oplysninger om fremtidige " "udgivelser.\n" "Send en mail til: xdrawchem-announce-request@lists.sourceforge.net med " "'subscribe' i emnefeltet.\n" "\n" "XDrawChem is copyright (C) 2002 Bryan Herger.\n" "Enkeltdele copyright (C) 1997-2000 Dr. Christoph Steinbeck og the JChemPaint " "project\n" "OpenBabel-koden copyright (C) 2003 by the OpenBabel project team.\n" "Se filen COPYRIGHT.txt for flere detaljer" #: application.cpp:1362 msgid "How to get help" msgstr "Hvordan man får hjælp" #: application.cpp:1363 #, fuzzy msgid "" "Current information on XDrawChem can always be found at\n" "http://xdrawchem.sourceforge.net/\n" "The latest release will be posted here, as well as links to mailing lists " "and the bug tracker.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "You can contact the author directly at\n" "bherger@users.sourceforge.net" msgstr "" "Aktuel information om XDrawChem kan altid findes på\n" "http://www.prism.gatech.edu/~gte067k/xdrawchem/\n" "Den seneste version vil altid kunne findes her.\n" "\n" "Der er to postlister: xdrawchem-announce, hvor nye versionerannonceres,\n" "og xdrawchem-user, for åben diskussion blandt brugere af XDrawChem.\n" "Tilmeld dig ved at sende en blank e-mail med emnet \"subscribe\" til\n" "\"xdrawchem-announce-request@lists.sourceforge.net\" eller\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "Du kan kontakte forfatteren direkte via\n" "herger@chemistry.gatech.edu" #: application.cpp:1443 msgid "Database query failed" msgstr "Databaseforespørgslen mislykkedes" #: application.cpp:1443 msgid "No molecules in the database match the query." msgstr "Ingen molekyler i databasen passer med forespørgslen." #: application.cpp:1679 application.cpp:1687 application.cpp:1694 #: application.cpp:1701 #, qt-format msgid "Zoom = %1 %" msgstr "" #: application.cpp:1705 msgid "XDC Settings" msgstr "" #: application.cpp:1706 msgid "Change XDrawChem settings:" msgstr "" #: application.cpp:1707 msgid "&Main font" msgstr "" #: application.cpp:1707 #, fuzzy msgid "&Ruler font" msgstr "Sæt skrifttype" #: application.cpp:1708 bondedit.cpp:252 charsel.cpp:68 crings_dialog.cpp:137 #: fixeddialog.cpp:144 molinfodialog.cpp:37 netchoosedialog.cpp:88 #: netdialog.cpp:80 pagesetupdialog.cpp:109 peptidebuilder.cpp:78 #: ringdialog.cpp:55 smilesdialog.cpp:41 msgid "Cancel" msgstr "Annullér" #: application_ob.cpp:35 tool_2d3d.cpp:92 msgid "--Select a filter-- (*)" msgstr "--Vælg et filter-- (*)" #: application_ob.cpp:38 msgid "CDXML - ChemDraw text/XML format (*)" msgstr "CDXML - ChemDraw text/XML format (*)" #: application_ob.cpp:41 msgid "CDX - ChemDraw binary format (*)" msgstr "CDX - ChemDraw binært format (*)" #: application_ob.cpp:44 msgid "XDC - XDrawChem native format (*)" msgstr "XDC - XDrawChems eget format (*)" #: application_ob.cpp:68 msgid "Open file..." msgstr "Åbn fil..." #: application_ob.cpp:83 application_ob.cpp:162 tool_2d3d.cpp:113 msgid "Could not determine file type" msgstr "Kunne ikke genkende filtypen" #: application_ob.cpp:84 application_ob.cpp:163 tool_2d3d.cpp:114 msgid "Please select a file type from the list." msgstr "Vælg en filtype fra listen." #: application_ob.cpp:126 msgid "Problem while opening the file" msgstr "Der opstod et problem under åbningen af filen" #: application_ob.cpp:127 msgid "Cannot open the specified file." msgstr "Kunne ikke åbne den angivne fil." #: application_ob.cpp:150 tool_2d3d.cpp:107 msgid "Save file as..." msgstr "Gem filen som..." #: application_ob.cpp:155 #, fuzzy msgid "Overwrite file?" msgstr "Udskriv filen" #: application_ob.cpp:155 #, qt-format msgid "Overwrite existing file: %1 ?" msgstr "" #: application_ob.cpp:221 msgid "IOIface Data error" msgstr "IOIface Data fejl" #: application_ob.cpp:222 msgid "" "Cannot convert the molecule.\n" "Conversion failed in ioiface.cpp" msgstr "" "Kunne ikke konvertere molekylet.\n" "Konverteringen mislykkedes i ioiface.cpp" #: application_ob.cpp:228 tool_2d3d.cpp:133 msgid "Problem while writing the file" msgstr "Der opstod et problem under skrivningen af filen" #: application_ob.cpp:229 tool_2d3d.cpp:134 msgid "Cannot write the specified file." msgstr "Kunne ikke skrive den angivne fil." #: application_ring.cpp:120 msgid "[*] Cyclopropane" msgstr "[*] Cyclopropan" #: application_ring.cpp:124 msgid "[*] Cyclobutane" msgstr "[*] Cyclobutan" #: application_ring.cpp:128 msgid "[*] Cyclopentane" msgstr "[*] Cyclopentan" #: application_ring.cpp:132 msgid "Imidazole" msgstr "imidazol" #: application_ring.cpp:136 msgid "[*] Cyclopentadiene" msgstr "[*] cyclepentadien" #: application_ring.cpp:140 msgid "[*] Cyclohexane (flat)" msgstr "[*] cyclohexan (flad)" #: application_ring.cpp:144 msgid "Cyclohexane (boat)" msgstr "cyclehexan (båd)" #: application_ring.cpp:148 msgid "Cyclohexane (chair)" msgstr "cyclehexan (stol)" #: application_ring.cpp:152 msgid "[*] Benzene" msgstr "[*] Benzen" #: application_ring.cpp:156 msgid "Pyrimidine" msgstr "pyrimidin" #: application_ring.cpp:160 msgid "[*] Cycloheptane" msgstr "[*] Cycloheptan" #: application_ring.cpp:164 msgid "[*] Cyclooctane" msgstr "[*] Cyclooctan" #: application_ring.cpp:168 msgid "Indole" msgstr "Indol" #: application_ring.cpp:172 msgid "Purine" msgstr "purin" #: application_ring.cpp:176 msgid "Naphthalene" msgstr "Naftalen" #: application_ring.cpp:180 msgid "Biphenyl" msgstr "Biphenyl" #: application_ring.cpp:184 msgid "Anthracene" msgstr "anthracen" #: application_ring.cpp:188 msgid "Steroid (fused ring template)" msgstr "Steroid (skabelon for kondenserede ringe)" #: application_ring.cpp:191 msgid "Rings" msgstr "Ringe" #: application_ring.cpp:196 msgid "Alanine" msgstr "alinin" #: application_ring.cpp:200 msgid "Arginine" msgstr "arginin" #: application_ring.cpp:204 msgid "Asparagine" msgstr "asparagin" #: application_ring.cpp:208 msgid "Aspartic acid" msgstr "Asparginsyre" #: application_ring.cpp:212 msgid "Cysteine" msgstr "cystein" #: application_ring.cpp:216 msgid "Glutamic acid" msgstr "glutaminsyre" #: application_ring.cpp:220 msgid "Glutamine" msgstr "glutamin" #: application_ring.cpp:224 msgid "Glycine" msgstr "glycin" #: application_ring.cpp:228 msgid "Histidine" msgstr "histidin" #: application_ring.cpp:232 msgid "Isoleucine" msgstr "isolucin" #: application_ring.cpp:236 msgid "Leucine" msgstr "leucin" #: application_ring.cpp:240 msgid "Lysine" msgstr "Lysin" #: application_ring.cpp:244 msgid "Methionine" msgstr "methionin" #: application_ring.cpp:248 msgid "Nitrophenylalanine" msgstr "nitrophenylalanin" #: application_ring.cpp:252 msgid "Phenylalanine" msgstr "phenylalanin" #: application_ring.cpp:256 msgid "Proline" msgstr "prolin" #: application_ring.cpp:260 msgid "Serine" msgstr "serin" #: application_ring.cpp:264 msgid "Statine" msgstr "Statin" #: application_ring.cpp:268 msgid "Threonine" msgstr "threonin" #: application_ring.cpp:272 msgid "Tryptophan" msgstr "tryptophan" #: application_ring.cpp:276 msgid "Tyrosine" msgstr "tyrosin" #: application_ring.cpp:280 msgid "Valine" msgstr "valin" #: application_ring.cpp:283 msgid "Amino acids" msgstr "Aminosyrer" #: application_ring.cpp:288 msgid "Adenine" msgstr "Adenin" #: application_ring.cpp:291 msgid "Cytosine" msgstr "Cytosin" #: application_ring.cpp:294 msgid "Guanine" msgstr "Guanin" #: application_ring.cpp:297 msgid "Thymine" msgstr "Thymin" #: application_ring.cpp:300 msgid "Uracil" msgstr "Uracil" #: application_ring.cpp:302 msgid "Nucleic acids" msgstr "Nucleotidsyrer" #: application_ring.cpp:307 msgid "Ribose" msgstr "Ribose" #: application_ring.cpp:311 msgid "Deoxyribose" msgstr "Deoxyribose" #: application_ring.cpp:315 msgid "D-fructose" msgstr "D-fruktose" #: application_ring.cpp:319 msgid "D-glucose" msgstr "D-glukose" #: application_ring.cpp:322 msgid "Sugars" msgstr "Sukkerstoffer" #: application_ring.cpp:326 msgid "[*] FMOC" msgstr "FMOC [9-fluorenylmethoxycarbonyl]" #: application_ring.cpp:329 msgid "[*] BOC" msgstr "BOC [butoxycarbonyl]" #: application_ring.cpp:332 msgid "[*] DABCYL" msgstr "[*] DABCYL" #: application_ring.cpp:335 msgid "[*] DABSYL" msgstr "[*] DABSYL" #: application_ring.cpp:338 msgid "[*] DANSYL" msgstr "DANSYL [1-(dimethylanimo)-5-naphthylsulfonyl]" #: application_ring.cpp:341 msgid "[*] EDANS" msgstr "[*] EDANS" #: application_ring.cpp:344 msgid "Useful groups" msgstr "Nyttige grupper" #: application_ring.cpp:369 msgid "Add new..." msgstr "" #: bondedit.cpp:52 msgid "Color" msgstr "Farve" #: bondedit.cpp:57 msgid "Arrow editor" msgstr "Pile-editor" #: bondedit.cpp:58 bondedit.cpp:165 bondedit.cpp:187 bondedit.cpp:212 msgid "Style:" msgstr "Stil:" #: bondedit.cpp:61 msgid "Plain arrow" msgstr "Almindelig pil" #: bondedit.cpp:64 msgid "NR arrow" msgstr "NR pil" #: bondedit.cpp:67 msgid "Dashed arrow" msgstr "Stiplet pil" #: bondedit.cpp:70 msgid "Two-way arrow" msgstr "Dobbeltpil" #: bondedit.cpp:73 msgid "Split two-way arrow" msgstr "Delt dobbeltpil" #: bondedit.cpp:76 msgid "Retrosynthetic arrow" msgstr "Retrosyntetisk pil" #: bondedit.cpp:98 msgid "Bond editor" msgstr "Bindings-editor" #: bondedit.cpp:100 msgid "Bond order:" msgstr "Bindingsrækkefølge:" #: bondedit.cpp:103 msgid "Dashed line" msgstr "Stiplet linje" #: bondedit.cpp:106 msgid "Single" msgstr "Enkelt" #: bondedit.cpp:109 msgid "Stereo-up" msgstr "3D-ud" #: bondedit.cpp:112 msgid "Stereo-down" msgstr "3D-ind" #: bondedit.cpp:115 msgid "Wavy" msgstr "Bølget" #: bondedit.cpp:118 msgid "Single/double (aromatic)" msgstr "Enkelt/dobbelt (aromatisk)" #: bondedit.cpp:121 msgid "Double" msgstr "Dobbelt" #: bondedit.cpp:124 msgid "Double/triple" msgstr "Dobbelt/tripel" #: bondedit.cpp:127 msgid "Triple" msgstr "Tripel" #: bondedit.cpp:134 #, fuzzy msgid "Bond thickness:" msgstr "Sæt linjetykkelse" #: bondedit.cpp:153 #, fuzzy msgid "Double bond alignment:" msgstr "Dobbeltbindingers mellemrum:" #: bondedit.cpp:156 #, fuzzy msgid "Auto" msgstr "&Om" #: bondedit.cpp:157 msgid "Left" msgstr "" #: bondedit.cpp:158 msgid "Center" msgstr "" #: bondedit.cpp:159 #, fuzzy msgid "Right" msgstr "Ringe" #: bondedit.cpp:164 msgid "Bracket editor" msgstr "Editor af kantede parenteser" #: bondedit.cpp:168 msgid "Square bracket" msgstr "Kantet parentes" #: bondedit.cpp:171 msgid "Parentheses" msgstr "Parenteser" #: bondedit.cpp:174 msgid "Curly bracket" msgstr "Krøllet parentes" #: bondedit.cpp:177 msgid "Box" msgstr "Boks" #: bondedit.cpp:180 msgid "Ellipse" msgstr "Elipse" #: bondedit.cpp:186 msgid "Curved Arrow editor" msgstr "Editor af krumme pile" #: bondedit.cpp:190 msgid "90 degree clockwise" msgstr "90 grader med uret" #: bondedit.cpp:193 msgid "180 degree clockwise" msgstr "180 grader med uret" #: bondedit.cpp:196 msgid "270 degree clockwise" msgstr "270 grader med uret" #: bondedit.cpp:199 msgid "90 degree counterclockwise" msgstr "90 grader mod uret" #: bondedit.cpp:202 msgid "180 degree counterclockwise" msgstr "180 grader mod uret" #: bondedit.cpp:205 msgid "270 degree counterclockwise" msgstr "270 grader mod uret" #: bondedit.cpp:211 msgid "Symbol editor" msgstr "Symbol-editor" #: bondedit.cpp:215 msgid "Positive charge" msgstr "Positiv ladning" #: bondedit.cpp:218 msgid "Negative charge" msgstr "Negativ ladning" #: bondedit.cpp:221 msgid "Partial positive charge" msgstr "Delvis positiv ladning" #: bondedit.cpp:224 msgid "Partial negative charge" msgstr "Delvis negativ ladning" #: bondedit.cpp:227 msgid "Single electron" msgstr "Enkelt elektron" #: bondedit.cpp:230 msgid "Electron pair" msgstr "Elektronpar" #: bondedit.cpp:233 msgid "Stereochemical ring hydrogen" msgstr "Stereokemisk ring-hydrogen" #: bondedit.cpp:236 msgid "p orbital" msgstr "p orbital" #: bondedit.cpp:239 msgid "p double" msgstr "p dobbelt" #: bondedit.cpp:242 msgid "bead" msgstr "dråbe" #: bondedit.cpp:248 crings_dialog.cpp:133 dyk.cpp:40 fixeddialog.cpp:136 #: molinfodialog.cpp:29 pagesetupdialog.cpp:105 peptidebuilder.cpp:74 #: smilesdialog.cpp:37 msgid "OK" msgstr "O.k." #: charsel.cpp:44 #, fuzzy msgid "Insert symbol" msgstr "Tegn symbol" #: charsel.cpp:47 #, fuzzy msgid "Font:" msgstr "Sæt skrifttype" #: chemdata_rxn.cpp:41 msgid "Missing reactant or product" msgstr "Manglende reaktant eller produkt" #: chemdata_rxn.cpp:42 msgid "You must select at least one reactant and one product." msgstr "Du skal vælge mindst en reaktant og et produkt" #: chemdata_rxn.cpp:50 msgid "Estimated gas-phase enthalpy change:\n" msgstr "Estimér ændringen af enthalpi i gasfasen:\n" #: chemdata_rxn.cpp:59 #, qt-format msgid "Reactants = %1 kJ/mol\n" msgstr "Reaktanter = %1 kJ/mol\n" #: chemdata_rxn.cpp:68 #, qt-format msgid "Products = %1 kJ/mol\n" msgstr "Produkter = %1 kJ/mol\n" #: chemdata_rxn.cpp:70 #, qt-format msgid "Reaction = %1 kJ/mol" msgstr "Reaktion = %1 kJ/mol" #: chemdata_rxn.cpp:71 msgid "Enthalpy change" msgstr "Enthalpiændring" #: chemdata_rxn.cpp:81 msgid "1H NMR compare error" msgstr "1H NMR sammenligningsfejl" #: chemdata_rxn.cpp:82 chemdata_rxn.cpp:138 msgid "Please select only one reactant and one product to compare." msgstr "Vælg kun en reaktant og et produkt til at sammenligne." #: chemdata_rxn.cpp:137 msgid "13C NMR compare error" msgstr "13C NMR sammenligningsfejl" #: chemdata_tools.cpp:171 msgid "Octanol-water partition" msgstr "Octanol-vand forholdet" #: chemdata_tools.cpp:171 #, qt-format msgid "Estimated octanol-water partition constant (log Kow) = %1" msgstr "Beregn octanol-vand fordelingskoefficient (log Kow) = %1" #: chemdata_tools.cpp:193 msgid "SMILES string" msgstr "SMILES streng" #: chemdata_tools.cpp:193 msgid "SMILES string for selected molecule:" msgstr "SMILES streng for udvalgt molekyle:" #: crings_dialog.cpp:123 msgid "Add custom ring to menu list" msgstr "Tilføj brugerdefineret ring til menulisten" #: dyk.cpp:17 dyk.cpp:20 msgid "Did You Know?" msgstr "Vidste du det?" #: dyk.cpp:28 msgid "Previous tip" msgstr "Forrige tip" #: dyk.cpp:32 msgid "Next tip" msgstr "Næste tip" #: dyk.cpp:36 msgid "Don't show this dialog at startup" msgstr "Vis ikke denne dialogboks under opstart" #: dyk.cpp:55 msgid "" "XDrawChem can be run from the command line to produce images. Type " "\"xdrawchem --help\" for details." msgstr "" "XDrawChem kan startes fra komandolinjen for at lave et billede ud fra en " "inputfil. Skriv \"xdrawchem --help\" for flere oplysninger." #: dyk.cpp:56 msgid "" "When in select mode, you can edit most objects by right-clicking on them." msgstr "" "I markeringstilstanden kan de fleste objekter redigeres ved at højreklikke " "på dem." #: dyk.cpp:57 msgid "" "When drawing bonds, you can edit the bond style by right-clicking on the " "bond." msgstr "" "Når du tegner bindinger, kan bindingstypen ændres ved at højreklikke på " "bindingen." #: dyk.cpp:58 msgid "" "When in select mode, press Shift+LeftButton and drag over part of a molecule " "to select the entire molecule." msgstr "" "I markeringstilstanden kan du holde Shift+venstre musetast nede og trække " "for at markere hele molekylet." #: dyk.cpp:59 msgid "" "When in select mode, press Ctrl+LeftButton on a molecule to get molecule " "information." msgstr "" "I markeringstilstanden kan du trykke på Ctrl+venstre musetast for at få " "molekyleinformation." #: dyk.cpp:60 msgid "" "Bond length, bond angle, and units are set in the Drawing Settings option " "under the Format menu." msgstr "" "Bindingernes længde, bindingsvinklen og enhederne er angivet under " "tegneindstillinger i Formatér-menuen." #: dyk.cpp:61 msgid "" "You can attach a subscript to a bracket by selecting the text tool, then " "clicking on the bracket." msgstr "" "Du kan skrive et sænket tal efter en kantet parantes, ved at vælge " "tekstværktøjet og derefter markere den kantede parantes." #: dyk.cpp:62 msgid "" "You can toggle the grid display by pressing Ctrl+G. Turning the grid on or " "off does not affect whether objects snap to the grid." msgstr "" "Du kan bestemme om gitteret skal vises eller skjules ved at trykke Ctrl+G. " "Om man slår gitteret til eller fra påvirker ikke om objekter fastgør sig til " "gitteret." #: dyk.cpp:63 msgid "" "A number of ring and molecule templates are available from the ring tool, " "including single and fused rings, amino acids, and nucleosides." msgstr "" "En række skabeloner til ringe og molekyler er tilgængelige i ringværktøjet, " "incl. enkelt- og kondenserede ringe, aminosyrer og nucleotider." #: dyk.cpp:64 msgid "Remember to select a file type when opening or saving documents." msgstr "Husk at angive en filtype når du åbner og gemmer dokumenter." #: dyk.cpp:65 msgid "" "The option \"Clean up molecule\" under the Tools menu can be used to refine " "structures such as rings and macromolecules." msgstr "" "Indstillingen \"Ryd op i molekylet\" under Værktøjsmenuen kan bruges til at " "rafinere strukturer som fx ringe og makromolekyler." #: dyk.cpp:66 msgid "" "It's possible to attach rings to structures by selecting a ring and clicking " "on an atom." msgstr "" "Det er muligt at tilknytte ringe til strukturer ved at vælge en ring og " "klikke på et atom." #: dyk.cpp:67 msgid "" "XDrawChem can automatically attach amino acids from N-terminal to C-terminal " "(but the result isn't always pretty :)" msgstr "" "XDrawChem kan automatisk tilknytte aminosyrer fra N-terminal til C-terminal " "(men resultatet er ikke altid lige kønt :)" #: dyk.cpp:68 msgid "" "Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/" msgstr "" #: dyk.cpp:69 msgid "" "XDrawChem can draw over 100,000 substances using its Internet database. " "Select Find on internet from the File menu to search for compounds." msgstr "" #: dyk.cpp:70 msgid "" "XDrawChem can identify compounds by CAS number and occasionally by name. " "Select Molecule information from the Tools menu and click on a molecule. " "However, this only works if the compound is listed in the database." msgstr "" #: fixeddialog.cpp:29 msgid "Set fixed angle and length" msgstr "Sæt fast vinkel og længde" #: fixeddialog.cpp:32 msgid "Units:" msgstr "Enheder:" #: fixeddialog.cpp:35 fixeddialog.cpp:253 pagesetupdialog.cpp:69 msgid "pixels" msgstr "pixler" #: fixeddialog.cpp:37 fixeddialog.cpp:256 pagesetupdialog.cpp:74 msgid "inches" msgstr "tommer" #: fixeddialog.cpp:38 fixeddialog.cpp:259 pagesetupdialog.cpp:79 xruler.cpp:60 #: xruler.cpp:84 msgid "cm" msgstr "cm" #: fixeddialog.cpp:44 msgid "Bond fixed length:" msgstr "Fast bindingslængde:" #: fixeddialog.cpp:50 msgid "Bond fixed angle:" msgstr "Fast bindingsvinkel:" #: fixeddialog.cpp:66 fixeddialog.cpp:91 msgid "degrees" msgstr "grader" #: fixeddialog.cpp:69 msgid "Arrow fixed length:" msgstr "Fast pilelængde:" #: fixeddialog.cpp:72 msgid "Arrow fixed angle:" msgstr "Fast pilevinkel:" #: fixeddialog.cpp:94 msgid "Double bond spacing:" msgstr "Dobbeltbindingers mellemrum:" #: fixeddialog.cpp:110 msgid "Show grid" msgstr "Vis gitteret" #: fixeddialog.cpp:111 #, fuzzy msgid "Do not show grid" msgstr "Vis gitteret" #: fixeddialog.cpp:112 #, fuzzy msgid "Show square grid" msgstr "Vis gitteret" #: fixeddialog.cpp:113 #, fuzzy msgid "Show hex grid" msgstr "Vis gitteret" #: fixeddialog.cpp:116 msgid "Snap to grid" msgstr "Fastgør til gitteret" #: fixeddialog.cpp:122 msgid "Grid spacing" msgstr "Gitterafstand" #: fixeddialog.cpp:140 msgid "Default" msgstr "Standard" #: graphdialog.cpp:30 msgid "Print" msgstr "Udskriv" #: graphdialog.cpp:34 msgid "Export Peak List" msgstr "Eksportér top listen" #: graphdialog.cpp:38 molinfodialog.cpp:33 tool_13c_nmr.cpp:37 #: tool_1h_nmr.cpp:37 tool_ir.cpp:37 msgid "Help" msgstr "Hjælp" #: graphwidget.cpp:121 #, fuzzy msgid "Red is reactant" msgstr "Reaktant" #: graphwidget.cpp:124 #, fuzzy msgid "Blue is product" msgstr "Produktets toppe:\n" #: helpwindow.cpp:70 msgid "&Close" msgstr "&Luk" #: helpwindow.cpp:79 msgid "&Backward" msgstr "&Tilbage" #: helpwindow.cpp:82 msgid "&Forward" msgstr "&Frem" #: helpwindow.cpp:84 msgid "&Home" msgstr "&Hjem" #: helpwindow.cpp:87 msgid "&About ..." msgstr "&Om ..." #: helpwindow.cpp:90 msgid "&Go" msgstr "&Gå" #: helpwindow.cpp:106 msgid "Backward" msgstr "Tilbage" #: helpwindow.cpp:109 msgid "Forward" msgstr "Frem" #: helpwindow.cpp:112 msgid "Home" msgstr "Hjem" #: main.cpp:145 msgid "untitled" msgstr "uden navn" #: molecule_1h_nmr.cpp:50 #, fuzzy msgid "Predicted 1H-NMR" msgstr "Forudse 13C NMR" #: molecule_1h_nmr.cpp:65 #, fuzzy msgid " Intensity: " msgstr ", intensitet " #: molecule_1h_nmr.cpp:66 msgid " Multiplicity: " msgstr "" #: molecule.cpp:89 msgid "Reactant" msgstr "Reaktant" #: molecule.cpp:91 msgid "Product" msgstr "Produkt" #: molecule_tools_1.cpp:171 #, fuzzy msgid "Predicted 13C-NMR" msgstr "Forudse 13C NMR" #: molecule_tools_1.cpp:234 #, fuzzy msgid "Predicted IR" msgstr "Forudse IR" #: molecule_tools_1.cpp:248 msgid "~1350-1000, C-N" msgstr "" #: molecule_tools_1.cpp:250 msgid "~1300-1000, C-O" msgstr "" #: molecule_tools_1.cpp:254 msgid "~1660-1600, C=C (cis/vinyl strong; trans weak)" msgstr "" #: molecule_tools_1.cpp:256 msgid "~1690-1640, C=N" msgstr "" #: molecule_tools_1.cpp:258 msgid "~1700 (narrow), C=O" msgstr "" #: molecule_tools_1.cpp:260 msgid "~1350-1300, S=O (~1050 if R-(S=O)-R')" msgstr "" #: molecule_tools_1.cpp:264 molecule_tools_1.cpp:351 molecule_tools_1.cpp:353 msgid "~2250 (narrow), nitrile" msgstr "" #: molecule_tools_1.cpp:317 molecule_tools_1.cpp:319 molecule_tools_1.cpp:321 #: molecule_tools_1.cpp:323 molecule_tools_1.cpp:325 molecule_tools_1.cpp:327 #: molecule_tools_1.cpp:329 msgid "~3000 (broad), C-H" msgstr "" #: molecule_tools_1.cpp:331 molecule_tools_1.cpp:339 molecule_tools_1.cpp:341 msgid "two peaks: ~3400, ~3300, primary N-H" msgstr "" #: molecule_tools_1.cpp:333 molecule_tools_1.cpp:335 molecule_tools_1.cpp:337 msgid "~3300 (broad), secondary N-H" msgstr "" #: molecule_tools_1.cpp:343 molecule_tools_1.cpp:345 molecule_tools_1.cpp:347 msgid "~2550 (broad), S-H" msgstr "" #: molecule_tools_1.cpp:349 molecule_tools_1.cpp:359 molecule_tools_1.cpp:361 msgid "~3400 (broad), O-H" msgstr "" #: molecule_tools_1.cpp:355 msgid "~2270 (narrow), -N=C=O" msgstr "" #: molecule_tools_1.cpp:357 msgid "~2125 (narrow), -N=C=S" msgstr "" #: molecule_tools_1.cpp:363 molecule_tools_1.cpp:365 msgid "~1525 (narrow), -NO2" msgstr "" #: molecule_tools_1.cpp:367 msgid "~1600 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:368 msgid "~1475 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:580 #, fuzzy msgid "10.5 (Guanidine)" msgstr "Guanin" #: molecule_tools_1.cpp:600 msgid "9 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:604 msgid "11 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:608 msgid "11 (a-carbon between ketone and ester)" msgstr "" #: molecule_tools_1.cpp:612 msgid "13 (a-carbon between two esters)" msgstr "" #: molecule_tools_1.cpp:621 msgid "5 (Aromatic primary amine)" msgstr "" #: molecule_tools_1.cpp:627 msgid "9-10 (Alkene-primary amine)" msgstr "" #: molecule_tools_1.cpp:630 msgid "11 (Aliphatic primary amine)" msgstr "" #: molecule_tools_1.cpp:642 msgid "-4 (pyrrole)" msgstr "" #: molecule_tools_1.cpp:647 msgid "14.4 (secondary amine)" msgstr "" #: molecule_tools_1.cpp:652 #, fuzzy msgid "11 (aliphatic secondary amine)" msgstr "Tegn aliphatisk kæde" #: molecule_tools_1.cpp:664 msgid "6.8 (conjugated secondary amine)" msgstr "" #: molecule_tools_1.cpp:668 msgid "5 (aromatic secondary amine)" msgstr "" #: molecule_tools_1.cpp:672 molecule_tools_1.cpp:676 msgid "1-3 (purine/pyrimidine)" msgstr "" #: molecule_tools_1.cpp:687 msgid "4 (tertiary amine)" msgstr "" #: molecule_tools_1.cpp:693 msgid "10 (aliphatic tertiary amine)" msgstr "" #: molecule_tools_1.cpp:703 msgid "8 (Peroxy acid)" msgstr "" #: molecule_tools_1.cpp:720 msgid "-1 (sulfonic acid)" msgstr "" #: molecule_tools_1.cpp:734 msgid "4 (Aromatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:738 msgid "4.5 (Aliphatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:740 msgid "3 (Aliphatic carboxylic acid, a-halide)" msgstr "" #: molecule_tools_1.cpp:742 msgid "1.3 (Aliphatic carboxylic acid, 2 a-halide)" msgstr "" #: molecule_tools_1.cpp:749 msgid "10 (Aromatic -OH)" msgstr "" #: molecule_tools_1.cpp:751 msgid "16 (Aliphatic -OH)" msgstr "" #: molecule_tools_1.cpp:761 msgid "7.8 (Aromatic -SH)" msgstr "" #: molecule_tools_1.cpp:763 msgid "10.6 (Aliphatic -SH)" msgstr "" #: molecule_tools_1.cpp:770 msgid "Estimated pKa's:" msgstr "Estimerede pKa'er:" #: molecule_tools_1.cpp:780 msgid "There seem to be no sites with pKa between -1 and 15." msgstr "Der er ingen sites with pKa mellem -1 og 15." #: molecule_tools_1.cpp:783 msgid "Estimated pKa's" msgstr "Estimerede pKa'er" #: molecule_tools_2.cpp:462 #, fuzzy msgid "Elemental analysis:\n" msgstr "Grundstofanalyse" #: molinfodialog.cpp:12 msgid "Molecule Info" msgstr "Molekyle-info" #: molinfodialog.cpp:14 molinfodialog.cpp:15 msgid "Name: " msgstr "" #: molinfodialog.cpp:17 molinfodialog.cpp:18 msgid "CAS: " msgstr "" #: molinfodialog.cpp:20 msgid "Molecular weight = " msgstr "Molekylevægt = " #: molinfodialog.cpp:23 molinfodialog.h:24 msgid "Formula = " msgstr "Formel = " #: molinfodialog.cpp:26 msgid "Analysis = " msgstr "Analyse = " #: myfiledialog.cpp:6 msgid "Transparent" msgstr "Gennemsigtig" #: netdialog.cpp:42 msgid "Find structure via Internet" msgstr "Find strukturen via internettet" #: netdialog.cpp:46 msgid "XDC database server:" msgstr "XDC databaseserver:" #: netdialog.cpp:54 msgid "Search type:" msgstr "Søg efter type:" #: netdialog.cpp:59 msgid "CAS Number" msgstr "CAS-nummer" #: netdialog.cpp:60 msgid "Formula" msgstr "Formel" #: netdialog.cpp:61 msgid "Chemical name" msgstr "Kemisk navn" #: netdialog.cpp:64 msgid "Look for:" msgstr "Kig efter:" #: netdialog.cpp:72 msgid "Exact matches only" msgstr "Kun nøjagtige match" #: netdialog.cpp:75 msgid "Search" msgstr "Søg" #: pagesetupdialog.cpp:19 msgid "Page setup" msgstr "Sideopsætning" #: pagesetupdialog.cpp:22 msgid "Paper size:" msgstr "Papirstørrelse:" #: pagesetupdialog.cpp:25 msgid "Letter (8.5\" x 11\")" msgstr "Letter (8.5\" x 11\")" #: pagesetupdialog.cpp:26 msgid "Legal (8.5\" x 14\")" msgstr "Legal (8.5\" x 14\")" #: pagesetupdialog.cpp:27 msgid "A4 (210 mm x 297 mm)" msgstr "A4 (210 mm x 297 mm)" #: pagesetupdialog.cpp:28 msgid "640x480 pixels" msgstr "640x480 pixeler" #: pagesetupdialog.cpp:29 msgid "800x600 pixels" msgstr "800x600 pixeler" #: pagesetupdialog.cpp:30 msgid "1024x768 pixels" msgstr "1024x768 pixeler" #: pagesetupdialog.cpp:31 msgid "Custom paper size" msgstr "Selvvalgt papirstørrelse" #: pagesetupdialog.cpp:50 msgid "Orientation:" msgstr "Orientering:" #: pagesetupdialog.cpp:53 msgid "Portrait" msgstr "Stående" #: pagesetupdialog.cpp:54 msgid "Landscape" msgstr "Liggende" #: pagesetupdialog.cpp:86 msgid "Page width:" msgstr "Sidebredde:" #: pagesetupdialog.cpp:96 msgid "Page height:" msgstr "Sidehøjde:" #: peptidebuilder.cpp:12 msgid "Peptide Builder" msgstr "Peptidbygning" #: peptidebuilder.cpp:18 msgid "" "Enter peptide sequence -\n" "three-letter abbreviations:" msgstr "" "Skriv peptid-sekvens -\n" "forkortelse på 3 bogstaver:" #: peptidebuilder.cpp:23 msgid "Shortcut: Hold 'Alt' and type one-letter codes!" msgstr "Genvej: Hold 'Alt' nede og skriv et-bogstavskoder!" #: render2d.cpp:125 render2d_event.cpp:696 render2d_event.cpp:1018 msgid "" "Select mode: left click on object to move, right click on object to edit" msgstr "" "Vælg tilstand: venstreklik på et objekt for at flytte det, højreklik på " "objektet for at redigere det" #: render2d.cpp:136 #, fuzzy msgid "Lasso mode: left click and hold to draw lasso" msgstr "Tegn pil tilstand: venstreklik for at tegne en pil" #: render2d.cpp:147 msgid "Draw Line mode: left click to draw line, right click to edit" msgstr "" "Tegn linje tilstand: venstreklik for at tegne en linje, højreklik for at " "redigere" #: render2d.cpp:158 msgid "Draw Dashed Line mode: left click to draw line, right click to edit" msgstr "" "Tegn stiplet linje tilstand: venstreklik for at tegne en linje, højreklik " "for at redigere" #: render2d.cpp:169 msgid "Draw Chain mode: left click and drag to draw aliphatic chain" msgstr "" "Tegn kæde tilstand: venstreklik og træk for at tegne en aliphatisk kæde" #: render2d.cpp:180 msgid "Draw Stereo-Up Line mode: left click to draw line, right click to edit" msgstr "" "Tegn 3D-ud linje tilstand: venstreklik for at tegne en linje, højreklik for " "at redigere" #: render2d.cpp:191 msgid "" "Draw Stereo-Down Line mode: left click to draw line, right click to edit" msgstr "" "Tegn 3D-ind linje tilstand: venstreklik for at tegne linje, højreklik for at " "redigere" #: render2d.cpp:202 msgid "Draw Wavy Line mode: left click to draw line, right click to edit" msgstr "" "Tegn bølget linje tilstand: venstreklik for at tegne en linje, højreklik for " "at redigere" #: render2d.cpp:222 msgid "Draw Arrow mode: left click to draw arrow" msgstr "Tegn pil tilstand: venstreklik for at tegne en pil" #: render2d.cpp:240 msgid "Draw Bracket mode: left click to draw bracket" msgstr "" "Tegn kantet parentes tilstand: venstreklik for at tegne kantede parenteser" #: render2d.cpp:252 msgid "Erase mode: left click to erase object" msgstr "Slet tilstand: venstreklik for at slette et objekt" #: render2d.cpp:262 msgid "Text mode: left click to add or edit text" msgstr "Tekst tilstand: venstreklik for at tilføje eller redigere tekst" #: render2d.cpp:275 msgid "Draw Symbol mode: left click to add symbol" msgstr "Tegn symbol tilstand: venstreklik for at tilføje et symbol" #: render2d.cpp:289 msgid "Draw graphic object: cubic bezier" msgstr "Tegn et grafisk objekt: kubisk bezier-kurve" #: render2d.cpp:305 render2d.cpp:316 msgid "Left-click to draw Newman projection template" msgstr "Venstre-klik for a tegne Newman-projektionsskabelon" #: render2d.cpp:329 #, qt-format msgid "Draw Ring mode: left click to add %1" msgstr "Tegn ring tilstand: venstreklik for at tilføje %1" #: render2d.cpp:353 msgid "Click on a molecule for information" msgstr "Klik på et molekyle for at få informationer om det" #: render2d.cpp:356 render2d_event.cpp:1082 msgid "Click on a molecule to calculate its molecular weight" msgstr "Klik på et molekyle for at beregne dets molekylevægt" #: render2d.cpp:359 render2d_event.cpp:1095 msgid "Click on a molecule to calculate its empirical formula" msgstr "Klik på et molekyle for at beregne dets empiriske formel" #: render2d.cpp:362 msgid "Click on a molecule to calculate its elemental analysis" msgstr "Klik på et molekyle for lave en grundstofanalyse" #: render2d.cpp:365 msgid "Click on a molecule to calculate its 13C NMR" msgstr "Klik på et molekyle for at beregne dets 13C NMR" #: render2d.cpp:368 msgid "Click on a molecule to calculate its 1H NMR" msgstr "Klik på et molekyle for at beregne dets 1H NMR" #: render2d.cpp:371 msgid "Click on a molecule to calculate its IR" msgstr "Klik på et molekyle for at beregne dets IR" #: render2d.cpp:374 msgid "Click on a molecule to calculate its pKa(s)" msgstr "Klik på et molekyle for at beregne dets pKa(s)" #: render2d.cpp:377 #, fuzzy msgid "Click on a molecule for possible retrosynthesis" msgstr "Klik på et molekyle for at få informationer om det" #: render2d.cpp:381 #, fuzzy msgid "Click on a molecule to display its bond identifier" msgstr "Klik på et molekyle for at fjerne gruppemarkeringen" #: render2d.cpp:384 msgid "Click on a molecule to calculate its octanol-water partition" msgstr "" "Klik på et molekyle for at beregne dets octanol-vand fordelingskoefficient" #: render2d.cpp:387 msgid "Click on a molecule to generate 3-D coordinates" msgstr "Klik på et molekyle for at generere dets 3-D koordinater" #: render2d.cpp:390 #, fuzzy msgid "Click on a molecule to guess its name" msgstr "Klik på et molekyle for at beregne dets IR" #: render2d.cpp:393 msgid "Click on a molecule to determine its SMILES string" msgstr "Klik på et molekyle for at bestemme dets SMILES streng" #: render2d.cpp:396 msgid "Click on a molecule to clean up its structure" msgstr "Klik på et molekyle for at rydde op i dets struktur" #: render2d.cpp:399 msgid "Click on a molecule to assign it as a reactant" msgstr "Klik på et molekyle for markere det som reaktant" #: render2d.cpp:402 msgid "Click on a molecule to assign it as a product" msgstr "Klik på et molekyle for markere det som produkt" #: render2d.cpp:405 msgid "Click on a molecule to clear it group assignment" msgstr "Klik på et molekyle for at fjerne gruppemarkeringen" #: render2d.cpp:408 msgid "Click on a molecule to save it as a custom ring" msgstr "Klik på et molekyle for at gemme det som brugerdefineret ring" #: render2d.cpp:411 msgid "Tool test mode" msgstr "Testtilstand" #: render2d.cpp:414 #, fuzzy msgid "Click on a molecule" msgstr "Ryd op i molekylet" #: render2d.cpp:431 msgid "Select mode: left click to move, right click to edit" msgstr "Vælg tilstand: venstreklik for at flytte, højreklik for at redigere" #: render2d.cpp:482 msgid "Undo!" msgstr "Fortryd!" #: render2d.cpp:484 msgid "Cannot undo, sorry!" msgstr "Kan desværre ikke fortrydes!" #: render2d_event.cpp:134 #, fuzzy msgid "No information." msgstr "Molekyle information..." #: render2d_event.cpp:145 #, fuzzy msgid "Object information" msgstr "Molekyle information..." #: render2d_event.cpp:187 msgid "Object" msgstr "" #: render2d_event.cpp:189 #, fuzzy msgid "Arrow" msgstr "NR pil" #: render2d_event.cpp:191 #, fuzzy msgid "Bond" msgstr " bindinger" #: render2d_event.cpp:193 #, fuzzy msgid "Bracket" msgstr "Editor af kantede parenteser" #: render2d_event.cpp:195 #, fuzzy msgid "Curved Arrow" msgstr "Editor af krumme pile" #: render2d_event.cpp:197 #, fuzzy msgid "Symbol" msgstr "Symbol-editor" #: render2d_event.cpp:199 msgid "Text" msgstr "" #: render2d_event.cpp:202 #, fuzzy msgid "Edit" msgstr "&Redigér" #: render2d_event.cpp:204 render2d_event.cpp:211 #, fuzzy msgid "Info" msgstr "Indol" #: render2d_event.cpp:209 #, fuzzy msgid "Molecule" msgstr "Molekyle-info" #: render2d_event.cpp:1008 msgid "Select mode: left click on object to move" msgstr "Vælg tilstand: venstreklik på et objekt for at flytte det" #: render2d_event.cpp:1079 render2d_event.cpp:1092 msgid ", click to paste into drawing" msgstr ", klik for at indsætte på tegningen" #: render2d_event.cpp:1409 msgid "Draw Line - Length = " msgstr "Tegn linje - Længde = " #: render2d_event.cpp:1409 msgid ", Angle = " msgstr ", Vinkel = " #: render2d_event.cpp:1440 msgid "Draw aliphatic chain - Length = " msgstr "Tegn aliphatisk kæde - Længde = " #: render2d_event.cpp:1440 msgid " bonds" msgstr " bindinger" #: render2d_text.cpp:121 msgid "Enter subscript" msgstr "Sænket skrift" #: render2d_text.cpp:122 msgid "Please type or edit the subscript for this bracket:" msgstr "Skriv eller rediger den sænkede skrift for denne kantede parentes:" #: retro.cpp:34 msgid "No reactions found" msgstr "" #: retro.cpp:99 msgid "" "The following reactions could have resulted in this product:\n" "\n" msgstr "" #: retro.cpp:100 msgid "" "\n" "Target bonds will be highlighted in green.\n" "To see reactions affecting a highlighted bond, right-click on the bond and " "select Info.\n" "To clear highlights, select Undo from the Edit menu, or press Ctrl+Z." msgstr "" #: retro.cpp:102 retro.cpp:104 msgid "Reverse reactions list" msgstr "" #: retro.cpp:105 #, fuzzy msgid "No reactions in the database could yield the selected molecule." msgstr "Der opstod en fejl. Serveren kan ikke finde det valgte molekyle." #: ringdialog.cpp:37 msgid "Ring tool" msgstr "Ringværktøj" #: ringdialog.cpp:41 msgid "Choose a structure from list:" msgstr "Vælg en struktur fra listen:" #: smilesdialog.cpp:30 msgid "Enter SMILES string" msgstr "Indtast SMILES streng" #: smilesdialog.cpp:31 msgid "Enter SMILES string:" msgstr "Indtast SMILES streng:" #: to3d.cpp:263 #, fuzzy msgid "Save 3D file as..." msgstr "Gem filen som..." #: to3d.cpp:265 msgid "MDL molfile (*.mol)" msgstr "" #: tool_13c_nmr.cpp:26 msgid "13C NMR spectrum" msgstr "13C NMR spektrum" #: tool_13c_nmr.cpp:57 tool_13c_nmr.cpp:68 tool_13c_nmr.cpp:79 msgid ", intensity " msgstr ", intensitet " #: tool_13c_nmr.cpp:63 tool_1h_nmr.cpp:61 tool_ir.cpp:61 msgid "Peaks of reactant:\n" msgstr "Reaktantens toppe:\n" #: tool_13c_nmr.cpp:74 tool_1h_nmr.cpp:72 tool_ir.cpp:72 msgid "Peaks of product:\n" msgstr "Produktets toppe:\n" #: tool_1h_nmr.cpp:26 msgid "1H NMR spectrum" msgstr "1H NMR spektrum" #: tool_ir.cpp:26 msgid "IR spectrum" msgstr "IR spektrum" #: xruler.cpp:58 xruler.cpp:82 msgid "px" msgstr "px" #: xruler.cpp:59 xruler.cpp:83 msgid "in" msgstr "i" #: http.h:21 msgid "Accessing network" msgstr "" #: http.h:24 #, fuzzy msgid "Please wait." msgstr "Sidebredde:" #: molinfodialog.h:34 msgid "CAS:" msgstr "" #: molinfodialog.h:40 msgid "Name:" msgstr "" #, fuzzy #~ msgid "Estimate partial charges" #~ msgstr "Estimér ændringen i gasfasens enthalpi" #, fuzzy #~ msgid "Retrosynthesis" #~ msgstr "Retrosyntetisk pil" #, fuzzy #~ msgid "" #~ "This copy of XDrawChem is more than 90 days old. A more recent version " #~ "may be available at\n" #~ "http://freshmeat.net/projects/xdrawchem/" #~ msgstr "" #~ "Denne version af XDrawChem er mere end 60 dage gammel. Det er ikke et " #~ "problem :-) men måske er der en nyere på http://freshmeat.net/projects/" #~ "xdrawchem/" #, fuzzy #~ msgid "Could not open the retrosynthesis data file." #~ msgstr "Kunne ikke åbne filen: " #~ msgid "Calculate empirical formula" #~ msgstr "Beregn empirisk formel" #~ msgid "Calculate molecular weight" #~ msgstr "Beregn molekylevægten" #~ msgid "Test tool" #~ msgstr "Testværktøj" #~ msgid "Click on a molecule to determine its IUPAC name" #~ msgstr "Klik på et molekyle for at finde dets IUPAC-navn" xdrawchem-v1.11.0/translation/xdrawchem-de.po000066400000000000000000001763041371466245600212410ustar00rootroot00000000000000# German translation of xdrawchem. # This file is distributed under the same license as the xdrawchem package. # Copyright (C) 2004-2005 THE PACKAGE'S COPYRIGHT HOLDER. # Copyright (C) 2004-2005, The Free Software Foundation # Daniel Leidert , 2004, 2005. msgid "" msgstr "" "Project-Id-Version: xdrawchem 1.9.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-08-10 23:25+0200\n" "PO-Revision-Date: 2005-08-10 23:25+0200\n" "Last-Translator: Daniel Leidert \n" "Language-Team: none\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: application.cpp:164 msgid "" "Click this button to open a file.

    You can also select the Open " "command from the File menu." msgstr "" "Öffnet eine bestehende Datei.

    Entspricht dem Menüpunkt Öffnen im " "Datei-Menü." #: application.cpp:165 msgid "" "Click this button to save the file you are editing.

    You can also " "select the Save command from the File menu.

    " msgstr "" "Speichert die Datei, die Sie gerade bearbeiten.

    Entspricht dem " "Menüpunkt Speichern im Datei-Menü." #: application.cpp:166 msgid "" "Click this button to print the file you are editing.

    You can also " "select the Print command from the File menu." msgstr "" "Druckt die Datei, die Sie gerade bearbeiten.

    Entspricht dem Menüpunkt " "Drucken im Datei-Menü." #: application.cpp:167 msgid "" "Click this button to cut a selection.

    You can also select the Cut " "command from the Edit menu, or press Ctrl+X." msgstr "" "Schneidet den markierten Bereich aus.

    Entspricht dem Menüpunkt " "Ausschneiden im Bearbeiten-Menü. Tastenkombination: 'Strg'+'X'." #: application.cpp:168 msgid "" "Click this button to copy a selection.

    You can also select the Copy " "command from the Edit menu, or press Ctrl+C." msgstr "" "Kopiert den markierten Bereich in die Zwischenablage.

    Entspricht dem " "Menüpunkt Kopieren im Bearbeiten-Menü. Tastenkombination: 'Strg'+'C'." #: application.cpp:169 msgid "" "Click this button to paste a selection.

    You can also select the Paste " "command from the Edit menu, or press Ctrl+V." msgstr "" "Fügt Inhalte aus der Zwischenablage ein.

    Entspricht dem Menüpunkt " "Einfügen im Bearbeiten-Menü. Tastenkombination: 'Strg'+'V'." #: application.cpp:170 msgid "Click this button to zoom in." msgstr "Vergrößert den Zoom-Faktor." #: application.cpp:171 msgid "Click this button to zoom out." msgstr "Verkleinert den Zoom-Faktor." #: application.cpp:174 msgid "" "Select tool

    Use the Select tool to select and move items inside a box." "

    You can select multiple items and cut, copy, move and rotate them." msgstr "" "Auswahl

    Damit markieren und verschieben Sie Elemente innerhalb der " "Box.

    Sie können auch mehrere Elemente ausschneiden, kopieren, " "verschieben oder drehen." #: application.cpp:175 msgid "" "Lasso tool

    Use the Lasso tool to select and move items by drawing a " "loop around them.

    You can select multiple items and cut, copy, move " "and rotate them." msgstr "" "Lasso

    Damit markieren und verschieben Sie Elemente innerhalb der Box, " "indem Sie den Auswahl-Bereich freihändig zeichnen.

    Sie können auch " "mehrere Elemente ausschneiden, kopieren, verschieben oder drehen." #: application.cpp:176 msgid "Erase tool

    Use the Erase tool to erase individual items." msgstr "Radierer

    Damit löschen Sie einzelne Elemente." #: application.cpp:177 msgid "" "Line tool

    Use the Line tool to draw bonds. Draw over existing bonds " "to create double and triple bonds." msgstr "" "Linie

    Damit zeichnen Sie Einfachbindungen. Wenn Sie dieses Werkzeug " "auf bereits bestehende Bindungen anwenden, erzeugen Sie Doppel- und " "Dreifachbindungen." #: application.cpp:178 msgid "" "Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw " "over existing bonds to add dashed lines (to indicate resonance, etc.)." msgstr "" "Gestrichelte Linie

    Damit zeichnen Sie gestrichelte Linien oder " "Bindungen. Wenden Sie diese Werkzeug auf bereits bestehende Bindungen an, um " "Resonanz, Bindungsbruch, u.ä. darzustellen." #: application.cpp:179 msgid "" "Chain tool

    Use the Chain tool to draw aliphatic chains. The length " "of each segment is the current bond length." msgstr "" "Aliphatische Ketten

    Nutzen Sie dieses Werkzeug, um aliphatische " "Ketten zu zeichnen. Die Länge eines jeden Segments entspricht der " "Bindungslänge." #: application.cpp:180 msgid "" "Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as " "shown on the button." msgstr "" "Keil

    Damit zeichen Sie eine stereospezifische Bindung aus der " "Papierebene heraus." #: application.cpp:181 msgid "" "Stereo Down Line tool

    Use the Line tool to draw stereo-down lines, as " "shown on the button." msgstr "" "Keil gestrichelt

    Damit zeichen Sie eine stereospezifische Bindung in " "die Papierebene hinein." #: application.cpp:182 msgid "" "Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on " "the button." msgstr "" "Unspezifische Bindung

    Damit zeichnen Sie eine unspezifische " "Stereobindung (z.B. für Racemate)." #: application.cpp:183 msgid "" "Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click " "to draw a straight arrow.

    Click and hold to pick from a list of " "available arrows." msgstr "" "Gerader Pfeil

    Damit fügen Sie einen geraden Pfeil ein.

    Wenn " "Sie die Schaltfläche gedrückt halten, erscheint eine Auswahlliste mit " "verschiedenen geraden Pfeilen (Reaktionspfeil, Gleichgewichtspfeil, ...)." #: application.cpp:184 msgid "" "Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows." "

    Click and hold to select from a picture menu of arrows." msgstr "" "Gekrümmter Pfeil

    Damit fügen Sie einen gekrümmten Pfeil ein." "

    Wenn Sie die Schaltfläche gedrückt halten, erscheint eine " "Auswahlliste mit verschiedenen gekrümmten Pfeile." #: application.cpp:185 msgid "" "Bracket tool

    Use the Bracket tool to draw brackets and parentheses." "

    Click to draw square brackets.

    Click and hold to select from " "a picture menu of brackets." msgstr "" "Klammern

    Damit fügen Sie Klammer-Ausdrücke ein.

    Wenn Sie die " "Schaltfläche gedrückt halten, erscheint eine Auswahlliste mit verschiedenen " "Klammern (geschweifte, eckige, runde, ... Klammern)." #: application.cpp:186 msgid "" "Text tool

    Use the Text tool to add text and label atoms and points." "
    (See manual for info on formatting text)" msgstr "" "Text

    Damit fügen Sie Text oder bezeichnen Atome." "

    Formatierungsanweisungen für den Text finden Sie im Handbuch." #: application.cpp:187 msgid "" "Ring tool

    Use the Ring tool to insert ready-made rings and structures." "

    Click to open the ring dialog, which allows selection from a list of " "all built-in rings and structures.

    Click and hold to select from a " "picture menu of select rings.
    (See manual for more info on modifying this " "menu)" msgstr "" "Templates

    Damit fügen Sie fertige Ringe und Strukturen ein." "

    Wenn Sie die Schaltfläche anklicken, erscheint ein Auswahldialog mit " "verschiedenen Ringen und Strukturen.

    Wenn Sie die Schaltfläche " "gedrückt halten, erscheint eine Auswahlliste mit verschiedenen Ringen und " "Strukturen.
    Anweisungen zum Modifizieren dieses Menüs finden Sie im " "Handbuch." #: application.cpp:188 msgid "" "Symbol tool

    Use the Symbol tool to insert symbols.

    Click and " "hold to select from a picture menu of symbols.
    " msgstr "" "Symbole

    Damit fügen Sie Symbole ein.

    Wenn Sie die Schaltfläche " "gedrückt halten, erscheint eine Auswahlliste mit verschiedenen Symbolen." #: application.cpp:223 msgid "File Operations" msgstr "Datei-Menü" #: application.cpp:228 msgid "Open file" msgstr "Datei öffnen" #: application.cpp:235 msgid "Save file" msgstr "Datei speichern" #: application.cpp:242 msgid "Print file" msgstr "Datei drucken" #: application.cpp:249 render2d_event.cpp:283 msgid "Cut" msgstr "Ausschneiden" #: application.cpp:256 render2d_event.cpp:284 msgid "Copy" msgstr "Kopieren" #: application.cpp:263 msgid "Paste" msgstr "Einfügen" #: application.cpp:270 msgid "Zoom In" msgstr "Zoom vergrößern" #: application.cpp:277 msgid "Zoom Out" msgstr "Zoom verkleinern" #: application.cpp:291 msgid "Set drawing color" msgstr "Zeichenfarbe" #: application.cpp:295 msgid "Set line thickness" msgstr "Linienbreite" #: application.cpp:296 msgid "Set Line Thickness" msgstr "Linienbreite wählen" #: application.cpp:310 msgid "Set font" msgstr "Schrifart" #: application.cpp:311 msgid "Set Font" msgstr "Schriftart wählen" #: application.cpp:320 msgid "Set font size" msgstr "Schriftgröße" #: application.cpp:321 msgid "Set Font Size" msgstr "Schriftgröße wählen" #: application.cpp:335 msgid "Left-justify selected text" msgstr "Text links ausrichten" #: application.cpp:343 msgid "Center selected text" msgstr "Text zentrieren" #: application.cpp:351 msgid "Right-justify selected text" msgstr "Text rechts ausrichten" #: application.cpp:359 msgid "Make selected text bold (Ctrl+B)" msgstr "Text fett drucken ('Strg'-B)" #: application.cpp:369 msgid "Italicize selected text (Ctrl+I)" msgstr "Text kursiv drucken ('Strg'+'I')" #: application.cpp:379 msgid "Underline selected text (Ctrl+U)" msgstr "Text unterstreichen ('Strg'+'U')" #: application.cpp:389 msgid "Superscript selected text (Ctrl-Plus)" msgstr "Text hochstellen ('Strg'+'Plus')" #: application.cpp:400 msgid "Subscript selected text (Ctrl-Minus)" msgstr "Text tiefstellen ('Strg'+'Minus')" #: application.cpp:416 netchoosedialog.cpp:89 render2d_event.cpp:282 msgid "Select" msgstr "Auswählen" #: application.cpp:423 msgid "Lasso" msgstr "Lasso" #: application.cpp:430 msgid "Erase" msgstr "Radierer" #: application.cpp:437 msgid "Draw line" msgstr "Normale Bindung zeichnen" #: application.cpp:445 msgid "Draw dashed line" msgstr "Gestrichelte Bindung zeichnen" #: application.cpp:453 msgid "Draw aliphatic chain" msgstr "Aliphatische Kette zeichnen" #: application.cpp:461 msgid "Draw stereo-up line" msgstr "Stereospezifische Bindung nach vorne zeichnen" #: application.cpp:469 msgid "Draw stereo-down line" msgstr "Stereospezifische Bindung nach hinten zeichnen" #: application.cpp:477 msgid "Draw wavy bond" msgstr "Unspezifische Bindung zeichnen" #: application.cpp:485 msgid "Draw arrow" msgstr "Pfeil zeichnen" #: application.cpp:495 msgid "Draw curved arrow" msgstr "Gekrümmten Pfeil zeichnen" #: application.cpp:505 msgid "Draw bracket" msgstr "Klammern einfügen" #: application.cpp:515 msgid "Draw or edit text" msgstr "Text einfügen" #: application.cpp:523 msgid "Draw ring" msgstr "Ringe und andere Strukturen einfügen" #: application.cpp:534 msgid "Draw symbol" msgstr "Symbol einfügen" #: application.cpp:542 msgid "Canned Structures" msgstr "Vorgegebene Strukturen" #: application.cpp:550 msgid "Cyclopropane" msgstr "Cyclopropan" #: application.cpp:558 msgid "Cyclobutane" msgstr "Cyclobutan" #: application.cpp:566 msgid "Cyclopentane" msgstr "Cyclopentan" #: application.cpp:574 msgid "Cyclopentadiene" msgstr "Cyclopentadien" #: application.cpp:582 msgid "Cyclohexane" msgstr "Cyclohexan" #: application.cpp:590 msgid "Cyclohexane - chair conformation" msgstr "Cyclohexane - Sesselkonformation" #: application.cpp:598 msgid "Cyclohexane - boat conformation" msgstr "Cyclohexan - Bootkonformation" #: application.cpp:606 msgid "Benzene" msgstr "Benzen" #: application.cpp:616 msgid "Biochemical drawing tools" msgstr "Biochemische Zeichenwerkeuge" #: application.cpp:621 helpwindow.cpp:89 msgid "&File" msgstr "&Datei" #: application.cpp:623 msgid "&New" msgstr "&Neu" #: application.cpp:625 msgid "&Open" msgstr "&Öffnen" #: application.cpp:630 msgid "&Find on Internet" msgstr "Im &Internet finden" #: application.cpp:634 msgid "&Save" msgstr "&Speichern" #: application.cpp:638 msgid "Save &as..." msgstr "Speichern &unter..." #: application.cpp:640 msgid "Save picture..." msgstr "Als Bild speichern..." #: application.cpp:643 msgid "Pa&ge setup" msgstr "Seiten&einstellungen" #: application.cpp:644 helpwindow.cpp:68 msgid "&Print" msgstr "&Drucken" #: application.cpp:648 graphdialog.cpp:42 tool_13c_nmr.cpp:41 #: tool_1h_nmr.cpp:41 tool_ir.cpp:41 msgid "Close" msgstr "Schließen" #: application.cpp:649 msgid "Quit" msgstr "Beenden" #: application.cpp:652 msgid "Rotate 90 degrees clockwise" msgstr "Drehung um 90° im Uhrzeigersinn" #: application.cpp:654 msgid "Rotate 180 degrees" msgstr "Drehung um 180°" #: application.cpp:655 msgid "Rotate 90 degrees counterclockwise" msgstr "Drehung um 90° entgegen dem Uhrzeigersinn" #: application.cpp:659 msgid "Flip &horizontal" msgstr "Rotation &horizontal" #: application.cpp:660 msgid "Flip &vertical" msgstr "Rotation &vertikal" #: application.cpp:663 msgid "Normal (100%)" msgstr "Normal (100%)" #: application.cpp:665 msgid "Zoom out" msgstr "Vergrößern" #: application.cpp:666 msgid "Zoom in" msgstr "Verkleinern" #: application.cpp:680 msgid "&Edit" msgstr "&Bearbeiten" #: application.cpp:682 msgid "&Undo" msgstr "&Rückgängig" #: application.cpp:683 msgid "Insert s&ymbol" msgstr "S&ymbol einfügen" #: application.cpp:687 msgid "Cu&t" msgstr "&Ausschneiden" #: application.cpp:688 msgid "&Copy" msgstr "&Kopieren" #: application.cpp:689 msgid "&Paste" msgstr "&Einfügen" #: application.cpp:690 msgid "Clear" msgstr "Leeren" #: application.cpp:692 msgid "Select &All" msgstr "&Alles auswählen" #: application.cpp:693 msgid "&Deselect All" msgstr "Auswahl auf&heben" #: application.cpp:695 msgid "&Rotate" msgstr "&Drehen" #: application.cpp:696 msgid "&Flip" msgstr "&Rotieren" #: application.cpp:698 msgid "&Zoom" msgstr "&Zoom" #: application.cpp:701 msgid "&Group" msgstr "&Gruppieren" #: application.cpp:702 msgid "Select &Reactant" msgstr "&Edukt auswählen" #: application.cpp:704 msgid "Select &Product" msgstr "&Produkt auswählen" #: application.cpp:706 msgid "Clear &group" msgstr "&Gruppierung aufheben" #: application.cpp:708 msgid "Clear all &groups" msgstr "&Alle Gruppierungen aufheben" #: application.cpp:713 msgid "Forma&t" msgstr "&Format" #: application.cpp:715 msgid "&Bond - Fixed length and angle" msgstr "&Bindung - Länge und Winkel fest" #: application.cpp:718 msgid "&Arrow - Fixed length and angle" msgstr "&Pfeil - Länge und Winkel fest" #: application.cpp:725 msgid "Set background &color" msgstr "Hinter&grundfarbe setzen" #: application.cpp:727 msgid "Toggle &grid" msgstr "Hintergrund&raster umschalten" #: application.cpp:729 msgid "&Drawing settings..." msgstr "&Einstellungen" #: application.cpp:731 msgid "&XDC settings..." msgstr "&XDC Einstellungen..." #: application.cpp:736 msgid "Estimate gas-phase enthalphy change" msgstr "Reaktionsenthalpie in der Gasphase abschätzen" #: application.cpp:738 msgid "Compare 1H NMR" msgstr "Vergleich der 1H-NMR-Spektren" #: application.cpp:740 msgid "Compare 13C NMR" msgstr "Vergleich der 13C-NMR-Spektren" #: application.cpp:747 msgid "Reverse reactions" msgstr "Vorschlag für Retrosynthese" #: application.cpp:753 msgid "Get bond identifier" msgstr "Identifikator der Bindung bestimmen" #: application.cpp:757 msgid "T&ools" msgstr "&Werkzeuge" #: application.cpp:758 msgid "Clean up molecule" msgstr "Molekül bereinigen" #: application.cpp:759 msgid "Auto &layout" msgstr "Auto &Layout" #: application.cpp:760 msgid "Create custom ring" msgstr "Benutzerdefinierte Struktur erstellen" #: application.cpp:763 msgid "Molecule information..." msgstr "Molekül-Information..." #: application.cpp:765 msgid "Predict 1H NMR" msgstr "Berechne 1H-NMR-Spektrum" #: application.cpp:766 msgid "Predict 13C NMR" msgstr "Berechne 13C-NMR-Spektrum" #: application.cpp:767 msgid "Predict IR" msgstr "Berechne IR-Spektrum" #: application.cpp:768 msgid "Predict pKa" msgstr "Schätze Säurekonstante pKs" #: application.cpp:769 msgid "Predict octanol-water partition (Kow)" msgstr "Schätze Octanol-Wasser-Verteilungskoeffizient (Kow)" #: application.cpp:770 msgid "Reaction" msgstr "Reaktion" #: application.cpp:772 msgid "Input SMILES" msgstr "SMILES-String eingeben" #: application.cpp:773 msgid "Output SMILES" msgstr "SMILES-String ausgeben" #: application.cpp:774 msgid "Output InChI" msgstr "InChI ausgeben" #: application.cpp:776 msgid "Build 3D model of molecule" msgstr "Erstelle 3D-Modell des Moleküls" #: application.cpp:782 helpwindow.cpp:92 msgid "&Help" msgstr "&Hilfe" #: application.cpp:784 msgid "&Manual" msgstr "Hand&buch" #: application.cpp:785 msgid "&Did You Know?" msgstr "&Wussten Sie schon...?" #: application.cpp:786 msgid "&About" msgstr "&Über" #: application.cpp:787 msgid "&Support" msgstr "&Support" #: application.cpp:788 msgid "&References" msgstr "&Referenzen" #: application.cpp:790 msgid "What's &This" msgstr "What's &This - Assistent" #: application.cpp:873 msgid "Antibody" msgstr "Antikörper" #: application.cpp:876 msgid "Newman projection symbol" msgstr "Newman-Projektion" #: application.cpp:877 msgid "Newman projection - staggered (anti)" msgstr "Newman-Projektion - gestaffelt (anti)" #: application.cpp:878 msgid "Newman projection - eclipsed" msgstr "Newman-Projektion - verdeckt" #: application.cpp:936 msgid "Cubic bezier" msgstr "Kubische Bezierkurve" #: application.cpp:939 msgid "Cubic bezier - half arrow" msgstr "Kubische Bezierkurve - halber Pfeil" #: application.cpp:942 msgid "Cubic bezier - full arrow" msgstr "Kubische Bezierkurve - voller Pfeil" #: application.cpp:988 application_ring.cpp:351 msgid "User-defined" msgstr "Benutzerdefiniert" #: application.cpp:1214 application_ob.cpp:190 application_ob.cpp:201 msgid "Could not write to " msgstr "Kann nicht zugreifen auf " #: application.cpp:1220 application_ob.cpp:194 application_ob.cpp:205 #: application_ob.cpp:238 msgid "Saved file " msgstr "Datei gespeichert " #: application.cpp:1272 msgid "Save as picture..." msgstr "Als Bild speichern..." #: application.cpp:1307 application.cpp:1361 application.cpp:1367 msgid "Saved picture file " msgstr "Bild gespeichert " #: application.cpp:1309 application.cpp:1363 application.cpp:1369 msgid "Unable to save picture!" msgstr "Bild kann nicht gespeichert werden!" #: application.cpp:1466 msgid "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Please subscribe to the mailing list for information about future releases.\n" "Send a message to xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n" "\n" "XDrawChem is copyright (C) 2004 Bryan Herger.\n" "Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint " "project\n" "OpenBabel code copyright (C) 2003 by the OpenBabel project team.\n" "See file COPYRIGHT.txt for more details" msgstr "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Bitte tragen Sie sich in die Mailing-Liste (nur in Englisch) ein, um " "Informationen über zukünftige Veröffentlichungen zu erhalten.\n" "Dazu senden Sie eine E-Mail an xdrawchem-announce-request@lists.sourceforge." "net mit dem Betreff: 'subscribe'\n" "\n" "XDrawChem Copyright (C) 2004 Bryan Herger (http://xdrawchem.sourceforge." "net)\n" "Anteilig Copyright (C) 1997-2000 Dr. Christoph Steinbeck und das JChemPaint " "Projekt (http://jchempaint.sourceforge.net)\n" "OpenBabel Copyright (C) 2003 OpenBabel Projekt-Team (http://openbabel." "sourceforge.net)\n" "Siehe COPYRIGHT.txt für mehr Details" #: application.cpp:1470 msgid "How to get help" msgstr "Wo gibt es Hilfe?" #: application.cpp:1471 msgid "" "Current information on XDrawChem can always be found at\n" "http://xdrawchem.sourceforge.net/\n" "The latest release will be posted here, as well as links to mailing lists " "and the bug tracker.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "You can contact the author directly at\n" "bherger@users.sourceforge.net" msgstr "" "Aktuelle Informationen zu XDrawChem befinden sich immer unter\n" "http://xdrawchem.sourceforge.net/\n" "Hier gibt es den aktuellsten Release und Links zu den Mailing-Listen und dem " "Bug-Tracker.\n" "\n" "Bitte teilen Sie gefundene Fehler (Bugs) über den SourceForge-Tracker: " "http://www.sourceforge.net/tracker/?group_id=34518 mit.\n" "\n" "Es gibt 2 Mailing-Listen:\n" "xdrawchem-announce - Ankündigung neuer Veröffentlichungen\n" "xdrawchem-user - offene Diskussion unter den Anwendern von XDrawChem\n" "\n" "Sie können sich eintragen, indem Sie eine leere E-Mail mit dem Betreff: " "'subscribe' an \n" "'xdrawchem-announce-request@lists.sourceforge.net' oder\n" "'xdrawchem-user-request@lists.sourceforge.net' senden.\n" "\n" "Den Autor können Sie direkt erreichen unter:\n" "bherger@users.sourceforge.net" #: application.cpp:1551 msgid "Database query failed" msgstr "Anfrage an Datenbank fehlgeschlagen" #: application.cpp:1551 msgid "No molecules in the database match the query." msgstr "Kein auf die Anfrage zutreffendes Molekül in der Datenbank gefunden." #: application.cpp:1788 application.cpp:1796 application.cpp:1803 #: application.cpp:1810 #, qt-format msgid "Zoom = %1 %" msgstr "Zoom = %1 %" #: application.cpp:1814 msgid "XDC Settings" msgstr "XDC Einstellungen" #: application.cpp:1815 msgid "Change XDrawChem settings:" msgstr "Ändere XDrawChem-Einstellungen:" #: application.cpp:1816 msgid "&Main font" msgstr "&Menü Schrift" #: application.cpp:1816 msgid "&Ruler font" msgstr "&Lineal Schrift" #: application.cpp:1817 bondedit.cpp:252 charsel.cpp:68 crings_dialog.cpp:137 #: fixeddialog.cpp:144 molinfodialog.cpp:53 netchoosedialog.cpp:94 #: netdialog.cpp:80 pagesetupdialog.cpp:109 peptidebuilder.cpp:78 #: ringdialog.cpp:55 smilesdialog.cpp:41 textshapedialog.cpp:66 msgid "Cancel" msgstr "Abbrechen" #: application_ob.cpp:35 tool_2d3d.cpp:92 msgid "--Select a filter-- (*)" msgstr "--Filter wählen-- (*)" #: application_ob.cpp:38 msgid "CDXML - ChemDraw text/XML format (*)" msgstr "CDXML - ChemDraw Text/XML Format (*)" #: application_ob.cpp:41 msgid "CDX - ChemDraw binary format (*)" msgstr "CDX - ChemDraw Binary Format (*)" #: application_ob.cpp:44 msgid "XDC - XDrawChem native format (*)" msgstr "XDC - natives XDrawChem Format (*)" #: application_ob.cpp:68 msgid "Open file..." msgstr "Datei öffnen..." #: application_ob.cpp:83 application_ob.cpp:165 tool_2d3d.cpp:113 msgid "Could not determine file type" msgstr "Datei-Typ kann nicht bestimmt werden" #: application_ob.cpp:84 application_ob.cpp:166 tool_2d3d.cpp:114 msgid "Please select a file type from the list." msgstr "Bitte wählen Sie einen Datei-Typ von der Liste." #: application_ob.cpp:95 msgid "Couldn't open file" msgstr "Datei kann nicht geöffnet werden" #: application_ob.cpp:95 msgid "Could not open the file: " msgstr "Kann folgende Datei nicht öffnen: " #: application_ob.cpp:96 application_ob.cpp:104 msgid "Unable to load " msgstr "Kann nicht geladen werden " #: application_ob.cpp:110 application_ob.cpp:140 msgid "Loaded document " msgstr "Geladenes Dokument " #: application_ob.cpp:126 msgid "Problem while opening the file" msgstr "Problem während des Öffnens der Datei" #: application_ob.cpp:127 msgid "Cannot open the specified file." msgstr "Gewählte Datei kann nicht geöffnet werden." #: application_ob.cpp:153 tool_2d3d.cpp:107 msgid "Save file as..." msgstr "Datei speichern unter..." #: application_ob.cpp:158 msgid "Overwrite file?" msgstr "Datei überschreiben?" #: application_ob.cpp:158 #, qt-format msgid "Overwrite existing file: %1 ?" msgstr "Existierende Datei überschreiben: %1 ?" #: application_ob.cpp:224 msgid "IOIface Data error" msgstr "Fehler: IOIface Data error" #: application_ob.cpp:225 msgid "" "Cannot convert the molecule.\n" "Conversion failed in ioiface.cpp" msgstr "" "Molekül kann nicht konvertiert werden.Konvertierung fehlgeschlagen in " "ioiface.cpp." #: application_ob.cpp:231 tool_2d3d.cpp:133 msgid "Problem while writing the file" msgstr "Problem während des Schreibvorganges." #: application_ob.cpp:232 tool_2d3d.cpp:134 msgid "Cannot write the specified file." msgstr "Gewählte Datei kann nicht geschrieben werden." #: application_ring.cpp:121 msgid "[*] Cyclopropane" msgstr "[*] Cyclopropan" #: application_ring.cpp:125 msgid "[*] Cyclobutane" msgstr "[*] Cyclobutan" #: application_ring.cpp:129 msgid "[*] Cyclopentane" msgstr "[*] Cyclopentan" #: application_ring.cpp:133 msgid "Imidazole" msgstr "Imidazol" #: application_ring.cpp:137 msgid "[*] Cyclopentadiene" msgstr "[*] Cyclopentadien" #: application_ring.cpp:141 msgid "[*] Cyclohexane (flat)" msgstr "[*] Cyclohexan (flach)" #: application_ring.cpp:145 msgid "Cyclohexane (boat)" msgstr "Cyclohexan (Boot)" #: application_ring.cpp:149 msgid "Cyclohexane (chair)" msgstr "Cyclohexan (Sessel)" #: application_ring.cpp:153 msgid "[*] Benzene" msgstr "[*] Benzen" #: application_ring.cpp:157 msgid "Pyrimidine" msgstr "Pyrimidin" #: application_ring.cpp:161 msgid "[*] Cycloheptane" msgstr "[*] Cycloheptan" #: application_ring.cpp:165 msgid "[*] Cyclooctane" msgstr "[*] Cyclooctan" #: application_ring.cpp:169 msgid "Indole" msgstr "Indol" #: application_ring.cpp:173 msgid "Purine" msgstr "Purin" #: application_ring.cpp:177 msgid "Naphthalene" msgstr "Naphthalen" #: application_ring.cpp:181 msgid "Biphenyl" msgstr "Biphenyl" #: application_ring.cpp:185 msgid "Anthracene" msgstr "Anthracen" #: application_ring.cpp:189 msgid "Steroid (fused ring template)" msgstr "Steroid (geschlossener Ring)" #: application_ring.cpp:192 msgid "Rings" msgstr "Ringstrukturen" #: application_ring.cpp:197 msgid "Alanine" msgstr "Alanin" #: application_ring.cpp:201 msgid "Arginine" msgstr "Arginin" #: application_ring.cpp:205 msgid "Asparagine" msgstr "Asparagin" #: application_ring.cpp:209 msgid "Aspartic acid" msgstr "Asparaginsäure" #: application_ring.cpp:213 msgid "Cysteine" msgstr "Cystein" #: application_ring.cpp:217 msgid "Glutamic acid" msgstr "Glutaminsäure" #: application_ring.cpp:221 msgid "Glutamine" msgstr "Glutamin" #: application_ring.cpp:225 msgid "Glycine" msgstr "Glycin" #: application_ring.cpp:229 msgid "Histidine" msgstr "Histidin" #: application_ring.cpp:233 msgid "Isoleucine" msgstr "Isoleucin" #: application_ring.cpp:237 msgid "Leucine" msgstr "Leucin" #: application_ring.cpp:241 msgid "Lysine" msgstr "Lysin" #: application_ring.cpp:245 msgid "Methionine" msgstr "Methionin" #: application_ring.cpp:249 msgid "Nitrophenylalanine" msgstr "Nitrophenylalanin" #: application_ring.cpp:253 msgid "Phenylalanine" msgstr "Phenylalanin" #: application_ring.cpp:257 msgid "Proline" msgstr "Prolin" #: application_ring.cpp:261 msgid "Serine" msgstr "Serin" #: application_ring.cpp:265 msgid "Statine" msgstr "Statin" #: application_ring.cpp:269 msgid "Threonine" msgstr "Threonin" #: application_ring.cpp:273 msgid "Tryptophan" msgstr "Tryptophan" #: application_ring.cpp:277 msgid "Tyrosine" msgstr "Tyrosin" #: application_ring.cpp:281 msgid "Valine" msgstr "Valin" #: application_ring.cpp:284 msgid "Amino acids" msgstr "Aminosäuren" #: application_ring.cpp:289 msgid "Adenine" msgstr "Adenin" #: application_ring.cpp:292 msgid "Cytosine" msgstr "Cytosin" #: application_ring.cpp:295 msgid "Guanine" msgstr "Guanin" #: application_ring.cpp:298 msgid "Thymine" msgstr "Thymin" #: application_ring.cpp:301 msgid "Uracil" msgstr "Uracil" #: application_ring.cpp:303 msgid "Nucleic acids" msgstr "Nukleinbasen" #: application_ring.cpp:308 msgid "Ribose" msgstr "Ribose" #: application_ring.cpp:312 msgid "Deoxyribose" msgstr "Desoxyribose" #: application_ring.cpp:316 msgid "D-fructose" msgstr "D-Fructose" #: application_ring.cpp:320 msgid "D-glucose" msgstr "D-Glucose" #: application_ring.cpp:323 msgid "Sugars" msgstr "Zucker" #: application_ring.cpp:327 msgid "[*] FMOC" msgstr "[*] FMOC" #: application_ring.cpp:330 msgid "[*] BOC" msgstr "[*] BOC" #: application_ring.cpp:333 msgid "[*] DABCYL" msgstr "[*] DABCYL" #: application_ring.cpp:336 msgid "[*] DABSYL" msgstr "[*] DABSYL" #: application_ring.cpp:339 msgid "[*] DANSYL" msgstr "[*] DANSYL" #: application_ring.cpp:342 msgid "[*] EDANS" msgstr "[*] EDANS" #: application_ring.cpp:345 msgid "[*] Biotin" msgstr "[*] Biotin" #: application_ring.cpp:348 msgid "Useful groups" msgstr "Funktionelle Gruppen" #: application_ring.cpp:373 msgid "Add new..." msgstr "Neu hinzufügen..." #: bondedit.cpp:52 msgid "Color" msgstr "Farbe" #: bondedit.cpp:57 msgid "Arrow editor" msgstr "Pfeileditor" #: bondedit.cpp:58 bondedit.cpp:165 bondedit.cpp:187 bondedit.cpp:212 msgid "Style:" msgstr "Art:" #: bondedit.cpp:61 msgid "Plain arrow" msgstr "Reaktionspfeil" #: bondedit.cpp:64 msgid "NR arrow" msgstr "'No-Reaction'-Pfeil" #: bondedit.cpp:67 msgid "Dashed arrow" msgstr "Gestrichelter Pfeil" #: bondedit.cpp:70 msgid "Two-way arrow" msgstr "Mesomeriepfeil" #: bondedit.cpp:73 msgid "Split two-way arrow" msgstr "Gleichgewichtspfeil" #: bondedit.cpp:76 msgid "Retrosynthetic arrow" msgstr "Retrosynthesepfeil" #: bondedit.cpp:98 msgid "Bond editor" msgstr "Bindungseditor" #: bondedit.cpp:100 msgid "Bond order:" msgstr "Bindungsordnung" #: bondedit.cpp:103 msgid "Dashed line" msgstr "gestrichelt" #: bondedit.cpp:106 msgid "Single" msgstr "einfach" #: bondedit.cpp:109 msgid "Stereo-up" msgstr "stereospezifisch vorn" #: bondedit.cpp:112 msgid "Stereo-down" msgstr "stereospezifisch hinten" #: bondedit.cpp:115 msgid "Wavy" msgstr "unspezifisch" #: bondedit.cpp:118 msgid "Single/double (aromatic)" msgstr "einfach/zweifach (aromatisch)" #: bondedit.cpp:121 msgid "Double" msgstr "zweifach" #: bondedit.cpp:124 msgid "Double/triple" msgstr "zweifach/dreifach" #: bondedit.cpp:127 msgid "Triple" msgstr "dreifach" #: bondedit.cpp:134 msgid "Bond thickness:" msgstr "Bindungsbreite:" #: bondedit.cpp:153 msgid "Double bond alignment:" msgstr "Anordnung der Doppelbindung:" #: bondedit.cpp:156 msgid "Auto" msgstr "Automatisch" #: bondedit.cpp:157 msgid "Left" msgstr "links" #: bondedit.cpp:158 msgid "Center" msgstr "zentriert" #: bondedit.cpp:159 msgid "Right" msgstr "rechts" #: bondedit.cpp:164 msgid "Bracket editor" msgstr "Klammereditor" #: bondedit.cpp:168 msgid "Square bracket" msgstr "rechteckige Klammern" #: bondedit.cpp:171 msgid "Parentheses" msgstr "runde Klammern" #: bondedit.cpp:174 msgid "Curly bracket" msgstr "geschweifte Klammern" #: bondedit.cpp:177 msgid "Box" msgstr "Rechteck" #: bondedit.cpp:180 textshapedialog.cpp:23 msgid "Ellipse" msgstr "Ellipse" #: bondedit.cpp:186 msgid "Curved Arrow editor" msgstr "Pfeileditor" #: bondedit.cpp:190 msgid "90 degree clockwise" msgstr "90° im Uhrzeigersinn" #: bondedit.cpp:193 msgid "180 degree clockwise" msgstr "180° im Uhrzeigersinn" #: bondedit.cpp:196 msgid "270 degree clockwise" msgstr "270° im Uhrzeigersinn" #: bondedit.cpp:199 msgid "90 degree counterclockwise" msgstr "90° entgegen Uhrzeigersinn" #: bondedit.cpp:202 msgid "180 degree counterclockwise" msgstr "180° entgegen Uhrzeigersinn" #: bondedit.cpp:205 msgid "270 degree counterclockwise" msgstr "270° entgegen Uhrzeigersinn" #: bondedit.cpp:211 msgid "Symbol editor" msgstr "Symboleditor" #: bondedit.cpp:215 msgid "Positive charge" msgstr "Positive Ladung" #: bondedit.cpp:218 msgid "Negative charge" msgstr "Negative Ladung" #: bondedit.cpp:221 msgid "Partial positive charge" msgstr "Positive Partialladung" #: bondedit.cpp:224 msgid "Partial negative charge" msgstr "Negative Partialladung" #: bondedit.cpp:227 msgid "Single electron" msgstr "Elektron" #: bondedit.cpp:230 msgid "Electron pair" msgstr "Elektronenpaar" # verbessern #: bondedit.cpp:233 msgid "Stereochemical ring hydrogen" msgstr "Stereospezifisches H-Atom" #: bondedit.cpp:236 msgid "p orbital" msgstr "p-Orbital (halb)" #: bondedit.cpp:239 msgid "p double" msgstr "p-Orbital" #: bondedit.cpp:242 msgid "bead" msgstr "Atom" #: bondedit.cpp:248 chemdata_tools.cpp:207 crings_dialog.cpp:133 dyk.cpp:40 #: fixeddialog.cpp:136 molinfodialog.cpp:40 pagesetupdialog.cpp:105 #: peptidebuilder.cpp:74 smilesdialog.cpp:37 textshapedialog.cpp:62 msgid "OK" msgstr "OK" #: charsel.cpp:44 msgid "Insert symbol" msgstr "Symbol einfügen" #: charsel.cpp:47 msgid "Font:" msgstr "Schriftart:" #: chemdata_rxn.cpp:41 msgid "Missing reactant or product" msgstr "Edukt oder Produkt fehlt" #: chemdata_rxn.cpp:42 msgid "You must select at least one reactant and one product." msgstr "Sie müssen mindestens ein Edukt und ein Produkt auswählen." #: chemdata_rxn.cpp:50 msgid "Estimated gas-phase enthalpy change:\n" msgstr "Berechnung der Reaktionsenthalpie in der Gasphase:\n" #: chemdata_rxn.cpp:59 #, qt-format msgid "Reactants = %1 kJ/mol\n" msgstr "Edukt(e) = %1 kJ/mol\n" #: chemdata_rxn.cpp:68 #, qt-format msgid "Products = %1 kJ/mol\n" msgstr "Produkt(e) = %1 kJ/mol\n" #: chemdata_rxn.cpp:70 #, qt-format msgid "Reaction = %1 kJ/mol" msgstr "Reaktion = %1 kJ/mol" #: chemdata_rxn.cpp:71 msgid "Enthalpy change" msgstr "Reaktionsenthalpie" #: chemdata_rxn.cpp:81 msgid "1H NMR compare error" msgstr "Fehler beim Vergleich der 1H-NMR-Spektren" #: chemdata_rxn.cpp:82 chemdata_rxn.cpp:138 msgid "Please select only one reactant and one product to compare." msgstr "" "Bitte wählen Sie nur ein Edukt und ein Produkt aus, um die Spektren zu " "vergleichen." #: chemdata_rxn.cpp:137 msgid "13C NMR compare error" msgstr "Fehler beim Vergleich der 13C-NMR-Spektren" #: chemdata_tools.cpp:178 msgid "Octanol-water partition" msgstr "Octanol-Wasser-Verteilungskoeffizient" #: chemdata_tools.cpp:178 #, qt-format msgid "Estimated octanol-water partition constant (log Kow) = %1" msgstr "Abgeschätzter Octanol-Wasser-Verteilungskoeffizient (log Kow) = %1" #: chemdata_tools.cpp:200 msgid "SMILES string" msgstr "SMILES-String" #: chemdata_tools.cpp:200 msgid "SMILES string for selected molecule:" msgstr "SMILES-String für das gewählte Molekül:" #: chemdata_tools.cpp:207 msgid "InChI string" msgstr "InChI-String" #: chemdata_tools.cpp:207 msgid "InChI string for selected molecule:" msgstr "InChI-String für das gewählte Molekül:" #: chemdata_tools.cpp:207 msgid "Copy to clipboard" msgstr "In Zwischenablage kopieren" #: chemdata_tools.cpp:212 msgid "Could not convert to InChI string." msgstr "Konnte nicht in InChI-String konvertiert werden." #: crings_dialog.cpp:123 msgid "Add custom ring to menu list" msgstr "Benutzerdefinierte Struktur der Auswahlliste hinzufügen" #: dyk.cpp:17 dyk.cpp:20 msgid "Did You Know?" msgstr "Wussten Sie schon ...?" #: dyk.cpp:28 msgid "Previous tip" msgstr "Nächster" #: dyk.cpp:32 msgid "Next tip" msgstr "Vorheriger" #: dyk.cpp:36 msgid "Don't show this dialog at startup" msgstr "Dialog beim Start nicht anzeigen" #: dyk.cpp:55 msgid "" "XDrawChem can be run from the command line to produce images. Type " "\"xdrawchem --help\" for details." msgstr "" "XDrawChem kann über die Kommandozeile Bilder produzieren. Geben Sie " "'xdrawchem --help' für mehr Details ein." #: dyk.cpp:56 msgid "" "When in select mode, you can edit most objects by right-clicking on them." msgstr "" "Mit dem 'Auswahl'-Werkzeug genügt häufig 'rechteMaustaste' auf ein Objekt, " "um dieses zu bearbeiten." #: dyk.cpp:57 msgid "" "When drawing bonds, you can edit the bond style by right-clicking on the " "bond." msgstr "" "Wenn Sie eine Bindung gezeichnet haben, können Sie mit 'rechteMaustaste' auf " "die Bindung den Bindungseditor aufrufen." #: dyk.cpp:58 msgid "" "When in select mode, press Shift+LeftButton and drag over part of a molecule " "to select the entire molecule." msgstr "" "Mit dem Auswahl-Werkzeug können Sie ein ganzes Molekül selektieren, indem " "Sie mit 'Shift'+'linkeMaustaste' einen Teil des Moleküls markieren." #: dyk.cpp:59 msgid "" "When in select mode, press Ctrl+LeftButton on a molecule to get molecule " "information." msgstr "" "Mit dem Auswahl-Werkzeug können Sie Informationen über ein Molekül abfragen, " "indem Sie mit 'Strg'+'linkeMaustaste' das Molekül markieren." #: dyk.cpp:60 msgid "" "Bond length, bond angle, and units are set in the Drawing Settings option " "under the Format menu." msgstr "" "Bindungslängen, Bindungswinkel und Maßeinheiten legen Sie im Menü unter " "'Format' > 'Eigenschaften' fest." #: dyk.cpp:61 msgid "" "You can attach a subscript to a bracket by selecting the text tool, then " "clicking on the bracket." msgstr "" "Sie können eine Klammer mit einem Index versehen, indem Sie das Text-" "Werkzeug auswählen und die Klammer anklicken." #: dyk.cpp:62 msgid "" "You can toggle the grid display by pressing Ctrl+G. Turning the grid on or " "off does not affect whether objects snap to the grid." msgstr "" "Um zwischen den verschiedenen Hintergrundrastern umzuschalten, drücken Sie " "einfach 'Strg'+'G'. Das Ein-/Ausschalten des Rasters hat keinen Einfluss auf " "die Lage Ihrer Moleküle." #: dyk.cpp:63 msgid "" "A number of ring and molecule templates are available from the ring tool, " "including single and fused rings, amino acids, and nucleosides." msgstr "" "Über die Schaltfläche 'Templates' stehen Ihnen viele verschiedene fertige " "Strukturen zur Verfügung - z.B. einfache und komplizierte Ringstrukturen, " "Aminosäuren, Nukleinbasen und Zucker." #: dyk.cpp:64 msgid "Remember to select a file type when opening or saving documents." msgstr "" "Vergessen Sie nicht, einen Datei-Typ anzugeben, wenn Sie eine Datei öffnen " "oder speichern wollen." #: dyk.cpp:65 msgid "" "The option \"Clean up molecule\" under the Tools menu can be used to refine " "structures such as rings and macromolecules." msgstr "" "Die Option 'Molekül bereinigen' kann dazu benutzt werden, die Struktur vor " "allem großer Moleküle zu verfeinern und zu optimieren." #: dyk.cpp:66 msgid "" "It's possible to attach rings to structures by selecting a ring and clicking " "on an atom." msgstr "" "Um ein Template (z.B Ring) an eine bestehende Struktur anzuhängen, wählen " "Sie das Template und klicken Sie dann auf das Verbindungsatom." #: dyk.cpp:67 msgid "" "XDrawChem can automatically attach amino acids from N-terminal to C-terminal " "(but the result isn't always pretty :)" msgstr "" "XDrawChem kann Aminosäuren automatisch vom N-Terminus zum C-Terminus " "anhängen. Das Resultat ist jedoch nicht immer schön :)" #: dyk.cpp:68 msgid "" "Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/" msgstr "" "Nutzen Sie die aktuellste Version? Schauen Sie auf\n" "http://xdrawchem.sourceforge.net/" #: dyk.cpp:69 msgid "" "XDrawChem can draw over 100,000 substances using its Internet database. " "Select Find on internet from the File menu to search for compounds." msgstr "" "XDrawChem kann über seine Internet-Datenbank mehr als 100,000 Substanzen " "darstellen. Wählen Sie 'Datei' > 'Im Internet finden', um nach Verbindungen " "zu suchen." #: dyk.cpp:70 msgid "" "XDrawChem can identify compounds by CAS number and occasionally by name. " "Select Molecule information from the Tools menu and click on a molecule. " "However, this only works if the compound is listed in the database." msgstr "" "XDrawChem ist in der Lage, Verbindungen nach der CAS-Nummer und teilweise " "nach dem Namen zu identifizieren. Wählen Sie 'Werkzeuge' > 'Molekül-" "Information...' und markieren Sie dann ein Molekül per Doppelklick. Dies " "funktioniert jedoch nur, wenn das Molekül in der Datenbank gelistet ist." #: fixeddialog.cpp:29 msgid "Set fixed angle and length" msgstr "Feste Bindungslängen und -winkel einrichten" #: fixeddialog.cpp:32 msgid "Units:" msgstr "Einheiten:" #: fixeddialog.cpp:35 fixeddialog.cpp:253 pagesetupdialog.cpp:69 msgid "pixels" msgstr "Pixel" #: fixeddialog.cpp:37 fixeddialog.cpp:256 pagesetupdialog.cpp:74 msgid "inches" msgstr "Inch" #: fixeddialog.cpp:38 fixeddialog.cpp:259 pagesetupdialog.cpp:79 xruler.cpp:60 #: xruler.cpp:84 msgid "cm" msgstr "cm" #: fixeddialog.cpp:44 msgid "Bond fixed length:" msgstr "Feste Bindungslänge:" #: fixeddialog.cpp:50 msgid "Bond fixed angle:" msgstr "Fester Bindungswinkel:" #: fixeddialog.cpp:66 fixeddialog.cpp:91 msgid "degrees" msgstr "Grad" #: fixeddialog.cpp:69 msgid "Arrow fixed length:" msgstr "Feste Pfeillänge" #: fixeddialog.cpp:72 msgid "Arrow fixed angle:" msgstr "Feste Pfeilwinkelung" #: fixeddialog.cpp:94 msgid "Double bond spacing:" msgstr "Breite einer Doppelbindung:" #: fixeddialog.cpp:110 msgid "Show grid" msgstr "Hintergrundraster" #: fixeddialog.cpp:111 msgid "Do not show grid" msgstr "Hintergrundraster nicht zeigen" #: fixeddialog.cpp:112 msgid "Show square grid" msgstr "quadratische Hintergrundraster zeigen" #: fixeddialog.cpp:113 msgid "Show hex grid" msgstr "hexagonale Hintergrundraster zeigen" #: fixeddialog.cpp:116 msgid "Snap to grid" msgstr "Raster als Vorlage" #: fixeddialog.cpp:122 msgid "Grid spacing" msgstr "Rasterbreite" #: fixeddialog.cpp:140 msgid "Default" msgstr "Standard" #: graphdialog.cpp:30 msgid "Print" msgstr "Drucken" #: graphdialog.cpp:34 msgid "Export Peak List" msgstr "Peak-Liste exportieren" #: graphdialog.cpp:38 molinfodialog.cpp:44 tool_13c_nmr.cpp:37 #: tool_1h_nmr.cpp:37 tool_ir.cpp:37 msgid "Help" msgstr "Hilfe" #: graphwidget.cpp:121 msgid "Red is reactant" msgstr "Edukt ist rot markiert." #: graphwidget.cpp:124 msgid "Blue is product" msgstr "Produkt ist blau markiert." #: helpwindow.cpp:70 msgid "&Close" msgstr "&Schließen" #: helpwindow.cpp:79 msgid "&Backward" msgstr "&Rückwärts" #: helpwindow.cpp:82 msgid "&Forward" msgstr "&Vorwärts" #: helpwindow.cpp:84 msgid "&Home" msgstr "&Startseite" #: helpwindow.cpp:87 msgid "&About ..." msgstr "&Über ..." #: helpwindow.cpp:90 msgid "&Go" msgstr "&Los" #: helpwindow.cpp:106 msgid "Backward" msgstr "Rückwärts" #: helpwindow.cpp:109 msgid "Forward" msgstr "Vorwärts" #: helpwindow.cpp:112 msgid "Home" msgstr "Startseite" #: main.cpp:145 msgid "untitled" msgstr "unbenannt" #: molecule_1h_nmr.cpp:50 msgid "Predicted 1H-NMR" msgstr "Vorausberechnetes 1H-NMR" #: molecule_1h_nmr.cpp:65 msgid " Intensity: " msgstr " Intensität: " #: molecule_1h_nmr.cpp:66 msgid " Multiplicity: " msgstr " Multiplizität: " #: molecule.cpp:89 msgid "Reactant" msgstr "Edukt" #: molecule.cpp:91 msgid "Product" msgstr "Produkt" #: molecule_tools_1.cpp:171 msgid "Predicted 13C-NMR" msgstr "Berechnetes 13C-NMR-Spektrum" #: molecule_tools_1.cpp:234 msgid "Predicted IR" msgstr "Berechnetes 1H-NMR-Spektrum" #: molecule_tools_1.cpp:248 msgid "~1350-1000, C-N" msgstr "~1350-1000, C-N" #: molecule_tools_1.cpp:250 msgid "~1300-1000, C-O" msgstr "~1300-1000, C-O" #: molecule_tools_1.cpp:254 msgid "~1660-1600, C=C (cis/vinyl strong; trans weak)" msgstr "~1660-1600, C=C (cis/vinyl stark; trans schwach)" #: molecule_tools_1.cpp:256 msgid "~1690-1640, C=N" msgstr "~1690-1640, C=N" #: molecule_tools_1.cpp:258 msgid "~1700 (narrow), C=O" msgstr "~1700 (schmal), C=O" #: molecule_tools_1.cpp:260 msgid "~1350-1300, S=O (~1050 if R-(S=O)-R')" msgstr "~1350-1300, S=O (~1050 bei R-(S=O)-R')" #: molecule_tools_1.cpp:264 molecule_tools_1.cpp:351 molecule_tools_1.cpp:353 msgid "~2250 (narrow), nitrile" msgstr "~2250 (schmal), Nitril" #: molecule_tools_1.cpp:317 molecule_tools_1.cpp:319 molecule_tools_1.cpp:321 #: molecule_tools_1.cpp:323 molecule_tools_1.cpp:325 molecule_tools_1.cpp:327 #: molecule_tools_1.cpp:329 msgid "~3000 (broad), C-H" msgstr "~3000 (breit), C-H" #: molecule_tools_1.cpp:331 molecule_tools_1.cpp:339 molecule_tools_1.cpp:341 msgid "two peaks: ~3400, ~3300, primary N-H" msgstr "2 Peaks: ~3400, ~3300, primär N-H" #: molecule_tools_1.cpp:333 molecule_tools_1.cpp:335 molecule_tools_1.cpp:337 msgid "~3300 (broad), secondary N-H" msgstr "~3300 (breit), sekundär N-H" #: molecule_tools_1.cpp:343 molecule_tools_1.cpp:345 molecule_tools_1.cpp:347 msgid "~2550 (broad), S-H" msgstr "~2550 (breit), S-H" #: molecule_tools_1.cpp:349 molecule_tools_1.cpp:359 molecule_tools_1.cpp:361 msgid "~3400 (broad), O-H" msgstr "~3400 (breit), O-H" #: molecule_tools_1.cpp:355 msgid "~2270 (narrow), -N=C=O" msgstr "~2270 (schmal), -N=C=O" #: molecule_tools_1.cpp:357 msgid "~2125 (narrow), -N=C=S" msgstr "~2125 (schmal), -N=C=S" #: molecule_tools_1.cpp:363 molecule_tools_1.cpp:365 msgid "~1525 (narrow), -NO2" msgstr "~1525 (schmal), -NO2" #: molecule_tools_1.cpp:367 msgid "~1600 (narrow), aromatic ring C=C" msgstr "~1600 (schmal), aromatischer Ring C=C" #: molecule_tools_1.cpp:368 msgid "~1475 (narrow), aromatic ring C=C" msgstr "~1475 (schmal), aromatischer Ring C=C" #: molecule_tools_1.cpp:580 msgid "10.5 (Guanidine)" msgstr "10.5 (Guanidin)" #: molecule_tools_1.cpp:600 msgid "9 (a-carbon between two ketones)" msgstr "9 (a-Carbonyl zwischen zwei Ketongruppen)" #: molecule_tools_1.cpp:604 msgid "11 (a-carbon between two ketones)" msgstr "11 (a-Carbonyl zwischen zwei Ketongruppen)" #: molecule_tools_1.cpp:608 msgid "11 (a-carbon between ketone and ester)" msgstr "11 (a-Carbonyl zwischen Keton- und Estergruppe)" #: molecule_tools_1.cpp:612 msgid "13 (a-carbon between two esters)" msgstr "13 (a-Carbonyl zwischen zwei Estergruppen)" #: molecule_tools_1.cpp:621 msgid "5 (Aromatic primary amine)" msgstr "5 (aromatische primäres Amin)" #: molecule_tools_1.cpp:627 msgid "9-10 (Alkene-primary amine)" msgstr "9-10 (ungesättigtes primäres Amin)" #: molecule_tools_1.cpp:630 msgid "11 (Aliphatic primary amine)" msgstr "11 (aliphatisches primäres Amin)" #: molecule_tools_1.cpp:642 msgid "-4 (pyrrole)" msgstr "-4 (Pyrrol)" #: molecule_tools_1.cpp:647 msgid "14.4 (secondary amine)" msgstr "14.4 (sekundäres Amin)" #: molecule_tools_1.cpp:652 msgid "11 (aliphatic secondary amine)" msgstr "11 (aliphatisches sekundäres Amin)" #: molecule_tools_1.cpp:664 msgid "6.8 (conjugated secondary amine)" msgstr "6.8 (konjugiertes sekundäres Amin)" #: molecule_tools_1.cpp:668 msgid "5 (aromatic secondary amine)" msgstr "5 (aromatisches sekundäres Amin)" #: molecule_tools_1.cpp:672 molecule_tools_1.cpp:676 msgid "1-3 (purine/pyrimidine)" msgstr "1-3 (Purin/Pyrimidin)" #: molecule_tools_1.cpp:687 msgid "4 (tertiary amine)" msgstr "4 (tertiäres Amin)" #: molecule_tools_1.cpp:693 msgid "10 (aliphatic tertiary amine)" msgstr "10 (aliphatisches tertiäres Amin)" #: molecule_tools_1.cpp:703 msgid "8 (Peroxy acid)" msgstr "8 (Peroxidsüure)" #: molecule_tools_1.cpp:720 msgid "-1 (sulfonic acid)" msgstr "-1 (Sulfonsäure)" #: molecule_tools_1.cpp:734 msgid "4 (Aromatic carboxylic acid)" msgstr "4 (aromatische Carbonsäure)" #: molecule_tools_1.cpp:738 msgid "4.5 (Aliphatic carboxylic acid)" msgstr "4.5 (aliphatische Carbonsäure)" #: molecule_tools_1.cpp:740 msgid "3 (Aliphatic carboxylic acid, a-halide)" msgstr "3 (aliphatische Carbonsäure, a-Halogenid)" #: molecule_tools_1.cpp:742 msgid "1.3 (Aliphatic carboxylic acid, 2 a-halide)" msgstr "1.3 (aliphatische Carbonsäure, 2 a-Halogenide)" #: molecule_tools_1.cpp:749 msgid "10 (Aromatic -OH)" msgstr "10 (-OH am aromatischen Ring)" #: molecule_tools_1.cpp:751 msgid "16 (Aliphatic -OH)" msgstr "16 (-OH an der aliphatischen Kette)" #: molecule_tools_1.cpp:761 msgid "7.8 (Aromatic -SH)" msgstr "7.8 (-SH am aromatischen Ring)" #: molecule_tools_1.cpp:763 msgid "10.6 (Aliphatic -SH)" msgstr "10.6 (-SH an der aliphatischen Kette)" #: molecule_tools_1.cpp:770 msgid "Estimated pKa's:" msgstr "Geschätze pKs:" #: molecule_tools_1.cpp:780 msgid "There seem to be no sites with pKa between -1 and 15." msgstr "" "Es gibt offenbar keine Stellen in diesem Molekül mit einem pKs zwischen -1 " "und 15." #: molecule_tools_1.cpp:783 msgid "Estimated pKa's" msgstr "Geschätze pKs" #: molecule_tools_2.cpp:482 msgid "Elemental analysis:\n" msgstr "Elementaranalyse:\n" #: molinfodialog.cpp:16 msgid "Molecule Info" msgstr "Molekül-Information" #: molinfodialog.cpp:18 molinfodialog.cpp:19 msgid "Name: " msgstr "Name: " #: molinfodialog.cpp:21 molinfodialog.cpp:22 msgid "Other names: " msgstr "Synonyme: " #: molinfodialog.cpp:25 molinfodialog.cpp:26 msgid "CAS: " msgstr "CAS: " #: molinfodialog.cpp:28 molinfodialog.cpp:29 msgid "PubChem compound: " msgstr "PubChem-Verbindung: " #: molinfodialog.cpp:31 msgid "Molecular weight = " msgstr "Molekülgewicht = " #: molinfodialog.cpp:34 molinfodialog.h:24 msgid "Formula = " msgstr "Summenformel = " #: molinfodialog.cpp:37 msgid "Analysis = " msgstr "Analyse = " #: molinfodialog.cpp:48 msgid "Search PubChem" msgstr "PubChem durchsuchen" #: myfiledialog.cpp:6 msgid "Transparent" msgstr "Transparent" #: netdialog.cpp:42 msgid "Find structure via Internet" msgstr "Struktur via Internet finden" #: netdialog.cpp:46 msgid "XDC database server:" msgstr "XDC Datenbank-Server:" #: netdialog.cpp:54 msgid "Search type:" msgstr "Suchtyp:" #: netdialog.cpp:59 msgid "CAS Number" msgstr "CAS-Nummer" #: netdialog.cpp:60 msgid "Formula" msgstr "Summenformel" #: netdialog.cpp:61 msgid "Chemical name" msgstr "Chemikalienname" #: netdialog.cpp:64 msgid "Look for:" msgstr "Suche nach:" #: netdialog.cpp:72 msgid "Exact matches only" msgstr "Exakte Suche" #: netdialog.cpp:75 msgid "Search" msgstr "Suchen" #: pagesetupdialog.cpp:19 msgid "Page setup" msgstr "Seiteneinstellungen" #: pagesetupdialog.cpp:22 msgid "Paper size:" msgstr "Papiergröße:" #: pagesetupdialog.cpp:25 msgid "Letter (8.5\" x 11\")" msgstr "Letter (8.5\" x 11\")" #: pagesetupdialog.cpp:26 msgid "Legal (8.5\" x 14\")" msgstr "Legal (8.5\" x 14\")" #: pagesetupdialog.cpp:27 msgid "A4 (210 mm x 297 mm)" msgstr "A4 (210 mm x 297 mm)" #: pagesetupdialog.cpp:28 msgid "640x480 pixels" msgstr "640x480 Pixel" #: pagesetupdialog.cpp:29 msgid "800x600 pixels" msgstr "800x600 Pixel" #: pagesetupdialog.cpp:30 msgid "1024x768 pixels" msgstr "1024x768 Pixel" #: pagesetupdialog.cpp:31 msgid "Custom paper size" msgstr "Benutzerdefiniert" #: pagesetupdialog.cpp:50 msgid "Orientation:" msgstr "Orientierung:" #: pagesetupdialog.cpp:53 msgid "Portrait" msgstr "Hochformat" #: pagesetupdialog.cpp:54 msgid "Landscape" msgstr "Querformat" #: pagesetupdialog.cpp:86 msgid "Page width:" msgstr "Seitenbreite:" #: pagesetupdialog.cpp:96 msgid "Page height:" msgstr "Seitenhöhe:" #: peptidebuilder.cpp:12 msgid "Peptide Builder" msgstr "Peptid-Baukasten" #: peptidebuilder.cpp:18 msgid "" "Enter peptide sequence -\n" "three-letter abbreviations:" msgstr "" "Eingabe der Peptid-Sequenz -\n" "Drei-Buchstaben-Code:" #: peptidebuilder.cpp:23 msgid "Shortcut: Hold 'Alt' and type one-letter codes!" msgstr "Kürzel: 'Alt' gedrückt halten und Ein-Buchstaben-Code eingeben!" #: render2d.cpp:130 render2d_event.cpp:801 render2d_event.cpp:1174 msgid "" "Select mode: left click on object to move, right click on object to edit" msgstr "" "Auswahl-Modus: 'linkeMaustaste' auf Objekt zum Bewegen, 'rechteMaustaste' " "auf Objekt zum Bearbeiten." #: render2d.cpp:141 msgid "Lasso mode: left click and hold to draw lasso" msgstr "Lasso-Modus: 'linkeMaustaste' gedrückt halten zum Markieren" #: render2d.cpp:152 msgid "Draw Line mode: left click to draw line, right click to edit" msgstr "" "Bindungs-Modus (einfach): 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' " "zum Editieren" #: render2d.cpp:163 msgid "Draw Dashed Line mode: left click to draw line, right click to edit" msgstr "" "Bindungs-Modus (gestrichelt): 'linkeMaustaste' zum Einfügen, " "'rechteMaustaste' zum Editieren" #: render2d.cpp:174 msgid "Draw Chain mode: left click and drag to draw aliphatic chain" msgstr "" "Ketten-Modus: 'linkeMaustaste' gedrückt halten, bis gewünschte Kettenlänge " "erreicht" #: render2d.cpp:185 msgid "Draw Stereo-Up Line mode: left click to draw line, right click to edit" msgstr "" "Bindungs-Modus (stereospez. nach vorn): 'linkeMaustaste' zum Einfügen, " "'rechteMaustaste' zum Editieren" #: render2d.cpp:196 msgid "" "Draw Stereo-Down Line mode: left click to draw line, right click to edit" msgstr "" "Bindungs-Modus (stereospez. nach hinten): 'linkeMaustaste' zum Einfügen, " "'rechteMaustaste' zum Editieren" #: render2d.cpp:207 msgid "Draw Wavy Line mode: left click to draw line, right click to edit" msgstr "" "Bindungs-Modus (unspezifisch): 'linkeMaustaste' zum Einfügen, " "'rechteMaustaste' zum Editieren" #: render2d.cpp:228 msgid "Draw Arrow mode: left click to draw arrow" msgstr "" "Pfeil-Modus: 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum Editieren" #: render2d.cpp:246 msgid "Draw Bracket mode: left click to draw bracket" msgstr "" "Klammer-Modus: 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum Editieren" #: render2d.cpp:258 msgid "Erase mode: left click to erase object" msgstr "Radierer-Modus: 'linkeMaustaste' zum Löschen eines Objektes" #: render2d.cpp:268 msgid "Text mode: left click to add or edit text" msgstr "Text-Modus: 'linkeMaustaste' zum Einfügen oder Bearbeiten von Text" #: render2d.cpp:281 msgid "Draw Symbol mode: left click to add symbol" msgstr "" "Symbol-Modus: 'linkeMaustaste' zum Einfügen, 'rechteMaustaste' zum Editieren" #: render2d.cpp:295 msgid "Draw graphic object: cubic bezier" msgstr "Zeichne grafisches Objekt: Kubische Bezierkurve" #: render2d.cpp:311 render2d.cpp:322 msgid "Left-click to draw Newman projection template" msgstr "'linkeMaustaste' zum Einfügen des Newman-Projektion-Templates" #: render2d.cpp:335 #, qt-format msgid "Draw Ring mode: left click to add %1" msgstr "Template-Modus: 'linkeMaustaste' zum Einfügen von %1" #: render2d.cpp:359 msgid "Click on a molecule for information" msgstr "" "Klicken Sie auf ein Molekül, um Informationen über dieses Molekül zu erhalten" #: render2d.cpp:362 render2d_event.cpp:1247 msgid "Click on a molecule to calculate its molecular weight" msgstr "Klicken Sie auf ein Molekül, um sein Molekülgewicht zu kalkulieren" #: render2d.cpp:365 render2d_event.cpp:1260 msgid "Click on a molecule to calculate its empirical formula" msgstr "Klicken Sie auf ein Molekül, um seine Summenformel zu ermitteln" #: render2d.cpp:368 msgid "Click on a molecule to calculate its elemental analysis" msgstr "Klicken Sie auf ein Molekül, um eine Elementaranalyse zu erstellen" #: render2d.cpp:371 msgid "Click on a molecule to calculate its 13C NMR" msgstr "" "Klicken Sie auf ein Molekül, um sein 13C-NMR-Spektrum berechnen zu lassen" #: render2d.cpp:374 msgid "Click on a molecule to calculate its 1H NMR" msgstr "" "Klicken Sie auf ein Molekül, um sein 1H-NMR-Spektrum berechnen zu lassen" #: render2d.cpp:377 msgid "Click on a molecule to calculate its IR" msgstr "Klicken Sie auf ein Molekül, um sein IR-Spektrum berechnen zu lassen" #: render2d.cpp:380 msgid "Click on a molecule to calculate its pKa(s)" msgstr "" "Klicken Sie auf ein Molekül, um den wahrscheinlichen pKs berechnen zu lassen" #: render2d.cpp:383 msgid "Click on a molecule for possible retrosynthesis" msgstr "" "Klicken Sie auf ein Molekül, um eine mögliche Retrosysnthese erstellen zu " "lassen" #: render2d.cpp:387 msgid "Click on a molecule to display its bond identifier" msgstr "Klicken Sie auf ein Molekül, um den Bindungs-Identifier anzuzeigen" #: render2d.cpp:390 msgid "Click on a molecule to calculate its octanol-water partition" msgstr "" "Klicken Sie auf ein Molekül, um den wahrscheinlichen Octanol-Wasser-" "Verteilungskoeffizienten berechnen zu lassen" #: render2d.cpp:393 msgid "Click on a molecule to generate 3-D coordinates" msgstr "Klicken Sie auf ein Molekül, um die 3D-Koordinaten zu erstellen" #: render2d.cpp:396 msgid "Click on a molecule to guess its name" msgstr "" "Klicken Sie auf ein Molekül, um dessen wahrscheinlichen Namen zu ermitteln" #: render2d.cpp:399 msgid "Click on a molecule to determine its SMILES string" msgstr "" "Klicken Sie auf ein Molekül, um sich dessen SMILES-String ausgeben zu lassen" #: render2d.cpp:402 msgid "Click on a molecule to clean up its structure" msgstr "Klicken Sie auf ein Molekül, um seine Struktur zu bereinigen" #: render2d.cpp:405 msgid "Click on a molecule to assign it as a reactant" msgstr "Klicken Sie auf ein Molekül, um es als Edukt zu kennzeichnen" #: render2d.cpp:408 msgid "Click on a molecule to assign it as a product" msgstr "Klicken Sie auf ein Molekül, um es als Produkt zu kennzeichnen" #: render2d.cpp:411 msgid "Click on a molecule to clear it group assignment" msgstr "Klicken Sie auf ein Molekül, um seine Gruppenzugehörigkeit zu lösen" #: render2d.cpp:414 msgid "Click on a molecule to save it as a custom ring" msgstr "" "Klicken Sie auf ein Molekül, um es als benutzerdefinierte Struktur zu " "speichern" #: render2d.cpp:417 msgid "Tool test mode" msgstr "Test-Modus" #: render2d.cpp:420 msgid "Click on a molecule" msgstr "Klicken Sie auf ein Molekül" #: render2d.cpp:437 msgid "Select mode: left click to move, right click to edit" msgstr "" "Auswahl-Modus: 'linkeMaustaste' zum Bewegen, 'rechteMaustaste' zum " "Bearbeiten." #: render2d.cpp:490 msgid "Undo!" msgstr "Änderung rückgängig gemacht!" #: render2d.cpp:492 msgid "Cannot undo, sorry!" msgstr "Änderung kann nicht rückgängig gemacht werden, sorry!" #: render2d_event.cpp:139 msgid "No information." msgstr "Keine Information" #: render2d_event.cpp:150 msgid "Object information" msgstr "Objekt-Information" #: render2d_event.cpp:251 render2d_event.cpp:299 msgid "Object" msgstr "Objekt" #: render2d_event.cpp:253 msgid "Arrow" msgstr "Pfeil" #: render2d_event.cpp:255 msgid "Bond" msgstr "Bindungen" #: render2d_event.cpp:257 msgid "Bracket" msgstr "Klammer" #: render2d_event.cpp:259 msgid "Curved Arrow" msgstr "Gekrümmter Pfeil" #: render2d_event.cpp:261 msgid "Symbol" msgstr "Symbol" #: render2d_event.cpp:263 render2d_event.cpp:301 msgid "Text" msgstr "Text" #: render2d_event.cpp:266 render2d_event.cpp:304 msgid "Edit" msgstr "Bearbeiten" #: render2d_event.cpp:268 render2d_event.cpp:281 msgid "Info" msgstr "Molekül-Information" #: render2d_event.cpp:270 msgid "Fill color..." msgstr "Füllfarbe..." #: render2d_event.cpp:271 msgid "No fill" msgstr "Keine Füllung" #: render2d_event.cpp:274 render2d_event.cpp:306 msgid "Shape..." msgstr "Modellieren..." #: render2d_event.cpp:279 msgid "Molecule" msgstr "Molekül" #: render2d_event.cpp:1162 msgid "Select mode: left click on object to move" msgstr "Auswahl-Modus: 'linkeMaustaste' auf Objekt zum Bewegen" #: render2d_event.cpp:1244 render2d_event.cpp:1257 msgid ", click to paste into drawing" msgstr ", anklicken, um es in das Dokument einzufügen" #: render2d_event.cpp:1574 msgid "Draw Line - Length = " msgstr "Bindung einfügen - Länge = " #: render2d_event.cpp:1574 msgid ", Angle = " msgstr ", Winkel = " #: render2d_event.cpp:1607 msgid "Draw aliphatic chain - Length = " msgstr "Aliphatische Kette zeichnen - Kettenlänge = " #: render2d_event.cpp:1607 msgid " bonds" msgstr " Bindungen" #: render2d_text.cpp:135 render2d_text.cpp:306 msgid "Enter subscript" msgstr "Index eingeben" #: render2d_text.cpp:136 render2d_text.cpp:307 msgid "Please type or edit the subscript for this bracket:" msgstr "Bitte geben Sie den Index für diese Klammer ein:" #: retro.cpp:34 msgid "No reactions found" msgstr "Keine Reaktionen gefunden" #: retro.cpp:99 msgid "" "The following reactions could have resulted in this product:\n" "\n" msgstr "" "Die folgenden Reaktionen könnten zu diesem Produkt führen:\n" "\n" #: retro.cpp:100 msgid "" "\n" "Target bonds will be highlighted in green.\n" "To see reactions affecting a highlighted bond, right-click on the bond and " "select Info.\n" "To clear highlights, select Undo from the Edit menu, or press Ctrl+Z." msgstr "" "\n" "Zielbindungen werden in Grün hervorgehoben.\n" "Zum Anzeigen einer Liste möglicher Reaktionen, die eine markierte Bindung " "beeinflussen bzw. ergeben können, RechteMaustaste auf diese Bindung und Info " "auswählen.\n" "Zum Löschen aller Markierungen, die Rückgängig-Funktion des Bearbeiten-Menüs " "aufrufen oder Ctrl+Z drücken." #: retro.cpp:102 retro.cpp:104 msgid "Reverse reactions list" msgstr "Liste der Reaktionen für die Retrosynthese" #: retro.cpp:105 msgid "No reactions in the database could yield the selected molecule." msgstr "" "In der Datenbank wurden keine Reaktionen gefunden, die zu dem gewählten " "Molekül führen." #: ringdialog.cpp:37 msgid "Ring tool" msgstr "Teemplate-Werkzeug" #: ringdialog.cpp:41 msgid "Choose a structure from list:" msgstr "Wählen Sie eine Struktur aus der Liste:" #: smilesdialog.cpp:30 msgid "Enter SMILES string" msgstr "SMILES-String eingeben" #: smilesdialog.cpp:31 msgid "Enter SMILES string:" msgstr "SMILES-String eingeben:" #: textshapedialog.cpp:19 msgid "Edit text shape" msgstr "Textform bearbeiten" #: textshapedialog.cpp:22 msgid "No shape" msgstr "Keine Form" #: textshapedialog.cpp:24 msgid "Rectangle" msgstr "Dreieck" #: textshapedialog.cpp:25 msgid "Circle" msgstr "Kreis" #: textshapedialog.cpp:26 msgid "Square" msgstr "Viereck" #: textshapedialog.cpp:30 msgid "Border" msgstr "Rahmen" #: textshapedialog.cpp:33 msgid "Border color" msgstr "Rahmenfarbe" #: textshapedialog.cpp:40 msgid "Fill" msgstr "Füllen" #: textshapedialog.cpp:43 msgid "Fill color" msgstr "Füllfarbe" #: textshapedialog.cpp:49 msgid "Width:" msgstr "Breite:" #: textshapedialog.cpp:52 msgid "Height:" msgstr "Höhe:" #: to3d.cpp:279 msgid "Save 3D file as..." msgstr "3D-Datei speichern unter..." #: to3d.cpp:281 msgid "MDL molfile (*.mol)" msgstr "MDL Moldatei (*.mol)" #: tool_13c_nmr.cpp:26 msgid "13C NMR spectrum" msgstr "13C-NMR-Spektrum" #: tool_13c_nmr.cpp:57 tool_13c_nmr.cpp:68 tool_13c_nmr.cpp:79 msgid ", intensity " msgstr ", Intensität " #: tool_13c_nmr.cpp:63 tool_1h_nmr.cpp:61 tool_ir.cpp:61 msgid "Peaks of reactant:\n" msgstr "Peaks des Eduktes:\n" #: tool_13c_nmr.cpp:74 tool_1h_nmr.cpp:72 tool_ir.cpp:72 msgid "Peaks of product:\n" msgstr "Peaks des Produktes:\n" #: tool_1h_nmr.cpp:26 msgid "1H NMR spectrum" msgstr "1H-NMR-Spektrum" #: tool_ir.cpp:26 msgid "IR spectrum" msgstr "IR-Spektrum" #: xruler.cpp:58 xruler.cpp:82 msgid "px" msgstr "Pixel" #: xruler.cpp:59 xruler.cpp:83 msgid "in" msgstr "Inch" #: http.h:21 msgid "Accessing network" msgstr "Verbinde mit Netzwerk" #: http.h:24 msgid "Please wait." msgstr "Bitte warten ..." #: molinfodialog.h:34 msgid "CAS:" msgstr "CAS:" #: molinfodialog.h:41 msgid "PubChem compound:" msgstr "PubChem-Verbindung:" #: molinfodialog.h:47 msgid "Name:" msgstr "Name:" #: molinfodialog.h:53 msgid "Other names:" msgstr "Synonyme:" #~ msgid "Automatically Add &hydrogens" #~ msgstr "&H-Atome automatisch hinzufügen" #~ msgid "&Insert symbol" #~ msgstr "&Symbol einfügen" #~ msgid "BUILD3D didn't work" #~ msgstr "BUILD3D ist fehlgeschlagen" #~ msgid "" #~ "BUILD3D did not produce output.\n" #~ "Is it installed correctly?\n" #~ "BUILD3D does not come with XDrawChem, obtain a copy from the Files " #~ "section at:\n" #~ "http://www.sourceforge.net/projects/xdrawchem/" #~ msgstr "" #~ "BUILD3D hat kein Ergebnis ausgegeben.\n" #~ "Ist es korrekt installiert?\n" #~ "BUILD3D wird nicht mit XDrawChem ausgeliefert. Eine Kopie erhalten Sie in " #~ "der Datei-Sektion auf:\n" #~ "http://www.sourceforge.net/projects/xdrawchem/" #~ msgid "Couldn't write file" #~ msgstr "Datei kann nicht geschrieben werden" #~ msgid "Could not write:\n" #~ msgstr "Kann nicht schreiben auf:\n" #~ msgid "Estimate partial charges" #~ msgstr "Partialladungen abschätzen" #~ msgid "Retrosynthesis" #~ msgstr "Retrosynthese" #~ msgid "No fragments returned." #~ msgstr "Keine Fragmente erhalten." #~ msgid "Could not open the retrosynthesis data file." #~ msgstr "Datei mit den Retrosynthese-Daten kann nicht geöffnet werden." #~ msgid "Unable to convert" #~ msgstr "Kann nicht konvertiert werden" #~ msgid "Unable to convert the selected molecule to 3-D." #~ msgstr "Das gewählte Molekül kann nicht nach 3D konvertiert werden." xdrawchem-v1.11.0/translation/xdrawchem-fr.po000066400000000000000000001332001371466245600212440ustar00rootroot00000000000000# Translation file in .po format. # This is a Qt message file in .po format. Each msgid starts with # a scope. This scope should *NOT* be translated - eg. "Foo::Bar" # would be translated to "Pub", not "Foo::Pub". # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-05-16 18:12+0200\n" "PO-Revision-Date: 2003-03-24 12:00+200\n" "Last-Translator: Mr. Right \n" "Language-Team: german \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: ts2msg\n" #: application.cpp:159 msgid "" "Click this button to open a file.

    You can also select the Open " "command from the File menu." msgstr "" #: application.cpp:160 msgid "" "Click this button to save the file you are editing.

    You can also " "select the Save command from the File menu.

    " msgstr "" #: application.cpp:161 msgid "" "Click this button to print the file you are editing.

    You can also " "select the Print command from the File menu." msgstr "" #: application.cpp:162 msgid "" "Click this button to cut a selection.

    You can also select the Cut " "command from the Edit menu, or press Ctrl+X." msgstr "" #: application.cpp:163 msgid "" "Click this button to copy a selection.

    You can also select the Copy " "command from the Edit menu, or press Ctrl+C." msgstr "" #: application.cpp:164 msgid "" "Click this button to paste a selection.

    You can also select the Paste " "command from the Edit menu, or press Ctrl+V." msgstr "" #: application.cpp:165 msgid "Click this button to zoom in." msgstr "" #: application.cpp:166 msgid "Click this button to zoom out." msgstr "" #: application.cpp:169 msgid "" "Select tool

    Use the Select tool to select and move items inside a box." "

    You can select multiple items and cut, copy, move and rotate them." msgstr "" #: application.cpp:170 msgid "" "Lasso tool

    Use the Lasso tool to select and move items by drawing a " "loop around them.

    You can select multiple items and cut, copy, move " "and rotate them." msgstr "" #: application.cpp:171 msgid "Erase tool

    Use the Erase tool to erase individual items." msgstr "" #: application.cpp:172 msgid "" "Line tool

    Use the Line tool to draw bonds. Draw over existing bonds " "to create double and triple bonds." msgstr "" #: application.cpp:173 msgid "" "Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw " "over existing bonds to add dashed lines (to indicate resonance, etc.)." msgstr "" #: application.cpp:174 msgid "" "Chain tool

    Use the Chain tool to draw aliphatic chains. The length " "of each segment is the current bond length." msgstr "" #: application.cpp:175 msgid "" "Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as " "shown on the button." msgstr "" #: application.cpp:176 msgid "" "Stereo Down Line tool

    Use the Line tool to draw stereo-down lines, as " "shown on the button." msgstr "" #: application.cpp:177 msgid "" "Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on " "the button." msgstr "" #: application.cpp:178 msgid "" "Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click " "to draw a straight arrow.

    Click and hold to pick from a list of " "available arrows." msgstr "" #: application.cpp:179 msgid "" "Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows." "

    Click and hold to select from a picture menu of arrows." msgstr "" #: application.cpp:180 msgid "" "Bracket tool

    Use the Bracket tool to draw brackets and parentheses." "

    Click to draw square brackets.

    Click and hold to select from " "a picture menu of brackets." msgstr "" #: application.cpp:181 msgid "" "Text tool

    Use the Text tool to add text and label atoms and points." "
    (See manual for info on formatting text)" msgstr "" #: application.cpp:182 msgid "" "Ring tool

    Use the Ring tool to insert ready-made rings and structures." "

    Click to open the ring dialog, which allows selection from a list of " "all built-in rings and structures.

    Click and hold to select from a " "picture menu of select rings.
    (See manual for more info on modifying this " "menu)" msgstr "" #: application.cpp:183 msgid "" "Symbol tool

    Use the Symbol tool to insert symbols.

    Click and " "hold to select from a picture menu of symbols.
    " msgstr "" #: application.cpp:218 msgid "File Operations" msgstr "" #: application.cpp:223 msgid "Open file" msgstr "" #: application.cpp:230 msgid "Save file" msgstr "" #: application.cpp:237 msgid "Print file" msgstr "" #: application.cpp:244 render2d_event.cpp:213 msgid "Cut" msgstr "" #: application.cpp:251 render2d_event.cpp:214 msgid "Copy" msgstr "" #: application.cpp:258 msgid "Paste" msgstr "" #: application.cpp:265 msgid "Zoom In" msgstr "" #: application.cpp:272 msgid "Zoom Out" msgstr "" #: application.cpp:286 #, fuzzy msgid "Set drawing color" msgstr "Spécifier couleur de dessin" #: application.cpp:290 #, fuzzy msgid "Set line thickness" msgstr "Spécifier épaisseur du trait" #: application.cpp:291 #, fuzzy msgid "Set Line Thickness" msgstr "Spécifier épaisseur du trait" #: application.cpp:305 msgid "Set font" msgstr "" #: application.cpp:306 msgid "Set Font" msgstr "" #: application.cpp:315 msgid "Set font size" msgstr "" #: application.cpp:316 msgid "Set Font Size" msgstr "" #: application.cpp:330 msgid "Left-justify selected text" msgstr "" #: application.cpp:338 msgid "Center selected text" msgstr "" #: application.cpp:346 msgid "Right-justify selected text" msgstr "" #: application.cpp:354 #, fuzzy msgid "Make selected text bold (Ctrl+B)" msgstr "Texte sélectionné en gras" #: application.cpp:364 #, fuzzy msgid "Italicize selected text (Ctrl+I)" msgstr "Texte sélectionné en italique" #: application.cpp:374 #, fuzzy msgid "Underline selected text (Ctrl+U)" msgstr "Souligner le texte sélectionné" #: application.cpp:384 #, fuzzy msgid "Superscript selected text (Ctrl-Plus)" msgstr "Texte sélectionné en exposant" #: application.cpp:395 msgid "Subscript selected text (Ctrl-Minus)" msgstr "" #: application.cpp:411 netchoosedialog.cpp:83 render2d_event.cpp:212 msgid "Select" msgstr "" #: application.cpp:418 msgid "Lasso" msgstr "" #: application.cpp:425 msgid "Erase" msgstr "" #: application.cpp:432 msgid "Draw line" msgstr "" #: application.cpp:440 #, fuzzy msgid "Draw dashed line" msgstr "Dessiner ligne pointilliée" #: application.cpp:448 msgid "Draw aliphatic chain" msgstr "" #: application.cpp:456 #, fuzzy msgid "Draw stereo-up line" msgstr "Dessiner ligne stereo-up" #: application.cpp:464 #, fuzzy msgid "Draw stereo-down line" msgstr "Dessiner ligne stereo-down" #: application.cpp:472 msgid "Draw wavy bond" msgstr "" #: application.cpp:480 msgid "Draw arrow" msgstr "" #: application.cpp:490 #, fuzzy msgid "Draw curved arrow" msgstr "Dessiner flèche courbe" #: application.cpp:500 msgid "Draw bracket" msgstr "" #: application.cpp:510 #, fuzzy msgid "Draw or edit text" msgstr "Dessiner ou éditer texte" #: application.cpp:518 msgid "Draw ring" msgstr "" #: application.cpp:529 msgid "Draw symbol" msgstr "" #: application.cpp:537 msgid "Canned Structures" msgstr "" #: application.cpp:545 msgid "Cyclopropane" msgstr "" #: application.cpp:553 msgid "Cyclobutane" msgstr "" #: application.cpp:561 msgid "Cyclopentane" msgstr "" #: application.cpp:569 msgid "Cyclopentadiene" msgstr "" #: application.cpp:577 msgid "Cyclohexane" msgstr "" #: application.cpp:585 msgid "Cyclohexane - chair conformation" msgstr "" #: application.cpp:593 msgid "Cyclohexane - boat conformation" msgstr "" #: application.cpp:601 msgid "Benzene" msgstr "" #: application.cpp:611 helpwindow.cpp:89 msgid "&File" msgstr "" #: application.cpp:613 msgid "&New" msgstr "" #: application.cpp:615 msgid "&Open" msgstr "" #: application.cpp:620 #, fuzzy msgid "&Find on Internet" msgstr "&Chercher via Internet" #: application.cpp:624 msgid "&Save" msgstr "" #: application.cpp:628 msgid "Save &as..." msgstr "" #: application.cpp:630 #, fuzzy msgid "Save picture..." msgstr "Exporter une image..." #: application.cpp:633 msgid "Pa&ge setup" msgstr "" #: application.cpp:634 helpwindow.cpp:68 msgid "&Print" msgstr "" #: application.cpp:638 graphdialog.cpp:42 tool_13c_nmr.cpp:41 #: tool_1h_nmr.cpp:41 tool_ir.cpp:41 msgid "Close" msgstr "" #: application.cpp:639 msgid "Quit" msgstr "" #: application.cpp:642 #, fuzzy msgid "Rotate 90 degrees clockwise" msgstr "Rotation 90° horaire" #: application.cpp:644 #, fuzzy msgid "Rotate 180 degrees" msgstr "Rotation 180°" #: application.cpp:645 #, fuzzy msgid "Rotate 90 degrees counterclockwise" msgstr "Rotation 90° antihoraire" #: application.cpp:649 #, fuzzy msgid "Flip &horizontal" msgstr "Basculer &horizontalement" #: application.cpp:650 msgid "Flip &vertical" msgstr "" #: application.cpp:653 msgid "Normal (100%)" msgstr "" #: application.cpp:655 msgid "Zoom out" msgstr "" #: application.cpp:656 msgid "Zoom in" msgstr "" #: application.cpp:670 msgid "&Edit" msgstr "" #: application.cpp:672 msgid "&Undo" msgstr "" #: application.cpp:673 msgid "Insert s&ymbol" msgstr "" #: application.cpp:677 msgid "Cu&t" msgstr "" #: application.cpp:678 msgid "&Copy" msgstr "" #: application.cpp:679 msgid "&Paste" msgstr "" #: application.cpp:680 msgid "Clear" msgstr "" #: application.cpp:682 msgid "Select &All" msgstr "" #: application.cpp:683 msgid "&Deselect All" msgstr "" #: application.cpp:685 msgid "&Rotate" msgstr "" #: application.cpp:686 msgid "&Flip" msgstr "" #: application.cpp:688 msgid "&Zoom" msgstr "" #: application.cpp:691 msgid "&Group" msgstr "" #: application.cpp:692 msgid "Select &Reactant" msgstr "" #: application.cpp:694 msgid "Select &Product" msgstr "" #: application.cpp:696 msgid "Clear &group" msgstr "" #: application.cpp:698 msgid "Clear all &groups" msgstr "" #: application.cpp:703 msgid "Forma&t" msgstr "" #: application.cpp:705 #, fuzzy msgid "&Bond - Fixed length and angle" msgstr "Longueur et &angle fixes" #: application.cpp:708 #, fuzzy msgid "&Arrow - Fixed length and angle" msgstr "Longueur et &angle fixes" #: application.cpp:715 #, fuzzy msgid "Set background &color" msgstr "Choisir la &couleur du fond" #: application.cpp:717 msgid "Toggle &grid" msgstr "" #: application.cpp:719 msgid "&Drawing settings..." msgstr "" #: application.cpp:721 msgid "&XDC settings..." msgstr "" #: application.cpp:726 msgid "Estimate gas-phase enthalphy change" msgstr "" #: application.cpp:728 msgid "Compare 1H NMR" msgstr "" #: application.cpp:730 msgid "Compare 13C NMR" msgstr "" #: application.cpp:737 msgid "Reverse reactions" msgstr "" #: application.cpp:743 msgid "Get bond identifier" msgstr "" #: application.cpp:747 msgid "T&ools" msgstr "" #: application.cpp:748 msgid "Clean up molecule" msgstr "" #: application.cpp:749 msgid "Auto &layout" msgstr "" #: application.cpp:750 msgid "Create custom ring" msgstr "" #: application.cpp:753 msgid "Molecule information..." msgstr "" #: application.cpp:755 msgid "Predict 1H NMR" msgstr "" #: application.cpp:756 #, fuzzy msgid "Predict 13C NMR" msgstr "Prédiction RMN C13" #: application.cpp:757 msgid "Predict IR" msgstr "" #: application.cpp:758 msgid "Predict pKa" msgstr "" #: application.cpp:759 msgid "Predict octanol-water partition (Kow)" msgstr "" #: application.cpp:760 msgid "Reaction" msgstr "" #: application.cpp:762 msgid "Input SMILES" msgstr "" #: application.cpp:763 msgid "Output SMILES" msgstr "" #: application.cpp:765 msgid "Build 3D model of molecule" msgstr "" #: application.cpp:771 helpwindow.cpp:92 msgid "&Help" msgstr "" #: application.cpp:773 msgid "&Manual" msgstr "" #: application.cpp:774 msgid "&Did You Know?" msgstr "" #: application.cpp:775 msgid "&About" msgstr "" #: application.cpp:776 msgid "&Support" msgstr "" #: application.cpp:777 msgid "&References" msgstr "" #: application.cpp:779 msgid "What's &This" msgstr "" #: application.cpp:860 msgid "Newman projection symbol" msgstr "" #: application.cpp:861 msgid "Newman projection - staggered (anti)" msgstr "" #: application.cpp:862 msgid "Newman projection - eclipsed" msgstr "" #: application.cpp:920 msgid "Cubic bezier" msgstr "" #: application.cpp:923 msgid "Cubic bezier - half arrow" msgstr "" #: application.cpp:926 msgid "Cubic bezier - full arrow" msgstr "" #: application.cpp:972 application_ring.cpp:347 msgid "User-defined" msgstr "" #: application.cpp:1198 application_ob.cpp:190 application_ob.cpp:201 msgid "Could not write to " msgstr "" #: application.cpp:1204 application_ob.cpp:194 application_ob.cpp:205 #: application_ob.cpp:238 msgid "Saved file " msgstr "" #: application.cpp:1256 msgid "Save as picture..." msgstr "" #: application.cpp:1291 application.cpp:1335 application.cpp:1341 msgid "Saved picture file " msgstr "" #: application.cpp:1293 application.cpp:1337 application.cpp:1343 msgid "Unable to save picture!" msgstr "" #: application.cpp:1397 msgid "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Please subscribe to the mailing list for information about future releases.\n" "Send a message to xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n" "\n" "XDrawChem is copyright (C) 2004 Bryan Herger.\n" "Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint " "project\n" "OpenBabel code copyright (C) 2003 by the OpenBabel project team.\n" "See file COPYRIGHT.txt for more details" msgstr "" #: application.cpp:1401 msgid "How to get help" msgstr "" #: application.cpp:1402 msgid "" "Current information on XDrawChem can always be found at\n" "http://xdrawchem.sourceforge.net/\n" "The latest release will be posted here, as well as links to mailing lists " "and the bug tracker.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "You can contact the author directly at\n" "bherger@users.sourceforge.net" msgstr "" #: application.cpp:1482 msgid "Database query failed" msgstr "" #: application.cpp:1482 msgid "No molecules in the database match the query." msgstr "" #: application.cpp:1718 application.cpp:1726 application.cpp:1733 #: application.cpp:1740 msgid "Zoom = %1 %" msgstr "" #: application.cpp:1744 msgid "XDC Settings" msgstr "" #: application.cpp:1745 msgid "Change XDrawChem settings:" msgstr "" #: application.cpp:1746 msgid "&Main font" msgstr "" #: application.cpp:1746 msgid "&Ruler font" msgstr "" #: application.cpp:1747 bondedit.cpp:252 charsel.cpp:68 crings_dialog.cpp:137 #: fixeddialog.cpp:144 molinfodialog.cpp:37 netchoosedialog.cpp:88 #: netdialog.cpp:80 pagesetupdialog.cpp:109 peptidebuilder.cpp:78 #: ringdialog.cpp:55 smilesdialog.cpp:41 msgid "Cancel" msgstr "" #: application_ob.cpp:35 tool_2d3d.cpp:92 msgid "--Select a filter-- (*)" msgstr "" #: application_ob.cpp:38 msgid "CDXML - ChemDraw text/XML format (*)" msgstr "" #: application_ob.cpp:41 msgid "CDX - ChemDraw binary format (*)" msgstr "" #: application_ob.cpp:44 msgid "XDC - XDrawChem native format (*)" msgstr "" #: application_ob.cpp:68 msgid "Open file..." msgstr "" #: application_ob.cpp:83 application_ob.cpp:165 tool_2d3d.cpp:113 msgid "Could not determine file type" msgstr "" #: application_ob.cpp:84 application_ob.cpp:166 tool_2d3d.cpp:114 msgid "Please select a file type from the list." msgstr "" #: application_ob.cpp:95 msgid "Couldn't open file" msgstr "" #: application_ob.cpp:95 msgid "Could not open the file: " msgstr "" #: application_ob.cpp:96 application_ob.cpp:104 msgid "Unable to load " msgstr "" #: application_ob.cpp:110 application_ob.cpp:140 msgid "Loaded document " msgstr "" #: application_ob.cpp:126 msgid "Problem while opening the file" msgstr "" #: application_ob.cpp:127 msgid "Cannot open the specified file." msgstr "" #: application_ob.cpp:153 tool_2d3d.cpp:107 msgid "Save file as..." msgstr "" #: application_ob.cpp:158 msgid "Overwrite file?" msgstr "" #: application_ob.cpp:158 msgid "Overwrite existing file: %1 ?" msgstr "" #: application_ob.cpp:224 msgid "IOIface Data error" msgstr "" #: application_ob.cpp:225 msgid "" "Cannot convert the molecule.\n" "Conversion failed in ioiface.cpp" msgstr "" #: application_ob.cpp:231 tool_2d3d.cpp:133 msgid "Problem while writing the file" msgstr "" #: application_ob.cpp:232 tool_2d3d.cpp:134 msgid "Cannot write the specified file." msgstr "" #: application_ring.cpp:120 msgid "[*] Cyclopropane" msgstr "" #: application_ring.cpp:124 msgid "[*] Cyclobutane" msgstr "" #: application_ring.cpp:128 msgid "[*] Cyclopentane" msgstr "" #: application_ring.cpp:132 msgid "Imidazole" msgstr "" #: application_ring.cpp:136 msgid "[*] Cyclopentadiene" msgstr "" #: application_ring.cpp:140 msgid "[*] Cyclohexane (flat)" msgstr "" #: application_ring.cpp:144 msgid "Cyclohexane (boat)" msgstr "" #: application_ring.cpp:148 msgid "Cyclohexane (chair)" msgstr "" #: application_ring.cpp:152 msgid "[*] Benzene" msgstr "" #: application_ring.cpp:156 msgid "Pyrimidine" msgstr "" #: application_ring.cpp:160 msgid "[*] Cycloheptane" msgstr "" #: application_ring.cpp:164 msgid "[*] Cyclooctane" msgstr "" #: application_ring.cpp:168 msgid "Indole" msgstr "" #: application_ring.cpp:172 msgid "Purine" msgstr "" #: application_ring.cpp:176 msgid "Naphthalene" msgstr "" #: application_ring.cpp:180 msgid "Biphenyl" msgstr "" #: application_ring.cpp:184 msgid "Anthracene" msgstr "" #: application_ring.cpp:188 msgid "Steroid (fused ring template)" msgstr "" #: application_ring.cpp:191 msgid "Rings" msgstr "" #: application_ring.cpp:196 msgid "Alanine" msgstr "" #: application_ring.cpp:200 msgid "Arginine" msgstr "" #: application_ring.cpp:204 msgid "Asparagine" msgstr "" #: application_ring.cpp:208 msgid "Aspartic acid" msgstr "" #: application_ring.cpp:212 msgid "Cysteine" msgstr "" #: application_ring.cpp:216 msgid "Glutamic acid" msgstr "" #: application_ring.cpp:220 msgid "Glutamine" msgstr "" #: application_ring.cpp:224 msgid "Glycine" msgstr "" #: application_ring.cpp:228 msgid "Histidine" msgstr "" #: application_ring.cpp:232 msgid "Isoleucine" msgstr "" #: application_ring.cpp:236 msgid "Leucine" msgstr "" #: application_ring.cpp:240 msgid "Lysine" msgstr "" #: application_ring.cpp:244 msgid "Methionine" msgstr "" #: application_ring.cpp:248 msgid "Nitrophenylalanine" msgstr "" #: application_ring.cpp:252 msgid "Phenylalanine" msgstr "" #: application_ring.cpp:256 msgid "Proline" msgstr "" #: application_ring.cpp:260 msgid "Serine" msgstr "" #: application_ring.cpp:264 msgid "Statine" msgstr "" #: application_ring.cpp:268 msgid "Threonine" msgstr "" #: application_ring.cpp:272 msgid "Tryptophan" msgstr "" #: application_ring.cpp:276 msgid "Tyrosine" msgstr "" #: application_ring.cpp:280 msgid "Valine" msgstr "" #: application_ring.cpp:283 msgid "Amino acids" msgstr "" #: application_ring.cpp:288 msgid "Adenine" msgstr "" #: application_ring.cpp:291 msgid "Cytosine" msgstr "" #: application_ring.cpp:294 msgid "Guanine" msgstr "" #: application_ring.cpp:297 msgid "Thymine" msgstr "" #: application_ring.cpp:300 msgid "Uracil" msgstr "" #: application_ring.cpp:302 msgid "Nucleic acids" msgstr "" #: application_ring.cpp:307 msgid "Ribose" msgstr "" #: application_ring.cpp:311 msgid "Deoxyribose" msgstr "" #: application_ring.cpp:315 msgid "D-fructose" msgstr "" #: application_ring.cpp:319 msgid "D-glucose" msgstr "" #: application_ring.cpp:322 msgid "Sugars" msgstr "" #: application_ring.cpp:326 msgid "[*] FMOC" msgstr "" #: application_ring.cpp:329 msgid "[*] BOC" msgstr "" #: application_ring.cpp:332 msgid "[*] DABCYL" msgstr "" #: application_ring.cpp:335 msgid "[*] DABSYL" msgstr "" #: application_ring.cpp:338 msgid "[*] DANSYL" msgstr "" #: application_ring.cpp:341 msgid "[*] EDANS" msgstr "" #: application_ring.cpp:344 msgid "Useful groups" msgstr "" #: application_ring.cpp:369 msgid "Add new..." msgstr "" #: bondedit.cpp:52 msgid "Color" msgstr "" #: bondedit.cpp:57 msgid "Arrow editor" msgstr "" #: bondedit.cpp:58 bondedit.cpp:165 bondedit.cpp:187 bondedit.cpp:212 msgid "Style:" msgstr "" #: bondedit.cpp:61 msgid "Plain arrow" msgstr "" #: bondedit.cpp:64 msgid "NR arrow" msgstr "" #: bondedit.cpp:67 msgid "Dashed arrow" msgstr "" #: bondedit.cpp:70 msgid "Two-way arrow" msgstr "" #: bondedit.cpp:73 msgid "Split two-way arrow" msgstr "" #: bondedit.cpp:76 msgid "Retrosynthetic arrow" msgstr "" #: bondedit.cpp:98 msgid "Bond editor" msgstr "" #: bondedit.cpp:100 msgid "Bond order:" msgstr "" #: bondedit.cpp:103 msgid "Dashed line" msgstr "" #: bondedit.cpp:106 msgid "Single" msgstr "" #: bondedit.cpp:109 msgid "Stereo-up" msgstr "" #: bondedit.cpp:112 msgid "Stereo-down" msgstr "" #: bondedit.cpp:115 msgid "Wavy" msgstr "" #: bondedit.cpp:118 msgid "Single/double (aromatic)" msgstr "" #: bondedit.cpp:121 msgid "Double" msgstr "" #: bondedit.cpp:124 msgid "Double/triple" msgstr "" #: bondedit.cpp:127 msgid "Triple" msgstr "" #: bondedit.cpp:134 msgid "Bond thickness:" msgstr "" #: bondedit.cpp:153 msgid "Double bond alignment:" msgstr "" #: bondedit.cpp:156 msgid "Auto" msgstr "" #: bondedit.cpp:157 msgid "Left" msgstr "" #: bondedit.cpp:158 msgid "Center" msgstr "" #: bondedit.cpp:159 msgid "Right" msgstr "" #: bondedit.cpp:164 msgid "Bracket editor" msgstr "" #: bondedit.cpp:168 msgid "Square bracket" msgstr "" #: bondedit.cpp:171 msgid "Parentheses" msgstr "" #: bondedit.cpp:174 msgid "Curly bracket" msgstr "" #: bondedit.cpp:177 msgid "Box" msgstr "" #: bondedit.cpp:180 msgid "Ellipse" msgstr "" #: bondedit.cpp:186 msgid "Curved Arrow editor" msgstr "" #: bondedit.cpp:190 msgid "90 degree clockwise" msgstr "" #: bondedit.cpp:193 msgid "180 degree clockwise" msgstr "" #: bondedit.cpp:196 msgid "270 degree clockwise" msgstr "" #: bondedit.cpp:199 #, fuzzy msgid "90 degree counterclockwise" msgstr "Rotation 90° antihoraire" #: bondedit.cpp:202 #, fuzzy msgid "180 degree counterclockwise" msgstr "Rotation 90° antihoraire" #: bondedit.cpp:205 #, fuzzy msgid "270 degree counterclockwise" msgstr "Rotation 90° antihoraire" #: bondedit.cpp:211 msgid "Symbol editor" msgstr "" #: bondedit.cpp:215 msgid "Positive charge" msgstr "" #: bondedit.cpp:218 msgid "Negative charge" msgstr "" #: bondedit.cpp:221 msgid "Partial positive charge" msgstr "" #: bondedit.cpp:224 msgid "Partial negative charge" msgstr "" #: bondedit.cpp:227 msgid "Single electron" msgstr "" #: bondedit.cpp:230 msgid "Electron pair" msgstr "" #: bondedit.cpp:233 msgid "Stereochemical ring hydrogen" msgstr "" #: bondedit.cpp:236 msgid "p orbital" msgstr "" #: bondedit.cpp:239 msgid "p double" msgstr "" #: bondedit.cpp:242 msgid "bead" msgstr "" #: bondedit.cpp:248 crings_dialog.cpp:133 dyk.cpp:40 fixeddialog.cpp:136 #: molinfodialog.cpp:29 pagesetupdialog.cpp:105 peptidebuilder.cpp:74 #: smilesdialog.cpp:37 msgid "OK" msgstr "" #: charsel.cpp:44 msgid "Insert symbol" msgstr "" #: charsel.cpp:47 msgid "Font:" msgstr "" #: chemdata_rxn.cpp:41 msgid "Missing reactant or product" msgstr "" #: chemdata_rxn.cpp:42 msgid "You must select at least one reactant and one product." msgstr "" #: chemdata_rxn.cpp:50 msgid "Estimated gas-phase enthalpy change:\n" msgstr "" #: chemdata_rxn.cpp:59 msgid "Reactants = %1 kJ/mol\n" msgstr "" #: chemdata_rxn.cpp:68 msgid "Products = %1 kJ/mol\n" msgstr "" #: chemdata_rxn.cpp:70 msgid "Reaction = %1 kJ/mol" msgstr "" #: chemdata_rxn.cpp:71 msgid "Enthalpy change" msgstr "" #: chemdata_rxn.cpp:81 msgid "1H NMR compare error" msgstr "" #: chemdata_rxn.cpp:82 chemdata_rxn.cpp:138 msgid "Please select only one reactant and one product to compare." msgstr "" #: chemdata_rxn.cpp:137 msgid "13C NMR compare error" msgstr "" #: chemdata_tools.cpp:171 msgid "Octanol-water partition" msgstr "" #: chemdata_tools.cpp:171 msgid "Estimated octanol-water partition constant (log Kow) = %1" msgstr "" #: chemdata_tools.cpp:193 msgid "SMILES string" msgstr "" #: chemdata_tools.cpp:193 msgid "SMILES string for selected molecule:" msgstr "" #: crings_dialog.cpp:123 msgid "Add custom ring to menu list" msgstr "" #: dyk.cpp:17 dyk.cpp:20 msgid "Did You Know?" msgstr "" #: dyk.cpp:28 msgid "Previous tip" msgstr "" #: dyk.cpp:32 msgid "Next tip" msgstr "" #: dyk.cpp:36 msgid "Don't show this dialog at startup" msgstr "" #: dyk.cpp:55 msgid "" "XDrawChem can be run from the command line to produce images. Type " "\"xdrawchem --help\" for details." msgstr "" #: dyk.cpp:56 msgid "" "When in select mode, you can edit most objects by right-clicking on them." msgstr "" #: dyk.cpp:57 msgid "" "When drawing bonds, you can edit the bond style by right-clicking on the " "bond." msgstr "" #: dyk.cpp:58 msgid "" "When in select mode, press Shift+LeftButton and drag over part of a molecule " "to select the entire molecule." msgstr "" #: dyk.cpp:59 msgid "" "When in select mode, press Ctrl+LeftButton on a molecule to get molecule " "information." msgstr "" #: dyk.cpp:60 msgid "" "Bond length, bond angle, and units are set in the Drawing Settings option " "under the Format menu." msgstr "" #: dyk.cpp:61 msgid "" "You can attach a subscript to a bracket by selecting the text tool, then " "clicking on the bracket." msgstr "" #: dyk.cpp:62 msgid "" "You can toggle the grid display by pressing Ctrl+G. Turning the grid on or " "off does not affect whether objects snap to the grid." msgstr "" #: dyk.cpp:63 msgid "" "A number of ring and molecule templates are available from the ring tool, " "including single and fused rings, amino acids, and nucleosides." msgstr "" #: dyk.cpp:64 msgid "Remember to select a file type when opening or saving documents." msgstr "" #: dyk.cpp:65 msgid "" "The option \"Clean up molecule\" under the Tools menu can be used to refine " "structures such as rings and macromolecules." msgstr "" #: dyk.cpp:66 msgid "" "It's possible to attach rings to structures by selecting a ring and clicking " "on an atom." msgstr "" #: dyk.cpp:67 msgid "" "XDrawChem can automatically attach amino acids from N-terminal to C-terminal " "(but the result isn't always pretty :)" msgstr "" #: dyk.cpp:68 msgid "" "Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/" msgstr "" #: dyk.cpp:69 msgid "" "XDrawChem can draw over 100,000 substances using its Internet database. " "Select Find on internet from the File menu to search for compounds." msgstr "" #: dyk.cpp:70 msgid "" "XDrawChem can identify compounds by CAS number and occasionally by name. " "Select Molecule information from the Tools menu and click on a molecule. " "However, this only works if the compound is listed in the database." msgstr "" #: fixeddialog.cpp:29 #, fuzzy msgid "Set fixed angle and length" msgstr "Spécifier longueur et angle fixes" #: fixeddialog.cpp:32 msgid "Units:" msgstr "" #: fixeddialog.cpp:35 fixeddialog.cpp:253 pagesetupdialog.cpp:69 msgid "pixels" msgstr "" #: fixeddialog.cpp:37 fixeddialog.cpp:256 pagesetupdialog.cpp:74 msgid "inches" msgstr "" #: fixeddialog.cpp:38 fixeddialog.cpp:259 pagesetupdialog.cpp:79 xruler.cpp:60 #: xruler.cpp:84 msgid "cm" msgstr "" #: fixeddialog.cpp:44 msgid "Bond fixed length:" msgstr "" #: fixeddialog.cpp:50 msgid "Bond fixed angle:" msgstr "" #: fixeddialog.cpp:66 fixeddialog.cpp:91 msgid "degrees" msgstr "" #: fixeddialog.cpp:69 msgid "Arrow fixed length:" msgstr "" #: fixeddialog.cpp:72 msgid "Arrow fixed angle:" msgstr "" #: fixeddialog.cpp:94 msgid "Double bond spacing:" msgstr "" #: fixeddialog.cpp:110 msgid "Show grid" msgstr "" #: fixeddialog.cpp:111 msgid "Do not show grid" msgstr "" #: fixeddialog.cpp:112 msgid "Show square grid" msgstr "" #: fixeddialog.cpp:113 msgid "Show hex grid" msgstr "" #: fixeddialog.cpp:116 msgid "Snap to grid" msgstr "" #: fixeddialog.cpp:122 msgid "Grid spacing" msgstr "" #: fixeddialog.cpp:140 msgid "Default" msgstr "" #: graphdialog.cpp:30 msgid "Print" msgstr "" #: graphdialog.cpp:34 msgid "Export Peak List" msgstr "" #: graphdialog.cpp:38 molinfodialog.cpp:33 tool_13c_nmr.cpp:37 #: tool_1h_nmr.cpp:37 tool_ir.cpp:37 msgid "Help" msgstr "" #: graphwidget.cpp:121 msgid "Red is reactant" msgstr "" #: graphwidget.cpp:124 msgid "Blue is product" msgstr "" #: helpwindow.cpp:70 msgid "&Close" msgstr "" #: helpwindow.cpp:79 msgid "&Backward" msgstr "" #: helpwindow.cpp:82 msgid "&Forward" msgstr "" #: helpwindow.cpp:84 msgid "&Home" msgstr "" #: helpwindow.cpp:87 msgid "&About ..." msgstr "" #: helpwindow.cpp:90 msgid "&Go" msgstr "" #: helpwindow.cpp:106 msgid "Backward" msgstr "" #: helpwindow.cpp:109 msgid "Forward" msgstr "" #: helpwindow.cpp:112 msgid "Home" msgstr "" #: main.cpp:145 msgid "untitled" msgstr "" #: molecule_1h_nmr.cpp:50 msgid "Predicted 1H-NMR" msgstr "" #: molecule_1h_nmr.cpp:65 msgid " Intensity: " msgstr "" #: molecule_1h_nmr.cpp:66 msgid " Multiplicity: " msgstr "" #: molecule.cpp:89 msgid "Reactant" msgstr "" #: molecule.cpp:91 msgid "Product" msgstr "" #: molecule_tools_1.cpp:171 msgid "Predicted 13C-NMR" msgstr "" #: molecule_tools_1.cpp:234 msgid "Predicted IR" msgstr "" #: molecule_tools_1.cpp:248 msgid "~1350-1000, C-N" msgstr "" #: molecule_tools_1.cpp:250 msgid "~1300-1000, C-O" msgstr "" #: molecule_tools_1.cpp:254 msgid "~1660-1600, C=C (cis/vinyl strong; trans weak)" msgstr "" #: molecule_tools_1.cpp:256 msgid "~1690-1640, C=N" msgstr "" #: molecule_tools_1.cpp:258 msgid "~1700 (narrow), C=O" msgstr "" #: molecule_tools_1.cpp:260 msgid "~1350-1300, S=O (~1050 if R-(S=O)-R')" msgstr "" #: molecule_tools_1.cpp:264 molecule_tools_1.cpp:351 molecule_tools_1.cpp:353 msgid "~2250 (narrow), nitrile" msgstr "" #: molecule_tools_1.cpp:317 molecule_tools_1.cpp:319 molecule_tools_1.cpp:321 #: molecule_tools_1.cpp:323 molecule_tools_1.cpp:325 molecule_tools_1.cpp:327 #: molecule_tools_1.cpp:329 msgid "~3000 (broad), C-H" msgstr "" #: molecule_tools_1.cpp:331 molecule_tools_1.cpp:339 molecule_tools_1.cpp:341 msgid "two peaks: ~3400, ~3300, primary N-H" msgstr "" #: molecule_tools_1.cpp:333 molecule_tools_1.cpp:335 molecule_tools_1.cpp:337 msgid "~3300 (broad), secondary N-H" msgstr "" #: molecule_tools_1.cpp:343 molecule_tools_1.cpp:345 molecule_tools_1.cpp:347 msgid "~2550 (broad), S-H" msgstr "" #: molecule_tools_1.cpp:349 molecule_tools_1.cpp:359 molecule_tools_1.cpp:361 msgid "~3400 (broad), O-H" msgstr "" #: molecule_tools_1.cpp:355 msgid "~2270 (narrow), -N=C=O" msgstr "" #: molecule_tools_1.cpp:357 msgid "~2125 (narrow), -N=C=S" msgstr "" #: molecule_tools_1.cpp:363 molecule_tools_1.cpp:365 msgid "~1525 (narrow), -NO2" msgstr "" #: molecule_tools_1.cpp:367 msgid "~1600 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:368 msgid "~1475 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:580 msgid "10.5 (Guanidine)" msgstr "" #: molecule_tools_1.cpp:600 msgid "9 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:604 msgid "11 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:608 msgid "11 (a-carbon between ketone and ester)" msgstr "" #: molecule_tools_1.cpp:612 msgid "13 (a-carbon between two esters)" msgstr "" #: molecule_tools_1.cpp:621 msgid "5 (Aromatic primary amine)" msgstr "" #: molecule_tools_1.cpp:627 msgid "9-10 (Alkene-primary amine)" msgstr "" #: molecule_tools_1.cpp:630 msgid "11 (Aliphatic primary amine)" msgstr "" #: molecule_tools_1.cpp:642 msgid "-4 (pyrrole)" msgstr "" #: molecule_tools_1.cpp:647 msgid "14.4 (secondary amine)" msgstr "" #: molecule_tools_1.cpp:652 msgid "11 (aliphatic secondary amine)" msgstr "" #: molecule_tools_1.cpp:664 msgid "6.8 (conjugated secondary amine)" msgstr "" #: molecule_tools_1.cpp:668 msgid "5 (aromatic secondary amine)" msgstr "" #: molecule_tools_1.cpp:672 molecule_tools_1.cpp:676 msgid "1-3 (purine/pyrimidine)" msgstr "" #: molecule_tools_1.cpp:687 msgid "4 (tertiary amine)" msgstr "" #: molecule_tools_1.cpp:693 msgid "10 (aliphatic tertiary amine)" msgstr "" #: molecule_tools_1.cpp:703 msgid "8 (Peroxy acid)" msgstr "" #: molecule_tools_1.cpp:720 msgid "-1 (sulfonic acid)" msgstr "" #: molecule_tools_1.cpp:734 msgid "4 (Aromatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:738 msgid "4.5 (Aliphatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:740 msgid "3 (Aliphatic carboxylic acid, a-halide)" msgstr "" #: molecule_tools_1.cpp:742 msgid "1.3 (Aliphatic carboxylic acid, 2 a-halide)" msgstr "" #: molecule_tools_1.cpp:749 msgid "10 (Aromatic -OH)" msgstr "" #: molecule_tools_1.cpp:751 msgid "16 (Aliphatic -OH)" msgstr "" #: molecule_tools_1.cpp:761 msgid "7.8 (Aromatic -SH)" msgstr "" #: molecule_tools_1.cpp:763 msgid "10.6 (Aliphatic -SH)" msgstr "" #: molecule_tools_1.cpp:770 msgid "Estimated pKa's:" msgstr "" #: molecule_tools_1.cpp:780 msgid "There seem to be no sites with pKa between -1 and 15." msgstr "" #: molecule_tools_1.cpp:783 msgid "Estimated pKa's" msgstr "" #: molecule_tools_2.cpp:462 #, fuzzy msgid "Elemental analysis:\n" msgstr "Analyse élémentaire" #: molinfodialog.cpp:12 msgid "Molecule Info" msgstr "" #: molinfodialog.cpp:14 molinfodialog.cpp:15 msgid "Name: " msgstr "" #: molinfodialog.cpp:17 molinfodialog.cpp:18 msgid "CAS: " msgstr "" #: molinfodialog.cpp:20 msgid "Molecular weight = " msgstr "" #: molinfodialog.cpp:23 molinfodialog.h:24 msgid "Formula = " msgstr "" #: molinfodialog.cpp:26 msgid "Analysis = " msgstr "" #: myfiledialog.cpp:6 msgid "Transparent" msgstr "" #: netdialog.cpp:42 #, fuzzy msgid "Find structure via Internet" msgstr "Rechercher une structure via Internet" #: netdialog.cpp:46 #, fuzzy msgid "XDC database server:" msgstr "Serveur de base XDC :" #: netdialog.cpp:54 #, fuzzy msgid "Search type:" msgstr "Type de recherche :" #: netdialog.cpp:59 #, fuzzy msgid "CAS Number" msgstr "CAS Number" #: netdialog.cpp:60 msgid "Formula" msgstr "" #: netdialog.cpp:61 #, fuzzy msgid "Chemical name" msgstr "Nom chimique" #: netdialog.cpp:64 #, fuzzy msgid "Look for:" msgstr "Rechercher :" #: netdialog.cpp:72 #, fuzzy msgid "Exact matches only" msgstr "Correspondances exactes uniquement" #: netdialog.cpp:75 msgid "Search" msgstr "" #: pagesetupdialog.cpp:19 msgid "Page setup" msgstr "" #: pagesetupdialog.cpp:22 msgid "Paper size:" msgstr "" #: pagesetupdialog.cpp:25 msgid "Letter (8.5\" x 11\")" msgstr "" #: pagesetupdialog.cpp:26 msgid "Legal (8.5\" x 14\")" msgstr "" #: pagesetupdialog.cpp:27 msgid "A4 (210 mm x 297 mm)" msgstr "" #: pagesetupdialog.cpp:28 msgid "640x480 pixels" msgstr "" #: pagesetupdialog.cpp:29 msgid "800x600 pixels" msgstr "" #: pagesetupdialog.cpp:30 msgid "1024x768 pixels" msgstr "" #: pagesetupdialog.cpp:31 msgid "Custom paper size" msgstr "" #: pagesetupdialog.cpp:50 msgid "Orientation:" msgstr "" #: pagesetupdialog.cpp:53 msgid "Portrait" msgstr "" #: pagesetupdialog.cpp:54 msgid "Landscape" msgstr "" #: pagesetupdialog.cpp:86 msgid "Page width:" msgstr "" #: pagesetupdialog.cpp:96 msgid "Page height:" msgstr "" #: peptidebuilder.cpp:12 msgid "Peptide Builder" msgstr "" #: peptidebuilder.cpp:18 msgid "" "Enter peptide sequence -\n" "three-letter abbreviations:" msgstr "" #: peptidebuilder.cpp:23 msgid "Shortcut: Hold 'Alt' and type one-letter codes!" msgstr "" #: render2d.cpp:129 render2d_event.cpp:700 render2d_event.cpp:1025 msgid "" "Select mode: left click on object to move, right click on object to edit" msgstr "" #: render2d.cpp:140 msgid "Lasso mode: left click and hold to draw lasso" msgstr "" #: render2d.cpp:151 msgid "Draw Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:162 msgid "Draw Dashed Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:173 msgid "Draw Chain mode: left click and drag to draw aliphatic chain" msgstr "" #: render2d.cpp:184 msgid "Draw Stereo-Up Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:195 msgid "" "Draw Stereo-Down Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:206 msgid "Draw Wavy Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:227 msgid "Draw Arrow mode: left click to draw arrow" msgstr "" #: render2d.cpp:245 msgid "Draw Bracket mode: left click to draw bracket" msgstr "" #: render2d.cpp:257 msgid "Erase mode: left click to erase object" msgstr "" #: render2d.cpp:267 msgid "Text mode: left click to add or edit text" msgstr "" #: render2d.cpp:280 msgid "Draw Symbol mode: left click to add symbol" msgstr "" #: render2d.cpp:294 msgid "Draw graphic object: cubic bezier" msgstr "" #: render2d.cpp:310 render2d.cpp:321 msgid "Left-click to draw Newman projection template" msgstr "" #: render2d.cpp:334 msgid "Draw Ring mode: left click to add %1" msgstr "" #: render2d.cpp:358 msgid "Click on a molecule for information" msgstr "" #: render2d.cpp:361 render2d_event.cpp:1091 #, fuzzy msgid "Click on a molecule to calculate its molecular weight" msgstr "Calcul masse moléculaire" #: render2d.cpp:364 render2d_event.cpp:1104 #, fuzzy msgid "Click on a molecule to calculate its empirical formula" msgstr "Calcul formule empirique" #: render2d.cpp:367 msgid "Click on a molecule to calculate its elemental analysis" msgstr "" #: render2d.cpp:370 msgid "Click on a molecule to calculate its 13C NMR" msgstr "" #: render2d.cpp:373 msgid "Click on a molecule to calculate its 1H NMR" msgstr "" #: render2d.cpp:376 msgid "Click on a molecule to calculate its IR" msgstr "" #: render2d.cpp:379 msgid "Click on a molecule to calculate its pKa(s)" msgstr "" #: render2d.cpp:382 msgid "Click on a molecule for possible retrosynthesis" msgstr "" #: render2d.cpp:386 msgid "Click on a molecule to display its bond identifier" msgstr "" #: render2d.cpp:389 msgid "Click on a molecule to calculate its octanol-water partition" msgstr "" #: render2d.cpp:392 msgid "Click on a molecule to generate 3-D coordinates" msgstr "" #: render2d.cpp:395 msgid "Click on a molecule to guess its name" msgstr "" #: render2d.cpp:398 msgid "Click on a molecule to determine its SMILES string" msgstr "" #: render2d.cpp:401 msgid "Click on a molecule to clean up its structure" msgstr "" #: render2d.cpp:404 msgid "Click on a molecule to assign it as a reactant" msgstr "" #: render2d.cpp:407 msgid "Click on a molecule to assign it as a product" msgstr "" #: render2d.cpp:410 msgid "Click on a molecule to clear it group assignment" msgstr "" #: render2d.cpp:413 msgid "Click on a molecule to save it as a custom ring" msgstr "" #: render2d.cpp:416 msgid "Tool test mode" msgstr "" #: render2d.cpp:419 msgid "Click on a molecule" msgstr "" #: render2d.cpp:436 msgid "Select mode: left click to move, right click to edit" msgstr "" #: render2d.cpp:489 msgid "Undo!" msgstr "" #: render2d.cpp:491 msgid "Cannot undo, sorry!" msgstr "" #: render2d_event.cpp:134 msgid "No information." msgstr "" #: render2d_event.cpp:145 msgid "Object information" msgstr "" #: render2d_event.cpp:187 msgid "Object" msgstr "" #: render2d_event.cpp:189 msgid "Arrow" msgstr "" #: render2d_event.cpp:191 msgid "Bond" msgstr "" #: render2d_event.cpp:193 msgid "Bracket" msgstr "" #: render2d_event.cpp:195 msgid "Curved Arrow" msgstr "" #: render2d_event.cpp:197 msgid "Symbol" msgstr "" #: render2d_event.cpp:199 msgid "Text" msgstr "" #: render2d_event.cpp:202 msgid "Edit" msgstr "" #: render2d_event.cpp:204 render2d_event.cpp:211 msgid "Info" msgstr "" #: render2d_event.cpp:209 msgid "Molecule" msgstr "" #: render2d_event.cpp:1013 msgid "Select mode: left click on object to move" msgstr "" #: render2d_event.cpp:1088 render2d_event.cpp:1101 msgid ", click to paste into drawing" msgstr "" #: render2d_event.cpp:1418 msgid "Draw Line - Length = " msgstr "" #: render2d_event.cpp:1418 msgid ", Angle = " msgstr "" #: render2d_event.cpp:1449 msgid "Draw aliphatic chain - Length = " msgstr "" #: render2d_event.cpp:1449 msgid " bonds" msgstr "" #: render2d_text.cpp:131 render2d_text.cpp:289 msgid "Enter subscript" msgstr "" #: render2d_text.cpp:132 render2d_text.cpp:290 msgid "Please type or edit the subscript for this bracket:" msgstr "" #: retro.cpp:34 msgid "No reactions found" msgstr "" #: retro.cpp:99 msgid "" "The following reactions could have resulted in this product:\n" "\n" msgstr "" #: retro.cpp:100 msgid "" "\n" "Target bonds will be highlighted in green.\n" "To see reactions affecting a highlighted bond, right-click on the bond and " "select Info.\n" "To clear highlights, select Undo from the Edit menu, or press Ctrl+Z." msgstr "" #: retro.cpp:102 retro.cpp:104 msgid "Reverse reactions list" msgstr "" #: retro.cpp:105 msgid "No reactions in the database could yield the selected molecule." msgstr "" #: ringdialog.cpp:37 #, fuzzy msgid "Ring tool" msgstr "Outil cycle" #: ringdialog.cpp:41 #, fuzzy msgid "Choose a structure from list:" msgstr "Choisissez une structure dans la liste :" #: smilesdialog.cpp:30 msgid "Enter SMILES string" msgstr "" #: smilesdialog.cpp:31 msgid "Enter SMILES string:" msgstr "" #: to3d.cpp:279 msgid "Save 3D file as..." msgstr "" #: to3d.cpp:281 msgid "MDL molfile (*.mol)" msgstr "" #: tool_13c_nmr.cpp:26 msgid "13C NMR spectrum" msgstr "" #: tool_13c_nmr.cpp:57 tool_13c_nmr.cpp:68 tool_13c_nmr.cpp:79 msgid ", intensity " msgstr "" #: tool_13c_nmr.cpp:63 tool_1h_nmr.cpp:61 tool_ir.cpp:61 msgid "Peaks of reactant:\n" msgstr "" #: tool_13c_nmr.cpp:74 tool_1h_nmr.cpp:72 tool_ir.cpp:72 msgid "Peaks of product:\n" msgstr "" #: tool_1h_nmr.cpp:26 msgid "1H NMR spectrum" msgstr "" #: tool_ir.cpp:26 msgid "IR spectrum" msgstr "" #: xruler.cpp:58 xruler.cpp:82 msgid "px" msgstr "" #: xruler.cpp:59 xruler.cpp:83 msgid "in" msgstr "" #: http.h:21 msgid "Accessing network" msgstr "" #: http.h:24 msgid "Please wait." msgstr "" #: molinfodialog.h:34 msgid "CAS:" msgstr "" #: molinfodialog.h:40 msgid "Name:" msgstr "" #~ msgid "@default::&Close" #~ msgstr "Fermer" #~ msgid "@default::<< &Previous" #~ msgstr "<< &Previous" #~ msgid "@default::&Next >>" #~ msgstr "& Next >>" #~ msgid "ApplicationWindow::Open file" #~ msgstr "Ouvrir fichier" #~ msgid "ApplicationWindow::Save file" #~ msgstr "Enregistrer fichier" #~ msgid "ApplicationWindow::Print file" #~ msgstr "Imprimer fichier" #~ msgid "ApplicationWindow::Cut" #~ msgstr "Couper" #~ msgid "ApplicationWindow::Copy" #~ msgstr "Copier" #~ msgid "ApplicationWindow::Paste" #~ msgstr "Coller" #~ msgid "ApplicationWindow::Set font" #~ msgstr "Spécifier police" #~ msgid "ApplicationWindow::Set Font" #~ msgstr "Spécifier police" #~ msgid "ApplicationWindow::Set font size" #~ msgstr "Spécifier taille de police" #~ msgid "ApplicationWindow::Set Font Size" #~ msgstr "Spécifier taille de police" #~ msgid "ApplicationWindow::Subscript selected text" #~ msgstr "Texte sélectionné en indice" #~ msgid "ApplicationWindow::Select" #~ msgstr "Sélectionner" #~ msgid "ApplicationWindow::Erase" #~ msgstr "Effacer" #~ msgid "ApplicationWindow::Draw line" #~ msgstr "Dessiner ligne" #~ msgid "ApplicationWindow::Draw arrow" #~ msgstr "Dessiner flèche" #~ msgid "ApplicationWindow::Draw bracket" #~ msgstr "Dessiner crochet" #~ msgid "ApplicationWindow::Draw ring" #~ msgstr "Dessiner cycle" #~ msgid "ApplicationWindow::Draw symbol" #~ msgstr "Dessiner symbole" #~ msgid "ApplicationWindow::&File" #~ msgstr "&Fichier" #~ msgid "ApplicationWindow::&New" #~ msgstr "&Nouveau" #~ msgid "ApplicationWindow::&Open" #~ msgstr "&Ouvrir" #~ msgid "ApplicationWindow::&Save" #~ msgstr "&Enregistrer" #~ msgid "ApplicationWindow::Save &as..." #~ msgstr "Enregistrer sous..." #~ msgid "ApplicationWindow::Pa&ge setup" #~ msgstr "Mise en pa&ge..." #~ msgid "ApplicationWindow::&Print" #~ msgstr "&Imprimer" #~ msgid "ApplicationWindow::Close" #~ msgstr "&Fermer" #~ msgid "ApplicationWindow::Quit" #~ msgstr "&Quitter" #~ msgid "ApplicationWindow::Flip &vertical" #~ msgstr "Basculer &verticalement" #~ msgid "ApplicationWindow::&Edit" #~ msgstr "&Editer" #~ msgid "ApplicationWindow::&Undo" #~ msgstr "&Annuler" #~ msgid "ApplicationWindow::Cu&t" #~ msgstr "Cou&per" #~ msgid "ApplicationWindow::&Copy" #~ msgstr "&Copier" #~ msgid "ApplicationWindow::&Paste" #~ msgstr "&Coller" #~ msgid "ApplicationWindow::Clear" #~ msgstr "&Effacer" #~ msgid "ApplicationWindow::Select &All" #~ msgstr "Tout &sélectionner" #~ msgid "ApplicationWindow::&Rotate" #~ msgstr "&Rotation" #~ msgid "ApplicationWindow::&Flip" #~ msgstr "&Basculer" #~ msgid "ApplicationWindow::Forma&t" #~ msgstr "Forma&t" #~ msgid "ApplicationWindow::&Set fixed length and angle" #~ msgstr "&Choisir longueur et angle fixes" #~ msgid "ApplicationWindow::T&ools" #~ msgstr "Outils" #~ msgid "ApplicationWindow::Auto &layout" #~ msgstr "Mise en place automatique" #~ msgid "ApplicationWindow::Predict IR" #~ msgstr "Prédiction Infrarouge" #~ msgid "ApplicationWindow::&Help" #~ msgstr "&Aide" #~ msgid "ApplicationWindow::&Manual" #~ msgstr "&Manuel" #~ msgid "ApplicationWindow::&About..." #~ msgstr "&A propos..." #~ msgid "ApplicationWindow::&References..." #~ msgstr "&Références" #~ msgid "FixedDialog::Fixed angle:" #~ msgstr "Angle fixe :" #~ msgid "FixedDialog::Fixed length:" #~ msgstr "Longueur fixe :" #~ msgid "FixedDialog::Cancel" #~ msgstr "Annuler" #~ msgid "HelpWindow::&Close" #~ msgstr "Fermer" #~ msgid "NetChooseDialog::Select" #~ msgstr "Sélectionner" #~ msgid "NetChooseDialog::Cancel" #~ msgstr "Annuler" #~ msgid "NetDialog::Formula" #~ msgstr "Formule" #~ msgid "NetDialog::Search" #~ msgstr "Rechercher" #~ msgid "NetDialog::Cancel" #~ msgstr "Annuler" #~ msgid "PageSetupDialog::Page setup" #~ msgstr "Mise en page" #~ msgid "PageSetupDialog::Cancel" #~ msgstr "Annuler" #~ msgid "RingDialog::Cancel" #~ msgstr "Annuler" #~ msgid "XManual::&Close" #~ msgstr "Fermer" #~ msgid "XManual::&Next >>" #~ msgstr "& Next >>" #~ msgid "XManual::<< &Previous" #~ msgstr "<< &Previous" xdrawchem-v1.11.0/translation/xdrawchem-it.po000066400000000000000000001663701371466245600212670ustar00rootroot00000000000000# # Translators, if you are not familiar with the PO format, gettext # documentation is worth reading, especially sections dedicated to # this format, e.g. by running: # info -n '(gettext)PO Files' # info -n '(gettext)Header Entry' # # Some information specific to po-debconf are available at # /usr/share/doc/po-debconf/README-trans # or http://www.debian.org/intl/l10n/po-debconf/README-trans # # Developers do not need to manually edit POT or PO files. # # xdrawchem xdrawchem-it.po. # Copyright (C) 2004, Andrea Tasso # This file is distributed under the same license as the xdrawchem package. # msgid "" msgstr "" "Project-Id-Version: xdrawchem 1.7.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-03-18 03:20+0100\n" "PO-Revision-Date: 2004-03-10 07:00+0100\n" "Last-Translator: Andrea Tasso \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: application.cpp:159 msgid "" "Click this button to open a file.

    You can also select the Open " "command from the File menu." msgstr "" "Fare click su questo pulsante per aprire un file.

    Si può anche " "selezionareil comando \"Apri\" dal menù \"File.\"" #: application.cpp:160 msgid "" "Click this button to save the file you are editing.

    You can also " "select the Save command from the File menu.

    " msgstr "" "Fare click su questo pulsante per salvare il file che si sta modificando." "

    Si può anche selezionare il comando \"Salva\" dal menù \"File." "\"

    " #: application.cpp:161 msgid "" "Click this button to print the file you are editing.

    You can also " "select the Print command from the File menu." msgstr "" "Fare click su questo pulsante per stampare il file che si sta modificando." "

    Si può anche selezionare il comando \"Stampa\" dal menù \"File.\"" #: application.cpp:162 msgid "" "Click this button to cut a selection.

    You can also select the Cut " "command from the Edit menu, or press Ctrl+X." msgstr "" "Fare click su questo pulsante per tagliare una selezione.

    Si può " "anche selezionare il comando \"Taglia\" dal menù \"Modifica\", o premere Ctrl" "+X." #: application.cpp:163 msgid "" "Click this button to copy a selection.

    You can also select the Copy " "command from the Edit menu, or press Ctrl+C." msgstr "" "Fare click su questo pulsante per copiare una selezione.

    Si può anche " "selezionare il comando \"Copia\" dal menù \"Modifica\", o premere Ctrl+C." #: application.cpp:164 msgid "" "Click this button to paste a selection.

    You can also select the Paste " "command from the Edit menu, or press Ctrl+V." msgstr "" "Fare click su questo pulsante per incollare una selezione.

    Si può " "anche selezionare il comando \"Incolla\" dal menù \"Modifica\", o premere " "Ctrl+V." #: application.cpp:165 msgid "Click this button to zoom in." msgstr "" #: application.cpp:166 msgid "Click this button to zoom out." msgstr "" #: application.cpp:169 #, fuzzy msgid "" "Select tool

    Use the Select tool to select and move items inside a box." "

    You can select multiple items and cut, copy, move and rotate them." msgstr "" "Strumento Selezione

    Usare lo strumento \"Selezione\" per selezionare " "e muovere gli oggetti.

    Si possono selezionare più oggetti e " "tagliarli, copiarli, muoverli e ruotarli." #: application.cpp:170 #, fuzzy msgid "" "Lasso tool

    Use the Lasso tool to select and move items by drawing a " "loop around them.

    You can select multiple items and cut, copy, move " "and rotate them." msgstr "" "Strumento Selezione

    Usare lo strumento \"Selezione\" per selezionare " "e muovere gli oggetti.

    Si possono selezionare più oggetti e " "tagliarli, copiarli, muoverli e ruotarli." #: application.cpp:171 msgid "Erase tool

    Use the Erase tool to erase individual items." msgstr "" "Strumento Cancella

    Usare lo strumento \"Cancella\" per cancellare i " "singoli oggetti.

    " #: application.cpp:172 msgid "" "Line tool

    Use the Line tool to draw bonds. Draw over existing bonds " "to create double and triple bonds." msgstr "" "Strumento Linea

    Usare lo strumento \"Linea\" per disegnare i legami." "Per creare i legami doppi e tripli disegnare sopra i legami esistenti." #: application.cpp:173 msgid "" "Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw " "over existing bonds to add dashed lines (to indicate resonance, etc.)." msgstr "" "Strumento Linea Tratteggiata

    Usare lo strumento \"Linea Tratteggiata" "\" per disegnare righe tratteggiate.Per aggiungere righe tratteggiate, " "disegnare sopra i legami esistenti (per indicare risonanza, ecc.)." #: application.cpp:174 msgid "" "Chain tool

    Use the Chain tool to draw aliphatic chains. The length " "of each segment is the current bond length." msgstr "" "Strumento Catena

    Usare lo strumento \"Catena\" per disegnare catene " "alifatiche.La lunghezza di ciascun segmento è la lunghezza di legame " "corrente." #: application.cpp:175 msgid "" "Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as " "shown on the button." msgstr "" "Strumento Linea Stereo Su

    Usare lo strumento \"Linea Stereo Su\" per " "disegnare linee stereo verso l'alto,come mostrato sul pulsante." #: application.cpp:176 msgid "" "Stereo Down Line tool

    Use the Line tool to draw stereo-down lines, as " "shown on the button." msgstr "" "Strumento Linea Stereo Giù

    Usare lo strumento \"Linea Stereo Giù\" " "per disegnare linee stereo verso il basso,come mostrato sul pulsante." #: application.cpp:177 msgid "" "Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on " "the button." msgstr "" "Strumento Linea Ondulata

    Usare lo strumento \"Linea Ondulata\" per " "disegnare linee ondulate, come mostrato sul pulsante." #: application.cpp:178 msgid "" "Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click " "to draw a straight arrow.

    Click and hold to pick from a list of " "available arrows." msgstr "" "Strumento Freccia

    Usare lo strumento \"Freccia\" per disegnare frecce " "dritte.

    Fare click per disegnare una freccia dritta

    Tenere " "premuto per scegliere tra la lista delle frecce disponibili." #: application.cpp:179 msgid "" "Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows." "

    Click and hold to select from a picture menu of arrows." msgstr "" "Strumento Freccia Curva

    Usare lo strumento \"Freccia Curva\" per " "inserire frecce curve.

    Tenere premuto per selezionare da un menù " "grafico di frecce." #: application.cpp:180 msgid "" "Bracket tool

    Use the Bracket tool to draw brackets and parentheses." "

    Click to draw square brackets.

    Click and hold to select from " "a picture menu of brackets." msgstr "" "Strumento Parentesi

    Usare lo strumento \"Parentesi\" per disegnare " "parentesi tonde e quadre.

    Fare click per disegnare parentesi quadre." "

    Tenere premuto per selezionare da un menù grafico di parentesi." #: application.cpp:181 msgid "" "Text tool

    Use the Text tool to add text and label atoms and points." "
    (See manual for info on formatting text)" msgstr "" "Strumento Testo

    Usare lo strumento \"Testo\" per aggiungere testo e " "atomi marcati e punti.
    (Vedere il manuale per informazioni sulla " "formattazione del testo)" #: application.cpp:182 msgid "" "Ring tool

    Use the Ring tool to insert ready-made rings and structures." "

    Click to open the ring dialog, which allows selection from a list of " "all built-in rings and structures.

    Click and hold to select from a " "picture menu of select rings.
    (See manual for more info on modifying this " "menu)" msgstr "" "Strumento Anello

    Usare lo strumento \"Anello\" per inserire anelli e " "strutture già pronti.

    Fare click per aprire la finestra di dialogo " "anelli, che permette la selezione da una lista di tutte gli anelli e le " "strutture predefinite.

    Tenere premuto per selezionare da un menù " "grafico di anelli selezionati.
    (Vedere il manuale per maggiori " "informazioni su come modificare questo menu)" #: application.cpp:183 msgid "" "Symbol tool

    Use the Symbol tool to insert symbols.

    Click and " "hold to select from a picture menu of symbols.
    " msgstr "" "Strumento Simbolo

    Usare lo strumento \"Simbolo\" per inserire simboli." "

    Tenere premuto per selezionare da un menù grafico di simboli.
    " #: application.cpp:218 msgid "File Operations" msgstr "Operazioni sui file" #: application.cpp:223 msgid "Open file" msgstr "Apri file" #: application.cpp:230 msgid "Save file" msgstr "Salva file" #: application.cpp:237 msgid "Print file" msgstr "Stampa file" #: application.cpp:244 render2d_event.cpp:213 msgid "Cut" msgstr "Taglia" #: application.cpp:251 render2d_event.cpp:214 msgid "Copy" msgstr "Copia" #: application.cpp:258 msgid "Paste" msgstr "Incolla" #: application.cpp:265 msgid "Zoom In" msgstr "" #: application.cpp:272 msgid "Zoom Out" msgstr "" #: application.cpp:286 msgid "Set drawing color" msgstr "Imposta il colore del disegno" #: application.cpp:290 msgid "Set line thickness" msgstr "Imposta lo spessore della linea" #: application.cpp:291 msgid "Set Line Thickness" msgstr "Imposta lo Spessore della Linea" #: application.cpp:305 msgid "Set font" msgstr "Imposta il tipo di carattere" #: application.cpp:306 msgid "Set Font" msgstr "Imposta il Tipo di Carattere" #: application.cpp:315 msgid "Set font size" msgstr "Imposta la dimensione del tipo di carattere" #: application.cpp:316 msgid "Set Font Size" msgstr "Imposta la Dimensione del Tipo di Carattere" #: application.cpp:330 msgid "Left-justify selected text" msgstr "Allinea a sinistra il testo selezionato" #: application.cpp:338 msgid "Center selected text" msgstr "Centra il testo selezionato" #: application.cpp:346 msgid "Right-justify selected text" msgstr "Allinea a destra il testo selezionato" #: application.cpp:354 msgid "Make selected text bold (Ctrl+B)" msgstr "Rende il testo selezionato maiuscolo (Ctrl+B)" #: application.cpp:364 msgid "Italicize selected text (Ctrl+I)" msgstr "Rende il testo selezionato Corsivo (Ctrl+I)" #: application.cpp:374 msgid "Underline selected text (Ctrl+U)" msgstr "Sottolinea il testo selezionato (Ctrl+U" #: application.cpp:384 msgid "Superscript selected text (Ctrl-Plus)" msgstr "Rende il testo selezionato come apice (Ctrl +)" #: application.cpp:395 msgid "Subscript selected text (Ctrl-Minus)" msgstr "Rende il testo selezionato come pedice (Ctrl -)" #: application.cpp:411 netchoosedialog.cpp:83 render2d_event.cpp:212 msgid "Select" msgstr "Seleziona" #: application.cpp:418 msgid "Lasso" msgstr "" #: application.cpp:425 msgid "Erase" msgstr "Cancella" #: application.cpp:432 msgid "Draw line" msgstr "Disegna linea" #: application.cpp:440 msgid "Draw dashed line" msgstr "Disegna linea tratteggiata" #: application.cpp:448 msgid "Draw aliphatic chain" msgstr "Disegna catena alifatica" #: application.cpp:456 msgid "Draw stereo-up line" msgstr "Disegna linea stereo-su" #: application.cpp:464 msgid "Draw stereo-down line" msgstr "Disegna linea stereo-giù" #: application.cpp:472 msgid "Draw wavy bond" msgstr "Disegna legame ondulato" #: application.cpp:480 msgid "Draw arrow" msgstr "Disegna freccia" #: application.cpp:490 msgid "Draw curved arrow" msgstr "Disegna freccia curva" #: application.cpp:500 msgid "Draw bracket" msgstr "Disegna parentesi" #: application.cpp:510 msgid "Draw or edit text" msgstr "Scrivi o modifica testo" #: application.cpp:518 msgid "Draw ring" msgstr "Disegna anello" #: application.cpp:529 msgid "Draw symbol" msgstr "Disegna simbolo" #: application.cpp:537 msgid "Canned Structures" msgstr "Strutture Predefinite" #: application.cpp:545 msgid "Cyclopropane" msgstr "Ciclopropano" #: application.cpp:553 msgid "Cyclobutane" msgstr "Ciclobutano" #: application.cpp:561 msgid "Cyclopentane" msgstr "Ciclopentano" #: application.cpp:569 msgid "Cyclopentadiene" msgstr "Ciclopentadiene" #: application.cpp:577 msgid "Cyclohexane" msgstr "Cicloesano" #: application.cpp:585 msgid "Cyclohexane - chair conformation" msgstr "Cicloesano - conformazione a sedia" #: application.cpp:593 msgid "Cyclohexane - boat conformation" msgstr "Cicloesano - conformazione a barca" #: application.cpp:601 msgid "Benzene" msgstr "Benzene" #: application.cpp:611 helpwindow.cpp:89 msgid "&File" msgstr "&File" #: application.cpp:613 msgid "&New" msgstr "&Nuovo" #: application.cpp:615 msgid "&Open" msgstr "&Apri" #: application.cpp:620 msgid "&Find on Internet" msgstr "Tr&ova su Internet" #: application.cpp:624 msgid "&Save" msgstr "&Salva" #: application.cpp:628 msgid "Save &as..." msgstr "Sa&lva come..." #: application.cpp:630 msgid "Save picture..." msgstr "Salva immagine..." #: application.cpp:633 msgid "Pa&ge setup" msgstr "&Imposta Pagina" #: application.cpp:634 helpwindow.cpp:68 msgid "&Print" msgstr "Stam&pa" #: application.cpp:638 graphdialog.cpp:42 tool_13c_nmr.cpp:41 #: tool_1h_nmr.cpp:41 tool_ir.cpp:41 msgid "Close" msgstr "Chiudi" #: application.cpp:639 msgid "Quit" msgstr "Esci" #: application.cpp:642 msgid "Rotate 90 degrees clockwise" msgstr "Ruota di 90 gradi in senso orario" #: application.cpp:644 msgid "Rotate 180 degrees" msgstr "Ruota di 180 gradi" #: application.cpp:645 msgid "Rotate 90 degrees counterclockwise" msgstr "Ruota di 90 gradi in senso antiorario" #: application.cpp:649 msgid "Flip &horizontal" msgstr "Inverti &orizzontalmente" #: application.cpp:650 msgid "Flip &vertical" msgstr "Inverti &verticalmente" #: application.cpp:653 msgid "Normal (100%)" msgstr "" #: application.cpp:655 msgid "Zoom out" msgstr "" #: application.cpp:656 msgid "Zoom in" msgstr "" #: application.cpp:670 msgid "&Edit" msgstr "&Modifica" #: application.cpp:672 msgid "&Undo" msgstr "&Annulla" #: application.cpp:673 #, fuzzy msgid "&Insert symbol" msgstr "Disegna simbolo" #: application.cpp:677 msgid "Cu&t" msgstr "&Taglia" #: application.cpp:678 msgid "&Copy" msgstr "&Copia" #: application.cpp:679 msgid "&Paste" msgstr "&Incolla" #: application.cpp:680 msgid "Clear" msgstr "Cancella" #: application.cpp:682 msgid "Select &All" msgstr "&Seleziona Tutto" #: application.cpp:683 #, fuzzy msgid "&Deselect All" msgstr "&Seleziona Tutto" #: application.cpp:685 msgid "&Rotate" msgstr "&Ruota" #: application.cpp:686 msgid "&Flip" msgstr "&Inverti" #: application.cpp:688 #, fuzzy msgid "&Zoom" msgstr "&Inizio" #: application.cpp:691 msgid "&Group" msgstr "&Gruppo" #: application.cpp:692 msgid "Select &Reactant" msgstr "Seleziona il &Reagente" #: application.cpp:694 msgid "Select &Product" msgstr "Seleziona il &Prodotto" #: application.cpp:696 msgid "Clear &group" msgstr "Cancella il &gruppo" #: application.cpp:698 msgid "Clear all &groups" msgstr "Cancella tutti i &gruppi" #: application.cpp:703 msgid "Forma&t" msgstr "Forma&tta" #: application.cpp:705 msgid "&Bond - Fixed length and angle" msgstr "&Legame - Angolo e lunghezza fissi" #: application.cpp:708 msgid "&Arrow - Fixed length and angle" msgstr "&Freccia - Angolo e lunghezza fissi" #: application.cpp:711 msgid "Automatically Add &hydrogens" msgstr "Aggiunge automaticamente &idrogeni" #: application.cpp:715 msgid "Set background &color" msgstr "Imposta il &colore dello sfondo" #: application.cpp:717 msgid "Toggle &grid" msgstr "Attiva la &griglia" #: application.cpp:719 msgid "&Drawing settings..." msgstr "Impostazioni del &Disegno..." #: application.cpp:721 #, fuzzy msgid "&XDC settings..." msgstr "Impostazioni del &Disegno..." #: application.cpp:726 msgid "Estimate gas-phase enthalphy change" msgstr "Stima la variazione di entalpia in fase gas" #: application.cpp:728 msgid "Compare 1H NMR" msgstr "Confronta gli spettri NMR H1" #: application.cpp:730 msgid "Compare 13C NMR" msgstr "Confronta gli spettri NMR C13" #: application.cpp:737 #, fuzzy msgid "Reverse reactions" msgstr "Reazione" #: application.cpp:743 msgid "Get bond identifier" msgstr "" #: application.cpp:747 msgid "T&ools" msgstr "S&trumenti" #: application.cpp:748 msgid "Clean up molecule" msgstr "Riduci a scheletro la struttura della molecola" #: application.cpp:749 msgid "Auto &layout" msgstr "Disposizione &automatica" #: application.cpp:750 msgid "Create custom ring" msgstr "Crea anello personalizzato" #: application.cpp:753 msgid "Molecule information..." msgstr "Informazioni sulla molecola..." #: application.cpp:755 #, fuzzy msgid "Predict 1H NMR" msgstr "Prevede lo spettro NMR C13" #: application.cpp:756 msgid "Predict 13C NMR" msgstr "Prevede lo spettro NMR C13" #: application.cpp:757 msgid "Predict IR" msgstr "Prevede lo spettro IR" #: application.cpp:758 msgid "Predict pKa" msgstr "Prevede il pKa" #: application.cpp:759 msgid "Predict octanol-water partition (Kow)" msgstr "Prevede il coefficiente di ripartizione ottanolo-acqua (Kow)" #: application.cpp:760 msgid "Reaction" msgstr "Reazione" #: application.cpp:762 msgid "Input SMILES" msgstr "Inserisce SMILES" #: application.cpp:763 msgid "Output SMILES" msgstr "Calcola SMILES" #: application.cpp:765 msgid "Build 3D model of molecule" msgstr "" #: application.cpp:771 helpwindow.cpp:92 msgid "&Help" msgstr "&Aiuto" #: application.cpp:773 msgid "&Manual" msgstr "&Manuale" #: application.cpp:774 msgid "&Did You Know?" msgstr "&Sapevate che?" #: application.cpp:775 msgid "&About" msgstr "&Informazioni su" #: application.cpp:776 msgid "&Support" msgstr "&Supporto" #: application.cpp:777 msgid "&References" msgstr "&Riferimenti" #: application.cpp:779 msgid "What's &This" msgstr "Cos'è &Questo" #: application.cpp:857 msgid "Newman projection symbol" msgstr "Simbolo proiezione di Newman" #: application.cpp:858 msgid "Newman projection - staggered (anti)" msgstr "Proiezione di Newman - sfalsata (anti)" #: application.cpp:859 msgid "Newman projection - eclipsed" msgstr "Proiezione di Newman - eclissata" #: application.cpp:914 msgid "Cubic bezier" msgstr "Bezier cubica" #: application.cpp:917 msgid "Cubic bezier - half arrow" msgstr "Bezier cubica - mezza freccia" #: application.cpp:920 msgid "Cubic bezier - full arrow" msgstr "Bezier cubica - freccia intera" #: application.cpp:966 application_ring.cpp:347 msgid "User-defined" msgstr "Personalizzati" #: application.cpp:1152 application_ob.cpp:95 msgid "Couldn't open file" msgstr "Impossibile aprire il file" #: application.cpp:1152 application_ob.cpp:95 msgid "Could not open the file: " msgstr "Impossibile aprire il file: " #: application.cpp:1153 application.cpp:1161 application_ob.cpp:96 #: application_ob.cpp:104 msgid "Unable to load " msgstr "Impossibile caricare " #: application.cpp:1167 application_ob.cpp:110 application_ob.cpp:137 msgid "Loaded document " msgstr "Documento caricato " #: application.cpp:1191 application_ob.cpp:187 application_ob.cpp:198 msgid "Could not write to " msgstr "Impossibile scrivere in " #: application.cpp:1197 application_ob.cpp:191 application_ob.cpp:202 #: application_ob.cpp:235 msgid "Saved file " msgstr "File salvato " #: application.cpp:1249 msgid "Save as picture..." msgstr "Salva come immagine..." #: application.cpp:1284 application.cpp:1296 application.cpp:1302 msgid "Saved picture file " msgstr "File immagine salvato " #: application.cpp:1286 application.cpp:1298 application.cpp:1304 msgid "Unable to save picture!" msgstr "Impossibile salvare l'immagine!" #: application.cpp:1358 #, fuzzy msgid "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Please subscribe to the mailing list for information about future releases.\n" "Send a message to xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n" "\n" "XDrawChem is copyright (C) 2004 Bryan Herger.\n" "Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint " "project\n" "OpenBabel code copyright (C) 2003 by the OpenBabel project team.\n" "See file COPYRIGHT.txt for more details" msgstr "" "\n" "Bryan Herger\n" "herger@chemistry.gatech.edu\n" "\n" "Per informazioni sulle successive release iscriversi alla mailing list\n" "Inviare un messaggio a xdrawchem-announce-request@lists.sourceforge.net con\n" "'subscribe' nel soggetto\n" "Il copyright (C) 2002 su XDrawChem è di Bryan Herger.\n" "Copyright parziale (C) 1997-2000 di Christoph Steinbeck e del progetto\n" "JChemPaint \n" "Il copyright (C) 2003 sul codice di OpenBabel è del team di progetto " "OpenBabel\n" "Per maggiori dettagli vedi il file COPYRIGHT.txt" #: application.cpp:1362 msgid "How to get help" msgstr "Dove trovare aiuto" #: application.cpp:1363 #, fuzzy msgid "" "Current information on XDrawChem can always be found at\n" "http://xdrawchem.sourceforge.net/\n" "The latest release will be posted here, as well as links to mailing lists " "and the bug tracker.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "You can contact the author directly at\n" "bherger@users.sourceforge.net" msgstr "" "Informazioni aggiornate su XDrawChem possono sempre trovarsi a\n" "http://www.prism.gatech.edu/~gte067k/xdrawchem/\n" "L'ultima release sarà annunciata lì.\n" "\n" "Ci sono due mailng lists: xdrawchem-announce, dove saranno annunciate le\n" "nuove release,\n" "e xdrawchem-user, per la discussione tra gli utenti di xdrawchem.\n" "Per iscriversi, mandare una e-mail vuota con soggetto \"subscribe\" a \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" o\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "L'autore puo' essere contattato direttamente a\n" "herger@chemistry.gatech.edu" #: application.cpp:1443 msgid "Database query failed" msgstr "Interrogazione del database fallita" #: application.cpp:1443 msgid "No molecules in the database match the query." msgstr "Nessuna molecola del database soddisfa l'interrogazione." #: application.cpp:1679 application.cpp:1687 application.cpp:1694 #: application.cpp:1701 #, qt-format msgid "Zoom = %1 %" msgstr "" #: application.cpp:1705 msgid "XDC Settings" msgstr "" #: application.cpp:1706 msgid "Change XDrawChem settings:" msgstr "" #: application.cpp:1707 msgid "&Main font" msgstr "" #: application.cpp:1707 #, fuzzy msgid "&Ruler font" msgstr "Imposta il tipo di carattere" #: application.cpp:1708 bondedit.cpp:252 charsel.cpp:68 crings_dialog.cpp:137 #: fixeddialog.cpp:144 molinfodialog.cpp:37 netchoosedialog.cpp:88 #: netdialog.cpp:80 pagesetupdialog.cpp:109 peptidebuilder.cpp:78 #: ringdialog.cpp:55 smilesdialog.cpp:41 msgid "Cancel" msgstr "Annulla" #: application_ob.cpp:35 tool_2d3d.cpp:92 msgid "--Select a filter-- (*)" msgstr "--Selezionare un filtro-- (*)" #: application_ob.cpp:38 msgid "CDXML - ChemDraw text/XML format (*)" msgstr "CDXML - formato testo/XML ChemDraw(*)" #: application_ob.cpp:41 msgid "CDX - ChemDraw binary format (*)" msgstr "CDX - formato binario ChemDraw (*)" #: application_ob.cpp:44 msgid "XDC - XDrawChem native format (*)" msgstr "XDC - formato nativo XDrawChem (*)" #: application_ob.cpp:68 msgid "Open file..." msgstr "Apri file..." #: application_ob.cpp:83 application_ob.cpp:162 tool_2d3d.cpp:113 msgid "Could not determine file type" msgstr "Impossibile determinare il tipo di file" #: application_ob.cpp:84 application_ob.cpp:163 tool_2d3d.cpp:114 msgid "Please select a file type from the list." msgstr "Selezionare un tipo di file dalla lista." #: application_ob.cpp:126 msgid "Problem while opening the file" msgstr "Problema nell'apertura del file" #: application_ob.cpp:127 msgid "Cannot open the specified file." msgstr "Impossibile aprire il file specificato." #: application_ob.cpp:150 tool_2d3d.cpp:107 msgid "Save file as..." msgstr "Salva file come..." #: application_ob.cpp:155 #, fuzzy msgid "Overwrite file?" msgstr "Stampa file" #: application_ob.cpp:155 #, qt-format msgid "Overwrite existing file: %1 ?" msgstr "" #: application_ob.cpp:221 msgid "IOIface Data error" msgstr "Errore dati di IOIface" #: application_ob.cpp:222 msgid "" "Cannot convert the molecule.\n" "Conversion failed in ioiface.cpp" msgstr "" "Impossibile convertire la molecola\n" "Conversione fallita in ioiface.cpp" #: application_ob.cpp:228 tool_2d3d.cpp:133 msgid "Problem while writing the file" msgstr "Probema nella scrittura del file" #: application_ob.cpp:229 tool_2d3d.cpp:134 msgid "Cannot write the specified file." msgstr "Impossibile scrivere il file specificato." #: application_ring.cpp:120 msgid "[*] Cyclopropane" msgstr "[*] Ciclopropano" #: application_ring.cpp:124 msgid "[*] Cyclobutane" msgstr "[*] Ciclobutano" #: application_ring.cpp:128 msgid "[*] Cyclopentane" msgstr "[*] Ciclopentano" #: application_ring.cpp:132 msgid "Imidazole" msgstr "Imidazolo" #: application_ring.cpp:136 msgid "[*] Cyclopentadiene" msgstr "[*] Ciclopentadiene" #: application_ring.cpp:140 msgid "[*] Cyclohexane (flat)" msgstr "[*] Cicloesano (piatto)" #: application_ring.cpp:144 msgid "Cyclohexane (boat)" msgstr "Cicloesano (barca)" #: application_ring.cpp:148 msgid "Cyclohexane (chair)" msgstr "Cicloesano (sedia)" #: application_ring.cpp:152 msgid "[*] Benzene" msgstr "[*] Benzene" #: application_ring.cpp:156 msgid "Pyrimidine" msgstr "Pirimidina" #: application_ring.cpp:160 msgid "[*] Cycloheptane" msgstr "[*] Cicloeptano" #: application_ring.cpp:164 msgid "[*] Cyclooctane" msgstr "[*] Cicloottano" #: application_ring.cpp:168 msgid "Indole" msgstr "Indolo" #: application_ring.cpp:172 msgid "Purine" msgstr "Purina" #: application_ring.cpp:176 msgid "Naphthalene" msgstr "Naftalene" #: application_ring.cpp:180 msgid "Biphenyl" msgstr "Bifenile" #: application_ring.cpp:184 msgid "Anthracene" msgstr "Antracene" #: application_ring.cpp:188 msgid "Steroid (fused ring template)" msgstr "Steroide (modello ad anelli condensati)" #: application_ring.cpp:191 msgid "Rings" msgstr "Anelli" #: application_ring.cpp:196 msgid "Alanine" msgstr "Alanina" #: application_ring.cpp:200 msgid "Arginine" msgstr "Arginina" #: application_ring.cpp:204 msgid "Asparagine" msgstr "Asparagina" #: application_ring.cpp:208 msgid "Aspartic acid" msgstr "Acido Aspartico" #: application_ring.cpp:212 msgid "Cysteine" msgstr "Cisteina" #: application_ring.cpp:216 msgid "Glutamic acid" msgstr "Acido glutamico" #: application_ring.cpp:220 msgid "Glutamine" msgstr "Glutamina" #: application_ring.cpp:224 msgid "Glycine" msgstr "Glicina" #: application_ring.cpp:228 msgid "Histidine" msgstr "Istidina" #: application_ring.cpp:232 msgid "Isoleucine" msgstr "Isoleucina" #: application_ring.cpp:236 msgid "Leucine" msgstr "Leucina" #: application_ring.cpp:240 msgid "Lysine" msgstr "Lisina" #: application_ring.cpp:244 msgid "Methionine" msgstr "Metionina" #: application_ring.cpp:248 msgid "Nitrophenylalanine" msgstr "Nitrofenilalanina" #: application_ring.cpp:252 msgid "Phenylalanine" msgstr "Fenilalanina" #: application_ring.cpp:256 msgid "Proline" msgstr "Prolina" #: application_ring.cpp:260 msgid "Serine" msgstr "Serina" #: application_ring.cpp:264 msgid "Statine" msgstr "Statina" #: application_ring.cpp:268 msgid "Threonine" msgstr "Treonina" #: application_ring.cpp:272 msgid "Tryptophan" msgstr "Triptofano" #: application_ring.cpp:276 msgid "Tyrosine" msgstr "Tirosina" #: application_ring.cpp:280 msgid "Valine" msgstr "Valina" #: application_ring.cpp:283 msgid "Amino acids" msgstr "Amminoacidi" #: application_ring.cpp:288 msgid "Adenine" msgstr "Adenina" #: application_ring.cpp:291 msgid "Cytosine" msgstr "Citosina" #: application_ring.cpp:294 msgid "Guanine" msgstr "Guanina" #: application_ring.cpp:297 msgid "Thymine" msgstr "Timina" #: application_ring.cpp:300 msgid "Uracil" msgstr "Uracile" #: application_ring.cpp:302 msgid "Nucleic acids" msgstr "Acidi nucleici" #: application_ring.cpp:307 msgid "Ribose" msgstr "Ribosio" #: application_ring.cpp:311 msgid "Deoxyribose" msgstr "Desossiribosio" #: application_ring.cpp:315 msgid "D-fructose" msgstr "D-fruttosio" #: application_ring.cpp:319 msgid "D-glucose" msgstr "D-glucosio" #: application_ring.cpp:322 msgid "Sugars" msgstr "Zuccheri" #: application_ring.cpp:326 msgid "[*] FMOC" msgstr "" #: application_ring.cpp:329 msgid "[*] BOC" msgstr "" #: application_ring.cpp:332 msgid "[*] DABCYL" msgstr "" #: application_ring.cpp:335 msgid "[*] DABSYL" msgstr "" #: application_ring.cpp:338 msgid "[*] DANSYL" msgstr "" #: application_ring.cpp:341 msgid "[*] EDANS" msgstr "" #: application_ring.cpp:344 msgid "Useful groups" msgstr "Gruppi utili" #: application_ring.cpp:369 msgid "Add new..." msgstr "" #: bondedit.cpp:52 msgid "Color" msgstr "Colore" #: bondedit.cpp:57 msgid "Arrow editor" msgstr "Editor delle frecce" #: bondedit.cpp:58 bondedit.cpp:165 bondedit.cpp:187 bondedit.cpp:212 msgid "Style:" msgstr "Stile:" #: bondedit.cpp:61 msgid "Plain arrow" msgstr "Freccia normale" #: bondedit.cpp:64 msgid "NR arrow" msgstr "Freccia di non reazione" #: bondedit.cpp:67 msgid "Dashed arrow" msgstr "Freccia tratteggiata" #: bondedit.cpp:70 msgid "Two-way arrow" msgstr "Freccia bidirezionale" #: bondedit.cpp:73 msgid "Split two-way arrow" msgstr "Freccia doppia bidirezionale" #: bondedit.cpp:76 msgid "Retrosynthetic arrow" msgstr "Freccia retrosintetica" #: bondedit.cpp:98 msgid "Bond editor" msgstr "Editor dei legami" #: bondedit.cpp:100 msgid "Bond order:" msgstr "Ordine di legame:" #: bondedit.cpp:103 msgid "Dashed line" msgstr "Linea tratteggiata" #: bondedit.cpp:106 msgid "Single" msgstr "Singolo" #: bondedit.cpp:109 msgid "Stereo-up" msgstr "Stereo-su" #: bondedit.cpp:112 msgid "Stereo-down" msgstr "Stereo-giù" #: bondedit.cpp:115 msgid "Wavy" msgstr "Ondulato" #: bondedit.cpp:118 msgid "Single/double (aromatic)" msgstr "Singolo/doppio (aromatico)" #: bondedit.cpp:121 msgid "Double" msgstr "Doppio" #: bondedit.cpp:124 msgid "Double/triple" msgstr "Doppio/triplo" #: bondedit.cpp:127 msgid "Triple" msgstr "Triplo" #: bondedit.cpp:134 #, fuzzy msgid "Bond thickness:" msgstr "Imposta lo spessore della linea" #: bondedit.cpp:153 #, fuzzy msgid "Double bond alignment:" msgstr "Spaziatura del doppio legame" #: bondedit.cpp:156 #, fuzzy msgid "Auto" msgstr "&Informazioni su" #: bondedit.cpp:157 msgid "Left" msgstr "" #: bondedit.cpp:158 msgid "Center" msgstr "" #: bondedit.cpp:159 #, fuzzy msgid "Right" msgstr "Anelli" #: bondedit.cpp:164 msgid "Bracket editor" msgstr "Editor delle parentesi" #: bondedit.cpp:168 msgid "Square bracket" msgstr "Parentesi quadre" #: bondedit.cpp:171 msgid "Parentheses" msgstr "Parentesi tonde" #: bondedit.cpp:174 msgid "Curly bracket" msgstr "Parentesi quadre" #: bondedit.cpp:177 msgid "Box" msgstr "Riquadro" #: bondedit.cpp:180 msgid "Ellipse" msgstr "Ellisse" #: bondedit.cpp:186 msgid "Curved Arrow editor" msgstr "Editor delle frecce curve" #: bondedit.cpp:190 msgid "90 degree clockwise" msgstr "90 gradi in senso orario" #: bondedit.cpp:193 msgid "180 degree clockwise" msgstr "180 gradi in senso orario" #: bondedit.cpp:196 msgid "270 degree clockwise" msgstr "270 gradi in senso orario" #: bondedit.cpp:199 msgid "90 degree counterclockwise" msgstr "90 gradi in senso antiorario" #: bondedit.cpp:202 msgid "180 degree counterclockwise" msgstr "180 gradi in senso antiorario" #: bondedit.cpp:205 msgid "270 degree counterclockwise" msgstr "180 gradi in senso antiorario" #: bondedit.cpp:211 msgid "Symbol editor" msgstr "Editor dei simboli" #: bondedit.cpp:215 msgid "Positive charge" msgstr "Carica positiva" #: bondedit.cpp:218 msgid "Negative charge" msgstr "Carica negativa" #: bondedit.cpp:221 msgid "Partial positive charge" msgstr "Carica positiva parziale" #: bondedit.cpp:224 msgid "Partial negative charge" msgstr "Carica negativa parziale" #: bondedit.cpp:227 msgid "Single electron" msgstr "Elettrone spaiato" #: bondedit.cpp:230 msgid "Electron pair" msgstr "Doppietto elettronico" #: bondedit.cpp:233 msgid "Stereochemical ring hydrogen" msgstr "Anello stereochimico dell'idrogeno" #: bondedit.cpp:236 msgid "p orbital" msgstr "orbitale p" #: bondedit.cpp:239 msgid "p double" msgstr "orbitale p doppio" #: bondedit.cpp:242 msgid "bead" msgstr "sferetta" #: bondedit.cpp:248 crings_dialog.cpp:133 dyk.cpp:40 fixeddialog.cpp:136 #: molinfodialog.cpp:29 pagesetupdialog.cpp:105 peptidebuilder.cpp:74 #: smilesdialog.cpp:37 msgid "OK" msgstr "OK" #: charsel.cpp:44 #, fuzzy msgid "Insert symbol" msgstr "Disegna simbolo" #: charsel.cpp:47 #, fuzzy msgid "Font:" msgstr "Imposta il Tipo di Carattere" #: chemdata_rxn.cpp:41 msgid "Missing reactant or product" msgstr "Reagente o prodotto mancante" #: chemdata_rxn.cpp:42 msgid "You must select at least one reactant and one product." msgstr "È necessario selezionare almeno un reagente ed un prodotto." #: chemdata_rxn.cpp:50 msgid "Estimated gas-phase enthalpy change:\n" msgstr "Stima della variazione di entalpia in fase gas:\n" #: chemdata_rxn.cpp:59 #, qt-format msgid "Reactants = %1 kJ/mol\n" msgstr "Reagenti = %1 kJ/mol\n" #: chemdata_rxn.cpp:68 #, qt-format msgid "Products = %1 kJ/mol\n" msgstr "Prodotti = %1 kJ/mol\n" #: chemdata_rxn.cpp:70 #, qt-format msgid "Reaction = %1 kJ/mol" msgstr "Reazione = %1 kJ/mol" #: chemdata_rxn.cpp:71 msgid "Enthalpy change" msgstr "Variazione di entalpia" #: chemdata_rxn.cpp:81 msgid "1H NMR compare error" msgstr "Errore nel confronto NMR 1H" #: chemdata_rxn.cpp:82 chemdata_rxn.cpp:138 msgid "Please select only one reactant and one product to compare." msgstr "Selezionare solamente un reagente ed un prodotto da confrontare" #: chemdata_rxn.cpp:137 msgid "13C NMR compare error" msgstr "Errore nel confronto NMR C13" #: chemdata_tools.cpp:171 msgid "Octanol-water partition" msgstr "Ripartizione ottanolo-acqua" #: chemdata_tools.cpp:171 #, qt-format msgid "Estimated octanol-water partition constant (log Kow) = %1" msgstr "Costante di ripartizione ottanolo-acqua stimata (log Kow) = %1" #: chemdata_tools.cpp:193 msgid "SMILES string" msgstr "Stringa SMILES" #: chemdata_tools.cpp:193 msgid "SMILES string for selected molecule:" msgstr "Stringa SMILES per la molecola selezionata:" #: crings_dialog.cpp:123 msgid "Add custom ring to menu list" msgstr "Aggiunge anelli personalizzati alla lista del menu" #: dyk.cpp:17 dyk.cpp:20 msgid "Did You Know?" msgstr "Sapevate che?" #: dyk.cpp:28 msgid "Previous tip" msgstr "Suggerimento precedente" #: dyk.cpp:32 msgid "Next tip" msgstr "Suggerimento successivo" #: dyk.cpp:36 msgid "Don't show this dialog at startup" msgstr "Non mostrare questo dialogo all'avvio" #: dyk.cpp:55 msgid "" "XDrawChem can be run from the command line to produce images. Type " "\"xdrawchem --help\" for details." msgstr "" "XDrawChem può essere lanciato dalla riga di comando per produrre immagini. " "Digitare \"xdrawchem --help\" per dettagli." #: dyk.cpp:56 msgid "" "When in select mode, you can edit most objects by right-clicking on them." msgstr "" "In modalità selezione, è possibile modificare la maggior parte degli oggetti " "facendo click su di essi con il pulsante destro del mouse." #: dyk.cpp:57 msgid "" "When drawing bonds, you can edit the bond style by right-clicking on the " "bond." msgstr "" "Durante il disegno dei legami, è possibile modificare lo stile del legame " "facendo click su di esso con il pulsante destro del mouse." #: dyk.cpp:58 msgid "" "When in select mode, press Shift+LeftButton and drag over part of a molecule " "to select the entire molecule." msgstr "" "In modalità selezione, premere Shift+FrecciaSin trascinando il mouse sopra " "una parte della molecola per selezionare l'intera molecola." #: dyk.cpp:59 msgid "" "When in select mode, press Ctrl+LeftButton on a molecule to get molecule " "information." msgstr "" "In modalità selezione, premere Ctrl+FrecciaSin su una molecola, per ottenere " "informazioni sulla molecola." #: dyk.cpp:60 msgid "" "Bond length, bond angle, and units are set in the Drawing Settings option " "under the Format menu." msgstr "" "Lunghezza di legame, angolo di legame, ed unità sono impostate nell'opzione " "Impostazioni del Disegno nel menù Formato." #: dyk.cpp:61 msgid "" "You can attach a subscript to a bracket by selecting the text tool, then " "clicking on the bracket." msgstr "" "È possibile incollare un pedice ad una parentesi selezionando lo strumento " "\"Testo\", e facendo successivamente click sulla parentesi." #: dyk.cpp:62 msgid "" "You can toggle the grid display by pressing Ctrl+G. Turning the grid on or " "off does not affect whether objects snap to the grid." msgstr "" "È possibile alternare la visualizzazione della griglia premendo Ctrl+G.Il " "fatto che la visualizzazione sia attivata o meno, non influenza l'ancoraggio " "degli oggetti alla griglia." #: dyk.cpp:63 msgid "" "A number of ring and molecule templates are available from the ring tool, " "including single and fused rings, amino acids, and nucleosides." msgstr "" "Vari modelli di anelli e molecole sono disponibili tramite lo strumento " "\"Anello\", che comprende anelli signoli e condensati, amminoacidi, e " "nucleosidi." #: dyk.cpp:64 msgid "Remember to select a file type when opening or saving documents." msgstr "" "Ricordarsi di selezionare il tipo di file quando i documenti vengono aperti " "o salvati " #: dyk.cpp:65 msgid "" "The option \"Clean up molecule\" under the Tools menu can be used to refine " "structures such as rings and macromolecules." msgstr "" "L'opzione \"Riduci a scehletro la molecola\" nel menù Strumenti, puo' essere " "usata per perfezionare le strutture come anelli e macromolecole." #: dyk.cpp:66 msgid "" "It's possible to attach rings to structures by selecting a ring and clicking " "on an atom." msgstr "" "È possibile attaccare gli anelli alle strutture selezionando un anello e " "facendo click su un atomo." #: dyk.cpp:67 msgid "" "XDrawChem can automatically attach amino acids from N-terminal to C-terminal " "(but the result isn't always pretty :)" msgstr "" "XDrawChem può legare automaticamente gli amminoacidi tramite il ponte " "ammidico (il risultato non è sempre piacevole :)" #: dyk.cpp:68 msgid "" "Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/" msgstr "" #: dyk.cpp:69 msgid "" "XDrawChem can draw over 100,000 substances using its Internet database. " "Select Find on internet from the File menu to search for compounds." msgstr "" #: dyk.cpp:70 msgid "" "XDrawChem can identify compounds by CAS number and occasionally by name. " "Select Molecule information from the Tools menu and click on a molecule. " "However, this only works if the compound is listed in the database." msgstr "" #: fixeddialog.cpp:29 msgid "Set fixed angle and length" msgstr "Imposta angolo e lunghezza fissi" #: fixeddialog.cpp:32 msgid "Units:" msgstr "Unità:" #: fixeddialog.cpp:35 fixeddialog.cpp:253 pagesetupdialog.cpp:69 msgid "pixels" msgstr "pixel" #: fixeddialog.cpp:37 fixeddialog.cpp:256 pagesetupdialog.cpp:74 msgid "inches" msgstr "pollici" #: fixeddialog.cpp:38 fixeddialog.cpp:259 pagesetupdialog.cpp:79 xruler.cpp:60 #: xruler.cpp:84 msgid "cm" msgstr "cm" #: fixeddialog.cpp:44 msgid "Bond fixed length:" msgstr "Lunghezza di legame impostato:" #: fixeddialog.cpp:50 msgid "Bond fixed angle:" msgstr "Angolo di legame impostato:" #: fixeddialog.cpp:66 fixeddialog.cpp:91 msgid "degrees" msgstr "gradi" #: fixeddialog.cpp:69 msgid "Arrow fixed length:" msgstr "Lunghezza della freccia impostata:" #: fixeddialog.cpp:72 msgid "Arrow fixed angle:" msgstr "Angolo della freccia impostato:" #: fixeddialog.cpp:94 msgid "Double bond spacing:" msgstr "Spaziatura del doppio legame" #: fixeddialog.cpp:110 msgid "Show grid" msgstr "Mostra la griglia" #: fixeddialog.cpp:111 #, fuzzy msgid "Do not show grid" msgstr "Mostra la griglia" #: fixeddialog.cpp:112 #, fuzzy msgid "Show square grid" msgstr "Mostra la griglia" #: fixeddialog.cpp:113 #, fuzzy msgid "Show hex grid" msgstr "Mostra la griglia" #: fixeddialog.cpp:116 msgid "Snap to grid" msgstr "Ancora alla griglia" #: fixeddialog.cpp:122 msgid "Grid spacing" msgstr "Spaziatura della griglia" #: fixeddialog.cpp:140 msgid "Default" msgstr "Predefiniti" #: graphdialog.cpp:30 msgid "Print" msgstr "Stampa" #: graphdialog.cpp:34 msgid "Export Peak List" msgstr "Esporta l'elenco dei picchi" #: graphdialog.cpp:38 molinfodialog.cpp:33 tool_13c_nmr.cpp:37 #: tool_1h_nmr.cpp:37 tool_ir.cpp:37 msgid "Help" msgstr "Aiuto" #: graphwidget.cpp:121 #, fuzzy msgid "Red is reactant" msgstr "Reagente" #: graphwidget.cpp:124 #, fuzzy msgid "Blue is product" msgstr "Picchi del prodotto:\n" #: helpwindow.cpp:70 msgid "&Close" msgstr "&Chiudi" #: helpwindow.cpp:79 msgid "&Backward" msgstr "&Indietro" #: helpwindow.cpp:82 msgid "&Forward" msgstr "&Avanti" #: helpwindow.cpp:84 msgid "&Home" msgstr "&Inizio" #: helpwindow.cpp:87 msgid "&About ..." msgstr "&Informazioni" #: helpwindow.cpp:90 msgid "&Go" msgstr "&Procede" #: helpwindow.cpp:106 msgid "Backward" msgstr "Indietro" #: helpwindow.cpp:109 msgid "Forward" msgstr "Avanti" #: helpwindow.cpp:112 msgid "Home" msgstr "Inizio" #: main.cpp:145 msgid "untitled" msgstr "senza titolo" #: molecule_1h_nmr.cpp:50 #, fuzzy msgid "Predicted 1H-NMR" msgstr "Prevede lo spettro NMR C13" #: molecule_1h_nmr.cpp:65 #, fuzzy msgid " Intensity: " msgstr ", intensità" #: molecule_1h_nmr.cpp:66 msgid " Multiplicity: " msgstr "" #: molecule.cpp:89 msgid "Reactant" msgstr "Reagente" #: molecule.cpp:91 msgid "Product" msgstr "Prodotto" #: molecule_tools_1.cpp:171 #, fuzzy msgid "Predicted 13C-NMR" msgstr "Prevede lo spettro NMR C13" #: molecule_tools_1.cpp:234 #, fuzzy msgid "Predicted IR" msgstr "Prevede lo spettro IR" #: molecule_tools_1.cpp:248 msgid "~1350-1000, C-N" msgstr "" #: molecule_tools_1.cpp:250 msgid "~1300-1000, C-O" msgstr "" #: molecule_tools_1.cpp:254 msgid "~1660-1600, C=C (cis/vinyl strong; trans weak)" msgstr "" #: molecule_tools_1.cpp:256 msgid "~1690-1640, C=N" msgstr "" #: molecule_tools_1.cpp:258 msgid "~1700 (narrow), C=O" msgstr "" #: molecule_tools_1.cpp:260 msgid "~1350-1300, S=O (~1050 if R-(S=O)-R')" msgstr "" #: molecule_tools_1.cpp:264 molecule_tools_1.cpp:351 molecule_tools_1.cpp:353 msgid "~2250 (narrow), nitrile" msgstr "" #: molecule_tools_1.cpp:317 molecule_tools_1.cpp:319 molecule_tools_1.cpp:321 #: molecule_tools_1.cpp:323 molecule_tools_1.cpp:325 molecule_tools_1.cpp:327 #: molecule_tools_1.cpp:329 msgid "~3000 (broad), C-H" msgstr "" #: molecule_tools_1.cpp:331 molecule_tools_1.cpp:339 molecule_tools_1.cpp:341 msgid "two peaks: ~3400, ~3300, primary N-H" msgstr "" #: molecule_tools_1.cpp:333 molecule_tools_1.cpp:335 molecule_tools_1.cpp:337 msgid "~3300 (broad), secondary N-H" msgstr "" #: molecule_tools_1.cpp:343 molecule_tools_1.cpp:345 molecule_tools_1.cpp:347 msgid "~2550 (broad), S-H" msgstr "" #: molecule_tools_1.cpp:349 molecule_tools_1.cpp:359 molecule_tools_1.cpp:361 msgid "~3400 (broad), O-H" msgstr "" #: molecule_tools_1.cpp:355 msgid "~2270 (narrow), -N=C=O" msgstr "" #: molecule_tools_1.cpp:357 msgid "~2125 (narrow), -N=C=S" msgstr "" #: molecule_tools_1.cpp:363 molecule_tools_1.cpp:365 msgid "~1525 (narrow), -NO2" msgstr "" #: molecule_tools_1.cpp:367 msgid "~1600 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:368 msgid "~1475 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:580 #, fuzzy msgid "10.5 (Guanidine)" msgstr "Guanina" #: molecule_tools_1.cpp:600 msgid "9 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:604 msgid "11 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:608 msgid "11 (a-carbon between ketone and ester)" msgstr "" #: molecule_tools_1.cpp:612 msgid "13 (a-carbon between two esters)" msgstr "" #: molecule_tools_1.cpp:621 msgid "5 (Aromatic primary amine)" msgstr "" #: molecule_tools_1.cpp:627 msgid "9-10 (Alkene-primary amine)" msgstr "" #: molecule_tools_1.cpp:630 msgid "11 (Aliphatic primary amine)" msgstr "" #: molecule_tools_1.cpp:642 msgid "-4 (pyrrole)" msgstr "" #: molecule_tools_1.cpp:647 msgid "14.4 (secondary amine)" msgstr "" #: molecule_tools_1.cpp:652 #, fuzzy msgid "11 (aliphatic secondary amine)" msgstr "Disegna catena alifatica" #: molecule_tools_1.cpp:664 msgid "6.8 (conjugated secondary amine)" msgstr "" #: molecule_tools_1.cpp:668 msgid "5 (aromatic secondary amine)" msgstr "" #: molecule_tools_1.cpp:672 molecule_tools_1.cpp:676 msgid "1-3 (purine/pyrimidine)" msgstr "" #: molecule_tools_1.cpp:687 msgid "4 (tertiary amine)" msgstr "" #: molecule_tools_1.cpp:693 msgid "10 (aliphatic tertiary amine)" msgstr "" #: molecule_tools_1.cpp:703 msgid "8 (Peroxy acid)" msgstr "" #: molecule_tools_1.cpp:720 msgid "-1 (sulfonic acid)" msgstr "" #: molecule_tools_1.cpp:734 msgid "4 (Aromatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:738 msgid "4.5 (Aliphatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:740 msgid "3 (Aliphatic carboxylic acid, a-halide)" msgstr "" #: molecule_tools_1.cpp:742 msgid "1.3 (Aliphatic carboxylic acid, 2 a-halide)" msgstr "" #: molecule_tools_1.cpp:749 msgid "10 (Aromatic -OH)" msgstr "" #: molecule_tools_1.cpp:751 msgid "16 (Aliphatic -OH)" msgstr "" #: molecule_tools_1.cpp:761 msgid "7.8 (Aromatic -SH)" msgstr "" #: molecule_tools_1.cpp:763 msgid "10.6 (Aliphatic -SH)" msgstr "" #: molecule_tools_1.cpp:770 msgid "Estimated pKa's:" msgstr "Stima del pKa:" #: molecule_tools_1.cpp:780 msgid "There seem to be no sites with pKa between -1 and 15." msgstr "Sembra che non ci siano siti con pKa compreso tra -1 e 15" #: molecule_tools_1.cpp:783 msgid "Estimated pKa's" msgstr "pKa stimato" #: molecule_tools_2.cpp:462 #, fuzzy msgid "Elemental analysis:\n" msgstr "Analisi elementare" #: molinfodialog.cpp:12 msgid "Molecule Info" msgstr "Informazioni sulla molecola" #: molinfodialog.cpp:14 molinfodialog.cpp:15 msgid "Name: " msgstr "" #: molinfodialog.cpp:17 molinfodialog.cpp:18 msgid "CAS: " msgstr "" #: molinfodialog.cpp:20 msgid "Molecular weight = " msgstr "Peso molecolare = " #: molinfodialog.cpp:23 molinfodialog.h:24 msgid "Formula = " msgstr "Formula = " #: molinfodialog.cpp:26 msgid "Analysis = " msgstr "Analisi = " #: myfiledialog.cpp:6 msgid "Transparent" msgstr "Trasparente" #: netdialog.cpp:42 msgid "Find structure via Internet" msgstr "Trova la struttura via Internet" #: netdialog.cpp:46 msgid "XDC database server:" msgstr "server del database XDC" #: netdialog.cpp:54 msgid "Search type:" msgstr "Tipo di ricerca:" #: netdialog.cpp:59 msgid "CAS Number" msgstr "Numero di CAS" #: netdialog.cpp:60 msgid "Formula" msgstr "Formula" #: netdialog.cpp:61 msgid "Chemical name" msgstr "Nome chimico" #: netdialog.cpp:64 msgid "Look for:" msgstr "Cerca:" #: netdialog.cpp:72 msgid "Exact matches only" msgstr "Solo corrispondenze esatte" #: netdialog.cpp:75 msgid "Search" msgstr "Cerca" #: pagesetupdialog.cpp:19 msgid "Page setup" msgstr "Impostazione pagina" #: pagesetupdialog.cpp:22 msgid "Paper size:" msgstr "Dimensioni della carta" #: pagesetupdialog.cpp:25 msgid "Letter (8.5\" x 11\")" msgstr "Lettera (8.5\" x 11\")" #: pagesetupdialog.cpp:26 msgid "Legal (8.5\" x 14\")" msgstr "Legale (8.5\" x 14\")" #: pagesetupdialog.cpp:27 msgid "A4 (210 mm x 297 mm)" msgstr "A4 (210 mm x 297 mm)" #: pagesetupdialog.cpp:28 msgid "640x480 pixels" msgstr "640x480 pixel" #: pagesetupdialog.cpp:29 msgid "800x600 pixels" msgstr "800x600 pixel" #: pagesetupdialog.cpp:30 msgid "1024x768 pixels" msgstr "1024x768 pixel" #: pagesetupdialog.cpp:31 msgid "Custom paper size" msgstr "Dimensioni della carta personalizzate" #: pagesetupdialog.cpp:50 msgid "Orientation:" msgstr "Orientazione" #: pagesetupdialog.cpp:53 msgid "Portrait" msgstr "Verticale" #: pagesetupdialog.cpp:54 msgid "Landscape" msgstr "Orizzontale" #: pagesetupdialog.cpp:86 msgid "Page width:" msgstr "Larghezza della carta:" #: pagesetupdialog.cpp:96 msgid "Page height:" msgstr "Altezza della carta:" #: peptidebuilder.cpp:12 msgid "Peptide Builder" msgstr "Costruttore di peptidi" #: peptidebuilder.cpp:18 msgid "" "Enter peptide sequence -\n" "three-letter abbreviations:" msgstr "" "Inserire la sequenza del peptide -\n" "abbreviazione di tre lettere:" #: peptidebuilder.cpp:23 msgid "Shortcut: Hold 'Alt' and type one-letter codes!" msgstr "" "Scorciatoia: Tenere premuto 'Alt' e digitare i codici a lettera singola!" #: render2d.cpp:125 render2d_event.cpp:696 render2d_event.cpp:1018 msgid "" "Select mode: left click on object to move, right click on object to edit" msgstr "" "Modalità selezione: fare click con il tasto sinistro del mouse su un oggetto " "per muoverlo, con quello sinistro per modificarlo" #: render2d.cpp:136 #, fuzzy msgid "Lasso mode: left click and hold to draw lasso" msgstr "" "Modalità disegna freccia, fare click con il tasto sinistro del mouse per " "disegnare la freccia" #: render2d.cpp:147 msgid "Draw Line mode: left click to draw line, right click to edit" msgstr "" "Modalità disegna linea: fare click con il tasto sinistro del mouse per " "disegnare la linea, con quello destro per modificarla" #: render2d.cpp:158 msgid "Draw Dashed Line mode: left click to draw line, right click to edit" msgstr "" "Modalità disegna linea tratteggiata: fare click con il tasto sinistro del " "mouse per disegnare la linea, con quello destro per modificarla" #: render2d.cpp:169 msgid "Draw Chain mode: left click and drag to draw aliphatic chain" msgstr "" "Modalità disegna catena: fare click con il tasto sinistro del mouse e " "trascinarlo per disegnare la catena alifatica." #: render2d.cpp:180 msgid "Draw Stereo-Up Line mode: left click to draw line, right click to edit" msgstr "" "Modalità disegna linea stereo-su: fare click con il tasto sinistro del mouse " "per disegnare la linea, con quello destro per modificarla" #: render2d.cpp:191 msgid "" "Draw Stereo-Down Line mode: left click to draw line, right click to edit" msgstr "" "Modalità disegna linea stereo-giù: fare click con il tasto sinistro del " "mouse per disegnare la linea, con quello destro per modificarla" #: render2d.cpp:202 msgid "Draw Wavy Line mode: left click to draw line, right click to edit" msgstr "" "Modalità disegna linea ondulata: fare click con il tasto sinistro del mouse " "per disegnare la linea, con quello destro per modificarla" #: render2d.cpp:222 msgid "Draw Arrow mode: left click to draw arrow" msgstr "" "Modalità disegna freccia, fare click con il tasto sinistro del mouse per " "disegnare la freccia" #: render2d.cpp:240 msgid "Draw Bracket mode: left click to draw bracket" msgstr "" "Modalità disegna parentesi: fare click con il tasto sinistro del mouse per " "disegnare la parentesi" #: render2d.cpp:252 msgid "Erase mode: left click to erase object" msgstr "" "Modalità cancella: fare click con il tasto sinistro del mouse per cancellare " "l'oggetto" #: render2d.cpp:262 msgid "Text mode: left click to add or edit text" msgstr "" "Modalità testo: fare click con il tasto sinistro del mouse per aggiungere o " "modificare testo" #: render2d.cpp:275 msgid "Draw Symbol mode: left click to add symbol" msgstr "" "Modalità disegna simbolo: fare click con il tasto sinistro del mouse per " "aggiungere un simbolo" #: render2d.cpp:289 msgid "Draw graphic object: cubic bezier" msgstr "Disegna oggetto grafico: bezier cubica" #: render2d.cpp:305 render2d.cpp:316 msgid "Left-click to draw Newman projection template" msgstr "" "Fare click con il tasto sinistro del mouse per disegnare un modello della " "proiezione di Newman" #: render2d.cpp:329 #, qt-format msgid "Draw Ring mode: left click to add %1" msgstr "" "Modalità disegna anello: fare click con il tasto sinistro del mouse per " "aggiungere %1" #: render2d.cpp:353 msgid "Click on a molecule for information" msgstr "Fare click su una molecola per informazioni" #: render2d.cpp:356 render2d_event.cpp:1082 msgid "Click on a molecule to calculate its molecular weight" msgstr "Fare click su una molecola per calcolare il suo peso molecolare" #: render2d.cpp:359 render2d_event.cpp:1095 msgid "Click on a molecule to calculate its empirical formula" msgstr "Fare click su una molecola per calcolare la sua formula empirica" #: render2d.cpp:362 msgid "Click on a molecule to calculate its elemental analysis" msgstr "Fare click su una molecola per calcolare la sua analisi elementare" #: render2d.cpp:365 msgid "Click on a molecule to calculate its 13C NMR" msgstr "Fare click su una molecola per calcolare il suo NMR C13" #: render2d.cpp:368 msgid "Click on a molecule to calculate its 1H NMR" msgstr "Fare click su una molecola per calcolare il suo NMR 1H" #: render2d.cpp:371 msgid "Click on a molecule to calculate its IR" msgstr "Fare click su una molecola per calcolare il suo IR" #: render2d.cpp:374 msgid "Click on a molecule to calculate its pKa(s)" msgstr "Fare click su una molecola per calcolare il suo pKa(s)" #: render2d.cpp:377 #, fuzzy msgid "Click on a molecule for possible retrosynthesis" msgstr "Fare click su una molecola per informazioni" #: render2d.cpp:381 #, fuzzy msgid "Click on a molecule to display its bond identifier" msgstr "Fare click su una molecola per annullare la sua definizione" #: render2d.cpp:384 msgid "Click on a molecule to calculate its octanol-water partition" msgstr "" "Fare click su una molecola per calcolare la sua ripartizione ottanolo-acqua" #: render2d.cpp:387 msgid "Click on a molecule to generate 3-D coordinates" msgstr "Fare click su una molecola per calcolare le sue coordinate 3-D" #: render2d.cpp:390 #, fuzzy msgid "Click on a molecule to guess its name" msgstr "Fare click su una molecola per calcolare il suo IR" #: render2d.cpp:393 msgid "Click on a molecule to determine its SMILES string" msgstr "Fare click su una molecola per determinare la sua stringa SMILES" #: render2d.cpp:396 msgid "Click on a molecule to clean up its structure" msgstr "" "Fare click su una molecola per la riduzione a scheletro della sua struttura" #: render2d.cpp:399 msgid "Click on a molecule to assign it as a reactant" msgstr "Fare click su una molecola per definirla come reagente" #: render2d.cpp:402 msgid "Click on a molecule to assign it as a product" msgstr "Fare click su una molecola per definirla come prodotto" #: render2d.cpp:405 msgid "Click on a molecule to clear it group assignment" msgstr "Fare click su una molecola per annullare la sua definizione" #: render2d.cpp:408 msgid "Click on a molecule to save it as a custom ring" msgstr "Fare click su una molecola per salvarla come anello personalizzato" #: render2d.cpp:411 msgid "Tool test mode" msgstr "Strumento modalità test" #: render2d.cpp:414 #, fuzzy msgid "Click on a molecule" msgstr "Riduci a scheletro la struttura della molecola" #: render2d.cpp:431 msgid "Select mode: left click to move, right click to edit" msgstr "" "Modalità selezione: fare click con il tasto sinistro del mouse per muoversi, " "con quello destro per modificare" #: render2d.cpp:482 msgid "Undo!" msgstr "Annulla!" #: render2d.cpp:484 msgid "Cannot undo, sorry!" msgstr "Impossibile annullare!" #: render2d_event.cpp:134 #, fuzzy msgid "No information." msgstr "Informazioni sulla molecola..." #: render2d_event.cpp:145 #, fuzzy msgid "Object information" msgstr "Informazioni sulla molecola..." #: render2d_event.cpp:187 msgid "Object" msgstr "" #: render2d_event.cpp:189 #, fuzzy msgid "Arrow" msgstr "Freccia di non reazione" #: render2d_event.cpp:191 #, fuzzy msgid "Bond" msgstr " legami" #: render2d_event.cpp:193 #, fuzzy msgid "Bracket" msgstr "Editor delle parentesi" #: render2d_event.cpp:195 #, fuzzy msgid "Curved Arrow" msgstr "Editor delle frecce curve" #: render2d_event.cpp:197 #, fuzzy msgid "Symbol" msgstr "Editor dei simboli" #: render2d_event.cpp:199 msgid "Text" msgstr "" #: render2d_event.cpp:202 #, fuzzy msgid "Edit" msgstr "&Modifica" #: render2d_event.cpp:204 render2d_event.cpp:211 #, fuzzy msgid "Info" msgstr "Indolo" #: render2d_event.cpp:209 #, fuzzy msgid "Molecule" msgstr "Informazioni sulla molecola" #: render2d_event.cpp:1008 msgid "Select mode: left click on object to move" msgstr "" "Modalità selezione: fare click con il tasto sinistro del mouse per muoversi" #: render2d_event.cpp:1079 render2d_event.cpp:1092 msgid ", click to paste into drawing" msgstr ", fare click con il mouse per incollare nel disegno" #: render2d_event.cpp:1409 msgid "Draw Line - Length = " msgstr "Disegna Linea - Lunghezza = " #: render2d_event.cpp:1409 msgid ", Angle = " msgstr ", Angolo = " #: render2d_event.cpp:1440 msgid "Draw aliphatic chain - Length = " msgstr "Disegna catena alifatica - Lunghezza = " #: render2d_event.cpp:1440 msgid " bonds" msgstr " legami" #: render2d_text.cpp:121 msgid "Enter subscript" msgstr "Immettere pedice" #: render2d_text.cpp:122 msgid "Please type or edit the subscript for this bracket:" msgstr "Digitare o modificare il pedice per questa parentesi:" #: retro.cpp:34 msgid "No reactions found" msgstr "" #: retro.cpp:99 msgid "" "The following reactions could have resulted in this product:\n" "\n" msgstr "" #: retro.cpp:100 msgid "" "\n" "Target bonds will be highlighted in green.\n" "To see reactions affecting a highlighted bond, right-click on the bond and " "select Info.\n" "To clear highlights, select Undo from the Edit menu, or press Ctrl+Z." msgstr "" #: retro.cpp:102 retro.cpp:104 msgid "Reverse reactions list" msgstr "" #: retro.cpp:105 #, fuzzy msgid "No reactions in the database could yield the selected molecule." msgstr "Si è avuto un errore. Il server non trova la molecola selezionata." #: ringdialog.cpp:37 msgid "Ring tool" msgstr "Strumento Anello" #: ringdialog.cpp:41 msgid "Choose a structure from list:" msgstr "Scegliere una struttura dalla lista:" #: smilesdialog.cpp:30 msgid "Enter SMILES string" msgstr "Immettere la stringa SMILES" #: smilesdialog.cpp:31 msgid "Enter SMILES string:" msgstr "Immettere la stringa SMILES:" #: to3d.cpp:263 #, fuzzy msgid "Save 3D file as..." msgstr "Salva file come..." #: to3d.cpp:265 msgid "MDL molfile (*.mol)" msgstr "" #: tool_13c_nmr.cpp:26 msgid "13C NMR spectrum" msgstr "Spettro NMR C13" #: tool_13c_nmr.cpp:57 tool_13c_nmr.cpp:68 tool_13c_nmr.cpp:79 msgid ", intensity " msgstr ", intensità" #: tool_13c_nmr.cpp:63 tool_1h_nmr.cpp:61 tool_ir.cpp:61 msgid "Peaks of reactant:\n" msgstr "Picchi del reagente:\n" #: tool_13c_nmr.cpp:74 tool_1h_nmr.cpp:72 tool_ir.cpp:72 msgid "Peaks of product:\n" msgstr "Picchi del prodotto:\n" #: tool_1h_nmr.cpp:26 msgid "1H NMR spectrum" msgstr "spettro NMR 1H" #: tool_ir.cpp:26 msgid "IR spectrum" msgstr "spettro IR" #: xruler.cpp:58 xruler.cpp:82 msgid "px" msgstr "px" #: xruler.cpp:59 xruler.cpp:83 msgid "in" msgstr "in" #: http.h:21 msgid "Accessing network" msgstr "" #: http.h:24 #, fuzzy msgid "Please wait." msgstr "Larghezza della carta:" #: molinfodialog.h:34 msgid "CAS:" msgstr "" #: molinfodialog.h:40 msgid "Name:" msgstr "" #, fuzzy #~ msgid "Estimate partial charges" #~ msgstr "Stima la variazione di entalpia in fase gas" #, fuzzy #~ msgid "Retrosynthesis" #~ msgstr "Freccia retrosintetica" #, fuzzy #~ msgid "" #~ "This copy of XDrawChem is more than 90 days old. A more recent version " #~ "may be available at\n" #~ "http://freshmeat.net/projects/xdrawchem/" #~ msgstr "" #~ "Questa copia di XDrawChem ha più di 60 giorni. Una versione più recente " #~ "può essere disponibile su http://freshmeat.net/projects/xdrawchem/" #, fuzzy #~ msgid "Could not open the retrosynthesis data file." #~ msgstr "Impossibile aprire il file: " #~ msgid "Calculate empirical formula" #~ msgstr "Calcola la formula empirica" #~ msgid "Calculate molecular weight" #~ msgstr "Calcola il peso molecolare" #~ msgid "Test tool" #~ msgstr "Strumento Test" #~ msgid "Click on a molecule to determine its IUPAC name" #~ msgstr "Fare click su una molecola per determinare il suo nome IUPAC" xdrawchem-v1.11.0/translation/xdrawchem-pl.po000066400000000000000000001702271371466245600212620ustar00rootroot00000000000000# translation of pl.po to Polish # translation of xdrawchem.po to Polish # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # Nikodem Kuznik , 2005. # msgid "" msgstr "" "Project-Id-Version: pl\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-03-03 17:03+0100\n" "PO-Revision-Date: 2005-03-06 00:23-0500\n" "Last-Translator: Nikodem Kuznik \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.3\n" #: application.cpp:158 msgid "" "Click this button to open a file.

    You can also select the Open " "command from the File menu." msgstr "" "Naciśnij ten przycisk, aby otworzyć dokument.

    W tym celu możesz " "również wybrać komendę Otwórz z menu Plik." #: application.cpp:159 msgid "" "Click this button to save the file you are editing.

    You can also " "select the Save command from the File menu.

    " msgstr "" "Naciśnij ten przycisk, aby zapisać aktualny dokument.

    W tym celu " "możesz również wybrać komendę Zapisz z menu Plik.

    " #: application.cpp:160 msgid "" "Click this button to print the file you are editing.

    You can also " "select the Print command from the File menu." msgstr "" "Naciśnij ten przycisk, aby wydrukować aktualny dokument.

    W tym celu " "możesz również wybrać komendę Drukuj z menu Plik." #: application.cpp:161 msgid "" "Click this button to cut a selection.

    You can also select the Cut " "command from the Edit menu, or press Ctrl+X." msgstr "" "Naciśnij ten przycisk, aby wyciąć zaznaczony fragment.

    W tym celu " "możesz również wybrać komendę Wytnij z menu Edycja lub nacisnąć klawisze Ctrl" "+X." #: application.cpp:162 msgid "" "Click this button to copy a selection.

    You can also select the Copy " "command from the Edit menu, or press Ctrl+C." msgstr "" "Naciśnij ten przycisk, aby skopiować zaznaczony fragment.

    W tym celu " "możesz również wybrać komendę Kopiuj z menu Edycja lub nacisnąć klawisze Ctrl" "+C." #: application.cpp:163 msgid "" "Click this button to paste a selection.

    You can also select the Paste " "command from the Edit menu, or press Ctrl+V." msgstr "" "Naciśnij ten przycisk, aby wkleić fragment.

    W tym celu możesz również " "wybrać komendę Wklej z menu Edycja lub nacisnąć klawisze Ctrl+V." #: application.cpp:164 msgid "Click this button to zoom in." msgstr "Naciśnij ten przycisk, aby powiększyć." #: application.cpp:165 msgid "Click this button to zoom out." msgstr "Naciśnij ten przycisk, aby pomniejszyć" #: application.cpp:168 msgid "" "Select tool

    Use the Select tool to select and move items inside a box." "

    You can select multiple items and cut, copy, move and rotate them." msgstr "" "Narzędzie zaznaczania

    To narzędzie jest używane do zaznaczania i " "przesuwania elementów.

    Można wybrać kilka elementów, skopiować je, " "wyciąć, przesuwać i obracać." #: application.cpp:169 msgid "" "Lasso tool

    Use the Lasso tool to select and move items by drawing a " "loop around them.

    You can select multiple items and cut, copy, move " "and rotate them." msgstr "" "Narzędzie lasso

    To narzędzie jest używane do zaznaczania lassem i " "przesuwania elementów.

    Można wybrać kilka elementów, skopiować je, " "wyciąć, przesuwać i obracać." #: application.cpp:170 msgid "Erase tool

    Use the Erase tool to erase individual items." msgstr "" "Narzędzie gumowania

    Narzędzie to jest używane do usuwania " "pojedynczych elementów." #: application.cpp:171 msgid "" "Line tool

    Use the Line tool to draw bonds. Draw over existing bonds " "to create double and triple bonds." msgstr "" "Narzędzie rysowania wiązań

    Narzędzie to jest używane do rysowania " "wiązań. Rysowanie kolejnego wiązania na istniejącym już powoduje tworzenie " "wiązań wielokrotnych." #: application.cpp:172 msgid "" "Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw " "over existing bonds to add dashed lines (to indicate resonance, etc.)." msgstr "" "Narzędzie rysowania wiązań przerywanych

    Narzędzie to jest używane do " "rysowania wiązań przerywanych. Rysowanie wiązania przerywanego na istniejącym " "już wiązaniu powoduje dodanie linii przerywanej (np. obrazującej rezonans)." #: application.cpp:173 msgid "" "Chain tool

    Use the Chain tool to draw aliphatic chains. The length " "of each segment is the current bond length." msgstr "" "Narzędzie rysowania łańcuchów

    Narzędzie to jest używane do rysowania " "łańcuchów alifatycznych. Każde przesunięcie powoduje utworzenie kolejnego " "fragmentu łancucha." #: application.cpp:174 msgid "" "Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as " "shown on the button." msgstr "" "Narzędzie rysowania klina wypełnionego

    Narzędzie to jest używane do " "rysowanie wiązania skierowanego ku obserwatorowi tak, jak to widać na " "oznaczeniu przycisku." #: application.cpp:175 msgid "" "Stereo Down Line tool

    Use the Line tool to draw stereo-down lines, as " "shown on the button." msgstr "" "Narzędzie rysowania klina przerywanego

    Narzędzie to jest używane do " "rysowanie wiązania skierowanego od obserwatora tak, jak to widać na " "oznaczeniu przycisku." #: application.cpp:176 msgid "" "Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on " "the button." msgstr "" "Narzędzie rysowania wiązań falowanych

    Narzędzie to jest używane do " "rysowania wiązań falowanych, np. dla wiązań o nieoznaczonej geometrii." #: application.cpp:177 msgid "" "Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click " "to draw a straight arrow.

    Click and hold to pick from a list of " "available arrows." msgstr "" "Narzędzie rysowania strzałek

    Narzędzie to jest używane do rysowania " "prostych strzałek.

    Naciśnij i przytrzymaj, aby wybrać z listy " "dostępnych strzałek." #: application.cpp:178 msgid "" "Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows." "

    Click and hold to select from a picture menu of arrows." msgstr "" "Narzędzie rysowania zakrzywionych strzałek

    Narzędzie to jest używane " "do rysowania prostych strzałek.

    Naciśnij i przytrzymaj, aby wybrać z " "listy dostępnych strzałek." #: application.cpp:179 msgid "" "Bracket tool

    Use the Bracket tool to draw brackets and parentheses." "

    Click to draw square brackets.

    Click and hold to select from " "a picture menu of brackets." msgstr "" "Narzędzie rysowania nawiasów

    Narzędzie to używane jest do rysowania " "nawiasów okrągłych i kwadratowych.

    Naciśnij i przytrzymaj, aby wybrać " "z listy dostępnych dostępnych nawiasów." #: application.cpp:180 msgid "" "Text tool

    Use the Text tool to add text and label atoms and points." "
    (See manual for info on formatting text)" msgstr "" "Narzędzie dodawania tekstu

    Narzędzie to używane jest do dodawania " "tekstu i oznaczania tekstem atomów i punktów.
    (Więcej informacji w " "podręczniku)" #: application.cpp:181 msgid "" "Ring tool

    Use the Ring tool to insert ready-made rings and structures." "

    Click to open the ring dialog, which allows selection from a list of " "all built-in rings and structures.

    Click and hold to select from a " "picture menu of select rings.
    (See manual for more info on modifying this " "menu)" msgstr "" "Narzędzie rysowania pierścieni

    Narzędzie to używane jest do dodawania " "gotowych pierścieni i struktur .

    Naciśnij, aby przywołać okno " "dialogowe pozwalające wybrać pożądana strukturę.

    Naciśnij i " "przytrzymaj, aby wybrać z listy symbol pożądanego pierścienia.
    " "(Informacje na temat modyfikacji tej list znajdują się w podręczniku)" #: application.cpp:182 msgid "" "Symbol tool

    Use the Symbol tool to insert symbols.

    Click and " "hold to select from a picture menu of symbols.
    " msgstr "" "Narzędzie dodawania symboli

    Narzędzie to używane jest do dodawania " "symboli.

    Naciśnij i przytrzymaj, aby wybrać z listy dostępnych " "symboli.
    " #: application.cpp:217 msgid "File Operations" msgstr "Operacje na plikach" #: application.cpp:222 msgid "Open file" msgstr "Otwórz plik" #: application.cpp:229 msgid "Save file" msgstr "Zapisz plik" #: application.cpp:236 msgid "Print file" msgstr "Drukuj plik" #: application.cpp:243 render2d_event.cpp:213 msgid "Cut" msgstr "Wytnij" #: application.cpp:250 render2d_event.cpp:214 msgid "Copy" msgstr "Kopiuj" #: application.cpp:257 msgid "Paste" msgstr "Wklej" #: application.cpp:264 msgid "Zoom In" msgstr "PowiÄ™ksz" #: application.cpp:271 msgid "Zoom Out" msgstr "Pomnijesz" #: application.cpp:285 msgid "Set drawing color" msgstr "Ustawienie koloru rysunku" #: application.cpp:289 msgid "Set line thickness" msgstr "Ustawienie gruboÅ›ci linii" #: application.cpp:290 msgid "Set Line Thickness" msgstr "Ustawienie gruboÅ›ci linii" #: application.cpp:304 msgid "Set font" msgstr "Ustawienie czcionki" #: application.cpp:305 msgid "Set Font" msgstr "Ustawienie czcionki" #: application.cpp:314 msgid "Set font size" msgstr "Ustawienie rozmiaru czcionki" #: application.cpp:315 msgid "Set Font Size" msgstr "Ustawienie rozmiaru czcionki" #: application.cpp:329 msgid "Left-justify selected text" msgstr "Wyrównaj do lewej zaznaczony tekst" #: application.cpp:337 msgid "Center selected text" msgstr "Wycentruj zaznaczony tekst" #: application.cpp:345 msgid "Right-justify selected text" msgstr "Wyrównaj do prawej zaznaczony tekst" #: application.cpp:353 msgid "Make selected text bold (Ctrl+B)" msgstr "Zmiana zaznaczonego tekstu na pogrubiony (Ctrl+B)" #: application.cpp:363 msgid "Italicize selected text (Ctrl+I)" msgstr "Zmiana zaznaczonego tekstu na kursywÄ™ (Ctrl+I)" #: application.cpp:373 msgid "Underline selected text (Ctrl+U)" msgstr "PodkreÅ›lenie zaznaczonego tekstu (Ctrl+U)" #: application.cpp:383 msgid "Superscript selected text (Ctrl-Plus)" msgstr "Zmiana zaznaczonego tekstu na indeks górny (Ctrl-Plus)" #: application.cpp:394 msgid "Subscript selected text (Ctrl-Minus)" msgstr "Zmiana zaznaczonego tekstu na indeks dolny (Ctrl-Minus)" #: application.cpp:410 netchoosedialog.cpp:83 render2d_event.cpp:212 msgid "Select" msgstr "NarzÄ™dzie zaznaczania" #: application.cpp:417 msgid "Lasso" msgstr "NarzÄ™dzie lasso" #: application.cpp:424 msgid "Erase" msgstr "NarzÄ™dzie gumowania" #: application.cpp:431 msgid "Draw line" msgstr "NarzÄ™dzie rysowania wiÄ…zaÅ„" #: application.cpp:439 msgid "Draw dashed line" msgstr "NarzÄ™dzie rysowania wiÄ…zaÅ„ przerywanych" #: application.cpp:447 msgid "Draw aliphatic chain" msgstr "NarzÄ™dzie rysowania Å‚aÅ„cuchów alifatycznych" #: application.cpp:455 msgid "Draw stereo-up line" msgstr "NarzÄ™dzie rysowania klinów wypeÅ‚nionych" #: application.cpp:463 msgid "Draw stereo-down line" msgstr "NarzÄ™dzie rysowania klinów przerywanych" #: application.cpp:471 msgid "Draw wavy bond" msgstr "NarzÄ™dzie rysowania wiÄ…zaÅ„ falowanych" #: application.cpp:479 msgid "Draw arrow" msgstr "NarzÄ™dzie rysowania strzaÅ‚ek" #: application.cpp:489 msgid "Draw curved arrow" msgstr "NarzÄ™dzie rysowania strzaÅ‚ek zakrzywionych" #: application.cpp:499 msgid "Draw bracket" msgstr "NarzÄ™dzie rysowania nawiasów" #: application.cpp:509 msgid "Draw or edit text" msgstr "NarzÄ™dzie dodawania tekstu" #: application.cpp:517 msgid "Draw ring" msgstr "NarzÄ™dzie rysowania pierÅ›cieni" #: application.cpp:528 msgid "Draw symbol" msgstr "NarzÄ™dzie dodawania symboli" #: application.cpp:536 msgid "Canned Structures" msgstr "Wbudowane szkielety" #: application.cpp:544 msgid "Cyclopropane" msgstr "Cyklopropan" #: application.cpp:552 msgid "Cyclobutane" msgstr "Cyklobutan" #: application.cpp:560 msgid "Cyclopentane" msgstr "Cyklopentan" #: application.cpp:568 msgid "Cyclopentadiene" msgstr "Cyklopentadien" #: application.cpp:576 msgid "Cyclohexane" msgstr "Cykloheksan" #: application.cpp:584 msgid "Cyclohexane - chair conformation" msgstr "Cykloheksan - konformacja krzesÅ‚owa" #: application.cpp:592 msgid "Cyclohexane - boat conformation" msgstr "Cykloheksan - konformacja łódkowa" #: application.cpp:600 msgid "Benzene" msgstr "Benzen" #: application.cpp:610 helpwindow.cpp:89 msgid "&File" msgstr "&Plik" #: application.cpp:612 msgid "&New" msgstr "&Nowy" #: application.cpp:614 msgid "&Open" msgstr "&Otwórz" #: application.cpp:619 msgid "&Find on Internet" msgstr "Wyszukaj w &internecie" #: application.cpp:623 msgid "&Save" msgstr "&Zapisz" #: application.cpp:627 msgid "Save &as..." msgstr "Zapisz &jako..." #: application.cpp:629 msgid "Save picture..." msgstr "Zapisz obraz..." #: application.cpp:640 msgid "Pa&ge setup" msgstr "Ustawienia stron&y..." #: application.cpp:641 helpwindow.cpp:68 msgid "&Print" msgstr "&Drukuj..." #: application.cpp:645 graphdialog.cpp:42 tool_13c_nmr.cpp:41 #: tool_1h_nmr.cpp:41 tool_ir.cpp:41 msgid "Close" msgstr "Zamknij" #: application.cpp:646 msgid "Quit" msgstr "ZakoÅ„cz" #: application.cpp:649 msgid "Rotate 90 degrees clockwise" msgstr "Obróć o 90 stopni zgodnie z zegarem" #: application.cpp:651 msgid "Rotate 180 degrees" msgstr "Obróć o 180 stopni" #: application.cpp:652 msgid "Rotate 90 degrees counterclockwise" msgstr "Obróć o 90 stopni przeciwnie do zegara" #: application.cpp:656 msgid "Flip &horizontal" msgstr "Odbij po&ziomo" #: application.cpp:657 msgid "Flip &vertical" msgstr "Odbij pio&nowo" #: application.cpp:660 msgid "Normal (100%)" msgstr "Normalne (100%)" #: application.cpp:662 msgid "Zoom out" msgstr "Pomnijesz" #: application.cpp:663 msgid "Zoom in" msgstr "PowiÄ™ksz" #: application.cpp:677 msgid "&Edit" msgstr "&Edycja" #: application.cpp:679 msgid "&Undo" msgstr "&Cofnij" #: application.cpp:681 msgid "Cu&t" msgstr "Wy&tnij" #: application.cpp:682 msgid "&Copy" msgstr "&Kopiuj" #: application.cpp:683 msgid "&Paste" msgstr "&Wklej" #: application.cpp:684 msgid "Clear" msgstr "Wyczyść" #: application.cpp:686 msgid "Select &All" msgstr "&Zaznacz wszystko" #: application.cpp:687 msgid "&Deselect All" msgstr "&Odznacz wszystko" #: application.cpp:689 msgid "&Rotate" msgstr "&Obróć" #: application.cpp:690 msgid "&Flip" msgstr "&Odbij" #: application.cpp:692 msgid "&Zoom" msgstr "&PowiÄ™kszenie" #: application.cpp:695 msgid "&Group" msgstr "&Grupuj" #: application.cpp:696 msgid "Select &Reactant" msgstr "Zaznacz &substrat" #: application.cpp:698 msgid "Select &Product" msgstr "Zaznacz &produkt" #: application.cpp:700 msgid "Clear &group" msgstr "&UsuÅ„ grupowanie" #: application.cpp:702 msgid "Clear all &groups" msgstr "UsuÅ„ &wszystkie grupowania" #: application.cpp:707 msgid "Forma&t" msgstr "Forma&t" #: application.cpp:709 msgid "&Bond - Fixed length and angle" msgstr "&WiÄ…zanie - dÅ‚ugość i kÄ…t jak w ustawieniach" #: application.cpp:712 msgid "&Arrow - Fixed length and angle" msgstr "&StrzaÅ‚ka - dÅ‚ugość i kÄ…t jak w ustawieniach" #: application.cpp:715 msgid "Automatically Add &hydrogens" msgstr "Automatycznie dodawaj &wodory" #: application.cpp:719 msgid "Set background &color" msgstr "Ustawienie koloru &tÅ‚a" #: application.cpp:721 msgid "Toggle &grid" msgstr "Przełącz tryb &siatki" #: application.cpp:723 msgid "&Drawing settings..." msgstr "Ustawienia &rysunku..." #: application.cpp:725 msgid "&XDC settings..." msgstr "Ustawienia &XDC..." #: application.cpp:730 msgid "Estimate gas-phase enthalphy change" msgstr "Szacowana zmiana entalpii w fazie gazowej" #: application.cpp:732 msgid "Compare 1H NMR" msgstr "Porównanie 1H NMR" #: application.cpp:734 msgid "Compare 13C NMR" msgstr "Porównanie 13C NMR" #: application.cpp:741 msgid "Reverse reactions" msgstr "Reakcje przeciwne" #: application.cpp:747 msgid "Get bond identifier" msgstr "WyÅ›wietl rodzaj wiÄ…zania" #: application.cpp:751 msgid "T&ools" msgstr "&NarzÄ™dzia" #: application.cpp:752 msgid "Clean up molecule" msgstr "Wyrównaj czÄ…steczkÄ™" #: application.cpp:753 msgid "Auto &layout" msgstr "A&utomatyczne uÅ‚ożenie" #: application.cpp:754 msgid "Create custom ring" msgstr "Utwórz nowy pierÅ›cieÅ„" #: application.cpp:757 msgid "Molecule information..." msgstr "Charakterystyka czÄ…steczki..." #: application.cpp:773 msgid "Predict 1H NMR" msgstr "Symulacja 1H NMR" #: application.cpp:774 msgid "Predict 13C NMR" msgstr "Symulacja 13C NMR" #: application.cpp:775 msgid "Predict IR" msgstr "Symulacja IR" #: application.cpp:776 msgid "Predict pKa" msgstr "Symulacja pKa" #: application.cpp:777 msgid "Predict octanol-water partition (Kow)" msgstr "Symulacja wsp. podziaÅ‚u oktanol-woda (Kow)" #: application.cpp:778 msgid "Reaction" msgstr "Reakcja" #: application.cpp:780 msgid "Input SMILES" msgstr "SMILES wejÅ›ciowy" #: application.cpp:781 msgid "Output SMILES" msgstr "SMILES wynikowy" #: application.cpp:783 msgid "Build 3D model of molecule" msgstr "Wygeneruj model 3D " #: application.cpp:789 helpwindow.cpp:92 msgid "&Help" msgstr "Pomo&c" #: application.cpp:791 msgid "&Manual" msgstr "PodrÄ™cznik XDrawChe&m" #: application.cpp:792 msgid "&Did You Know?" msgstr "C&zy wiesz, że...?" #: application.cpp:793 msgid "&About" msgstr "&Informacje" #: application.cpp:794 msgid "&Support" msgstr "&Lista kontaktów" #: application.cpp:795 msgid "&References" msgstr "&OdnoÅ›niki literaturowe" #: application.cpp:797 msgid "What's &This" msgstr "Co &to jest?" #: application.cpp:875 msgid "Newman projection symbol" msgstr "Symbol projekcji Newmana" #: application.cpp:876 msgid "Newman projection - staggered (anti)" msgstr "Projekcja Newmana - naprzemianlegÅ‚a (anti)" #: application.cpp:877 msgid "Newman projection - eclipsed" msgstr "Projekcja Newmana - naprzeciwlegÅ‚a" #: application.cpp:932 msgid "Cubic bezier" msgstr "Krzywa Beziera" #: application.cpp:935 msgid "Cubic bezier - half arrow" msgstr "Krzywa Beziera - poÅ‚owa grota" #: application.cpp:938 msgid "Cubic bezier - full arrow" msgstr "Krzywa Beziera - caÅ‚y grot" #: application.cpp:984 application_ring.cpp:347 msgid "User-defined" msgstr "Grupy użytkownika" #: application.cpp:1168 application_ob.cpp:95 msgid "Couldn't open file" msgstr "Nie można otworzyć pliku" #: application.cpp:1168 application_ob.cpp:95 msgid "Could not open the file: " msgstr "Nie można otworzyć pliku: " #: application.cpp:1169 application.cpp:1177 application_ob.cpp:96 #: application_ob.cpp:104 msgid "Unable to load " msgstr "Nie można zaÅ‚adować " #: application.cpp:1183 application_ob.cpp:110 application_ob.cpp:137 msgid "Loaded document " msgstr "ZaÅ‚adowano dokument " #: application.cpp:1207 application_ob.cpp:187 application_ob.cpp:198 msgid "Could not write to " msgstr "Nie można zapisać do " #: application.cpp:1213 application_ob.cpp:191 application_ob.cpp:202 #: application_ob.cpp:235 msgid "Saved file " msgstr "Zapisano dokument " #: application.cpp:1265 msgid "Save as picture..." msgstr "Zapisz jako obraz..." #: application.cpp:1300 application.cpp:1312 application.cpp:1318 msgid "Saved picture file " msgstr "Zapisano obraz " #: application.cpp:1302 application.cpp:1314 application.cpp:1320 msgid "Unable to save picture!" msgstr "Nie można zapisać obrazu!" #: application.cpp:1374 msgid "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Please subscribe to the mailing list for information about future releases.\n" "Send a message to xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n" "\n" "XDrawChem is copyright (C) 2004 Bryan Herger.\n" "Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint " "project\n" "OpenBabel code copyright (C) 2003 by the OpenBabel project team.\n" "See file COPYRIGHT.txt for more details" msgstr "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "ProszÄ™ subskrybować listÄ™ dyskusyjnÄ… w celu uzyskania informacji o nowych " "wersjach\n" "WyÅ›lij wiadomość do xdrawchem-announce-request@lists.sourceforge.net " "umieszczajÄ…c sÅ‚owo 'subscribe' w tytule wiadomoÅ›ci.\n" "\n" "XDrawChem - prawa autorskie (C) 2004 Bryan Herger.\n" "Częściowe prawa autorskie (C) 1997-2000 Dr Christoph Steinbeck oraz projekt " "JChemPaint\n" "Kod OpenBabel - prawa autorskie (C) 2003 Grupa projektu OpenBabel.\n" "TÅ‚umaczenie Nikodem Kuźnik. http://chemlix.linux.pl\n" "Szczegóły w pliku COPYRIGHT.txt" #: application.cpp:1378 msgid "How to get help" msgstr "Jak uzyskać pomoc" #: application.cpp:1379 msgid "" "Current information on XDrawChem can always be found at\n" "http://xdrawchem.sourceforge.net/\n" "The latest release will be posted here, as well as links to mailing lists " "and the bug tracker.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "You can contact the author directly at\n" "bherger@users.sourceforge.net" msgstr "" "Aktualne informacje o programie XDrawChem sÄ… zawsze umieszczone na stronie\n" "http://xdrawchem.sourceforge.net/\n" "Tam też znajduje siÄ™ zawsze ostatnia, aktualna wersja programu.\n" "\n" "Wszelkie błędy należy zgÅ‚aszać na SourceForge: " "http://www.sourceforge.net/tracker/?group_id=34518\n" "\n" "SÄ… dwie listy dyskusyjne: xdrawchem-announce, w której ogÅ‚aszana jest " "kolejna, nowa wersja,\n" "oraz lista xdrawchem-user, na temat użytkowania programu XDrawChem.\n" "Subskrypcja każdej z listy polega na wysÅ‚aniu pustej wiadomoÅ›ci z tematem: " "\"subscribe\" do\n" "\"xdrawchem-announce-request@lists.sourceforge.net\" lub\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "Możliwy jest konatakt bezpoÅ›redni (w j. angielskim) z autorem poprzez:\n" "bherger@users.sourceforge.net\n" "\n" "Kontakt w sprawie polskiego tÅ‚umaczenia:\n" "http://chemlix.linux.pl oraz nkuznik@yahoo.com" #: application.cpp:1459 msgid "Database query failed" msgstr "Zapytanie do bazy danych nie powiodÅ‚o siÄ™" #: application.cpp:1459 msgid "No molecules in the database match the query." msgstr "Brak dopasowaÅ„ czÄ…steczki w bazie danych." #: application.cpp:1690 application.cpp:1698 application.cpp:1705 #: application.cpp:1712 #, qt-format msgid "Zoom = %1 %" msgstr "PowiÄ™kszenie = %1 %" #: application.cpp:1716 msgid "XDC Settings" msgstr "Ustawienia XDC" #: application.cpp:1717 msgid "Change XDrawChem settings:" msgstr "ZmieÅ„ ustawienia programu:" #: application.cpp:1718 msgid "&Main font" msgstr "Czcionka &podstawowa" #: application.cpp:1718 msgid "&Ruler font" msgstr "Czcionka &linijki" #: application.cpp:1719 bondedit.cpp:252 crings_dialog.cpp:137 #: fixeddialog.cpp:144 molinfodialog.cpp:37 netchoosedialog.cpp:88 #: netdialog.cpp:80 pagesetupdialog.cpp:109 peptidebuilder.cpp:78 #: ringdialog.cpp:55 smilesdialog.cpp:41 msgid "Cancel" msgstr "Anuluj" #: application_ob.cpp:35 tool_2d3d.cpp:92 msgid "--Select a filter-- (*)" msgstr "--Wybierz filtr-- (*)" #: application_ob.cpp:38 msgid "CDXML - ChemDraw text/XML format (*)" msgstr "CDXML - format XML/tekstowy ChemDraw (*)" #: application_ob.cpp:41 msgid "CDX - ChemDraw binary format (*)" msgstr "CDX - binarny format ChemDraw (*)" #: application_ob.cpp:44 msgid "XDC - XDrawChem native format (*)" msgstr "XDC - rodzimy format XDrawChem (*)" #: application_ob.cpp:68 msgid "Open file..." msgstr "Otwórz plik..." #: application_ob.cpp:83 application_ob.cpp:162 tool_2d3d.cpp:113 msgid "Could not determine file type" msgstr "Nie można rozpoznać typu pliku" #: application_ob.cpp:84 application_ob.cpp:163 tool_2d3d.cpp:114 msgid "Please select a file type from the list." msgstr "Wybierz typ pliku z listy." #: application_ob.cpp:126 msgid "Problem while opening the file" msgstr "Błąd podczas otwierania pliku" #: application_ob.cpp:127 msgid "Cannot open the specified file." msgstr "Nie można otworzyć podanego pliku." #: application_ob.cpp:150 tool_2d3d.cpp:107 msgid "Save file as..." msgstr "Zapisz plik jako..." #: application_ob.cpp:155 msgid "Overwrite file?" msgstr "Czy nadpisać plik?" #: application_ob.cpp:155 #, qt-format msgid "Overwrite existing file: %1 ?" msgstr "Czy nadpisać istniejÄ…cy plik: %1 ?" #: application_ob.cpp:221 msgid "IOIface Data error" msgstr "Błąd danych We/Wy" #: application_ob.cpp:222 msgid "" "Cannot convert the molecule.\n" "Conversion failed in ioiface.cpp" msgstr "" "Nie można przekonwertować pliku.\n" "Konwersja nie powiodÅ‚a siÄ™ w ioiface.cpp" #: application_ob.cpp:228 tool_2d3d.cpp:133 msgid "Problem while writing the file" msgstr "Błąd podczas zapisywania pliku" #: application_ob.cpp:229 tool_2d3d.cpp:134 msgid "Cannot write the specified file." msgstr "Nie można zapisać podanego pliku." #: application_ring.cpp:120 msgid "[*] Cyclopropane" msgstr "[*] Cyklopropan" #: application_ring.cpp:124 msgid "[*] Cyclobutane" msgstr "[*] Cyklobutan" #: application_ring.cpp:128 msgid "[*] Cyclopentane" msgstr "[*] Cyklopentan" #: application_ring.cpp:132 msgid "Imidazole" msgstr "Imidazol" #: application_ring.cpp:136 msgid "[*] Cyclopentadiene" msgstr "[*] Cyklopentadien" #: application_ring.cpp:140 msgid "[*] Cyclohexane (flat)" msgstr "[*] Cykloheksan (pÅ‚aski)" #: application_ring.cpp:144 msgid "Cyclohexane (boat)" msgstr "Cykloheksan (łódka)" #: application_ring.cpp:148 msgid "Cyclohexane (chair)" msgstr "Cykloheksan (krzesÅ‚o)" #: application_ring.cpp:152 msgid "[*] Benzene" msgstr "[*] Benzen" #: application_ring.cpp:156 msgid "Pyrimidine" msgstr "Pirymidyna" #: application_ring.cpp:160 msgid "[*] Cycloheptane" msgstr "[*] Cykloheptan" #: application_ring.cpp:164 msgid "[*] Cyclooctane" msgstr "[*] Cyklooktan" #: application_ring.cpp:168 msgid "Indole" msgstr "Indol" #: application_ring.cpp:172 msgid "Purine" msgstr "Puryna" #: application_ring.cpp:176 msgid "Naphthalene" msgstr "Naftalen" #: application_ring.cpp:180 msgid "Biphenyl" msgstr "Bifenyl" #: application_ring.cpp:184 msgid "Anthracene" msgstr "Antracen" #: application_ring.cpp:188 msgid "Steroid (fused ring template)" msgstr "Steroid (szkielet skumulowanych pierÅ›cieni)" #: application_ring.cpp:191 msgid "Rings" msgstr "PierÅ›cienie" #: application_ring.cpp:196 msgid "Alanine" msgstr "Alanina" #: application_ring.cpp:200 msgid "Arginine" msgstr "Arginina" #: application_ring.cpp:204 msgid "Asparagine" msgstr "Asparagina" #: application_ring.cpp:208 msgid "Aspartic acid" msgstr "Kwas asparaginowy" #: application_ring.cpp:212 msgid "Cysteine" msgstr "Cysteina" #: application_ring.cpp:216 msgid "Glutamic acid" msgstr "Kwas glutaminowy" #: application_ring.cpp:220 msgid "Glutamine" msgstr "Glutamina" #: application_ring.cpp:224 msgid "Glycine" msgstr "Glicyna" #: application_ring.cpp:228 msgid "Histidine" msgstr "Histydyna" #: application_ring.cpp:232 msgid "Isoleucine" msgstr "Izoleucyna" #: application_ring.cpp:236 msgid "Leucine" msgstr "Leucyna" #: application_ring.cpp:240 msgid "Lysine" msgstr "Lizyna" #: application_ring.cpp:244 msgid "Methionine" msgstr "Metionina" #: application_ring.cpp:248 msgid "Nitrophenylalanine" msgstr "Nitrofenyloalanina" #: application_ring.cpp:252 msgid "Phenylalanine" msgstr "Fenyloalanina" #: application_ring.cpp:256 msgid "Proline" msgstr "Prolina" #: application_ring.cpp:260 msgid "Serine" msgstr "Seryna" #: application_ring.cpp:264 msgid "Statine" msgstr "Statyna" #: application_ring.cpp:268 msgid "Threonine" msgstr "Treonina" #: application_ring.cpp:272 msgid "Tryptophan" msgstr "Tryptofan" #: application_ring.cpp:276 msgid "Tyrosine" msgstr "Tyrozyna" #: application_ring.cpp:280 msgid "Valine" msgstr "Walina" #: application_ring.cpp:283 msgid "Amino acids" msgstr "Aminokwasy" #: application_ring.cpp:288 msgid "Adenine" msgstr "Adenina" #: application_ring.cpp:291 msgid "Cytosine" msgstr "Cytozyna" #: application_ring.cpp:294 msgid "Guanine" msgstr "Guanina" #: application_ring.cpp:297 msgid "Thymine" msgstr "Tymina" #: application_ring.cpp:300 msgid "Uracil" msgstr "Uracyl" #: application_ring.cpp:302 msgid "Nucleic acids" msgstr "Kwasy nukleinowe" #: application_ring.cpp:307 msgid "Ribose" msgstr "Ryboza" #: application_ring.cpp:311 msgid "Deoxyribose" msgstr "Deoksyryboza" #: application_ring.cpp:315 msgid "D-fructose" msgstr "D-Fruktoza" #: application_ring.cpp:319 msgid "D-glucose" msgstr "D-Glukoza" #: application_ring.cpp:322 msgid "Sugars" msgstr "Cukry" #: application_ring.cpp:326 msgid "[*] FMOC" msgstr "[*] FMOC" #: application_ring.cpp:329 msgid "[*] BOC" msgstr "[*] BOC" #: application_ring.cpp:332 msgid "[*] DABCYL" msgstr "[*] DABCYL" #: application_ring.cpp:335 msgid "[*] DABSYL" msgstr "[*] DABSYL" #: application_ring.cpp:338 msgid "[*] DANSYL" msgstr "[*] DANSYL" #: application_ring.cpp:341 msgid "[*] EDANS" msgstr "[*] EDANS" #: application_ring.cpp:344 msgid "Useful groups" msgstr "Użyteczne grupy" #: application_ring.cpp:369 msgid "Add new..." msgstr "Dodaj nowe..." #: bondedit.cpp:52 msgid "Color" msgstr "Kolor" #: bondedit.cpp:57 msgid "Arrow editor" msgstr "Edytor strzaÅ‚ek" #: bondedit.cpp:58 bondedit.cpp:165 bondedit.cpp:187 bondedit.cpp:212 msgid "Style:" msgstr "Styl:" #: bondedit.cpp:61 msgid "Plain arrow" msgstr "ZwykÅ‚a" #: bondedit.cpp:64 msgid "NR arrow" msgstr "Brak reakcji" #: bondedit.cpp:67 msgid "Dashed arrow" msgstr "Przerywana" #: bondedit.cpp:70 msgid "Two-way arrow" msgstr "Dwustronna" #: bondedit.cpp:73 msgid "Split two-way arrow" msgstr "Podwójna dwustronna" #: bondedit.cpp:76 msgid "Retrosynthetic arrow" msgstr "Retrosynteza" #: bondedit.cpp:98 msgid "Bond editor" msgstr "Edytor wiÄ…zaÅ„" #: bondedit.cpp:100 msgid "Bond order:" msgstr "RzÄ…d wiÄ…zania:" #: bondedit.cpp:103 msgid "Dashed line" msgstr "Przerywane" #: bondedit.cpp:106 msgid "Single" msgstr "Pojedyncze" #: bondedit.cpp:109 msgid "Stereo-up" msgstr "Klik wypeÅ‚niony" #: bondedit.cpp:112 msgid "Stereo-down" msgstr "Klin przerywany" #: bondedit.cpp:115 msgid "Wavy" msgstr "Falowane" #: bondedit.cpp:118 msgid "Single/double (aromatic)" msgstr "Aromatyczne" #: bondedit.cpp:121 msgid "Double" msgstr "Podwójne" #: bondedit.cpp:124 msgid "Double/triple" msgstr "Podwójne/potrójne" #: bondedit.cpp:127 msgid "Triple" msgstr "Potrójne" #: bondedit.cpp:134 msgid "Bond thickness:" msgstr "Ustawienie gruboÅ›ci wiÄ…zaÅ„:" #: bondedit.cpp:153 msgid "Double bond alignment:" msgstr "Wyrównanie wiÄ…zania podwójnego: " #: bondedit.cpp:156 msgid "Auto" msgstr "Automatycznie" #: bondedit.cpp:157 msgid "Left" msgstr "Do lewej" #: bondedit.cpp:158 msgid "Center" msgstr "Po Å›rodku" #: bondedit.cpp:159 msgid "Right" msgstr "Do prawej" #: bondedit.cpp:164 msgid "Bracket editor" msgstr "Edytor nawiasów" #: bondedit.cpp:168 msgid "Square bracket" msgstr "Kwadratowy" #: bondedit.cpp:171 msgid "Parentheses" msgstr "ZaokrÄ…glony" #: bondedit.cpp:174 msgid "Curly bracket" msgstr "ZawiniÄ™ty nawias" #: bondedit.cpp:177 msgid "Box" msgstr "ProstokÄ…t" #: bondedit.cpp:180 msgid "Ellipse" msgstr "Elipsa" #: bondedit.cpp:186 msgid "Curved Arrow editor" msgstr "Edytor zakrzywionych strzaÅ‚ek" #: bondedit.cpp:190 msgid "90 degree clockwise" msgstr "90 stopni zgodnie z zegarem" #: bondedit.cpp:193 msgid "180 degree clockwise" msgstr "180 stopni zgodnie z zegarem" #: bondedit.cpp:196 msgid "270 degree clockwise" msgstr "270 stopni zgodnie z zegarem" #: bondedit.cpp:199 msgid "90 degree counterclockwise" msgstr "90 stopni przeciwnie do zegara" #: bondedit.cpp:202 msgid "180 degree counterclockwise" msgstr "180 stopni przeciwnie do zegara" #: bondedit.cpp:205 msgid "270 degree counterclockwise" msgstr "270 stopni przeciwnie do zegara" #: bondedit.cpp:211 msgid "Symbol editor" msgstr "Edytor symboli" #: bondedit.cpp:215 msgid "Positive charge" msgstr "Åadunek dodatni" #: bondedit.cpp:218 msgid "Negative charge" msgstr "Åadunek ujemny" #: bondedit.cpp:221 msgid "Partial positive charge" msgstr "Częściowy Å‚adunek dodatni" #: bondedit.cpp:224 msgid "Partial negative charge" msgstr "Częściowy Å‚adunek ujemny" #: bondedit.cpp:227 msgid "Single electron" msgstr "Pojedynczy elektron" #: bondedit.cpp:230 msgid "Electron pair" msgstr "Para elektronowa" #: bondedit.cpp:233 msgid "Stereochemical ring hydrogen" msgstr "Wodór w pierÅ›cieniu" #: bondedit.cpp:236 msgid "p orbital" msgstr "Orbital p" #: bondedit.cpp:239 msgid "p double" msgstr "p podwójny" #: bondedit.cpp:242 msgid "bead" msgstr "kula" #: bondedit.cpp:248 crings_dialog.cpp:133 dyk.cpp:40 fixeddialog.cpp:136 #: molinfodialog.cpp:29 pagesetupdialog.cpp:105 peptidebuilder.cpp:74 #: smilesdialog.cpp:37 msgid "OK" msgstr "OK" #: chemdata_rxn.cpp:41 msgid "Missing reactant or product" msgstr "Brak substratu lub produktu" #: chemdata_rxn.cpp:42 msgid "You must select at least one reactant and one product." msgstr "Należy wybrać co najmniej jeden substrat i jeden produkt." #: chemdata_rxn.cpp:50 msgid "Estimated gas-phase enthalpy change:\n" msgstr "Szacowana zmiana entalpii fazy gazowej:\n" #: chemdata_rxn.cpp:59 #, qt-format msgid "Reactants = %1 kJ/mol\n" msgstr "Substraty = %1 kJ/mol\n" #: chemdata_rxn.cpp:68 #, qt-format msgid "Products = %1 kJ/mol\n" msgstr "Produkty = %1 kJ/mol\n" #: chemdata_rxn.cpp:70 #, qt-format msgid "Reaction = %1 kJ/mol" msgstr "Reakcja = %1 kJ/mol" #: chemdata_rxn.cpp:71 msgid "Enthalpy change" msgstr "Zmiana entalpii" #: chemdata_rxn.cpp:81 msgid "1H NMR compare error" msgstr "Błąd porównania 1H NMR" #: chemdata_rxn.cpp:82 chemdata_rxn.cpp:138 msgid "Please select only one reactant and one product to compare." msgstr "ProszÄ™ wybrać tylko jeden substrat i jeden produkt dla porównania." #: chemdata_rxn.cpp:137 msgid "13C NMR compare error" msgstr "Błąd porównania 13C NMR" #: chemdata_tools.cpp:171 msgid "Octanol-water partition" msgstr "Współczynnik podziaÅ‚u oktanol - woda" #: chemdata_tools.cpp:171 #, qt-format msgid "Estimated octanol-water partition constant (log Kow) = %1" msgstr "Szacunkowy wsp. podziaÅ‚u oktanol-woda (log Kow) = %1" #: chemdata_tools.cpp:193 msgid "SMILES string" msgstr "ÅaÅ„cuch SMILES" #: chemdata_tools.cpp:193 msgid "SMILES string for selected molecule:" msgstr "ÅaÅ„cuch SMILES dla zaznaczonej czÄ…steczki:" #: crings_dialog.cpp:123 msgid "Add custom ring to menu list" msgstr "Dodaj nowy pierÅ›cieÅ„ do listy menu" #: dyk.cpp:17 dyk.cpp:20 msgid "Did You Know?" msgstr "Czy wiesz, że...?" #: dyk.cpp:28 msgid "Previous tip" msgstr "Poprzednia porada" #: dyk.cpp:32 msgid "Next tip" msgstr "NastÄ™pna porada" #: dyk.cpp:36 msgid "Don't show this dialog at startup" msgstr "Nie pokazuj porad po uruchomieniu" #: dyk.cpp:55 msgid "" "XDrawChem can be run from the command line to produce images. Type " "\"xdrawchem --help\" for details." msgstr "" "XDrawChem może utworzyć obrazy z wiersza poleceÅ„. WiÄ™cej informacji po " "wpisaniu \"xdrawchem --help\"." #: dyk.cpp:56 msgid "When in select mode, you can edit most objects by right-clicking on them." msgstr "" "W trybie zaznaczania można edytować wiÄ™kszość obiektów poprzez klikniÄ™cie " "danego obiektu prawym klawiszem myszy." #: dyk.cpp:57 msgid "" "When drawing bonds, you can edit the bond style by right-clicking on the " "bond." msgstr "" "W trybie rysowania wiÄ…zaÅ„ można edytować typ wiÄ…zania po klikniÄ™ciu prawym " "klawiszem myszy nad danym wiÄ…zaniem." #: dyk.cpp:58 msgid "" "When in select mode, press Shift+LeftButton and drag over part of a molecule " "to select the entire molecule." msgstr "" "W trybie zaznaczania można zaznaczyć całą czÄ…steczkÄ™ poprzez przeciÄ…gniÄ™cie " "kursorem myszynad jej fragmentem trzymajÄ…c klawisz Shift oraz lewy przycisk " "myszy." #: dyk.cpp:59 msgid "" "When in select mode, press Ctrl+LeftButton on a molecule to get molecule " "information." msgstr "" "W trybie zaznaczania można uzyskać charakterystykÄ™ czÄ…steczki poprzez " "klikniÄ™cie czÄ…steczki lewym przyciskiem myszy nad jej fragmentem trzymajÄ…c " "klawisz Ctrl." #: dyk.cpp:60 msgid "" "Bond length, bond angle, and units are set in the Drawing Settings option " "under the Format menu." msgstr "" "DÅ‚ugość wiÄ…zaÅ„, kÄ…t miedzy wiÄ…zaniami oraz stosowane jednostki można " "zmieniać w 'Ustawieniach rysunku' dostÄ™pnych z menu Format." #: dyk.cpp:61 msgid "" "You can attach a subscript to a bracket by selecting the text tool, then " "clicking on the bracket." msgstr "" "Można dołączyć indeks dolny do nawiasów kwadratowych poprzez użycie " "'NarzÄ™dzia dodawania tekstu' po klikniÄ™ciu na nawias." #: dyk.cpp:62 msgid "" "You can toggle the grid display by pressing Ctrl+G. Turning the grid on or " "off does not affect whether objects snap to the grid." msgstr "" "Można przełączać miÄ™dzy trybami wyÅ›wietlania siatki poprzez naciÅ›niÄ™cie Ctrl" "+G. Obecność siatki lub jej brak nie wpÅ‚ywa na funkcjÄ™ 'PrzeciÄ…gnij do " "siatki'." #: dyk.cpp:63 msgid "" "A number of ring and molecule templates are available from the ring tool, " "including single and fused rings, amino acids, and nucleosides." msgstr "" "Jest dostÄ™pnych wiele szkieletów czÄ…steczek poprzez 'NarzÄ™dzie rysowania " "pierÅ›cieni'. SÄ… dostÄ™pne miÄ™dzy innymi: proste i skondensowane pierÅ›cienie, " "aminokwasy oraz nukleozydy." #: dyk.cpp:64 msgid "Remember to select a file type when opening or saving documents." msgstr "" "Należy pamiÄ™tać o wybraniu typu pliku przy otwieraniu lub zapisywaniu " "dokumentu." #: dyk.cpp:65 msgid "" "The option \"Clean up molecule\" under the Tools menu can be used to refine " "structures such as rings and macromolecules." msgstr "" "Komenda \"Wyrównaj czÄ…steczkÄ™\" z menu NarzÄ™dzia jest przydatna do polepszenia " "wyglÄ…du rysunku, np. wyrównanie pierÅ›cieni do foremnych czy lepsze uÅ‚ożenie " "atomów makroczÄ…steczki." #: dyk.cpp:66 msgid "" "It's possible to attach rings to structures by selecting a ring and clicking " "on an atom." msgstr "" "Można dołączyć pierÅ›cieÅ„ lub fragment struktury do narysowanego wczeÅ›niej " "atomu.W tym celu należy wybrać pierÅ›cieÅ„ lub strukturÄ™, a nastÄ™pnie kliknąć " "na pożądany atom." #: dyk.cpp:67 msgid "" "XDrawChem can automatically attach amino acids from N-terminal to C-terminal " "(but the result isn't always pretty :)" msgstr "" "XDrawChem może automatycznie dołączać aminokwasy z N-terminalnych do C-" "terminalnych." #: dyk.cpp:68 msgid "" "Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/" msgstr "" "Zawsze warto sprawdzić czy sÄ… uaktualnienia programu na stronie:\n" "http://xdrawchem.sourceforge.net/" #: dyk.cpp:69 msgid "" "XDrawChem can draw over 100,000 substances using its Internet database. " "Select Find on internet from the File menu to search for compounds." msgstr "Program XDrawChem jest w stanie narysować ponad 100 000 zwiÄ…zków wykorzystujÄ…c bazÄ™ internetowÄ…. Wybierz komendÄ™ Wyszukaj w internecie z menu Plik, aby przeszukać bazÄ™ zwiÄ…zków." #: dyk.cpp:70 msgid "" "XDrawChem can identify compounds by CAS number and occasionally by name. " "Select Molecule information from the Tools menu and click on a molecule. " "However, this only works if the compound is listed in the database." msgstr "" "Program XDrawChem może identyfikować zwiÄ…zki po ich numerze CAS oraz po nazwie w niektórych przypadkach. Wybierz komendÄ™ Charakterystyka czÄ…steczki z menu NarzÄ™dzia i kliknij czÄ…steczkÄ™. " "Jest to jednak skuteczne tylko w przypadku, jeÅ›li dany zwiÄ…zek znajduje siÄ™ już w bazie danych." #: fixeddialog.cpp:29 msgid "Set fixed angle and length" msgstr "Ustawienie dÅ‚ugoÅ›ci wiÄ…zaÅ„ i kÄ…tów" #: fixeddialog.cpp:32 msgid "Units:" msgstr "Jednostki:" #: fixeddialog.cpp:35 fixeddialog.cpp:253 pagesetupdialog.cpp:69 msgid "pixels" msgstr "piksele" #: fixeddialog.cpp:37 fixeddialog.cpp:256 pagesetupdialog.cpp:74 msgid "inches" msgstr "cale" #: fixeddialog.cpp:38 fixeddialog.cpp:259 pagesetupdialog.cpp:79 xruler.cpp:60 #: xruler.cpp:84 msgid "cm" msgstr "cm" #: fixeddialog.cpp:44 msgid "Bond fixed length:" msgstr "DÅ‚ugość wiÄ…zania:" #: fixeddialog.cpp:50 msgid "Bond fixed angle:" msgstr "KÄ…t miÄ™dzy wiÄ…zaniami:" #: fixeddialog.cpp:66 fixeddialog.cpp:91 msgid "degrees" msgstr "stopni" #: fixeddialog.cpp:69 msgid "Arrow fixed length:" msgstr "DÅ‚ugość strzaÅ‚ki:" #: fixeddialog.cpp:72 msgid "Arrow fixed angle:" msgstr "KÄ…t miÄ™dzy strzaÅ‚kami:" #: fixeddialog.cpp:94 msgid "Double bond spacing:" msgstr "Rozstaw wiÄ…zania podwójnego: " #: fixeddialog.cpp:110 msgid "Show grid" msgstr "Pokaż siatkÄ™" #: fixeddialog.cpp:111 msgid "Do not show grid" msgstr "Nie pokazuj siatki" #: fixeddialog.cpp:112 msgid "Show square grid" msgstr "Pokaż siatkÄ™ kwadratowÄ…" #: fixeddialog.cpp:113 msgid "Show hex grid" msgstr "Pokaż siatkÄ™ szeÅ›ciokÄ…tnÄ…" #: fixeddialog.cpp:116 msgid "Snap to grid" msgstr "PrzeciÄ…gnij do siatki" #: fixeddialog.cpp:122 msgid "Grid spacing" msgstr "Rozstaw linii siatki" #: fixeddialog.cpp:140 msgid "Default" msgstr "DomyÅ›lne" #: graphdialog.cpp:30 msgid "Print" msgstr "Drukuj" #: graphdialog.cpp:34 msgid "Export Peak List" msgstr "Eksportuj listÄ™ pików" #: graphdialog.cpp:38 molinfodialog.cpp:33 tool_13c_nmr.cpp:37 #: tool_1h_nmr.cpp:37 tool_ir.cpp:37 msgid "Help" msgstr "Pomoc" #: graphwidget.cpp:121 msgid "Red is reactant" msgstr "Czerwone, to substrat" #: graphwidget.cpp:124 msgid "Blue is product" msgstr "Niebieskie, to produkt" #: helpwindow.cpp:70 msgid "&Close" msgstr "Z&amknij" #: helpwindow.cpp:79 msgid "&Backward" msgstr "&Wstecz" #: helpwindow.cpp:82 msgid "&Forward" msgstr "&NastÄ™pne" #: helpwindow.cpp:84 msgid "&Home" msgstr "&Home" #: helpwindow.cpp:87 msgid "&About ..." msgstr "&O programie XDrawChem ..." #: helpwindow.cpp:90 msgid "&Go" msgstr "&Idź" #: helpwindow.cpp:106 msgid "Backward" msgstr "Wstecz" #: helpwindow.cpp:109 msgid "Forward" msgstr "NastÄ™pne" #: helpwindow.cpp:112 msgid "Home" msgstr "Home" #: main.cpp:145 msgid "untitled" msgstr "bez_nazwy" #: molecule_1h_nmr.cpp:50 msgid "Predicted 1H-NMR" msgstr "Symulacja 1H NMR" #: molecule_1h_nmr.cpp:65 msgid " Intensity: " msgstr "Intensywność: " #: molecule_1h_nmr.cpp:66 msgid " Multiplicity: " msgstr " Multipletowość: " #: molecule.cpp:89 msgid "Reactant" msgstr "Substrat" #: molecule.cpp:91 msgid "Product" msgstr "Produkt" #: molecule_tools_1.cpp:171 msgid "Predicted 13C-NMR" msgstr "Symulacja 13C NMR" #: molecule_tools_1.cpp:234 msgid "Predicted IR" msgstr "Symulacja IR" #: molecule_tools_1.cpp:248 msgid "~1350-1000, C-N" msgstr "~1350-1000, C-N" #: molecule_tools_1.cpp:250 msgid "~1300-1000, C-O" msgstr "~1300-1000, C-O" #: molecule_tools_1.cpp:254 msgid "~1660-1600, C=C (cis/vinyl strong; trans weak)" msgstr "~1660-1600, C=C (cis/winyl silne; trans sÅ‚abe)" #: molecule_tools_1.cpp:256 msgid "~1690-1640, C=N" msgstr "~1690-1640, C=N" #: molecule_tools_1.cpp:258 msgid "~1700 (narrow), C=O" msgstr "~1700 (wÄ…skie), C=O" #: molecule_tools_1.cpp:260 msgid "~1350-1300, S=O (~1050 if R-(S=O)-R')" msgstr "~1350-1300, S=O (~1050 jeÅ›li R-(S=O)-R')" #: molecule_tools_1.cpp:264 molecule_tools_1.cpp:351 molecule_tools_1.cpp:353 msgid "~2250 (narrow), nitrile" msgstr "~2250 (wÄ…skie), nitryl" #: molecule_tools_1.cpp:317 molecule_tools_1.cpp:319 molecule_tools_1.cpp:321 #: molecule_tools_1.cpp:323 molecule_tools_1.cpp:325 molecule_tools_1.cpp:327 #: molecule_tools_1.cpp:329 msgid "~3000 (broad), C-H" msgstr "~3000 (szerokie), C-H" #: molecule_tools_1.cpp:331 molecule_tools_1.cpp:339 molecule_tools_1.cpp:341 msgid "two peaks: ~3400, ~3300, primary N-H" msgstr "dwa sygnaÅ‚y: ~3400, ~3300, pierwszorzÄ™dowe N-H" #: molecule_tools_1.cpp:333 molecule_tools_1.cpp:335 molecule_tools_1.cpp:337 msgid "~3300 (broad), secondary N-H" msgstr "~3300 (szerokie), drugorzÄ™dowe N-H" #: molecule_tools_1.cpp:343 molecule_tools_1.cpp:345 molecule_tools_1.cpp:347 msgid "~2550 (broad), S-H" msgstr "~2550 (szerokie), S-H" #: molecule_tools_1.cpp:349 molecule_tools_1.cpp:359 molecule_tools_1.cpp:361 msgid "~3400 (broad), O-H" msgstr "~3400 (szerokie), O-H" #: molecule_tools_1.cpp:355 msgid "~2270 (narrow), -N=C=O" msgstr "~2270 (wÄ…skie), -N=C=O" #: molecule_tools_1.cpp:357 msgid "~2125 (narrow), -N=C=S" msgstr "~2125 (wÄ…skie), -N=C=S" #: molecule_tools_1.cpp:363 molecule_tools_1.cpp:365 msgid "~1525 (narrow), -NO2" msgstr "~1525 (wÄ…skie), -NO2" #: molecule_tools_1.cpp:367 msgid "~1600 (narrow), aromatic ring C=C" msgstr "~1600 (wÄ…skie), C=C pierÅ›cieÅ„ aromatyczny" #: molecule_tools_1.cpp:368 msgid "~1475 (narrow), aromatic ring C=C" msgstr "~1475 (wÄ…skie), C=C pierÅ›cieÅ„ aromatyczny" #: molecule_tools_1.cpp:580 msgid "10.5 (Guanidine)" msgstr "10,5 (guanidyna)" #: molecule_tools_1.cpp:600 msgid "9 (a-carbon between two ketones)" msgstr "9 (a-wÄ™giel miÄ™dzy dwoma ketonami)" #: molecule_tools_1.cpp:604 msgid "11 (a-carbon between two ketones)" msgstr "11 (a-wÄ™giel miÄ™dzy dwoma ketonami)" #: molecule_tools_1.cpp:608 msgid "11 (a-carbon between ketone and ester)" msgstr "11 (atom wÄ™gla miÄ™dzy ketonem i estrem)" #: molecule_tools_1.cpp:612 msgid "13 (a-carbon between two esters)" msgstr "13 (atom wÄ™gla miÄ™dzy dwoma estrami)" #: molecule_tools_1.cpp:621 msgid "5 (Aromatic primary amine)" msgstr "5 (pierwszorzÄ™dowa amina aromatyczna)" #: molecule_tools_1.cpp:627 msgid "9-10 (Alkene-primary amine)" msgstr "9-10 (pierwszorzÄ™dowa amina alkenowa)" #: molecule_tools_1.cpp:630 msgid "11 (Aliphatic primary amine)" msgstr "11 (pierwszorzÄ™dowa amina alifatyczna)" #: molecule_tools_1.cpp:642 msgid "-4 (pyrrole)" msgstr "-4 (pirol)" #: molecule_tools_1.cpp:647 msgid "14.4 (secondary amine)" msgstr "14,4 (amina drugorzÄ™dowa)" #: molecule_tools_1.cpp:652 msgid "11 (aliphatic secondary amine)" msgstr "11 (drugorzÄ™dowa amina alifatyczna)" #: molecule_tools_1.cpp:664 msgid "6.8 (conjugated secondary amine)" msgstr "6.8 (sprzężona amina drugorzÄ™dowa)" #: molecule_tools_1.cpp:668 msgid "5 (aromatic secondary amine)" msgstr "5 (aromatyczna amina drugorzÄ™dowa)" #: molecule_tools_1.cpp:672 molecule_tools_1.cpp:676 msgid "1-3 (purine/pyrimidine)" msgstr "1-3 (puryna/pirymidyna)" #: molecule_tools_1.cpp:687 msgid "4 (tertiary amine)" msgstr "4 (amina trzeciorzÄ™dowa)" #: molecule_tools_1.cpp:693 msgid "10 (aliphatic tertiary amine)" msgstr "10 (trzeciorzÄ™dowa amina alifatyczna)" #: molecule_tools_1.cpp:703 msgid "8 (Peroxy acid)" msgstr "8 (kwas nadtlenowy)" #: molecule_tools_1.cpp:720 msgid "-1 (sulfonic acid)" msgstr "-1 (kwas sulfonowy)" #: molecule_tools_1.cpp:734 msgid "4 (Aromatic carboxylic acid)" msgstr "4 (aromatyczny kwas karboksylowy)" #: molecule_tools_1.cpp:738 msgid "4.5 (Aliphatic carboxylic acid)" msgstr "4.5 (alifatyczny kwas karboksylowy)" #: molecule_tools_1.cpp:740 msgid "3 (Aliphatic carboxylic acid, a-halide)" msgstr "3 (alifatyczny kwas karboksylowy, a-halogenek)" #: molecule_tools_1.cpp:742 msgid "1.3 (Aliphatic carboxylic acid, 2 a-halide)" msgstr "1,3 (alifatyczny kwas karboksylowy, 2-a-halogenek)" #: molecule_tools_1.cpp:749 msgid "10 (Aromatic -OH)" msgstr "10 (aromatyczna grupa OH)" #: molecule_tools_1.cpp:751 msgid "16 (Aliphatic -OH)" msgstr "16 (alifatyczna grupa OH)" #: molecule_tools_1.cpp:761 msgid "7.8 (Aromatic -SH)" msgstr "7,8 (aromatyczna grupa SH)" #: molecule_tools_1.cpp:763 msgid "10.6 (Aliphatic -SH)" msgstr "10,6 (alifatyczna grupa SH)" #: molecule_tools_1.cpp:770 msgid "Estimated pKa's:" msgstr "Oszacowane pKa:" #: molecule_tools_1.cpp:780 msgid "There seem to be no sites with pKa between -1 and 15." msgstr "Brak fragmentów o wartoÅ›ciach pKa pomiÄ™dzy -1 i 15." #: molecule_tools_1.cpp:783 msgid "Estimated pKa's" msgstr "Oszacowane pKa" #: molecule_tools_2.cpp:462 msgid "Elemental analysis:\n" msgstr "Analiza elementarna:\n" #: molinfodialog.cpp:12 msgid "Molecule Info" msgstr "Charakterystyka czÄ…steczki" #: molinfodialog.cpp:14 molinfodialog.cpp:15 msgid "Name: " msgstr "Nazwa: " #: molinfodialog.cpp:17 molinfodialog.cpp:18 msgid "CAS: " msgstr "CAS: " #: molinfodialog.cpp:20 msgid "Molecular weight = " msgstr "Masa czÄ…steczkowa = " #: molinfodialog.cpp:23 molinfodialog.h:24 msgid "Formula = " msgstr "Wzór = " #: molinfodialog.cpp:26 msgid "Analysis = " msgstr "SkÅ‚ad pierwiastkowy = " #: myfiledialog.cpp:6 msgid "Transparent" msgstr "Przezroczysty" #: netdialog.cpp:42 msgid "Find structure via Internet" msgstr "Wyszukaj strukturÄ™ w internecie" #: netdialog.cpp:46 msgid "XDC database server:" msgstr "Serwer bazy danych XDC:" #: netdialog.cpp:54 msgid "Search type:" msgstr "Typ przeszukiwania:" #: netdialog.cpp:59 msgid "CAS Number" msgstr "Numer CAS" #: netdialog.cpp:60 msgid "Formula" msgstr "Wzór" #: netdialog.cpp:61 msgid "Chemical name" msgstr "Nazwa chemiczna" #: netdialog.cpp:64 msgid "Look for:" msgstr "Szukaj zwiÄ…zku:" #: netdialog.cpp:72 msgid "Exact matches only" msgstr "Tylko dokÅ‚adne dopasowania" #: netdialog.cpp:75 msgid "Search" msgstr "Szukaj" #: pagesetupdialog.cpp:19 msgid "Page setup" msgstr "Ustawienia strony" #: pagesetupdialog.cpp:22 msgid "Paper size:" msgstr "Rozmiar papieru:" #: pagesetupdialog.cpp:25 msgid "Letter (8.5\" x 11\")" msgstr "Letter (8.5\" x 11\")" #: pagesetupdialog.cpp:26 msgid "Legal (8.5\" x 14\")" msgstr "Legal (8.5\" x 14\")" #: pagesetupdialog.cpp:27 msgid "A4 (210 mm x 297 mm)" msgstr "A4 (210 mm x 297 mm)" #: pagesetupdialog.cpp:28 msgid "640x480 pixels" msgstr "640x480 pikseli" #: pagesetupdialog.cpp:29 msgid "800x600 pixels" msgstr "800x600 pikseli" #: pagesetupdialog.cpp:30 msgid "1024x768 pixels" msgstr "1024x768 pikseli" #: pagesetupdialog.cpp:31 msgid "Custom paper size" msgstr "Inny rozmiar papieru" #: pagesetupdialog.cpp:50 msgid "Orientation:" msgstr "Orientacja:" #: pagesetupdialog.cpp:53 msgid "Portrait" msgstr "Portret" #: pagesetupdialog.cpp:54 msgid "Landscape" msgstr "Pejzaż" #: pagesetupdialog.cpp:86 msgid "Page width:" msgstr "Szerokość strony:" #: pagesetupdialog.cpp:96 msgid "Page height:" msgstr "Wysokość strony:" #: peptidebuilder.cpp:12 msgid "Peptide Builder" msgstr "Konstruktor peptydów" #: peptidebuilder.cpp:18 msgid "" "Enter peptide sequence -\n" "three-letter abbreviations:" msgstr "" "Wprowadź sekwencjÄ™ peptydu -\n" "skróty trójliterowe" #: peptidebuilder.cpp:23 msgid "Shortcut: Hold 'Alt' and type one-letter codes!" msgstr "Usprawnienie: Przytrzymaj 'Alt' i wprowadź kody jednoliterowe!" #: render2d.cpp:125 render2d_event.cpp:696 render2d_event.cpp:1018 msgid "Select mode: left click on object to move, right click on object to edit" msgstr "" "Tryb zaznaczania: naciÅ›nij lewy przycisk, aby przesunąć obiekt lub prawy, " "aby obiekt edytować" #: render2d.cpp:136 msgid "Lasso mode: left click and hold to draw lasso" msgstr "Tryb lasso: naciÅ›nij i przytrzymaj lewy przycisk, aby zaznaczyć lassem." #: render2d.cpp:147 msgid "Draw Line mode: left click to draw line, right click to edit" msgstr "" "Tryb rysowania wiÄ…zaÅ„: naciÅ›nij lewy przycisk, aby narysować wiÄ…zanie lub " "prawy, aby je edytować" #: render2d.cpp:158 msgid "Draw Dashed Line mode: left click to draw line, right click to edit" msgstr "" "Tryb rysowania wiÄ…zaÅ„ przerywanych: naciÅ›nij lewy przycisk, aby narysować " "wiÄ…zanie lub prawy, aby je edytować" #: render2d.cpp:169 msgid "Draw Chain mode: left click and drag to draw aliphatic chain" msgstr "" "Tryb rysowania Å‚aÅ„cuchów: naciÅ›nij lewy przycisk i przeciÄ…gniej, aby " "narysować Å‚aÅ„cuch" #: render2d.cpp:180 msgid "Draw Stereo-Up Line mode: left click to draw line, right click to edit" msgstr "" "Tryb rysowania klina wypeÅ‚nionego: naciÅ›nij lewy przycisk, aby narysować " "klin lub prawy, aby go edytować" #: render2d.cpp:191 msgid "Draw Stereo-Down Line mode: left click to draw line, right click to edit" msgstr "" "Tryb rysowania klina przerywanego: naciÅ›nij lewy przycisk, aby narysować " "klin lub prawy, aby go edytować" #: render2d.cpp:202 msgid "Draw Wavy Line mode: left click to draw line, right click to edit" msgstr "" "Tryb rysowania wiÄ…zaÅ„ falowanych: naciÅ›nij lewy przycisk, aby narysować " "takie wiÄ…zanie lub prawy, aby je edytować" #: render2d.cpp:222 msgid "Draw Arrow mode: left click to draw arrow" msgstr "" "Tryb rysowania strzaÅ‚ek: naciÅ›nij lewy przycisk, aby narysować strzaÅ‚kÄ™ lub " "prawy, aby jÄ… edytować" #: render2d.cpp:240 msgid "Draw Bracket mode: left click to draw bracket" msgstr "Tryb rysowania nawiasów: naciÅ›nij lewy przycisk, aby narysować nawias" #: render2d.cpp:252 msgid "Erase mode: left click to erase object" msgstr "Tryb gumowania: naciÅ›nij lewy przycisk, aby wygumować obiekt" #: render2d.cpp:262 msgid "Text mode: left click to add or edit text" msgstr "Tryb dodawania tekstu: naciÅ›nij lewy przycisk, aby dodać lub edytować tekst" #: render2d.cpp:275 msgid "Draw Symbol mode: left click to add symbol" msgstr "Tryb dodawania symboli: naciÅ›nij lewy przycisk, aby dodać symbol" #: render2d.cpp:289 msgid "Draw graphic object: cubic bezier" msgstr "NarzÄ™dzie rysowania obiektów graficznych: krzywa Beziera" #: render2d.cpp:305 render2d.cpp:316 msgid "Left-click to draw Newman projection template" msgstr "Kliknij lewym przyciskiem, aby narysować szkielet projekcji Newmana." #: render2d.cpp:329 #, qt-format msgid "Draw Ring mode: left click to add %1" msgstr "Tryb rysowania pierÅ›cieni: kliknij lewym przyciskiem, aby dodać %1" #: render2d.cpp:353 msgid "Click on a molecule for information" msgstr "Kliknij czÄ…steczkÄ™, aby uzyskać jej charakterystykÄ™" #: render2d.cpp:356 render2d_event.cpp:1082 msgid "Click on a molecule to calculate its molecular weight" msgstr "Kliknij czÄ…steczkÄ™, aby obliczyć jej masÄ™ czÄ…steczkowÄ…" #: render2d.cpp:359 render2d_event.cpp:1095 msgid "Click on a molecule to calculate its empirical formula" msgstr "Kliknij czÄ…steczkÄ™, aby obliczyć jej wzór empiryczny" #: render2d.cpp:362 msgid "Click on a molecule to calculate its elemental analysis" msgstr "Kliknij czÄ…steczkÄ™, aby obliczyć jej skÅ‚ad pierwiastkowy" #: render2d.cpp:365 msgid "Click on a molecule to calculate its 13C NMR" msgstr "Kliknij czÄ…steczkÄ™, aby wygenerować jej widmo 13C NMR" #: render2d.cpp:368 msgid "Click on a molecule to calculate its 1H NMR" msgstr "Kliknij czÄ…steczkÄ™, aby wygenerować jej widmo 1H NMR" #: render2d.cpp:371 msgid "Click on a molecule to calculate its IR" msgstr "Kliknij czÄ…steczkÄ™, aby wygenerować jej widmo IR" #: render2d.cpp:374 msgid "Click on a molecule to calculate its pKa(s)" msgstr "Kliknij czÄ…steczkÄ™, aby oszacować jej pKa(s)" #: render2d.cpp:377 msgid "Click on a molecule for possible retrosynthesis" msgstr "Kliknij czÄ…steczkÄ™, aby wygenerować jej możliwÄ… retrosyntezÄ™." #: render2d.cpp:381 msgid "Click on a molecule to display its bond identifier" msgstr "Kliknij czÄ…steczkÄ™, aby wyÅ›wietlić rodzaje jej wiÄ…zaÅ„" #: render2d.cpp:384 msgid "Click on a molecule to calculate its octanol-water partition" msgstr "Kliknij czÄ…steczkÄ™, aby oszacować jej wsp. podziaÅ‚u oktanol-woda" #: render2d.cpp:387 msgid "Click on a molecule to generate 3-D coordinates" msgstr "Kliknij czÄ…steczkÄ™, aby wygenerować jej współrzÄ™dne 3-D" #: render2d.cpp:390 msgid "Click on a molecule to guess its name" msgstr "Kliknij czÄ…steczkÄ™, aby wygenerować jej nazwÄ™" #: render2d.cpp:393 msgid "Click on a molecule to determine its SMILES string" msgstr "Kliknij czÄ…steczkÄ™, aby wygenerować jej Å‚aÅ„cuch SMILES" #: render2d.cpp:396 msgid "Click on a molecule to clean up its structure" msgstr "Kliknij czÄ…steczkÄ™, aby jÄ… wyrównać" #: render2d.cpp:399 msgid "Click on a molecule to assign it as a reactant" msgstr "Kliknij czÄ…steczkÄ™, aby oznaczyć jÄ… jako substrat" #: render2d.cpp:402 msgid "Click on a molecule to assign it as a product" msgstr "Kliknij czÄ…steczkÄ™, aby oznaczyć jÄ… jako produkt" #: render2d.cpp:405 msgid "Click on a molecule to clear it group assignment" msgstr "Kliknij czÄ…steczkÄ™, aby wykasować jej przypisanie do grupy" #: render2d.cpp:408 msgid "Click on a molecule to save it as a custom ring" msgstr "Kliknij czÄ…steczkÄ™, aby zapisać jÄ… jako nowy pierÅ›cieÅ„" #: render2d.cpp:411 msgid "Tool test mode" msgstr "Tryb narzÄ™dzia testowego" #: render2d.cpp:414 msgid "Click on a molecule" msgstr "Kliknij czÄ…steczkÄ™" #: render2d.cpp:431 msgid "Select mode: left click to move, right click to edit" msgstr "Tryb zaznaczania: kliknij obiekt, który chcesz przesunąć" #: render2d.cpp:482 msgid "Undo!" msgstr "Cofnij!" #: render2d.cpp:484 msgid "Cannot undo, sorry!" msgstr "Nie można cofnąć!" #: render2d_event.cpp:134 msgid "No information." msgstr "Brak charakterystyki" #: render2d_event.cpp:145 msgid "Object information" msgstr "Informacja o obiekcie" #: render2d_event.cpp:187 msgid "Object" msgstr "Obiekt" #: render2d_event.cpp:189 msgid "Arrow" msgstr "StrzaÅ‚ka" #: render2d_event.cpp:191 msgid "Bond" msgstr "WiÄ…zanie" #: render2d_event.cpp:193 msgid "Bracket" msgstr "Nawias" #: render2d_event.cpp:195 msgid "Curved Arrow" msgstr "StrzaÅ‚ka zakrzywiona" #: render2d_event.cpp:197 msgid "Symbol" msgstr "Symbol" #: render2d_event.cpp:199 msgid "Text" msgstr "Tekst" #: render2d_event.cpp:202 msgid "Edit" msgstr "Edycja" #: render2d_event.cpp:204 render2d_event.cpp:211 msgid "Info" msgstr "Info" #: render2d_event.cpp:209 msgid "Molecule" msgstr "CzÄ…steczka" #: render2d_event.cpp:1008 msgid "Select mode: left click on object to move" msgstr "" "Tryb zaznaczania: naciÅ›nij lewy przycisk, aby przesunąć obiekt lub prawy, " "aby obiekt edytować" #: render2d_event.cpp:1079 render2d_event.cpp:1092 msgid ", click to paste into drawing" msgstr ", naciÅ›nij, aby wkleić do rysunku" #: render2d_event.cpp:1409 msgid "Draw Line - Length = " msgstr "Rysuj wiÄ…zanie - DÅ‚ugość = " #: render2d_event.cpp:1409 msgid ", Angle = " msgstr ", KÄ…t = " #: render2d_event.cpp:1440 msgid "Draw aliphatic chain - Length = " msgstr "Rysuj Å‚aÅ„cuch alifatyczny - DÅ‚ugość = " #: render2d_event.cpp:1440 msgid " bonds" msgstr " wiÄ…zania" #: render2d_text.cpp:106 msgid "Enter subscript" msgstr "Wprowadź indeks dolny" #: render2d_text.cpp:107 msgid "Please type or edit the subscript for this bracket:" msgstr "Wprowadź lub edytuj indeksy dolny dla wybranego nawiasu: " #: retro.cpp:26 msgid "No reactions found" msgstr "Nie znaleziono reakcji" #: retro.cpp:91 msgid "" "The following reactions could have resulted in this product:\n" "\n" msgstr "" "Poniższe reakcje mogÄ… prowadzić do takiego produktu:\n" "\n" #: retro.cpp:92 msgid "" "\n" "Target bonds will be highlighted in green.\n" "To see reactions affecting a highlighted bond, right-click on the bond and " "select Info.\n" "To clear highlights, select Undo from the Edit menu, or press Ctrl+Z." msgstr "" "\n" "Docelowe wiÄ…zania bÄ™dÄ… oznaczone kolorem zielonym.\n" "Aby uzyskać informacje dotyczÄ…ce reakcji wpÅ‚ywajÄ…cych na oznaczone wiÄ…znie, kliknij na to wiÄ…zanie prawym klawiszem i wybierz Info.\n" "Aby usunąć oznaczenie, wybierz komendÄ™ Cofnij z menu Edycja lub naciÅ›nij Ctrl + Z." #: retro.cpp:94 retro.cpp:96 msgid "Reverse reactions list" msgstr "Lista reakcji przeciwnych" #: retro.cpp:97 msgid "No reactions in the database could yield the selected molecule." msgstr "Å»adna reakcja z bazy nie prowadzi do zaznaczonej czÄ…steczki." #: ringdialog.cpp:37 msgid "Ring tool" msgstr "NarzÄ™dzie rysowania pierÅ›cieni" #: ringdialog.cpp:41 msgid "Choose a structure from list:" msgstr "Wybierz fragment z listy:" #: smilesdialog.cpp:30 msgid "Enter SMILES string" msgstr "Wprowadź Å‚aÅ„cuch SMILES" #: smilesdialog.cpp:31 msgid "Enter SMILES string:" msgstr "Wprowadź Å‚aÅ„cuch SMILES:" #: to3d.cpp:263 msgid "Save 3D file as..." msgstr "Zapisz 3D plik jako..." #: to3d.cpp:265 msgid "MDL molfile (*.mol)" msgstr "Plik czÄ…steczki MDL (*.mol)" #: tool_13c_nmr.cpp:26 msgid "13C NMR spectrum" msgstr "Widmo 13C NMR" #: tool_13c_nmr.cpp:57 tool_13c_nmr.cpp:68 tool_13c_nmr.cpp:79 msgid ", intensity " msgstr ", intensywność " #: tool_13c_nmr.cpp:63 tool_1h_nmr.cpp:61 tool_ir.cpp:61 msgid "Peaks of reactant:\n" msgstr "SygnaÅ‚y substratu:\n" #: tool_13c_nmr.cpp:74 tool_1h_nmr.cpp:72 tool_ir.cpp:72 msgid "Peaks of product:\n" msgstr "SygnaÅ‚y produktu:\n" #: tool_1h_nmr.cpp:26 msgid "1H NMR spectrum" msgstr "Widmo 1H NMR" #: tool_ir.cpp:26 msgid "IR spectrum" msgstr "Widmo IR" #: xruler.cpp:58 xruler.cpp:82 msgid "px" msgstr "px" #: xruler.cpp:59 xruler.cpp:83 msgid "in" msgstr "cali" #: http.h:21 msgid "Accessing network" msgstr "ÅÄ…czenie z sieciÄ…" #: http.h:24 msgid "Please wait." msgstr "ProszÄ™ czekać" #: molinfodialog.h:34 msgid "CAS:" msgstr "CAS:" #: molinfodialog.h:40 msgid "Name:" msgstr "Nazwa:" xdrawchem-v1.11.0/translation/xdrawchem-ru.po000066400000000000000000001437521371466245600213000ustar00rootroot00000000000000# Russian translation of xdrawchem. # This file is distributed under the same license as the xdrawchem package. # Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER. # Copyright (C) 2004, The Free Software Foundation # Vitaly Lipatov , 2004. # Roman Borisyuk , 2004. msgid "" msgstr "" "Project-Id-Version: xdrawchem 1.8.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-03-18 03:20+0100\n" "PO-Revision-Date: 2004-08-01 16:03MSK\n" "Last-Translator: Vitaly Lipatov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=KOI8-R\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.3.1\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: application.cpp:159 msgid "" "Click this button to open a file.

    You can also select the Open " "command from the File menu." msgstr "" #: application.cpp:160 msgid "" "Click this button to save the file you are editing.

    You can also " "select the Save command from the File menu.

    " msgstr "" "îÁÖÍÉÔÅ ÜÔÕ ËÎÏÐËÕ, ÞÔÏÂÙ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ, ËÏÔÏÒÙÊ ×Ù ÒÅÄÁËÔÉÒÕÅÔÅ.

    " "÷Ù ÔÁËÖÅ ÍÏÖÅÔÅ ×ÙÂÒÁÔØ ËÏÍÁÎÄÕ ÓÏÈÒÁÎÉÔØ × ÍÅÎÀ æÁÊÌ

    " #: application.cpp:161 #, fuzzy msgid "" "Click this button to print the file you are editing.

    You can also " "select the Print command from the File menu." msgstr "ÄÏ

    îÁÐÅÞÁÔÁÔØ ËÏÍÁÎÄÁ æÁÊÌ." #: application.cpp:162 msgid "" "Click this button to cut a selection.

    You can also select the Cut " "command from the Edit menu, or press Ctrl+X." msgstr "" #: application.cpp:163 msgid "" "Click this button to copy a selection.

    You can also select the Copy " "command from the Edit menu, or press Ctrl+C." msgstr "" #: application.cpp:164 msgid "" "Click this button to paste a selection.

    You can also select the Paste " "command from the Edit menu, or press Ctrl+V." msgstr "" #: application.cpp:165 #, fuzzy msgid "Click this button to zoom in." msgstr "." #: application.cpp:166 msgid "Click this button to zoom out." msgstr "" #: application.cpp:169 msgid "" "Select tool

    Use the Select tool to select and move items inside a box." "

    You can select multiple items and cut, copy, move and rotate them." msgstr "" #: application.cpp:170 msgid "" "Lasso tool

    Use the Lasso tool to select and move items by drawing a " "loop around them.

    You can select multiple items and cut, copy, move " "and rotate them." msgstr "" #: application.cpp:171 msgid "Erase tool

    Use the Erase tool to erase individual items." msgstr "" #: application.cpp:172 msgid "" "Line tool

    Use the Line tool to draw bonds. Draw over existing bonds " "to create double and triple bonds." msgstr "" #: application.cpp:173 msgid "" "Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw " "over existing bonds to add dashed lines (to indicate resonance, etc.)." msgstr "" #: application.cpp:174 msgid "" "Chain tool

    Use the Chain tool to draw aliphatic chains. The length " "of each segment is the current bond length." msgstr "" #: application.cpp:175 msgid "" "Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as " "shown on the button." msgstr "" #: application.cpp:176 msgid "" "Stereo Down Line tool

    Use the Line tool to draw stereo-down lines, as " "shown on the button." msgstr "" #: application.cpp:177 msgid "" "Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on " "the button." msgstr "" #: application.cpp:178 msgid "" "Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click " "to draw a straight arrow.

    Click and hold to pick from a list of " "available arrows." msgstr "" #: application.cpp:179 msgid "" "Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows." "

    Click and hold to select from a picture menu of arrows." msgstr "" #: application.cpp:180 msgid "" "Bracket tool

    Use the Bracket tool to draw brackets and parentheses." "

    Click to draw square brackets.

    Click and hold to select from " "a picture menu of brackets." msgstr "" #: application.cpp:181 msgid "" "Text tool

    Use the Text tool to add text and label atoms and points." "
    (See manual for info on formatting text)" msgstr "" #: application.cpp:182 msgid "" "Ring tool

    Use the Ring tool to insert ready-made rings and structures." "

    Click to open the ring dialog, which allows selection from a list of " "all built-in rings and structures.

    Click and hold to select from a " "picture menu of select rings.
    (See manual for more info on modifying this " "menu)" msgstr "" #: application.cpp:183 msgid "" "Symbol tool

    Use the Symbol tool to insert symbols.

    Click and " "hold to select from a picture menu of symbols.
    " msgstr "" #: application.cpp:218 msgid "File Operations" msgstr "ïÐÅÒÁÃÉÉ Ó ÆÁÊÌÁÍÉ" #: application.cpp:223 msgid "Open file" msgstr "ïÔËÒÙÔØ ÆÁÊÌ" #: application.cpp:230 msgid "Save file" msgstr "óÏÈÒÁÎÉÔØ ÆÁÊÌ" #: application.cpp:237 msgid "Print file" msgstr "îÁÐÅÞÁÔÁÔØ ÆÁÊÌ" #: application.cpp:244 render2d_event.cpp:213 msgid "Cut" msgstr "÷ÙÒÅÚÁÔØ" #: application.cpp:251 render2d_event.cpp:214 msgid "Copy" msgstr "úÁÐÏÍÎÉÔØ" #: application.cpp:258 msgid "Paste" msgstr "÷ÓÔÁ×ÉÔØ" #: application.cpp:265 msgid "Zoom In" msgstr "õ×ÅÌÉÞÉÔØ" #: application.cpp:272 msgid "Zoom Out" msgstr "õÍÅÎØÛÉÔØ" #: application.cpp:286 msgid "Set drawing color" msgstr "õÓÔÁÎÏ×ÉÔØ Ã×ÅÔ ÒÉÓÏ×ÁÎÉÑ" #: application.cpp:290 msgid "Set line thickness" msgstr "õÓÔÁÎÏ×ÉÔØ ÔÏÌÝÉÎÕ ÌÉÎÉÉ" #: application.cpp:291 msgid "Set Line Thickness" msgstr "õÓÔÁÎÏ×ÉÔØ ÔÏÌÝÉÎÕ ÌÉÎÉÉ" #: application.cpp:305 msgid "Set font" msgstr "" #: application.cpp:306 msgid "Set Font" msgstr "õÓÔÁÎÏ×ÉÔØ ÛÒÉÆÔ" #: application.cpp:315 msgid "Set font size" msgstr "õÓÔÁÎÏ×ÉÔØ ÒÁÚÍÅÒ ÛÒÉÆÔÁ" #: application.cpp:316 msgid "Set Font Size" msgstr "õÓÔÁÎÏ×ÉÔØ ÒÁÚÍÅÒ ÛÒÉÆÔÁ" #: application.cpp:330 msgid "Left-justify selected text" msgstr "÷ÙÒÏ×ÎÑÔØ ×ÙÄÅÌÅÎÎÙÊ ÔÅËÓÔ ÐÏ ÌÅ×ÏÍÕ ËÒÁÀ" #: application.cpp:338 msgid "Center selected text" msgstr "ãÅÎÔÒÉÒÏ×ÁÔØ ×ÙÄÅÌÅÎÎÙÊ ÛÒÉÆÔ" #: application.cpp:346 msgid "Right-justify selected text" msgstr "÷ÙÒÏ×ÎÑÔØ ×ÙÂÒÁÎÎÙÊ ÔÅËÓÔ ÐÏ ÐÒÁ×ÏÍÕ ËÒÁÀ" #: application.cpp:354 msgid "Make selected text bold (Ctrl+B)" msgstr "óÄÅÌÁÔØ ×ÙÄÅÌÅÎÎÙÊ ÔÅËÓÔ ÐÏÌÕÖÉÒÎÙÍ (Ctrl+B)" #: application.cpp:364 msgid "Italicize selected text (Ctrl+I)" msgstr "óÄÅÌÁÔØ ËÕÒÓÉ×ÎÙÍ ×ÙÄÅÌÅÎÎÙÊ ÔÅËÓÔ (Ctrl-I)" #: application.cpp:374 msgid "Underline selected text (Ctrl+U)" msgstr "óÄÅÌÁÔØ ×ÙÄÅÌÅÎÎÙÊ ÔÅËÓÔ ÐÏÄÞ£ÒËÎÕÔÙÍ (Ctrl+U)" #: application.cpp:384 msgid "Superscript selected text (Ctrl-Plus)" msgstr "óÄÅÌÁÔØ ×ÙÄÅÌÅÎÎÙÊ ÔÅËÓÔ ×ÅÒÈÎÉÍ ÉÎÄÅËÓÏÍ (Ctrl-Plus)" #: application.cpp:395 msgid "Subscript selected text (Ctrl-Minus)" msgstr "óÄÅÌÁÔØ ×ÙÄÅÌÅÎÎÙÊ ÔÅËÓÔ ÎÉÖÎÉÍ ÉÎÄÅËÓÏÍ (Ctrl-Minus)" #: application.cpp:411 netchoosedialog.cpp:83 render2d_event.cpp:212 msgid "Select" msgstr "÷ÙÂÒÁÔØ" #: application.cpp:418 msgid "Lasso" msgstr "ìÁÓÓÏ" #: application.cpp:425 msgid "Erase" msgstr "óÔÅÒÅÔØ" #: application.cpp:432 msgid "Draw line" msgstr "òÉÓÏ×ÁÎÉÅ ÌÉÎÉÉ" #: application.cpp:440 msgid "Draw dashed line" msgstr "òÉÓÏ×ÁÎÉÅ ÐÕÎËÔÉÒÎÏÊ ÌÉÎÉÉ" #: application.cpp:448 msgid "Draw aliphatic chain" msgstr "òÉÓÏ×ÁÎÉÅ ÚÉÇÚÁÇÏÏÂÒÁÚÎÏÊ ÌÉÎÉÉ" #: application.cpp:456 msgid "Draw stereo-up line" msgstr "" #: application.cpp:464 msgid "Draw stereo-down line" msgstr "" #: application.cpp:472 #, fuzzy msgid "Draw wavy bond" msgstr "òÉÓÏ×ÁÎÉÅ ×ÏÌÎÉÓÔÏÊ ÌÉÎÉÉ" #: application.cpp:480 msgid "Draw arrow" msgstr "ïÂÏÚÎÁÞÅÎÉÅ ÓÔÒÅÌËÉ-ÕËÁÚÁÔÅÌÑ" #: application.cpp:490 msgid "Draw curved arrow" msgstr "ïÂÏÚÎÁÞÅÎÉÅ ÉÚÏÇÎÕÔÏÊ ÓÔÒÅÌËÉ-ÕËÁÚÁÔÅÌÑ " #: application.cpp:500 msgid "Draw bracket" msgstr "ïÂÏÚÎÁÞÅÎÉÅ ÓËÏÂÏË-ÒÁÚÄÅÌÉÔÅÌÅÊ" #: application.cpp:510 msgid "Draw or edit text" msgstr "óÏÓÔÁ×ÌÅÎÉÅ ÉÌÉ ÒÅÄÁËÔÉÒÏ×ÁÎÉÅ ÔÅËÓÔÁ" #: application.cpp:518 msgid "Draw ring" msgstr "ïÂÏÚÎÁÞÅÎÉÅ ÃÉËÌÉÞÅÓËÏÊ ÓÔÒÕËÔÕÒÙ" #: application.cpp:529 #, fuzzy msgid "Draw symbol" msgstr "òÉÓÏ×ÁÎÉÅ" #: application.cpp:537 msgid "Canned Structures" msgstr "çÏÔÏ×ÙÅ ÓÔÒÕËÔÕÒÎÙÅ ÆÏÒÍÕÌÙ ×ÅÝÅÓÔ×" #: application.cpp:545 msgid "Cyclopropane" msgstr "ãÉËÌÏÐÒÏÐÁÎ" #: application.cpp:553 msgid "Cyclobutane" msgstr "ãÉËÌÏÂÕÔÁÎ" #: application.cpp:561 msgid "Cyclopentane" msgstr "ãÉËÌÏÐÅÎÔÁÎ" #: application.cpp:569 msgid "Cyclopentadiene" msgstr "ãÉËÌÏÐÅÎÔÁÄÉÅÎ" #: application.cpp:577 msgid "Cyclohexane" msgstr "ãÉËÌÏÇÅËÓÁÎ" #: application.cpp:585 msgid "Cyclohexane - chair conformation" msgstr "ãÉËÌÏÇÅËÓÁÎ - ÆÒÏÎÔÁÌØÎÁÑ ÆÏÒÍÁ" #: application.cpp:593 msgid "Cyclohexane - boat conformation" msgstr "ãÉËÌÏÇÅËÓÁÎ - ÐÒÏÓÔÒÁÎÓÔ×ÅÎÎÁÑ ÆÏÒÍÁ" #: application.cpp:601 msgid "Benzene" msgstr "âÅÎÚÏÌ" #: application.cpp:611 helpwindow.cpp:89 msgid "&File" msgstr "&æÁÊÌ" #: application.cpp:613 msgid "&New" msgstr "&óÏÚÄÁÔØ" #: application.cpp:615 msgid "&Open" msgstr "&ïÔËÒÙÔØ" #: application.cpp:620 msgid "&Find on Internet" msgstr "&îÁÊÔÉ × éÎÔÅÒÎÅÔ" #: application.cpp:624 msgid "&Save" msgstr "&óÏÈÒÁÎÉÔØ" #: application.cpp:628 msgid "Save &as..." msgstr "óÏÈÒÁÎÉÔØ &ËÁË..." #: application.cpp:630 msgid "Save picture..." msgstr "óÏÈÒÁÎÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ..." #: application.cpp:633 msgid "Pa&ge setup" msgstr "ðÁÒÁÍ&ÅÔÒÙ ÓÔÒÁÎÉÃÙ" #: application.cpp:634 helpwindow.cpp:68 msgid "&Print" msgstr "&ðÅÞÁÔØ" #: application.cpp:638 graphdialog.cpp:42 tool_13c_nmr.cpp:41 #: tool_1h_nmr.cpp:41 tool_ir.cpp:41 msgid "Close" msgstr "úÁËÒÙÔØ" #: application.cpp:639 msgid "Quit" msgstr "÷ÙÊÔÉ" #: application.cpp:642 msgid "Rotate 90 degrees clockwise" msgstr "÷ÒÁÝÅÎÉÅ ÎÁ 90 ÇÒÁÄÕÓÏ× ÐÏ ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÅ" #: application.cpp:644 msgid "Rotate 180 degrees" msgstr "÷ÒÁÝÅÎÉÅ ÎÁ 180 ÇÒÁÄÕÓÏ×" #: application.cpp:645 msgid "Rotate 90 degrees counterclockwise" msgstr "÷ÒÁÝÅÎÉÅ ÎÁ 90 ÇÒÁÄÕÓÏ× ÐÒÏÔÉ× ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ" #: application.cpp:649 msgid "Flip &horizontal" msgstr "ïÔÏÂÒÁÚÉÔØ ÇÏÒÉÚÏÎÔÁÌØÎÏ" #: application.cpp:650 msgid "Flip &vertical" msgstr "ïÔÏÂÒÁÚÉÔØ ×ÅÒÔÉËÁÌØÎÏ" #: application.cpp:653 msgid "Normal (100%)" msgstr "îÏÒÍÁÌØÎÙÊ (100%)" #: application.cpp:655 msgid "Zoom out" msgstr "ïÔÄÁÌÉÔØ" #: application.cpp:656 msgid "Zoom in" msgstr "ðÒÉÂÌÉÚÉÔØ" #: application.cpp:670 msgid "&Edit" msgstr "&ðÒÁ×ËÁ" #: application.cpp:672 msgid "&Undo" msgstr "ïÔÍÅÎÉÔØ" #: application.cpp:673 #, fuzzy msgid "&Insert symbol" msgstr "òÉÓÏ×ÁÎÉÅ" #: application.cpp:677 msgid "Cu&t" msgstr "÷&ÙÒÅÚÁÔØ" #: application.cpp:678 msgid "&Copy" msgstr "&úÁÐÏÍÎÉÔØ" #: application.cpp:679 msgid "&Paste" msgstr "&÷ÓÔÁ×ÉÔØ" #: application.cpp:680 msgid "Clear" msgstr "ïÞÉÓÔÉÔØ" #: application.cpp:682 msgid "Select &All" msgstr "÷ÙÄÅÌÉÔØ &×Ó£" #: application.cpp:683 msgid "&Deselect All" msgstr "&ïÔÍÅÎÉÔØ ×Ó£ ×ÙÄÅÌÅÎÉÅ" #: application.cpp:685 msgid "&Rotate" msgstr "&ðÏ×ÅÒÎÕÔØ" #: application.cpp:686 msgid "&Flip" msgstr "&ïÔÒÁÚÉÔØ" #: application.cpp:688 msgid "&Zoom" msgstr "&íÁÓÛÔÁÂ" #: application.cpp:691 msgid "&Group" msgstr "&çÒÕÐÐÁ" #: application.cpp:692 msgid "Select &Reactant" msgstr "÷ÙÂÒÁÔØ &ðÏ×ÔÏÒÉÔØ" #: application.cpp:694 msgid "Select &Product" msgstr "÷ÙÂÒÁÔØ &ðÒÏÄÕËÔ" #: application.cpp:696 msgid "Clear &group" msgstr "ïÞÉÓÔÉÔØ &ÇÒÕÐÐÕ" #: application.cpp:698 msgid "Clear all &groups" msgstr "ïÞÉÓÔÉÔØ ×ÓÅ &ÇÒÕÐÐÙ" #: application.cpp:703 msgid "Forma&t" msgstr "æÏÒÍÁ&Ô" #: application.cpp:705 msgid "&Bond - Fixed length and angle" msgstr "&ìÉÎÉÉ Ó×ÑÚÉ ÆÉËÓÉÒÕÀÔÓÑ ÄÌÉÎÏÊ É ÕÇÌÏÍ" #: application.cpp:708 msgid "&Arrow - Fixed length and angle" msgstr "&óÔÒÅÌËÉ-ÕËÁÚÁÔÅÌÉ ÆÉËÓÉÒÕÀÔÓÑ ÄÌÉÎÏÊ É ÕÇÌÏÍ" #: application.cpp:711 msgid "Automatically Add &hydrogens" msgstr "á×ÔÏÍÁÔÉÞÅÓËÉ äÏÂÁ×ÌÑÔØ &ÉÏÎÙ ×ÏÄÏÒÏÄÁ" #: application.cpp:715 msgid "Set background &color" msgstr "îÁÓÔÒÏÊËÁ ÆÏÎÁ" #: application.cpp:717 msgid "Toggle &grid" msgstr "÷ËÌÀÞÉÔØ ÓÅÔËÕ" #: application.cpp:719 msgid "&Drawing settings..." msgstr "çÒÁÆÉÞÅÓËÉÅ ÎÁÓÔÒÏÊËÉ" #: application.cpp:721 #, fuzzy msgid "&XDC settings..." msgstr "çÒÁÆÉÞÅÓËÉÅ ÎÁÓÔÒÏÊËÉ" #: application.cpp:726 msgid "Estimate gas-phase enthalphy change" msgstr "ïÃÅÎÉÔØ ÉÚÍÅÎÅÎÉÑ ÇÁÚÏ×ÏÊ ÆÏÒÍÙ ÜÎÔÁÌØÐÉÉ" #: application.cpp:728 msgid "Compare 1H NMR" msgstr "óÒÁ×ÎÉÔØ 1H NMR" #: application.cpp:730 msgid "Compare 13C NMR" msgstr "óÒÁ×ÎÉÔØ 13C NMR" #: application.cpp:737 #, fuzzy msgid "Reverse reactions" msgstr "äÅÊÓÔ×ÉÅ" #: application.cpp:743 msgid "Get bond identifier" msgstr "ðÏÌÕÞÉÔØ Ó×ÑÚÎÏÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ" #: application.cpp:747 msgid "T&ools" msgstr "éÎÓÔÒÕÍÅÎÔÙ" #: application.cpp:748 msgid "Clean up molecule" msgstr "ïÞÉÓÔÉÔØ ÍÏÌÅËÕÌÕ" #: application.cpp:749 msgid "Auto &layout" msgstr "á×ÔÏÍÁÔÉÞÅÓËÉÊ &ÍÁËÅÔ" #: application.cpp:750 msgid "Create custom ring" msgstr "óÏÚÄÁÔØ ÓÏÂÓÔ×ÅÎÎÕÀ ÃÉËÌÉÞÅÓËÕÀ ÓÔÒÕËÔÕÒÕ " #: application.cpp:753 msgid "Molecule information..." msgstr "íÏÌÅËÕÌÑÒÎÁÑ ÉÎÆÏÒÍÁÃÉÑ" #: application.cpp:755 #, fuzzy msgid "Predict 1H NMR" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ 13C NMR" #: application.cpp:756 msgid "Predict 13C NMR" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ 13C NMR" #: application.cpp:757 msgid "Predict IR" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ IR" #: application.cpp:758 msgid "Predict pKa" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ pKa" #: application.cpp:759 msgid "Predict octanol-water partition (Kow)" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ ËÏÎÓÔÁÎÔÕ ÄÉÓÓÏÃÉÁÃÉÉ ×ÏÄÙ (Kow)" #: application.cpp:760 msgid "Reaction" msgstr "äÅÊÓÔ×ÉÅ" #: application.cpp:762 #, fuzzy msgid "Input SMILES" msgstr "÷ÓÔÁ×ÉÔØ ÆÁÊÌ" #: application.cpp:763 #, fuzzy msgid "Output SMILES" msgstr "÷ÙÈÏÄ" #: application.cpp:765 msgid "Build 3D model of molecule" msgstr "" #: application.cpp:771 helpwindow.cpp:92 msgid "&Help" msgstr "ðÏÍÏÝØ" #: application.cpp:773 msgid "&Manual" msgstr "òÕËÏ×ÏÄÓÔ×Ï" #: application.cpp:774 msgid "&Did You Know?" msgstr "÷Ù ÚÎÁÌÉ ?" #: application.cpp:775 msgid "&About" msgstr "ï ÐÒÏÇÒÁÍÍÅ" #: application.cpp:776 msgid "&Support" msgstr "ðÏÄÄÅÒÖËÁ" #: application.cpp:777 msgid "&References" msgstr "óÓÙÌËÉ" #: application.cpp:779 msgid "What's &This" msgstr "þÔÏ ÜÔÏ?" #: application.cpp:857 msgid "Newman projection symbol" msgstr "" #: application.cpp:858 msgid "Newman projection - staggered (anti)" msgstr "" #: application.cpp:859 msgid "Newman projection - eclipsed" msgstr "" #: application.cpp:914 msgid "Cubic bezier" msgstr "ëÕÂÉÞÅÓËÏÅ âÅÚØÅ" #: application.cpp:917 msgid "Cubic bezier - half arrow" msgstr "ëÕÂÉÞÅÓËÏÅ âÅÚØÅ - ÐÏÌÏ×ÉÎÁ ÓÔÒÅÌËÉ-ÕËÁÚÁÔÅÌÑ" #: application.cpp:920 msgid "Cubic bezier - full arrow" msgstr "ëÕÂÉÞÅÓËÏÅ âÅÚØÅ - ÐÏÌÎÁÑ ÓÔÒÅÌËÁ-ÕËÁÚÁÔÅÌØ" #: application.cpp:966 application_ring.cpp:347 msgid "User-defined" msgstr "ðÏÌØÚÏ×ÁÔÅÌØÓËÉÊ ×ÙÂÏÒ" #: application.cpp:1152 application_ob.cpp:95 msgid "Couldn't open file" msgstr "îÅ ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÆÁÊÌ" #: application.cpp:1152 application_ob.cpp:95 msgid "Could not open the file: " msgstr "îÅ ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÆÁÊÌ " #: application.cpp:1153 application.cpp:1161 application_ob.cpp:96 #: application_ob.cpp:104 msgid "Unable to load " msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÒÏÉÚ×ÅÓÔÉ ÚÁÇÒÕÚËÕ " #: application.cpp:1167 application_ob.cpp:110 application_ob.cpp:137 msgid "Loaded document " msgstr "äÏËÕÍÅÎÔ ÚÁÇÒÕÖÅÎ " #: application.cpp:1191 application_ob.cpp:187 application_ob.cpp:198 msgid "Could not write to " msgstr "úÁÐÉÓØ ÎÅ×ÏÚÍÏÖÎÁ " #: application.cpp:1197 application_ob.cpp:191 application_ob.cpp:202 #: application_ob.cpp:235 msgid "Saved file " msgstr "æÁÊÌ ÓÏÈÒÁÎÅÎ" #: application.cpp:1249 msgid "Save as picture..." msgstr "óÏÈÒÁÎÉÔØ ËÁË ÉÚÏÂÒÁÖÅÎÉÅ..." #: application.cpp:1284 application.cpp:1296 application.cpp:1302 msgid "Saved picture file " msgstr "çÒÁÆÉÞÅÓËÉÊ ÆÁÊÌ ÓÏÈÒÁÎÅÎ" #: application.cpp:1286 application.cpp:1298 application.cpp:1304 msgid "Unable to save picture!" msgstr "îÅ×ÏÚÍÏÖÎÏ ÓÏÈÒÁÎÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ !" #: application.cpp:1358 msgid "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Please subscribe to the mailing list for information about future releases.\n" "Send a message to xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n" "\n" "XDrawChem is copyright (C) 2004 Bryan Herger.\n" "Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint " "project\n" "OpenBabel code copyright (C) 2003 by the OpenBabel project team.\n" "See file COPYRIGHT.txt for more details" msgstr "" #: application.cpp:1362 msgid "How to get help" msgstr "ëÁË ÐÏÌÕÞÉÔØ ÐÏÍÏÝØ" #: application.cpp:1363 msgid "" "Current information on XDrawChem can always be found at\n" "http://xdrawchem.sourceforge.net/\n" "The latest release will be posted here, as well as links to mailing lists " "and the bug tracker.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "You can contact the author directly at\n" "bherger@users.sourceforge.net" msgstr "" "÷Ù ÍÏÖÅÔÅ ÎÁÊÔÉ ÐÏÓÌÅÄÎÀÀ ÉÎÆÏÒÍÁÃÉÀ ÐÏ XDrawChem\n" "ÎÁ ÓÁÊÔÅ http://xdrawchem.sourceforge.net/\n" "ôÁÍ ÐÕÂÌÉËÕÅÔÓÑ ÉÎÆÏÒÍÁÃÉÑ Ï ÐÏÓÌÅÄÎÉÈ ÒÅÌÉÚÁÈ, ÔÁË ÖÅ ËÁË ÓÓÙÌËÉ ÎÁ ÓÐÉÓËÉ " "ÒÁÓÓÙÌËÉ É ÓÉÓÔÅÍÕ ÓÏÏÂÝÅÎÉÑ Ï ÎÁÊÄÅÎÎÙÈ ÏÛÉÂËÁÈ.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "÷Ù ÍÏÖÅÔÅ Ó×ÑÚÁÔØÓÑ ÎÁÐÒÑÍÕÀ Ó Á×ÔÏÒÏÍ:\n" "bherger@users.sourceforge.net" #: application.cpp:1443 msgid "Database query failed" msgstr "úÁÐÒÏÓ ÎÅ×ÏÚÍÏÖÅÎ" #: application.cpp:1443 msgid "No molecules in the database match the query." msgstr "îÅÔ ÚÁÐÒÁÛÉ×ÁÅÍÙÈ ÍÏÌÅËÕÌ × ÂÁÚÅ ÄÁÎÎÙÈ" #: application.cpp:1679 application.cpp:1687 application.cpp:1694 #: application.cpp:1701 #, fuzzy, qt-format msgid "Zoom = %1 %" msgstr "íÁÓÛÔÁÂ" #: application.cpp:1705 msgid "XDC Settings" msgstr "" #: application.cpp:1706 msgid "Change XDrawChem settings:" msgstr "" #: application.cpp:1707 msgid "&Main font" msgstr "" #: application.cpp:1707 msgid "&Ruler font" msgstr "" #: application.cpp:1708 bondedit.cpp:252 charsel.cpp:68 crings_dialog.cpp:137 #: fixeddialog.cpp:144 molinfodialog.cpp:37 netchoosedialog.cpp:88 #: netdialog.cpp:80 pagesetupdialog.cpp:109 peptidebuilder.cpp:78 #: ringdialog.cpp:55 smilesdialog.cpp:41 msgid "Cancel" msgstr "ïÔÍÅÎÉÔØ" #: application_ob.cpp:35 tool_2d3d.cpp:92 msgid "--Select a filter-- (*)" msgstr "÷ÙÂÒÁÔØ ÆÉÌØÔÒ" #: application_ob.cpp:38 msgid "CDXML - ChemDraw text/XML format (*)" msgstr "" #: application_ob.cpp:41 msgid "CDX - ChemDraw binary format (*)" msgstr "" #: application_ob.cpp:44 msgid "XDC - XDrawChem native format (*)" msgstr "" #: application_ob.cpp:68 msgid "Open file..." msgstr "ïÔËÒÙÔØ ÆÁÊÌ..." #: application_ob.cpp:83 application_ob.cpp:162 tool_2d3d.cpp:113 msgid "Could not determine file type" msgstr "îÅ×ÏÚÍÏÖÎÏ ÏÐÒÅÄÅÌÉÔØ ÔÉÐ ÆÁÊÌÁ" #: application_ob.cpp:84 application_ob.cpp:163 tool_2d3d.cpp:114 msgid "Please select a file type from the list." msgstr "ðÏÖÁÊÌÕÓÔÁ, ×ÙÂÅÒÉÔÅ ÔÉÐ ÆÁÊÌÁ ÉÚ ÓÐÉÓËÁ." #: application_ob.cpp:126 msgid "Problem while opening the file" msgstr "ðÒÏÂÌÅÍÁ ÐÒÉ ÏÔËÒÙÔÉÉ ÆÁÊÌÁ" #: application_ob.cpp:127 msgid "Cannot open the specified file." msgstr "îÅ ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÕËÁÚÁÎÎÙÊ ÆÁÊÌ." #: application_ob.cpp:150 tool_2d3d.cpp:107 msgid "Save file as..." msgstr "óÏÈÒÁÎÉÔØ ÆÁÊÌ ËÁË..." #: application_ob.cpp:155 msgid "Overwrite file?" msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ?" #: application_ob.cpp:155 #, qt-format msgid "Overwrite existing file: %1 ?" msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ: %1 ?" #: application_ob.cpp:221 msgid "IOIface Data error" msgstr "IOIface ÏÛÉÂËÁ ÄÁÎÎÙÈ" #: application_ob.cpp:222 msgid "" "Cannot convert the molecule.\n" "Conversion failed in ioiface.cpp" msgstr "" "ðÒÅ×ÒÁÝÅÎÉÅ ÍÏÌÅËÕÌÙ ÎÅ×ÏÚÍÏÖÎÏ.\n" "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÎÁÒÕÛÉÌÏÓØ × ÆÁÊÌÅ ioiface.cpp" #: application_ob.cpp:228 tool_2d3d.cpp:133 msgid "Problem while writing the file" msgstr "ðÒÏÂÌÅÍÁ ÐÒÉ ÚÁÐÉÓÉ ÆÁÊÌÁ" #: application_ob.cpp:229 tool_2d3d.cpp:134 msgid "Cannot write the specified file." msgstr "îÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ ÕËÁÚÁÎÎÙÊ ÆÁÊÌ." #: application_ring.cpp:120 msgid "[*] Cyclopropane" msgstr "[*] ãÉËÌÏÐÒÏÐÁÎ" #: application_ring.cpp:124 msgid "[*] Cyclobutane" msgstr "[*] ãÉËÌÏÂÕÔÁÎ" #: application_ring.cpp:128 msgid "[*] Cyclopentane" msgstr "[*] ãÉËÌÏÐÅÎÔÁÎ" #: application_ring.cpp:132 msgid "Imidazole" msgstr "éÍÉÄÁÚÏÌ" #: application_ring.cpp:136 msgid "[*] Cyclopentadiene" msgstr "[*] ãÉËÌÏÐÅÎÔÁÄÉÅÎ" #: application_ring.cpp:140 msgid "[*] Cyclohexane (flat)" msgstr "[*] ãÉËÌÏÇÅËÓÁÎ" #: application_ring.cpp:144 msgid "Cyclohexane (boat)" msgstr "ãÉËÌÏÇÅËÓÁÎ (ÐÒÏÓÔÒÁÎÓÔ×ÅÎÎÙÊ)" #: application_ring.cpp:148 msgid "Cyclohexane (chair)" msgstr "ãÉËÌÏÇÅËÓÁÎ (ÆÒÏÎÔÁÌØÎÙÊ)" #: application_ring.cpp:152 msgid "[*] Benzene" msgstr "[*] âÅÎÚÏÌ" #: application_ring.cpp:156 msgid "Pyrimidine" msgstr "ðÉÒÉÍÉÄÉÎ" #: application_ring.cpp:160 msgid "[*] Cycloheptane" msgstr "[*] ãÉËÌÏÇÅÐÔÁÎ" #: application_ring.cpp:164 msgid "[*] Cyclooctane" msgstr "[*] ãÉËÌÏÏËÔÁÎ" #: application_ring.cpp:168 msgid "Indole" msgstr "éÎÄÏÌ" #: application_ring.cpp:172 msgid "Purine" msgstr "ðÕÒÉÎ" #: application_ring.cpp:176 msgid "Naphthalene" msgstr "îÁÆÔÁÌÉÎ" #: application_ring.cpp:180 msgid "Biphenyl" msgstr "âÉÆÅÎÉÌ" #: application_ring.cpp:184 msgid "Anthracene" msgstr "áÎÔÒÁÃÅÎ" #: application_ring.cpp:188 msgid "Steroid (fused ring template)" msgstr "óÔÅÒÏÉÄ " #: application_ring.cpp:191 msgid "Rings" msgstr "ãÉËÌÉÞÅÓËÉÅ ÓÔÒÕËÔÕÒÙ" #: application_ring.cpp:196 msgid "Alanine" msgstr "áÌÁÎÉÎ" #: application_ring.cpp:200 msgid "Arginine" msgstr "áÒÇÉÎÉÎ" #: application_ring.cpp:204 msgid "Asparagine" msgstr "áÓÐÁÒÁÇÉÎ" #: application_ring.cpp:208 msgid "Aspartic acid" msgstr "áÓÐÁÒÇÉÎÏ×ÁÑ ËÉÓÌÏÔÁ" #: application_ring.cpp:212 msgid "Cysteine" msgstr "ãÉÓÔÅÉÎ" #: application_ring.cpp:216 msgid "Glutamic acid" msgstr "çÌÀÔÁÍÉÎÏ×ÁÑ ËÉÓÌÏÔÁ" #: application_ring.cpp:220 msgid "Glutamine" msgstr "çÌÀÔÁÍÉÎ" #: application_ring.cpp:224 msgid "Glycine" msgstr "çÌÉÃÉÎ" #: application_ring.cpp:228 msgid "Histidine" msgstr "çÉÓÔÉÄÉÎ" #: application_ring.cpp:232 msgid "Isoleucine" msgstr "éÚÏÌÅÊÃÉÎ" #: application_ring.cpp:236 msgid "Leucine" msgstr "ìÅÊÃÉÎ" #: application_ring.cpp:240 msgid "Lysine" msgstr "ìÉÚÉÎ" #: application_ring.cpp:244 msgid "Methionine" msgstr "íÅÔÉÏÎÉÌ" #: application_ring.cpp:248 msgid "Nitrophenylalanine" msgstr "îÉÔÒÏÆÅÎÉÌÁÌÁÎÉÎ" #: application_ring.cpp:252 msgid "Phenylalanine" msgstr "æÅÎÉÌÁÌÁÎÉÎ" #: application_ring.cpp:256 msgid "Proline" msgstr "ðÒÏÌÉÎ" #: application_ring.cpp:260 msgid "Serine" msgstr "óÅÒÉÎ" #: application_ring.cpp:264 msgid "Statine" msgstr "óÔÁÔÉÎ" #: application_ring.cpp:268 msgid "Threonine" msgstr "æÒÅÏÎÉÎ" #: application_ring.cpp:272 msgid "Tryptophan" msgstr "ôÒÉÐÔÏÆÁÎ" #: application_ring.cpp:276 msgid "Tyrosine" msgstr "ôÉÒÏÚÉÎ" #: application_ring.cpp:280 msgid "Valine" msgstr "÷ÁÌÉÎ" #: application_ring.cpp:283 msgid "Amino acids" msgstr "áÍÉÎÏËÉÓÌÏÔÙ" #: application_ring.cpp:288 msgid "Adenine" msgstr "áÄÅÎÉÎ" #: application_ring.cpp:291 msgid "Cytosine" msgstr "ãÉÔÏÚÉÎ" #: application_ring.cpp:294 msgid "Guanine" msgstr "áÍÉÄÉÎÏ" #: application_ring.cpp:297 msgid "Thymine" msgstr "æÉÍÉÎ" #: application_ring.cpp:300 msgid "Uracil" msgstr "õÒÁÓÉÌ" #: application_ring.cpp:302 msgid "Nucleic acids" msgstr "îÕËÌÅÉÎÏ×ÙÅ ËÉÓÌÏÔÙ" #: application_ring.cpp:307 msgid "Ribose" msgstr "" #: application_ring.cpp:311 msgid "Deoxyribose" msgstr "" #: application_ring.cpp:315 msgid "D-fructose" msgstr "D-ÆÒÕËÔÏÚÁ" #: application_ring.cpp:319 msgid "D-glucose" msgstr "D-ÇÌÀËÏÚÁ" #: application_ring.cpp:322 msgid "Sugars" msgstr "óÁÈÁÒÁ" #: application_ring.cpp:326 msgid "[*] FMOC" msgstr "" #: application_ring.cpp:329 msgid "[*] BOC" msgstr "" #: application_ring.cpp:332 msgid "[*] DABCYL" msgstr "" #: application_ring.cpp:335 msgid "[*] DABSYL" msgstr "" #: application_ring.cpp:338 msgid "[*] DANSYL" msgstr "" #: application_ring.cpp:341 msgid "[*] EDANS" msgstr "" #: application_ring.cpp:344 msgid "Useful groups" msgstr "ðÏÌÅÚÎÙÅ ÇÒÕÐÐÙ" #: application_ring.cpp:369 msgid "Add new..." msgstr "" #: bondedit.cpp:52 msgid "Color" msgstr "ã×ÅÔ" #: bondedit.cpp:57 msgid "Arrow editor" msgstr "òÅÄÁËÔÉÒÏ×ÁÎÉÅ ÓÔÒÅÌÏË-ÕËÁÚÁÔÅÌÅÊ" #: bondedit.cpp:58 bondedit.cpp:165 bondedit.cpp:187 bondedit.cpp:212 msgid "Style:" msgstr "óÔÉÌØ" #: bondedit.cpp:61 msgid "Plain arrow" msgstr "ïÂÙÞÎÁÑ ÓÔÒÅÌËÁ-ÕËÁÚÁÔÅÌØ" #: bondedit.cpp:64 msgid "NR arrow" msgstr "" #: bondedit.cpp:67 #, fuzzy msgid "Dashed arrow" msgstr "ûÔÒÉÈÏ×ÁÑ ÓÔÒÅÌËÁ-ÕËÁÚÁÔÅÌØ" #: bondedit.cpp:70 msgid "Two-way arrow" msgstr "" #: bondedit.cpp:73 #, fuzzy msgid "Split two-way arrow" msgstr "ðÏ ÞÁÓÔÑÍ" #: bondedit.cpp:76 msgid "Retrosynthetic arrow" msgstr "óÔÒÅÌËÁ-ÕËÁÚÁÔÅÌØ ÄÌÑ ÏÂÒÁÔÎÏÇÏ ÓÉÎÔÅÚÁ" #: bondedit.cpp:98 msgid "Bond editor" msgstr "òÅÄÁËÔÉÒÏ×ÁÎÉÅ ÌÉÎÉÉ Ó×ÑÚÉ" #: bondedit.cpp:100 msgid "Bond order:" msgstr "" #: bondedit.cpp:103 #, fuzzy msgid "Dashed line" msgstr "ûÔÒÉÈÏ×ÁÑ ÌÉÎÉÑ" #: bondedit.cpp:106 msgid "Single" msgstr "ïÄÉÎÁÒÎÁÑ" #: bondedit.cpp:109 msgid "Stereo-up" msgstr "" #: bondedit.cpp:112 msgid "Stereo-down" msgstr "" #: bondedit.cpp:115 msgid "Wavy" msgstr "÷ÏÌÎÉÓÔÁÑ" #: bondedit.cpp:118 msgid "Single/double (aromatic)" msgstr "ïÄÉÎÁÒÎÁÑ/ä×ÏÊÎÁÑ" #: bondedit.cpp:121 msgid "Double" msgstr "ä×ÏÊÎÁÑ" #: bondedit.cpp:124 msgid "Double/triple" msgstr "ä×ÏÊÎÁÑ/ôÒÏÊÎÁÑ" #: bondedit.cpp:127 msgid "Triple" msgstr "ôÒÏÊÎÁÑ" #: bondedit.cpp:134 msgid "Bond thickness:" msgstr "ôÏÌÝÉÎÁ ÌÉÎÉÊ Ó×ÑÚÉ" #: bondedit.cpp:153 msgid "Double bond alignment:" msgstr "" #: bondedit.cpp:156 msgid "Auto" msgstr "á×ÔÏÍÁÔÉÞÅÓËÉ" #: bondedit.cpp:157 msgid "Left" msgstr "óÌÅ×Á" #: bondedit.cpp:158 msgid "Center" msgstr "ðÏ ÃÅÎÔÒÕ" #: bondedit.cpp:159 msgid "Right" msgstr "óÐÒÁ×Á" #: bondedit.cpp:164 msgid "Bracket editor" msgstr "òÅÄÁËÔÉÒÏ×ÁÎÉÅ ÒÁÚÄÅÌÉÔÅÌØÎÙÈ ÓËÏÂÏË" #: bondedit.cpp:168 msgid "Square bracket" msgstr "ë×ÁÄÒÁÔÎÙÅ ÓËÏÂËÉ" #: bondedit.cpp:171 msgid "Parentheses" msgstr "" #: bondedit.cpp:174 msgid "Curly bracket" msgstr "÷ÏÌÎÉÓÔÙÅ ÓËÏÂËÉ" #: bondedit.cpp:177 msgid "Box" msgstr "ðÒÑÍÏÕÇÏÌØÎÉË" #: bondedit.cpp:180 msgid "Ellipse" msgstr "üÌÌÉÐÓ" #: bondedit.cpp:186 msgid "Curved Arrow editor" msgstr "òÅÄÁËÔÏÒ ÄÌÑ ×ÙÇÎÕÔÙÈ ÓÔÒÅÌÏË-ÕËÁÚÁÔÅÌÅÊ" #: bondedit.cpp:190 msgid "90 degree clockwise" msgstr "90 ÇÒÁÄÕÓÏ× ÐÏ ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ" #: bondedit.cpp:193 msgid "180 degree clockwise" msgstr "180 ÇÒÁÄÕÓÏ× ÐÏ ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÅ" #: bondedit.cpp:196 msgid "270 degree clockwise" msgstr "270 ÇÒÁÄÕÓÏ× ÐÏ ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ" #: bondedit.cpp:199 msgid "90 degree counterclockwise" msgstr "90 ÇÒÁÄÕÓÏ× ÐÒÏÔÉ× ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ" #: bondedit.cpp:202 msgid "180 degree counterclockwise" msgstr "180 ÇÒÁÄÕÓÏ× ÐÒÏÔÉ× ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ" #: bondedit.cpp:205 msgid "270 degree counterclockwise" msgstr "270 ÇÒÁÄÕÓÏ× ÐÒÏÔÉ× ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ" #: bondedit.cpp:211 msgid "Symbol editor" msgstr "òÅÄÁËÔÏÒ ÓÉÍ×ÏÌÏ×" #: bondedit.cpp:215 msgid "Positive charge" msgstr "ðÏÌÏÖÉÔÅÌØÎÙÊ ÚÁÒÑÄ" #: bondedit.cpp:218 msgid "Negative charge" msgstr "ïÔÒÉÃÁÔÅÌØÎÙÊ ÚÁÒÑÄ" #: bondedit.cpp:221 msgid "Partial positive charge" msgstr "þÁÓÔÉÞÎÏ ÐÏÌÏÖÉÔÅÌØÎÙÊ ÚÁÒÑÄ" #: bondedit.cpp:224 msgid "Partial negative charge" msgstr "þÁÓÔÉÞÎÏ ÏÔÒÉÃÁÔÅÌØÎÙÊ ÚÁÒÑÄ" #: bondedit.cpp:227 msgid "Single electron" msgstr "ïÄÉÎ ÜÌÅËÔÒÏÎ" #: bondedit.cpp:230 msgid "Electron pair" msgstr "ðÁÒÁ ÜÌÅËÔÒÏÎÏ×" #: bondedit.cpp:233 msgid "Stereochemical ring hydrogen" msgstr "" #: bondedit.cpp:236 msgid "p orbital" msgstr "p ÏÒÂÉÔÁÌØ" #: bondedit.cpp:239 msgid "p double" msgstr "" #: bondedit.cpp:242 msgid "bead" msgstr "" #: bondedit.cpp:248 crings_dialog.cpp:133 dyk.cpp:40 fixeddialog.cpp:136 #: molinfodialog.cpp:29 pagesetupdialog.cpp:105 peptidebuilder.cpp:74 #: smilesdialog.cpp:37 msgid "OK" msgstr "OK" #: charsel.cpp:44 #, fuzzy msgid "Insert symbol" msgstr "òÉÓÏ×ÁÎÉÅ" #: charsel.cpp:47 #, fuzzy msgid "Font:" msgstr "õÓÔÁÎÏ×ÉÔØ ÛÒÉÆÔ" #: chemdata_rxn.cpp:41 msgid "Missing reactant or product" msgstr "ðÒÏÐÕÝÅÎ ÒÅÁÇÅÎÔ ÉÌÉ ÐÒÏÄÕËÔ" #: chemdata_rxn.cpp:42 msgid "You must select at least one reactant and one product." msgstr "÷Ù ÄÏÌÖÎÙ ×ÙÂÒÁÔØ ÐÏ ËÒÁÊÎÅÊ ÍÅÒÅ ÏÄÉÎ ÒÅÁÇÅÎÔ ÉÌÉ ÐÒÏÄÕËÔ." #: chemdata_rxn.cpp:50 msgid "Estimated gas-phase enthalpy change:\n" msgstr "ïÃÅÎÅÎÙ ÉÚÍÅÎÅÎÉÑ ÇÁÚÏ×ÏÊ ÆÁÚÙ ÜÎÔÁÌØÐÉÉ:\n" #: chemdata_rxn.cpp:59 #, qt-format msgid "Reactants = %1 kJ/mol\n" msgstr "òÅÁÇÅÎÔÙ= = %1 kJ/mol\n" #: chemdata_rxn.cpp:68 #, qt-format msgid "Products = %1 kJ/mol\n" msgstr "ðÒÏÄÕËÔÙ= = %1 kJ/mol\n" #: chemdata_rxn.cpp:70 #, qt-format msgid "Reaction = %1 kJ/mol" msgstr "òÅÁÇÅÎÔ= = %1 kJ/mol" #: chemdata_rxn.cpp:71 msgid "Enthalpy change" msgstr "éÚÍÅÎÅÎÉÑ ÜÎÔÁÌØÐÉÉ" #: chemdata_rxn.cpp:81 msgid "1H NMR compare error" msgstr "" #: chemdata_rxn.cpp:82 chemdata_rxn.cpp:138 msgid "Please select only one reactant and one product to compare." msgstr "ðÏÖÁÊÌÕÓÔÁ, ×ÙÂÅÒÉÔÅ ÔÏÌØËÏ ÏÄÉÎ ÒÅÁÇÅÎÔ É ÏÄÉÎ ÐÒÏÄÕËÔ ÄÌÑ ÓÒÁ×ÎÅÎÉÑ." #: chemdata_rxn.cpp:137 msgid "13C NMR compare error" msgstr "" #: chemdata_tools.cpp:171 msgid "Octanol-water partition" msgstr "" #: chemdata_tools.cpp:171 #, qt-format msgid "Estimated octanol-water partition constant (log Kow) = %1" msgstr "" #: chemdata_tools.cpp:193 msgid "SMILES string" msgstr "" #: chemdata_tools.cpp:193 msgid "SMILES string for selected molecule:" msgstr "" #: crings_dialog.cpp:123 msgid "Add custom ring to menu list" msgstr "äÏÂÁ×ÉÔØ × ÓÐÉÓÏË ÃÉËÌÉÞÅÓËÏÅ ÓÏÅÄÉÎÅÎÉÅ" #: dyk.cpp:17 dyk.cpp:20 msgid "Did You Know?" msgstr "÷Ù ÚÎÁÌÉ ?" #: dyk.cpp:28 msgid "Previous tip" msgstr "ðÒÅÄÙÄÕÝÉÊ" #: dyk.cpp:32 msgid "Next tip" msgstr "óÌÅÄÕÀÝÉÊ" #: dyk.cpp:36 msgid "Don't show this dialog at startup" msgstr "îÅ ÐÏËÁÚÙ×ÁÔØ ÜÔÏ ÏËÎÏ ÐÒÉ ÓÌÅÄÕÀÝÅÍ ÚÁÐÕÓËÅ" #: dyk.cpp:55 msgid "" "XDrawChem can be run from the command line to produce images. Type " "\"xdrawchem --help\" for details." msgstr "" #: dyk.cpp:56 msgid "" "When in select mode, you can edit most objects by right-clicking on them." msgstr "" "÷Ù ÍÏÖÅÔÅ ÒÅÄÁËÔÉÒÏ×ÁÔØ ÂÏÌØÛÉÎÓÔ×Ï ÏÂßÅËÔÏ× ÎÁÖÁÔÉÅÍ ÐÒÁ×ÏÊ ËÎÏÐËÉ ÍÙÛÉ ÎÁ " "ÎÉÈ, ËÏÇÄÁ ×ËÌÀÞÅÎ ×ÙÄÅÌÑÅÍÙÊ ÒÅÖÉÍ." #: dyk.cpp:57 msgid "" "When drawing bonds, you can edit the bond style by right-clicking on the " "bond." msgstr "" "ëÏÇÄÁ ÒÉÓÕÀÔÓÑ ÌÉÎÉÉ-Ó×ÑÚÉ, ÷Ù ÍÏÖÅÔÅ ÒÅÄÁËÔÉÒÏ×ÁÔØ ÓÔÉÌØ ÌÉÎÉÉ ÎÁÖÁÔÉÅÍ " "ÐÒÁ×ÏÊ ËÎÏÐËÉ ÍÙÛÉ ÎÁ ÎÅÊ ." #: dyk.cpp:58 msgid "" "When in select mode, press Shift+LeftButton and drag over part of a molecule " "to select the entire molecule." msgstr "" "÷ ÷ÙÄÅÌÑÅÍÏÍ ÒÅÖÉÍÅ, ÎÁÖÍÉÔÅ Shift + ìÅ×ÕÀ ËÎÏÐËÕ ÍÙÛÉ É ×ÙÂÅÒÅÔÅ ÞÁÓÔÉ " "ÍÏÌÅËÕÌÙ, ÞÔÏÂÙ ×ÙÄÅÌÉÔØ ÃÅÌÕÀ ÍÏÌÅËÕÌÕ ." #: dyk.cpp:59 msgid "" "When in select mode, press Ctrl+LeftButton on a molecule to get molecule " "information." msgstr "" "÷ ÷ÙÄÅÌÑÅÍÏÍ ÒÅÖÉÍÅ, ÎÁÖÍÉÔÅ Ctrl+ìÅ×ÕÀ ËÎÏÐËÕ ÍÙÛÉ ÎÁ ÍÏÌÅËÕÌÅ, ÞÔÏÂÙ " "ÐÏÌÕÞÉÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÍÏÌÅËÕÌÅ." #: dyk.cpp:60 msgid "" "Bond length, bond angle, and units are set in the Drawing Settings option " "under the Format menu." msgstr "" "åÄÉÎÉÃÙ ÉÚÍÅÒÅÎÉÑ ÄÌÉÎÙ ÌÉÎÉÉ, ÕÇÌÁ ÎÁËÌÏÎÁ ÎÁÓÔÒÁÉ×ÁÀÔÓÑ × çÒÁÆÉÞÅÓËÉÈ " "îÁÓÔÒÏÊËÁÈ × ÍÅÎÀ æÏÒÍÁÔ." #: dyk.cpp:61 msgid "" "You can attach a subscript to a bracket by selecting the text tool, then " "clicking on the bracket." msgstr "" "÷Ù ÍÏÖÅÔÅ ÐÒÉÓÏÅÄÉÎÉÔØ ÉÎÄÅËÓ Ë ÒÁÚÄÅÌÉÔÅÌØÎÙÍ ÓËÏÂËÁÍ ×ÙÂÒÁ× ÔÅËÓÔÏ×ÙÅ " "ÎÁÓÔÒÏÊËÉ, ÚÁÔÅÍ ÎÁÖÁ× ÎÁ ÓËÏÂËÕ " #: dyk.cpp:62 msgid "" "You can toggle the grid display by pressing Ctrl+G. Turning the grid on or " "off does not affect whether objects snap to the grid." msgstr " ." #: dyk.cpp:63 msgid "" "A number of ring and molecule templates are available from the ring tool, " "including single and fused rings, amino acids, and nucleosides." msgstr "" "ûÁÂÌÏÎÙ ÁÒÏÍÁÔÉÞÅÓËÏÇÏ ËÏÌØÃÁ É ÍÏÌÅËÕÌÙ ÄÏÓÔÕÐÎÙ × ÉÎÓÔÒÕÍÅÎÔÁÈ " "ÁÒÏÍÁÔÉÞÅÓËÏÇÏ ËÏÌØÃÁ,×ËÌÀÞÁÀÝÉÈ ËÁË ÏÄÉÎÏÞÎÙÅ, ÔÁË ÂÏÌØÛÅÇÏ ËÏÌÉÞÅÓÔ×Á " "ÁÒÏÍÁÔÉÞÅÓËÉÅ ËÏÌØÃÁ, ÁÍÉÎÏËÉÓÌÏÔÙ É ÎÕËÌÅÏÔÉÄÙ." #: dyk.cpp:64 msgid "Remember to select a file type when opening or saving documents." msgstr "" "úÁÐÏÍÎÉÔÅ ×ÙÂÒÁÎÎÙÊ ÔÉÐ ÆÁÊÌÁ, ËÏÇÄÁ ÏÔËÒÙ×ÁÀÔÓÑ ÉÌÉ ÓÏÈÒÁÎÑÀÔÓÑ ÄÏËÕÍÅÎÔÙ." #: dyk.cpp:65 msgid "" "The option \"Clean up molecule\" under the Tools menu can be used to refine " "structures such as rings and macromolecules." msgstr "" "ïÐÃÉÑ \"ïÞÉÓÔÉÔØ ÍÏÌÅËÕÌÕ\" × ÍÅÎÀ éÎÓÔÒÕÍÅÎÔÙ ÍÏÖÅÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÁ ÄÌÑ " "ÕÄÁÌÅÎÉÑ ÓÔÒÕËÔÕÒ ÔÁËÉÈ ËÁË ËÏÌØÃÁ ÉÌÉ ÍÁËÒÏÍÏÌÅËÕÌÙ." #: dyk.cpp:66 msgid "" "It's possible to attach rings to structures by selecting a ring and clicking " "on an atom." msgstr "" #: dyk.cpp:67 msgid "" "XDrawChem can automatically attach amino acids from N-terminal to C-terminal " "(but the result isn't always pretty :)" msgstr "" #: dyk.cpp:68 msgid "" "Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/" msgstr "" #: dyk.cpp:69 msgid "" "XDrawChem can draw over 100,000 substances using its Internet database. " "Select Find on internet from the File menu to search for compounds." msgstr "" #: dyk.cpp:70 msgid "" "XDrawChem can identify compounds by CAS number and occasionally by name. " "Select Molecule information from the Tools menu and click on a molecule. " "However, this only works if the compound is listed in the database." msgstr "" #: fixeddialog.cpp:29 msgid "Set fixed angle and length" msgstr "õËÁÚÁÔØ ÆÉËÓÉÒÏ×ÁÎÎÕÀ ÄÌÉÎÕ É ÕÇÏÌ ÎÁËÌÏÎÁ" #: fixeddialog.cpp:32 msgid "Units:" msgstr "åÄÉÎÉÃÙ:" #: fixeddialog.cpp:35 fixeddialog.cpp:253 pagesetupdialog.cpp:69 msgid "pixels" msgstr "ÐÉËÓÅÌÅÊ" #: fixeddialog.cpp:37 fixeddialog.cpp:256 pagesetupdialog.cpp:74 msgid "inches" msgstr "ÄÀÊÍÙ" #: fixeddialog.cpp:38 fixeddialog.cpp:259 pagesetupdialog.cpp:79 xruler.cpp:60 #: xruler.cpp:84 msgid "cm" msgstr "ÓÍ" #: fixeddialog.cpp:44 msgid "Bond fixed length:" msgstr "õËÁÚÁÔØ ÄÌÉÎÕ ÌÉÎÉÉ:" #: fixeddialog.cpp:50 msgid "Bond fixed angle:" msgstr "õËÁÚÁÔØ ÆÉËÓÉÒÏ×ÁÎÎÙÊ ÕÇÏÌ ÎÁËÌÏÎÁ" #: fixeddialog.cpp:66 fixeddialog.cpp:91 msgid "degrees" msgstr "ÇÒÁÄÕÓÙ" #: fixeddialog.cpp:69 msgid "Arrow fixed length:" msgstr "õËÁÚÁÔØ ÄÌÉÎÕ ÓÔÒÅÌËÉ-ÕËÁÚÁÔÅÌÑ:" #: fixeddialog.cpp:72 msgid "Arrow fixed angle:" msgstr "õËÁÚÁÔØ ÕÇÏÌ ÎÁËÌÏÎÁ ÓÔÒÅÌËÉ-ÕËÁÚÁÔÅÌÑ:" #: fixeddialog.cpp:94 msgid "Double bond spacing:" msgstr "" #: fixeddialog.cpp:110 msgid "Show grid" msgstr "ðÏËÁÚÁÔØ ÓÅÔËÕ" #: fixeddialog.cpp:111 msgid "Do not show grid" msgstr "îÅ ÐÏËÁÚÙ×ÁÔØ ÓÅÔËÕ" #: fixeddialog.cpp:112 msgid "Show square grid" msgstr "ðÏËÁÚÁÔØ Ë×ÁÄÒÁÔÎÕÀ ÓÅÔËÕ" #: fixeddialog.cpp:113 msgid "Show hex grid" msgstr "" #: fixeddialog.cpp:116 #, fuzzy msgid "Snap to grid" msgstr " " #: fixeddialog.cpp:122 msgid "Grid spacing" msgstr "" #: fixeddialog.cpp:140 msgid "Default" msgstr "ðÏ ÕÍÏÌÞÁÎÉÀ" #: graphdialog.cpp:30 msgid "Print" msgstr "îÁÐÅÞÁÔÁÔØ" #: graphdialog.cpp:34 #, fuzzy msgid "Export Peak List" msgstr "üËÓÐÏÒÔÉÒÏ×ÁÔØ óÐÉÓÏË" #: graphdialog.cpp:38 molinfodialog.cpp:33 tool_13c_nmr.cpp:37 #: tool_1h_nmr.cpp:37 tool_ir.cpp:37 msgid "Help" msgstr "ðÏÍÏÝØ" #: graphwidget.cpp:121 #, fuzzy msgid "Red is reactant" msgstr "òÅÁÇÉÒÏ×ÁÔØ" #: graphwidget.cpp:124 #, fuzzy msgid "Blue is product" msgstr "÷ÙÂÒÁÔØ &ðÒÏÄÕËÔ" #: helpwindow.cpp:70 msgid "&Close" msgstr "&úÁËÒÙÔØ" #: helpwindow.cpp:79 msgid "&Backward" msgstr "&îÁÚÁÄ" #: helpwindow.cpp:82 msgid "&Forward" msgstr "&÷ÐÅÒÅÄ" #: helpwindow.cpp:84 msgid "&Home" msgstr "ðÅÒÓÏÎÁÌØÎÙÊ ËÁÔÁÌÏÇ" #: helpwindow.cpp:87 msgid "&About ..." msgstr "&ï ÐÒÏÇÒÁÍÍÅ ..." #: helpwindow.cpp:90 msgid "&Go" msgstr "&ðÅÒÅÊÔÉ" #: helpwindow.cpp:106 msgid "Backward" msgstr "îÁÚÁÄ" #: helpwindow.cpp:109 msgid "Forward" msgstr "÷ÐÅÒÅÄ" #: helpwindow.cpp:112 msgid "Home" msgstr "ðÅÒÓÏÎÁÌØÎÙÊ ËÁÔÁÌÏÇ" #: main.cpp:145 msgid "untitled" msgstr "" #: molecule_1h_nmr.cpp:50 #, fuzzy msgid "Predicted 1H-NMR" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ 13C NMR" #: molecule_1h_nmr.cpp:65 msgid " Intensity: " msgstr "" #: molecule_1h_nmr.cpp:66 msgid " Multiplicity: " msgstr "" #: molecule.cpp:89 msgid "Reactant" msgstr "òÅÁÇÉÒÏ×ÁÔØ" #: molecule.cpp:91 msgid "Product" msgstr "ðÒÏÄÕËÔ" #: molecule_tools_1.cpp:171 #, fuzzy msgid "Predicted 13C-NMR" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ 13C NMR" #: molecule_tools_1.cpp:234 #, fuzzy msgid "Predicted IR" msgstr "ðÒÅÄÕÓÍÏÔÒÅÔØ IR" #: molecule_tools_1.cpp:248 msgid "~1350-1000, C-N" msgstr "" #: molecule_tools_1.cpp:250 msgid "~1300-1000, C-O" msgstr "" #: molecule_tools_1.cpp:254 msgid "~1660-1600, C=C (cis/vinyl strong; trans weak)" msgstr "" #: molecule_tools_1.cpp:256 msgid "~1690-1640, C=N" msgstr "" #: molecule_tools_1.cpp:258 msgid "~1700 (narrow), C=O" msgstr "" #: molecule_tools_1.cpp:260 msgid "~1350-1300, S=O (~1050 if R-(S=O)-R')" msgstr "" #: molecule_tools_1.cpp:264 molecule_tools_1.cpp:351 molecule_tools_1.cpp:353 msgid "~2250 (narrow), nitrile" msgstr "" #: molecule_tools_1.cpp:317 molecule_tools_1.cpp:319 molecule_tools_1.cpp:321 #: molecule_tools_1.cpp:323 molecule_tools_1.cpp:325 molecule_tools_1.cpp:327 #: molecule_tools_1.cpp:329 msgid "~3000 (broad), C-H" msgstr "" #: molecule_tools_1.cpp:331 molecule_tools_1.cpp:339 molecule_tools_1.cpp:341 msgid "two peaks: ~3400, ~3300, primary N-H" msgstr "" #: molecule_tools_1.cpp:333 molecule_tools_1.cpp:335 molecule_tools_1.cpp:337 msgid "~3300 (broad), secondary N-H" msgstr "" #: molecule_tools_1.cpp:343 molecule_tools_1.cpp:345 molecule_tools_1.cpp:347 msgid "~2550 (broad), S-H" msgstr "" #: molecule_tools_1.cpp:349 molecule_tools_1.cpp:359 molecule_tools_1.cpp:361 msgid "~3400 (broad), O-H" msgstr "" #: molecule_tools_1.cpp:355 msgid "~2270 (narrow), -N=C=O" msgstr "" #: molecule_tools_1.cpp:357 msgid "~2125 (narrow), -N=C=S" msgstr "" #: molecule_tools_1.cpp:363 molecule_tools_1.cpp:365 msgid "~1525 (narrow), -NO2" msgstr "" #: molecule_tools_1.cpp:367 msgid "~1600 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:368 msgid "~1475 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:580 #, fuzzy msgid "10.5 (Guanidine)" msgstr "áÍÉÄÉÎÏ" #: molecule_tools_1.cpp:600 msgid "9 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:604 msgid "11 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:608 msgid "11 (a-carbon between ketone and ester)" msgstr "" #: molecule_tools_1.cpp:612 msgid "13 (a-carbon between two esters)" msgstr "" #: molecule_tools_1.cpp:621 msgid "5 (Aromatic primary amine)" msgstr "" #: molecule_tools_1.cpp:627 msgid "9-10 (Alkene-primary amine)" msgstr "" #: molecule_tools_1.cpp:630 msgid "11 (Aliphatic primary amine)" msgstr "" #: molecule_tools_1.cpp:642 msgid "-4 (pyrrole)" msgstr "" #: molecule_tools_1.cpp:647 msgid "14.4 (secondary amine)" msgstr "" #: molecule_tools_1.cpp:652 #, fuzzy msgid "11 (aliphatic secondary amine)" msgstr "òÉÓÏ×ÁÎÉÅ ÚÉÇÚÁÇÏÏÂÒÁÚÎÏÊ ÌÉÎÉÉ" #: molecule_tools_1.cpp:664 msgid "6.8 (conjugated secondary amine)" msgstr "" #: molecule_tools_1.cpp:668 msgid "5 (aromatic secondary amine)" msgstr "" #: molecule_tools_1.cpp:672 molecule_tools_1.cpp:676 msgid "1-3 (purine/pyrimidine)" msgstr "" #: molecule_tools_1.cpp:687 msgid "4 (tertiary amine)" msgstr "" #: molecule_tools_1.cpp:693 msgid "10 (aliphatic tertiary amine)" msgstr "" #: molecule_tools_1.cpp:703 msgid "8 (Peroxy acid)" msgstr "" #: molecule_tools_1.cpp:720 msgid "-1 (sulfonic acid)" msgstr "" #: molecule_tools_1.cpp:734 msgid "4 (Aromatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:738 msgid "4.5 (Aliphatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:740 msgid "3 (Aliphatic carboxylic acid, a-halide)" msgstr "" #: molecule_tools_1.cpp:742 msgid "1.3 (Aliphatic carboxylic acid, 2 a-halide)" msgstr "" #: molecule_tools_1.cpp:749 msgid "10 (Aromatic -OH)" msgstr "" #: molecule_tools_1.cpp:751 msgid "16 (Aliphatic -OH)" msgstr "" #: molecule_tools_1.cpp:761 msgid "7.8 (Aromatic -SH)" msgstr "" #: molecule_tools_1.cpp:763 msgid "10.6 (Aliphatic -SH)" msgstr "" #: molecule_tools_1.cpp:770 msgid "Estimated pKa's:" msgstr "òÁÓÓÞÉÔÁÎÎÙÊ pKa's:" #: molecule_tools_1.cpp:780 msgid "There seem to be no sites with pKa between -1 and 15." msgstr "" #: molecule_tools_1.cpp:783 msgid "Estimated pKa's" msgstr "òÁÓÓÞÉÔÁÎÎÙÊ pKa's:" #: molecule_tools_2.cpp:462 #, fuzzy msgid "Elemental analysis:\n" msgstr "ïÓÎÏ×ÎÏÊ ÁÎÁÌÉÚ" #: molinfodialog.cpp:12 msgid "Molecule Info" msgstr "éÎÆÏÒÍÁÃÉÑ Ï ÍÏÌÅËÕÌÅ" #: molinfodialog.cpp:14 molinfodialog.cpp:15 msgid "Name: " msgstr "îÁÚ×ÁÎÉÅ: " #: molinfodialog.cpp:17 molinfodialog.cpp:18 msgid "CAS: " msgstr "" #: molinfodialog.cpp:20 msgid "Molecular weight = " msgstr "íÏÌÅËÕÌÑÒÎÁÑ ÍÁÓÓÁ" #: molinfodialog.cpp:23 molinfodialog.h:24 msgid "Formula = " msgstr "æÏÒÍÕÌÁ = " #: molinfodialog.cpp:26 msgid "Analysis = " msgstr "áÎÁÌÉÚ = " #: myfiledialog.cpp:6 msgid "Transparent" msgstr "ðÒÏÚÒÁÞÎÏÓÔØ" #: netdialog.cpp:42 msgid "Find structure via Internet" msgstr "îÁÊÔÉ ÓÔÒÕËÔÕÒÕ ÞÅÒÅÚ éÎÔÅÒÎÅÔ" #: netdialog.cpp:46 msgid "XDC database server:" msgstr "XDC ÂÁÚÁ ÓÅÒ×ÅÒÁ" #: netdialog.cpp:54 msgid "Search type:" msgstr "éÓËÁÔØ ÔÉÐ:" #: netdialog.cpp:59 msgid "CAS Number" msgstr "CAS ÎÏÍÅÒ" #: netdialog.cpp:60 msgid "Formula" msgstr "æÏÒÍÕÌÁ" #: netdialog.cpp:61 msgid "Chemical name" msgstr "èÉÍÉÞÅÓËÏÅ ÎÁÚ×ÁÎÉÅ" #: netdialog.cpp:64 msgid "Look for:" msgstr "" #: netdialog.cpp:72 msgid "Exact matches only" msgstr "" #: netdialog.cpp:75 msgid "Search" msgstr "éÓËÁÔØ" #: pagesetupdialog.cpp:19 msgid "Page setup" msgstr "îÁÓÔÒÏÊËÁ ÓÔÒÁÎÉÃÙ" #: pagesetupdialog.cpp:22 msgid "Paper size:" msgstr "òÁÚÍÅÒ ÂÕÍÁÇÉ:" #: pagesetupdialog.cpp:25 msgid "Letter (8.5\" x 11\")" msgstr "Letter (8.5\" x 11\")" #: pagesetupdialog.cpp:26 msgid "Legal (8.5\" x 14\")" msgstr "" #: pagesetupdialog.cpp:27 msgid "A4 (210 mm x 297 mm)" msgstr "" #: pagesetupdialog.cpp:28 msgid "640x480 pixels" msgstr "640x480 ÔÏÞÅË" #: pagesetupdialog.cpp:29 msgid "800x600 pixels" msgstr "800x600 ÔÏÞÅË" #: pagesetupdialog.cpp:30 msgid "1024x768 pixels" msgstr "1024x768 ÔÏÞÅË" #: pagesetupdialog.cpp:31 msgid "Custom paper size" msgstr "ðÏÌØÚÏ×ÁÔÅÌØÓËÉÊ ÒÁÚÍÅÒ ÂÕÍÁÇÉ" #: pagesetupdialog.cpp:50 msgid "Orientation:" msgstr "òÁÓÐÏÌÏÖÅÎÉÅ:" #: pagesetupdialog.cpp:53 msgid "Portrait" msgstr "ðÏÒÔÒÅÔ" #: pagesetupdialog.cpp:54 msgid "Landscape" msgstr "÷ÉÄ" #: pagesetupdialog.cpp:86 msgid "Page width:" msgstr "ûÉÒÉÎÁ ÂÕÍÁÇÉ" #: pagesetupdialog.cpp:96 msgid "Page height:" msgstr "÷ÙÓÏÔÁ ÂÕÍÁÇÉ" #: peptidebuilder.cpp:12 msgid "Peptide Builder" msgstr "" #: peptidebuilder.cpp:18 msgid "" "Enter peptide sequence -\n" "three-letter abbreviations:" msgstr "" #: peptidebuilder.cpp:23 msgid "Shortcut: Hold 'Alt' and type one-letter codes!" msgstr "" #: render2d.cpp:125 render2d_event.cpp:696 render2d_event.cpp:1018 #, fuzzy msgid "" "Select mode: left click on object to move, right click on object to edit" msgstr " " #: render2d.cpp:136 msgid "Lasso mode: left click and hold to draw lasso" msgstr "òÅÖÉÍ ìÁÓÓÏ: îÁÖÍÉÔÅ ÌÅ×ÕÀ ËÎÏÐËÕ ÍÙÛÉ É ÄÅÒÖÉÔÅ ÞÔÏÂÙ ×ÙÄÅÌÉÔØ ÌÁÓÓÏ " #: render2d.cpp:147 msgid "Draw Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:158 #, fuzzy msgid "Draw Dashed Line mode: left click to draw line, right click to edit" msgstr " " #: render2d.cpp:169 #, fuzzy msgid "Draw Chain mode: left click and drag to draw aliphatic chain" msgstr " " #: render2d.cpp:180 #, fuzzy msgid "Draw Stereo-Up Line mode: left click to draw line, right click to edit" msgstr " " #: render2d.cpp:191 #, fuzzy msgid "" "Draw Stereo-Down Line mode: left click to draw line, right click to edit" msgstr " " #: render2d.cpp:202 #, fuzzy msgid "Draw Wavy Line mode: left click to draw line, right click to edit" msgstr " " #: render2d.cpp:222 msgid "Draw Arrow mode: left click to draw arrow" msgstr "" #: render2d.cpp:240 #, fuzzy msgid "Draw Bracket mode: left click to draw bracket" msgstr " " #: render2d.cpp:252 #, fuzzy msgid "Erase mode: left click to erase object" msgstr "óÔÉÒÁÔÅÌØÎÙÊ ÒÅÖÉÍ: îÁÖÍÉÔÅ ÌÅ×ÕÀ ËÎÏÐËÕ ÍÙÛÉ, ÞÔÏÂÙ ÕÄÁÌÉÔØ ÏÂßÅËÔ" #: render2d.cpp:262 msgid "Text mode: left click to add or edit text" msgstr "" #: render2d.cpp:275 msgid "Draw Symbol mode: left click to add symbol" msgstr "" #: render2d.cpp:289 msgid "Draw graphic object: cubic bezier" msgstr "" #: render2d.cpp:305 render2d.cpp:316 #, fuzzy msgid "Left-click to draw Newman projection template" msgstr " " #: render2d.cpp:329 #, qt-format msgid "Draw Ring mode: left click to add %1" msgstr "" #: render2d.cpp:353 msgid "Click on a molecule for information" msgstr "" #: render2d.cpp:356 render2d_event.cpp:1082 #, fuzzy msgid "Click on a molecule to calculate its molecular weight" msgstr " " #: render2d.cpp:359 render2d_event.cpp:1095 #, fuzzy msgid "Click on a molecule to calculate its empirical formula" msgstr " " #: render2d.cpp:362 #, fuzzy msgid "Click on a molecule to calculate its elemental analysis" msgstr " " #: render2d.cpp:365 #, fuzzy msgid "Click on a molecule to calculate its 13C NMR" msgstr " " #: render2d.cpp:368 #, fuzzy msgid "Click on a molecule to calculate its 1H NMR" msgstr " " #: render2d.cpp:371 #, fuzzy msgid "Click on a molecule to calculate its IR" msgstr " " #: render2d.cpp:374 msgid "Click on a molecule to calculate its pKa(s)" msgstr "" #: render2d.cpp:377 msgid "Click on a molecule for possible retrosynthesis" msgstr "" #: render2d.cpp:381 #, fuzzy msgid "Click on a molecule to display its bond identifier" msgstr " " #: render2d.cpp:384 #, fuzzy msgid "Click on a molecule to calculate its octanol-water partition" msgstr " " #: render2d.cpp:387 msgid "Click on a molecule to generate 3-D coordinates" msgstr "" #: render2d.cpp:390 msgid "Click on a molecule to guess its name" msgstr "" #: render2d.cpp:393 #, fuzzy msgid "Click on a molecule to determine its SMILES string" msgstr " " #: render2d.cpp:396 #, fuzzy msgid "Click on a molecule to clean up its structure" msgstr " " #: render2d.cpp:399 #, fuzzy msgid "Click on a molecule to assign it as a reactant" msgstr " " #: render2d.cpp:402 #, fuzzy msgid "Click on a molecule to assign it as a product" msgstr " " #: render2d.cpp:405 msgid "Click on a molecule to clear it group assignment" msgstr "" #: render2d.cpp:408 #, fuzzy msgid "Click on a molecule to save it as a custom ring" msgstr "ÄÏ " #: render2d.cpp:411 msgid "Tool test mode" msgstr "" #: render2d.cpp:414 #, fuzzy msgid "Click on a molecule" msgstr "ïÞÉÓÔÉÔØ ÍÏÌÅËÕÌÕ" #: render2d.cpp:431 #, fuzzy msgid "Select mode: left click to move, right click to edit" msgstr " " #: render2d.cpp:482 #, fuzzy msgid "Undo!" msgstr "ïÔÍÅÎÉÔØ" #: render2d.cpp:484 msgid "Cannot undo, sorry!" msgstr "îÅ×ÏÚÍÏÖÎÏ ÏÔÍÅÎÉÔØ" #: render2d_event.cpp:134 #, fuzzy msgid "No information." msgstr "íÏÌÅËÕÌÑÒÎÁÑ ÉÎÆÏÒÍÁÃÉÑ" #: render2d_event.cpp:145 #, fuzzy msgid "Object information" msgstr "íÏÌÅËÕÌÑÒÎÁÑ ÉÎÆÏÒÍÁÃÉÑ" #: render2d_event.cpp:187 msgid "Object" msgstr "" #: render2d_event.cpp:189 msgid "Arrow" msgstr "" #: render2d_event.cpp:191 msgid "Bond" msgstr "" #: render2d_event.cpp:193 #, fuzzy msgid "Bracket" msgstr "òÅÄÁËÔÉÒÏ×ÁÎÉÅ ÒÁÚÄÅÌÉÔÅÌØÎÙÈ ÓËÏÂÏË" #: render2d_event.cpp:195 #, fuzzy msgid "Curved Arrow" msgstr "òÅÄÁËÔÏÒ ÄÌÑ ×ÙÇÎÕÔÙÈ ÓÔÒÅÌÏË-ÕËÁÚÁÔÅÌÅÊ" #: render2d_event.cpp:197 #, fuzzy msgid "Symbol" msgstr "òÅÄÁËÔÏÒ ÓÉÍ×ÏÌÏ×" #: render2d_event.cpp:199 msgid "Text" msgstr "" #: render2d_event.cpp:202 #, fuzzy msgid "Edit" msgstr "&ðÒÁ×ËÁ" #: render2d_event.cpp:204 render2d_event.cpp:211 #, fuzzy msgid "Info" msgstr "éÎÄÏÌ" #: render2d_event.cpp:209 #, fuzzy msgid "Molecule" msgstr "éÎÆÏÒÍÁÃÉÑ Ï ÍÏÌÅËÕÌÅ" #: render2d_event.cpp:1008 msgid "Select mode: left click on object to move" msgstr " " #: render2d_event.cpp:1079 render2d_event.cpp:1092 #, fuzzy msgid ", click to paste into drawing" msgstr " " #: render2d_event.cpp:1409 #, fuzzy msgid "Draw Line - Length = " msgstr " " #: render2d_event.cpp:1409 msgid ", Angle = " msgstr ", îÁËÌÏÎ" #: render2d_event.cpp:1440 #, fuzzy msgid "Draw aliphatic chain - Length = " msgstr " " #: render2d_event.cpp:1440 msgid " bonds" msgstr "" #: render2d_text.cpp:121 msgid "Enter subscript" msgstr "÷×ÅÓÔÉ ÉÎÄÅËÓ" #: render2d_text.cpp:122 msgid "Please type or edit the subscript for this bracket:" msgstr "" #: retro.cpp:34 msgid "No reactions found" msgstr "" #: retro.cpp:99 msgid "" "The following reactions could have resulted in this product:\n" "\n" msgstr "" #: retro.cpp:100 msgid "" "\n" "Target bonds will be highlighted in green.\n" "To see reactions affecting a highlighted bond, right-click on the bond and " "select Info.\n" "To clear highlights, select Undo from the Edit menu, or press Ctrl+Z." msgstr "" #: retro.cpp:102 retro.cpp:104 msgid "Reverse reactions list" msgstr "" #: retro.cpp:105 msgid "No reactions in the database could yield the selected molecule." msgstr "" #: ringdialog.cpp:37 msgid "Ring tool" msgstr "éÎÓÔÒÕÍÅÎÔÙ ÁÒÏÍÁÔÉÞÅÓËÏÇÏ ËÏÌØÃÁ" #: ringdialog.cpp:41 msgid "Choose a structure from list:" msgstr "" #: smilesdialog.cpp:30 msgid "Enter SMILES string" msgstr "" #: smilesdialog.cpp:31 msgid "Enter SMILES string:" msgstr "" #: to3d.cpp:263 #, fuzzy msgid "Save 3D file as..." msgstr "óÏÈÒÁÎÉÔØ ÆÁÊÌ ËÁË..." #: to3d.cpp:265 msgid "MDL molfile (*.mol)" msgstr "" #: tool_13c_nmr.cpp:26 msgid "13C NMR spectrum" msgstr "" #: tool_13c_nmr.cpp:57 tool_13c_nmr.cpp:68 tool_13c_nmr.cpp:79 msgid ", intensity " msgstr "" #: tool_13c_nmr.cpp:63 tool_1h_nmr.cpp:61 tool_ir.cpp:61 msgid "Peaks of reactant:\n" msgstr "" #: tool_13c_nmr.cpp:74 tool_1h_nmr.cpp:72 tool_ir.cpp:72 msgid "Peaks of product:\n" msgstr "" #: tool_1h_nmr.cpp:26 msgid "1H NMR spectrum" msgstr "" #: tool_ir.cpp:26 msgid "IR spectrum" msgstr "" #: xruler.cpp:58 xruler.cpp:82 msgid "px" msgstr "" #: xruler.cpp:59 xruler.cpp:83 #, fuzzy msgid "in" msgstr "ÄÀÊÍ" #: http.h:21 msgid "Accessing network" msgstr "" #: http.h:24 #, fuzzy msgid "Please wait." msgstr "ûÉÒÉÎÁ ÂÕÍÁÇÉ" #: molinfodialog.h:34 msgid "CAS:" msgstr "" #: molinfodialog.h:40 #, fuzzy msgid "Name:" msgstr "îÁÚ×ÁÎÉÅ: " #~ msgid "Estimate partial charges" #~ msgstr "ïÃÅÎÉÔØ ÞÁÓÔÉÞÎÙÅ ÉÚÍÅÎÅÎÉÑ " #~ msgid "Retrosynthesis" #~ msgstr "ïÂÒÁÔÎÏÅ ÄÅÊÓÔ×ÉÅ ÓÉÎÔÅÚÁ" #~ msgid "" #~ "This copy of XDrawChem is more than 90 days old. A more recent version " #~ "may be available at\n" #~ "http://freshmeat.net/projects/xdrawchem/" #~ msgstr "" #~ "üÔÁ ËÏÐÉÑ XDrawChem ÓÔÁÒÅÅ 90 ÄÎÅÊ. õÖÅ ÍÏÖÅÔ ÂÙÔØ ÄÏÓÔÕÐÎÁ ÂÏÌÅÅ ÎÏ×ÁÑ " #~ "×ÅÒÓÉÑ ÐÏ ÁÄÒÅÓÕ\n" #~ "http://freshmeat.net/projects/xdrawchem/" xdrawchem-v1.11.0/translation/xdrawchem.pot000066400000000000000000001243721371466245600210350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-08-10 23:25+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: application.cpp:164 msgid "" "Click this button to open a file.

    You can also select the Open " "command from the File menu." msgstr "" #: application.cpp:165 msgid "" "Click this button to save the file you are editing.

    You can also " "select the Save command from the File menu.

    " msgstr "" #: application.cpp:166 msgid "" "Click this button to print the file you are editing.

    You can also " "select the Print command from the File menu." msgstr "" #: application.cpp:167 msgid "" "Click this button to cut a selection.

    You can also select the Cut " "command from the Edit menu, or press Ctrl+X." msgstr "" #: application.cpp:168 msgid "" "Click this button to copy a selection.

    You can also select the Copy " "command from the Edit menu, or press Ctrl+C." msgstr "" #: application.cpp:169 msgid "" "Click this button to paste a selection.

    You can also select the Paste " "command from the Edit menu, or press Ctrl+V." msgstr "" #: application.cpp:170 msgid "Click this button to zoom in." msgstr "" #: application.cpp:171 msgid "Click this button to zoom out." msgstr "" #: application.cpp:174 msgid "" "Select tool

    Use the Select tool to select and move items inside a box." "

    You can select multiple items and cut, copy, move and rotate them." msgstr "" #: application.cpp:175 msgid "" "Lasso tool

    Use the Lasso tool to select and move items by drawing a " "loop around them.

    You can select multiple items and cut, copy, move " "and rotate them." msgstr "" #: application.cpp:176 msgid "Erase tool

    Use the Erase tool to erase individual items." msgstr "" #: application.cpp:177 msgid "" "Line tool

    Use the Line tool to draw bonds. Draw over existing bonds " "to create double and triple bonds." msgstr "" #: application.cpp:178 msgid "" "Dashed Line tool

    Use the Dashed Line tool to draw dashed lines. Draw " "over existing bonds to add dashed lines (to indicate resonance, etc.)." msgstr "" #: application.cpp:179 msgid "" "Chain tool

    Use the Chain tool to draw aliphatic chains. The length " "of each segment is the current bond length." msgstr "" #: application.cpp:180 msgid "" "Stereo Up Line tool

    Use the Line tool to draw stereo-up lines, as " "shown on the button." msgstr "" #: application.cpp:181 msgid "" "Stereo Down Line tool

    Use the Line tool to draw stereo-down lines, as " "shown on the button." msgstr "" #: application.cpp:182 msgid "" "Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, as shown on " "the button." msgstr "" #: application.cpp:183 msgid "" "Arrow tool

    Use the Arrow tool to draw straight arrows.

    Click " "to draw a straight arrow.

    Click and hold to pick from a list of " "available arrows." msgstr "" #: application.cpp:184 msgid "" "Curved Arrow tool

    Use the Curved Arrow tool to insert curved arrows." "

    Click and hold to select from a picture menu of arrows." msgstr "" #: application.cpp:185 msgid "" "Bracket tool

    Use the Bracket tool to draw brackets and parentheses." "

    Click to draw square brackets.

    Click and hold to select from " "a picture menu of brackets." msgstr "" #: application.cpp:186 msgid "" "Text tool

    Use the Text tool to add text and label atoms and points." "
    (See manual for info on formatting text)" msgstr "" #: application.cpp:187 msgid "" "Ring tool

    Use the Ring tool to insert ready-made rings and structures." "

    Click to open the ring dialog, which allows selection from a list of " "all built-in rings and structures.

    Click and hold to select from a " "picture menu of select rings.
    (See manual for more info on modifying this " "menu)" msgstr "" #: application.cpp:188 msgid "" "Symbol tool

    Use the Symbol tool to insert symbols.

    Click and " "hold to select from a picture menu of symbols.
    " msgstr "" #: application.cpp:223 msgid "File Operations" msgstr "" #: application.cpp:228 msgid "Open file" msgstr "" #: application.cpp:235 msgid "Save file" msgstr "" #: application.cpp:242 msgid "Print file" msgstr "" #: application.cpp:249 render2d_event.cpp:283 msgid "Cut" msgstr "" #: application.cpp:256 render2d_event.cpp:284 msgid "Copy" msgstr "" #: application.cpp:263 msgid "Paste" msgstr "" #: application.cpp:270 msgid "Zoom In" msgstr "" #: application.cpp:277 msgid "Zoom Out" msgstr "" #: application.cpp:291 msgid "Set drawing color" msgstr "" #: application.cpp:295 msgid "Set line thickness" msgstr "" #: application.cpp:296 msgid "Set Line Thickness" msgstr "" #: application.cpp:310 msgid "Set font" msgstr "" #: application.cpp:311 msgid "Set Font" msgstr "" #: application.cpp:320 msgid "Set font size" msgstr "" #: application.cpp:321 msgid "Set Font Size" msgstr "" #: application.cpp:335 msgid "Left-justify selected text" msgstr "" #: application.cpp:343 msgid "Center selected text" msgstr "" #: application.cpp:351 msgid "Right-justify selected text" msgstr "" #: application.cpp:359 msgid "Make selected text bold (Ctrl+B)" msgstr "" #: application.cpp:369 msgid "Italicize selected text (Ctrl+I)" msgstr "" #: application.cpp:379 msgid "Underline selected text (Ctrl+U)" msgstr "" #: application.cpp:389 msgid "Superscript selected text (Ctrl-Plus)" msgstr "" #: application.cpp:400 msgid "Subscript selected text (Ctrl-Minus)" msgstr "" #: application.cpp:416 netchoosedialog.cpp:89 render2d_event.cpp:282 msgid "Select" msgstr "" #: application.cpp:423 msgid "Lasso" msgstr "" #: application.cpp:430 msgid "Erase" msgstr "" #: application.cpp:437 msgid "Draw line" msgstr "" #: application.cpp:445 msgid "Draw dashed line" msgstr "" #: application.cpp:453 msgid "Draw aliphatic chain" msgstr "" #: application.cpp:461 msgid "Draw stereo-up line" msgstr "" #: application.cpp:469 msgid "Draw stereo-down line" msgstr "" #: application.cpp:477 msgid "Draw wavy bond" msgstr "" #: application.cpp:485 msgid "Draw arrow" msgstr "" #: application.cpp:495 msgid "Draw curved arrow" msgstr "" #: application.cpp:505 msgid "Draw bracket" msgstr "" #: application.cpp:515 msgid "Draw or edit text" msgstr "" #: application.cpp:523 msgid "Draw ring" msgstr "" #: application.cpp:534 msgid "Draw symbol" msgstr "" #: application.cpp:542 msgid "Canned Structures" msgstr "" #: application.cpp:550 msgid "Cyclopropane" msgstr "" #: application.cpp:558 msgid "Cyclobutane" msgstr "" #: application.cpp:566 msgid "Cyclopentane" msgstr "" #: application.cpp:574 msgid "Cyclopentadiene" msgstr "" #: application.cpp:582 msgid "Cyclohexane" msgstr "" #: application.cpp:590 msgid "Cyclohexane - chair conformation" msgstr "" #: application.cpp:598 msgid "Cyclohexane - boat conformation" msgstr "" #: application.cpp:606 msgid "Benzene" msgstr "" #: application.cpp:616 msgid "Biochemical drawing tools" msgstr "" #: application.cpp:621 helpwindow.cpp:89 msgid "&File" msgstr "" #: application.cpp:623 msgid "&New" msgstr "" #: application.cpp:625 msgid "&Open" msgstr "" #: application.cpp:630 msgid "&Find on Internet" msgstr "" #: application.cpp:634 msgid "&Save" msgstr "" #: application.cpp:638 msgid "Save &as..." msgstr "" #: application.cpp:640 msgid "Save picture..." msgstr "" #: application.cpp:643 msgid "Pa&ge setup" msgstr "" #: application.cpp:644 helpwindow.cpp:68 msgid "&Print" msgstr "" #: application.cpp:648 graphdialog.cpp:42 tool_13c_nmr.cpp:41 #: tool_1h_nmr.cpp:41 tool_ir.cpp:41 msgid "Close" msgstr "" #: application.cpp:649 msgid "Quit" msgstr "" #: application.cpp:652 msgid "Rotate 90 degrees clockwise" msgstr "" #: application.cpp:654 msgid "Rotate 180 degrees" msgstr "" #: application.cpp:655 msgid "Rotate 90 degrees counterclockwise" msgstr "" #: application.cpp:659 msgid "Flip &horizontal" msgstr "" #: application.cpp:660 msgid "Flip &vertical" msgstr "" #: application.cpp:663 msgid "Normal (100%)" msgstr "" #: application.cpp:665 msgid "Zoom out" msgstr "" #: application.cpp:666 msgid "Zoom in" msgstr "" #: application.cpp:680 msgid "&Edit" msgstr "" #: application.cpp:682 msgid "&Undo" msgstr "" #: application.cpp:683 msgid "Insert s&ymbol" msgstr "" #: application.cpp:687 msgid "Cu&t" msgstr "" #: application.cpp:688 msgid "&Copy" msgstr "" #: application.cpp:689 msgid "&Paste" msgstr "" #: application.cpp:690 msgid "Clear" msgstr "" #: application.cpp:692 msgid "Select &All" msgstr "" #: application.cpp:693 msgid "&Deselect All" msgstr "" #: application.cpp:695 msgid "&Rotate" msgstr "" #: application.cpp:696 msgid "&Flip" msgstr "" #: application.cpp:698 msgid "&Zoom" msgstr "" #: application.cpp:701 msgid "&Group" msgstr "" #: application.cpp:702 msgid "Select &Reactant" msgstr "" #: application.cpp:704 msgid "Select &Product" msgstr "" #: application.cpp:706 msgid "Clear &group" msgstr "" #: application.cpp:708 msgid "Clear all &groups" msgstr "" #: application.cpp:713 msgid "Forma&t" msgstr "" #: application.cpp:715 msgid "&Bond - Fixed length and angle" msgstr "" #: application.cpp:718 msgid "&Arrow - Fixed length and angle" msgstr "" #: application.cpp:725 msgid "Set background &color" msgstr "" #: application.cpp:727 msgid "Toggle &grid" msgstr "" #: application.cpp:729 msgid "&Drawing settings..." msgstr "" #: application.cpp:731 msgid "&XDC settings..." msgstr "" #: application.cpp:736 msgid "Estimate gas-phase enthalphy change" msgstr "" #: application.cpp:738 msgid "Compare 1H NMR" msgstr "" #: application.cpp:740 msgid "Compare 13C NMR" msgstr "" #: application.cpp:747 msgid "Reverse reactions" msgstr "" #: application.cpp:753 msgid "Get bond identifier" msgstr "" #: application.cpp:757 msgid "T&ools" msgstr "" #: application.cpp:758 msgid "Clean up molecule" msgstr "" #: application.cpp:759 msgid "Auto &layout" msgstr "" #: application.cpp:760 msgid "Create custom ring" msgstr "" #: application.cpp:763 msgid "Molecule information..." msgstr "" #: application.cpp:765 msgid "Predict 1H NMR" msgstr "" #: application.cpp:766 msgid "Predict 13C NMR" msgstr "" #: application.cpp:767 msgid "Predict IR" msgstr "" #: application.cpp:768 msgid "Predict pKa" msgstr "" #: application.cpp:769 msgid "Predict octanol-water partition (Kow)" msgstr "" #: application.cpp:770 msgid "Reaction" msgstr "" #: application.cpp:772 msgid "Input SMILES" msgstr "" #: application.cpp:773 msgid "Output SMILES" msgstr "" #: application.cpp:774 msgid "Output InChI" msgstr "" #: application.cpp:776 msgid "Build 3D model of molecule" msgstr "" #: application.cpp:782 helpwindow.cpp:92 msgid "&Help" msgstr "" #: application.cpp:784 msgid "&Manual" msgstr "" #: application.cpp:785 msgid "&Did You Know?" msgstr "" #: application.cpp:786 msgid "&About" msgstr "" #: application.cpp:787 msgid "&Support" msgstr "" #: application.cpp:788 msgid "&References" msgstr "" #: application.cpp:790 msgid "What's &This" msgstr "" #: application.cpp:873 msgid "Antibody" msgstr "" #: application.cpp:876 msgid "Newman projection symbol" msgstr "" #: application.cpp:877 msgid "Newman projection - staggered (anti)" msgstr "" #: application.cpp:878 msgid "Newman projection - eclipsed" msgstr "" #: application.cpp:936 msgid "Cubic bezier" msgstr "" #: application.cpp:939 msgid "Cubic bezier - half arrow" msgstr "" #: application.cpp:942 msgid "Cubic bezier - full arrow" msgstr "" #: application.cpp:988 application_ring.cpp:351 msgid "User-defined" msgstr "" #: application.cpp:1214 application_ob.cpp:190 application_ob.cpp:201 msgid "Could not write to " msgstr "" #: application.cpp:1220 application_ob.cpp:194 application_ob.cpp:205 #: application_ob.cpp:238 msgid "Saved file " msgstr "" #: application.cpp:1272 msgid "Save as picture..." msgstr "" #: application.cpp:1307 application.cpp:1361 application.cpp:1367 msgid "Saved picture file " msgstr "" #: application.cpp:1309 application.cpp:1363 application.cpp:1369 msgid "Unable to save picture!" msgstr "" #: application.cpp:1466 msgid "" "\n" "Bryan Herger\n" "bherger@users.sourceforge.net\n" "\n" "Please subscribe to the mailing list for information about future releases.\n" "Send a message to xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n" "\n" "XDrawChem is copyright (C) 2004 Bryan Herger.\n" "Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint " "project\n" "OpenBabel code copyright (C) 2003 by the OpenBabel project team.\n" "See file COPYRIGHT.txt for more details" msgstr "" #: application.cpp:1470 msgid "How to get help" msgstr "" #: application.cpp:1471 msgid "" "Current information on XDrawChem can always be found at\n" "http://xdrawchem.sourceforge.net/\n" "The latest release will be posted here, as well as links to mailing lists " "and the bug tracker.\n" "\n" "Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/" "tracker/?group_id=34518\n" "\n" "There are two mailing lists: xdrawchem-announce, where new releases will be " "announced,\n" "and xdrawchem-user, for open discussion among XDrawChem users.\n" "Subscribe by sending a blank e-mail with subject \"subscribe\" to \n" "\"xdrawchem-announce-request@lists.sourceforge.net\" or\n" "\"xdrawchem-user-request@lists.sourceforge.net\"\n" "\n" "You can contact the author directly at\n" "bherger@users.sourceforge.net" msgstr "" #: application.cpp:1551 msgid "Database query failed" msgstr "" #: application.cpp:1551 msgid "No molecules in the database match the query." msgstr "" #: application.cpp:1788 application.cpp:1796 application.cpp:1803 #: application.cpp:1810 #, qt-format msgid "Zoom = %1 %" msgstr "" #: application.cpp:1814 msgid "XDC Settings" msgstr "" #: application.cpp:1815 msgid "Change XDrawChem settings:" msgstr "" #: application.cpp:1816 msgid "&Main font" msgstr "" #: application.cpp:1816 msgid "&Ruler font" msgstr "" #: application.cpp:1817 bondedit.cpp:252 charsel.cpp:68 crings_dialog.cpp:137 #: fixeddialog.cpp:144 molinfodialog.cpp:53 netchoosedialog.cpp:94 #: netdialog.cpp:80 pagesetupdialog.cpp:109 peptidebuilder.cpp:78 #: ringdialog.cpp:55 smilesdialog.cpp:41 textshapedialog.cpp:66 msgid "Cancel" msgstr "" #: application_ob.cpp:35 tool_2d3d.cpp:92 msgid "--Select a filter-- (*)" msgstr "" #: application_ob.cpp:38 msgid "CDXML - ChemDraw text/XML format (*)" msgstr "" #: application_ob.cpp:41 msgid "CDX - ChemDraw binary format (*)" msgstr "" #: application_ob.cpp:44 msgid "XDC - XDrawChem native format (*)" msgstr "" #: application_ob.cpp:68 msgid "Open file..." msgstr "" #: application_ob.cpp:83 application_ob.cpp:165 tool_2d3d.cpp:113 msgid "Could not determine file type" msgstr "" #: application_ob.cpp:84 application_ob.cpp:166 tool_2d3d.cpp:114 msgid "Please select a file type from the list." msgstr "" #: application_ob.cpp:95 msgid "Couldn't open file" msgstr "" #: application_ob.cpp:95 msgid "Could not open the file: " msgstr "" #: application_ob.cpp:96 application_ob.cpp:104 msgid "Unable to load " msgstr "" #: application_ob.cpp:110 application_ob.cpp:140 msgid "Loaded document " msgstr "" #: application_ob.cpp:126 msgid "Problem while opening the file" msgstr "" #: application_ob.cpp:127 msgid "Cannot open the specified file." msgstr "" #: application_ob.cpp:153 tool_2d3d.cpp:107 msgid "Save file as..." msgstr "" #: application_ob.cpp:158 msgid "Overwrite file?" msgstr "" #: application_ob.cpp:158 #, qt-format msgid "Overwrite existing file: %1 ?" msgstr "" #: application_ob.cpp:224 msgid "IOIface Data error" msgstr "" #: application_ob.cpp:225 msgid "" "Cannot convert the molecule.\n" "Conversion failed in ioiface.cpp" msgstr "" #: application_ob.cpp:231 tool_2d3d.cpp:133 msgid "Problem while writing the file" msgstr "" #: application_ob.cpp:232 tool_2d3d.cpp:134 msgid "Cannot write the specified file." msgstr "" #: application_ring.cpp:121 msgid "[*] Cyclopropane" msgstr "" #: application_ring.cpp:125 msgid "[*] Cyclobutane" msgstr "" #: application_ring.cpp:129 msgid "[*] Cyclopentane" msgstr "" #: application_ring.cpp:133 msgid "Imidazole" msgstr "" #: application_ring.cpp:137 msgid "[*] Cyclopentadiene" msgstr "" #: application_ring.cpp:141 msgid "[*] Cyclohexane (flat)" msgstr "" #: application_ring.cpp:145 msgid "Cyclohexane (boat)" msgstr "" #: application_ring.cpp:149 msgid "Cyclohexane (chair)" msgstr "" #: application_ring.cpp:153 msgid "[*] Benzene" msgstr "" #: application_ring.cpp:157 msgid "Pyrimidine" msgstr "" #: application_ring.cpp:161 msgid "[*] Cycloheptane" msgstr "" #: application_ring.cpp:165 msgid "[*] Cyclooctane" msgstr "" #: application_ring.cpp:169 msgid "Indole" msgstr "" #: application_ring.cpp:173 msgid "Purine" msgstr "" #: application_ring.cpp:177 msgid "Naphthalene" msgstr "" #: application_ring.cpp:181 msgid "Biphenyl" msgstr "" #: application_ring.cpp:185 msgid "Anthracene" msgstr "" #: application_ring.cpp:189 msgid "Steroid (fused ring template)" msgstr "" #: application_ring.cpp:192 msgid "Rings" msgstr "" #: application_ring.cpp:197 msgid "Alanine" msgstr "" #: application_ring.cpp:201 msgid "Arginine" msgstr "" #: application_ring.cpp:205 msgid "Asparagine" msgstr "" #: application_ring.cpp:209 msgid "Aspartic acid" msgstr "" #: application_ring.cpp:213 msgid "Cysteine" msgstr "" #: application_ring.cpp:217 msgid "Glutamic acid" msgstr "" #: application_ring.cpp:221 msgid "Glutamine" msgstr "" #: application_ring.cpp:225 msgid "Glycine" msgstr "" #: application_ring.cpp:229 msgid "Histidine" msgstr "" #: application_ring.cpp:233 msgid "Isoleucine" msgstr "" #: application_ring.cpp:237 msgid "Leucine" msgstr "" #: application_ring.cpp:241 msgid "Lysine" msgstr "" #: application_ring.cpp:245 msgid "Methionine" msgstr "" #: application_ring.cpp:249 msgid "Nitrophenylalanine" msgstr "" #: application_ring.cpp:253 msgid "Phenylalanine" msgstr "" #: application_ring.cpp:257 msgid "Proline" msgstr "" #: application_ring.cpp:261 msgid "Serine" msgstr "" #: application_ring.cpp:265 msgid "Statine" msgstr "" #: application_ring.cpp:269 msgid "Threonine" msgstr "" #: application_ring.cpp:273 msgid "Tryptophan" msgstr "" #: application_ring.cpp:277 msgid "Tyrosine" msgstr "" #: application_ring.cpp:281 msgid "Valine" msgstr "" #: application_ring.cpp:284 msgid "Amino acids" msgstr "" #: application_ring.cpp:289 msgid "Adenine" msgstr "" #: application_ring.cpp:292 msgid "Cytosine" msgstr "" #: application_ring.cpp:295 msgid "Guanine" msgstr "" #: application_ring.cpp:298 msgid "Thymine" msgstr "" #: application_ring.cpp:301 msgid "Uracil" msgstr "" #: application_ring.cpp:303 msgid "Nucleic acids" msgstr "" #: application_ring.cpp:308 msgid "Ribose" msgstr "" #: application_ring.cpp:312 msgid "Deoxyribose" msgstr "" #: application_ring.cpp:316 msgid "D-fructose" msgstr "" #: application_ring.cpp:320 msgid "D-glucose" msgstr "" #: application_ring.cpp:323 msgid "Sugars" msgstr "" #: application_ring.cpp:327 msgid "[*] FMOC" msgstr "" #: application_ring.cpp:330 msgid "[*] BOC" msgstr "" #: application_ring.cpp:333 msgid "[*] DABCYL" msgstr "" #: application_ring.cpp:336 msgid "[*] DABSYL" msgstr "" #: application_ring.cpp:339 msgid "[*] DANSYL" msgstr "" #: application_ring.cpp:342 msgid "[*] EDANS" msgstr "" #: application_ring.cpp:345 msgid "[*] Biotin" msgstr "" #: application_ring.cpp:348 msgid "Useful groups" msgstr "" #: application_ring.cpp:373 msgid "Add new..." msgstr "" #: bondedit.cpp:52 msgid "Color" msgstr "" #: bondedit.cpp:57 msgid "Arrow editor" msgstr "" #: bondedit.cpp:58 bondedit.cpp:165 bondedit.cpp:187 bondedit.cpp:212 msgid "Style:" msgstr "" #: bondedit.cpp:61 msgid "Plain arrow" msgstr "" #: bondedit.cpp:64 msgid "NR arrow" msgstr "" #: bondedit.cpp:67 msgid "Dashed arrow" msgstr "" #: bondedit.cpp:70 msgid "Two-way arrow" msgstr "" #: bondedit.cpp:73 msgid "Split two-way arrow" msgstr "" #: bondedit.cpp:76 msgid "Retrosynthetic arrow" msgstr "" #: bondedit.cpp:98 msgid "Bond editor" msgstr "" #: bondedit.cpp:100 msgid "Bond order:" msgstr "" #: bondedit.cpp:103 msgid "Dashed line" msgstr "" #: bondedit.cpp:106 msgid "Single" msgstr "" #: bondedit.cpp:109 msgid "Stereo-up" msgstr "" #: bondedit.cpp:112 msgid "Stereo-down" msgstr "" #: bondedit.cpp:115 msgid "Wavy" msgstr "" #: bondedit.cpp:118 msgid "Single/double (aromatic)" msgstr "" #: bondedit.cpp:121 msgid "Double" msgstr "" #: bondedit.cpp:124 msgid "Double/triple" msgstr "" #: bondedit.cpp:127 msgid "Triple" msgstr "" #: bondedit.cpp:134 msgid "Bond thickness:" msgstr "" #: bondedit.cpp:153 msgid "Double bond alignment:" msgstr "" #: bondedit.cpp:156 msgid "Auto" msgstr "" #: bondedit.cpp:157 msgid "Left" msgstr "" #: bondedit.cpp:158 msgid "Center" msgstr "" #: bondedit.cpp:159 msgid "Right" msgstr "" #: bondedit.cpp:164 msgid "Bracket editor" msgstr "" #: bondedit.cpp:168 msgid "Square bracket" msgstr "" #: bondedit.cpp:171 msgid "Parentheses" msgstr "" #: bondedit.cpp:174 msgid "Curly bracket" msgstr "" #: bondedit.cpp:177 msgid "Box" msgstr "" #: bondedit.cpp:180 textshapedialog.cpp:23 msgid "Ellipse" msgstr "" #: bondedit.cpp:186 msgid "Curved Arrow editor" msgstr "" #: bondedit.cpp:190 msgid "90 degree clockwise" msgstr "" #: bondedit.cpp:193 msgid "180 degree clockwise" msgstr "" #: bondedit.cpp:196 msgid "270 degree clockwise" msgstr "" #: bondedit.cpp:199 msgid "90 degree counterclockwise" msgstr "" #: bondedit.cpp:202 msgid "180 degree counterclockwise" msgstr "" #: bondedit.cpp:205 msgid "270 degree counterclockwise" msgstr "" #: bondedit.cpp:211 msgid "Symbol editor" msgstr "" #: bondedit.cpp:215 msgid "Positive charge" msgstr "" #: bondedit.cpp:218 msgid "Negative charge" msgstr "" #: bondedit.cpp:221 msgid "Partial positive charge" msgstr "" #: bondedit.cpp:224 msgid "Partial negative charge" msgstr "" #: bondedit.cpp:227 msgid "Single electron" msgstr "" #: bondedit.cpp:230 msgid "Electron pair" msgstr "" #: bondedit.cpp:233 msgid "Stereochemical ring hydrogen" msgstr "" #: bondedit.cpp:236 msgid "p orbital" msgstr "" #: bondedit.cpp:239 msgid "p double" msgstr "" #: bondedit.cpp:242 msgid "bead" msgstr "" #: bondedit.cpp:248 chemdata_tools.cpp:207 crings_dialog.cpp:133 dyk.cpp:40 #: fixeddialog.cpp:136 molinfodialog.cpp:40 pagesetupdialog.cpp:105 #: peptidebuilder.cpp:74 smilesdialog.cpp:37 textshapedialog.cpp:62 msgid "OK" msgstr "" #: charsel.cpp:44 msgid "Insert symbol" msgstr "" #: charsel.cpp:47 msgid "Font:" msgstr "" #: chemdata_rxn.cpp:41 msgid "Missing reactant or product" msgstr "" #: chemdata_rxn.cpp:42 msgid "You must select at least one reactant and one product." msgstr "" #: chemdata_rxn.cpp:50 msgid "Estimated gas-phase enthalpy change:\n" msgstr "" #: chemdata_rxn.cpp:59 #, qt-format msgid "Reactants = %1 kJ/mol\n" msgstr "" #: chemdata_rxn.cpp:68 #, qt-format msgid "Products = %1 kJ/mol\n" msgstr "" #: chemdata_rxn.cpp:70 #, qt-format msgid "Reaction = %1 kJ/mol" msgstr "" #: chemdata_rxn.cpp:71 msgid "Enthalpy change" msgstr "" #: chemdata_rxn.cpp:81 msgid "1H NMR compare error" msgstr "" #: chemdata_rxn.cpp:82 chemdata_rxn.cpp:138 msgid "Please select only one reactant and one product to compare." msgstr "" #: chemdata_rxn.cpp:137 msgid "13C NMR compare error" msgstr "" #: chemdata_tools.cpp:178 msgid "Octanol-water partition" msgstr "" #: chemdata_tools.cpp:178 #, qt-format msgid "Estimated octanol-water partition constant (log Kow) = %1" msgstr "" #: chemdata_tools.cpp:200 msgid "SMILES string" msgstr "" #: chemdata_tools.cpp:200 msgid "SMILES string for selected molecule:" msgstr "" #: chemdata_tools.cpp:207 msgid "InChI string" msgstr "" #: chemdata_tools.cpp:207 msgid "InChI string for selected molecule:" msgstr "" #: chemdata_tools.cpp:207 msgid "Copy to clipboard" msgstr "" #: chemdata_tools.cpp:212 msgid "Could not convert to InChI string." msgstr "" #: crings_dialog.cpp:123 msgid "Add custom ring to menu list" msgstr "" #: dyk.cpp:17 dyk.cpp:20 msgid "Did You Know?" msgstr "" #: dyk.cpp:28 msgid "Previous tip" msgstr "" #: dyk.cpp:32 msgid "Next tip" msgstr "" #: dyk.cpp:36 msgid "Don't show this dialog at startup" msgstr "" #: dyk.cpp:55 msgid "" "XDrawChem can be run from the command line to produce images. Type " "\"xdrawchem --help\" for details." msgstr "" #: dyk.cpp:56 msgid "" "When in select mode, you can edit most objects by right-clicking on them." msgstr "" #: dyk.cpp:57 msgid "" "When drawing bonds, you can edit the bond style by right-clicking on the " "bond." msgstr "" #: dyk.cpp:58 msgid "" "When in select mode, press Shift+LeftButton and drag over part of a molecule " "to select the entire molecule." msgstr "" #: dyk.cpp:59 msgid "" "When in select mode, press Ctrl+LeftButton on a molecule to get molecule " "information." msgstr "" #: dyk.cpp:60 msgid "" "Bond length, bond angle, and units are set in the Drawing Settings option " "under the Format menu." msgstr "" #: dyk.cpp:61 msgid "" "You can attach a subscript to a bracket by selecting the text tool, then " "clicking on the bracket." msgstr "" #: dyk.cpp:62 msgid "" "You can toggle the grid display by pressing Ctrl+G. Turning the grid on or " "off does not affect whether objects snap to the grid." msgstr "" #: dyk.cpp:63 msgid "" "A number of ring and molecule templates are available from the ring tool, " "including single and fused rings, amino acids, and nucleosides." msgstr "" #: dyk.cpp:64 msgid "Remember to select a file type when opening or saving documents." msgstr "" #: dyk.cpp:65 msgid "" "The option \"Clean up molecule\" under the Tools menu can be used to refine " "structures such as rings and macromolecules." msgstr "" #: dyk.cpp:66 msgid "" "It's possible to attach rings to structures by selecting a ring and clicking " "on an atom." msgstr "" #: dyk.cpp:67 msgid "" "XDrawChem can automatically attach amino acids from N-terminal to C-terminal " "(but the result isn't always pretty :)" msgstr "" #: dyk.cpp:68 msgid "" "Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/" msgstr "" #: dyk.cpp:69 msgid "" "XDrawChem can draw over 100,000 substances using its Internet database. " "Select Find on internet from the File menu to search for compounds." msgstr "" #: dyk.cpp:70 msgid "" "XDrawChem can identify compounds by CAS number and occasionally by name. " "Select Molecule information from the Tools menu and click on a molecule. " "However, this only works if the compound is listed in the database." msgstr "" #: fixeddialog.cpp:29 msgid "Set fixed angle and length" msgstr "" #: fixeddialog.cpp:32 msgid "Units:" msgstr "" #: fixeddialog.cpp:35 fixeddialog.cpp:253 pagesetupdialog.cpp:69 msgid "pixels" msgstr "" #: fixeddialog.cpp:37 fixeddialog.cpp:256 pagesetupdialog.cpp:74 msgid "inches" msgstr "" #: fixeddialog.cpp:38 fixeddialog.cpp:259 pagesetupdialog.cpp:79 xruler.cpp:60 #: xruler.cpp:84 msgid "cm" msgstr "" #: fixeddialog.cpp:44 msgid "Bond fixed length:" msgstr "" #: fixeddialog.cpp:50 msgid "Bond fixed angle:" msgstr "" #: fixeddialog.cpp:66 fixeddialog.cpp:91 msgid "degrees" msgstr "" #: fixeddialog.cpp:69 msgid "Arrow fixed length:" msgstr "" #: fixeddialog.cpp:72 msgid "Arrow fixed angle:" msgstr "" #: fixeddialog.cpp:94 msgid "Double bond spacing:" msgstr "" #: fixeddialog.cpp:110 msgid "Show grid" msgstr "" #: fixeddialog.cpp:111 msgid "Do not show grid" msgstr "" #: fixeddialog.cpp:112 msgid "Show square grid" msgstr "" #: fixeddialog.cpp:113 msgid "Show hex grid" msgstr "" #: fixeddialog.cpp:116 msgid "Snap to grid" msgstr "" #: fixeddialog.cpp:122 msgid "Grid spacing" msgstr "" #: fixeddialog.cpp:140 msgid "Default" msgstr "" #: graphdialog.cpp:30 msgid "Print" msgstr "" #: graphdialog.cpp:34 msgid "Export Peak List" msgstr "" #: graphdialog.cpp:38 molinfodialog.cpp:44 tool_13c_nmr.cpp:37 #: tool_1h_nmr.cpp:37 tool_ir.cpp:37 msgid "Help" msgstr "" #: graphwidget.cpp:121 msgid "Red is reactant" msgstr "" #: graphwidget.cpp:124 msgid "Blue is product" msgstr "" #: helpwindow.cpp:70 msgid "&Close" msgstr "" #: helpwindow.cpp:79 msgid "&Backward" msgstr "" #: helpwindow.cpp:82 msgid "&Forward" msgstr "" #: helpwindow.cpp:84 msgid "&Home" msgstr "" #: helpwindow.cpp:87 msgid "&About ..." msgstr "" #: helpwindow.cpp:90 msgid "&Go" msgstr "" #: helpwindow.cpp:106 msgid "Backward" msgstr "" #: helpwindow.cpp:109 msgid "Forward" msgstr "" #: helpwindow.cpp:112 msgid "Home" msgstr "" #: main.cpp:145 msgid "untitled" msgstr "" #: molecule_1h_nmr.cpp:50 msgid "Predicted 1H-NMR" msgstr "" #: molecule_1h_nmr.cpp:65 msgid " Intensity: " msgstr "" #: molecule_1h_nmr.cpp:66 msgid " Multiplicity: " msgstr "" #: molecule.cpp:89 msgid "Reactant" msgstr "" #: molecule.cpp:91 msgid "Product" msgstr "" #: molecule_tools_1.cpp:171 msgid "Predicted 13C-NMR" msgstr "" #: molecule_tools_1.cpp:234 msgid "Predicted IR" msgstr "" #: molecule_tools_1.cpp:248 msgid "~1350-1000, C-N" msgstr "" #: molecule_tools_1.cpp:250 msgid "~1300-1000, C-O" msgstr "" #: molecule_tools_1.cpp:254 msgid "~1660-1600, C=C (cis/vinyl strong; trans weak)" msgstr "" #: molecule_tools_1.cpp:256 msgid "~1690-1640, C=N" msgstr "" #: molecule_tools_1.cpp:258 msgid "~1700 (narrow), C=O" msgstr "" #: molecule_tools_1.cpp:260 msgid "~1350-1300, S=O (~1050 if R-(S=O)-R')" msgstr "" #: molecule_tools_1.cpp:264 molecule_tools_1.cpp:351 molecule_tools_1.cpp:353 msgid "~2250 (narrow), nitrile" msgstr "" #: molecule_tools_1.cpp:317 molecule_tools_1.cpp:319 molecule_tools_1.cpp:321 #: molecule_tools_1.cpp:323 molecule_tools_1.cpp:325 molecule_tools_1.cpp:327 #: molecule_tools_1.cpp:329 msgid "~3000 (broad), C-H" msgstr "" #: molecule_tools_1.cpp:331 molecule_tools_1.cpp:339 molecule_tools_1.cpp:341 msgid "two peaks: ~3400, ~3300, primary N-H" msgstr "" #: molecule_tools_1.cpp:333 molecule_tools_1.cpp:335 molecule_tools_1.cpp:337 msgid "~3300 (broad), secondary N-H" msgstr "" #: molecule_tools_1.cpp:343 molecule_tools_1.cpp:345 molecule_tools_1.cpp:347 msgid "~2550 (broad), S-H" msgstr "" #: molecule_tools_1.cpp:349 molecule_tools_1.cpp:359 molecule_tools_1.cpp:361 msgid "~3400 (broad), O-H" msgstr "" #: molecule_tools_1.cpp:355 msgid "~2270 (narrow), -N=C=O" msgstr "" #: molecule_tools_1.cpp:357 msgid "~2125 (narrow), -N=C=S" msgstr "" #: molecule_tools_1.cpp:363 molecule_tools_1.cpp:365 msgid "~1525 (narrow), -NO2" msgstr "" #: molecule_tools_1.cpp:367 msgid "~1600 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:368 msgid "~1475 (narrow), aromatic ring C=C" msgstr "" #: molecule_tools_1.cpp:580 msgid "10.5 (Guanidine)" msgstr "" #: molecule_tools_1.cpp:600 msgid "9 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:604 msgid "11 (a-carbon between two ketones)" msgstr "" #: molecule_tools_1.cpp:608 msgid "11 (a-carbon between ketone and ester)" msgstr "" #: molecule_tools_1.cpp:612 msgid "13 (a-carbon between two esters)" msgstr "" #: molecule_tools_1.cpp:621 msgid "5 (Aromatic primary amine)" msgstr "" #: molecule_tools_1.cpp:627 msgid "9-10 (Alkene-primary amine)" msgstr "" #: molecule_tools_1.cpp:630 msgid "11 (Aliphatic primary amine)" msgstr "" #: molecule_tools_1.cpp:642 msgid "-4 (pyrrole)" msgstr "" #: molecule_tools_1.cpp:647 msgid "14.4 (secondary amine)" msgstr "" #: molecule_tools_1.cpp:652 msgid "11 (aliphatic secondary amine)" msgstr "" #: molecule_tools_1.cpp:664 msgid "6.8 (conjugated secondary amine)" msgstr "" #: molecule_tools_1.cpp:668 msgid "5 (aromatic secondary amine)" msgstr "" #: molecule_tools_1.cpp:672 molecule_tools_1.cpp:676 msgid "1-3 (purine/pyrimidine)" msgstr "" #: molecule_tools_1.cpp:687 msgid "4 (tertiary amine)" msgstr "" #: molecule_tools_1.cpp:693 msgid "10 (aliphatic tertiary amine)" msgstr "" #: molecule_tools_1.cpp:703 msgid "8 (Peroxy acid)" msgstr "" #: molecule_tools_1.cpp:720 msgid "-1 (sulfonic acid)" msgstr "" #: molecule_tools_1.cpp:734 msgid "4 (Aromatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:738 msgid "4.5 (Aliphatic carboxylic acid)" msgstr "" #: molecule_tools_1.cpp:740 msgid "3 (Aliphatic carboxylic acid, a-halide)" msgstr "" #: molecule_tools_1.cpp:742 msgid "1.3 (Aliphatic carboxylic acid, 2 a-halide)" msgstr "" #: molecule_tools_1.cpp:749 msgid "10 (Aromatic -OH)" msgstr "" #: molecule_tools_1.cpp:751 msgid "16 (Aliphatic -OH)" msgstr "" #: molecule_tools_1.cpp:761 msgid "7.8 (Aromatic -SH)" msgstr "" #: molecule_tools_1.cpp:763 msgid "10.6 (Aliphatic -SH)" msgstr "" #: molecule_tools_1.cpp:770 msgid "Estimated pKa's:" msgstr "" #: molecule_tools_1.cpp:780 msgid "There seem to be no sites with pKa between -1 and 15." msgstr "" #: molecule_tools_1.cpp:783 msgid "Estimated pKa's" msgstr "" #: molecule_tools_2.cpp:482 msgid "Elemental analysis:\n" msgstr "" #: molinfodialog.cpp:16 msgid "Molecule Info" msgstr "" #: molinfodialog.cpp:18 molinfodialog.cpp:19 msgid "Name: " msgstr "" #: molinfodialog.cpp:21 molinfodialog.cpp:22 msgid "Other names: " msgstr "" #: molinfodialog.cpp:25 molinfodialog.cpp:26 msgid "CAS: " msgstr "" #: molinfodialog.cpp:28 molinfodialog.cpp:29 msgid "PubChem compound: " msgstr "" #: molinfodialog.cpp:31 msgid "Molecular weight = " msgstr "" #: molinfodialog.cpp:34 molinfodialog.h:24 msgid "Formula = " msgstr "" #: molinfodialog.cpp:37 msgid "Analysis = " msgstr "" #: molinfodialog.cpp:48 msgid "Search PubChem" msgstr "" #: myfiledialog.cpp:6 msgid "Transparent" msgstr "" #: netdialog.cpp:42 msgid "Find structure via Internet" msgstr "" #: netdialog.cpp:46 msgid "XDC database server:" msgstr "" #: netdialog.cpp:54 msgid "Search type:" msgstr "" #: netdialog.cpp:59 msgid "CAS Number" msgstr "" #: netdialog.cpp:60 msgid "Formula" msgstr "" #: netdialog.cpp:61 msgid "Chemical name" msgstr "" #: netdialog.cpp:64 msgid "Look for:" msgstr "" #: netdialog.cpp:72 msgid "Exact matches only" msgstr "" #: netdialog.cpp:75 msgid "Search" msgstr "" #: pagesetupdialog.cpp:19 msgid "Page setup" msgstr "" #: pagesetupdialog.cpp:22 msgid "Paper size:" msgstr "" #: pagesetupdialog.cpp:25 msgid "Letter (8.5\" x 11\")" msgstr "" #: pagesetupdialog.cpp:26 msgid "Legal (8.5\" x 14\")" msgstr "" #: pagesetupdialog.cpp:27 msgid "A4 (210 mm x 297 mm)" msgstr "" #: pagesetupdialog.cpp:28 msgid "640x480 pixels" msgstr "" #: pagesetupdialog.cpp:29 msgid "800x600 pixels" msgstr "" #: pagesetupdialog.cpp:30 msgid "1024x768 pixels" msgstr "" #: pagesetupdialog.cpp:31 msgid "Custom paper size" msgstr "" #: pagesetupdialog.cpp:50 msgid "Orientation:" msgstr "" #: pagesetupdialog.cpp:53 msgid "Portrait" msgstr "" #: pagesetupdialog.cpp:54 msgid "Landscape" msgstr "" #: pagesetupdialog.cpp:86 msgid "Page width:" msgstr "" #: pagesetupdialog.cpp:96 msgid "Page height:" msgstr "" #: peptidebuilder.cpp:12 msgid "Peptide Builder" msgstr "" #: peptidebuilder.cpp:18 msgid "" "Enter peptide sequence -\n" "three-letter abbreviations:" msgstr "" #: peptidebuilder.cpp:23 msgid "Shortcut: Hold 'Alt' and type one-letter codes!" msgstr "" #: render2d.cpp:130 render2d_event.cpp:801 render2d_event.cpp:1174 msgid "" "Select mode: left click on object to move, right click on object to edit" msgstr "" #: render2d.cpp:141 msgid "Lasso mode: left click and hold to draw lasso" msgstr "" #: render2d.cpp:152 msgid "Draw Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:163 msgid "Draw Dashed Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:174 msgid "Draw Chain mode: left click and drag to draw aliphatic chain" msgstr "" #: render2d.cpp:185 msgid "Draw Stereo-Up Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:196 msgid "" "Draw Stereo-Down Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:207 msgid "Draw Wavy Line mode: left click to draw line, right click to edit" msgstr "" #: render2d.cpp:228 msgid "Draw Arrow mode: left click to draw arrow" msgstr "" #: render2d.cpp:246 msgid "Draw Bracket mode: left click to draw bracket" msgstr "" #: render2d.cpp:258 msgid "Erase mode: left click to erase object" msgstr "" #: render2d.cpp:268 msgid "Text mode: left click to add or edit text" msgstr "" #: render2d.cpp:281 msgid "Draw Symbol mode: left click to add symbol" msgstr "" #: render2d.cpp:295 msgid "Draw graphic object: cubic bezier" msgstr "" #: render2d.cpp:311 render2d.cpp:322 msgid "Left-click to draw Newman projection template" msgstr "" #: render2d.cpp:335 #, qt-format msgid "Draw Ring mode: left click to add %1" msgstr "" #: render2d.cpp:359 msgid "Click on a molecule for information" msgstr "" #: render2d.cpp:362 render2d_event.cpp:1247 msgid "Click on a molecule to calculate its molecular weight" msgstr "" #: render2d.cpp:365 render2d_event.cpp:1260 msgid "Click on a molecule to calculate its empirical formula" msgstr "" #: render2d.cpp:368 msgid "Click on a molecule to calculate its elemental analysis" msgstr "" #: render2d.cpp:371 msgid "Click on a molecule to calculate its 13C NMR" msgstr "" #: render2d.cpp:374 msgid "Click on a molecule to calculate its 1H NMR" msgstr "" #: render2d.cpp:377 msgid "Click on a molecule to calculate its IR" msgstr "" #: render2d.cpp:380 msgid "Click on a molecule to calculate its pKa(s)" msgstr "" #: render2d.cpp:383 msgid "Click on a molecule for possible retrosynthesis" msgstr "" #: render2d.cpp:387 msgid "Click on a molecule to display its bond identifier" msgstr "" #: render2d.cpp:390 msgid "Click on a molecule to calculate its octanol-water partition" msgstr "" #: render2d.cpp:393 msgid "Click on a molecule to generate 3-D coordinates" msgstr "" #: render2d.cpp:396 msgid "Click on a molecule to guess its name" msgstr "" #: render2d.cpp:399 msgid "Click on a molecule to determine its SMILES string" msgstr "" #: render2d.cpp:402 msgid "Click on a molecule to clean up its structure" msgstr "" #: render2d.cpp:405 msgid "Click on a molecule to assign it as a reactant" msgstr "" #: render2d.cpp:408 msgid "Click on a molecule to assign it as a product" msgstr "" #: render2d.cpp:411 msgid "Click on a molecule to clear it group assignment" msgstr "" #: render2d.cpp:414 msgid "Click on a molecule to save it as a custom ring" msgstr "" #: render2d.cpp:417 msgid "Tool test mode" msgstr "" #: render2d.cpp:420 msgid "Click on a molecule" msgstr "" #: render2d.cpp:437 msgid "Select mode: left click to move, right click to edit" msgstr "" #: render2d.cpp:490 msgid "Undo!" msgstr "" #: render2d.cpp:492 msgid "Cannot undo, sorry!" msgstr "" #: render2d_event.cpp:139 msgid "No information." msgstr "" #: render2d_event.cpp:150 msgid "Object information" msgstr "" #: render2d_event.cpp:251 render2d_event.cpp:299 msgid "Object" msgstr "" #: render2d_event.cpp:253 msgid "Arrow" msgstr "" #: render2d_event.cpp:255 msgid "Bond" msgstr "" #: render2d_event.cpp:257 msgid "Bracket" msgstr "" #: render2d_event.cpp:259 msgid "Curved Arrow" msgstr "" #: render2d_event.cpp:261 msgid "Symbol" msgstr "" #: render2d_event.cpp:263 render2d_event.cpp:301 msgid "Text" msgstr "" #: render2d_event.cpp:266 render2d_event.cpp:304 msgid "Edit" msgstr "" #: render2d_event.cpp:268 render2d_event.cpp:281 msgid "Info" msgstr "" #: render2d_event.cpp:270 msgid "Fill color..." msgstr "" #: render2d_event.cpp:271 msgid "No fill" msgstr "" #: render2d_event.cpp:274 render2d_event.cpp:306 msgid "Shape..." msgstr "" #: render2d_event.cpp:279 msgid "Molecule" msgstr "" #: render2d_event.cpp:1162 msgid "Select mode: left click on object to move" msgstr "" #: render2d_event.cpp:1244 render2d_event.cpp:1257 msgid ", click to paste into drawing" msgstr "" #: render2d_event.cpp:1574 msgid "Draw Line - Length = " msgstr "" #: render2d_event.cpp:1574 msgid ", Angle = " msgstr "" #: render2d_event.cpp:1607 msgid "Draw aliphatic chain - Length = " msgstr "" #: render2d_event.cpp:1607 msgid " bonds" msgstr "" #: render2d_text.cpp:135 render2d_text.cpp:306 msgid "Enter subscript" msgstr "" #: render2d_text.cpp:136 render2d_text.cpp:307 msgid "Please type or edit the subscript for this bracket:" msgstr "" #: retro.cpp:34 msgid "No reactions found" msgstr "" #: retro.cpp:99 msgid "" "The following reactions could have resulted in this product:\n" "\n" msgstr "" #: retro.cpp:100 msgid "" "\n" "Target bonds will be highlighted in green.\n" "To see reactions affecting a highlighted bond, right-click on the bond and " "select Info.\n" "To clear highlights, select Undo from the Edit menu, or press Ctrl+Z." msgstr "" #: retro.cpp:102 retro.cpp:104 msgid "Reverse reactions list" msgstr "" #: retro.cpp:105 msgid "No reactions in the database could yield the selected molecule." msgstr "" #: ringdialog.cpp:37 msgid "Ring tool" msgstr "" #: ringdialog.cpp:41 msgid "Choose a structure from list:" msgstr "" #: smilesdialog.cpp:30 msgid "Enter SMILES string" msgstr "" #: smilesdialog.cpp:31 msgid "Enter SMILES string:" msgstr "" #: textshapedialog.cpp:19 msgid "Edit text shape" msgstr "" #: textshapedialog.cpp:22 msgid "No shape" msgstr "" #: textshapedialog.cpp:24 msgid "Rectangle" msgstr "" #: textshapedialog.cpp:25 msgid "Circle" msgstr "" #: textshapedialog.cpp:26 msgid "Square" msgstr "" #: textshapedialog.cpp:30 msgid "Border" msgstr "" #: textshapedialog.cpp:33 msgid "Border color" msgstr "" #: textshapedialog.cpp:40 msgid "Fill" msgstr "" #: textshapedialog.cpp:43 msgid "Fill color" msgstr "" #: textshapedialog.cpp:49 msgid "Width:" msgstr "" #: textshapedialog.cpp:52 msgid "Height:" msgstr "" #: to3d.cpp:279 msgid "Save 3D file as..." msgstr "" #: to3d.cpp:281 msgid "MDL molfile (*.mol)" msgstr "" #: tool_13c_nmr.cpp:26 msgid "13C NMR spectrum" msgstr "" #: tool_13c_nmr.cpp:57 tool_13c_nmr.cpp:68 tool_13c_nmr.cpp:79 msgid ", intensity " msgstr "" #: tool_13c_nmr.cpp:63 tool_1h_nmr.cpp:61 tool_ir.cpp:61 msgid "Peaks of reactant:\n" msgstr "" #: tool_13c_nmr.cpp:74 tool_1h_nmr.cpp:72 tool_ir.cpp:72 msgid "Peaks of product:\n" msgstr "" #: tool_1h_nmr.cpp:26 msgid "1H NMR spectrum" msgstr "" #: tool_ir.cpp:26 msgid "IR spectrum" msgstr "" #: xruler.cpp:58 xruler.cpp:82 msgid "px" msgstr "" #: xruler.cpp:59 xruler.cpp:83 msgid "in" msgstr "" #: http.h:21 msgid "Accessing network" msgstr "" #: http.h:24 msgid "Please wait." msgstr "" #: molinfodialog.h:34 msgid "CAS:" msgstr "" #: molinfodialog.h:41 msgid "PubChem compound:" msgstr "" #: molinfodialog.h:47 msgid "Name:" msgstr "" #: molinfodialog.h:53 msgid "Other names:" msgstr "" xdrawchem-v1.11.0/translation/xdrawchem_da.ts000066400000000000000000005140571371466245600213300ustar00rootroot00000000000000 @default OK O.k. cm cm in i px px &Go &GÃ¥ Box Boks Cut Klip &New &Ny Copy Kopiér Cu&t K&lip Help Hjælp Home Hjem Quit Afslut Wavy Bølget bead drÃ¥be Click on a molecule to determine its IUPAC name Klik pÃ¥ et molekyle for at finde dets IUPAC-navn Loaded document Indlæst dokument Compare 13C NMR Sammenlign 13C NMR &Copy &Kopiér &Edit &Redigér &File &Fil &Flip &Spejl &Help &Hjælp &Home &Hjem &Open &Ã…bn 640x480 pixels 640x480 pixeler &Save &Gem &Undo Fo&rtryd Legal (8.5" x 14") Legal (8.5" x 14") Pyrimidine pyrimidin Plain arrow Almindelig pil Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. Bindingernes længde, bindingsvinklen og enhederne er angivet under tegneindstillinger i Formatér-menuen. Couldn't open file Kunne ikke Ã¥bne filen Clear Ryd Close Luk Color Farve Erase Slet Cyclopentadiene cyclepentadien Paste Indsæt Print Udskriv Rings Ringe Undo! Fortryd! Biphenyl Biphenyl Input SMILES Input SMILES Canned Structures Cylenderformede struktorer Two-way arrow Dobbeltpil Draw curved arrow Tegn krum pil Tyrosine tyrosin Cysteine cystein Snap to grid Fastgør til gitteret Cytosine Cytosin --Select a filter-- (*) --Vælg et filter-- (*) No molecules in the database match the query. Ingen molekyler i databasen passer med forespørgslen. Deoxyribose Deoxyribose Select &Reactant Vælg &reaktant Nucleic acids Nucleotidsyrer Analysis = Analyse = You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. Du kan bestemme om gitteret skal vises eller skjules ved at trykke Ctrl+G. Om man slÃ¥r gitteret til eller fra pÃ¥virker ikke om objekter fastgør sig til gitteret. What's &This Hvad er &dette Bond fixed angle: Fast bindingsvinkel: Missing reactant or product Manglende reaktant eller produkt Please select only one reactant and one product to compare. Vælg kun en reaktant og et produkt til at sammenligne. 90 degree clockwise 90 grader med uret Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Linjeværktøjet<br><br> Brug linjeværktøjet til at tegne bindinger. Tegn ovenpÃ¥ eksisterende bindinger for at lave dobbeltbindinger og tripelbindinger. Amino acids Aminosyrer Draw Stereo-Down Line mode: left click to draw line, right click to edit Tegn 3D-ind linje tilstand: venstreklik for at tegne linje, højreklik for at redigere Square bracket Kantet parentes Export Peak List Eksportér top listen Glutamic acid glutaminsyre Peaks of product: Produktets toppe: Partial positive charge Delvis positiv ladning Cannot write the specified file. Kunne ikke skrive den angivne fil. Draw dashed line Tegn stiplet linje Cubic bezier Kubisk bezier-kurve Cyclopentane Cyclopentan [*] Cyclopentane [*] Cyclopentan Arrow editor Pile-editor Calculate empirical formula Beregn empirisk formel bonds bindinger Text mode: left click to add or edit text Tekst tilstand: venstreklik for at tilføje eller redigere tekst Rotate 90 degrees counterclockwise Rotér 90 grader mod uret Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Klik her for at gemme den fil du har Ã¥ben.<br><br>Du kan ogsÃ¥ bruge menupunktet Gem pÃ¥ Fil-menuen.<br><br> Save &as... Gem &som... Select tool<br><br>Use the Select tool to select and move items.<br><br>You can select multiple items and cut, copy, move and rotate them. Værktøjet Vælg<br><br>Brug Vælg til at udvælge og flytte udsnit.<br><br>Du kan markere flere udsnit og klippe, kopiere, flytte og rotere dem. Toggle &grid &Gitter Til/Fra &About &Om &Close &Luk &Group &Gruppe &Paste &Indsæt &Print &Udskriv Set drawing color Sæt tegnefarve Dashed arrow Stiplet pil Leucine leucin Phenylalanine phenylalanin Isoleucine isolucin 1024x768 pixels 1024x768 pixeler Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Værktøjet 3D-ind<br><br> Brug linjeværktøjet til at tegne 3D-ind linjer, som vist pÃ¥ knappen. Steroid (fused ring template) Steroid (skabelon for kondenserede ringe) Cyclopropane Cyclopropan Left-click to draw Newman projection template Venstre-klik for a tegne Newman-projektionsskabelon [*] Cyclopropane [*] Cyclopropan Flip &horizontal Spejl &vandret Curly bracket Krøllet parentes Enter subscript Sænket skrift Newman projection - staggered (anti) Newman-projektion - forskudt (anti) 1H NMR compare error 1H NMR sammenligningsfejl 1H NMR spectrum 1H NMR spektrum 13C NMR spectrum 13C NMR spektrum A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. En række skabeloner til ringe og molekyler er tilgængelige i ringværktøjet, incl. enkelt- og kondenserede ringe, aminosyrer og nucleotider. Make selected text <b>bold</b> (Ctrl+B) Gør den markerede tekst<b> fed</b> (Ctrl+B) Left-justify selected text Venstrejustér markeret tekst Previous tip Forrige tip <i>Italicize</i> selected text (Ctrl+I) <i>Kursivér</i> den markerede tekst (Ctrl+I) Could not open the file: Kunne ikke Ã¥bne filen: Output SMILES Output SMILES &Find on Internet &Find pÃ¥ internettet Automatically Add &hydrogens Tilføj automatisk &hydrogen &Bond - Fixed length and angle &Binding - Fast længde og vinkel Subscript selected text (Ctrl-Minus) Sænket tekst (Ctrl+Minus) Unable to save picture! Kan ikke gemme billedet! 800x600 pixels 800x600 pixeler Paper size: Papirstørrelse: Partial negative charge Delvis negativ ladning Arrow fixed angle: Fast pilevinkel: It's possible to attach rings to structures by selecting a ring and clicking on an atom. Det er muligt at tilknytte ringe til strukturer ved at vælge en ring og klikke pÃ¥ et atom. Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Værktøjet 3D-ud linje<br><br> Brug linjeværktøjet til at tegne 3D-ud linjer, som vist pÃ¥ knappen. Set line thickness Sæt linjetykkelse Set Line Thickness Sæt linjetykkelse Set fixed angle and length Sæt fast vinkel og længde NR arrow NR pil When in select mode, you can edit most objects by right-clicking on them. I markeringstilstanden kan de fleste objekter redigeres ved at højreklikke pÃ¥ dem. CDX - ChemDraw binary format (*) CDX - ChemDraw binært format (*) [*] DABSYL [*] DABSYL [*] DABCYL [*] DABCYL [*] DANSYL DANSYL [1-(dimethylanimo)-5-naphthylsulfonyl] Ring tool Ringværktøj Cancel Annullér Erase tool<br><br>Use the Erase tool to erase individual items. Værktøjet Slet<br><br> Brug Slet til at fjerne enkelte emner. Double Dobbelt Landscape Liggende Remember to select a file type when opening or saving documents. Husk at angive en filtype nÃ¥r du Ã¥bner og gemmer dokumenter. Molecule information... Molekyle information... Formula = Formel = Shortcut: Hold 'Alt' and type one-letter codes! Genvej: Hold 'Alt' nede og skriv et-bogstavskoder! A4 (210 mm x 297 mm) A4 (210 mm x 297 mm) , Angle = , Vinkel = Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Tekstværktøjet<br><br>Brug tekstværktøjet til at skrive tekst og til at navngive atomer og punkter.<br>(Se manualen for informationer om tekstformatering) Indole Indol Compare 1H NMR Sammenlign 1H NMR How to get help Hvordan man fÃ¥r hjælp Elemental analysis Grundstofanalyse Draw wavy bond Tegn bølget binding Lysine Lysin Select &Product Vælg &Produkt CAS Number CAS-nummer Print file Udskriv filen T&ools Værk&tøjer Purine purin Ribose Ribose Search Søg Select Vælg XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. XDrawChem kan startes fra komandolinjen for at lave et billede ud fra en inputfil. Skriv "xdrawchem --help" for flere oplysninger. Serine serin Nitrophenylalanine nitrophenylalanin Right-justify selected text Højrejustér markeret tekst Single Enkelt Cyclohexane Cyclohexan Sugars Sukkerstoffer Style: Stil: untitled uden navn Single/double (aromatic) Enkelt/dobbelt (aromatisk) , click to paste into drawing , klik for at indsætte pÃ¥ tegningen Triple Tripel Choose a structure from list: Vælg en struktur fra listen: Units: Enheder: Valine valin Uracil Uracil Cyclobutane Cyclobutan Look for: Kig efter: Click on a molecule for information Klik pÃ¥ et molekyle for at fÃ¥ informationer om det Parentheses Parenteser Predict octanol-water partition (Kow) Forudse octanol-vand skilningen (Kow) Save as picture... Gem som billede... 180 degree clockwise 180 grader med uret Click on a molecule to clean up its structure Klik pÃ¥ et molekyle for at rydde op i dets struktur Molecule Info Molekyle-info XDC database server: XDC databaseserver: Clean up molecule Ryd op i molekylet Click on a molecule to calculate its 13C NMR Klik pÃ¥ et molekyle for at beregne dets 13C NMR Saved file Gemt fil Create custom ring Opret egen ring Single electron Enkelt elektron Problem while opening the file Der opstod et problem under Ã¥bningen af filen Clear &group Ryd &gruppe Octanol-water partition Octanol-vand forholdet p orbital p orbital Show grid Vis gitteret Portrait StÃ¥ende Reactants = %1 kJ/mol Reaktanter = %1 kJ/mol p double p dobbelt Click on a molecule to calculate its IR Klik pÃ¥ et molekyle for at beregne dets IR &About ... &Om ... Draw Symbol mode: left click to add symbol Tegn symbol tilstand: venstreklik for at tilføje et symbol Could not determine file type Kunne ikke genkende filtypen Rotate 90 degrees clockwise Rotér 90 grader med uret Please select a file type from the list. Vælg en filtype fra listen. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Kædeværktøjet<br><br>Brug kædeværktøjet til at tegne aliphatiske kæder. længden af hvert sekment er den nuværende bindingslængde. Bond editor Bindings-editor IR spectrum IR spektrum Unable to load Kan ikke indlæse inches tommer 270 degree clockwise 270 grader med uret Bond order: Bindingsrækkefølge: Pa&ge setup Side&opsætning Arrow fixed length: Fast pilelængde: Draw or edit text Tegn eller rediger tekst Draw graphic object: cubic bezier Tegn et grafisk objekt: kubisk bezier-kurve pixels pixler Page setup Sideopsætning Page width: Sidebredde: Estimated pKa's: Estimerede pKa'er: Product Produkt Proline prolin Backward Tilbage &Backward &Tilbage Adenine Adenin Tryptophan tryptophan Click on a molecule to clear it group assignment Klik pÃ¥ et molekyle for at fjerne gruppemarkeringen Save picture... Gem billede... Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Klik her for at indsætte.<br><br>Du kan ogsÃ¥ indsætte med menupunktet Indsæt fra Redigér-menuen, eller Ctrl+V. Letter (8.5" x 11") Letter (8.5" x 11") Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Værktøjet Kantede patenteser<br><br>Brug værktøjet Kantede patenteser til at tegne kantede parenteser.<br><br>Klik for at tegne almindelige til kantede parenteser.<br><br>Klik og hold nede for at vælge fra en billedmenu over parentesformer. Draw symbol Tegn symbol Click on a molecule to assign it as a product Klik pÃ¥ et molekyle for markere det som produkt Aspartic acid Asparginsyre Cannot open the specified file. Kunne ikke Ã¥bne den angivne fil. Cubic bezier - half arrow Kubisk bezier-kurve - halv pil Saved picture file Gemt billedfil Rotate 180 degrees Rotér 180 grader Alanine alinin When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. I markeringstilstanden kan du trykke pÃ¥ Ctrl+venstre musetast for at fÃ¥ molekyleinformation. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. Indstillingen "Ryd op i molekylet" under Værktøjsmenuen kan bruges til at rafinere strukturer som fx ringe og makromolekyler. Problem while writing the file Der opstod et problem under skrivningen af filen Cannot convert the molecule. Conversion failed in ioiface.cpp Kunne ikke konvertere molekylet. Konverteringen mislykkedes i ioiface.cpp Cyclohexane (chair) cyclehexan (stol) Asparagine asparagin [*] Cyclohexane (flat) [*] cyclohexan (flad) Cyclohexane (boat) cyclehexan (bÃ¥d) Draw line Tegn linje Draw ring Tegn ring Benzene Benzen Threonine threonin Clear all &groups Ryd &alle grupper Cyclohexane - boat conformation cyclohexan - bÃ¥dkonformation Arginine arginin Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Bølgelinjeværktøjet<br><br>Brug bølgelinjeværktøjet til at tegne bølgede linjer, som vist pÃ¥ knappen. [*] Benzene [*] Benzen Curved Arrow editor Editor af krumme pile Click on a molecule to calculate its octanol-water partition Klik pÃ¥ et molekyle for at beregne dets octanol-vand fordelingskoefficient 90 degree counterclockwise 90 grader mod uret 270 degree counterclockwise 270 grader mod uret 180 degree counterclockwise 180 grader mod uret Molecular weight = Molekylevægt = Newman projection symbol Newman-projektionssymbol Draw aliphatic chain - Length = Tegn aliphatisk kæde - Længde = When drawing bonds, you can edit the bond style by right-clicking on the bond. NÃ¥r du tegner bindinger, kan bindingstypen ændres ved at højreklikke pÃ¥ bindingen. Draw arrow Tegn pil Double bond spacing: Dobbeltbindingers mellemrum: Select mode: left click on object to move Vælg tilstand: venstreklik pÃ¥ et objekt for at flytte det Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> Symbolværktøjet<br><br>Brug symbolværktøjet til at indsætte symboler.<br><br>Klik og hold nede for at vælge fra en billedmenu med synboler.<br> Peaks of reactant: Reaktantens toppe: Products = %1 kJ/mol Produkter = %1 kJ/mol Auto &layout Auto&layout Open file... Ã…bn fil... D-fructose D-fruktose Click on a molecule to save it as a custom ring Klik pÃ¥ et molekyle for at gemme det som brugerdefineret ring You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. Du kan skrive et sænket tal efter en kantet parantes, ved at vælge tekstværktøjet og derefter markere den kantede parantes. Cannot undo, sorry! Kan desværre ikke fortrydes! Click on a molecule to determine its SMILES string Klik pÃ¥ et molekyle for at bestemme dets SMILES streng Bryan Herger herger@chemistry.gatech.edu Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2002 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Bryan Herger herger@chemistry.gatech.edu Tilmeld dig til postlisten, hvis du vil have oplysninger om fremtidige udgivelser. Send en mail til: xdrawchem-announce-request@lists.sourceforge.net med 'subscribe' i emnefeltet. XDrawChem is copyright (C) 2002 Bryan Herger. Enkeltdele copyright (C) 1997-2000 Dr. Christoph Steinbeck og the JChemPaint project OpenBabel-koden copyright (C) 2003 by the OpenBabel project team. Se filen COPYRIGHT.txt for flere detaljer Custom paper size Selvvalgt papirstørrelse Estimate gas-phase enthalphy change Estimér ændringen i gasfasens enthalpi Electron pair Elektronpar Transparent Gennemsigtig Set background &color Sæt &baggrundsfarve Select &All Markér &alt Click on a molecule to generate 3-D coordinates Klik pÃ¥ et molekyle for at generere dets 3-D koordinater Test tool Testværktøj Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Værktøjet Krum pil<br><br>Brug værktøjet Krum pil til at indsætte krumme pile.<br><br>Klik og hold knappen nede for at se billeder af de pileformer der er tilgængelige. [*] Cycloheptane [*] Cycloheptan Useful groups Nyttige grupper Click on a molecule to calculate its pKa(s) Klik pÃ¥ et molekyle for at beregne dets pKa(s) 13C NMR compare error 13C NMR sammenligningsfejl Click on a molecule to calculate its elemental analysis Klik pÃ¥ et molekyle for lave en grundstofanalyse Statine Statin Histidine histidin Naphthalene Naftalen Default Standard degrees grader , intensity , intensitet Cyclohexane - chair conformation cyclohexan - stolkonformation &Support &Support Please type or edit the subscript for this bracket: Skriv eller rediger den sænkede skrift for denne kantede parentes: [*] Cyclobutane [*] Cyclobutan Split two-way arrow Delt dobbeltpil Click this button to open a file.<br><br>You can also select the Open command from the File menu. Klik her for at Ã¥bne en fil<br><br>Du kan ogsÃ¥ menupunktet Ã…bn pÃ¥ Fil-menuen. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Klik her for at klippe det markerede ud.<br>Du kan ogsÃ¥ bruge menupunktet Klip fra Redigér-menuen, eller trykke pÃ¥ Ctrl+X. Erase mode: left click to erase object Slet tilstand: venstreklik for at slette et objekt Predict IR Forudse IR File Operations Filoperationer Thymine Thymin Underline selected text (Ctrl+U) Understreg den markerede tekst (Ctrl+U) [*] Cyclooctane [*] Cyclooctan Negative charge Negativ ladning Save file as... Gem filen som... Click on a molecule to calculate its empirical formula Klik pÃ¥ et molekyle for at beregne dets empiriske formel Dashed line Stiplet linje Database query failed Databaseforespørgslen mislykkedes &Manual &Manual Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Klik her for at udskrive den fil du har Ã¥ben.<br><br>Du kan ogsÃ¥ bruge menupunktet Udskriv fra Fil-menuen. Bond fixed length: Fast bindingslængde: Draw Line - Length = Tegn linje - Længde = Reactant Reaktant Reaction Reaktion Draw Arrow mode: left click to draw arrow Tegn pil tilstand: venstreklik for at tegne en pil Estimated gas-phase enthalpy change: Estimér ændringen af enthalpi i gasfasen: Click on a molecule to calculate its molecular weight Klik pÃ¥ et molekyle for at beregne dets molekylevægt &Rotate &Rotér Superscript selected text (Ctrl-Plus) Hævet skrift (Ctrl+Plus) An error occured. The server cannot find the selected molecule. Der opstod en fejl. Serveren kan ikke finde det valgte molekyle. Estimated octanol-water partition constant (log Kow) = %1 Beregn octanol-vand fordelingskoefficient (log Kow) = %1 Newman projection - eclipsed Newman-projektion - elipseformet Draw Ring mode: left click to add %1 Tegn ring tilstand: venstreklik for at tilføje %1 &Arrow - Fixed length and angle &Pil - Fast længde og vinkel Page height: Sidehøjde: Enter SMILES string Indtast SMILES streng Add custom ring to menu list Tilføj brugerdefineret ring til menulisten SMILES string for selected molecule: SMILES streng for udvalgt molekyle: Open file Ã…bn fil Don't show this dialog at startup Vis ikke denne dialogboks under opstart Ellipse Elipse Tool test mode Testtilstand Draw Bracket mode: left click to draw bracket Tegn kantet parentes tilstand: venstreklik for at tegne kantede parenteser Stereo-down 3D-ind Set Font Sæt skrifttype Stereochemical ring hydrogen Stereokemisk ring-hydrogen Set font Sæt skrifttype Enthalpy change Enthalpiændring Save file Gem filen Retrosynthetic arrow Retrosyntetisk pil Stereo-up 3D-ud Positive charge Positiv ladning &References &Litteraturliste Set font size Sæt skriftstørrelse Set Font Size Sæt skriftstørrelse Glutamine glutamin Next tip Næste tip Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Pileværktøjet<br><br>Brug pileværktøjet til at tegne lige pile.<br><br>Klik for at tegne en lige pil.<br><br>Klik og hold nede for at vælge en pil fra listen over tilgængelige pileformer. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. I markeringstilstanden kan du holde Shift+venstre musetast nede og trække for at markere hele molekylet. XDC - XDrawChem native format (*) XDC - XDrawChems eget format (*) Select mode: left click on object to move, right click on object to edit Vælg tilstand: venstreklik pÃ¥ et objekt for at flytte det, højreklik pÃ¥ objektet for at redigere det Draw bracket Tegn kantet parentes There seem to be no sites with pKa between -1 and 15. Der er ingen sites with pKa mellem -1 og 15. Draw stereo-up line Tegn 3d-ud linje Forma&t &Formatér Formula Formel Forward Frem &Forward &Frem Estimated pKa's Estimerede pKa'er Draw aliphatic chain Tegn aliphatisk kæde Draw Dashed Line mode: left click to draw line, right click to edit Tegn stiplet linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Klik her for at kopiere det markerede.<br><br>Du kan ogsÃ¥ kopiere med menupunktet Kopiér fra Redigér-menuen, eller trykke Ctrl+C. Find structure via Internet Find strukturen via internettet Symbol editor Symbol-editor Reaction = %1 kJ/mol Reaktion = %1 kJ/mol Draw Line mode: left click to draw line, right click to edit Tegn linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere &Did You Know? &Vidste du at? Did You Know? Vidste du det? You must select at least one reactant and one product. Du skal vælge mindst en reaktant og et produkt Double/triple Dobbelt/tripel Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Ringværktøjet<br><br>Brug ringværktøjet til at indsætte færdiglavede ringe og strukturer.<br><br>Klik for at Ã¥bne dialogboksen ringe. Der kan du vælge mellem alle programmets indbyggede ringe og strukturer.<br><br>Klik og hold nede for at vælge fra en billedmenu over ringene.<br>(Se manualen for flere informationer om hvordan du tilpasser denne menu) Draw Stereo-Up Line mode: left click to draw line, right click to edit Tegn 3D-ud linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere [*] BOC BOC [butoxycarbonyl] Enter peptide sequence - three-letter abbreviations: Skriv peptid-sekvens - forkortelse pÃ¥ 3 bogstaver: Chemical name Kemisk navn Peptide Builder Peptidbygning Cubic bezier - full arrow Kubisk bezier-kurve - fuld pil Calculate molecular weight Beregn molekylevægten Select mode: left click to move, right click to edit Vælg tilstand: venstreklik for at flytte, højreklik for at redigere Draw stereo-down line Tegn 3D-ind linje Enter SMILES string: Indtast SMILES streng: D-glucose D-glukose Glycine glycin Click on a molecule to calculate its 1H NMR Klik pÃ¥ et molekyle for at beregne dets 1H NMR Grid spacing Gitterafstand Center selected text Centrér markeret tekst Guanine Guanin &Drawing settings... &Tegneindstillinger... Bracket editor Editor af kantede parenteser Click on a molecule to assign it as a reactant Klik pÃ¥ et molekyle for markere det som reaktant XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) XDrawChem kan automatisk tilknytte aminosyrer fra N-terminal til C-terminal (men resultatet er ikke altid lige kønt :) IOIface Data error IOIface Data fejl Methionine methionin This copy of XDrawChem is more than 60 days old. A more recent version may be available at http://freshmeat.net/projects/xdrawchem/ Denne version af XDrawChem er mere end 60 dage gammel. Det er ikke et problem :-) men mÃ¥ske er der en nyere pÃ¥ http://freshmeat.net/projects/xdrawchem/ Draw Wavy Line mode: left click to draw line, right click to edit Tegn bølget linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere [*] EDANS [*] EDANS Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Værktøjet Stiplet linje<br><br>Brug Stiplet linje til at tegne stiplede linjer. Tegn ovenpÃ¥ eksisterende bindinger for at tilføje en stiplet linje (for at vise resonans ol.) User-defined Brugerdefinerede Current information on XDrawChem can always be found at http://www.prism.gatech.edu/~gte067k/xdrawchem/ The latest release will be posted here. There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at herger@chemistry.gatech.edu Aktuel information om XDrawChem kan altid findes pÃ¥ http://www.prism.gatech.edu/~gte067k/xdrawchem/ Den seneste version vil altid kunne findes her. Der er to postlister: xdrawchem-announce, hvor nye versionerannonceres, og xdrawchem-user, for Ã¥ben diskussion blandt brugere af XDrawChem. Tilmeld dig ved at sende en blank e-mail med emnet "subscribe" til "xdrawchem-announce-request@lists.sourceforge.net" eller "xdrawchem-user-request@lists.sourceforge.net" Du kan kontakte forfatteren direkte via herger@chemistry.gatech.edu Anthracene anthracen [*] Cyclopentadiene [*] cyclepentadien Flip &vertical Spejl &lodret CDXML - ChemDraw text/XML format (*) CDXML - ChemDraw text/XML format (*) Exact matches only Kun nøjagtige match Imidazole imidazol Could not write to Kunne ikke skrive til SMILES string SMILES streng Draw Chain mode: left click and drag to draw aliphatic chain Tegn kæde tilstand: venstreklik og træk for at tegne en aliphatisk kæde Predict 13C NMR Forudse 13C NMR Search type: Søg efter type: Orientation: Orientering: Predict pKa Forudse pKa [*] FMOC FMOC [9-fluorenylmethoxycarbonyl] ApplicationWindow Click this button to open a file.<br><br>You can also select the Open command from the File menu. Klik her for at Ã¥bne en fil<br><br>Du kan ogsÃ¥ menupunktet Ã…bn pÃ¥ Fil-menuen. Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Klik her for at gemme den fil du har Ã¥ben.<br><br>Du kan ogsÃ¥ bruge menupunktet Gem pÃ¥ Fil-menuen.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Klik her for at udskrive den fil du har Ã¥ben.<br><br>Du kan ogsÃ¥ bruge menupunktet Udskriv fra Fil-menuen. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Klik her for at klippe det markerede ud.<br>Du kan ogsÃ¥ bruge menupunktet Klip fra Redigér-menuen, eller trykke pÃ¥ Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Klik her for at kopiere det markerede.<br><br>Du kan ogsÃ¥ kopiere med menupunktet Kopiér fra Redigér-menuen, eller trykke Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Klik her for at indsætte.<br><br>Du kan ogsÃ¥ indsætte med menupunktet Indsæt fra Redigér-menuen, eller Ctrl+V. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Erase tool<br><br>Use the Erase tool to erase individual items. Værktøjet Slet<br><br> Brug Slet til at fjerne enkelte emner. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Linjeværktøjet<br><br> Brug linjeværktøjet til at tegne bindinger. Tegn ovenpÃ¥ eksisterende bindinger for at lave dobbeltbindinger og tripelbindinger. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Værktøjet Stiplet linje<br><br>Brug Stiplet linje til at tegne stiplede linjer. Tegn ovenpÃ¥ eksisterende bindinger for at tilføje en stiplet linje (for at vise resonans ol.) Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Kædeværktøjet<br><br>Brug kædeværktøjet til at tegne aliphatiske kæder. længden af hvert sekment er den nuværende bindingslængde. Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Værktøjet 3D-ud linje<br><br> Brug linjeværktøjet til at tegne 3D-ud linjer, som vist pÃ¥ knappen. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Værktøjet 3D-ind<br><br> Brug linjeværktøjet til at tegne 3D-ind linjer, som vist pÃ¥ knappen. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Bølgelinjeværktøjet<br><br>Brug bølgelinjeværktøjet til at tegne bølgede linjer, som vist pÃ¥ knappen. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Pileværktøjet<br><br>Brug pileværktøjet til at tegne lige pile.<br><br>Klik for at tegne en lige pil.<br><br>Klik og hold nede for at vælge en pil fra listen over tilgængelige pileformer. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Værktøjet Krum pil<br><br>Brug værktøjet Krum pil til at indsætte krumme pile.<br><br>Klik og hold knappen nede for at se billeder af de pileformer der er tilgængelige. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Værktøjet Kantede patenteser<br><br>Brug værktøjet Kantede patenteser til at tegne kantede parenteser.<br><br>Klik for at tegne almindelige til kantede parenteser.<br><br>Klik og hold nede for at vælge fra en billedmenu over parentesformer. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Tekstværktøjet<br><br>Brug tekstværktøjet til at skrive tekst og til at navngive atomer og punkter.<br>(Se manualen for informationer om tekstformatering) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Ringværktøjet<br><br>Brug ringværktøjet til at indsætte færdiglavede ringe og strukturer.<br><br>Klik for at Ã¥bne dialogboksen ringe. Der kan du vælge mellem alle programmets indbyggede ringe og strukturer.<br><br>Klik og hold nede for at vælge fra en billedmenu over ringene.<br>(Se manualen for flere informationer om hvordan du tilpasser denne menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> Symbolværktøjet<br><br>Brug symbolværktøjet til at indsætte symboler.<br><br>Klik og hold nede for at vælge fra en billedmenu med synboler.<br> File Operations Filoperationer Open file Ã…bn fil Save file Gem filen Print file Udskriv filen Cut Klip Copy Kopiér Paste Indsæt Zoom In Zoom Out Set line thickness Sæt linjetykkelse Set Line Thickness Sæt linjetykkelse Set font Sæt skrifttype Set Font Sæt skrifttype Set font size Sæt skriftstørrelse Set Font Size Sæt skriftstørrelse Left-justify selected text Venstrejustér markeret tekst Center selected text Centrér markeret tekst Right-justify selected text Højrejustér markeret tekst Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Select Vælg Lasso Erase Slet Draw Line Draw dashed line Tegn stiplet linje Draw aliphatic chain Tegn aliphatisk kæde Draw stereo-up line Tegn 3d-ud linje Draw stereo-down line Tegn 3D-ind linje Draw wavy bond Tegn bølget binding Draw or edit text Tegn eller rediger tekst &File &Fil &New &Ny &Open &Ã…bn &Find on Internet &Find pÃ¥ internettet &Save &Gem Save &as... Gem &som... Save picture... Gem billede... Send to &external program... Pa&ge setup Side&opsætning &Print &Udskriv Close Luk Quit Afslut &Edit &Redigér &Undo Fo&rtryd Insert s&ymbol Cu&t K&lip &Copy &Kopiér &Paste &Indsæt Clear Ryd Select &All Markér &alt &Deselect All &Rotate &Rotér Rotate 90 degrees clockwise Rotér 90 grader med uret Rotate 180 degrees Rotér 180 grader Rotate 90 degrees counterclockwise Rotér 90 grader mod uret &Flip &Spejl Flip &horizontal Spejl &vandret Flip &vertical Spejl &lodret &Zoom Normal (100%) Zoom out Zoom in &Group &Gruppe Select &Reactant Vælg &reaktant Select &Product Vælg &Produkt Clear &group Ryd &gruppe Clear all &groups Ryd &alle grupper Forma&t &Formatér &Bond - Fixed length and angle &Binding - Fast længde og vinkel &Arrow - Fixed length and angle &Pil - Fast længde og vinkel Set background &color Sæt &baggrundsfarve Toggle &grid &Gitter Til/Fra &Drawing settings... &Tegneindstillinger... &XDC settings... T&ools Værk&tøjer Clean up molecule Ryd op i molekylet Auto &layout Auto&layout Create custom ring Opret egen ring Molecule information... Molekyle information... Predict 1H NMR Predict 13C NMR Forudse 13C NMR Predict IR Forudse IR Predict pKa Forudse pKa Predict octanol-water partition (Kow) Forudse octanol-vand skilningen (Kow) Reaction Reaktion Estimate gas-phase enthalphy change Estimér ændringen i gasfasens enthalpi Compare 1H NMR Sammenlign 1H NMR Compare 13C NMR Sammenlign 13C NMR Reverse reactions Get bond identifier Input InChI or SMILES Output SMILES Output SMILES Output InChI Build 3D model of molecule &Help &Hjælp &Manual &Manual &Did You Know? &Vidste du at? &About &Om &Support &Support &References &Litteraturliste What's &This Hvad er &dette Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Annullér Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman-projektionssymbol Newman projection - staggered (anti) Newman-projektion - forskudt (anti) Newman projection - eclipsed Newman-projektion - elipseformet Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow Stiplet pil BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Kubisk bezier-kurve Cubic bezier - half arrow Kubisk bezier-kurve - halv pil Cubic bezier - full arrow Kubisk bezier-kurve - fuld pil Square bracket Kantet parentes Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Could not write to Kunne ikke skrive til Saved file Gemt fil Save as picture... Gem som billede... Saved picture file Gemt billedfil Unable to save picture! Kan ikke gemme billedet! Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details How to get help Hvordan man fÃ¥r hjælp Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Database query failed Databaseforespørgslen mislykkedes No molecules in the database match the query. Ingen molekyler i databasen passer med forespørgslen. Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font --Select a filter-- (*) --Vælg et filter-- (*) CDXML - ChemDraw text/XML format (*) CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) CDX - ChemDraw binært format (*) XDC - XDrawChem native format (*) XDC - XDrawChems eget format (*) Open file... Ã…bn fil... Could not determine file type Kunne ikke genkende filtypen Please select a file type from the list. Vælg en filtype fra listen. Couldn't open file Kunne ikke Ã¥bne filen Could not open the file: Kunne ikke Ã¥bne filen: Unable to load Kan ikke indlæse Loaded document Indlæst dokument Problem while opening the file Der opstod et problem under Ã¥bningen af filen Cannot open the specified file. Kunne ikke Ã¥bne den angivne fil. Save file as... Gem filen som... Overwrite file? Overwrite existing file: %1 ? IOIface Data error IOIface Data fejl Cannot convert the molecule. Conversion failed in ioiface.cpp Kunne ikke konvertere molekylet. Konverteringen mislykkedes i ioiface.cpp Problem while writing the file Der opstod et problem under skrivningen af filen Cannot write the specified file. Kunne ikke skrive den angivne fil. Rings Ringe [*] Cyclopropane [*] Cyclopropan [*] Cyclobutane [*] Cyclobutan [*] Cyclopentane [*] Cyclopentan Imidazole imidazol [*] Cyclopentadiene [*] cyclepentadien [*] Cyclohexane (flat) [*] cyclohexan (flad) Cyclohexane (boat) cyclehexan (bÃ¥d) Cyclohexane (chair) cyclehexan (stol) [*] Benzene [*] Benzen Pyrimidine pyrimidin [*] Cycloheptane [*] Cycloheptan [*] Cyclooctane [*] Cyclooctan Indole Indol Purine purin Naphthalene Naftalen Biphenyl Biphenyl Anthracene anthracen Steroid (fused ring template) Steroid (skabelon for kondenserede ringe) Amino acids Aminosyrer Alanine alinin Arginine arginin Asparagine asparagin Aspartic acid Asparginsyre Cysteine cystein Glutamic acid glutaminsyre Glutamine glutamin Glycine glycin Histidine histidin Isoleucine isolucin Leucine leucin Lysine Lysin Methionine methionin Nitrophenylalanine nitrophenylalanin Phenylalanine phenylalanin Proline prolin Serine serin Statine Statin Threonine threonin Tryptophan tryptophan Tyrosine tyrosin Valine valin Nucleic acids Nucleotidsyrer Adenine Adenin Cytosine Cytosin Guanine Guanin Thymine Thymin Uracil Uracil Sugars Sukkerstoffer Ribose Ribose Deoxyribose Deoxyribose D-fructose D-fruktose D-glucose D-glukose Useful groups Nyttige grupper [*] FMOC FMOC [9-fluorenylmethoxycarbonyl] [*] BOC BOC [butoxycarbonyl] [*] DABCYL [*] DABCYL [*] DABSYL [*] DABSYL [*] DANSYL DANSYL [1-(dimethylanimo)-5-naphthylsulfonyl] [*] EDANS [*] EDANS [*] Biotin User-defined Brugerdefinerede Add new... Save before closing? The document has been changed since the last save. BondEditDialog Preview: Color: Arrow editor Pile-editor Style: Stil: Plain arrow Almindelig pil NR arrow NR pil Dashed arrow Stiplet pil Two-way arrow Dobbeltpil Split two-way arrow Delt dobbeltpil Retrosynthetic arrow Retrosyntetisk pil Arrow thickness: Bond editor Bindings-editor Bond order: Bindingsrækkefølge: Dashed line Stiplet linje Single Enkelt Stereo-up 3D-ud Stereo-down 3D-ind Wavy Bølget Single/double (aromatic) Enkelt/dobbelt (aromatisk) Double Dobbelt Double/triple Dobbelt/tripel Triple Tripel Bond thickness: Double bond alignment: Auto Left Center Right Bracket editor Editor af kantede parenteser Square bracket Kantet parentes Parentheses Parenteser Curly bracket Krøllet parentes Box Boks Ellipse Elipse Curved Arrow editor Editor af krumme pile 90 degree clockwise 90 grader med uret 180 degree clockwise 180 grader med uret 270 degree clockwise 270 grader med uret 90 degree counterclockwise 90 grader mod uret 180 degree counterclockwise 180 grader mod uret 270 degree counterclockwise 270 grader mod uret Symbol editor Symbol-editor Positive charge Positiv ladning Negative charge Negativ ladning Partial positive charge Delvis positiv ladning Partial negative charge Delvis negativ ladning Single electron Enkelt elektron Electron pair Elektronpar Stereochemical ring hydrogen Stereokemisk ring-hydrogen p orbital p orbital p double p dobbelt bead drÃ¥be OK O.k. Cancel Annullér CharSelDialog Insert symbol Font: Cancel Annullér ChemData Missing reactant or product Manglende reaktant eller produkt You must select at least one reactant and one product. Du skal vælge mindst en reaktant og et produkt Estimated gas-phase enthalpy change: Estimér ændringen af enthalpi i gasfasen: Reactants = %1 kJ/mol Reaktanter = %1 kJ/mol Products = %1 kJ/mol Produkter = %1 kJ/mol Reaction = %1 kJ/mol Reaktion = %1 kJ/mol Enthalpy change Enthalpiændring 1H NMR compare error 1H NMR sammenligningsfejl Please select only one reactant and one product to compare. Vælg kun en reaktant og et produkt til at sammenligne. 13C NMR compare error 13C NMR sammenligningsfejl Octanol-water partition Octanol-vand forholdet Estimated octanol-water partition constant (log Kow) = %1 Beregn octanol-vand fordelingskoefficient (log Kow) = %1 SMILES string SMILES streng SMILES string for selected molecule: SMILES streng for udvalgt molekyle: InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list Tilføj brugerdefineret ring til menulisten OK O.k. Cancel Annullér CustomRingWidget Title: DYKDialog Did You Know? Vidste du det? Don't show this dialog at startup Vis ikke denne dialogboks under opstart Previous tip Forrige tip Next tip Næste tip OK O.k. XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length Sæt fast vinkel og længde Units: Enheder: pixels pixler Bond fixed length: Fast bindingslængde: Bond fixed angle: Fast bindingsvinkel: degrees grader Arrow fixed length: Fast pilelængde: Arrow fixed angle: Fast pilevinkel: Double bond spacing: Dobbeltbindingers mellemrum: Do not show grid Show square grid Show hex grid Snap to grid Fastgør til gitteret Grid spacing: Default Standard OK O.k. Cancel Annullér inches tommer cm cm GraphDialog Print Udskriv Export Peak List Eksportér top listen Help Hjælp Close Luk GraphWidget Red is reactant Blue is product HelpWindow &File &Fil &Print &Udskriv &Close &Luk &Go &GÃ¥ &Backward &Tilbage &Forward &Frem &Home &Hjem &Help &Hjælp &About ... &Om ... MolInfoDialog Formula = Formel = CAS: PubChem compound: Name: Other names: Molecule Info Molekyle-info Name: Other names: CAS: PubChem compound: Molecular weight = Molekylevægt = Analysis Search PubChem Help Hjælp OK O.k. Cancel Annullér Molecule Predicted 1H-NMR Intensity: Multiplicity: Reactant Reaktant Product Produkt Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: Estimerede pKa'er: There seem to be no sites with pKa between -1 and 15. Der er ingen sites with pKa mellem -1 og 15. Estimated pKa's Estimerede pKa'er Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent Gennemsigtig NetChooseDialog Choose Structure Select a molecule from list and click OK: Select Vælg Cancel Annullér NetDialog Find structure via Internet Find strukturen via internettet XDC database server: XDC databaseserver: Search type: Søg efter type: Chemical name Kemisk navn CAS Number CAS-nummer Formula Formel Look for: Kig efter: Exact matches only Kun nøjagtige match Search Søg Cancel Annullér PageSetupDialog Page setup Sideopsætning Paper size: Papirstørrelse: Letter (8.5" x 11") Letter (8.5" x 11") Legal (8.5" x 14") Legal (8.5" x 14") A4 (210 mm x 297 mm) A4 (210 mm x 297 mm) 640x480 pixels 640x480 pixeler 800x600 pixels 800x600 pixeler 1024x768 pixels 1024x768 pixeler Custom paper size Selvvalgt papirstørrelse Orientation: Orientering: Portrait StÃ¥ende Landscape Liggende pixels pixler inches tommer cm cm Page width: Sidebredde: Page height: Sidehøjde: OK O.k. Cancel Annullér PeptDialog Peptide Builder Peptidbygning Enter peptide sequence - three-letter abbreviations: Skriv peptid-sekvens - forkortelse pÃ¥ 3 bogstaver: Shortcut: Hold 'Alt' and type one-letter codes! Genvej: Hold 'Alt' nede og skriv et-bogstavskoder! OK O.k. Cancel Annullér Render2D Select mode: left click on object to move, right click on object to edit Vælg tilstand: venstreklik pÃ¥ et objekt for at flytte det, højreklik pÃ¥ objektet for at redigere det Lasso mode: left click and hold to draw lasso Draw Line mode: left click to draw line, right click to edit Tegn linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere Draw Dashed Line mode: left click to draw line, right click to edit Tegn stiplet linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere Draw Chain mode: left click and drag to draw aliphatic chain Tegn kæde tilstand: venstreklik og træk for at tegne en aliphatisk kæde Draw Stereo-Up Line mode: left click to draw line, right click to edit Tegn 3D-ud linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere Draw Stereo-Down Line mode: left click to draw line, right click to edit Tegn 3D-ind linje tilstand: venstreklik for at tegne linje, højreklik for at redigere Draw Wavy Line mode: left click to draw line, right click to edit Tegn bølget linje tilstand: venstreklik for at tegne en linje, højreklik for at redigere Draw Arrow mode: left click to draw arrow Tegn pil tilstand: venstreklik for at tegne en pil Draw Bracket mode: left click to draw bracket Tegn kantet parentes tilstand: venstreklik for at tegne kantede parenteser Text mode: left click to add or edit text Tekst tilstand: venstreklik for at tilføje eller redigere tekst Erase mode: left click to erase object Slet tilstand: venstreklik for at slette et objekt Draw Symbol mode: left click to add symbol Tegn symbol tilstand: venstreklik for at tilføje et symbol Draw graphic object: cubic bezier Tegn et grafisk objekt: kubisk bezier-kurve Left-click to draw Newman projection template Venstre-klik for a tegne Newman-projektionsskabelon Draw Ring mode: left click to add %1 Tegn ring tilstand: venstreklik for at tilføje %1 Click on a molecule for information Klik pÃ¥ et molekyle for at fÃ¥ informationer om det Click on a molecule to calculate its molecular weight Klik pÃ¥ et molekyle for at beregne dets molekylevægt Click on a molecule to calculate its empirical formula Klik pÃ¥ et molekyle for at beregne dets empiriske formel Click on a molecule to calculate its elemental analysis Klik pÃ¥ et molekyle for lave en grundstofanalyse Click on a molecule to calculate its 13C NMR Klik pÃ¥ et molekyle for at beregne dets 13C NMR Click on a molecule to calculate its 1H NMR Klik pÃ¥ et molekyle for at beregne dets 1H NMR Click on a molecule to calculate its IR Klik pÃ¥ et molekyle for at beregne dets IR Click on a molecule to calculate its pKa(s) Klik pÃ¥ et molekyle for at beregne dets pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Klik pÃ¥ et molekyle for at beregne dets octanol-vand fordelingskoefficient Click on a molecule to generate 3-D coordinates Klik pÃ¥ et molekyle for at generere dets 3-D koordinater Click on a molecule to guess its name Click on a molecule to determine its SMILES string Klik pÃ¥ et molekyle for at bestemme dets SMILES streng Click on a molecule to clean up its structure Klik pÃ¥ et molekyle for at rydde op i dets struktur Click on a molecule to assign it as a reactant Klik pÃ¥ et molekyle for markere det som reaktant Click on a molecule to assign it as a product Klik pÃ¥ et molekyle for markere det som produkt Click on a molecule to clear it group assignment Klik pÃ¥ et molekyle for at fjerne gruppemarkeringen Click on a molecule to save it as a custom ring Klik pÃ¥ et molekyle for at gemme det som brugerdefineret ring Tool test mode Testtilstand Click on a molecule Select mode: left click to move, right click to edit Vælg tilstand: venstreklik for at flytte, højreklik for at redigere Undo! Fortryd! Cannot undo, sorry! Kan desværre ikke fortrydes! No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Vælg Cut Klip Copy Kopiér Select mode: left click on objects to move Select mode: left click on object to move Vælg tilstand: venstreklik pÃ¥ et objekt for at flytte det , click to paste into drawing , klik for at indsætte pÃ¥ tegningen Draw Line - Length = Tegn linje - Længde = , Angle = , Vinkel = Draw aliphatic chain - Length = Tegn aliphatisk kæde - Længde = bonds bindinger Enter subscript Sænket skrift Please type or edit the subscript for this bracket: Skriv eller rediger den sænkede skrift for denne kantede parentes: RingDialog Ring tool Ringværktøj Choose a structure from list: Vælg en struktur fra listen: Cancel Annullér SmilesDialog Enter InChI or SMILES string Enter InChI or SMILES string: OK O.k. Cancel Annullér TextShapeDialog Edit text shape No shape Ellipse Elipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK O.k. Cancel Annullér Tool_13CNMR_Dialog 13C NMR spectrum 13C NMR spektrum Help Hjælp Close Luk , intensity , intensitet Peaks of reactant: Reaktantens toppe: Peaks of product: Produktets toppe: Tool_1HNMR_Dialog 1H NMR spectrum 1H NMR spektrum Help Hjælp Close Luk Peaks of reactant: Reaktantens toppe: Peaks of product: Produktets toppe: Tool_IR_Dialog IR spectrum IR spektrum Help Hjælp Close Luk Peaks of reactant: Reaktantens toppe: Peaks of product: Produktets toppe: XRuler px px in i cm cm xdrawchem-v1.11.0/translation/xdrawchem_de.ts000066400000000000000000003644361371466245600213400ustar00rootroot00000000000000 iso8859-1 @default untitled &Close Schließen << &Previous << &Previous &Next >> &Next >> ApplicationWindow Click this button to open a file. <br><br>You can also select the Open command from the File menu. Öffnet eine bestehende Datei<br><br>Entspricht Öffnen... im Dateimenü Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Speichern einer editierten Datei<br><br>Entspricht Speichern im Dateimenü Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Drucken einer editierten Datei<br><br>Entspricht Drucken im Dateimenü Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Ausschneiden eines ausgewählten Bereiches<br><br>Entspricht Ausschneiden im Menü Bearbeiten<br><br>Tastenkombination: Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Kopieren eines ausgewählten Bereiches<br><br>Entspricht Kopieren im Menü Bearbeiten<br><br>Tastenkombination: Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Einfügen eines zuvor kopierten oder ausgeschittenen Bereiches<br><br>Entspricht Einfügen im Menü Bearbeiten<br><br>Tastenkombination: Ctrl+V. Select tool<br><br>Use the Select tool to select and move items.<br><br>You can select multiple items and cut, copy, move and rotate them. Auswählen<br><br>Zur Auswahl einzelner oder mehrerer Objekte<br><br>Die ausgewählten Objekte können verschoben, kopiert, ausgeschnitten, rotiert oder gelöscht werden. Erase tool<br><br>Use the Erase tool to erase individual items. Löschen<br><br>Zum Löschen einzelner Objekte Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Linie<br><br>Zum Zeichnen von Einfach- und Merfachbindungen<br><br> Beim mehrmaligen Überzeichnen von Einfachbindungen entstehen Doppel- oder Dreifachbindungen Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). gestrichelte Linie<br><br>Zum Zeichen gestrichelter Linien oder Bindungen<br><br> Durch Überzeichnen von existierenden Bindungen wird Resonanz angedeuted Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Keil<br><br>Für die stereochemische Darstellung (aus der Papierebene heraus) Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. gestrichelter Keil<br><br>Für die stereochemische Darstellung (in die Papierebene hinein) Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Pfeil<br><br>Zum Zeichnen diverser gerader Pfeile<br><br>Einfachklick für einen Standardpfeil<br><br>Bei gedrücktem Mausknopf erscheint eine Auswahlliste Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. gekrümmter Pfeil<br><br>Zum Einfügen von gekrümmten Pfeilen<br><br>Bei gedrücktem Mausknopf erscheint eine Auswahlliste Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Klammern<br><br>Zum Zeichnen verschiedener Arten von Klammern><br>Einfachklick für eckige Klammern<br><br>Bei gedrücktem Mausknopf erscheint eine Auswahlliste Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Text<br><br>Zum Einfügen von Text und der Kennzeichnung von Atomen sowie Punkten<br>(Siehe Handbuch für Textformatierung) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Ringe<br><br>Zum einfügen von vorgefertigten Ringen und Strukturformeln<br><br>Einfachklick öffnet den detaillierten Auswahldialog<br><br>Bei gedrücktem Mausknopf erscheint eine Auswahlliste mit ausgewählten Vorlagen<br>(Siehe Handbuch für die Modifizierung dieses Menüs) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> diverse Symbole<br><br>Zum einfügen verschiedener Symbole<br><br>Bei gedrücktem Mausknopf erscheint eine grafische Auswahlliste File Operations Open file Datei öffnen Save file Datei speichern Print file Drucken Cut Ausschneiden Copy Kopieren Paste Einfügen Set drawing color Zeichenfarbe Set line thickness Linienbreite Set Line Thickness Linienbreite Set font Schriftart Set Font Schriftart Set font size Schriftgröße Set Font Size Schriftgröße Make selected text <b>bold</b> fett <i>Italicize</i> selected text kursiv Underline selected text unterstrichen Superscript selected text hochgestellt Subscript selected text tiefgestellt Select Auswählen Erase Löschen Draw line Linie Draw dashed line gestrichelte Linie Draw stereo-up line Keil Draw stereo-down line gestrichelter Keil Draw arrow Pfeil Draw curved arrow gekrümmter Pfeil Draw bracket Klammern Draw or edit text Text hinzufügen oder editieren Draw ring Ringe Draw symbol diverse Symbole Canned Structures Ringe &File &Datei &New &Neu &Open Öffnen... &Find on Internet Suche im &Internet &Save &Speichern Save &as... Speichern unter... Save picture... Bild exportieren... Pa&ge setup Seiteneinstellungen... &Print Drucken Close Schließen Quit Beenden Rotate 90 degrees clockwise 90° rechtsdrehend Rotate 180 degrees 180° Rotate 90 degrees counterclockwise 90° linksdrehend Flip &horizontal horizontal Flip &vertical vertikal &Edit Bearbeiten &Undo Rückgängig Cu&t Ausschneiden &Copy Kopieren &Paste Einfügen Clear Löschen Select &All Alles auswählen &Rotate Rotieren &Flip Spiegeln Forma&t Formatierung Fixed &length and angle Feste Längen und Winkel &Set fixed length and angle Setze Längen und Winkel Set &background color Setze Hintergrundfarbe T&ools Werkzeuge Clean up molecule Auto &layout Calculate empirical formula Berechne empirische Formel Calculate molecular weight Berechne Molekulargewicht Elemental analysis Elementaranalyse Predict 13C NMR 13C NMR Vorhersage Predict IR IR Vorhersage &Help &Hilfe &Manual Handbuch &About... Über... &References... Quellen What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! Database query failed No molecules in the database match the query. Click this button to open a file.<br><br>You can also select the Open command from the File menu. Output SMILES &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair OK Cancel Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Default Set fixed angle and length Setzen fester Winkel und Längen Fixed angle: Fester Winkel: Fixed length: Feste Länge: OK Cancel Abbruch Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Close Schließen &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Cancel Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Auswählen Cancel Abbruch Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet Strukturformelsuche im WWW XDC database server: XDC Datenbankserver: Search type: Suchmuster: CAS Number CAS Nummer Formula Formel Chemical name Chemischer Name Look for: Suche nach: Exact matches only Genaue Treffer Search Suche Cancel Abbruch PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Abbruch Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Ringvorlagen Choose a structure from list: Wählen Sie von dieser Liste: Cancel Abbruch SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XManual <center><b>Welcome to XDrawChem!</b><br>Bryan Herger<br>herger@chemistry.gatech.edu<br></center><p><b>Navigating the manual:</b><p>At the bottom of the window there are three buttons. These are:<p>Close - close the manual.<br>Prev - go to the previous manual page.<br>Next - go to the next manual page.<p>The number between Prev and Next tells what page you are viewing.<br>You can jump to any page by selecting the page title from the combo box at the top.<p>A note on keyboard shortcuts: key names are abbreviated. For example, "Ctrl+O" means hold the control (Ctrl) key and press O. <center> <b>Willkommen zu XDrawChem!</b><br> Bryan Herger<br> herger@chemistry.gatech.edu<br> </center> <p><b>Navigation durch das Handbuch</b> <p>Am unteren Fensterrand gibt es drei Knöpfe deren Bedeutung wohl selbsterklärend sein dürfte... Man kann auch zu einem beliebigen Hilfethema springen, indem man es in der oberen Auswahlbox auswählt. <p>Tastenkombinationen werden immer wie folgt beschrieben: [Ctrl+O] bedeuted, daß man die Taste [Ctrl] gedrückt hält, während man die Taste [O] betätigt. <b>Overview</b><p>The application window consists of five major elements:<br>The menu bar at the top;<br>The file/edit toolbar below the menu bar;<br>The drawing toolbar, on the left;<br>The status bar, along the bottom;<br>and the drawing area, the large area in the middle.<p>The File/Edit toolbar shows commonly used items which are also found under the File and Edit menus.<p>The Drawing toolbar shows available drawing tools.<p>To get help on a toolbar button, click on the <img source="whatsthisicon"><b>What's This?</b> button, then the button you want help with.<p>The status bar shows error messages, information, and usually a tip on how to use the current drawing tool.<p>The following pages describe all the buttons and menu options. <b>Übersicht</b> <p>Das Hauptfenster von XDrawChem besteht im wesentlichen aus fünf Elementen:<br> <p>Menuleiste am oberen Rand<br> Werkzeugleiste direkt unterhalb der Menüleiste<br> Werkzeugleiste fürs Zeichnen auf der linken Seite<br> Statusleiste am unteren Fensterrand<br> Zeichenfläche<br> <p>Die Werkzeugleiste unterhalb der Menüleiste enthält im wesentlichen Funktionen, welche auch über die Menüs 'Datei' und 'Bearbeiten' erreichbar sind. <p>Die Werkzeugleiste fürs Zeichnen enthält natürlich die verfügbaren Werkzeuge fürs Zeichnen. <p>Um eine nähere Auskunft über ein Werkzeug zu bekommen, kann man auf den <img source="whatsthisicon"><b>What's this?</b> Knopf klicken, gefolgt von einem Klick auf den Werkzeugknopf über den man näheres erfahren möchte. <p>Die Statuszeile zeigt Fehlermeldungen, Informationen und gewöhnlich auch einem Tip, wie man das ausgewählte Zeichenwerkzeug benutzt. <p>Die folgenden Seiten beschreiben alle Knöpfe (Buttons) und Menüoptionen. <b>The File Menu and Toolbar Buttons</b><p><img source="fileopenicon"><b>Open File</b> (Ctrl+O) Open a file. A dialog will appear asking you to select a file. This will overwrite the drawing in the current window!<br>Files which are not native (XDC) format will be scaled to the current fixed length on loading.<p><img source="filesaveicon"><b>Save File</b> (Ctrl+S) Save the current file. If it is a new file, you will be prompted for a directory and filename to save to.<p><b>Save as...</b> Save the current file with a different name.<br><p><b>Save image</b> Saves the current drawing as an image (BMP, PNG, EPS formats available). The entire drawing is saved.<p><b>Page Setup</b> Opens a window allowing you to choose paper size and orientation.<p><img source="fileprinticon"><b>Print</b> (Ctrl+P) Prints the current drawing. A dialog will appear, allowing you to select destination printer or file, paper size, orientation, etc.<p><b>Close</b> (Ctrl+W) Closes this window.<p><b>Quit</b> (Ctrl+Q) Closes all windows and exits the application. <b>Das Dateimenü und dessen Werkzeugleiste</b> <p><b>Neu</b> erzeugt eine ein neues XDrawChem Fenster. <p><img source="fileopenicon"><b>Datei öffnen</b> [Ctrl+O] öffnet eine bestehende Datei. Ein Dialogfenster zur Dateiauswahl erscheint. Das Öffnen einer Datei überschreibt den Inhalt der aktuellen Zeichenfläche!<br> Dateien die nicht im XDC Format vorliegen werden beim Öffnen auf die jeweils eingestellte 'Feste Länge' skaliert. <p><img source="filesaveicon"><b>Datei speichern</b> [Ctrl+S] speichert die aktuelle Datei. Falls es sich um eine neue Datei handelt, wird der Dialog 'Speichern unter...' aus dem Dateimenu geöffnet. <p><b>Speichern unter...</b> speichert die aktuelle Zeichnung unter einem anderen Namen ab. <p><b>Bild exportieren</b> speichert die aktuelle Zeichnung als Bild im Format BMP, PNG oder EPS ab. Hierbei wird die ganze Zeichenfläche gespeichert. <p><b>Seiteneinstellungen...</b> öffnet ein Fenster zum Auswählen von Papiergröße und Orientierung. <p><img source="fileprinticon"><b>Drucken</b> [Ctrl+P] Druckt die aktuelle Zeichnung. Das Druckdialogfenster erscheint um diverse Einstellungen vornehmen zu können. <p><b>Schließen</b> [Ctrl+W] schließt das aktuelle Fenster. <p><b>Beenden</b> [Ctrl+Q] schließt alle Fenster und beendet XDrawChem. <b>Drawing</b><p>The toolbar on the left side show available drawing tools. Click on a tool, then click and drag in the drawing area to draw.<p><img source="selecttoolicon"><b>Select tool</b> Select objects in the drawing. Click on individual objects to select, or left-click and drag to select multiple objects.<br>After selecting objects, you can move them by dragging with the left mouse button, or roatet them by dragging with the right mouse button.<p><img source="erasetoolicon"><b>Erase tool</b> Erase individual objects. Move mouse over object to highlight and left-click to delete.<p><img source="linetoolicon"><b>Line tool</b> Draw lines (bonds). This tool will automatically snap endpoints of lines together. Start or finish drawing near the endpoint of another line. The highlight square will indicate which line it will snap to. Create double and triple bonds by drawing over an existing line.<p><img source="dashtoolicon"><b>Dashed line tool</b> Draw dashed lines. These can also be drawn over existing bonds to form e.g. aromatic bonds or resonance forms.<p><img source="uplinetoolicon"><b>Up Line tool</b> Draw up-facing stereospecific bonds.<p><img source="downlinetoolicon"><b>Down Line tool</b> Draw down-facing stereospecific bonds.<p><img source="arrowtoolicon"><b>Arrow tool</b> Draw arrows. Arrows cannot snap to any other object.<p><img source="curvearrowtoolicon"><b>Curved arrow tool</b> Draw curved arrows. Click and hold this tool and a submenu will appear. Select a curved arrow from the menu.<p><img source="brackettoolicon"><b>Bracket tool</b> Draw brackets. Click and hold this tool and a submenu will appear. Select a bracket from the menu. Left-click and drag to draw brackets.<p><img source="texttoolicon"><b>Text tool</b> Add text. Click on the endpoint of a line or an intersection to label it.<br>The next page describes text in great detail.<p><img source="ringtoolicon"><b>Ring tool</b> Add rings and other predefined molecules. A dialog box will appear with rings and molecules XChemDraw is able to draw. Or, click and hold to get a picture list of 'favorite' rings.<br>Directions to put molecules on the 'favorite' list appear later.<p><img source="symboltoolicon"><b>Symbol tool</b> Add symbols. Click and hold for a picture menu of symbols. Select a symbol from the menu. Click on a point to put a symbol on that point -- the symbol will move with the point. <b>Zeichnen</b> <p>Die Werkzeugleiste auf der linken Seite enthält alle verfügbaren Zeichenwerkzeuge. Man wählt das Werkzeug per Mausklick aus, um auf der Zeichenfläche damit zu zeichnen. <p><img source="selecttoolicon"><b>Auswählen</b> wählt Objekte in der Zeichenfläche aus. Durch Anklicken eines Objekts wird dieses ausgewählt, durch das Ziehen bei gedrücktem Mausknopf können ganze Bereiche ausgewählt werden. Der ausgewählte Bereich wird durch einen Rahmen markiert.<br> Durch das Klicken mit der Maus auf ein ausgewähltes Objekt kann man dieses, bei gedrückthalten der linken Maustaste, verschieben. Klickt man hierbei jedoch auf die rechte obere Ecke des Rahmens, so kann das Objekt rotiert werden. Beim Klicken auf die rechte untere Ecke kann man eine Skalierung des Objekts vornehmen. <p><img source="erasetoolicon"><b>Löschen</b> löscht einzelne Objekte. Durch das Ziehen der Maus auf ein Objekt wird dieses hervorgehoben und kann dann per Klick gelöscht werden. <p><img source="linetoolicon"><b>Linie</b> zeichnet Linien (Bindungen). Die Endpunkte zweier Linien werden automatisch zusammengeführt, wenn die neue Linie nahe dem Start- oder Endpunkt beginnt oder aufhört. Das jeweilige 'Andocken' wird durch ein kleines Quadrat gekennzeichnet. Doppel- und Dreifachbindungen können durch das 'Überzeichnen' schon existierender Bindungen erstellt werden. <p><img source="dashtoolicon"><b>gestrichelte Linie</b> zeichnet gestrichelte Linien. Diese können auch über schon existierende Bindungen gezeichnet werden, um den Resonanzcharakter einer Bindung darzustellen. <p><img source="uplinetoolicon"><b>Keil</b> dient der stereochemischen Darstellung (aus der Papierebene heraus). <p><img source="downlinetoolicon"><b>gestrichelter Keil</b> dient ebenfalls der stereochemischen Darstellung (in die Papierebene hinein). <p><img source="arrowtoolicon"><b>Pfeil</b> zeichnet verschiedene Pfeile. Bei gedrückter Maustaste auf dem Pfeilknopf erscheint ein Auswahlmenü. Pfeile können nicht mit anderen Objekten zusammengefügt werden. Durch anschließendes Auswählen können Pfeile auf die gewünschte Länge skaliert werden. <p><img source="curvearrowtoolicon"><b>gekrümmter Pfeil</b> zeichnet Pfeile mit verschiedenen Krümmungen. Bei gedrückter Maustaste auf diesem Werkzeugknopf erscheint ein Auswahlmenü. <p><img source="brackettoolicon"><b>Klammern</b> zeichnet verschiedene Arten von Klammern, die über das gedrückthalten der Maus erreichbar sind. Hat man die gewünschte Klammer ausgewählt kann man sie per Linksklick und gleichzeitigem ziehen der Maus zeichnen. <p><img source="texttoolicon"><b>Text</b> fügt Text in eine Zeichnung ein. Durch Klicken auf einen End- oder Knotenpunkt können andere Atomsorten markiert werden.<br> Die nächste Seite beschreibt das Textwerkzeug ausführlicher. <p><img source="ringtoolicon"><b>Ringe</b> ist zum Einfügen von Ringen und anderen vordefinierten Molekülen. Ein Einfachklick läßt eine Auswahlbox mit allen vorgefertigten Molekülen erscheinen. Bei gedrückter Maustaste erscheint eine Favoritenliste von Molekülen.<br> Das Hinzufügen von Molekülen zur Favoritenliste wird weiter hinten erklärt. <p><img source="symboltoolicon"><b>diverse Symbole</b> fügt Symbole hinzu. Bei gedrückter Maustaste erscheint ein Auswahlmenü. <b>Text</b><p>Select the <img source="texttoolicon">Text tool to add or edit text. Click anywhere to add text, click on a point to add a label (e.g., the element or functional group). Click on existing text to edit.<p>While you are editing, select text by dragging over with the cursor, or hold Shift and Arrow-Left or Right. Use the <img source="supericon">Superscript and <img source="subicon">Subscript buttons on the top toolbar to add or remove super- and subscript. You can also make the text <img source="boldtool"><b>bold</b>, <img source="italictool"><i>italic</i>, or <img source="underlinetool"><u>underlined</u> in a similar manner.<p>While editing, you can change the font and size of the text being edited by changing the font and size on the top toolbar. Note that this affects the entire text being edited. <b>Text</b> <p>Über den <img source="texttoolicon"><b>Text</b> Knopf wählt man das Textwerkzeug zum Hinzufügen oder Bearbeiten von Text. Man kann den Text an einer beliebigen Stelle auf der Zeichenfläche einfügen. Durch den Klick auf einen Linienendpunkt können Elemente oder funktionelle Gruppen markiert werden. Durch Klicken auf schon existierenden Text, kann dieser editiert werden. <p>Während dem Editieren kann der text wie gewohnt mit der Maus oder per Tastenkombination [Shift+Pfeiltasten] markiert werden. Mit Hilfe der <img source="supericon">Hoch- und <img source="subicon">Tiefstellknöpfe von der oberen Werkzeugleiste kann man hoch- und tiefgestellte Schriftzeichen erzeugen oder entfernen. Man kann den Text auch <img source="boldtool"><b>fett</b>, <img source="italictool"><i>kursiv</i> oder <img source="underlinetool"><u>unterstrichen</u> darstellen. <p>Man kann auch die Schriftart und Schriftgröße des zu editierenden Textes ändern, wobei sich dies immer auf den gesamten zu editierenden Text bezieht. <b>Formatting</b><p><b>Fixed line length and angles</b> To set fixed line length and angles, check the 'Fixed length/angles' option under the Format menu. The fixed length may be changed in the 'Set fixed length/angle' dialog. Units are in pixels. To print to scale, use 50 pixels as the fixed length, save as an image and print at 100 dpi for 1/2 inch lines, for example.<p><b>Changing font and font size</b> To change font parameters, select a new font and size from the top toolbar.<p><b>Changing color</b> To change color, click on the Set Color button on the top toolbar. It is the button showing the current drawing color (default is black) with an arrow to the right. A window will appear allowing you to select the new drawing color.<p><b>Changing the background</b> Select 'Set Background Color' from the Format menu. A window will appear allowing you to select a new background color.<p><b>Changing line width</b> To change line width, select a line width from the pulldown of numbers to the right of the color list.<p><b>Auto Layout</b> To automatically adjust the position of molecules and arrows, select the objects you wish to line up. Select Auto Layout under the Tools menu or press Ctrl+L. <b>Formatierung</b> <p><b>Feste Längen und Winkel</b> kann benutzt werden um feste Linienlängen und Winkelgrößen zu definieren. Man findet diese Option im Menü 'Formatierung'. Die Länge der Linien ist in Pixel angegeben. Um skaliert zu drucken kann man zum Beispiel 50 Pixel als feste Länge einstellen, was bei einem Druck von 100 dpi (dots per inch, einem Inch entsprechen circa 2,54 cm) dann in einer Linienlänge von einem halben Inch resultiert. <p>Um die <b>Schriftart und Schriftgröße</b> zu ändern kann man die Werkzeuge der oberen Werkzeugleiste benutzen. <p>Die <b>Änderung der Zeichenfarbe</b> erreicht man mit dem entsprechenden Knopf der oberen Werkzeugleiste. Dieser Knopf zeigt stets die aktuelle Zeichenfarbe (normalerweise schwarz) an. Durch Anklicken erscheint ein neues Fenster was die Auswahl einer anderen Farbe erlaubt. <p>Die <b>Hintergrundfarbe</b> kann man im Menü 'Formatierung' einstellen. Es erscheint ein Fenster zur Auswahl der neuen Hintergrundfarbe. <p>Die <b>Linienbreite</b> kann mit der oberen Werkzeugleiste festgelegt werden. Der Knopf dafür befindet sich rechts neben der Auswahl für die Zeichenfarbe. <p><b>Ausrichten</b> [Ctrl+L] richtet die Positionen von zuvor ausgewählten Molekülen und Pfeilen automatisch aus. <b>Tools</b><p>The Tools menu has several useful functions:<br><b>Auto layout</b> (Ctrl+L) is described on the previous page.<br><b>Calculate empirical formula</b> Select this option and click on a molecule. A label will appear above the molecule showing its empirical formula.<br><b>Calculate molecular weight</b> Select this option and click on a molecule. A label will appear under the molecule with its molecular weight.<br><b>Calculate empirical formula</b> Select this option and click on a molecule. A window will pop up with the percent composition of carbon, hydrogen, oxygen, and nitrogen.<br><b>Predict 13C NMR</b> Select this option and click on a molecule. A dialog will appear with a picture of the molecule and the predicted peaks. You can print the picture and peak list exactly as shown on the screen.<br><b>Predict IR</b> Select this option and click on a molecule. A dialog will appear with a picture of the molecule and the predicted peaks. You can print the picture and peak list exactly as shown on the screen.<br> <b>Werkzeuge</b> <p>Dieses Menü beinhaltet einige recht nützliche Funktionen:<br> <b>Ausrichten</b> [Ctrl+L] ist auf der vorherigen Seite beschrieben.<br> <b>Berechne empirische Formel</b> Bei der Wahl dieses Menüpunkts und dem anschließenden Klick auf ein Molekül erscheint dessen empirische Formel direkt über ihm.<br> <b>Berechne Molekulargewicht</b> Funktioniert genau wie die empirische Formel. Es erscheint das Molekulargewicht unterhalb des Moleküls.<br> <b>Elementaranalyse</b> Durch Wahl dieses Menüpunkts und gefolgtem Klick auf ein Molekül bekommt man ein Fenster mit den prozentualen Anteilen von Kohlenstoff, Wasserstoff, Sauerstoff und Stickstoff der jeweiligen Spezies.<br> <b>13C NMR Vorhersage</b> Durch Wahl dieses Menüpunkts und gefolgtem Klick auf ein Molekül erscheint dessen berechnetes 13C NMR Spectrum.<br> <b>IR Vorhersage</b> Die Wahl dieses Menüpunkts und gefolgtem Klick auf ein Molekül zeigt dessen IR Aktivität. <b>Internet database searches</b><p>XDrawChem can retrieve molecules from its own network database. Structures in the database are taken from the public NCI database. See References in Help menu.<p>Choose Find on Internet from the File menu or press Ctrl+F to open the search dialog. The server is set at compile time, or by the environment variable XDC_SERVER. It can also be changed here. Select CAS-Number or Formula search from the pulldown menu. Type the search string in the bottom text box. Check exact match if you want to find an exact formula; CAS number searches are always assumed to be exact match searaches. Press Search. If only one molecule is found, it is automatically inserted. If multiple molecules are found, you will be presented with a list of molecules. Click on the CAS number to select the molecule and press Select to insert the molecule into the current drawing. <b>Internetdatenbanksuche</b> <p>XDrawChem kann Moleküle von einer Netzwerkdatenbank aus laden. <p>Für die <b>Suche im Internet</b> [Ctrl+F] wählt man zunächst den entsprechenden Eintrag im Dateimenü, was den Suchdialog öffnet. Der Name des Servers wird entweder während des Kompilierens oder durch die Umgebungsvariable XDC_SERVER festgelegt. Man kann nach CAS Nummern oder Summenformeln von Molekülen suchen. Wählt man 'Genaue Treffer' kann man Moleküle mit genau übereinstimmender Summenformel finden. Die Suche nach der CAS Nummer sollte immer ein eindeutiges Ergebnis liefern. Wird nur ein Molekül gefunden wird es automatisch eingefügt, andernfalls erscheint eine Auswahlliste. <img source="ringtoolicon"><b>Ring and Molecules in XDrawChem's library</b><p>Press and hold the left mouse button on the Ring tool button to open the ring menu. The following structures are available:<p>Rings: cyclopentane, imidazole, cyclohexane, benzene.<p>Molecules:<br>All 20 standard amino acids.<br>Standard nucleic acids: adenine, guanine, cytosine, thymine, uracil.<p><b>Adding molecules</b><br>To add a molecule to the Ring dialog, simply save a CML format file of it to the RINGDIR directory (see INSTALL.txt). The molecule will appear by the name it is saved as (e.g., save methyl t-butyl ether as 'mtbe.cml' and 'mtbe' will appear on the molecule list next time the dialog is opened.)<p><b>The Favorite list</b><br>The Favorite list is the last meu item under the ring menu. To add molecules to this list, simply put the molecule in the RINGDIR directory (see INSTALL.txt), as well as a PNG image of the molecule with the same name. For instance, one could add acetone by placing a CML file named 'acetone.cml' in RINGDIR, as well as a PNG file named 'acetone.png'. See files in RINGDIR already; XDrawChem installs with benzene, imidazole, cyclopentane, and cyclohexane on the favorite list.<br>To remove a picture from the Favorite list, delete its corresponding picture (PNG file). <img source="ringtoolicon"><b>Ringe and Moleküle in XDrawChem's Bibliothek</b> <p>XDrawChem kommt standardmäßig mit den 20 natürlich vorkommenden Aminosäuren sowie den Nukleinsäuren Adenin, Guanin, Cytosin, Thymin und Uracil. <p><b>Hinzufügen von Molekülen</b><br> Um ein Molekül zum Ringdialog hinzuzufügen muß man es nur im CML Format im RINGDIR Verzeichnis ablegen (siehe INSTALL.txt). Das Molekül erscheint dann unter dem Namen, unter dem es abgespeichert wurde. Speichert man zum Beispiel Methyltertbutylether als 'mtbe.cml' ab, so erscheint es in der Molekülliste unter 'mtbe', wenn diese daß nächste mal geöffnet wird. <p><b>Die Favoritenliste</b><br> Die Favoritenliste erscheint wenn man den Ringeknopf auf der linken Werkzeugleiste circa eine halbe Sekunde lang gedrückt hält. Um Moleküle zu dieser Liste hinzuzufügen muß man sie wie oben einfach im RINGDIR Verzeichnis abspeichern (siehe INSTALL.txt). Nun muß man zusätzlich noch ein Bild des Moleküls im PNG Format unter gleichem Namen in das RINGDIR Verzeichnis hineinkopieren. Zum Beispiel kann man Aceton hinzufügen indem man die CML Datei 'aceton.cml' sowie die PNG Datei 'aceton.png' in das RINGDIR Verzeichnis kopiert. XDrawChem hat von Haus aus Cyclopentan, Imidazol, Cyclohexan und Benzol in der Favoritenliste. Um ein Molekül aus der Favoritenliste zu entfernen muß man also lediglich dessen PNG Datei löschen. &Close Schließen &Next >> &Next >> << &Previous << &Previous <b>Selecting and Editing</b><p>Important note: you can cut, copy, and paste between XDrawChem windows. It is possible to copy images into other applications, or to drag and drop selections. If the application will not accept copy or drag and drop, use <b>Save image</b> to create an image, or save as an MDL Molfile. It is not possible to paste or drag items into XDrawChem from other applications.<p><b>Selecting, Moving, Drag and Drop</b><p>Select using the <img source="selecttoolicon"><b>Select tool</b>. Click and drag to highlight a selection. Alternatively, the Select tool can be used to drag individual objects and points. Move the cursor over an object and the cursor will become a four-way arrow. Click and drag with the left button to move.<p>You can drag and drop selections into other applications. Use the right mouse button to drag the selected region to another application. The destination application must be able to accept image drops of type image/png or image/bmp.<p><b>Changing objects</b><p>To change an object after drawing it, choose the select tool and highlight the object. Right-click on it. A dialog box will appear (except for Text object) allowing you to change properties of the object.<p><b>Rotate and resize</b><p>To rotate or resize, select multiple objects. A box will appear around the selection. Click and drag the box in the top right to rotate; click and drag the box in the bottom right to resize.<p><b>Editing</b><br><b>Undo</b> (Ctrl+Z) Undo the last action. The last 16 actions may be undone.<br><img source="cuticon"><b>Cut</b> (Ctrl+X) Cut a selection from this drawing.<br><img source="copyicon"><b>Copy</b> (Ctrl+C) Copy a selection from this drawing. The Copy command also copies the selection to the system clipboard as an image.<br><img source="pasteicon"><b>Paste</b> (Ctrl+V) Paste something that was cut or copied.<br><b>Clear</b> (Del) Erases the current selection permanently.<br><b>Select all</b> (Ctrl+A) Select all objects in the drawing.<br>There are two sub-menus:<br><b>Rotate:</b> Rotate the selection by 90, 180, or 270 degrees.<br><b>Flip:</b> Flip the selection about a horizontal or vertical line. <b>Auswählen und Bearbeiten</b> <p>Das Ausschneiden, Kopieren und Einfügen funktioniert bis jetzt leider nur zwischen Fenstern von XDrawChem. Um Zeichnungen in andere Anwendungen zu importieren, kann man 'Bild exportieren...' benutzen um ein Bild zu erzeugen oder das Molekül als MDL Datei abspeichern. <p>Zum <b>Auswählen</b> von Objekten benutzt man den entsprechenden Knopf <img source="selecttoolicon"> auf der linken Werkzeugleiste. Man zieht die Maus bei gedrückter Taste um den gewünschten Bereich auszuwählen. Man kann dieses Werkzeug auch zum Ziehen und Verschieben von Punkten oder Objekten verwenden. Hierzu plaziert man den Mauszeiger über dem gewünschten Objekt, worauf sich dieser in ein Pfeilkreuz verwandelt. Durch Ziehen bei gedrückter Maustaste verschiebt man das Objekt auf der Zeichenfläche. <p>Die <b>Änderung von Objekten</b> (Bindungen, Pfeile etc.) erfolgt ebenfalls durch das Werkzeug <b>Auswählen</b>. Bewegt man den Mauszeiger auf das zu ändernde Objekt, so daß es hervorgehoben wird, kann durch Rechtsklick eine Auswahlbox der zu ändernden Eigenschaften aufgerufen werden. <p>Zum <b>Rotieren und Skalieren</b> wählt man mehrere Objekte aus, so daß ein Rahmen erscheint. Klickt man nun auf die rechte obere Ecke des Rahmens, so kann das Objekt rotiert werden. Beim Klicken auf die rechte untere Ecke kann man eine Skalierung des Objekts vornehmen. <p><b>Rückgängig</b> [Ctrl+Z] macht die letzte Aktion ungeschehen. Insgesamt können 16 Aktionen rückgängig gemacht werden.<br> <img source="cuticon"><b>Ausschneiden</b> [Ctrl+X] schneidet den ausgewählten Bereich aus.<br> <img source="copyicon"><b>Kopieren</b> [Ctrl+C] kopiert den ausgewählten Bereich.<br> <img source="pasteicon"><b>Einfügen</b> [Ctrl+V] fügt das zuvor Ausgeschnittene oder Kopierte wieder ein.<br> <b>Löschen</b> [Del] löscht den ausgewählten Bereich.<br> <b>Alles auswählen</b> [Ctrl+A] wählt alle Objekte auf der Zeichenfläche aus.<br> <b>Rotieren:</b> rotiert den ausgewählten Bereich um 90, 180, oder 270 Grad.<br> <b>Spiegeln:</b> spiegelt den ausgewählten Bereich horizontal oder vertikal. XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_dk.ts000066400000000000000000002520441371466245600213350ustar00rootroot00000000000000 @default untitled ApplicationWindow Click this button to open a file.<br><br>You can also select the Open command from the File menu. Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Save file Print file Cut Copy Paste Set line thickness Set Line Thickness Set font Set Font Set font size Set Font Size Select Erase Draw dashed line Draw stereo-up line Draw stereo-down line Draw or edit text &File &New &Open &Find on Internet &Save Save &as... Save picture... Pa&ge setup &Print Close Quit Rotate 90 degrees clockwise Rotate 180 degrees Rotate 90 degrees counterclockwise Flip &horizontal Flip &vertical &Edit &Undo Cu&t &Copy &Paste Clear Select &All &Rotate &Flip &Group Select &Reactant Select &Product Clear &group Clear all &groups Forma&t &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... Estimate gas-phase enthalphy change Compare 1H NMR Compare 13C NMR T&ools Clean up molecule Auto &layout Create custom ring Molecule information... Predict 13C NMR Predict IR Reaction Output SMILES &Help &Manual &About &Support &References What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! How to get help Database query failed No molecules in the database match the query. Open file... --Select a filter-- (*) XDC - XDrawChem native format (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair Stereochemical ring hydrogen p orbital OK Cancel Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 1H NMR compare error Please select only one reactant and one product to compare. 13C NMR compare error SMILES string SMILES string for selected molecule: Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: OK Cancel Default Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Export Peak List Help Close GraphWidget Red is reactant Blue is product HelpWindow &Print &Close &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Help Cancel CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Cancel Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet XDC database server: Search type: CAS Number Formula Chemical name Look for: Exact matches only Search Cancel PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Draw Ring mode: left click to add %1 Click on a molecule for information Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Tool test mode Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Select mode: left click on object to move , click to paste into drawing Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Choose a structure from list: Cancel SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_en.ts000066400000000000000000002520441371466245600213410ustar00rootroot00000000000000 @default untitled ApplicationWindow Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Save file Print file Cut Copy Paste Set line thickness Set Line Thickness Set font Set Font Set font size Set Font Size Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Select Erase Draw dashed line Draw stereo-up line Draw stereo-down line Draw or edit text &File &New &Open &Find on Internet &Save Save &as... Save picture... Pa&ge setup &Print Close Quit Rotate 90 degrees clockwise Rotate 180 degrees Rotate 90 degrees counterclockwise Flip &horizontal Flip &vertical &Edit &Undo Cu&t &Copy &Paste Clear Select &All &Rotate &Flip Forma&t T&ools Clean up molecule Auto &layout Predict 13C NMR Predict IR &Help &Manual What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! Database query failed No molecules in the database match the query. Click this button to open a file.<br><br>You can also select the Open command from the File menu. Output SMILES &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair OK Cancel Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Default Set fixed angle and length OK Cancel Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Close &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Cancel Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Cancel Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet XDC database server: Search type: CAS Number Formula Chemical name Look for: Exact matches only Search Cancel PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Choose a structure from list: Cancel SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_es.ts000066400000000000000000002520441371466245600213460ustar00rootroot00000000000000 @default untitled ApplicationWindow Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Save file Print file Cut Copy Paste Set line thickness Set Line Thickness Set font Set Font Set font size Set Font Size Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Select Erase Draw dashed line Draw stereo-up line Draw stereo-down line Draw or edit text &File &New &Open &Find on Internet &Save Save &as... Save picture... Pa&ge setup &Print Close Quit Rotate 90 degrees clockwise Rotate 180 degrees Rotate 90 degrees counterclockwise Flip &horizontal Flip &vertical &Edit &Undo Cu&t &Copy &Paste Clear Select &All &Rotate &Flip Forma&t T&ools Clean up molecule Auto &layout Predict 13C NMR Predict IR &Help &Manual What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! Database query failed No molecules in the database match the query. Click this button to open a file.<br><br>You can also select the Open command from the File menu. Output SMILES &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair OK Cancel Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length OK Cancel Default Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Close &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Cancel Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Cancel Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet XDC database server: Search type: CAS Number Formula Chemical name Look for: Exact matches only Search Cancel PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Choose a structure from list: Cancel SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_fr.ts000066400000000000000000002631321371466245600213460ustar00rootroot00000000000000 iso8859-1 @default untitled &Close Fermer << &Previous << &Previous &Next >> & Next >> ApplicationWindow Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Ouvrir fichier Save file Enregistrer fichier Print file Imprimer fichier Cut Couper Copy Copier Paste Coller Set drawing color Spécifier couleur de dessin Set line thickness Spécifier épaisseur du trait Set Line Thickness Spécifier épaisseur du trait Set font Spécifier police Set Font Spécifier police Set font size Spécifier taille de police Set Font Size Spécifier taille de police Make selected text <b>bold</b> Texte sélectionné en <b>gras</b> <i>Italicize</i> selected text Texte sélectionné en <i>italique</i> Underline selected text Souligner le texte sélectionné Superscript selected text Texte sélectionné en exposant Subscript selected text Texte sélectionné en indice Select Sélectionner Erase Effacer Draw line Dessiner ligne Draw dashed line Dessiner ligne pointilliée Draw stereo-up line Dessiner ligne stereo-up Draw stereo-down line Dessiner ligne stereo-down Draw arrow Dessiner flèche Draw curved arrow Dessiner flèche courbe Draw bracket Dessiner crochet Draw or edit text Dessiner ou éditer texte Draw ring Dessiner cycle Draw symbol Dessiner symbole &File &Fichier &New &Nouveau &Open &Ouvrir &Find on Internet &Chercher via Internet &Save &Enregistrer Save &as... Enregistrer sous... Save picture... Exporter une image... Pa&ge setup Mise en pa&ge... &Print &Imprimer Close &Fermer Quit &Quitter Rotate 90 degrees clockwise Rotation 90° horaire Rotate 180 degrees Rotation 180° Rotate 90 degrees counterclockwise Rotation 90° antihoraire Flip &horizontal Basculer &horizontalement Flip &vertical Basculer &verticalement &Edit &Editer &Undo &Annuler Cu&t Cou&per &Copy &Copier &Paste &Coller Clear &Effacer Select &All Tout &sélectionner &Rotate &Rotation &Flip &Basculer Forma&t Forma&t Fixed &length and angle Longueur et &angle fixes &Set fixed length and angle &Choisir longueur et angle fixes Set &background color Choisir la &couleur du fond T&ools Outils Clean up molecule Auto &layout Mise en place automatique Calculate empirical formula Calcul formule empirique Calculate molecular weight Calcul masse moléculaire Elemental analysis Analyse élémentaire Predict 13C NMR Prédiction RMN C13 Predict IR Prédiction Infrarouge &Help &Aide &Manual &Manuel &About... &A propos... &References... &Références What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! Database query failed No molecules in the database match the query. Click this button to open a file.<br><br>You can also select the Open command from the File menu. Output SMILES &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair OK Cancel Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Default Set fixed angle and length Spécifier longueur et angle fixes Fixed angle: Angle fixe : Fixed length: Longueur fixe : OK Cancel Annuler Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Close Fermer &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Cancel Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Sélectionner Cancel Annuler Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet Rechercher une structure via Internet XDC database server: Serveur de base XDC : Search type: Type de recherche : CAS Number CAS Number Formula Formule Chemical name Nom chimique Look for: Rechercher : Exact matches only Correspondances exactes uniquement Search Rechercher Cancel Annuler PageSetupDialog Page setup Mise en page Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Annuler Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Outil cycle Choose a structure from list: Choisissez une structure dans la liste : Cancel Annuler SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XManual &Close Fermer &Next >> & Next >> << &Previous << &Previous XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_it.ts000066400000000000000000002520441371466245600213530ustar00rootroot00000000000000 @default untitled ApplicationWindow Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Save file Print file Cut Copy Paste Set line thickness Set Line Thickness Set font Set Font Set font size Set Font Size Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Select Erase Draw dashed line Draw stereo-up line Draw stereo-down line Draw or edit text &File &New &Open &Find on Internet &Save Save &as... Save picture... Pa&ge setup &Print Close Quit Rotate 90 degrees clockwise Rotate 180 degrees Rotate 90 degrees counterclockwise Flip &horizontal Flip &vertical &Edit &Undo Cu&t &Copy &Paste Clear Select &All &Rotate &Flip Forma&t T&ools Clean up molecule Auto &layout Predict 13C NMR Predict IR &Help &Manual What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! Database query failed No molecules in the database match the query. Click this button to open a file.<br><br>You can also select the Open command from the File menu. Output SMILES &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair OK Cancel Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length OK Cancel Default Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Close &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Cancel Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Cancel Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet XDC database server: Search type: CAS Number Formula Chemical name Look for: Exact matches only Search Cancel PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Choose a structure from list: Cancel SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_jp.ts000066400000000000000000002520441371466245600213500ustar00rootroot00000000000000 @default untitled ApplicationWindow Click this button to open a file.<br><br>You can also select the Open command from the File menu. Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Save file Print file Cut Copy Paste Set line thickness Set Line Thickness Set font Set Font Set font size Set Font Size Select Erase Draw dashed line Draw stereo-up line Draw stereo-down line Draw or edit text &File &New &Open &Find on Internet &Save Save &as... Save picture... Pa&ge setup &Print Close Quit Rotate 90 degrees clockwise Rotate 180 degrees Rotate 90 degrees counterclockwise Flip &horizontal Flip &vertical &Edit &Undo Cu&t &Copy &Paste Clear Select &All &Rotate &Flip &Group Select &Reactant Select &Product Clear &group Clear all &groups Forma&t &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... Estimate gas-phase enthalphy change Compare 1H NMR Compare 13C NMR T&ools Clean up molecule Auto &layout Create custom ring Molecule information... Predict 13C NMR Predict IR Reaction Output SMILES &Help &Manual &About &Support &References What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! How to get help Database query failed No molecules in the database match the query. Open file... --Select a filter-- (*) XDC - XDrawChem native format (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair Stereochemical ring hydrogen p orbital OK Cancel Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 1H NMR compare error Please select only one reactant and one product to compare. 13C NMR compare error SMILES string SMILES string for selected molecule: Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: OK Cancel Default Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Export Peak List Help Close GraphWidget Red is reactant Blue is product HelpWindow &Print &Close &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Help Cancel CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Cancel Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet XDC database server: Search type: CAS Number Formula Chemical name Look for: Exact matches only Search Cancel PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Draw Ring mode: left click to add %1 Click on a molecule for information Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Tool test mode Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Select mode: left click on object to move , click to paste into drawing Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Choose a structure from list: Cancel SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_nl.ts000066400000000000000000003034571371466245600213550ustar00rootroot00000000000000 iso8859-1 @default untitled &Close Sluiten << &Previous << &Previous &Next >> &Next >> ApplicationWindow Click this button to open a file. <br><br>You can also select the Open command from the File menu. Druk op deze knop om een bestand te openen. <br><br>U kunt ook het commando Openen uit het Bestand menu gebruiken. Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Druk op deze knop om het bestand op te slaan.<br><br>U kunt ook het commando Opslaan in het Bestand menu kiezen.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Druk op deze knop om het bestand af te drukken.<br><br>U kunt ook het commando Afdrukken in het Bestand menu kiezen. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Druk op deze knop om een selectie te verwijderen.<br><br>U kunt ook het commando Knippen uit het Bewerk menu kiezen, of Ctrt+X drukken. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Druk op deze knop om een selectie te kopieren.<br><br>U kunt ook het commando Kopieren uit het Bewerk menu kiezen, of Ctrt+C drukken. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Druk op deze knop om een selectie te plakken.<br><br>U kunt ook het commando Plakken uit het Bewerk menu kiezen, of Ctrt+V drukken. Select tool<br><br>Use the Select tool to select and move items.<br><br>You can select multiple items and cut, copy, move and rotate them. Selectie tool<br><br>U kunt de Selectie tool kiezen en objecten bewegen.<br><br>U kunt meerdere objecten selecten en verwijderen, kopieren, verplaatsen en roteren. Erase tool<br><br>Use the Erase tool to erase individual items. Wissen tool<br><br>U kunt the Wissen tool gebruiken om objecten te wissen. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Lijn tool<br><br>U kunt de Lijn tool gebruiken om bindingen te tekenen. Teken over een reeds aanwezige binding om die twee- of drievoudig te maken. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Gestreepte Lijn tool<br><br>Gebruik de Gestreepte Lijn tool om gestreepte lijnen te tekenen. Teken over een reeds aanwezige lijn om ze gestreept te maken (om resonantie aan te geven, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Lijn Omhoog tool<br><br>Gebruik deze Lijn tool om stereobindingen die omhoop staan te maken, zoals het knop aangeeft. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Stereo Lijn Omlaag tool<br><br>Gebruik deze Lijn tool om stereobindingen die omlaag staan te maken, zoals het knop aangeeft. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Pijl tool<br><br>Gebruik de Pijl tool om rechte pijlen te tekenen. <br><br>Druk deze knop in om een pijl te tekenen.<br><br>Door te klikken en vast te houden kunt u andere pijlen kiezen. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Gekromde Pijl tool<br><br>Gebruik de Gekromde Pijl tool om kromme pijlen te tekenen.<br><br>Door te klikken en vast te houden kunt u andere pijlen kiezen. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Haken tool<br><br>Gebruik de Haken tool om haken te tekenen.<br><br>Door te klikken en vast te houden kunt u andere haken kiezen. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Tekst tool<br><br>Gebruik de Tekst tool om tekst toe te voegen en atomen en punten te benoemen.<br>(Informatie over tekstopmaak vindu in de handleiding) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Ring tool<br><br>Gebruik de Ring tool om voorgebakken ringen en structuren toe te voegen.<br><br>Klikken opent een scherm waarin u uit een lijst structuren kan kiezen.<br><br>Met klikken en vast houden kunt u kiezen welke structuur of ring u wilt tekenen.<br>(Informatie over het aanpassen van dit menu vind u in de handleiding) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> Symbool tool<br><br>Gebruik het Symbool tool om symbolen toe te voegen.<br><br>Door klikken en vasthouden kunt u uit een lijst van symbolen kiezen.<br> File Operations Bestandoperaties Open file Open bestand Save file Bewaar bestand Print file Bestand afdrukken Cut Knippen Copy Kopiëren Paste Plakken Set drawing color Kies tekenkleur Set line thickness Kies lijndikte Set Line Thickness Kies Lijndikte Set font Kies lettertype Set Font Kies Lettertype Set font size Kies lettergrootte Set Font Size Kies Lettergrootte Make selected text <b>bold</b> Maak geselecteerde text <b>vet</b> <i>Italicize</i> selected text Maak de geselecteerde tekst <i>schuin</i> Underline selected text Onderstreep de geselecteerde tekst Superscript selected text Maak geselecteerde tekst superscript Subscript selected text Maak geselecteerde tekst subscript Select Selecteer Erase Wis Draw line Teken lijn Draw dashed line Teken een gestreepte lijn Draw stereo-up line Teken een stereobinding omhoog Draw stereo-down line Teken een stereobinding omlaag Draw arrow Teken pijl Draw curved arrow Teken gekromde pijl Draw bracket Teken haak Draw or edit text Plaats of bewerk tekst Draw ring Teken ring Draw symbol Teken symbool Canned Structures Voorgebakken Structuren Cyclopropane Cyclopropaan Cyclobutane Cyclobutaan Cyclopentane Cyclopentaan Cyclopentadiene Cyclopentadieen Cyclohexane Cyclohexaan Cyclohexane - chair conformation Cyclohexaan - stoel conformatie Cyclohexane - boat conformation Cyclohexaan - boot conformatie Benzene benzeen &File &Bestand &New &Nieuw &Open &Openen &Find on Internet &Zoek op het internet &Save Ops&laan Save &as... Opslaan &als... Save picture... Opslaan als plaatje... Pa&ge setup Pa&gina opmaak &Print &Printen Close Sluiten Quit Afsluiten Rotate 90 degrees clockwise Roteer 90 graden (met de klok mee) Rotate 180 degrees Roteer 180 graden Rotate 90 degrees counterclockwise Roteer 90 graden (tegen klok in) Flip &horizontal Spiegel &horizontaal Flip &vertical Spiegel &verticaal &Edit &Bewerk &Undo &Ongedaan maken Cu&t &Knippen &Copy Ko&piëren &Paste &Plakken Clear Wissen Select &All Selectaar &Alles &Rotate &Roteren &Flip &Spiegelen Forma&t Opmake&n Fixed &length and angle Vaste &lengtes en hoeken &Set fixed length and angle &Stel vaste bindingslengte en -hoek in Set &background color Stel de &achtergrond kleur in T&ools H&ulpmiddelen Clean up molecule Molecuul verfraaien Auto &layout Auto &opmaak Calculate empirical formula Bereken verhoudingsformule Calculate molecular weight Bereken moleculair gewicht Elemental analysis Bereken elementanalyse Predict 13C NMR Voorspel 13C NMR Predict IR Voorspel IR Input SMILES Voer SMILES in &Help &Help &Manual &Handleiding &About... &Info over... &References... &Referenties... What's &This Wat is &Dit Couldn't open file Kan bestand niet openen Could not open the file: Kan het volgende bestand niet openen: Unable to load Kan niet openen Loaded document Bestand geladen Could not write to Kan het opslaan op Saved file Bestand opgeslagen Save file as... Bestand opslaan als... Save as picture... Bestand uitvoeren als plaatje... Saved picture file Sla plaatje op Unable to save picture! Kan plaatje niet opslaan! Database query failed Database zoekopdracht is gefaald No molecules in the database match the query. Geen moleculen gevonden in database. An error occured. The server cannot find the selected molecule. Een fout is opgetreden. De server kan het molecuul niet vinden. Click this button to open a file.<br><br>You can also select the Open command from the File menu. Output SMILES &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Afbreken Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow Gestreepte pijl BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Rechte haken Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Color Kleur Arrow editor Pijl bewerker Style: Stijl: Plain arrow Normale pijl Dashed arrow Gestreepte pijl Two-way arrow Twee-richtingspijl Split two-way arrow Opgesplitste twee-richtingspijl Retrosynthetic arrow Retrosynthese pijl Bond editor Binding bewerker Bond order: Bindingsorde: Dashed line Gestreepte lijn Single Enkelvoudig Stereo-up Stereopijl omhoog Stereo-down Stereopijl omlaag Single/double (aromatic) aromatisch Double dubbel Double/triple dubbel/drievoudig Triple drievoudig Bracket editor Haak bewerker Square bracket Rechte haken Parentheses Normale haken Curly bracket Accoladen Curved Arrow editor Gekromde pijl bewerker 90 degree clockwise 90 graden met de klok mee 180 degree clockwise 180 graden met de klok mee 270 degree clockwise 270 graden met de klok mee 90 degree counterclockwise 90 graden tegen de klok in 180 degree counterclockwise 180 graden tegen de klok in 270 degree counterclockwise 270 graden tegen de klok in Symbol editor Symbool bewerker Positive charge Positieve lading Negative charge Negatieve lading Partial positive charge Partiële positieve lading Partial negative charge Partiële negatieve lading Single electron Enkel elektron Electron pair Elektronenpaar OK OK Cancel Afbreken Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel Afbreken ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK OK Cancel Afbreken CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length Stel vaste hoek en lengte in Fixed angle: Vaste hoek: Fixed length: Vaste lengte: OK OK Cancel Afbreken Default Standaard Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Sluiten Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Printen &Close Sluiten &Backward &Forward &Home &About ... &File &Bestand &Go &Help &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK OK Cancel Afbreken Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Selecteren Cancel Afbreken Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet Zoek structuur via het internet XDC database server: XDC database server: Search type: Type zoekopdracht: CAS Number CAS-nummer Formula Formule Chemical name Chemische naam Look for: Zoek naar: Exact matches only Alleen exacte vondsten Search Zoeken Cancel Afbreken PageSetupDialog Page setup Pagina layout Paper size: Pagine grootte: Letter (8.5" x 11") Letter (8.5" x 11") Legal (8.5" x 14") Legal (8.5" x 14") A4 (210 mm x 297 mm) A4 (210 mm x 297 mm) 640x480 pixels 640x480 punten 800x600 pixels 800x600 punten 1024x768 pixels 1024x768 punten Orientation: Oriëntatie: Portrait Staand Landscape Liggend OK OK Cancel Afbreken Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK OK Cancel Afbreken Render2D Select mode: left click on object to move, right click on object to edit Selectie modus: linker muisknop om een object te verplaatsen, rechter muisknop om een object te bewerken Draw Line mode: left click to draw line, right click to edit Teken Lijn modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken Draw Dashed Line mode: left click to draw line, right click to edit Teken Gestreepte Lijn modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken Draw Stereo-Up Line mode: left click to draw line, right click to edit Teken Stereobinding Omhoog modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken Draw Stereo-Down Line mode: left click to draw line, right click to edit Teken Stereobinding Omlaag modus: linker muisknop om een lijn te tekenen, rechter muisknop om lijn te bewerken Draw Arrow mode: left click to draw arrow Teken pijl modus: linker muisknop tekent pijl Draw Bracket mode: left click to draw bracket Teken haak modus: linker muisknop tekent haak Erase mode: left click to erase object Wissen modus: linker muisknop wist object Text mode: left click to add or edit text Tekst modus: linker muisknop bewerkt of voegt tekst toe Draw Symbol mode: left click to add symbol Teken symbool modus: linker muisknop voegt symbool toe Click on a molecule to calculate its molecular weight Klik op een molecuul om het moleculair gewicht te berekenen Click on a molecule to calculate its empirical formula Klik op een molecuul om de verhoudingsformule te berekenen Click on a molecule to calculate its elemental analysis Klik op een molecuul om de elementanalyse te bepalen Click on a molecule to calculate its 13C NMR Klik op een molecuul om het 13C NMR spectrum te berekenen Click on a molecule to calculate its 1H NMR Klik op een molecuul om het proton NMR spectrum te berekenen Click on a molecule to calculate its IR Klik op een molecuul om het infrarood spectrum te berekenen Click on a molecule to determine its IUPAC name Klik op een molecuul om de IUPAC naam te bepalen Click on a molecule to determine its SMILES string Klik op een molecuul om de SMILES string te bepalen Click on a molecule to clean up its structure Klik op een molecuul om de structuur netter te maken Select mode: left click to move, right click to edit Selecteer modus: linker muisknop verplaatst molecuul, rechter bewerkt molecuul Undo! Maak ongedaan! Cannot undo, sorry! Kan de actie niet ongedaan maken, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Knippen Copy Kopiëren Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Ring hulpmiddel Choose a structure from list: Kies een structuur uit de lijst: Cancel Afbreken SmilesDialog OK OK Cancel Afbreken Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK OK Cancel Afbreken Tool_13CNMR_Dialog 13C NMR spectrum Help Close Sluiten , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Sluiten Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Sluiten Peaks of reactant: Peaks of product: XManual <center><b>Welcome to XDrawChem!</b><br>Bryan Herger<br>herger@chemistry.gatech.edu<br></center><p><b>Navigating the manual:</b><p>At the bottom of the window there are three buttons. These are:<p>Close - close the manual.<br>Prev - go to the previous manual page.<br>Next - go to the next manual page.<p>The number between Prev and Next tells what page you are viewing.<br>You can jump to any page by selecting the page title from the combo box at the top.<p>A note on keyboard shortcuts: key names are abbreviated. For example, "Ctrl+O" means hold the control (Ctrl) key and press O. <center><b>Welkom bij XDrawChem!</b><br>Bryan Herger<br>herger@chemistry.gatech.edu<br></center> <p><b>Bladeren in de handleiding:</b> <p>Onderaan het scherm staan drie knoppen: <p>Sluiten - afsluiten van de handleiding. <br>Terug - ga naar de vorige pagina. <br>Verder - ga naar de volgende pagina. <p>Het aantal tussen de Terug en Verder knoppen geeft aan welke pagina u nu bekijkt. <br>U kunt naar elke pagina gaan door de titel van de pagina te kiezen in de lijst bovenaan het scherm. <p>Een kort overzicht van de toetsencombinaties: toetsen zijn afgekort. Een voorbeeld: "Ctrl+O" betekent dat u de control toets (Ctrl) ingedrukd houdt terwijl u de 0 indrukt. <b>Overview</b><p>The application window consists of five major elements:<br>The menu bar at the top;<br>The file/edit toolbar below the menu bar;<br>The drawing toolbar, on the left;<br>The status bar, along the bottom;<br>and the drawing area, the large area in the middle.<p>The File/Edit toolbar shows commonly used items which are also found under the File and Edit menus.<p>The Drawing toolbar shows available drawing tools.<p>To get help on a toolbar button, click on the <img source="whatsthisicon"><b>What's This?</b> button, then the button you want help with.<p>The status bar shows error messages, information, and usually a tip on how to use the current drawing tool.<p>The following pages describe all the buttons and menu options. <b>Overzicht</b><p>Het programmascherm bestaat uit vijf belangrijke elementen:<br>Het menu boven aan het scherm;<br>Het bestands- en bewerktoolbar onder het menu;<br>De tekentoolbar aan de linker kant;<br>De statusbar onderaan het scherm;<br>en het tekengedeelte in het midden.<p>De bestands- en bewerktoolbar geeft u veel gebruikte acties die ook in het menu onder Bestand en Bewerk gevonden kunnen worden.<p>De tekentoolbar geeft u verschillende tekenmodussen.<p> Om informatie over de knoppen te krijgen, druk u de <img source="whatsthisicon"><b>Wat is dit?</b> knop in, en klikt daarna op de knop waarover u informatie wilt.<p>De statusbar geeft u foutmeldingen, informatie en vaak een tip over de huidige tekenmodus.<p>De volgende paginas beschrijven alle knoppen en menu opties. &Close Sluiten &Next >> &Next >> << &Previous << &Previous XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_pl.ts000066400000000000000000003034501371466245600213500ustar00rootroot00000000000000 @default untitled bez_nazwy ApplicationWindow Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> NaciÅ›nij ten przycisk, aby zapisać aktualny plik.<br><br>W tym celu możesz również wybrać komendÄ™ Zapisz z menu Plik.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. NaciÅ›nij ten przycisk, aby wydrukować aktualny plik.<br><br>W tym celu możesz również wybrać komendÄ™ Drukuj z menu Plik. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. NaciÅ›nij ten przycisk, aby wyciąć zaznaczony fragment.<br><br>W tym celu możesz również wybrać komendÄ™ Wytnij z menu Edycja lub nacisnąć klawisze Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. NaciÅ›nij ten przycisk, aby skopiować zaznaczony fragment.<br><br>W tym celu możesz również wybrać komendÄ™ Kopiuj z menu Edycja lub nacisnąć klawisze Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. NaciÅ›nij ten przycisk, aby wkleić fragment.<br><br>W tym celu możesz również wybrać komendÄ™ Wklej z menu Edycja lub nacisnąć klawisze Ctrl+V. Select tool<br><br>Use the Select tool to select and move items.<br><br>You can select multiple items and cut, copy, move and rotate them. NarzÄ™dzie zaznaczania<br><br>To narzÄ™dzie jest używane do zaznaczania i przesuwania elementów.<br><br>Można wybrać kilka elementów, skopiować je, wyciąć, przesuwać i obracać. Erase tool<br><br>Use the Erase tool to erase individual items. NarzÄ™dzie gumowania<br><br>NarzÄ™dzie to jest używane do usuwania pojedyÅ„czych elementów. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. NarzÄ™dzie rysowania wiÄ…zaÅ„<br><br>NarzÄ™dzie to jest używane do rysowania wiÄ…zaÅ„. Rysowanie kolejnego wiÄ…zania na istniejÄ…cym już powoduje tworzenie wiÄ…zaÅ„ wielkokrotnych. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). NarzÄ™dzie rysowania wiÄ…zaÅ„ przerywanych<br><br>NarzÄ™dzie to jest używane do rysowania wiÄ…zaÅ„ przerywanych. Rysowanie wiÄ…zania przerywanego na istniejÄ…cym już wiÄ…zaniu powoduje dodanie linii przerywanej (np. obrazujÄ…cej rezonans). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. NarzÄ™dzie rysowania klina wypeÅ‚nionego<br><br>NarzÄ™dzie to jest używane do rysowanie wiÄ…zania skierowanego ku obserwatorowi, tak jak to widać na oznaczeniu przycisku. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. NarzÄ™dzie rysowania klina przerywanego<br><br>NarzÄ™dzie to jest używane do rysowanie wiÄ…zania skierowanego od obserwatora, tak jak to widać na oznaczeniu przycisku. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. NarzÄ™dzie rysowania strzaÅ‚ek<br><br>NarzÄ™dzie to jest używane do rysowania prostych strzaÅ‚ek.<br><br>NaciÅ›nij i przytrzymać, aby wybrać z listy dostÄ™pnych strzaÅ‚ek. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. NarzÄ™dzie rysowania zakrzywionych strzaÅ‚ek<br><br>NarzÄ™dzie to jest używane do rysowania prostych strzaÅ‚ek.<br><br>NaciÅ›nij i przytrzymać, aby wybrać z listy dostÄ™pnych strzaÅ‚ek. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. NarzÄ™dzie rysowania nawiasów<br><br>NarzÄ™dzie to używane jest do rysowania nawiasów okrÄ…gÅ‚ych i kwadratowych.<br><br>NaciÅ›nij i przytrzymać, aby wybrać z listy dostÄ™pnych dostÄ™pnych nawiasów. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) NarzÄ™dzie dodawania tekstu<br><br>NarzÄ™dzie to używane jest do dodawania tekstu i oznacznia tekstem atomów i punktów.<br>(WiÄ™cej informacji w podrÄ™czniku) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) NarzÄ™dzie rysowania pierÅ›cienie<br><br>NarzÄ™dzie to używane jest do dodawania gotowych pierÅ›cieni i strutkur .<br><br>NaciÅ›nij, aby przywoÅ‚ać okno dialogowe pozwalajÄ…ce wybrać pożądana strutkurÄ™.<br><br>NaciÅ›niej i przytrzymaj, aby wybrać z listy symbol pożądanego pierÅ›cienia.<br>(Informacje na temat modyfikacji tej list znjadujÄ… siÄ™ w podrÄ™czniku) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> NarzÄ™dzie dodawania symboli<br><br>NarzÄ™dzie to używane jest do dodawania symboli.<br><br>NaciÅ›nij i przytrzymać, aby wybrać z listy dostÄ™pnych symboli.<br> File Operations Operacja na plikach Open file Otwórz plik Save file Zapisz plik Print file Wdrukuj plik Cut Wytnij Copy Kopiuj Paste Wklej Set drawing color Ustawienie koloru rysunku Set line thickness Ustawienie gruboÅ›ci linii Set Line Thickness Ustawienie gruboÅ›ci linii Set font Ustawienie czcionki Set Font Ustawienie czcionki Set font size Ustawienie rozmiaru czcionki Set Font Size Ustawienie rozmiaru czcionki Select NarzÄ™dzie zaznaczania Erase Narzedzie gumowania Draw line NarzÄ™dzie rysowania wiÄ…zaÅ„ Draw dashed line NarzÄ™dzie rysowania wiÄ…zaÅ„ przerywanych Draw stereo-up line NarzÄ™dzie rysowania klinów wypeÅ‚nionych Draw stereo-down line NarzÄ™dzie rysowania klinów przerywanych Draw arrow NarzÄ™dzie rysowania strzaÅ‚ek Draw curved arrow NarzÄ™dzie rysowania strzaÅ‚ek zakrzywionych Draw bracket NarzÄ™dzie rysowania nawiasów Draw or edit text NarzÄ™dzie dodawania tesktu Draw ring NarzÄ™dzie rysowania pierÅ›cieni Draw symbol NarzÄ™dzie dodawania symboli Canned Structures Wbudowane szkelety Cyclopropane Cyklopropan Cyclobutane Cyklobutan Cyclopentane Cyklopentan Cyclopentadiene Cyklopednadien Cyclohexane Cykloheksan Cyclohexane - chair conformation Cykloheksan - konformacja krzesÅ‚owa Cyclohexane - boat conformation Cykloheksan - konformacja łódkowa Benzene Benzen &File &Plik &New &Nowy &Open &Otwórz... &Find on Internet Wyszukaj w &internecie &Save &Zapisz Save &as... Zapisz &jako... Save picture... Zapisz &obraz... Pa&ge setup Ustawienia stron&y &Print &Drukuj... Close Z&amknij Quit Za&koÅ„cz Rotate 90 degrees clockwise Obróć o 90 stopni zgodnie z zegarem Rotate 180 degrees Obróć o 180 stopni zgodnie z zegarem Rotate 90 degrees counterclockwise Obróć o 90 stopni przeciwnie do zegara Flip &horizontal Odbij po&ziomo Flip &vertical Odbij pio&nowo &Edit &Edycja &Undo &Cofnij Cu&t Wy&tnij &Copy &Kopiuj &Paste &Wklej Clear Wyczyść Select &All &Zaznacz wszystko &Rotate O&bróć &Flip O&dbij Forma&t Forma&t T&ools &NarzÄ™dzia Clean up molecule Wyrównaj czÄ…steczkÄ™ Auto &layout A&utomatyczne uÅ‚ożenie Calculate empirical formula Oblicz wzór empiryczny Calculate molecular weight Oblicz masÄ™ czÄ…steczkowÄ… Elemental analysis SkÅ‚ad pierwiastkowy Predict 13C NMR Symulacja 13C NMR Predict IR Symulacja IR Input SMILES Wprowadź SMILES &Help Pomo&c &Manual PoczrÄ™&cznik XDrawChem What's &This Co to &jest? Couldn't open file Nie można otworzyć pliku Could not open the file: Nie można otworzyć pliku: Unable to load Nie można zaÅ‚adować Loaded document Dokument zostaÅ‚ zaÅ‚adowany Could not write to Nie można zapisać do Saved file Dokument zostaÅ‚ zapisany Save file as... Zapisz plik jako... Save as picture... Zapisz jako obraz... Saved picture file Obraz zostaÅ‚ zapisany Unable to save picture! Nie można zapisać obrazu! Database query failed Zapytanie do bazy danych nie powiodÅ‚o siÄ™ No molecules in the database match the query. Brak dopasowania czÄ…steczki w bazie danych. An error occured. The server cannot find the selected molecule. WystÄ…piÅ‚ błąd. Serwer nie może znaleźc wybranej czÄ…steczki. Click this button to open a file.<br><br>You can also select the Open command from the File menu. NaciÅ›nij ten przycisk, aby otworzyć dokument.<br><br>W tym celu możesz również wybrać komendÄ™ Otwórz z menu Plik. Output SMILES SMILES wynikowy &Bond - Fixed length and angle &WiÄ…zanie - dÅ‚ugość i kÄ…t jak w ustawieniach &Arrow - Fixed length and angle &StrzaÅ‚ka - dÅ‚ugość i kÄ…t jak w ustawieniach Set background &color Ustawienie koloru &tÅ‚a &Drawing settings... Ustawienia &rysunku... &Group &Grupowanie Select &Reactant Zaznacz &substrat Select &Product Zaznacz &produkt Clear &group &UsuÅ„ grupowanie Clear all &groups UsuÅ„ &wszysktie grupowania Molecule information... Charakterystyka czÄ…steczki... Estimate gas-phase enthalphy change Szacowana zmiania entalpii w fazie gazowej Compare 13C NMR Porównanie 13C NMR Reaction Reakcja &About &O programie XDrawChem... &Support &Lista kontatków &References &OdnoÅ›niki literaturowe How to get help Jak uzyskać pomoc Current information on XDrawChem can always be found at http://www.prism.gatech.edu/~gte067k/xdrawchem/ The latest release will be posted here. There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at herger@chemistry.gatech.edu Aktualne informacje o programie XDrawChem sÄ… zawsze umieszczone na stronie http://www.prism.gatech.edu/~gte067k/xdrawchem/ Tam też znajduje siÄ™ zawsze ostatnia, aktualna wersja programu. SÄ… dwie listy dyskusyjne: xdrawchem-announce, w której ogÅ‚aszana jest kolejna, nowa wersja, oraz lista xdrawchem-user, na temat użytkowania programu XDrawChem. Subskrypcja każdej z listy polega na wysÅ‚aniu pustej wiadomoÅ›ci z tematem: "subscribe" do "xdrawchem-announce-request@lists.sourceforge.net" lub "xdrawchem-user-request@lists.sourceforge.net" Możliwy jest konatakt bezpoÅ›redni z autorem poprzez: herger@chemistry.gatech.edu Make selected text <b>bold</b> (Ctrl+B) Zmiana zaznaczonego tekstu na <b>pogrubiony</b> (Ctrl+B) <i>Italicize</i> selected text (Ctrl+I) Zmiana zaznaczonego tekstu na <i>kursywÄ™</i> (Ctrl+I) Underline selected text (Ctrl+U) PodkreÅ›lenie zaznaczonego tekstu (Ctrl+U) Superscript selected text (Ctrl-Plus) Zmiana zaznaczonego tekstu na indeks górny (Ctrl-Plus) Subscript selected text (Ctrl-Minus) Zmiana zaznaczonego tekstu na indeks dolny (Ctrl-Minus) Compare 1H NMR Porównanie 1H NMR Create custom ring Utwórz nowy pierÅ›cieÅ„ Bryan Herger herger@chemistry.gatech.edu Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2002 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project See file COPYRIGHT.txt for more details Bryan Herger herger@chemistry.gatech.edu ProszÄ™ zasubskrybować listÄ™ dyskusyjnÄ™ w celu uzyskania informacji o nowych wersjach WyÅ›lij wiadomość do xdrawchem-announce-request@lists.sourceforge.net umieszczjÄ…c sÅ‚owo 'subscribe' w tytule wiadomoÅ›ci. XDrawChem - parwa autorskie (C) 2002 Bryan Herger. Częściowe prawa autorskie (C) 1997-2000 Dr. Christoph Steinbeck oraz projekt JChemPaint Szczególy w pliku COPYRIGHT.txt [*] Cyclopropane [*] Cyklopropan [*] Cyclobutane [*] Cyklobutan [*] Cyclopentane [*] Cyklopentan Imidazole Imidazol [*] Cyclopentadiene [*] Cyklopentadien [*] Cyclohexane (flat) [*] Cykloheksan (pÅ‚aski) Cyclohexane (boat) Cykloheksan (łódka) Cyclohexane (chair) Cykloheksan (krzesÅ‚o) [*] Benzene [*] Benzen Pyrimidine Pirymidyna [*] Cycloheptane [*] Cykloheptan [*] Cyclooctane [*] Cyklooktan Indole Indol Purine Puryna Naphthalene Naftalen Biphenyl Bifenyl Anthracene Antracen Steroid (fused ring template) Steroid (szkielet skumulowanych pierÅ›cieni) Rings PierÅ›cienie Alanine Alanina Arginine Arginina Asparagine Asparagina Aspartic acid Kwas asparaginowy Cysteine Cysteina Glutamic acid Kwas glutaminowy Glutamine Glutamina Glycine Glicyna Histidine Histydyna Isoleucine Izoleucyna Leucine Leucyna Lysine Lizyna Methionine Metionina Nitrophenylalanine Nitrofenyloalanina Phenylalanine Fenyloalanina Proline Prolina Serine Seryna Statine Statyna Threonine Treonina Tryptophan Tryptofan Tyrosine Tyrozyna Valine Walina Amino acids Aminokwasy Adenine Adenina Cytosine Cytozyna Guanine Guanina Thymine Tymina Uracil Uracyl Nucleic acids Kwasy nukleinowe Ribose Ryboza Deoxyribose Deoksyryboza D-fructose D-Fruktoza D-glucose D-Glukoza Sugars Cukry [*] FMOC [*] FMOC [*] BOC [*] BOC [*] DABCYL [*] DABCYL [*] DABSYL [*] DABSYL [*] DANSYL [*] DANSYL [*] EDANS [*] EDANS Useful groups Użyteczne grupy User-defined Grupy użytkownika --Select a filter-- (*) --Wybierz filtr-- (*) Could not determine file type Nie można rozpoznać typu pliku Please select a file type from the list. Wybierz typ pliku z listy. Problem while opening the file Błąd podczas otwierania pliku Cannot open the specified file. Nie można otworzyć podanego pliku. Automatically Add &hydrogens Automatyczne dodanie &wodorów Test tool NarzÄ™dzie testowe Open file... Otwórz plik... XDC - XDrawChem native format (*) XDC - format XDrawChem (*) IOIface Data error Błąd danych We/Wy Cannot convert the molecule. Conversion failed in ioiface.cpp Nie moża przekonwertować pliku. Konwersja nie powiodaÅ‚a siÄ™ w ioiface.cpp Problem while writing the file Błąd podczas zapisywania pliku Cannot write the specified file. Nie można zapisać podanego pliku. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Anuluj Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow Przerywana BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Kwadratowy Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Color Kolor Arrow editor Edytor strzaÅ‚ek Style: Rodzaj: Plain arrow WzykÅ‚a Dashed arrow Przerywana Two-way arrow Dwustronna Split two-way arrow Podwójna dwustronna Retrosynthetic arrow Retrosynteza Bond editor Edytor wiÄ…zaÅ„ Bond order: RzÄ…d wiÄ…zania: Dashed line Przerywane Single Pojedyncze Stereo-up Klik wypeÅ‚niony Stereo-down Klin przerywany Single/double (aromatic) Arotmatyczne Double Podwójne Double/triple Podwójne/potrójne Triple Potrójne Bracket editor Edytor nawiasów Square bracket Kwadratowy Parentheses ZaokrÄ…glony Curly bracket ZawiniÄ™ty nawias Curved Arrow editor Edytor zakrzywionych strzaÅ‚ek 90 degree clockwise 90 stopni zgodnie z zegarem 180 degree clockwise 180 stopni zgodnie z zegarem 270 degree clockwise 270 stopni zgodnie z zegarem 90 degree counterclockwise 90 stopni przeciwnie do zegara 180 degree counterclockwise 180 stopni przeciwnie do zegara 270 degree counterclockwise 270 stopni przeciwnie do zegara Symbol editor Edytor symboli Positive charge Åadunek dodatni Negative charge Åadunek ujemny Partial positive charge Częściowy Å‚adunek dodatni Partial negative charge Częściowy Å‚adunek ujemny Single electron Pojedynczy elektron Electron pair Para elektronowa OK OK Cancel Anuluj Stereochemical ring hydrogen Wodór w pierÅ›cieniu stereochemicznym p orbital Orbital p Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel Anuluj ChemData SMILES string ÅaÅ„cuch SMILES SMILES string for selected molecule: ÅaÅ„cuch SMILES dla zaznaczonej czÄ…steczki: Missing reactant or product Brak substratu lub produktu You must select at least one reactant and one product. Należy wybrać co najmniej jeden substrat i jeden produkt. Estimated gas-phase enthalpy change: Szacowana zmiania entalpii fazy gazowej: Reactants = %1 kJ/mol Substraty = %1 kJ/mol Products = %1 kJ/mol Produkty = %1 kJ/mol Reaction = %1 kJ/mol Reakcja = %1 kJ/mol Enthalpy change Zmania entalpii 13C NMR compare error Błąd porównania 13C NMR Please select only one reactant and one product to compare. ProszÄ™ wybrać tylko jeden substrat i jeden produkt dla porównania. 1H NMR compare error Błąd porównania 1H NMR Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list Dodaj nowy pierÅ›cieÅ„ do listy menu OK OK Cancel Anuluj CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Default DomyÅ›lne Set fixed angle and length Ustawienie dÅ‚ugoÅ›ci wiÄ…zaÅ„ i kontów OK OK Cancel Anuluj Bond fixed length: DÅ‚ugość wiÄ…zania: Bond fixed angle: KÄ…t miÄ™dzy wiÄ…zaniami: Arrow fixed length: DÅ‚ugość strzaÅ‚ki: Arrow fixed angle: KÄ…t miÄ™dzy strzaÅ‚kami: Double bond spacing: Rozstaw wiÄ…zania podwójnego: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Drukuj Close Zamknij Export Peak List Eksportuj listÄ™ pików Help Pomoc GraphWidget Red is reactant Blue is product HTTP Accessing network Åaczenie z sieciÄ… Please wait. ProszÄ™ czekać. HelpWindow &Print &Drukuj &Close Z&amknij &Backward &Cofnij &Forward Przyw&róć &Home &Home &About ... &O programie XDrawChem ... &File &Plik &Go &Idź &Help Pomo&c Backward Cofnij Forward Przywróć Home Home MolInfoDialog Formula = Wzór = Molecule Info Charakterystyka czÄ…steczki Molecular weight = Masa czÄ…steczkowa = Analysis = SkÅ‚ad procentowy = OK OK Cancel Anuluj Help Pomoc CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Substrat Product Produkt Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent Przezroczysty NetChooseDialog Select Wybierz Cancel Anuluj Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet Znajdź strukturÄ™ przez internet XDC database server: Serwer bazy danych XDC: Search type: Typ przeszukiwania: CAS Number Numer CAS Formula Wzór Chemical name Nazwa chemiczna Look for: Szukaj zwiÄ…zku: Exact matches only Tylko dokÅ‚adne dopasowania Search Szukaj Cancel Anuluj PageSetupDialog Page setup Ustawienia strony Paper size: Rozmiar papieru: Letter (8.5" x 11") Letter (8.5" x 11") Legal (8.5" x 14") Legal (8.5" x 14") A4 (210 mm x 297 mm) A4 (210 mm x 297 mm) 640x480 pixels 640x480 pikseli 800x600 pixels 640x480 pikseli 1024x768 pixels 1024x768 pikseli Orientation: Orientacja: Portrait Portret Landscape Pejzaż OK OK Cancel Anuluj Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Konstruktor peptydów Enter peptide sequence - three-letter abbreviations: Wprowadź sekwencjÄ™ peptydu - skróty trójliterowe: Shortcut: Hold 'Alt' and type one-letter codes! Skrót: Przytrzymaj 'Alt' i wprowadź kody jednoliterowe! OK OK Cancel Anuluj Render2D Select mode: left click on object to move, right click on object to edit Tryb zaznaczania: naciÅ›nij lewy przycisk, aby przesunąć obiekt lub prawy, aby obiekt edytować Draw Line mode: left click to draw line, right click to edit Tryb rysowania wiÄ…zaÅ„: naciÅ›nij lewy przycisk, aby narysować wiÄ…zanie lub prawy, aby je edytować Draw Dashed Line mode: left click to draw line, right click to edit Tryb rysowania wiÄ…zaÅ„ przerywanych: naciÅ›nij lewy przycisk, aby narysować wiÄ…zanie lub prawy, aby je edytować Draw Stereo-Up Line mode: left click to draw line, right click to edit Tryb rysowania klina wypeÅ‚nionego: naciÅ›nij lewy przycisk, aby narysować klin lub prawy, aby go edytować Draw Stereo-Down Line mode: left click to draw line, right click to edit Tryb rysowania klina przerywanego: naciÅ›nij lewy przycisk, aby narysować klin lub prawy, aby go edytować Draw Arrow mode: left click to draw arrow Tryb rysowania strzaÅ‚ek: naciÅ›nij lewy przycisk, aby narysować strzaÅ‚kÄ™ lub prawy, aby jÄ… edytować Draw Bracket mode: left click to draw bracket Tryb rysowania nawiasów: naciÅ›nij lewy przycisk, aby narysować nawias Erase mode: left click to erase object Tryb gumowania: naciÅ›nij lewy przycisk, aby wygumować objekt Text mode: left click to add or edit text Tryb dodawania tekstu: naciÅ›nij lewy przycisk, aby dodać lub edytować tekst Draw Symbol mode: left click to add symbol Tryb dodawania symboli: naciÅ›nij lewy przycisk, aby dodać symbol Click on a molecule to calculate its molecular weight Kliknij czÄ…steczkÄ™, aby obliczyć jej masÄ™ czÄ…steczkowÄ… Click on a molecule to calculate its empirical formula Kliknij czÄ…steczkÄ™, aby obliczyć jej wzór empiryczny Click on a molecule to calculate its elemental analysis Kliknij czÄ…steczkÄ™, aby obliczyć jej skÅ‚ad pierwiastkowy Click on a molecule to calculate its 13C NMR Kliknij czÄ…steczkÄ™, aby wygenerować jej widmo 13C NMR Click on a molecule to calculate its 1H NMR Kliknij czÄ…steczkÄ™, aby wygenerować jej widmo 1H NMR Click on a molecule to calculate its IR Kliknij czÄ…steczkÄ™, aby wygenerować jej widmo IR Click on a molecule to determine its IUPAC name Kliknij czÄ…steczkÄ™, aby wygenerować jej nazwÄ™ IUPAC Click on a molecule to determine its SMILES string Kliknij czÄ…steczkÄ™, aby wygenerować jej Å‚aÅ„cuch SMILES Click on a molecule to clean up its structure Kliknij czÄ…steczkÄ™, aby jÄ… wyrównać Select mode: left click to move, right click to edit Tryb zaznaczania: naciÅ›nij lewy przycisk, aby przesunąć obiekt lub prawy, aby obiekt edytować Undo! Cofnij! Cannot undo, sorry! Nie można cofnąć! Draw Ring mode: left click to add %1 Tryb rysowania pierÅ›cieni: naciÅ›nij lewy przycisk, aby dodać %1 , click to paste into drawing , naciÅ›niej, aby wkleić do rysunku Click on a molecule for information Kliknij czÄ…steczkÄ™, aby uzyskać jej charakterystykÄ™ Click on a molecule to assign it as a reactant Kliknij czÄ…steczkÄ™, aby oznaczyć jÄ… jako substrat Click on a molecule to assign it as a product Kliknij czÄ…steczkÄ™, aby oznaczyć jÄ… jako produkt Click on a molecule to clear it group assignment Kliknij czÄ…steczkÄ™, aby wykasować jej przypisanie do grupy Click on a molecule to save it as a custom ring Kliknij czÄ…steczkÄ™, aby zapisać jÄ… jako nowy pierÅ›cieÅ„ Select mode: left click on object to move Tryb zaznaczania: kliknij obiekt, który chcesz przesunąć Tool test mode Tryb narzÄ™dzia testowego Enter subscript Wprowadź indeks dolny Please type or edit the subscript for this bracket: Wprowadź lub edytuj indeks dolny dla bieżącego nawiasu: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Wytnij Copy Kopiuj Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool NarzÄ™dzie rysowania pierÅ›cieni Choose a structure from list: Wybierz fragment z listy: Cancel Anuluj SmilesDialog Enter SMILES string Wprowadź Å‚aÅ„cuch SMILES OK OK Cancel Anuluj Enter SMILES string: Wprowadź Å‚aÅ„cuch SMILES: Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK OK Cancel Anuluj Tool_13CNMR_Dialog 13C NMR spectrum Widmo 13C NMR Help Pomoc Close Zamknij , intensity , intensywność Peaks of reactant: SygnaÅ‚y substratu: Peaks of product: SygnaÅ‚y produktu: Tool_1HNMR_Dialog 1H NMR spectrum Widmo 1H NMR Help Pomoc Close Zamknij Peaks of reactant: SygnaÅ‚y substratu: Peaks of product: SygnaÅ‚y produktu: Tool_IR_Dialog IR spectrum Widmo IR Help Pomoc Close Zamknij Peaks of reactant: SygnaÅ‚y substratu: Peaks of product: SygnaÅ‚y produktu: XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_pt.ts000066400000000000000000002520441371466245600213620ustar00rootroot00000000000000 @default untitled ApplicationWindow Click this button to open a file.<br><br>You can also select the Open command from the File menu. Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Save file Print file Cut Copy Paste Set line thickness Set Line Thickness Set font Set Font Set font size Set Font Size Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Select Erase Draw dashed line Draw stereo-up line Draw stereo-down line Draw or edit text &File &New &Open &Find on Internet &Save Save &as... Save picture... Pa&ge setup &Print Close Quit Rotate 90 degrees clockwise Rotate 180 degrees Rotate 90 degrees counterclockwise Flip &horizontal Flip &vertical &Edit &Undo Cu&t &Copy &Paste Clear Select &All &Rotate &Flip Forma&t T&ools Clean up molecule Auto &layout Predict 13C NMR Predict IR Output SMILES &Help &Manual What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! Database query failed No molecules in the database match the query. &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair OK Cancel Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length OK Cancel Default Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Close &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Cancel Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Cancel Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet XDC database server: Search type: CAS Number Formula Chemical name Look for: Exact matches only Search Cancel PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Choose a structure from list: Cancel SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XRuler px in cm xdrawchem-v1.11.0/translation/xdrawchem_pt_BR.ts000066400000000000000000002520441371466245600217450ustar00rootroot00000000000000 @default untitled ApplicationWindow Click this button to open a file.<br><br>You can also select the Open command from the File menu. Click this button to save the file you are editing.<br><br>You can also select the Save command from the File menu.<br><br> Click this button to print the file you are editing.<br><br>You can also select the Print command from the File menu. Click this button to cut a selection.<br><br>You can also select the Cut command from the Edit menu, or press Ctrl+X. Click this button to copy a selection.<br><br>You can also select the Copy command from the Edit menu, or press Ctrl+C. Click this button to paste a selection.<br><br>You can also select the Paste command from the Edit menu, or press Ctrl+V. Erase tool<br><br>Use the Erase tool to erase individual items. Line tool<br><br>Use the Line tool to draw bonds. Draw over existing bonds to create double and triple bonds. Dashed Line tool<br><br>Use the Dashed Line tool to draw dashed lines. Draw over existing bonds to add dashed lines (to indicate resonance, etc.). Stereo Up Line tool<br><br>Use the Line tool to draw stereo-up lines, as shown on the button. Stereo Down Line tool<br><br>Use the Line tool to draw stereo-down lines, as shown on the button. Arrow tool<br><br>Use the Arrow tool to draw straight arrows.<br><br>Click to draw a straight arrow.<br><br>Click and hold to pick from a list of available arrows. Curved Arrow tool<br><br>Use the Curved Arrow tool to insert curved arrows.<br><br>Click and hold to select from a picture menu of arrows. Bracket tool<br><br>Use the Bracket tool to draw brackets and parentheses.<br><br>Click to draw square brackets.<br><br>Click and hold to select from a picture menu of brackets. Text tool<br><br>Use the Text tool to add text and label atoms and points.<br>(See manual for info on formatting text) Ring tool<br><br>Use the Ring tool to insert ready-made rings and structures.<br><br>Click to open the ring dialog, which allows selection from a list of all built-in rings and structures.<br><br>Click and hold to select from a picture menu of select rings.<br>(See manual for more info on modifying this menu) Symbol tool<br><br>Use the Symbol tool to insert symbols.<br><br>Click and hold to select from a picture menu of symbols.<br> File Operations Open file Save file Print file Cut Copy Paste Set line thickness Set Line Thickness Set font Set Font Set font size Set Font Size Make selected text <b>bold</b> <i>Italicize</i> selected text Underline selected text Superscript selected text Subscript selected text Select Erase Draw dashed line Draw stereo-up line Draw stereo-down line Draw or edit text &File &New &Open &Find on Internet &Save Save &as... Save picture... Pa&ge setup &Print Close Quit Rotate 90 degrees clockwise Rotate 180 degrees Rotate 90 degrees counterclockwise Flip &horizontal Flip &vertical &Edit &Undo Cu&t &Copy &Paste Clear Select &All &Rotate &Flip Forma&t T&ools Clean up molecule Auto &layout Predict 13C NMR Predict IR Output SMILES &Help &Manual What's &This Couldn't open file Could not open the file: Unable to load Loaded document Could not write to Saved file Save file as... Save as picture... Saved picture file Unable to save picture! Database query failed No molecules in the database match the query. &Bond - Fixed length and angle &Arrow - Fixed length and angle Set background &color &Drawing settings... &Group Select &Reactant Select &Product Clear &group Clear all &groups Molecule information... Estimate gas-phase enthalphy change Compare 13C NMR Reaction &About &Support &References How to get help Compare 1H NMR Create custom ring [*] Cyclopropane [*] Cyclobutane [*] Cyclopentane Imidazole [*] Cyclopentadiene [*] Cyclohexane (flat) Cyclohexane (boat) Cyclohexane (chair) [*] Benzene Pyrimidine [*] Cycloheptane [*] Cyclooctane Indole Purine Naphthalene Biphenyl Anthracene Steroid (fused ring template) Rings Alanine Arginine Asparagine Aspartic acid Cysteine Glutamic acid Glutamine Glycine Histidine Isoleucine Leucine Lysine Methionine Nitrophenylalanine Phenylalanine Proline Serine Statine Threonine Tryptophan Tyrosine Valine Amino acids Adenine Cytosine Guanine Thymine Uracil Nucleic acids Ribose Deoxyribose D-fructose D-glucose Sugars [*] FMOC [*] BOC [*] DABCYL [*] DABSYL [*] DANSYL [*] EDANS Useful groups User-defined --Select a filter-- (*) Could not determine file type Please select a file type from the list. Problem while opening the file Cannot open the specified file. Open file... XDC - XDrawChem native format (*) IOIface Data error Cannot convert the molecule. Conversion failed in ioiface.cpp Problem while writing the file Cannot write the specified file. Click this button to zoom in. Click this button to zoom out. Select tool<br><br>Use the Select tool to select and move items inside a box.<br><br>You can select multiple items and cut, copy, move and rotate them. Lasso tool<br><br>Use the Lasso tool to select and move items by drawing a loop around them.<br><br>You can select multiple items and cut, copy, move and rotate them. Chain tool<br><br>Use the Chain tool to draw aliphatic chains. The length of each segment is the current bond length. Wavy Line tool<br><br>Use the Wavy Line tool to draw wavy lines, as shown on the button. Zoom In Zoom Out Left-justify selected text Center selected text Right-justify selected text Lasso Draw Line Draw aliphatic chain Draw wavy bond Send to &external program... Insert s&ymbol &Deselect All &Zoom Normal (100%) Zoom out Zoom in Toggle &grid &XDC settings... Predict 1H NMR Predict pKa Predict octanol-water partition (Kow) Reverse reactions Get bond identifier Input InChI or SMILES Output InChI Build 3D model of molecule &Did You Know? Send to external program This function will open a 3-D version of one molecule in an external modelling program. Send to program: Ghemical KryoMol Cancel Send to external program failed Could not save file for external program. Could not execute the external program. Please verify that it is installed correctly. Plus sign Minus sign Delta plus Delta minus 1e symbol 2e symbol 2e line Ring up Orbital Double orbital Bead Antibody Newman projection symbol Newman projection - staggered (anti) Newman projection - eclipsed Regular Arrow Top harpoon Bottom harpoon Middle Did not work Dashed arrow BI1 arrow BI2 arrow Retro arrow 90° cw 90° ccw 180° cw 180° ccw 270° cw 270° ccw Cubic bezier Cubic bezier - half arrow Cubic bezier - full arrow Square bracket Curve bracket Brace bracket Box bracket Ellipse bracket Closed square bracket Circle bracket Bryan Herger bherger@users.sourceforge.net Please subscribe to the mailing list for information about future releases. Send a message to xdrawchem-announce-request@lists.sourceforge.net with 'subscribe' as the subject. XDrawChem is copyright (C) 2004 Bryan Herger. Portions copyright (C) 1997-2000 Dr. Christoph Steinbeck and the JChemPaint project OpenBabel code copyright (C) 2003 by the OpenBabel project team. See file COPYRIGHT.txt for more details Current information on XDrawChem can always be found at http://xdrawchem.sourceforge.net/ The latest release will be posted here, as well as links to mailing lists and the bug tracker. Please submit bugs using the SourceForge tracker: http://www.sourceforge.net/tracker/?group_id=34518 There are two mailing lists: xdrawchem-announce, where new releases will be announced, and xdrawchem-user, for open discussion among XDrawChem users. Subscribe by sending a blank e-mail with subject "subscribe" to "xdrawchem-announce-request@lists.sourceforge.net" or "xdrawchem-user-request@lists.sourceforge.net" You can contact the author directly at bherger@users.sourceforge.net Zoom = %1 % XDC Settings Change XDrawChem settings: &Main font &Ruler font CDXML - ChemDraw text/XML format (*) CDX - ChemDraw binary format (*) Overwrite file? Overwrite existing file: %1 ? [*] Biotin Add new... Save before closing? The document has been changed since the last save. BondEditDialog Arrow editor Style: Plain arrow Dashed arrow Two-way arrow Split two-way arrow Retrosynthetic arrow Bond editor Bond order: Dashed line Single Stereo-up Stereo-down Single/double (aromatic) Double Double/triple Triple Bracket editor Square bracket Parentheses Curly bracket Curved Arrow editor 90 degree clockwise 180 degree clockwise 270 degree clockwise 90 degree counterclockwise 180 degree counterclockwise 270 degree counterclockwise Symbol editor Positive charge Negative charge Partial positive charge Partial negative charge Single electron Electron pair OK Cancel Stereochemical ring hydrogen p orbital Preview: Color: NR arrow Arrow thickness: Wavy Bond thickness: Double bond alignment: Auto Left Center Right Box Ellipse p double bead CharSelDialog Insert symbol Font: Cancel ChemData SMILES string SMILES string for selected molecule: Missing reactant or product You must select at least one reactant and one product. Estimated gas-phase enthalpy change: Reactants = %1 kJ/mol Products = %1 kJ/mol Reaction = %1 kJ/mol Enthalpy change 13C NMR compare error Please select only one reactant and one product to compare. 1H NMR compare error Octanol-water partition Estimated octanol-water partition constant (log Kow) = %1 InChI string InChI string for selected molecule: CustomRingDialog Add custom ring to menu list OK Cancel CustomRingWidget Title: DYKDialog Did You Know? Don't show this dialog at startup Previous tip Next tip OK XDrawChem can be run from the command line to produce images. Type "xdrawchem --help" for details. When in select mode, you can edit most objects by right-clicking on them. When drawing bonds, you can edit the bond style by right-clicking on the bond. When in select mode, press Shift+LeftButton and drag over part of a molecule to select the entire molecule. When in select mode, press Ctrl+LeftButton on a molecule to get molecule information. Bond length, bond angle, and units are set in the Drawing Settings option under the Format menu. You can attach a subscript to a bracket by selecting the text tool, then clicking on the bracket. You can toggle the grid display by pressing Ctrl+G. Turning the grid on or off does not affect whether objects snap to the grid. A number of ring and molecule templates are available from the ring tool, including single and fused rings, amino acids, and nucleosides. Remember to select a file type when opening or saving documents. The option "Clean up molecule" under the Tools menu can be used to refine structures such as rings and macromolecules. It's possible to attach rings to structures by selecting a ring and clicking on an atom. XDrawChem can automatically attach amino acids from N-terminal to C-terminal (but the result isn't always pretty :) Be sure to check for updates at http://xdrawchem.sourceforge.net/ XDrawChem can draw over 100,000 substances using its Internet database. Select Find on internet from the File menu to search for compounds. XDrawChem can identify compounds by CAS number and occasionally by name. Select Molecule information from the Tools menu and click on a molecule. However, this only works if the compound is listed in the database. FixedDialog Set fixed angle and length OK Cancel Default Bond fixed length: Bond fixed angle: Arrow fixed length: Arrow fixed angle: Double bond spacing: Units: pixels degrees Do not show grid Show square grid Show hex grid Snap to grid Grid spacing: inches cm GraphDialog Print Close Export Peak List Help GraphWidget Red is reactant Blue is product HelpWindow &Print &Close &Backward &Forward &Home &About ... &File &Go &Help MolInfoDialog Formula = Molecule Info Molecular weight = OK Cancel Help CAS: PubChem compound: Name: Other names: Name: Other names: CAS: PubChem compound: Analysis Search PubChem Molecule Reactant Product Predicted 1H-NMR Intensity: Multiplicity: Predicted 13C-NMR Predicted IR ~1350-1000, C-N ~1300-1000, C-O ~1660-1600, C=C (cis/vinyl strong; trans weak) ~1690-1640, C=N ~1700 (narrow), C=O ~1350-1300, S=O (~1050 if R-(S=O)-R') ~2250 (narrow), nitrile ~3000 (broad), C-H two peaks: ~3400, ~3300, primary N-H ~3300 (broad), secondary N-H ~2550 (broad), S-H ~3400 (broad), O-H ~2270 (narrow), -N=C=O ~2125 (narrow), -N=C=S ~1525 (narrow), -NO2 ~1600 (narrow), aromatic ring C=C ~1475 (narrow), aromatic ring C=C 10.5 (Guanidine) 9 (a-carbon between two ketones) 11 (a-carbon between two ketones) 11 (a-carbon between ketone and ester) 13 (a-carbon between two esters) 5 (Aromatic primary amine) 9-10 (Alkene-primary amine) 11 (Aliphatic primary amine) -4 (pyrrole) 14.4 (secondary amine) 11 (aliphatic secondary amine) 6.8 (conjugated secondary amine) 5 (aromatic secondary amine) 1-3 (purine/pyrimidine) 4 (tertiary amine) 10 (aliphatic tertiary amine) 8 (Peroxy acid) -1 (sulfonic acid) 4 (Aromatic carboxylic acid) 4.5 (Aliphatic carboxylic acid) 3 (Aliphatic carboxylic acid, a-halide) 1.3 (Aliphatic carboxylic acid, 2 a-halide) 10 (Aromatic -OH) 16 (Aliphatic -OH) 7.8 (Aromatic -SH) 10.6 (Aliphatic -SH) Estimated pKa's: There seem to be no sites with pKa between -1 and 15. Estimated pKa's Elemental analysis: No reactions found The following reactions could have resulted in this product: Target bonds will be highlighted in green. To see reactions affecting a highlighted bond, right-click on the bond and select Info. To clear highlights, select Undo from the Edit menu, or press Ctrl+Z. Reverse reactions list No reactions in the database could yield the selected molecule. Save 3D file as... MDL molfile (*.mol) MyFileDialog Transparent NetChooseDialog Select Cancel Choose Structure Select a molecule from list and click OK: NetDialog Find structure via Internet XDC database server: Search type: CAS Number Formula Chemical name Look for: Exact matches only Search Cancel PageSetupDialog Page setup Paper size: Letter (8.5" x 11") Legal (8.5" x 14") A4 (210 mm x 297 mm) 640x480 pixels 800x600 pixels 1024x768 pixels Orientation: Portrait Landscape OK Cancel Custom paper size pixels inches cm Page width: Page height: PeptDialog Peptide Builder Enter peptide sequence - three-letter abbreviations: Shortcut: Hold 'Alt' and type one-letter codes! OK Cancel Render2D Select mode: left click on object to move, right click on object to edit Draw Line mode: left click to draw line, right click to edit Draw Dashed Line mode: left click to draw line, right click to edit Draw Stereo-Up Line mode: left click to draw line, right click to edit Draw Stereo-Down Line mode: left click to draw line, right click to edit Draw Arrow mode: left click to draw arrow Draw Bracket mode: left click to draw bracket Erase mode: left click to erase object Text mode: left click to add or edit text Draw Symbol mode: left click to add symbol Click on a molecule to calculate its molecular weight Click on a molecule to calculate its empirical formula Click on a molecule to calculate its elemental analysis Click on a molecule to calculate its 13C NMR Click on a molecule to calculate its 1H NMR Click on a molecule to calculate its IR Click on a molecule to determine its SMILES string Click on a molecule to clean up its structure Select mode: left click to move, right click to edit Undo! Cannot undo, sorry! Draw Ring mode: left click to add %1 , click to paste into drawing Click on a molecule for information Click on a molecule to assign it as a reactant Click on a molecule to assign it as a product Click on a molecule to clear it group assignment Click on a molecule to save it as a custom ring Select mode: left click on object to move Tool test mode Enter subscript Please type or edit the subscript for this bracket: Lasso mode: left click and hold to draw lasso Draw Chain mode: left click and drag to draw aliphatic chain Draw Wavy Line mode: left click to draw line, right click to edit Draw graphic object: cubic bezier Left-click to draw Newman projection template Click on a molecule to calculate its pKa(s) Click on a molecule for possible retrosynthesis Click on a molecule to display its bond identifier Click on a molecule to calculate its octanol-water partition Click on a molecule to generate 3-D coordinates Click on a molecule to guess its name Click on a molecule No information. Object information Object Arrow Bond Bracket Curved Arrow Symbol Text Edit Info Fill color... No fill Shape... Molecule Select Cut Copy Select mode: left click on objects to move Draw Line - Length = , Angle = Draw aliphatic chain - Length = bonds RingDialog Ring tool Choose a structure from list: Cancel SmilesDialog OK Cancel Enter InChI or SMILES string Enter InChI or SMILES string: TextShapeDialog Edit text shape No shape Ellipse Rectangle Circle Square Border Border color Fill Fill color Width: Height: OK Cancel Tool_13CNMR_Dialog 13C NMR spectrum Help Close , intensity Peaks of reactant: Peaks of product: Tool_1HNMR_Dialog 1H NMR spectrum Help Close Peaks of reactant: Peaks of product: Tool_IR_Dialog IR spectrum Help Close Peaks of reactant: Peaks of product: XRuler px in cm xdrawchem-v1.11.0/xdrawchem.pro000066400000000000000000000161101371466245600164630ustar00rootroot00000000000000TEMPLATE = app TARGET = xdrawchem # edit to match your OB install exists(/usr/include/openbabel3/openbabel/mol.h) { INCLUDEPATH += /usr/include/openbabel3 LIBS += -lopenbabel } exists(/usr/local/include/openbabel-3.0/openbabel/mol.h) { INCLUDEPATH += /usr/local/include/openbabel-3.0 LIBS += -lopenbabel } exists(/Developer/openbabel-3.0/include/openbabel/mol.h) { INCLUDEPATH += /Developer/openbabel-3.0/include LIBS += -L/Developer/openbabel-3.0/lib/Debug -lopenbabel } # exit if openbabel wasn't found contains( LIBS, -lopenbabel ) { } else { error(OpenBabel was not found. Edit xdrawchem.pro and add valid include and lib values) # if you get this error, comment the above with #, uncomment the variables below, and set # the paths to match your OpenBabel install #INCLUDEPATH += /usr/local/include/openbabel-3.0 #LIBS += -lopenbabel } # set PREFIX if not set (it is set when building RPM) isEmpty(PREFIX) { PREFIX = /usr/local } DESTDIR = bin target.path = $${PREFIX}/$${DESTDIR} INSTALLS = target MOC_DIR = .moc UI_DIR = .ui OBJECTS_DIR = .obj # for includes and libs DEFINES += UNIX DEFINES += RINGHOME=\\\"$${PREFIX}/share/xdrawchem\\\" DEFINES += XDC_SERVER=\\\"https://www.woodsidelabs.com/chemistry/newdb.php\\\" ringdir.path = $${PREFIX}/share/xdrawchem ringdir.files = ring/* doc.path = $${PREFIX}/share/xdrawchem/doc doc.files = doc/* INSTALLS += ringdir doc QMAKE_CXXFLAGS_DEBUG += -O0 -g3 CONFIG += debug QT += xml svg network core widgets printsupport network gui RESOURCES = resources.qrc rings.qrc HEADERS = xdrawchem/aa_xpm.h \ xdrawchem/application.h \ xdrawchem/arrow.h \ xdrawchem/arrows.h \ xdrawchem/atom.h \ xdrawchem/biotools.h \ xdrawchem/bondedit.h \ xdrawchem/bond.h \ xdrawchem/boshcp.h \ xdrawchem/bracket.h \ xdrawchem/brackets.h \ xdrawchem/CDXConstants.h \ xdrawchem/cdxml_reader.h \ xdrawchem/charsel.h \ xdrawchem/chemdata.h \ xdrawchem/colorbutton.h \ xdrawchem/clipboard.h \ xdrawchem/cml.h \ xdrawchem/crings_dialog.h \ xdrawchem/cubicbezier.h \ xdrawchem/curvearrow.h \ xdrawchem/defs.h \ xdrawchem/dpoint.h \ xdrawchem/drawable.h \ xdrawchem/dyk.h \ xdrawchem/fixeddialog.h \ xdrawchem/gobject.h \ xdrawchem/graphdata.h \ xdrawchem/graphdialog.h \ xdrawchem/graphwidget.h \ xdrawchem/helpwindow.h \ xdrawchem/http.h \ xdrawchem/ioiface.h \ xdrawchem/moldata.h \ xdrawchem/molecule.h \ xdrawchem/molecule_sssr.h \ xdrawchem/molinfodialog.h \ xdrawchem/myfiledialog.h \ xdrawchem/na_xpm.h \ xdrawchem/netaccess.h \ xdrawchem/netchoosedialog.h \ xdrawchem/netdialog.h \ xdrawchem/ngw.h \ xdrawchem/pagesetupdialog.h \ xdrawchem/paintable.h \ xdrawchem/peak.h \ xdrawchem/peptidebuilder.h \ xdrawchem/prefs.h \ xdrawchem/previewwidget.h \ xdrawchem/render2d.h \ xdrawchem/renderarea.h \ xdrawchem/ringdialog.h \ xdrawchem/ring.h \ xdrawchem/ring_xpm.h \ xdrawchem/sdg.h \ xdrawchem/setofrings.h \ xdrawchem/smilesdialog.h \ xdrawchem/sorf.h \ xdrawchem/sugar_xpm.h \ xdrawchem/symbol.h \ xdrawchem/symbol_xpm.h \ xdrawchem/text.h \ xdrawchem/textshapedialog.h \ xdrawchem/tool_13c_nmr.h \ xdrawchem/tool_1h_nmr.h \ xdrawchem/tool_2d3d.h \ xdrawchem/tooldialog.h \ xdrawchem/tool_ir.h \ xdrawchem/xdc_event.h \ xdrawchem/xdc_textedit.h \ xdrawchem/xdc_toolbutton.h \ xdrawchem/xml_cml.h \ xdrawchem/xml_reader.h \ xdrawchem/xruler.h SOURCES = xdrawchem/application.cpp \ xdrawchem/application_ob.cpp \ xdrawchem/application_ring.cpp \ xdrawchem/arrow.cpp \ xdrawchem/biotools.cpp \ xdrawchem/bond.cpp \ xdrawchem/bondedit.cpp \ xdrawchem/boshcp.cpp \ xdrawchem/bracket.cpp \ xdrawchem/cdx2cdxml.cpp \ xdrawchem/cdxml_reader.cpp \ xdrawchem/charsel.cpp \ xdrawchem/chemdata_cdx.cpp \ xdrawchem/chemdata_cdxml.cpp \ xdrawchem/chemdata_cml.cpp \ xdrawchem/chemdata.cpp \ xdrawchem/chemdata_edit.cpp \ xdrawchem/chemdata_event.cpp \ xdrawchem/chemdata_mdl.cpp \ xdrawchem/chemdata_rw.cpp \ xdrawchem/chemdata_rxn.cpp \ xdrawchem/chemdata_tools.cpp \ xdrawchem/chemdata_xdc.cpp \ xdrawchem/chemdata_xml.cpp \ xdrawchem/colorbutton.cpp \ xdrawchem/crings_dialog.cpp \ xdrawchem/curvearrow.cpp \ xdrawchem/drawable.cpp \ xdrawchem/dyk.cpp \ xdrawchem/fixeddialog.cpp \ xdrawchem/gobject.cpp \ xdrawchem/graphdialog.cpp \ xdrawchem/graphwidget.cpp \ xdrawchem/helpwindow.cpp \ xdrawchem/http.cpp \ xdrawchem/ioiface.cpp \ xdrawchem/main.cpp \ xdrawchem/molecule_1h_nmr.cpp \ xdrawchem/molecule.cpp \ xdrawchem/molecule_obmol.cpp \ xdrawchem/molecule_smiles.cpp \ xdrawchem/molecule_sssr.cpp \ xdrawchem/molecule_tools_1.cpp \ xdrawchem/molecule_tools_2.cpp \ xdrawchem/molinfodialog.cpp \ xdrawchem/myfiledialog.cpp \ xdrawchem/netaccess.cpp \ xdrawchem/netchoosedialog.cpp \ xdrawchem/netdialog.cpp \ xdrawchem/ngw.cpp \ xdrawchem/pagesetupdialog.cpp \ xdrawchem/peptidebuilder.cpp \ xdrawchem/previewwidget.cpp \ xdrawchem/render2d.cpp \ xdrawchem/render2d_draw.cpp \ xdrawchem/render2d_event.cpp \ xdrawchem/render2d_print.cpp \ xdrawchem/render2d_select.cpp \ xdrawchem/render2d_text.cpp \ xdrawchem/renderarea.cpp \ xdrawchem/retro.cpp \ xdrawchem/ringdialog.cpp \ xdrawchem/smilesdialog.cpp \ xdrawchem/symbol.cpp \ xdrawchem/text.cpp \ xdrawchem/textshapedialog.cpp \ xdrawchem/to3d.cpp \ xdrawchem/tool_13c_nmr.cpp \ xdrawchem/tool_1h_nmr.cpp \ xdrawchem/tool_2d3d.cpp \ xdrawchem/tooldialog.cpp \ xdrawchem/tool_ir.cpp \ xdrawchem/xdc_toolbutton.cpp \ xdrawchem/xml_cml.cpp \ xdrawchem/xml_reader.cpp \ xdrawchem/xruler.cpp TRANSLATIONS = translation/xdrawchem_da.ts \ translation/xdrawchem_dk.ts \ translation/xdrawchem_es.ts \ translation/xdrawchem_it.ts \ translation/xdrawchem_nl.ts \ translation/xdrawchem_pt_BR.ts \ translation/xdrawchem_de.ts \ translation/xdrawchem_en.ts \ translation/xdrawchem_fr.ts \ translation/xdrawchem_jp.ts \ translation/xdrawchem_pl.ts \ translation/xdrawchem_pt.ts xdrawchem-v1.11.0/xdrawchem/000077500000000000000000000000001371466245600157425ustar00rootroot00000000000000xdrawchem-v1.11.0/xdrawchem/CDXConstants.h000066400000000000000000001267111371466245600204360ustar00rootroot00000000000000/* $Workfile: CDXConstants.h $ $Revision: 1.1.1.1 $ $Date: 2004/01/24 17:15:47 $ Copyright: 1986-2001 CambridgeSoft Corp., all rights reserved. Description: Constants defined by the CDX file format Specification */ #ifndef _H_CDXConstants #define _H_CDXConstants #include "CDXBasicTypes.h" // An ANSI replacement for four-byte character constants. #ifdef _X86_ // littleEndian #define QUADCONST(a, b, c, d) \ (((long)((d)&0xff) << 24) | ((long)((c)&0xff) << 16) | \ ((long)((b)&0xff) << 8) | ((long)((a)&0xff))) #else // _X86_ #define QUADCONST(a, b, c, d) \ (((long)((a)&0xff) << 24) | ((long)((b)&0xff) << 16) | \ ((long)((c)&0xff) << 8) | ((long)((d)&0xff))) #endif // _X86_ typedef UINT16 CDXTag; typedef INT32 CDXObjectID; // signed for now, due to mac compiler bug? #define kCDX_HeaderString "VjCD0100" #define kCDX_Signature QUADCONST('V', 'j', 'C', 'D') #define kCDX_HeaderLength 28 #define kCDXML_HeaderString \ "\n" \ "\n" const UINT16 kCDXTag_Object = 0x8000; const UINT16 kCDXTag_UserDefined = 0x4000; enum CDXDatumID { // General properties. kCDXProp_EndObject, // 0x0000 Marks end of object. kCDXProp_CreationUserName, // 0x0001 The name of the creator (program user's // name) of the document. (CDXString) kCDXProp_CreationDate, // 0x0002 The time of object creation. (CDXDate) kCDXProp_CreationProgram, // 0x0003 The name of the program, including // version and platform, that created the // associated CDX object. ChemDraw 4.0 uses // ChemDraw 4.0 as the value of CreationProgram. // (CDXString) kCDXProp_ModificationUserName, // 0x0004 The name of the last modifier // (program user's name) of the document. // (CDXString) kCDXProp_ModificationDate, // 0x0005 Time of the last modification. // (CDXDate) kCDXProp_ModificationProgram, // 0x0006 The name of the program, including // version and platform, of the last program // to perform a modification. ChemDraw 4.0 // uses ChemDraw 4.0 as the value of // CreationProgram. (CDXString) kCDXProp_Unused1, // 0x0007 Table of contents. (obsolete) kCDXProp_Name, // 0x0008 Name of an object. (CDXString) kCDXProp_Comment, // 0x0009 An arbitrary string intended to be meaningful to // a user. (CDXString) kCDXProp_ZOrder, // 0x000A Back-to-front ordering index in 2D drawing. // (INT16) kCDXProp_RegistryNumber, // 0x000B A registry or catalog number of a // molecule object. (CDXString) kCDXProp_RegistryAuthority, // 0x000C A string that specifies the authority // which issued a registry or catalog number. // Some examples of registry authorities are // CAS, Beilstein, Aldrich, and Merck. // (CDXString) kCDXProp_Unused2, // 0x000D Indicates that this object (the reference // object) is an alias to an object elsewhere in the // document (the target object). The attributes and // contained objects should be taken from the target // object. (obsolete) kCDXProp_RepresentsProperty, // 0x000E Indicates that this object represents // some property in some other object. // (CDXRepresentsProperty) kCDXProp_IgnoreWarnings, // 0x000F Signifies whether chemical warnings // should be suppressed on this object. // (CDXBooleanImplied) kCDXProp_ChemicalWarning, // 0x0010 A warning concerning possible chemical // problems with this object. (CDXString) kCDXProp_Visible, // 0x0011 The object is visible if non-zero. (CDXBoolean) // Fonts. kCDXProp_FontTable = 0x0100, // 0x0100 A list of fonts used in the document. (CDXFontTable) // Coordinates. kCDXProp_2DPosition = 0x0200, // 0x0200 The 2D location (in the order of vertical and // horizontal locations) of an object. (CDXPoint2D) kCDXProp_3DPosition, // 0x0201 The 3D location (in the order of X-, Y-, and // Z-locations in right-handed coordinate system) of an // object in CDX coordinate units. The precise meaning // of this attribute varies depending on the type of // object. (CDXPoint3D) kCDXProp_2DExtent, // 0x0202 The width and height of an object in CDX // coordinate units. The precise meaning of this // attribute varies depending on the type of object. // (CDXPoint2D) kCDXProp_3DExtent, // 0x0203 The width, height, and depth of an object in // CDX coordinate units (right-handed coordinate system). // The precise meaning of this attribute varies depending // on the type of object. (CDXPoint3D) kCDXProp_BoundingBox, // 0x0204 The smallest rectangle that encloses the // graphical representation of the object. // (CDXRectangle) kCDXProp_RotationAngle, // 0x0205 The angular orientation of an object in // degrees * 65536. (INT32) // Colors. kCDXProp_ColorTable = 0x0300, // 0x0300 The color palette used throughout // the document. (CDXColorTable) kCDXProp_ForegroundColor, // 0x0301 The foreground color of an object // represented as the two-based index into the // object's color table. (UINT16) kCDXProp_BackgroundColor, // 0x0302 The background color of an object // represented as the two-based index into the // object's color table. (INT16) // Atom properties. kCDXProp_Node_Type = 0x0400, // 0x0400 The type of a node object. (INT16) kCDXProp_Node_LabelDisplay, // 0x0401 The characteristics of node label // display. (INT8) kCDXProp_Node_Element, // 0x0402 The atomic number of the atom representing // this node. (INT16) kCDXProp_Atom_ElementList, // 0x0403 A list of atomic numbers. // (CDXElementList) kCDXProp_Atom_Formula, // 0x0404 The composition of a node representing a // fragment whose composition is known, but whose // connectivity is not. For example, // C4H9 represents a mixture of // the 4 butyl isomers. (CDXFormula) kCDXProp_Atom_Isotope = 0x0420, // 0x0420 The absolute isotopic mass of an atom (2 for // deuterium, 14 for carbon-14). (INT16) kCDXProp_Atom_Charge, // 0x0421 The atomic charge of an atom. (INT8) kCDXProp_Atom_Radical, // 0x0422 The atomic radical attribute of an atom. // (UINT8) kCDXProp_Atom_RestrictFreeSites, // 0x0423 Indicates that up to the // specified number of additional // substituents are permitted on this atom. // (UINT8) kCDXProp_Atom_RestrictImplicitHydrogens, // 0x0424 Signifies that implicit // hydrogens are not allowed on // this atom. (CDXBooleanImplied) kCDXProp_Atom_RestrictRingBondCount, // 0x0425 The number of ring bonds // attached to an atom. (INT8) kCDXProp_Atom_RestrictUnsaturatedBonds, // 0x0426 Indicates whether // unsaturation should be present or // absent. (INT8) kCDXProp_Atom_RestrictRxnChange, // 0x0427 If present, signifies that the // reaction change of an atom must be as // specified. (CDXBooleanImplied) kCDXProp_Atom_RestrictRxnStereo, // 0x0428 The change of stereochemistry of // an atom during a reaction. (INT8) kCDXProp_Atom_AbnormalValence, // 0x0429 Signifies that an abnormal valence // for an atom is permitted. // (CDXBooleanImplied) kCDXProp_Unused3, // 0x042A kCDXProp_Atom_NumHydrogens, // 0x042B The number of (explicit) hydrogens in // a labeled atom consisting of one heavy atom // and (optionally) the symbol H (e.g., // CH3). (UINT16) kCDXProp_Unused4, // 0x042C kCDXProp_Unused5, // 0x042D kCDXProp_Atom_HDot, // 0x042E Signifies the presence of an implicit hydrogen // with stereochemistry specified equivalent to an // explicit H atom with a wedged bond. // (CDXBooleanImplied) kCDXProp_Atom_HDash, // 0x042F Signifies the presence of an implicit // hydrogen with stereochemistry specified equivalent // to an explicit H atom with a hashed bond. // (CDXBooleanImplied) kCDXProp_Atom_Geometry, // 0x0430 The geometry of the bonds about this atom. // (INT8) kCDXProp_Atom_BondOrdering, // 0x0431 An ordering of the bonds to this node, // used for stereocenters, fragments, and named // alternative groups with more than one // attachment. (CDXObjectIDArray) kCDXProp_Node_Attachments, // 0x0432 For multicenter attachment nodes or // variable attachment nodes, a list of IDs of // the nodes which are multiply or variably // attached to this node. // (CDXObjectIDArrayWithCounts) kCDXProp_Atom_GenericNickname, // 0x0433 The name of the generic nickname. // (CDXString) kCDXProp_Atom_AltGroupID, // 0x0434 The ID of the alternative group object // that describes this node. (CDXObjectID) kCDXProp_Atom_RestrictSubstituentsUpTo, // 0x0435 Indicates that // substitution is restricted to no // more than the specified value. // (UINT8) kCDXProp_Atom_RestrictSubstituentsExactly, // 0x0436 Indicates that exactly // the specified number of // substituents must be present. // (UINT8) kCDXProp_Atom_CIPStereochemistry, // 0x0437 The node's absolute // stereochemistry according to the // Cahn-Ingold-Prelog system. (INT8) kCDXProp_Atom_Translation, // 0x0438 Provides for restrictions on whether a // given node may match other more- or // less-general nodes. (INT8) kCDXProp_Atom_AtomNumber, // 0x0439 Atom number, as text. (CDXString) kCDXProp_Atom_ShowQuery, // 0x043A Show the query indicator if non-zero. // (CDXBoolean) kCDXProp_Atom_ShowStereo, // 0x043B Show the stereochemistry indicator if // non-zero. (CDXBoolean) kCDXProp_Atom_ShowAtomNumber, // 0x043C Show the atom number if non-zero. // (CDXBoolean) kCDXProp_Atom_LinkCountLow, // 0x043D Low end of repeat count for link // nodes. (INT16) kCDXProp_Atom_LinkCountHigh, // 0x043E High end of repeat count for link // nodes. (INT16) // Molecule properties. kCDXProp_Mole_Racemic = 0x0500, // 0x0500 Indicates that the molecule is a // racemic mixture. (CDXBoolean) kCDXProp_Mole_Absolute, // 0x0501 Indicates that the molecule has known // absolute configuration. (CDXBoolean) kCDXProp_Mole_Relative, // 0x0502 Indicates that the molecule has known // relative stereochemistry, but unknown absolute // configuration. (CDXBoolean) kCDXProp_Mole_Formula, // 0x0503 The molecular formula representation of a // molecule object. (CDXFormula) kCDXProp_Mole_Weight, // 0x0504 The average molecular weight of a molecule // object. (FLOAT64) kCDXProp_Frag_ConnectionOrder, // 0x0505 An ordered list of attachment // points within a fragment. // (CDXObjectIDArray) // Bond properties. kCDXProp_Bond_Order = 0x0600, // 0x0600 The order of a bond object. (INT16) kCDXProp_Bond_Display, // 0x0601 The display type of a bond object. (INT16) kCDXProp_Bond_Display2, // 0x0602 The display type for the second line of a // double bond. (INT16) kCDXProp_Bond_DoublePosition, // 0x0603 The position of the second line of a // double bond. (INT16) kCDXProp_Bond_Begin, // 0x0604 The ID of the CDX node object at the first // end of a bond. (CDXObjectID) kCDXProp_Bond_End, // 0x0605 The ID of the CDX node object at the second end // of a bond. (CDXObjectID) kCDXProp_Bond_RestrictTopology, // 0x0606 Indicates the desired topology of // a bond in a query. (INT8) kCDXProp_Bond_RestrictRxnParticipation, // 0x0607 Specifies that a bond is // affected by a reaction. (INT8) kCDXProp_Bond_BeginAttach, // 0x0608 Indicates where within the Bond_Begin // node a bond is attached. (UINT8) kCDXProp_Bond_EndAttach, // 0x0609 Indicates where within the Bond_End node // a bond is attached. (UINT8) kCDXProp_Bond_CIPStereochemistry, // 0x060A The bond's absolute // stereochemistry according to the // Cahn-Ingold-Prelog system. (INT8) kCDXProp_Bond_BondOrdering, // 0x060B Ordered list of attached bond IDs. // (CDXObjectIDArray) kCDXProp_Bond_ShowQuery, // 0x060C Show the query indicator if non-zero. // (CDXBoolean) kCDXProp_Bond_ShowStereo, // 0x060D Show the stereochemistry indicator if // non-zero. (CDXBoolean) // Text properties. kCDXProp_Text = 0x0700, // 0x0700 The text of a text object. (CDXString) kCDXProp_Justification, // 0x0701 The horizontal justification of a text // object. (INT8) kCDXProp_LineHeight, // 0x0702 The line height of a text object. (UINT16) kCDXProp_WordWrapWidth, // 0x0703 The word-wrap width of a text object. // (INT16) kCDXProp_LineStarts, // 0x0704 The number of lines of a text object followed // by that many values indicating the zero-based text // position of each line start. (INT16ListWithCounts) kCDXProp_LabelAlignment, // 0x0705 The alignment of the text with respect to // the node position. (INT8) kCDXProp_LabelLineHeight, // 0x0706 Text line height for atom labels (INT16) kCDXProp_CaptionLineHeight, // 0x0707 Text line height for non-atomlabel // text objects (INT16) // Document properties. kCDXProp_MacPrintInfo = 0x0800, // 0x0800 The 120 byte Macintosh TPrint data associated with the // CDX document object. Refer to Macintosh Toolbox manual for // detailed description. (Unformatted) kCDXProp_WinPrintInfo, // 0x0801 The Windows DEVMODE structure associated // with the CDX document object. (Unformatted) kCDXProp_PrintMargins, // 0x0802 The outer margins of the Document. // (CDXRectangle) kCDXProp_ChainAngle, // 0x0803 The default chain angle setting in degrees * // 65536. (INT32) kCDXProp_BondSpacing, // 0x0804 The spacing between segments of a multiple // bond, measured relative to bond length. (INT16) kCDXProp_BondLength, // 0x0805 The default bond length. (CDXCoordinate) kCDXProp_BoldWidth, // 0x0806 The default bold bond width. (CDXCoordinate) kCDXProp_LineWidth, // 0x0807 The default line width. (CDXCoordinate) kCDXProp_MarginWidth, // 0x0808 The default amount of space surrounding atom // labels. (CDXCoordinate) kCDXProp_HashSpacing, // 0x0809 The default spacing between hashed lines // used in wedged hashed bonds. (CDXCoordinate) kCDXProp_LabelStyle, // 0x080A The default style for atom labels.. // (CDXFontStyle) kCDXProp_CaptionStyle, // 0x080B The default style for non-atomlabel text // objects.. (CDXFontStyle) kCDXProp_CaptionJustification, // 0x080C The horizontal justification of a // caption (non-atomlabel text object) (INT8) kCDXProp_FractionalWidths, // 0x080D Signifies whether to use fractional // width information when drawing text. // (CDXBooleanImplied) kCDXProp_Magnification, // 0x080E The view magnification factor (INT16) kCDXProp_WidthPages, // 0x080F The width of the document in pages. (INT16) kCDXProp_HeightPages, // 0x0810 The height of the document in pages. (INT16) kCDXProp_DrawingSpaceType, // 0x0811 The type of drawing space used for this // document. (INT8) kCDXProp_DrawingSpaceWidth, // 0x0812 The width of the document. // (CDXCoordinate) kCDXProp_DrawingSpaceHeight, // 0x0813 The height of the document. // (CDXCoordinate) kCDXProp_PageOverlap, // 0x0814 The amount of overlap of pages when a poster // is tiled. (CDXCoordinate) kCDXProp_Header, // 0x0815 The text of the header. (CDXString) kCDXProp_HeaderPosition, // 0x0816 The vertical offset of the header // baseline from the top of the page. // (CDXCoordinate) kCDXProp_Footer, // 0x0817 The text of the footer. (CDXString) kCDXProp_FooterPosition, // 0x0818 The vertical offset of the footer // baseline from the bottom of the page. // (CDXCoordinate) kCDXProp_PrintTrimMarks, // 0x0819 If present, trim marks are to printed in // the margins. (CDXBooleanImplied) kCDXProp_LabelStyleFont, // 0x081A The default font family for atom labels. // (INT16) kCDXProp_CaptionStyleFont, // 0x081B The default font style for captions // (non-atom-label text objects). (INT16) kCDXProp_LabelStyleSize, // 0x081C The default font size for atom labels. // (INT16) kCDXProp_CaptionStyleSize, // 0x081D The default font size for captions // (non-atom-label text objects). (INT16) kCDXProp_LabelStyleFace, // 0x081E The default font style for atom labels. // (INT16) kCDXProp_CaptionStyleFace, // 0x081F The default font face for captions // (non-atom-label text objects). (INT16) kCDXProp_LabelStyleColor, // 0x0820 The default color for atom labels // (INT16) kCDXProp_CaptionStyleColor, // 0x0821 The default color for captions // (non-atom-label text objects). (INT16) kCDXProp_BondSpacingAbs, // 0x0822 The absolute distance between segments of // a multiple bond. (CDXCoordinate) kCDXProp_LabelJustification, // 0x0823 The default justification for atom // labels. (INT8) // Window properties. kCDXProp_Window_IsZoomed = 0x0900, // 0x0900 Signifies whether the main viewing window is zoomed // (maximized). (CDXBooleanImplied) kCDXProp_Window_Position, // 0x0901 The top-left position of the main // viewing window. (CDXPoint2D) kCDXProp_Window_Size, // 0x0902 Height and width of the document window. // (CDXPoint2D) // Graphic object properties. kCDXProp_Graphic_Type = 0x0A00, // 0x0A00 The type of graphical object. (INT16) kCDXProp_Line_Type, // 0x0A01 The type of a line object. (INT16) kCDXProp_Arrow_Type, // 0x0A02 The type of arrow object, which represents // line, arrow, arc, rectangle, or orbital. (INT16) kCDXProp_Rectangle_Type, // 0x0A03 The type of a rectangle object. (INT16) kCDXProp_Oval_Type, // 0x0A04 The type of an arrow object that represents a // circle or ellipse. (INT16) kCDXProp_Orbital_Type, // 0x0A05 The type of orbital object. (INT16) kCDXProp_Bracket_Type, // 0x0A06 The type of symbol object. (INT16) kCDXProp_Symbol_Type, // 0x0A07 The type of symbol object. (INT16) kCDXProp_Curve_Type, // 0x0A08 The type of curve object. (INT16) kCDXProp_Arrow_HeadSize = 0x0A20, // 0x0A20 The size of the arrow's head. (INT16) kCDXProp_Arc_AngularSize, // 0x0A21 The size of an arc (in degrees * 10, so // 90 degrees = 900). (INT16) kCDXProp_Bracket_LipSize, // 0x0A22 The size of a bracket. (INT16) kCDXProp_Curve_Points, // 0x0A23 The Bézier curve's control point // locations. (CDXCurvePoints) // Embedded pictures. kCDXProp_Picture_Edition = 0x0A60, // 0x0A60 The section information (SectionHandle) of the // Macintosh Publish & Subscribe edition embedded in the CDX // picture object. (Unformatted) kCDXProp_Picture_EditionAlias, // 0x0A61 The alias information of the // Macintosh Publish & Subscribe edition // embedded in the CDX picture object. // (Unformatted) kCDXProp_MacPICT, // 0x0A62 A Macintosh PICT data object. (Unformatted) kCDXProp_WindowsMetafile, // 0x0A63 A Microsoft Windows Metafile object. // (Unformatted) kCDXProp_OLEObject, // 0x0A64 An OLE object. (Unformatted) // Spectrum properties kCDXProp_Spectrum_XSpacing = 0x0A80, // 0x0A80 The spacing in logical units (ppm, Hz, wavenumbers) // between points along the X-axis of an evenly-spaced grid. // (FLOAT64) kCDXProp_Spectrum_XLow, // 0x0A81 The first data point for the X-axis of an // evenly-spaced grid. (FLOAT64) kCDXProp_Spectrum_XType, // 0x0A82 The type of units the X-axis represents. // (INT16) kCDXProp_Spectrum_YType, // 0x0A83 The type of units the Y-axis represents. // (INT16) kCDXProp_Spectrum_XAxisLabel, // 0x0A84 A label for the X-axis. (CDXString) kCDXProp_Spectrum_YAxisLabel, // 0x0A85 A label for the Y-axis. (CDXString) kCDXProp_Spectrum_DataPoint, // 0x0A86 The Y-axis values for the spectrum. // It is an array of double values // corresponding to X-axis values. (FLOAT64) kCDXProp_Spectrum_Class, // 0x0A87 The type of spectrum represented. (INT16) kCDXProp_Spectrum_YLow, // 0x0A88 Y value to be used to offset data when // storing XML. (FLOAT64) kCDXProp_Spectrum_YScale, // 0x0A89 Y scaling used to scale data when // storing XML. (FLOAT64) // Alternate Group properties kCDXProp_NamedAlternativeGroup_TextFrame = 0x0B00, // 0x0B00 The bounding box of upper portion of the Named // Alternative Group, containing the name of the group. // (CDXRectangle) kCDXProp_NamedAlternativeGroup_GroupFrame, // 0x0B01 The bounding box of the // lower portion of the Named // Alternative Group, containing // the definition of the group. // (CDXRectangle) kCDXProp_NamedAlternativeGroup_Valence, // 0x0B02 The number of attachment // points in each alternative in a // named alternative group. (INT16) // Reaction properties kCDXProp_ReactionStep_Atom_Map = 0x0C00, // 0x0C00 Represents pairs of mapped atom IDs; each pair is a // reactant atom mapped to to a product atom. (CDXObjectIDArray) kCDXProp_ReactionStep_Reactants, // 0x0C01 An order list of reactants // present in the Reaction Step. // (CDXObjectIDArray) kCDXProp_ReactionStep_Products, // 0x0C02 An order list of products present // in the Reaction Step. (CDXObjectIDArray) kCDXProp_ReactionStep_Plusses, // 0x0C03 An ordered list of pluses used to // separate components of the Reaction Step. // (CDXObjectIDArray) kCDXProp_ReactionStep_Arrows, // 0x0C04 An ordered list of arrows used to // separate components of the Reaction Step. // (CDXObjectIDArray) // CDObjectTag properties kCDXProp_ObjectTag_Type = 0x0D00, // 0x0D00 The tag's data type. (INT16) kCDXProp_Unused6, // 0x0D01 obsolete (obsolete) kCDXProp_Unused7, // 0x0D02 obsolete (obsolete) kCDXProp_ObjectTag_Tracking, // 0x0D03 The tag will participate in tracking // if non-zero. (CDXBoolean) kCDXProp_ObjectTag_Persistent, // 0x0D04 The tag will be resaved to a CDX // file if non-zero. (CDXBoolean) kCDXProp_ObjectTag_Value, // 0x0D05 The value is a INT32, FLOAT64 or // unformatted string depending on the value of // ObjectTag_Type. (varies) kCDXProp_Positioning, // 0x0D06 How the indicator should be positioned with // respect to its containing object. (INT8) kCDXProp_PositioningAngle, // 0x0D07 Angular positioning, in radians * // 65536. (INT32) kCDXProp_PositioningOffset, // 0x0D08 Offset positioning. (CDXPoint2D) // CDSequence properties kCDXProp_Sequence_Identifier = 0x0E00, // 0x0E00 A unique (but otherwise random) identifier for a given // Sequence object. (CDXString) // CDCrossReference properties kCDXProp_CrossReference_Container = 0x0F00, // 0x0F00 An external object containing (as an embedded object) // the document containing the Sequence object being referenced. // (CDXString) kCDXProp_CrossReference_Document, // 0x0F01 An external document containing // the Sequence object being referenced. // (CDXString) kCDXProp_CrossReference_Identifier, // 0x0F02 A unique (but otherwise // random) identifier for a given // Cross-Reference object. (CDXString) kCDXProp_CrossReference_Sequence, // 0x0F03 A value matching the // SequenceIdentifier of the Sequence // object to be referenced. (CDXString) // Miscellaneous properties. kCDXProp_Template_PaneHeight = 0x1000, // 0x1000 The height of the viewing window of a template grid. // (CDXCoordinate) kCDXProp_Template_NumRows, // 0x1001 The number of rows of the CDX // TemplateGrid object. (INT16) kCDXProp_Template_NumColumns, // 0x1002 The number of columns of the CDX // TemplateGrid object. (INT16) kCDXProp_SplitterPositions = 0x1ff0, // 0x1FF0 An array of vertical positions that subdivide a page // into regions. (CDXObjectIDArray) // User defined properties // First 1024 tags are reserved for temporary tags used only during the // runtime. kCDXUser_TemporaryBegin = kCDXTag_UserDefined, kCDXUser_TemporaryEnd = kCDXTag_UserDefined + 0x0400, // Objects. kCDXObj_Document = kCDXTag_Object, // 0x8000 kCDXObj_Page, // 0x8001 kCDXObj_Group, // 0x8002 kCDXObj_Fragment, // 0x8003 kCDXObj_Node, // 0x8004 kCDXObj_Bond, // 0x8005 kCDXObj_Text, // 0x8006 kCDXObj_Graphic, // 0x8007 kCDXObj_Curve, // 0x8008 kCDXObj_EmbeddedObject, // 0x8009 kCDXObj_NamedAlternativeGroup, // 0x800a kCDXObj_TemplateGrid, // 0x800b kCDXObj_RegistryNumber, // 0x800c kCDXObj_ReactionScheme, // 0x800d kCDXObj_ReactionStep, // 0x800e kCDXObj_ObjectDefinition, // 0x800f kCDXObj_Spectrum, // 0x8010 kCDXObj_ObjectTag, // 0x8011 kCDXObj_OleClientItem, // 0x8012 // obsolete kCDXObj_Sequence, // 0x8013 kCDXObj_CrossReference // 0x8014 }; enum CDXNodeType { kCDXNodeType_Unspecified, kCDXNodeType_Element, kCDXNodeType_ElementList, kCDXNodeType_ElementListNickname, kCDXNodeType_Nickname, kCDXNodeType_Fragment, kCDXNodeType_Formula, kCDXNodeType_GenericNickname, kCDXNodeType_AnonymousAlternativeGroup, kCDXNodeType_NamedAlternativeGroup, kCDXNodeType_MultiAttachment, kCDXNodeType_VariableAttachment, kCDXNodeType_ExternalConnectionPoint, kCDXNodeType_LinkNode }; enum CDXLabelDisplay { kCDXLabelDisplay_Auto, kCDXLabelDisplay_Left, kCDXLabelDisplay_Center, kCDXLabelDisplay_Right, kCDXLabelDisplay_Above, kCDXLabelDisplay_Below, kCDXLabelDisplay_BestInitial }; enum CDXRadical { // Same as MDL codes kCDXRadical_None = 0, kCDXRadical_Singlet = 1, // diradical singlet (two dots) kCDXRadical_Doublet = 2, // monoradical (one dot) kCDXRadical_Triplet = 3 // diradical triplet (two dots) }; enum CDXIsotope { kCDXIsotope_Natural = 0 }; enum CDXRingBondCount { kCDXRingBondCount_Unspecified = -1, kCDXRingBondCount_NoRingBonds = 0, kCDXRingBondCount_AsDrawn = 1, kCDXRingBondCount_SimpleRing = 2, kCDXRingBondCount_Fusion = 3, kCDXRingBondCount_SpiroOrHigher = 4 }; enum CDXUnsaturation { kCDXUnsaturation_Unspecified = 0, kCDXUnsaturation_MustBeAbsent = 1, kCDXUnsaturation_MustBePresent = 2, kCDXUnsaturationLastEnum }; enum CDXReactionStereo { kCDXReactionStereo_Unspecified = 0, kCDXReactionStereo_Inversion = 1, kCDXReactionStereo_Retention = 2 }; enum CDXTranslation { kCDXTranslation_Equal = 0, kCDXTranslation_Broad = 1, kCDXTranslation_Narrow = 2, kCDXTranslation_Any = 3 }; enum CDXAtomGeometry { kCDXAtomGeometry_Unknown = 0, kCDXAtomGeometry_1Ligand = 1, kCDXAtomGeometry_Linear = 2, kCDXAtomGeometry_Bent = 3, kCDXAtomGeometry_TrigonalPlanar = 4, kCDXAtomGeometry_TrigonalPyramidal = 5, kCDXAtomGeometry_SquarePlanar = 6, kCDXAtomGeometry_Tetrahedral = 7, kCDXAtomGeometry_TrigonalBipyramidal = 8, kCDXAtomGeometry_SquarePyramidal = 9, kCDXAtomGeometry_5Ligand = 10, kCDXAtomGeometry_Octahedral = 11, kCDXAtomGeometry_6Ligand = 12, kCDXAtomGeometry_7Ligand = 13, kCDXAtomGeometry_8Ligand = 14, kCDXAtomGeometry_9Ligand = 15, kCDXAtomGeometry_10Ligand = 16 }; enum CDXBondOrder { kCDXBondOrder_Single = 0x0001, kCDXBondOrder_Double = 0x0002, kCDXBondOrder_Triple = 0x0004, kCDXBondOrder_Quadruple = 0x0008, kCDXBondOrder_Quintuple = 0x0010, kCDXBondOrder_Sextuple = 0x0020, kCDXBondOrder_Half = 0x0040, kCDXBondOrder_OneHalf = 0x0080, kCDXBondOrder_TwoHalf = 0x0100, kCDXBondOrder_ThreeHalf = 0x0200, kCDXBondOrder_FourHalf = 0x0400, kCDXBondOrder_FiveHalf = 0x0800, kCDXBondOrder_Dative = 0x1000, kCDXBondOrder_Ionic = 0x2000, kCDXBondOrder_Hydrogen = 0x4000, kCDXBondOrder_ThreeCenter = 0x8000, kCDXBondOrder_SingleOrDouble = kCDXBondOrder_Single | kCDXBondOrder_Double, kCDXBondOrder_SingleOrAromatic = kCDXBondOrder_Single | kCDXBondOrder_OneHalf, kCDXBondOrder_DoubleOrAromatic = kCDXBondOrder_Double | kCDXBondOrder_OneHalf, kCDXBondOrder_Any = -1 }; // Permit combination of CDXBondOrder values inline CDXBondOrder &operator|=(CDXBondOrder &lhs, const CDXBondOrder &rhs) { return lhs = CDXBondOrder(UINT32(lhs) | UINT32(rhs)); } enum CDXBondDisplay { kCDXBondDisplay_Solid = 0, kCDXBondDisplay_Dash = 1, kCDXBondDisplay_Hash = 2, kCDXBondDisplay_WedgedHashBegin = 3, kCDXBondDisplay_WedgedHashEnd = 4, kCDXBondDisplay_Bold = 5, kCDXBondDisplay_WedgeBegin = 6, kCDXBondDisplay_WedgeEnd = 7, kCDXBondDisplay_Wavy = 8, kCDXBondDisplay_HollowWedgeBegin = 9, kCDXBondDisplay_HollowWedgeEnd = 10, kCDXBondDisplay_WavyWedgeBegin = 11, kCDXBondDisplay_WavyWedgeEnd = 12, kCDXBondDisplay_Dot = 13, kCDXBondDisplay_DashDot = 14 }; enum CDXBondDoublePosition { kCDXBondDoublePosition_AutoCenter = 0x0000, kCDXBondDoublePosition_AutoRight = 0x0001, kCDXBondDoublePosition_AutoLeft = 0x0002, kCDXBondDoublePosition_UserCenter = 0x0100, kCDXBondDoublePosition_UserRight = 0x0101, kCDXBondDoublePosition_UserLeft = 0x0102 }; enum CDXBondTopology { kCDXBondTopology_Unspecified = 0, kCDXBondTopology_Ring = 1, kCDXBondTopology_Chain = 2, kCDXBondTopology_RingOrChain = 3 }; enum CDXBondReactionParticipation { kCDXBondReactionParticipation_Unspecified = 0, kCDXBondReactionParticipation_ReactionCenter = 1, kCDXBondReactionParticipation_MakeOrBreak = 2, kCDXBondReactionParticipation_ChangeType = 3, kCDXBondReactionParticipation_MakeAndChange = 4, kCDXBondReactionParticipation_NotReactionCenter = 5, kCDXBondReactionParticipation_NoChange = 6, kCDXBondReactionParticipation_Unmapped = 7 }; enum CDXTextJustification { kCDXTextJustification_Right = -1, kCDXTextJustification_Left, kCDXTextJustification_Center, kCDXTextJustification_Full, kCDXTextJustification_Above, kCDXTextJustification_Below, kCDXTextJustification_Auto }; #define kCDXTagType_Unknown "unknown" #define kCDXTagType_Query "query" #define kCDXTagType_Stereo "stereo" #define kCDXTagType_Number "number" enum CDXPositioningType { kCDXPositioningType_Auto = 0, kCDXPositioningType_Angle, kCDXPositioningType_Offset }; #define kCDXLineHeight_Variable 0 #define kCDXLineHeight_Automatic 1 enum CDXGraphicType { kCDXGraphicType_Undefined = 0, kCDXGraphicType_Line, kCDXGraphicType_Arc, kCDXGraphicType_Rectangle, kCDXGraphicType_Oval, kCDXGraphicType_Orbital, kCDXGraphicType_Bracket, kCDXGraphicType_Symbol }; enum CDXBracketType { kCDXBracketType_RoundPair, kCDXBracketType_SquarePair, kCDXBracketType_CurlyPair, kCDXBracketType_Square, kCDXBracketType_Curly }; enum CDXRectangleType { kCDXRectangleType_Plain = 0x0000, kCDXRectangleType_RoundEdge = 0x0001, kCDXRectangleType_Shadow = 0x0002, kCDXRectangleType_Shaded = 0x0004, kCDXRectangleType_Filled = 0x0008, kCDXRectangleType_Dashed = 0x0010, kCDXRectangleType_Bold = 0x0020 }; enum CDXOvalType { kCDXOvalType_Circle = 0x0001, kCDXOvalType_Shaded = 0x0002, kCDXOvalType_Filled = 0x0004, kCDXOvalType_Dashed = 0x0008, kCDXOvalType_Bold = 0x0010 }; enum CDXSymbolType { kCDXSymbolType_LonePair, kCDXSymbolType_Electron, kCDXSymbolType_RadicalCation, kCDXSymbolType_RadicalAnion, kCDXSymbolType_CirclePlus, kCDXSymbolType_CircleMinus, kCDXSymbolType_Dagger, kCDXSymbolType_DoubleDagger, kCDXSymbolType_Plus, kCDXSymbolType_Minus, kCDXSymbolType_Racemic, kCDXSymbolType_Absolute, kCDXSymbolType_Relative }; enum CDXLineType { kCDXLineType_Solid = 0x0000, kCDXLineType_Dashed = 0x0001, kCDXLineType_Bold = 0x0002 }; enum CDXArrowType { kCDXArrowType_NoHead = 0, kCDXArrowType_HalfHead = 1, kCDXArrowType_FullHead = 2, kCDXArrowType_Resonance = 4, kCDXArrowType_Equilibrium = 8, kCDXArrowType_Hollow = 16, kCDXArrowType_RetroSynthetic = 32 }; enum CDXOrbitalType { kCDXOrbitalType_s, // s orbital kCDXOrbitalType_oval, // Oval-shaped sigma or pi orbital kCDXOrbitalType_lobe, // One lobe of a p orbital kCDXOrbitalType_p, // Complete p orbital kCDXOrbitalType_hybridPlus, // hydrid orbital kCDXOrbitalType_hybridMinus, // hydrid orbital (opposite shading) kCDXOrbitalType_dz2Plus, // dz2 orbital kCDXOrbitalType_dz2Minus, // dz2 orbital (opposite shading) kCDXOrbitalType_dxy, // dxy orbital kCDXOrbitalType_sShaded = 0x0100, // shaded s orbital kCDXOrbitalType_ovalShaded, // shaded Oval-shaped sigma or pi orbital kCDXOrbitalType_lobeShaded, // shaded single lobe of a p orbital kCDXOrbitalType_pShaded, // shaded Complete p orbital kCDXOrbitalType_sFilled = 0x0200, // filled s orbital kCDXOrbitalType_ovalFilled, // filled Oval-shaped sigma or pi orbital kCDXOrbitalType_lobeFilled, // filled single lobe of a p orbital kCDXOrbitalType_pFilled, // filled Complete p orbital kCDXOrbitalType_hybridPlusFilled, // filled hydrid orbital kCDXOrbitalType_hybridMinusFilled, // filled hydrid orbital (opposite // shading) kCDXOrbitalType_dz2PlusFilled, // filled dz2 orbital kCDXOrbitalType_dz2MinusFilled, // filled dz2 orbital (opposite shading) kCDXOrbitalType_dxyFilled // filled dxy orbital }; enum CDXSpectrumYType { kCDXSpectrumYType_Unknown, kCDXSpectrumYType_Absorbance, kCDXSpectrumYType_Transmittance, kCDXSpectrumYType_PercentTransmittance, kCDXSpectrumYType_Other, kCDXSpectrumYType_ArbitraryUnits }; enum CDXSpectrumXType { kCDXSpectrumXType_Unknown, kCDXSpectrumXType_Wavenumbers, kCDXSpectrumXType_Microns, kCDXSpectrumXType_Hertz, kCDXSpectrumXType_MassUnits, kCDXSpectrumXType_PartsPerMillion, kCDXSpectrumXType_Other }; enum CDXSpectrumClass { kCDXSpectrumClass_Unknown, kCDXSpectrumClass_Chromatogram, kCDXSpectrumClass_Infrared, kCDXSpectrumClass_UVVis, kCDXSpectrumClass_XRayDiffraction, kCDXSpectrumClass_MassSpectrum, kCDXSpectrumClass_NMR, kCDXSpectrumClass_Raman, kCDXSpectrumClass_Fluorescence, kCDXSpectrumClass_Atomic }; enum CDXDrawingSpaceType { kCDXDrawingSpace_Pages, kCDXDrawingSpace_Poster }; enum CDXAtomCIPType { kCDXCIPAtom_Undetermined = 0, kCDXCIPAtom_None, kCDXCIPAtom_R, kCDXCIPAtom_S, kCDXCIPAtom_r, kCDXCIPAtom_s, kCDXCIPAtom_Unspecified // No hash/wedge, but if there were one, it would // have stereochemistry. }; enum CDXBondCIPType { kCDXCIPBond_Undetermined = 0, kCDXCIPBond_None, kCDXCIPBond_E, kCDXCIPBond_Z }; enum CDXObjectTagType { kCDXObjectTagType_Undefined = 0, kCDXObjectTagType_Double, kCDXObjectTagType_Long, kCDXObjectTagType_String }; enum CDXCharSet { kCDXCharSetUnknown = 0, kCDXCharSetEBCDICOEM = 37, kCDXCharSetMSDOSUS = 437, kCDXCharSetEBCDIC500V1 = 500, kCDXCharSetArabicASMO708 = 708, kCDXCharSetArabicASMO449P, kCDXCharSetArabicTransparent, kCDXCharSetArabicTransparentASMO = 720, kCDXCharSetGreek437G = 737, kCDXCharSetBalticOEM = 775, kCDXCharSetMSDOSLatin1 = 850, kCDXCharSetMSDOSLatin2 = 852, kCDXCharSetIBMCyrillic = 855, kCDXCharSetIBMTurkish = 857, kCDXCharSetMSDOSPortuguese = 860, kCDXCharSetMSDOSIcelandic, kCDXCharSetHebrewOEM, kCDXCharSetMSDOSCanadianFrench, kCDXCharSetArabicOEM, kCDXCharSetMSDOSNordic, kCDXCharSetMSDOSRussian, kCDXCharSetIBMModernGreek = 869, kCDXCharSetThai = 874, kCDXCharSetEBCDIC, kCDXCharSetJapanese = 932, kCDXCharSetChineseSimplified = 936, // PRC, Singapore kCDXCharSetKorean = 949, kCDXCharSetChineseTraditional = 950, // Taiwan, Hong Kong kCDXCharSetUnicodeISO10646 = 1200, kCDXCharSetWin31EasternEuropean = 1250, kCDXCharSetWin31Cyrillic, kCDXCharSetWin31Latin1, kCDXCharSetWin31Greek, kCDXCharSetWin31Turkish, kCDXCharSetHebrew, kCDXCharSetArabic, kCDXCharSetBaltic, kCDXCharSetVietnamese, kCDXCharSetKoreanJohab = 1361, kCDXCharSetMacRoman = 10000, kCDXCharSetMacJapanese, kCDXCharSetMacTradChinese, kCDXCharSetMacKorean, kCDXCharSetMacArabic, kCDXCharSetMacHebrew, kCDXCharSetMacGreek, kCDXCharSetMacCyrillic, kCDXCharSetMacReserved, kCDXCharSetMacDevanagari, kCDXCharSetMacGurmukhi, kCDXCharSetMacGujarati, kCDXCharSetMacOriya, kCDXCharSetMacBengali, kCDXCharSetMacTamil, kCDXCharSetMacTelugu, kCDXCharSetMacKannada, kCDXCharSetMacMalayalam, kCDXCharSetMacSinhalese, kCDXCharSetMacBurmese, kCDXCharSetMacKhmer, kCDXCharSetMacThai, kCDXCharSetMacLao, kCDXCharSetMacGeorgian, kCDXCharSetMacArmenian, kCDXCharSetMacSimpChinese, kCDXCharSetMacTibetan, kCDXCharSetMacMongolian, kCDXCharSetMacEthiopic, kCDXCharSetMacCentralEuroRoman, kCDXCharSetMacVietnamese, kCDXCharSetMacExtArabic, kCDXCharSetMacUninterpreted, kCDXCharSetMacIcelandic = 10079, kCDXCharSetMacTurkish = 10081 }; #endif // _H_CDXConstants xdrawchem-v1.11.0/xdrawchem/aa_xpm.h000066400000000000000000002662471371466245600174010ustar00rootroot00000000000000/* XPM */ static const char *aa_ala[] = { /* width height ncolors chars_per_pixel */ "43 49 2 1", /* colors */ " c #000000", ". c None", /* pixels */ "...........................................", "...........................................", "...........................................", "...........................................", "...........................................", ".... ... ....... ... ......................", ".... ... ....... ... ......................", ".... ... ....... .. ......................", ".... ....... . . ......................", ".... ... ....... .. ......................", ".... ... .. .. .. ......................", ".... ... . ... . ... ......................", "............. .............................", "........... ......... ....................", "........... .......... ....................", ".......... ........ ...................", "....................... ...................", "........................ ..................", "........................ .................", "......................... ......", "........................ ..................", "........................ ..................", "....................... ...................", "....................... ...................", "...................... ....................", "..................... .....................", "..... ............. .....................", ".... ... ........... ......................", "... ..... . ......................", "... ..... ......... .......................", "... ..... ......................", ".... ... ........... ......................", "..... ............. .....................", "..................... .....................", "...................... ....................", "...........................................", "...........................................", "........................ ... ... ........", "....................... ... .. ... ........", "...................... ..... . ... ........", "...................... ..... . ........", "...................... ..... . ... ........", "....................... ... .. ... ........", "........................ ... ... ........", "...........................................", "...........................................", "...........................................", "...........................................", "..........................................."}; /* XPM */ static const char *aa_arg[] = { /* width height ncolors chars_per_pixel */ "106 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................." "................................", ".........................................................................." "................................", ".........................................................................." "................................", ".........................................................................." "................................", ".........................................................................." "................................", ".... ... ....... ... " ".........................................................................." "...........", ".... ... ....... ... " ".........................................................................." "...........", ".... ... ....... .. " "......................................................... ... .. ... " "................", ".... ....... . . " "......................................................... ... .. ... " "................", ".... ... ....... .. " "......................................................... .. .. ... " "................", ".... ... .. .. .. " "......................................................... . . .. " "................", ".... ... . ... . ... " "......................................................... .. .. ... " "................", "............. " "................................................................ .. .. " "... .. ...........", "........... ......... " "..................................................... . ... .. ... . ... " "..........", "........... ........... " "................................................... ................. " "...........", ".......... ........ " ".................................................. ................ " "............", "........................ ................................................ " " ................. .............", "........................ ............................................... " ".................. ..........", "......................... ................ ................ " "..................................", "........................ ............ .............. . .............. . " ".................................", "........................ .............. ............ ... ............ . . " "................................", "....................... ................ .......... .... .......... .. " ". ...............................", "....................... ................. ........ ...... " "................ ..............................", "...................... ................... ...... ........ " ".............. . ..................... .......", "...................... .................... .... ........... ... .. ... " ".. .. ... .. ... ...... .....", "..................... ...................... ... ............ ... .. ... " "... . ... .. ... ........ .......", "..... ............. ....................... . ............. .. .. ... " "..... .. .. ... ........ .......", ".... ... ........... ......................... .............. . . .. " "..... . . .. ................", "... ..... ........................................ .. .. ... " "..... .. .. ... ................", "... ..... ......... ......................................... .. .. ... " "..... .. .. ... .. ...........", "... ..... . ........................................ ... .. ... " "..... ... .. ... . ... ..........", ".... ... ........... " "......................................................................... " "...........", "..... ............. " "...................................................................... " "............", "..................... " "...................................................................... " ".............", ".........................................................................." "................. ..........", ".........................................................................." "................................", "........................ ... ... " ".......................................................................", "....................... ... .. ... " ".......................................................................", "...................... ..... . ... " ".......................................................................", "...................... ..... . " ".......................................................................", "...................... ..... . ... " ".......................................................................", "....................... ... .. ... " ".......................................................................", "........................ ... ... " ".......................................................................", ".........................................................................." "................................", ".........................................................................." "................................", ".........................................................................." "................................", ".........................................................................." "................................", ".........................................................................." "................................"}; /* XPM */ static const char *aa_asn[] = { /* width height ncolors chars_per_pixel */ "79 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".... ... ....... ... " "..........................................................", ".... ... ....... ... " "..........................................................", ".... ... ....... .. " "..........................................................", ".... ....... . . " "..........................................................", ".... ... ....... .. " "..........................................................", ".... ... .. .. .. " "..........................................................", ".... ... . ... . ... " "..........................................................", "............. " ".................................................................", "........... ......... " "........................................................", "........... ........... " ".......................................................", ".......... ........ ................................ ... .. ... " "...........", "........................ ............................... ... .. ... " "...........", "........................ ............................... .. .. ... " "...........", "......................... ................. . . .. " "...........", "........................ ............ ................ .. .. ... " "...........", "........................ ............... ............ . .. .. ... .. " "......", "....................... .................. ......... .. ... .. ... . ... " ".....", "....................... .................... ..... ................... " "......", "...................... ....................... . ................... " ".......", "...................... ........................ .................... " "........", "..................... ......................... . ................... " ".....", "..... ............. ......................... . " ".............................", ".... ... ........... .......................... . " ".............................", "... ..... .......................... . " ".............................", "... ..... ......... ........................... . " ".............................", "... ..... . .......................... . " ".............................", ".... ... ........... " "..........................................................", "..... ............. " ".........................................................", "..................... ........................ " "..............................", "............................................. ... " ".............................", "............................................ ..... " "............................", "........................ ... ... ......... ..... " "............................", "....................... ... .. ... ......... ..... " "............................", "...................... ..... . ... .......... ... " ".............................", "...................... ..... . ........... " "..............................", "...................... ..... . ... " "............................................", "....................... ... .. ... " "............................................", "........................ ... ... " "............................................", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." "....."}; /* XPM */ static const char *aa_asp[] = { /* width height ncolors chars_per_pixel */ "70 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ "......................................................................", "......................................................................", "......................................................................", "......................................................................", "......................................................................", ".... ... ....... ... .................................................", ".... ... ....... ... .................................................", ".... ... ....... .. .................................................", ".... ....... . . .................................................", ".... ... ....... .. .................................................", ".... ... .. .. .. .................................................", ".... ... . ... . ... .................................................", "............. ........................................................", "........... ......... ...............................................", "........... ........... ..............................................", ".......... ........ ............................. ... ... ......", "........................ ........................... ... .. ... ......", "........................ .......................... ..... . ... ......", "......................... ............. ..... . ......", "........................ ............ ............ ..... . ... ......", "........................ .............. ............ ... .. ... ......", "....................... ................ ............ ... ... ......", "....................... ................. ........ ...................", "...................... ................... ...... ...................", "...................... .................... .... ....................", "..................... ...................... ... .....................", "..... ............. ....................... . ......................", ".... ... ........... ........................ ......................", "... ..... ........................ . ......................", "... ..... ......... ......................... . ......................", "... ..... . ........................ . ......................", ".... ... ........... ........................ . ......................", "..... ............. ....................... . ......................", "..................... ....................... . ......................", "......................................................................", "......................................................................", "........................ ... ... ......... .......................", "....................... ... .. ... ........ ... ......................", "...................... ..... . ... ....... ..... .....................", "...................... ..... . ....... ..... .....................", "...................... ..... . ... ....... ..... .....................", "....................... ... .. ... ........ ... ......................", "........................ ... ... ......... .......................", "......................................................................", "......................................................................", "......................................................................", "......................................................................", "......................................................................"}; /* XPM */ static const char *aa_cys[] = { /* width height ncolors chars_per_pixel */ "58 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ "..........................................................", "..........................................................", "..........................................................", "..........................................................", "..........................................................", ".... ... ....... ... .....................................", ".... ... ....... ... .....................................", ".... ... ....... .. .....................................", ".... ....... . . .....................................", ".... ... ....... .. .....................................", ".... ... .. .. .. .....................................", ".... ... . ... . ... .....................................", "............. ............................................", "........... ......... ...................................", "........... ........... ..................................", ".......... ........ ..................................", "........................ .................................", "........................ .................................", "......................... ....................", "........................ ........... ...................", "........................ ............. ...................", "....................... ............... ..................", "....................... ............... ..................", "...................... ................. .................", "...................... ...................................", "..................... ....................................", "..... ............. .................... .. ... ......", ".... ... ........... .................... .. . ... ......", "... ..... .................... ..... ... ......", "... ..... ......... ...................... ... ......", "... ..... . ....................... . ... ......", ".... ... ........... .................... ... . ... ......", "..... ............. ................... .. ... ......", "..................... ....................................", "..........................................................", "..........................................................", "........................ ... ... .......................", "....................... ... .. ... .......................", "...................... ..... . ... .......................", "...................... ..... . .......................", "...................... ..... . ... .......................", "....................... ... .. ... .......................", "........................ ... ... .......................", "..........................................................", "..........................................................", "..........................................................", "..........................................................", ".........................................................."}; /* XPM */ static const char *aa_gln[] = { /* width height ncolors chars_per_pixel */ "84 50 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................." "..........", ".........................................................................." "..........", ".........................................................................." "..........", ".........................................................................." "..........", ".........................................................................." "..........", ".................................................... " ".............................", "................................................... ... " "............................", ".... ... ....... ... ............................. ..... " "...........................", ".... ... ....... ... ............................. ..... " "...........................", ".... ... ....... .. ............................. ..... " "...........................", ".... ....... . . .............................. ... " "............................", ".... ... ....... .. ............................... " ".............................", ".... ... .. .. .. " "...............................................................", ".... ... . ... . ... " "...............................................................", "............. ....................................... . " "............................", "........... ......... .............................. . " "............................", "........... ........... ............................. . " "............................", ".......... ........ ............................. . " "............................", "........................ ............................ . " "............................", "........................ ............................ . " "............................", "......................... ................ " ".............................", "........................ ............ .............. . " "............................", "........................ .............. ............ ... " "...........................", "....................... ................ .......... .... " "..........................", "....................... ................. ........ ...... " ".........................", "...................... ................... ...... ........ " "........................", "...................... .................... .... ........... ... .. ... " "...........", "..................... ...................... ... ............ ... .. ... " "...........", "..... ............. ....................... . ............. .. .. ... " "...........", ".... ... ........... ......................... .............. . . .. " "...........", "... ..... ........................................ .. .. ... " "...........", "... ..... ......... ......................................... .. .. ... " ".. ......", "... ..... . ........................................ ... .. ... " ". ... .....", ".... ... ........... " "........................................................ ......", "..... ............. " "..................................................... .......", "..................... " "..................................................... ........", ".........................................................................." " .....", ".........................................................................." "..........", "........................ ... ... " ".................................................", "....................... ... .. ... " ".................................................", "...................... ..... . ... " ".................................................", "...................... ..... . " ".................................................", "...................... ..... . ... " ".................................................", "....................... ... .. ... " ".................................................", "........................ ... ... " ".................................................", ".........................................................................." "..........", ".........................................................................." "..........", ".........................................................................." "..........", ".........................................................................." "..........", ".........................................................................." ".........."}; /* XPM */ static const char *aa_glu[] = { /* width height ncolors chars_per_pixel */ "79 50 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".................................................... " "........................", "................................................... ... " ".......................", ".... ... ....... ... ............................. ..... " "......................", ".... ... ....... ... ............................. ..... " "......................", ".... ... ....... .. ............................. ..... " "......................", ".... ....... . . .............................. ... " ".......................", ".... ... ....... .. ............................... " "........................", ".... ... .. .. .. " "..........................................................", ".... ... . ... . ... " "..........................................................", "............. ....................................... . " ".......................", "........... ......... .............................. . " ".......................", "........... ........... ............................. . " ".......................", ".......... ........ ............................. . " ".......................", "........................ ............................ . " ".......................", "........................ ............................ . " ".......................", "......................... ................ " "........................", "........................ ............ .............. . " ".......................", "........................ .............. ............ ... " "......................", "....................... ................ .......... .... " ".....................", "....................... ................. ........ ...... " "....................", "...................... ................... ...... ........ " "...................", "...................... .................... .... ............ ... ... " "......", "..................... ...................... ... ............ ... .. ... " "......", "..... ............. ....................... . ............ ..... . ... " "......", ".... ... ........... ......................... ............. ..... . " "......", "... ..... ....................................... ..... . ... " "......", "... ..... ......... ......................................... ... .. ... " "......", "... ..... . ......................................... ... ... " "......", ".... ... ........... " "..........................................................", "..... ............. " ".........................................................", "..................... " ".........................................................", ".........................................................................." ".....", ".........................................................................." ".....", "........................ ... ... " "............................................", "....................... ... .. ... " "............................................", "...................... ..... . ... " "............................................", "...................... ..... . " "............................................", "...................... ..... . ... " "............................................", "....................... ... .. ... " "............................................", "........................ ... ... " "............................................", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." ".....", ".........................................................................." "....."}; /* XPM */ static const char *aa_gly[] = { /* width height ncolors chars_per_pixel */ "41 49 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................", ".........................................", ".........................................", ".........................................", ".........................................", ".... ... ....... ... ....................", ".... ... ....... ... ....................", ".... ... ....... .. ....................", ".... ....... . . ....................", ".... ... ....... .. ....................", ".... ... .. .. .. ....................", ".... ... . ... . ... ....................", "............. ...........................", "........... ......... ..................", "........... .......... ..................", ".......... ........ .................", "....................... .................", "........................ ................", "........................ ...............", ".........................................", "........................ ................", "........................ ................", "....................... .................", "....................... .................", "...................... ..................", "..................... ...................", "..... ............. ...................", ".... ... ........... ....................", "... ..... . ....................", "... ..... ......... .....................", "... ..... ....................", ".... ... ........... ....................", "..... ............. ...................", "..................... ...................", "...................... ..................", ".........................................", ".........................................", "........................ ... ... ......", "....................... ... .. ... ......", "...................... ..... . ... ......", "...................... ..... . ......", "...................... ..... . ... ......", "....................... ... .. ... ......", "........................ ... ... ......", ".........................................", ".........................................", ".........................................", ".........................................", "........................................."}; /* XPM */ static const char *aa_his[] = { /* width height ncolors chars_per_pixel */ "71 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".......................................................................", ".......................................................................", ".......................................................................", ".......................................................................", ".......................................................................", ".... ... ....... ... ..................................................", ".... ... ....... ... ..................................................", ".... ... ....... .. ..................................................", ".... ....... . . ..................................................", ".... ... ....... .. ..................................................", ".... ... .. .. .. ..................................................", ".... ... . ... . ... ..................................................", "............. .........................................................", "........... ......... ......................... ... .. ... ...........", "........... .......... ......................... ... .. ... ...........", ".......... ....... ........................ .. .. ... ...........", "....................... ........................ . . .. ...........", "....................... ....................... .. .. ... ...........", "........................ ........... .. .. ... ...........", "....................... ............ .......... ... .. ... ...........", "....................... .............. ...................... ........", "....................... ............... ..................... ........", "...................... ................. ...... ............. ........", "...................... .................. ..... ............. ........", "..................... .................... ... .............. ........", "..................... ..................... .. .............. ........", "..... ............ ....................... .............. ........", ".... ... ........... ........................ .............. ........", "... ..... ........................ ............. ........", "... ..... ......... .......................... .......................", "... ..... ......................... ......................", ".... ... ........... .......................... ........... ... ......", "..... ............ ......................... .......... ... ......", "..................... .......................... .......... .. ......", "................................................ ......... . . ......", "................................................. .... . .. ......", "....................... ... ... ............... . ... .. ......", "...................... ... .. ... ................ ....... ... ......", "..................... ..... . ... .....................................", "..................... ..... . .....................................", "..................... ..... . ... .....................................", "...................... ... .. ... .....................................", "....................... ... ... .....................................", ".......................................................................", ".......................................................................", ".......................................................................", ".......................................................................", "......................................................................."}; /* XPM */ static const char *aa_ile[] = { /* width height ncolors chars_per_pixel */ "61 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".............................................................", ".............................................................", ".............................................................", ".............................................................", ".............................................................", ".... ... ....... ... ........................................", ".... ... ....... ... ........................................", ".... ... ....... .. ........................................", ".... ....... . . ........................................", ".... ... ....... .. ..................... ..................", ".... ... .. .. .. ..................... ..................", ".... ... . ... . ... .................... ...................", "............. ........................... ...................", "........... ......... ................. ....................", "........... ........... ............... .....................", ".......... ........ ............... .....................", "........................ ............. ......................", "........................ ............. ......................", "......................... .......................", "........................ ........... ......................", "........................ ............. ......................", "....................... ............... .....................", "....................... ............... .....................", "...................... ................. ....................", "...................... ................. ....................", "..................... ................... ...................", "..... ............. ................... ...................", ".... ... ........... ..................... ..................", "... ..... ..................... .................", "... ..... ......... ....................... ......", "... ..... . ........................................", ".... ... ........... ........................................", "..... ............. .......................................", "..................... .......................................", ".............................................................", ".............................................................", "........................ ... ... ..........................", "....................... ... .. ... ..........................", "...................... ..... . ... ..........................", "...................... ..... . ..........................", "...................... ..... . ... ..........................", "....................... ... .. ... ..........................", "........................ ... ... ..........................", ".............................................................", ".............................................................", ".............................................................", ".............................................................", "............................................................."}; /* XPM */ static const char *aa_leu[] = { /* width height ncolors chars_per_pixel */ "61 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".............................................................", ".............................................................", ".............................................................", ".............................................................", ".............................................................", ".... ... ....... ... ........................................", ".... ... ....... ... ........................................", ".... ... ....... .. ........................................", ".... ....... . . ........................................", ".... ... ....... .. ........................................", ".... ... .. .. .. ........................................", ".... ... . ... . ... ........................................", "............. ...............................................", "........... ......... ......................................", "........... ........... .....................................", ".......... ........ .....................................", "........................ ....................................", "........................ ....................................", "......................... .......................", "........................ ........... ......................", "........................ ............. ......................", "....................... ............... .....................", "....................... ............... .....................", "...................... ................. ....................", "...................... ................. ....................", "..................... ................... ...................", "..... ............. ................... ...................", ".... ... ........... ..................... ..................", "... ..... ..................... .................", "... ..... ......... ....................... ......", "... ..... . ..................... ..................", ".... ... ........... ..................... ..................", "..... ............. ................... ...................", "..................... ................... ...................", "........................................ ....................", "....................................... .....................", "........................ ... ... .... .....................", "....................... ... .. ... ... ......................", "...................... ..... . ... ... ......................", "...................... ..... . .. .......................", "...................... ..... . ... ..........................", "....................... ... .. ... ..........................", "........................ ... ... ..........................", ".............................................................", ".............................................................", ".............................................................", ".............................................................", "............................................................."}; /* XPM */ static const char *aa_lys[] = { /* width height ncolors chars_per_pixel */ "97 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................." ".......................", ".........................................................................." ".......................", ".........................................................................." ".......................", ".........................................................................." ".......................", ".........................................................................." ".......................", ".... ... ....... ... " ".........................................................................." "..", ".... ... ....... ... " ".........................................................................." "..", ".... ... ....... .. " ".........................................................................." "..", ".... ....... . . " ".........................................................................." "..", ".... ... ....... .. " ".........................................................................." "..", ".... ... .. .. .. " ".........................................................................." "..", ".... ... . ... . ... " ".........................................................................." "..", "............. " ".........................................................................." ".........", "........... ......... " "........................................................................." ".", "........... ........... " "................................................................. .......", ".......... ........ ............................................. ... " ".. ... ...... .....", "........................ ............................................ ... " ".. ... ........ .......", "........................ ............................................ .. " ".. ... ........ .......", "......................... ................ .............. . . " ".. ................", "........................ ............ .............. . ............. .. " ".. ... ................", "........................ .............. ............ ... ............ .. " ".. ... .. ...........", "....................... ................ .......... .... ........... ... " ".. ... . .. ...........", "....................... ................. ........ ...... ........ " "................ ...........", "...................... ................... ...... ........ ...... " ".................. ..........", "...................... .................... .... .......... .... " "............... ... ..........", "..................... ...................... ... ............ ... " "................. ...........", "..... ............. ....................... . .............. . " "................................", ".... ... ........... ......................... ................ " ".................................", "... ..... " ".........................................................................." "..", "... ..... ......... " ".........................................................................." "...", "... ..... . " ".........................................................................." "..", ".... ... ........... " ".........................................................................." "..", "..... ............. " ".........................................................................." ".", "..................... " ".........................................................................." ".", ".........................................................................." ".......................", ".........................................................................." ".......................", "........................ ... ... " "..............................................................", "....................... ... .. ... " "..............................................................", "...................... ..... . ... " "..............................................................", "...................... ..... . " "..............................................................", "...................... ..... . ... " "..............................................................", "....................... ... .. ... " "..............................................................", "........................ ... ... " "..............................................................", ".........................................................................." ".......................", ".........................................................................." ".......................", ".........................................................................." ".......................", ".........................................................................." ".......................", ".........................................................................." "......................."}; /* XPM */ static const char *aa_met[] = { /* width height ncolors chars_per_pixel */ "67 49 2 1", /* colors */ " c #000000", ". c None", /* pixels */ "...................................................................", "...................................................................", "...................................................................", "...................................................................", "...................................................................", ".... ... ....... ... ..............................................", ".... ... ....... ... ..............................................", ".... ... ....... .. ..............................................", ".... ....... . . ..............................................", ".... ... ....... .. ..............................................", ".... ... .. .. .. ..............................................", ".... ... . ... . ... ..............................................", "............. .....................................................", "........... ......... ............................................", "........... .......... ............................................", ".......... ........ ...........................................", "....................... ...........................................", "........................ ..........................................", "........................ .........................................", "......................... .............................", "........................ ............. ..................... ......", "........................ ............. ..................... ......", "....................... ............... ................... .......", "....................... ............... ................... .......", "...................... ................. ................. ........", "..................... ................... .........................", "..... ............. ................... ............ ..........", ".... ... ........... ..................... .......... .. .........", "... ..... . ..................... .......... .............", "... ..... ......... ....................... .. ...........", "... ..... ................................... .........", ".... ... ........... ................................ ... .........", "..... ............. ............................... ..........", "..................... .............................................", "...................... ............................................", "...................................................................", "...................................................................", "........................ ... ... ................................", "....................... ... .. ... ................................", "...................... ..... . ... ................................", "...................... ..... . ................................", "...................... ..... . ... ................................", "....................... ... .. ... ................................", "........................ ... ... ................................", "...................................................................", "...................................................................", "...................................................................", "...................................................................", "..................................................................."}; /* XPM */ static const char *aa_phe[] = { /* width height ncolors chars_per_pixel */ "73 49 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................", ".........................................................................", ".........................................................................", ".........................................................................", ".........................................................................", ".... ... ....... ... ....................................................", ".... ... ....... ... ....................................................", ".... ... ....... .. ....................................................", ".... ....... . . ....................................................", ".... ... ....... .. ....................................................", ".... ... .. .. .. ....................................................", ".... ... . ... . ... ....................................................", "............. ...........................................................", "........... ......... ..................................................", "........... .......... ..................................................", ".......... ........ .................................................", "....................... .................................................", "........................ ................................................", "........................ ...............................................", "......................... ........... ...........", "........................ ............. ......... ............ ..........", "........................ ............. ......... .......... ..........", "....................... ............... ....... . ............ .........", "....................... ............... ....... .............. .........", "...................... ................. ..... . .............. ........", "..................... ................... ... . ................ .......", "..... ............. ................... ... . ................ .......", ".... ... ........... ..................... . . .................. ......", "... ..... . ..................... . .................. ......", "... ..... ......... ....................... . ...........................", "... ..... ...................... ..................... .....", ".... ... ........... ....................... ..................... ......", "..... ............. ....................... ................... .......", "..................... ....................... ................... .......", "...................... ....................... ................. ........", ".............................................. ................. ........", "............................................... ............... .........", "........................ ... ... ............ ............... .........", "....................... ... .. ... ............. ............. ..........", "...................... ..... . ... ............. ..........", "...................... ..... . .............. ...........", "...................... ..... . ... ......................................", "....................... ... .. ... ......................................", "........................ ... ... ......................................", ".........................................................................", ".........................................................................", ".........................................................................", ".........................................................................", "........................................................................" "."}; /* XPM */ static const char *aa_pro[] = { /* width height ncolors chars_per_pixel */ "60 36 2 1", /* colors */ " c #000000", ". c None", /* pixels */ "............................................................", "............................................................", "............................................................", "............................................................", "............................................................", "............................. .... .... ... ... ......", "............................ ... .. ... .. ... .. ... ......", ".............. ........... ...... ..... ..... . ... ......", "........... .. .......... ...... ..... ..... . ......", "........ ..... ......... ...... ..... ..... . ... ......", "..... ......... .......... ... .. ... .. ... .. ... ......", "... ............. .......... .... .... ... ... ......", "... .............. ...... .................................", "... ............... ..... .................................", "... ................ ... ..................................", "... ................ .. ...................................", "... ................. . ....................................", "... .................. .....................................", "... ................. . ....................................", "... ................ .. ...................................", "... ................ .... ..................................", "... ............... ...... .................................", "... ........................ ... ...........................", "... ....................... ... ...........................", "..... ..... ... .. ... ... ... ...........................", "........ .. ... .. ... ... ...........................", "........... . .. .. ... ... ... ...........................", "............. . . .. ... ... ...........................", "............. .. .. ... ... ... ...........................", "............. .. .. ... ...................................", "............. ... .. ... ...................................", "............................................................", "............................................................", "............................................................", "............................................................", "............................................................"}; /* XPM */ static const char *aa_ser[] = { /* width height ncolors chars_per_pixel */ "59 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ "...........................................................", "...........................................................", "...........................................................", "...........................................................", "...........................................................", ".... ... ....... ... ......................................", ".... ... ....... ... ......................................", ".... ... ....... .. ......................................", ".... ....... . . ......................................", ".... ... ....... .. ......................................", ".... ... .. .. .. ......................................", ".... ... . ... . ... ......................................", "............. .............................................", "........... ......... ....................................", "........... ........... ...................................", ".......... ........ ...................................", "........................ ..................................", "........................ ..................................", "......................... .....................", "........................ ........... ....................", "........................ ............. ....................", "....................... ............... ...................", "....................... ............... ...................", "...................... ................. ..................", "...................... ....................................", "..................... .....................................", "..... ............. .................... ... ... ......", ".... ... ........... .................... ... .. ... ......", "... ..... ................... ..... . ... ......", "... ..... ......... .................... ..... . ......", "... ..... . ................... ..... . ... ......", ".... ... ........... .................... ... .. ... ......", "..... ............. .................... ... ... ......", "..................... .....................................", "...........................................................", "...........................................................", "........................ ... ... ........................", "....................... ... .. ... ........................", "...................... ..... . ... ........................", "...................... ..... . ........................", "...................... ..... . ... ........................", "....................... ... .. ... ........................", "........................ ... ... ........................", "...........................................................", "...........................................................", "...........................................................", "...........................................................", "..........................................................."}; /* XPM */ static const char *aa_thr[] = { /* width height ncolors chars_per_pixel */ "59 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ "...........................................................", "...........................................................", "...........................................................", "...........................................................", "...........................................................", ".... ... ....... ... ......................................", ".... ... ....... ... ......................................", ".... ... ....... .. ......................................", ".... ....... . . ......................................", ".... ... ....... .. ..................... ................", ".... ... .. .. .. ..................... ................", ".... ... . ... . ... .................... .................", "............. ........................... .................", "........... ......... ................. ..................", "........... ........... ............... ...................", ".......... ........ ............... ...................", "........................ ............. ....................", "........................ ............. ....................", "......................... .....................", "........................ ........... ....................", "........................ ............. ....................", "....................... ............... ...................", "....................... ............... ...................", "...................... ................. ..................", "...................... ....................................", "..................... .....................................", "..... ............. .................... ... ... ......", ".... ... ........... .................... ... .. ... ......", "... ..... ................... ..... . ... ......", "... ..... ......... .................... ..... . ......", "... ..... . ................... ..... . ... ......", ".... ... ........... .................... ... .. ... ......", "..... ............. .................... ... ... ......", "..................... .....................................", "...........................................................", "...........................................................", "........................ ... ... ........................", "....................... ... .. ... ........................", "...................... ..... . ... ........................", "...................... ..... . ........................", "...................... ..... . ... ........................", "....................... ... .. ... ........................", "........................ ... ... ........................", "...........................................................", "...........................................................", "...........................................................", "...........................................................", "..........................................................."}; /* XPM */ static const char *aa_trp[] = { /* width height ncolors chars_per_pixel */ "83 56 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................." ".........", ".........................................................................." ".........", ".........................................................................." ".........", ".........................................................................." ".........", ".........................................................................." ".........", ".... ... ....... ... " "..............................................................", ".... ... ....... ... " "..............................................................", ".... ... ....... .. " "..............................................................", ".... ....... . . " "..............................................................", ".... ... ....... .. " "..............................................................", ".... ... .. .. .. " "..............................................................", ".... ... . ... . ... " "..............................................................", "............. " ".....................................................................", "........... ......... " "............................................................", "........... ........... " "...........................................................", ".......... ........ " "...........................................................", "........................ ........................................... " "..............", "........................ .......................................... . " ".............", "......................... ........................... .. " "...........", "........................ ............ ......................... .... " "..........", "........................ ............... ...................... ..... " ".........", "....................... .................. ................... ....... " " ........", "....................... .................... ................ " "......... .......", "...................... ....................... ............. . " "............ ......", "...................... ........................ . " ".............. .....", "..................... .......................... .......... " ".............. .....", "..... ............. .......................... .......... " "............... .....", ".... ... ........... ........................... .......... " "............... .....", "... ..... ........................... .......... " "............... .....", "... ..... ......... ............................ .......... " "............... .....", "... ..... . ........................... .......... " "............... .....", ".... ... ........... ........................... .......... " "............... .....", "..... ............. .......................... .......... " "............... .....", "..................... .......................... .......... " "............... .....", "................................................ .......... " "............... .....", "................................................ ........... " "................ .....", "........................ ... ... ............. ........... " ".....................", "....................... ... .. ... ............. ......... " "............. ......", "...................... ..... . ... .............. ......... .. " "........... .......", "...................... ..... . ............... ....... ... " "......... ........", "...................... ..... . ... ............... ....... .... ....... " ".........", "....................... ... .. ... ................ ..... ...... ..... " "..........", "........................ ... ... .............................. ... " "...........", ".................................................................. ... " "............", ".................................................... ... .. ... ... . " ".............", ".................................................... ... .. ... .... " "..............", ".................................................... .. .. ... " "...................", ".................................................... . . .. " "...................", ".................................................... .. .. ... " "...................", ".................................................... .. .. ... " "...................", ".................................................... ... .. ... " "...................", ".........................................................................." ".........", ".........................................................................." ".........", ".........................................................................." ".........", ".........................................................................." ".........", ".........................................................................." "........."}; /* XPM */ static const char *aa_tyr[] = { /* width height ncolors chars_per_pixel */ "95 48 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".........................................................................." ".....................", ".........................................................................." ".....................", ".........................................................................." ".....................", ".........................................................................." ".....................", ".........................................................................." ".....................", ".... ... ....... ... " "........................................................................." ".", ".... ... ....... ... " "........................................................................." ".", ".... ... ....... .. " "........................................................................." ".", ".... ....... . . " "........................................................................." ".", ".... ... ....... .. " "........................................................................." ".", ".... ... .. .. .. " "........................................................................." ".", ".... ... . ... . ... " "........................................................................." ".", "............. " ".........................................................................." ".......", "........... ......... " "........................................................................", "........... ........... " ".......................................................................", ".......... ........ " ".......................................................................", "........................ " "......................................................................", "........................ " "......................................................................", "......................... ........... " ".................................", "........................ ........... ......... ........... " "................................", "........................ ............. ......... .......... " "................................", "....................... ............... ....... . ............ " "...............................", "....................... ............... ....... .............. " "...............................", "...................... ................. ..... . .............. " "..............................", "...................... ................. ..... ................ " "..............................", "..................... ................... ... . ................ " ".............................", "..... ............. ................... ... .................. " "............ ... ... ......", ".... ... ........... ..................... . .................. " ".......... ... .. ... ......", "... ..... ..................... .................... " "........ ..... . ... ......", "... ..... ......... ....................... ....................... " " ..... . ......", "... ..... . ....................... ..................... " "......... ..... . ... ......", ".... ... ........... ....................... ..................... " ".......... ... .. ... ......", "..... ............. ....................... ................... " "............ ... ... ......", "..................... ....................... ................... " ".............................", ".............................................. ................. " "..............................", "............................................... ............... " "...............................", "........................ ... ... ............ ............... " "...............................", "....................... ... .. ... ............. ............. " "................................", "...................... ..... . ... ............. . .. " "................................", "...................... ..... . .............. " ".................................", "...................... ..... . ... " "............................................................", "....................... ... .. ... " "............................................................", "........................ ... ... " "............................................................", ".........................................................................." ".....................", ".........................................................................." ".....................", ".........................................................................." ".....................", ".........................................................................." ".....................", ".........................................................................." "....................."}; /* XPM */ static const char *aa_val[] = { /* width height ncolors chars_per_pixel */ "49 49 2 1", /* colors */ " c #000000", ". c None", /* pixels */ ".................................................", ".................................................", ".................................................", ".................................................", ".................................................", ".... ... ....... ... ............................", ".... ... ....... ... ............................", ".... ... ....... .. ............................", ".... ....... . . ............................", ".... ... ....... .. ..................... .....", ".... ... .. .. .. ..................... ......", ".... ... . ... . ... .................... .......", "............. ........................... .......", "........... ......... ................. ........", "........... .......... ................. ........", ".......... ........ ............... .........", "....................... ............... .........", "........................ ............. ..........", "........................ ........... ..........", "......................... ...........", "........................ ............. ..........", "........................ ............. ..........", "....................... ............... .........", "....................... ............... .........", "...................... ................. ........", "..................... ................... .......", "..... ............. ................... .......", ".... ... ........... ..................... ......", "... ..... . ..................... ......", "... ..... ......... .............................", "... ..... ............................", ".... ... ........... ............................", "..... ............. ...........................", "..................... ...........................", "...................... ..........................", ".................................................", ".................................................", "........................ ... ... ..............", "....................... ... .. ... ..............", "...................... ..... . ... ..............", "...................... ..... . ..............", "...................... ..... . ... ..............", "....................... ... .. ... ..............", "........................ ... ... ..............", ".................................................", ".................................................", ".................................................", ".................................................", "................................................."}; /* XPM */ static const char *aa_nph[] = { /* width height num_colors chars_per_pixel */ " 100 48 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "####.###.######.###.######################################################" "##########################", "####.###.######.###.######################################################" "##########################", "####.###.######..##.######################################################" "##########################", "####.....######.#.#.######################################################" "##########################", "####.###.######.##..######################################################" "##########################", "####.###.##...#.##..######################################################" "##########################", "####.###.#.##.#.###.######################################################" "##########################", "############.#############################################################" "##########################", "###########.##########.###################################################" "##########################", "##########....#########.##################################################" "##########################", "#######################.##################################################" "##########################", "########################.#################################################" "##########################", "########################.#################################################" "##########################", "#########################.............###########.............############" "##########################", "########################.#############.#########.###########.#.###########" "##########################", "########################.#############.#########..##########...###########" "##########################", "#######################.###############.#######..############.#.##########" "##########################", "#######################.###############.#######.##############..##########" "##########################", "######################.#################.#####..##############.#.#########" "##########################", "#####################.###################.###..################.#.########" "##########################", "#####...#############.###################.###..################.#.########" "###.###.###...############", "####.###.###########.#####################.#..##################.#.#######" "###.###.##.###.###########", "###.#####..........#.#####################.#..##################...#######" "###..##.#.#####.##########", "###.#####.#########.#######################..######################......." "..#.#.#.#.#####.##########", "###.#####............######################..#####################..######" "###.##..#.#####.##########", "####.###.###########.#######################.#####################.#######" "###.##..##.###.##...######", "#####...#############.#######################.###################.########" "###.###.###...##.##.######", "#####################.#######################.###################.########" "##################.#######", "######################.#######################.#################.#########" "#################.########", "##############################################.#################.#########" "################....######", "###############################################.###############.##########" "##########################", "########################...###.###.############.###############.##########" "##########################", "#######################.###.##.###.#############.#############.###########" "##########################", "######################.#####.#.###.#############............#..###########" "##########################", "######################.#####.#.....##############.............############" "##########################", "######################.#####.#.###.#######################################" "##########################", "#######################.###.##.###.#######################################" "##########################", "########################...###.###.#######################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################"}; /* XPM */ static const char *aa_statine[] = { /* width height num_colors chars_per_pixel */ " 86 60 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "############", "##########################################################################" "############", "##########################################################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################.##################################" "############", "#######################################..#################################" "############", "#####################################..#..################################" "############", "###################################..#####..##############################" "############", "##################################.#########..############################" "############", "################################..############..##########################" "############", "##############################..################..########################" "############", "#############################.###################.########################" "############", "#############################.############################################" "############", "#############################.############################################" "############", "#############################.############################################" "############", "#############################.############################################" "############", "#############################.############################################" "############", "#############################.############################################" "############", "#############################.############################################" "############", "#############################.############################################" "############", "#############################.#######################################...##" "#.###.######", "#############################.######################################.###.#" "#.###.######", "#############################.#####################################.#####." "#.###.######", "#############################.###################..################.#####." "#.....######", "###########################..#..################..#..##############.#####." "#.###.######", "#########################..#####..############..#####..###########.#.###.#" "#.###.######", "####.###.######.###.####.#########.#########..#########.#########.###...##" "#.###.######", "####.###.######.###.##..###########..#####..############..#####..#########" "############", "####.###.######..##.#################..#..################..#..###########" "############", "####.....######.#.#.###################..##################...############" "############", "####.###.######.##..###################.###################.#.############" "############", "####.###.##...#.##..###################.###################.#.############" "############", "####.###.#.##.#.###.###################.###################.#.############" "############", "############.##########################.###################.#.############" "############", "###########.###########################.###################.#.############" "############", "##########....#########################.###################.#.############" "############", "##########################################################################" "############", "##########################################################################" "############", "######################################...###.###.#########...#############" "############", "#####################################.###.##.###.########.###.############" "############", "####################################.#####.#.###.#######.#####.###########" "############", "####################################.#####.#.....#######.#####.###########" "############", "####################################.#####.#.###.#######.#####.###########" "############", "#####################################.###.##.###.########.###.############" "############", "######################################...###.###.#########...#############" "############", "##########################################################################" "############", "##########################################################################" "############", "##########################################################################" "############", "##########################################################################" "############", "##########################################################################" "############"}; xdrawchem-v1.11.0/xdrawchem/application.cpp000066400000000000000000002115651371466245600207630ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "application.h" #include "charsel.h" #include "chemdata.h" #include "colorbutton.h" #include "crings_dialog.h" #include "defs.h" #include "drawable.h" #include "dyk.h" #include "fixeddialog.h" #include "helpwindow.h" #include "myfiledialog.h" #include "netaccess.h" #include "netchoosedialog.h" #include "netdialog.h" #include "pagesetupdialog.h" #include "peptidebuilder.h" #include "render2d.h" #include "renderarea.h" #include "ringdialog.h" #include "xdc_event.h" #include "xdc_toolbutton.h" #include "xruler.h" // Brackets #include "brackets.h" // end brackets // Symbols #include "newman-anti.xpm" #include "newman-eclipse.xpm" #include "newman.xpm" #include "symbol_xpm.h" // end symbols // Arrows #include "arrows.h" #include "ccw180.xpm" #include "ccw270.xpm" #include "ccw90.xpm" #include "cubicbezier.h" #include "cw180.xpm" #include "cw270.xpm" #include "cw90.xpm" // end Arrows // defined in main.cpp // extern QString RingDir, HomeDir; ApplicationWindow::ApplicationWindow() : QMainWindow() { setFont(preferences.getMainFont()); // new, fancy PNG icon setWindowIcon(QIcon(":/icons/xdrawchem-icon.png")); OBGetFilters(); // What's This? text for top toolbar QString fileOpenText = tr("Click this button to open a file.

    You can also select the " "Open command from the File menu."); QString fileSaveText = tr("Click this button to save the file you are editing.

    You can " "also select the Save command from the File menu.

    "); QString filePrintText = tr("Click this button to print the file you are editing.

    You " "can also select the Print command from the File menu."); QString editCutText = tr("Click this button to cut a selection.

    You can also select " "the Cut command from the Edit menu, or press Ctrl+X."); QString editCopyText = tr("Click this button to copy a selection.

    You can also select " "the Copy command from the Edit menu, or press Ctrl+C."); QString editPasteText = tr("Click this button to paste a selection.

    You can also select " "the Paste command from the Edit menu, or press Ctrl+V."); QString editMPText = tr("Click this button to zoom in."); QString editMMText = tr("Click this button to zoom out."); // What's This? text for left side toolbar QString selectToolText = tr("Select tool

    Use the Select tool to select and move items " "inside a box.

    You can select multiple items and cut, copy, " "move and rotate them."); QString lassoToolText = tr("Lasso tool

    Use the Lasso tool to select and move items by " "drawing a loop around them.

    You can select multiple items " "and cut, copy, move and rotate them."); QString eraseToolText = tr("Erase tool

    Use the Erase tool to erase individual items."); QString lineToolText = tr("Line tool

    Use the Line tool to draw bonds. Draw over " "existing bonds to create double and triple bonds."); QString dashLineToolText = tr("Dashed Line tool

    Use the Dashed Line tool to draw dashed " "lines. Draw over existing bonds to add dashed lines (to indicate " "resonance, etc.)."); QString chainToolText = tr("Chain tool

    Use the Chain tool to draw aliphatic chains. " "The length of each segment is the current bond length."); QString upLineToolText = tr("Stereo Up Line tool

    Use the Line tool to draw stereo-up " "lines, as shown on the button."); QString downLineToolText = tr("Stereo Down Line tool

    Use the Line tool to draw stereo-down " "lines, as shown on the button."); QString wavyLineToolText = tr("Wavy Line tool

    Use the Wavy Line tool to draw wavy lines, " "as shown on the button."); QString arrowToolText = tr("Arrow tool

    Use the Arrow tool to draw straight " "arrows.

    Click to draw a straight arrow.

    Click and " "hold to pick from a list of available arrows."); QString cArrowToolText = tr("Curved Arrow tool

    Use the Curved Arrow tool to insert " "curved arrows.

    Click and hold to select from a picture menu " "of arrows."); QString bracketToolText = tr("Bracket tool

    Use the Bracket tool to draw brackets and " "parentheses.

    Click to draw square brackets.

    Click " "and hold to select from a picture menu of brackets."); QString textToolText = tr("Text tool

    Use the Text tool to add text and label atoms and " "points.
    (See manual for info on formatting text)"); QString ringToolText = tr("Ring tool

    Use the Ring tool to insert ready-made rings and " "structures.

    Click to open the ring dialog, which allows " "selection from a list of all built-in rings and " "structures.

    Click and hold to select from a picture menu of " "select rings.
    (See manual for more info on modifying this menu)"); QString symbolToolText = tr("Symbol tool

    Use the Symbol tool to " "insert symbols.

    Click and hold to " "select from a picture menu of symbols.
    "); printer = new QPrinter; m_centralWidget = new QWidget(this); setCentralWidget(m_centralWidget); /// create scrolling viewport and render widget m_renderArea = new RenderArea(m_centralWidget); m_renderer = new Render2D(m_renderArea); m_renderArea->setWidget(m_renderer); m_renderArea->setAlignment(Qt::AlignCenter); connect(m_renderArea, SIGNAL(scrolled(int, int)), SLOT(svXY(int, int))); m_renderArea->viewport()->installEventFilter(this); /// create grid layout QGridLayout *glo = new QGridLayout(m_centralWidget); m_rulerUnitLabel = new QLabel(m_centralWidget); m_rulerUnitLabel->setText(QString::fromLatin1("px")); glo->addWidget(m_rulerUnitLabel, 0, 0); vruler = new XRuler(m_centralWidget); vruler->setHV(2); vruler->setFixedWidth(20); glo->addWidget(vruler, 1, 0); hruler = new XRuler(m_centralWidget); hruler->setHV(1); hruler->setFixedHeight(20); glo->addWidget(hruler, 0, 1); glo->addWidget(m_renderArea, 1, 1); /** * top toolbar */ fileTools = new QToolBar(tr("File Operations"), this); addToolBar(fileTools); QAction *fileOpenAction = fileTools->addAction(QIcon(":/icons/fileopen.png"), tr("Open file"), this, SLOT(load())); fileOpenAction->setWhatsThis(fileOpenText); QAction *fileSaveAction = fileTools->addAction(QIcon(":/icons/filesave.png"), tr("Save file"), this, SLOT(save())); fileSaveAction->setWhatsThis(fileSaveText); QAction *filePrintAction = fileTools->addAction(QIcon(":/icons/fileprint.png"), tr("Print file"), this, SLOT(print())); filePrintAction->setWhatsThis(filePrintText); QAction *cutAction = fileTools->addAction(QIcon(":/icons/cuttool.png"), tr("Cut"), this, SLOT(Cut())); cutAction->setWhatsThis(editCutText); QAction *copyAction = fileTools->addAction(QIcon(":/icons/copytool.png"), tr("Copy"), this, SLOT(Copy())); copyAction->setWhatsThis(editCopyText); QAction *pasteAction = fileTools->addAction(QIcon(":/icons/pastetool.png"), tr("Paste"), this, SLOT(Paste())); pasteAction->setWhatsThis(editPasteText); QAction *magPlusAction = fileTools->addAction(QIcon(":/icons/mag_plus.png"), tr("Zoom In"), this, SLOT(MagnifyPlus())); magPlusAction->setWhatsThis(editMPText); QAction *magMinusAction = fileTools->addAction(QIcon(":/icons/mag_minus.png"), tr("Zoom Out"), this, SLOT(MagnifyMinus())); magMinusAction->setWhatsThis(editMMText); // QPixmap tmp_pm = QPixmap( 32, 20 ); // // tmp_pm.fill( QColor( 210, 210, 210 ) ); // QPainter pixpaint( &tmp_pm ); // // pixpaint.fillRect( 2, 3, 14, 14, QColor( 0, 0, 0 ) ); // pixpaint.setPen( QColor( 0, 0, 0 ) ); // pixpaint.drawLine( 24, 2, 24, 16 ); // pixpaint.drawLine( 24, 16, 20, 12 ); // pixpaint.drawLine( 24, 16, 28, 12 ); // setColorAction = fileTools->addAction( QIcon( tmp_pm ), tr( "Color" // ), this, SLOT( NewColor() ) ); colorBtn = new ColorButton(m_renderer->GetColor()); connect(colorBtn, SIGNAL(pressed()), SLOT(NewColor())); fileTools->addWidget(colorBtn); ltList = new QComboBox(fileTools); ltList->setToolTip(tr("Set line thickness")); ltList->setWhatsThis(tr("Set Line Thickness")); ltList->addItem(QIcon(":/icons/line1.png"), "1"); ltList->addItem(QIcon(":/icons/line2.png"), "2"); ltList->addItem(QIcon(":/icons/line3.png"), "3"); ltList->addItem(QIcon(":/icons/line4.png"), "4"); ltList->addItem(QIcon(":/icons/line5.png"), "5"); connect(ltList, SIGNAL(activated(int)), SLOT(SetThick(int))); fileTools->addWidget(ltList); QFontComboBox *fonts = new QFontComboBox; fonts->setFontFilters(QFontComboBox::ScalableFonts); fonts->setWritingSystem(QFontDatabase::Latin); connect(fonts, SIGNAL(currentFontChanged(const QFont &)), SLOT(setFontFace(const QFont &))); fileTools->addWidget(fonts); // TODO GitLab Issue #32 fontSizeList = new QComboBox(fileTools); fontSizeList->hide(); /* fontSizeList->setToolTip(tr("Set font size")); fontSizeList->setWhatsThis(tr("Set Font Size")); fontSizeList->setEditable(true); fontSizeList->setInsertPolicy(QComboBox::InsertAtBottom); QDoubleValidator *double_validator = new QDoubleValidator; double_validator->setBottom(0.05); double_validator->setNotation(QDoubleValidator::StandardNotation); fontSizeList->setValidator(double_validator); fontSizeList->addItem("8"); fontSizeList->addItem("10"); fontSizeList->addItem("12"); fontSizeList->addItem("14"); fontSizeList->addItem("18"); fontSizeList->addItem("24"); fontSizeList->addItem("32"); fontSizeList->setCurrentIndex(2); connect(fontSizeList, SIGNAL(textActivated(const QString &)), this, SLOT(setFontPoints(const QString &))); */ fileTools->addWidget(fontSizeList); justifyLeftAction = fileTools->addAction(QIcon(":/icons/justifylefttool.png"), tr("Left-justify selected text"), m_renderer, SLOT(JustifyLeft())); justifyLeftAction->setVisible(false); justifyCenterAction = fileTools->addAction(QIcon(":/icons/justifycentertool.png"), tr("Center selected text"), m_renderer, SLOT(JustifyCenter())); justifyCenterAction->setVisible(false); justifyRightAction = fileTools->addAction(QIcon(":/icons/justifyrighttool.png"), tr("Right-justify selected text"), m_renderer, SLOT(JustifyRight())); justifyRightAction->setVisible(false); boldAction = fileTools->addAction(QIcon(":/icons/boldtool.png"), tr("Make selected text bold"), m_renderer, SLOT(Bold())); boldAction->setVisible(false); italicAction = fileTools->addAction(QIcon(":/icons/italictool.png"), tr("Italicize selected text"), m_renderer, SLOT(Italic())); italicAction->setVisible(false); underlineAction = fileTools->addAction(QIcon(":/icons/underlinetool.png"), tr("Underline selected text"), m_renderer, SLOT(Underline())); underlineAction->setVisible(false); superscriptAction = fileTools->addAction(QIcon(":/icons/superscript.png"), tr("Superscript selected text"), m_renderer, SLOT(Superscript())); superscriptAction->setVisible(false); subscriptAction = fileTools->addAction(QIcon(":/icons/subscript.png"), tr("Subscript selected text"), m_renderer, SLOT(Subscript())); subscriptAction->setVisible(false); QAction *whatsThisAction = QWhatsThis::createAction(fileTools); fileTools->addAction(whatsThisAction); /** * left side toolbar */ drawTools = new QToolBar(tr("Tools"), this); addToolBar(Qt::LeftToolBarArea, drawTools); QAction *selectAction = drawTools->addAction(QIcon(":/icons/selecttool.svg"), tr("Select"), m_renderer, SLOT(setMode_Select())); selectAction->setShortcut(QKeySequence(tr("s"))); selectAction->setWhatsThis(selectToolText); QAction *lassoAction = drawTools->addAction(QIcon(":/icons/lassotool.svg"), tr("Lasso"), m_renderer, SLOT(setMode_Lasso())); lassoAction->setShortcut(QKeySequence(tr("l"))); lassoAction->setWhatsThis(lassoToolText); QAction *eraseAction = drawTools->addAction(QIcon(":/icons/erasetool.svg"), tr("Erase"), m_renderer, SLOT(setMode_Erase())); eraseAction->setShortcut(QKeySequence(tr("e"))); eraseAction->setWhatsThis(eraseToolText); QAction *drawLineAction = drawTools->addAction(QIcon(":/icons/linetool.svg"), tr("Draw Line"), m_renderer, SLOT(setMode_DrawLine())); drawLineAction->setShortcut(QKeySequence(tr("d"))); drawLineAction->setWhatsThis(lineToolText); QAction *drawDashLineAction = drawTools->addAction(QIcon(":/icons/dashtool.svg"), tr("Draw dashed line"), m_renderer, SLOT(setMode_DrawDashLine())); drawDashLineAction->setWhatsThis(dashLineToolText); QAction *drawChainAction = drawTools->addAction(QIcon(":/icons/chaintool.svg"), tr("Draw aliphatic chain"), m_renderer, SLOT(setMode_DrawChain())); drawChainAction->setShortcut(QKeySequence(tr("c"))); drawChainAction->setWhatsThis(chainToolText); QAction *drawUpLineAction = drawTools->addAction(QIcon(":/icons/uptool.svg"), tr("Draw stereo-up line"), m_renderer, SLOT(setMode_DrawUpLine())); drawUpLineAction->setWhatsThis(upLineToolText); QAction *drawDownLineAction = drawTools->addAction(QIcon(":/icons/downtool.svg"), tr("Draw stereo-down line"), m_renderer, SLOT(setMode_DrawDownLine())); drawDownLineAction->setWhatsThis(downLineToolText); QAction *drawWavyLineAction = drawTools->addAction(QIcon(":/icons/wavytool.svg"), tr("Draw wavy bond"), m_renderer, SLOT(setMode_DrawWavyLine())); drawWavyLineAction->setWhatsThis(wavyLineToolText); /// textbutton QAction *drawTextAction = drawTools->addAction(QIcon(":/icons/texttool.svg"), tr("Draw or edit text"), m_renderer, SLOT(setMode_DrawText())); drawTextAction->setShortcut(QKeySequence(tr("t"))); drawTextAction->setWhatsThis(textToolText); /// arrowbutton drawArrowButton = new QToolButton(); regularArrowMenu = BuildArrowMenu(); drawArrowButton->setMenu(regularArrowMenu); drawArrowButton->setPopupMode(QToolButton::MenuButtonPopup); drawArrowButton->setDefaultAction(regularArrowAction); drawArrowButton->setWhatsThis(arrowToolText); drawArrowButton->setIcon(QIcon(":/icons/regulararrow.svg")); drawArrowButton->setShortcut(QKeySequence(tr("a"))); connect(drawArrowButton, SIGNAL(triggered(QAction *)), SLOT(FromArrowMenu(QAction *))); connect(regularArrowMenu, SIGNAL(triggered(QAction *)), SLOT(setRegularArrowAction(QAction *))); drawTools->addWidget(drawArrowButton); /// curvearrowbutton drawCurveArrowButton = new QToolButton(); curveArrowMenu = BuildCurveArrowMenu(); drawCurveArrowButton->setMenu(curveArrowMenu); drawCurveArrowButton->setPopupMode(QToolButton::MenuButtonPopup); drawCurveArrowButton->setDefaultAction(carrowCW90Action); drawCurveArrowButton->setWhatsThis(cArrowToolText); drawCurveArrowButton->setIcon(QIcon(":/icons/clockwise90arrow.svg")); drawCurveArrowButton->setShortcut(QKeySequence(tr("Shift+A"))); connect(drawCurveArrowButton, SIGNAL(triggered(QAction *)), SLOT(FromCurveArrowMenu(QAction *))); connect(curveArrowMenu, SIGNAL(triggered(QAction *)), SLOT(setCurveArrowAction(QAction *))); drawTools->addWidget(drawCurveArrowButton); /// bracketbutton drawBracketButton = new QToolButton(); bracketMenu = BuildBracketMenu(); drawBracketButton->setMenu(bracketMenu); drawBracketButton->setPopupMode(QToolButton::MenuButtonPopup); drawBracketButton->setDefaultAction(squareBracketAction); drawBracketButton->setWhatsThis(bracketToolText); drawBracketButton->setIcon(QIcon(QPixmap(squarebracket_xpm))); drawBracketButton->setShortcut(QKeySequence(tr("b"))); connect(drawBracketButton, SIGNAL(triggered(QAction *)), SLOT(FromBracketMenu(QAction *))); connect(bracketMenu, SIGNAL(triggered(QAction *)), SLOT(setBracketAction(QAction *))); drawTools->addWidget(drawBracketButton); // QAction *drawRingAction = new QAction( QIcon( ":/icons/ringtool.png" ), // tr( "Draw ring" ), this ); drawRingButton = new QToolButton(); ringMenu = BuildNewRingMenu(); drawRingButton->setMenu(ringMenu); drawRingButton->setPopupMode(QToolButton::MenuButtonPopup); drawRingButton->setDefaultAction(ring5Action); drawRingButton->setWhatsThis(ringToolText); drawRingButton->setShortcut(QKeySequence(tr("r"))); connect(drawRingButton, SIGNAL(triggered(QAction *)), SLOT(setRingAction(QAction *))); drawTools->addWidget(drawRingButton); /// symbolbutton drawSymbolButton = new QToolButton(this); QMenu *symbolMenu = BuildSymbolMenu(); drawSymbolButton->setMenu(symbolMenu); drawSymbolButton->setPopupMode(QToolButton::MenuButtonPopup); drawSymbolButton->setWhatsThis(symbolToolText); connect(symbolMenu, SIGNAL(triggered(QAction *)), SLOT(setSymbolAction(QAction *))); drawTools->addWidget(drawSymbolButton); addToolBarBreak(Qt::LeftToolBarArea); /** * second (left? right?) toolbar - predefined rings */ ringTools = new QToolBar(tr("Common Rings"), this); addToolBar(Qt::LeftToolBarArea, ringTools); XDC_ToolButton *b1; b1 = new XDC_ToolButton(ringTools, "cyclopropane.cml"); b1->setIcon(QIcon(":/icons/cyclopropane.svg")); connect(b1, SIGNAL(pressed()), b1, SLOT(trigger())); connect(b1, SIGNAL(IncludeFile(QString)), this, SLOT(FromRingToolbar(QString))); ringTools->addWidget(b1); b1 = new XDC_ToolButton(ringTools, "cyclobutane.cml"); b1->setIcon(QIcon(":/icons/cyclobutane.svg")); connect(b1, SIGNAL(pressed()), b1, SLOT(trigger())); connect(b1, SIGNAL(IncludeFile(QString)), this, SLOT(FromRingToolbar(QString))); ringTools->addWidget(b1); b1 = new XDC_ToolButton(ringTools, "cyclopentane.cml"); b1->setIcon(QIcon(":/icons/cyclopentane.svg")); connect(b1, SIGNAL(pressed()), b1, SLOT(trigger())); connect(b1, SIGNAL(IncludeFile(QString)), this, SLOT(FromRingToolbar(QString))); ringTools->addWidget(b1); b1 = new XDC_ToolButton(ringTools, "cyclopentadiene.cml"); b1->setIcon(QIcon(":/icons/cyclopentadiene.svg")); connect(b1, SIGNAL(pressed()), b1, SLOT(trigger())); connect(b1, SIGNAL(IncludeFile(QString)), this, SLOT(FromRingToolbar(QString))); ringTools->addWidget(b1); b1 = new XDC_ToolButton(ringTools, "cyclohexane.cml"); b1->setIcon(QIcon(":/icons/cyclohexane.svg")); connect(b1, SIGNAL(pressed()), b1, SLOT(trigger())); connect(b1, SIGNAL(IncludeFile(QString)), this, SLOT(FromRingToolbar(QString))); ringTools->addWidget(b1); b1 = new XDC_ToolButton(ringTools, "benzene.cml"); b1->setIcon(QIcon(":/icons/benzene.svg")); connect(b1, SIGNAL(pressed()), b1, SLOT(trigger())); connect(b1, SIGNAL(IncludeFile(QString)), this, SLOT(FromRingToolbar(QString))); ringTools->addWidget(b1); /* may have to use these for Qt 4... QAction *cyclopropaneAction = ringTools->addAction( QIcon( ":/icons/cyclopropane.png" ), tr( "Cyclopropane" ), this, SLOT( FromRingToolbar( QString("cyclopropane.cml") ) ) ); QAction *cyclobutaneAction = ringTools->addAction( QIcon( ":/icons/cyclobutane.png" ), tr( "Cyclobutane" ), this, SLOT( FromRingToolbar( QString("cyclobutane.cml") ) ) ); QAction *cyclopentaneAction = ringTools->addAction( QIcon( ":/icons/cyclopentane.png" ), tr( "Cyclopentane" ), this, SLOT( FromRingToolbar( QString("cyclopentane.cml") ) ) ); QAction *cyclopentadieneAction = ringTools->addAction( QIcon( ":/icons/cyclopentadiene.png" ), tr( "Cyclopentadiene" ), this, SLOT( FromRingToolbar( QString("cyclopentadiene.cml") ) ) ); QAction *cyclohexaneAction = ringTools->addAction( QIcon( ":/icons/cyclohexane.png" ), tr( "Cyclohexane" ), this, SLOT( FromRingToolbar( QString("cyclohexane.cml") ) ) ); QAction *ring_chairAction = ringTools->addAction( QIcon( ":/icons/6ring_chair.png" ), tr( "Cyclohexane - chair conformation" ), this, SLOT( FromRingToolbar( QString("6ring_chair.cml") ) ) ); QAction *ring_boatAction = ringTools->addAction( QIcon( ":/icons/6ring_boat.png" ), tr( "Cyclohexane - boat conformation" ), this, SLOT( FromRingToolbar( QString("6ring_boat.cml") ) ) ); QAction *benzeneAction = ringTools->addAction( QIcon( ":/icons/benzene.png" ), tr( "Benzene" ), this, SLOT( FromRingToolbar( QString("benzene.cml") ) ) ); */ /** * BioTools toolbar */ // bioTools = BuildBioTools(); // addToolBar(Qt::RightToolBarArea, bioTools); /** * menus * * file menu */ QMenu *file = menuBar()->addMenu(tr("&File")); file->addAction(tr("&New"), this, SLOT(newDoc()), QKeySequence::New); file->addAction(tr("&Open"), this, SLOT(load()), QKeySequence::Open); file->addAction(tr("&Find on Internet"), this, SLOT(MakeNetDialog()), QKeySequence::Find); file->addAction(tr("&Save"), this, SLOT(save()), QKeySequence::Save); file->addAction(tr("Save &as..."), this, SLOT(saveAs()), QKeySequence::SaveAs); file->addAction(tr("Save picture..."), this, SLOT(savePicture())); // TODO GitLab Issue #59 /* file->addSeparator(); file->addAction(tr("Send to &external program..."), this, SLOT(externalProgram())); */ // TODO GitLab Issue #25 /* file->addSeparator(); file->addAction(tr("Pa&ge setup"), this, SLOT(pageSetup())); */ // TODO GitLab Issue #56 /* file->addAction(tr("&Print"), this, SLOT(print()), QKeySequence::Print); */ file->addSeparator(); file->addAction(tr("Close"), this, SLOT(close()), QKeySequence::Close); file->addAction(tr("&Quit"), qApp, SLOT(closeAllWindows()), QKeySequence::Quit); /** * edit menu */ edit = menuBar()->addMenu(tr("&Edit")); edit->addAction(tr("&Undo"), this, SLOT(Undo()), QKeySequence::Undo); edit->addAction(tr("&Redo"), this, SLOT(Redo()), QKeySequence::Redo); insertSymbolAction = edit->addAction(tr("Insert s&ymbol"), this, SLOT(InsertSymbol())); insertSymbolAction->setVisible(false); edit->addSeparator(); edit->addAction(tr("Cu&t"), this, SLOT(Cut()), QKeySequence::Cut); edit->addAction(tr("&Copy"), this, SLOT(Copy()), QKeySequence::Copy); edit->addAction(tr("&Paste"), this, SLOT(Paste()), QKeySequence::Paste); edit->addAction(tr("Clear"), this, SLOT(Clear()), QKeySequence::Delete); edit->addSeparator(); edit->addAction(tr("Select &All"), this, SLOT(SelectAll()), QKeySequence::SelectAll); edit->addAction(tr("&Deselect All"), this, SLOT(DeselectAll()), QKeySequence::Deselect); QMenu *rotateSub = new QMenu(tr("&Rotate"), this); rotateSub->addAction(tr("Rotate 90 degrees clockwise"), this, SLOT(Rotate90())); rotateSub->addAction(tr("Rotate 180 degrees"), this, SLOT(Rotate180())); rotateSub->addAction(tr("Rotate 90 degrees counterclockwise"), this, SLOT(Rotate270())); QMenu *flipSub = new QMenu(tr("&Flip"), this); flipSub->addAction(tr("Flip &horizontal"), this, SLOT(FlipH())); flipSub->addAction(tr("Flip &vertical"), this, SLOT(FlipV())); QMenu *zoomSub = new QMenu(tr("&Zoom"), this); zoomSub->addAction(tr("Normal (100%)"), this, SLOT(Magnify100()), Qt::CTRL + Qt::Key_0); zoomSub->addAction(tr("Zoom out"), this, SLOT(MagnifyMinus()), QKeySequence::ZoomOut); zoomSub->addAction(tr("Zoom in"), this, SLOT(MagnifyPlus()), QKeySequence::ZoomIn); edit->addMenu(rotateSub); edit->addMenu(flipSub); edit->addSeparator(); edit->addMenu(zoomSub); /** * group menu */ QMenu *groupmenu = menuBar()->addMenu(tr("&Group")); groupmenu->addAction(tr("Select &Reactant"), this, SLOT(setGroup_Reactant())); groupmenu->addAction(tr("Select &Product"), this, SLOT(setGroup_Product())); groupmenu->addAction(tr("Clear &group"), this, SLOT(clearGroup())); groupmenu->addAction(tr("Clear all &groups"), this, SLOT(clearAllGroups())); /** * format menu */ format = menuBar()->addMenu(tr("Forma&t")); fixedBondAction = format->addAction(tr("&Bond - Fixed length and angle"), this, SLOT(setFixed_bond())); fixedBondAction->setCheckable(true); fixedBondAction->setChecked(preferences.getBond_fixed()); fixedArrowAction = format->addAction(tr("&Arrow - Fixed length and angle"), this, SLOT(setFixed_arrow())); fixedArrowAction->setCheckable(true); fixedArrowAction->setChecked(preferences.getArrow_fixed()); format->addSeparator(); format->addAction(tr("Set background &color"), this, SLOT(BackgroundColor())); format->addAction(tr("Toggle &grid"), this, SLOT(toggleGrid()), Qt::CTRL + Qt::Key_G); format->addSeparator(); format->addAction(tr("&Drawing settings..."), this, SLOT(ShowFixedDialog())); format->addAction(tr("&XDC settings..."), this, SLOT(XDCSettings())); /** * tools menu */ QMenu *tools = menuBar()->addMenu(tr("T&ools")); tools->addAction(tr("Clean up molecule"), this, SLOT(CleanUpMolecule())); tools->addAction(tr("Auto &layout"), this, SLOT(AutoLayout()), Qt::CTRL + Qt::Key_L); tools->addAction(tr("Create custom ring"), this, SLOT(saveCustomRing())); tools->addSeparator(); tools->addAction(tr("Molecule information..."), this, SLOT(MoleculeInfo()), Qt::CTRL + Qt::Key_I); tools->addAction(tr("Predict 1H NMR"), this, SLOT(Calc1HNMR())); tools->addAction(tr("Predict 13C NMR"), this, SLOT(Calc13CNMR())); tools->addAction(tr("Predict IR"), this, SLOT(CalcIR())); tools->addAction(tr("Predict pKa"), this, SLOT(CalcpKa())); tools->addAction(tr("Predict octanol-water partition (Kow)"), this, SLOT(CalcKOW())); QMenu *reactionSub = new QMenu(tr("Reaction"), this); reactionSub->addAction(tr("Estimate gas-phase enthalphy change"), this, SLOT(reactionAnalysisEnthalpy())); reactionSub->addAction(tr("Compare 1H NMR"), this, SLOT(reactionAnalysis1HNMR())); reactionSub->addAction(tr("Compare 13C NMR"), this, SLOT(reactionAnalysis13CNMR())); reactionSub->addSeparator(); reactionSub->addAction(tr("Reverse reactions"), this, SLOT(reactivityRetro())); reactionSub->addAction(tr("Get bond identifier"), this, SLOT(RetroBondName())); tools->addMenu(reactionSub); tools->addSeparator(); tools->addAction(tr("Input InChI or SMILES"), this, SLOT(FromSMILES())); tools->addAction(tr("Output SMILES"), this, SLOT(ToSMILES())); tools->addAction(tr("Output InChI"), this, SLOT(ToInChI())); // TODO GitLab Issue #58 // tools->addSeparator(); // tools->addAction(tr("Build 3D model of molecule"), this, SLOT(To3D())); /** * help menu */ QMenu *help = menuBar()->addMenu(tr("&Help")); help->addAction(tr("&Manual"), this, SLOT(NewManual()), QKeySequence::HelpContents); help->addAction(tr("&Did You Know?"), this, SLOT(showDYK())); help->addAction(tr("&About"), this, SLOT(about())); help->addAction(tr("&Support"), this, SLOT(support())); help->addAction(tr("&References"), this, SLOT(Refs())); help->addSeparator(); help->addAction(tr("What's &This"), this, SLOT(whatsThis()), QKeySequence::WhatsThis); /** * create data system */ m_chemData = new ChemData; /// connect (non-Qt) data center and render widget m_renderer->setChemData(m_chemData); m_chemData->setRender2D(m_renderer); connect(m_renderer, SIGNAL(XDCEventSignal(XDC_Event *)), m_chemData, SLOT(XDCEventHandler(XDC_Event *))); // connect m_renderer to application window connect(m_renderer, SIGNAL(textOn(QFont)), SLOT(showTextButtons(QFont))); connect(m_renderer, SIGNAL(TextOff()), SLOT(HideTextButtons())); connect(m_renderer, SIGNAL(SignalSetStatusBar(QString)), SLOT(SetStatusBar(QString))); connect(m_chemData, SIGNAL(SignalSetStatusBar(QString)), SLOT(SetStatusBar(QString))); connect(m_renderer, SIGNAL(SignalHelpTopic(QString)), SLOT(HelpTopic(QString))); connect(m_chemData, SIGNAL(SignalHelpTopic(QString)), SLOT(HelpTopic(QString))); connect(m_chemData, SIGNAL(SignalUpdateCustomRingMenu()), SLOT(updateCustomRingMenu())); statusBar()->showMessage("Ready"); showMaximized(); } // externalProgram() sends to an external program void ApplicationWindow::externalProgram() { // supported programs #define PROGRAM_KRYOMOL 1 #define PROGRAM_GHEMICAL 2 int sendto = 0, qbox, passfail = 0; qbox = QMessageBox::question(this, tr("Send to external program"), tr("This function will open a 3-D version of one molecule\nin an " "external modelling program.\n\nSend to program:"), tr("Ghemical"), tr("KryoMol"), tr("Cancel"), 2); sendto = (qbox + 1) % 3; if (sendto > 0) { QTemporaryDir dir; if (!dir.isValid()) { QMessageBox::critical(this, tr("Send to external program failed"), tr("Could not create temporary directory.")); return; } Molecule *mol = m_chemData->firstMolecule(); if (!mol) { QMessageBox::critical(this, tr("Send to external program failed"), tr("Could not find molecule to send.")); return; } QString exportName = QDateTime::currentDateTime().toString("yyyyMMddhhmm.'m'ol"); exportName = dir.filePath(exportName); qDebug() << "export " << exportName; mol->Make3DVersion(exportName); if (!QFile::exists(exportName)) { QMessageBox::critical(this, tr("Send to external program failed"), tr("Could not save file for external program.")); return; } if (sendto == 1) { qDebug() << "Ghemical: "; exportName.prepend("ghemical "); passfail = system(exportName.toLatin1()); qDebug() << passfail; } if (sendto == 2) { qDebug() << "KryoMol: "; exportName.prepend("kryomol "); passfail = system(exportName.toLatin1()); qDebug() << passfail; } if (passfail != 0) { QMessageBox::critical(this, tr("Send to external program failed"), tr("Could not execute the external program.\nPlease verify " "that it is installed correctly.")); return; } } } QMenu *ApplicationWindow::BuildSymbolMenu() { QMenu *symbolSub = new QMenu(this); QAction *defaultaction = symbolSub->addAction(QIcon(":/icons/sym_plus.png"), tr("Plus sign")); defaultaction->setData("sym_plus"); drawSymbolButton->setDefaultAction(defaultaction); symbolSub->addAction(QIcon(":/icons/sym_minus.png"), tr("Minus sign"))->setData("sym_minus"); symbolSub->addAction(QIcon(":/icons/sym_delta_plus.png"), tr("Delta plus")) ->setData("sym_delta_plus"); symbolSub->addAction(QIcon(":/icons/sym_minus.png"), tr("Delta minus")) ->setData("sym_delta_minus"); symbolSub->addAction(QIcon(":/icons/sym_1e.png"), tr("1e symbol"))->setData("sym_1e"); symbolSub->addAction(QIcon(":/icons/sym_2e.png"), tr("2e symbol"))->setData("sym_2e"); symbolSub->addAction(QIcon(":/icons/sym_2e_line.png"), tr("2e line"))->setData("sym_2e_line"); symbolSub->addAction(QIcon(QPixmap(sym_ring_up_xpm)), tr("Ring up"))->setData("sym_ring_up"); symbolSub->addAction(QIcon(QPixmap(p_orbital_xpm)), tr("Orbital"))->setData("p_orbital"); symbolSub->addAction(QIcon(QPixmap(p_double_xpm)), tr("Double orbital")) ->setData("p_double_orbital"); symbolSub->addAction(QIcon(QPixmap(bead_xpm)), tr("Bead"))->setData("bead"); symbolSub->addAction(QIcon(QPixmap(sym_antibody)), tr("Antibody"))->setData("antibody"); symbolSub->addAction(QIcon(QPixmap(newman_xpm)), tr("Newman projection symbol")) ->setData("newman"); symbolSub ->addAction(QIcon(QPixmap(newman_anti_xpm)), tr("Newman projection - staggered (anti)")) ->setData("newman_anti"); symbolSub->addAction(QIcon(QPixmap(newman_eclipse_xpm)), tr("Newman projection - eclipsed")) ->setData("newman_gauche"); return symbolSub; } QMenu *ApplicationWindow::BuildArrowMenu() { QMenu *arrowSub = new QMenu(this); regularArrowAction = arrowSub->addAction(QIcon(":/icons/regulararrow.svg"), tr("Regular Arrow")); topharpoonArrowAction = arrowSub->addAction(QIcon(":/icons/upharpoonarrow.svg"), tr("Top harpoon")); bottomharpoonAction = arrowSub->addAction(QIcon(":/icons/downharpoonarrow.svg"), tr("Bottom harpoon")); middleArrowAction = arrowSub->addAction(QIcon(":/icons/middlearrow.svg"), tr("Middle")); didntworkArrowAction = arrowSub->addAction(QIcon(":/icons/negationarrow.svg"), tr("Did not work")); dashedArrowAction = arrowSub->addAction(QIcon(":/icons/dashedarrow.svg"), tr("Dashed arrow")); bi1ArrowAction = arrowSub->addAction(QIcon(":/icons/bidirectionalarrow1.svg"), tr("BI1 arrow")); bi2ArrowAction = arrowSub->addAction(QIcon(":/icons/bidirectionalarrow2.svg"), tr("BI2 arrow")); retroArrowAction = arrowSub->addAction(QIcon(":/icons/retrosynthesisarrow.svg"), tr("Retro arrow")); return arrowSub; } QMenu *ApplicationWindow::BuildCurveArrowMenu() { QMenu *arrowSub = new QMenu(this); carrowCW90Action = arrowSub->addAction(QIcon(":/icons/clockwise90arrow.svg"), tr("90° cw")); carrowCCW90Action = arrowSub->addAction(QIcon(":/icons/counterclockwise90arrow.svg"), tr("90° ccw")); carrowCW180Action = arrowSub->addAction(QIcon(":/icons/clockwise180arrow.svg"), tr("180° cw")); carrowCCW180Action = arrowSub->addAction(QIcon(":/icons/counterclockwise180arrow.svg"), tr("180° ccw")); carrowCW270Action = arrowSub->addAction(QIcon(":/icons/clockwise270arrow.svg"), tr("270° cw")); carrowCCW270Action = arrowSub->addAction(QIcon(":/icons/counterclockwise270arrow.svg"), tr("270° ccw")); // TODO Implement these actions (GitLab Issue #27) // carrowBezierAction = arrowSub->addAction(QIcon(QPixmap(cbezier_xpm)), tr("Cubic bezier")); // carrowBezierhalfAction = // arrowSub->addAction(QIcon(QPixmap(cbezierhalf_xpm)), tr("Cubic bezier - half arrow")); // carrowBezierfullAction = // arrowSub->addAction(QIcon(QPixmap(cbezierfull_xpm)), tr("Cubic bezier - full arrow")); return arrowSub; } QMenu *ApplicationWindow::BuildBracketMenu() { QMenu *bracketSub = new QMenu(this); squareBracketAction = bracketSub->addAction(QIcon(QPixmap(squarebracket_xpm)), tr("Square bracket")); curveBracketAction = bracketSub->addAction(QIcon(QPixmap(curvebracket_xpm)), tr("Curve bracket")); braceBracketAction = bracketSub->addAction(QIcon(QPixmap(bracebracket_xpm)), tr("Brace bracket")); boxBracketAction = bracketSub->addAction(QIcon(QPixmap(boxbracket_xpm)), tr("Box bracket")); ellipseBracketAction = bracketSub->addAction(QIcon(QPixmap(ellipsebracket_xpm)), tr("Ellipse bracket")); closedsquareBracketAction = bracketSub->addAction(QIcon(QPixmap(closedsquarebracket_xpm)), tr("Closed square bracket")); circleBracketAction = bracketSub->addAction(QIcon(QPixmap(circlebracket_xpm)), tr("Circle bracket")); return bracketSub; } // loads custom rings. void ApplicationWindow::FromRingMenu(int x) { m_chemData->StartUndo(0, 0); m_chemData->DeselectAll(); /// TODO m_chemData->SetTopLeft(sa->viewportToContents(QPoint(0,0))); QString fname(ringlist[x]); fname.replace(fname.length() - 3, 3, QString("cml")); m_chemData->load(preferences.getCustomRingDir() + fname); m_renderer->Inserted(); } void ApplicationWindow::updateCustomRingMenu() { ringMenu->removeAction(customRingMenuAction); QMenu *customMenu = BuildCustomRingMenu(); ringMenu->addMenu(customMenu); customRingMenuAction = customMenu->menuAction(); } void ApplicationWindow::FromRingToolbar(QString fi) { qDebug() << QString("FromRingToolbar:") << fi; m_chemData->DeselectAll(); if (fi.contains("6ring") > 0) { m_renderer->setMode_DrawRing(":/ring_cml/" + fi, fi.left(fi.length() - 4)); return; } m_renderer->setMode_DrawRing(":/ring_cml/" + fi, fi.left(fi.length() - 4), 1); } void ApplicationWindow::setSymbolAction(QAction *action) { drawSymbolButton->setDefaultAction(action); m_renderer->setMode_DrawSymbol(action->data().toString()); } void ApplicationWindow::FromArrowMenu(QAction *action) { if (action == regularArrowAction) { m_renderer->setMode_DrawArrow(regularArrow); } else if (action == topharpoonArrowAction) { m_renderer->setMode_DrawArrow(topharpoonArrow); } else if (action == bottomharpoonAction) { m_renderer->setMode_DrawArrow(bottomharpoonArrow); } else if (action == middleArrowAction) { m_renderer->setMode_DrawArrow(middleArrow); } else if (action == didntworkArrowAction) { m_renderer->setMode_DrawArrow(didntworkArrow); } else if (action == dashedArrowAction) { m_renderer->setMode_DrawArrow(dashedArrow); } else if (action == bi1ArrowAction) { m_renderer->setMode_DrawArrow(bi1Arrow); } else if (action == bi2ArrowAction) { m_renderer->setMode_DrawArrow(bi2Arrow); } else if (action == retroArrowAction) { m_renderer->setMode_DrawArrow(retroArrow); } else { qDebug() << "unknown action"; } } void ApplicationWindow::setRegularArrowAction(QAction *action) { drawArrowButton->setDefaultAction(action); FromArrowMenu(action); } void ApplicationWindow::FromCurveArrowMenu(QAction *action) { if (action == carrowCW90Action) { m_renderer->setMode_DrawCurveArrow(cw90Arrow); } else if (action == carrowCCW90Action) { m_renderer->setMode_DrawCurveArrow(ccw90Arrow); } else if (action == carrowCW180Action) { m_renderer->setMode_DrawCurveArrow(cw180Arrow); } else if (action == carrowCCW180Action) { m_renderer->setMode_DrawCurveArrow(ccw180Arrow); } else if (action == carrowCW270Action) { m_renderer->setMode_DrawCurveArrow(cw270Arrow); } else if (action == carrowCCW270Action) { m_renderer->setMode_DrawCurveArrow(ccw270Arrow); } else if (action == carrowBezierAction) { m_renderer->setMode_DrawGraphicObject(TYPE_BEZIER, 0); } else if (action == carrowBezierhalfAction) { m_renderer->setMode_DrawGraphicObject(TYPE_BEZIER, 1); } else if (action == carrowBezierfullAction) { m_renderer->setMode_DrawGraphicObject(TYPE_BEZIER, 2); } else { qDebug() << "unknown action"; } } void ApplicationWindow::setCurveArrowAction(QAction *action) { drawCurveArrowButton->setDefaultAction(action); FromCurveArrowMenu(action); } void ApplicationWindow::FromBracketMenu(QAction *action) { if (action == squareBracketAction) { m_renderer->setMode_DrawBracket(squareBracket); } else if (action == curveBracketAction) { m_renderer->setMode_DrawBracket(curveBracket); } else if (action == braceBracketAction) { m_renderer->setMode_DrawBracket(braceBracket); } else if (action == boxBracketAction) { m_renderer->setMode_DrawBracket(boxBracket); } else if (action == ellipseBracketAction) { m_renderer->setMode_DrawBracket(ellipseBracket); } else if (action == closedsquareBracketAction) { m_renderer->setMode_DrawBracket(closedsquareBracket); } else if (action == circleBracketAction) { m_renderer->setMode_DrawBracket(circleBracket); } else { qDebug() << "unknown Action"; } } void ApplicationWindow::setBracketAction(QAction *action) { if (action == squareBracketAction) { m_renderer->setMode_DrawBracket(squareBracket); drawBracketButton->setDefaultAction(squareBracketAction); drawBracketButton->setIcon(QIcon(QPixmap(squarebracket_xpm))); } else if (action == curveBracketAction) { m_renderer->setMode_DrawBracket(curveBracket); drawBracketButton->setDefaultAction(curveBracketAction); drawBracketButton->setIcon(QIcon(QPixmap(curvebracket_xpm))); } else if (action == braceBracketAction) { m_renderer->setMode_DrawBracket(braceBracket); drawBracketButton->setDefaultAction(braceBracketAction); drawBracketButton->setIcon(QIcon(QPixmap(bracebracket_xpm))); } else if (action == boxBracketAction) { m_renderer->setMode_DrawBracket(boxBracket); drawBracketButton->setDefaultAction(boxBracketAction); drawBracketButton->setIcon(QIcon(QPixmap(boxbracket_xpm))); } else if (action == ellipseBracketAction) { m_renderer->setMode_DrawBracket(ellipseBracket); drawBracketButton->setDefaultAction(ellipseBracketAction); drawBracketButton->setIcon(QIcon(QPixmap(ellipsebracket_xpm))); } else if (action == closedsquareBracketAction) { m_renderer->setMode_DrawBracket(closedsquareBracket); drawBracketButton->setDefaultAction(closedsquareBracketAction); drawBracketButton->setIcon(QIcon(QPixmap(closedsquarebracket_xpm))); } else if (action == circleBracketAction) { m_renderer->setMode_DrawBracket(circleBracket); drawBracketButton->setDefaultAction(circleBracketAction); drawBracketButton->setIcon(QIcon(QPixmap(circlebracket_xpm))); } else { qDebug() << "unknown Action"; } } void ApplicationWindow::setFixed_arrow() { if (fixedArrowAction->isChecked()) { fixedArrowAction->setChecked(false); preferences.setArrow_fixed(false); } else { fixedArrowAction->setChecked(true); preferences.setArrow_fixed(true); } } void ApplicationWindow::setFixed_bond() { if (fixedBondAction->isChecked()) { fixedBondAction->setChecked(false); preferences.setBond_fixed(false); } else { fixedBondAction->setChecked(true); preferences.setBond_fixed(true); } } /* void ApplicationWindow::setFix_Hydrogens() { if ( format->isItemChecked( fix_hydrogens ) ) { format->setItemChecked( fix_hydrogens, false ); preferences.setFixHydrogens( false ); } else { format->setItemChecked( fix_hydrogens, true ); preferences.setFixHydrogens( true ); } } */ ApplicationWindow::~ApplicationWindow() { delete printer; delete m_chemData; } void ApplicationWindow::SetColor(int m) { if (m == 0) m_renderer->SetColor(QColor(0, 0, 0)); if (m == 1) m_renderer->SetColor(QColor(127, 0, 0)); if (m == 2) m_renderer->SetColor(QColor(0, 127, 0)); if (m == 3) m_renderer->SetColor(QColor(0, 0, 127)); } void ApplicationWindow::SetThick(int t) { m_renderer->SetThick(t + 1); } void ApplicationWindow::showTextButtons(QFont infont) { insertSymbolAction->setVisible(true); justifyLeftAction->setVisible(true); justifyCenterAction->setVisible(true); justifyRightAction->setVisible(true); boldAction->setVisible(true); italicAction->setVisible(true); underlineAction->setVisible(true); superscriptAction->setVisible(true); subscriptAction->setVisible(true); fontSizeList->setEditText(QString::number(infont.pointSize())); } void ApplicationWindow::HideTextButtons() { insertSymbolAction->setVisible(false); justifyLeftAction->setVisible(false); justifyCenterAction->setVisible(false); justifyRightAction->setVisible(false); boldAction->setVisible(false); italicAction->setVisible(false); underlineAction->setVisible(false); superscriptAction->setVisible(false); subscriptAction->setVisible(false); // set font combo boxes to object font (passed as infont) // set font combo boxes to current font QFont infont = m_renderer->GetFont(); fontSizeList->setEditText(QString::number(infont.pointSize())); } void ApplicationWindow::newDoc() { ApplicationWindow *ed = new ApplicationWindow; // Share clipboard ed->setClipboard(m_renderer->getClipboard()); ed->show(); ed->HideTextButtons(); } void ApplicationWindow::load() { OBImport(); return; /* DELETE ME QFileDialog fd(QString(), QString(), 0, 0, TRUE); fd.setWindowTitle("Load file"); fd.setMode(QFileDialog::ExistingFile); QStringList filters; filters.append("All files (*)"); filters.append("XDrawChem native (*.xdc)"); filters.append("MDL Molfile (*.mol)"); filters.append("CML - Chemical Markup Language (*.cml)"); fd.setFilters(filters); if ( fd.exec() == QDialog::Accepted ) load( fd.selectedFile() ); */ } void ApplicationWindow::load(QString fileName) { OBNewLoad(fileName, "--Select a filter-- (*)"); return; // // fix me // to use OpenBabel // /* QString realFileName = fileName; QFile f(fileName); if ( !f.open(IO_ReadOnly) ) { QMessageBox::warning(0, tr("Couldn't open file"), tr("Could not open the file: ") + fileName); statusBar()->showMessage(tr("Unable to load ") + fileName); return; } f.close(); SelectAll(); Clear(); if ( !m_chemData->load(fileName) ) { statusBar()->showMessage(tr("Unable to load ") + fileName); return; } fileName = realFileName; setWindowTitle( QString(XDC_VERSION) + QString(" - ") + fileName ); statusBar()->showMessage( tr("Loaded document ") + fileName ); filename = fileName; m_chemData->DeselectAll(); m_renderer->update(); */ } void ApplicationWindow::save() { if (filename.isEmpty()) { OBExport(); } else { OBNewSave(); } } void ApplicationWindow::saveAs() { OBExport(); return; } void ApplicationWindow::savePicture() { int pm = 0; bool was_saved = false; QStringList picFiles; QString selectedFile; MyFileDialog fd(0); fd.setWindowTitle(tr("Save as picture...")); fd.setFileMode(QFileDialog::AnyFile); QStringList picfilters; picfilters.append("Portable Network Graphic (*.png)"); picfilters.append("Windows Bitmap (*.bmp)"); picfilters.append("Encapsulated PostScript (*.eps)"); picfilters.append("Scalable Vector Graphics (*.svg)"); fd.setNameFilters(picfilters); if (fd.exec() == QDialog::Accepted) { picFiles = fd.selectedFiles(); if (!picFiles.isEmpty()) selectedFile = picFiles.at(0); QString tmpx = selectedFile.right(4).toLower(); if (tmpx == QString(".png")) pm = 1; if (tmpx == QString(".bmp")) pm = 2; if (tmpx == QString(".svg")) pm = 3; if ((tmpx != QString(".png")) && (tmpx != QString(".bmp")) && (tmpx != QString(".svg")) && (tmpx != QString(".eps"))) { if (fd.selectedNameFilter().left(3) == QString("Por")) { selectedFile.append(".png"); pm = 1; } if (fd.selectedNameFilter().left(3) == QString("Win")) { selectedFile.append(".bmp"); pm = 2; } if (fd.selectedNameFilter().left(3) == QString("Enc")) { selectedFile.append(".eps"); } if (fd.selectedNameFilter().left(3) == QString("Sca")) { selectedFile.append(".svg"); pm = 3; } } if (pm == 3) { // save as Scalable Vector Graphics was_saved = m_renderer->SaveSVG(selectedFile); if (was_saved) statusBar()->showMessage(tr("Saved picture file ") + selectedFile); else statusBar()->showMessage(tr("Unable to save picture!")); return; } if (pm != 0) { QPixmap tosave = m_renderer->MakePixmap(fd.isTransparent()); if (pm == 1) // PNG was_saved = tosave.save(selectedFile, "PNG"); if (pm == 2) // BMP was_saved = tosave.save(selectedFile, "BMP"); if (was_saved) statusBar()->showMessage(tr("Saved picture file ") + selectedFile); else statusBar()->showMessage(tr("Unable to save picture!")); } else { // save as EPS was_saved = m_renderer->SaveEPS(selectedFile); if (was_saved) statusBar()->showMessage(tr("Saved picture file ") + selectedFile); else statusBar()->showMessage(tr("Unable to save picture!")); } } } void ApplicationWindow::savePNG() { bool was_saved; QPixmap tosave; tosave = m_renderer->MakePixmap(ni_tflag); was_saved = tosave.save(ni_savefile, "PNG"); // QPixmap tosave = m_renderer->MakePixmap( ni_tflag ); // was_saved = tosave.save(ni_savefile, "PNG"); if (was_saved == false) { qWarning() << "save PNG failed for " << ni_savefile; } close(); // this function is only used in non-interactive mode } void ApplicationWindow::save3D() { // bool was_saved; m_chemData->Save3D(ni_savefile); close(); // this function is only used in non-interactive mode } void ApplicationWindow::print() { m_renderer->Print(); } void ApplicationWindow::closeEvent(QCloseEvent *ce) { if (!m_chemData->edited()) { ce->accept(); return; } switch (QMessageBox::information(this, tr("Save before closing?"), tr("The document has been changed since the last save."), "Save Now", "Cancel", "Leave Anyway", 0, 1)) { case 0: save(); ce->accept(); break; case 1: default: // just for sanity ce->ignore(); break; case 2: ce->accept(); break; } } void ApplicationWindow::about() { QMessageBox::about(this, XDC_VERSION, QString(XDC_VERSION) + tr("\nBryan Herger\nbherger@users.sourceforge.net\n\nPlease " "subscribe to the mailing list for information about future " "releases.\nSend a message to " "xdrawchem-announce-request@lists.sourceforge.net with " "'subscribe' as the subject.\n\nXDrawChem is copyright (C) 2004 " "Bryan Herger.\nPortions copyright (C) 1997-2000 Dr. Christoph " "Steinbeck and the JChemPaint project\nOpenBabel code copyright " "(C) 2003 by the OpenBabel project team.\nSee file " "COPYRIGHT.txt for more details")); } void ApplicationWindow::support() { QMessageBox::information( 0, tr("How to get help"), tr("Current information on XDrawChem can always be found " "at\nhttp://xdrawchem.sourceforge.net/\nThe latest release will be " "posted here, as well as links to mailing lists and the bug " "tracker.\n\nPlease submit bugs using the SourceForge tracker: " "http://www.sourceforge.net/tracker/?group_id=34518\n\nThere are " "two mailing lists: xdrawchem-announce, where new releases will be " "announced,\nand xdrawchem-user, for open discussion among " "XDrawChem users.\nSubscribe by sending a blank e-mail with subject " "\"subscribe\" to " "\n\"xdrawchem-announce-request@lists.sourceforge.net\" " "or\n\"xdrawchem-user-request@lists.sourceforge.net\"\n\nYou can " "contact the author directly at\nbherger@users.sourceforge.net")); } void ApplicationWindow::whatsThis() { QWhatsThis::enterWhatsThisMode(); } const char *reflist = "Krause S, Willighagen E, Steinbeck C, " "\"JChemPaint - Using the Collaborative Forces of the Internet\nto Develop " "a Free Editor for 2D Chemical Structures\", Molecules 5:93-98\n\n" "Bremser W, \"HOSE - A Novel Substructure Code\", Anal. Chim. Acta 103:" "355-365\n\n" "Bremser W, \"Expectation Ranges of 13C NMR Chemical Shifts\", " "Mag. Res. Chem. 23(4):271-275\n\n" "Weininger D, \"SMILES, a Chemical Language and Information System. 1. " "Introduction to Methodology and Encoding Rules\",\nJ. Chem. Inf. Comput. " "Sci. 28:31-36\n\n" "Figueras J, \"Ring Perception Using Breadth-First Search\", J. Chem. Inf. " "Comput Sci. 36:986-991\n\n" "Ugi I et al., Journal of Chemical research (M), 1991, 2601-2689\n\n" "Pauling, L. \"The Nature of the Chemical Bond\", 3ed., 1960, Cornell " "University Press\n\n" "Pretsch, Clerc, Seibl, Simon. \"Tables of Spectral Data for Structure " "Determination of Organic Compounds\", 2ed., 1989, Springer-Verlag\n\n" "Lin S and Sandler SI, J. Phys. Chem. A, 2000, vol. 104, 7099-7105\n\n" "Steinbeck C, JMDraw (software), http://jmdraw.sourceforge.net/\n\n" "Molecules in the XDrawChem database are from the NCI Open Database, " "October 1999 release: http://cactvs.cit.nih.gov/"; void ApplicationWindow::Refs() { QMessageBox::about(this, "XDrawChem References", reflist); } void ApplicationWindow::SetStatusBar(const QString &s) { statusBar()->showMessage(s); } /* obsolete. void ApplicationWindow::MakeRingDialog() { RingDialog t(this, "ring dialog"); if ( !t.exec() ) return; m_chemData->StartUndo(0,0); m_chemData->DeselectAll(); m_chemData->SetTopLeft(sv->viewportToContents(QPoint(0,0))); m_chemData->load( RingDir + t.getFile() ); m_renderer->Inserted(); } */ void ApplicationWindow::ShowFixedDialog() { FixedDialog fixedDialog(this); if (!fixedDialog.exec()) return; hruler->update(); vruler->update(); /* na = i.getAngle_arrow(); nl = i.getLength_arrow(); if (na < 0.0) return; if (nl < 0.0) return; preferences.setArrow_fixedangle(na); preferences.setArrow_fixedlength(nl); na = i.getAngle_bond(); nl = i.getLength_bond(); if (na < 0.0) return; if (nl < 0.0) return; preferences.setBond_fixedangle(na); preferences.setBond_fixedlength(nl); na = i.getDoubleBondOffset(); if (na < 0.0) return; preferences.setDoubleBondOffset(na); */ } /* void ApplicationWindow::MakeNetDialog() { netDlg = new NetDialog( this ); if ( !netDlg->exec() ) return; qDebug() << "Server:" << netDlg->getServer(); qDebug() << "Key :" << netDlg->getKey(); qDebug() << "Value :" << netDlg->getValue(); NetAccess *na = new NetAccess(); connect( na, SIGNAL( choicesFinished( const QStringList & ) ), this, SLOT( slotChoicesFinished( const QStringList & ) ) ); setCursor( Qt::WaitCursor ); m_renderer->setWaitCursor(); na->getChoices( netDlg->getServer(), netDlg->getKey(), netDlg->getValue(), netDlg->getExact() ); } */ void ApplicationWindow::MakeNetDialog() { NetDialog n(this); if (!n.exec()) return; // cout << "Server:" << n.getServer() << Qt::endl; // cout << "Key :" << n.getKey() << Qt::endl; // cout << "Value :" << n.getValue() << Qt::endl; NetAccess na; setCursor(Qt::WaitCursor); m_renderer->setWaitCursor(); QStringList choices = na.getChoices(n.getServer(), n.getKey(), n.getValue(), n.getExact()); setCursor(Qt::ArrowCursor); m_renderer->setArrowCursor(); if (choices.count() == 0) { QMessageBox::warning(this, tr("Database query failed"), tr("No molecules in the database match the query.")); return; } /* if (choices.count() == 1) { int i1 = choices[0].find("|"); QString subfile = choices[0].left(i1) + ".mol"; QString wf = na.getFile(n.getServer(), subfile); c->DeselectAll(); c->SetTopLeft(sv->viewportToContents(QPoint(0,0))); c->ProcessMDL(wf); r->Inserted(); return; } */ NetChooseDialog nc(this, choices); if (!nc.exec()) return; // cout << nc.getFile() << Qt::endl; // TODO: insert SMILES string returned by database m_chemData->fromSMILES(nc.getFile()); m_renderer->Inserted(); m_renderer->update(); /* if (nc.getFile().contains(".mol")) { c->DeselectAll(); c->SetTopLeft(sv->viewportToContents(QPoint(0,0))); c->ProcessMDL(wf); r->Inserted(); return; } */ } void ApplicationWindow::slotChoicesFinished(const QStringList &choices) { qDebug() << "slotChoicesFinished"; setCursor(Qt::ArrowCursor); m_renderer->setArrowCursor(); if (choices.count() == 0) { QMessageBox::warning(this, tr("Database query failed"), tr("No molecules in the database match the query.")); return; } /* if (choices.count() == 1) { int i1 = choices[0].find("|"); QString subfile = choices[0].left(i1) + ".mol"; QString wf = na.getFile(n.getServer(), subfile); m_chemData->DeselectAll(); m_chemData->SetTopLeft(sv->viewportToContents(QPoint(0,0))); m_chemData->ProcessMDL(wf); m_renderer->Inserted(); return; } */ NetChooseDialog nc(this, choices); if (!nc.exec()) return; qDebug() << nc.getFile(); // TODO: insert SMILES string returned by database m_chemData->fromSMILES(nc.getFile()); m_renderer->Inserted(); m_renderer->update(); /* if (nc.getFile().contains(".mol")) { m_chemData->DeselectAll(); m_chemData->SetTopLeft(sv->viewportToContents(QPoint(0,0))); m_chemData->ProcessMDL(wf); m_renderer->Inserted(); return; } */ } void ApplicationWindow::pageSetup() { PageSetupDialog p(this); // p.setPageSize(preferences.getPageSize()); // p.setOrientation(preferences.getPageOrientation()); if (!p.exec()) return; // preferences.setPageSize(p.getPageSize()); // preferences.setPageOrientation(p.getOrientation()); m_renderer->UpdatePageGeometry(); } void ApplicationWindow::NewColor() { QColor newColor = QColorDialog::getColor(m_renderer->GetColor()); if (newColor.isValid()) { m_renderer->SetColor(newColor); colorBtn->setColor(newColor); } } void ApplicationWindow::BackgroundColor() { QColor nc1 = QColorDialog::getColor(m_renderer->getBGColor()); if (nc1.isValid()) { m_renderer->setBGColor(nc1); m_renderer->update(); } } // peptide builder void ApplicationWindow::PeptideBuilder() { PeptDialog p1(this); if (!p1.exec()) return; QString seq1 = p1.getPeptide(); qDebug() << "peptide: " << seq1; } // help from help menu void ApplicationWindow::NewManual() { QString home; #ifdef UNIX home = QDir(RINGHOME).filePath("doc/index.html"); #else home = QDir(RINGHOME).filePath("doc\\index.html"); #endif HelpBrowser(QString(home)); } // invoke context-sensitive help void ApplicationWindow::HelpTopic(QString topic) { QString home; #ifdef UNIX home = QDir(RINGHOME).filePath("doc/" + topic); #else home = QDir(RINGHOME).filePath("doc\\" + topic); #endif HelpBrowser(QString(home)); } // new manual (based on QTextBrowser) -- derived from Qt example "helpviewer" // Copyright (C) 1992-2000 Trolltech AS. All rights reserved. void ApplicationWindow::HelpBrowser(QString home) { HelpWindow *help = new HelpWindow(home, ".", 0); help->setWindowTitle(QString(XDC_VERSION) + " - Help viewer"); if (QApplication::desktop()->width() > 400 && QApplication::desktop()->height() > 500) help->show(); else help->showMaximized(); } // end code covered by "helpviewer" example copyright // pass thru to Render2D void ApplicationWindow::Cut() { m_renderer->Cut(); } void ApplicationWindow::Copy() { m_renderer->Copy(); } void ApplicationWindow::Paste() { m_renderer->Paste(); } void ApplicationWindow::Undo() { m_renderer->Undo(); } void ApplicationWindow::Redo() { m_renderer->Redo(); } void ApplicationWindow::FlipH() { m_renderer->Flip(FLIP_H); } void ApplicationWindow::FlipV() { m_renderer->Flip(FLIP_V); } void ApplicationWindow::Rotate90() { m_renderer->Rotate90(); } void ApplicationWindow::Rotate180() { m_renderer->Rotate180(); } void ApplicationWindow::Rotate270() { m_renderer->Rotate270(); } void ApplicationWindow::Clear() { m_renderer->EraseSelected(); } void ApplicationWindow::MoleculeInfo() { m_renderer->Tool(MODE_TOOL_MOLECULE_INFO); } void ApplicationWindow::CalcEA() { m_renderer->Tool(MODE_TOOL_CALCEA); } void ApplicationWindow::CalcEF() { m_renderer->Tool(MODE_TOOL_CALCEF); } void ApplicationWindow::CalcMW() { m_renderer->Tool(MODE_TOOL_CALCMW); } void ApplicationWindow::Calc13CNMR() { m_renderer->Tool(MODE_TOOL_13CNMR); } void ApplicationWindow::Calc1HNMR() { m_renderer->Tool(MODE_TOOL_1HNMR); } void ApplicationWindow::CalcIR() { m_renderer->Tool(MODE_TOOL_IR); } void ApplicationWindow::CalcpKa() { m_renderer->Tool(MODE_TOOL_PKA); } void ApplicationWindow::CalcKOW() { m_renderer->Tool(MODE_TOOL_KOW); } void ApplicationWindow::CalcName() { m_renderer->Tool(MODE_TOOL_NAME); } void ApplicationWindow::ToSMILES() { m_renderer->Tool(MODE_TOOL_TOSMILES); } void ApplicationWindow::ToInChI() { m_renderer->Tool(MODE_TOOL_TOINCHI); } void ApplicationWindow::To3D() { m_renderer->Tool(MODE_TOOL_2D3D); } void ApplicationWindow::CleanUpMolecule() { m_renderer->Tool(MODE_TOOL_CLEANUPMOL); } void ApplicationWindow::saveCustomRing() { m_renderer->Tool(MODE_TOOL_CUSTOMRING); } void ApplicationWindow::SelectAll() { m_renderer->SelectAll(); } void ApplicationWindow::DeselectAll() { m_renderer->DeselectAll(); } void ApplicationWindow::AutoLayout() { m_renderer->AutoLayout(); } void ApplicationWindow::DrawRegularArrow() { m_renderer->setMode_DrawArrow(regularArrow); } void ApplicationWindow::DrawSquareBracket() { m_renderer->setMode_DrawBracket(squareBracket); } void ApplicationWindow::CubicBezierTool(int x) { qDebug() << "Bezier:" << x - 6; m_renderer->setMode_DrawGraphicObject(TYPE_BEZIER, x - 6); } void ApplicationWindow::setClipboard(Clipboard *clip1) { m_renderer->setClipboard(clip1); } void ApplicationWindow::setGroup_Reactant() { m_renderer->Tool(MODE_TOOL_GROUP_REACTANT); } void ApplicationWindow::setGroup_Product() { m_renderer->Tool(MODE_TOOL_GROUP_PRODUCT); } void ApplicationWindow::clearGroup() { m_renderer->Tool(MODE_TOOL_GROUP_CLEAR); } void ApplicationWindow::Retro() { m_renderer->Tool(MODE_TOOL_RETRO); } void ApplicationWindow::RetroAtomName() { m_renderer->Tool(MODE_TOOL_RETRO_ATOMNAME); } void ApplicationWindow::RetroBondName() { m_renderer->Tool(MODE_TOOL_RETRO_BONDNAME); } void ApplicationWindow::InsertSymbol() { m_renderer->InsertSymbol(); } void ApplicationWindow::Test() { CharSelDialog cd1(this); cd1.exec(); // m_renderer->Tool(MODE_TOOL_TEST); } void ApplicationWindow::clearAllGroups() { m_renderer->clearAllGroups(); } void ApplicationWindow::reactionAnalysisTest() { m_renderer->ReactionAnalysis(RXN_TEST); } void ApplicationWindow::reactionAnalysisEnthalpy() { m_renderer->ReactionAnalysis(RXN_ENTHALPY_ESTIMATE); } void ApplicationWindow::reactionAnalysis1HNMR() { m_renderer->ReactionAnalysis(RXN_1HNMR); } void ApplicationWindow::reactionAnalysis13CNMR() { m_renderer->ReactionAnalysis(RXN_13CNMR); } void ApplicationWindow::reactivityForward() { m_renderer->Tool(MODE_TOOL_REACTIVITY_FORWARD); } void ApplicationWindow::reactivityRetro() { m_renderer->Tool(MODE_TOOL_REACTIVITY_RETRO); } void ApplicationWindow::reactivityPC() { m_renderer->Tool(MODE_TOOL_CHARGES); } void ApplicationWindow::toggleGrid() { int i1; i1 = preferences.getDrawGrid(); i1++; if (i1 > 2) i1 = 0; preferences.setDrawGrid(i1); m_renderer->createGrid(); m_renderer->update(); } void ApplicationWindow::svXY(int x1, int y1) { hruler->setRange(x1, x1 + m_centralWidget->width()); hruler->update(); vruler->setRange(y1, y1 + m_centralWidget->height()); vruler->update(); } void ApplicationWindow::zoomEvent(QWheelEvent *e) { if (e->angleDelta().y() > 0) { MagnifyPlus(); } else { MagnifyMinus(); } } bool ApplicationWindow::eventFilter(QObject * /*obj*/, QEvent *e) { if (e->type() == QEvent::Wheel && (QApplication::keyboardModifiers() & Qt::ControlModifier)) { zoomEvent(static_cast(e)); e->accept(); return true; } return false; } void ApplicationWindow::showDYK() { DYKDialog dyk1; dyk1.exec(); } void ApplicationWindow::MagnifyPlus() { Zoom(std::min(preferences.getZoom() + 25, 500)); } void ApplicationWindow::MagnifyMinus() { Zoom(std::max(preferences.getZoom() - 25, 25)); } void ApplicationWindow::Magnify100() { Zoom(100); } void ApplicationWindow::Zoom(int zoom_level) { preferences.setZoom(zoom_level); m_renderer->zoomEvent(); hruler->zoomEvent(); vruler->zoomEvent(); SetStatusBar(tr("Zoom = %1 %").arg(preferences.getZoom())); } void ApplicationWindow::XDCSettings() { bool ok; QFont font; switch (QMessageBox::information(this, tr("XDC Settings"), tr("Change XDrawChem settings:"), tr("&Main font"), tr("&Ruler font"), tr("Cancel"), 2, // Enter == button 2 2)) { // Escape == button 2 case 0: font = QFontDialog::getFont(&ok, preferences.getMainFont(), this); if (ok) { preferences.setMainFont(font); setFont(font); update(); } else { return; } break; case 1: font = QFontDialog::getFont(&ok, preferences.getRulerFont(), this); if (ok) { preferences.setRulerFont(font); // setFont(font); hruler->update(); vruler->update(); update(); } else { return; } break; case 2: return; break; } } void ApplicationWindow::setFontFace(const QFont &newfont) { qDebug() << "FontFace: " << newfont; m_renderer->SetFont(newfont); } void ApplicationWindow::setFontPoints(const QString &fn1) { qDebug() << "FontPoints: " << fn1; fontSizeList->removeItem(7); // 7 default options so delete anything more than that fontSizeList->setEditText(fn1); // QFont newfont = m_renderer->GetFont(); // newfont.setPointSizeF(fn1.toDouble()); // m_renderer->SetFont(newfont); } // cmake#include "application.moc" xdrawchem-v1.11.0/xdrawchem/application.h000066400000000000000000000163751371466245600204320ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef APPLICATION_H #define APPLICATION_H #include #include #include #include #include #include #include #include #include #include #include #include class RenderArea; class Render2D; class ChemData; class Clipboard; class Clipboard; class XRuler; class NetDialog; class ColorButton; class ApplicationWindow : public QMainWindow { Q_OBJECT public: ApplicationWindow(); ~ApplicationWindow(); QString ni_savefile; bool ni_tflag; protected: void closeEvent(QCloseEvent *); bool eventFilter(QObject * /*obj*/, QEvent *e); public slots: void newDoc(); void load(); void load(QString); void save(); void saveAs(); void savePicture(); void externalProgram(); void savePNG(); void save3D(); void pageSetup(); void print(); // void MakeRingDialog(); *** obsolete. removed. void MakeNetDialog(); void slotChoicesFinished(const QStringList &); void ShowFixedDialog(); void showDYK(); void Cut(); void Copy(); void Paste(); void Undo(); void Redo(); void Clear(); void SelectAll(); void DeselectAll(); void showTextButtons(QFont); void HideTextButtons(); void SetStatusBar(const QString &); // void setRenderFont(); void SetColor(int); void NewColor(); void BackgroundColor(); void SetThick(int); void FromRingMenu(int); // void FromNewRingMenu( QString ); // in application_ring.cpp void FromRingToolbar(QString); void FromArrowMenu(QAction *); void FromCurveArrowMenu(QAction *); void FromBracketMenu(QAction *); void CubicBezierTool(int); void FlipH(); void FlipV(); void Rotate90(); void Rotate180(); void Rotate270(); void setFixed_arrow(); void setFixed_bond(); // void setFix_Hydrogens(); void MoleculeInfo(); void CalcEA(); void CalcEF(); void CalcMW(); void Calc13CNMR(); void Calc1HNMR(); void CalcIR(); void CalcpKa(); void CalcKOW(); void To3D(); void CalcName(); void AutoLayout(); void PeptideBuilder(); void saveCustomRing(); void updateCustomRingMenu(); void DrawRegularArrow(); void DrawSquareBracket(); void CleanUpMolecule(); void Retro(); void RetroAtomName(); void RetroBondName(); void reactionAnalysisTest(); void reactionAnalysisEnthalpy(); void reactionAnalysis1HNMR(); void reactionAnalysis13CNMR(); void reactivityForward(); void reactivityRetro(); void reactivityPC(); void ToSMILES(); void ToInChI(); void FromSMILES(); // defined in smilesdialog.cpp void setGroup_Reactant(); void setGroup_Product(); void clearGroup(); void clearAllGroups(); void toggleGrid(); void svXY(int, int); void zoomEvent(QWheelEvent *e); void MagnifyPlus(); void MagnifyMinus(); void Magnify100(); void Zoom(int); void XDCSettings(); void InsertSymbol(); void OBGetFilters(); void OBImport(); void OBNewLoad(QString, QString); void OBExport(); void OBNewSave(); QString OBGuessFileType(QString); void about(); void support(); void whatsThis(); void NewManual(); void HelpBrowser(QString); void HelpTopic(QString); void Refs(); void Dummy() {} void Test(); void setClipboard(Clipboard *); private slots: void setRegularArrowAction(QAction *); void setCurveArrowAction(QAction *); void setBracketAction(QAction *); void setSymbolAction(QAction *); void setRingAction(QAction *); void setFontFace(const QFont &); void setFontPoints(const QString &); private: // QPopupMenu *BuildRingMenu(); obsolete... QMenu *BuildCustomRingMenu(); QMenu *BuildArrowMenu(); QMenu *BuildCurveArrowMenu(); QMenu *BuildBracketMenu(); QMenu *BuildNewRingMenu(); // in application_ring.cpp QMenu *BuildSymbolMenu(); QWidget *m_centralWidget; XRuler *hruler, *vruler; QLabel *m_rulerUnitLabel; QMenu *edit, *format; QMenu *ringmenu; QToolBar *BuildBioTools(); int fix_hydrogens; QPrinter *printer; RenderArea *m_renderArea; Render2D *m_renderer; ChemData *m_chemData; QToolBar *fileTools, *drawTools, *ringTools, *bioTools; QString filename, filefilter; QToolButton *Bold, *TextUnderline, *Italic, *Underline, *superScript, *subScript, *leftJustify, *centerJustify, *rightJustify; ColorButton *colorBtn; QAction *justifyLeftAction, *justifyCenterAction, *justifyRightAction, *boldAction, *italicAction, *underlineAction, *superscriptAction, *subscriptAction, *insertSymbolAction, *fixedBondAction, *fixedArrowAction; /// regular arrows QToolButton *drawArrowButton; QMenu *regularArrowMenu; QAction *regularArrowAction, *topharpoonArrowAction, *bottomharpoonAction, *middleArrowAction, *didntworkArrowAction, *dashedArrowAction, *bi1ArrowAction, *bi2ArrowAction, *retroArrowAction; /// curve arrows QToolButton *drawCurveArrowButton; QMenu *curveArrowMenu; QAction *carrowCW90Action, *carrowCCW90Action, *carrowCW180Action, *carrowCCW180Action, *carrowCW270Action, *carrowCCW270Action, *carrowBezierAction, *carrowBezierhalfAction, *carrowBezierfullAction; /// brackets QToolButton *drawBracketButton; QMenu *bracketMenu; QAction *squareBracketAction, *curveBracketAction, *braceBracketAction, *boxBracketAction, *ellipseBracketAction, *closedsquareBracketAction, *circleBracketAction; QToolButton *drawSymbolButton; /// rings QToolButton *drawRingButton; QMenu *ringMenu; QAction *ring3Action, *ring4Action, *ring5Action, *ring6Action, *ringBenzeneAction, *ringImidazoleAction, *ringCyclopentadieneAction, *ring6BoatAction, *ring6ChairAction, *ringPyrimidineAction, *ring7Action, *ring8Action, *ringIndoleAction, *ringNaphAction, *ringPurineAction, *ringBiphenylAction, *ringAnthraAction, *ringSteroidAction; QAction *naAdenineAction, *naCytosineAction, *naGuanineAction, *naThymineAction, *naUracilAction; QAction *srAction, *sdAction, *sfAction, *sgAction; QAction *customRingMenuAction; QComboBox *colorList, *fontSizeList, *ltList; QFontComboBox *fonts; QStringList ringlist, symbollist, arrowlist, curvearrowlist, bracketlist; QStringList filters, readFilters, writeFilters; NetDialog *netDlg; }; #endif xdrawchem-v1.11.0/xdrawchem/application_ob.cpp000066400000000000000000000244421371466245600214370ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include "application.h" #include "bond.h" #include "chemdata.h" #include "dpoint.h" #include "molecule.h" #include "ioiface.h" using namespace OpenBabel; // OpenBabel functions. void ApplicationWindow::OBGetFilters() { OBConversion Conv; // io_type inFileType = UNDEFINED; // int i; // OBFileFormat fileFormat; QString str1, myext; str1 = tr("--Select a filter-- (*)"); readFilters.append(str1); writeFilters.append(str1); str1 = tr("CDXML - ChemDraw text/XML format (*)"); readFilters.append(str1); writeFilters.append(str1); str1 = tr("CDX - ChemDraw binary format (*)"); readFilters.append(str1); writeFilters.append(str1); str1 = tr("XDC - XDrawChem native format (*)"); readFilters.append(str1); writeFilters.append(str1); Formatpos pos; OBFormat *pFormat; const char *str = 0; while (OBConversion::GetNextFormat(pos, str, pFormat)) { // qDebug() << " " << str; if ((pFormat->Flags() & NOTWRITABLE) && (pFormat->Flags() & NOTREADABLE)) continue; str1 = str; myext = str1.left(str1.indexOf(" -- ")); str1.append("(*."); str1.append(myext); str1.append(")"); if ((pFormat->Flags() & NOTREADABLE) == 0) readFilters.append(str1); if ((pFormat->Flags() & NOTWRITABLE) == 0) writeFilters.append(str1); } filters.sort(); readFilters.sort(); writeFilters.sort(); } void ApplicationWindow::OBImport() { QFileDialog fd(this, tr("Open file...")); // fd.setWindowTitle(); fd.setFileMode(QFileDialog::ExistingFile); fd.setNameFilters(readFilters); if (fd.exec() == QDialog::Accepted) { OBNewLoad(fd.selectedFiles()[0], fd.selectedNameFilter()); } } void ApplicationWindow::OBNewLoad(QString infile, QString infilter) { // io_type inFileType = UNDEFINED; /// OBFileFormat fileFormat; filename = infile; filefilter = infilter; /* handled internally */ if ((infilter.left(3) == "XDC") || (infilter.left(3) == "CDX") || (infile.endsWith(".XDC", Qt::CaseInsensitive))) { QString realFileName = filename; QFile f(filename); if (!f.open(QIODevice::ReadOnly)) { QMessageBox::warning(0, tr("Couldn't open file"), tr("Could not open the file: ") + filename); statusBar()->showMessage(tr("Unable to load ") + filename); return; } f.close(); SelectAll(); Clear(); if (!m_chemData->load(filename)) { statusBar()->showMessage(tr("Unable to load ") + filename); return; } filename = realFileName; setWindowTitle(QString(XDC_VERSION) + QString(" - ") + filename); statusBar()->showMessage(tr("Loaded document ") + filename); m_chemData->DeselectAll(); m_renderer->update(); m_chemData->saved(); return; } /* end XDC/CDX code */ OBConversion Conv; OBFormat *inFormat = 0; if (infilter.left(2) == QString::fromLatin1("--")) { inFormat = Conv.FormatFromExt(infile.toLatin1().data()); if (inFormat == 0) { QMessageBox::warning(0, tr("Could not determine file type"), tr("Please select a file type from the list.")); return; } } /* rest done by OpenBabel */ int cutpt = infilter.indexOf(QString::fromLatin1(" -- ")); infilter.truncate(cutpt); const char *tmpchar = infilter.toLatin1(); char *realchar; realchar = (char *)malloc(sizeof(char) * infilter.length()); strcpy(realchar, tmpchar); if (inFormat == 0) inFormat = Conv.FindFormat(realchar); OBMol *mol = new OBMol; std::ifstream inFileStream(infile.toLatin1()); if (!inFileStream) { QMessageBox::warning(0, tr("Problem while opening the file"), tr("Cannot open the specified file.")); return; } qInfo() << "OB loading " << inFormat; Conv.SetInAndOutFormats(inFormat, inFormat); Conv.Read(mol, &inFileStream); SelectAll(); Clear(); IOIface converter(m_chemData, mol); if (converter.convertToChemData()) { QMessageBox::warning(0, tr("Problem while reading the file"), tr("The file has invalid elements. Valid parts " "loaded have been loaded.")); } m_chemData->ScaleAll(); m_chemData->DeselectAll(); m_renderer->update(); m_renderer->setMode_Select(); m_chemData->saved(); setWindowTitle(QString(XDC_VERSION) + QString(" - ") + filename); statusBar()->showMessage(tr("Loaded document ") + filename); } void ApplicationWindow::OBExport() { qDebug() << "OBExport()"; // io_type inFileType = UNDEFINED; int i; // OBFileFormat fileFormat; // char *formatOptions; QFile ftest; QFileDialog fd(this, tr("Save file as...")); QString str1; fd.setFileMode(QFileDialog::AnyFile); fd.setNameFilters(writeFilters); fd.setAcceptMode(QFileDialog::AcceptSave); fd.selectNameFilter("XDC - XDrawChem native format (*)"); if (fd.exec() == QDialog::Accepted) { if (ftest.exists(fd.selectedFiles()[0])) { i = QMessageBox::warning(this, tr("Overwrite file?"), tr("Overwrite existing file: %1 ?").arg(fd.selectedFiles()[0]), QMessageBox::Ok, QMessageBox::Cancel); if (i == QMessageBox::Cancel) return; } str1 = fd.selectedNameFilter(); filefilter = str1; // so we know what file type to save as filename = fd.selectedFiles()[0]; OBNewSave(); } } void ApplicationWindow::OBNewSave() { m_chemData->StartUndo(); // needed in case we scale before saving OBConversion Conv; OBFormat *outFormat = 0; QString str1; // io_type inFileType = UNDEFINED; // int i; // OBFileFormat fileFormat; // char *formatOptions; str1 = filefilter; if (str1.left(3) == "XDC" || filename.right(4).toLower() == ".xdc") { if (filename.right(4).toLower() != ".xdc") filename.append(".xdc"); if (!m_chemData->save(filename)) { statusBar()->showMessage(tr("Could not write to ") + filename); return; } } else if (str1.left(3) == "CDX" || filename.right(6).toLower() == ".cdxml") { if (filename.right(6).toLower() != ".cdxml") filename.append(".cdxml"); if (!m_chemData->save(filename)) { statusBar()->showMessage(tr("Could not write to ") + filename); return; } } else { outFormat = Conv.FormatFromExt(filename.toLatin1()); if (outFormat == 0) { QMessageBox::warning(0, tr("Could not determine file type"), tr("Please select a file type from the list.")); return; } int cutpt = str1.indexOf(" -- "); str1.truncate(cutpt); const char *tmpchar = str1.toLatin1(); char *realchar; realchar = (char *)malloc(sizeof(char) * str1.length()); strcpy(realchar, tmpchar); if (outFormat == 0) outFormat = Conv.FindFormat(realchar); OBMol *mol = new OBMol; Conv.SetInAndOutFormats(outFormat, outFormat); // invert so save file has correct coordinates // m_renderer->SelectAll(); // m_renderer->Flip(FLIP_V); // m_renderer->DeselectAll(); IOIface converter(m_chemData, mol); if (!converter.convertToOBMol()) { QMessageBox::warning(0, tr("IOIface Data error"), tr("Cannot convert the molecule.\nConversion " "failed in ioiface.cpp")); return; } std::ofstream outFileStream(filename.toLatin1()); if (!outFileStream) { QMessageBox::warning(0, tr("Problem while writing the file"), tr("Cannot write the specified file.")); return; } Conv.Write(mol, &outFileStream); // fileFormat.WriteMolecule(outFileStream, *mol, "3D", formatOptions); // m_chemData->Undo(); } setWindowTitle(QString(XDC_VERSION) + QString(" - ") + filename); statusBar()->showMessage(tr("Saved file ") + filename); m_chemData->saved(); return; } QString ApplicationWindow::OBGuessFileType(QString guessname) { QString guesstype = "--Select a filter-- (*)"; QString guess_lower = guessname.toLower(); if (guess_lower.right(4) == ".xdc") { guesstype = "XDC - XDrawChem native format (*)"; return guesstype; } if (guess_lower.right(6) == ".cdxml") { guesstype = "CDXML - ChemDraw text/XML format (*)"; return guesstype; } if (guess_lower.right(4) == ".cdx") { guesstype = "CDX - ChemDraw binary format (*)"; return guesstype; } QString dos_ext, ext_test; for (int cc = guess_lower.length() - 1; cc > 0; cc--) { if (guess_lower.at(cc) == '.') break; dos_ext.prepend(guess_lower.at(cc)); } for (QStringList::Iterator it = filters.begin(); it != filters.end(); ++it) { ext_test = *it; ext_test = ext_test.left(ext_test.indexOf(":")); if (dos_ext == ext_test) { guesstype = *it; break; } } return guesstype; } xdrawchem-v1.11.0/xdrawchem/application_ring.cpp000066400000000000000000000250161371466245600217740ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include "application.h" #include "chemdata.h" #include "defs.h" #include "prefs.h" #include "render2d.h" extern Preferences preferences; // canned structure images #include "aa_xpm.h" #include "na_xpm.h" #include "ring_xpm.h" #include "sugar_xpm.h" QMenu *ApplicationWindow::BuildNewRingMenu() { QMenu *ringSub = new QMenu(this); qInfo() << "BuildNewRingMenu"; // make ring list QMenu *genericSub = new QMenu(tr("Rings"), ringSub); ring3Action = genericSub->addAction(QIcon(QPixmap(r_cyclopropane)), tr("[*] Cyclopropane")); ring3Action->setData(QString(":/ring_cml/cyclopropane.cml")); ring4Action = genericSub->addAction(QIcon(QPixmap(r_cyclobutane)), tr("[*] Cyclobutane")); ring4Action->setData(QString(":/ring_cml/cyclobutane.cml")); ring5Action = genericSub->addAction(QIcon(QPixmap(r_cyclopentane)), tr("[*] Cyclopentane")); ring5Action->setData(QString(":/ring_cml/cyclopentane.cml")); ringImidazoleAction = genericSub->addAction(QIcon(QPixmap(r_imidazole)), tr("Imidazole")); ringImidazoleAction->setData(QString(":/ring_cml/imidazole.cml")); ringCyclopentadieneAction = genericSub->addAction(QIcon(QPixmap(r_cyclopentadiene)), tr("[*] Cyclopentadiene")); ringCyclopentadieneAction->setData(QString(":/ring_cml/cyclopentadiene.cml")); ring6Action = genericSub->addAction(QIcon(QPixmap(r_6flat)), tr("[*] Cyclohexane (flat)")); ring6Action->setData(QString(":/ring_cml/cyclohexane.cml")); ring6BoatAction = genericSub->addAction(QIcon(QPixmap(r_6boat)), tr("Cyclohexane (boat)")); ring6BoatAction->setData(QString(":/ring_cml/6ring_boat.cml")); ring6ChairAction = genericSub->addAction(QIcon(QPixmap(r_6chair)), tr("Cyclohexane (chair)")); ring6ChairAction->setData(QString(":/ring_cml/6ring_chair.cml")); ringBenzeneAction = genericSub->addAction(QIcon(QPixmap(r_benzene)), tr("[*] Benzene")); ringBenzeneAction->setData(QString(":/ring_cml/benzene.cml")); ringPyrimidineAction = genericSub->addAction(QIcon(QPixmap(r_pyrimidine)), tr("Pyrimidine")); ringPyrimidineAction->setData(QString(":/ring_cml/pyrimidine.cml")); ring7Action = genericSub->addAction(QIcon(QPixmap(ring7)), tr("[*] Cycloheptane")); ring7Action->setData(QString(":/ring_cml/cycloheptane.cml")); ring8Action = genericSub->addAction(QIcon(QPixmap(ring8)), tr("[*] Cyclooctane")); ring8Action->setData(QString(":/ring_cml/cyclooctane.cml")); ringIndoleAction = genericSub->addAction(QIcon(QPixmap(r_indole)), tr("Indole")); ringIndoleAction->setData(QString(":/ring_cml/indole.cml")); ringPurineAction = genericSub->addAction(QIcon(QPixmap(r_purine)), tr("Purine")); ringPurineAction->setData(QString(":/ring_cml/purine.cml")); ringNaphAction = genericSub->addAction(QIcon(QPixmap(naphthalene_xpm)), tr("Naphthalene")); ringNaphAction->setData(QString(":/ring_cml/naphthalene.cml")); ringBiphenylAction = genericSub->addAction(QIcon(QPixmap(biphenyl_xpm)), tr("Biphenyl")); ringBiphenylAction->setData(QString(":/ring_cml/biphenyl.cml")); ringAnthraAction = genericSub->addAction(QIcon(QPixmap(anthracene_xpm)), tr("Anthracene")); ringAnthraAction->setData(QString(":/ring_cml/anthracene.cml")); ringSteroidAction = genericSub->addAction(QIcon(QPixmap(r_steroid)), tr("Steroid (fused ring template)")); ringSteroidAction->setData(QString(":/ring_cml/steroid.cml")); ringSub->addMenu(genericSub); // make amino acid list QAction *aaAction; QMenu *aaSub = new QMenu(tr("Amino acids"), this); aaAction = aaSub->addAction(QIcon(QPixmap(aa_ala)), tr("Alanine")); aaAction->setData(":/ring_cml/alanine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_arg)), tr("Arginine")); aaAction->setData(":/ring_cml/arginine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_asn)), tr("Asparagine")); aaAction->setData(":/ring_cml/asparagine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_asp)), tr("Aspartic acid")); aaAction->setData(":/ring_cml/aspartic_acid.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_cys)), tr("Cysteine")); aaAction->setData(":/ring_cml/cysteine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_glu)), tr("Glutamic acid")); aaAction->setData(":/ring_cml/glutamic_acid.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_gln)), tr("Glutamine")); aaAction->setData(":/ring_cml/glutamine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_gly)), tr("Glycine")); aaAction->setData(":/ring_cml/glycine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_his)), tr("Histidine")); aaAction->setData(":/ring_cml/histidine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_ile)), tr("Isoleucine")); aaAction->setData(":/ring_cml/isoleucine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_leu)), tr("Leucine")); aaAction->setData(":/ring_cml/leucine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_lys)), tr("Lysine")); aaAction->setData(":/ring_cml/lysine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_met)), tr("Methionine")); aaAction->setData(":/ring_cml/methionine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_nph)), tr("Nitrophenylalanine")); aaAction->setData(":/ring_cml/nitrophenylalanine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_phe)), tr("Phenylalanine")); aaAction->setData(":/ring_cml/phenylalanine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_pro)), tr("Proline")); aaAction->setData(":/ring_cml/proline.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_ser)), tr("Serine")); aaAction->setData(":/ring_cml/serine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_statine)), tr("Statine")); aaAction->setData(":/ring_cml/statine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_thr)), tr("Threonine")); aaAction->setData(":/ring_cml/threonine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_trp)), tr("Tryptophan")); aaAction->setData(":/ring_cml/tryptophan.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_tyr)), tr("Tyrosine")); aaAction->setData(":/ring_cml/tyrosine.cml"); aaAction = aaSub->addAction(QIcon(QPixmap(aa_val)), tr("Valine")); aaAction->setData(":/ring_cml/valine.cml"); ringSub->addMenu(aaSub); // make nucleic acid list QMenu *naSub = new QMenu(tr("Nucleic acids"), this); naAdenineAction = naSub->addAction(QIcon(QPixmap(na_adenine)), tr("Adenine")); naAdenineAction->setData(":/ring_cml/adenine.cml"); naCytosineAction = naSub->addAction(QIcon(QPixmap(na_cytosine)), tr("Cytosine")); naCytosineAction->setData(":/ring_cml/cytosine.cml"); naGuanineAction = naSub->addAction(QIcon(QPixmap(na_guanine)), tr("Guanine")); naGuanineAction->setData(":/ring_cml/guanine.cml"); naThymineAction = naSub->addAction(QIcon(QPixmap(na_thymine)), tr("Thymine")); naThymineAction->setData(":/ring_cml/thymine.cml"); naUracilAction = naSub->addAction(QIcon(QPixmap(na_uracil)), tr("Uracil")); naUracilAction->setData(":/ring_cml/uracil.cml"); ringSub->addMenu(naSub); // make sugar list QMenu *sugarSub = new QMenu(tr("Sugars"), this); srAction = sugarSub->addAction(QIcon(QPixmap(s_ribose)), tr("Ribose")); srAction->setData(":/ring_cml/ribose.cml"); sdAction = sugarSub->addAction(QIcon(QPixmap(s_deoxyribose)), tr("Deoxyribose")); sdAction->setData(":/ring_cml/deoxyribose.cml"); sfAction = sugarSub->addAction(QIcon(QPixmap(s_d_fructose)), tr("D-fructose")); sfAction->setData(":/ring_cml/d-fructose.cml"); sgAction = sugarSub->addAction(QIcon(QPixmap(s_d_glucose)), tr("D-glucose")); sgAction->setData(":/ring_cml/d-glucose.cml"); ringSub->addMenu(sugarSub); // make function group list QMenu *fgSub = new QMenu(tr("Useful groups"), this); fgSub->addAction(tr("[*] FMOC"))->setData(":/ring_cml/fmoc.cml"); fgSub->addAction(tr("[*] BOC"))->setData(":/ring_cml/boc.cml"); fgSub->addAction(tr("[*] DABCYL"))->setData(":/ring_cml/dabcyl.cml"); fgSub->addAction(tr("[*] DABSYL"))->setData(":/ring_cml/dabsyl.cml"); fgSub->addAction(tr("[*] DANSYL"))->setData(":/ring_cml/dansyl.cml"); fgSub->addAction(tr("[*] EDANS"))->setData(":/ring_cml/edans.cml"); fgSub->addAction(tr("[*] Biotin"))->setData(":/ring_cml/biotin.cml"); ringSub->addMenu(fgSub); // make user-defined list QMenu *customMenu = BuildCustomRingMenu(); ringSub->addMenu(customMenu); customRingMenuAction = customMenu->menuAction(); return ringSub; } QMenu *ApplicationWindow::BuildCustomRingMenu() { QMenu *userDefSub = new QMenu(tr("User-defined"), this); QDir d(preferences.getCustomRingDir(), "*.png"); ringlist = d.entryList(); QAction *customAction; for (int cc = 0; cc < ringlist.count(); cc++) { QPixmap px1(QString(preferences.getCustomRingDir() + ringlist[cc])); QBitmap mask1(px1.width(), px1.height()); mask1.fill(Qt::color1); px1.setMask(mask1); /*userDefSub->addAction( QPixmap( QString(RingDir + ringlist[cc]) ), ringlist[cc], this, FromRingMenu(int)), 0, cc ); */ QString name = ringlist[cc].left(ringlist[cc].length() - 4); customAction = userDefSub->addAction(QIcon(px1), name); customAction->setData(preferences.getCustomRingDir() + name + ".cml"); } userDefSub->addAction(tr("Add new..."), this, SLOT(saveCustomRing())); return userDefSub; } void ApplicationWindow::setRingAction(QAction *action) { qInfo() << "setRingAction() invoked with data " << action->data(); if (action->data().isNull()) return; drawRingButton->setDefaultAction(action); m_renderer->setMode_DrawRing(action->data().toString(), action->iconText(), 1); } xdrawchem-v1.11.0/xdrawchem/arrow.cpp000066400000000000000000000150111371466245600175760ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // arrow.cpp - Arrow's implementation of functions #include "arrow.h" #include "bondedit.h" #include "defs.h" #include "drawable.h" #include "render2d.h" Arrow::Arrow(Render2D *r1, QObject *parent) : Drawable(parent) { m_renderer = r1; highlighted = false; style = ARROW_REGULAR; thick = 1; } Arrow *Arrow::CloneTo(Drawable *target) const { if (!target) target = new Arrow(m_renderer, parent()); Arrow *t = static_cast(this->Drawable::CloneTo(target)); return t; } QString Arrow::ToXML(QString xml_id) { QString s, n1; // begin arrow s.append("\n"); // write Start s.append(""); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\n"); // write End s.append(""); n1.setNum(end->x); s.append(n1); s.append(" "); n1.setNum(end->y); s.append(n1); s.append("\n"); // write color s.append(""); n1.setNum(color.red()); s.append(n1); s.append(" "); n1.setNum(color.green()); s.append(n1); s.append(" "); n1.setNum(color.blue()); s.append(n1); s.append("\n"); // write style s.append("\n"); // write thickness s.append(""); n1.setNum(thick); s.append(n1); s.append("\n"); // end arrow s.append("\n"); return s; } QString Arrow::ToCDXML(QString xml_id) { QString s, n1; // begin arrow s.append("x); s.append(n1); s.append(" "); n1.setNum(end->y); s.append(n1); s.append(" "); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\" "); if (style == ARROW_REGULAR) s.append("GraphicType=\"Line\" ArrowType=\"FullHead\" HeadSize=\"1000\""); if (style == ARROW_DASH) s.append("GraphicType=\"Line\" LineType=\"Dashed\" " "ArrowType=\"FullHead\" HeadSize=\"1000\""); if (style == ARROW_BI1) s.append("GraphicType=\"Line\" ArrowType=\"Resonance\" HeadSize=\"1000\""); if (style == ARROW_BI2) s.append("GraphicType=\"Line\" ArrowType=\"Equilibrium\" HeadSize=\"1000\""); if (style == ARROW_RETRO) s.append("GraphicType=\"Line\" ArrowType=\"RetroSynthetic\" " "HeadSize=\"1000\""); s.append("/>\n"); return s; } // set Arrow from XDrawChem-format XML void Arrow::FromXML(QString xml_tag) { qDebug() << "read arrow"; int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 8; SetStartFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 6; SetEndFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf("") + 8; qDebug() << "arrow::style = |" << xml_tag.mid(i1 + 7, i2 - i1 - 15) << "|"; style = xml_tag.mid(i1 + 7, i2 - i1 - 15).toInt(); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 8; thick = xml_tag.mid(i1 + 7, 1).toInt(); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 8; SetColorFromXML(xml_tag.mid(i1, i2 - i1)); } } void Arrow::Render() { QColor c1; if (highlighted) c1 = QColor(255, 0, 0); else c1 = color; m_renderer->drawArrow(start->toQPoint(), end->toQPoint(), c1, style, thick); } int Arrow::Type() { return TYPE_ARROW; } void Arrow::Edit() { qDebug() << "edit arrow"; BondEditDialog be(m_renderer, start, end, TYPE_ARROW, 0, 0, thick, style, color); if (!be.exec()) return; qDebug() << "change"; style = be.Style(); color = be.Color(); thick = be.Thick(); } int Arrow::Orientation() { double a1 = getAngle(start, end); if (a1 < 45.0) return ARROW_HORIZONTAL; if (a1 < 135.0) return ARROW_VERTICAL; if (a1 < 225.0) return ARROW_HORIZONTAL; if (a1 < 315.0) return ARROW_VERTICAL; return ARROW_HORIZONTAL; } QPoint Arrow::Midpoint() { QPoint a; a.setX(qRound((start->x + end->x) / 2.0)); a.setY(qRound((start->y + end->y) / 2.0)); return a; } bool Arrow::Find(DPoint *target) { if (start == target) return true; if (end == target) return true; return false; } // Do not allow connections to this object. // Simplest way to do this, I think, is to disallow this function DPoint *Arrow::FindNearestPoint(DPoint * /*target*/, double &dist) { dist = 99999.0; return 0; } Drawable *Arrow::FindNearestObject(DPoint *target, double &dist) { dist = DistanceToLine(start, end, target); return this; } void Arrow::setPoints(DPoint *s, DPoint *e) { start = s; end = e; } QRect Arrow::BoundingBox() { if (highlighted == false) return QRect(QPoint(999, 999), QPoint(0, 0)); int top, bottom, left, right, swp; top = (int)start->y; left = (int)start->x; bottom = (int)end->y; right = (int)end->x; if (bottom < top) { swp = top; top = bottom; bottom = swp; } if (right < left) { swp = left; left = right; right = swp; } return QRect(QPoint(left, top), QPoint(right, bottom)); } bool Arrow::isWithinRect(QRect n, bool /*shiftdown*/) { if (DPointInRect(start, n) && DPointInRect(end, n)) highlighted = true; else highlighted = false; return highlighted; } // cmake#include "arrow.moc" xdrawchem-v1.11.0/xdrawchem/arrow.h000066400000000000000000000034121371466245600172450ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // arrow.h -- subclass of Drawable for arrows #ifndef ARROW_H #define ARROW_H #include #include #include "dpoint.h" #include "drawable.h" #include "render2d.h" class Arrow : public Drawable { Q_OBJECT public: Arrow(Render2D *, QObject *parent = 0); Arrow *CloneTo(Drawable *target = nullptr) const; void Render(); // draw this object void Edit(); // edit this object int Type(); // return type of object bool Find(DPoint *); // does this Arrow contain this DPoint? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void setPoints(DPoint *, DPoint *); QRect BoundingBox(); bool isWithinRect(QRect, bool); QString ToXML(QString); QString ToCDXML(QString); void FromXML(QString); int Orientation(); QPoint Midpoint(); int Style() { return style; } void SetStyle(int s1) { style = s1; } private: // Renderer Render2D *m_renderer; }; #endif xdrawchem-v1.11.0/xdrawchem/arrows.h000066400000000000000000000511271371466245600174360ustar00rootroot00000000000000/* XPM */ static const char *arrow_regular_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".......................+......", "........................+.....", ".........................+....", "..........................+...", "..++++++++++++++++++++++++++..", "..........................+...", ".........................+....", "........................+.....", ".......................+......", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; static const char *arrow_middle_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "...........+..................", "............+.................", ".............+................", "..............+...............", "..++++++++++++++++++++++++++..", "..............+...............", ".............+................", "............+.................", "...........+..................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; static const char *arrow_bottomharpoon_xpm[] = { "30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..++++++++++++++++++++++++++..", "..........................+...", ".........................+....", "........................+.....", ".......................+......", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; static const char *arrow_topharpoon_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".......................+......", "........................+.....", ".........................+....", "..........................+...", "..++++++++++++++++++++++++++..", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; static const char *arrow_didnt_work_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..........+......+.....+......", "...........+....+.......+.....", "............+..+.........+....", ".............++...........+...", "..++++++++++++++++++++++++++..", ".............++...........+...", "............+..+.........+....", "...........+....+.......+.....", "..........+......+.....+......", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; /* XPM */ static const char *arrow_dash_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".......................+......", "........................+.....", ".........................+....", "..........................+...", "..++..++..++..++..++..++++++..", "..........................+...", ".........................+....", "........................+.....", ".......................+......", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; /* XPM */ static const char *arrow_bi1_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "......+................+......", ".....+..................+.....", "....+....................+....", "...+......................+...", "..++++++++++++++++++++++++++..", "...+......................+...", "....+....................+....", ".....+..................+.....", "......+................+......", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; /* XPM */ static const char *arrow_bi2_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".......................+......", "........................+.....", ".........................+....", "..........................+...", "..++++++++++++++++++++++++++..", "..............................", "..............................", "..++++++++++++++++++++++++++..", "...+..........................", "....+.........................", ".....+........................", "......+.......................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; /* XPM */ static const char *arrow_retro_xpm[] = {"30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".....................+........", "......................+.......", ".......................+......", "........................+.....", "..++++++++++++++++++++++++....", "..+.......................+...", "..+........................+..", "..+.......................+...", "..++++++++++++++++++++++++....", "........................+.....", ".......................+......", "......................+.......", ".....................+........", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}; xdrawchem-v1.11.0/xdrawchem/atom.h000066400000000000000000000102341371466245600170530ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // atom.h -- Atom class comparable to that in CompChem package. #ifndef ATOM_H #define ATOM_H #include class Atom { public: QString name; QString symbol; int number; int charge; /** list of adjacent nodes */ QVector nodeTable; /** list of the bondorders of the bonds listed in nodeTable */ QVector bondTable; /** list of numbers of adjacent node in an array * This is kept for historic reasons and should not be used anymore */ QVector intnodeTable; /** degree of this node, i.e. the number of attached nodes */ int degree; /** Possiblity to indicate the number of implicit hydrogen atoms attached to this node. This is used to check is the sum of bond orders of all bonds of this node to other heavy atoms plus the sum of implicit hydrogens euqals maxBondOrderSum */ int HCount; /** Maximum allowed sum of bond orders of all bonds of this node. This should for example be set to 4 (four) for carbon atoms */ int maxBondOrderSum; /** Maximum allow BondOrder for this node. Would e.g. be 2 for oxygens */ int maxBondOrder; /** current sum of bondorders for this node. */ int bondOrderSum; /** to store the numbers of the rings of which this node is part of. BTW, what is the maximum number of Rings that an atom with, say, octahedral configuration can be part of? Ten is certainly too much. */ QVector inRings; /** x coordinate of this node */ double x; /** y coordinate of this node */ double y; /** z coordinate of this node */ double z; int ringCounter; int status; // to hold one of the three stati below /** Constructs an empty Atom */ Atom() { // bondOrderSum = getBondCount(); // physicalProperties = new Hashtable(); init(); } /** Constructs a Atom with a given element symbol*/ Atom(QString s) { symbol = s; init(); } /** Constructs a Atom with a given element Symbol and node number */ Atom(QString s, int n) { symbol = s; number = n; init(); } /** Constructs a Atom with a given element Symbol and node number */ Atom(QString s, double x1, double y1, double z1) { symbol = s; x = x1; y = y1; z = z1; init(); } /** Constructs a Atom with a given node number */ Atom(int n) { number = n; init(); } void init() { nodeTable.resize(10); bondTable.resize(10); intnodeTable.resize(10); inRings.resize(10); } Atom *clone() { Atom *n = new Atom; n->name = name; n->symbol = symbol; n->number = number; n->charge = charge; n->status = status; n->degree = degree; n->x = x; n->y = y; n->z = z; n->ringCounter = ringCounter; n->HCount = HCount; n->maxBondOrderSum = maxBondOrderSum; n->maxBondOrder = maxBondOrder; n->bondOrderSum = bondOrderSum; // System->arraycopy(nodeTable, 0, n->nodeTable, 0, 10); for (int f = 0; f < 10; f++) n->nodeTable.replace(f, nodeTable[f]); // shallow copy! // the rest are deep copies. n->intnodeTable = intnodeTable; n->bondTable = bondTable; n->inRings = inRings; return n; } }; #endif xdrawchem-v1.11.0/xdrawchem/back.xpm000066400000000000000000000010371371466245600173710ustar00rootroot00000000000000/* XPM */ /* Drawn by Mark Donohoe for the K Desktop Environment */ /* See http://www.kde.org */ static const char *back_xpm[]={ "16 16 5 1", "# c #000000", "a c #ffffff", "c c #808080", "b c #c0c0c0", ". c None", "................", ".......#........", "......##........", ".....#a#........", "....#aa########.", "...#aabaaaaaaa#.", "..#aabbbbbbbbb#.", "...#abbbbbbbbb#.", "...c#ab########.", "....c#a#ccccccc.", ".....c##c.......", "......c#c.......", ".......cc.......", "........c.......", "................", "......................"}; xdrawchem-v1.11.0/xdrawchem/bead.xpm000066400000000000000000000124741371466245600173730ustar00rootroot00000000000000/* XPM */ static const char *box_xpm[] = { /* width height ncolors chars_per_pixel */ "20 20 107 2", /* colors */ " c #B1B1B1", " . c #AFAFAF", " X c #ADADAD", " o c #ABABAB", " O c #A9A9A9", " + c #A7A7A7", " @ c #A1A1A1", " # c #9F9F9F", " $ c #9B9B9B", " % c #999999", " & c #979797", " * c #959595", " = c #919191", " - c #8F8F8F", " ; c #8B8B8B", " : c #898989", " > c #878787", " , c #858585", " < c #838383", " 1 c #7F7F7F", " 2 c #777777", " 3 c #737373", " 4 c #717171", " 5 c #6F6F6F", " 6 c #6D6D6D", " 7 c #676767", " 8 c #5B5B5B", " 9 c #595959", " 0 c #F8F8F8", " q c #EEEEEE", " w c #E6E6E6", " e c #E4E4E4", " r c #E2E2E2", " t c #E0E0E0", " y c #DEDEDE", " u c #DCDCDC", " i c #DADADA", " p c #D8D8D8", " a c #D6D6D6", " s c #D4D4D4", " d c #D2D2D2", " f c #CECECE", " g c #CACACA", " h c #C8C8C8", " j c #C6C6C6", " k c #C4C4C4", " l c #C2C2C2", " z c #BEBEBE", " x c #BABABA", " c c #B8B8B8", " v c #B6B6B6", " b c #B4B4B4", " n c #B2B2B2", " m c #B0B0B0", " M c #AEAEAE", " N c #ACACAC", " B c #AAAAAA", " V c #A8A8A8", " C c #A6A6A6", " Z c #A4A4A4", " A c #A2A2A2", " S c #A0A0A0", " D c #9A9A9A", " F c #969696", " G c #929292", " H c #909090", " J c #888888", " K c #868686", " L c #848484", " P c #828282", " I c #808080", " U c #7C7C7C", " Y c #787878", " T c #747474", " R c #6C6C6C", " E c #666666", " W c #606060", " Q c #5E5E5E", " ! c #585858", " ~ c #545454", " ^ c #FFFFFF", " / c #4C4C4C", " ( c #EDEDED", " ) c #E5E5E5", " _ c #E3E3E3", " ` c #E1E1E1", " ' c #DFDFDF", " ] c #DBDBDB", " [ c #D9D9D9", " { c #D7D7D7", " } c #D5D5D5", " | c #D3D3D3", ". c #D1D1D1", ".. c #CFCFCF", ".X c #CDCDCD", ".o c #CBCBCB", ".O c #C9C9C9", ".+ c #C7C7C7", ".@ c #C5C5C5", ".# c #C3C3C3", ".$ c #C1C1C1", ".% c #BFBFBF", ".& c #BDBDBD", ".* c #BBBBBB", ".= c #B7B7B7", ".- c #B5B5B5", ".; c #B3B3B3", /* pixels */ " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ O X B A & < ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^.* k.@ l.& v X @ = Y ^ ^ ^ ^ ^", " ^ ^ ^ ^.O. d. .X h.$ c M @ H 2 ^ ^ ^ ^", " ^ ^ ^.X { i i p s f.+.%.- B $ : 6 ^ ^ ^", " ^ ^.@ [ ' t ' u p d.o k x . A G U ~ ^ ^", " ^ ^ s ' _ _ r t ] s f j.&.; C & L 7 ^ ^", " ^ ^ i r ) ) ( ^ 0 p...+ z b V D J 5 ^ ^", " ^ k u _ ) w ^ ^ ^ y f.+ z b V D : 4 / ^", " ^.@ ] ` _ e ^ ^ ^ i.X.@.&.; + % J 4 / ^", " ^.% { y t t _ q t d g.# x m Z F , 6 / ^", " ^ ^. [ u u i { |.X.+.% v N S G I E ^ ^", " ^ ^ j d a a } d f h l x + D ; Y 8 ^ ^", " ^ ^ n.+.X.. f.o.+ l.* b B # G P R / ^ ^", " ^ ^ ^.-.$.@.@.#.% x.; o @ F > T ! ^ ^ ^", " ^ ^ ^ ^ X v c.= b . V S * J 2 Q ^ ^ ^ ^", " ^ ^ ^ ^ ^ D Z C Z # % - < 3 9 ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ L : K 1 3 W ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^" }; static const char *hl_box_xpm[] = { /* width height ncolors chars_per_pixel */ "20 20 107 2", /* colors */ " c #B1B1B1", " . c #AFAFAF", " X c #ADADAD", " o c #ABABAB", " O c #A9A9A9", " + c #A7A7A7", " @ c #A1A1A1", " # c #9F9F9F", " $ c #9B9B9B", " % c #999999", " & c #979797", " * c #959595", " = c #919191", " - c #8F8F8F", " ; c #8B8B8B", " : c #898989", " > c #878787", " , c #858585", " < c #838383", " 1 c #7F7F7F", " 2 c #777777", " 3 c #737373", " 4 c #717171", " 5 c #6F6F6F", " 6 c #6D6D6D", " 7 c #676767", " 8 c #5B5B5B", " 9 c #595959", " 0 c #F8F8F8", " q c #EEEEEE", " w c #E6E6E6", " e c #E4E4E4", " r c #E2E2E2", " t c #E0E0E0", " y c #DEDEDE", " u c #DCDCDC", " i c #DADADA", " p c #D8D8D8", " a c #D6D6D6", " s c #D4D4D4", " d c #D2D2D2", " f c #CECECE", " g c #CACACA", " h c #C8C8C8", " j c #C6C6C6", " k c #C4C4C4", " l c #C2C2C2", " z c #BEBEBE", " x c #BABABA", " c c #B8B8B8", " v c #B6B6B6", " b c #B4B4B4", " n c #B2B2B2", " m c #B0B0B0", " M c #AEAEAE", " N c #ACACAC", " B c #AAAAAA", " V c #A8A8A8", " C c #A6A6A6", " Z c #A4A4A4", " A c #A2A2A2", " S c #A0A0A0", " D c #9A9A9A", " F c #969696", " G c #929292", " H c #909090", " J c #888888", " K c #868686", " L c #848484", " P c #828282", " I c #808080", " U c #7C7C7C", " Y c #787878", " T c #747474", " R c #6C6C6C", " E c #666666", " W c #606060", " Q c #5E5E5E", " ! c #585858", " ~ c #545454", " ^ c #000000", " / c #4C4C4C", " ( c #EDEDED", " ) c #E5E5E5", " _ c #E3E3E3", " ` c #E1E1E1", " ' c #DFDFDF", " ] c #DBDBDB", " [ c #D9D9D9", " { c #D7D7D7", " } c #D5D5D5", " | c #D3D3D3", ". c #D1D1D1", ".. c #CFCFCF", ".X c #CDCDCD", ".o c #CBCBCB", ".O c #C9C9C9", ".+ c #C7C7C7", ".@ c #C5C5C5", ".# c #C3C3C3", ".$ c #C1C1C1", ".% c #BFBFBF", ".& c #BDBDBD", ".* c #BBBBBB", ".= c #B7B7B7", ".- c #B5B5B5", ".; c #B3B3B3", /* pixels */ " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ O X B A & < ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^.* k.@ l.& v X @ = Y ^ ^ ^ ^ ^", " ^ ^ ^ ^.O. d. .X h.$ c M @ H 2 ^ ^ ^ ^", " ^ ^ ^.X { i i p s f.+.%.- B $ : 6 ^ ^ ^", " ^ ^.@ [ ' t ' u p d.o k x . A G U ~ ^ ^", " ^ ^ s ' _ _ r t ] s f j.&.; C & L 7 ^ ^", " ^ ^ i r ) ) ( ^ 0 p...+ z b V D J 5 ^ ^", " ^ k u _ ) w ^ ^ ^ y f.+ z b V D : 4 / ^", " ^.@ ] ` _ e ^ ^ ^ i.X.@.&.; + % J 4 / ^", " ^.% { y t t _ q t d g.# x m Z F , 6 / ^", " ^ ^. [ u u i { |.X.+.% v N S G I E ^ ^", " ^ ^ j d a a } d f h l x + D ; Y 8 ^ ^", " ^ ^ n.+.X.. f.o.+ l.* b B # G P R / ^ ^", " ^ ^ ^.-.$.@.@.#.% x.; o @ F > T ! ^ ^ ^", " ^ ^ ^ ^ X v c.= b . V S * J 2 Q ^ ^ ^ ^", " ^ ^ ^ ^ ^ D Z C Z # % - < 3 9 ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ L : K 1 3 W ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^" }; xdrawchem-v1.11.0/xdrawchem/biotools.cpp000066400000000000000000000022351371466245600203020ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "biotools.h" #include "application.h" #include "defs.h" QToolBar *ApplicationWindow::BuildBioTools() { QToolBar *localbar = new QToolBar(this); return localbar; } BioTools::BioTools(Render2D *, QObject *parent) : Drawable(parent) { which = ""; } int BioTools::Type() { return TYPE_BIOTOOLS; } void BioTools::SetWhich(QString w1) { which = w1; } void BioTools::Render() {} xdrawchem-v1.11.0/xdrawchem/biotools.h000066400000000000000000000025571371466245600177560ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // biotools.h -- subclass of Drawable for representing various biochemical // structures: membranes, antibodies, etc. #ifndef BIOTOOLS_H #define BIOTOOLS_H #include "dpoint.h" #include "drawable.h" #include "render2d.h" class Molecule; class BioTools : public Drawable { public: BioTools(Render2D *, QObject *parent = 0); // BioTools *CloneTo(Drawable *target = nullptr) const; void Render(); // draw this object int Type(); // return type of object void SetWhich(QString); QString GetWhich() { return which; } private: // Renderer // Render2D *r; }; #endif xdrawchem-v1.11.0/xdrawchem/boat6.xpm000066400000000000000000000015211371466245600175020ustar00rootroot00000000000000/* XPM */ static char *boat6[] = { /* width height num_colors chars_per_pixel */ " 24 24 2 1", /* colors */ ". c #000000", "# c #ffffff", /* pixels */ "########################", "########################", "########################", "########################", "########################", "########################", "########################", "###.##############.#####", "###...###########..#####", "###.#..##########..#####", "####.##..#######.#.#####", "####.###..######.#.#####", "####.#####........######", "####.##########.########", "#####.########.#########", "#####.#######..#########", "#####.........##########", "########################", "########################", "########################", "########################", "########################", "########################", "########################" }; xdrawchem-v1.11.0/xdrawchem/bond.cpp000066400000000000000000000306301371466245600173720ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // bond.cpp - Bond's implementation of functions #include "bond.h" #include "bondedit.h" #include "defs.h" #include "drawable.h" #include "render2d.h" Bond::Bond(Render2D *r1, QObject *parent) : Drawable(parent) { r = r1; order = 1; stereo = STEREO_UNDEFINED; dashed = 0; highlighted = false; thick = 1; wside = 0; auto_wside = 1; IR_shift = -100.0; IR_intensity = "NA"; cname = ""; rxnlist = "Run 'Tools/Reaction/Reverse reactions' first."; } Bond *Bond::CloneTo(Drawable *target) const { if (!target) target = new Bond(r, parent()); Bond *t = static_cast(this->Drawable::CloneTo(target)); t->order = order; t->stereo = stereo; t->dashed = dashed; t->wside = wside; t->auto_wside = auto_wside; t->IR_shift = IR_shift; t->IR_intensity = IR_intensity; t->partial_charge = partial_charge; t->rxnlist = rxnlist; t->cname = cname; return t; } void Bond::setOrder(int a) { order = a; if (order == 5) stereo = STEREO_UP; if (order == 7) stereo = STEREO_DOWN; if (order == 8) { order = 7; // tmp_pt = start; // start = end; // end = tmp_pt; stereo = STEREO_DOWN; } } bool Bond::operator==(const Bond &other) const { return (((start == other.start) && (end == other.end)) || ((end == other.start) && (start == other.end))); } bool Bond::isWithinRect(QRect n, bool /*shiftdown*/) { if (DPointInRect(start, n) && DPointInRect(end, n)) highlighted = true; else highlighted = false; return highlighted; } void Bond::Edit() { int db1 = 0; qDebug() << "edit bond"; BondEditDialog be(r, start, end, TYPE_BOND, order, dashed, thick, 0, color); if (auto_wside == 0) db1 = wside; be.setDoubleBond(db1); if (!be.exec()) return; qDebug() << "change"; color = be.Color(); order = be.Order(); dashed = be.Dash(); thick = be.Thick(); db1 = be.DoubleBond(); if (db1 == 0) { auto_wside = 1; } else { auto_wside = 0; wside = db1; } } void Bond::Render() { // Red if highlighted QColor b_color = highlighted ? QColor(255, 0, 0) : color; switch (order) { // Single bonds case 1: r->drawLine(start->toQPointF(), end->toQPointF(), thick, b_color, dashed); break; // Double and Triple bonds case 3: { double spacing = preferences.getDoubleBondOffset() * Thick(); QPointF startp = start->toQPointF(); QPointF endp = end->toQPointF(); QPointF vec = endp - startp; // Make orthogonal scaled vector QPointF ortho(-vec.y(), vec.x()); ortho *= spacing / sqrt(vec.x() * vec.x() + vec.y() + vec.y()); // Make copy of number of dashed because it's going to be modified int numdashed = dashed; r->drawLine(startp - ortho, startp - ortho + vec, thick, b_color, numdashed-- > 0); r->drawLine(startp, endp, thick, b_color, numdashed-- > 0); r->drawLine(startp + ortho, startp + ortho + vec, thick, b_color, numdashed-- > 0); } case 2: break; // Stereo Up Bonds case 5: r->drawUpLine(start->toQPointF(), end->toQPointF(), b_color); break; // Wavy Bonds case 6: r->drawWavyLine(start->toQPointF(), end->toQPointF(), b_color); break; // Stereo Down Bonds case 7: r->drawDownLine(start->toQPointF(), end->toQPointF(), b_color); break; } if (order < 2 || order > 3) return; // TODO FIXME // double myangle, x1, y1, x2, y2, rise, run, lx, ly, trim = 0.02; // for double and triple bonds double myangle = getAngle(start, end); myangle += 90.0; myangle = myangle * (M_PI / 180.0); // double offs = start->distanceTo(end) / 25.0; /* offs = preferences.getDoubleBondOffset(); if (order == 3) { if (thick > 2) offs += 0.5; if (thick > 3) offs += 0.4; if (thick > 4) offs += 0.3; } else { if (thick > 2) offs += 0.3; if (thick > 4) offs += 0.3; } x2 = cos(myangle) * 3.0 * offs; y2 = sin(myangle) * 3.0 * offs; // x1, y1, 3 and 4 are for use with special case 1 below x1 = cos(myangle) * 2.5 * offs; y1 = sin(myangle) * 2.5 * offs; */ /* original (does not use preferences!) double spacing = 1.0; spacing = (double)thick / 2.0 + 1.0; */ // check for order 2 special case (center double bond) bool special_case_1 = order == 2 && (((start->element == "O") && (start->substituents == 2)) || ((end->element == "O") && (end->substituents == 2)) || ((start->element == "C") && (start->substituents == 2)) || ((end->element == "C") && (end->substituents == 2)) || ((start->element == "CH2") && (start->substituents == 2)) || ((end->element == "CH2") && (end->substituents == 2)) || ((start->element == "N") && (end->element == "N")) || (wside == 2)); // force centered double bond double spacing = (double)thick / 2.0 + preferences.getDoubleBondOffset() / (special_case_1 ? 4.0 : 2.0); double x2 = cos(myangle) * spacing; double y2 = sin(myangle) * spacing; // x1, y1, 3 and 4 are for use with special case 1 below double x1 = cos(myangle) * spacing; double y1 = sin(myangle) * spacing; QPointF sp3(start->x + x1, start->y + y1); QPointF ep3(end->x + x1, end->y + y1); QPointF sp4(start->x - x1, start->y - y1); QPointF ep4(end->x - x1, end->y - y1); // shorten lines by removing from each end // double b_length = start->distanceTo(end); double trim = 0.05; // Percentage of bond to trim // if ( b_length < 100.0 ) // trim = 0.03; // if ( b_length < 51.0 ) // trim = 0.05; // if ( b_length < 27.0 ) // trim = 0.07; // find sp1 and ep1 double rise = (end->y + y2) - (start->y + y2); double run = (end->x + x2) - (start->x + x2); double lx = start->x + x2 + run * trim; double ly = start->y + y2 + rise * trim; QPointF sp1(lx, ly); lx = start->x + x2 + run * (1.0 - trim); ly = start->y + y2 + rise * (1.0 - trim); QPointF ep1(lx, ly); // find sp2 and ep2 rise = (end->y - y2) - (start->y - y2); run = (end->x - x2) - (start->x - x2); lx = start->x - x2 + run * trim; ly = start->y - y2 + rise * trim; QPointF sp2(lx, ly); lx = start->x - x2 + run * (1.0 - trim); ly = start->y - y2 + rise * (1.0 - trim); QPointF ep2(lx, ly); if (special_case_1 == true) { if (dashed > 1) r->drawLine(sp3, ep3, thick, b_color, 1); else r->drawLine(sp3, ep3, thick, b_color); if (dashed > 0) r->drawLine(sp4, ep4, thick, b_color, 1); else r->drawLine(sp4, ep4, thick, b_color); return; } QPointF sp, ep; if (order == 2) { if (wside == 1) { sp = sp1; ep = ep1; } else { sp = sp2; ep = ep2; } // qDebug() << "wside:" << wside; if (dashed > 1) r->drawLine(start->toQPointF(), end->toQPointF(), thick, b_color, 1); else r->drawLine(start->toQPointF(), end->toQPointF(), thick, b_color); if (dashed > 0) r->drawLine(sp, ep, thick, b_color, 1); else r->drawLine(sp, ep, thick, b_color); return; } } int Bond::Type() { return TYPE_BOND; } bool Bond::Find(DPoint *target) { if (start == target) return true; if (end == target) return true; return false; } // You *did* call Find() first to make sure target is in this Bond...? DPoint *Bond::otherPoint(DPoint *target) { if (target == start) return end; if (target == end) return start; return 0; } DPoint *Bond::FindNearestPoint(DPoint *target, double &dist) { if (target->distanceTo(start) < target->distanceTo(end)) { dist = target->distanceTo(start); return start; } else { dist = target->distanceTo(end); return end; } } Drawable *Bond::FindNearestObject(DPoint *target, double &dist) { dist = DistanceToLine(start, end, target); return this; } void Bond::setPoints(DPoint *s, DPoint *e) { start = s; end = e; } QRect Bond::BoundingBox() { if (highlighted == false) return QRect(QPoint(999, 999), QPoint(0, 0)); int top, bottom, left, right, swp; top = (int)start->y; left = (int)start->x; bottom = (int)end->y; right = (int)end->x; if (bottom < top) { swp = top; top = bottom; bottom = swp; } if (right < left) { swp = left; left = right; right = swp; } return QRect(QPoint(left, top), QPoint(right, bottom)); } double Bond::Enthalpy() { double dh = 0.0; QString atom1, atom2, swp; atom1 = start->element; atom2 = end->element; if (QString::compare(atom1, atom2) > 0) { swp = atom1; atom1 = atom2; atom2 = swp; } // special cases (functional groups, etc.) if (atom1 == "OH") { dh += 463.0; atom1 = "O"; } if (atom2 == "OH") { dh += 463.0; atom2 = "O"; } if ((order == 1) || (order == 5) || (order == 7)) { if ((atom1 == "Br") && (atom2 == "H")) dh = 366.0; if ((atom1 == "C") && (atom2 == "Br")) dh = 276.0; if ((atom1 == "C") && (atom2 == "C")) dh = 348.0; if ((atom1 == "C") && (atom2 == "Cl")) dh = 328.0; if ((atom1 == "C") && (atom2 == "F")) dh = 441.0; if ((atom1 == "C") && (atom2 == "H")) dh = 413.0; if ((atom1 == "C") && (atom2 == "I")) dh = 240.0; if ((atom1 == "C") && (atom2 == "N")) dh = 292.0; if ((atom1 == "C") && (atom2 == "O")) dh = 351.0; if ((atom1 == "C") && (atom2 == "S")) dh = 259.0; if ((atom1 == "Cl") && (atom2 == "H")) dh = 432.0; if ((atom1 == "Cl") && (atom2 == "N")) dh = 200.0; if ((atom1 == "Cl") && (atom2 == "O")) dh = 203.0; if ((atom1 == "F") && (atom2 == "H")) dh = 563.0; if ((atom1 == "F") && (atom2 == "N")) dh = 270.0; if ((atom1 == "F") && (atom2 == "O")) dh = 185.0; if ((atom1 == "H") && (atom2 == "H")) dh = 436.0; if ((atom1 == "H") && (atom2 == "I")) dh = 299.0; if ((atom1 == "H") && (atom2 == "N")) dh = 391.0; if ((atom1 == "H") && (atom2 == "O")) dh = 463.0; if ((atom1 == "H") && (atom2 == "S")) dh = 339.0; if ((atom1 == "O") && (atom2 == "O")) dh = 139.0; } if (order == 2) { if ((atom1 == "C") && (atom2 == "C")) dh = 615.0; if ((atom1 == "C") && (atom2 == "N")) dh = 615.0; if ((atom1 == "C") && (atom2 == "O")) dh = 728.0; if ((atom1 == "C") && (atom2 == "S")) dh = 477.0; if ((atom1 == "N") && (atom2 == "N")) dh = 418.0; if ((atom1 == "O") && (atom2 == "O")) dh = 498.0; } if (order == 3) { if ((atom1 == "C") && (atom2 == "C")) dh = 812.0; if ((atom1 == "C") && (atom2 == "N")) dh = 891.0; if ((atom1 == "N") && (atom2 == "N")) dh = 945.0; } return dh; } double Bond::Length() { return start->distanceTo(end); } xdrawchem-v1.11.0/xdrawchem/bond.h000066400000000000000000000104511371466245600170360ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // bond.h -- subclass of Drawable for lines/bonds #ifndef BOND_H #define BOND_H #include #include #include "dpoint.h" #include "drawable.h" #include "moldata.h" #include "render2d.h" #define BOND_LEFT 0 #define BOND_RIGHT 1 #define BOND_CENTER 2 class Bond : public Drawable { public: Bond(Render2D *, QObject *parent = 0); Bond *CloneTo(Drawable *target = nullptr) const; bool operator==(const Bond &other) const; void Render(); // draw this object void Edit(); // open edit window void RenderSide(int w) { if (auto_wside == 1) wside = w; } int Type(); // return type of object bool Find(DPoint *); // does this Bond contain this DPoint? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void setPoints(DPoint *, DPoint *); bool isWithinRect(QRect, bool); int Order() { return order; } int baseOrder() { if (order == 5) return 1; if (order == 7) return 1; return order; } void setOrder(int); int Stereo() { return stereo; } void setStereo(int a) { stereo = a; } int Dash() { return dashed; } void setDash(int d) { dashed = d; } QRect BoundingBox(); DPoint *otherPoint(DPoint *); void setIR_shift(double in1) { IR_shift = in1; } void setIR_intensity(QString in1) { IR_intensity = in1; } double getIR_shift() { return IR_shift; } QString getIR_intensity() { return IR_intensity; } double Enthalpy(); double Length(); void setDoubleBondAlign(int db1) { wside = db1; } int getDoubleBondAlign() { return wside; } void setDoubleBondAuto(int db1) { auto_wside = db1; } int getDoubleBondAuto() { return auto_wside; } void resetReactions() { partial_charge = -999.0; rxnlist = "NONE"; } void setPC(double x1) { partial_charge = x1; } double getPC() { return partial_charge; } void setReactions(QString rxn1) { rxnlist = rxn1; } QString getReactions() { return rxnlist; } void setCName(QString cn1) { cname = cn1; } QString CName() { return cname; } bool isCHBond() { if (start->element == "H") return true; if (end->element == "H") return true; return false; } bool aromatic() { if ((start == 0) || (end == 0)) return false; if (start->aromatic && end->aromatic) return true; return false; } double length() { int e1, e2; e1 = start->getAtomicNumber(); e2 = end->getAtomicNumber(); return MolData::bondLength(e1, e2, order); } QPoint midpoint() { double dx, dy; dx = (end->x + start->x) / 2.0; dy = (end->x + start->x) / 2.0; QPoint mp1((int)dx, (int)dy); return mp1; } private: // Renderer Render2D *r; // order of bond (1-3, or 5 if up, or 7 if down) int order; // stereochemistry flag // values could be STEREO_UNDEFINED, STEREO_UP, STEREO_DOWN, STEREO_E, // STEREO_Z int stereo; // is one or more of the lines dashed int dashed; // which side to draw double bond on? // standing at start and looking at end // 0 = left, 2 = center, 1 = right; see #define's above // auto_wside: 0 = no auto, 1 = auto (false/true) int wside, auto_wside; // IR data double IR_shift; QString IR_intensity; // reactivity double partial_charge; QString rxnlist; // bond name QString cname; }; #endif xdrawchem-v1.11.0/xdrawchem/bondedit.cpp000066400000000000000000000430121371466245600202360ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include "bondedit.h" #include "defs.h" #include "previewwidget.h" BondEditDialog::BondEditDialog(QWidget *parent, DPoint *s, DPoint *e, int ty, int o, int d, int th, int st, QColor c1) : QDialog(parent) { s1 = s; e1 = e; type = ty; order = o; dash = d; thick = th; style = st; color = c1; QGridLayout *mygrid = new QGridLayout(); setLayout(mygrid); QGroupBox *pwFrame = new QGroupBox(tr("Preview:")); QGridLayout *pwFrameLayout = new QGridLayout(); pwFrame->setLayout(pwFrameLayout); QSpacerItem *spacerTop = new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding); pwFrameLayout->addItem(spacerTop, 0, 1); QSpacerItem *spacerBottom = new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding); pwFrameLayout->addItem(spacerBottom, 2, 0); QSpacerItem *spacerLeft = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); pwFrameLayout->addItem(spacerLeft, 1, 0); QSpacerItem *spacerRight = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); pwFrameLayout->addItem(spacerRight, 1, 2); pw = new PreviewWidget(); pw->setMinimumSize(QSize(50, 50)); pw->updateWidget(type, thick, dash, order, style, color); pwFrameLayout->addWidget(pw, 1, 1); mygrid->addWidget(pwFrame, 0, 0); QLabel *colorLabel = new QLabel(tr("Color:")); mygrid->addWidget(colorLabel, 1, 0); /* QPixmap *tmp_pm = new QPixmap( 30, 18 ); QBitmap mask0( 30, 18 ); mask0.fill( Qt::color1 ); tmp_pm->setMask( mask0 ); tmp_pm->fill( color );*/ colorBtn = new ColorButton(color); // colorBtn->setIcon( QIcon( *tmp_pm ) ); connect(colorBtn, SIGNAL(pressed()), SLOT(GetNewColor())); mygrid->addWidget(colorBtn, 1, 1); if (type == TYPE_ARROW) { setWindowTitle(tr("Arrow editor")); QGroupBox *arrowBtnBox = new QGroupBox(tr("Style:")); QVBoxLayout *arrowBtnBoxLayout = new QVBoxLayout(); arrowBtnBox->setLayout(arrowBtnBoxLayout); QButtonGroup *arrowBtnGroup = new QButtonGroup(this); arrowBtnGroup->setExclusive(true); connect(arrowBtnGroup, SIGNAL(buttonClicked(int)), SLOT(styleChanged(int))); QRadioButton *plainArrowBtn = new QRadioButton(tr("Plain arrow")); if (style == ARROW_REGULAR) plainArrowBtn->setChecked(true); arrowBtnBoxLayout->addWidget(plainArrowBtn); arrowBtnGroup->addButton(plainArrowBtn, ARROW_REGULAR); QRadioButton *nrArrowBtn = new QRadioButton(tr("NR arrow")); if (style == ARROW_DIDNT_WORK) nrArrowBtn->setChecked(true); arrowBtnBoxLayout->addWidget(nrArrowBtn); arrowBtnGroup->addButton(nrArrowBtn, ARROW_DIDNT_WORK); QRadioButton *dashedArrowBtn = new QRadioButton(tr("Dashed arrow")); if (style == ARROW_DASH) dashedArrowBtn->setChecked(true); arrowBtnBoxLayout->addWidget(dashedArrowBtn); arrowBtnGroup->addButton(dashedArrowBtn, ARROW_DASH); QRadioButton *twArrowBtn = new QRadioButton(tr("Two-way arrow")); if (style == ARROW_BI1) twArrowBtn->setChecked(true); arrowBtnBoxLayout->addWidget(twArrowBtn); arrowBtnGroup->addButton(twArrowBtn, ARROW_BI1); QRadioButton *splitTwArrowBtn = new QRadioButton(tr("Split two-way arrow")); if (style == ARROW_BI2) splitTwArrowBtn->setChecked(true); arrowBtnBoxLayout->addWidget(splitTwArrowBtn); arrowBtnGroup->addButton(splitTwArrowBtn, ARROW_BI2); QRadioButton *retroArrowBtn = new QRadioButton(tr("Retrosynthetic arrow")); if (style == ARROW_RETRO) retroArrowBtn->setChecked(true); arrowBtnBoxLayout->addWidget(retroArrowBtn); arrowBtnGroup->addButton(retroArrowBtn, ARROW_RETRO); mygrid->addWidget(arrowBtnBox, 0, 1); QLabel *arrowThickLbl = new QLabel(tr("Arrow thickness:")); mygrid->addWidget(arrowThickLbl, 2, 0); // arrow thickness list ltList = new QComboBox(); ltList->addItem(QIcon(":/icons/line1.png"), "1"); ltList->addItem(QIcon(":/icons/line2.png"), "2"); ltList->addItem(QIcon(":/icons/line3.png"), "3"); ltList->addItem(QIcon(":/icons/line4.png"), "4"); ltList->addItem(QIcon(":/icons/line5.png"), "5"); connect(ltList, SIGNAL(activated(int)), SLOT(setThick(int))); ltList->setCurrentIndex(th - 1); mygrid->addWidget(ltList, 2, 1); } else if (type == TYPE_BOND) { setWindowTitle(tr("Bond editor")); QGroupBox *bondBtnBox = new QGroupBox(tr("Bond order:")); QVBoxLayout *bondBtnBoxLayout = new QVBoxLayout(); bondBtnBox->setLayout(bondBtnBoxLayout); QButtonGroup *bondBtnGroup = new QButtonGroup(this); bondBtnGroup->setExclusive(true); connect(bondBtnGroup, SIGNAL(buttonClicked(int)), SLOT(orderChanged(int))); QRadioButton *dashedBondBtn = new QRadioButton(tr("Dashed line")); if ((order == 1) && (dash == 1)) dashedBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(dashedBondBtn); bondBtnGroup->addButton(dashedBondBtn, 0); QRadioButton *singleBondBtn = new QRadioButton(tr("Single")); if ((order == 1) && (dash == 0)) singleBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(singleBondBtn); bondBtnGroup->addButton(singleBondBtn, 1); QRadioButton *stereoUpBondBtn = new QRadioButton(tr("Stereo-up")); if ((order == 5) && (dash == 0)) stereoUpBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(stereoUpBondBtn); bondBtnGroup->addButton(stereoUpBondBtn, 5); QRadioButton *stereoDownBondBtn = new QRadioButton(tr("Stereo-down")); if ((order == 7) && (dash == 0)) stereoDownBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(stereoDownBondBtn); bondBtnGroup->addButton(stereoDownBondBtn, 7); QRadioButton *wavyBondBtn = new QRadioButton(tr("Wavy")); if ((order == 6) && (dash == 0)) wavyBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(wavyBondBtn); bondBtnGroup->addButton(wavyBondBtn, 6); QRadioButton *aromaticBondBtn = new QRadioButton(tr("Single/double (aromatic)")); if ((order == 2) && (dash == 1)) aromaticBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(aromaticBondBtn); bondBtnGroup->addButton(aromaticBondBtn, 11); QRadioButton *doubleBondBtn = new QRadioButton(tr("Double")); if ((order == 2) && (dash == 0)) doubleBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(doubleBondBtn); bondBtnGroup->addButton(doubleBondBtn, 2); QRadioButton *doubleTripleBondBtn = new QRadioButton(tr("Double/triple")); if ((order == 3) && (dash == 1)) doubleTripleBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(doubleTripleBondBtn); bondBtnGroup->addButton(doubleTripleBondBtn, 12); QRadioButton *tripleBondBtn = new QRadioButton(tr("Triple")); if ((order == 3) && (dash == 0)) tripleBondBtn->setChecked(true); bondBtnBoxLayout->addWidget(tripleBondBtn); bondBtnGroup->addButton(tripleBondBtn, 3); mygrid->addWidget(bondBtnBox, 0, 1); // QToolTip::add(ltList, TOOLTIP_SET_THICKNESS); // QWhatsThis::add(ltList, "Set Line Thickness"); QLabel *bondThickLbl = new QLabel(tr("Bond thickness:")); mygrid->addWidget(bondThickLbl, 2, 0); // bond thickness list ltList = new QComboBox(); ltList->addItem(QIcon(":/icons/line1.png"), "1"); ltList->addItem(QIcon(":/icons/line2.png"), "2"); ltList->addItem(QIcon(":/icons/line3.png"), "3"); ltList->addItem(QIcon(":/icons/line4.png"), "4"); ltList->addItem(QIcon(":/icons/line5.png"), "5"); connect(ltList, SIGNAL(activated(int)), this, SLOT(setThick(int))); mygrid->addWidget(ltList, 2, 1); ltList->setCurrentIndex(th - 1); QLabel *bondAlignLbl = new QLabel(tr("Double bond alignment:")); mygrid->addWidget(bondAlignLbl, 3, 0); dbList = new QComboBox(); dbList->addItem(tr("Auto")); dbList->addItem(tr("Left")); dbList->addItem(tr("Center")); dbList->addItem(tr("Right")); connect(dbList, SIGNAL(activated(int)), this, SLOT(setDoubleBond(int))); mygrid->addWidget(dbList, 3, 1); } else if (type == TYPE_BRACKET) { setWindowTitle(tr("Bracket editor")); QGroupBox *bracketBtnBox = new QGroupBox(tr("Style:")); QVBoxLayout *bracketBtnBoxLayout = new QVBoxLayout(); bracketBtnBox->setLayout(bracketBtnBoxLayout); QButtonGroup *bracketBtnGroup = new QButtonGroup(this); bracketBtnGroup->setExclusive(true); connect(bracketBtnGroup, SIGNAL(buttonClicked(int)), SLOT(styleChanged(int))); QRadioButton *squareBracketBtn = new QRadioButton(tr("Square bracket")); if (style == BRACKET_SQUARE) squareBracketBtn->setChecked(true); bracketBtnBoxLayout->addWidget(squareBracketBtn); bracketBtnGroup->addButton(squareBracketBtn, BRACKET_SQUARE); QRadioButton *parenBracketBtn = new QRadioButton(tr("Parentheses")); if (style == BRACKET_CURVE) parenBracketBtn->setChecked(true); bracketBtnBoxLayout->addWidget(parenBracketBtn); bracketBtnGroup->addButton(parenBracketBtn, BRACKET_CURVE); QRadioButton *curlyBracketBtn = new QRadioButton(tr("Curly bracket")); if (style == BRACKET_BRACE) curlyBracketBtn->setChecked(true); bracketBtnBoxLayout->addWidget(curlyBracketBtn); bracketBtnGroup->addButton(curlyBracketBtn, BRACKET_BRACE); QRadioButton *boxBracketBtn = new QRadioButton(tr("Box")); if (style == BRACKET_BOX) boxBracketBtn->setChecked(true); bracketBtnBoxLayout->addWidget(boxBracketBtn); bracketBtnGroup->addButton(boxBracketBtn, BRACKET_BOX); QRadioButton *ellipseBracketBtn = new QRadioButton(tr("Ellipse")); if (style == BRACKET_ELLIPSE) ellipseBracketBtn->setChecked(true); bracketBtnBoxLayout->addWidget(ellipseBracketBtn); bracketBtnGroup->addButton(ellipseBracketBtn, BRACKET_ELLIPSE); mygrid->addWidget(bracketBtnBox, 0, 1); } else if (type == TYPE_CURVEARROW) { setWindowTitle(tr("Curved Arrow editor")); QGroupBox *curveArrowBtnBox = new QGroupBox(tr("Style:")); QVBoxLayout *curveArrowBtnBoxLayout = new QVBoxLayout(); curveArrowBtnBox->setLayout(curveArrowBtnBoxLayout); QButtonGroup *curveArrowBtnGroup = new QButtonGroup(this); curveArrowBtnGroup->setExclusive(true); connect(curveArrowBtnGroup, SIGNAL(buttonClicked(int)), SLOT(styleChanged(int))); QRadioButton *cw90ArrowBtn = new QRadioButton(tr("90 degree clockwise")); if (style == CA_CW90) cw90ArrowBtn->setChecked(true); curveArrowBtnBoxLayout->addWidget(cw90ArrowBtn); curveArrowBtnGroup->addButton(cw90ArrowBtn, CA_CW90); QRadioButton *cw180ArrowBtn = new QRadioButton(tr("180 degree clockwise")); if (style == CA_CW180) cw180ArrowBtn->setChecked(true); curveArrowBtnBoxLayout->addWidget(cw180ArrowBtn); curveArrowBtnGroup->addButton(cw180ArrowBtn, CA_CW180); QRadioButton *cw270ArrowBtn = new QRadioButton(tr("270 degree clockwise")); if (style == CA_CW270) cw270ArrowBtn->setChecked(true); curveArrowBtnBoxLayout->addWidget(cw270ArrowBtn); curveArrowBtnGroup->addButton(cw270ArrowBtn, CA_CW270); QRadioButton *ccw90ArrowBtn = new QRadioButton(tr("90 degree counterclockwise")); if (style == CA_CCW90) ccw90ArrowBtn->setChecked(true); curveArrowBtnBoxLayout->addWidget(ccw90ArrowBtn); curveArrowBtnGroup->addButton(ccw90ArrowBtn, CA_CCW90); QRadioButton *ccw180ArrowBtn = new QRadioButton(tr("180 degree counterclockwise")); if (style == CA_CCW180) ccw180ArrowBtn->setChecked(true); curveArrowBtnBoxLayout->addWidget(ccw180ArrowBtn); curveArrowBtnGroup->addButton(ccw180ArrowBtn, CA_CCW180); QRadioButton *ccw270ArrowBtn = new QRadioButton(tr("270 degree counterclockwise")); if (style == CA_CCW270) ccw270ArrowBtn->setChecked(true); curveArrowBtnBoxLayout->addWidget(ccw270ArrowBtn); curveArrowBtnGroup->addButton(ccw270ArrowBtn, CA_CCW270); mygrid->addWidget(curveArrowBtnBox, 0, 1); } else if (type == TYPE_SYMBOL) { setWindowTitle(tr("Symbol editor")); QGroupBox *symbolBtnBox = new QGroupBox(tr("Style:")); QVBoxLayout *symbolBtnBoxLayout = new QVBoxLayout(); symbolBtnBox->setLayout(symbolBtnBoxLayout); QButtonGroup *symbolBtnGroup = new QButtonGroup(this); symbolBtnGroup->setExclusive(true); connect(symbolBtnGroup, SIGNAL(buttonClicked(int)), SLOT(styleChanged(int))); QRadioButton *plusSymbolBtn = new QRadioButton(tr("Positive charge")); if (style == SYM_PLUS) plusSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(plusSymbolBtn); symbolBtnGroup->addButton(plusSymbolBtn, SYM_PLUS); QRadioButton *minusSymbolBtn = new QRadioButton(tr("Negative charge")); if (style == SYM_MINUS) minusSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(minusSymbolBtn); symbolBtnGroup->addButton(minusSymbolBtn, SYM_MINUS); QRadioButton *partPlusSymbolBtn = new QRadioButton(tr("Partial positive charge")); if (style == SYM_DELTA_PLUS) partPlusSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(partPlusSymbolBtn); symbolBtnGroup->addButton(partPlusSymbolBtn, SYM_DELTA_PLUS); QRadioButton *partMinusSymbolBtn = new QRadioButton(tr("Partial negative charge")); if (style == SYM_DELTA_MINUS) partMinusSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(partMinusSymbolBtn); symbolBtnGroup->addButton(partMinusSymbolBtn, SYM_DELTA_MINUS); QRadioButton *singleSymbolBtn = new QRadioButton(tr("Single electron")); if (style == SYM_1E) singleSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(singleSymbolBtn); symbolBtnGroup->addButton(singleSymbolBtn, SYM_1E); QRadioButton *pairSymbolBtn = new QRadioButton(tr("Electron pair")); if (style == SYM_2E) pairSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(pairSymbolBtn); symbolBtnGroup->addButton(pairSymbolBtn, SYM_2E); QRadioButton *ringUpSymbolBtn = new QRadioButton(tr("Stereochemical ring hydrogen")); if (style == SYM_RING_UP) ringUpSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(ringUpSymbolBtn); symbolBtnGroup->addButton(ringUpSymbolBtn, SYM_RING_UP); QRadioButton *pOrbitalSymbolBtn = new QRadioButton(tr("p orbital")); if (style == SYM_P_ORBITAL) pOrbitalSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(pOrbitalSymbolBtn); symbolBtnGroup->addButton(pOrbitalSymbolBtn, SYM_P_ORBITAL); QRadioButton *pDoubleSymbolBtn = new QRadioButton(tr("p double")); if (style == SYM_P_DOUBLE) pDoubleSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(pDoubleSymbolBtn); symbolBtnGroup->addButton(pDoubleSymbolBtn, SYM_P_DOUBLE); QRadioButton *beadSymbolBtn = new QRadioButton(tr("bead")); if (style == SYM_BEAD) beadSymbolBtn->setChecked(true); symbolBtnBoxLayout->addWidget(beadSymbolBtn); symbolBtnGroup->addButton(beadSymbolBtn, SYM_BEAD); mygrid->addWidget(symbolBtnBox, 0, 1); } QHBoxLayout *btnLayout = new QHBoxLayout(); QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); btnLayout->addItem(spacer); QPushButton *okBtn, *dismissBtn; okBtn = new QPushButton(tr("OK"), this); connect(okBtn, SIGNAL(clicked()), SLOT(accept())); btnLayout->addWidget(okBtn); dismissBtn = new QPushButton(tr("Cancel"), this); connect(dismissBtn, SIGNAL(clicked()), SLOT(reject())); btnLayout->addWidget(dismissBtn); mygrid->addLayout(btnLayout, 4, 0, 1, 2); } void BondEditDialog::GetNewColor() { QColor nc1 = QColorDialog::getColor(color); if (nc1.isValid()) { color = nc1; colorBtn->setColor(color); } } // cmake#include "bondedit.moc" xdrawchem-v1.11.0/xdrawchem/bondedit.h000066400000000000000000000055001371466245600177030ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef BOND_EDIT_DIALOG_H #define BOND_EDIT_DIALOG_H #include #include #include #include #include #include "colorbutton.h" #include "dpoint.h" #include "previewwidget.h" class BondEditDialog : public QDialog { Q_OBJECT public: BondEditDialog(QWidget *parent, DPoint *s, DPoint *e, int ty, int o, int d, int th, int st, QColor c1); int Style() { return style; } int Order() { return order; } int Dash() { return dash; } QColor Color() { return color; } int Thick() { return thick; } int DoubleBond() { return dbond; } public slots: void GetNewColor(); void styleChanged(int s1) { style = s1; pw->updateWidget(type, thick, dash, order, style, color); } void orderChanged(int o1) { if (o1 == 0) { order = 1; dash = 1; } if (o1 == 1) { order = 1; dash = 0; } if (o1 == 2) { order = 2; dash = 0; } if (o1 == 3) { order = 3; dash = 0; } if (o1 == 5) { order = 5; dash = 0; } if (o1 == 6) { order = 6; dash = 0; } if (o1 == 7) { order = 7; dash = 0; } if (o1 == 11) { order = 2; dash = 1; } if (o1 == 12) { order = 3; dash = 1; } pw->updateWidget(type, thick, dash, order, style, color); } void setThick(int tnew) { qDebug() << "setThick: " << tnew; thick = tnew + 1; pw->updateWidget(type, thick, dash, order, style, color); } void setDoubleBond(int tnew) { dbond = tnew; dbList->setCurrentIndex(dbond); } private: ColorButton *colorBtn; QComboBox *ltList, *dbList; DPoint *s1, *e1; QColor color; int type; int order, dash, thick; int ahead, style, dbond; PreviewWidget *pw; }; #endif xdrawchem-v1.11.0/xdrawchem/boshcp.cpp000066400000000000000000001715131371466245600177340ustar00rootroot00000000000000// XDrawChem // Copyright (C) 1997 - 2000 Dr. Christoph Steinbeck // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // boshcp.cpp -- A C++/Qt version of the Bremser C13 prediction table. // See Bremser W, "Expectation Ranges of 13C NMR ChemicalShifts", Mag. Res. // Chem. 23(4):271-275 // Derived from Java implementation by Christoph Steinbeck, see copyright // notice above #include "boshcp.h" void BremserOneSphereHOSECodePredictor::prepareHashTable() { ht.put("%CC$(//)", HOSECodeShiftRange("%CC$(//)", 79.3, 16.4, "S", 112.7, 54.4, 36, 54)); ht.put("%CC(//)", HOSECodeShiftRange("%CC(//)", 81.8, 21.2, "S", 144.7, 32.9, 547, 1402)); ht.put("%CO(//)", HOSECodeShiftRange("%CO(//)", 88.2, 5.0, "S", 88.2, 88.2, 1, 1)); ht.put("%CN(//)", HOSECodeShiftRange("%CN(//)", 81.4, 5.0, "S", 83.6, 79.3, 2, 2)); ht.put("%CS(//)", HOSECodeShiftRange("%CS(//)", 80.2, 28.0, "S", 99.8, 68.1, 6, 7)); ht.put("%CP$(//)", HOSECodeShiftRange("%CP$(//)", 74.8, 5.0, "S", 77.9, 71.2, 8, 10)); ht.put("%CP(//)", HOSECodeShiftRange("%CP(//)", 77.7, 21.3, "S", 106.9, 60.4, 15, 25)); ht.put("%CQ(//)", HOSECodeShiftRange("%CQ(//)", 110.2, 30.4, "S", 132.3, 82.6, 15, 29)); ht.put("%CF(//)", HOSECodeShiftRange("%CF(//)", 90.1, 5.0, "S", 90.1, 90.1, 1, 1)); ht.put("%CX(//)", HOSECodeShiftRange("%CX(//)", 65.2, 35.3, "S", 79.8, 56.7, 3, 4)); ht.put("%CY(//)", HOSECodeShiftRange("%CY(//)", 41.7, 13.8, "S", 50.1, 37.0, 6, 9)); ht.put("%CI(//)", HOSECodeShiftRange("%CI(//)", 0.0, 17.6, "S", 9.0, -6.3, 3, 5)); ht.put("%C(//)", HOSECodeShiftRange("%C(//)", 72.6, 13.3, "D", 96.3, 22.0, 103, 265)); ht.put("%NC$(//)", HOSECodeShiftRange("%NC$(//)", 113.0, 5.0, "S", 113.1, 112.9, 2, 2)); ht.put("%NC(//)", HOSECodeShiftRange("%NC(//)", 116.7, 8.4, "S", 133.2, 37.7, 806, 2046)); ht.put("%NO(//)", HOSECodeShiftRange("%NO(//)", 109.1, 5.0, "S", 109.7, 108.5, 1, 7)); ht.put("%NN(//)", HOSECodeShiftRange("%NN(//)", 116.8, 6.6, "S", 124.1, 105.7, 34, 57)); ht.put("%NS(//)", HOSECodeShiftRange("%NS(//)", 116.9, 16.7, "S", 134.1, 107.0, 27, 73)); ht.put("%NP(//)", HOSECodeShiftRange("%NP(//)", 119.1, 5.0, "S", 120.3, 118.0, 2, 2)); ht.put("%NB(//)", HOSECodeShiftRange("%NB(//)", 165.4, 5.0, "S", 165.4, 165.4, 1, 1)); ht.put("%N(//)", HOSECodeShiftRange("%N(//)", 112.7, 5.0, "D", 112.8, 112.6, 1, 2)); ht.put("%PC(//)", HOSECodeShiftRange("%PC(//)", 164.9, 5.0, "S", 164.9, 164.9, 1, 1)); ht.put("=C=C(//)", HOSECodeShiftRange("=C=C(//)", 189.9, 51.3, "S", 235.4, 97.4, 108, 156)); ht.put("=C=O(//)", HOSECodeShiftRange("=C=O(//)", 172.0, 68.1, "S", 206.2, 18.5, 26, 37)); ht.put("=C=N(//)", HOSECodeShiftRange("=C=N(//)", 197.4, 28.2, "S", 227.6, 186.7, 15, 15)); ht.put("=C=S(//)", HOSECodeShiftRange("=C=S(//)", 269.1, 5.0, "S", 269.1, 269.1, 1, 1)); ht.put("=CC$C$(//)", HOSECodeShiftRange("=CC$C$(//)", 111.1, 28.4, "S", 153.7, 80.5, 130, 289)); ht.put("=CC$C(//)", HOSECodeShiftRange("=CC$C(//)", 126.9, 32.3, "S", 187.4, 63.1, 1243, 3017)); ht.put("=CC$O(//)", HOSECodeShiftRange("=CC$O(//)", 148.5, 25.4, "S", 201.0, 118.0, 207, 409)); ht.put("=CC$N$$(//)", HOSECodeShiftRange("=CC$N$$(//)", 130.5, 36.0, "S", 143.3, 120.9, 4, 4)); ht.put("=CC$N(//)", HOSECodeShiftRange("=CC$N(//)", 129.8, 29.0, "S", 161.4, 90.2, 257, 546)); ht.put("=CC$S$$(//)", HOSECodeShiftRange("=CC$S$$(//)", 113.8, 5.0, "S", 115.3, 112.4, 3, 4)); ht.put("=CC$S$(//)", HOSECodeShiftRange("=CC$S$(//)", 115.0, 12.1, "S", 121.8, 110.3, 4, 5)); ht.put("=CC$S(//)", HOSECodeShiftRange("=CC$S(//)", 131.3, 39.0, "S", 185.8, 57.9, 86, 133)); ht.put("=CC$P$(//)", HOSECodeShiftRange("=CC$P$(//)", 125.1, 5.0, "S", 130.5, 119.7, 1, 2)); ht.put("=CC$F(//)", HOSECodeShiftRange("=CC$F(//)", 142.7, 9.4, "S", 152.1, 135.5, 5, 12)); ht.put("=CC$X(//)", HOSECodeShiftRange("=CC$X(//)", 131.3, 28.0, "S", 188.0, 87.4, 73, 164)); ht.put("=CC$Y(//)", HOSECodeShiftRange("=CC$Y(//)", 116.1, 23.9, "S", 134.8, 89.1, 30, 43)); ht.put("=CC$I(//)", HOSECodeShiftRange("=CC$I(//)", 88.6, 32.8, "S", 105.7, 72.7, 5, 5)); ht.put("=CC$(//)", HOSECodeShiftRange("=CC$(//)", 119.6, 25.2, "D", 166.9, 63.5, 1159, 3433)); ht.put("=CCC(//)", HOSECodeShiftRange("=CCC(//)", 136.2, 34.9, "S", 238.3, 39.4, 3854, 10753)); ht.put("=CC$CC(//)", HOSECodeShiftRange("=CC$CC(//)", 124.6, 17.4, "*", 135.8, 112.4, 5, 15)); ht.put("=CC$C(//)", HOSECodeShiftRange("=CC$C(//)", 113.5, 21.5, "S", 121.1, 107.3, 2, 3)); ht.put("=CC$(//)", HOSECodeShiftRange("=CC$(//)", 109.8, 5.0, "D", 109.8, 109.8, 1, 1)); ht.put("=CCO(//)", HOSECodeShiftRange("=CCO(//)", 161.6, 28.5, "S", 208.4, 110.7, 883, 1892)); ht.put("=CCN$$(//)", HOSECodeShiftRange("=CCN$$(//)", 137.8, 21.4, "S", 164.4, 120.5, 62, 97)); ht.put("=CCN(//)", HOSECodeShiftRange("=CCN(//)", 141.8, 27.7, "S", 181.7, 76.9, 892, 2035)); ht.put("=CCS$$(//)", HOSECodeShiftRange("=CCS$$(//)", 131.8, 60.2, "S", 152.8, 69.0, 11, 15)); ht.put("=CCS$(//)", HOSECodeShiftRange("=CCS$(//)", 144.5, 30.8, "S", 153.0, 109.2, 7, 10)); ht.put("=CCS(//)", HOSECodeShiftRange("=CCS(//)", 139.7, 34.2, "S", 181.5, 78.1, 265, 519)); ht.put("=CCP$(//)", HOSECodeShiftRange("=CCP$(//)", 124.1, 41.3, "S", 146.5, 95.3, 8, 11)); ht.put("=CCP(//)", HOSECodeShiftRange("=CCP(//)", 126.5, 73.3, "S", 161.3, 30.8, 21, 31)); ht.put("=CCQ(//)", HOSECodeShiftRange("=CCQ(//)", 141.3, 58.1, "S", 183.7, 73.7, 26, 41)); ht.put("=CCB(//)", HOSECodeShiftRange("=CCB(//)", 151.2, 115.0, "S", 180.1, 127.3, 3, 3)); ht.put("=CCF(//)", HOSECodeShiftRange("=CCF(//)", 149.7, 26.5, "S", 180.0, 121.8, 17, 22)); ht.put("=CCX(//)", HOSECodeShiftRange("=CCX(//)", 132.0, 17.3, "S", 166.8, 87.9, 267, 746)); ht.put("=CCY(//)", HOSECodeShiftRange("=CCY(//)", 110.7, 29.8, "S", 161.5, 80.6, 82, 99)); ht.put("=CCI(//)", HOSECodeShiftRange("=CCI(//)", 91.8, 48.7, "S", 130.6, 64.2, 7, 8)); ht.put("=CC(//)", HOSECodeShiftRange("=CC(//)", 127.8, 25.7, "D", 223.5, 12.1, 7600, 21001)); ht.put("=C$=C$(//)", HOSECodeShiftRange("=C$=C$(//)", -14.6, 5.0, "S", -14.6, -14.6, 1, 1)); ht.put("=C$C$C$(//)", HOSECodeShiftRange("=C$C$C$(//)", 48.3, 5.0, "S", 48.3, 48.3, 1, 1)); ht.put("=C$CC(//)", HOSECodeShiftRange("=C$CC(//)", 25.9, 47.7, "S", 51.7, -5.3, 7, 9)); ht.put("=C$CP(//)", HOSECodeShiftRange("=C$CP(//)", 39.2, 5.0, "S", 39.2, 39.2, 1, 1)); ht.put("=C$CX(//)", HOSECodeShiftRange("=C$CX(//)", 85.0, 5.0, "S", 85.0, 85.0, 1, 1)); ht.put("=C$C(//)", HOSECodeShiftRange("=C$C(//)", 19.3, 38.2, "D", 28.6, 10.9, 3, 3)); ht.put("=C$X(//)", HOSECodeShiftRange("=C$X(//)", 70.1, 5.0, "D", 70.1, 70.1, 1, 1)); ht.put("=C$(//)", HOSECodeShiftRange("=C$(//)", 2.7, 5.0, "I", 2.9, 2.5, 1, 3)); ht.put("=COO(//)", HOSECodeShiftRange("=COO(//)", 168.6, 18.7, "S", 184.2, 141.9, 43, 81)); ht.put("=CON$$(//)", HOSECodeShiftRange("=CON$$(//)", 152.7, 5.0, "S", 153.7, 151.5, 4, 11)); ht.put("=CON(//)", HOSECodeShiftRange("=CON(//)", 158.1, 16.2, "S", 173.8, 129.8, 69, 122)); ht.put("=COS$$(//)", HOSECodeShiftRange("=COS$$(//)", 161.1, 5.0, "S", 161.1, 161.1, 1, 1)); ht.put("=COS(//)", HOSECodeShiftRange("=COS(//)", 154.8, 26.4, "S", 172.8, 148.2, 6, 7)); ht.put("=COQ(//)", HOSECodeShiftRange("=COQ(//)", 158.5, 16.4, "S", 173.0, 151.3, 9, 17)); ht.put("=COX(//)", HOSECodeShiftRange("=COX(//)", 141.5, 27.2, "S", 148.7, 126.7, 3, 3)); ht.put("=COY(//)", HOSECodeShiftRange("=COY(//)", 122.4, 5.0, "S", 125.1, 120.8, 5, 8)); ht.put("=COI(//)", HOSECodeShiftRange("=COI(//)", 88.5, 5.0, "S", 88.5, 88.5, 1, 1)); ht.put("=CO(//)", HOSECodeShiftRange("=CO(//)", 144.8, 16.4, "D", 193.6, 109.3, 399, 1555)); ht.put("=CN$$N(//)", HOSECodeShiftRange("=CN$$N(//)", 137.9, 11.0, "S", 151.2, 128.4, 12, 17)); ht.put("=CN$$S(//)", HOSECodeShiftRange("=CN$$S(//)", 147.2, 10.1, "S", 154.3, 129.7, 11, 16)); ht.put("=CN$$(//)", HOSECodeShiftRange("=CN$$(//)", 120.0, 38.1, "D", 142.9, 96.8, 10, 13)); ht.put("=CN$S(//)", HOSECodeShiftRange("=CN$S(//)", 152.8, 5.0, "S", 153.4, 152.2, 2, 2)); ht.put("=CNN(//)", HOSECodeShiftRange("=CNN(//)", 149.0, 16.4, "S", 169.1, 121.3, 117, 185)); ht.put("=CNS(//)", HOSECodeShiftRange("=CNS(//)", 154.3, 24.4, "S", 181.5, 125.8, 52, 77)); ht.put("=CNP$(//)", HOSECodeShiftRange("=CNP$(//)", 142.1, 5.0, "S", 146.6, 137.6, 1, 2)); ht.put("=CNQ(//)", HOSECodeShiftRange("=CNQ(//)", 140.7, 35.2, "S", 150.0, 134.5, 3, 3)); ht.put("=CNF(//)", HOSECodeShiftRange("=CNF(//)", 151.8, 5.0, "S", 152.3, 151.3, 2, 2)); ht.put("=CNX(//)", HOSECodeShiftRange("=CNX(//)", 129.3, 28.6, "S", 162.4, 106.1, 25, 33)); ht.put("=CNY(//)", HOSECodeShiftRange("=CNY(//)", 111.2, 23.6, "S", 136.5, 94.4, 23, 30)); ht.put("=CNI(//)", HOSECodeShiftRange("=CNI(//)", 81.8, 5.0, "S", 81.8, 81.8, 1, 1)); ht.put("=CN(//)", HOSECodeShiftRange("=CN(//)", 131.5, 27.1, "D", 167.5, 86.1, 925, 1980)); ht.put("=CS$$X(//)", HOSECodeShiftRange("=CS$$X(//)", 129.7, 5.0, "S", 129.7, 129.7, 1, 1)); ht.put("=CS$$Y(//)", HOSECodeShiftRange("=CS$$Y(//)", 122.7, 5.0, "S", 122.7, 122.7, 1, 1)); ht.put("=CS$$(//)", HOSECodeShiftRange("=CS$$(//)", 121.6, 40.9, "D", 145.1, 62.4, 20, 37)); ht.put("=CS$X(//)", HOSECodeShiftRange("=CS$X(//)", 137.3, 5.0, "S", 143.5, 131.1, 2, 2)); ht.put("=CS$Y(//)", HOSECodeShiftRange("=CS$Y(//)", 131.5, 5.0, "S", 131.5, 131.5, 1, 1)); ht.put("=CS$(//)", HOSECodeShiftRange("=CS$(//)", 116.9, 60.2, "D", 148.4, 59.3, 13, 15)); ht.put("=CSS(//)", HOSECodeShiftRange("=CSS(//)", 145.4, 37.6, "S", 195.6, 106.4, 47, 74)); ht.put("=CSB(//)", HOSECodeShiftRange("=CSB(//)", 143.1, 5.0, "S", 143.1, 143.1, 1, 1)); ht.put("=CSF(//)", HOSECodeShiftRange("=CSF(//)", 166.5, 5.0, "S", 166.5, 166.5, 1, 1)); ht.put("=CSX(//)", HOSECodeShiftRange("=CSX(//)", 129.4, 16.0, "S", 150.3, 114.7, 17, 26)); ht.put("=CSY(//)", HOSECodeShiftRange("=CSY(//)", 114.3, 10.1, "S", 125.5, 92.1, 24, 46)); ht.put("=CSI(//)", HOSECodeShiftRange("=CSI(//)", 77.3, 14.5, "S", 82.2, 73.1, 2, 4)); ht.put("=CS(//)", HOSECodeShiftRange("=CS(//)", 125.7, 24.0, "D", 190.2, 33.2, 258, 562)); ht.put("=CP$(//)", HOSECodeShiftRange("=CP$(//)", 109.4, 42.2, "D", 131.3, 73.7, 15, 21)); ht.put("=CP(//)", HOSECodeShiftRange("=CP(//)", 101.9, 68.3, "D", 148.2, 29.6, 64, 116)); ht.put("=CQQ(//)", HOSECodeShiftRange("=CQQ(//)", 128.6, 127.6, "S", 189.6, 59.0, 7, 14)); ht.put("=CQX(//)", HOSECodeShiftRange("=CQX(//)", 143.0, 5.0, "S", 143.0, 143.0, 1, 2)); ht.put("=CQ(//)", HOSECodeShiftRange("=CQ(//)", 132.4, 31.8, "D", 152.2, 81.8, 21, 37)); ht.put("=CB(//)", HOSECodeShiftRange("=CB(//)", 143.4, 33.0, "D", 177.9, 114.3, 12, 20)); ht.put("=CFF(//)", HOSECodeShiftRange("=CFF(//)", 156.8, 5.0, "S", 157.4, 156.0, 2, 3)); ht.put("=CFY(//)", HOSECodeShiftRange("=CFY(//)", 138.3, 5.0, "S", 138.3, 138.3, 1, 1)); ht.put("=CF(//)", HOSECodeShiftRange("=CF(//)", 149.5, 5.0, "D", 151.3, 147.7, 2, 2)); ht.put("=CXX(//)", HOSECodeShiftRange("=CXX(//)", 122.8, 13.9, "S", 144.5, 106.8, 67, 123)); ht.put("=CX(//)", HOSECodeShiftRange("=CX(//)", 121.5, 20.1, "D", 156.2, 87.9, 49, 120)); ht.put("=CYY(//)", HOSECodeShiftRange("=CYY(//)", 92.2, 13.3, "S", 103.9, 89.1, 7, 8)); ht.put("=CYI(//)", HOSECodeShiftRange("=CYI(//)", 70.3, 5.0, "S", 70.3, 70.3, 1, 1)); ht.put("=CY(//)", HOSECodeShiftRange("=CY(//)", 112.4, 19.0, "D", 139.4, 74.0, 25, 62)); ht.put("=CII(//)", HOSECodeShiftRange("=CII(//)", 30.5, 5.0, "S", 32.4, 28.7, 2, 2)); ht.put("=CI(//)", HOSECodeShiftRange("=CI(//)", 90.2, 21.0, "D", 103.9, 82.3, 5, 8)); ht.put("=C(//)", HOSECodeShiftRange("=C(//)", 112.6, 23.0, "T", 155.1, 12.5, 907, 3109)); ht.put("=O=N(//)", HOSECodeShiftRange("=O=N(//)", 124.8, 5.0, "S", 132.1, 115.9, 30, 72)); ht.put("=OC$C$(//)", HOSECodeShiftRange("=OC$C$(//)", 168.8, 5.0, "S", 168.8, 168.8, 1, 1)); ht.put("=OC$C(//)", HOSECodeShiftRange("=OC$C(//)", 188.2, 22.6, "S", 235.5, 103.6, 116, 216)); ht.put("=OC$O(//)", HOSECodeShiftRange("=OC$O(//)", 161.3, 9.3, "S", 182.1, 155.9, 36, 85)); ht.put("=OC$N(//)", HOSECodeShiftRange("=OC$N(//)", 158.4, 6.1, "S", 167.6, 148.7, 47, 93)); ht.put("=OC$S(//)", HOSECodeShiftRange("=OC$S(//)", 187.5, 5.0, "S", 189.0, 186.1, 2, 2)); ht.put("=OC$Q(//)", HOSECodeShiftRange("=OC$Q(//)", 199.2, 5.0, "S", 199.2, 199.2, 1, 1)); ht.put("=OCC(//)", HOSECodeShiftRange("=OCC(//)", 198.6, 25.4, "S", 244.3, 87.5, 3091, 7782)); ht.put("=OCO(//)", HOSECodeShiftRange("=OCO(//)", 170.6, 16.6, "S", 1000.0, 128.0, 4638, 16486)); ht.put("=OCN(//)", HOSECodeShiftRange("=OCN(//)", 168.7, 12.1, "S", 197.8, 34.3, 2161, 5520)); ht.put("=OCS(//)", HOSECodeShiftRange("=OCS(//)", 192.7, 24.2, "S", 213.6, 106.9, 78, 115)); ht.put("=OCP(//)", HOSECodeShiftRange("=OCP(//)", 229.0, 5.0, "S", 229.0, 229.0, 1, 1)); ht.put("=OCQ(//)", HOSECodeShiftRange("=OCQ(//)", 242.1, 68.1, "S", 291.7, 216.8, 6, 6)); ht.put("=OCF(//)", HOSECodeShiftRange("=OCF(//)", 157.4, 5.0, "S", 161.6, 155.9, 6, 31)); ht.put("=OCX(//)", HOSECodeShiftRange("=OCX(//)", 169.5, 8.8, "S", 180.0, 151.0, 77, 144)); ht.put("=OCY(//)", HOSECodeShiftRange("=OCY(//)", 173.7, 18.4, "S", 178.0, 165.3, 4, 4)); ht.put("=OC(//)", HOSECodeShiftRange("=OC(//)", 193.7, 14.5, "D", 212.2, 156.8, 414, 954)); ht.put("=OOO(//)", HOSECodeShiftRange("=OOO(//)", 153.9, 11.6, "S", 173.8, 148.1, 73, 127)); ht.put("=OON(//)", HOSECodeShiftRange("=OON(//)", 155.3, 6.9, "S", 186.4, 144.7, 309, 792)); ht.put("=OOS(//)", HOSECodeShiftRange("=OOS(//)", 163.1, 21.9, "S", 173.8, 147.1, 7, 9)); ht.put("=OOP$(//)", HOSECodeShiftRange("=OOP$(//)", 167.0, 5.0, "S", 167.0, 167.0, 1, 1)); ht.put("=OOX(//)", HOSECodeShiftRange("=OOX(//)", 151.0, 5.0, "S", 157.6, 147.2, 9, 22)); ht.put("=OO(//)", HOSECodeShiftRange("=OO(//)", 161.7, 6.1, "D", 172.8, 158.5, 22, 73)); ht.put("=ONN(//)", HOSECodeShiftRange("=ONN(//)", 154.8, 10.0, "S", 185.1, 112.2, 422, 1159)); ht.put("=ONS$$(//)", HOSECodeShiftRange("=ONS$$(//)", 161.2, 5.0, "S", 161.8, 160.8, 2, 4)); ht.put("=ONS$(//)", HOSECodeShiftRange("=ONS$(//)", 168.4, 5.0, "S", 169.0, 167.9, 2, 4)); ht.put("=ONS(//)", HOSECodeShiftRange("=ONS(//)", 167.7, 6.3, "S", 173.4, 157.1, 32, 45)); ht.put("=ONP$(//)", HOSECodeShiftRange("=ONP$(//)", 169.4, 5.0, "S", 170.1, 168.8, 2, 2)); ht.put("=ONP(//)", HOSECodeShiftRange("=ONP(//)", 166.0, 5.0, "S", 167.6, 164.4, 1, 2)); ht.put("=ONB(//)", HOSECodeShiftRange("=ONB(//)", 182.8, 5.0, "S", 182.8, 182.8, 1, 1)); ht.put("=ONX(//)", HOSECodeShiftRange("=ONX(//)", 147.5, 5.0, "S", 149.2, 144.6, 7, 9)); ht.put("=ONY(//)", HOSECodeShiftRange("=ONY(//)", 146.5, 5.0, "S", 146.5, 146.5, 1, 1)); ht.put("=ON(//)", HOSECodeShiftRange("=ON(//)", 162.5, 5.0, "D", 168.4, 155.8, 62, 140)); ht.put("=OSS(//)", HOSECodeShiftRange("=OSS(//)", 190.2, 6.1, "S", 192.6, 188.3, 2, 4)); ht.put("=OSX(//)", HOSECodeShiftRange("=OSX(//)", 164.2, 5.0, "S", 165.0, 163.4, 1, 2)); ht.put("=OS(//)", HOSECodeShiftRange("=OS(//)", 187.7, 5.0, "D", 187.7, 187.7, 1, 1)); ht.put("=O(//)", HOSECodeShiftRange("=O(//)", 60.6, 5.0, "T", 60.6, 60.6, 1, 1)); ht.put("=N=N(//)", HOSECodeShiftRange("=N=N(//)", 136.3, 10.2, "S", 143.6, 125.6, 19, 26)); ht.put("=N=S(//)", HOSECodeShiftRange("=N=S(//)", 134.7, 11.6, "S", 150.1, 121.0, 29, 70)); ht.put("=NC$C$(//)", HOSECodeShiftRange("=NC$C$(//)", 115.9, 55.2, "S", 145.6, 65.4, 16, 24)); ht.put("=NC$C(//)", HOSECodeShiftRange("=NC$C(//)", 144.9, 41.4, "S", 176.4, 60.0, 101, 183)); ht.put("=NC$O(//)", HOSECodeShiftRange("=NC$O(//)", 153.1, 14.6, "S", 162.5, 146.1, 5, 6)); ht.put("=NC$N(//)", HOSECodeShiftRange("=NC$N(//)", 144.8, 14.1, "S", 159.7, 136.8, 12, 21)); ht.put("=NC$S(//)", HOSECodeShiftRange("=NC$S(//)", 159.7, 7.4, "S", 165.9, 153.6, 8, 10)); ht.put("=NC$P$(//)", HOSECodeShiftRange("=NC$P$(//)", 52.4, 5.0, "S", 56.1, 48.7, 1, 2)); ht.put("=CN$X(//)", HOSECodeShiftRange("=CN$X(//)", 142.8, 30.6, "S", 160.9, 136.3, 2, 4)); ht.put("=NC$(//)", HOSECodeShiftRange("=NC$(//)", 121.5, 72.4, "D", 150.8, 46.0, 32, 46)); ht.put("=NCC(//)", HOSECodeShiftRange("=NCC(//)", 156.3, 27.8, "S", 207.3, 51.2, 604, 1575)); ht.put("=NCO(//)", HOSECodeShiftRange("=NCO(//)", 163.6, 18.6, "S", 195.1, 143.3, 140, 255)); ht.put("=NCN(//)", HOSECodeShiftRange("=NCN(//)", 155.3, 16.1, "S", 185.6, 129.9, 330, 658)); ht.put("=NCS$$(//)", HOSECodeShiftRange("=NCS$$(//)", 162.9, 5.0, "S", 162.9, 162.9, 1, 1)); ht.put("=NCS(//)", HOSECodeShiftRange("=NCS(//)", 165.2, 17.6, "S", 193.3, 134.9, 113, 238)); ht.put("=NCF(//)", HOSECodeShiftRange("=NCF(//)", 150.4, 23.6, "S", 156.8, 147.3, 2, 3)); ht.put("=NCX(//)", HOSECodeShiftRange("=NCX(//)", 154.3, 28.7, "S", 184.5, 131.0, 25, 31)); ht.put("=NCY(//)", HOSECodeShiftRange("=NCY(//)", 128.5, 16.5, "S", 143.8, 117.1, 9, 15)); ht.put("=NCI(//)", HOSECodeShiftRange("=NCI(//)", 93.3, 5.0, "S", 93.3, 93.3, 1, 1)); ht.put("=NC(//)", HOSECodeShiftRange("=NC(//)", 151.0, 27.9, "D", 187.0, 47.2, 519, 1125)); ht.put("=NOO(//)", HOSECodeShiftRange("=NOO(//)", 163.9, 9.0, "S", 171.1, 159.8, 4, 11)); ht.put("=NON(//)", HOSECodeShiftRange("=NON(//)", 155.5, 13.7, "S", 174.6, 139.2, 38, 62)); ht.put("=NOS(//)", HOSECodeShiftRange("=NOS(//)", 164.9, 14.7, "S", 175.8, 157.9, 9, 12)); ht.put("=NO(//)", HOSECodeShiftRange("=NO(//)", 155.5, 11.6, "D", 171.6, 143.6, 19, 33)); ht.put("=NN$$S(//)", HOSECodeShiftRange("=NN$$S(//)", 165.7, 5.0, "S", 166.0, 165.4, 1, 2)); ht.put("=NNN(//)", HOSECodeShiftRange("=NNN(//)", 155.8, 10.7, "S", 180.0, 135.0, 263, 479)); ht.put("=NNS$(//)", HOSECodeShiftRange("=NNS$(//)", 162.4, 5.0, "S", 162.6, 162.2, 1, 2)); ht.put("=NNS(//)", HOSECodeShiftRange("=NNS(//)", 162.4, 16.7, "S", 187.1, 140.2, 245, 459)); ht.put("=NNP(//)", HOSECodeShiftRange("=NNP(//)", 186.5, 31.0, "S", 194.8, 182.1, 3, 3)); ht.put("=NNX(//)", HOSECodeShiftRange("=NNX(//)", 144.7, 17.2, "S", 152.7, 132.5, 8, 10)); ht.put("=NNY(//)", HOSECodeShiftRange("=NNY(//)", 127.6, 14.5, "S", 139.3, 121.5, 6, 8)); ht.put("=NN(//)", HOSECodeShiftRange("=NN(//)", 145.0, 13.6, "D", 175.1, 121.3, 310, 918)); ht.put("=NS$$S(//)", HOSECodeShiftRange("=NS$$S(//)", 155.9, 5.0, "S", 155.9, 155.9, 1, 1)); ht.put("=NS$$P$(//)", HOSECodeShiftRange("=NS$$P$(//)", 60.2, 5.0, "S", 61.3, 59.1, 1, 2)); ht.put("=NS$S(//)", HOSECodeShiftRange("=NS$S(//)", 177.6, 5.0, "S", 177.6, 177.6, 1, 1)); ht.put("=NSS(//)", HOSECodeShiftRange("=NSS(//)", 166.1, 34.3, "S", 197.2, 138.6, 35, 68)); ht.put("=NSF(//)", HOSECodeShiftRange("=NSF(//)", 168.6, 5.0, "S", 168.6, 168.6, 1, 1)); ht.put("=NSX(//)", HOSECodeShiftRange("=NSX(//)", 153.6, 24.5, "S", 178.1, 137.9, 9, 14)); ht.put("=NSY(//)", HOSECodeShiftRange("=NSY(//)", 133.2, 24.1, "S", 138.8, 124.2, 3, 3)); ht.put("=NS(//)", HOSECodeShiftRange("=NS(//)", 155.6, 20.0, "D", 183.6, 141.4, 22, 54)); ht.put("=NP$P$(//)", HOSECodeShiftRange("=NP$P$(//)", 37.9, 5.0, "S", 37.9, 37.9, 1, 1)); ht.put("=NXX(//)", HOSECodeShiftRange("=NXX(//)", 143.8, 5.0, "S", 160.5, 127.1, 2, 2)); ht.put("=NX(//)", HOSECodeShiftRange("=NX(//)", 166.2, 5.0, "D", 166.2, 166.2, 1, 2)); ht.put("=N(//)", HOSECodeShiftRange("=N(//)", 118.5, 93.6, "T", 170.5, 22.9, 11, 24)); ht.put("=S=S(//)", HOSECodeShiftRange("=S=S(//)", 192.7, 5.0, "S", 192.8, 192.6, 1, 4)); ht.put("=SC$C(//)", HOSECodeShiftRange("=SC$C(//)", 152.4, 5.0, "S", 152.4, 152.4, 1, 1)); ht.put("=SC$O(//)", HOSECodeShiftRange("=SC$O(//)", 207.5, 5.0, "S", 214.3, 200.7, 2, 2)); ht.put("=SC$N(//)", HOSECodeShiftRange("=SC$N(//)", 191.1, 24.5, "S", 198.1, 182.0, 4, 4)); ht.put("=SCC(//)", HOSECodeShiftRange("=SCC(//)", 214.7, 70.9, "S", 278.4, 166.7, 41, 70)); ht.put("=SCO(//)", HOSECodeShiftRange("=SCO(//)", 206.0, 20.7, "S", 221.2, 183.7, 16, 21)); ht.put("=SCN(//)", HOSECodeShiftRange("=SCN(//)", 194.8, 20.4, "S", 212.5, 165.2, 88, 155)); ht.put("=SCS(//)", HOSECodeShiftRange("=SCS(//)", 209.8, 63.8, "S", 251.6, 127.9, 24, 29)); ht.put("=SCX(//)", HOSECodeShiftRange("=SCX(//)", 202.3, 5.0, "S", 202.3, 202.3, 1, 1)); ht.put("=SC(//)", HOSECodeShiftRange("=SC(//)", 197.9, 64.8, "D", 206.6, 180.5, 2, 3)); ht.put("=S$C$C$(//)", HOSECodeShiftRange("=S$C$C$(//)", 66.3, 5.0, "S", 66.3, 66.3, 1, 1)); ht.put("=S$(//)", HOSECodeShiftRange("=S$(//)", 32.8, 5.0, "T", 32.8, 32.8, 1, 1)); ht.put("=SOO(//)", HOSECodeShiftRange("=SOO(//)", 191.0, 5.0, "S", 193.3, 185.4, 6, 18)); ht.put("=SON(//)", HOSECodeShiftRange("=SON(//)", 184.1, 9.2, "S", 192.9, 174.0, 18, 38)); ht.put("=SOS(//)", HOSECodeShiftRange("=SOS(//)", 211.4, 15.0, "S", 233.7, 205.6, 9, 24)); ht.put("=SOX(//)", HOSECodeShiftRange("=SOX(//)", 184.4, 5.0, "S", 184.4, 184.4, 1, 1)); ht.put("=SNN(//)", HOSECodeShiftRange("=SNN(//)", 179.3, 9.5, "S", 194.6, 157.5, 272, 693)); ht.put("=SNS(//)", HOSECodeShiftRange("=SNS(//)", 193.4, 17.3, "S", 215.8, 172.0, 68, 148)); ht.put("=SNP$(//)", HOSECodeShiftRange("=SNP$(//)", 196.1, 5.0, "S", 196.9, 194.7, 4, 11)); ht.put("=SNX(//)", HOSECodeShiftRange("=SNX(//)", 174.1, 5.0, "S", 175.5, 172.7, 1, 2)); ht.put("=SN(//)", HOSECodeShiftRange("=SN(//)", 187.8, 12.0, "D", 205.9, 183.7, 10, 14)); ht.put("=SSS(//)", HOSECodeShiftRange("=SSS(//)", 219.7, 15.8, "S", 231.7, 207.0, 14, 22)); ht.put("=SSX(//)", HOSECodeShiftRange("=SSX(//)", 192.4, 5.0, "S", 195.1, 189.8, 2, 2)); ht.put("=SXX(//)", HOSECodeShiftRange("=SXX(//)", 193.7, 5.0, "S", 217.4, 170.1, 2, 2)); ht.put("=S(//)", HOSECodeShiftRange("=S(//)", 30.5, 5.0, "T", 30.5, 30.5, 1, 1)); ht.put("=P=P(//)", HOSECodeShiftRange("=P=P(//)", 8.3, 5.0, "S", 10.8, 5.8, 2, 2)); ht.put("=PC$(//)", HOSECodeShiftRange("=PC$(//)", 52.4, 5.0, "D", 53.8, 51.4, 2, 3)); ht.put("=PCC(//)", HOSECodeShiftRange("=PCC(//)", 106.5, 136.5, "S", 193.4, 77.4, 5, 5)); ht.put("=PCO(//)", HOSECodeShiftRange("=PCO(//)", 215.7, 5.0, "S", 216.0, 215.5, 2, 2)); ht.put("=PC(//)", HOSECodeShiftRange("=PC(//)", 51.7, 93.4, "D", 128.5, 3.2, 8, 11)); ht.put("=POP(//)", HOSECodeShiftRange("=POP(//)", 205.3, 5.0, "S", 205.3, 205.3, 1, 1)); ht.put("=PNN(//)", HOSECodeShiftRange("=PNN(//)", 186.5, 31.0, "S", 194.8, 182.1, 3, 3)); ht.put("=PSS(//)", HOSECodeShiftRange("=PSS(//)", 27.6, 5.0, "S", 28.4, 26.8, 2, 2)); ht.put("=PP(//)", HOSECodeShiftRange("=PP(//)", 7.4, 5.0, "D", 8.2, 6.8, 2, 5)); ht.put("=PQQ(//)", HOSECodeShiftRange("=PQQ(//)", 12.0, 33.4, "S", 30.6, 0.3, 4, 5)); ht.put("=PQ(//)", HOSECodeShiftRange("=PQ(//)", 90.2, 5.0, "D", 147.9, 32.6, 2, 2)); ht.put("=P(//)", HOSECodeShiftRange("=P(//)", -4.7, 13.0, "T", 10.0, -14.2, 11, 13)); ht.put("=BCB(//)", HOSECodeShiftRange("=BCB(//)", 115.2, 5.0, "S", 115.2, 115.2, 1, 1)); ht.put("*C*C*C(//)", HOSECodeShiftRange("*C*C*C(//)", 130.5, 11.0, "S", 162.1, 99.1, 896, 3851)); ht.put("*C*C*O(//)", HOSECodeShiftRange("*C*C*O(//)", 159.5, 9.6, "S", 168.7, 154.7, 4, 10)); ht.put("*C*C*N(//)", HOSECodeShiftRange("*C*C*N(//)", 142.4, 11.9, "S", 159.7, 120.4, 214, 766)); ht.put("*C*C*S(//)", HOSECodeShiftRange("*C*C*S(//)", 167.5, 5.0, "S", 167.5, 167.5, 1, 2)); ht.put("*C*CC$(//)", HOSECodeShiftRange("*C*CC$(//)", 126.9, 20.4, "S", 173.2, 77.1, 1774, 6780)); ht.put("*C*CC(//)", HOSECodeShiftRange("*C*CC(//)", 134.5, 19.8, "S", 186.2, 74.6, 7374, 26549)); ht.put("*C*CO(//)", HOSECodeShiftRange("*C*CO(//)", 153.6, 14.1, "S", 184.7, 115.2, 2544, 13422)); ht.put("*C*CN$$(//)", HOSECodeShiftRange("*C*CN$$(//)", 143.8, 11.5, "S", 159.1, 119.2, 473, 1514)); ht.put("*C*CN$(//)", HOSECodeShiftRange("*C*CN$(//)", 160.6, 18.6, "S", 166.8, 141.4, 9, 12)); ht.put("*C*CN(//)", HOSECodeShiftRange("*C*CN(//)", 140.4, 17.1, "S", 168.2, 77.3, 2283, 7826)); ht.put("*C*CS$$(//)", HOSECodeShiftRange("*C*CS$$(//)", 136.7, 12.4, "S", 162.5, 105.5, 280, 993)); ht.put("*C*CS$(//)", HOSECodeShiftRange("*C*CS$(//)", 143.4, 13.0, "S", 164.8, 122.9, 40, 89)); ht.put("*C*CS(//)", HOSECodeShiftRange("*C*CS(//)", 132.8, 16.4, "S", 162.1, 104.7, 346, 860)); ht.put("*C*CP$(//)", HOSECodeShiftRange("*C*CP$(//)", 132.5, 11.3, "S", 165.9, 107.6, 36, 141)); ht.put("*C*CP(//)", HOSECodeShiftRange("*C*CP(//)", 129.4, 16.5, "S", 159.6, 113.1, 127, 1065)); ht.put("*C*CQ(//)", HOSECodeShiftRange("*C*CQ(//)", 136.9, 10.7, "S", 166.1, 92.6, 73, 259)); ht.put("*C*CB(//)", HOSECodeShiftRange("*C*CB(//)", 146.2, 23.4, "S", 163.9, 127.3, 12, 31)); ht.put("*C*CF(//)", HOSECodeShiftRange("*C*CF(//)", 155.2, 18.9, "S", 175.3, 121.7, 290, 1101)); ht.put("*C*CX(//)", HOSECodeShiftRange("*C*CX(//)", 129.8, 14.4, "S", 151.8, 95.6, 808, 3670)); ht.put("*C*CY(//)", HOSECodeShiftRange("*C*CY(//)", 118.7, 15.2, "S", 166.3, 93.5, 279, 758)); ht.put("*C*CI(//)", HOSECodeShiftRange("*C*CI(//)", 94.3, 20.4, "S", 122.2, 65.6, 120, 248)); ht.put("*C*C(//)", HOSECodeShiftRange("*C*C(//)", 125.3, 14.3, "D", 180.9, 52.9, 16673, 124916)); ht.put("H*C*C(//)", HOSECodeShiftRange("H*C*C(//)", 125.3, 14.3, "D", 180.9, 52.9, 16673, 124916)); ht.put("*C*O*N(//)", HOSECodeShiftRange("*C*O*N(//)", 179.8, 5.0, "S", 179.8, 179.8, 1, 1)); ht.put("*C*OC$(//)", HOSECodeShiftRange("*C*OC$(//)", 203.6, 5.0, "S", 203.6, 203.6, 1, 1)); ht.put("*C*OC(//)", HOSECodeShiftRange("*C*OC(//)", 179.1, 22.6, "S", 216.0, 146.8, 46, 150)); ht.put("*C*OO(//)", HOSECodeShiftRange("*C*OO(//)", 171.4, 5.0, "S", 171.4, 171.4, 1, 2)); ht.put("*C*ON(//)", HOSECodeShiftRange("*C*ON(//)", 160.6, 10.4, "S", 167.1, 153.8, 10, 16)); ht.put("*C*O(//)", HOSECodeShiftRange("*C*O(//)", 176.7, 31.8, "D", 191.9, 147.0, 8, 19)); ht.put("*C*N*N(//)", HOSECodeShiftRange("*C*N*N(//)", 154.0, 5.5, "S", 159.4, 145.4, 14, 38)); ht.put("*C*NC$(//)", HOSECodeShiftRange("*C*NC$(//)", 139.6, 28.9, "S", 157.2, 108.1, 76, 123)); ht.put("*C*NC(//)", HOSECodeShiftRange("*C*NC(//)", 154.6, 19.3, "S", 177.7, 99.7, 475, 1032)); ht.put("*C*NO(//)", HOSECodeShiftRange("*C*NO(//)", 161.1, 11.4, "S", 177.9, 136.5, 159, 280)); ht.put("*C*NN$$(//)", HOSECodeShiftRange("*C*NN$$(//)", 152.3, 37.2, "S", 162.0, 145.4, 3, 3)); ht.put("*C*NN(//)", HOSECodeShiftRange("*C*NN(//)", 154.2, 11.1, "S", 178.1, 125.8, 259, 682)); ht.put("*C*NS$$(//)", HOSECodeShiftRange("*C*NS$$(//)", 153.4, 5.0, "S", 166.5, 140.3, 2, 2)); ht.put("*C*NS(//)", HOSECodeShiftRange("*C*NS(//)", 162.6, 18.4, "S", 183.8, 140.3, 28, 45)); ht.put("*C*NQ(//)", HOSECodeShiftRange("*C*NQ(//)", 168.2, 5.0, "S", 168.2, 168.2, 1, 1)); ht.put("*C*NF(//)", HOSECodeShiftRange("*C*NF(//)", 157.8, 16.7, "S", 174.2, 143.9, 23, 47)); ht.put("*C*NX(//)", HOSECodeShiftRange("*C*NX(//)", 148.8, 24.1, "S", 165.9, 117.8, 99, 201)); ht.put("*C*NY(//)", HOSECodeShiftRange("*C*NY(//)", 135.4, 21.9, "S", 147.2, 108.6, 17, 24)); ht.put("*C*NT(//)", HOSECodeShiftRange("*C*NT(//)", 108.2, 36.8, "S", 127.8, 82.4, 7, 8)); ht.put("*C*N(//)", HOSECodeShiftRange("*C*N(//)", 146.9, 14.7, "D", 168.9, 104.7, 978, 3025)); ht.put("*C*SN(//)", HOSECodeShiftRange("*C*SN(//)", 214.6, 5.0, "S", 214.7, 214.5, 1, 2)); ht.put("*C*SS(//)", HOSECodeShiftRange("*C*SS(//)", 199.8, 20.8, "S", 203.7, 190.1, 3, 4)); ht.put("*C*S(//)", HOSECodeShiftRange("*C*S(//)", 158.8, 5.0, "D", 158.8, 158.8, 1, 2)); ht.put("*C*PC(//)", HOSECodeShiftRange("*C*PC(//)", 124.4, 72.7, "S", 166.9, 95.7, 5, 13)); ht.put("*C*P(//)", HOSECodeShiftRange("*C*P(//)", 135.1, 82.8, "D", 154.5, 71.8, 4, 9)); ht.put("*C*Q*Q*C(//)", HOSECodeShiftRange("*C*Q*Q*C(//)", 79.5, 46.2, "P", 85.7, 67.1, 2, 3)); ht.put("*C*Q(//)", HOSECodeShiftRange("*C*Q(//)", 129.0, 5.0, "D", 129.0, 129.0, 1, 2)); ht.put("*Q*NC(//)", HOSECodeShiftRange("*Q*NC(//)", 173.7, 5.0, "S", 173.9, 173.6, 2, 2)); ht.put("*N*N*N(//)", HOSECodeShiftRange("*N*N*N(//)", 157.8, 15.6, "S", 190.9, 147.5, 12, 26)); ht.put("*N*NC$(//)", HOSECodeShiftRange("*N*NC$(//)", 149.7, 27.5, "S", 157.7, 140.2, 3, 4)); ht.put("*N*NC(//)", HOSECodeShiftRange("*N*NC(//)", 164.3, 16.7, "S", 183.1, 145.5, 72, 134)); ht.put("*N*NO(//)", HOSECodeShiftRange("*N*NO(//)", 166.7, 14.3, "S", 179.1, 149.1, 34, 58)); ht.put("*N*NN(//)", HOSECodeShiftRange("*N*NN(//)", 160.5, 10.9, "S", 178.7, 148.9, 85, 156)); ht.put("*N*NS$$(//)", HOSECodeShiftRange("*N*NS$$(//)", 162.7, 15.7, "S", 166.9, 160.6, 2, 3)); ht.put("*N*NS(//)", HOSECodeShiftRange("*N*NS(//)", 168.0, 14.4, "S", 186.7, 148.1, 30, 61)); ht.put("*N*NP$(//)", HOSECodeShiftRange("*N*NP$(//)", 170.7, 5.0, "S", 172.7, 168.8, 2, 2)); ht.put("*N*NF(//)", HOSECodeShiftRange("*N*NF(//)", 168.7, 11.9, "S", 174.0, 156.9, 6, 12)); ht.put("*N*NX(//)", HOSECodeShiftRange("*N*NX(//)", 164.2, 12.8, "S", 177.0, 142.1, 22, 54)); ht.put("*N*NY(//)", HOSECodeShiftRange("*N*NY(//)", 153.5, 5.0, "S", 153.6, 153.4, 1, 2)); ht.put("*N*NI(//)", HOSECodeShiftRange("*N*NI(//)", 129.8, 5.0, "S", 130.2, 129.4, 1, 2)); ht.put("*N*N(//)", HOSECodeShiftRange("*N*N(//)", 152.2, 13.8, "D", 167.8, 127.9, 124, 372)); ht.put("*P*P(//)", HOSECodeShiftRange("*P*P(//)", 26.2, 5.0, "D", 26.2, 26.2, 1, 1)); ht.put("*Q(//)", HOSECodeShiftRange("*Q(//)", 84.0, 5.0, "T", 84.0, 84.0, 1, 1)); ht.put("C$C$C$C$(//)", HOSECodeShiftRange("C$C$C$C$(//)", 71.3, 5.0, "S", 71.3, 71.3, 1, 1)); ht.put("C$C$C$(//)", HOSECodeShiftRange("C$C$C$(//)", 58.0, 5.0, "D", 59.6, 56.4, 1, 2)); ht.put("C$C$CC(//)", HOSECodeShiftRange("C$C$CC(//)", 61.0, 17.4, "S", 85.1, 28.5, 125, 228)); ht.put("C$C$CO(//)", HOSECodeShiftRange("C$C$CO(//)", 81.0, 22.4, "S", 95.3, 61.3, 8, 10)); ht.put("C$CCN(//)", HOSECodeShiftRange("C$CCN(//)", 70.8, 18.8, "S", 95.0, 53.9, 13, 24)); ht.put("C$C$CY(//)", HOSECodeShiftRange("C$C$CY(//)", 59.4, 19.3, "S", 64.6, 56.7, 3, 3)); ht.put("C$C$C(//)", HOSECodeShiftRange("C$C$C(//)", 57.1, 23.6, "D", 123.3, 41.8, 104, 162)); ht.put("C$C$OO(//)", HOSECodeShiftRange("C$C$OO(//)", 90.5, 5.0, "S", 90.5, 90.5, 1, 1)); ht.put("C$C$DC(//)", HOSECodeShiftRange("C$C$DC(//)", 94.3, 5.0, "S", 94.3, 94.3, 1, 1)); ht.put("C$C$O(//)", HOSECodeShiftRange("C$C$O(//)", 78.5, 5.0, "D", 85.1, 71.9, 2, 2)); ht.put("C$C$NS(//)", HOSECodeShiftRange("C$C$NS(//)", 64.7, 5.0, "S", 64.7, 64.7, 1, 1)); ht.put("C$C$N(//)", HOSECodeShiftRange("C$C$N(//)", 63.9, 21.6, "D", 92.9, 54.6, 10, 16)); ht.put("C$C$XX(//)", HOSECodeShiftRange("C$C$XX(//)", 72.2, 12.3, "S", 76.9, 67.1, 4, 5)); ht.put("C$C$X(//)", HOSECodeShiftRange("C$C$X(//)", 54.8, 5.0, "D", 54.8, 54.8, 1, 1)); ht.put("C$C$YY(//)", HOSECodeShiftRange("C$C$YY(//)", 50.2, 5.0, "S", 50.2, 50.2, 1, 1)); ht.put("C$C$Y(//)", HOSECodeShiftRange("C$C$Y(//)", 62.8, 153.7, "D", 104.1, 41.6, 2, 3)); ht.put("C$C$(//)", HOSECodeShiftRange("C$C$(//)", 48.2, 10.7, "T", 61.5, 36.7, 51, 127)); ht.put("C$CCC(//)", HOSECodeShiftRange("C$CCC(//)", 50.5, 18.1, "S", 104.1, 21.8, 838, 1886)); ht.put("C$CCO(//)", HOSECodeShiftRange("C$CCO(//)", 79.3, 15.9, "S", 103.4, 55.1, 283, 540)); ht.put("C$CCN$$(//)", HOSECodeShiftRange("C$CCN$$(//)", 97.8, 5.0, "S", 97.8, 97.8, 1, 1)); ht.put("C$CCN(//)", HOSECodeShiftRange("C$CCN(//)", 70.2, 27.3, "S", 115.5, 36.3, 89, 159)); ht.put("C$CCS$$(//)", HOSECodeShiftRange("C$CCS$$(//)", 67.4, 10.6, "S", 75.8, 62.8, 5, 8)); ht.put("C$CCS(//)", HOSECodeShiftRange("C$CCS(//)", 51.9, 9.3, "S", 62.6, 49.2, 9, 24)); ht.put("C$CCQ(//)", HOSECodeShiftRange("C$CCQ(//)", 46.7, 5.0, "S", 58.8, 37.7, 2, 2)); ht.put("C$CCF(//)", HOSECodeShiftRange("C$CCF(//)", 94.0, 5.0, "S", 58.8, 34.7, 2, 2)); ht.put("C$CCX(//)", HOSECodeShiftRange("C$CCX(//)", 71.5, 15.5, "S", 84.6, 51.8, 32, 51)); ht.put("C$CCY(//)", HOSECodeShiftRange("C$CCY(//)", 63.3, 24.3, "S", 80.5, 32.2, 24, 34)); ht.put("C$CC(//)", HOSECodeShiftRange("C$CC(//)", 46.6, 18.6, "D", 92.5, 10.9, 1527, 3361)); ht.put("C$COO(//)", HOSECodeShiftRange("C$COO(//)", 100.3, 11.5, "S", 111.2, 86.0, 36, 111)); ht.put("C$CON(//)", HOSECodeShiftRange("C$CON(//)", 87.7, 15.8, "S", 97.5, 71.0, 9, 12)); ht.put("C$COS(//)", HOSECodeShiftRange("C$COS(//)", 93.0, 31.6, "S", 102.7, 71.3, 6, 6)); ht.put("C$COP$(//)", HOSECodeShiftRange("C$COP$(//)", 86.0, 5.0, "S", 86.0, 86.0, 1, 1)); ht.put("C$COX(//)", HOSECodeShiftRange("C$COX(//)", 95.7, 5.0, "S", 97.3, 94.1, 2, 2)); ht.put("C$COY(//)", HOSECodeShiftRange("C$COY(//)", 92.4, 5.0, "S", 92.4, 92.4, 1, 1)); ht.put("C$CO(//)", HOSECodeShiftRange("C$CO(//)", 73.0, 16.9, "D", 96.3, 46.3, 383, 850)); ht.put("C$CN$$Y(//)", HOSECodeShiftRange("C$CN$$Y(//)", 91.7, 5.0, "S", 91.7, 91.7, 1, 1)); ht.put("C$CN$$(//)", HOSECodeShiftRange("C$CN$$(//)", 83.6, 5.0, "D", 83.6, 83.6, 1, 1)); ht.put("C$CNN(//)", HOSECodeShiftRange("C$CNN(//)", 65.9, 66.1, "S", 87.5, 32.5, 5, 6)); ht.put("C$CNS$(//)", HOSECodeShiftRange("C$CNS$(//)", 101.8, 5.0, "S", 101.8, 101.8, 1, 1)); ht.put("C$CNS(//)", HOSECodeShiftRange("C$CNS(//)", 76.1, 5.0, "S", 77.0, 74.8, 2, 4)); ht.put("C$CN(//)", HOSECodeShiftRange("C$CN(//)", 57.3, 11.6, "D", 83.2, 32.6, 669, 1898)); ht.put("C$CS$$(//)", HOSECodeShiftRange("C$CS$$(//)", 67.4, 5.3, "D", 71.1, 64.1, 10, 15)); ht.put("C$CSS(//)", HOSECodeShiftRange("C$CSS(//)", 65.7, 23.5, "S", 74.9, 57.9, 3, 4)); ht.put("C$CSX(//)", HOSECodeShiftRange("C$CSX(//)", 98.0, 8.6, "S", 99.0, 90.0, 3, 6)); ht.put("C$CS(//)", HOSECodeShiftRange("C$CS(//)", 47.6, 21.2, "D", 88.7, 32.2, 23, 46)); ht.put("C$CP$(//)", HOSECodeShiftRange("C$CP$(//)", 39.8, 5.0, "D", 39.8, 39.8, 1, 1)); ht.put("C$CP(//)", HOSECodeShiftRange("C$CP(//)", 38.6, 5.0, "D", 38.6, 38.6, 1, 1)); ht.put("C$CQ(//)", HOSECodeShiftRange("C$CQ(//)", 25.0, 16.2, "D", 28.8, 21.3, 3, 3)); ht.put("C$CB(//)", HOSECodeShiftRange("C$CB(//)", 41.9, 5.0, "D", 43.0, 40.8, 1, 5)); ht.put("C$CFF(//)", HOSECodeShiftRange("C$CFF(//)", 108.7, 7.0, "S", 109.8, 106.9, 3, 3)); ht.put("C$CFX(//)", HOSECodeShiftRange("C$CFX(//)", 107.7, 5.0, "S", 107.7, 107.7, 1, 1)); ht.put("C$CFY(//)", HOSECodeShiftRange("C$CFY(//)", 102.4, 5.0, "S", 103.1, 102.0, 3, 3)); ht.put("C$CF(//)", HOSECodeShiftRange("C$CF(//)", 90.4, 6.9, "D", 95.1, 85.8, 6, 8)); ht.put("C$CXX(//)", HOSECodeShiftRange("C$CXX(//)", 85.1, 11.7, "S", 101.4, 76.4, 34, 49)); ht.put("C$CXY(//)", HOSECodeShiftRange("C$CXY(//)", 75.8, 22.6, "S", 81.5, 71.2, 3, 3)); ht.put("C$CX(//)", HOSECodeShiftRange("C$CX(//)", 59.5, 10.1, "D", 80.5, 50.1, 65, 107)); ht.put("C$CYY(//)", HOSECodeShiftRange("C$CYY(//)", 66.8, 24.1, "S", 86.7, 54.3, 7, 8)); ht.put("C$CY(//)", HOSECodeShiftRange("C$CY(//)", 47.3, 9.8, "D", 63.6, 38.0, 78, 161)); ht.put("C$CI(//)", HOSECodeShiftRange("C$CI(//)", 26.8, 29.3, "D", 34.3, 21.0, 3, 3)); ht.put("C$C(//)", HOSECodeShiftRange("C$C(//)", 38.2, 13.0, "T", 86.9, 19.4, 2580, 6952)); ht.put("C$OOO(//)", HOSECodeShiftRange("C$OOO(//)", 111.6, 5.0, "S", 111.6, 116.6, 1, 1)); ht.put("C$OO(//)", HOSECodeShiftRange("C$OO(//)", 94.8, 11.9, "D", 105.8, 86.6, 18, 25)); ht.put("C$ON(//)", HOSECodeShiftRange("C$ON(//)", 82.0, 6.4, "D", 85.4, 71.7, 10, 22)); ht.put("C$OS$(//)", HOSECodeShiftRange("C$OS$(//)", 97.4, 5.0, "D", 98.6, 96.2, 1, 2)); ht.put("C$OS(//)", HOSECodeShiftRange("C$OS(//)", 74.1, 5.0, "D", 75.4, 72.9, 2, 2)); ht.put("C$OXX(//)", HOSECodeShiftRange("C$OXX(//)", 98.7, 5.0, "S", 98.7, 98.7, 1, 1)); ht.put("C$O(//)", HOSECodeShiftRange("C$O(//)", 67.0, 5.4, "T", 77.7, 60.4, 108, 263)); ht.put("C$NN(//)", HOSECodeShiftRange("C$NN(//)", 62.3, 5.0, "D", 62.3, 62.3, 1, 1)); ht.put("C$NS(//)", HOSECodeShiftRange("C$NS(//)", 71.9, 12.7, "D", 77.0, 64.8, 3, 7)); ht.put("C$NX(//)", HOSECodeShiftRange("C$NX(//)", 79.9, 5.0, "D", 79.9, 79.9, 1, 1)); ht.put("C$$NY(//)", HOSECodeShiftRange("C$$NY(//)", 71.8, 5.0, "D", 71.8, 71.8, 1, 1)); ht.put("C$N(//)", HOSECodeShiftRange("C$N(//)", 50.1, 14.0, "T", 74.9, 38.3, 248, 615)); ht.put("C$S$$(//)", HOSECodeShiftRange("C$S$$(//)", 62.4, 5.7, "T", 67.7, 56.6, 12, 20)); prepTable2(); } void BremserOneSphereHOSECodePredictor::prepTable2() { ht.put("C$S$XX(//)", HOSECodeShiftRange("C$S$XX(//)", 93.9, 5.0, "S", 93.9, 93.9, 1, 1)); ht.put("C$S$(//)", HOSECodeShiftRange("C$S$(//)", 59.1, 14.8, "T", 62.7, 52.8, 4, 4)); ht.put("C$SS(//)", HOSECodeShiftRange("C$SS(//)", 67.5, 25.1, "D", 71.6, 44.8, 2, 7)); ht.put("C$SXX(//)", HOSECodeShiftRange("C$SXX(//)", 94.1, 5.0, "S", 94.1, 94.1, 1, 2)); ht.put("C$SX(//)", HOSECodeShiftRange("C$SX(//)", 65.5, 5.0, "D", 65.5, 65.5, 1, 1)); ht.put("C$S(//)", HOSECodeShiftRange("C$S(//)", 34.7, 9.7, "T", 48.5, 26.2, 92, 143)); ht.put("C$P$(//)", HOSECodeShiftRange("C$P$(//)", 45.1, 10.4, "T", 55.5, 32.9, 15, 30)); ht.put("C$P(//)", HOSECodeShiftRange("C$P(//)", 34.2, 13.7, "T", 40.1, 23.2, 6, 8)); ht.put("C$Q(//)", HOSECodeShiftRange("C$Q(//)", 25.3, 5.0, "T", 25.9, 24.8, 2, 2)); ht.put("C$B(//)", HOSECodeShiftRange("C$B(//)", 28.1, 11.7, "T", 29.8, 25.0, 3, 3)); ht.put("C$FFF(//)", HOSECodeShiftRange("C$FFF(//)", 117.3, 8.9, "S", 151.0, 108.6, 21, 50)); ht.put("C$FFX(//)", HOSECodeShiftRange("C$FFX(//)", 118.0, 5.0, "S", 118.4, 117.9, 2, 3)); ht.put("C$FF(//)", HOSECodeShiftRange("C$FF(//)", 108.5, 6.1, "D", 110.1, 107.4, 3, 3)); ht.put("C$FXX(//)", HOSECodeShiftRange("C$FXX(//)", 112.3, 5.0, "S", 113.9, 110.8, 2, 2)); ht.put("C$FXY(//)", HOSECodeShiftRange("C$FXY(//)", 104.2, 5.0, "S", 104.2, 104.2, 1, 1)); ht.put("C$F(//)", HOSECodeShiftRange("C$F(//)", 81.3, 8.2, "T", 84.9, 78.9, 3, 4)); ht.put("C$XXX(//)", HOSECodeShiftRange("C$XXX(//)", 92.0, 5.0, "S", 96.5, 88.5, 29, 63)); ht.put("C$XXY(//)", HOSECodeShiftRange("C$XXY(//)", 81.2, 5.0, "S", 81.2, 81.2, 1, 1)); ht.put("C$XX(//)", HOSECodeShiftRange("C$XX(//)", 66.0, 5.1, "D", 70.9, 61.6, 20, 31)); ht.put("C$XYY(//)", HOSECodeShiftRange("C$XYY(//)", 64.5, 5.0, "S", 64.5, 64.5, 1, 1)); ht.put("C$XY(//)", HOSECodeShiftRange("C$XY(//)", 57.5, 5.0, "D", 57.5, 57.5, 1, 1)); ht.put("C$X(//)", HOSECodeShiftRange("C$X(//)", 43.1, 5.0, "T", 49.1, 40.5, 27, 72)); ht.put("C$YYY(//)", HOSECodeShiftRange("C$YYY(//)", 36.5, 5.0, "S", 44.6, 28.4, 2, 2)); ht.put("C$YY(//)", HOSECodeShiftRange("C$YY(//)", 34.4, 7.6, "D", 39.4, 31.3, 6, 7)); ht.put("C$Y(//)", HOSECodeShiftRange("C$Y(//)", 30.1, 6.8, "T", 35.5, 25.0, 10, 21)); ht.put("C$I(//)", HOSECodeShiftRange("C$I(//)", -4.0, 5.0, "T", -3.5, -4.6, 2, 2)); ht.put("C$(//)", HOSECodeShiftRange("C$(//)", 23.1, 7.3, "Q", 56.0, 13.8, 464, 4656)); ht.put("CCCC(//)", HOSECodeShiftRange("CCCC(//)", 39.6, 17.2, "S", 252.9, -8.9, 3912, 12026)); ht.put("CCCO(//)", HOSECodeShiftRange("CCCO(//)", 76.6, 17.3, "S", 112.7, 49.8, 1876, 4419)); ht.put("CCCN$$(//)", HOSECodeShiftRange("CCCN$$(//)", 87.3, 15.5, "S", 96.2, 71.4, 19, 30)); ht.put("CCCN$(//)", HOSECodeShiftRange("CCCN$(//)", 91.1, 5.0, "S", 91.4, 91.0, 3, 3)); ht.put("CCCN(//)", HOSECodeShiftRange("CCCN(//)", 59.9, 22.4, "S", 110.4, 29.9, 575, 973)); ht.put("CCCS$$(//)", HOSECodeShiftRange("CCCS$$(//)", 65.3, 9.6, "S", 78.2, 57.6, 25, 34)); ht.put("CCCS$(//)", HOSECodeShiftRange("CCCS$(//)", 53.3, 42.8, "S", 87.4, 21.4, 12, 18)); ht.put("CCCS(//)", HOSECodeShiftRange("CCCS(//)", 51.1, 17.9, "S", 71.0, 31.3, 108, 171)); ht.put("CCCP$(//)", HOSECodeShiftRange("CCCP$(//)", 39.4, 17.1, "S", 50.8, 32.7, 7, 8)); ht.put("CCCP(//)", HOSECodeShiftRange("CCCP(//)", 38.1, 22.3, "S", 122.1, 23.4, 54, 110)); ht.put("CCCQ(//)", HOSECodeShiftRange("CCCQ(//)", 21.8, 17.9, "S", 71.0, 0.6, 24, 118)); ht.put("CCCB(//)", HOSECodeShiftRange("CCCB(//)", 26.7, 19.0, "S", 41.7, 17.6, 8, 9)); ht.put("CCCF(//)", HOSECodeShiftRange("CCCF(//)", 94.4, 11.9, "S", 112.0, 74.9, 22, 35)); ht.put("CCCX(//)", HOSECodeShiftRange("CCCX(//)", 76.0, 14.6, "S", 91.6, 45.8, 206, 495)); ht.put("CCCY(//)", HOSECodeShiftRange("CCCY(//)", 63.5, 28.5, "S", 96.6, 1.0, 53, 80)); ht.put("CCCI(//)", HOSECodeShiftRange("CCCI(//)", 50.2, 22.3, "S", 71.6, 31.1, 16, 43)); ht.put("CCC(//)", HOSECodeShiftRange("CCC(//)", 40.1, 23.0, "D", 355.5, -6.8, 9398, 30350)); ht.put("CCOO(//)", HOSECodeShiftRange("CCOO(//)", 106.7, 14.3, "S", 132.9, 57.8, 402, 981)); ht.put("CCON(//)", HOSECodeShiftRange("CCON(//)", 90.7, 24.0, "S", 119.9, 58.0, 71, 130)); ht.put("CCOS$$(//)", HOSECodeShiftRange("CCOS$$(//)", 86.7, 5.0, "S", 86.7, 86.7, 1, 1)); ht.put("CCOS(//)", HOSECodeShiftRange("CCOS(//)", 86.8, 20.5, "S", 102.7, 72.3, 12, 16)); ht.put("CCOP$(//)", HOSECodeShiftRange("CCOP$(//)", 94.9, 5.0, "S", 95.0, 94.8, 1, 2)); ht.put("CCOP(//)", HOSECodeShiftRange("CCOP(//)", 74.2, 5.0, "S", 77.5, 70.9, 2, 2)); ht.put("CCOQ(//)", HOSECodeShiftRange("CCOQ(//)", 78.1, 5.0, "S", 80.8, 75.5, 2, 2)); ht.put("CCOX(//)", HOSECodeShiftRange("CCOX(//)", 97.0, 22.4, "S", 106.7, 72.8, 16, 28)); ht.put("CCOY(//)", HOSECodeShiftRange("CCOY(//)", 80.1, 5.0, "S", 80.1, 80.1, 1, 1)); ht.put("CCO(//)", HOSECodeShiftRange("CCO(//)", 73.1, 14.4, "D", 104.3, 34.2, 5218, 20980)); ht.put("CCN$$N$$(//)", HOSECodeShiftRange("CCN$$N$$(//)", 116.2, 5.0, "S", 116.2, 116.2, 1, 1)); ht.put("CCN$$X(//)", HOSECodeShiftRange("CCN$$X(//)", 100.4, 5.0, "S", 100.4, 100.4, 1, 1)); ht.put("CCN$$Y(//)", HOSECodeShiftRange("CCN$$Y(//)", 89.1, 5.0, "S", 89.1, 89.1, 1, 1)); ht.put("CCN$$(//)", HOSECodeShiftRange("CCN$$(//)", 86.1, 11.6, "D", 96.5, 66.7, 28, 57)); ht.put("CCN$X(//)", HOSECodeShiftRange("CCN$X(//)", 59.8, 5.0, "S", 59.8, 59.8, 1, 1)); ht.put("CCNN(//)", HOSECodeShiftRange("CCNN(//)", 79.1, 18.3, "S", 106.5, 56.0, 48, 65)); ht.put("CCNS$$(//)", HOSECodeShiftRange("CCNS$$(//)", 93.4, 5.0, "S", 93.4, 93.4, 1, 1)); ht.put("CCNS$(//)", HOSECodeShiftRange("CCNS$(//)", 93.5, 5.0, "S", 94.1, 93.0, 2, 2)); ht.put("CCNS(//)", HOSECodeShiftRange("CCNS(//)", 75.4, 17.9, "S", 101.9, 64.0, 14, 18)); ht.put("CCNP$(//)", HOSECodeShiftRange("CCNP$(//)", 49.3, 5.0, "S", 49.3, 49.3, 1, 1)); ht.put("CCNQ(//)", HOSECodeShiftRange("CCNQ(//)", 90.4, 5.0, "S", 90.6, 90.2, 1, 2)); ht.put("CCNX(//)", HOSECodeShiftRange("CCNX(//)", 87.4, 16.4, "S", 96.1, 73.5, 8, 11)); ht.put("CCNY(//)", HOSECodeShiftRange("CCNY(//)", 73.3, 5.0, "S", 77.1, 69.6, 2, 2)); ht.put("CCN(//)", HOSECodeShiftRange("CCN(//)", 57.6, 18.7, "D", 163.8, 12.7, 1988, 5153)); ht.put("CCS$$S$$(//)", HOSECodeShiftRange("CCS$$S$$(//)", 88.4, 11.5, "S", 92.0, 80.7, 4, 8)); ht.put("CCS$$(//)", HOSECodeShiftRange("CCS$$(//)", 60.1, 17.0, "D", 82.0, 28.3, 91, 125)); ht.put("CCS$S(//)", HOSECodeShiftRange("CCS$S(//)", 62.2, 19.8, "S", 65.7, 57.0, 2, 3)); ht.put("CCS$(//)", HOSECodeShiftRange("CCS$(//)", 60.8, 11.9, "D", 73.3, 45.9, 21, 54)); ht.put("CCSS(//)", HOSECodeShiftRange("CCSS(//)", 57.6, 20.4, "S", 115.8, 29.9, 56, 97)); ht.put("CCSP$(//)", HOSECodeShiftRange("CCSP$(//)", 55.5, 5.0, "S", 55.8, 55.2, 1, 2)); ht.put("CCSX(//)", HOSECodeShiftRange("CCSX(//)", 80.8, 5.0, "S", 80.8, 80.8, 1, 1)); ht.put("CCS(//)", HOSECodeShiftRange("CCS(//)", 45.6, 18.4, "D", 82.2, 22.7, 299, 643)); ht.put("CCP$(//)", HOSECodeShiftRange("CCP$(//)", 30.6, 9.9, "D", 47.0, 26.9, 32, 81)); ht.put("CCPP(//)", HOSECodeShiftRange("CCPP(//)", 71.2, 5.0, "S", 71.2, 71.2, 1, 2)); ht.put("CCP(//)", HOSECodeShiftRange("CCP(//)", 40.3, 26.4, "D", 77.9, 0.4, 78, 170)); ht.put("CCQQ(//)", HOSECodeShiftRange("CCQQ(//)", 39.4, 5.0, "S", 39.4, 39.4, 1, 1)); ht.put("CCQ(//)", HOSECodeShiftRange("CCQ(//)", 36.3, 39.1, "D", 84.1, -7.1, 35, 54)); ht.put("CCBB(//)", HOSECodeShiftRange("CCBB(//)", 48.2, 5.0, "S", 56.2, 40.3, 2, 2)); ht.put("CCB(//)", HOSECodeShiftRange("CCB(//)", 31.0, 18.4, "D", 56.5, 18.5, 12, 38)); ht.put("CCFF(//)", HOSECodeShiftRange("CCFF(//)", 114.9, 18.2, "S", 134.1, 88.8, 40, 82)); ht.put("CCFX(//)", HOSECodeShiftRange("CCFX(//)", 104.0, 13.9, "S", 110.5, 94.5, 5, 7)); ht.put("CCFY(//)", HOSECodeShiftRange("CCFY(//)", 90.8, 22.1, "S", 99.5, 82.0, 2, 4)); ht.put("CCF(//)", HOSECodeShiftRange("CCF(//)", 90.3, 19.3, "D", 101.6, 48.9, 29, 53)); ht.put("CCXX(//)", HOSECodeShiftRange("CCXX(//)", 88.3, 27.7, "S", 113.9, 55.5, 137, 321)); ht.put("CCXY(//)", HOSECodeShiftRange("CCXY(//)", 68.0, 30.2, "S", 92.7, 50.2, 6, 11)); ht.put("CCX(//)", HOSECodeShiftRange("CCX(//)", 60.8, 14.2, "D", 82.4, 27.3, 295, 565)); ht.put("CCYY(//)", HOSECodeShiftRange("CCYY(//)", 51.0, 33.3, "S", 85.6, 27.4, 21, 28)); ht.put("CCY(//)", HOSECodeShiftRange("CCY(//)", 50.9, 16.1, "D", 92.7, 13.9, 183, 537)); ht.put("CCI(//)", HOSECodeShiftRange("CCI(//)", 30.4, 18.2, "D", 64.4, 15.8, 36, 65)); ht.put("CC(//)", HOSECodeShiftRange("CC(//)", 29.6, 14.8, "T", 255.1, -8.0, 24063, 96834)); ht.put("COOO(//)", HOSECodeShiftRange("COOO(//)", 115.2, 20.4, "S", 125.0, 77.1, 21, 35)); ht.put("COON(//)", HOSECodeShiftRange("COON(//)", 113.2, 19.8, "S", 133.7, 102.7, 9, 14)); ht.put("COOS(//)", HOSECodeShiftRange("COOS(//)", 118.1, 5.0, "S", 118.3, 117.9, 1, 2)); ht.put("COOP$(//)", HOSECodeShiftRange("COOP$(//)", 106.8, 5.0, "S", 106.9, 106.7, 1, 2)); ht.put("COOX(//)", HOSECodeShiftRange("COOX(//)", 120.5, 5.0, "S", 121.7, 118.0, 3, 4)); ht.put("COO(//)", HOSECodeShiftRange("COO(//)", 99.2, 8.9, "D", 122.1, 76.9, 636, 3201)); ht.put("CON$$(//)", HOSECodeShiftRange("CON$$(//)", 106.6, 5.0, "D", 110.8, 102.5, 2, 2)); ht.put("CONN(//)", HOSECodeShiftRange("CONN(//)", 107.6, 90.8, "S", 120.6, 83.3, 3, 3)); ht.put("CONS(//)", HOSECodeShiftRange("CONS(//)", 112.5, 5.0, "S", 115.1, 110.2, 2, 11)); ht.put("CON(//)", HOSECodeShiftRange("CON(//)", 88.2, 12.5, "D", 108.0, 58.2, 134, 503)); ht.put("COS$$(//)", HOSECodeShiftRange("COS$$(//)", 84.3, 8.2, "D", 92.1, 81.1, 4, 8)); ht.put("COSS(//)", HOSECodeShiftRange("COSS(//)", 94.5, 39.6, "S", 110.7, 83.3, 4, 4)); ht.put("COS(//)", HOSECodeShiftRange("COS(//)", 82.4, 12.3, "D", 103.4, 67.9, 19, 31)); ht.put("COP$P$(//)", HOSECodeShiftRange("COP$P$(//)", 72.4, 5.0, "S", 72.4, 72.4, 1, 1)); ht.put("COP$(//)", HOSECodeShiftRange("COP$(//)", 71.0, 5.9, "D", 73.8, 67.6, 4, 10)); ht.put("COP(//)", HOSECodeShiftRange("COP(//)", 72.2, 9.1, "D", 74.7, 71.0, 3, 3)); ht.put("COFF(//)", HOSECodeShiftRange("COFF(//)", 118.0, 5.4, "S", 119.9, 114.6, 6, 6)); ht.put("COF(//)", HOSECodeShiftRange("COF(//)", 106.7, 6.1, "D", 114.5, 103.3, 7, 35)); ht.put("COXX(//)", HOSECodeShiftRange("COXX(//)", 102.0, 6.9, "S", 104.6, 99.6, 5, 5)); ht.put("COX(//)", HOSECodeShiftRange("COX(//)", 88.3, 10.7, "D", 96.4, 74.9, 14, 22)); ht.put("COY(//)", HOSECodeShiftRange("COY(//)", 76.7, 32.6, "D", 92.1, 55.1, 7, 9)); ht.put("COI(//)", HOSECodeShiftRange("COI(//)", 47.4, 5.0, "D", 47.4, 47.4, 1, 1)); ht.put("CO(//)", HOSECodeShiftRange("CO(//)", 65.0, 10.8, "T", 173.7, 19.3, 3649, 15321)); ht.put("CN$$XX(//)", HOSECodeShiftRange("CN$$XX(//)", 112.3, 5.0, "S", 115.2, 109.5, 2, 2)); ht.put("CN$$X(//)", HOSECodeShiftRange("CN$$X(//)", 90.7, 5.0, "D", 93.3, 88.1, 2, 2)); ht.put("CN$$(//)", HOSECodeShiftRange("CN$$(//)", 76.1, 8.0, "T", 85.0, 68.9, 20, 37)); ht.put("CNN(//)", HOSECodeShiftRange("CNN(//)", 76.3, 22.3, "D", 153.0, 40.7, 73, 178)); ht.put("CNS$$(//)", HOSECodeShiftRange("CNS$$(//)", 70.0, 18.0, "D", 73.3, 61.6, 2, 4)); ht.put("CNS$(//)", HOSECodeShiftRange("CNS$(//)", 62.9, 5.0, "D", 62.9, 62.9, 1, 1)); ht.put("CNSS(//)", HOSECodeShiftRange("CNSS(//)", 72.4, 5.0, "S", 72.4, 72.4, 1, 1)); ht.put("CNS(//)", HOSECodeShiftRange("CNS(//)", 62.8, 10.9, "D", 74.5, 49.4, 27, 102)); ht.put("CNP$(//)", HOSECodeShiftRange("CNP$(//)", 53.7, 13.2, "D", 57.1, 51.1, 3, 3)); ht.put("CNP(//)", HOSECodeShiftRange("CNP(//)", 83.7, 133.7, "D", 110.0, 49.4, 3, 3)); ht.put("CNXX(//)", HOSECodeShiftRange("CNXX(//)", 97.1, 25.8, "S", 101.5, 90.3, 3, 3)); ht.put("CNX(//)", HOSECodeShiftRange("CNX(//)", 73.2, 36.4, "D", 92.8, 62.5, 5, 5)); ht.put("CNYY(//)", HOSECodeShiftRange("CNYY(//)", 77.6, 5.0, "S", 77.6, 77.6, 1, 1)); ht.put("CN(//)", HOSECodeShiftRange("CN(//)", 50.1, 15.2, "T", 84.4, -84.4, 4697, 13562)); ht.put("CS$$S$$(//)", HOSECodeShiftRange("CS$$S$$(//)", 83.6, 5.0, "D", 84.0, 83.2, 1, 2)); ht.put("CS$$FF(//)", HOSECodeShiftRange("CS$$FF(//)", 115.9, 5.0, "S", 115.9, 115.9, 1, 1)); ht.put("CS$$X(//)", HOSECodeShiftRange("CS$$X(//)", 73.9, 5.0, "D", 76.2, 65.7, 6, 42)); ht.put("CS$$Y(//)", HOSECodeShiftRange("CS$$Y(//)", 65.0, 5.0, "D", 65.0, 65.0, 1, 1)); ht.put("CS$$(//)", HOSECodeShiftRange("CS$$(//)", 54.1, 13.9, "T", 76.9, 31.6, 229, 446)); ht.put("CS$S$(//)", HOSECodeShiftRange("CS$S$(//)", 74.0, 9.9, "D", 76.3, 71.7, 1, 3)); ht.put("CS$S(//)", HOSECodeShiftRange("CS$S(//)", 68.3, 15.5, "D", 79.4, 50.8, 5, 12)); ht.put("CS$XX(//)", HOSECodeShiftRange("CS$XX(//)", 102.0, 5.0, "S", 102.0, 102.0, 1, 1)); ht.put("CS$X(//)", HOSECodeShiftRange("CS$X(//)", 80.3, 11.2, "D", 82.9, 77.7, 1, 3)); ht.put("CS$(//)", HOSECodeShiftRange("CS$(//)", 52.5, 13.8, "T", 72.0, 33.8, 88, 169)); ht.put("CSSS(//)", HOSECodeShiftRange("CSSS(//)", 64.6, 89.2, "S", 88.4, 50.0, 3, 3)); ht.put("CSS(//)", HOSECodeShiftRange("CSS(//)", 48.8, 13.9, "D", 64.5, 35.1, 53, 99)); ht.put("CS(//)", HOSECodeShiftRange("CS(//)", 34.1, 14.8, "T", 64.7, 15.5, 942, 2502)); ht.put("CP$X(//)", HOSECodeShiftRange("CP$X(//)", 62.4, 5.0, "D", 62.4, 62.4, 1, 1)); ht.put("CP$(//)", HOSECodeShiftRange("CP$(//)", 29.0, 10.1, "T", 41.5, 16.2, 76, 148)); ht.put("CPQ(//)", HOSECodeShiftRange("CPQ(//)", 21.8, 5.0, "D", 21.8, 21.8, 1, 1)); ht.put("CP(//)", HOSECodeShiftRange("CP(//)", 24.0, 19.2, "T", 58.0, -63.2, 360, 970)); ht.put("CQQQ(//)", HOSECodeShiftRange("CQQQ(//)", 24.7, 5.0, "S", 29.3, 20.1, 2, 2)); ht.put("CQQB(//)", HOSECodeShiftRange("CQQB(//)", 26.0, 5.0, "S", 27.2, 25.0, 2, 3)); ht.put("CQQ(//)", HOSECodeShiftRange("CQQ(//)", 12.5, 26.6, "D", 19.7, 8.7, 2, 3)); ht.put("CQY(//)", HOSECodeShiftRange("CQY(//)", 48.7, 5.0, "D", 48.7, 48.7, 1, 2)); ht.put("CQ(//)", HOSECodeShiftRange("CQ(//)", 16.7, 20.7, "T", 34.9, -65.1, 81, 140)); ht.put("CBBB(//)", HOSECodeShiftRange("CBBB(//)", 90.6, 30.1, "S", 106.3, 75.9, 4, 12)); ht.put("CBB(//)", HOSECodeShiftRange("CBB(//)", 76.7, 29.6, "D", 86.5, 54.3, 3, 10)); ht.put("CB(//)", HOSECodeShiftRange("CB(//)", 20.0, 21.2, "T", 37.5, -4.6, 36, 95)); ht.put("CFFF(//)", HOSECodeShiftRange("CFFF(//)", 122.7, 5.0, "S", 128.4, 104.3, 138, 363)); ht.put("CFFX(//)", HOSECodeShiftRange("CFFX(//)", 124.9, 5.2, "S", 128.1, 122.4, 6, 7)); ht.put("CFFY(//)", HOSECodeShiftRange("CFFY(//)", 119.3, 5.0, "S", 119.3, 119.3, 1, 1)); ht.put("CFF(//)", HOSECodeShiftRange("CFF(//)", 110.6, 8.1, "D", 115.0, 107.8, 5, 5)); ht.put("CFXX(//)", HOSECodeShiftRange("CFXX(//)", 118.4, 6.7, "S", 120.2, 116.1, 3, 4)); ht.put("CFX(//)", HOSECodeShiftRange("CFX(//)", 95.2, 5.0, "D", 95.7, 94.5, 4, 4)); ht.put("CF(//)", HOSECodeShiftRange("CF(//)", 83.0, 8.4, "T", 92.4, 78.1, 8, 14)); ht.put("CXXX(//)", HOSECodeShiftRange("CXXX(//)", 97.6, 10.6, "S", 110.5, 69.2, 125, 244)); ht.put("CXXY(//)", HOSECodeShiftRange("CXXY(//)", 78.5, 8.8, "S", 82.4, 76.4, 4, 4)); ht.put("CXX(//)", HOSECodeShiftRange("CXX(//)", 71.8, 8.9, "D", 84.0, 63.1, 68, 132)); ht.put("CXYY(//)", HOSECodeShiftRange("CXYY(//)", 63.3, 5.0, "S", 63.3, 63.3, 1, 1)); ht.put("CXY(//)", HOSECodeShiftRange("CXY(//)", 57.4, 5.0, "D", 61.3, 55.2, 6, 22)); ht.put("CX(//)", HOSECodeShiftRange("CX(//)", 43.9, 8.9, "T", 59.5, 25.3, 254, 564)); ht.put("CYYY(//)", HOSECodeShiftRange("CYYY(//)", 45.7, 19.7, "S", 63.2, 31.5, 9, 11)); ht.put("CYY(//)", HOSECodeShiftRange("CYY(//)", 44.7, 14.1, "D", 63.2, 32.4, 30, 41)); ht.put("CY(//)", HOSECodeShiftRange("CY(//)", 32.7, 8.9, "T", 48.5, 13.5, 167, 380)); ht.put("CI(//)", HOSECodeShiftRange("CI(//)", 4.9, 11.1, "T", 26.3, -16.5, 43, 98)); ht.put("C(//)", HOSECodeShiftRange("C(//)", 20.3, 13.3, "Q", 68.7, -9.9, 13215, 72490)); ht.put("OOOO(//)", HOSECodeShiftRange("OOOO(//)", 128.9, 50.1, "S", 135.8, 115.5, 3, 3)); ht.put("OOO(//)", HOSECodeShiftRange("OOO(//)", 113.0, 5.7, "D", 117.1, 107.1, 10, 12)); ht.put("OON(//)", HOSECodeShiftRange("OON(//)", 114.1, 37.8, "D", 130.1, 101.6, 4, 4)); ht.put("OOP$(//)", HOSECodeShiftRange("OOP$(//)", 95.8, 5.0, "D", 95.8, 95.8, 1, 1)); ht.put("OO(//)", HOSECodeShiftRange("OO(//)", 96.9, 10.1, "T", 109.6, 80.8, 106, 472)); ht.put("ONN(//)", HOSECodeShiftRange("ONN(//)", 105.9, 5.0, "D", 105.9, 105.9, 1, 1)); ht.put("ON(//)", HOSECodeShiftRange("ON(//)", 76.4, 18.7, "T", 92.5, 60.2, 60, 87)); ht.put("OS$$(//)", HOSECodeShiftRange("OS$$(//)", 77.4, 5.0, "T", 79.9, 75.0, 2, 2)); ht.put("OS(//)", HOSECodeShiftRange("OS(//)", 78.1, 5.0, "T", 78.1, 78.1, 1, 1)); ht.put("OP$(//)", HOSECodeShiftRange("OP$(//)", 60.0, 8.9, "T", 66.1, 55.3, 4, 9)); ht.put("OP(//)", HOSECodeShiftRange("OP(//)", 65.9, 5.0, "T", 66.2, 65.6, 1, 2)); ht.put("OQ(//)", HOSECodeShiftRange("OQ(//)", 56.9, 5.0, "T", 58.0, 56.0, 3, 3)); ht.put("OFFF(//)", HOSECodeShiftRange("OFFF(//)", 120.4, 5.0, "S", 120.9, 118.0, 3, 10)); ht.put("OFFX(//)", HOSECodeShiftRange("OFFX(//)", 125.2, 5.0, "S", 125.4, 125.0, 1, 5)); ht.put("OFF(//)", HOSECodeShiftRange("OFF(//)", 116.0, 5.0, "D", 117.1, 114.3, 4, 4)); ht.put("OXXX(//)", HOSECodeShiftRange("OXXX(//)", 119.8, 5.0, "S", 119.8, 119.8, 1, 1)); ht.put("OX(//)", HOSECodeShiftRange("OX(//)", 76.9, 16.0, "T", 85.0, 68.9, 4, 5)); ht.put("O(//)", HOSECodeShiftRange("O(//)", 54.7, 6.2, "Q", 87.1, 27.3, 739, 11054)); ht.put("N$$(//)", HOSECodeShiftRange("N$$(//)", 62.4, 5.0, "Q", 63.5, 61.3, 1, 3)); ht.put("NNNS(//)", HOSECodeShiftRange("NNNS(//)", 104.2, 5.0, "S", 104.2, 104.2, 1, 1)); ht.put("NNN(//)", HOSECodeShiftRange("NNN(//)", 101.8, 42.4, "D", 150.4, 87.3, 7, 10)); ht.put("NNS(//)", HOSECodeShiftRange("NNS(//)", 78.2, 8.0, "D", 80.3, 76.7, 3, 3)); ht.put("NNXX(//)", HOSECodeShiftRange("NNXX(//)", 103.5, 5.0, "S", 106.6, 100.5, 2, 2)); ht.put("NN(//)", HOSECodeShiftRange("NN(//)", 66.9, 18.3, "T", 83.7, 42.8, 81, 298)); ht.put("NS$$(//)", HOSECodeShiftRange("NS$$(//)", 62.0, 5.0, "T", 62.0, 62.0, 1, 1)); ht.put("NSXX(//)", HOSECodeShiftRange("NSXX(//)", 50.1, 5.0, "S", 50.1, 50.1, 1, 1)); ht.put("NS(//)", HOSECodeShiftRange("NS(//)", 51.2, 14.7, "T", 60.4, 33.3, 20, 30)); ht.put("NP$P$(//)", HOSECodeShiftRange("NP$P$(//)", 50.7, 5.0, "D", 56.0, 45.4, 1, 2)); ht.put("NP$(//)", HOSECodeShiftRange("NP$(//)", 52.0, 16.8, "T", 59.5, 37.9, 9, 15)); ht.put("NPQ(//)", HOSECodeShiftRange("NPQ(//)", 90.4, 5.0, "D", 90.4, 90.4, 1, 1)); ht.put("NQ(//)", HOSECodeShiftRange("NQ(//)", 32.4, 20.2, "T", 44.7, 26.0, 5, 5)); ht.put("NFFF(/))", HOSECodeShiftRange("NFFF(/))", 119.3, 5.0, "S", 121.3, 116.1, 3, 6)); ht.put("NXX(//)", HOSECodeShiftRange("NXX(//)", 80.3, 11.8, "D", 88.0, 76.4, 6, 8)); ht.put("NX(//)", HOSECodeShiftRange("NX(//)", 58.4, 11.6, "T", 72.9, 49.4, 13, 19)); ht.put("NY(//)", HOSECodeShiftRange("NY(//)", 46.1, 5.0, "T", 46.1, 46.1, 1, 2)); ht.put("N(//)", HOSECodeShiftRange("N(//)", 40.1, 14.3, "Q", 65.6, 19.8, 1842, 7007)); ht.put("S$$S$$(//)", HOSECodeShiftRange("S$$S$$(//)", 69.3, 6.5, "T", 70.8, 67.8, 1, 3)); ht.put("S$$S$(//)", HOSECodeShiftRange("S$$S$(//)", 66.4, 5.0, "T", 66.8, 66.0, 1, 2)); ht.put("S$$S(//)", HOSECodeShiftRange("S$$S(//)", 68.4, 5.0, "T", 68.4, 68.4, 1, 2)); ht.put("S$$FFF(//)", HOSECodeShiftRange("S$$FFF(//)", 118.8, 5.0, "S", 120.3, 118.0, 5, 8)); ht.put("S$$FF(//)", HOSECodeShiftRange("S$$FF(//)", 114.7, 5.0, "D", 114.7, 114.7, 1, 1)); ht.put("S$$XXX(//)", HOSECodeShiftRange("S$$XXX(//)", 107.3, 5.0, "S", 107.3, 107.3, 1, 1)); ht.put("S$$XX(//)", HOSECodeShiftRange("S$$XX(//)", 78.8, 5.0, "D", 78.8, 78.8, 1, 1)); ht.put("S$$X(//)", HOSECodeShiftRange("S$$X(//)", 74.5, 5.0, "T", 74.5, 74.5, 1, 1)); ht.put("S$$(//)", HOSECodeShiftRange("S$$(//)", 40.5, 5.8, "Q", 52.6, 30.9, 56, 169)); ht.put("S$S$(//)", HOSECodeShiftRange("S$S$(//)", 68.6, 5.0, "T", 69.7, 65.9, 2, 4)); ht.put("S$S(//)", HOSECodeShiftRange("S$S(//)", 51.6, 5.6, "T", 53.1, 49.8, 2, 4)); ht.put("S$(//)", HOSECodeShiftRange("S$(//)", 40.6, 7.0, "Q", 57.0, 34.8, 34, 94)); ht.put("SSS(//)", HOSECodeShiftRange("SSS(//)", 56.7, 29.9, "D", 69.3, 41.7, 3, 5)); ht.put("SSP$(//)", HOSECodeShiftRange("SSP$(//)", 44.1, 5.0, "D", 44.1, 44.1, 1, 1)); ht.put("SSX(//)", HOSECodeShiftRange("SSX(//)", 74.9, 5.0, "D", 74.9, 74.9, 1, 1)); ht.put("SS(//)", HOSECodeShiftRange("SS(//)", 39.2, 24.4, "T", 97.7, 18.6, 35, 57)); ht.put("SQ(//)", HOSECodeShiftRange("SQ(//)", 23.2, 5.0, "T", 23.2, 23.2, 1, 2)); ht.put("SFFF(//)", HOSECodeShiftRange("SFFF(//)", 129.2, 5.0, "S", 129.7, 128.2, 4, 13)); ht.put("SFFX(//)", HOSECodeShiftRange("SFFX(//)", 130.0, 5.0, "S", 130.1, 129.9, 1, 6)); ht.put("SFXX(//)", HOSECodeShiftRange("SFXX(//)", 121.3, 5.0, "S", 121.6, 119.4, 3, 13)); ht.put("SXXX(//)", HOSECodeShiftRange("SXXX(//)", 99.3, 5.0, "S", 102.9, 97.6, 6, 44)); ht.put("SXX(//)", HOSECodeShiftRange("SXX(//)", 77.0, 5.0, "D", 78.2, 75.9, 2, 2)); ht.put("SX(//)", HOSECodeShiftRange("SX(//)", 46.3, 10.9, "T", 50.8, 42.5, 3, 4)); ht.put("S(//)", HOSECodeShiftRange("S(//)", 19.4, 15.0, "Q", 49.0, 6.5, 217, 732)); ht.put("P$XXX(//)", HOSECodeShiftRange("P$XXX(//)", 89.0, 5.0, "S", 89.0, 89.0, 1, 1)); ht.put("P$X(//)", HOSECodeShiftRange("P$X(//)", 35.3, 13.1, "T", 45.6, 33.0, 3, 6)); ht.put("P$(//)", HOSECodeShiftRange("P$(//)", 14.2, 6.5, "Q", 20.7, 4.3, 29, 65)); ht.put("PP(//)", HOSECodeShiftRange("PP(//)", 33.3, 5.0, "D", 33.3, 33.3, 1, 1)); ht.put("PPQ(//)", HOSECodeShiftRange("PPQ(//)", 17.6, 5.0, "D", 17.6, 17.6, 1, 1)); ht.put("PP(//)", HOSECodeShiftRange("PP(//)", 35.9, 32.9, "T", 53.9, 13.8, 6, 8)); ht.put("PQ(//)", HOSECodeShiftRange("PQ(//)", 16.0, 18.6, "T", 23.4, 7.8, 4, 6)); ht.put("PFFF(//)", HOSECodeShiftRange("PFFF(//)", 124.5, 5.0, "S", 126.4, 118.7, 9, 15)); ht.put("PX(//)", HOSECodeShiftRange("PX(//)", 43.4, 5.0, "T", 53.1, 33.8, 2, 2)); ht.put("P(//)", HOSECodeShiftRange("P(//)", 16.6, 13.0, "Q", 34.9, -38.8, 308, 1520)); ht.put("QQQQ(//)", HOSECodeShiftRange("QQQQ(//)", 7.7, 28.1, "S", 13.1, 0.3, 2, 3)); ht.put("QQ(//)", HOSECodeShiftRange("QQ(//)", 2.5, 5.0, "T", 6.1, -2.2, 8, 13)); ht.put("QXX(//)", HOSECodeShiftRange("QXX(//)", 62.6, 5.0, "D", 64.6, 61.9, 2, 4)); ht.put("QX(//)", HOSECodeShiftRange("QX(//)", 29.9, 10.5, "T", 32.7, 20.7, 5, 7)); ht.put("QY(//)", HOSECodeShiftRange("QY(//)", 16.6, 5.0, "T", 17.6, 14.8, 3, 4)); ht.put("QI(//)", HOSECodeShiftRange("QI(//)", -13.1, 5.0, "T", -13.1, -13.1, 1, 2)); ht.put("Q(//)", HOSECodeShiftRange("Q(//)", 1.3, 9.8, "Q", 54.6, -30.3, 420, 2793)); ht.put("BBBB(//)", HOSECodeShiftRange("BBBB(//)", 62.4, 5.0, "S", 63.4, 61.4, 1, 4)); ht.put("BBB(//)", HOSECodeShiftRange("BBB(//)", 102.4, 5.0, "D", 102.4, 102.4, 1, 2)); ht.put("B(//)", HOSECodeShiftRange("B(//)", 7.5, 16.2, "Q", 19.2, -15.7, 36, 62)); ht.put("FF(//)", HOSECodeShiftRange("FF(//)", 108.5, 5.0, "T", 108.5, 108.5, 1, 1)); ht.put("F(//)", HOSECodeShiftRange("F(//)", 73.5, 7.4, "Q", 75.2, 71.8, 1, 3)); ht.put("XXXX(//)", HOSECodeShiftRange("XXXX(//)", 96.1, 5.0, "S", 96.3, 95.9, 1, 5)); ht.put("XXXY(//)", HOSECodeShiftRange("XXXY(//)", 67.4, 5.0, "S", 67.5, 67.3, 1, 2)); ht.put("XXX(//)", HOSECodeShiftRange("XXX(//)", 77.2, 5.0, "D", 77.3, 77.1, 1, 7)); ht.put("XXYY(//)", HOSECodeShiftRange("XXYY(//)", 35.4, 5.0, "S", 35.4, 35.4, 1, 1)); ht.put("XXY(//)", HOSECodeShiftRange("XXY(//)", 56.9, 5.0, "D", 57.2, 56.6, 1, 2)); ht.put("XX(//)", HOSECodeShiftRange("XX(//)", 53.8, 5.0, "T", 53.9, 53.7, 1, 4)); ht.put("XYYY(//)", HOSECodeShiftRange("XYYY(//)", 4.8, 5.0, "S", 4.8, 4.8, 1, 1)); ht.put("XYY(//)", HOSECodeShiftRange("XYY(//)", 34.2, 5.0, "D", 34.2, 34.2, 1, 2)); ht.put("XY(//)", HOSECodeShiftRange("XY(//)", 38.6, 5.0, "T", 40.3, 36.9, 1, 2)); ht.put("X(//)", HOSECodeShiftRange("X(//)", 25.2, 5.0, "Q", 25.7, 24.7, 1, 2)); ht.put("YYYY(//)", HOSECodeShiftRange("YYYY(//)", -30.0, 5.0, "S", -29.5, -30.5, 1, 4)); ht.put("YYY(//)", HOSECodeShiftRange("YYY(//)", 11.5, 5.6, "D", 12.8, 10.2, 1, 3)); ht.put("YY(//)", HOSECodeShiftRange("YY(//)", 20.3, 5.0, "T", 21.6, 19.0, 1, 2)); ht.put("Y(//)", HOSECodeShiftRange("Y(//)", 9.6, 5.0, "Q", 9.9, 9.3, 1, 3)); ht.put("III(//)", HOSECodeShiftRange("III(//)", -97.4, 2.4, "D", -99.9, -99.9, 1, 2)); ht.put("II(//)", HOSECodeShiftRange("II(//)", -58.1, 5.0, "T", -52.5, -63.7, 1, 2)); ht.put("I(//)", HOSECodeShiftRange("I(//)", -21.0, 5.0, "Q", -20.0, -22.0, 1, 5)); } xdrawchem-v1.11.0/xdrawchem/boshcp.h000066400000000000000000000107221371466245600173730ustar00rootroot00000000000000// XDrawChem // Copyright (C) 1997 - 2000 Dr. Christoph Steinbeck // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // boshcp.h -- A C++/Qt version of the Bremser C13 prediction table. // See Bremser W, "Expectation Ranges of 13C NMR ChemicalShifts", Mag. Res. // Chem. 23(4):271-275 // Derived from Java implementation by Christoph Steinbeck, see copyright // notice above #ifndef BOSHCP_H #define BOSHCP_H #include #include class HOSECodeShiftRange { public: QString code; double shift; double confidenceLimit; QString multiplicity; double maxShift; double minShift; int fourSphereCount; int lineCount; bool valid; HOSECodeShiftRange() { valid = true; } HOSECodeShiftRange(QString c, double s, double conf, QString m, double ma, double mi, int f, int l) { code = c; shift = s; confidenceLimit = conf; multiplicity = m; maxShift = ma; minShift = mi; fourSphereCount = f; lineCount = l; valid = true; } QString toString() { QString tmp; QString s("delta_C: "); tmp.setNum(shift); s.append(tmp); s.append("("); s.append(multiplicity); s.append(")"); // s.append(" for code "); // s.append(code); // s.append(" with confidence limit "); s.append(" +/- "); tmp.setNum(confidenceLimit); s.append(tmp); s.append(" in shift range "); tmp.setNum(maxShift); s.append(tmp); s.append("-"); tmp.setNum(minShift); s.append(tmp); return s; } }; class HashKey { public: HashKey() {} QString key; HOSECodeShiftRange data; }; class PseudoHashTable { public: QList table; HashKey *tmp_key; HOSECodeShiftRange get(QString n) { foreach (tmp_key, table) { if (tmp_key->key == n) return tmp_key->data; } HOSECodeShiftRange ret; ret.valid = false; return ret; } void put(QString n, HOSECodeShiftRange r) { tmp_key = new HashKey; tmp_key->key = n; tmp_key->data = r; table.append(tmp_key); } bool containsKey(QString n) { foreach (tmp_key, table) { if (tmp_key->key == n) return true; } return false; } }; class BremserOneSphereHOSECodePredictor { public: BremserOneSphereHOSECodePredictor() { prepareHashTable(); } double predict(QString hoseCode) { if (ht.containsKey(hoseCode)) return ht.get(hoseCode).shift; return -1.0; } QString predictFull(QString hoseCode) { if (ht.containsKey(hoseCode)) return ht.get(hoseCode).toString(); return QString(""); } QString getMult(QString hoseCode) { if (ht.containsKey(hoseCode)) return ht.get(hoseCode).multiplicity; return QString(""); } double getConfidenceLimit(QString hoseCode) { if (ht.containsKey(hoseCode)) return ht.get(hoseCode).confidenceLimit; return -1.0; } QString getBibData() { QString s = "The carbon NMR chemical shift prediction of this module \n"; s += "is based on the 651 1-sphere HOSE-Code table published by W. " "Bremser in:\n"; s += "W. Bremser, \"Expectation Ranges of 13C NMR Chemical Shifts\", \n"; s += "Mag. Res. Chem., Vol. 23, No. 4, 1985, 271-275.\n"; s += "It is important to understand, that these values are indeed not " "more than expectation ranges.\n"; return s; } void prepareHashTable(); void prepTable2(); private: PseudoHashTable ht; }; #endif xdrawchem-v1.11.0/xdrawchem/boxtool.xpm000066400000000000000000000005511371466245600201570ustar00rootroot00000000000000/* XPM */ static const char *boxtool[] = { "16 13 2 1", "A c #040404040404", "B c #F3F3F7F7F3F3", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBAAAAAAAAAAAABB", "BBABBBBBBBBBBABB", "BBABBBBBBBBBBABB", "BBABBBBBBBBBBABB", "BBABBBBBBBBBBABB", "BBABBBBBBBBBBABB", "BBABBBBBBBBBBABB", "BBABBBBBBBBBBABB", "BBAAAAAAAAAAAABB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; xdrawchem-v1.11.0/xdrawchem/bracket.cpp000066400000000000000000000200261371466245600200610ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // bracket.cpp - Bracket's implementation of functions #include "bracket.h" #include "bondedit.h" #include "defs.h" #include "drawable.h" #include "render2d.h" Bracket::Bracket(Render2D *r1, QObject *parent) : Drawable(parent) { r = r1; highlighted = false; style = BRACKET_SQUARE; subtext = ""; fill = false; fillColor = QColor(0, 255, 255); } Bracket *Bracket::CloneTo(Drawable *target) const { if (!target) target = new Bracket(r, parent()); Bracket *t = static_cast(this->Drawable::CloneTo(target)); t->subtext = subtext; t->fill = fill; t->fillColor = fillColor; return t; } QString Bracket::ToXML(QString xml_id) { QString s, n1; // begin bracket s.append("\n"); // write Start s.append(""); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\n"); // write End s.append(""); n1.setNum(end->x); s.append(n1); s.append(" "); n1.setNum(end->y); s.append(n1); s.append("\n"); // write Style s.append("\n"); // write subscript text, if present if (subtext.length() > 0) { s.append(""); s.append(subtext); s.append("\n"); } // write color s.append(""); n1.setNum(color.red()); s.append(n1); s.append(" "); n1.setNum(color.green()); s.append(n1); s.append(" "); n1.setNum(color.blue()); s.append(n1); s.append("\n"); // fill info s.append(""); if (fill == true) s.append("true"); else s.append("false"); s.append(""); s.append(""); n1.setNum(fillColor.red()); s.append(n1); s.append(" "); n1.setNum(fillColor.green()); s.append(n1); s.append(" "); n1.setNum(fillColor.blue()); s.append(n1); s.append("\n"); // end bracket s.append("\n"); return s; } QString Bracket::ToCDXML(QString xml_id) { QString s, n1; // begin arrow s.append("x); s.append(n1); s.append(" "); n1.setNum(end->y); s.append(n1); s.append(" "); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\" "); if (style == BRACKET_SQUARE) s.append("GraphicType=\"Bracket\" BracketType=\"SquarePair\""); if (style == BRACKET_CURVE) s.append("GraphicType=\"Bracket\" BracketType=\"RoundPair\""); if (style == BRACKET_BRACE) s.append("GraphicType=\"Bracket\" BracketType=\"CurlyPair\""); s.append("/>\n"); return s; } // set Bracket from XDrawChem-format XML void Bracket::FromXML(QString xml_tag) { int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 8; SetStartFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 6; SetEndFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf("") + 8; style = xml_tag.mid(i1 + 7, 1).toInt(); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 12; subtext = xml_tag.mid(i1, i2 - i1); subtext.remove(0, 11); i2 = subtext.indexOf(""); subtext.remove(i2, 999); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 8; SetColorFromXML(xml_tag.mid(i1, i2 - i1)); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { if (xml_tag.mid(i1 + 6, 4) == "true") fill = true; else fill = false; } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 12; SetFillColorFromXML(xml_tag.mid(i1, i2 - i1)); } } void Bracket::SetFillColorFromXML(QString xml_tag) { qDebug() << "SetFColorFromXML:" << xml_tag; int i1, i2; int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 11); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> d1 >> d2 >> d3; fillColor = QColor(d1, d2, d3); } void Bracket::Render() { QColor c1, ivc; if (highlighted) c1 = QColor(255, 0, 0); else c1 = color; // safety check if ((fill == true) && (fillable() == true)) { ivc = fillColor; // otherwise, it's invalid } r->drawBracket(start->toQPoint(), end->toQPoint(), c1, style, ivc); int tx = end->toQPoint().x(), ty = end->toQPoint().y(); tx += 4; if (subtext.length() > 0) r->drawString(subtext, QPoint(tx, ty), c1, QFont("helvetica", 10)); } void Bracket::Edit() { BondEditDialog be(r, start, end, TYPE_BRACKET, 0, 0, 0, style, color); if (!be.exec()) return; qDebug() << "change"; style = be.Style(); color = be.Color(); } int Bracket::Type() { return TYPE_BRACKET; } bool Bracket::Find(DPoint *target) { if (start == target) return true; if (end == target) return true; return false; } // Do not allow connections to this object. // Simplest way to do this, I think, is to disallow this function DPoint *Bracket::FindNearestPoint(DPoint *target, double &dist) { dist = 99999.0; return 0; } Drawable *Bracket::FindNearestObject(DPoint *target, double &dist) { DPoint *tl = new DPoint; DPoint *tr = new DPoint; DPoint *bl = new DPoint; DPoint *br = new DPoint; double tl_x, tl_y, br_x, br_y, swp, dist1, dist2; tl_x = start->x; tl_y = start->y; br_x = end->x; br_y = end->y; if (tl_x < br_x) { swp = tl_x; tl_x = br_x; br_x = swp; } if (tl_y < br_y) { swp = tl_y; tl_y = br_y; br_y = swp; } tl->x = tl_x; tl->y = tl_y; bl->x = tl_x; bl->y = br_y; tr->x = br_x; tr->y = tl_y; br->x = br_x; br->y = br_y; dist1 = DistanceToLine(tl, bl, target); dist2 = DistanceToLine(tr, br, target); if (dist1 < dist2) dist = dist1; else dist = dist2; delete tl; delete tr; delete bl; delete br; return this; } void Bracket::setPoints(DPoint *s, DPoint *e) { start = s; end = e; } bool Bracket::isWithinRect(QRect n, bool /*shiftdown*/) { if (DPointInRect(start, n) && DPointInRect(end, n)) highlighted = true; else highlighted = false; return highlighted; } QRect Bracket::BoundingBox() { if (highlighted == false) return QRect(QPoint(999, 999), QPoint(0, 0)); int top, bottom, left, right, swp; top = (int)start->y; left = (int)start->x; bottom = (int)end->y; right = (int)end->x; if (bottom < top) { swp = top; top = bottom; bottom = swp; } if (right < left) { swp = left; left = right; right = swp; } return QRect(QPoint(left, top), QPoint(right, bottom)); } xdrawchem-v1.11.0/xdrawchem/bracket.h000066400000000000000000000044041371466245600175300ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // bracket.h -- subclass of Drawable for brackets #ifndef BRACKET_H #define BRACKET_H #include #include #include #include "dpoint.h" #include "drawable.h" #include "render2d.h" class Bracket : public Drawable { public: Bracket(Render2D *, QObject *parent = 0); Bracket *CloneTo(Drawable *target = nullptr) const; void Render(); // draw this object void Edit(); int Type(); // return type of object bool Find(DPoint *); // does this Bracket contain this DPoint? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void setPoints(DPoint *, DPoint *); bool isWithinRect(QRect, bool); QRect BoundingBox(); QString ToXML(QString); QString ToCDXML(QString); void FromXML(QString); int Style() { return style; } void SetStyle(int s1) { style = s1; } void setText(QString s1) { subtext = s1; } QString getText() { return subtext; } void setFill(bool b1) { fill = b1; } bool getFill() { return fill; } void setFillColor(QColor fc1) { fillColor = fc1; } QColor getFillColor() { return fillColor; } void SetFillColorFromXML(QString); bool fillable() { if (style > 3) return true; // see defs.h for BRACKET_ return false; } private: // Renderer Render2D *r; // subscript text, if applicable QString subtext; // fill options, where applicable bool fill; QColor fillColor; }; #endif xdrawchem-v1.11.0/xdrawchem/brackets.h000066400000000000000000000220431371466245600177120ustar00rootroot00000000000000static const char *boxbracket_xpm[] = { /* width height ncolors chars_per_pixel */ "30 30 2 1", /* colors */ "A c None", "B c #000000", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBBBBBBBBBBBBBBBBBBBBBBBAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABBBBBBBBBBBBBBBBBBBBBBBBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; static const char *closedsquarebracket_xpm[] = { /* width height ncolors chars_per_pixel */ "30 30 2 1", /* colors */ "A c None", "B c #000000", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBBBBBBBBBBBBBBBBBBBBBBBAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAABAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAABAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAABAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAABAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAABAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAABABABABABABABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABBBBBBBBBBBBBBBBBBBBBBBBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; /* XPM */ static const char *squarebracket_xpm[] = { /* width height ncolors chars_per_pixel */ "30 30 2 1", /* colors */ "A c None", "B c #000000", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBBBBBAAAAAAAAAAAABBBBBBAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABBBBBBAAAAAAAAAAAABBBBBBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; static const char *ellipsebracket_xpm[] = { /* width height ncolors chars_per_pixel */ "30 30 2 1", /* colors */ "A c None", "B c #000000", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAABBBBBBBBBBBBBBBBAAAAAAA", "AAAAAABAAAAAAAAAAAAAAAABAAAAAA", "AAAAABAAAAAAAAAAAAAAAAAABAAAAA", "AAAABAAAAAAAAAAAAAAAAAAAABAAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAAABAAAAAAAAAAAAAAAAAAAABAAAA", "AAAAABAAAAAAAAAAAAAAAAAABAAAAA", "AAAAAABAAAAAAAAAAAAAAAABAAAAAA", "AAAAAAABBBBBBBBBBBBBBBBAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; static const char *circlebracket_xpm[] = { /* width height ncolors chars_per_pixel */ "30 30 2 1", /* colors */ "A c None", "B c #000000", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAABBBBBBBBBBBBBBBBAAAAAAA", "AAAAAABAAAAAAAAAAAAAAAABAAAAAA", "AAAAABAAAAAAAAABAAAAAAAABAAAAA", "AAAABAAAAAAAAAAAAAAAAAAAABAAAA", "AAABAAAAAAAAAAABAAAAAAAAAABAAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAABAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAABAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAABAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAABABABABABABABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAAABAAAAAAAAAAAAAAAAAAAABAAAA", "AAAAABAAAAAAAAAAAAAAAAAABAAAAA", "AAAAAABAAAAAAAAAAAAAAAABAAAAAA", "AAAAAAABBBBBBBBBBBBBBBBAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; static const char *curvebracket_xpm[] = { /* width height ncolors chars_per_pixel */ "30 30 2 1", /* colors */ "A c None", "B c #000000", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAABAAAAAAAAAAAAAABAAAAAAA", "AAAAAABAAAAAAAAAAAAAAAABAAAAAA", "AAAAABAAAAAAAAAAAAAAAAAABAAAAA", "AAAABAAAAAAAAAAAAAAAAAAAABAAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AABAAAAAAAAAAAAAAAAAAAAAAAABAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAAABAAAAAAAAAAAAAAAAAAAABAAAA", "AAAAABAAAAAAAAAAAAAAAAAABAAAAA", "AAAAAABAAAAAAAAAAAAAAAABAAAAAA", "AAAAAAABAAAAAAAAAAAAAABAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; static const char *bracebracket_xpm[] = { /* width height ncolors chars_per_pixel */ "30 30 2 1", /* colors */ "A c None", "B c #000000", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBBBBBAAAAAAAAAAAABBBBBBAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "BBBBAAAAAAAAAAAAAAAAAAAAAABBBB", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABAAAAAAAAAAAAAAAAAAAAAABAAA", "AAABBBBBBAAAAAAAAAAAABBBBBBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; xdrawchem-v1.11.0/xdrawchem/ccw180.xpm000066400000000000000000000021431371466245600174750ustar00rootroot00000000000000/* XPM */ static const char * ccw180_xpm[] = { "30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", ".............++++++...........", "..........+++......+++........", ".........+............+.......", "........+..............+......", ".......+................+.....", "......+..................+....", ".....+....................+...", ".....+....................+...", "+....+..+.................+...", ".+..+..+...................+..", "..+.+.+....................+..", "...+++.....................+..", "....+......................+..", "..............................", "..............................", "..............................", ".......+....+++...+++.........", "......++...+...+.+...+........", ".......+...+...+.+...+........", ".......+....+++..+...+........", ".......+...+...+.+...+........", ".......+...+...+.+...+........", ".......+...+...+.+...+........", ".......+....+++...+++.........", "..............................", "..............................", ".............................."}; xdrawchem-v1.11.0/xdrawchem/ccw270.xpm000066400000000000000000000022701371466245600174760ustar00rootroot00000000000000/* XPM */ static const char *ccw270_xpm[] = { /* width height num_colors chars_per_pixel */ " 30 30 2 1", /* colors */ ". c #ffffff", "# c #000000", /* pixels */ "..............................", "............######............", "..........##......##..........", ".........##........##.........", "........##..........##........", "........#............#........", ".......#..............#.......", ".......#..............#.......", ".......#..............#.......", ".......#......................", ".......#......................", ".......#......................", "........#.....................", "........##...#................", ".........##...#...............", "..........##...#..............", "............#####.............", "...............#..............", "..............#...............", ".............#................", "..............................", "..............................", ".........##..####..##.........", "........#..#.#..#.#..#........", "...........#...#..#..#........", "..........#....#..#..#........", ".........#....#...#..#........", "........####..#....##.........", "..............................", ".............................." }; xdrawchem-v1.11.0/xdrawchem/ccw90.xpm000066400000000000000000000021421371466245600174140ustar00rootroot00000000000000/* XPM */ static const char * ccw90_xpm[] = { "30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "...........+..................", "..........+...................", ".........+....................", "........++++++................", ".........+....+++.............", "..........+......+............", "...........+......+...........", "...................+..........", "....................+.........", ".....................+........", ".....................+........", ".....................+........", "......................+.......", "......................+.......", "......................+.......", "......................+.......", "..............................", "..............................", "..............................", "..........+++...+++...........", ".........+...+.+...+..........", ".........+...+.+...+..........", "..........++++.+...+..........", ".............+.+...+..........", ".............+.+...+..........", ".............+.+...+..........", "..........+++...+++...........", "..............................", "..............................", ".............................."}; xdrawchem-v1.11.0/xdrawchem/cdx2cdxml.cpp000066400000000000000000000250311371466245600203370ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "chemdata.h" #include "defs.h" #include "dpoint.h" #include "text.h" // Parse property (2 byte property + 2 byte length + value) QString ChemData::ParseProperty(QByteArray a) { QString propvalue; QString sx, sy; propvalue = ""; if ((a[0] == '0') && (a[1] == '2')) { // position, p int y1 = (unsigned char)a[4] + (unsigned char)a[5] * 256 + (unsigned char)a[6] * 65536 + (unsigned char)a[7] * 16777216; int x1 = (unsigned char)a[8] + (unsigned char)a[9] * 256 + (unsigned char)a[10] * 65536 + (unsigned char)a[11] * 16777216; sx.setNum((double)x1 / 65536.0); sy.setNum((double)y1 / 65536.0); propvalue.append("p=\""); propvalue.append(sx); propvalue.append(" "); propvalue.append(sy); propvalue.append("\""); return propvalue; } if ((a[0] == '4') && (a[1] == '2')) { // bounding box int y1 = (unsigned char)a[4] + (unsigned char)a[5] * 256 + (unsigned char)a[6] * 65536 + (unsigned char)a[7] * 16777216; int x1 = (unsigned char)a[8] + (unsigned char)a[9] * 256 + (unsigned char)a[10] * 65536 + (unsigned char)a[11] * 16777216; int y2 = (unsigned char)a[12] + (unsigned char)a[13] * 256 + (unsigned char)a[14] * 65536 + (unsigned char)a[15] * 16777216; int x2 = (unsigned char)a[16] + (unsigned char)a[17] * 256 + (unsigned char)a[18] * 65536 + (unsigned char)a[19] * 16777216; sx.setNum((double)x1 / 65536.0); sy.setNum((double)y1 / 65536.0); QString sx2, sy2; sx2.setNum((double)x2 / 65536.0); sy2.setNum((double)y2 / 65536.0); propvalue.append("BoundingBox=\""); propvalue.append(sx); propvalue.append(" "); propvalue.append(sy); propvalue.append(" "); propvalue.append(sx2); propvalue.append(" "); propvalue.append(sy2); propvalue.append("\""); return propvalue; } if ((a[0] == '4') && (a[1] == '6')) { // bond begin B propvalue.append("B=\""); int x1 = (unsigned char)a[4] + (unsigned char)a[5] * 256 + (unsigned char)a[6] * 65536 + (unsigned char)a[7] * 16777216; sx.setNum(x1); propvalue.append(sx); propvalue.append("\""); return propvalue; } if ((a[0] == '5') && (a[1] == '6')) { // bond end E propvalue.append("E=\""); int x1 = (unsigned char)a[4] + (unsigned char)a[5] * 256 + (unsigned char)a[6] * 65536 + (unsigned char)a[7] * 16777216; sx.setNum(x1); propvalue.append(sx); propvalue.append("\""); return propvalue; } if ((a[0] == '0') && (a[1] == '6')) { // bond order propvalue.append("Order=\""); int x1 = (unsigned char)a[4]; sx.setNum(x1); propvalue.append(sx); propvalue.append("\""); return propvalue; } if ((a[0] == '1') && (a[1] == '6')) { // bond display property int x1 = (unsigned char)a[4]; if (x1 == 3) propvalue = "Display=\"WedgedHashBegin\""; if (x1 == 6) propvalue = "Display=\"WedgeBegin\""; return propvalue; } if ((a[0] == '0') && (a[1] == 'a')) { // graphic type if (a[4] == '1') propvalue = "GraphicType=\"Line\""; if (a[4] == '2') propvalue = "GraphicType=\"Arc\""; if (a[4] == '6') propvalue = "GraphicType=\"Bracket\""; if (a[4] == '7') propvalue = "GraphicType=\"Symbol\""; return propvalue; } if ((a[0] == '6') && (a[1] == 'a')) { // bracket type if (a[4] == '0') propvalue = "BracketType=\"RoundPair\""; if (a[4] == '1') propvalue = "BracketType=\"SquarePair\""; if (a[4] == '2') propvalue = "BracketType=\"CurlyPair\""; return propvalue; } if ((a[0] == '2') && (a[1] == 'a')) { // arrow type propvalue = "ArrowType=\"FullHead\""; return propvalue; } if ((a[0] == '0') && (a[1] == '7')) { // propvalue.append(""); int x1 = (a[4] * 10) + 6; for (int d = x1; d < a.size(); d++) propvalue += a.at(d); propvalue.append(""); return propvalue; } qDebug() << "Unrecognized property: " << Qt::hex << (int)a[1] << " " << (int)a[0] << " [" << Qt::dec << a.size() - 4 << " bytes]"; return QString(""); } // Convert binary CDX to text CDXML QString ChemData::CDXToCDXML(QString fn) { QFile f(fn); QString wholefile, proptag, stag; QStack tagstack; QString *ts; if (!f.open(QIODevice::ReadOnly)) return wholefile; qDebug() << "CDX ChemDraw binary file format."; // QMessageBox::warning(r, "Can't read binary format", // "This file is a ChemDraw (CDX) binary file, but this program // cannot read it (yet :)"); // make a QByteArray QByteArray cdxfile = f.readAll(); // for ( int c = 0; c < f.size(); c++ ) { // cdxfile[c] = f.getch(); // } bool opentag = false; // start reading tags. int ptr; ptr = 28; // theoretically, position 28 is where the Document tag is // the Document tag doesn't really matter to us; we ignore most of that // stuff anyways... wholefile.append(""); if ((cdxfile[ptr] == '0') && (cdxfile[ptr + 1] == 'b')) ptr = 30; do { // until a , , or tag is found if ((cdxfile[ptr] == '0') && (cdxfile[ptr + 1] == '0')) { // end tag? if (tagstack.count() > 0) { if (opentag) wholefile.append(">"); ts = tagstack.top(); if ((*ts == "") && (stag.length() > 1)) { wholefile.append(stag); stag = ""; } ts = tagstack.pop(); wholefile.append(*ts); ptr += 2; opentag = false; } else { ptr += 2; } continue; } if (cdxfile[ptr + 1] >= '0') { // it's a property int moveforward = cdxfile[ptr + 3] * 256; // TODO + cdxfile[ptr+2] + 4; QByteArray b(moveforward, '0'); for (int d = 0; d < moveforward; d++) b[d] = cdxfile[ptr + d]; proptag = ParseProperty(b); if ((cdxfile[ptr] == '0') && (cdxfile[ptr + 1] == '7')) { stag = proptag; ptr += moveforward; // move past data continue; } if (proptag.length() > 1) { wholefile.append(" "); wholefile.append(proptag); } ptr += moveforward; // move past data continue; } if ((unsigned char)cdxfile[ptr + 1] == 'c') { // it's an object if ((tagstack.count() > 0) && opentag) wholefile.append(">"); opentag = true; int local_id = 0; local_id = local_id + (unsigned char)cdxfile[ptr + 2]; local_id = local_id + (unsigned char)cdxfile[ptr + 3] * 256; QString s_id; s_id.setNum(local_id); if (cdxfile[ptr] == '1') { // page object wholefile.append(""); tagstack.push(ts); ptr += 6; // move past tag and ID continue; } if (cdxfile[ptr] == '3') { // fragment object wholefile.append(""); tagstack.push(ts); ptr += 6; // move past tag and ID continue; } if (cdxfile[ptr] == '4') { // node object wholefile.append(""); tagstack.push(ts); ptr += 6; // move past tag and ID continue; } if (cdxfile[ptr] == '5') { // bond object wholefile.append(""); tagstack.push(ts); ptr += 6; // move past tag and ID continue; } if (cdxfile[ptr] == '6') { // text object wholefile.append(""); tagstack.push(ts); ptr += 6; // move past tag and ID continue; } if (cdxfile[ptr] == '7') { // graphic object wholefile.append(""); tagstack.push(ts); ptr += 6; // move past tag and ID continue; } } } while (ptr < cdxfile.size()); wholefile.append(""); // qDebug() << wholefile; return wholefile; } xdrawchem-v1.11.0/xdrawchem/cdxml_reader.cpp000066400000000000000000000423111371466245600211000ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // CDXML_Reader.cpp - function definitions for class CDXML_Reader #include "cdxml_reader.h" #include "chemdata.h" #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "text.h" extern Preferences preferences; CDXML_Reader::CDXML_Reader(ChemData *c1) { nodedepth = 0; fragdepth = 0; c = c1; colors.append({0, QColor(0, 0, 0)}); colors.append({1, QColor(255, 255, 255)}); } bool CDXML_Reader::ReadFile(QString fn) { qDebug() << Qt::endl << "New and improved CDXML parser" << Qt::endl; int i1 = fn.indexOf("") + 8; ParseDocument(fn.mid(i1, i2 - i1)); Build(); qDebug() << Qt::endl << "Done parsing!" << Qt::endl; return false; } void CDXML_Reader::ParseDocument(QString dtag) { int i1, i2; // find and parse color table i1 = dtag.indexOf(""); i2 = dtag.indexOf("") + 13; if (i1 >= 0) { ParseColorTable(dtag.mid(i1, i2 - i1)); dtag.remove(i1, i2 - i1); } // if no color table, set default foreground and background if (colors.count() < 3) { colors.append({2, QColor(255, 255, 255)}); // background colors.append({3, QColor(0, 0, 0)}); // foreground } // find and parse font table i1 = dtag.indexOf(""); i2 = dtag.indexOf("") + 12; if (i1 >= 0) { ParseFontTable(dtag.mid(i1, i2 - i1)); dtag.remove(i1, i2 - i1); } // find and parse page(s) do { i1 = dtag.indexOf("") + 7; if (i1 < 0) break; ParsePage(dtag.mid(i1, i2 - i1)); dtag.remove(i1, i2 - i1); } while (1); } void CDXML_Reader::ParseColorTable(QString ctable) { QString nexttag; int ptr = 0, idx = 2; readTag(ctable, ptr); // Discard = 0) { i2 = i1 + positionOfEndTag(ptag.mid(i1), "fragment"); ParseFragment(ptag.mid(i1, i2 - i1)); ptag.remove(i1, i2 - i1); flag = true; } // find text // i1 = ptag.indexOf("= 0) { // i2 = ptag.indexOf("") + 4; // ParseText(ptag.mid(i1, i2 - i1)); // ptag.remove(i1, i2 - i1); // flag = true; //} } while (flag); // repeat as necessary // find text and graphics not contained in fragments do { flag = false; i1 = ptag.indexOf("= 0) { i2 = i1 + positionOfEndTag(ptag.mid(i1), "t"); qDebug() << "toplevel"; QString rs = ParseText(ptag.mid(i1, i2 - i1)); DPoint *curr_node = new DPoint; curr_node->x = globalx; curr_node->y = globaly; curr_node->element = rs; nodelist.append(curr_node); ptag.remove(i1, i2 - i1); flag = true; } i1 = ptag.indexOf("= 0) { i2 = ptag.indexOf(">", i1) + 1; if (!selfContainedTag(ptag.mid(i1, i2 - i1))) qDebug() << "Malformed "; qDebug() << "toplevel"; ParseGraphic(ptag.mid(i1, i2 - i1)); ptag.remove(i1, i2 - i1); flag = true; } } while (flag); } // warning, fragments can contain nodes, which in turn can contain fragments. // make sure you get the level right void CDXML_Reader::ParseFragment(QString ftag) { fragdepth++; qDebug() << Qt::endl << "<--frag-->"; qDebug() << ftag << Qt::endl << Qt::endl; int i1, i2; bool flag; do { flag = false; // find nodes i1 = ftag.indexOf("", i1) + 1; if (i1 >= 0) { if (!selfContainedTag(ftag.mid(i1, i2 - i1))) i2 = i1 + positionOfEndTag(ftag.mid(i1), "n"); ParseNode(ftag.mid(i1, i2 - i1)); ftag.remove(i1, i2 - i1); flag = true; } } while (flag); do { flag = false; // find bonds (typically self-contained) i1 = ftag.indexOf("", i1) + 1; if (i1 >= 0) { if (!selfContainedTag(ftag.mid(i1, i2 - i1))) qDebug() << "Malformed "; ParseBond(ftag.mid(i1, i2 - i1)); ftag.remove(i1, i2 - i1); flag = true; } // find graphics i1 = ftag.indexOf("= 0) { i2 = ftag.indexOf(">", i1) + 1; if (!selfContainedTag(ftag.mid(i1, i2 - i1))) qDebug() << "Malformed "; ParseGraphic(ftag.mid(i1, i2 - i1)); ftag.remove(i1, i2 - i1); flag = true; } } while (flag); fragdepth--; } // note this reads and the contained QString CDXML_Reader::ParseText(QString ttag) { qDebug() << Qt::endl << "<--text-->"; qDebug() << ttag << Qt::endl; int i1, i2, i3; QString a1, v1; // tokenize the tag QStringList t_tokens; i1 = ttag.indexOf(">"); t_tokens = readAttr(ttag.left(i1 + 1)); qDebug() << "<--t_tokens-->"; for (int c1 = 0; c1 < t_tokens.count(); c1 += 2) { a1 = t_tokens.at(c1); v1 = t_tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("P")) { i1 = v1.indexOf(QString(" ")); globalx = v1.mid(0, i1).toDouble(); globaly = v1.mid(i1 + 1).toDouble(); } } // tokenize the tag QString actualtext; // QStringList s_tokens; // i1 = ttag.indexOf("", i1) + 1; // s_tokens = readAttr(ttag.mid(i1, i2 - i1)); // qDebug() << "<--s_tokens-->" ; // for (int c1 = 0; c1 < s_tokens.count(); c1 += 2) { // a1 = *(s_tokens.at(c1)); // v1 = *(s_tokens.at(c1 + 1)); // qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-" ; // compare attribute a1 with list of relevant attr's //} // read actual text // i1 = i2; // i2 = ttag.indexOf("<", i1); // QString actualtext = ttag.mid(i1, i2 - i1); while ((i1 = ttag.indexOf(" 0) { i2 = ttag.indexOf(">", i1); i3 = ttag.indexOf("", i2); actualtext.append(ttag.mid(i2 + 1, i3 - i2 - 1)); ttag.remove(i1, i3 - i1 + 4); qDebug() << ttag; }; qDebug() << "string = " << actualtext; return actualtext; } void CDXML_Reader::ParseGraphic(QString gtag) { CDXML_Object *curr_obj = new CDXML_Object; curr_obj->type = TYPE_DRAWABLE; // tokenize the tag QStringList tokens; QString a1, v1; int i1; DPoint *s1, *e1; i1 = gtag.indexOf(">"); tokens = readAttr(gtag.left(i1 + 1)); qDebug() << "<--graphictokens-->"; for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == "BOUNDINGBOX") { s1 = new DPoint; e1 = new DPoint; QTextStream coords(&v1, QIODevice::ReadOnly); coords >> s1->x >> s1->y >> e1->x >> e1->y; // qDebug() << s1->x << " "; // qDebug() << s1->y << " "; // qDebug() << e1->x << " "; // qDebug() << e1->y ; curr_obj->start = s1; curr_obj->end = e1; } // don't let GraphicType override special types... if ((a1.toUpper() == "GRAPHICTYPE") && (curr_obj->type == TYPE_DRAWABLE)) { if (v1.toUpper() == "BRACKET") curr_obj->type = TYPE_BRACKET; } if (a1.toUpper() == "ARROWTYPE") { curr_obj->type = TYPE_ARROW; curr_obj->idata2 = ARROW_REGULAR; if (v1.toUpper() == "RESONANCE") curr_obj->idata2 = ARROW_BI1; if (v1.toUpper() == "EQUILIBRIUM") curr_obj->idata2 = ARROW_BI2; if (v1.toUpper() == "RETROSYNTHETIC") curr_obj->idata2 = ARROW_RETRO; } if (a1.toUpper() == "BRACKETTYPE") { curr_obj->idata2 = BRACKET_SQUARE; if (v1.toUpper() == "SQUAREPAIR") curr_obj->type = TYPE_BRACKET; if (v1.toUpper() == "ROUNDPAIR") { curr_obj->type = TYPE_BRACKET; curr_obj->idata2 = BRACKET_CURVE; } if (v1.toUpper() == "CURLYPAIR") { curr_obj->type = TYPE_BRACKET; curr_obj->idata2 = BRACKET_BRACE; } } } objectlist.append(curr_obj); } // warning, nodes can contain fragments, which in turn can contain nodes. // make sure you get the level right void CDXML_Reader::ParseNode(QString ntag) { DPoint *curr_node = new DPoint; nodedepth++; qDebug() << Qt::endl << "<--node-->"; qDebug() << ntag << Qt::endl << Qt::endl; int i1, i2; bool flag; // tokenize the tag QStringList tokens; QString a1, v1, nodetype; i1 = ntag.indexOf(">"); tokens = readAttr(ntag.left(i1 + 1)); qDebug() << "<--nodetokens-->"; for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) curr_node->id = v1; if (a1.toUpper() == QString("NODETYPE")) nodetype = v1; if (a1.toUpper() == QString("P")) { i1 = v1.indexOf(QString(" ")); curr_node->x = v1.mid(0, i1).toDouble(); curr_node->y = v1.mid(i1 + 1).toDouble(); } } do { flag = false; // find nodes i1 = ntag.indexOf("= 0) { i2 = i1 + positionOfEndTag(ntag.mid(i1), "fragment"); // right now, we only care about top-level fragment/nodes // ParseFragment(ntag.mid(i1, i2 - i1)); ntag.remove(i1, i2 - i1); flag = true; } // find text (strings) i1 = ntag.indexOf("= 0) { i2 = i1 + positionOfEndTag(ntag.mid(i1), "t"); QString rs = ParseText(ntag.mid(i1, i2 - i1)); curr_node->element = rs; ntag.remove(i1, i2 - i1); flag = true; } } while (flag); nodedepth--; nodelist.append(curr_node); } void CDXML_Reader::ParseBond(QString btag) { CDXML_Object *curr_obj = new CDXML_Object; curr_obj->type = TYPE_BOND; curr_obj->idata1 = 1; // tokenize the tag QStringList tokens; QString a1, v1; int i1; i1 = btag.indexOf(">"); tokens = readAttr(btag.left(i1 + 1)); qDebug() << "<--bondtokens-->"; for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) curr_obj->id = v1; if (a1.toUpper() == QString("B")) curr_obj->start_id = v1; if (a1.toUpper() == QString("E")) curr_obj->end_id = v1; if (a1.toUpper() == QString("ORDER")) curr_obj->idata1 = v1.toUInt(); if (a1.toUpper() == QString("DISPLAY")) { if (v1 == QString("WedgeBegin")) curr_obj->idata1 = 5; if (v1 == QString("WedgedHashBegin")) curr_obj->idata1 = 7; } } objectlist.append(curr_obj); } DPoint *CDXML_Reader::FindNode(QString key) { for (DPoint *curr_node : nodelist) { if (curr_node->id == key) return curr_node; } return 0; } // build structure from data we read void CDXML_Reader::Build() { QList up; DPoint *s1, *e1; Text *nt; double bondlength = 0.0; int nbonds = 0; qDebug() << "nodes: " << nodelist.count(); qDebug() << "objects: " << objectlist.count(); // add all non-text objects for (CDXML_Object *curr_obj : objectlist) { if (curr_obj->type == TYPE_BOND) { s1 = FindNode(curr_obj->start_id); e1 = FindNode(curr_obj->end_id); bondlength += s1->distanceTo(e1); nbonds++; c->addBond(s1, e1, 1, curr_obj->idata1, QColor(0, 0, 0), true); s1->hit = true; e1->hit = true; if (up.contains(s1)) up.append(s1); if (up.contains(e1)) up.append(e1); } if (curr_obj->type == TYPE_ARROW) { c->addArrow(curr_obj->end, curr_obj->start, QColor(0, 0, 0), curr_obj->idata2, true); if (up.contains(curr_obj->start)) up.append(curr_obj->start); if (up.contains(curr_obj->end)) up.append(curr_obj->end); } if (curr_obj->type == TYPE_BRACKET) { c->addBracket(curr_obj->start, curr_obj->end, QColor(0, 0, 0), curr_obj->idata2, true); if (up.contains(curr_obj->start)) up.append(curr_obj->start); if (up.contains(curr_obj->end)) up.append(curr_obj->end); } } // add text for (DPoint *curr_node : nodelist) { if (curr_node->element != "C") { nt = new Text(c->getRender2D()); nt->setPoint(curr_node); if (up.contains(curr_node)) up.append(curr_node); if (curr_node->hit) { // true = part of molecule nt->setJustify(JUSTIFY_CENTER); } else { // false = free-standing text nt->setJustify(JUSTIFY_TOPLEFT); } nt->setText(curr_node->element); curr_node->element.fill(' '); // nt->setTextMask( curr_node->element ); nt->Highlight(true); c->addText(nt); } } // clear "hit" flag for (DPoint *curr_node : nodelist) { curr_node->hit = false; } // scale drawing double avglen = bondlength / (double)nbonds; double curfixed = preferences.getBond_fixedlength(); double sf = curfixed / avglen; qDebug() << "Scale:" << sf; // sf = 1.0; double sl = 9999.0, sr = -9999.0, st = 9999.0, sb = -9999.0; for (DPoint *curr_node : up) { curr_node->x *= sf; curr_node->y *= sf; if (curr_node->x < sl) sl = curr_node->x; if (curr_node->x > sr) sr = curr_node->x; if (curr_node->y < st) st = curr_node->y; if (curr_node->y > sb) sb = curr_node->y; } double tx = 50 - sl; double ty = 50 - st; for (DPoint *curr_node : up) { curr_node->x += tx; curr_node->y += ty; } } xdrawchem-v1.11.0/xdrawchem/cdxml_reader.h000066400000000000000000000050221371466245600205430ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // CDXML_Reader: XML Reader for CDXML type. #include #include #include #include "chemdata.h" #include "dpoint.h" #include "xml_reader.h" // TODO Remove int index struct ColorTableEntry { int index; QColor color; }; struct FontTableEntry { QString id; QString fam; }; class CDXML_Object { public: CDXML_Object() {} QString id; // XML ID QString start_id; // id of start and end points for bonds QString end_id; DPoint *start; // start and end points for non-bonds DPoint *end; int type; int idata1, idata2; double ddata1, ddata2; QString sdata; QColor color; QFont font; }; class CDXML_Reader : public XML_Reader { public: CDXML_Reader(ChemData *); bool ReadFile(QString); private: // basically, all member functions are private. Not necessary but // probably a good idea void ParseDocument(QString); void ParseColorTable(QString); QColor ParseColor(QString); void ParseFontTable(QString); FontTableEntry ParseFont(QString); void ParsePage(QString); void ParseFragment(QString); QString ParseText(QString); void ParseGraphic(QString); void ParseNode(QString); void ParseBond(QString); DPoint *FindNode(QString); void Build(); // ---- // data // ---- // color table QList colors; // font table QList fonts; // node list (atoms) and temp object QList nodelist; // CDXML object list and temp object QList objectlist; // ChemData object we are reading into ChemData *c; // how many levels of node/fragment are we in int nodedepth, fragdepth; // for passing data double globalx, globaly; }; xdrawchem-v1.11.0/xdrawchem/charsel.cpp000066400000000000000000000066741371466245600201040ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include "charsel.h" #include "defs.h" #include "prefs.h" extern Preferences preferences; CharSelLabel::CharSelLabel(QWidget *parent) : QLabel(parent) {} void CharSelLabel::mousePressEvent(QMouseEvent *e1) { int c1; c1 = (int)((double)e1->y() / 16.0); c1 *= 32; c1 += (int)((double)e1->x() / 16.0); emit thisChar(c1); } CharSelDialog::CharSelDialog(QWidget *parent) : QDialog(parent) { QFontDatabase qfd; QStringList families = qfd.families(); int firstsym = -1, cc1 = -1; thischar = "spam"; setWindowTitle(tr("Insert symbol")); QLabel *l1 = new QLabel(); l1->setGeometry(10, 10, 80, 30); l1->setText(tr("Font:")); charfont = new QComboBox(); charfont->setGeometry(100, 10, 180, 30); QString family; for (QStringList::Iterator f = families.begin(); f != families.end(); ++f) { cc1++; family = *f; charfont->addItem(family); if ((family.toLower().contains("symbol") > 0) && (firstsym < 0)) firstsym = cc1; } charfont->setCurrentIndex(firstsym); connect(charfont, SIGNAL(activated(int)), this, SLOT(fontChange(int))); letters = new CharSelLabel(this); letters->setGeometry(10, 50, 512, 128); // letters->setText( "sample" ); fontChange(firstsym); connect(letters, SIGNAL(thisChar(int)), this, SLOT(chosenChar(int))); QPushButton *dismiss; dismiss = new QPushButton(tr("Cancel"), this); dismiss->setGeometry(140, 220, 80, 30); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); } void CharSelDialog::fontChange(int n1) { symbolFont = QFont(charfont->currentText(), 12); QPixmap p1(512, 128); p1.fill(); int i, j; QPainter pp; QString l1; QChar qc1; char c1; pp.begin(&p1); pp.setFont(symbolFont); for (i = 0; i < 32; i++) { pp.drawLine(i * 16, 0, i * 16, 200); } for (i = 0; i < 8; i++) { pp.drawLine(0, i * 16, 600, i * 16); } for (j = 0; j < 8; j++) { for (i = 0; i < 32; i++) { c1 = (char)(j * 32 + i); qc1 = c1; l1 = qc1; pp.drawText(i * 16 + 2, j * 16 + 12, l1); } } pp.end(); letters->setPixmap(p1); } void CharSelDialog::chosenChar(int c1) { qDebug() << "charsel: " << c1; QString l1; QChar qc1; char cc1; cc1 = (char)c1; qc1 = cc1; thischar = qc1; QLineEdit *lined = new QLineEdit(this); lined->setText(thischar); lined->setFont(symbolFont); thischar = lined->text(); delete lined; accept(); } // cmake#include "charsel.moc" xdrawchem-v1.11.0/xdrawchem/charsel.h000066400000000000000000000030051371466245600175320ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef CHARDIALOG_H #define CHARDIALOG_H #include #include #include #include #include class CharSelLabel : public QLabel { Q_OBJECT public: CharSelLabel(QWidget *parent); signals: void thisChar(int); protected: void mousePressEvent(QMouseEvent *); }; class CharSelDialog : public QDialog { Q_OBJECT public: CharSelDialog(QWidget *parent); QString selectedChar() { return thischar; } QFont selectedFont() { return symbolFont; } public slots: void fontChange(int); void chosenChar(int); private: QComboBox *charfont; CharSelLabel *letters; QString thischar; QFont symbolFont; int papersize, orient, ps_set, po_set; }; #endif xdrawchem-v1.11.0/xdrawchem/chemdata.cpp000066400000000000000000000312071371466245600202170ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "chemdata.h" #include "arrow.h" #include "biotools.h" #include "bond.h" #include "bracket.h" #include "curvearrow.h" #include "defs.h" #include "drawable.h" #include "molecule.h" #include "symbol.h" #include "text.h" ChemData::ChemData(QObject *parent) : QObject(parent) { thick_kludge = -1; notSaved = false; // Initialize Undo undo_index = -1; } ChemData::~ChemData() { if (clip && !clip->owners) delete clip; } void ChemData::drawAll() { // draw all objects in ChemData for (Drawable *curr_draw : drawlist) { curr_draw->Render(); } } // update Molecules after move void ChemData::FinishMove() { for (Drawable *curr_draw : drawlist) { if (curr_draw->Type() == TYPE_MOLECULE) { static_cast(curr_draw)->Changed(); } } notSaved = true; } Molecule *ChemData::firstMolecule() { for (Drawable *curr_draw : drawlist) { if (curr_draw->Type() == TYPE_MOLECULE) { return static_cast(curr_draw); } } return nullptr; } void ChemData::addMolecule(Molecule *m1) { drawlist.append(m1); notSaved = true; } void ChemData::addArrow(DPoint *s, DPoint *e, QColor c, int t, int p2, bool hl) { Arrow *a1 = new Arrow(r); a1->setPoints(s, e); a1->SetColor(c); a1->SetStyle(t); a1->setThick(p2); if (hl) a1->Highlight(true); drawlist.append(a1); notSaved = true; } void ChemData::addCurveArrow(DPoint *s, DPoint *e, QColor c, QString s1, bool hl) { CurveArrow *a1 = new CurveArrow(r); a1->setPoints(s, e); a1->SetColor(c); a1->SetCurve(s1); if (hl) a1->Highlight(true); drawlist.append(a1); notSaved = true; } void ChemData::addBracket(DPoint *s, DPoint *e, QColor c, int type, bool hl) { Bracket *a1 = new Bracket(r); a1->setPoints(s, e); a1->SetColor(c); a1->SetStyle(type); if (hl) a1->Highlight(true); drawlist.append(a1); notSaved = true; } void ChemData::addText(Text *t) { qDebug() << "addText"; if (t->Justify() == JUSTIFY_TOPLEFT) { // add to drawing drawlist.append(t); } else { // add label to specific Molecule for (Drawable *curr_draw : drawlist) { if (curr_draw->Find(t->Start()) == true) { Molecule *tm = (Molecule *)curr_draw; // this is cheating, I know! tm->addText(t); return; } } qDebug() << "FYI, add text failed"; } notSaved = true; } void ChemData::addGraphicObject(GraphicObject *t) { drawlist.append(t); notSaved = true; } void ChemData::addBond(DPoint *s, DPoint *e, int thick, int order, QColor c, bool hl) { // qInfo() << "Request to add bond:" << s->element << "(" << s->x << "," << // s->y << ")-" << e->element << "(" << e->x << "," << e->y << "), order " // << order; Drawable *m1 = 0, *m2 = 0; for (Drawable *curr_draw : drawlist) { if (curr_draw->Find(s)) m1 = curr_draw; if (curr_draw->Find(e)) m2 = curr_draw; } // qInfo() << "m1 = " << (m1 == 0 ? -1 : m1->Type()) << ", m2 = " << (m2 == // 0 ? -1 : m2->Type()); // neither point exists -- create new Molecule if ((m1 == 0) && (m2 == 0)) { // qInfo() << "neither point exists, create new Molecule"; Molecule *m = new Molecule(r); m->SetChemdata(this); m->addBond(s, e, thick, order, c, hl); drawlist.append(m); notSaved = true; return; } // one point exists, or both in same molecule if ((m1 == 0) && (m2 != 0)) { m1 = m2; m2 = 0; } if (((m1 != 0) && (m2 == 0)) || (m1 == m2)) { // qInfo() << "one point exists, or both in same molecule"; m1->addBond(s, e, thick, order, c, hl); notSaved = true; return; } // both points exist in different molecules if (m1 != m2) { // qInfo() << "both points exist in different molecules"; m1->addBond(s, e, thick, order, c, hl); m1->addMolecule(m2); // before or after addBond? drawlist.removeAll(m2); delete m2; } notSaved = true; } void ChemData::addSymbol(DPoint *a, QString symbolfile, bool hl) { Symbol *s1 = new Symbol(r); s1->setPoint(a); s1->SetSymbol(symbolfile); if (hl) s1->Highlight(true); // determine whether point exists or not; if exists, add to Molecule for (Drawable *curr_draw : drawlist) { if ((curr_draw->Find(a)) && (curr_draw->Type() == TYPE_MOLECULE)) { static_cast(curr_draw)->addSymbol(s1); return; } } drawlist.append(s1); notSaved = true; } Molecule *ChemData::insideMolecule(DPoint *t1) { // qDebug() << t1->x << "," << t1->y; for (Drawable *curr_draw : drawlist) { if (curr_draw->Type() == TYPE_MOLECULE) { Molecule *m1 = (Molecule *)curr_draw; // QRect tr1 = m1->BoundingBoxAll(); // qDebug() << tr1.left() << "," << tr1.top() << ";"; // qDebug() << tr1.right() << "," << tr1.bottom(); if (m1->BoundingBoxAll().contains(t1->toQPoint(), false)) return m1; } } return 0; } DPoint *ChemData::FindNearestPoint(DPoint *target, double &dist) { DPoint *nearest = 0, *d1; double mindist = 9999.0, d1dist = 999999.0; for (Drawable *curr_draw : drawlist) { d1 = curr_draw->FindNearestPoint(target, d1dist); if (d1dist < mindist) { mindist = d1dist; nearest = d1; } } dist = mindist; return nearest; } Drawable *ChemData::FindNearestObject(DPoint *target, double &dist) { Drawable *nearest = 0, *d1; double mindist = 2000.0, d1dist = 999999.0; for (Drawable *curr_draw : drawlist) { d1 = curr_draw->FindNearestObject(target, d1dist); if (d1dist < mindist) { mindist = d1dist; nearest = d1; } } dist = mindist; return nearest; } void ChemData::Erase(Drawable *d) { QList removelist; bool erased = false; if (drawlist.removeAll(d) == false) { for (Drawable *curr_draw : drawlist) { erased = curr_draw->Erase(d); // collect empty Molecules for removal if (curr_draw->Members() == 0) removelist.append(curr_draw); qDebug() << "erased:" << erased; if (erased == true) break; // should only be one instance of d to remove! } } else { // drawlist.remove(d) == true delete d; } // remove empty Molecules for (Drawable *curr_draw : removelist) { drawlist.removeAll(curr_draw); delete curr_draw; } // Split Molecules as needed DetectSplit(); notSaved = true; } void ChemData::EraseSelected() { QList removelist; for (Drawable *curr_draw : drawlist) { if (curr_draw->Type() == TYPE_MOLECULE) { static_cast(curr_draw)->EraseSelected(); // collect empty Molecules for removal if (curr_draw->Members() == 0) removelist.append(curr_draw); } else { if (curr_draw->Highlighted() == true) { removelist.append(curr_draw); } } } for (Drawable *curr_draw : removelist) { /* if (curr_draw->Type() == TYPE_TEXT) { Text *tmp_text = (Text *)curr_draw; if (tmp_text->getDataType() == TEXT_DATA_MW) { tmp_text->getMolecule()->MWLabelDeleted(); } if (tmp_text->getDataType() == TEXT_DATA_FORMULA) { tmp_text->getMolecule()->FormulaLabelDeleted(); } } */ drawlist.removeAll(curr_draw); delete curr_draw; } // Split Molecules as needed DetectSplit(); notSaved = true; } // Split Molecule's which hold multiple structures (e.g. after delete) void ChemData::DetectSplit() { QList removelist; QList split_list; for (Drawable *curr_draw : drawlist) { if (curr_draw->Type() == TYPE_MOLECULE) { Molecule *tmp_mol = (Molecule *)curr_draw; split_list = tmp_mol->MakeSplit(); if (split_list.count() > 1) { qDebug() << "Split needed"; removelist.append(curr_draw); for (Drawable *td2 : split_list) { drawlist.append(td2); } split_list.clear(); } } } // remove old Molecules for (Drawable *curr_draw : removelist) { drawlist.removeAll(curr_draw); delete curr_draw; } } void ChemData::SelectAll() { QList allpts = UniquePoints(); for (Drawable *curr_draw : drawlist) { curr_draw->SelectAll(); } for (DPoint *curr_pt : allpts) { curr_pt->setHighlighted(true); } } void ChemData::DeselectAll() { QList allpts = UniquePoints(); for (Drawable *curr_draw : drawlist) { curr_draw->DeselectAll(); } for (DPoint *curr_pt : allpts) { curr_pt->setHighlighted(false); } } void ChemData::SetColorIfHighlighted(QColor c) { for (Drawable *curr_draw : drawlist) curr_draw->SetColorIfHighlighted(c); } void ChemData::Move(double dx, double dy) { for (Drawable *curr_draw : drawlist) curr_draw->Move(dx, dy); notSaved = true; } void ChemData::Resize(DPoint *d1, double dy) { for (Drawable *curr_draw : drawlist) curr_draw->Resize(d1, dy); notSaved = true; } void ChemData::Rotate(DPoint *d1, double dy) { for (Drawable *curr_draw : drawlist) curr_draw->Rotate(d1, dy); notSaved = true; } void ChemData::Flip(DPoint *d1, int dy) { for (Drawable *curr_draw : drawlist) curr_draw->Flip(d1, dy); notSaved = true; } // Find minimum rectangle needed to enclose selection QRect ChemData::selectionBox() { int top = 99999, bottom = 0, left = 99999, right = 0; QRect tmprect; for (Drawable *curr_draw : drawlist) { tmprect = curr_draw->BoundingBox(); if (tmprect.isValid()) { left = std::min(tmprect.left(), left); right = std::max(tmprect.right(), right); top = std::min(tmprect.top(), top); bottom = std::max(tmprect.bottom(), bottom); } } left = std::max(0, left - 3); top = std::max(0, top - 3); // Change right and bottom to have a maximum of right += 5; bottom += 3; return QRect(QPoint(left, top), QPoint(right, bottom)); } // when doing multiple selection via MODE_SELECT_MULTIPLE, we will // have to highlight/unhighlight regions of the drawing as the selection // box changes. This function is called to start checking whether objects // fall within the select box. void ChemData::NewSelectRect(QRect n, bool shiftdown) { QList allpts = UniquePoints(); for (DPoint *curr_pt : allpts) { if (n.contains(curr_pt->toQPoint()) == true) { curr_pt->setHighlighted(true); } else { curr_pt->setHighlighted(false); } } for (Drawable *curr_draw : drawlist) { curr_draw->isWithinRect(n, shiftdown); } } // Get list of unique points contained in all Molecules. QList ChemData::UniquePoints() { QList up, tp; for (Drawable *curr_draw : drawlist) { tp = curr_draw->AllPoints(); for (DPoint *curr_pt : tp) up.append(curr_pt); } qDebug() << up.count(); return up; } QList ChemData::UniqueObjects() { QList uo; for (Drawable *curr_draw : drawlist) { for (Drawable *td2 : curr_draw->AllObjects()) { uo.append(td2); } } qInfo() << uo.count() << " unique objects"; return uo; } int ChemData::Size() { return drawlist.size(); } // cmake#include "chemdata.moc" xdrawchem-v1.11.0/xdrawchem/chemdata.h000066400000000000000000000137241371466245600176700ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // chemdata.h -- the class that manages all of XDrawChem's data. #ifndef CHEMDATA_H #define CHEMDATA_H #include #include #include #include "bond.h" #include "cml.h" #include "drawable.h" #include "gobject.h" #include "molinfodialog.h" #include "text.h" #include "xdc_event.h" #include "prefs.h" extern Preferences preferences; class Render2D; class Clipboard; class ChemData : public QObject { Q_OBJECT public: void setRender2D(Render2D *r1) { r = r1; } Render2D *getRender2D() { return r; } bool edited() { return notSaved; } bool needsSave() { return notSaved; } void saved() { notSaved = false; } // defined in chemdata.cpp ChemData(QObject *parent = 0); ~ChemData(); void drawAll(); Molecule *firstMolecule(); void addMolecule(Molecule *); void addBond(DPoint *, DPoint *, int, int, QColor, bool hl = false); void addArrow(DPoint *, DPoint *, QColor, int, int, bool hl = false); void addCurveArrow(DPoint *, DPoint *, QColor, QString, bool hl = false); void addBracket(DPoint *, DPoint *, QColor, int, bool hl = false); void addText(Text *); void addGraphicObject(GraphicObject *); void addSymbol(DPoint *, QString, bool hl = false); void Erase(Drawable *); void EraseSelected(); void DetectSplit(); DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void NewSelectRect(QRect, bool); void SelectAll(); void DeselectAll(); void Move(double, double); void Resize(DPoint *, double); void Rotate(DPoint *, double); void Flip(DPoint *, int); void SetColorIfHighlighted(QColor); void FinishMove(); QRect selectionBox(); QList UniquePoints(); QList UniqueObjects(); int Size(); void SetTopLeft(QPoint p) { RenderTopLeft = p; } Molecule *insideMolecule(DPoint *); // defined in chemdata_edit.cpp void Cut(); void Copy(); bool Paste(); void StartUndo(int fn = 0, DPoint *s1 = 0); bool Undo(); bool Redo(); void ScaleAll(double bond_length = -1.0); // defined in chemdata_rw.cpp bool load(QString); bool save(QString); bool load_legacy(QString); // defined in chemdata_xdc.cpp bool load_native(QString); bool save_native(QString); // defined in chemdata_cdx.cpp bool save_cdx(QString); bool save_cdxml(QString); // defined in chemdata_mdl.cpp bool load_mdl(QString); bool ProcessMDL(QString); bool save_mdl(QString); // defined in chemdata_xml.cpp bool load_xml(QString); bool ProcessXML(QString); bool LoadCDXMLFile(QString, QString); bool SelfContainedTag(QString); QString ReadTag(QString, int &); QString ReadData(QString, int &); QStringList ReadAttr(QString); QStringList Tokenize(QString); void ParseBoundingBox(QString, double &, double &, double &, double &); // defined in chemdata_cml.cpp bool NewLoadCMLFile(QString); bool LoadCMLFile(QString, QString); bool save_cml(QString); void Convert_CML_Lists_To_Native(); // defined in chemdata_tools.cpp void Save3D(QString); void clearAllGroups(); void Tool(DPoint *, int); void AutoLayout(); void fromSMILES(QString); void SmartPlace(QString, DPoint *); void SmartPlaceToo(QString, DPoint *); void SmartPlaceThree(QString, DPoint *); double CalculateRingAttachAngle(DPoint *); bool SelectWithinLoop(QVector); // defined in cdx2cdxml.cpp QString ParseProperty(QByteArray); QString CDXToCDXML(QString); // defined in chemdata_rxn.cpp void ReactionAnalysis(int); // defined in retro.cpp void Retro(Molecule *); // defined here void setThickKludge(int lt1) { thick_kludge = lt1; } Clipboard *getClipboard() { if (!clip) clip = new Clipboard; return clip; } void setClipboard(Clipboard *clip1) { if (clip1) ++clip1->owners; clip = clip1; } public slots: void XDCEventHandler(XDC_Event *); void returnFromMID(); signals: void SignalSetStatusBar(QString); void SignalHelpTopic(QString); void SignalUpdateCustomRingMenu(); private: // the Render2D widget this ChemData is linked to Render2D *r; // Top left corner of visible part of r QPoint RenderTopLeft; // Application clipboard Clipboard *clip = nullptr; // list of Drawable objects we are tracking QList drawlist; // Variables for reading CML/CDXML/XML files QString MoleculeTitle; QString MoleculeId; QList CML_Atoms; QList CML_Atoms_Sub; QList CML_Bonds; QList CML_Bonds_Sub; QList TagStack; QList CDXML_Objects; CML_Atom *curr_atom; CML_Bond *curr_bond; // variables for Undo int undo_index; DPoint *undo_start, *undo_end; double undo_dx, undo_dy; QStringList last_states; QString current_undo_file; // Presistent dialogs MolInfoDialog *mi; Text *tt, *tt_mw, *tt_ef, *tt_ea; // hack for setting ring thickness int thick_kludge; // has this document changed since last save? bool notSaved; }; #endif xdrawchem-v1.11.0/xdrawchem/chemdata_cdx.cpp000066400000000000000000000045331371466245600210570ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "chemdata.h" #include "defs.h" #include "dpoint.h" #include "text.h" // save as ChemDraw binary format (IBM PC byte order) bool ChemData::save_cdx(QString fn) { QList up; QList uo; QString tmpline; // get all unique points and objects up = UniquePoints(); uo = UniqueObjects(); if (up.count() == 0) return false; // don't write an empty file // open file and text stream QFile f(fn); if (!f.open(QIODevice::WriteOnly)) { return false; } f.close(); return false; } // save as ChemDraw XML text format bool ChemData::save_cdxml(QString fn) { QList up; QList uo; QString tmpline, cur_id; int idcount = 1; // open file and text stream QFile f(fn); if (!f.open(QIODevice::WriteOnly)) { return false; } QTextStream t(&f); t << ""; t << ""; t << ""; t << ""; t << ""; t << ""; t << ""; // save document here Drawable *tmp_draw; foreach (tmp_draw, drawlist) { cur_id.setNum(idcount); tmpline = tmp_draw->ToCDXML(cur_id); if (tmp_draw->Type() == TYPE_MOLECULE) idcount += 500; else idcount += 2; t << tmpline; } t << ""; t << ""; f.close(); return true; } xdrawchem-v1.11.0/xdrawchem/chemdata_cdxml.cpp000066400000000000000000000355121371466245600214110ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "arrow.h" #include "bracket.h" #include "chemdata.h" #include "cml.h" #include "defs.h" #include "dpoint.h" #include "text.h" // handle CDXML format (used by ChemDraw, TM Cambridge Software) // assume Cambridge Software CDXML.DTD bool ChemData::LoadCDXMLFile(QString wholefile, QString doctype) { qDebug() << "CDXML"; int num_pages = 0; int currentpage; int currentfragment; int nodedepth = 0; QString line; QString tmpline, tfont, tdata, a1, v1, textpos, textstr, textid; QString graphic_id, graphictype, arrowtype, boundingbox; QString nodetype; DPoint *s1, *e1; QString thistag, nexttag; QStringList tokens, refs; int d1, ptr = 0; int *st1; double l1, l2, l3, l4; do { thistag = ReadTag(wholefile, ptr); // ReadTag returns a null at EOF (ideally). if (thistag.isNull()) break; // Look for beginning of document if (thistag.indexOf(QString("<") + doctype) >= 0) { qDebug() << ""; // push this tag on stack st1 = new int; *st1 = CML_MOLECULE; TagStack.append(st1); // parse attributes in tag tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("NAME")) MoleculeId = v1; // if (a1.toUpper() == QString("TITLE")) MoleculeTitle = // v1; } } // , and contained objects get ignored // (for now - may implement them later) // // handle if (thistag.indexOf(QString("= 0) { num_pages++; st1 = new int; *st1 = CDXML_PAGE; TagStack.append(st1); tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) currentpage = v1.toUInt(); } } // handle if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CDXML_PAGE) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } } // handle if (thistag.indexOf(QString("= 0) { st1 = new int; *st1 = CDXML_FRAGMENT; TagStack.append(st1); tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) currentfragment = v1.toUInt(); } } // handle if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CDXML_FRAGMENT) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } } // handle and if (thistag.indexOf(QString("= 0) { qDebug() << thistag; st1 = new int; *st1 = CDXML_GRAPHIC; TagStack.append(st1); tokens = ReadAttr(thistag); curr_bond = new CML_Bond; for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); // qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << // "-" ; compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) graphic_id = v1; if (a1.toUpper() == QString("BOUNDINGBOX")) boundingbox = v1; if (a1.toUpper() == QString("GRAPHICTYPE")) graphictype = v1; if (a1.toUpper() == QString("ARROWTYPE")) arrowtype = v1; if (a1.toUpper() == QString("BRACKETTYPE")) arrowtype = v1; } if (SelfContainedTag(thistag)) { TagStack.removeLast(); qDebug() << "ID = " << graphic_id; qDebug() << "BBox = " << boundingbox; qDebug() << "GType = " << graphictype; qDebug() << "AType = " << arrowtype; ParseBoundingBox(boundingbox, l1, l2, l3, l4); qDebug() << l1 << " " << l2 << " "; qDebug() << l3 << " " << l4; if ((graphictype.toUpper() == QString("LINE")) && (arrowtype.toUpper() == QString("FULLHEAD"))) { // create end points of this arrow s1 = new DPoint(l1, l2); e1 = new DPoint(l3, l4); Arrow *dr1 = new Arrow(r); dr1->setPoints(s1, e1); dr1->Highlight(true); CDXML_Objects.append(dr1); } if ((graphictype.toUpper() == QString("BRACKET")) && (arrowtype.toUpper() == QString("SQUAREPAIR"))) { // create corner points of this bracket qDebug() << "bracket"; s1 = new DPoint(l1, l2); e1 = new DPoint(l3, l4); Bracket *dr1 = new Bracket(r); dr1->setPoints(s1, e1); dr1->Highlight(true); CDXML_Objects.append(dr1); } } } // handle if (thistag == QString("")) { qDebug() << thistag; st1 = TagStack.last(); if (*st1 == CDXML_GRAPHIC) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } } // handle (string) if (thistag.indexOf(QString("= 0) { textstr.append(ReadData(wholefile, ptr)); nexttag = ReadTag(wholefile, ptr); if (nexttag != QString("")) qDebug() << "Imbalanced tags!"; } // handle (text box) if (thistag.indexOf(QString("= 0) { st1 = new int; *st1 = CDXML_TEXT; TagStack.append(st1); tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) textid = v1; if (a1.toUpper() == QString("P")) textpos = v1; } } // handle if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CDXML_TEXT) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } if ((curr_atom != 0) && (nodedepth > 0)) curr_atom->element = textstr; if (nodedepth == 0) { qDebug() << "TEXT:" << textid << "|" << textpos << "|" << textstr; curr_atom = new CML_Atom; curr_atom->atom = false; curr_atom->element = textstr; d1 = textpos.indexOf(QString(" ")); curr_atom->x = textpos.mid(0, d1).toDouble(); curr_atom->y = textpos.mid(d1).toDouble(); CML_Atoms.append(curr_atom); } textstr = QString(""); } // handle node if (thistag.indexOf(QString("= 0) { st1 = new int; *st1 = CDXML_NODE; TagStack.append(st1); nodedepth++; curr_atom = new CML_Atom; tokens = ReadAttr(thistag); nodetype = QString(""); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) curr_atom->id = v1; if (a1.toUpper() == QString("NODETYPE")) nodetype = v1; if (a1.toUpper() == QString("P")) { d1 = v1.indexOf(QString(" ")); curr_atom->x = v1.mid(0, d1).toDouble(); curr_atom->y = v1.mid(d1 + 1).toDouble(); } if (a1.toUpper() == QString("ELEMENT")) { if (v1 == QString("1")) curr_atom->element = QString("H"); if (v1 == QString("5")) curr_atom->element = QString("B"); if (v1 == QString("7")) curr_atom->element = QString("N"); if (v1 == QString("8")) curr_atom->element = QString("O"); if (v1 == QString("9")) curr_atom->element = QString("F"); if (v1 == QString("11")) curr_atom->element = QString("Na"); if (v1 == QString("15")) curr_atom->element = QString("P"); if (v1 == QString("16")) curr_atom->element = QString("S"); if (v1 == QString("17")) curr_atom->element = QString("Cl"); if (v1 == QString("19")) curr_atom->element = QString("K"); if (v1 == QString("35")) curr_atom->element = QString("Br"); if (v1 == QString("53")) curr_atom->element = QString("I"); } } if (SelfContainedTag(thistag)) { TagStack.removeLast(); nodedepth--; if (nodedepth == 0) // onl add if not nested CML_Atoms.append(curr_atom); } } // handle which is really if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CDXML_NODE) { TagStack.removeLast(); nodedepth--; } else { qDebug() << "Imbalanced (node) tags!"; } if (nodedepth == 0) // only add if not nested CML_Atoms.append(curr_atom); } // handle bonds ... or if (thistag.indexOf(QString("= 0) { qDebug() << thistag; st1 = new int; *st1 = CDXML_BOND; TagStack.append(st1); curr_bond = new CML_Bond; curr_bond->a1 = ""; tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) curr_bond->id = v1; if (a1.toUpper() == QString("B")) curr_bond->a1 = v1; if (a1.toUpper() == QString("E")) curr_bond->a2 = v1; if (a1.toUpper() == QString("ORDER")) curr_bond->order = v1.toUInt(); if (a1.toUpper() == QString("DISPLAY")) { if (v1 == QString("WedgeBegin")) curr_bond->order = 5; if (v1 == QString("WedgedHashBegin")) curr_bond->order = 7; } } if (SelfContainedTag(thistag)) { TagStack.removeLast(); if (nodedepth == 0) // only add if not in a node CML_Bonds.append(curr_bond); } } // handle if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CDXML_BOND) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } if (nodedepth == 0) // only add if not in a node CML_Bonds.append(curr_bond); } // Look for end of document if (thistag.indexOf(QString("= 0) { qDebug() << ""; st1 = TagStack.last(); if (*st1 == CML_MOLECULE) { TagStack.removeLast(); // should be last tag... if (!TagStack.isEmpty()) qDebug() << "Imbalanced tags!"; continue; } } } while (ptr < wholefile.length()); qDebug() << CML_Atoms.count() << " atoms"; qDebug() << CML_Bonds.count() << " bonds"; // convert CML_Atom and CML_Bond to DPoint and customObject, respectively Convert_CML_Lists_To_Native(); return false; } /* / Save CDXML file (fn = filename) bool ChemData::SaveCDXML(QString fn) { QPtrList up; QPtrList uo; Text *tmp_text; Bond *curr_bond; QString n1, nfull; int n = 0; up = UniquePoints(); uo = UniqueObjects(); if (up.count() == 0) return false; // don't write an empty file QFile f(fn); if (!f.open(IO_WriteOnly)) { return false; } QTextStream t(&f); // introductory XML stuff -- declare DTD, start molecule t << "" ; t << "" ; t << "" ; f.close(); return true; } */ xdrawchem-v1.11.0/xdrawchem/chemdata_cml.cpp000066400000000000000000000543501371466245600210560ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include // #include #include #include "chemdata.h" #include "cml.h" #include "defs.h" #include "dpoint.h" #include "text.h" #include "xml_cml.h" bool ChemData::NewLoadCMLFile(QString fn) { QFile xmlFile(fn); if (!xmlFile.open(QIODevice::ReadOnly)) return false; QXmlStreamReader reader; reader.setDevice(&xmlFile); CMLParser handler(r, &reader); handler.parse(); // Returns bool qDebug() << "done parsing"; // add bonds and labels to main drawing double totlen = 0.0, dx = 99999.0, dy = 99999.0; int n = 0; int th1; qDebug() << "thick_kludge: " << thick_kludge; if (thick_kludge > 0) { th1 = thick_kludge; } else { th1 = 1; } QList parsedBonds; Bond *tbond; parsedBonds = handler.getBonds(); foreach (tbond, parsedBonds) { addBond(tbond->Start(), tbond->End(), th1, tbond->Order(), QColor(0, 0, 0), true); if (tbond->Start()->x < dx) dx = tbond->Start()->x; if (tbond->End()->x < dx) dx = tbond->End()->x; if (tbond->Start()->y < dy) dy = tbond->Start()->y; if (tbond->End()->y < dy) dy = tbond->End()->y; totlen += tbond->Start()->distanceTo(tbond->End()); n++; } QList parsedPoints; parsedPoints = handler.getPoints(); QString makesub, ms2; for (DPoint *tmp_pt : parsedPoints) { if (tmp_pt->element != "C") { Text *nt = new Text(r); nt->setPoint(tmp_pt); nt->setJustify(JUSTIFY_CENTER); nt->Highlight(true); nt->setText(tmp_pt->element); makesub = tmp_pt->element; ms2 = ""; for (int cc = 0; cc < makesub.length(); cc++) { if (makesub[cc].isLetter()) ms2.append(" "); if (makesub[cc].isNumber()) ms2.append("-"); if (makesub[cc] == '+') ms2.append("+"); if (makesub[cc] == '-') ms2.append("+"); } // nt->setTextMask( ms2 ); addText(nt); } } // scale drawing // scale points to match current fixed length double curfixed = preferences.getBond_fixedlength(); double avglen = totlen / (double)n; double sf = curfixed / avglen; qDebug() << sf; for (DPoint *tmp_pt : parsedPoints) { tmp_pt->x *= sf; tmp_pt->y *= sf; } Move(-dx * sf, -dy * sf); Move(40, 40); return true; } // load CML format (save is waaaay down at the end of this file :) // 'legacy' CML support. Current CML format handled by LoadNew...() above bool ChemData::LoadCMLFile(QString wholefile, QString doctype) { QString line; QString tmpline, tfont, tdata, a1, v1; QString thistag, nexttag; QStringList tokens, refs; QStringList elementlist, fclist, x2list, y2list, idlist; QStringList a1list, a2list, olist; QString str_id, str_title, str_builtin, atomrefs1, atomrefs2, str_order, str_element; QString arr_fc, arr_x2, arr_y2; int d1, d5, ptr = 0; int *st1; do { thistag = ReadTag(wholefile, ptr); qDebug() << thistag.toLatin1(); // ReadTag returns a null at EOF (ideally). if (thistag.isNull()) break; // Look for beginning of document if (thistag.indexOf(QString("<") + doctype) >= 0) { // push this tag on stack st1 = new int; *st1 = CML_MOLECULE; TagStack.append(st1); // parse attributes in tag tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) MoleculeId = v1; if (a1.toUpper() == QString("TITLE")) MoleculeTitle = v1; } } // handle records if (thistag.indexOf(QString("= 0) { st1 = new int; *st1 = CML_ATOM; TagStack.append(st1); curr_atom = new CML_Atom; tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) curr_atom->id = v1; } } // handle if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CML_ATOM) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } CML_Atoms.append(curr_atom); } // handle records if (thistag.indexOf(QString("= 0) { st1 = new int; *st1 = CML_BOND; TagStack.append(st1); curr_bond = new CML_Bond; curr_bond->a1 = ""; tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("ID")) curr_bond->id = v1; if (a1.toUpper() == QString("ATOMREFS")) { d5 = v1.indexOf(QString(" ")); curr_bond->a1 = v1.left(d5); curr_bond->a2 = v1.mid(d5 + 1); qDebug() << "bond[" << curr_bond->a1.toLatin1() << "|"; qDebug() << curr_bond->a2.toLatin1() << "]"; } } } // handle if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CML_BOND) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } CML_Bonds.append(curr_bond); } // handle records if (thistag == QString("")) { st1 = new int; *st1 = CML_ATOMARRAY; TagStack.append(st1); str_id.remove(0, 9999); str_element.remove(0, 9999); } // handle if (thistag == QString("")) { st1 = TagStack.last(); if (*st1 == CML_ATOMARRAY) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } // create lists of tokens in arr_x2, arr_y2, str_id, str_element, // arr_fc idlist = Tokenize(str_id); elementlist = Tokenize(str_element); x2list = Tokenize(arr_x2); y2list = Tokenize(arr_y2); fclist = Tokenize(arr_fc); for (d1 = 0; d1 < idlist.count(); d1++) { curr_atom = new CML_Atom; curr_atom->id = idlist[d1]; curr_atom->element = elementlist[d1]; curr_atom->formalCharge = fclist[d1].toInt(); curr_atom->x = x2list[d1].toDouble(); curr_atom->y = y2list[d1].toDouble(); CML_Atoms.append(curr_atom); } } // handle records if (thistag == QString("")) { st1 = new int; *st1 = CML_BONDARRAY; TagStack.append(st1); atomrefs1.remove(0, 9999); atomrefs2.remove(0, 9999); str_order.remove(0, 9999); } // handle if (thistag == QString("")) { qDebug() << atomrefs1; qDebug() << atomrefs2; qDebug() << str_order; st1 = TagStack.last(); if (*st1 == CML_BONDARRAY) { TagStack.removeLast(); } else { qDebug() << "Imbalanced tags!"; } // tokenize data a1list = Tokenize(atomrefs1); a2list = Tokenize(atomrefs2); olist = Tokenize(str_order); for (d1 = 0; d1 < a1list.count(); d1++) { curr_bond = new CML_Bond; curr_bond->a1 = a1list[d1]; curr_bond->a2 = a2list[d1]; curr_bond->order = olist[d1].toInt(); CML_Bonds.append(curr_bond); } } // handle - if (thistag.indexOf(QString("= 0) { st1 = TagStack.last(); if (*st1 != CML_ATOM) qDebug() << "Improperly placed tag!"; tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "COORD2-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("TITLE")) str_title = v1; if (a1.toUpper() == QString("BUILTIN")) str_builtin = v1; } tdata = ReadData(wholefile, ptr); nexttag = ReadTag(wholefile, ptr); if (nexttag != QString("")) qDebug() << "Imbalanced tags!"; if (str_builtin != QString("xy2")) qDebug() << "Unrecognized builtin type in !"; d5 = tdata.indexOf(QString(" ")); curr_atom->x = tdata.left(d5).toDouble(); curr_atom->y = tdata.mid(d5).toDouble(); } // handle - if (thistag.indexOf(QString("= 0) { st1 = TagStack.last(); if (*st1 != CML_ATOM) qDebug() << "Improperly placed tag!"; tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "COORD3-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("TITLE")) str_title = v1; if (a1.toUpper() == QString("BUILTIN")) str_builtin = v1; } tdata = ReadData(wholefile, ptr); nexttag = ReadTag(wholefile, ptr); if (nexttag != QString("")) qDebug() << "Imbalanced tags!"; if ((str_builtin != QString("xyz3")) && (str_builtin != QString("xyzFract"))) qDebug() << "Unrecognized builtin type in !"; tokens = Tokenize(tdata); curr_atom->x = tokens[0].toDouble(); curr_atom->y = tokens[1].toDouble(); curr_atom->z = tokens[2].toDouble(); } // handle - AND - if ((thistag.indexOf(QString("= 0) || (thistag.indexOf(QString("= 0)) { tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); qDebug() << "STRING-" << a1.toLatin1() << "|" << v1.toLatin1() << "-"; // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("TITLE")) str_title = v1; if (a1.toUpper() == QString("BUILTIN")) str_builtin = v1; } tdata = ReadData(wholefile, ptr); nexttag = ReadTag(wholefile, ptr); qDebug() << "DATA[" << tdata << "]"; if (nexttag.left(8) != QString(" tags!"; // known cases of st1 = TagStack.last(); if ((*st1 == CML_BOND) && (str_builtin == QString("atomRef"))) { if (curr_bond->a1 == "") curr_bond->a1 = tdata; else curr_bond->a2 = tdata; } if ((*st1 == CML_BOND) && (str_builtin == QString("order"))) curr_bond->order = tdata.toInt(); if ((*st1 == CML_ATOM) && (str_builtin == QString("elementType"))) curr_atom->element = tdata; if ((*st1 == CML_ATOMARRAY) && (str_builtin == QString("elementType"))) str_element = tdata; if ((*st1 == CML_ATOMARRAY) && (str_builtin == QString("id"))) str_id = tdata; if ((*st1 == CML_BONDARRAY) && (str_builtin == QString("atomRefs"))) { if (atomrefs1.length() == 0) atomrefs1 = tdata; else atomrefs2 = tdata; } if ((*st1 == CML_BONDARRAY) && (str_builtin == QString("order"))) str_order = tdata; } // handle - AND // - if ((thistag.indexOf(QString("= 0) || (thistag.indexOf(QString("= 0)) { tokens = ReadAttr(thistag); for (int c1 = 0; c1 < tokens.count(); c1 += 2) { a1 = tokens.at(c1); v1 = tokens.at(c1 + 1); // compare attribute a1 with list of relevant attr's if (a1.toUpper() == QString("TITLE")) str_title = v1; if (a1.toUpper() == QString("BUILTIN")) str_builtin = v1; } tdata = ReadData(wholefile, ptr); nexttag = ReadTag(wholefile, ptr); qDebug() << "DATA[" << tdata << "]"; if ((nexttag != QString("")) && (nexttag != QString(""))) qDebug() << "Imbalanced or tags!"; // known cases of and st1 = TagStack.last(); if ((*st1 == CML_ATOMARRAY) && (str_builtin == QString("formalCharge"))) arr_fc = tdata; if ((*st1 == CML_ATOMARRAY) && (str_builtin == QString("x2"))) arr_x2 = tdata; if ((*st1 == CML_ATOMARRAY) && (str_builtin == QString("y2"))) arr_y2 = tdata; if ((*st1 == CML_ATOMARRAY) && (str_builtin == QString("x3"))) arr_x2 = tdata; if ((*st1 == CML_ATOMARRAY) && (str_builtin == QString("y3"))) arr_y2 = tdata; if ((*st1 == CML_BONDARRAY) && (str_builtin == QString("order"))) str_order = tdata; } // Look for end of document if (thistag.indexOf(QString("= 0) { st1 = TagStack.last(); if (*st1 == CML_MOLECULE) { TagStack.removeLast(); // should be last tag... if (!TagStack.isEmpty()) qDebug() << "Imbalanced tags!"; continue; } } } while (ptr < wholefile.length()); // convert CML_Atom and CML_Bond to DPoint and customObject, respectively Convert_CML_Lists_To_Native(); return true; } void ChemData::Convert_CML_Lists_To_Native() { double totlen = 0.0; int n = 0; QString makesub, ms2; int th1; qDebug() << "thick_kludge: " << thick_kludge; if (thick_kludge > 0) { th1 = thick_kludge; } else { th1 = 1; } // convert CML_Atoms to DPoints QList points; foreach (curr_atom, CML_Atoms) { points.append(curr_atom->toDPoint()); } // add Bonds DPoint *end1, *end2; // Bond endpoints foreach (curr_bond, CML_Bonds) { // find first atom for (DPoint *tmp_pt : points) { if (curr_bond->a1 == tmp_pt->id) { end1 = tmp_pt; break; } } // find second atom for (DPoint *tmp_pt : points) { if (curr_bond->a2 == tmp_pt->id) { end2 = tmp_pt; break; } } addBond(end1, end2, th1, curr_bond->order, QColor(0, 0, 0), true); totlen += end1->distanceTo(end2); n++; } // add Text labels for (DPoint *tmp_pt : points) { if (tmp_pt->element != QString("C")) { qDebug() << tmp_pt->element; Text *nt = new Text(r); nt->setPoint(tmp_pt); nt->setJustify(JUSTIFY_CENTER); nt->Highlight(true); nt->setText(tmp_pt->element); makesub = tmp_pt->element; ms2 = ""; for (int cc = 0; cc < makesub.length(); cc++) { if (makesub[cc].isLetter()) ms2.append(" "); if (makesub[cc].isNumber()) ms2.append("-"); if (makesub[cc] == '+') ms2.append("+"); if (makesub[cc] == '-') ms2.append("+"); } // nt->setTextMask( ms2 ); addText(nt); } } // scale points to match current fixed length double curfixed = preferences.getBond_fixedlength(); double avglen = totlen / (double)n; double sf = curfixed / avglen; qDebug() << sf; for (Drawable *tmp_draw : CDXML_Objects) { points.append(tmp_draw->Start()); points.append(tmp_draw->End()); } for (DPoint *tmp_pt : points) { tmp_pt->x *= sf; tmp_pt->y *= sf; } for (Drawable *tmp_draw : CDXML_Objects) { drawlist.append(tmp_draw); } QRect sb = selectionBox(); qDebug() << sb.left(); qDebug() << sb.right(); qDebug() << sb.top(); qDebug() << sb.bottom(); double tx = RenderTopLeft.x() + 50 - sb.left(); double ty = RenderTopLeft.y() + 50 - sb.top(); Move(tx, ty); } // Save CML format bool ChemData::save_cml(QString fn) { QList up; QList uo; QString n1, nfull; int n = 0; up = UniquePoints(); uo = UniqueObjects(); if (up.count() == 0) return false; // don't write an empty file QFile f(fn); if (!f.open(QIODevice::WriteOnly)) { return false; } QTextStream t(&f); // introductory XML stuff -- declare DTD, start molecule t << ""; t << ""; t << ""; // add miscellaneous info, a la JChemPaint t << "" << QDateTime::currentDateTime().toString() << ""; t << "" << XDC_VERSION << "" << Qt::endl; // Copy text from Text objects to element field in DPoint for (Drawable *tmp_draw : uo) { if (tmp_draw->Type() == TYPE_TEXT) { Text *tmp_text = static_cast(tmp_draw); // is this cheating? tmp_text->Start()->element = tmp_text->getText(); } } // Add XML ID's to DPoint's, write as we go t << ""; for (DPoint *tmp_pt : up) { n1.setNum(n); nfull = QString("a") + n1; tmp_pt->id = nfull; n++; t << "id << "\">"; t << ""; t << tmp_pt->element << ""; t << ""; t << tmp_pt->x; t << "" << Qt::endl << ""; t << tmp_pt->y; t << ""; // t << "0" ; t << ""; } t << ""; // add XML ID's to Bond's, write as we go n = 0; t << ""; for (Drawable *tmp_draw : uo) { if (tmp_draw->Type() == TYPE_BOND) { Bond *curr_bond = static_cast(tmp_draw); // I ask again, is this cheating? n1.setNum(n); nfull = QString("b") + n1; tmp_draw->setID(nfull); n++; t << "getID() << "\">"; t << "" << curr_bond->Start()->id << ""; t << "" << curr_bond->End()->id << ""; t << "" << curr_bond->Order() << ""; if (curr_bond->Order() == 5) { // stereo-up bonds t << "W"; } if (curr_bond->Order() == 7) { // stereo-down bonds t << "H"; } t << ""; } } t << ""; // End file... t << ""; f.close(); return true; } xdrawchem-v1.11.0/xdrawchem/chemdata_edit.cpp000066400000000000000000000064441371466245600212310ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "arrow.h" #include "bond.h" #include "bracket.h" #include "chemdata.h" #include "clipboard.h" #include "curvearrow.h" #include "defs.h" #include "drawable.h" #include "molecule.h" #include "symbol.h" #include "text.h" void ChemData::ScaleAll(double bond_length) { Molecule *tmp_mol; for (Drawable *tmp_draw : drawlist) { if (tmp_draw->Type() == TYPE_MOLECULE) { tmp_mol = (Molecule *)tmp_draw; tmp_mol->Scale(bond_length); } } } void ChemData::Cut() { Copy(); EraseSelected(); } void ChemData::Copy() { Clipboard *clipboard = getClipboard(); clipboard->clear(); for (Drawable *drawable : drawlist) { bool hl = drawable->Highlighted(); if (drawable->Type() == TYPE_MOLECULE && !hl) { for (Drawable *d : drawable->AllObjects()) { hl = d || hl; } } if (hl) { clipboard->objects.append(drawable->CloneTo()); } } } bool ChemData::Paste() { Clipboard *clipboard = getClipboard(); if (clipboard->objects.empty()) { return false; } EraseSelected(); DeselectAll(); for (int i = 0; i < clipboard->objects.size(); ++i) { drawlist.append(clipboard->objects[i]); clipboard->objects[i] = clipboard->objects[i]->CloneTo(); } return true; } void ChemData::StartUndo(int fn, DPoint *s1) { // checkpoint! save_native(""); // saves into current_undo_file // Do not save if there are no changes if (undo_index != -1 && last_states[undo_index] == current_undo_file) { current_undo_file = ""; return; } // Erase redo history if (fn != 0) { while (last_states.size() > (undo_index + 1)) { last_states.removeLast(); } } // Delete old items if it's full if (last_states.size() > 31) { last_states.removeFirst(); --undo_index; } // Add history item last_states << current_undo_file; ++undo_index; } bool ChemData::Undo() { // No more undo items if (undo_index < 0) { return false; } // Save current state for redo if it's the last item if (undo_index == last_states.size() - 1) { StartUndo(1); --undo_index; } load_native(last_states[undo_index--]); current_undo_file = ""; return true; } bool ChemData::Redo() { // No more redo items if (last_states.size() - 2 <= undo_index) return false; load_native(last_states[++undo_index + 1]); return true; } xdrawchem-v1.11.0/xdrawchem/chemdata_event.cpp000066400000000000000000000051001371466245600214110ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "arrow.h" #include "bond.h" #include "bracket.h" #include "chemdata.h" #include "curvearrow.h" #include "defs.h" #include "drawable.h" #include "gobject.h" #include "molecule.h" #include "symbol.h" #include "text.h" void ChemData::XDCEventHandler(XDC_Event *evt) { GraphicObject *go; switch (evt->type()) { case EVT_ADD_BOND: if (evt->Param2() < 0) addBond(evt->Start(), evt->End(), evt->Param1(), 1, evt->color(), evt->bool1()); else addBond(evt->Start(), evt->End(), evt->Param1(), evt->Param2(), evt->color(), evt->bool1()); break; case EVT_ADD_BOND_UP: addBond(evt->Start(), evt->End(), 1, 5, evt->color()); break; case EVT_ADD_BOND_DOWN: addBond(evt->Start(), evt->End(), 1, 7, evt->color()); break; case EVT_ADD_BOND_WAVY: addBond(evt->Start(), evt->End(), 1, 6, evt->color()); break; case EVT_ADD_BOND_DASH: addBond(evt->Start(), evt->End(), evt->Param1(), 99, evt->color()); break; case EVT_ADD_ARROW: addArrow(evt->Start(), evt->End(), evt->color(), evt->Param1(), evt->Param2()); break; case EVT_ADD_BRACKET: addBracket(evt->Start(), evt->End(), evt->color(), evt->Param1()); break; case EVT_ADD_CURVEARROW: addCurveArrow(evt->Start(), evt->End(), evt->color(), evt->text()); break; case EVT_ADD_GRAPHIC: go = new GraphicObject(r); go->setObjectType(TYPE_BEZIER); // for now! go->SetStyle(evt->Param1()); go->SetColor(evt->color()); go->setPointArray(evt->points()); addGraphicObject(go); break; default: qDebug() << "Unknown event type???"; break; } // delete the event! delete evt; } xdrawchem-v1.11.0/xdrawchem/chemdata_mdl.cpp000066400000000000000000000020071371466245600210470ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "chemdata.h" #include "defs.h" #include "dpoint.h" #include "text.h" bool ChemData::load_mdl(QString fn) { return false; } bool ChemData::ProcessMDL(QString wf) { return false; } bool ChemData::save_mdl(QString fn) { return false; } xdrawchem-v1.11.0/xdrawchem/chemdata_rw.cpp000066400000000000000000000126351371466245600207330ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include "cdxml_reader.h" #include "chemdata.h" #include "defs.h" #include "dpoint.h" #include "text.h" bool ChemData::load(QString fn) { // identify file type by first few lines QFile f(fn); if (!f.open(QIODevice::ReadOnly)) { QMessageBox::warning(0, "Couldn't open file", "Could not open the file: " + fn); return false; } // first, read first 8 bytes for CDX (binary ChemDraw) magic cookie f.flush(); char cookie[9]; f.read(cookie, 8); cookie[8] = '\0'; QString qcookie(cookie); qDebug() << "cookie:" << qcookie; // if (qcookie == "VjCD0100") { if (qcookie.left(2).toUpper() == "VJ") { QString wf = CDXToCDXML(fn); CDXML_Reader reader(this); reader.ReadFile(wf); return true; } f.reset(); // now check for text file types QString ln; ln = f.readAll(); // magic cookie check // pre-0.90 native format contains XDRAWCHEM-1.0 in first line if (ln.indexOf("XDRAWCHEM-1.0") >= 0) { f.close(); return load_legacy(fn); } // Check for XML: could be CML, CDXML, or native XDC... // look for many "<" :) if (ln.count("<") > 8) { f.close(); return load_xml(fn); } // if not XML, the last type supported is MDL Molfile - try that f.close(); return load_mdl(fn); // if all else fails... return false; } bool ChemData::save(QString fn) { // determine save file type by extension if (fn.right(3).toLower() == QString("xdc")) return save_native(fn); if (fn.right(3).toLower() == QString("cml")) return save_cml(fn); if (fn.right(3).toLower() == QString("mol")) return save_mdl(fn); if (fn.right(3).toLower() == QString("cdx")) return save_cdx(fn); if (fn.right(5).toLower() == QString("cdxml")) return save_cdxml(fn); return false; } // Load legacy XDrawChem (0.85 and prior) bool ChemData::load_legacy(QString fn) { QFile f(fn); if (!f.open(QIODevice::ReadOnly)) return false; QTextStream t(&f); QString ln, dummy, tmpline; int i1, i2, i3, i4, i5; QList points; DPoint *tp; Text *mt; do { ln = t.readLine(); // read POINTs into QPtrList points (hopefully all at beginning of file // :) if (ln.left(5) == QString("POINT")) { tp = new DPoint; QTextStream(&ln) >> dummy >> i1 >> tp->x >> tp->y >> i2 >> i3; points.append(tp); } // add LINEs if (ln.left(4) == QString("LINE")) { QTextStream(&ln) >> dummy >> i1 >> i2 >> i3 >> i4 >> i5; addBond(points.at(i1), points.at(i2), 1, i3, QColor(0, 0, 0)); } // add UPLINEs if (ln.left(6) == QString("UPLINE")) { QTextStream(&ln) >> dummy >> i1 >> i2 >> i3 >> i4 >> i5; addBond(points.at(i1), points.at(i2), 1, 5, QColor(0, 0, 0)); } // add DOWNLINEs if (ln.left(8) == QString("DOWNLINE")) { QTextStream(&ln) >> dummy >> i1 >> i2 >> i3 >> i4 >> i5; addBond(points.at(i1), points.at(i2), 1, 7, QColor(0, 0, 0)); } // add ARROWs if (ln.left(5) == QString("ARROW")) { QTextStream(&ln) >> dummy >> i1 >> i2; addArrow(points.at(i1), points.at(i2), QColor(0, 0, 0), ARROW_REGULAR, 1); } // add BRACKETs if (ln.left(7) == QString("BRACKET")) { QTextStream(&ln) >> dummy >> i1 >> i2; addBracket(points.at(i1), points.at(i2), QColor(0, 0, 0), BRACKET_SQUARE); } // add TEXT if (ln.left(4) == QString("TEXT")) { QTextStream(&ln) >> tmpline >> i1; tmpline = ln.mid(ln.indexOf('`') + 1); mt = new Text(r); mt->setPoint(points.at(i1)); mt->setJustify(JUSTIFY_TOPLEFT); mt->SetColor(QColor(0, 0, 0)); mt->setText(tmpline); tmpline.fill(' '); // mt->setTextMask( tmpline ); addText(mt); } // add LABEL if (ln.left(5) == QString("LABEL")) { QTextStream(&ln) >> tmpline >> i1; tmpline = ln.mid(ln.indexOf('`') + 1); mt = new Text(r); mt->setPoint(points.at(i1)); mt->setJustify(JUSTIFY_CENTER); mt->SetColor(QColor(0, 0, 0)); mt->setText(tmpline); tmpline.fill(' '); // mt->setTextMask( tmpline ); addText(mt); } } while (!t.atEnd()); qDebug() << "Legacy: found " << points.count() << " points."; return true; } xdrawchem-v1.11.0/xdrawchem/chemdata_rxn.cpp000066400000000000000000000145451371466245600211140ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include "bond.h" #include "chemdata.h" #include "defs.h" #include "drawable.h" #include "graphdialog.h" #include "molecule.h" #include "text.h" #include "tool_13c_nmr.h" #include "tool_1h_nmr.h" #include "boshcp.h" void ChemData::ReactionAnalysis(int flags) { QList reactantList; QList productList; Tool_1HNMR_Dialog tool1hnmr; Tool_13CNMR_Dialog tool13cnmr; Molecule *tmp_mol; Drawable *tmp_draw; foreach (tmp_draw, drawlist) { if (tmp_draw->Type() == TYPE_MOLECULE) { tmp_mol = (Molecule *)tmp_draw; if (tmp_mol->groupType() == GROUP_REACTANT) reactantList.append(tmp_mol); if (tmp_mol->groupType() == GROUP_PRODUCT) productList.append(tmp_mol); } } if ((reactantList.count() == 0) || (productList.count() == 0)) { QMessageBox::information(0, tr("Missing reactant or product"), tr("You must select at least one reactant and one product.")); return; } qDebug() << "Reaction analysis called"; if (flags == RXN_ENTHALPY_ESTIMATE) { qDebug() << "Enthalpy change"; QString summary_report = tr("Estimated gas-phase enthalpy change:\n"); double this_dh, reactant_dh = 0.0, product_dh = 0.0; int x = 1; foreach (tmp_mol, reactantList) { this_dh = tmp_mol->SumBondEnthalpy(); reactant_dh += this_dh; x++; } summary_report.append(tr("Reactants = %1 kJ/mol\n").arg(reactant_dh)); x = 1; foreach (tmp_mol, productList) { this_dh = tmp_mol->SumBondEnthalpy(); product_dh += this_dh; x++; } product_dh *= -1.0; summary_report.append(tr("Products = %1 kJ/mol\n").arg(product_dh)); this_dh = reactant_dh + product_dh; summary_report.append(tr("Reaction = %1 kJ/mol").arg(this_dh)); QMessageBox::information(0, tr("Enthalpy change"), summary_report); return; } // enthalpy if (flags == RXN_1HNMR) { // int c1, c2, c3, mul; // double shift1; QString n1, nfull, ntemp; if ((reactantList.count() > 1) || (productList.count() > 1)) { QMessageBox::warning(0, tr("1H NMR compare error"), tr("Please select only one reactant and one " "product to compare.")); return; } QStringList rlist, plist; Molecule *r1 = reactantList.first(); Molecule *p1 = productList.first(); tool1hnmr.setProductMolecule(p1); tool1hnmr.setMolecule(r1); tool1hnmr.exec(); /* rlist = r1->Calc1HNMR(false); plist = p1->Calc1HNMR(false); GraphDialog *g = new GraphDialog(r, tr("Predicted 1H-NMR")); for ( QStringList::Iterator it = rlist.begin(); it != rlist.end(); ++it ) { ntemp = *it; c1 = ntemp.indexOf(','); c2 = ntemp.indexOf(',', c1 + 1); c3 = ntemp.indexOf(',', c2 + 1); shift1 = ntemp.mid(0, c1).toDouble(); nfull = ""; n1.setNum(shift1); nfull = n1 + " ppm"; nfull = nfull + tr(" Intensity: ") + ntemp.mid(c1 + 1, c2 - c1 - 1); nfull = nfull + tr(" Multiplicity: ") + ntemp.mid(c2 + 1, c3 - c2 - 1); mul = ntemp.mid(c1 + 1, c2 - c1 - 1).toInt(); g->AddPeak(shift1, mul, QColor(255,0,0), QString("peak"), nfull); } for ( QStringList::Iterator it2 = plist.begin(); it2 != plist.end(); ++it2 ) { ntemp = *it2; c1 = ntemp.indexOf(','); c2 = ntemp.indexOf(',', c1 + 1); c3 = ntemp.indexOf(',', c2 + 1); shift1 = ntemp.mid(0, c1).toDouble(); nfull = ""; n1.setNum(shift1); nfull = n1 + " ppm"; nfull = nfull + tr(" Intensity: ") + ntemp.mid(c1 + 1, c2 - c1 - 1); nfull = nfull + tr(" Multiplicity: ") + ntemp.mid(c2 + 1, c3 - c2 - 1); mul = ntemp.mid(c1 + 1, c2 - c1 - 1).toInt(); g->AddPeak(shift1, mul, QColor(0,0,255), QString("peak"), nfull); } g->show(); */ return; } // 1H-NMR if (flags == RXN_13CNMR) { if ((reactantList.count() > 1) || (productList.count() > 1)) { QMessageBox::warning(0, tr("13C NMR compare error"), tr("Please select only one reactant and one " "product to compare.")); return; } BremserOneSphereHOSECodePredictor boshcp; QStringList rlist, plist; Molecule *r1 = reactantList.first(); Molecule *p1 = productList.first(); rlist = r1->Calc13CNMR(false); plist = p1->Calc13CNMR(false); tool13cnmr.setProductMolecule(p1); tool13cnmr.setMolecule(r1); tool13cnmr.exec(); /* GraphDialog *g = new GraphDialog(r, "Predicted 13C-NMR"); for ( QStringList::Iterator it = rlist.begin(); it != rlist.end(); ++it ) { g->AddPeak(boshcp.predict(*it), QColor(255,0,0), boshcp.getMult(*it), boshcp.predictFull(*it)); } for ( QStringList::Iterator it2 = plist.begin(); it2 != plist.end(); ++it2 ) { g->AddPeak(boshcp.predict(*it2) + 0.1, QColor(0,0,255), boshcp.getMult(*it2), boshcp.predictFull(*it2)); } g->show(); */ } // RXN_13CNMR } xdrawchem-v1.11.0/xdrawchem/chemdata_tools.cpp000066400000000000000000000511211371466245600214340ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "arrow.h" #include "bond.h" #include "bracket.h" #include "chemdata.h" #include "crings_dialog.h" #include "defs.h" #include "drawable.h" #include "gobject.h" #include "molecule.h" #include "netaccess.h" #include "text.h" #include "tool_13c_nmr.h" #include "tool_1h_nmr.h" #include "tool_2d3d.h" #include "tool_ir.h" #include "tooldialog.h" // For AutoLayout class LayoutGroup { public: QList items; LayoutGroup *left; LayoutGroup *right; LayoutGroup *above; LayoutGroup *below; bool placed; void Move(double x, double y) { qDebug() << "MOVE:" << x << " " << y; for (Drawable *tmp_draw : items) { tmp_draw->SelectAll(); tmp_draw->Move(x, y); tmp_draw->DeselectAll(); } } QRect BoundingBox() { int top = 99999, bottom = 0, left = 99999, right = 0; QRect tmprect; for (Drawable *tmp_draw : items) { tmp_draw->SelectAll(); tmprect = tmp_draw->BoundingBox(); tmp_draw->DeselectAll(); if (tmprect.isValid()) { if (tmprect.left() < left) left = tmprect.left(); if (tmprect.right() > right) right = tmprect.right(); if (tmprect.top() < top) top = tmprect.top(); if (tmprect.bottom() > bottom) bottom = tmprect.bottom(); } } return QRect(QPoint(left, top), QPoint(right, bottom)); } QPoint Center() { return BoundingBox().center(); } }; // Determine Molecule clicked, do Tool action void ChemData::Tool(DPoint *target, int mode) { // QClipboard *cb = QApplication::clipboard(); qDebug() << "ChemData::Tool: " << mode; Molecule *m = 0; NetAccess *na = new NetAccess(); CustomRingDialog cr1; ToolDialog tool1; Tool_1HNMR_Dialog *tool1hnmr; Tool_13CNMR_Dialog *tool13cnmr; Tool_IR_Dialog *toolir; Tool_2D3D tool2d3d; QString tmpname, serverName; QStringList choices; // int dret; for (Drawable *tmp_draw : drawlist) { if (tmp_draw->Type() == TYPE_MOLECULE) { m = (Molecule *)tmp_draw; if (m->BoundingBoxAll().contains(target->toQPoint(), false)) break; m = 0; } } if (m == 0) return; double kow = 0.0; QString thisInChI; switch (mode) { case MODE_TOOL_MOLECULE_INFO: mi = new MolInfoDialog(r); thisInChI = m->ToInChI(); tt_mw = m->CalcMW(); mi->setMW(tt_mw->getText()); tt_ef = m->CalcEmpiricalFormula(); mi->setEF(tt_ef->getText()); tt_ea = m->CalcElementalAnalysis(); mi->setEA(tt_ea->getText()); serverName = getenv("XDC_SERVER"); if (serverName.length() < 2) serverName = XDC_SERVER; if (na->getNameCAS(serverName, thisInChI)) { mi->setCAS(na->scas); mi->setName(na->siupacname); mi->setSynonyms(na->sname); mi->setPCC(na->spccompound); } connect(mi, SIGNAL(MIDClose()), this, SLOT(returnFromMID())); mi->show(); // if ( !mi->exec() ) return; // if (mi->isMWChecked()) drawlist.append(tt_mw); // if (mi->isEFChecked()) drawlist.append(tt_ef); // delete mi; break; case MODE_TOOL_CALCMW: tt = m->CalcMW(); if (tt != 0) drawlist.append(tt); break; case MODE_TOOL_CALCEF: tt = m->CalcEmpiricalFormula(); if (tt != 0) drawlist.append(tt); break; case MODE_TOOL_CALCEA: tt = m->CalcElementalAnalysis(); if (tt != 0) drawlist.append(tt); break; case MODE_TOOL_13CNMR: tool13cnmr = new Tool_13CNMR_Dialog; tool13cnmr->setMolecule(m); tool13cnmr->show(); // m->Calc13CNMR(); break; case MODE_TOOL_1HNMR: tool1hnmr = new Tool_1HNMR_Dialog; tool1hnmr->setMolecule(m); tool1hnmr->show(); // m->Calc1HNMR(); break; case MODE_TOOL_IR: toolir = new Tool_IR_Dialog; toolir->setMolecule(m); toolir->show(); // m->CalcIR(); break; case MODE_TOOL_PKA: m->CalcpKa(); break; case MODE_TOOL_RETRO: Retro(m); break; case MODE_TOOL_REACTIVITY_FORWARD: m->Reactivity(mode); break; case MODE_TOOL_REACTIVITY_RETRO: m->Reactivity(mode); for (Bond *tmp_bond = m->bondsFirst(); tmp_bond != 0; tmp_bond = m->bondsNext()) { if (tmp_bond->getReactions().length() > 2) { tmp_bond->SetColor(QColor(124, 252, 0)); } } r->update(); break; case MODE_TOOL_CHARGES: m->Reactivity(mode); break; case MODE_TOOL_KOW: kow = m->CalcKOW(); QMessageBox::information( r, tr("Octanol-water partition"), tr("Estimated octanol-water partition constant (log Kow) = %1").arg(kow)); break; case MODE_TOOL_2D3D: m->Make3DVersion(); break; case MODE_TOOL_NAME: m->CalcName(); break; case MODE_TOOL_CUSTOMRING: cr1.setMolecule(m); if (cr1.exec() == QDialog::Accepted) emit SignalUpdateCustomRingMenu(); break; case MODE_TOOL_TOSMILES: tmpname = m->ToSMILES(); if (tmpname.length() == 0) { qDebug() << "Could not get SMILES string!"; } QMessageBox::information(r, tr("SMILES string"), tr("SMILES string for selected molecule:") + "\n\n" + tmpname); break; case MODE_TOOL_TOINCHI: // m->AddNMRprotons(); tmpname = m->ToInChI(); // m->RemoveNMRprotons(); if (tmpname.length() == 0) { qDebug() << "Could not get InChI string!"; } QMessageBox::information(r, tr("InChI string"), tr("InChI string for selected molecule:") + "\n\n" + tmpname); break; case MODE_TOOL_CLEANUPMOL: m->CleanUp(); break; case MODE_TOOL_GROUP_REACTANT: m->setGroupType(GROUP_REACTANT); break; case MODE_TOOL_GROUP_PRODUCT: m->setGroupType(GROUP_PRODUCT); break; case MODE_TOOL_GROUP_CLEAR: m->setGroupType(GROUP_NONE); break; case MODE_TOOL_TEST: tool1.setMolecule(m); tool1.exec(); break; } // Need to pick next tool manually } void ChemData::Save3D(QString fn3d) { // save 3D image of first molecule Molecule *m = 0; for (Drawable *tmp_draw : drawlist) { if (tmp_draw->Type() == TYPE_MOLECULE) { m = (Molecule *)tmp_draw; break; } } if (m != 0) { m->Make3DVersion(fn3d); } else { qDebug() << "No molecule in input file!"; } } void ChemData::returnFromMID() { Q_CHECK_PTR(mi); Q_CHECK_PTR(tt_mw); Q_CHECK_PTR(tt_ef); Q_CHECK_PTR(tt_ea); if (mi->isMWChecked()) drawlist.append(tt_mw); if (mi->isEFChecked()) drawlist.append(tt_ef); if (mi->isEAChecked()) drawlist.append(tt_ea); mi->hide(); delete mi; } void ChemData::clearAllGroups() { Molecule *m = 0; QString tmpname; for (Drawable *tmp_draw : drawlist) { if (tmp_draw->Type() == TYPE_MOLECULE) { m = (Molecule *)tmp_draw; m->setGroupType(GROUP_NONE); } } } // calculate molecular weights of Molecules // AutoLayout void ChemData::AutoLayout() { QList layout; LayoutGroup *tmp_lo, *tl, *tr, *ta, *tb, *tl1; int dista, distb, distl, distr, d1, d2, d3, d4, ds; Text *tmp_text; Arrow *tmp_arrow; Drawable *td2; Drawable *tmp_draw; // first, put Arrows and Molecules into LayoutGroups for (Drawable *tmp_draw : drawlist) { if (tmp_draw->Type() == TYPE_ARROW) { tmp_lo = new LayoutGroup; tmp_lo->items.append(tmp_draw); tmp_lo->placed = false; tmp_lo->left = 0; tmp_lo->right = 0; tmp_lo->above = 0; tmp_lo->below = 0; layout.append(tmp_lo); } if (tmp_draw->Type() == TYPE_MOLECULE) { tmp_lo = new LayoutGroup; tmp_lo->items.append(tmp_draw); tmp_lo->placed = false; tmp_lo->left = 0; tmp_lo->right = 0; tmp_lo->above = 0; tmp_lo->below = 0; layout.append(tmp_lo); } } // now, attach Text to Arrows as needed for (LayoutGroup *tmp_lo : layout) { td2 = tmp_lo->items.first(); if (td2->Type() == TYPE_ARROW) { tmp_arrow = (Arrow *)td2; foreach (tmp_draw, drawlist) { if (tmp_draw->Type() == TYPE_TEXT) { tmp_text = (Text *)tmp_draw; int ns; QPoint amid = tmp_arrow->Midpoint(); QPoint tcenter = tmp_text->NearestCenter(amid, tmp_arrow->Orientation(), ns); int dx = tcenter.x() - amid.x(); int dy = tcenter.y() - amid.y(); double dist = sqrt((double)(dx * dx + dy * dy)); qDebug() << dist; if (dist < 25) { if (tmp_arrow->Orientation() == ARROW_HORIZONTAL) { if (dy < 0) { // above arrow dy = dy + 12; tmp_text->ForceMove(-dx, -dy); } else { // below arrow dy = dy - 12; tmp_text->ForceMove(-dx, -dy); } } else { // ARROW_VERTICAL if (dx < 0) { // above arrow dx = dx + 12; tmp_text->ForceMove(-dx, -dy); } else { // below arrow dx = dx - 12; tmp_text->ForceMove(-dx, -dy); } } tmp_lo->items.append(tmp_text); // add Text to LayoutGroup } // if (dist...) } // if (...TYPE_TEXT) } // for (...) } // if (...TYPE_ARROW) } // for(...) // Now determine position of LayoutGroups for (LayoutGroup *tmp_lo : layout) { QRect box = tmp_lo->BoundingBox(); QPoint l1(box.left(), box.center().y()); QPoint r1(box.right(), box.center().y()); QPoint a1(box.top(), box.center().x()); QPoint b1(box.bottom(), box.center().x()); // check sides dista = 9999; distb = 9999; distl = 9999; distr = 9999; ds = 9999; tl = 0; tr = 0; ta = 0; tb = 0; foreach (tl1, layout) { QRect box1 = tl1->BoundingBox(); QPoint l2(box1.left(), box1.center().y()); QPoint r2(box1.right(), box1.center().y()); QPoint a2(box1.top(), box1.center().x()); QPoint b2(box1.bottom(), box1.center().x()); d1 = (int)(r->DistanceBetween(l1, r2)); d2 = (int)(r->DistanceBetween(r1, l2)); d3 = (int)(r->DistanceBetween(a1, b2)); d4 = (int)(r->DistanceBetween(b1, a2)); if (d1 < ds) ds = d1; if (d2 < ds) ds = d2; if (d3 < ds) ds = d3; if (d4 < ds) ds = d4; if (d1 == ds) tl = tl1; if (d2 == ds) tr = tl1; if (d3 == ds) ta = tl1; if (d4 == ds) tb = tl1; } if (tl != 0) { qDebug() << "left"; tl->right = tmp_lo; tmp_lo->left = tl; } if (tr != 0) { qDebug() << "right"; tr->left = tmp_lo; tmp_lo->right = tr; } if (ta != 0) { qDebug() << "above"; ta->below = tmp_lo; tmp_lo->above = ta; } if (tb != 0) { qDebug() << "below"; tb->above = tmp_lo; tmp_lo->below = tb; } qDebug(); } // Place everything // Start with things near arrows for (LayoutGroup *tmp_lo : layout) { if (tmp_lo->items.first()->Type() == TYPE_ARROW) { tmp_lo->placed = true; tmp_arrow = (Arrow *)(tmp_lo->items.first()); if (tmp_arrow->Orientation() == ARROW_HORIZONTAL) { // adjust position according to already placed Molecule or Arrow if (tmp_lo->left != 0) { if (tmp_lo->left->placed == true) { int dy = tmp_lo->Center().y() - tmp_lo->left->Center().y(); tmp_lo->Move(0, -dy); } } if (tmp_lo->right != 0) { if (tmp_lo->right->placed == true) { int dy = tmp_lo->Center().y() - tmp_lo->right->Center().y(); tmp_lo->Move(0, -dy); } } if (tmp_lo->left != 0) { if (tmp_lo->left->placed == false) { int dy = tmp_lo->left->Center().y() - tmp_lo->Center().y(); tmp_lo->left->Move(0, -dy); tmp_lo->left->placed = true; } } if (tmp_lo->right != 0) { if (tmp_lo->right->placed == false) { int dy = tmp_lo->right->Center().y() - tmp_lo->Center().y(); tmp_lo->right->Move(0, -dy); tmp_lo->right->placed = true; } } } else { // ARROW_VERTICAL // adjust position according to already placed Molecule or Arrow if (tmp_lo->above != 0) { if (tmp_lo->above->placed == true) { int dx = tmp_lo->Center().y() - tmp_lo->above->Center().y(); tmp_lo->Move(-dx, 0); } } if (tmp_lo->below != 0) { if (tmp_lo->below->placed == true) { int dx = tmp_lo->Center().x() - tmp_lo->below->Center().x(); tmp_lo->Move(-dx, 0); } } if (tmp_lo->above != 0) { if (tmp_lo->above->placed == false) { int dx = tmp_lo->above->Center().x() - tmp_lo->Center().x(); tmp_lo->above->Move(-dx, 0); tmp_lo->above->placed = true; } } if (tmp_lo->below != 0) { if (tmp_lo->below->placed == false) { int dx = tmp_lo->below->Center().x() - tmp_lo->Center().x(); tmp_lo->below->Move(-dx, 0); tmp_lo->below->placed = true; } } } // if (tmp_arrow...) } // if (...TYPE_ARROW) } // for (...) } void ChemData::fromSMILES(QString sm) { Molecule *m1 = new Molecule(r); m1->FromSMILES(sm); m1->SelectAll(); drawlist.append(m1); } void ChemData::SmartPlace(QString sf, DPoint *t1) { if (sf.contains("cyclopentadiene") > 0) sf.replace(QRegExp("diene"), "diene-sp"); double ang1 = -CalculateRingAttachAngle(t1) + 1.5708; load(sf); Drawable *tmp_draw = drawlist.last(); Molecule *m1 = (Molecule *)tmp_draw; if (fabs(ang1) < 0.1) { ang1 = 3.14159; } else { if (fabs(ang1) > 3.13) { ang1 = 0.0; } } qDebug() << "angle = " << (ang1 * 180.0 / 3.14159) << " degrees!"; DPoint *tmp_pt = m1->GetRingAttachPoint(); m1->Rotate(ang1); double dx, dy; dx = t1->x - tmp_pt->x; dy = t1->y - tmp_pt->y; m1->Move(dx, dy); QList nb = m1->BreakRingBonds(tmp_pt); foreach (tmp_pt, nb) { addBond(tmp_pt, t1, 1, tmp_pt->new_order, QColor(0, 0, 0), true); qDebug() << "added a bond"; } } void ChemData::SmartPlaceToo(QString sf, DPoint *t1) { double ang1 = -CalculateRingAttachAngle(t1) + 3.14159; load(sf); Drawable *tmp_draw = drawlist.last(); Molecule *m1 = (Molecule *)tmp_draw; qDebug() << "angle = " << (ang1 * 180.0 / 3.14159) << " degrees!"; // tmp_pt = m1->GetRingAttachPoint(); DPoint *tmp_pt = m1->GetAttachPoint(sf); m1->Rotate(ang1); double dx, dy; dx = t1->x - tmp_pt->x; dy = t1->y - tmp_pt->y; m1->Move(dx, dy); QList nb = m1->BreakRingBonds(tmp_pt); for (DPoint *tmp_pt : nb) { addBond(tmp_pt, t1, 1, tmp_pt->new_order, QColor(0, 0, 0), true); qDebug() << "added a bond"; } // need to put back N if EDANS if (sf.contains("edans") > 0) { t1->element = "NH"; Text *nt = new Text(r); nt->setPoint(t1); nt->setJustify(JUSTIFY_CENTER); nt->setText("NH"); // nt->setTextMask( " " ); addText(nt); } } void ChemData::SmartPlaceThree(QString sf, DPoint *t1) { double ang1 = -CalculateRingAttachAngle(t1); load(sf); Drawable *tmp_draw = drawlist.last(); Molecule *m1 = (Molecule *)tmp_draw; qDebug() << "angle = " << (ang1 * 180.0 / 3.14159) << " degrees!"; // tmp_pt = m1->GetRingAttachPoint(); DPoint *tmp_pt = m1->GetAttachPoint(sf); m1->Rotate(ang1); double dx, dy; dx = t1->x - tmp_pt->x; dy = t1->y - tmp_pt->y; m1->Move(dx, dy); QList nb = m1->BreakRingBonds(tmp_pt); for (DPoint *tmp_pt : nb) { addBond(tmp_pt, t1, 1, tmp_pt->new_order, QColor(0, 0, 0), true); qDebug() << "added a bond"; } // need to put back N t1->element = "NH"; Text *nt = new Text(r); nt->setPoint(t1); nt->setJustify(JUSTIFY_CENTER); nt->setText("NH"); // nt->setTextMask( " " ); addText(nt); } double ChemData::CalculateRingAttachAngle(DPoint *t1) { double a1; Molecule *m = 0; for (Drawable *tmp_draw : drawlist) { if ((tmp_draw->Type() == TYPE_MOLECULE) && (tmp_draw->Find(t1) == true)) { m = (Molecule *)tmp_draw; break; } } if (m == 0) return 0.0; a1 = m->CalculateRingAttachAngle(t1); return a1; } // Implemented using Crossing Number Algorithm bool ChemData::SelectWithinLoop(QVector curr_lasso) { int count; bool retval = false; // Were any selectable Drawables found? QList obj_list = UniqueObjects(); for (Drawable *tmp_draw : obj_list) { count = 0; QPointF center; // Get center of object if (tmp_draw->End()) { center = r->Midpoint(tmp_draw->Start()->toQPoint(), tmp_draw->End()->toQPoint()); } else { center = tmp_draw->Start()->toQPoint(); } // Count number of times lasso passes through left of center for (int i = 0; i < curr_lasso.size() - 1; ++i) { count += ((curr_lasso.at(i).y() < center.y()) ^ (curr_lasso.at(i + 1).y() < center.y())) & (curr_lasso.at(i).x() < center.x()); } // Odd count -> Drawable is inside if (count & 1) { retval = true; tmp_draw->Highlight(true); } } return retval; } xdrawchem-v1.11.0/xdrawchem/chemdata_xdc.cpp000066400000000000000000000201731371466245600210550ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "arrow.h" #include "bond.h" #include "bracket.h" #include "chemdata.h" #include "cml.h" #include "curvearrow.h" #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "gobject.h" #include "molecule.h" #include "text.h" // handle new native format bool ChemData::load_native(QString wholefile) { QString line; QString tmpline, tfont, tdata, a1, v1; QString thistag, nexttag; int d1, d2, d3, ptr = 0; int psize = PAGE_LETTER, porient = PAGE_PORTRAIT; // strip and tags. d1 = wholefile.indexOf("", d1); wholefile.remove(d1, d2 - d1 + 1); d3 = wholefile.indexOf(""); wholefile.remove(d3, 999); // find page size/orientation tags (these are optional) d1 = wholefile.indexOf(""); if (d1 >= 0) { d2 = wholefile.indexOf(""); line = wholefile.mid(d1 + 10, d2 - d1 - 10); // qInfo() << "PAGESIZE:" << line; if (line == "PAGE_LETTER") psize = PAGE_LETTER; if (line == "PAGE_LEGAL") psize = PAGE_LEGAL; if (line == "PAGE_A4") psize = PAGE_A4; if (line == "PAGE_640") psize = PAGE_640; if (line == "PAGE_800") psize = PAGE_800; if (line == "PAGE_1024") psize = PAGE_1024; wholefile.remove(d1, d2 - d1 + 11); } d1 = wholefile.indexOf(""); if (d1 >= 0) { d2 = wholefile.indexOf(""); line = wholefile.mid(d1 + 12, d2 - d1 - 12); // qInfo() << "PAGEORIENT:" << line; // porient defaults to PAGE_PORTRAIT if (line == "PAGE_LANDSCAPE") porient = PAGE_LANDSCAPE; wholefile.remove(d1, d2 - d1 + 13); } r->setPageSizeAndOrientation(); // read and set color d1 = wholefile.indexOf(""); if (d1 >= 0) { d2 = wholefile.indexOf(""); line = wholefile.mid(d1 + 9, d2 - d1 - 9); QTextStream is(&line, QIODevice::ReadOnly); int rn, gn, bn; is >> rn >> gn >> bn; QColor bc1(rn, gn, bn); r->setBGColor(bc1); wholefile = wholefile.remove(d1, d2 - d1 + 10); } // qInfo() << "wholefile:" << wholefile; do { thistag = ReadTag(wholefile, ptr); // qInfo() << "thistag:" << thistag; // ReadTag returns a null at EOF (ideally). Or, empty string in Qt5... if (thistag.isEmpty()) break; // check what object type this is if (thistag.contains(""); thistag = wholefile.mid(d1, d2 - d1 + 8); Arrow *a1 = new Arrow(r); a1->FromXML(thistag); drawlist.append(a1); wholefile.remove(d1, d2 - d1 + 8); ptr = 0; continue; } if (thistag.contains(""); thistag = wholefile.mid(d1, d2 - d1 + 16); GraphicObject *a1 = new GraphicObject(r); a1->FromXML(thistag); drawlist.append(a1); wholefile.remove(d1, d2 - d1 + 13); ptr = 0; continue; } if (thistag.contains(""); thistag = wholefile.mid(d1, d2 - d1 + 13); CurveArrow *a1 = new CurveArrow(r); a1->FromXML(thistag); drawlist.append(a1); wholefile.remove(d1, d2 - d1 + 13); ptr = 0; continue; } if (thistag.contains(""); thistag = wholefile.mid(d1, d2 - d1 + 7); Text *a1 = new Text(r); a1->FromXML(thistag); drawlist.append(a1); wholefile.remove(d1, d2 - d1 + 7); ptr = 0; continue; } if (thistag.contains(""); thistag = wholefile.mid(d1, d2 - d1 + 10); Bracket *a1 = new Bracket(r); a1->FromXML(thistag); drawlist.append(a1); wholefile.remove(d1, d2 - d1 + 10); ptr = 0; continue; } if (thistag.contains(""); thistag = wholefile.mid(d1, d2 - d1 + 9); Symbol *a1 = new Symbol(r); a1->FromXML(thistag); drawlist.append(a1); wholefile.remove(d1, d2 - d1 + 9); ptr = 0; continue; } if (thistag.contains(""); thistag = wholefile.mid(d1, d2 - d1 + 11); Molecule *a1 = new Molecule(r); a1->SetChemdata(this); a1->FromXML(thistag); drawlist.append(a1); wholefile.remove(d1, d2 - d1 + 11); ptr = 0; continue; } // qInfo() << "reached end, ptr = " << ptr; } while (ptr < wholefile.length()); return false; } bool ChemData::save_native(QString fn) { int n = 0; QString n1, nfull, fulltext; int ps = preferences.getPageSize(), po = preferences.getPageOrientation(); Drawable *tmp_draw; QTextStream t(&fulltext, QIODevice::WriteOnly); if (fn.length() > 0) { t << ""; t << ""; } else { current_undo_file = ""; } t << ""; // write page size and orientation t << ""; switch (ps) { case PAGE_LETTER: t << "PAGE_LETTER"; break; case PAGE_LEGAL: t << "PAGE_LEGAL"; break; case PAGE_A4: t << "PAGE_A4"; break; case PAGE_640: t << "PAGE_640"; break; case PAGE_800: t << "PAGE_800"; break; case PAGE_1024: t << "PAGE_1024"; break; default: t << "PAGE_LETTER"; break; } t << ""; if (po == PAGE_PORTRAIT) t << "PAGE_PORTRAIT"; else t << "PAGE_LANDSCAPE"; // write background color t << ""; QColor bc1 = r->getBGColor(); t << bc1.red() << " "; t << bc1.green() << " "; t << bc1.blue() << ""; foreach (tmp_draw, drawlist) { n1.setNum(n); nfull = QString("obj") + n1; t << tmp_draw->ToXML(nfull); n++; } t << ""; if (fn.length() > 0) { QFile f(fn); if (!f.open(QIODevice::WriteOnly)) { return false; } QTextStream t1(&f); t1 << fulltext; f.close(); } else { current_undo_file = fulltext; } return true; } xdrawchem-v1.11.0/xdrawchem/chemdata_xml.cpp000066400000000000000000000206111371466245600210740ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "cdxml_reader.h" #include "chemdata.h" #include "defs.h" #include "dpoint.h" #include "text.h" bool ChemData::load_xml(QString fn) { QFile f(fn); if (!f.open(QIODevice::ReadOnly)) { return false; } // Read entire file to string QString wholefile = f.readAll(); // We're done with the file. Close it f.close(); // try and guess whether (new) CML file bool cmlfile = false; if (wholefile.toUpper().contains(" 0) cmlfile = true; if (wholefile.toUpper().contains(" 0) cmlfile = false; if (wholefile.toUpper().contains(" 0) cmlfile = false; if (wholefile.toUpper().contains("ATOMREFS=") > 0) cmlfile = false; if (wholefile.toUpper().contains(" 0) cmlfile = false; if (cmlfile == true) { bool r1 = NewLoadCMLFile(fn); return r1; } // trasfer control to process_xml() return ProcessXML(wholefile); } // if you have already read in a file (e.g., from network), call this bool ChemData::ProcessXML(QString wholefile) { QString line; QString doctype, thistag, nexttag, cml_doctype, cdxml_doctype, xdc_doctype; QStringList tokens, refs; int d1, d2, d3, ptr = 0, cml_type = 0; // double l1, l2, l3, l4; // clear all lists CML_Atoms.clear(); CML_Atoms_Sub.clear(); CML_Bonds.clear(); CML_Bonds_Sub.clear(); CDXML_Objects.clear(); // kludge! cml_doctype = QString("idgniosdnvi"); cdxml_doctype = QString("idgniosdnvi"); xdc_doctype = QString("idgniosdnvi"); do { thistag = ReadTag(wholefile, ptr); // ReadTag returns a null at EOF (ideally). if (thistag.isNull()) break; // check for 'special' tags... // continue past tag if (thistag.indexOf(QString("?xml")) >= 0) continue; // but we really want the tag if (thistag.indexOf(QString("!DOCTYPE")) >= 0) { // read the actual document type d1 = thistag.indexOf(QString("!DOCTYPE")); d2 = thistag.indexOf(QString(" "), d1); d3 = thistag.indexOf(QString(" "), d2 + 1); doctype = thistag.mid(d2 + 1, d3 - d2 - 1); if (thistag.toUpper().indexOf("CML.DTD") >= 0) cml_type = 1; if (thistag.toUpper().indexOf("CML-1999-05-15") >= 0) cml_type = 1; if (thistag.toUpper().indexOf("CDXML.DTD") >= 0) cml_type = 2; if (thistag.toUpper().indexOf("XDRAWCHEM-1") >= 0) cml_type = 3; if (cml_type == 1) cml_doctype = doctype; if (cml_type == 2) cdxml_doctype = doctype; if (cml_type == 3) xdc_doctype = doctype; if (cml_type == 0) { return false; } continue; } // Extract CML documents, pass to LoadCMLFile if (thistag.indexOf(QString("<") + cml_doctype) >= 0) { d1 = ptr - thistag.length(); d2 = wholefile.indexOf(QString(""), ptr) + 3 + cml_doctype.length(); LoadCMLFile(wholefile.mid(d1, d2 - d1), cml_doctype); wholefile.remove(d1, d2 - d1); } // Extract CDXML documents, pass to LoadCDXMLFile if (thistag.indexOf(QString("<") + cdxml_doctype) >= 0) { // test functionality CDXML_Reader reader(this); reader.ReadFile(wholefile); // end test d1 = ptr - thistag.length(); d2 = wholefile.indexOf(QString(""), ptr) + 3 + cml_doctype.length(); // LoadCDXMLFile(wholefile.mid(d1, d2 - d1), cdxml_doctype); wholefile.remove(d1, d2 - d1); } // Extract native (XDC) documents, pass to load_native() // note that native documents expect ... // and that this pair should contain all elements in the document if (thistag.indexOf(QString("<") + xdc_doctype) >= 0) { d1 = ptr - thistag.length(); d2 = wholefile.indexOf(QString(""), ptr) + 3 + cml_doctype.length(); load_native(wholefile.mid(d1, d2 - d1)); wholefile.remove(d1, d2 - d1); } } while (ptr < wholefile.length()); r->update(); return true; } // ***************************** // General XML parsing functions // ***************************** // function to see if tag is 'self-contained', i.e.: // data returns false // returns true // (returns true if tag ends in "/>" bool ChemData::SelfContainedTag(QString tag) { if (tag.right(2) == "/>") return true; else return false; } // function to extract tags from stream QString ChemData::ReadTag(QString f, int &ptr) { int t1 = f.indexOf("<", ptr); ptr = t1; int t2 = f.indexOf(">", ptr); ptr = t2 + 1; return f.mid(t1, ptr - t1).toLatin1(); } // function to extract data between tags QString ChemData::ReadData(QString f, int &ptr) { int t1 = f.indexOf("<", ptr); return f.mid(ptr, t1 - ptr); } // function to extract attributes from tag // Return format: list item 0=first attribute, 1=value of first attribute, // 2=second attribute, 3=value of second attribute, you get it, right? QStringList ChemData::ReadAttr(QString tag) { QStringList l1; QString attr; QString a1, v1; int t1, eq1, te; // where to start tokenizing int ptr = tag.indexOf(QString(" ")); // where to end tokenizing int eol = tag.indexOf(QString(">")); do { while (tag[ptr].isSpace()) { ptr++; } t1 = tag.indexOf(QString("\""), ptr); te = tag.indexOf(QString("\""), t1 + 1); attr = tag.mid(ptr, te - ptr + 1); ptr = te + 1; eq1 = attr.indexOf(QString("=")); a1 = attr.left(eq1); v1 = attr.right(attr.length() - eq1 - 1); v1 = v1.mid(1, v1.length() - 2); if (a1.indexOf(QString(">")) >= 0) break; // end of tags // qDebug() << "[" << a1 << "=" << v1 << "]" ; l1.append(a1); l1.append(v1); } while (ptr < eol); return l1; } // function to tokenize QStringList ChemData::Tokenize(QString tag) { QStringList l1; QString a1, tag1; int t1; // strip leading and trailing white space tag1 = tag.simplified(); // where to start tokenizing int ptr = 0; // where to end tokenizing int eol = tag1.lastIndexOf(QString(" ")); do { t1 = tag1.indexOf(QString(" "), ptr); a1 = tag1.mid(ptr, t1 - ptr); ptr = t1 + 1; l1.append(a1); qDebug() << "[" << a1 << "]"; } while (ptr < eol); a1 = tag1.mid(ptr); l1.append(a1); return l1; } // ParseBoundingBox(): parse CDXML BoundingBox element. void ChemData::ParseBoundingBox(QString BBox, double &x1, double &y1, double &x2, double &y2) { int s1 = BBox.indexOf(QString(" "), 0); int s2 = BBox.indexOf(QString(" "), s1 + 1); int s3 = BBox.indexOf(QString(" "), s2 + 1); // qDebug() << BBox.mid(0, s1) << "|"; // qDebug() << BBox.mid(s1 + 1, s2 - s1) << "|"; // qDebug() << BBox.mid(s2 + 1, s3 - s2) << "|"; // qDebug() << BBox.mid(s3 + 1) << "|" ; x1 = BBox.mid(0, s1).toDouble(); y1 = BBox.mid(s1 + 1, s2 - s1).toDouble(); x2 = BBox.mid(s2 + 1, s3 - s2).toDouble(); y2 = BBox.mid(s3 + 1).toDouble(); } // ********************* // end parsing functions // ********************* xdrawchem-v1.11.0/xdrawchem/clipboard.h000066400000000000000000000021671371466245600200600ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef CLIPBOARD_H #define CLIPBOARD_H #include #include "drawable.h" class Clipboard { public: Clipboard() {} QList objects; void clear() { for (Drawable *ob : objects) { delete ob; } objects.clear(); } // Keep track of how many other owners int owners = 0; }; #endif xdrawchem-v1.11.0/xdrawchem/cml.h000066400000000000000000000031041371466245600166640ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef CML_H #define CML_H #include "defs.h" #include "dpoint.h" // temporary data structures to hold data in CML formats class CML_Atom { public: CML_Atom() { x = 987654321.0; y = 123456789.0; element = QString("C"); atom = true; } QString id; QString element; int formalCharge; double x, y, z; bool atom; DPoint *toDPoint() { DPoint *d = new DPoint; d->x = x; d->y = y; d->id = id; d->element = element; return d; } }; class CML_Bond { public: CML_Bond() { order = 1; type = TYPE_BOND; } QString id; QString a1; QString a2; int type; // for non-line types int order; }; class CDXML_Node { public: QString pos; QString text; }; #endif xdrawchem-v1.11.0/xdrawchem/colorbutton.cpp000066400000000000000000000055171371466245600210300ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2006 Gerd Fleischer // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include "colorbutton.h" ColorButton::ColorButton(QColor color, QWidget *parent) : QPushButton(parent) { btnColor = color; setColor(btnColor); } void ColorButton::paintEvent(QPaintEvent *) { QPainter painter(this); // First, we need to draw the bevel. QStyleOptionButton butOpt; initStyleOption(&butOpt); style()->drawControl(QStyle::CE_PushButtonBevel, &butOpt, &painter, this); // OK, now we can muck around with drawing out pretty little color box // First, sort out where it goes QRect labelRect = style()->subElementRect(QStyle::SE_PushButtonContents, &butOpt, this); int shift = style()->pixelMetric(QStyle::PM_ButtonMargin); labelRect.adjust(shift, shift, -shift, -shift); int x, y, w, h; labelRect.getRect(&x, &y, &w, &h); if (isChecked() || isDown()) { x += style()->pixelMetric(QStyle::PM_ButtonShiftHorizontal); y += style()->pixelMetric(QStyle::PM_ButtonShiftVertical); } QColor fillCol = isEnabled() ? btnColor : palette().color(backgroundRole()); qDrawShadePanel(&painter, x, y, w, h, palette(), true, 1, NULL); if (fillCol.isValid()) painter.fillRect(x + 1, y + 1, w - 2, h - 2, fillCol); if (hasFocus()) { QRect focusRect = style()->subElementRect(QStyle::SE_PushButtonFocusRect, &butOpt, this); QStyleOptionFocusRect focusOpt; focusOpt.init(this); focusOpt.rect = focusRect; focusOpt.backgroundColor = palette().window().color(); style()->drawPrimitive(QStyle::PE_FrameFocusRect, &focusOpt, &painter, this); } } void ColorButton::initStyleOption(QStyleOptionButton *opt) const { opt->init(this); opt->text.clear(); opt->icon = QIcon(); opt->features = QStyleOptionButton::None; } void ColorButton::setColor(QColor color) { btnColor = color; QPixmap colorIcon = QPixmap(width(), height()); colorIcon.fill(btnColor); setIcon(QIcon(colorIcon)); } xdrawchem-v1.11.0/xdrawchem/colorbutton.h000066400000000000000000000023141371466245600204650ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2006 Gerd Fleischer // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef COLOR_BUTTON_H #define COLOR_BUTTON_H #include class QColor; class QPixmap; class QStyleOptionButton; class ColorButton : public QPushButton { Q_OBJECT public: ColorButton(QColor color = Qt::black, QWidget *parent = 0); // default destructor void setColor(QColor color); private: void paintEvent(QPaintEvent *); void initStyleOption(QStyleOptionButton *opt) const; QColor btnColor; }; #endif xdrawchem-v1.11.0/xdrawchem/crings_dialog.cpp000066400000000000000000000077341371466245600212650ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2002 Adam Tenderholt // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // Dialog for Custom Rings #include #include #include #include "crings_dialog.h" #include "defs.h" #include "prefs.h" extern Preferences preferences; CustomRingWidget::CustomRingWidget(QWidget *parent) : QWidget(parent) { QGridLayout *layout = new QGridLayout(); setLayout(layout); layout->setMargin(0); setMinimumSize(350, 50); render = new Render2D(); data = new ChemData(this); render->setChemData(data); data->setRender2D(render); label = new QLabel(tr("Title: ")); layout->addWidget(label, 1, 0, 1, 1); title = new QLineEdit(); layout->addWidget(title, 1, 1, 1, 1); connect(title, SIGNAL(textChanged(const QString &)), this, SIGNAL(signalTextChanged(const QString &))); // render->setMode_SelectNone(); } CustomRingWidget::~CustomRingWidget() { if (render) delete render; if (data) delete data; if (title) delete title; if (label) delete label; } void CustomRingWidget::slotTitle(QString &string) { data->save(string); qDebug() << "saved: " << string << Qt::endl << "done with crwidget"; string.truncate(string.length() - 4); string.append(".png"); if (pixmap.save(string, "PNG")) qDebug() << "png: " << string; } void CustomRingWidget::setMolecule(Molecule *m) { data->addMolecule(m); Render2D *real_render = m->getRender2D(); QPixmap mol; QRect rr1 = m->BoundingBoxAll(); real_render->setMode_Select(); real_render->DeselectAll(); pixmap = real_render->grab(rr1); } CustomRingDialog::CustomRingDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Add custom ring to menu list")); QGridLayout *mygrid = new QGridLayout(this); m_widget = new CustomRingWidget(this); mygrid->addWidget(m_widget, 0, 0, 1, 3); connect(m_widget, SIGNAL(signalTextChanged(const QString &)), this, SLOT(slotTextChanged(const QString &))); connect(this, SIGNAL(signalTitle(QString &)), m_widget, SLOT(slotTitle(QString &))); // disableResize(); // enableButtonOK(false); QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); mygrid->addItem(spacer, 2, 0); QPushButton *ok, *dismiss; ok = new QPushButton(tr("OK"), this); connect(ok, SIGNAL(clicked()), SLOT(slotOk())); mygrid->addWidget(ok, 2, 1); dismiss = new QPushButton(tr("Cancel"), this); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); mygrid->addWidget(dismiss, 2, 2); } CustomRingDialog::~CustomRingDialog() { if (m_widget) delete m_widget; } void CustomRingDialog::slotTextChanged(const QString &string) { // if(string.isEmpty()) // enableButtonOK(false); // else //if string!=QString::null // enableButtonOK(true); } void CustomRingDialog::slotOk() { QString title = m_widget->getTitle(); qDebug() << title; QString filename = title.toLower(); filename.append(".cml"); QString file = preferences.getCustomRingDir(); file += filename; emit signalTitle(file); accept(); } // cmake#include "crings_dialog.moc" xdrawchem-v1.11.0/xdrawchem/crings_dialog.h000066400000000000000000000036201371466245600207200ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2002 Adam Tenderholt // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // Dialog for Custom Rings #ifndef _CRINGS_DIALOG_H #define _CRINGS_DIALOG_H #include #include #include #include #include #include "chemdata.h" #include "molecule.h" #include "render2d.h" class CustomRingWidget : public QWidget { Q_OBJECT public: CustomRingWidget(QWidget *parent = 0); ~CustomRingWidget(); QString getTitle() { return title->text(); } void setMolecule(Molecule *m); public slots: void slotTitle(QString &string); signals: void signalTextChanged(const QString &); private: Render2D *render; ChemData *data; QLineEdit *title; QLabel *label; QPixmap pixmap; }; class CustomRingDialog : public QDialog { Q_OBJECT public: CustomRingDialog(QWidget *parent = 0); ~CustomRingDialog(); void setMolecule(Molecule *m) { m_widget->setMolecule(m); } public slots: void slotOk(); void slotTextChanged(const QString &string); signals: void signalTitle(QString &); private: CustomRingWidget *m_widget; }; #endif xdrawchem-v1.11.0/xdrawchem/cubicbezier.h000066400000000000000000000104711371466245600204040ustar00rootroot00000000000000/* XPM */ static const char *cbezier_xpm[] = {"40 22 3 1", " c None", ". c None", "+ c #000000", "........................................", "......+++........++++........+++........", "......+++.....++++...+++.....+++........", "......+++...++..........++...+++........", "...........+..............++............", ".........++.................+...........", "........+....................+..........", ".......+......................+.........", ".......+.......................+........", "......+.........................+.......", ".....+..........................+.......", ".....+...........................+......", "....+............................++.....", "....+.............................+.....", "...+..............................+.....", "...+...............................+....", "..+................................+....", "..+.................................+...", ".+++...............................+++..", ".+++...............................+++..", ".+++...............................+++..", "........................................"}; /* XPM */ static const char *cbezierhalf_xpm[] = { "42 22 3 1", " c None", ". c None", "+ c #000000", "..........................................", "......+++........++++........+++..........", "......+++.....++++...+++.....+++..........", "......+++...++..........++...+++..........", "...........+..............++..............", ".........++.................+.............", "........+....................+............", ".......+......................+...........", ".......+.......................+..........", "......+.........................+.........", ".....+..........................+.........", ".....+...........................+........", "....+............................++.......", "....+.............................+.......", "...+..............................+.......", "...+...............................+......", "..+................................+....+.", "..+.................................+..+..", ".+++................................+.+...", ".+++................................++....", ".+++................................+.....", ".........................................."}; /* XPM */ static const char *cbezierfull_xpm[] = { "42 22 3 1", " c None", ". c None", "+ c #000000", "..........................................", "......+++........++++........+++..........", "......+++.....++++...+++.....+++..........", "......+++...++..........++...+++..........", "...........+..............++..............", ".........++.................+.............", "........+....................+............", ".......+......................+...........", ".......+.......................+..........", "......+.........................+.........", ".....+..........................+.........", ".....+...........................+........", "....+............................++.......", "....+.............................+.......", "...+..............................+.......", "...+...............................+......", "..+.............................+...+...+.", "..+..............................+..+..+..", ".+++..............................+.+.+...", ".+++...............................+++....", ".+++................................+.....", ".........................................."}; xdrawchem-v1.11.0/xdrawchem/curvearrow.cpp000066400000000000000000000145621371466245600206550ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // curvearrow.cpp - Curvearrow's implementation of functions #include "curvearrow.h" #include "bondedit.h" #include "defs.h" #include "drawable.h" #include "render2d.h" CurveArrow::CurveArrow(Render2D *r1, QObject *parent) : Drawable(parent) { r = r1; highlighted = false; } CurveArrow *CurveArrow::CloneTo(Drawable *target) const { if (!target) target = new CurveArrow(r, parent()); CurveArrow *t = static_cast(this->Drawable::CloneTo(target)); return t; } QString CurveArrow::ToXML(QString xml_id) { QString s, n1; // begin curvearrow s.append("\n"); // write Start s.append(""); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\n"); // write End s.append(""); n1.setNum(end->x); s.append(n1); s.append(" "); n1.setNum(end->y); s.append(n1); s.append("\n"); // write type s.append(""); s.append(which); s.append("\n"); // write color s.append(""); n1.setNum(color.red()); s.append(n1); s.append(" "); n1.setNum(color.green()); s.append(n1); s.append(" "); n1.setNum(color.blue()); s.append(n1); s.append("\n"); // end curvearrow s.append("\n"); return s; } // set CurveArrow from XDrawChem-format XML void CurveArrow::FromXML(QString xml_tag) { int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 8; SetStartFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 6; SetEndFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf("") + 11; i2 = xml_tag.indexOf(""); which = xml_tag.mid(i1, i2 - i1); qDebug() << which; i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 8; SetColorFromXML(xml_tag.mid(i1, i2 - i1)); } } void CurveArrow::Render() { QColor c1; if (highlighted) c1 = QColor(255, 0, 0); else c1 = color; r->drawCurveArrow(start->toQPoint(), end->toQPoint(), c1, which); } void CurveArrow::Edit() { int lsty; if (which == "CW90") lsty = CA_CW90; if (which == "CW180") lsty = CA_CW180; if (which == "CW270") lsty = CA_CW270; if (which == "CCW90") lsty = CA_CCW90; if (which == "CCW180") lsty = CA_CCW180; if (which == "CCW270") lsty = CA_CCW270; BondEditDialog be(r, start, end, TYPE_CURVEARROW, 0, 0, 0, lsty, color); if (!be.exec()) return; qDebug() << "change"; lsty = be.Style(); color = be.Color(); switch (lsty) { case CA_CW90: which = "CW90"; break; case CA_CW180: which = "CW180"; break; case CA_CW270: which = "CW270"; break; case CA_CCW90: which = "CCW90"; break; case CA_CCW180: which = "CCW180"; break; case CA_CCW270: which = "CCW270"; break; } } int CurveArrow::Type() { return TYPE_CURVEARROW; } bool CurveArrow::Find(DPoint *target) { if (start == target) return true; if (end == target) return true; return false; } // Do not allow connections to this object. // Simplest way to do this, I think, is to disallow this function DPoint *CurveArrow::FindNearestPoint(DPoint *target, double &dist) { dist = 99999.0; return 0; } Drawable *CurveArrow::FindNearestObject(DPoint *target, double &dist) { dist = DistanceToLine(start, end, target); return this; } void CurveArrow::setPoints(DPoint *s, DPoint *e) { start = s; end = e; } /* QRect CurveArrow::BoundingBox() { if (highlighted == false) return QRect( QPoint(999,999), QPoint(0,0) ); int top, bottom, left, right, swp; left = (int)start->x; top = (int)start->y; right = (int)end->x; bottom = (int)end->y; if ( (which == QString("CW180")) || (which == QString("CCW180")) ) { QPoint midp((start->x + end->x) / 2, (start->y + end->y) / 2); double dx = start->x - (double)midp.x(); double dy = start->y - (double)midp.y(); double dist = sqrt( dx*dx + dy*dy ); int dist1 = (int)dist + 1; top = midp.y() - dist1; left = midp.x() - dist1; bottom = midp.y() + dist1; right = midp.x() + dist1; } if (bottom < top) { swp = top; top = bottom; bottom = swp; } if (right < left) { swp = left; left = right; right = swp; } return QRect( QPoint(left,top), QPoint(right,bottom) ); } */ QRect CurveArrow::BoundingBox() { if (highlighted == false) return QRect(QPoint(999, 999), QPoint(0, 0)); int top, bottom, left, right, swp; QPoint midp(qRound((start->x + end->x) / 2.0), qRound((start->y + end->y) / 2.0)); double dx = start->x - (double)midp.x(); double dy = start->y - (double)midp.y(); double dist = sqrt(dx * dx + dy * dy); int dist1 = (int)dist + 1; top = midp.y() - dist1; left = midp.x() - dist1; bottom = midp.y() + dist1; right = midp.x() + dist1; if (bottom < top) { swp = top; top = bottom; bottom = swp; } if (right < left) { swp = left; left = right; right = swp; } return QRect(QPoint(left, top), QPoint(right, bottom)); } bool CurveArrow::isWithinRect(QRect n, bool /*shiftdown*/) { if (DPointInRect(start, n) && DPointInRect(end, n)) highlighted = true; else highlighted = false; return highlighted; } xdrawchem-v1.11.0/xdrawchem/curvearrow.h000066400000000000000000000032761371466245600203220ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // curvearrow.h -- subclass of Drawable for curvearrows #ifndef CURVEARROW_H #define CURVEARROW_H #include #include #include "dpoint.h" #include "drawable.h" #include "render2d.h" class CurveArrow : public Drawable { public: CurveArrow(Render2D *, QObject *parent = 0); CurveArrow *CloneTo(Drawable *target = nullptr) const; void Render(); // draw this object void Edit(); int Type(); // return type of object bool Find(DPoint *); // does this CurveArrow contain this DPoint? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void setPoints(DPoint *, DPoint *); QRect BoundingBox(); bool isWithinRect(QRect, bool); QString ToXML(QString); void FromXML(QString); void SetCurve(const QString &t) { which = t; } QString GetCurve() { return which; } private: // Renderer Render2D *r; }; #endif xdrawchem-v1.11.0/xdrawchem/cw180.xpm000066400000000000000000000021421371466245600173310ustar00rootroot00000000000000/* XPM */ static const char * cw180_xpm[] = { "30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "..............................", "..............................", "..............................", "...........++++++.............", "........+++......+++..........", ".......+............+.........", "......+..............+........", ".....+................+.......", "....+..................+......", "...+....................+.....", "...+....................+.....", "...+.................+..+....+", "..+...................+..+..+.", "..+....................+.+.+..", "..+.....................+++...", "..+......................+....", "..............................", "..............................", "..............................", ".......+....+++...+++.........", "......++...+...+.+...+........", ".......+...+...+.+...+........", ".......+....+++..+...+........", ".......+...+...+.+...+........", ".......+...+...+.+...+........", ".......+...+...+.+...+........", ".......+....+++...+++.........", "..............................", "..............................", ".............................."}; xdrawchem-v1.11.0/xdrawchem/cw270.xpm000066400000000000000000000022671371466245600173410ustar00rootroot00000000000000/* XPM */ static const char *cw270_xpm[] = { /* width height num_colors chars_per_pixel */ " 30 30 2 1", /* colors */ ". c #ffffff", "# c #000000", /* pixels */ "..............................", "............######............", "..........##......##..........", ".........##........##.........", "........##..........##........", "........#............#........", ".......#..............#.......", ".......#..............#.......", ".......#..............#.......", "......................#.......", "......................#.......", "......................#.......", ".....................#........", "................#...##........", "...............#...##.........", "..............#...##..........", ".............#####............", "..............#...............", "...............#..............", "................#.............", "..............................", "..............................", ".........##..####..##.........", "........#..#.#..#.#..#........", "...........#...#..#..#........", "..........#....#..#..#........", ".........#....#...#..#........", "........####..#....##.........", "..............................", ".............................." }; xdrawchem-v1.11.0/xdrawchem/cw90.xpm000066400000000000000000000021411371466245600172500ustar00rootroot00000000000000/* XPM */ static const char * cw90_xpm[] = { "30 30 3 1", " g None", ". g #FFFFFF", "+ g #000000", "...................+..........", "....................+.........", ".....................+........", ".................++++++.......", "..............+++....+........", ".............+......+.........", "............+......+..........", "...........+..................", "..........+...................", ".........+....................", ".........+....................", ".........+....................", "........+.....................", "........+.....................", "........+.....................", "........+.....................", "..............................", "..............................", "..............................", "..........+++...+++...........", ".........+...+.+...+..........", ".........+...+.+...+..........", "..........++++.+...+..........", ".............+.+...+..........", ".............+.+...+..........", ".............+.+...+..........", "..........+++...+++...........", "..............................", "..............................", ".............................."}; xdrawchem-v1.11.0/xdrawchem/defs.h000066400000000000000000000202371371466245600170400ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef DEFS_H #define DEFS_H #include // Ring directories (global, user) extern QString RingDir, HomeDir; const QString VERSION = QString::fromLatin1("1.11.0"); // version string (makes updates easier :) #ifdef UNIX const QString XDC_VERSION = QString::fromLatin1("XDrawChem ") + VERSION; #endif #ifdef WIN32 const QString XDC_VERSION = QString::fromLatin1("WinDrawChem ") + VERSION; #endif #ifdef MACOSX const QString XDC_VERSION = QString::fromLatin1("MacDrawChem ") + VERSION; #endif // define XDC_SERVER default URL //#define XDC_SERVER "http://www.woodsidelabs.com/chemistry" // units #define PIXELS 0 #define ENGLISH 1 #define METRIC 2 // grid settings #define GRID_NONE 0 #define GRID_SQUARE 1 #define GRID_HEX 2 // math constant #define MOL_ARAD 57.29578 #ifndef M_PI // M_PI is usually defined on Unix, but not Windows #define M_PI 3.14159246 #endif // modes (int Render2D::mode) #define MODE_SELECT 90 #define MODE_SELECT_LASSO 95 #define MODE_SELECT_MOVE_POINT 110 #define MODE_SELECT_MOVE_OBJECT 111 #define MODE_SELECT_MULTIPLE 120 #define MODE_SELECT_MULTIPLE_SELECTED 91 #define MODE_SELECT_MOVE_MULTIPLE 122 #define MODE_SELECT_MULTIPLE_RESIZE 123 #define MODE_SELECT_RESIZE_MULTIPLE 124 #define MODE_SELECT_MULTIPLE_ROTATE 125 #define MODE_SELECT_ROTATE_MULTIPLE 126 #define MODE_DRAWLINE 200 #define MODE_DRAWLINE_DRAWING 201 #define MODE_DRAWCHAIN 205 #define MODE_DRAWCHAIN_DRAWING 206 #define MODE_DRAWLINE_DASH 210 #define MODE_DRAWLINE_DASH_DRAWING 211 #define MODE_DRAWLINE_UP 220 #define MODE_DRAWLINE_UP_DRAWING 221 #define MODE_DRAWLINE_DOWN 240 #define MODE_DRAWLINE_DOWN_DRAWING 241 #define MODE_DRAWWAVYLINE 250 #define MODE_DRAWWAVYLINE_DRAWING 251 #define MODE_DRAWARROW 260 #define MODE_DRAWARROW_DRAWING 261 #define MODE_DRAWCURVEARROW 270 #define MODE_DRAWCURVEARROW_DRAWING 271 #define MODE_DRAWBRACKET 280 #define MODE_DRAWBRACKET_DRAWING 281 #define MODE_DRAWBEZIER 290 #define MODE_DRAWBEZIER_DRAWING 291 #define MODE_TEXT 298 #define MODE_ERASE 300 #define MODE_ERASING 301 #define MODE_SYMBOL 500 #define MODE_DRAWNEWMAN_ANTI 510 #define MODE_DRAWNEWMAN_GAUCHE 511 #define MODE_RING 550 #define MODE_TOOL 600 #define MODE_TOOL_CALCMW 601 #define MODE_TOOL_CALCEF 602 #define MODE_TOOL_13CNMR 603 #define MODE_TOOL_CALCEA 604 #define MODE_TOOL_1HNMR 605 #define MODE_TOOL_IR 606 #define MODE_TOOL_NAME 607 #define MODE_TOOL_TOSMILES 608 #define MODE_TOOL_FROMSMILES 609 #define MODE_TOOL_CLEANUPMOL 610 #define MODE_TOOL_MOLECULE_INFO 611 #define MODE_TOOL_GROUP_REACTANT 612 #define MODE_TOOL_GROUP_PRODUCT 613 #define MODE_TOOL_CUSTOMRING 614 #define MODE_TOOL_TOINCHI 615 #define MODE_TOOL_FROMINCHI 616 #define MODE_TOOL_GROUP_CLEAR 620 #define MODE_TOOL_2D3D 630 #define MODE_TOOL_PKA 640 #define MODE_TOOL_KOW 650 #define MODE_TOOL_RETRO 660 #define MODE_TOOL_RETRO_ATOMNAME 698 #define MODE_TOOL_RETRO_BONDNAME 699 // list (unique?) reactions/sites this molecule is susceptible to #define MODE_TOOL_REACTIVITY_FORWARD 670 // list (unique?) sites that could have been created by known rxn's #define MODE_TOOL_REACTIVITY_RETRO 671 // partial charges, maybe do colors, maybe base on AMBER or other FF #define MODE_TOOL_CHARGES 672 #define MODE_TOOL_TEST 669 // reaction analysis #define RXN_ENTHALPY_ESTIMATE 1 #define RXN_1HNMR 2 #define RXN_13CNMR 3 #define RXN_TEST 69 // types (Drawable::Type() and subclasses) #define TYPE_DRAWABLE 0 #define TYPE_MOLECULE 1 #define TYPE_BOND 10 #define TYPE_TEXT 11 #define TYPE_ARROW 12 #define TYPE_BRACKET 13 #define TYPE_SYMBOL 14 #define TYPE_CURVEARROW 15 #define TYPE_BEZIER 16 #define TYPE_BIOTOOLS 20 #define TYPE_GRAPHIC_OBJECT 99 #define TYPE_GRAPHIC_LINE 100 #define TYPE_GRAPHIC_ATOMMARK 101 #define TYPE_GRAPHIC_BONDMARK 102 // bond stereochemistry (Bond::stereo) #define STEREO_UNDEFINED 0 #define STEREO_UP 1 #define STEREO_DOWN 2 #define STEREO_E 3 #define STEREO_Z 4 enum bracketType { squareBracket = 0, curveBracket, braceBracket, boxBracket, ellipseBracket, closedsquareBracket, circleBracket }; // bracket types (Bracket::style) #define BRACKET_SQUARE 1 #define BRACKET_CURVE 2 #define BRACKET_BRACE 3 #define BRACKET_BOX 4 #define BRACKET_ELLIPSE 5 #define BRACKET_CLOSEDSQUARE 6 #define BRACKET_CIRCLE 7 #define BRACKET_BOX_SHADOW 8 #define BRACKET_ELLIPSE_SHADOW 9 #define BRACKET_SQUARE_SHADOW 10 #define BRACKET_CIRCLE_SHADOW 11 enum regularArrowType { regularArrow = 0, topharpoonArrow, bottomharpoonArrow, middleArrow, didntworkArrow, dashedArrow, bi1Arrow, bi2Arrow, retroArrow }; // arrow styles (Arrow::style) #define ARROW_REGULAR 1 #define ARROW_DIDNT_WORK 69 #define ARROW_DASH 2 #define ARROW_BI1 3 #define ARROW_BI2 4 #define ARROW_RETRO 5 #define ARROW_TOPHARPOON 6 #define ARROW_BOTTOMHARPOON 7 #define ARROW_MIDDLE 8 enum curveArrowType { cw90Arrow = 0, ccw90Arrow, cw180Arrow, ccw180Arrow, cw270Arrow, ccw270Arrow, bezierArrow, bezierhalfArrow, bezierfullArrow }; // curve arrow styles #define CA_CW90 1 #define CA_CW180 2 #define CA_CW270 3 #define CA_CCW90 4 #define CA_CCW180 5 #define CA_CCW270 6 enum symbolType { symbolPlus = 0, symbolMinus, symbolDeltaPlus, symbolDeltaMinus, symbol1E, symbol2E, symbol2ELine, symbolRingUp, symbolPOrbital, symbolPDouble, symbolBead }; // symbol styles #define SYM_PLUS 1 #define SYM_MINUS 2 #define SYM_DELTA_PLUS 3 #define SYM_DELTA_MINUS 4 #define SYM_2E 5 #define SYM_1E 6 #define SYM_RING_UP 7 #define SYM_P_ORBITAL 8 #define SYM_BEAD 9 #define SYM_P_DOUBLE 10 #define SYM_2E_LINE 11 // justification flags (Text::justify) #define JUSTIFY_CENTER 1 #define JUSTIFY_TOPLEFT 2 // Sides (Text::NearestCenter) #define TEXT_LEFT 1 #define TEXT_RIGHT 2 #define TEXT_TOP 3 #define TEXT_BOTTOM 4 // data held in text (Text::DataType) #define TEXT_DATA_NORMAL 1 #define TEXT_DATA_MW 2 #define TEXT_DATA_FORMULA 3 // Text shape styles (Text::shape) #define TEXT_SHAPE_NONE 0 #define TEXT_SHAPE_ELLIPSE 1 #define TEXT_SHAPE_RECTANGLE 2 #define TEXT_SHAPE_CIRCLE 3 #define TEXT_SHAPE_SQUARE 4 // Horizontal or vertical arrow (Arrow::Orientation) #define ARROW_HORIZONTAL 1 #define ARROW_VERTICAL 2 // Flip direction #define FLIP_H 1 #define FLIP_V 2 // Group types (Molecule::group_type) #define GROUP_NONE 0 #define GROUP_REACTANT 1 #define GROUP_PRODUCT 2 #define GROUP_SOLVENT 3 #define GROUP_CATALYST 4 // output devices #define OUTPUT_SCREEN 1 #define OUTPUT_IMAGE 2 #define OUTPUT_PRINTER 3 #define OUTPUT_EPS 4 // Paintable::op Operation types /* OBSOLETE #define OP_LINE 1 #define OP_DASH_LINE 2 #define OP_TEXT 3 #define OP_STRING 100 #define OP_CURVE_CW90 4 #define OP_CURVE_CCW90 5 #define OP_CURVE_CW180 6 #define OP_CURVE_CCW180 7 #define OP_CURVE_CW270 8 #define OP_CURVE_CCW270 9 #define OP_PIXMAP 10 #define OP_FILLBOX 11 #define OP_UP_LINE 12 */ // page setup #define PAGE_LETTER 1 #define PAGE_LEGAL 2 #define PAGE_A4 3 #define PAGE_640 4 #define PAGE_800 5 #define PAGE_1024 6 #define PAGE_CUSTOM 7 #define PAGE_PORTRAIT 100 #define PAGE_LANDSCAPE 200 // CML stuff // track what tag(s) we're in (private int CMLParser::states) #define CML_MOLECULE 10 #define CML_NONE 1 #define CML_ATOM 2 #define CML_BOND 3 #define CML_ATOMARRAY 4 #define CML_BONDARRAY 5 #define CDXML_COLORTABLE 100 #define CDXML_FONTTABLE 101 #define CDXML_PAGE 102 #define CDXML_FRAGMENT 103 #define CDXML_NODE 104 #define CDXML_BOND 105 #define CDXML_GRAPHIC 106 #define CDXML_TEXT 107 #endif // ifndef DEFS_H xdrawchem-v1.11.0/xdrawchem/down.xpm000066400000000000000000000035551371466245600174470ustar00rootroot00000000000000/* XPM */ static char *down[] = { /* width height num_colors chars_per_pixel */ " 71 23 2 1", /* colors */ ". c #000000", "# c #ffffff", /* pixels */ "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "##################################################.###.###.###.########", "##############################.###.###.###.###.###.###.###.###.########", "##############.###.###.###.###.###.###.###.###.###.###.###.###.########", "##############################.###.###.###.###.###.###.###.###.########", "##################################################.###.###.###.########", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################", "#######################################################################" }; xdrawchem-v1.11.0/xdrawchem/dpoint.h000066400000000000000000000312051371466245600174110ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef DPOINT_H #define DPOINT_H #include #include #include #include #include #include #include #include #include #include #include class Bond; class DPoint { public: double x, y, z; double x3, y3, z3; double dx, dy, dz; // where to go on this iteration of (3D/minimize) QString id; // XML ID field QString element; // OR text string if associated with Text QString elementmask; // (updated) actual display text QString symbol; // only used when saving Molecules as XDC-XML QString hosecode; // save HOSE codes made in molecule_tools.cpp QString tmphose; // temp HOSE code (if in first sphere) int hosescore; // HOSE score int ketos; // number of keto groups attached (if any) bool aromatic; // part of an aromatic system? bool inring; // part of a ring? QString ringset; // SMILES ring closure code(s) for this atom QString hybrid; // hybridization (sp2, etc...) for 2D and 3D layout QColor color; QFont font; bool hit; int substituents; // how many bonds to this atom (sum of order) DPoint *other; // other end of single bond. See molecule.cpp Bond *otherBond; // single Bond containing this DPoint // for SDG and SSSR DPoint *source; int serial; QList neighbors; QVector bondorder; QList path; // for reconstructing rings... int new_order; // reactivity double partial_charge; // + or -, should also set "color" above QString react_atom_type; // AMBER atom type? Custom? // spectral data bool nmr_proton; // is this DPoint a proton added for 1H NMR prediction? double H1_shift; int H1_multiplicity; QString protonHOSECode; double C13_shift; QString C13_multiplicity; double partialCharge; double getC13_shift() { return C13_shift; } QString getC13_multiplicity() { return C13_multiplicity; } void setC13_shift(double in1) { C13_shift = in1; } void setC13_multiplicity(QString in1) { C13_multiplicity = in1; } bool highlighted; // functions DPoint() { x = 0.0; y = 0.0; z = 0.0; init(); } DPoint(double a, double b) { x = a; y = b; init(); } DPoint(QPoint q) { x = q.x(); y = q.y(); init(); } DPoint(DPoint *op) { x = op->x; y = op->y; z = op->z; id = op->id; element = op->element; elementmask = op->elementmask; symbol = op->symbol; hosecode = op->hosecode; tmphose = op->tmphose; hosescore = op->hosescore; ketos = op->ketos; aromatic = op->aromatic; inring = op->inring; ringset = op->ringset; color = op->color; font = op->font; hit = op->hit; substituents = op->substituents; other = op->other; otherBond = op->otherBond; serial = op->serial; bondorder.resize(6); } void init() { highlighted = false; nmr_proton = false; element = QString("C"); elementmask = QString(" "); symbol = QString(""); color = QColor(0, 0, 0); font = QFont("Helvetica", 12); C13_shift = 0.0; C13_multiplicity = "NA"; aromatic = false; serial = 0; hit = false; bondorder.resize(6); partialCharge = 0.0; } // these would be more relevant... if "substituents" were private... int degree() { return substituents; } void setDegree(int neworder) { substituents = neworder; } // same here -- highlighted should be private bool isHighlighted() { return highlighted; } void setHighlighted(bool neworder) { highlighted = neworder; } // same here -- partialCharge should be private double getCharge() { return partialCharge; } void setCharge(double nc1) { partialCharge = nc1; } void set(QPoint p) { x = (double)p.x(); y = (double)p.y(); } void set(double xn, double yn, double zn) { x3 = xn; y3 = yn; z3 = zn; } QPoint toQPoint() { return QPoint(qRound(x), qRound(y)); } QPointF toQPointF() { return QPointF(x, y); } void zero() { x = 0.0; y = 0.0; z = 0.0; } bool isZero() { if ((x < 0.01) && (x > -0.01) && (y < 0.01) && (y > -0.01)) return true; else return false; } double distanceTo(DPoint *t) { double dx = x - t->x; double dy = y - t->y; return (double)sqrt(dx * dx + dy * dy); } double Magnitude() { return sqrt((x3 * x3) + (y3 * y3) + (z3 * z3)); } void Normalize() { double dst = Magnitude(); x3 /= dst; y3 /= dst; z3 /= dst; } void Scale(double sf) { double dst = Magnitude(); Normalize(); dst = dst * sf; x3 *= dst; y3 *= dst; z3 *= dst; } void SetMagnitude(double sf) { double dst = Magnitude(); sf = sf / dst; Normalize(); dst = dst * sf; x3 *= dst; y3 *= dst; z3 *= dst; } void SetFontFromXML(QString xml_tag) { // qDebug() << "DP::SetFontFromXML:" << xml_tag; int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 6); i1 = xml_tag.indexOf("#"); // qDebug() << xml_tag.mid( 0, i1 ) << "*" << xml_tag.mid( i1 + 1 ); font = QFont(xml_tag.mid(0, i1), xml_tag.mid(i1 + 1).toInt()); } void SetColorFromXML(QString xml_tag) { // qDebug() << "DP::SetColorFromXML:" << xml_tag; int i1, i2; int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 7); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> d1 >> d2 >> d3; color = QColor(d1, d2, d3); } // set DPoint coordinates from XML void SetCoordFromXML(QString xml_tag) { // qDebug() << "DP::SetCoordFromXML:" << xml_tag; int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 13); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> x >> y; } void SetElementFromXML(QString xml_tag) { // qDebug() << "DP::SetElementFromXML:" << xml_tag; int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 9); element = xml_tag; } void SetElementMaskFromXML(QString xml_tag) { // qDebug() << "DP::SetElementMaskFromXML:" << xml_tag; int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 9); elementmask = xml_tag; } void SetSymbolFromXML(QString xml_tag) { // qDebug() << "DP::SetSymbolFromXML:" << xml_tag; int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 9); symbol = xml_tag; } void FromXML(QString xml_tag) { int i1, i2, ib, ie; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 14; SetCoordFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 8; SetColorFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 7; SetFontFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 10; SetElementFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 10; SetElementMaskFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 10; if (i1 >= 0) SetSymbolFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf("yes"); if (i1 >= 0) hit = true; // Create Text object associated with this DPoint } // get plain text element QString plainElement() { QTextDocument localText; localText.setHtml(element); return localText.toPlainText(); } // return atomic number of atom connected in this group int getAtomicNumber() { QString localElement; QTextDocument localText; localText.setHtml(element); // localElement = localText.toPlainText(); localElement = element; // qDebug() << "localElement:" << localElement; int atom1 = 999; if (localElement == "H") atom1 = 1; if (localElement == "C") atom1 = 6; if (localElement == "CN") atom1 = 6; if (localElement == "NC") atom1 = 6; if (localElement == "CO") atom1 = 6; if (localElement == "OC") atom1 = 6; if (localElement == "HC") atom1 = 6; if (localElement == "CH") atom1 = 6; if (localElement == "H2C") atom1 = 6; if (localElement == "CH2") atom1 = 6; if (localElement == "H3C") atom1 = 6; if (localElement == "CH3") atom1 = 6; if (localElement == "N") atom1 = 7; if (localElement == "NH") atom1 = 7; if (localElement == "HN") atom1 = 7; if (localElement == "NO") atom1 = 7; if (localElement == "ON") atom1 = 7; if (localElement == "NH2") atom1 = 7; if (localElement == "H2N") atom1 = 7; if (localElement == "NO2") atom1 = 7; if (localElement == "O2N") atom1 = 7; if (localElement == "O") atom1 = 8; if (localElement == "OH") atom1 = 8; if (localElement == "HO") atom1 = 8; if (localElement == "F") atom1 = 9; if (localElement == "P") atom1 = 15; if (localElement == "S") atom1 = 16; if (localElement == "SH") atom1 = 16; if (localElement == "HS") atom1 = 16; if (localElement == "Cl") atom1 = 17; if (localElement == "Br") atom1 = 35; if (localElement == "I") atom1 = 53; return atom1; } QString baseElement() { int tc1 = getAtomicNumber(); if (tc1 == 1) return "H"; if (tc1 == 6) return "C"; if (tc1 == 7) return "N"; if (tc1 == 8) return "O"; if (tc1 == 9) return "F"; if (tc1 == 15) return "P"; if (tc1 == 16) return "S"; if (tc1 == 17) return "Cl"; if (tc1 == 35) return "Br"; if (tc1 == 53) return "I"; if (tc1 == 999) { // let's try this... QString bele = element; bele.remove("+"); bele.remove("-"); bele.remove("H"); bele.remove(QRegExp("\\d+")); return bele; } return "X"; } }; #endif xdrawchem-v1.11.0/xdrawchem/drawable.cpp000066400000000000000000000247051371466245600202370ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // drawable.cpp - Drawable's implementation of functions #include "drawable.h" #include "defs.h" #include "dpoint.h" Drawable::Drawable(QObject *parent) : QObject(parent) { start = 0; end = 0; color = QColor(0, 0, 0); } Drawable *Drawable::CloneTo(Drawable *target) const { if (!target) target = new Drawable(this->parent()); if (target->start) delete target->start; if (start) target->start = new DPoint(start); if (target->end) delete target->end; if (end) target->end = new DPoint(end); target->highlighted = highlighted; target->ingroup = ingroup; target->color = color; target->style = style; target->which = which; target->thick = thick; return target; } // *************************************************** // functions shared by all Drawables (except Molecule) // // AllPoints() and AllObjects(): return all unique DPoint's and all // Drawables, respectively, contained in Molecule. Only used by save_cml, // I think, and only applies to Molecule. int Drawable::Members() { return 1; } QList Drawable::AllPoints() { QList l; return l; } QList Drawable::AllObjects() { return QList{this}; } double Drawable::DistanceBetween(QPointF a, QPointF b) { double dx = a.x() - b.x(); double dy = a.y() - b.y(); return sqrt(dx * dx + dy * dy); } // convert Drawable to XML tag. Reimplement for all subclasses! QString Drawable::ToXML(QString) { return QString("\n"); } // convert Drawable to CDXML tag. Reimplement for all subclasses! QString Drawable::ToCDXML(QString) { return QString(); } // convert XML tag to Drawable. Reimplement for all subclasses! void Drawable::FromXML(QString) { return; } // convert XML tag to QColor and set current void Drawable::SetColorFromXML(QString xml_tag) { qDebug() << "SetColorFromXML:" << xml_tag; int i1, i2; int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 7); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> d1 >> d2 >> d3; color = QColor(d1, d2, d3); } // convert XML tag to QColor and return QColor QColor Drawable::GetColorFromXML(QString xml_tag) { qDebug() << "GetColorFromXML:" << xml_tag; QColor ncolor; int i1, i2; int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 7); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> d1 >> d2 >> d3; ncolor = QColor(d1, d2, d3); return ncolor; } // set DPoint *start from XML void Drawable::SetStartFromXML(QString xml_tag) { qDebug() << "SetStartFromXML:" << xml_tag; int i1, i2; double x1, y1; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 7); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> x1 >> y1; if (!start) { delete start; start = nullptr; } start = new DPoint(x1, y1); } // set DPoint *end from XML void Drawable::SetEndFromXML(QString xml_tag) { qDebug() << "SetEndFromXML:" << xml_tag; int i1, i2; double x1, y1; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 5); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> x1 >> y1; if (!end) { delete end; end = nullptr; } end = new DPoint(x1, y1); } void Drawable::Highlight() { highlighted = start->isHighlighted() && (end ? end->isHighlighted() : true); } void Drawable::Highlight(bool hl) { highlighted = hl; if (hl) { start->setHighlighted(true); if (end) end->setHighlighted(true); } } bool Drawable::Highlighted() { return highlighted; } void Drawable::SelectAll() { highlighted = true; } void Drawable::DeselectAll() { highlighted = false; } void Drawable::SetColorIfHighlighted(QColor c) { if (highlighted) color = c; } void Drawable::Move(double dx, double dy) { if ((highlighted) && (start != 0)) { start->x += dx; start->y += dy; } if ((highlighted) && (end != 0)) { end->x += dx; end->y += dy; } } void Drawable::ForceMove(double dx, double dy) { if (start != 0) { start->x += dx; start->y += dy; } if (end != 0) { end->x += dx; end->y += dy; } } void Drawable::Flip(DPoint *origin, int direction) { double delta; if (highlighted == false) return; if (start != 0) { if (direction == FLIP_H) { delta = start->x - origin->x; start->x = start->x - 2 * delta; } else { // direction == FLIP_V delta = start->y - origin->y; start->y = start->y - 2 * delta; } } if (end != 0) { if (direction == FLIP_H) { delta = end->x - origin->x; end->x = end->x - 2 * delta; } else { // direction == FLIP_V delta = end->y - origin->y; end->y = end->y - 2 * delta; } } } void Drawable::Rotate(DPoint *origin, double angle) { // double dx, dy; if (highlighted == false) return; if (start != 0) { double thisx = start->x - origin->x; double thisy = start->y - origin->y; double newx = thisx * cos(angle) + thisy * sin(angle); double newy = -thisx * sin(angle) + thisy * cos(angle); start->x = (newx + origin->x); start->y = (newy + origin->y); } if (end != 0) { double thisx = end->x - origin->x; double thisy = end->y - origin->y; double newx = thisx * cos(angle) + thisy * sin(angle); double newy = -thisx * sin(angle) + thisy * cos(angle); end->x = (newx + origin->x); end->y = (newy + origin->y); } } void Drawable::Resize(DPoint *origin, double scale) { double dx, dy; if (highlighted == false) return; if (start != 0) { dx = start->x - origin->x; dy = start->y - origin->y; dx *= scale; dy *= scale; start->x = origin->x + dx; start->y = origin->y + dy; } if (end != 0) { dx = end->x - origin->x; dy = end->y - origin->y; dx *= scale; dy *= scale; end->x = origin->x + dx; end->y = origin->y + dy; } } // // end common functions // ******************** void Drawable::Render() { qDebug() << "Not possible to render Drawable, only its subclasses"; } void Drawable::Edit() { qDebug() << "Not possible to edit Drawable, only its subclasses"; } int Drawable::Type() { return TYPE_DRAWABLE; } DPoint *Drawable::FindNearestPoint(DPoint *, double &d) { d = 99999.0; return 0; } Drawable *Drawable::FindNearestObject(DPoint *, double &d) { d = 99999.0; return 0; } bool Drawable::Find(DPoint *) { return false; } void Drawable::addBond(DPoint *, DPoint *, int, int, QColor, bool) { return; } void Drawable::addMolecule(Drawable *) { return; } bool Drawable::Erase(Drawable *) { return false; } bool Drawable::isWithinRect(QRect, bool) { return false; } QRect Drawable::BoundingBox() { return QRect(QPoint(999, 999), QPoint(0, 0)); } // math functions all Drawables might need double Drawable::getAngle(DPoint *a, DPoint *b) { return atan2(b->y - a->y, b->x - a->x) * 180 / M_PI; } // start->end is the line; target is the point we're measuring to double Drawable::DistanceToLine(DPoint *start1, DPoint *end1, DPoint *target) { // check if close enough to even worry #if 0 double xmin, xmax, ymin, ymax; if ( start1->x > end1->x ) { xmax = start1->x; xmin = end1->x; } else { xmin = start1->x; xmax = end1->x; } if ( start1->y > end1->y ) { ymax = start1->y; ymin = end1->y; } else { ymin = start1->y; ymax = end1->y; } xmin -= 6.0; ymin -= 6.0; xmax += 6.0; ymax += 6.0; if ( ( target->x < xmin ) || ( target->x > xmax ) || ( target->y < ymin ) || ( target->y > ymax ) ) return 999999.0; // find distance if target is inside "bounding box" double x1 = start1->x; double y1 = start1->y; double x2 = end1->x; double y2 = end1->y; double x3 = target->x; double y3 = target->y; double unum = ( x3 - x1 ) * ( x2 - x1 ) + ( y3 - y1 ) * ( y2 - y1 ); double dx = x2 - x1; double dy = y2 - y1; double rt = ( double ) sqrt( dx * dx + dy * dy ); double uden = rt * rt; double u = unum / uden; double xp = x1 + u * ( x2 - x1 ); double yp = y1 + u * ( y2 - y1 ); dx = xp - x3; dy = yp - y3; return ( double ) sqrt( dx * dx + dy * dy ); #else double x1 = start1->x; double y1 = start1->y; double x2 = end1->x; double y2 = end1->y; double x3 = target->x; double y3 = target->y; double dx = x2 - x1; double dy = y2 - y1; double rt = (double)sqrt(dx * dx + dy * dy); if (rt <= 0.0) { dx = x3 - x1; dy = y3 - y1; return sqrt(dx * dx + dy * dy); } if (dy * (y3 - y1) + dx * (x3 - x1) < 0.0) { dx = x3 - x1; dy = y3 - y1; return sqrt(dx * dx + dy * dy); } if (dy * (y3 - y2) + dx * (x3 - x2) > 0.0) { dx = x3 - x2; dy = y3 - y2; return sqrt(dx * dx + dy * dy); } double unum = dx * (y3 - y1) - dy * (x3 - x1); if (unum < 0.0) unum = -unum; return unum / rt; #endif } // DPointInRect: companion to WithinRect() in subclasses. bool Drawable::DPointInRect(DPoint *d, QRect r) { return r.contains(QPoint((int)d->x, (int)d->y), true); } // cmake#include "drawable.moc" xdrawchem-v1.11.0/xdrawchem/drawable.h000066400000000000000000000100051371466245600176700ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // drawable.h -- the class that is the parent of all drawable objects #ifndef DRAWABLE_H #define DRAWABLE_H #include #include #include #include #include "dpoint.h" class Bond; class Text; class Drawable : public QObject { Q_OBJECT public: Drawable(QObject *parent = 0); virtual Drawable *CloneTo(Drawable *target = nullptr) const; // Clone current data to target virtual void Render(); // draw this object virtual void Edit(); // edit this object virtual int Type(); // return type of object virtual DPoint *FindNearestPoint(DPoint *, double &); virtual Drawable *FindNearestObject(DPoint *, double &); virtual bool Find(DPoint *); virtual void addBond(DPoint *, DPoint *, int, int, QColor, bool hl = false); virtual void addMolecule(Drawable *); virtual void Highlight(); virtual void Highlight(bool); virtual bool Highlighted(); virtual bool Erase(Drawable *); virtual bool isWithinRect(QRect, bool); virtual void SelectAll(); virtual void DeselectAll(); virtual void Move(double, double); virtual void ForceMove(double, double); virtual void Rotate(DPoint *, double); virtual void Flip(DPoint *, int); virtual void Resize(DPoint *, double); virtual QRect BoundingBox(); virtual QList AllPoints(); virtual QList AllObjects(); virtual QString ToXML(QString); virtual QString ToCDXML(QString); virtual void FromXML(QString); virtual int Members(); // needed only to merge Molecules; see molecule.cpp, addMolecule() virtual Bond *bondsFirst() { return 0; } virtual Bond *bondsNext() { return 0; } virtual Text *labelsFirst() { return 0; } virtual Text *labelsNext() { return 0; } // stuff that all Drawables should know about static double getAngle(DPoint *, DPoint *); double DistanceToLine(DPoint *, DPoint *, DPoint *); double DistanceBetween(QPointF, QPointF); bool DPointInRect(DPoint *, QRect); DPoint *Start() { return start; } DPoint *End() { return end; } void setStart(DPoint *ns) { start = ns; } void setEnd(DPoint *ne) { end = ne; } virtual void SetColorIfHighlighted(QColor); void SetColor(QColor c) { color = c; } QColor GetColor() { return color; } QString getID() { return id; } void setID(QString x) { id = x; } QColor GetColorFromXML(QString); void SetColorFromXML(QString); void SetStartFromXML(QString); void SetEndFromXML(QString); bool isInGroup() { return ingroup; } void setInGroup(bool x) { ingroup = x; } int Thick() { return thick; } void setThick(int t) { thick = t; } // more or less everything must be protected so derived classes can use them protected: // highlighted? bool highlighted; // member of a group? bool ingroup; // points which define this Drawable (only start needed for TEXT) DPoint *start, *end; // color QColor color; // XML ID QString id; // arrow or bracket style int style; // which symbol or curvearrow to draw QString which; // thickness of bond/bracket/line int thick; }; #endif xdrawchem-v1.11.0/xdrawchem/dyk.cpp000066400000000000000000000131421371466245600172360ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "dyk.h" DYKDialog::DYKDialog(QWidget *parent) : QDialog(parent) { populateTipList(); setWindowTitle(tr("Did You Know?")); QGridLayout *dykLayout = new QGridLayout(); QLabel *dykLabel = new QLabel(tr("Did You Know?")); dykLayout->addWidget(dykLabel, 0, 0, 1, 1); tipcount = preferences.getDYKCount(); if (tipcount >= tips.count()) tipcount = 0; curtip = new QLabel(); curtip->setText(tips[tipcount]); dykLayout->addWidget(curtip, 1, 0, 1, 2); QSpacerItem *dykSpacer = new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding); dykLayout->addItem(dykSpacer, 2, 0, 1, 2); futureshow = new QCheckBox(tr("Don't show this dialog at startup")); futureshow->setChecked(!preferences.getDYK()); dykLayout->addWidget(futureshow, 3, 0, 1, 2); QHBoxLayout *btnLayout = new QHBoxLayout(); QPushButton *prevTipBtn = new QPushButton(tr("Previous tip")); connect(prevTipBtn, SIGNAL(clicked()), SLOT(prevTip())); btnLayout->addWidget(prevTipBtn); QPushButton *nextTipBtn = new QPushButton(tr("Next tip")); connect(nextTipBtn, SIGNAL(clicked()), SLOT(nextTip())); btnLayout->addWidget(nextTipBtn); QSpacerItem *btnSpacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); btnLayout->addItem(btnSpacer); QPushButton *okBtn = new QPushButton(tr("OK")); connect(okBtn, SIGNAL(clicked()), SLOT(finished())); btnLayout->addWidget(okBtn); dykLayout->addLayout(btnLayout, 4, 0, 1, 2); setLayout(dykLayout); } void DYKDialog::finished() { preferences.setDYK(!futureshow->isChecked()); tipcount++; if (tipcount >= tips.count()) tipcount = 0; preferences.setDYKCount(tipcount); accept(); } void DYKDialog::populateTipList() { tips.append(tr("XDrawChem can be run from the command line\n" "to produce images.\n" "Type \"xdrawchem --help\" for details.")); tips.append(tr("When in select mode, you can edit most objects\n" "by right-clicking on them.")); tips.append(tr("When drawing bonds, you can edit the bond style\n" "by right-clicking on the bond.")); tips.append(tr("When in select mode, press Shift+LeftButton and drag\n" "over part of a molecule to select the entire molecule.")); tips.append(tr("When in select mode, press Ctrl+LeftButton\n" "on a molecule to get molecule information.")); tips.append(tr("Bond length, bond angle, and units are set\n" "in the Drawing Settings option under the Format menu.")); tips.append(tr("You can attach a subscript to a bracket by selecting\n" "the text tool, then clicking on the bracket.")); tips.append(tr("You can toggle the grid display by pressing Ctrl+G.\n" "Turning the grid on or off does not affect whether\n" "objects snap to the grid.")); tips.append(tr("A number of ring and molecule templates are available\n" "from the ring tool, including single and fused rings,\n" "amino acids, and nucleosides.")); tips.append(tr("Remember to select a file type when\n" "opening or saving documents.")); tips.append(tr("The option \"Clean up molecule\" under\n" "the Tools menu can be used to refine structures\n" "such as rings and macromolecules.")); tips.append(tr("It's possible to attach rings to structures\n" "by selecting a ring and clicking on an atom.")); tips.append(tr("XDrawChem can automatically attach\n" "amino acids from N-terminal to C-terminal\n" "(but the result isn't always pretty :)")); tips.append(tr("Be sure to check for updates at\n" "http://xdrawchem.sourceforge.net/")); tips.append(tr("XDrawChem can draw over 100,000 substances using\n" "its Internet database. Select Find on internet\n" "from the File menu to search for compounds.")); tips.append(tr("XDrawChem can identify compounds by CAS number\n" "and occasionally by name.\n" "Select Molecule information from the Tools menu\n" "and click on a molecule. However, this only works\n" "if the compound is listed in the database.")); } void DYKDialog::nextTip() { tipcount++; if (tipcount >= tips.count()) tipcount = 0; curtip->setText(tips[tipcount]); updateGeometry(); } void DYKDialog::prevTip() { tipcount--; if (tipcount < 0) tipcount = tips.count() - 1; curtip->setText(tips[tipcount]); updateGeometry(); } // cmake#include "dyk.moc" xdrawchem-v1.11.0/xdrawchem/dyk.h000066400000000000000000000023431371466245600167040ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef DYKDIALOG_H #define DYKDIALOG_H #include #include #include #include "prefs.h" extern Preferences preferences; class DYKDialog : public QDialog { Q_OBJECT public: DYKDialog(QWidget *parent = 0); public slots: void nextTip(); void prevTip(); void finished(); private: void populateTipList(); QCheckBox *futureshow; QLabel *curtip; QStringList tips; int tipcount; }; #endif xdrawchem-v1.11.0/xdrawchem/edittool.xpm000066400000000000000000000005521371466245600203150ustar00rootroot00000000000000/* XPM */ static const char *edittool[] = { "16 13 2 1", "A c #040404040404", "B c #F3F3F7F7F3F3", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BAAABAABBAAABAAA", "BABBBABABBABBBAB", "BABBBABABBABBBAB", "BABBBABABBABBBAB", "BAABBABABBABBBAB", "BABBBABABBABBBAB", "BABBBABABBABBBAB", "BABBBABABBABBBAB", "BAAABAABBAAABBAB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; xdrawchem-v1.11.0/xdrawchem/fixeddialog.cpp000066400000000000000000000301421371466245600207250ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include "fixeddialog.h" #include "prefs.h" #include "render2d.h" extern Preferences preferences; FixedDialog::FixedDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Set fixed angle and length")); int decimals = 2; double prefValue, bondLength, arrowLength, offset, gridSpacing; QPushButton *ok, *cancel, *def1; QGridLayout *fixedlayout = new QGridLayout(); QLabel *unitsLabel = new QLabel(); unitsLabel->setText(tr("Units:")); fixedlayout->addWidget(unitsLabel, 0, 0, 1, 1); unitCombo = new QComboBox(); unitCombo->addItem(tr("pixels")); // not ready for these...yet // unitCombo->addItem( tr("inches") ); // unitCombo->addItem( tr("cm") ); prevunit = preferences.getUnits(); if (prevunit == PIXELS) decimals = 0; unitCombo->setCurrentIndex(prevunit); QString ustr = unitCombo->currentText(); connect(unitCombo, SIGNAL(activated(int)), this, SLOT(setUnits(int))); fixedlayout->addWidget(unitCombo, 0, 1, 1, 2); QLabel *bondLengthLabel = new QLabel(tr("Bond fixed length:")); fixedlayout->addWidget(bondLengthLabel, 1, 0); bondLengthBox = new QDoubleSpinBox(); bondLengthBox->setSuffix(" " + ustr); bondLengthBox->setMinimum(5); bondLengthBox->setMaximum(1000); bondLengthBox->setDecimals(decimals); prefValue = preferences.getBond_fixedlength(); if (prevunit == PIXELS) bondLength = prefValue; else if (prevunit == ENGLISH) bondLength = prefValue / 100.0; else bondLength = prefValue / 40.0; bondLengthBox->setValue(bondLength); fixedlayout->addWidget(bondLengthBox, 1, 1, 1, 2); QLabel *bondAngleLabel = new QLabel(tr("Bond fixed angle:")); fixedlayout->addWidget(bondAngleLabel, 2, 0); bondAngleBox = new QDoubleSpinBox(); bondAngleBox->setSuffix(" " + tr("degrees")); bondLengthBox->setMaximum(359.99); bondAngleBox->setValue(preferences.getBond_fixedangle()); fixedlayout->addWidget(bondAngleBox, 2, 1, 1, 2); QLabel *arrowLengthLabel = new QLabel(tr("Arrow fixed length:")); fixedlayout->addWidget(arrowLengthLabel, 3, 0); arrowLengthBox = new QDoubleSpinBox(); arrowLengthBox->setSuffix(" " + ustr); arrowLengthBox->setMinimum(prevunit == PIXELS ? 1 : 0.01); bondLengthBox->setMaximum(1000); arrowLengthBox->setDecimals(decimals); prefValue = preferences.getArrow_fixedlength(); if (prevunit == PIXELS) arrowLength = prefValue; else if (prevunit == ENGLISH) arrowLength = prefValue / 100.0; else arrowLength = prefValue / 40.0; arrowLengthBox->setValue(arrowLength); fixedlayout->addWidget(arrowLengthBox, 3, 1, 1, 2); QLabel *arrowAngleLabel = new QLabel(tr("Arrow fixed angle:")); fixedlayout->addWidget(arrowAngleLabel, 4, 0); arrowAngleBox = new QDoubleSpinBox(); arrowAngleBox->setSuffix(" " + tr("degrees")); bondLengthBox->setMaximum(359.99); arrowAngleBox->setValue(preferences.getArrow_fixedangle()); fixedlayout->addWidget(arrowAngleBox, 4, 1, 1, 2); QLabel *bondSpacingLabel = new QLabel(tr("Double bond spacing:")); fixedlayout->addWidget(bondSpacingLabel, 5, 0); doubleBondOffset = new QDoubleSpinBox(); doubleBondOffset->setSuffix(" " + ustr); doubleBondOffset->setMinimum(prevunit == PIXELS ? 1 : 0.01); doubleBondOffset->setDecimals(decimals); prefValue = preferences.getDoubleBondOffset(); if (prevunit == PIXELS) offset = prefValue; else if (prevunit == ENGLISH) offset = prefValue / 100.0; else offset = prefValue / 40.0; doubleBondOffset->setValue(offset); fixedlayout->addWidget(doubleBondOffset, 5, 1, 1, 2); // anti_toggle = new QCheckBox(tr("Anti-aliasing"), this); // anti_toggle->setGeometry(20,170,100,30); showgrid = new QComboBox(); showgrid->addItem(tr("Do not show grid")); showgrid->addItem(tr("Show square grid")); showgrid->addItem(tr("Show hex grid")); showgrid->setCurrentIndex(preferences.getDrawGrid()); fixedlayout->addWidget(showgrid, 6, 1, 1, 2); snapGridBox = new QCheckBox(tr("Snap to grid")); bool snapgrid = false; if (preferences.getSnapGrid() == GRID_SQUARE) snapgrid = true; snapGridBox->setChecked(snapgrid); fixedlayout->addWidget(snapGridBox, 7, 1, 1, 2); QLabel *gridSpacingLabel = new QLabel(tr("Grid spacing:")); fixedlayout->addWidget(gridSpacingLabel, 8, 0); gridSpacingBox = new QDoubleSpinBox(); gridSpacingBox->setSuffix(" " + ustr); gridSpacingBox->setMinimum(prevunit == PIXELS ? 1 : 0.01); gridSpacingBox->setDecimals(decimals); prefValue = preferences.getGridSpacing(); if (prevunit == PIXELS) gridSpacing = prefValue; else if (prevunit == ENGLISH) gridSpacing = prefValue / 100.0; else gridSpacing = prefValue / 40.0; gridSpacingBox->setValue(gridSpacing); fixedlayout->addWidget(gridSpacingBox, 8, 1, 1, 2); QHBoxLayout *buttonHBox = new QHBoxLayout(); QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); buttonHBox->addItem(spacer); def1 = new QPushButton(tr("Default")); connect(def1, SIGNAL(clicked()), SLOT(setDefaults())); buttonHBox->addWidget(def1); ok = new QPushButton(tr("OK")); connect(ok, SIGNAL(clicked()), SLOT(onSuccess())); buttonHBox->addWidget(ok); cancel = new QPushButton(tr("Cancel")); connect(cancel, SIGNAL(clicked()), SLOT(reject())); buttonHBox->addWidget(cancel); fixedlayout->addLayout(buttonHBox, 9, 0, 1, 3); setLayout(fixedlayout); } void FixedDialog::onSuccess() { double d1; preferences.setDrawGrid(showgrid->currentIndex()); if (snapGridBox->isChecked()) { preferences.setSnapGrid(GRID_SQUARE); } else { preferences.setSnapGrid(GRID_NONE); } preferences.setUnits(unitCombo->currentIndex()); d1 = bondLengthBox->value(); if (prevunit == PIXELS) bl = (int)d1; if (prevunit == ENGLISH) bl = qRound(d1 * 100.0); if (prevunit == METRIC) bl = qRound(d1 * 40.0); d1 = arrowLengthBox->value(); if (prevunit == PIXELS) al = (int)d1; if (prevunit == ENGLISH) al = qRound(d1 * 100.0); if (prevunit == METRIC) al = qRound(d1 * 40.0); d1 = doubleBondOffset->value(); if (prevunit == PIXELS) dsp = (int)d1; if (prevunit == ENGLISH) dsp = qRound(d1 * 100.0); if (prevunit == METRIC) dsp = qRound(d1 * 40.0); d1 = gridSpacingBox->value(); if (prevunit == PIXELS) gsp = (int)d1; if (prevunit == ENGLISH) gsp = qRound(d1 * 100.0); if (prevunit == METRIC) gsp = qRound(d1 * 40.0); d1 = arrowAngleBox->value(); if (d1 > 0.0) preferences.setArrow_fixedangle(d1); if (al > 0.0) preferences.setArrow_fixedlength(al); d1 = bondAngleBox->value(); if (d1 > 0.0) preferences.setBond_fixedangle(d1); if (bl > 0.0) preferences.setBond_fixedlength(bl); if (dsp > 0.0) preferences.setDoubleBondOffset(dsp); if (gsp > 0.0) preferences.setGridSpacing(qRound((double)gsp)); accept(); } void FixedDialog::setDefaults() { QString n; int i1; double d1; i1 = 25; if (prevunit == PIXELS) d1 = (double)i1; if (prevunit == ENGLISH) d1 = (double)i1 / 100.0; if (prevunit == METRIC) d1 = (double)i1 / 40.0; bondLengthBox->setValue(d1); bondAngleBox->setValue(15); i1 = 50; if (prevunit == PIXELS) d1 = (double)i1; if (prevunit == ENGLISH) d1 = (double)i1 / 100.0; if (prevunit == METRIC) d1 = (double)i1 / 40.0; arrowLengthBox->setValue(d1); arrowAngleBox->setValue(15); i1 = 1; if (prevunit == PIXELS) d1 = (double)i1; if (prevunit == ENGLISH) d1 = (double)i1 / 100.0; if (prevunit == METRIC) d1 = (double)i1 / 40.0; doubleBondOffset->setValue(d1); showgrid->setCurrentIndex(GRID_NONE); snapGridBox->setChecked(false); i1 = 50; if (prevunit == PIXELS) d1 = (double)i1; if (prevunit == ENGLISH) d1 = (double)i1 / 100.0; if (prevunit == METRIC) d1 = (double)i1 / 40.0; gridSpacingBox->setValue(d1); // anti_toggle->setChecked(false); } void FixedDialog::setUnits(int n1) { double d1; QString n; d1 = bondLengthBox->value(); if (prevunit == PIXELS) bl = (int)d1; if (prevunit == ENGLISH) bl = qRound(d1 * 100.0); if (prevunit == METRIC) bl = qRound(d1 * 40.0); d1 = arrowLengthBox->value(); if (prevunit == PIXELS) al = (int)d1; if (prevunit == ENGLISH) al = qRound(d1 * 100.0); if (prevunit == METRIC) al = qRound(d1 * 40.0); d1 = doubleBondOffset->value(); if (prevunit == PIXELS) dsp = (int)d1; if (prevunit == ENGLISH) dsp = qRound(d1 * 100.0); if (prevunit == METRIC) dsp = qRound(d1 * 40.0); d1 = gridSpacingBox->value(); if (prevunit == PIXELS) gsp = (int)d1; if (prevunit == ENGLISH) gsp = qRound(d1 * 100.0); if (prevunit == METRIC) gsp = qRound(d1 * 40.0); QString ustr; if (n1 == 0) { ustr = tr("pixels"); } if (n1 == 1) { ustr = tr("inches"); } if (n1 == 2) { ustr = tr("cm"); } bondLengthBox->setSuffix(" " + ustr); arrowLengthBox->setSuffix(" " + ustr); doubleBondOffset->setSuffix(" " + ustr); gridSpacingBox->setSuffix(" " + ustr); prevunit = n1; if (prevunit == PIXELS) d1 = (double)bl; if (prevunit == ENGLISH) d1 = (double)bl / 100.0; if (prevunit == METRIC) d1 = (double)bl / 40.0; bondLengthBox->setValue(d1); if (prevunit == PIXELS) d1 = (double)al; if (prevunit == ENGLISH) d1 = (double)al / 100.0; if (prevunit == METRIC) d1 = (double)al / 40.0; arrowLengthBox->setValue(d1); if (prevunit == PIXELS) d1 = (double)dsp; if (prevunit == ENGLISH) d1 = (double)dsp / 100.0; if (prevunit == METRIC) d1 = (double)dsp / 40.0; doubleBondOffset->setValue(d1); if (prevunit == PIXELS) d1 = (double)gsp; if (prevunit == ENGLISH) d1 = (double)gsp / 100.0; if (prevunit == METRIC) d1 = (double)gsp / 40.0; gridSpacingBox->setValue(d1); } void FixedDialog::setLength_bond(double t) { bondLengthBox->setValue(t); } void FixedDialog::setAngle_bond(double t) { bondAngleBox->setValue(t); } double FixedDialog::getLength_bond() { double t = bondLengthBox->value(); return t; } double FixedDialog::getAngle_bond() { double t = bondAngleBox->value(); return t; } void FixedDialog::setLength_arrow(double t) { arrowLengthBox->setValue(t); } void FixedDialog::setAngle_arrow(double t) { arrowAngleBox->setValue(t); } double FixedDialog::getLength_arrow() { double t = arrowLengthBox->value(); return t; } double FixedDialog::getAngle_arrow() { double t = arrowAngleBox->value(); return t; } double FixedDialog::getDoubleBondOffset() { double t = doubleBondOffset->value(); return t; } void FixedDialog::setDoubleBondOffset(double t) { doubleBondOffset->setValue(t); } // cmake#include "fixeddialog.moc" xdrawchem-v1.11.0/xdrawchem/fixeddialog.h000066400000000000000000000035771371466245600204060ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef FIXEDDIALOG_H #define FIXEDDIALOG_H #include #include class QComboBox; class QDoubleSpinBox; class FixedDialog : public QDialog { Q_OBJECT public: FixedDialog(QWidget *parent); double getLength_bond(); double getAngle_bond(); void setLength_bond(double); void setAngle_bond(double); double getLength_arrow(); double getAngle_arrow(); void setLength_arrow(double); void setAngle_arrow(double); double getDoubleBondOffset(); void setDoubleBondOffset(double); void setAntiChecked(bool checked) { anti_toggle->setChecked(checked); } bool getAntiChecked() { return anti_toggle->isChecked(); } public slots: void onSuccess(); void setDefaults(); void setUnits(int); private: QComboBox *unitCombo; QDoubleSpinBox *bondLengthBox; QDoubleSpinBox *bondAngleBox; QDoubleSpinBox *arrowLengthBox; QDoubleSpinBox *arrowAngleBox; QDoubleSpinBox *doubleBondOffset; QDoubleSpinBox *gridSpacingBox; QCheckBox *anti_toggle, *snapGridBox; QComboBox *showgrid; int bl, al, dsp, gsp, prevunit; }; #endif xdrawchem-v1.11.0/xdrawchem/forward.xpm000066400000000000000000000010601371466245600201310ustar00rootroot00000000000000/* XPM */ /* Drawn by Mark Donohoe for the K Desktop Environment */ /* See http://www.kde.org */ static const char *forward_xpm[]={ "16 16 5 1", "# c #000000", "a c #ffffff", "c c #808080", "b c #c0c0c0", ". c None", "................", "................", ".........#......", ".........##.....", ".........#a#....", "..########aa#...", "..#aaaaaaabaa#..", "..#bbbbbbbbbaa#.", "..#bbbbbbbbba#..", "..########ba#c..", "..ccccccc#a#c...", "........c##c....", "........c#c.....", "........cc......", "........c.......", "................", "................"}; xdrawchem-v1.11.0/xdrawchem/gobject.cpp000066400000000000000000000202411371466245600200620ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // gobject.cpp - GraphicObject's implementation of functions #include #include #include #include #include "bondedit.h" #include "defs.h" #include "drawable.h" #include "gobject.h" #include "render2d.h" GraphicObject::GraphicObject(Render2D *r1, QObject *parent) : Drawable(parent) { r = r1; highlighted = false; style = 0; ot = 0; } GraphicObject *GraphicObject::CloneTo(Drawable *target) const { if (!target) target = new GraphicObject(r, parent()); GraphicObject *t = static_cast(this->Drawable::CloneTo(target)); t->objectPoints = objectPoints; t->ot = ot; return t; } QString GraphicObject::ToXML(QString xml_id) { QString s, n1; // begin graphic object s.append("\n"); // write object type (ot) s.append(""); n1.setNum(ot); s.append(n1); s.append("\n"); // write Style s.append("\n"); // write points if (ot == TYPE_BEZIER) { int ci, xi, yi; for (ci = 0; ci < 4; ci++) { s.append(""); objectPoints.point(ci, &xi, &yi); n1.setNum(xi); s.append(n1); s.append(" "); n1.setNum(yi); s.append(n1); s.append("\n"); } } // write color s.append(""); n1.setNum(color.red()); s.append(n1); s.append(" "); n1.setNum(color.green()); s.append(n1); s.append(" "); n1.setNum(color.blue()); s.append(n1); s.append("\n"); // end bracket s.append("\n"); return s; } QString GraphicObject::ToCDXML(QString xml_id) { QString s, n1; return s; // until I learn how to do these objects in CDXML // begin arrow s.append("x); s.append(n1); s.append(" "); n1.setNum(end->y); s.append(n1); s.append(" "); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\" "); if (style == BRACKET_SQUARE) s.append("GraphicType=\"Bracket\" BracketType=\"SquarePair\""); if (style == BRACKET_CURVE) s.append("GraphicType=\"Bracket\" BracketType=\"RoundPair\""); if (style == BRACKET_BRACE) s.append("GraphicType=\"Bracket\" BracketType=\"CurlyPair\""); s.append("/>\n"); return s; } // set GraphicObject from XDrawChem-format XML void GraphicObject::FromXML(QString xml_tag) { int i1, i2; i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 8; SetStartFromXML(xml_tag.mid(i1, i2 - i1)); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 6; SetEndFromXML(xml_tag.mid(i1, i2 - i1)); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 13; ot = xml_tag.mid(i1 + 12, 2).toInt(); } i1 = xml_tag.indexOf("") + 8; style = xml_tag.mid(i1 + 7, i2 - i1 - 15).toInt(); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 8; SetColorFromXML(xml_tag.mid(i1, i2 - i1)); } if (ot == TYPE_BEZIER) { objectPoints.resize(4); int ci, xi, yi, i3 = 0; QString xml_subtag; for (ci = 0; ci < 4; ci++) { i1 = xml_tag.indexOf("", i3); i2 = xml_tag.indexOf("", i3) + 8; i3 = i2 + 1; xml_subtag = xml_tag.mid(i1, i2 - i1); i1 = xml_subtag.indexOf(""); i2 = xml_subtag.indexOf(""); xml_subtag.remove(i2, 999); xml_subtag.remove(i1, 7); QTextStream ts(&xml_subtag, QIODevice::ReadOnly); ts >> xi >> yi; qDebug() << ci << " " << xi << " " << yi; objectPoints.setPoint(ci, xi, yi); } start = new DPoint(objectPoints.point(0)); end = new DPoint(objectPoints.point(1)); } } void GraphicObject::Render() { QColor c1; if (highlighted) c1 = QColor(255, 0, 0); else c1 = color; if (ot == TYPE_BEZIER) r->drawBezier(objectPoints, c1, false, style); if (ot == TYPE_GRAPHIC_LINE) r->drawLine(start->toQPoint(), end->toQPoint(), 1, GetColor(), 1); if (ot == TYPE_GRAPHIC_BONDMARK) r->drawLine(start->toQPoint(), end->toQPoint(), 1, GetColor(), 1); } void GraphicObject::Edit() { return; // it's not practical to edit any graphic objects this way /* BondEditDialog be(r, "bracket editor", start, end, TYPE_BRACKET, 0, 0, 0, style, color); if ( !be.exec() ) return; qDebug() << "change" ; style = be.Style(); color = be.Color(); */ } int GraphicObject::Type() { // real type is stored in style return TYPE_GRAPHIC_OBJECT; } bool GraphicObject::Find(DPoint *target) { if (start == target) return true; if (end == target) return true; return false; } // Do not allow connections to this object. // Simplest way to do this, I think, is to disallow this function DPoint *GraphicObject::FindNearestPoint(DPoint *target, double &dist) { dist = 99999.0; return 0; } Drawable *GraphicObject::FindNearestObject(DPoint *target, double &dist) { DPoint *tl = new DPoint; DPoint *tr = new DPoint; DPoint *bl = new DPoint; DPoint *br = new DPoint; double tl_x, tl_y, br_x, br_y, swp, dist1, dist2; tl_x = start->x; tl_y = start->y; br_x = end->x; br_y = end->y; if (tl_x < br_x) { swp = tl_x; tl_x = br_x; br_x = swp; } if (tl_y < br_y) { swp = tl_y; tl_y = br_y; br_y = swp; } tl->x = tl_x; tl->y = tl_y; bl->x = tl_x; bl->y = br_y; tr->x = br_x; tr->y = tl_y; br->x = br_x; br->y = br_y; dist1 = DistanceToLine(tl, bl, target); dist2 = DistanceToLine(tr, br, target); if (dist1 < dist2) dist = dist1; else dist = dist2; delete tl; delete tr; delete bl; delete br; return this; } void GraphicObject::setPoints(DPoint *s, DPoint *e) { start = s; end = e; } bool GraphicObject::isWithinRect(QRect n, bool /*shiftdown*/) { if (DPointInRect(start, n) && DPointInRect(end, n)) highlighted = true; else highlighted = false; return highlighted; } QRect GraphicObject::BoundingBox() { if (highlighted == false) return QRect(QPoint(999, 999), QPoint(0, 0)); int top, bottom, left, right, swp; top = (int)start->y; left = (int)start->x; bottom = (int)end->y; right = (int)end->x; if (bottom < top) { swp = top; top = bottom; bottom = swp; } if (right < left) { swp = left; left = right; right = swp; } return QRect(QPoint(left, top), QPoint(right, bottom)); } void GraphicObject::setPointArray(QPolygon inp1) { objectPoints = inp1; // kludge around lack opf Start and End in this object type/style start = new DPoint(objectPoints.point(0)); end = new DPoint(objectPoints.point(1)); } xdrawchem-v1.11.0/xdrawchem/gobject.h000066400000000000000000000037051371466245600175350ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // gobject.h -- subclass of Drawable for graphic objects #ifndef GOBJECT_H #define GOBJECT_H #include "dpoint.h" #include "drawable.h" #include "render2d.h" class QRect; class QString; class QPolygon; class GraphicObject : public Drawable { public: GraphicObject(Render2D *, QObject *parent = 0); GraphicObject *CloneTo(Drawable *target = nullptr) const; void Render(); // draw this object void Edit(); int Type(); // return type of object bool Find(DPoint *); // does this GraphicObject contain this DPoint? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void setPoints(DPoint *, DPoint *); void setPointArray(QPolygon); bool isWithinRect(QRect, bool); QRect BoundingBox(); QString ToXML(QString); QString ToCDXML(QString); void FromXML(QString); int Style() { return style; } void SetStyle(int s) { style = s; } int objectType() { return ot; } void setObjectType(int t) { ot = t; } private: // Renderer Render2D *r; // Point array (for cubic bezier and possibly others) QPolygon objectPoints; // graphic object type int ot; }; #endif xdrawchem-v1.11.0/xdrawchem/graphdata.h000066400000000000000000000021261371466245600200470ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef GRAPHDATA_H #define GRAPHDATA_H #include class GraphData { public: double value; QString label; QString fulltext; int intensity; bool drawlabel; QColor pcolor; GraphData() { drawlabel = false; intensity = 1; pcolor = QColor(0, 0, 0); } }; #endif xdrawchem-v1.11.0/xdrawchem/graphdialog.cpp000066400000000000000000000061631371466245600207350ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include "defs.h" #include "graphdata.h" #include "graphdialog.h" #include "helpwindow.h" #include "render2d.h" // defined in main.cpp extern QString RingDir; GraphDialog::GraphDialog(QWidget *parent, const QString &name) : QDialog(parent) { setWindowTitle(name); QGridLayout *dialogLayout = new QGridLayout(); setLayout(dialogLayout); g = new GraphWidget(); dialogLayout->addWidget(g, 0, 0, 1, 2); // g->setGeometry( 0, 0, 600, 500 ); // QPushButton *showhide = new QPushButton("Show/hide molecule", this); // showhide->setGeometry(20,320,150,40); // showhide->setPalette(QPalette(QPalette::Midlight)); QPushButton *qprint = new QPushButton(tr("Print"), this); connect(qprint, SIGNAL(clicked()), g, SLOT(Print())); dialogLayout->addWidget(qprint, 1, 0); QPushButton *qexport = new QPushButton(tr("Export Peak List"), this); connect(qexport, SIGNAL(clicked()), g, SLOT(Export())); dialogLayout->addWidget(qexport, 1, 1); QPushButton *qhelp = new QPushButton(tr("Help"), this); connect(qhelp, SIGNAL(clicked()), SLOT(SendHelp())); dialogLayout->addWidget(qhelp, 2, 0); QPushButton *qclose = new QPushButton(tr("Close"), this); connect(qclose, SIGNAL(clicked()), SLOT(accept())); dialogLayout->addWidget(qclose, 2, 1); if (name.contains("13C-NMR") > 0) g->setDataType(1); if (name.contains("IR") > 0) g->setDataType(2); if (name.contains("1H-NMR") > 0) g->setDataType(3); } void GraphDialog::AddPeak(double v1, QString l1, QString t1) { AddPeak(v1, QColor(0, 0, 0), l1, t1); } void GraphDialog::AddPeak(double v1, QColor c1, QString l1, QString t1) { if (v1 < 0) return; // negative indicates invalid peak. g->AddPeak(v1, c1, l1, t1); } void GraphDialog::AddPeak(double v1, int m1, QColor c1, QString l1, QString t1) { g->AddPeak(v1, m1, c1, l1, t1); } void GraphDialog::AddPixmap(QPixmap p1) { g->AddPixmap(p1); } void GraphDialog::SendHelp() { QString home, topic; topic = "spectra.html"; #ifdef UNIX home = RingDir + "doc/" + topic; #else home = RingDir + "doc\\" + topic; #endif HelpWindow *help = new HelpWindow(home, ".", 0); help->setWindowTitle(QString(XDC_VERSION) + " - Help viewer"); help->show(); } // cmake#include "graphdialog.moc" xdrawchem-v1.11.0/xdrawchem/graphdialog.h000066400000000000000000000025241371466245600203770ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef GRAPHDIALOG_H #define GRAPHDIALOG_H #include #include #include #include "graphdata.h" #include "graphwidget.h" class GraphDialog : public QDialog { Q_OBJECT public: GraphDialog(QWidget *parent, const QString &name); void AddPeak(double, QString l1 = "", QString t1 = ""); void AddPeak(double, QColor, QString l1 = "", QString t1 = ""); void AddPeak(double, int, QColor, QString l1 = "", QString t1 = ""); void AddPixmap(QPixmap); public slots: void SendHelp(); private: GraphWidget *g; }; #endif xdrawchem-v1.11.0/xdrawchem/graphwidget.cpp000066400000000000000000000142731371466245600207620ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // graphwidget.cpp - definitions for functions of class GraphWidget #include #include #include #include #include #include #include "defs.h" #include "graphdata.h" #include "graphwidget.h" #include "render2d.h" GraphWidget::GraphWidget(QWidget *parent) : QWidget(parent) { datatype = 0; output = 0; PrintSetup(); m_toclip = ""; } void GraphWidget::paintEvent(QPaintEvent *pe) { QPainter p; QString s, ft; bool cmp2 = false; int cx = 10, cy = 10; if (output == 0) p.begin(this); else p.begin(printer); if (p1.width() > 0) { p.drawPixmap(QPoint(10, 10), p1); cy = cy + p1.height() + 5; } if (datatype == 1) { // 13C-NMR cy = cy + 90; // draw baseline p.drawLine(QPoint(50, cy), QPoint(550, cy)); p.drawLine(QPoint(500, cy), QPoint(500, cy + 3)); p.drawText(QPoint(500, cy + 15), "0 ppm"); p.drawLine(QPoint(440, cy), QPoint(440, cy + 3)); p.drawText(QPoint(440, cy + 15), "20"); p.drawLine(QPoint(380, cy), QPoint(380, cy + 3)); p.drawText(QPoint(380, cy + 15), "40"); p.drawLine(QPoint(320, cy), QPoint(320, cy + 3)); p.drawText(QPoint(320, cy + 15), "60"); p.drawLine(QPoint(260, cy), QPoint(260, cy + 3)); p.drawText(QPoint(260, cy + 15), "80"); p.drawLine(QPoint(200, cy), QPoint(200, cy + 3)); p.drawText(QPoint(200, cy + 15), "100"); p.drawLine(QPoint(140, cy), QPoint(140, cy + 3)); p.drawText(QPoint(140, cy + 15), "120"); p.drawLine(QPoint(80, cy), QPoint(80, cy + 3)); p.drawText(QPoint(80, cy + 15), "140"); foreach (GraphData *tg, peaks) { int cx = 500 - (int)(tg->value * 3.0); int intense = tg->intensity * 30; if (intense > 90) intense = 90; p.setPen(tg->pcolor); p.drawLine(QPoint(cx, cy), QPoint(cx, cy - intense)); } cy = cy + 45; } if (datatype == 2) // IR cy = cy + 20; if (datatype == 3) { // 1H-NMR cy = cy + 90; // draw baseline p.drawLine(QPoint(50, cy), QPoint(550, cy)); p.drawLine(QPoint(500, cy), QPoint(500, cy + 3)); p.drawText(QPoint(500, cy + 15), "-2 ppm"); p.drawLine(QPoint(440, cy), QPoint(440, cy + 3)); p.drawText(QPoint(440, cy + 15), "0"); p.drawLine(QPoint(380, cy), QPoint(380, cy + 3)); p.drawText(QPoint(380, cy + 15), "2"); p.drawLine(QPoint(320, cy), QPoint(320, cy + 3)); p.drawText(QPoint(320, cy + 15), "4"); p.drawLine(QPoint(260, cy), QPoint(260, cy + 3)); p.drawText(QPoint(260, cy + 15), "6"); p.drawLine(QPoint(200, cy), QPoint(200, cy + 3)); p.drawText(QPoint(200, cy + 15), "8"); p.drawLine(QPoint(140, cy), QPoint(140, cy + 3)); p.drawText(QPoint(140, cy + 15), "10"); p.drawLine(QPoint(80, cy), QPoint(80, cy + 3)); p.drawText(QPoint(80, cy + 15), "12"); foreach (GraphData *tg, peaks) { int cx = 440 - (int)(tg->value * 30.0); int intense = tg->intensity * 10; if (intense > 90) intense = 90; p.setPen(tg->pcolor); p.drawLine(QPoint(cx, cy), QPoint(cx, cy - intense)); } cy = cy + 45; } foreach (GraphData *tg, peaks) { s.setNum(tg->intensity); ft = tg->fulltext; if (datatype == 1) { // 13C-NMR ft.append(", intensity "); ft.append(s); } p.setPen(tg->pcolor); if (tg->pcolor == QColor(0, 0, 255)) cmp2 = true; p.drawText(QPoint(cx, cy), ft); // And now to clipboard m_toclip += ft + "\n"; cy = cy + 15; } if (cmp2) { p.setPen(QColor(255, 0, 0)); p.drawText(QPoint(cx, cy), tr("Red is reactant")); cy = cy + 15; p.setPen(QColor(0, 0, 255)); p.drawText(QPoint(cx, cy), tr("Blue is product")); } p.end(); } void GraphWidget::PrintSetup() { printer = new QPrinter; printer->setFullPage(true); printer->setPageSize(QPrinter::Letter); printer->setOrientation(QPrinter::Portrait); printer->setColorMode(QPrinter::GrayScale); } void GraphWidget::Print() { qDebug() << "Graph::Print"; QPrintDialog dialog(printer, this); if (!dialog.exec()) { return; } output = 1; update(); output = 0; update(); } void GraphWidget::AddPeak(double v1, QColor c1, QString l1, QString t1) { GraphData *g1 = new GraphData; g1->value = v1; g1->fulltext = t1; g1->pcolor = c1; if (l1.isEmpty() == false) { g1->label = l1; g1->drawlabel = true; } // check for duplicate peaks foreach (GraphData *tg, peaks) { if (tg->value == v1) { tg->intensity++; return; } } peaks.append(g1); } void GraphWidget::AddPeak(double v1, int m1, QColor c1, QString l1, QString t1) { GraphData *g1 = new GraphData; g1->value = v1; g1->fulltext = t1; g1->pcolor = c1; g1->intensity = m1; if (l1.isEmpty() == false) { g1->label = l1; g1->drawlabel = true; } peaks.append(g1); } void GraphWidget::Export() { QClipboard *clip = QApplication::clipboard(); if (m_toclip != "") clip->setText(m_toclip); } // cmake#include "graphwidget.moc" xdrawchem-v1.11.0/xdrawchem/graphwidget.h000066400000000000000000000031501371466245600204170ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // graphwidget.h -- class definition for XDrawChem NMR/MS/IR graph widget. #ifndef GRAPHWIDGET_H #define GRAPHWIDGET_H #include #include #include class QPaintEvent; #include "graphdata.h" class GraphWidget : public QWidget { Q_OBJECT public: GraphWidget(QWidget *parent = 0); void setDataType(int x) { datatype = x; } void AddPeak(double, QColor, QString l1 = QString(), QString t1 = QString()); void AddPeak(double, int, QColor, QString l1 = QString(), QString t1 = QString()); void AddPixmap(QPixmap p) { p1 = p; } void PrintSetup(); public slots: void Print(); void Export(); protected: void paintEvent(QPaintEvent *); QString m_toclip; private: int datatype; int output; QList peaks; QPixmap p1; QPrinter *printer; }; #endif xdrawchem-v1.11.0/xdrawchem/helpwindow.cpp000066400000000000000000000141071371466245600206310ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include "defs.h" #include "helpwindow.h" #include "back.xpm" #include "forward.xpm" #include "home.xpm" HelpWindow::HelpWindow(const QString &home_, const QString &_path, QWidget *parent) : QMainWindow(parent), pathCombo(0), selectedURL() { setWindowIcon(QPixmap(":/icons/xdrawchem-icon.png")); browser = new QTextBrowser(this); // browser->setSearchPaths( _path ); browser->setFrameStyle(QFrame::Panel | QFrame::Sunken); connect(browser, SIGNAL(sourceChanged(const QUrl &)), this, SLOT(sourceChanged(const QUrl &))); setCentralWidget(browser); if (!home_.isEmpty()) browser->setSource(home_); connect(browser, SIGNAL(highlighted(const QString &)), statusBar(), SLOT(showMessage(const QString &))); resize(640, 700); QMenu *file = new QMenu(tr("&File"), this); file->addAction(tr("&Print"), this, SLOT(print()), QKeySequence::Print); file->addSeparator(); file->addAction(tr("&Close"), this, SLOT(close()), QKeySequence::Close); // The same three icons are used twice each. QIcon icon_back(QPixmap(":/icons/back.xpm")); QIcon icon_forward(QPixmap(":/icons/forward.xpm")); QIcon icon_home(QPixmap(":/icons/home.xpm")); QMenu *go = new QMenu(tr("&Go"), this); backwardAction = go->addAction(icon_back, tr("&Backward"), browser, SLOT(backward()), QKeySequence::MoveToPreviousPage); forwardAction = go->addAction(icon_forward, tr("&Forward"), browser, SLOT(forward()), QKeySequence::MoveToNextPage); homeAction = go->addAction(icon_home, tr("&Home"), browser, SLOT(home())); QMenu *help = new QMenu(tr("&Help"), this); help->addAction(tr("&About ..."), this, SLOT(about())); menuBar()->addMenu(file); menuBar()->addMenu(go); menuBar()->addMenu(help); forwardAction->setEnabled(false); backwardAction->setEnabled(false); connect(browser, SIGNAL(backwardAvailable(bool)), SLOT(setBackwardAvailable(bool))); connect(browser, SIGNAL(forwardAvailable(bool)), SLOT(setForwardAvailable(bool))); QToolBar *toolbar = new QToolBar(this); addToolBar(Qt::TopToolBarArea, toolbar); // QToolButton *button; toolbar->addAction(backwardAction); toolbar->addAction(forwardAction); toolbar->addAction(homeAction); toolbar->addSeparator(); pathCombo = new QComboBox(toolbar); pathCombo->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); connect(pathCombo, SIGNAL(activated(const QString &)), SLOT(pathSelected(const QString &))); toolbar->addWidget(pathCombo); pathCombo->addItem(home_); browser->setFocus(); } void HelpWindow::setBackwardAvailable(bool b) { backwardAction->setEnabled(b); } void HelpWindow::setForwardAvailable(bool b) { forwardAction->setEnabled(b); } void HelpWindow::sourceChanged(const QUrl &url) { if (browser->documentTitle().isNull()) setWindowTitle(QString(XDC_VERSION) + " - Help viewer"); else setWindowTitle(QString(XDC_VERSION) + " - Help viewer - " + browser->documentTitle()); // selectedURL = browser->context(); if (!url.isEmpty() && pathCombo) { int i = pathCombo->findText(url.path()); if (i == -1) { pathCombo->addItem(url.path(), 0); pathCombo->setCurrentIndex(0); } else pathCombo->setCurrentIndex(i); // selectedURL = QString(); } } HelpWindow::~HelpWindow() {} void HelpWindow::about() { QMessageBox::about(this, "HelpViewer Example", "

    This example implements a simple HTML help viewer " "using Qt's rich text capabilities

    " "

    It's just about 100 lines of C++ code, so don't " "expect too much :-)

    "); } void HelpWindow::print() { #ifndef QT_NO_PRINTER /* QPrinter printer; printer.setFullPage(TRUE); if ( printer.setup( this ) ) { QPainter p( &printer ); Q3PaintDeviceMetrics metrics(p.device()); int dpix = metrics.logicalDpiX(); int dpiy = metrics.logicalDpiY(); const int margin = 72; // pt QRect body(margin*dpix/72, margin*dpiy/72, metrics.width()-margin*dpix/72*2, metrics.height()-margin*dpiy/72*2 ); Q3SimpleRichText richText( browser->text(), QFont(), browser->context(), browser->styleSheet(), browser->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; do { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.drawText( view.right() - p.fontMetrics().width( QString::number(page) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) ); if ( view.top() >= richText.height() ) break; printer.newPage(); page++; } while (TRUE); }*/ #endif } void HelpWindow::pathSelected(const QString &_path) { browser->setSource(_path); } // cmake#include "helpwindow.moc" xdrawchem-v1.11.0/xdrawchem/helpwindow.h000066400000000000000000000026301371466245600202740ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef HELPWINDOW_H #define HELPWINDOW_H #include class QComboBox; class QTextBrowser; class QUrl; class HelpWindow : public QMainWindow { Q_OBJECT public: HelpWindow(const QString &home_, const QString &path, QWidget *parent = 0); ~HelpWindow(); private slots: void setBackwardAvailable(bool); void setForwardAvailable(bool); void sourceChanged(const QUrl &); void about(); void print(); void pathSelected(const QString &); private: QTextBrowser *browser; QComboBox *pathCombo; QAction *backwardAction, *forwardAction, *homeAction; QString selectedURL; }; #endif xdrawchem-v1.11.0/xdrawchem/home.xpm000066400000000000000000000010361371466245600174200ustar00rootroot00000000000000/* XPM */ /* Drawn by Mark Donohoe for the K Desktop Environment */ /* See http://www.kde.org */ static const char *home_xpm[]={ "16 16 4 1", "# c #000000", "a c #ffffff", "b c #c0c0c0", ". c None", "........... ....", " ....##.......", "..#...####......", "..#..#aabb#.....", "..#.#aaaabb#....", "..##aaaaaabb#...", "..#aaaaaaaabb#..", ".#aaaaaaaaabbb#.", "###aaaaaaaabb###", "..#aaaaaaaabb#..", "..#aaa###aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#####.######..", "................"}; xdrawchem-v1.11.0/xdrawchem/http.cpp000066400000000000000000000051151371466245600174270ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "http.h" HTTP::HTTP() { connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(downloadFinished(QNetworkReply *))); } HTTP::HTTP(QString url1) { finished = false; // url1 = "http://www.woodsidelabs.com/"; qDebug() << "HTTP:" << url1; manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(downloadFinished(QNetworkReply *))); QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url1))); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); #ifndef QT_NO_SSL connect(reply, SIGNAL(sslErrors(QList)), SLOT(sslErrors(QList))); #endif } void HTTP::slotError(const QNetworkReply::NetworkError e) { qDebug() << "An error happened!"; } void HTTP::doDownload(const QUrl &url) { qDebug() << "doDownload: " << url; QNetworkRequest request(url); QNetworkReply *reply = manager->get(request); #ifndef QT_NO_SSL connect(reply, SIGNAL(sslErrors(QList)), SLOT(sslErrors(QList))); #endif currentDownloads.append(reply); } void HTTP::execute(QString xurl) { QUrl url = QUrl::fromUserInput(xurl); doDownload(url); while (!finished) { qDebug() << "Waiting..."; } } void HTTP::sslErrors(const QList &sslErrors) { #ifndef QT_NO_SSL foreach (const QSslError &error, sslErrors) fprintf(stderr, "SSL error: %s\n", qPrintable(error.errorString())); #else Q_UNUSED(sslErrors); #endif } void HTTP::downloadFinished(QNetworkReply *reply) { replyText = reply->readAll(); qDebug() << "downloadFinished:" << replyText; currentDownloads.removeAll(reply); reply->deleteLater(); accept(); } QString HTTP::Data() { return replyText; } xdrawchem-v1.11.0/xdrawchem/http.h000066400000000000000000000031361371466245600170750ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef HTTP_H #define HTTP_H #include #include #include #include #include #include #include #include #include #include #include #include #include class QSslError; QT_USE_NAMESPACE class HTTP : public QDialog { Q_OBJECT QNetworkAccessManager *manager; QList currentDownloads; QString replyText; QString cUrl; bool finished; public: HTTP(); HTTP(QString); void doDownload(const QUrl &url); QString Data(); void execute(QString); public slots: void downloadFinished(QNetworkReply *reply); void slotError(QNetworkReply::NetworkError e); void sslErrors(const QList &errors); }; #endif xdrawchem-v1.11.0/xdrawchem/ioiface.cpp000066400000000000000000000205331371466245600200500ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2002 adam // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "application.h" #include "bond.h" #include "chemdata.h" #include "dpoint.h" #include "ioiface.h" #include "molecule.h" struct Point { double x, y; int idx; bool operator==(const Point &point) const { return (/*x == point.x && y == point.y*/ idx == point.idx); } bool operator<(const Point &point) const { return (x * x + y * y) < (point.x * point.x + point.y * point.y); } }; struct pt_cmp { bool operator()(const Point &one, const Point &two) const { return one < two; } }; using namespace OpenBabel; const char IOIface::symbol[110][4] = { "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", // 20 "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", // 40 "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", // 60 "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", // 80 "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", // 100 "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Uun"}; IOIface::IOIface(ChemData *cd, OBMol *mol) { chemdata = cd; obmol = mol; } IOIface::~IOIface() { // chemdata and obmol shouldn't be deleted in case // they are to be used later } void IOIface::setChemData(ChemData *cd) { chemdata = cd; } void IOIface::setOBMol(OBMol *mol) { obmol = mol; } bool IOIface::convertToChemData() { bool error = false; OBBond *bond; OBAtom *atom1, *atom2; DPoint *s, *e; Point point; Text *text; std::vector::iterator bonditr; std::map points; std::map::iterator itr; int i = 0; double x, y; /* look through bonds and store points found since ChemData::addBond() requires DPoint*, and not DPoint. */ for (bond = obmol->BeginBond(bonditr); bond; bond = obmol->NextBond(bonditr)) { atom1 = bond->GetBeginAtom(); atom2 = bond->GetEndAtom(); x = atom1->GetX(); x = (x + 5) * 15 + 100; y = atom1->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; point.idx = atom1->GetIdx(); itr = points.find(point); if (itr == points.end()) { // qInfo() << "atom1:idx " << atom1->GetIdx(); // std::cerr << "true"; i++; points[point] = new DPoint(x, y); } x = atom2->GetX(); x = (x + 5) * 15 + 100; y = atom2->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; point.idx = atom2->GetIdx(); itr = points.find(point); if (itr == points.end()) { // qInfo() << "atom2:idx " << atom2->GetIdx(); i++; points[point] = new DPoint(x, y); } } // qInfo() << "ioiface points: " << i; i = 0; /* use information from previous for-loop and add bonds and labels */ for (bond = obmol->BeginBond(bonditr); bond; bond = obmol->NextBond(bonditr)) { atom1 = bond->GetBeginAtom(); atom2 = bond->GetEndAtom(); // TODO: this should be configurable. if (atom1->GetAtomicNum() == 1) continue; // skip hydrogens for now if (atom2->GetAtomicNum() == 1) continue; // skip hydrogens for now x = atom1->GetX(); x = (x + 5) * 15 + 100; y = atom1->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; itr = points.find(point); s = (*itr).second; x = atom2->GetX(); x = (x + 5) * 15 + 100; y = atom2->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; itr = points.find(point); e = (*itr).second; int bondorder = bond->GetBondOrder(); // Invalid File if (!(atom1->GetAtomicNum() && atom2->GetAtomicNum())) { error = true; continue; } // set elements if (atom1->GetAtomicNum() != 6) { QString str(""); str += IOIface::symbol[atom1->GetAtomicNum() - 1]; str += ""; s->SetElementFromXML(str); } if (atom2->GetAtomicNum() != 6) { QString str(""); str += IOIface::symbol[atom2->GetAtomicNum() - 1]; str += ""; e->SetElementFromXML(str); } // qInfo() << "adding bond: " << atom1->GetIdx() << "|" << // atom2->GetIdx() << ", with order " << bondorder; chemdata->addBond(s, e, 1, bondorder, QColor("black"), true); i++; // label atoms if not Carbon if (atom1->GetAtomicNum() != 6) { text = new Text(chemdata->getRender2D()); QString str = IOIface::symbol[atom1->GetAtomicNum() - 1]; text->setPoint(s); text->setText(str); // str.fill(' '); // text->setTextMask(str); chemdata->addText(text); // qDebug() << "ioiface(1) text:" << str; } if (atom2->GetAtomicNum() != 6) { text = new Text(chemdata->getRender2D()); QString str = IOIface::symbol[atom2->GetAtomicNum() - 1]; text->setPoint(e); text->setText(str); // str.fill(' '); // text->setTextMask(str); text->setJustify(JUSTIFY_CENTER); chemdata->addText(text); // qDebug() << "ioiface(2) text:" << str; } } // qInfo() << "ioiface added bonds: " << i; return error; } // // TODO :) // bool IOIface::convertToOBMol() { QList allpoints; QList allbonds; DPoint *tmp_atom; Bond *tmp_bond; Molecule *this_mol; // now, this might not always do what the user wants but most file // formats can only save one molecule. So, let's get the first molecule // from the ChemData and do that. this_mol = chemdata->firstMolecule(); allpoints = this_mol->AllPoints(); allbonds = this_mol->AllBonds(); // adapted from openbabel/mdl.cpp, most similar format to this... // (i.e., MDL is atom list followed by bond list) obmol->BeginModify(); obmol->ReserveAtoms(allpoints.count()); char type[5]; vector3 v; OBAtom atom; foreach (tmp_atom, allpoints) { v.SetX(tmp_atom->x); v.SetY(tmp_atom->y); v.SetZ(tmp_atom->z); atom.SetVector(v); atom.SetAtomicNum(tmp_atom->getAtomicNumber()); strcpy(type, tmp_atom->baseElement().toLatin1()); atom.SetType(type); // atom.SetType( tmp_atom->baseElement().toLatin1() ); if (!obmol->AddAtom(atom)) return (false); atom.Clear(); } int start, end, order, flag, bst; foreach (tmp_bond, allbonds) { flag = 0; start = allpoints.indexOf(tmp_bond->Start()) + 1; end = allpoints.indexOf(tmp_bond->End()) + 1; order = tmp_bond->Order(); bst = tmp_bond->Stereo(); if (bst == STEREO_UP) flag |= OB_WEDGE_BOND; if (bst == STEREO_DOWN) flag |= OB_HASH_BOND; if (!obmol->AddBond(start, end, order, flag)) return (false); } obmol->EndModify(); return true; } // eof xdrawchem-v1.11.0/xdrawchem/ioiface.h000066400000000000000000000026371371466245600175220ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2002 Adam Tenderholt // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // Interface between ChemData and OELib #ifndef _IOIFACE_H #define _IOIFACE_H #include "chemdata.h" #include #include #include #include using namespace OpenBabel; class IOIface { public: IOIface(ChemData *cd = 0, OBMol *mol = 0); ~IOIface(); static const char symbol[110][4]; void setChemData(ChemData *cd); void setOBMol(OBMol *mol); bool convertToChemData(); bool convertToOBMol(); private: ChemData *chemdata; OBMol *obmol; }; #endif // eof xdrawchem-v1.11.0/xdrawchem/main.cpp000066400000000000000000000140401371466245600173710ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include "application.h" #include "clipboard.h" #include "defs.h" #include "dyk.h" #include "prefs.h" QString RingDir, HomeDir; QTextStream out(stdout); Preferences preferences; void usage(); // defined below int main(int argc, char **argv) { int ae; // parse command line options QStringList cmds; QString infile, outfile; bool loadflag = false, pngflag = false, quitflag = false, helpflag = false, versionflag = false, tflag = false, to3dflag = false; for (int c1 = 0; c1 < argc; c1++) { cmds.append(argv[c1]); } if (cmds.count() > 1) { foreach (QString arg, cmds) { qDebug() << arg << ":"; if (arg == "-h") { helpflag = true; continue; } if (arg == "--help") { helpflag = true; continue; } if (arg == "-v") { versionflag = true; continue; } if (arg == "--version") { versionflag = true; continue; } if (arg == "-t") { tflag = true; continue; } if (arg == "-png") { pngflag = true; outfile = arg; continue; } if (arg == "-3d") { to3dflag = true; outfile = arg; continue; } loadflag = true; infile = arg; } } if (helpflag) usage(); if (versionflag) { out << XDC_VERSION << Qt::endl; exit(0); } QApplication a(argc, argv); // set library directory (RingDir = default RINGHOME) QString dname(RINGHOME); if (dname.right(1) != QString("/")) dname.append(QString("/")); // dname.append( "ring/" ); qInfo() << "appDirPath::" << QApplication::applicationDirPath(); QString altdname = QApplication::applicationDirPath(); if (altdname.contains("Contents/MacOS")) { dname = altdname.replace("Contents/MacOS", "Contents/Resources"); if (dname.right(1) != QString("/")) dname.append(QString("/")); } if (altdname.contains("Program Files")) { dname = altdname; if (dname.right(1) != QString("/")) dname.append(QString("/")); dname.append("ring/"); } qInfo() << "dname = " << dname; RingDir = QApplication::applicationDirPath().replace("bin", "ring/"); // set home directory/pref file and fallback dir/pref file #ifdef UNIX HomeDir = getenv("HOME"); QString cRingDir = HomeDir; cRingDir.append("/.xdrawchem/"); preferences.setCustomRingDir(cRingDir); HomeDir = HomeDir + "/.xdrawchemrc"; preferences.setSaveFile(HomeDir); QFile f1(HomeDir); if (f1.open(QIODevice::ReadOnly) == false) { HomeDir = RingDir + "xdrawchemrc"; preferences.setFile(HomeDir, true); } else { f1.close(); preferences.setFile(HomeDir, false); } #else // Windows, Mac? HomeDir = "xdrawchemrc"; preferences.setCustomRingDir(RingDir); preferences.setSaveFile(HomeDir); QFile f1(HomeDir); if (f1.open(QIODevice::ReadOnly) == false) { HomeDir = RingDir + "xdrawchemrc"; preferences.setFile(HomeDir, true); } else { f1.close(); preferences.setFile(HomeDir, false); } #endif if (preferences.LoadPrefs() == false) { qWarning() << "Unable to load preferences file"; preferences.Defaults(); } // translation file for application strings QTranslator translator; translator.load(QString::fromLatin1("xdrawchem_") + QLocale::system().name(), RingDir); a.installTranslator(&translator); ApplicationWindow *mw = new ApplicationWindow; mw->setWindowTitle(QString(XDC_VERSION) + QString(" - ") + mw->tr("untitled")); if (loadflag) mw->load(infile); mw->show(); if (pngflag) { mw->ni_savefile = outfile; mw->ni_tflag = tflag; QTimer::singleShot(0, mw, SLOT(savePNG())); } if (to3dflag) { mw->ni_savefile = outfile; mw->ni_tflag = tflag; QTimer::singleShot(0, mw, SLOT(save3D())); } if (quitflag) exit(0); // exit if non-interactive mode. a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); mw->HideTextButtons(); if (preferences.getDYK()) { DYKDialog dyk1; dyk1.exec(); } ae = a.exec(); if (preferences.SavePrefs() == false) { qWarning() << "Unable to save preferences file"; } return ae; } void usage() { out << XDC_VERSION << Qt::endl; out << "Usage:" << Qt::endl; out << " xdrawchem [input file] [options]" << Qt::endl; out << "Command line options:" << Qt::endl; out << "-png : Create a PNG image of input file and exit" << Qt::endl; out << "-t: Make transparent PNG (also specify -png)" << Qt::endl; out << "-3d: Make 3D model of input file (output MDL mofile)" << Qt::endl; out << "-h, --help: Display this help" << Qt::endl; out << "-v, --version: Display the version information" << Qt::endl; exit(0); } xdrawchem-v1.11.0/xdrawchem/moldata.h000066400000000000000000000277141371466245600175470ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // moldata.h -- class MolData knows how to calculate molecular weights // and partial charges #ifndef MOLDATA_H #define MOLDATA_H #include #include #include #include class MolData { public: static double NameToMW(QString e) { if (e.toUpper() == QString("H")) return 1.00794; if (e.toUpper() == QString("HE")) return 4.0026; if (e.toUpper() == QString("LI")) return 6.941; if (e.toUpper() == QString("B")) return 10.811; if (e.toUpper() == QString("C")) return 12.011; if (e.toUpper() == QString("N")) return 14.0067; if (e.toUpper() == QString("O")) return 15.9994; if (e.toUpper() == QString("F")) return 18.9984; if (e.toUpper() == QString("NA")) return 22.98977; if (e.toUpper() == QString("MG")) return 24.305; if (e.toUpper() == QString("SI")) return 28.0855; if (e.toUpper() == QString("P")) return 30.97376; if (e.toUpper() == QString("S")) return 32.066; if (e.toUpper() == QString("CL")) return 35.4527; if (e.toUpper() == QString("K")) return 39.0983; if (e.toUpper() == QString("SE")) return 78.96; if (e.toUpper() == QString("BR")) return 79.904; if (e.toUpper() == QString("I")) return 126.9045; return 6.0; } static double MW(QString x) { qDebug() << "Request for MW of " << x; // parse this string QString iso; // isotope MW QString thiselement; // current element QString repeatnum; // number of repeats int ptr = 0; // cursor position (pointer) in x int isoflag = false; // isotope-override normal MW lookup if MW specified double this_mw; // MW of this element int repeat = 1; // number of this atom double mw_out = 0.0; // MW returned QStringList tokens; do { iso.remove(0, 999); thiselement.remove(0, 999); repeatnum.remove(0, 999); // Check if token starts with a number if (x.at(ptr).isNumber() == true) { // read isotope value isoflag = true; iso.append(x.at(ptr)); ptr++; if (x.at(ptr).isNumber() == true) { iso.append(x.at(ptr)); ptr++; } if (x.at(ptr).isNumber() == true) { iso.append(x.at(ptr)); ptr++; } } // ptr now points to first letter of element thiselement.append(x.at(ptr)); ptr++; // if next letter is lowercase, add it too if (x.at(ptr).category() == QChar::Letter_Lowercase) { thiselement.append(x.at(ptr)); ptr++; } // if next character is number, it's the subscript if (x.at(ptr).isNumber() == true) { repeatnum.append(x.at(ptr)); ptr++; if (x.at(ptr).isNumber() == true) { repeatnum.append(x.at(ptr)); ptr++; } if (x.at(ptr).isNumber() == true) { repeatnum.append(x.at(ptr)); ptr++; } repeat = repeatnum.toInt(); } // Move to next letter/number if (ptr < x.length()) { if (x.at(ptr).isSpace() == true) ptr++; } if (isoflag) this_mw = iso.toDouble(); else this_mw = NameToMW(thiselement); // add to molecular weight mw_out = mw_out + (repeat * this_mw); isoflag = false; repeat = 1; } while (ptr < x.length()); qDebug() << "MW = " << mw_out; return mw_out; } // How many bonds (hydrogens) should this element or group have? static int Hydrogens(QString x) { qDebug() << "Request for bonds/hydrogens to |" << x << "|"; // first check 'special' patterns if (x.toUpper().contains("TIPS") == 1) return 1; if (x.toUpper().contains("TMS") == 1) return 1; if (x.toUpper().contains("MS") == 1) return 1; if (x == "CO") return 2; if (x == "SO") return 2; if (x == "AcO") return 1; if (x == "MeO") return 1; if (x == "EtO") return 1; if (x == "TsO") return 1; if (x == "BnO") return 1; if (x == "BzO") return 1; if (x == "TBSO") return 1; if (x == "OAc") return 1; if (x == "OMe") return 1; if (x == "OEt") return 1; if (x == "OTs") return 1; if (x == "OBn") return 1; if (x == "OBz") return 1; if (x == "OTBS") return 1; if (x == "NO2") return 1; if (x == "O2N") return 1; if (x == "CH3") return 1; if (x == "OH") return 1; if (x == "HO") return 1; if (x == "CHO") return 1; if (x == "COOH") return 1; if (x == "HOOC") return 1; if (x == "CN") return 1; if (x == "NH2") return 1; if (x == "H2N") return 1; if (x == "NH") return 2; if (x == "HN") return 2; if (x == "O-") return 1; if (x == "-O") return 1; QString firstelement; // element to consider bool flag = false; // Find first element for (QChar letter : x) { if (letter.isLetter()) { firstelement.append(letter); flag = true; } else if (letter.isLower() && flag) { firstelement.append(letter); break; } else if (flag) { break; } } firstelement = firstelement.toUpper(); if (firstelement == QString("H")) return 1; if (firstelement == QString("HE")) return 0; if (firstelement == QString("LI")) return 1; if (firstelement == QString("B")) return 3; if (firstelement == QString("C")) return 4; if (firstelement == QString("N")) return 3; if (firstelement == QString("O")) return 2; if (firstelement == QString("F")) return 1; if (firstelement == QString("NA")) return 1; if (firstelement == QString("MG")) return 2; if (firstelement == QString("SI")) return 4; if (firstelement == QString("CL")) return 1; if (firstelement == QString("K")) return 1; if (firstelement == QString("SE")) return 2; if (firstelement == QString("BR")) return 1; if (firstelement == QString("I")) return 1; // these could cause problems if (firstelement == QString("P")) return 3; if (firstelement == QString("S")) return 2; // if not known... return 1; } static double partialCharge(QString /*ident*/, int /*method*/) { double ret_pc; ret_pc = 0.0; return ret_pc; } static double bondLength(int el1, int el2, int order) { // make el1 the smaller element (by atomic number) int swp; if (el1 > el2) { swp = el1; el1 = el2; el2 = swp; } if (order == 1) { if (el1 == 1) { if (el2 == 6) { return 1.09; } if (el2 == 7) { return 1.01; } if (el2 == 8) { return 0.96; } } if (el1 == 6) { if (el2 == 6) { return 1.54; } if (el2 == 7) { return 1.47; } if (el2 == 8) { return 1.43; } if (el2 == 9) { return 1.35; } if (el2 == 16) { return 1.82; } if (el2 == 17) { return 1.77; } if (el2 == 35) { return 1.94; } if (el2 == 53) { return 2.14; } } if (el1 == 7) { if (el2 == 8) { } } } if (order == 2) { if (el1 == 6) { if (el2 == 6) { return 1.34; } if (el2 == 7) { } if (el2 == 8) { } } } if (order == 3) { if (el1 == 6) { if (el2 == 6) { return 1.20; } if (el2 == 7) { } } } return 1.54; } static double bondAngleDegrees(int el1, int neighbors) { if (el1 == 6) { if (neighbors == 1) return 0.0; if (neighbors == 2) return 180.0; if (neighbors == 3) return 120.0; if (neighbors == 4) return 109.47; } if (el1 == 7) { if (neighbors == 1) return 180.0; if (neighbors == 2) return 120.0; if (neighbors == 3) return 109.47; } if (el1 == 8) { if (neighbors == 1) return 180.0; if (neighbors == 2) return 120.0; } if (el1 == 14) { if (neighbors == 1) return 0.0; if (neighbors == 2) return 180.0; if (neighbors == 3) return 120.0; if (neighbors == 4) return 109.47; } if (el1 == 15) { if (neighbors == 1) return 180.0; if (neighbors == 2) return 120.0; if (neighbors == 3) return 109.47; } if (el1 == 16) { if (neighbors == 1) return 180.0; if (neighbors == 2) return 120.0; } return 109.47; } // important! maht.h expects angles in radians! static double bondAngle(int el1, int neighbors) { double retvald, retval; retvald = bondAngleDegrees(el1, neighbors); retval = retvald * 3.14159 / 180.0; return retval; } }; #endif xdrawchem-v1.11.0/xdrawchem/molecule.cpp000066400000000000000000001104331371466245600202550ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule.cpp - Molecule's implementation of functions #include "molecule.h" #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "moldata.h" #include "render2d.h" #include "text.h" Molecule::Molecule(Render2D *r1, QObject *parent) : Drawable(parent) { r = r1; text_mw = 0; text_formula = 0; group_type = GROUP_NONE; showPC = false; // peaklist.setAutoDelete(true); // bonds.setAutoDelete(true); // labels.setAutoDelete(true); // symbols.setAutoDelete(true); } Molecule *Molecule::CloneTo(Drawable *target) const { if (!target) target = new Molecule(r, parent()); Molecule *t = static_cast(this->Drawable::CloneTo(target)); QMap pmap; for (Bond *b : bonds) { if (!b->Highlighted()) continue; if (!pmap.contains(b->Start())) pmap[b->Start()] = new DPoint(b->Start()); if (!pmap.contains(b->End())) pmap[b->End()] = new DPoint(b->End()); } // t->cd = cd; for (Bond *bond : bonds) { if (bond->Highlighted()) t->addBond(pmap[bond->Start()], pmap[bond->End()], bond->Thick(), bond->Order(), bond->GetColor(), true); } for (Text *text : labels) { Text *newtext = text->CloneTo(); t->addText(newtext); } for (Symbol *s : symbols) { t->addSymbol(s->CloneTo()); } if (text_mw) t->text_mw = text_mw->CloneTo(); if (text_formula) t->text_formula = text_formula->CloneTo(); t->nc = nc; t->nh = nh; t->no = no; t->nn = nn; t->nmw = nmw; t->group_type = group_type; t->group_id = group_id; t->protonMagEnvList = protonMagEnvList; t->protonFinalList = protonFinalList; t->showPC = showPC; t->atomRxns = atomRxns; t->bondRxns = bondRxns; // May need to be copied: // QList tomove; // QList up; // SSSR this_sssr; return t; } // implement more cleanup here Molecule::~Molecule() { qDeleteAll(peaklist); peaklist.clear(); } void Molecule::Render() { /// collect all points AllPoints(); /// update double bond states int nleft = 0, nright = 0; double ang; for (Bond *tb2 : bonds) { if (tb2->Order() == 2) { nleft = 0; nright = 0; for (Bond *tmp_bond : bonds) { if (tmp_bond == tb2) continue; if (tmp_bond->Find(tb2->Start())) { ang = Angle(tb2, tmp_bond); if (ang < 180.0) nleft++; else nright++; } if (tmp_bond->Find(tb2->End())) { ang = Angle(tb2, tmp_bond); if (ang < 180.0) nleft++; else nright++; } } if (nleft > nright) tb2->RenderSide(0); else tb2->RenderSide(1); } } // draw group box if needed if (group_type != GROUP_NONE) { QRect gb1 = BoundingBoxAll(); gb1.setLeft(gb1.left() - 6); gb1.setRight(gb1.right() + 6); gb1.setBottom(gb1.bottom() + 6); r->drawLine(gb1.topLeft(), gb1.bottomLeft(), 1, QColor(0, 0, 0), 0); r->drawLine(gb1.bottomLeft(), gb1.bottomRight(), 1, QColor(0, 0, 0), 0); r->drawLine(gb1.bottomRight(), gb1.topRight(), 1, QColor(0, 0, 0), 0); QPoint tl1(gb1.topLeft().x() + 2, gb1.topLeft().y() - 4); QString label1; if (group_type == GROUP_REACTANT) label1 = tr("Reactant"); if (group_type == GROUP_PRODUCT) label1 = tr("Product"); r->drawString(label1, tl1, QColor(0, 0, 0), QFont("times", 8)); } for (Bond *tmp_bond : bonds) tmp_bond->Render(); for (Text *tmp_text : labels) { // ignore if just "C" // if (tmp_text->getText() == "C") continue; tmp_text->Render(); } CalcOffsets(); for (Symbol *tmp_sym : symbols) tmp_sym->Render(); } // Calculate offsets, i.e., where to put a Symbol. void Molecule::CalcOffsets() { bool top = true, bottom = true, left = true, right = true; DPoint *op; double ang; for (Symbol *tmp_sym : symbols) { top = true; bottom = true; left = true; right = true; DPoint *tmp_pt = tmp_sym->Start(); for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) { op = tmp_bond->otherPoint(tmp_pt); ang = tmp_bond->getAngle(tmp_pt, op); if ((ang > 300.0) || (ang < 60.0)) right = false; if ((ang > 30.0) && (ang < 150.0)) bottom = false; if ((ang > 120.0) && (ang < 240.0)) left = false; if ((ang > 210.0) && (ang < 330.0)) top = false; } } if (bottom == true) { tmp_sym->SetOffset(QPoint(0, 12)); tmp_sym->SetRotate(0.0); continue; } if (top == true) { tmp_sym->SetOffset(QPoint(0, -12)); tmp_sym->SetRotate(180.0); continue; } if (right == true) { tmp_sym->SetOffset(QPoint(12, 0)); tmp_sym->SetRotate(-90.0); continue; } if (left == true) { tmp_sym->SetOffset(QPoint(-12, 0)); tmp_sym->SetRotate(90.0); continue; } tmp_sym->SetOffset(QPoint(0, 12)); } } int Molecule::Type() { return TYPE_MOLECULE; } bool Molecule::Find(DPoint *target) { for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(target) == true) return true; } return false; } bool Molecule::isWithinRect(QRect qr, bool shiftdown) { if (shiftdown) qDebug() << "shiftdown"; bool ret = false; for (Bond *tmp_bond : bonds) { if (tmp_bond->isWithinRect(qr, false)) ret = true; } if ((ret == true) && (shiftdown == true)) { qDebug() << "selectall"; SelectAll(); return false; } for (Text *tmp_text : labels) tmp_text->isWithinRect(qr, false); for (Symbol *tmp_sym : symbols) tmp_sym->isWithinRect(qr, false); return false; } void Molecule::SelectAll() { for (Bond *tmp_bond : bonds) tmp_bond->SelectAll(); for (Text *tmp_text : labels) tmp_text->SelectAll(); for (Symbol *tmp_sym : symbols) tmp_sym->SelectAll(); } void Molecule::DeselectAll() { for (Bond *tmp_bond : bonds) tmp_bond->DeselectAll(); for (Text *tmp_text : labels) tmp_text->DeselectAll(); for (Symbol *tmp_sym : symbols) tmp_sym->DeselectAll(); } void Molecule::SetColorIfHighlighted(QColor c) { for (Bond *tmp_bond : bonds) tmp_bond->SetColorIfHighlighted(c); for (Text *tmp_text : labels) tmp_text->SetColorIfHighlighted(c); for (Symbol *tmp_sym : symbols) tmp_sym->SetColorIfHighlighted(c); } // Copy Text labels into DPoint::element (needed esp. by save, CalcMW, // NMR prediction...) void Molecule::CopyTextToDPoint() { for (Text *tmp_text : labels) { DPoint *tmp_pt = tmp_text->Start(); tmp_pt->element = tmp_text->getText(); // clear aromaticity here tmp_pt->aromatic = false; } } QRect Molecule::BoundingBoxAll() { QRect fr; SelectAll(); fr = BoundingBox(); DeselectAll(); return fr; } bool Molecule::WithinBounds(DPoint *target) { QRect fr = BoundingBoxAll(); return fr.contains(target->toQPoint()); } // Determine if split is necessary (e.g., if this structure contains two // or more fragments). Return empty list if not, return new Molecule's // if needed QList Molecule::MakeSplit() { // QList up; QList pointqueue; QList uo; QList removequeue; QList molecules; Molecule *nm; DPoint *current; uo = bonds; // Start with first Bond... nm = new Molecule(r); nm->SetChemdata(cd); Bond *tmp_bond = uo.first(); nm->addBond(tmp_bond); uo.removeFirst(); pointqueue.append(tmp_bond->Start()); pointqueue.append(tmp_bond->End()); do { do { current = pointqueue.first(); pointqueue.removeFirst(); for (Bond *tmp_bond : uo) { if (tmp_bond->Find(current)) { pointqueue.append(tmp_bond->otherPoint(current)); nm->addBond(tmp_bond); removequeue.append(tmp_bond); } } for (Bond *tmp_bond : removequeue) { uo.removeAll(tmp_bond); } removequeue.clear(); } while (pointqueue.count() > 0); if (uo.count() > 0) { // Still bonds left, make new Molecule molecules.append(nm); nm = new Molecule(r); nm->SetChemdata(cd); tmp_bond = uo.first(); nm->addBond(tmp_bond); uo.removeFirst(); pointqueue.append(tmp_bond->Start()); pointqueue.append(tmp_bond->End()); } } while (uo.count() > 0); molecules.append(nm); qDebug() << nm->Members(); // Now split Text and Symbol lists if (molecules.count() > 1) { for (Text *tmp_text : labels) { foreach (nm, molecules) { if (nm->Find(tmp_text->Start())) nm->addText(tmp_text); } } for (Symbol *tmp_sym : symbols) { foreach (nm, molecules) { if (nm->Find(tmp_sym->Start())) nm->addSymbol(tmp_sym); } } } return molecules; } // Create and return a list of all unique DPoint's in this Molecule QList Molecule::AllPoints() { QList pl; DPoint *tmp_pt; for (Bond *tmp_bond : bonds) { tmp_pt = tmp_bond->Start(); if (pl.contains(tmp_pt) == 0) pl.append(tmp_pt); tmp_pt = tmp_bond->End(); if (pl.contains(tmp_pt) == 0) pl.append(tmp_pt); } for (Text *tmp_text : labels) { tmp_pt = tmp_text->Start(); if (pl.contains(tmp_pt) == 0) pl.append(tmp_pt); } // Copy Text labels to DPoint's as needed CopyTextToDPoint(); // Determine number of substituents at each point int c1 = 0; for (DPoint *tmp_pt : pl) { tmp_pt->serial = c1; // serialize atoms c1++; tmp_pt->hit = false; // also reset "hit" tmp_pt->substituents = 0; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) tmp_pt->substituents = tmp_pt->substituents + tmp_bond->Order(); } } // serialize atoms -- copy list place to serial field of DPoint // for (int c1 = 0; c1 < pl.count(); c1++) { // tmp_pt = pl.at(c1); // tmp_pt->serial = c1; // tmp_pt->hit = false; // also reset "hit" //} // qDebug() << "AllPoints():" << pl.count() ; return pl; } // Create and return a list of all unique Drawable's in this Molecule QList Molecule::AllObjects() { QList dl; up = AllPoints(); for (Bond *tmp_bond : bonds) { dl.append((Drawable *)tmp_bond); } for (Text *tmp_text : labels) { dl.append((Drawable *)tmp_text); } for (Symbol *tmp_sym : symbols) { dl.append((Drawable *)tmp_sym); } return dl; } QList Molecule::AllBonds() { // this should be safe, right? ioiface.cpp should use this read-only... :) return bonds; } QList Molecule::AllLabels() { return labels; } // Create a list of unique DPoints to move void Molecule::MakeTomoveList() { tomove.clear(); for (Bond *tmp_bond : bonds) { if (tmp_bond->Highlighted()) { DPoint *tmp_pt = tmp_bond->Start(); if (tomove.contains(tmp_pt) == 0) tomove.append(tmp_pt); tmp_pt = tmp_bond->End(); if (tomove.contains(tmp_pt) == 0) tomove.append(tmp_pt); } } for (Text *tmp_text : labels) { if (tmp_text->Highlighted()) { DPoint *tmp_pt = tmp_text->Start(); if (tomove.contains(tmp_pt) == 0) tomove.append(tmp_pt); } } for (Symbol *tmp_sym : symbols) { if (tmp_sym->Highlighted()) { DPoint *tmp_pt = tmp_sym->Start(); if (tomove.contains(tmp_pt) == 0) tomove.append(tmp_pt); } } } void Molecule::Move(double dx, double dy) { MakeTomoveList(); for (DPoint *tmp_pt : tomove) { tmp_pt->x += dx; tmp_pt->y += dy; } } void Molecule::Rotate(DPoint *origin, double angle) { MakeTomoveList(); for (DPoint *tmp_pt : tomove) { double thisx = tmp_pt->x - origin->x; double thisy = tmp_pt->y - origin->y; double newx = thisx * cos(angle) + thisy * sin(angle); double newy = -thisx * sin(angle) + thisy * cos(angle); tmp_pt->x = newx + origin->x; tmp_pt->y = newy + origin->y; } Changed(); } // rotate about center of molecule void Molecule::Rotate(double angle) { MakeTomoveList(); double centerx = 0.0, centery = 0.0; int n = 0; for (DPoint *tmp_pt : tomove) { centerx += tmp_pt->x; centery += tmp_pt->y; n++; } centerx /= (double)n; centery /= (double)n; for (DPoint *tmp_pt : tomove) { double thisx = tmp_pt->x - centerx; double thisy = tmp_pt->y - centery; double newx = thisx * cos(angle) + thisy * sin(angle); double newy = -thisx * sin(angle) + thisy * cos(angle); tmp_pt->x = newx + centerx; tmp_pt->y = newy + centery; } Changed(); } void Molecule::Flip(DPoint *origin, int direction) { MakeTomoveList(); double delta; for (DPoint *tmp_pt : tomove) { if (direction == FLIP_H) { delta = tmp_pt->x - origin->x; tmp_pt->x = tmp_pt->x - 2 * delta; } else { // direction == FLIP_V delta = tmp_pt->y - origin->y; tmp_pt->y = tmp_pt->y - 2 * delta; } } } void Molecule::Resize(DPoint *origin, double scale) { double dx, dy; MakeTomoveList(); for (DPoint *tmp_pt : tomove) { dx = tmp_pt->x - origin->x; dy = tmp_pt->y - origin->y; dx *= scale; dy *= scale; tmp_pt->x = origin->x + dx; tmp_pt->y = origin->y + dy; } } QRect Molecule::BoundingBox() { int top = 99999, bottom = 0, left = 99999, right = 0; QRect tmprect; for (Bond *tmp_bond : bonds) { tmprect = tmp_bond->BoundingBox(); if (tmprect.isValid()) { if (tmprect.left() < left) left = tmprect.left(); if (tmprect.right() > right) right = tmprect.right(); if (tmprect.top() < top) top = tmprect.top(); if (tmprect.bottom() > bottom) bottom = tmprect.bottom(); } } for (Text *tmp_text : labels) { tmprect = tmp_text->BoundingBox(); if (tmprect.isValid()) { if (tmprect.left() < left) left = tmprect.left(); if (tmprect.right() > right) right = tmprect.right(); if (tmprect.top() < top) top = tmprect.top(); if (tmprect.bottom() > bottom) bottom = tmprect.bottom(); } } return QRect(QPoint(left, top), QPoint(right, bottom)); } DPoint *Molecule::FindNearestPoint(DPoint *target, double &dist) { DPoint *nearest = 0, *d1; double mindist = 99999.0, d1dist = 999999.0; for (Bond *tmp_bond : bonds) { d1 = tmp_bond->FindNearestPoint(target, d1dist); if (d1dist < mindist) { mindist = d1dist; nearest = d1; } } dist = mindist; if (!nearest) return 0; nearest->other = 0; bool already_found = false; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(nearest) == true) { if (already_found == true) { nearest->other = 0; return nearest; } else { already_found = true; nearest->other = tmp_bond->otherPoint(nearest); nearest->otherBond = tmp_bond; } } } // check text objects to see if nearest point has a label // if it does, then don't select this point. // for (tmp_text=labels.first(); tmp_text != 0; tmp_text = labels.next()) { // if (tmp_text->Start() == nearest) dist = 9999.0; //} return nearest; } Drawable *Molecule::FindNearestObject(DPoint *target, double &dist) { Drawable *nearest = 0, *d1; double mindist = 999999.0, d1dist = 999999.0; for (Bond *tmp_bond : bonds) { d1 = tmp_bond->FindNearestObject(target, d1dist); if (d1dist < mindist) { mindist = d1dist; nearest = d1; } } // if on Text label, highlight it... for (Text *tmp_text : labels) { if (tmp_text->WithinBounds(target)) { nearest = tmp_text; dist = 0.01; return nearest; } } // if on Symbol, highlight it... for (Symbol *tmp_sym : symbols) { if (tmp_sym->WithinBounds(target)) { nearest = tmp_sym; dist = 0.01; return nearest; } } dist = mindist; return nearest; } void Molecule::addBond(DPoint *s, DPoint *e, int thick, int order, QColor c, bool hl) { int o, p; Bond *b = new Bond(r); b->setPoints(s, e); b->setThick(thick); if (preferences.getBondCenter() == true) { b->setDoubleBondAuto(0); b->setDoubleBondAlign(2); } if (order != 99) { b->setOrder(order); } else { b->setDash(1); b->setOrder(1); } if (order == 4) { /// MDL molfiles store aromaticity this way b->setDash(1); b->setOrder(2); } b->SetColor(c); if (hl) b->Highlight(true); /// check if bond exists before adding for (Bond *tmp_bond : bonds) { if (*tmp_bond == *b) { o = tmp_bond->Order(); p = tmp_bond->Dash(); if (o < 3) tmp_bond->setOrder(o + 1); if (order == 99) tmp_bond->setDash(p + 1); Changed(); return; } } bonds.append(b); Changed(); } // shortcut addBond void Molecule::addBond(Bond *b) { // but only add if it's not already there. if (bonds.count(b) == 0) bonds.append(b); Changed(); } // add a text label void Molecule::addText(Text *t) { // remove Text associated with this point, if any DPoint *findpt = t->Start(); for (Text *tmp_text : labels) { if (tmp_text->Start() == findpt) { labels.removeAll(tmp_text); break; } } t->setMolecule(this); labels.append(t); Changed(); } // add a Symbol void Molecule::addSymbol(Symbol *s) { symbols.append(s); Changed(); } // add a molecule to this one. The Drawable passed had better be a Molecule! void Molecule::addMolecule(Drawable *m1) { // qInfo() << "Molecule::addMolecule"; int i = 0; /*for ( tmp_bond = m1->bondsFirst(); tmp_bond != 0; tmp_bond = m1->bondsNext() ) { bonds.append( tmp_bond ); i++; }*/ i = bonds.count(); bonds.append(((Molecule *)m1)->AllBonds()); // qInfo() << "Merged bonds: " << (bonds.count() - i); /*for ( tmp_text = m1->labelsFirst(); tmp_text != 0; tmp_text = m1->labelsNext() ) { tmp_text->setMolecule( this ); labels.append( tmp_text ); i++; }*/ i = labels.count(); labels.append(((Molecule *)m1)->AllLabels()); // qInfo() << "Merged labels: " << (labels.count() - i); Changed(); } // Erase bool Molecule::Erase(Drawable *d) { int removed; bool retval = false; if (d->Type() == TYPE_BOND) { Bond *tmp_bond = (Bond *)d; if (bonds.contains(tmp_bond)) { if ((tmp_bond->Order() == 2) || (tmp_bond->Order() == 3)) { tmp_bond->setOrder(tmp_bond->Order() - 1); if (tmp_bond->Dash() > 0) tmp_bond->setDash(tmp_bond->Dash() - 1); Changed(); return true; } else { removed = bonds.removeAll(tmp_bond); if (removed > 0) delete d; retval = removed; } } } else { // deleting TEXT or SYMBOL if (d->Type() == TYPE_TEXT) { removed = labels.removeAll((Text *)d); if (removed > 0) { d->Start()->element = "C"; delete d; } return removed; } if (d->Type() == TYPE_SYMBOL) { removed = symbols.removeAll((Symbol *)d); if (removed > 0) delete d; return removed; } } if (retval == false) return false; Changed(); return true; } // Erase selected items void Molecule::EraseSelected() { QList removebonds; QList removetext; QList removesym; for (Bond *tmp_bond : bonds) { if (tmp_bond->Highlighted() == true) { removebonds.append(tmp_bond); } } for (Bond *tmp_bond : removebonds) { bonds.removeAll(tmp_bond); delete tmp_bond; } for (Text *tmp_text : labels) { if (tmp_text->Highlighted() == true) { removetext.append(tmp_text); } } for (Text *tmp_text : removetext) { labels.removeAll(tmp_text); delete tmp_text; } for (Symbol *tmp_sym : symbols) { if (tmp_sym->Highlighted() == true) { removesym.append(tmp_sym); } } for (Symbol *tmp_sym : removesym) { symbols.removeAll(tmp_sym); delete tmp_sym; } Changed(); } // XML (XDrawChem format) representation of this Molecule QString Molecule::ToXML(QString xml_id) { QString s(""); QList up; QList uo; QString n1, nfull; int n = 0; up = AllPoints(); uo = AllObjects(); if (up.count() == 0) return s; // don't write an empty file // Copy text from Text objects to element field in DPoint // also copy Symbol descriptions for (Drawable *tmp_draw : uo) { tmp_draw->Start()->hit = false; if (tmp_draw->Type() == TYPE_TEXT) { Text *tmp_text = (Text *)tmp_draw; // is this cheating? tmp_text->Start()->element = tmp_text->getText(); tmp_text->Start()->elementmask = tmp_text->getRichText(); tmp_text->Start()->color = tmp_text->GetColor(); tmp_text->Start()->font = tmp_text->getFont(); tmp_text->Start()->hit = true; } if (tmp_draw->Type() == TYPE_SYMBOL) { Symbol *tmp_sym = (Symbol *)tmp_draw; tmp_sym->Start()->symbol = tmp_sym->GetSymbol(); } } // begin Molecule s.append("\n"); if (group_type != GROUP_NONE) { s.append(""); if (group_type == GROUP_REACTANT) s.append("reactant"); if (group_type == GROUP_PRODUCT) s.append("product"); s.append("\n"); } // Add XML ID's to DPoint's, write as we go for (DPoint *tmp_pt : up) { n1.setNum(n); nfull = QString("a") + n1; tmp_pt->id = nfull; n++; s.append("id); s.append("\">\n"); s.append(""); s.append(tmp_pt->element); s.append("\n"); s.append(""); s.append(tmp_pt->elementmask); s.append("\n"); if (tmp_pt->hit) s.append("yes\n"); if (tmp_pt->symbol.length() > 1) { s.append(""); s.append(tmp_pt->symbol); s.append("\n"); } s.append(""); n1.setNum(tmp_pt->x); s.append(n1); s.append(" "); n1.setNum(tmp_pt->y); s.append(n1); s.append("\n"); // write color s.append(""); n1.setNum(tmp_pt->color.red()); s.append(n1); s.append(" "); n1.setNum(tmp_pt->color.green()); s.append(n1); s.append(" "); n1.setNum(tmp_pt->color.blue()); s.append(n1); s.append("\n"); // write font s.append(""); s.append(tmp_pt->font.family()); s.append(QString("#")); n1.setNum(tmp_pt->font.pointSize()); s.append(n1); s.append("\n"); s.append("\n"); } // add XML ID's to Bond's, write as we go n = 0; for (Drawable *tmp_draw : uo) { if (tmp_draw->Type() == TYPE_BOND) { Bond *tmp_bond = (Bond *)tmp_draw; // I ask again, is this cheating? n1.setNum(n); nfull = QString("b") + n1; tmp_draw->setID(nfull); n++; s.append("getID()); s.append("\">\n"); s.append(tmp_bond->Start()->id); s.append("\n"); s.append(tmp_bond->End()->id); s.append("\n"); s.append(""); n1.setNum(tmp_bond->Order()); s.append(n1); s.append("\n"); s.append(""); n1.setNum(tmp_bond->Dash()); s.append(n1); s.append("\n"); // write thickness s.append(""); n1.setNum(tmp_bond->Thick()); s.append(n1); s.append("\n"); // write color s.append(""); n1.setNum(tmp_bond->GetColor().red()); s.append(n1); s.append(" "); n1.setNum(tmp_bond->GetColor().green()); s.append(n1); s.append(" "); n1.setNum(tmp_bond->GetColor().blue()); s.append(n1); s.append("\n"); s.append("\n"); } } s.append("\n"); return s; } // XML (ChemDraw(TM) format) representation of this Molecule QString Molecule::ToCDXML(QString xml_id) { QString s(""); QList up; QList uo; QString n1, nfull; int n = xml_id.toInt() + 1; up = AllPoints(); uo = AllObjects(); if (up.count() == 0) return s; // don't write an empty file // also copy Symbol descriptions for (Drawable *tmp_draw : uo) { if (tmp_draw->Type() == TYPE_SYMBOL) { Symbol *tmp_sym = (Symbol *)tmp_draw; tmp_sym->Start()->symbol = tmp_sym->GetSymbol(); } } // begin Molecule s.append("\n"); // Add XML ID's to DPoint's, write as we go for (DPoint *tmp_pt : up) { n1.setNum(n); tmp_pt->id = n1; n++; s.append("id); s.append("\" p=\""); n1.setNum(tmp_pt->x); s.append(n1); s.append(" "); n1.setNum(tmp_pt->y); s.append(n1); s.append("\""); if (tmp_pt->element == "C") { s.append("/>\n"); } else { s.append(">"); s.append(tmp_pt->element); s.append("\n"); } } // add XML ID's to Bond's, write as we go for (Drawable *tmp_draw : uo) { if (tmp_draw->Type() == TYPE_BOND) { Bond *tmp_bond = (Bond *)tmp_draw; // I ask again, is this cheating? n1.setNum(n); tmp_draw->setID(n1); n++; s.append("getID()); s.append("\" B=\""); s.append(tmp_bond->Start()->id); s.append("\" E=\""); s.append(tmp_bond->End()->id); if (tmp_bond->Order() < 4) { s.append("\" Order=\""); n1.setNum(tmp_bond->Order()); s.append(n1); } if (tmp_bond->Order() == 5) { s.append("\" Display=\"WedgeBegin"); } if (tmp_bond->Order() == 7) { s.append("\" Display=\"WedgedHashBegin"); } s.append("\"/>\n"); } } s.append("\n"); return s; } // Generate MDL Molfile to export to generate SMILES, export for 3-D QString Molecule::ToMDLMolfile(int coords) { QTextDocument localtextdocument; QList up; // Q3PtrList uo; QString tmpline; int acount = 0, bcount = 0; /// get all unique points and objects up = AllPoints(); QString molfile; QTextStream t(&molfile, QIODevice::WriteOnly); t.setPadChar(' '); t.setFieldAlignment(QTextStream::AlignRight); /// write first three lines -- blank, unless we want to add comments etc. t << Qt::endl << Qt::endl << Qt::endl; /// find counts... acount += up.size(); // foreach (tmp_pt, up) { acount++; } bcount = bonds.count(); // write counts line t.setFieldWidth(3); t << acount << bcount << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "1"; t.setFieldWidth(6); t << "V2000" << Qt::endl; // Write atom list for (DPoint *tmp_pt : up) { localtextdocument.setHtml(tmp_pt->element); tmpline = localtextdocument.toPlainText(); // probably should strip H here, since it confuses OB if (tmpline.contains("H")) { tmpline = tmpline.replace("H", "").replace("2", "").replace("3", "").replace("4", ""); } for (int i = tmpline.length(); i < 3; ++i) tmpline.append(' '); t.setFieldWidth(10); t << tmp_pt->x << -tmp_pt->y << "0.0000"; if (coords != 0) t << tmp_pt->z; t.setFieldWidth(4); t << tmpline; // Element + 2 characters for monoisotope t.setFieldWidth(0); t << "0 0 0 0 0 0 0 0 0 0 0 0" << Qt::endl; } // write bond list for (Bond *tmp_bond : bonds) { t.setFieldWidth(3); t << up.indexOf(tmp_bond->Start()) + 1; t.setFieldWidth(3); t << up.indexOf(tmp_bond->End()) + 1; t.setFieldWidth(3); t << tmp_bond->Order(); if (tmp_bond->Order() < 4) t << " 0 0 0 0"; if (tmp_bond->Order() == 5) t << " 1 0 0 0"; if (tmp_bond->Order() == 7) t << " 6 0 0 0"; t << Qt::endl; } t << "M END"; qInfo() << "molfile: " << molfile; return molfile; } void Molecule::FromXML(QString xml_tag) { QString bondtag, subtag, startid, endid; QList points; DPoint *s1, *e1; int i1, i2; i1 = xml_tag.indexOf(""); if (i1 > 0) { subtag = xml_tag.mid(i1, 20); if (subtag.toLower().contains("reactant") > 0) group_type = GROUP_REACTANT; if (subtag.toLower().contains("product") > 0) group_type = GROUP_PRODUCT; } // Extract atom's do { i1 = xml_tag.indexOf("") + 7; if (i1 >= 0) { DPoint *tmp_pt = new DPoint; tmp_pt->FromXML(xml_tag.mid(i1, i2 - i1)); points.append(tmp_pt); xml_tag.remove(i1, i2 - i1); } else { break; } } while (1); // Add bond's do { i1 = xml_tag.indexOf("") + 7; if (i1 >= 0) { Bond *tmp_bond = new Bond(r); bondtag = xml_tag.mid(i1, i2 - i1); xml_tag.remove(i1, i2 - i1); qDebug() << bondtag; // parse Start i1 = bondtag.indexOf(""); i2 = bondtag.indexOf("") + 8; subtag = bondtag.mid(i1, i2 - i1); i1 = subtag.indexOf(""); i2 = subtag.indexOf(""); subtag.remove(i2, 999); subtag.remove(i1, 7); for (DPoint *tmp_pt : points) { if (tmp_pt->id == subtag) { s1 = tmp_pt; break; } } // parse End i1 = bondtag.indexOf(""); i2 = bondtag.indexOf("") + 6; subtag = bondtag.mid(i1, i2 - i1); i1 = subtag.indexOf(""); i2 = subtag.indexOf(""); subtag.remove(i2, 999); subtag.remove(i1, 5); for (DPoint *tmp_pt : points) { if (tmp_pt->id == subtag) { e1 = tmp_pt; break; } } // add points tmp_bond->setPoints(s1, e1); // parse Order i1 = bondtag.indexOf(""); i2 = bondtag.indexOf("") + 8; subtag = bondtag.mid(i1, i2 - i1); i1 = subtag.indexOf(""); i2 = subtag.indexOf(""); subtag.remove(i2, 999); subtag.remove(i1, 7); tmp_bond->setOrder(subtag.toInt()); // parse Dash i1 = bondtag.indexOf(""); i2 = bondtag.indexOf("") + 7; subtag = bondtag.mid(i1, i2 - i1); i1 = subtag.indexOf(""); i2 = subtag.indexOf(""); subtag.remove(i2, 999); subtag.remove(i1, 6); tmp_bond->setDash(subtag.toInt()); // parse thickness i1 = bondtag.indexOf(""); i2 = bondtag.indexOf("") + 8; subtag = bondtag.mid(i1, i2 - i1); i1 = subtag.indexOf(""); i2 = subtag.indexOf(""); subtag.remove(i2, 999); subtag.remove(i1, 7); tmp_bond->setThick(subtag.toInt()); // parse Dash i1 = bondtag.indexOf(""); i2 = bondtag.indexOf("") + 8; subtag = bondtag.mid(i1, i2 - i1); tmp_bond->SetColor(GetColorFromXML(subtag)); bonds.append(tmp_bond); } else { break; } } while (1); // add Text and Symbol as needed for (DPoint *tmp_pt : points) { if ((tmp_pt->element != QString("C")) || (tmp_pt->hit == true)) { Text *tmp_text = new Text(r); tmp_text->setPoint(tmp_pt); tmp_text->SetColor(tmp_pt->color); tmp_text->setFont(tmp_pt->font); tmp_text->setText(tmp_pt->elementmask); if (tmp_pt->elementmask.length() > 0) { // tmp_text->setTextMask( tmp_pt->elementmask ); } else { tmp_pt->element.fill(' '); // tmp_text->setTextMask( tmp_pt->element ); } labels.append(tmp_text); } if (tmp_pt->symbol.length() > 0) { Symbol *tmp_sym = new Symbol(r); tmp_sym->setPoint(tmp_pt); tmp_sym->SetSymbol(tmp_pt->symbol); symbols.append(tmp_sym); } } } // update MW and formula void Molecule::Changed() { // add hydrogens and correct labels // qDebug() << "changed" ; AddHydrogens(); return; } xdrawchem-v1.11.0/xdrawchem/molecule.h000066400000000000000000000162441371466245600177270ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule.h -- subclass of Drawable which contains a molecule #ifndef MOLECULE_H #define MOLECULE_H #include #include #include #include #include #include using namespace OpenBabel; #include "bond.h" #include "chemdata.h" #include "dpoint.h" #include "drawable.h" #include "molecule_sssr.h" #include "peak.h" #include "render2d.h" #include "symbol.h" #include "text.h" #include "tooldialog.h" class Molecule : public Drawable { public: Molecule(Render2D *, QObject *parent = 0); Molecule *CloneTo(Drawable *target = nullptr) const; ~Molecule(); Render2D *getRender2D() { return r; } void SetChemdata(ChemData *cd1) { cd = cd1; } void Render(); // draw this object int Type(); // return type of object bool Find(DPoint *); // is this DPoint present in this Molecule? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void addBond(DPoint *, DPoint *, int, int, QColor, bool hl = false); void addBond(Bond *); void addText(Text *); void addSymbol(Symbol *); void CopyTextToDPoint(); void CalcOffsets(); void addMolecule(Drawable *); Bond *bondsFirst() { return bonds.first(); } // Bond *bondsNext() { return bonds.next(); } Text *labelsFirst() { if (!labels.isEmpty()) return labels.first(); else return 0; } // Text *labelsNext() { return labels.next(); } bool Erase(Drawable *); void EraseSelected(); bool isWithinRect(QRect, bool); bool WithinBounds(DPoint *); void SelectAll(); void DeselectAll(); void SetColorIfHighlighted(QColor); void Move(double, double); void Rotate(DPoint *, double); void Rotate(double); void Flip(DPoint *, int); void Resize(DPoint *, double); QRect BoundingBox(); QRect BoundingBoxAll(); QList AllPoints(); QList AllObjects(); QList AllBonds(); QList AllLabels(); QList MakeSplit(); int Members() { return bonds.count(); } QString ToXML(QString); QString ToCDXML(QString); QString ToMDLMolfile(int coords = 0); void FromXML(QString); void Changed(); // defined in molecule_tools.cpp Bond *FindBond(DPoint *, DPoint *); int OrderOfBond(DPoint *, DPoint *); void Reactivity(int); // molecule_tools_2.cpp for now QList BreakRingBonds(DPoint *); DPoint *GetRingAttachPoint(); DPoint *GetAttachPoint(QString); double CalculateRingAttachAngle(DPoint *); void FindHybridization(); void setGroupType(int); Text *CalcMW(bool from_change = false); Text *CalcEmpiricalFormula(bool from_mw = false); Text *CalcElementalAnalysis(bool show_dialog = true); QStringList Calc13CNMR(bool show_dialog = true); void CalcIR(); QString CalcName(); // actually returns canonical SMILES // QString GetCASNumber(); // QString IUPAC_Name(); void AllNeighbors(); void MakeSSSR(); void AddHydrogens(bool to_carbon = false); double SumBondEnthalpy(); void Scale(double bond_length = -1.0); void AddPeak(double, QString, QString); void Make3DVersion(QString fn3d = ""); void CalcpKa(); double CalcPartialCharge(QString); double CalcKOW(); // defined in molecule_1h_nmr.cpp QStringList Calc1HNMR(bool show_dialog = true); void AddNMRprotons(); void RemoveNMRprotons(); void ProtonEnvironment(); void Multiplicity_1HNMR(); void Calc1HMultiplicityAndIntensity(); double Calc1HShift(QString); // defined in molecule_smiles.cpp void CleanUp(); void SDG(bool); QString ToSMILES(); void FromSMILES(QString); QString ToInChI(); void FromInChI(QString); // defined in retro.cpp QString BuildReactionList(QString); int Retro(); QString RetroTraverseBonds(DPoint *, DPoint *, Bond *, int); QString RetroAtomName(DPoint *); QString RetroBondName(Bond *, bool runsssr = false); bool RetroMatch(QString, QString); bool RetroTreeMatch(QString, QString, QString, QString); // defined here: bool isInGroup() { if (group_type != GROUP_NONE) return true; return false; } int groupType() { return group_type; } void FormulaLabelDeleted() { qDebug() << "FLD"; text_formula = 0; } void MWLabelDeleted() { text_mw = 0; } double Angle(Bond *a1, Bond *b1) { // from Bond a1 to Bond b1 // determine endpoints DPoint *a, *c, *b; if (a1->Start() == b1->Start()) { c = a1->Start(); a = a1->End(); b = b1->End(); } if (a1->Start() == b1->End()) { c = a1->Start(); a = a1->End(); b = b1->Start(); } if (a1->End() == b1->Start()) { c = a1->End(); b = a1->Start(); a = b1->End(); } if (a1->End() == b1->End()) { c = a1->End(); b = a1->Start(); a = b1->Start(); } double ang1 = getAngle(c, a); double ang2 = getAngle(c, b); double ang3 = ang1 - ang2; if (ang3 < 0.0) ang3 += 360.0; return ang3; } OBMol *convertToOBMol(); bool convertFromOBMol(OBMol *); static const char symbol[110][4]; // not appropriate but best way to handle ToolDialog requests. QList peaklist; private: // Renderer Render2D *r; // ChemData ChemData *cd; // list of elements which make up this molecule QList bonds; QList labels; QList symbols; // Text objects which hold MW and formula Text *text_mw, *text_formula; // list of unique points used by Move(), Resize(), Rotate(), and // function to fill it void MakeTomoveList(); QList tomove; // used for elemental analysis (set by CalcEmpiricalFormula) double nc, nh, no, nn, nmw; // Molecule's SSSR SSSR this_sssr; // point list for SDG, etc. QList up; // group data int group_type; int group_id; // proton magnetic environment list(s) QStringList protonMagEnvList; QStringList protonFinalList; // render partial charges? bool showPC; // reactivity info QStringList atomRxns, bondRxns; }; #endif xdrawchem-v1.11.0/xdrawchem/molecule_1h_nmr.cpp000066400000000000000000000431731371466245600215270ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule_1h_nmr.cpp - Molecule's implementation of (more) functions #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "graphdialog.h" #include "moldata.h" #include "molecule.h" #include "molinfodialog.h" #include "render2d.h" // SSSR (see comments in this file) #include "molecule_sssr.h" QStringList Molecule::Calc1HNMR(bool show_dialog) { QStringList peak_list; int c1, c2, c3, mul, inten; double shift1; QString n1, nfull, ntemp; // get list of unique points up = AllPoints(); // find aromatic rings MakeSSSR(); // add hydrogens qDebug() << bonds.count(); AddNMRprotons(); up = AllPoints(); // need to re-run after adding protons qDebug() << bonds.count(); // assign magnetic environment ProtonEnvironment(); // determine multiplicity and chirality Multiplicity_1HNMR(); // sort lists and calculate spectrum Calc1HMultiplicityAndIntensity(); // remove added hydrogens RemoveNMRprotons(); qDebug() << bonds.count(); GraphDialog *g = new GraphDialog(r, tr("Predicted 1H-NMR")); peaklist.clear(); // print (for now) list of NMR values for (QStringList::Iterator it = protonFinalList.begin(); it != protonFinalList.end(); ++it) { ntemp = *it; c1 = ntemp.indexOf(','); c2 = ntemp.indexOf(',', c1 + 1); c3 = ntemp.indexOf(',', c2 + 1); shift1 = ntemp.mid(0, c1).toDouble(); nfull = ""; n1.setNum(shift1); nfull = n1 + " ppm"; nfull = nfull + tr(" Intensity: ") + ntemp.mid(c1 + 1, c2 - c1 - 1); nfull = nfull + tr(" Multiplicity: ") + ntemp.mid(c2 + 1, c3 - c2 - 1); inten = ntemp.mid(c1 + 1, c2 - c1 - 1).toInt(); mul = ntemp.mid(c2 + 1, c3 - c2 - 1).toInt(); Peak *tmp_peak = new Peak; tmp_peak->value = shift1; tmp_peak->intensity = inten; tmp_peak->multiplicity = mul; tmp_peak->comment = nfull; peaklist.append(tmp_peak); g->AddPeak(shift1, mul, QColor(0, 0, 0), QString("peak"), nfull); } if (show_dialog == true) g->show(); return protonFinalList; } void Molecule::AddNMRprotons() { DPoint *new_proton; int h, ct, sumbonds; QString orig_element; double ox, oy; for (DPoint *tmp_pt : up) { orig_element = tmp_pt->element; ox = tmp_pt->x; oy = tmp_pt->y; if (orig_element == "H") continue; if (orig_element == "") orig_element = "C"; sumbonds = 0; h = 0; // remove protons and charges for (ct = 0; ct < orig_element.length(); ct++) { if (orig_element[ct] == 'H') { orig_element.remove(ct, 1); ct = 0; } if (orig_element[ct] == '+') { orig_element.remove(ct, 1); ct = 0; } if (orig_element[ct] == '-') { orig_element.remove(ct, 1); ct = 0; } if (orig_element[ct].isNumber() == true) { orig_element.remove(ct, 1); ct = 0; } } // find order of bonds for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) { if (tmp_bond->Order() < 4) sumbonds += tmp_bond->Order(); else sumbonds += 1; // order 5 and 7 (stereo) and order 1 bonds } } h = MolData::Hydrogens(orig_element) - sumbonds; if (h < 0) h = 0; for (ct = 0; ct < h; ct++) { Bond *tmp_bond = new Bond(r); new_proton = new DPoint; new_proton->element = "H"; new_proton->nmr_proton = true; new_proton->x = ox; new_proton->y = oy; tmp_bond->setPoints(tmp_pt, new_proton); bonds.append(tmp_bond); } } } void Molecule::RemoveNMRprotons() { QMutableListIterator it(bonds); while (it.hasNext()) { if (it.next()->End()->nmr_proton) { delete it.value(); it.remove(); } } } /// Do depth-first search to identify magnetic environment /// Essentially, assign a HOSE-style code to each proton. void Molecule::ProtonEnvironment() { int adj_protons; DPoint *depth1_pt, *depth2_pt, *depth3_pt; QList search_stack; // depth 2 atoms QString nearest, r1, r2, r3, r_current, depth3_str; QStringList rgroups, depth3list; int rnext = 0; protonMagEnvList.clear(); for (DPoint *tmp_pt : up) { tmp_pt->protonHOSECode = ""; rgroups.clear(); r1 = ""; r2 = ""; r3 = ""; r_current = ""; rnext = 0; adj_protons = 1; tmp_pt->H1_multiplicity = 0; search_stack.clear(); if (tmp_pt->element != "H") continue; /// first, find atom this proton is connected to (depth 1) for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) { depth1_pt = tmp_bond->otherPoint(tmp_pt); nearest = depth1_pt->baseElement(); if ((depth1_pt->inring == true) && (depth1_pt->aromatic == true)) nearest.append("A"); if ((depth1_pt->inring == true) && (depth1_pt->aromatic == false)) nearest.append("R"); break; } } /// now, find depth 2 atoms and put in list for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(depth1_pt)) { depth2_pt = tmp_bond->otherPoint(depth1_pt); // qDebug() << "DEPTH2: "<< depth2_pt->element ; if (depth2_pt == tmp_pt) continue; search_stack.append(depth2_pt); depth2_pt->serial = tmp_bond->Order(); } } /// determine R groups foreach (depth2_pt, search_stack) { r_current = ""; if ((depth2_pt->serial == 2) && (depth2_pt->aromatic == false)) r_current = "="; if (depth2_pt->serial == 3) r_current = "#"; r_current.append(depth2_pt->baseElement()); if (depth2_pt->aromatic == true) r_current.append("A"); depth3list.clear(); for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(depth2_pt)) { depth3_pt = tmp_bond->otherPoint(depth2_pt); if (depth3_pt == depth1_pt) continue; // qDebug() << "DEPTH3: "<< depth3_pt->element ; depth3_str = ""; if ((tmp_bond->Order() == 2) && (depth3_pt->aromatic == false)) depth3_str = "="; if (tmp_bond->Order() == 3) depth3_str = "#"; depth3_str.append(depth3_pt->baseElement()); depth3list.append(depth3_str); } } depth3list.sort(); for (QStringList::Iterator it1 = depth3list.begin(); it1 != depth3list.end(); ++it1) { r_current.append(*it1); } rgroups.append(r_current); } rgroups.sort(); for (QStringList::Iterator it2 = rgroups.begin(); it2 != rgroups.end(); ++it2) { nearest.append("("); nearest.append(*it2); nearest.append(")"); if (r1 == "") { r1 = *it2; continue; } if (r2 == "") { r2 = *it2; continue; } if (r3 == "") { r3 = *it2; continue; } } // check for chirality if ((r1 != r2) && (r2 != r3) && (r1 != r3) && (r1 != "H") && (r1 != "") && (r2 != "") && (r3 != "") && (r2 != "H") && (r3 != "H") && (nearest.left(1) == "C") && (nearest.left(2) != "CA")) { nearest.prepend("*"); } tmp_pt->protonHOSECode = nearest; qDebug() << "env:" << nearest; } } /// Do depth-first search to find adjacent protons (H at depth 2 and 3) void Molecule::Multiplicity_1HNMR() { int adj_protons; bool split, chiral; DPoint *depth1_pt, *depth2_pt, *depth3_pt; QString new_magenv; QList search_stack; // depth 2 atoms for (DPoint *tmp_pt : up) { /// chiral atoms should implicitly be split... if (tmp_pt->protonHOSECode.count("*") > 0) { protonMagEnvList.append(tmp_pt->protonHOSECode); continue; } adj_protons = 1; split = false; chiral = false; tmp_pt->H1_multiplicity = 0; search_stack.clear(); if (tmp_pt->element != "H") continue; /// first, find atom this proton is connected to (depth 1) for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) { depth1_pt = tmp_bond->otherPoint(tmp_pt); break; } } /// now, find depth 2 atoms and put in list for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(depth1_pt)) { depth2_pt = tmp_bond->otherPoint(depth1_pt); // qDebug() << "DEPTH2: "<< depth2_pt->element ; if (depth2_pt->element == "H") adj_protons += 0; else search_stack.append(depth2_pt); } } // qDebug() << "Stack: " << search_stack.count() ; /// now find depth 3 protons for (DPoint *depth2_pt : search_stack) { for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(depth2_pt)) { depth3_pt = tmp_bond->otherPoint(depth2_pt); // qDebug() << "DEPTH3: "<< depth3_pt->element ; if (depth3_pt->element == "H") { adj_protons++; if (depth3_pt->protonHOSECode != tmp_pt->protonHOSECode) split = true; } } } } tmp_pt->H1_multiplicity = adj_protons; qDebug() << "1H_mult = " << adj_protons; new_magenv = tmp_pt->protonHOSECode; if (split) { new_magenv.prepend("+"); } else { new_magenv.prepend("-"); } protonMagEnvList.append(new_magenv); qDebug() << "Magnetic environment: " << new_magenv; } // for (tmp_pt...) } void Molecule::Calc1HMultiplicityAndIntensity() { QString current_nmr, tmp_nmr, rev_nmr, n1, chiralnote; int int_count = 1, multi = 0; bool first_time = true; protonFinalList.clear(); protonMagEnvList.sort(); for (QStringList::Iterator it2 = protonMagEnvList.begin(); it2 != protonMagEnvList.end(); ++it2) { tmp_nmr = *it2; if (first_time == true) { first_time = false; current_nmr = tmp_nmr; continue; } if (tmp_nmr != current_nmr) { rev_nmr = current_nmr; rev_nmr.replace(QRegExp("\\(H\\)"), ""); qDebug() << "rev_nmr = " << rev_nmr; multi = rev_nmr.count('H') + 1; if (rev_nmr.count('-') > 0) multi = 1; // chirality? chiralnote = ""; if (rev_nmr.count('*') > 0) { qDebug() << "Oh no! Chiral center!"; chiralnote = " (chiral)"; } rev_nmr = current_nmr; rev_nmr.prepend(","); rev_nmr.prepend(chiralnote); n1.setNum(multi); rev_nmr.prepend(n1); n1.setNum(int_count); rev_nmr.prepend(","); rev_nmr.prepend(n1); rev_nmr.prepend(","); n1.setNum(Calc1HShift(current_nmr)); rev_nmr.prepend(n1); protonFinalList.append(rev_nmr); current_nmr = tmp_nmr; int_count = 1; } else { int_count++; } } rev_nmr = current_nmr; rev_nmr.replace(QRegExp("\\(H\\)"), ""); multi = rev_nmr.count('H') + 1; if (rev_nmr.count('-') > 0) multi = 1; // chirality? chiralnote = ""; if (rev_nmr.count('*') > 0) { qDebug() << "Oh no! Chiral center!"; chiralnote = " (chiral)"; } rev_nmr = current_nmr; rev_nmr.prepend(","); rev_nmr.prepend(chiralnote); n1.setNum(multi); rev_nmr.prepend(n1); n1.setNum(int_count); rev_nmr.prepend(","); rev_nmr.prepend(n1); rev_nmr.prepend(","); n1.setNum(Calc1HShift(current_nmr)); rev_nmr.prepend(n1); protonFinalList.append(rev_nmr); current_nmr = tmp_nmr; int_count = 0; qDebug() << Qt::endl << "Proton final list:"; for (QStringList::Iterator it = protonFinalList.begin(); it != protonFinalList.end(); ++it) { qDebug() << *it; } } // // everything below this point probably belongs in a separate file. // // proton types used in identification #define PROTON_CH 10 #define PROTON_CH_AROMATIC 20 #define PROTON_CH2 30 #define PROTON_CH2_RING 40 #define PROTON_CH3 50 #define PROTON_NH 60 #define PROTON_NH2 70 #define PROTON_OH 80 #define PROTON_SH 90 double Molecule::Calc1HShift(QString phc) { QString substr, nearest, r1, r2, r3; int l1, l2, rcount, nearest_code, protons; double base_shift; l1 = phc.indexOf('+'); if (l1 < 0) l1 = phc.indexOf('-'); if (l1 < 0) l1 = phc.indexOf('*'); substr = phc.mid(l1 + 1); qDebug() << "1H shift of " << substr; // identify base type: extract primary atom and R groups rcount = 0; nearest_code = 0; protons = 0; l1 = substr.indexOf("("); nearest = substr.left(l1); l2 = substr.indexOf(")", l1); r1 = substr.mid(l1 + 1, l2 - l1 - 1); rcount++; l1 = substr.indexOf("(", l2); if (l1 > 0) { l2 = substr.indexOf(")", l1); r2 = substr.mid(l1 + 1, l2 - l1 - 1); rcount++; l1 = substr.indexOf("(", l2); if (l1 > 0) { l2 = substr.indexOf(")", l1); r3 = substr.mid(l1 + 1, l2 - l1 - 1); rcount++; } } if (r1 == "H") protons++; if (r2 == "H") protons++; if (r3 == "H") protons++; if (nearest == "C") { if (protons == 0) nearest_code = PROTON_CH; if (protons == 1) nearest_code = PROTON_CH2; if (protons == 2) nearest_code = PROTON_CH3; } if (nearest == "CA") { nearest_code = PROTON_CH_AROMATIC; } if (nearest == "CR") { if (protons == 0) nearest_code = PROTON_CH; if (protons == 1) nearest_code = PROTON_CH2_RING; } if (nearest == "N") { if (protons == 0) nearest_code = PROTON_NH; if (protons == 1) nearest_code = PROTON_NH2; } if (nearest == "O") { nearest_code = PROTON_OH; } if (nearest == "S") { nearest_code = PROTON_SH; } // start with a base shift based on proton type switch (nearest_code) { case PROTON_CH: base_shift = 2.1; if ((r1 == "=O") && (r2 == "OC")) return 8.1; // -O-CHO if (r1 == "=O") return 9.7; // -CHO break; case PROTON_CH_AROMATIC: base_shift = 7.5; break; case PROTON_CH2: base_shift = 1.8; if ((r1 == "C=OC") && (r2 == "C=OC")) return 3.7; // -CO-CH2-CO- if ((r1 == "C=OC") && (r3 == "OC")) return 4.75; // -CO-CH2-O- if ((r2 == "OC") && (r3 == "OC")) return 5.5; // -S-CH2-S- if ((r2 == "SC") && (r3 == "SC")) return 3.75; // -S-CH2-S- if ((r2 == "OC") && (r3 == "SC")) return 4.9; // -O-CH2-S- if ((r2.left(1) == "N") && (r3.left(1) == "N")) return 4.3; // -N-CH2-N- break; case PROTON_CH2_RING: base_shift = 1.8; break; case PROTON_CH3: base_shift = 0.8; if (r3 == "OC") return 3.6; // CH3-O- if (r3.left(1) == "N") return 2.6; // CH3-N- if (r3.left(1) == "S") return 2.2; // CH3-S- if (r1.left(2) == "CA") return 2.5; // CH3-Ar if (r1.left(3) == "C=O") return 2.1; // CH3-CO- break; case PROTON_NH: base_shift = 1.8; if (r1.left(2) == "CA") return 5.0; // Ar-NH- break; case PROTON_NH2: base_shift = (double)(phc.length() % 10); break; case PROTON_OH: base_shift = 3.0; // R-OH if (r1.left(2) == "CA") return 5.8; // Ar-OH if (r1 == "C=OC") return 11.5; // carboxylic acid characteristic break; case PROTON_SH: base_shift = 2.0; if (r1.left(2) == "CA") return 4.0; // Ar-SH break; } return base_shift; } xdrawchem-v1.11.0/xdrawchem/molecule_obmol.cpp000066400000000000000000000151461371466245600214520ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include "application.h" #include "bond.h" #include "chemdata.h" #include "dpoint.h" #include "molecule.h" struct Point { float x, y; bool operator==(const Point &point) const { return (x == point.x && y == point.y); } bool operator<(const Point &point) const { return (x * x + y * y) < (point.x * point.x + point.y * point.y); } }; struct pt_cmp { bool operator()(const Point &one, const Point &two) const { return one < two; } }; using namespace OpenBabel; const char Molecule::symbol[110][4] = { "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", // 20 "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", // 40 "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", // 60 "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", // 80 "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", // 100 "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Uun"}; bool Molecule::convertFromOBMol(OBMol *obmol) { OBBond *bond; OBAtom *atom1, *atom2; DPoint *s, *e; Point point; Text *text; std::vector::iterator bonditr; std::map points; std::map::iterator itr; // int i=0; float x, y; /* look through bonds and store points found since ChemData::addBond() requires DPoint*, and not DPoint. */ for (bond = obmol->BeginBond(bonditr); bond; bond = obmol->NextBond(bonditr)) { atom1 = bond->GetBeginAtom(); atom2 = bond->GetEndAtom(); x = atom1->GetX(); x = (x + 5) * 15 + 100; y = atom1->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; itr = points.find(point); if (itr == points.end()) { std::cerr << "true"; points[point] = new DPoint(x, y); } x = atom2->GetX(); x = (x + 5) * 15 + 100; y = atom2->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; itr = points.find(point); if (itr == points.end()) points[point] = new DPoint(x, y); } /* use information from previous for-loop and add bonds and labels */ for (bond = obmol->BeginBond(bonditr); bond; bond = obmol->NextBond(bonditr)) { atom1 = bond->GetBeginAtom(); atom2 = bond->GetEndAtom(); x = atom1->GetX(); x = (x + 5) * 15 + 100; y = atom1->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; itr = points.find(point); s = (*itr).second; x = atom2->GetX(); x = (x + 5) * 15 + 100; y = atom2->GetY(); y = (y + 5) * 15 + 100; point.x = x; point.y = y; itr = points.find(point); e = (*itr).second; int bondorder = bond->GetBondOrder(); // set elements if (atom1->GetAtomicNum() != 6) { QString str(""); str += symbol[atom1->GetAtomicNum() - 1]; str += ""; s->SetElementFromXML(str); } if (atom2->GetAtomicNum() != 6) { QString str(""); str += symbol[atom2->GetAtomicNum() - 1]; str += ""; e->SetElementFromXML(str); } addBond(s, e, 1, bondorder, QColor("black"), true); // label atoms if not Carbon if (atom1->GetAtomicNum() != 6) { text = new Text(r); QString str = symbol[atom1->GetAtomicNum() - 1]; text->setText(str); text->setPoint(s); str.fill(' '); // text->setTextMask( str ); addText(text); } if (atom2->GetAtomicNum() != 6) { text = new Text(r); QString str = symbol[atom2->GetAtomicNum() - 1]; text->setText(str); text->setPoint(e); str.fill(' '); // text->setTextMask( str ); text->setJustify(JUSTIFY_CENTER); addText(text); } } return true; } // // TODO :) // OBMol *Molecule::convertToOBMol() { QList allpoints; QList allbonds; DPoint *tmp_atom; Bond *tmp_bond; // Molecule *this_mol; OBMol *obmol = new OBMol; allpoints = AllPoints(); allbonds = AllBonds(); // adapted from openbabel/mdl.cpp, most similar format to this... // (i.e., MDL is atom list followed by bond list) obmol->BeginModify(); obmol->ReserveAtoms(allpoints.count()); char type[5]; vector3 v; OBAtom atom; foreach (tmp_atom, allpoints) { v.SetX(tmp_atom->x); v.SetY(tmp_atom->y); v.SetZ(tmp_atom->z); atom.SetVector(v); atom.SetAtomicNum(tmp_atom->getAtomicNumber()); strcpy(type, tmp_atom->baseElement().toLatin1()); atom.SetType(type); if (!obmol->AddAtom(atom)) return NULL; atom.Clear(); } int start, end, order, flag, bst; foreach (tmp_bond, allbonds) { flag = 0; start = allpoints.indexOf(tmp_bond->Start()) + 1; end = allpoints.indexOf(tmp_bond->End()) + 1; order = tmp_bond->Order(); bst = tmp_bond->Stereo(); if (bst == STEREO_UP) flag |= OB_WEDGE_BOND; if (bst == STEREO_DOWN) flag |= OB_HASH_BOND; if (!obmol->AddBond(start, end, order, flag)) return NULL; } obmol->EndModify(); return obmol; } // eof xdrawchem-v1.11.0/xdrawchem/molecule_smiles.cpp000066400000000000000000000337461371466245600216440ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule_smiles.cpp - Molecule's implementation of even more functions, // notably, Structural Diagram Generation and SMILES #include #include #include #include #include #include "atom.h" #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "molecule.h" #include "render2d.h" #include "ring.h" #include "sdg.h" #include "setofrings.h" #include "text.h" using namespace OpenBabel; // CleanUp(): Invoke SDG() to clean up structure void Molecule::CleanUp() { SDG(true); } // Structure Diagram Generation - add coordinates to connectivity // generally called after reading in a file or SMILES string which did // not supply coordinates. Could also be used to clean up Molecule. // bool coord: have coordinates been set? (true = coordinates exist, e.g. // from file or hand drawing; false = no, strcuture supplied as connection // table from SMILES or file) // Method references: // 1) Ugi I et al., Journal of Chemical research (M), 1991, 2601-2689 // 2) Christoph Steinbeck's Java implentation of above, JMDraw. // http://jmdraw.sourceforge.net/ void Molecule::SDG(bool coord) { QRect bb1; QPoint center1, center2; if (coord == true) { // if coordinates exist, save center of bounding box bb1 = BoundingBoxAll(); center1 = bb1.center(); } // DPoint *t2; Atom *a1; // get unique points up = AllPoints(); QVector atoms(up.count()); // clear "hit" flag on all atoms for (DPoint *tmp_pt : up) tmp_pt->hit = false; // find rings (esp. find aromaticity) - do after CopyTextToDPoint() MakeSSSR(); qInfo() << "Done MakeSSSR()"; // convert "up" to JMDraw-friendly Qlist // rebuild neighbors list (usually mangled by MakeSSSR) for (DPoint *tmp_pt : up) { tmp_pt->neighbors.clear(); for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt) == true) { tmp_pt->neighbors.append(tmp_bond->otherPoint(tmp_pt)); tmp_pt->bondorder[(tmp_pt->neighbors.count() - 1)] = tmp_bond->Order(); } } } // first copy all DPoints int c1, c2, refnum; for (c1 = 0; c1 < up.count(); c1++) { DPoint *tmp_pt = up.at(c1); atoms[c1] = Atom(tmp_pt->element, tmp_pt->x, tmp_pt->y, tmp_pt->z); atoms[c1].number = tmp_pt->serial; atoms[c1].degree = tmp_pt->neighbors.count(); qInfo() << c1 << "-degree-" << atoms[c1].degree; } // now build connectivity table for (c1 = 0; c1 < up.count(); c1++) { DPoint *tmp_pt = up.at(c1); for (c2 = 0; c2 < tmp_pt->neighbors.count(); c2++) { refnum = tmp_pt->neighbors.at(c2)->serial; atoms[c1].nodeTable.replace(c2, &atoms[refnum]); atoms[c1].bondTable[c2] = tmp_pt->bondorder[c2]; atoms[c1].intnodeTable[c2] = refnum; } } /* convert this_sssr to setOfRings setOfRings s1; s1.resize(this_sssr.sssr.count()); Ring *ring1; QPtrList *tmp_ring; c1 = 0; for (tmp_ring = this_sssr.sssr.first(); tmp_ring != 0; tmp_ring = this_sssr.sssr.next()) { ring1 = new Ring; ring1->resize(tmp_ring->count()); c2 = 0; for (tmp_pt = tmp_ring->first(); tmp_pt != 0; tmp_pt = tmp_ring->next()) { a1 = atoms.at(tmp_pt->serial); ring1->replace(c2, a1); qInfo() << "RA" << c2 << ":" << tmp_pt->serial ; c2++; } ring1->sort2(); s1.replace(c1, ring1); c1++; } */ // pass to SDG class. class SDG sdg1; qInfo() << "SDG starting with atoms: " << atoms.size(); // TODO Interface with SDG for now, but eventually // remove this block after #19 is closed QVector sdg_atoms(atoms.size()); for (int i = 0; i < atoms.size(); ++i) { sdg_atoms[i] = &atoms[i]; } // End block sdg1.setAtoms(sdg_atoms); // sdg1.setRings(s1); sdg1.setBL(preferences.getBond_fixedlength()); sdg1.exec(); qInfo() << "SDG succeeded!"; // convert atoms back to DPoint (essentially, just update x,y coordinates) for (c1 = 0; c1 < up.count(); c1++) { DPoint *tmp_pt = up.at(c1); tmp_pt->x = atoms[c1].x; tmp_pt->y = atoms[c1].y; } bb1 = BoundingBoxAll(); int xmove = 0, ymove = 0; if (coord == true) { // if coordinates existed, move back into place center2 = bb1.center(); xmove = center1.x() - center2.x(); ymove = center1.y() - center2.y(); } else { // move to top left of screen if (bb1.left() < 10) xmove = 10 - bb1.left(); if (bb1.top() < 10) ymove = 10 - bb1.top(); } for (DPoint *tmp_pt : up) { tmp_pt->x += xmove; tmp_pt->y += ymove; } // add hydrogens AddHydrogens(); } // Use OpenBabel to make InChI strings... QString Molecule::ToInChI() { std::istringstream istream(ToMDLMolfile().toStdString()); std::ostringstream ostream; OBConversion Conv(&istream, &ostream); Conv.SetInAndOutFormats("mdl", "InChI"); Conv.Convert(); // convert the stream into a terminated c string return (QString(ostream.str().c_str())); } // Use OpenBabel to make SMILES strings. QString Molecule::ToSMILES() { QString smiles; std::istringstream istream(ToMDLMolfile().toStdString()); std::ostringstream ostream; OBConversion Conv(&istream, &ostream); Conv.SetInAndOutFormats("mdl", "SMILES"); Conv.Convert(); // convert the stream into a terminated c string return (QString(ostream.str().c_str())); } // convert InChI string to Molecule (using Babel!) // (Ideally, you should call this function just after creating) void Molecule::FromInChI(QString sm) {} // convert InChI or SMILES string to Molecule // (Ideally, you should call this function just after creating) void Molecule::FromSMILES(QString sm) { qInfo() << "FromSMILES: " << sm; QString inputFormat = "smi"; if (sm.contains("InChI=")) { inputFormat = "inchi"; } QByteArray smArray = sm.toLatin1(); std::istringstream istream(smArray.constData()); // build a stream on the string OBMol myMol; OBConversion conv; OBFormat *format = conv.FindFormat(inputFormat.toLatin1()); conv.SetInAndOutFormats(format, format); myMol.Clear(); conv.Read(&myMol, &istream); // now convert the molecule into XDC's internal representation OpenBabel::OBAtom *thisAtom; std::vector avec; QString tmp_element, tmp_element_mask; DPoint *thisDPoint; std::vector::iterator ait; std::map hashit; int i = 0; // this appears to be for debug for (thisAtom = myMol.BeginAtom(ait); thisAtom; thisAtom = myMol.NextAtom(ait)) { qInfo() << "Adding OBAtom: " << i++ << " of element#: " << thisAtom->GetAtomicNum() << " type: " << OBElements::GetSymbol(thisAtom->GetAtomicNum()); thisDPoint = new DPoint; tmp_element = OBElements::GetSymbol(thisAtom->GetAtomicNum()); tmp_element_mask = tmp_element; tmp_element_mask.fill(' '); // fix the mask characters thisDPoint->element = tmp_element; thisDPoint->elementmask = tmp_element_mask; if (tmp_element != "C") { Text *nt = new Text(r); nt->setPoint(thisDPoint); nt->setJustify(JUSTIFY_CENTER); nt->Highlight(false); nt->setText(tmp_element); labels.append(nt); } avec.push_back(thisDPoint); hashit[thisAtom] = thisDPoint; } OpenBabel::OBBond *thisBond; std::vector::iterator bit; for (thisBond = myMol.BeginBond(bit); thisBond; thisBond = myMol.NextBond(bit)) { addBond(hashit[thisBond->GetBeginAtom()], hashit[thisBond->GetEndAtom()], 1, thisBond->GetBondOrder(), QColor(0, 0, 0), true); } qInfo() << "Before SDG, Atoms: " << AllPoints().size() << ", Bonds: " << bonds.size(); SDG(false); // generate structure coordinates } // // OLD CODE // /* convert SMILES string to Molecule // (Ideally, you should call this function just after creating) void Molecule::FromSMILES(QString sm) { QStringList tokens; QPtrStack branch_tree; QPtrVector ring_closure_array(10); bool ring_array_status[10]; // track which elements of ring array are used for (int cc = 0; cc < 10; cc++) ring_array_status[cc] = false; // tokenize // tokens: atoms, groups enclosed in [], (, ) // note that numbers and symbols outside [] will break the tokenizer QStringList smilesTokens; QString prev_token, tmp_token; int i1; qInfo() << "SMILES:" << sm << "|" ; do { tmp_token = ""; if (sm[0] == '=') { // double bond tmp_token.append("="); sm.remove(0,1); } if (sm[0] == '#') { // triple bond tmp_token.append("#"); sm.remove(0,1); } if (sm[0].isLetter()) { // extract letter token // look for single-letter aromatic if (sm[0].toLower() == sm[0]) { tmp_token.append(sm.left(1)); sm.remove(0,1); } else { if ( (sm[1].toLower() == sm[1]) && (sm[1].isLetter()) ) { // lowercase; two-letter symbol tmp_token.append(sm.left(2)); sm.remove(0,2); } else { // tmp_token.append(sm.left(1)); sm.remove(0,1); } } // extract ring closure numbers if (sm.length() > 0) { do { if (sm[0].isNumber()) { tmp_token.append(sm.left(1)); sm.remove(0,1); } else { break; } } while (sm.length() > 0); } smilesTokens.append(tmp_token); } if (sm[0] == '(') { tmp_token = "("; smilesTokens.append(tmp_token); sm.remove(0,1); } if (sm[0] == ')') { tmp_token = ")"; smilesTokens.append(tmp_token); sm.remove(0,1); } if (sm[0] == '[') { i1 = sm.indexOf("]"); tmp_token = sm.left(i1); smilesTokens.append(tmp_token); } //qInfo() << "token: " << tmp_token << Qt::endl << "left: " << sm ; } while (sm.length() > 0); DPoint *prev_pt = 0, *new_pt = 0; QString tmp_element, tmp_element_mask; tmp_token = ""; prev_token = ""; int bond_order = 0; bool aromatic = false, flag = false; for ( QStringList::Iterator it = smilesTokens.begin(); it != smilesTokens.end(); ++it ) { prev_token = tmp_token; tmp_token = (*it).toLatin1(); qInfo() << "token: " << tmp_token ; // process tokens if (tmp_token == "(") { // start branch branch_tree.push(prev_pt); continue; } if (tmp_token == ")") { // end branch prev_pt = branch_tree.pop(); continue; } // if not a branch, it's probably an atom new_pt = new DPoint; // calculate bond order aromatic = false; if (tmp_token[0].isLetter()) { if (tmp_token[0].toLower() == tmp_token[0]) new_pt->aromatic = true; } if (prev_pt != 0) { bond_order = 1; if ( prev_pt->aromatic && new_pt->aromatic ) {bond_order = 4;} } if (tmp_token.left(1) == "=") { bond_order = 2; tmp_token.remove(0,1); } if (tmp_token.left(1) == "#") { bond_order = 3; tmp_token.remove(0,1); } // extract element info tmp_element = ""; tmp_element_mask = ""; if (tmp_token[0].isLetter()) { tmp_element = tmp_token.left(1); tmp_element = tmp_element.toUpper(); } if (tmp_token[1].isLetter()) tmp_element.append(tmp_token[1]); if (tmp_token[0] == '[') { int i1 = tmp_token.indexOf("]"); tmp_element = tmp_token.mid(1, i1 - 2); } qInfo() << "element: " << tmp_element ; tmp_element_mask = tmp_element; tmp_element_mask.fill(' '); // add super/sub-script where appropriate new_pt->element = tmp_element; new_pt->elementmask = tmp_element_mask; // create Text where appropriate if (new_pt->element != "C") { Text *nt = new Text(r); nt->setPoint(new_pt); nt->setJustify(JUSTIFY_CENTER); nt->Highlight(false); nt->setText(tmp_element); nt->setTextMask(tmp_element_mask); labels.append(nt); } // create bond if (prev_pt != 0) { addBond(prev_pt, new_pt, 1, bond_order, QColor(0,0,0), true); prev_pt = new_pt; } else { prev_pt = new_pt; } // handle ring closure do { flag = false; if (tmp_token.at(tmp_token.length() - 1).isNumber()) { int ringnum = tmp_token.right(1).toInt(); flag = true; if (ring_array_status[ringnum] == false) { // save this atom ring_closure_array.replace(ringnum, new_pt); ring_array_status[ringnum] = true; } else { // do ring closure tmp_pt = ring_closure_array.at(ringnum); if (tmp_pt->aromatic && new_pt->aromatic) addBond(tmp_pt, new_pt, 1, 4, QColor(0,0,0), true); else addBond(tmp_pt, new_pt, 1, 1, QColor(0,0,0), true); ring_array_status[ringnum] = false; } tmp_token.remove(tmp_token.length() - 1, 1); } } while (flag == true); } // print atom list and connection table? qInfo() << ToXML("smiles") ; SDG(false); // generate structure coordinates } // // OLD CODE // */ xdrawchem-v1.11.0/xdrawchem/molecule_sssr.cpp000066400000000000000000000213151371466245600213270ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule_sssr.cpp - defines class SSSR, which implements ring detection by // breadth-first traversal. This results in the Smallest Set of Smallest // Rings. This algorithm is based on J. Figueras' published method, // "Ring Perception Using Breadth-First Search", // J. Chem. Inf. Comput. Sci. 1996, 36, 986-991 /* //Added by qt3to4: #include */ #include "bond.h" #include "molecule_sssr.h" // Is this DPoint in a ring? int SSSR::IsInRing(DPoint *r1) { int retval = 0; if (sssr.count() == 0) { return 0; } for (QList *tmp_ring : sssr) { if (tmp_ring->contains(r1) > 0) retval++; } return retval; } // are these three points in the same ring? If so, return the number of // atoms in this ring int SSSR::InSameRing(DPoint *r1, DPoint *r2, DPoint *r3) { int retval; for (QList *tmp_ring : sssr) { retval = 0; if (tmp_ring->contains(r1) > 0) retval++; if (tmp_ring->contains(r2) > 0) retval++; if (tmp_ring->contains(r3) > 0) retval++; if (retval == 3) { return tmp_ring->count(); } } return 0; } // print SSSR as [xyz] void SSSR::PrintSSSR() { if (sssr.count() == 0) { qInfo() << "No rings."; return; } qInfo() << "Yes rings: ["; for (QList *tmp_ring : sssr) qInfo() << tmp_ring->count(); qInfo() << "]"; } // identify aromatic rings (just benzene for now) void SSSR::FindAromatic(QList bl) { bool o1, o2, goodring; for (QList *tmp_ring : sssr) { goodring = true; if (tmp_ring->count() != 6) { goodring = false; continue; } for (DPoint *tmp_pt : *tmp_ring) { o1 = false; o2 = false; for (Bond *tmp_bond : bl) { if (tmp_bond->Find(tmp_pt) == true) { if (tmp_bond->Order() == 1) o1 = true; if (tmp_bond->Order() == 2) o2 = true; } } if ((o1 == false) || (o2 == false)) { goodring = false; break; } } if (goodring == true) { qInfo() << "Aromatic ring"; for (DPoint *tmp_pt : *tmp_ring) { tmp_pt->aromatic = true; } } } } // Make sssr from given 'atoms' void SSSR::BuildSSSR(QList alist) { // clear old SSSR sssr.clear(); sssr_data.clear(); int atomsRemoved; structureAtoms = alist; // eliminate pesky chains by cutting off zero- and one-bond 'atoms' do { atomsRemoved = 0; for (DPoint *tmp_pt : structureAtoms) { if (tmp_pt->neighbors.count() < 2) { qInfo() << tmp_pt->serial << ":" << tmp_pt->neighbors.count(); // increment atomsRemoved atomsRemoved++; // remove this item from structureAtoms structureAtoms.removeAll(tmp_pt); // and remove this item from all neighbor lists foreach (DPoint *tmp_del, structureAtoms) { tmp_del->neighbors.removeAll(tmp_pt); } } } } while (atomsRemoved > 0); qInfo() << "There are " << structureAtoms.count() << " ring atoms"; // now traverse rings foreach (DPoint *tmp_it, structureAtoms) { QList *tmp_ring = GetRing(tmp_it); if (tmp_ring->size() > 0) Add(tmp_ring); else qInfo("Empty ring?"); } // find fused and bridged rings if (sssr.count() > 1) { int neighbors = 0, int1; bool bridged = false; foreach (QList *tmp_sssr1, sssr) { neighbors = 0; bridged = false; foreach (QList *tmp_sssr2, sssr) { if (tmp_sssr1 == tmp_sssr2) continue; int1 = CommonPoints(tmp_sssr1, tmp_sssr2); if (int1 > 1) neighbors++; if (int1 > 2) bridged = true; } qInfo() << "Bridge detect: " << neighbors << "/" << bridged; } } } // Add to sssr. Make sure this is not a duplicate of an existing ring void SSSR::Add(QList *r1) { DPoint *flagpt; if (CheckRing(r1) == true) { sssr.append(r1); // mark this dpoint as in a ring foreach (flagpt, *r1) { flagpt->inring = true; qInfo() << "flagged"; } } } // number of points in common between two rings int SSSR::CommonPoints(QList *r1, QList *r2) { int ol = 0; foreach (DPoint *tmp_r1, *r1) { if (r2->count(tmp_r1) >= 0) ol++; } return ol; } // check if ring is already in SSSR bool SSSR::CheckRing(QList *r) { int l2; bool iflag = true; for (QList *tmp_ring : sssr) { l2 = r->count(); for (DPoint *tmp_pt : *tmp_ring) { if (r->count(tmp_pt) >= 0) l2--; } if (l2 <= 0) { iflag = false; break; } } return iflag; } // Find smallest unique ring containing root node *root // Based on Figueras' breadth-first traversal QList *SSSR::GetRing(DPoint *root) { QList *testring = new QList; DPoint *thisnode; int tf = 0; ClearPaths(); bfs_queue.clear(); root->source = 0; bfs_queue.append(root); do { thisnode = bfs_queue.first(); bfs_queue.removeFirst(); // skip eliminated atoms if (!structureAtoms.contains(thisnode)) { qInfo("structureAtoms does not contain thisnode, skipping"); continue; } qInfo() << "this node neighbors: " << thisnode->neighbors.size(); for (DPoint *tmp_pt : thisnode->neighbors) { if (thisnode->source == tmp_pt) continue; // prevent backtrack if (structureAtoms.indexOf(tmp_pt) < 0) continue; // skip 'eliminated' if (tmp_pt->path.count() == 0) { tmp_pt->source = thisnode; tmp_pt->path = thisnode->path; tmp_pt->path.append(thisnode); bfs_queue.append(tmp_pt); } else { // collision qInfo() << "collide" << Qt::endl << "thisnode(" << thisnode->serial << "):"; // merge path lists (note overlaps) foreach (DPoint *tmpPoint, thisnode->path) { qInfo() << tmpPoint->serial; testring->append(tmpPoint); } qInfo() << Qt::endl << "tmp_pt(" << tmp_pt->serial << "):"; tf = 0; foreach (DPoint *tmpPoint, tmp_pt->path) { qInfo() << tmpPoint->serial; if (testring->count(tmpPoint) == 0) testring->append(tmpPoint); else tf++; } qInfo(); // but thisnode and tmp_pt have not themselves been added! if (testring->count(thisnode) == 0) testring->append(thisnode); else tf++; if (testring->count(tmp_pt) == 0) testring->append(tmp_pt); else tf++; // check for singleton overlap (tf == 1) qInfo() << "tf = " << tf; if (tf == 1) return testring; else testring->clear(); } } } while (bfs_queue.count() > 0); return testring; // to appease g++ -Wall. Probably returns before here. } // clear paths in 'atoms' void SSSR::ClearPaths() { for (DPoint *tmp_pt : structureAtoms) { tmp_pt->source = 0; tmp_pt->path.clear(); } } xdrawchem-v1.11.0/xdrawchem/molecule_sssr.h000066400000000000000000000037441371466245600210020ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule_sssr.cpp - defines class SSSR, which implements ring detection by // breadth-first traversal. This results in the Smallest Set of Smallest // Rings. This algorithm is based on J. Figueras' published method, // "Ring Perception Using Breadth-First Search", // J. Chem. Inf. Comput. Sci. 1996, 36, 986-991 #ifndef MOL_SSSR_H #define MOL_SSSR_H #include #include "dpoint.h" class RingData { public: RingData() { neighbors = 0; bridge = false; } int neighbors; // number of neighbor rings bool bridge; // bridged ring? (e.g. camphor) }; class SSSR { public: QList *> sssr; QList sssr_data; DPoint *lastnode; // 'source' node in BFS // Build SSSR from these lists QList structureAtoms; // BFS queue QList bfs_queue; int IsInRing(DPoint *); int InSameRing(DPoint *, DPoint *, DPoint *); void PrintSSSR(); void FindAromatic(QList); void BuildSSSR(QList); void Add(QList *); int CommonPoints(QList *, QList *); bool CheckRing(QList *); QList *GetRing(DPoint *); void ClearPaths(); }; #endif xdrawchem-v1.11.0/xdrawchem/molecule_tools_1.cpp000066400000000000000000001057611371466245600217250ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule_tools_1.cpp - Molecule's implementation of (more) functions #include #include #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "graphdialog.h" #include "moldata.h" #include "molecule.h" #include "molinfodialog.h" #include "netaccess.h" #include "render2d.h" //#include "namer.h" // Preferences extern Preferences preferences; // Prediction stuff #include "boshcp.h" // SSSR (see comments in this file) #include "molecule_sssr.h" // note that this function builds the DPoint::neighbors list as well void Molecule::MakeSSSR() { AllNeighbors(); QList groupAtoms = AllPoints(); this_sssr.BuildSSSR(groupAtoms); this_sssr.PrintSSSR(); this_sssr.FindAromatic(bonds); } int Molecule::OrderOfBond(DPoint *e1, DPoint *e2) { for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(e1) == true) { if (tmp_bond->otherPoint(e1) == e2) return tmp_bond->Order(); } } return 0; } Bond *Molecule::FindBond(DPoint *e1, DPoint *e2) { for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(e1) == true) { if (tmp_bond->otherPoint(e1) == e2) return tmp_bond; } } return 0; } QString Molecule::CalcName() { QString nom = ToSMILES(); nom = nom.simplified(); /* canonical SMILES no longer available :( // compose Python command (hopefully this function only gets called // when the Python test passes in application.cpp :) NetAccess na1; QString serverName = getenv("XDC_SERVER"); if (serverName.length() < 2) serverName = XDC_SERVER; nom = na1.getCanonicalSmiles(serverName, nom); nom = nom.stripWhiteSpace(); qDebug() << nom; */ return nom; } QStringList Molecule::Calc13CNMR(bool show_dialog) { BremserOneSphereHOSECodePredictor boshcp; QStringList hosecodes; QList sphere1; QString tmp_str, ts; DPoint *tmp_pt2, *tmp_pt3; int hs, hsmax; // get list of unique points up = AllPoints(); // find rings (esp. find aromaticity) - do after CopyTextToDPoint() MakeSSSR(); // clear peak list peaklist.clear(); // Scan for keto groups for (DPoint *tmp_pt : up) { tmp_pt->ketos = 0; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt) == true) { tmp_pt2 = tmp_bond->otherPoint(tmp_pt); if ((tmp_pt2->element == "O") && (tmp_bond->Order() == 2)) tmp_pt->ketos += 1; } } } // Determine atoms surrounding each atom and build HOSE code list for (DPoint *tmp_pt : up) { if (tmp_pt->element == "C") { // only look at carbons for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt) == true) { tmp_str = ""; hs = 0; tmp_pt2 = tmp_bond->otherPoint(tmp_pt); if (tmp_bond->Order() == 3) { tmp_str.append("%"); hs += 300; } if ((tmp_pt->aromatic == true) && (tmp_pt2->aromatic == true)) { tmp_str.append("*"); hs += 100; } else { if (tmp_bond->Order() == 2) { if (tmp_bond->Dash() == 0) { tmp_str.append("="); hs += 200; } if (tmp_bond->Dash() == 1) { tmp_str.append("*"); hs += 100; } } } if (tmp_pt2->element == "C") { tmp_str.append("C"); hs += 24; } if (tmp_pt2->element == "O") { tmp_str.append("O"); hs += 22; } if (tmp_pt2->element == "OH") { tmp_str.append("O"); hs += 22; } if (tmp_pt2->element == "HO") { tmp_str.append("O"); hs += 22; } if (tmp_pt2->element == "N") { tmp_str.append("N"); hs += 20; } if (tmp_pt2->element == "NH2") { tmp_str.append("N"); hs += 20; } if (tmp_pt2->element == "H2N") { tmp_str.append("N"); hs += 20; } if (tmp_pt2->element == "NH") { tmp_str.append("N"); hs += 20; } if (tmp_pt2->element == "HN") { tmp_str.append("N"); hs += 20; } if (tmp_pt2->element == "P") { tmp_str.append("P"); hs += 18; } if (tmp_pt2->element == "S") { tmp_str.append("S"); hs += 16; } if (tmp_pt2->element == "SH") { tmp_str.append("S"); hs += 16; } if (tmp_pt2->element == "HS") { tmp_str.append("S"); hs += 16; } if (tmp_pt2->element == "Si") { tmp_str.append("Q"); hs += 14; } if (tmp_pt2->element == "B") { tmp_str.append("B"); hs += 12; } if (tmp_pt2->element == "F") { tmp_str.append("F"); hs += 10; } if (tmp_pt2->element == "Cl") { tmp_str.append("X"); hs += 8; } if (tmp_pt2->element == "Br") { tmp_str.append("Y"); hs += 6; } if (tmp_pt2->element == "I") { tmp_str.append("I"); hs += 4; } if (tmp_pt2->ketos == 2) { tmp_str.append("$$"); } if (tmp_pt2->ketos == 1) { tmp_str.append("$"); } tmp_pt2->tmphose = tmp_str; tmp_pt2->hosescore = hs; sphere1.append(tmp_pt2); } } tmp_str = ""; do { hsmax = -1; foreach (tmp_pt3, sphere1) { if (tmp_pt3->hosescore > hsmax) { hsmax = tmp_pt3->hosescore; ts = tmp_pt3->tmphose; tmp_pt2 = tmp_pt3; } } sphere1.removeAll(tmp_pt2); tmp_str.append(ts); } while (sphere1.count() > 0); tmp_str.append("(//)"); hosecodes.append(tmp_str); tmp_pt->hosecode = tmp_str; qDebug() << tmp_str; } } GraphDialog *g = new GraphDialog(r, tr("Predicted 13C-NMR")); // print (for now) list of NMR values for (QStringList::Iterator it = hosecodes.begin(); it != hosecodes.end(); ++it) { // qDebug() << boshcp.predictFull(*it) ; g->AddPeak(boshcp.predict(*it), boshcp.getMult(*it), boshcp.predictFull(*it)); Peak *tmp_peak = new Peak; tmp_peak->value = boshcp.predict(*it); tmp_peak->intensity = 1; tmp_peak->multiplicity = 1; if (boshcp.getMult(*it) == "D") tmp_peak->multiplicity = 2; if (boshcp.getMult(*it) == "T") tmp_peak->multiplicity = 3; if (boshcp.getMult(*it) == "Q") tmp_peak->multiplicity = 4; tmp_peak->comment = boshcp.predictFull(*it); // check for existing peak foreach (Peak *tpeak, peaklist) { if ((tpeak->value == tmp_peak->value) && (tpeak->multiplicity == tmp_peak->multiplicity)) { tpeak->intensity += 1; delete tmp_peak; tmp_peak = 0; break; } } if (tmp_peak != 0) peaklist.append(tmp_peak); } if (show_dialog == false) { delete g; return hosecodes; } QPixmap mol = r->MakeFullPixmap(); QRect rr1 = BoundingBoxAll(); rr1.setLeft(rr1.left() - 4); rr1.setTop(rr1.top() - 4); rr1.setBottom(rr1.bottom() + 4); rr1.setRight(rr1.right() + 4); QPixmap mol1(rr1.size()); QPainter p(&mol1); p.drawPixmap(QPoint(0, 0), mol, rr1); g->AddPixmap(mol1); g->show(); delete g; return hosecodes; } void Molecule::CalcIR() { QList up; int atom1, atom2, lorder, swp; // get list of unique points up = AllPoints(); // find rings (esp. find aromaticity) MakeSSSR(); peaklist.clear(); GraphDialog *g = new GraphDialog(r, tr("Predicted IR")); // iterate thru all Bonds in Molecule for (Bond *tmp_bond : bonds) { // check for 'obvious' cases // rules for atoms and groups lorder = tmp_bond->Order(); if (lorder > 3) lorder = 1; // stereo bonds (5,7) are single bonds (1) atom1 = tmp_bond->Start()->getAtomicNumber(); atom2 = tmp_bond->End()->getAtomicNumber(); if (atom1 > atom2) { swp = atom1; atom1 = atom2; atom2 = swp; } if (lorder == 1) { if ((atom1 == 6) && (atom2 == 7)) AddPeak(1300.0, QString("C-N"), QString(tr("~1350-1000, C-N"))); if ((atom1 == 6) && (atom2 == 8)) AddPeak(1300.0, QString("C-O"), QString(tr("~1300-1000, C-O"))); } if (lorder == 2) { if ((atom1 == 6) && (atom2 == 6)) AddPeak(1660.0, QString("C=C"), QString(tr("~1660-1600, C=C (cis/vinyl strong; trans weak)"))); if ((atom1 == 6) && (atom2 == 7)) AddPeak(1670.0, QString("C=N"), QString(tr("~1690-1640, C=N"))); if ((atom1 == 6) && (atom2 == 8)) AddPeak(1700.0, QString("C=O"), QString(tr("~1700 (narrow), C=O"))); if ((atom1 == 8) && (atom2 == 16)) AddPeak(1350.0, QString("S=O"), QString(tr("~1350-1300, S=O (~1050 if R-(S=O)-R')"))); } if (lorder == 3) { if ((atom1 == 6) && (atom2 == 7)) AddPeak(2250.0, QString("CN"), QString(tr("~2250 (narrow), nitrile"))); } /* #################################################################### if (tmp_bond->Order() == 1) { if ( (tmp_bond->Start()->element == "C") && (tmp_bond->End()->element.contains("O") > 0) ) { AddPeak(1300.0, QString("C-O"), QString(tr("~1300-1000, C-O"))); } if ( (tmp_bond->Start()->element.contains("O") > 0) && (tmp_bond->End()->element == "C") ) { AddPeak(1300.0, QString("C-O"), QString(tr("~1300-1000, C-O"))); } if ( (tmp_bond->Start()->element == "C") && (tmp_bond->End()->element == "N") ) { AddPeak(1300.0, QString("C-N"), QString(tr("~1350-1000, C-N"))); } if ( (tmp_bond->Start()->element == "N") && (tmp_bond->End()->element == "C") ) { AddPeak(1300.0, QString("C-N"), QString(tr("~1350-1000, C-N"))); } } if (tmp_bond->Order() == 2) { if ( (tmp_bond->Start()->element == "C") && (tmp_bond->End()->element == "O") ) { // ketone AddPeak(1700.0, QString("C=O"), QString(tr("~1700 (narrow), ketone"))); } if ( (tmp_bond->Start()->element == "O") && (tmp_bond->End()->element == "C") ) { // ketone AddPeak(1700.0, QString("C=O"), QString(tr("~1700 (narrow), ketone"))); } if ( (tmp_bond->Start()->element == "C") && (tmp_bond->End()->element == "C") ) { // carbon double bond AddPeak(1700.0, QString("C=C"), QString(tr("~1660-1600, C=C (cis/vinyl strong; trans weak)"))); } } if (tmp_bond->Order() == 3) { if ( (tmp_bond->Start()->element == "C") && (tmp_bond->End()->element == "N") ) { // nitrile AddPeak(2250.0, QString("CN"), QString(tr("~2250 (narrow), nitrile"))); } if ( (tmp_bond->Start()->element == "N") && (tmp_bond->End()->element == "C") ) { // nitrile AddPeak(2250.0, QString("CN"), QString(tr("~2250 (narrow), nitrile"))); } } ######################################################################### */ } // iterate thru unique atoms, look for functional groups for (DPoint *tmp_pt : up) { qDebug() << "|" << tmp_pt->element << "|"; if ((tmp_pt->element == "C") && (tmp_pt->substituents < 4)) AddPeak(3000.0, QString("CH"), QString(tr("~3000 (broad), C-H"))); if (tmp_pt->element == "CH") AddPeak(3000.0, QString("CH"), QString(tr("~3000 (broad), C-H"))); if (tmp_pt->element == "HC") AddPeak(3000.0, QString("CH"), QString(tr("~3000 (broad), C-H"))); if (tmp_pt->element == "CH2") AddPeak(3000.0, QString("CH"), QString(tr("~3000 (broad), C-H"))); if (tmp_pt->element == "H2C") AddPeak(3000.0, QString("CH"), QString(tr("~3000 (broad), C-H"))); if (tmp_pt->element == "CH3") AddPeak(3000.0, QString("CH"), QString(tr("~3000 (broad), C-H"))); if (tmp_pt->element == "H3C") AddPeak(3000.0, QString("CH"), QString(tr("~3000 (broad), C-H"))); if ((tmp_pt->element == "N") && (tmp_pt->substituents == 1)) AddPeak(3350.0, QString("NH"), QString(tr("two peaks: ~3400, ~3300, primary N-H"))); if ((tmp_pt->element == "N") && (tmp_pt->substituents == 2)) AddPeak(3300.0, QString("NH"), QString(tr("~3300 (broad), secondary N-H"))); if (tmp_pt->element == "NH") AddPeak(3300.0, QString("NH"), QString(tr("~3300 (broad), secondary N-H"))); if (tmp_pt->element == "HN") AddPeak(3300.0, QString("NH"), QString(tr("~3300 (broad), secondary N-H"))); if (tmp_pt->element == "NH2") AddPeak(3350.0, QString("NH"), QString(tr("two peaks: ~3400, ~3300, primary N-H"))); if (tmp_pt->element == "H2N") AddPeak(3350.0, QString("NH"), QString(tr("two peaks: ~3400, ~3300, primary N-H"))); if ((tmp_pt->element == "S") && (tmp_pt->substituents < 2)) AddPeak(2550.0, QString("SH"), QString(tr("~2550 (broad), S-H"))); if ((tmp_pt->element == "SH") && (tmp_pt->substituents < 2)) AddPeak(2550.0, QString("SH"), QString(tr("~2550 (broad), S-H"))); if ((tmp_pt->element == "HS") && (tmp_pt->substituents < 2)) AddPeak(2550.0, QString("SH"), QString(tr("~2550 (broad), S-H"))); if ((tmp_pt->element == "O") && (tmp_pt->substituents < 2)) AddPeak(2550.0, QString("OH"), QString(tr("~3400 (broad), O-H"))); if (tmp_pt->element == "CN") AddPeak(2250.0, QString("CN"), QString(tr("~2250 (narrow), nitrile"))); if (tmp_pt->element == "NC") AddPeak(2250.0, QString("CN"), QString(tr("~2250 (narrow), nitrile"))); if (tmp_pt->element == "NCO") AddPeak(2270.0, QString("NCO"), QString(tr("~2270 (narrow), -N=C=O"))); if (tmp_pt->element == "NCS") AddPeak(2125.0, QString("NCS"), QString(tr("~2125 (narrow), -N=C=S"))); if (tmp_pt->element == "OH") AddPeak(3400.0, QString("OH"), QString(tr("~3400 (broad), O-H"))); if (tmp_pt->element == "HO") AddPeak(3400.0, QString("OH"), QString(tr("~3400 (broad), O-H"))); if (tmp_pt->element == "NO2") AddPeak(1525.0, QString("NO2"), QString(tr("~1525 (narrow), -NO2"))); if (tmp_pt->element == "O2N") AddPeak(1525.0, QString("NO2"), QString(tr("~1525 (narrow), -NO2"))); if (tmp_pt->aromatic == true) { AddPeak(1600.0, QString("aromatic"), QString(tr("~1600 (narrow), aromatic ring C=C"))); AddPeak(1475.0, QString("aromatic"), QString(tr("~1475 (narrow), aromatic ring C=C"))); } } QPixmap mol = r->MakeFullPixmap(); QRect rr1 = BoundingBoxAll(); rr1.setLeft(rr1.left() - 4); rr1.setTop(rr1.top() - 4); rr1.setBottom(rr1.bottom() + 4); rr1.setRight(rr1.right() + 4); QPixmap mol1(rr1.size()); QPainter p(&mol1); p.drawPixmap(QPoint(0, 0), mol, rr1); g->AddPixmap(mol1); // g->show(); } // invoked from chemdata_tools.cpp // derived (well, butchered) from Lin S-T and Sandler SI, J. Phys. Chem. A , // 2000, 104(30), 7099-7105 double Molecule::CalcKOW() { // get list of unique points up = AllPoints(); MakeSSSR(); AllNeighbors(); double ri = 0.0, qi = 0.0, dg = 0.0, fkow; DPoint *alt_pt1, *alt_pt2, *alt_pt3; // int testcount; for (DPoint *tmp_pt : up) { if (tmp_pt->hit) continue; // skip atoms already considered if (tmp_pt->baseElement() == "H") continue; /* qDebug() << "KOW parameters:"; qDebug() << tmp_pt->baseElement(); alt_pt1 = tmp_pt->neighbors.at(0); qDebug() << alt_pt1->baseElement(); qDebug() << tmp_pt->bondorder[0]; if (tmp_pt->neighbors.count() > 1) { alt_pt2 = tmp_pt->neighbors.at(1); qDebug() << alt_pt2->baseElement(); qDebug() << tmp_pt->bondorder[1]; } if (tmp_pt->neighbors.count() > 2) { alt_pt3 = tmp_pt->neighbors.at(2); qDebug() << alt_pt3->baseElement(); qDebug() << tmp_pt->bondorder[2]; } */ if (tmp_pt->baseElement() == "Br") { ri += 1.114; qi += 0.935; dg += 1.268; } if (tmp_pt->baseElement() == "Cl") { ri += 0.861; qi += 0.771; dg += 1.129; } if (tmp_pt->baseElement() == "F") { ri += 0.376; qi += 0.458; dg += 0.946; } if ((tmp_pt->baseElement() == "C") && (tmp_pt->neighbors.count() == 1)) { ri += 0.887; qi += 0.840; dg += 2.201; } if ((tmp_pt->baseElement() == "C") && (tmp_pt->neighbors.count() == 2)) { // check first for aldehyde/nitrile alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); if ((alt_pt1->baseElement() == "N") && (tmp_pt->bondorder[0] == 3)) { qDebug() << "Nitrile"; continue; } if ((alt_pt1->baseElement() == "O") && (tmp_pt->bondorder[0] == 2)) { qDebug() << "Aldehyde"; continue; } if ((alt_pt2->baseElement() == "N") && (tmp_pt->bondorder[1] == 3)) { qDebug() << "Nitrile"; continue; } if ((alt_pt2->baseElement() == "O") && (tmp_pt->bondorder[1] == 2)) { qDebug() << "Aldehyde"; continue; } if (tmp_pt->aromatic) { ri += 0.537; qi += 0.431; dg += 0.468; } else { if (tmp_pt->inring) { ri += 0.665; qi += 0.523; dg += 1.071; } else { ri += 0.665; qi += 0.523; dg += 1.077; } } } if ((tmp_pt->baseElement() == "C") && (tmp_pt->neighbors.count() == 3)) { // check first for ester/ketone alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); alt_pt3 = tmp_pt->neighbors.at(2); int ocount = 0, odb = 0; if (alt_pt1->baseElement() == "O") { ocount++; if (tmp_pt->bondorder[0] == 2) odb = 1; } if (alt_pt2->baseElement() == "O") { ocount++; if (tmp_pt->bondorder[1] == 2) odb = 1; } if (alt_pt3->baseElement() == "O") { ocount++; if (tmp_pt->bondorder[2] == 2) odb = 1; } if ((ocount == 1) && (odb == 1)) { // ketone ri += 0.716; qi += 0.527; dg += -3.315; continue; } if ((ocount == 2) && (odb == 1)) { // ester ri += 1.062; qi += 0.821; dg += -0.723; continue; } if (tmp_pt->aromatic) { ri += 0.316; qi += 0.114; dg += 0.031; } else { if (tmp_pt->inring) { ri += 0.497; qi += 0.235; dg += -0.051; } else { ri += 0.497; qi += 0.235; dg += -0.091; } } } if ((tmp_pt->baseElement() == "C") && (tmp_pt->neighbors.count() == 4)) { ri += 0.213; qi += 0.0; dg += -0.729; } if ((tmp_pt->baseElement() == "O") && (tmp_pt->neighbors.count() == 1)) { ri += 0.532; qi += 0.572; dg += -10.405; } if ((tmp_pt->baseElement() == "O") && (tmp_pt->neighbors.count() == 2)) { alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); if ((alt_pt1->baseElement() == "C") && (alt_pt2->baseElement() == "C")) ri += 0.742; qi += 0.748; dg += -9.255; } if ((tmp_pt->baseElement() == "N") && (tmp_pt->neighbors.count() == 1)) { ri += 0.742; qi += 0.748; dg += -9.255; } if ((tmp_pt->baseElement() == "N") && (tmp_pt->neighbors.count() == 2)) { if ((tmp_pt->bondorder[0] + tmp_pt->bondorder[1]) == 2) ri += 0.553; qi += 0.401; dg += -4.959; if ((tmp_pt->bondorder[0] + tmp_pt->bondorder[1]) == 3) ri += 0.436; qi += 0.339; dg += -1.301; } if ((tmp_pt->baseElement() == "N") && (tmp_pt->neighbors.count() == 3)) { ri += 0.341; qi += 0.0; dg += -5.525; } } fkow = -0.126 + 1.031 * ri - 1.208 * qi + dg / 1.364; return fkow; } // invoked from chemdata_tools.cpp void Molecule::CalcpKa() { // pKa's from -1.2 (CH3SO3H) to 18 (t-butyl alcohol) are considered // beyond that, (e.g, HCl, r-CH3), the user will probably not be interested QStringList pKa_table; // why reinvent the wheel? Use HOSE codes found by 13C-NMR to predict // environment Calc13CNMR(false); // restore neighbors list(s) AllNeighbors(); // get list of unique points up = AllPoints(); DPoint *alt_pt1, *alt_pt2, *alt_pt3; int testcount; // first thing to do is scan for large patterns (e.g. guanidino, rings) for (DPoint *tmp_pt : up) { if (tmp_pt->hit) continue; // skip atoms already considered if (tmp_pt->baseElement() == "C") { if (tmp_pt->neighbors.count() == 3) { // check for guanidino alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); alt_pt3 = tmp_pt->neighbors.at(2); testcount = alt_pt1->neighbors.count() + alt_pt2->neighbors.count() + alt_pt3->neighbors.count(); if ((alt_pt1->baseElement() == "N") && (alt_pt2->baseElement() == "N") && (alt_pt3->baseElement() == "N") && (testcount == 4)) { alt_pt1->hit = true; alt_pt2->hit = true; alt_pt3->hit = true; pKa_table.append(tr("10.5 (Guanidine)")); } } } } for (DPoint *tmp_pt : up) { // qDebug() << tmp_pt->serial << "," << tmp_pt->baseElement(); if (tmp_pt->hit) continue; // skip atoms already considered if (tmp_pt->baseElement() == "C") { if (tmp_pt->neighbors.count() == 3) { } // few cases where C-H proton is going to split! if ((tmp_pt->hosecode == "C$C$(//)") && (tmp_pt->substituents == 2)) { alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); if ((alt_pt1->hosecode == "=OCC") && (alt_pt1->hosecode == "=OCC")) { pKa_table.append(tr("9 (a-carbon between two ketones)")); } if ((alt_pt1->hosecode == "=OCO") && (alt_pt1->hosecode == "=OCC")) { pKa_table.append(tr("11 (a-carbon between two ketones)")); } if ((alt_pt1->hosecode == "=OCC") && (alt_pt1->hosecode == "=OCO")) { pKa_table.append(tr("11 (a-carbon between ketone and ester)")); } if ((alt_pt1->hosecode == "=OCO") && (alt_pt1->hosecode == "=OCO")) { pKa_table.append(tr("13 (a-carbon between two esters)")); } } } if (tmp_pt->baseElement() == "N") { qDebug() << tmp_pt->substituents; if (tmp_pt->substituents == 1) { alt_pt1 = tmp_pt->neighbors.at(0); // MakeSSSR() should set this if (alt_pt1->hosecode.count("*") > 0) { pKa_table.append(tr("5 (Aromatic primary amine)")); } else { if (alt_pt1->hosecode.count("=") > 0) { if (alt_pt1->hosecode.count("=O") > 0) { // amide! } else { pKa_table.append(tr("9-10 (Alkene-primary amine)")); } } else { pKa_table.append(tr("11 (Aliphatic primary amine)")); } } } if (tmp_pt->substituents == 2) { // check secondary amine alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); // qDebug() << "alt_pt1 = " << alt_pt1->hosecode; // qDebug() << "alt_pt2 = " << alt_pt2->hosecode; if ((alt_pt1->hosecode == "=CN(//)") && (alt_pt2->hosecode == "=CN(//)")) { // pyrrole pKa_table.append(tr("-4 (pyrrole)")); continue; } if ((alt_pt1->hosecode == "=CN(//)") && (alt_pt2->hosecode == "=NN(//)")) { pKa_table.append(tr("14.4 (secondary amine)")); continue; } if ((alt_pt1->hosecode.count("=O") == 0) && (alt_pt2->hosecode.count("=O") == 0)) { pKa_table.append(tr("11 (aliphatic secondary amine)")); } } if (tmp_pt->substituents == 3) { // check conjugated and tertiary amines if (tmp_pt->neighbors.count() == 2) { // conjugated/aromatic amine alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); qDebug() << "alt_pt1 = " << alt_pt1->hosecode; qDebug() << "alt_pt2 = " << alt_pt2->hosecode; if ((alt_pt1->hosecode == "=CN(//)") && (alt_pt2->hosecode == "=NN(//)")) { pKa_table.append(tr("6.8 (conjugated secondary amine)")); } if ((alt_pt1->hosecode.count("*C*N(//)") == 1) && (alt_pt2->hosecode.count("*C*N(//)") == 1)) { pKa_table.append(tr("5 (aromatic secondary amine)")); } if ((alt_pt1->hosecode.count("*N*N(//)") == 1) && (alt_pt2->hosecode.count("*C*N(//)") == 1)) { pKa_table.append(tr("1-3 (purine/pyrimidine)")); } if ((alt_pt1->hosecode.count("=NC(//)") == 1) && (alt_pt2->hosecode.count("CN(//)") == 1)) { pKa_table.append(tr("1-3 (purine/pyrimidine)")); } } if (tmp_pt->neighbors.count() == 3) { // tertiary amine alt_pt1 = tmp_pt->neighbors.at(0); alt_pt2 = tmp_pt->neighbors.at(1); alt_pt3 = tmp_pt->neighbors.at(2); if ((alt_pt1->hosecode.count("*") > 0) || (alt_pt2->hosecode.count("*") > 0) || (alt_pt3->hosecode.count("*") > 0)) { pKa_table.append(tr("4 (tertiary amine)")); continue; } if ((alt_pt1->hosecode.count("=O") == 0) && (alt_pt2->hosecode.count("=O") == 0) && (alt_pt3->hosecode.count("=O") == 0)) { pKa_table.append(tr("10 (aliphatic tertiary amine)")); } } } } if (tmp_pt->baseElement() == "O") { // qDebug() << "base element: O"; if (tmp_pt->substituents == 1) { alt_pt1 = tmp_pt->neighbors.at(0); // MakeSSSR() should set this if (alt_pt1->baseElement() == "O") { pKa_table.append(tr("8 (Peroxy acid)")); } if (alt_pt1->baseElement() == "S") { // sulfonic acid? if (alt_pt1->substituents >= 4) { int c_count = 0, o_count = 0; foreach (alt_pt2, alt_pt1->neighbors) { // qDebug() << "-" << alt_pt2->baseElement(); if (alt_pt2->baseElement() == "O") { alt_pt2->hit = true; o_count++; } if (alt_pt2->baseElement() == "O") { c_count++; } } if ((c_count == 1) && (o_count == 3)) pKa_table.append(tr("-1 (sulfonic acid)")); } } if (alt_pt1->baseElement() == "C") { if (alt_pt1->hosecode == "=OCO(//)") { // R-COOH // qDebug() << "carboxylic acid " << // alt_pt1->neighbors.count(); foreach (alt_pt2, alt_pt1->neighbors) { // qDebug() << "-" << alt_pt2->baseElement(); if (alt_pt2->baseElement() == "O") { alt_pt2->hit = true; } else { // qDebug() << "--" << alt_pt2->hosecode; if (alt_pt2->hosecode.count("*") > 0) { pKa_table.append(tr("4 (Aromatic carboxylic acid)")); } else { int halide_count = alt_pt2->hosecode.count("F") + alt_pt2->hosecode.count("X") + alt_pt2->hosecode.count("Y") + alt_pt2->hosecode.count("I"); if (halide_count == 0) pKa_table.append(tr("4.5 (Aliphatic carboxylic acid)")); if (halide_count == 1) pKa_table.append(tr("3 (Aliphatic carboxylic acid, " "a-halide)")); if (halide_count == 2) pKa_table.append(tr("1.3 (Aliphatic carboxylic " "acid, 2 a-halide)")); } } } continue; } if (alt_pt1->hosecode.count("*") > 0) { pKa_table.append(tr("10 (Aromatic -OH)")); } else { pKa_table.append(tr("16 (Aliphatic -OH)")); } } } } if (tmp_pt->baseElement() == "S") { // R-SH, Ar-SH (R-SO3H = consider under "O") if (tmp_pt->substituents == 1) { alt_pt1 = tmp_pt->neighbors.at(0); // MakeSSSR() should set this if (alt_pt1->hosecode.count("*") > 0) { pKa_table.append(tr("7.8 (Aromatic -SH)")); } else { pKa_table.append(tr("10.6 (Aliphatic -SH)")); } } } } QString finalList; finalList.append(tr("Estimated pKa's:")); for (QStringList::Iterator it = pKa_table.begin(); it != pKa_table.end(); ++it) { qDebug() << *it; finalList.append("\n"); finalList.append(*it); } if (pKa_table.count() < 1) { finalList.append("\n"); finalList.append(tr("There seem to be no sites with pKa between -1 and 15.")); } QMessageBox::information(r, tr("Estimated pKa's"), finalList); } xdrawchem-v1.11.0/xdrawchem/molecule_tools_2.cpp000066400000000000000000000623331371466245600217230ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // molecule_tools_2.cpp - Molecule's implementation of (more) functions #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "graphdialog.h" #include "moldata.h" #include "molecule.h" #include "molinfodialog.h" #include "render2d.h" //#include "namer.h" // Preferences extern Preferences preferences; // Scale the molecule. Should be used when loading the file. // bond_length sets the AVERAGE bond length. bond_length < 0 means // set according to current preferences. void Molecule::Scale(double bond_length) { double bond_sum = 0.0, bond_avg = 0.0, sf = 1.0; int nbonds = 0; // calculate current average bond length for (Bond *tmp_bond : bonds) { bond_sum += tmp_bond->Length(); nbonds++; } bond_avg = bond_sum / (double)nbonds; if (bond_length < 0.0) { bond_length = preferences.getBond_fixedlength(); } sf = bond_length / bond_avg; double topedge = 9999.0, leftedge = 9999.0; up = AllPoints(); for (DPoint *tmp_pt : up) { if (tmp_pt->x < leftedge) leftedge = tmp_pt->x; if (tmp_pt->y < topedge) topedge = tmp_pt->y; } for (DPoint *tmp_pt : up) { tmp_pt->x = ((tmp_pt->x - leftedge) * sf) + (leftedge * sf); tmp_pt->y = ((tmp_pt->y - topedge) * sf) + (topedge * sf); } } QList Molecule::BreakRingBonds(DPoint *target1) { QList bb; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(target1) == true) { DPoint *tmp_pt = tmp_bond->otherPoint(target1); tmp_pt->new_order = tmp_bond->Order(); bb.append(tmp_pt); bonds.removeAll(tmp_bond); tmp_bond = bonds.first(); } } return bb; } DPoint *Molecule::GetAttachPoint(QString sf) { DPoint *tmp_pt; if ((sf.contains("fmoc") > 0) || (sf.contains("boc") > 0) || (sf.contains("dabcyl") > 0) || (sf.contains("dabsyl") > 0) || (sf.contains("dansyl") > 0)) { up = AllPoints(); foreach (tmp_pt, up) { if (tmp_pt->element == "Cl") { qDebug() << "Point:Cl"; tmp_pt->element = "C"; break; } } for (Text *tmp_text : labels) { if (tmp_text->Start() == tmp_pt) { qDebug() << "removed"; labels.removeAll(tmp_text); break; } } qDebug() << tmp_pt->element; return tmp_pt; } if ((sf.contains("edans") > 0)) { up = AllPoints(); foreach (tmp_pt, up) { if (tmp_pt->element == "NH2") { qDebug() << "Point:NH2"; tmp_pt->element = "C"; break; } } for (Text *tmp_text : labels) { if (tmp_text->Start() == tmp_pt) { qDebug() << "removed"; labels.removeAll(tmp_text); break; } } qDebug() << tmp_pt->element; return tmp_pt; } if ((sf.contains("biotin") > 0)) { up = AllPoints(); foreach (tmp_pt, up) { if (tmp_pt->element == "OH") { qDebug() << "Biotin-Point:OH"; tmp_pt->element = "C"; break; } } for (Text *tmp_text : labels) { if (tmp_text->Start() == tmp_pt) { qDebug() << "removed"; labels.removeAll(tmp_text); break; } } qDebug() << tmp_pt->element; return tmp_pt; } // end biotin // for amino acids double ymax = 0.0; DPoint *ymaxpt = 0; up = AllPoints(); foreach (tmp_pt, up) { if (tmp_pt->element.contains("N") > 0) { qDebug() << "Point:NH2"; if (tmp_pt->y > ymax) { ymaxpt = tmp_pt; ymax = tmp_pt->y; } } } ymaxpt->element = "C"; for (Text *tmp_text : labels) { if (tmp_text->Start() == ymaxpt) { qDebug() << "removed"; labels.removeAll(tmp_text); break; } } qDebug() << ymaxpt->element; return ymaxpt; } DPoint *Molecule::GetRingAttachPoint() { double ymin = 99999.0; DPoint *yminpt = 0; up = AllPoints(); for (DPoint *tmp_pt : up) { if (tmp_pt->y < ymin) { yminpt = tmp_pt; ymin = tmp_pt->y; } } return yminpt; } double Molecule::CalculateRingAttachAngle(DPoint *t1) { double dx = 0.0, dy = 0.0; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(t1) == true) { DPoint *tmp_pt = tmp_bond->otherPoint(t1); dx = dx + (tmp_pt->x - t1->x); dy = dy + (tmp_pt->y - t1->y); break; } } double ang = atan(dy / dx); if (dx > 0.0) ang = ang + 3.14159; return ang; } // return sum of gas-phase bond enthalpy double Molecule::SumBondEnthalpy() { double dh = 0.0; for (Bond *tmp_bond : bonds) { dh += tmp_bond->Enthalpy(); } return dh; } // set group information void Molecule::setGroupType(int g1) { group_type = g1; } // build DPoint::neighbors list(s) void Molecule::AllNeighbors() { int n1, n2, n3; QList groupAtoms = AllPoints(); for (DPoint *tmp_pt : groupAtoms) { n1 = 0; n2 = 0; n3 = 0; tmp_pt->neighbors.clear(); tmp_pt->aromatic = false; tmp_pt->inring = false; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt) == true) { if (tmp_bond->Order() == 1) n1++; if (tmp_bond->Order() == 5) n1++; if (tmp_bond->Order() == 7) n1++; if (tmp_bond->Order() == 2) n2++; if (tmp_bond->Order() == 3) n3++; tmp_pt->neighbors.append(tmp_bond->otherPoint(tmp_pt)); tmp_pt->bondorder[(tmp_pt->neighbors.count() - 1)] = tmp_bond->Order(); } } tmp_pt->hybrid = "unknown"; if ((n1 == 1) && (n2 == 0) && (n3 == 0)) tmp_pt->hybrid = "sp3"; if ((n1 == 2) && (n2 == 0) && (n3 == 0)) tmp_pt->hybrid = "sp3"; if ((n1 == 3) && (n2 == 0) && (n3 == 0)) tmp_pt->hybrid = "sp3"; if ((n1 == 4) && (n2 == 0) && (n3 == 0)) tmp_pt->hybrid = "sp3"; if ((n1 == 5) && (n2 == 0) && (n3 == 0)) tmp_pt->hybrid = "sp3d2"; if ((n1 == 6) && (n2 == 0) && (n3 == 0)) tmp_pt->hybrid = "sp3d2"; if ((n1 == 0) && (n2 == 1) && (n3 == 0)) tmp_pt->hybrid = "sp2"; if ((n1 == 1) && (n2 == 1) && (n3 == 0)) tmp_pt->hybrid = "sp2"; if ((n1 == 2) && (n2 == 1) && (n3 == 0)) tmp_pt->hybrid = "sp2"; if ((n1 == 0) && (n2 == 2) && (n3 == 0)) tmp_pt->hybrid = "sp"; if ((n1 == 0) && (n2 == 0) && (n3 == 1)) tmp_pt->hybrid = "sp"; if ((n1 == 1) && (n2 == 0) && (n3 == 1)) tmp_pt->hybrid = "sp"; if ((n1 == 2) && (n2 == 2) && (n3 == 0)) tmp_pt->hybrid = "spd2"; } } // invoke from chemdata_tools.cpp // revised: now invoked from reactivity functions in Molecule // revised again: moved to static function in MolData class double Molecule::CalcPartialCharge(QString atomtype) { return 0.0; } Text *Molecule::CalcEmpiricalFormula(bool from_mw) { QList up; QString ef; QStringList allatoms, oddatoms; up = AllPoints(); // Split all labels into allatoms (one atom per entry) for (DPoint *tmp_pt : up) { // parse this string QString x = tmp_pt->plainElement(); QString iso; // isotope MW QString thiselement; // current element QString repeatnum; // number of repeats int ptr = 0; // cursor position (pointer) in x int isoflag = false; // isotope-override normal MW lookup if MW specified int repeat = 1; // number of this atom do { iso.remove(0, 999); thiselement.remove(0, 999); repeatnum.remove(0, 999); // Check if token starts with a number if (x.at(ptr).isNumber() == true) { // read isotope value isoflag = true; iso.append(x.at(ptr)); ptr++; if (x.at(ptr).isNumber() == true) { iso.append(x.at(ptr)); ptr++; } if (x.at(ptr).isNumber() == true) { iso.append(x.at(ptr)); ptr++; } } // ptr now points to first letter of element thiselement.append(x.at(ptr)); ptr++; qDebug() << x << " " << ptr; // if next letter is lowercase, add it too if (ptr < x.length() && x.at(ptr).category() == QChar::Letter_Lowercase) { thiselement.append(x.at(ptr)); ptr++; } // if next character is number, it's the subscript if (ptr < x.length() && x.at(ptr).isNumber()) { repeatnum.append(x.at(ptr)); ptr++; if (ptr < x.length() && x.at(ptr).isNumber()) { repeatnum.append(x.at(ptr)); ptr++; } if (ptr < x.length() && x.at(ptr).isNumber()) { repeatnum.append(x.at(ptr)); ptr++; } repeat = repeatnum.toInt(); } // Move to next letter/number if (ptr < x.length() && x.at(ptr).isSpace()) { ptr++; } // add atoms to list for (int cc = 0; cc < repeat; cc++) allatoms.append(thiselement); isoflag = false; repeat = 1; } while (ptr < x.length()); } // need to find implicit hydrogens here! int num_c = 0, num_h = 0, num_n = 0, num_o = 0, num_p = 0, num_s = 0; for (DPoint *tmp_pt : up) { int possible_h = 0; // qDebug() << "CalcEF:" << tmp_pt->element; possible_h = MolData::Hydrogens(tmp_pt->plainElement()); for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) possible_h -= tmp_bond->Order(); } if (possible_h < 0) { qDebug() << tmp_pt->element << " resulted in negative hydrogens "; qDebug() << "in Molecule::CalcEmpiricalFormula()"; possible_h = 0; } num_h += possible_h; } // convert allatoms to formula: first extract C,H,O,N,P,S // calculate molecular weight too nmw = (double)num_h * 1.00794; for (QStringList::Iterator it = allatoms.begin(); it != allatoms.end(); ++it) { nmw += MolData::NameToMW(*it); if (*it == "C") { num_c++; continue; } if (*it == "H") { num_h++; continue; } if (*it == "O") { num_o++; continue; } if (*it == "N") { num_n++; continue; } if (*it == "P") { num_p++; continue; } if (*it == "S") { num_s++; continue; } oddatoms.append(*it); } // qDebug() << "Found " << oddatoms.count() << " odd atoms." ; // sort odd atom list alphabetically (if necessary) if (oddatoms.count() > 0) oddatoms.sort(); QString finalef, n1; if (num_c > 0) { n1.setNum(num_c); finalef = finalef + "C"; if (num_c > 1) finalef = finalef + n1; } if (num_h > 0) { n1.setNum(num_h); finalef = finalef + "H"; if (num_h > 1) finalef = finalef + n1; } if (num_o > 0) { n1.setNum(num_o); finalef = finalef + "O"; if (num_o > 1) finalef = finalef + n1; } if (num_n > 0) { n1.setNum(num_n); finalef = finalef + "N"; if (num_n > 1) finalef = finalef + n1; } if (num_p > 0) { n1.setNum(num_p); finalef = finalef + "P"; if (num_p > 1) finalef = finalef + n1; } if (num_s > 0) { n1.setNum(num_s); finalef = finalef + "S"; if (num_s > 1) finalef = finalef + n1; } // add odd atoms if (oddatoms.count() > 0) { do { QString te = oddatoms.first(); int tc = 0; for (QStringList::Iterator ir = oddatoms.begin(); ir != oddatoms.end(); ++ir) { if (*ir == te) tc++; } finalef = finalef + te; n1.setNum(tc); if (tc > 1) finalef = finalef + n1; oddatoms.removeAll(te); } while (oddatoms.count() > 0); } // these are used for elemental analysis, don't delete nc = num_c; nh = num_h; nn = num_n; no = num_o; double nx, ny; QRect nr = BoundingBoxAll(); ny = nr.top() - 16.0; nx = (nr.left() + nr.right()) / 2.0; Text *tmp_text = new Text(r); DPoint *tmp_pt = new DPoint(nx, ny); tmp_text->setPoint(tmp_pt); tmp_text->setJustify(JUSTIFY_TOPLEFT); tmp_text->setText(finalef); for (int c = 0; c < finalef.length(); c++) { if (finalef[c].isLetter()) finalef.replace(c, 1, " "); if (finalef[c].isNumber()) finalef.replace(c, 1, "-"); } // tmp_text->setTextMask( finalef ); // if (from_mw == false) { // text_formula = tmp_text; // tmp_text->setMolecule(this); // tmp_text->setDataType(TEXT_DATA_FORMULA); //} return tmp_text; } Text *Molecule::CalcMW(bool from_change) { Text *tmp_txt1; tmp_txt1 = CalcEmpiricalFormula(true); double nx, ny; QRect nr = BoundingBoxAll(); ny = nr.bottom() + 5.0; nx = (nr.left() + nr.right()) / 2.0; Text *tmp_text = new Text(r); DPoint *tmp_pt = new DPoint(nx, ny); tmp_text->setPoint(tmp_pt); tmp_text->setJustify(JUSTIFY_TOPLEFT); QString finalmw; finalmw.setNum(nmw); finalmw = QString("MW = ") + finalmw; tmp_text->setText(finalmw); finalmw.fill(' '); // tmp_text->setTextMask( finalmw ); // if (from_change == false) { // text_mw = tmp_text; // tmp_text->setMolecule(this); // tmp_text->setDataType(TEXT_DATA_MW); //} return tmp_text; } Text *Molecule::CalcElementalAnalysis(bool show_dialog) { QString ea, n1; // calc empirical formula and total molecular weight Text *tmp_text = CalcMW(); nc *= 12.011; nh *= 1.00794; nn *= 14.0067; no *= 15.994; nc = nc * 100 / nmw; nh = nh * 100 / nmw; no = no * 100 / nmw; nn = nn * 100 / nmw; ea.append(tr("Elemental analysis:\n")); ea.append("C = "); n1.setNum(nc); ea.append(n1); ea.append("%\n"); ea.append("H = "); n1.setNum(nh); ea.append(n1); ea.append("%\n"); ea.append("O = "); n1.setNum(no); ea.append(n1); ea.append("%\n"); ea.append("N = "); n1.setNum(nn); ea.append(n1); ea.append("%"); /* int m1; if (show_dialog == true) { m1 = QMessageBox::information(r, tr("Elemental analysis"), ea, tr("Paste"), tr("OK"), QString::null, 1, 1); } else { m1 = 0; } */ double nx, ny; QRect nr = BoundingBoxAll(); ny = nr.top() + 8.0; nx = nr.right() + 16.0; tmp_text = new Text(r); // CHECK_PTR(tmp_text); DPoint *tmp_pt = new DPoint(nx, ny); tmp_text->setPoint(tmp_pt); // qDebug() << ea; tmp_text->setJustify(JUSTIFY_TOPLEFT); tmp_text->setText(ea); ea.fill(' '); // tmp_text->setTextMask( ea ); return tmp_text; } void Molecule::AddPeak(double d1, QString s1, QString s2) { Peak *tmp_peak = new Peak; tmp_peak->value = d1; tmp_peak->multiplicity = 1; tmp_peak->intensity = 80; if (s2.contains("broad") > 0) tmp_peak->intensity = 40; if (s2.contains("narrow") > 0) tmp_peak->intensity = 120; tmp_peak->comment = s2; foreach (Peak *tpeak, peaklist) { if ((tpeak->value == tmp_peak->value) && (tpeak->multiplicity == tmp_peak->multiplicity)) { tpeak->intensity += 1; delete tmp_peak; tmp_peak = 0; break; } } if (tmp_peak != 0) peaklist.append(tmp_peak); } // add hydrogens to atoms. Only add to carbon if to_carbons == true void Molecule::AddHydrogens(bool to_carbon) { // qDebug() << "AddHydrogens(" << to_carbon << "), prefs = " << // preferences.getFixHydrogens(); up = AllPoints(); int h = 0, sumbonds = 0; double dx; QString hnum, orig_element; int least_hindered_side; // calculate hindrance first for (DPoint *tmp_pt : up) { // find order of bonds least_hindered_side = 0; sumbonds = 0; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) { dx = tmp_pt->x - tmp_bond->otherPoint(tmp_pt)->x; if (dx > 0.5) least_hindered_side++; if (dx < -0.5) least_hindered_side--; } } // save # of bonds found // qDebug() << tmp_pt->toQPoint() << "(" << tmp_pt->element << "): found // substituents = " << sumbonds; tmp_pt->substituents = sumbonds; tmp_pt->C13_shift = least_hindered_side; // update Text, if it exists, with least hindered side for (Text *tmp_text : labels) { if (tmp_text->Start() == tmp_pt) { if (least_hindered_side < 0) tmp_text->CheckAlignment(2); // left hindered else tmp_text->CheckAlignment(1); // right hindered } } } // add hydrogens if user requested if (preferences.getFixHydrogens() == false) return; for (DPoint *tmp_pt : up) { orig_element = tmp_pt->element; if (tmp_pt->element == "") tmp_pt->element = "C"; sumbonds = 0; least_hindered_side = 0; h = 0; // don't add to carbons unless specifically instructed if ((tmp_pt->element == "C") && (to_carbon == false)) continue; // skip special cases if (tmp_pt->element == "CO") continue; if (tmp_pt->element == "SO") continue; // don't do fragments with charges if (tmp_pt->element.contains("+") > 0) continue; if (tmp_pt->element.contains("-") > 0) continue; // N typically needs correcting... if (tmp_pt->element == "HN") tmp_pt->element = "N"; if (tmp_pt->element == "NH") tmp_pt->element = "N"; if (tmp_pt->element == "H2N") tmp_pt->element = "N"; if (tmp_pt->element == "NH2") tmp_pt->element = "N"; if (tmp_pt->element == "H3N") tmp_pt->element = "N"; if (tmp_pt->element == "NH3") tmp_pt->element = "N"; // so does O if (tmp_pt->element == "HO") tmp_pt->element = "O"; if (tmp_pt->element == "OH") tmp_pt->element = "O"; if (tmp_pt->element == "H2O") tmp_pt->element = "O"; if (tmp_pt->element == "OH2") tmp_pt->element = "O"; // let's do thiols too, so H ends up on proper side if (tmp_pt->element == "HS") tmp_pt->element = "S"; if (tmp_pt->element == "SH") tmp_pt->element = "S"; // retrieve # of bonds found sumbonds = 0; // tmp_pt->substituents; for (Bond *tmp_bond : bonds) { if (tmp_bond->Find(tmp_pt)) { if (tmp_bond->Order() < 4) sumbonds += tmp_bond->Order(); if (tmp_bond->Order() >= 4) sumbonds += 1; } } least_hindered_side = (int)tmp_pt->C13_shift; // don't add if hydrogen already present if (tmp_pt->element.contains("H") == 0) { h = MolData::Hydrogens(tmp_pt->element) - sumbonds; qDebug() << "Found hydrogens: " << h; if (h > 1) hnum.setNum(h); else hnum = ""; if (h > 0) { if (least_hindered_side < 0) tmp_pt->element.prepend("H" + hnum); else tmp_pt->element.append("H" + hnum); } } // now find Text which reference this DPoint and copy back QString elbackup; if (orig_element != tmp_pt->element) { for (Text *tmp_text : labels) { if (tmp_text->Start() == tmp_pt) { elbackup = tmp_pt->element; qDebug() << tmp_pt->element; tmp_text->setText(tmp_pt->element); // *sigh* I suppose the least I can do is compute a proper // textmask elbackup.fill(' '); if (h > 1) { if (least_hindered_side < 0) { elbackup.replace(1, 1, "-"); } else { elbackup.replace(tmp_pt->element.length() - 1, 1, "-"); } } // tmp_text->setTextMask( elbackup ); // tmp_pt->element = elbackup; } // if (tmp_text->...) } // for(tmp_text...) } // if (orig...) } } // reactivity: use this for doing partial charges/VdW for now // int argument specifies analysis type void Molecule::Reactivity(int react_type) { qDebug() << "Reactivity(" << react_type << ")"; // get list of unique points up = AllPoints(); // find aromatic rings MakeSSSR(); // solve HOSE codes Calc13CNMR(false); // add hydrogens qDebug() << bonds.count(); AddNMRprotons(); up = AllPoints(); // need to re-run after adding protons qDebug() << bonds.count(); // reactivity... build list of all atom and bond retro-types QString localatomtype; double sumcharge = 0.0; atomRxns.clear(); bondRxns.clear(); foreach (DPoint *tmp_atomrxniter, up) { localatomtype = RetroAtomName(tmp_atomrxniter); atomRxns.append(localatomtype); // set partial charges here tmp_atomrxniter->react_atom_type = localatomtype; tmp_atomrxniter->partial_charge = CalcPartialCharge(localatomtype); sumcharge += MolData::partialCharge(localatomtype, 0); } qDebug() << "Calc total charge: " << sumcharge; qDebug() << "Atom count: " << atomRxns.count(); foreach (Bond *tmp_bondRxns, bonds) { if (tmp_bondRxns->isCHBond() == false) { bondRxns.append(RetroBondName(tmp_bondRxns)); tmp_bondRxns->setCName(RetroBondName(tmp_bondRxns)); // bondrxniter.current()->setReactions(BuildReactionList(bondrxniter.current()->CName())); } } qDebug() << "Bond count: " << bondRxns.count(); // do stuff, based on value passed in arg if (react_type == MODE_TOOL_REACTIVITY_FORWARD) { // for reactivity, we should look at atom types first, since atoms will // be the likely target of forward reactions. qDebug() << "Atom type list for FORWARD:"; for (QStringList::Iterator it = atomRxns.begin(); it != atomRxns.end(); ++it) { qDebug() << *it; } qDebug() << "--- list ends ---"; // we will also have to consider other atom types and bonds that may // interfere with a given reaction } if (react_type == MODE_TOOL_REACTIVITY_RETRO) { // for retrosynthesis, we are more interested in bonds, to se how they // might have been formed qDebug() << "Bond type list for RETRO:"; for (QStringList::Iterator it = bondRxns.begin(); it != bondRxns.end(); ++it) { qDebug() << *it; } qDebug() << "--- list ends ---"; // we will also have to consider R group substitution here. // call Molecule::Retro() (in retro.cpp) to do matching /*int nr = */ Retro(); } if (react_type == MODE_TOOL_CHARGES) { // just look at atom types and assign AMBER-like partial charges qDebug() << "Sum of charges = " << sumcharge; } // remove added hydrogens RemoveNMRprotons(); qDebug() << bonds.count(); } xdrawchem-v1.11.0/xdrawchem/molinfodialog.cpp000066400000000000000000000074571371466245600213060ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include "defs.h" #include "helpwindow.h" #include "molinfodialog.h" // defined in main.cpp extern QString RingDir; MolInfoDialog::MolInfoDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Molecule Info")); setMinimumWidth(400); QGridLayout *grid = new QGridLayout(); nameLabel = new QLabel(tr("Name: ")); nameLabel->setText(tr("Name: ")); grid->addWidget(nameLabel, 0, 0, 1, 1); synLabel = new QLabel(tr("Other names: ")); // synLabel->setAlignment( synLabel->alignment() | Qt::TextWordWrap ); grid->addWidget(synLabel, 1, 0, 1, 1); casLabel = new QLabel(tr("CAS: ")); grid->addWidget(casLabel, 2, 0, 1, 1); pcLabel = new QLabel(tr("PubChem compound: ")); grid->addWidget(pcLabel, 3, 0, 1, 1); molWeight = tr("Molecular weight = "); molWeightCheckBox = new QCheckBox(molWeight); grid->addWidget(molWeightCheckBox, 4, 0, 1, 1); ef = tr("Formula = "); ef_check = new QCheckBox(ef); grid->addWidget(ef_check, 5, 0, 1, 1); ea_check = new QCheckBox(tr("Analysis")); grid->addWidget(ea_check, 6, 0, 1, 1); eaLabel = new QLabel(ea); grid->addWidget(eaLabel, 7, 0, 1, 1); QPushButton *okBtn, *dismissBtn, *helpBtn; QHBoxLayout *btnLayout = new QHBoxLayout(); getpcc = new QPushButton(tr("Search PubChem")); connect(getpcc, SIGNAL(clicked()), SLOT(doPubChem())); btnLayout->addWidget(getpcc); getpcc->setEnabled(false); QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); btnLayout->addItem(spacer); helpBtn = new QPushButton(tr("Help")); connect(helpBtn, SIGNAL(clicked()), SLOT(SendHelp())); btnLayout->addWidget(helpBtn); okBtn = new QPushButton(tr("OK")); connect(okBtn, SIGNAL(clicked()), SLOT(doAccept())); btnLayout->addWidget(okBtn); dismissBtn = new QPushButton(tr("Cancel")); connect(dismissBtn, SIGNAL(clicked()), SLOT(reject())); btnLayout->addWidget(dismissBtn); grid->addLayout(btnLayout, 8, 0, 1, 1); setLayout(grid); } void MolInfoDialog::doAccept() { emit MIDClose(); } void MolInfoDialog::doPubChem() { QString ffurl, ffcmd; ffurl = "http://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid=" + pcc; QDesktopServices::openUrl(QUrl(ffurl, QUrl::TolerantMode)); /*ffcmd = "firefox " + ffurl + " &"; qDebug() << ffcmd; system( ffcmd.toLatin1() ); QClipboard *cb = QApplication::clipboard(); // Copy text into the clipboard cb->setText( ffurl, QClipboard::Clipboard );*/ } void MolInfoDialog::SendHelp() { QString home, topic; topic = "molinfo.html"; #ifdef UNIX home = RingDir + "doc/" + topic; #else home = RingDir + "doc\\" + topic; #endif HelpWindow *help = new HelpWindow(home, ".", 0); help->setWindowTitle(QString(XDC_VERSION) + " - Help viewer"); help->show(); } // cmake#include "molinfodialog.moc" xdrawchem-v1.11.0/xdrawchem/molinfodialog.h000066400000000000000000000046171371466245600207460ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef MIDIALOG_H #define MIDIALOG_H #include #include #include #include #include class MolInfoDialog : public QDialog { Q_OBJECT public: MolInfoDialog(QWidget *parent); bool isMWChecked() { return molWeightCheckBox->isChecked(); } bool isEFChecked() { return ef_check->isChecked(); } bool isEAChecked() { return ea_check->isChecked(); } void setMW(QString s1) { molWeightCheckBox->setText(s1); } void setEF(QString s1) { ef = tr("Formula = "); ef += s1; ef_check->setText(ef); } void setEA(QString s1) { ea = s1; eaLabel->setText(ea); } void setCAS(QString s1) { if (s1 != "unknown") { casLabel->setText(tr("CAS:") + s1); } } void setPCC(QString s1) { if (s1 != "unknown") { pcc = s1; getpcc->setEnabled(true); pcLabel->setText(tr("PubChem compound:") + s1); } } void setName(QString s1) { qDebug() << s1; if (s1 != "unknown") { nameLabel->setText(tr("Name:") + s1); } } void setSynonyms(QString s1) { qDebug() << s1; if (s1 != "unknown") { synLabel->setText(tr("Other names:") + s1); } } public slots: void SendHelp(); void doAccept(); void doPubChem(); signals: void MIDClose(); private: QCheckBox *molWeightCheckBox, *ef_check, *dg_check, *ea_check; QLabel *nameLabel, *casLabel, *synLabel, *pcLabel, *eaLabel; QString molWeight, ea, ef, dg, casno, pcc; QPushButton *getpcc; }; #endif xdrawchem-v1.11.0/xdrawchem/myfiledialog.cpp000066400000000000000000000023371371466245600211200ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include "myfiledialog.h" MyFileDialog::MyFileDialog(QWidget *parent) : QFileDialog(parent) { setOption(QFileDialog::DontUseNativeDialog, true); setAcceptMode(QFileDialog::AcceptSave); trans_toggle = new QCheckBox(tr("Transparent"), this); trans_toggle->setChecked(false); layout()->addWidget(trans_toggle); /// TODO: place } bool MyFileDialog::isTransparent() { return trans_toggle->isChecked(); } xdrawchem-v1.11.0/xdrawchem/myfiledialog.h000066400000000000000000000020401371466245600205540ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef MYFILEDIALOG_H #define MYFILEDIALOG_H #include #include class MyFileDialog : public QFileDialog { Q_OBJECT public: MyFileDialog(QWidget *parent); bool isTransparent(); private: QCheckBox *trans_toggle; }; #endif xdrawchem-v1.11.0/xdrawchem/na_xpm.h000066400000000000000000001531451371466245600174060ustar00rootroot00000000000000/* XPM */ static const char *na_adenine[] = { /* width height num_colors chars_per_pixel */ " 98 95 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################", "##########################.#####.##.#####.################################" "########################", "##########################..####.##.#####.################################" "########################", "##########################.#.###.##.#####.################################" "########################", "##########################.#.###.##.#####.################################" "########################", "##########################.##.##.##.......################################" "########################", "##########################.###.#.##.#####.###...##########################" "########################", "##########################.###.#.##.#####.##.###.#########################" "########################", "##########################.####..##.#####.######.#########################" "########################", "##########################.#####.##.#####.#####.##########################" "########################", "##############################################.###########################" "########################", "#############################################.############################" "########################", "############################################.#############################" "########################", "#############################.##############.#############################" "########################", "#############################.##############.....#########################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "#############################.############################################" "########################", "###########################..#..#######################################.##" "###.####################", "#########################..#####..#####################################..#" "###.####################", "#######################..########..####################################.#." "###.####################", "######################..##..#######..##################################.#." "###.####################", "####################..##..###########..################################.##" ".##.####################", "##################..###..#############..###############################.##" "#.#.####################", "#################..##..#################..###########################.#.##" "#.#.####################", "####.#####.####..##..####################..#######################...##.##" "##..####################", "####..####.##..###..#######################..#################....#####.##" "###.####################", "####.#.###.#..##..###########################..############....###########" "########################", "####.#.###.###..##############################..########...###############" "#####.##################", "####.##.##.##..#################################..##....##################" "######.#################", "####.###.#.#.#####################################..######################" "###.###.################", "####.###.#.#####################################.#.#######################" "####.###.###############", "####.####..#####################################.#.#######################" "#####.###.##############", "####.#####.#####################################.#.#######################" "######.###.#############", "################################################.#.#######################" "#######.###.############", "################################################.#.#######################" "########.###.###########", "################################################.#.#######################" "#########.###.##########", "#######.########################################.#.#######################" "##########.###.#########", "#######.########################################.#.#######################" "###########.###.########", "#######.########################################.#.#######################" "############.###.#######", "#######.########################################.#.#######################" "#############.###.######", "#######.########################################.#.#######################" "########################", "#######.########################################.#.#######################" "#################.######", "#######.########################################.#.#######################" "################.#######", "#######.########################################.#.#######################" "###############.########", "#######.########################################.#.#######################" "##############..########", "#######.########################################.#.#######################" "#############..#########", "#######.########################################.#.#######################" "############..##########", "#######.########################################.#.#######################" "############.###########", "#######.########################################.#.#######################" "###########.############", "#######.########################################.#.#######################" "##########.#############", "#######.########################################.#.#######################" "#########.##############", "#######.########################################.#.#######################" "########.###############", "#######.##.#######################################.#######################" "#######.################", "#######.###..#####################################..######################" "########################", "########..###..#################################..##....##################" "########################", "##########..##..##############################..########...############.##" "###.##.#####.###########", "############..##..###########################..############....########..#" "###.##.#####.###########", "#############..###..#######################..#################....#####.#." "###.##.#####.###########", "###############..##..####################..#######################...##.#." "###.##.#####.###########", "#################..##..#################..###########################.#.##" ".##.##.......###########", "##################..###..#############..###############################.##" "#.#.##.#####.###########", "####################..##.#.#####.####..################################.##" "#.#.##.#####.###########", "######################..##..####.##..##################################.##" "##..##.#####.###########", "#######################..#.#.###.#.####################################.##" "###.##.#####.###########", "##########################.#.###.#########################################" "########################", "##########################.##.##.#########################################" "########################", "##########################.###.#.#########################################" "########################", "##########################.###.#.#########################################" "########################", "##########################.####..#########################################" "########################", "##########################.#####.#########################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################", "##########################################################################" "########################"}; /* XPM */ static const char *na_cytosine[] = { /* width height num_colors chars_per_pixel */ " 79 95 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "#################################################.#####.##.#####.#########" "#####", "#################################################..####.##.#####.#########" "#####", "#################################################.#.###.##.#####.#########" "#####", "#################################################.#.###.##.#####.#########" "#####", "#################################################.##.##.##.......#########" "#####", "#################################################.###.#.##.#####.###...###" "#####", "#################################################.###.#.##.#####.##.###.##" "#####", "#################################################.####..##.#####.######.##" "#####", "#################################################.#####.##.#####.#####.###" "#####", "#####################################################################.####" "#####", "####################################################################.#####" "#####", "###################################################################.######" "#####", "####################################################.##############.######" "#####", "####################################################.##############.....##" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "####################################################.#####################" "#####", "##################################################..#..###################" "#####", "################################################..#####..#################" "#####", "##############################################..########..################" "#####", "#############################################..##..#######..##############" "#####", "###########################################..##..###########..############" "#####", "#########################################..###..#############..###########" "#####", "########################################..##..#################..#########" "#####", "###########################.#####.####..##..####################..########" "#####", "###########################..####.##..###..#######################..######" "#####", "###########################.#.###.#..##..###########################..####" "#####", "###########################.#.###.###..##############################..###" "#####", "###########################.##.##.##..#################################..#" "#####", "###########################.###.#.#.#####################################." "#####", "###########################.###.#.#####################################.#." "#####", "###########################.####..#####################################.#." "#####", "###########################.#####.#####################################.#." "#####", "#######################################################################.#." "#####", "#######################################################################.#." "#####", "#######################################################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "############################.#.##########################################." "#####", "###########################..#.##########################################." "#####", "#########################..###..########################################.#" "#####", "#######################..######..######################################..#" "#####", "#####################..#######.##..##################################..###" "#####", "###################..########..####..##############################..#####" "#####", "#################...#######..########..##########################...######" "#####", "################..#######..############..#################################" "#####", "##############..#######..###############...###############################" "#####", "######....###.#######..###################..#####.#####.##.#####.#########" "#####", "#####.####.########...######################..###..####.##.#####.#########" "#####", "####.######.######..##########################..#.#.###.##.#####.#########" "#####", "####.######.####..###############################.#.###.##.#####.#########" "#####", "####.######.##..#################################.##.##.##.......#########" "#####", "####.######.#.###################################.###.#.##.#####.#########" "#####", "####.######.#####################################.###.#.##.#####.#########" "#####", "#####.####.######################################.####..##.#####.#########" "#####", "######....#######################################.#####.##.#####.#########" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####"}; /* XPM */ static const char *na_guanine[] = { /* width height num_colors chars_per_pixel */ " 136 95 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "##############################################################", "##########################################################################" "##############################################################", "##########################################################################" "##############################################################", "##########################################################################" "##############################################################", "##########################################################################" "##############################################################", "#################################################################....#####" "##############################################################", "################################################################.####.####" "##############################################################", "###############################################################.######.###" "##############################################################", "###############################################################.######.###" "##############################################################", "###############################################################.######.###" "##############################################################", "###############################################################.######.###" "##############################################################", "###############################################################.######.###" "##############################################################", "################################################################.####.####" "##############################################################", "#################################################################....#####" "##############################################################", "##########################################################################" "##############################################################", "##########################################################################" "##############################################################", "##########################################################################" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "#################################################################.###.####" "##############################################################", "###################################################################.######" "##############################################################", "#################################################################..#..####" "###################################.#####.####################", "###############################################################..#####..##" "###################################..####.####################", "#############################################################..########..#" "###################################.#.###.####################", "############################################################..###########." ".##################################.#.###.####################", "##########################################################..##############" "#..################################.##.##.####################", "########################################################..################" "##..###############################.###.#.####################", "#######################################################..#################" "####..###########################.#.###.#.####################", "################################.#####.##.#####.#####..###################" "#####..#######################...##.####..####################", "################################.#####.##..####.###..#####################" "#######..#################....#####.#####.####################", "################################.#####.##.#.###.##..######################" "#########..############....###################################", "################################.#####.##.#.###.#.########################" "##########..########...####################.##################", "################################.......##.##.##.##########################" "############..##....########################.#################", "################################.#####.##.###.#.##########################" "##############..#########################.###.################", "################################.#####.##.###.#.##########################" "############.#.###########################.###.###############", "################################.#####.##.####..##########################" "############.#.############################.###.##############", "################################.#####.##.#####.##########################" "############.#.#############################.###.#############", "##########################################################################" "############.#.##############################.###.############", "##########################################################################" "############.#.###############################.###.###########", "##########################################################################" "############.#.################################.###.##########", "#############################################.############################" "############.#.#################################.###.#########", "#############################################.############################" "############.#.##################################.###.########", "#############################################.############################" "############.#.###################################.###.#######", "#############################################.############################" "############.#.####################################.###.######", "#############################################.############################" "############.#.###############################################", "#############################################.############################" "############.#.########################################.######", "#############################################.############################" "############.#.#######################################.#######", "#############################################.############################" "############.#.######################################.########", "#############################################.############################" "############.#.#####################################..########", "#############################################.############################" "############.#.####################################..#########", "#############################################.############################" "############.#.###################################..##########", "#############################################.############################" "############.#.###################################.###########", "#############################################.############################" "############.#.##################################.############", "#############################################.############################" "############.#.#################################.#############", "#############################################.############################" "############.#.################################.##############", "#############################################.############################" "############.#.###############################.###############", "#############################################.##.#########################" "##############.##############################.################", "#############################################.###..#######################" "##############..##############################################", "###########################################..#..###..#####################" "############..##....##########################################", "#########################################..#####..##..####################" "##########..########...############.#####.##.#####.###########", "########################################..########..##..##################" "#########..############....########..####.##.#####.###########", "######################################..###########..###..################" "#######..#################....#####.#.###.##.#####.###########", "####################################..###############..##..###############" "#####..#######################...##.#.###.##.#####.###########", "###################################..##################..##..#############" "####..###########################.#.##.##.##.......###########", "#################################..#####################..###..###########" "##..###############################.###.#.##.#####.###########", "####.#####.#########.#####.#####..########################..##.#.#####.###" "#..################################.###.#.##.#####.###########", "####.#####.#########..####.###..############################..##..####.##." ".##################################.####..##.#####.###########", "####.#####.#########.#.###.#..###############################..#.#.###.#.#" "###################################.#####.##.#####.###########", "####.#####.#########.#.###.#.###################################.#.###.###" "##############################################################", "####.......#########.##.##.#####################################.##.##.###" "##############################################################", "####.#####.###...###.###.#.#####################################.###.#.###" "##############################################################", "####.#####.##.###.##.###.#.#####################################.###.#.###" "##############################################################", "####.#####.######.##.####..#####################################.####..###" "##############################################################", "####.#####.#####.###.#####.#####################################.#####.###" "##############################################################", "###############.##########################################################" "##############################################################", "##############.###########################################################" "##############################################################", "#############.############################################################" "##############################################################", "#############.############################################################" "##############################################################", "#############.....########################################################" "##############################################################", "##########################################################################" "##############################################################"}; /* XPM */ static const char *na_thymine[] = { /* width height num_colors chars_per_pixel */ " 100 95 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "#################################################....#####################" "##########################", "################################################.####.####################" "##########################", "###############################################.######.###################" "##########################", "###############################################.######.###################" "##########################", "###############################################.######.###################" "##########################", "###############################################.######.###################" "##########################", "###############################################.######.###################" "##########################", "################################################.####.####################" "##########################", "#################################################....#####################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "#################################################.###.####################" "##########################", "###################################################.######################" "##########################", "#################################################..#..####################" "##################..######", "###############################################..#####..##################" "################..########", "##############################################..########..################" "###############..#########", "############################################..###########..###############" "#############..###########", "##########################################..###############..#############" "###########..#############", "#########################################..##################..###########" "##########..##############", "#######################################..#####################..##########" "########..################", "#################.#####.##.#####.#####..########################..########" "#######..#################", "#################.#####.##..####.###..############################..######" "#####..###################", "#################.#####.##.#.###.#..###############################..#####" "###..#####################", "#################.#####.##.#.###.#.##################################..###" "##..######################", "#################.......##.##.##.######################################..#" "..########################", "#################.#####.##.###.#.########################################." "##########################", "#################.#####.##.###.#.######################################.#." "##########################", "#################.#####.##.####..######################################.#." "##########################", "#################.#####.##.#####.######################################.#." "##########################", "#######################################################################.#." "##########################", "#######################################################################.#." "##########################", "#######################################################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "##############################.########################################.#." "##########################", "############################.#.##########################################." "##########################", "###########################..#.##########################################." "##########################", "#########################..###..########################################.#" "##########################", "#######################..######..######################################..#" "##########################", "#####################..#######.##..##################################..###" "##########################", "###################..########..####..##############################..#####" "##########################", "#################...#######..#######...##########################..#######" "##########################", "################..#######..###########..##################################" "##########################", "##############..#######..###############..################################" "##########################", "######....###.#######..###################..####.#####.##.#####.##########" "##########################", "#####.####.########...#####################...##..####.##.#####.##########" "##########################", "####.######.######..#########################..#.#.###.##.#####.##########" "##########################", "####.######.####..##############################.#.###.##.#####.##########" "##########################", "####.######.##..################################.##.##.##.......##########" "##########################", "####.######.#.##################################.###.#.##.#####.##########" "##########################", "####.######.####################################.###.#.##.#####.##########" "##########################", "#####.####.#####################################.####..##.#####.##########" "##########################", "######....######################################.#####.##.#####.##########" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################", "##########################################################################" "##########################"}; /* XPM */ static const char *na_uracil[] = { /* width height num_colors chars_per_pixel */ " 79 95 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "#################################################....#####################" "#####", "################################################.####.####################" "#####", "###############################################.######.###################" "#####", "###############################################.######.###################" "#####", "###############################################.######.###################" "#####", "###############################################.######.###################" "#####", "###############################################.######.###################" "#####", "################################################.####.####################" "#####", "#################################################....#####################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "#################################################.###.####################" "#####", "###################################################.######################" "#####", "#################################################..#..####################" "#####", "###############################################..#####..##################" "#####", "##############################################..########..################" "#####", "############################################..###########..###############" "#####", "##########################################..###############..#############" "#####", "#########################################..##################..###########" "#####", "#######################################..#####################..##########" "#####", "#################.#####.##.#####.#####..########################..########" "#####", "#################.#####.##..####.###..############################..######" "#####", "#################.#####.##.#.###.#..###############################..#####" "#####", "#################.#####.##.#.###.#.##################################..###" "#####", "#################.......##.##.##.######################################..#" "#####", "#################.#####.##.###.#.########################################." "#####", "#################.#####.##.###.#.######################################.#." "#####", "#################.#####.##.####..######################################.#." "#####", "#################.#####.##.#####.######################################.#." "#####", "#######################################################################.#." "#####", "#######################################################################.#." "#####", "#######################################################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "##############################.########################################.#." "#####", "############################.#.##########################################." "#####", "###########################..#.##########################################." "#####", "#########################..###..########################################.#" "#####", "#######################..######..######################################..#" "#####", "#####################..#######.##..##################################..###" "#####", "###################..########..####..##############################..#####" "#####", "#################...#######..#######...##########################..#######" "#####", "################..#######..###########..##################################" "#####", "##############..#######..###############..################################" "#####", "######....###.#######..###################..####.#####.##.#####.##########" "#####", "#####.####.########...#####################...##..####.##.#####.##########" "#####", "####.######.######..#########################..#.#.###.##.#####.##########" "#####", "####.######.####..##############################.#.###.##.#####.##########" "#####", "####.######.##..################################.##.##.##.......##########" "#####", "####.######.#.##################################.###.#.##.#####.##########" "#####", "####.######.####################################.###.#.##.#####.##########" "#####", "#####.####.#####################################.####..##.#####.##########" "#####", "######....######################################.#####.##.#####.##########" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####", "##########################################################################" "#####"}; xdrawchem-v1.11.0/xdrawchem/netaccess.cpp000066400000000000000000000207431371466245600204240ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "http.h" #include "netaccess.h" NetAccess::NetAccess() : QDialog() { status = true; sname = "unknown"; siupacname = "unknown"; scas = "unknown"; spccompound = "unknown"; buffer = 0; // http = new QNetworkAccessManager( this ); // progressDialog = new QProgressDialog( this ); // connect( http, SIGNAL( dataReadProgress( int, int ) ), SLOT( // slotUpdateDataReadProgress( int, int ) ) ); connect( http, SIGNAL( // finished( QNetworkReply * ) ), SLOT( slotFinished( QNetworkReply * ) ) ); // connect( http, SIGNAL( done( bool ) ), SLOT( rf( bool ) ) ); } QStringList NetAccess::getChoices(QString server, QString key, QString value, bool exact) { if (key == "formula") { // put atoms in proper order value = Rearrange(value); } QString cmd; cmd.append(server); cmd.append("/newdb.php?field="); cmd.append(key); cmd.append("&query="); if (key == "name") value = value.toUpper(); cmd.append(value); cmd.append("&exact="); if (exact) cmd.append("on"); else cmd.append("off"); QUrl url = QUrl(cmd); qInfo() << "getChoices URL:" << cmd; HTTP if1(cmd); if1.exec(); // httpRequestAborted = false; // http->setHost( url.host(), url.port() != -1 ? url.port() : 80 ); qDebug() << Qt::endl << "Results:" << Qt::endl << if1.Data(); // connect( progressDialog, SIGNAL( canceled() ), this, SLOT( // slotCancelDownload() ) ); // buffer = new QBuffer( this ); // buffer->open( QIODevice::WriteOnly ); QString testq = if1.Data(); // choicesId = http->get( url.path(), buffer ); // QTextStream in1(buffer, QIODevice::ReadOnly); // progressDialog->setLabelText( tr( "Getting choices" ) ); // progressDialog->show(); // bool saveflag = false; QTextStream in1(&testq, QIODevice::ReadOnly); QStringList results; // bool saveflag = false; QString tmpl; do { tmpl = in1.readLine(); // if (tmpl == "XXX") { saveflag = true; continue; } // if (tmpl == "YYY") { saveflag = false; continue; } // if (saveflag) results.append(tmpl); if (tmpl.length() > 5) results.append(tmpl); } while (!in1.atEnd()); return results; // what a program should always do! } QString NetAccess::getCanonicalSmiles(QString nserver, QString insmiles) { qDebug() << "NetAccess::getCanonicalSMILES() is obsolete"; return QString(); } QString NetAccess::getFile(QString server, QString fn) { QString cmd, wholefile; cmd.append("http://"); cmd.append(server); cmd.append("/cgi-bin/getfile?name="); cmd.append(fn); HTTP if1(cmd); if1.exec(); wholefile = if1.Data(); return wholefile; return QString(); } bool NetAccess::runBuild3D(QString buildfile) { QString cmd, wholefile; cmd.append("http://xdrawchem.sourceforge.net/cgi-bin/runbuild?buildfile="); cmd.append(buildfile); HTTP if1(cmd); if1.exec(); // qDebug() << Qt::endl << "Results:" << Qt::endl << if1.Data() ; s3dmol = if1.Data(); if (s3dmol.contains("can't write ") > 0) return false; if (s3dmol.contains("output file not found") > 0) return false; return true; } bool NetAccess::runInChI(QString buildfile) { qDebug() << "obsolete function call: NetAccess::runInChI()"; return true; } QString NetAccess::Rearrange(QString key) { QString key1, subkey, subnum; int cc; bool addflag; QStringList allatoms; do { // qDebug() << key ; // parse out element subkey = ""; addflag = false; subkey.append(key[0]); for (cc = 1; cc < key.length(); cc++) { if (key[cc].category() == QChar::Letter_Uppercase) { allatoms.append(subkey); key.remove(0, cc); addflag = true; break; } else { subkey.append(key[cc]); } } if (addflag == false) { allatoms.append(subkey); key.remove(0, cc); } } while (key.length() > 0); // qDebug() << allatoms.count() ; QString sym, n1; allatoms.sort(); if (allatoms.count() > 0) { for (QStringList::Iterator ir = allatoms.begin(); ir != allatoms.end(); ++ir) { n1 = *ir; if (n1.contains("C") > 0) key1.append(n1); if (n1.contains("H") > 0) key1.append(n1); } for (QStringList::Iterator ir = allatoms.begin(); ir != allatoms.end(); ++ir) { n1 = *ir; if ((n1.contains("C") == 0) && (n1.contains("H") == 0)) key1.append(n1); } } return key1; } void NetAccess::slotData(const QByteArray &d1) { htfile.append(d1); } void NetAccess::slotUpdateDataReadProgress(int bytesRead, int totalBytes) { if (httpRequestAborted) return; // progressDialog->setMaximum( totalBytes ); // progressDialog->setValue( bytesRead ); } void NetAccess::slotCancelDownload() { qDebug() << "slotCancelDownload"; httpRequestAborted = true; // http->abort(); emit(choicesFinished(QStringList())); } void NetAccess::slotFinished(int httpId, bool) { qDebug() << "Finished network access"; status = false; if (httpId == choicesId) { buffer->close(); QString tmpl; QStringList results = QStringList("test"); buffer->open(QIODevice::ReadOnly); do { tmpl = buffer->readLine(); qDebug() << tmpl; // if (tmpl == "XXX") { saveflag = true; continue; } // if (tmpl == "YYY") { saveflag = false; continue; } // if (saveflag) results.append(tmpl); if (tmpl.length() > 5) results.append(tmpl); } while (!buffer->atEnd()); emit(choicesFinished(results)); delete buffer; buffer = 0; } } bool NetAccess::getNameCAS(QString nserver, QString sinchi) { qInfo() << "getNameCAS:" << nserver << "," << sinchi; // don't waste bandwidth... if (sinchi.length() < 2) return false; // runInChI( ssmiles ); obsolete, we use OpenBabel now! sinchi = sinchi.trimmed(); QStringList choices = getChoices(nserver, "inchi", sinchi, true); QString tmp_str, tpc, tcas, tiname, tformula, tsyn; int i1; for (QStringList::Iterator ir = choices.begin(); ir != choices.end(); ++ir) { tmp_str = *ir; qDebug() << ">>>" << tmp_str; tmp_str.replace("\",\"", "~"); i1 = tmp_str.indexOf("~"); tpc = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tcas = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tiname = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tformula = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tsyn = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); // qDebug() << tcas << "," << tname <<","<< tformula << "," << tformat // ; tpc.replace("\"", ""); tcas.replace("\"", ""); tsyn.replace("\"", ""); tiname.replace("\"", ""); qInfo() << "-- DB return: --"; qInfo() << tpc; qInfo() << tcas; qInfo() << tiname; qInfo() << tsyn; qInfo() << "-- DB end --"; spccompound = tpc; scas = tcas; siupacname = tiname; sname = tsyn; return true; } return false; } bool NetAccess::get3DMol(QString inmol) { return false; } void NetAccess::rf(bool error) {} xdrawchem-v1.11.0/xdrawchem/netaccess.h000066400000000000000000000034531371466245600200700ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef NETACCESS_H #define NETACCESS_H #include class QString; class QStringList; class QProgressDialog; class QHttp; class QBuffer; class NetAccess : public QDialog { Q_OBJECT public: NetAccess(); QStringList getChoices(QString, QString, QString, bool); QString getFile(QString, QString); QString getCanonicalSmiles(QString, QString); QString Rearrange(QString); bool getNameCAS(QString, QString); bool get3DMol(QString); bool runBuild3D(QString); bool runInChI(QString); bool status; QString htfile, spccompound, sname, scas, siupacname, s3dmol, fullinchi, shortinchi; QHttp *http; public slots: void slotData(const QByteArray &); void slotFinished(int, bool); void rf(bool); private: // QProgressDialog *progressDialog; bool httpRequestAborted; QBuffer *buffer; int choicesId; private slots: void slotUpdateDataReadProgress(int, int); void slotCancelDownload(); signals: void choicesFinished(const QStringList &); }; #endif xdrawchem-v1.11.0/xdrawchem/netchoosedialog.cpp000066400000000000000000000114461371466245600216230ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include "defs.h" #include "netchoosedialog.h" NetChooseDialog::NetChooseDialog(QWidget *parent, QStringList r1) : QDialog(parent) { results = r1; QPushButton *ok, *dismiss; QLabel *cap1; setWindowTitle(tr("Choose Structure")); QGridLayout *mygrid = new QGridLayout(this); cap1 = new QLabel(tr("Select a molecule from list and click OK:"), this); mygrid->addWidget(cap1, 0, 0, 1, 4); tw = new QTableWidget(this); connect(tw, SIGNAL(cellDoubleClicked(int, int)), SLOT(cellDoubleClicked(int, int))); tw->setRowCount(r1.size()); tw->setColumnCount(5); QStringList m_TableHeader; m_TableHeader << "CAS" << "IUPAC Name" << "Formula" << "Other names" << "SMILES"; tw->setHorizontalHeaderLabels(m_TableHeader); tw->verticalHeader()->setVisible(false); tw->setEditTriggers(QAbstractItemView::NoEditTriggers); tw->setSelectionBehavior(QAbstractItemView::SelectRows); tw->setSelectionMode(QAbstractItemView::SingleSelection); tw->setShowGrid(false); // lv->setSorting(0); ///TODO; this should be set after loading data // anyways. mygrid->addWidget(tw, 1, 0, 3, 4); int i1, iRow = 0; QString tmp_str, tcas, tformula, tformat, tname, taltname; // QListWidgetItem *lvi; for (QStringList::Iterator ir = r1.begin(); ir != r1.end(); ++ir) { tmp_str = *ir; tmp_str.replace("\",\"", "~"); i1 = tmp_str.indexOf("~"); tcas = tmp_str.mid(1, i1 - 1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tcas = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tname = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tformula = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); taltname = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); i1 = tmp_str.indexOf("~"); tformat = tmp_str.mid(0, i1); tmp_str.remove(0, i1 + 1); // qDebug() << tcas << "," << tname <<","<< tformula << ","; tname.replace("\"", ""); tcas.replace("\"", ""); tformat.replace("\"", ""); taltname.replace("\"", ""); tformula.replace("\"", ""); tw->setItem(iRow, 0, new QTableWidgetItem(tcas)); tw->setItem(iRow, 1, new QTableWidgetItem(tname)); tw->setItem(iRow, 2, new QTableWidgetItem(tformula)); tw->setItem(iRow, 3, new QTableWidgetItem(taltname)); tw->setItem(iRow, 4, new QTableWidgetItem(tformat)); iRow++; /*lvi = new QListWidgetItem( lv ); lvi->setText( tcas ); lvi->setText( tname ); lvi->setText( tformula ); lvi->setText( taltname ); lvi->setText( tformat );*/ // lv->addItem(lvi); } QHBoxLayout *buttonHBox = new QHBoxLayout(this); QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); buttonHBox->addItem(spacer); ok = new QPushButton(tr("Select"), this); connect(ok, SIGNAL(clicked()), SLOT(OK())); buttonHBox->addWidget(ok); dismiss = new QPushButton(tr("Cancel"), this); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); buttonHBox->addWidget(dismiss); mygrid->addLayout(buttonHBox, 4, 0, 1, 4); } void NetChooseDialog::OK() { // save SMILES string of selected item int iRow = tw->currentItem()->row(); fn = tw->item(iRow, 4)->text(); fn.replace("\"", ""); // strip quotes qInfo() << "OK: fn = " << fn << ", row = " << iRow; accept(); } void NetChooseDialog::cellDoubleClicked(int row, int col) { // save SMILES string of selected item fn = tw->item(row, 4)->text(); fn.replace("\"", ""); // strip quotes qInfo() << "dblClick: fn = " << fn << ", row = " << row; accept(); } // cmake#include "netchoosedialog.moc" xdrawchem-v1.11.0/xdrawchem/netchoosedialog.h000066400000000000000000000023071371466245600212640ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef NETCHOOSEDIALOG_H #define NETCHOOSEDIALOG_H #include #include #include class NetChooseDialog : public QDialog { Q_OBJECT public: NetChooseDialog(QWidget *parent, QStringList); QString getFile() { return fn; } public slots: void OK(); void cellDoubleClicked(int, int); private: QString fn; QStringList results; QTableWidget *tw; /// TODO }; #endif xdrawchem-v1.11.0/xdrawchem/netdialog.cpp000066400000000000000000000052461371466245600204230ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include "defs.h" #include "netdialog.h" //#include "http.h" NetDialog::NetDialog(QWidget *parent) : QDialog(parent) { QString serverName; serverName = getenv("XDC_SERVER"); if (serverName.length() < 2) serverName = XDC_SERVER; QLabel *cap1, *caption, *l1; setWindowTitle(tr("Find structure via Internet")); QGridLayout *mygrid = new QGridLayout(this); cap1 = new QLabel(tr("XDC database server:")); mygrid->addWidget(cap1, 0, 0, 1, 4); serverkey = new QLineEdit(); serverkey->setText(serverName); mygrid->addWidget(serverkey, 0, 4, 1, 4); caption = new QLabel(tr("Search type:")); mygrid->addWidget(caption, 1, 0, 1, 4); keylist = new QComboBox(); keylist->addItem(tr("Chemical name")); keylist->addItem(tr("CAS Number")); keylist->addItem(tr("Formula")); mygrid->addWidget(keylist, 1, 4, 1, 4); l1 = new QLabel(tr("Look for:"), this); mygrid->addWidget(l1, 2, 0, 1, 4); searchkey = new QLineEdit(); mygrid->addWidget(searchkey, 2, 4, 1, 4); connect(searchkey, SIGNAL(returnPressed()), SLOT(accept())); searchkey->setFocus(); emcheck = new QCheckBox(tr("Exact matches only")); mygrid->addWidget(emcheck, 3, 0, 1, 8); QHBoxLayout *buttonHBox = new QHBoxLayout(); QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); buttonHBox->addItem(spacer); QPushButton *ok, *dismiss; ok = new QPushButton(tr("Search")); connect(ok, SIGNAL(clicked()), SLOT(accept())); buttonHBox->addWidget(ok); dismiss = new QPushButton(tr("Cancel")); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); buttonHBox->addWidget(dismiss); mygrid->addLayout(buttonHBox, 4, 0, 1, 8); } xdrawchem-v1.11.0/xdrawchem/netdialog.h000066400000000000000000000030111371466245600200540ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef NETDIALOG_H #define NETDIALOG_H #include #include class QLineEdit; class NetDialog : public QDialog { public: NetDialog(QWidget *parent); QString getKey() { QString ret; if (keylist->currentIndex() == 0) ret = "name"; else if (keylist->currentIndex() == 1) ret = "cas"; else if (keylist->currentIndex() == 2) ret = "formula"; return ret; } QString getValue() { return searchkey->text(); } QString getServer() { return serverkey->text(); } bool getExact() { return emcheck->isChecked(); } private: QString fn; QComboBox *dblist, *keylist; QCheckBox *emcheck; QLineEdit *searchkey, *serverkey; }; #endif xdrawchem-v1.11.0/xdrawchem/newman-anti.xpm000066400000000000000000000072511371466245600207130ustar00rootroot00000000000000/* XPM */ static const char * newman_anti_xpm[] = { "57 60 2 1", " c None", ". c #000000", " ", " ", " ", " ", " ", " ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . . ", " .. ...... .. ", " .. ... . ... .. ", " .. . . . .. ", " .. . . . .. ", " .. . . . .. ", " ... . . .. ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . .. .. . ", " . .. .. . ", " . . . . ", " . .. .. . ", " . .. ... ", " ... ... ", " .. . . .. ", " .. . . ... ", " .. . . .. ", " .. ... ... .. ", " .. ...... .. ", " .. . . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " ", " ", " ", " "}; xdrawchem-v1.11.0/xdrawchem/newman-eclipse.xpm000066400000000000000000000057001371466245600214010ustar00rootroot00000000000000/* XPM */ static const char * newman_eclipse_xpm[] = { "52 52 2 1", " c None", ". c #000000", " ", " ", " ", " ", " . ", " . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " ...... . ", " ... . ... ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . .. .. . ", " .... .. .. . ", " ...... . . . . ", " .... . .. .. . ", " . .. ... ", " ... ... ", " .. . . .. ", " .. . . ... ", " .. . ... .. ", " .. ... ... .. .. ", " .. ...... . .. ", " .. . . ", " . ", " . ", " .. ", " .. ", " . ", " . ", " ", " ", " ", " "}; xdrawchem-v1.11.0/xdrawchem/newman.xpm000066400000000000000000000031101371466245600177500ustar00rootroot00000000000000/* XPM */ static const char * newman_xpm[] = { "36 38 2 1", " c None", ". c #000000", " ", " ", " ", " ", " ", " ", " ", " ", " ...... ", " ... . ... ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . . . ", " . .. .. . ", " . .. .. . ", " . . . . ", " . .. .. . ", " . .. ... ", " . . ", " . . ", " . . ", " . . ", " ... ... ", " ...... ", " ", " ", " ", " ", " ", " "}; xdrawchem-v1.11.0/xdrawchem/ngw.cpp000066400000000000000000000127361371466245600172520ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ngw.cpp - definitions for functions of class NewGraphWidget #include #include #include #include #include #include "defs.h" #include "graphdata.h" #include "ngw.h" #include "render2d.h" NewGraphWidget::NewGraphWidget(QWidget *parent) : QWidget(parent) { setMinimumWidth(500); setMinimumHeight(200); datatype = 0; output = 0; PrintSetup(); } void NewGraphWidget::paintEvent(QPaintEvent *pe) { QPainter p; QString s, ft; // bool cmp2 = false; // int cx = 10, cy = 10; if (output == 0) p.begin(this); else p.begin(printer); int tick_spacing, t1, peakplace; QString n1; switch (datatype) { case DATA_1HNMR: tick_spacing = qRound(((double)width() - 40.0) / 12.0); // draw baseline p.drawLine(20, height() - 40, width() - 20, height() - 40); // draw ticks for (int x = 0; x < 13; x++) { t1 = 20 + x * tick_spacing; p.drawLine(t1, height() - 40, t1, height() - 35); n1.setNum(12 - x); p.drawText(t1 - 2, height() - 22, n1); } // draw spectrum for (GraphData *tmp_data : peaks) { peakplace = width() - 20 - qRound(tmp_data->value * tick_spacing); p.setPen(tmp_data->pcolor); p.drawLine(peakplace, height() - 40, peakplace, height() - 40 - (15 * tmp_data->intensity)); } break; case DATA_13CNMR: tick_spacing = (width() - 40) / 9; // draw baseline p.drawLine(20, height() - 40, width() - 20, height() - 40); // draw ticks for (int x = 0; x < 10; x++) { t1 = 20 + x * tick_spacing; p.drawLine(t1, height() - 40, t1, height() - 35); n1.setNum((8 - x) * 20); p.drawText(t1 - 2, height() - 22, n1); } // draw spectrum for (GraphData *tmp_data : peaks) { peakplace = width() - 20 - tick_spacing - ((tmp_data->value / 20.0) * tick_spacing); p.setPen(tmp_data->pcolor); p.drawLine(peakplace, height() - 40, peakplace, height() - 40 - qRound(15.0 * tmp_data->intensity)); } break; case DATA_IR: tick_spacing = (width() - 40) / 12; // draw baseline p.drawLine(20, 40, width() - 20, 40); // draw ticks for (int x = 0; x < 13; x++) { t1 = 20 + x * tick_spacing; p.drawLine(t1, 40, t1, 35); n1.setNum((12 - x) * 300); p.drawText(t1 - 3, 22, n1); } // draw spectrum for (GraphData *tmp_data : peaks) { peakplace = width() - 20 - (qRound(tmp_data->value / 300.0) * tick_spacing); p.setPen(tmp_data->pcolor); p.drawLine(peakplace, 40, peakplace, 40 + tmp_data->intensity); } break; default: break; } } void NewGraphWidget::PrintSetup() { printer = new QPrinter; printer->setFullPage(true); printer->setPageSize(QPrinter::Letter); printer->setOrientation(QPrinter::Portrait); printer->setColorMode(QPrinter::GrayScale); } void NewGraphWidget::Print() { qDebug() << "Graph::Print"; QPrintDialog dialog(printer, this); if (!dialog.exec()) { return; } output = 1; update(); output = 0; update(); } void NewGraphWidget::AddPeak(double v1, QColor c1, QString l1, QString t1) { GraphData *g1 = new GraphData; g1->value = v1; g1->fulltext = t1; g1->pcolor = c1; if (l1.isEmpty() == false) { g1->label = l1; g1->drawlabel = true; } // check for duplicate peaks foreach (GraphData *tg, peaks) { if (tg->value == v1) { tg->intensity++; return; } } peaks.append(g1); } void NewGraphWidget::AddPeak(Peak *tmp_peak, QColor c1) { GraphData *g1 = new GraphData; g1->value = tmp_peak->value; g1->fulltext = tmp_peak->comment; g1->intensity = tmp_peak->intensity; g1->pcolor = c1; // check for duplicate peaks foreach (GraphData *tg, peaks) { if ((tg->value == g1->value) && (tg->pcolor == g1->pcolor)) { qDebug() << "found existing peak"; tg->intensity += g1->intensity; delete g1; return; } } peaks.append(g1); } void NewGraphWidget::AddPeak(double v1, int m1, QColor c1, QString l1, QString t1) { GraphData *g1 = new GraphData; g1->value = v1; g1->fulltext = t1; g1->pcolor = c1; g1->intensity = m1; if (l1.isEmpty() == false) { g1->label = l1; g1->drawlabel = true; } peaks.append(g1); } // cmake#include "ngw.moc" xdrawchem-v1.11.0/xdrawchem/ngw.h000066400000000000000000000032701371466245600167100ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ngw.h -- class definition for 'new' XDrawChem NMR/MS/IR graph widget. #ifndef NEWGRAPHWIDGET_H #define NEWGRAPHWIDGET_H #include #include #include "graphdata.h" #include "peak.h" #define DATA_1HNMR 1 #define DATA_13CNMR 2 #define DATA_IR 3 class QPaintEvent; class QPrinter; class NewGraphWidget : public QWidget { Q_OBJECT public: NewGraphWidget(QWidget *parent = 0); void setDataType(int x) { datatype = x; } void AddPeak(double, QColor, QString l1 = QString(), QString t1 = QString()); void AddPeak(double, int, QColor, QString l1 = QString(), QString t1 = QString()); void AddPeak(Peak *, QColor); void AddPixmap(QPixmap p) { p1 = p; } void PrintSetup(); public slots: void Print(); protected: void paintEvent(QPaintEvent *); private: int datatype; int output; QList peaks; QPixmap p1; QPrinter *printer; }; #endif xdrawchem-v1.11.0/xdrawchem/p_orbital.xpm000066400000000000000000000007641371466245600204520ustar00rootroot00000000000000/* XPM */ static char * p_orbital_xpm[] = { "16 20 3 1", " g None", ". g #FFFFFF", "+ g #000000", "................", "....+++++++.....", "...++.....++....", "..++.......++...", "..+.........+...", "..+.........+...", "..+.........+...", "..+.........+...", "..+.........+...", "..++.......++...", "...+.......+....", "...++.....++....", "....++...++.....", ".....+...+......", ".....++.++......", "......+.+.......", "......+++.......", ".......+........", ".......+........", "................"}; xdrawchem-v1.11.0/xdrawchem/pagesetupdialog.cpp000066400000000000000000000172011371466245600216240ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include "defs.h" #include "pagesetupdialog.h" #include "prefs.h" extern Preferences preferences; PageSetupDialog::PageSetupDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Page setup")); QGridLayout *mygrid = new QGridLayout(); QLabel *pageSizeLabel = new QLabel(); pageSizeLabel->setText(tr("Paper size:")); mygrid->addWidget(pageSizeLabel, 0, 0, 1, 2); paperSize = new QComboBox(); paperSize->addItem(tr("Letter (8.5\" x 11\")")); paperSize->addItem(tr("Legal (8.5\" x 14\")")); paperSize->addItem(tr("A4 (210 mm x 297 mm)")); paperSize->addItem(tr("640x480 pixels")); paperSize->addItem(tr("800x600 pixels")); paperSize->addItem(tr("1024x768 pixels")); paperSize->addItem(tr("Custom paper size")); if (preferences.getPageSize() == PAGE_LETTER) paperSize->setCurrentIndex(0); if (preferences.getPageSize() == PAGE_LEGAL) paperSize->setCurrentIndex(1); if (preferences.getPageSize() == PAGE_A4) paperSize->setCurrentIndex(2); if (preferences.getPageSize() == PAGE_640) paperSize->setCurrentIndex(3); if (preferences.getPageSize() == PAGE_800) paperSize->setCurrentIndex(4); if (preferences.getPageSize() == PAGE_1024) paperSize->setCurrentIndex(5); if (preferences.getPageSize() == PAGE_CUSTOM) paperSize->setCurrentIndex(6); ps_set = paperSize->currentIndex(); mygrid->addWidget(paperSize, 0, 2, 1, 2); QLabel *paperOrientLabel = new QLabel(tr("Orientation:")); mygrid->addWidget(paperOrientLabel, 1, 0, 1, 2); paperOrient = new QComboBox(); paperOrient->addItem(tr("Portrait")); paperOrient->addItem(tr("Landscape")); if (preferences.getPageOrientation() == PAGE_PORTRAIT) paperOrient->setCurrentIndex(0); if (preferences.getPageOrientation() == PAGE_LANDSCAPE) paperOrient->setCurrentIndex(1); po_set = paperOrient->currentIndex(); connect(paperOrient, SIGNAL(activated(int)), SLOT(SwapWH(int))); mygrid->addWidget(paperOrient, 1, 2, 1, 2); int pw = preferences.getPageWidth(); int ph = preferences.getPageHeight(); int pu = preferences.getUnits(); int decimals = 2; double pwf, phf; QString unitstr, n1; unitstr = "undef"; if (pu == PIXELS) { unitstr = tr("pixels"); decimals = 0; pwf = (double)pw; phf = (double)ph; } if (pu == ENGLISH) { unitstr = tr("inches"); pwf = (double)pw / 100.0; phf = (double)ph / 100.0; } if (pu == METRIC) { unitstr = tr("cm"); pwf = (double)pw / 40.0; phf = (double)ph / 40.0; } QLabel *paperWidthLabel = new QLabel(tr("Page width:")); mygrid->addWidget(paperWidthLabel, 2, 0, 1, 2); paperWidth = new QDoubleSpinBox(); paperWidth->setMaximum(5000); paperWidth->setSuffix(" " + unitstr); paperWidth->setDecimals(decimals); paperWidth->setValue(pwf); mygrid->addWidget(paperWidth, 2, 2, 1, 2); QLabel *paperHeightLabel = new QLabel(tr("Page height:")); mygrid->addWidget(paperHeightLabel, 3, 0, 1, 2); paperHeight = new QDoubleSpinBox(); paperHeight->setMaximum(5000); paperHeight->setSuffix(" " + unitstr); paperHeight->setDecimals(decimals); paperHeight->setValue(phf); mygrid->addWidget(paperHeight, 3, 2, 1, 2); QHBoxLayout *buttonHBox = new QHBoxLayout(); QSpacerItem *spacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); buttonHBox->addItem(spacer); QPushButton *ok, *dismiss; ok = new QPushButton(tr("OK")); connect(ok, SIGNAL(clicked()), SLOT(accept())); buttonHBox->addWidget(ok); dismiss = new QPushButton(tr("Cancel")); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); buttonHBox->addWidget(dismiss); mygrid->addLayout(buttonHBox, 4, 0, 1, 4); setLayout(mygrid); } void PageSetupDialog::onSuccessful() { // save settings to Preferences class double pw = paperWidth->value(); double ph = paperHeight->value(); int pu = preferences.getUnits(); int pwf, phf; if (pu == PIXELS) { pwf = (int)pw; phf = (int)ph; } if (pu == ENGLISH) { pwf = (int)(pw * 100.0); phf = (int)(ph * 100.0); } if (pu == METRIC) { pwf = (int)(pw * 40.0); phf = (int)(ph * 40.0); } preferences.setPageWidth(pwf); preferences.setPageHeight(phf); if (paperSize->currentIndex() == 0) preferences.setPageSize(PAGE_LETTER); if (paperSize->currentIndex() == 1) preferences.setPageSize(PAGE_LEGAL); if (paperSize->currentIndex() == 2) preferences.setPageSize(PAGE_A4); if (paperSize->currentIndex() == 3) preferences.setPageSize(PAGE_640); if (paperSize->currentIndex() == 4) preferences.setPageSize(PAGE_800); if (paperSize->currentIndex() == 5) preferences.setPageSize(PAGE_1024); if (paperSize->currentIndex() == 6) preferences.setPageSize(PAGE_CUSTOM); if (paperOrient->currentIndex() == 0) preferences.setPageOrientation(PAGE_PORTRAIT); if (paperOrient->currentIndex() == 1) preferences.setPageOrientation(PAGE_LANDSCAPE); accept(); // exit gracefully } void PageSetupDialog::SwapWH(int nx) { if (po_set == paperOrient->currentIndex()) return; po_set = paperOrient->currentIndex(); double n1; n1 = paperWidth->value(); paperWidth->setValue(paperHeight->value()); paperHeight->setValue(n1); } void PageSetupDialog::setPageSize(int n) { if (n == PAGE_LETTER) paperSize->setCurrentIndex(0); if (n == PAGE_LEGAL) paperSize->setCurrentIndex(1); if (n == PAGE_A4) paperSize->setCurrentIndex(2); if (n == PAGE_640) paperSize->setCurrentIndex(3); if (n == PAGE_800) paperSize->setCurrentIndex(4); if (n == PAGE_1024) paperSize->setCurrentIndex(5); } int PageSetupDialog::getPageSize() { if (paperSize->currentIndex() == 0) return PAGE_LETTER; if (paperSize->currentIndex() == 1) return PAGE_LEGAL; if (paperSize->currentIndex() == 2) return PAGE_A4; if (paperSize->currentIndex() == 3) return PAGE_640; if (paperSize->currentIndex() == 4) return PAGE_800; if (paperSize->currentIndex() == 5) return PAGE_1024; return PAGE_LETTER; } void PageSetupDialog::setOrientation(int n) { if (n == PAGE_PORTRAIT) paperOrient->setCurrentIndex(0); if (n == PAGE_LANDSCAPE) paperOrient->setCurrentIndex(1); } int PageSetupDialog::getOrientation() { if (paperOrient->currentIndex() == 0) return PAGE_PORTRAIT; if (paperOrient->currentIndex() == 1) return PAGE_LANDSCAPE; return PAGE_PORTRAIT; } // cmake#include "pagesetupdialog.moc" xdrawchem-v1.11.0/xdrawchem/pagesetupdialog.h000066400000000000000000000025311371466245600212710ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef PSDIALOG_H #define PSDIALOG_H #include class QComboBox; class QDoubleSpinBox; class QLabel; class PageSetupDialog : public QDialog { Q_OBJECT public: PageSetupDialog(QWidget *parent); void setPageSize(int); int getPageSize(); void setOrientation(int); int getOrientation(); public slots: void onSuccessful(); void SwapWH(int); private: QComboBox *paperSize, *paperOrient; QDoubleSpinBox *paperWidth, *paperHeight; QLabel *unitWidthLabel, *unitHeightLabel; int papersize, orient, ps_set, po_set; }; #endif xdrawchem-v1.11.0/xdrawchem/paintable.h000066400000000000000000000020131371466245600200460ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef PAINTABLE_H #define PAINTABLE_H #include class Paintable { public: int op; QPoint a; QPoint b; QPoint b1; QColor c; QFont f; QChar ch; QString st; QPixmap p; int s; int t; }; #endif xdrawchem-v1.11.0/xdrawchem/peak.h000066400000000000000000000017701371466245600170400ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef PEAK_H #define PEAK_H #define PEAK_REACTANT 1 #define PEAK_PRODUCT 2 class Peak { public: int r_p; // reactant or product? double value; int multiplicity; int intensity; QString comment; }; #endif xdrawchem-v1.11.0/xdrawchem/peptidebuilder.cpp000066400000000000000000000114521371466245600214520ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "peptidebuilder.h" PeptDialog::PeptDialog(QWidget *parent) { setWindowTitle(tr("Peptide Builder")); QGridLayout *mygrid = new QGridLayout(this); QLabel *ltop = new QLabel(tr("Enter peptide sequence -\nthree-letter abbreviations:")); mygrid->addWidget(ltop, 0, 0, 0, 7); peptide = new QLineEdit(); mygrid->addWidget(peptide, 1, 1, 0, 7); QLabel *lne = new QLabel(tr("Shortcut: Hold 'Alt' and type one-letter codes!")); mygrid->addWidget(lne, 2, 2, 0, 7); QVBoxLayout *btnBoxLayout = new QVBoxLayout(); QButtonGroup *bgroup = new QButtonGroup(this); QPushButton *b1; b1 = new QPushButton("Ala (&A)"); btnBoxLayout->addWidget(b1); bgroup->addButton(b1); b1 = new QPushButton("Arg (&R)"); bgroup->addButton(b1); b1 = new QPushButton("Asn (&N)"); bgroup->addButton(b1); b1 = new QPushButton("Asp (&D)"); bgroup->addButton(b1); b1 = new QPushButton("Cys (&C)"); bgroup->addButton(b1); b1 = new QPushButton("Gln (&Q)"); bgroup->addButton(b1); b1 = new QPushButton("Glu (&E)"); bgroup->addButton(b1); b1 = new QPushButton("Gly (&G)"); bgroup->addButton(b1); b1 = new QPushButton("His (&H)"); bgroup->addButton(b1); b1 = new QPushButton("Ile (&I)"); bgroup->addButton(b1); b1 = new QPushButton("Leu (&L)"); bgroup->addButton(b1); b1 = new QPushButton("Lys (&K)"); bgroup->addButton(b1); b1 = new QPushButton("Met (&M)"); bgroup->addButton(b1); b1 = new QPushButton("Nph"); bgroup->addButton(b1); b1 = new QPushButton("Phe (&F)"); bgroup->addButton(b1); b1 = new QPushButton("Pro (&P)"); bgroup->addButton(b1); b1 = new QPushButton("Ser (&S)"); bgroup->addButton(b1); b1 = new QPushButton("Sta"); bgroup->addButton(b1); b1 = new QPushButton("Thr (&T)"); bgroup->addButton(b1); b1 = new QPushButton("Trp (&W)"); bgroup->addButton(b1); b1 = new QPushButton("Tyr (&Y)"); bgroup->addButton(b1); b1 = new QPushButton("Val (&V)"); bgroup->addButton(b1); connect(bgroup, SIGNAL(buttonClicked(int)), this, SLOT(buttonPress(int))); mygrid->addLayout(btnBoxLayout, 3, 4, 0, 7); QPushButton *ok, *dismiss; ok = new QPushButton(tr("OK"), this); connect(ok, SIGNAL(clicked()), SLOT(accept())); mygrid->addWidget(ok, 5, 5, 0, 1); dismiss = new QPushButton(tr("Cancel"), this); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); mygrid->addWidget(dismiss, 5, 5, 6, 7); } QString PeptDialog::getPeptide() { return peptide->text(); } void PeptDialog::buttonPress(int b1) { switch (b1) { case 0: peptide->insert("Ala"); break; case 1: peptide->insert("Arg"); break; case 2: peptide->insert("Asn"); break; case 3: peptide->insert("Asp"); break; case 4: peptide->insert("Cys"); break; case 5: peptide->insert("Gln"); break; case 6: peptide->insert("Glu"); break; case 7: peptide->insert("Gly"); break; case 8: peptide->insert("His"); break; case 9: peptide->insert("Ile"); break; case 10: peptide->insert("Leu"); break; case 11: peptide->insert("Lys"); break; case 12: peptide->insert("Met"); break; case 13: peptide->insert("Nph"); break; case 14: peptide->insert("Phe"); break; case 15: peptide->insert("Pro"); break; case 16: peptide->insert("Ser"); break; case 17: peptide->insert("Sta"); break; case 18: peptide->insert("Thr"); break; case 19: peptide->insert("Trp"); break; case 20: peptide->insert("Tyr"); break; case 21: peptide->insert("Val"); break; default: break; } } // cmake#include "peptidebuilder.moc" xdrawchem-v1.11.0/xdrawchem/peptidebuilder.h000066400000000000000000000020701371466245600211130ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef PEPTDIALOG_H #define PEPTDIALOG_H #include #include class PeptDialog : public QDialog { Q_OBJECT public: PeptDialog(QWidget *parent); QString getPeptide(); public slots: void buttonPress(int); private: QLineEdit *peptide; }; #endif xdrawchem-v1.11.0/xdrawchem/prefs.h000066400000000000000000000253261371466245600172420ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // prefs.h -- static Preferences class #ifndef PREFS_H #define PREFS_H #include #include #include #include #include #include #include #include "defs.h" class Preferences { public: Preferences() { Defaults(); } void Defaults() { fixed_arrow = true; arrow_fixedlength = 50.0; arrow_fixedangle = 15.0; fixed_bond = true; bond_fixedlength = 25.0; bond_fixedangle = 15.0; dbond_offset = 4.0; fix_hydrogens = true; paper_size = PAGE_LETTER; // perhaps change for Europe/Japan release :) paper_orient = PAGE_PORTRAIT; paper_width = 750; paper_height = 1000; units = PIXELS; gridmode = GRID_NONE; drawgrid = GRID_NONE; snapgrid = GRID_NONE; gridspace = 25; dyk = true; dykcount = 0; zoom = 100; mainFont = QFont("Helvetica", 10); rulerFont = QFont("Courier", 8); bondcenter = false; } void setFile(QString fn, bool fb) { fileName = fn; fallback = fb; } void setSaveFile(QString fn) { saveFileName = fn; } bool LoadPrefs() { QFile fin(fileName); if (fin.open(QIODevice::ReadOnly) == false) return false; QTextStream tin(&fin); QString line; do { line = tin.readLine(); // qDebug() << "PREFS:" << line ; if (line.toUpper().contains("FIXED_ARROW") > 0) { if (line.toUpper().contains("TRUE")) fixed_arrow = true; else fixed_arrow = false; } if (line.toUpper().contains("FIXED_BOND") > 0) { if (line.toUpper().contains("TRUE")) fixed_bond = true; else fixed_bond = false; } if (line.toUpper().contains("FIX_HYDROGENS") > 0) { if (line.toUpper().contains("TRUE")) fix_hydrogens = true; else fix_hydrogens = false; } if (line.toUpper().contains("DYK_TF") > 0) { if (line.toUpper().contains("TRUE")) dyk = true; else dyk = false; } if (line.toUpper().contains("ARROW_LENGTH") > 0) { arrow_fixedlength = line.mid(13).toDouble(); } if (line.toUpper().contains("ARROW_ANGLE") > 0) { arrow_fixedangle = line.mid(12).toDouble(); } if (line.toUpper().contains("BOND_LENGTH") > 0) { bond_fixedlength = line.mid(12).toDouble(); } if (line.toUpper().contains("BOND_ANGLE") > 0) { bond_fixedangle = line.mid(11).toDouble(); } if (line.toUpper().contains("DBOND_OFFSET") > 0) { dbond_offset = line.mid(13).toDouble(); } if (line.toUpper().contains("PAPER_SIZE") > 0) { paper_size = line.mid(11).toInt(); } if (line.toUpper().contains("PAPER_ORIENT") > 0) { paper_orient = line.mid(13).toInt(); } if (line.toUpper().contains("PAPER_WIDTH") > 0) { paper_width = line.mid(12).toInt(); } if (line.toUpper().contains("PAPER_HEIGHT") > 0) { paper_height = line.mid(13).toInt(); } if (line.toUpper().contains("UNITS") > 0) { units = line.mid(6).toInt(); } if (line.toUpper().contains("DRAWGRID") > 0) { drawgrid = line.mid(9).toInt(); } if (line.toUpper().contains("SNAPGRID") > 0) { snapgrid = line.mid(9).toInt(); } if (line.toUpper().contains("DYKCOUNT") > 0) { dykcount = line.mid(9).toInt(); } if (line.toUpper().contains("GRIDMODE") > 0) { gridmode = line.mid(9).toInt(); } if (line.toUpper().contains("GRIDSPACE") > 0) { gridspace = line.mid(10).toInt(); } if (line.toUpper().contains("MAINFONT") > 0) { mainFont.fromString(line.mid(9)); } if (line.toUpper().contains("RULERFONT") > 0) { rulerFont.fromString(line.mid(10)); } } while (!tin.atEnd()); fin.close(); return true; } bool SavePrefs() { QFile fout(saveFileName); if (fout.open(QIODevice::WriteOnly) == false) return false; QTextStream tout(&fout); if (fixed_arrow) tout << "FIXED_ARROW true" << Qt::endl; else tout << "FIXED_ARROW false" << Qt::endl; if (fixed_bond) tout << "FIXED_BOND true" << Qt::endl; else tout << "FIXED_BOND false" << Qt::endl; if (fix_hydrogens) tout << "FIX_HYDROGENS true" << Qt::endl; else tout << "FIX_HYDROGENS false" << Qt::endl; if (dyk) tout << "DYK_TF true" << Qt::endl; else tout << "DYK_TF false" << Qt::endl; tout << "DYKCOUNT " << dykcount << Qt::endl; tout << "ARROW_LENGTH " << arrow_fixedlength << Qt::endl; tout << "ARROW_ANGLE " << arrow_fixedangle << Qt::endl; tout << "BOND_LENGTH " << bond_fixedlength << Qt::endl; tout << "BOND_ANGLE " << bond_fixedangle << Qt::endl; tout << "DBOND_OFFSET " << dbond_offset << Qt::endl; tout << "PAPER_SIZE " << paper_size << Qt::endl; tout << "PAPER_ORIENT " << paper_orient << Qt::endl; tout << "PAPER_WIDTH " << paper_width << Qt::endl; tout << "PAPER_HEIGHT " << paper_height << Qt::endl; tout << "UNITS " << units << Qt::endl; tout << "DRAWGRID " << drawgrid << Qt::endl; tout << "SNAPGRID " << snapgrid << Qt::endl; tout << "GRIDMODE " << gridmode << Qt::endl; tout << "GRIDSPACE " << gridspace << Qt::endl; tout << "MAINFONT " << mainFont.toString() << Qt::endl; tout << "RULERFONT " << rulerFont.toString() << Qt::endl; fout.close(); return true; } bool getArrow_fixed() { return fixed_arrow; } double getArrow_fixedlength() { return arrow_fixedlength; } double getArrow_fixedangle() { return arrow_fixedangle; } bool getBond_fixed() { return fixed_bond; } double getBond_fixedlength() { return bond_fixedlength; } double getBond_fixedangle() { return bond_fixedangle; } bool getAntialiased() { return antialiased; } bool getFixHydrogens() { return fix_hydrogens; } int getPageSize() { return paper_size; } int getPageOrientation() { return paper_orient; } void setPageSize(int n1) { paper_size = n1; } void setPageOrientation(int n1) { paper_orient = n1; } void setFixHydrogens(bool n1) { fix_hydrogens = n1; } void setArrow_fixed(bool n1) { fixed_arrow = n1; } void setArrow_fixedlength(double n1) { arrow_fixedlength = n1; } void setArrow_fixedangle(double n1) { arrow_fixedangle = n1; } void setBond_fixed(bool n1) { fixed_bond = n1; } void setBond_fixedlength(double n1) { bond_fixedlength = n1; } void setBond_fixedangle(double n1) { bond_fixedangle = n1; } void setAntialiased(bool n1) { antialiased = n1; } double getDoubleBondOffset() { return dbond_offset; } void setDoubleBondOffset(double n1) { dbond_offset = n1; } int getPageWidth() { return paper_width; } void setPageWidth(int n1) { paper_width = n1; } int getPageHeight() { return paper_height; } void setPageHeight(int n1) { paper_height = n1; } int getUnits() { return units; } void setUnits(int n1) { units = n1; } int getGridMode() { return gridmode; } void setGridMode(int n1) { gridmode = n1; } int getDrawGrid() { return drawgrid; } void setDrawGrid(int n1) { drawgrid = n1; } int getSnapGrid() { return snapgrid; } void setSnapGrid(int n1) { snapgrid = n1; } int getGridSpacing() { return gridspace; } void setGridSpacing(int n1) { gridspace = n1; } bool getDYK() { return dyk; } void setDYK(bool n1) { dyk = n1; } int getDYKCount() { return dykcount; } void setDYKCount(int n1) { dykcount = n1; } int getZoom() { return zoom; } void setZoom(int z1) { zoom = z1; } QFont getMainFont() { return mainFont; } void setMainFont(QFont ff1) { mainFont = ff1; } QFont getRulerFont() { return rulerFont; } void setRulerFont(QFont ff1) { rulerFont = ff1; } void setCustomRingDir(QString d1) { QDir dir1(d1); if (dir1.exists()) { customRingDir = d1; return; } else { dir1.mkdir(d1); return; } } QString getCustomRingDir() { return customRingDir; } void setBondCenter(bool bc1) { bondcenter = bc1; } bool getBondCenter() { return bondcenter; } void setDpi(int d1) { paper_dpi = d1; } int getDpi() { return paper_dpi; } private: bool fixed_arrow, fixed_bond, fix_hydrogens; bool antialiased; bool fallback; // true = file from library directory bool dyk; // true = show Did You Know? dialog int dykcount; // which Did You Know? tip to show QString fileName; // prefs file name QString saveFileName; // save file name QString customRingDir; // custom ring directory double arrow_fixedlength; double arrow_fixedangle; double bond_fixedlength; double bond_fixedangle; double dbond_offset; int paper_size, paper_orient, paper_dpi; int paper_width, paper_height; // ALWAYS in pixels - convert as needed. int units; // PIXELS, ENGLISH, METRIC - see defs.h int gridmode, gridspace, drawgrid, snapgrid; int zoom; // not saved. QFont mainFont, rulerFont; // added at user request bool bondcenter; }; #endif xdrawchem-v1.11.0/xdrawchem/previewwidget.cpp000066400000000000000000000246151371466245600213430ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "defs.h" #include "previewwidget.h" // arrows #include "arrows.h" #include "ccw180.xpm" #include "ccw270.xpm" #include "ccw90.xpm" #include "cw180.xpm" #include "cw270.xpm" #include "cw90.xpm" // brackets #include "brackets.h" // bonds /* XPM */ static const char *upline_xpm[] = { /* width height num_colors chars_per_pixel */ " 64 24 2 1", /* colors */ ". c #000000", "# c #ffffff", /* pixels */ "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "##################################################.........#####", "##################################.........................#####", "##################.........................................#####", "#########..................................................#####", "######################.....................................#####", "##############################################.............#####", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################"}; /* XPM */ static const char *downline_xpm[] = { /* width height num_colors chars_per_pixel */ " 64 24 2 1", /* colors */ ". c #000000", "# c #ffffff", /* pixels */ "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "#############################################.###.###.###.######", "#########################.###.###.###.###.###.###.###.###.######", "#########.###.###.###.###.###.###.###.###.###.###.###.###.######", "#########################.###.###.###.###.###.###.###.###.######", "#############################################.###.###.###.######", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", }; /* XPM */ static const char *wavytool[] = { "16 13 3 1", "A c #040404040404", "B c #808083830404", "C c #FFFFFF", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCAACCCCAACCCCAC", "CACCACCACCACCACC", "CACCACCACCACCACC", "CCCCACCACCACCACC", "CCCCCAACCCCAACCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", }; // symbols #include "symbol_xpm.h" PreviewWidget::PreviewWidget(QWidget *parent) : QWidget(parent) { resize(50, 50); } void PreviewWidget::paintEvent(QPaintEvent *qp1) { int ofs = 2; QPainter p(this); if (type == TYPE_ARROW) { switch (style) { case ARROW_REGULAR: p.drawPixmap(10, 10, QPixmap(arrow_regular_xpm)); break; case ARROW_DIDNT_WORK: p.drawPixmap(10, 10, QPixmap(arrow_didnt_work_xpm)); break; case ARROW_DASH: p.drawPixmap(10, 10, QPixmap(arrow_dash_xpm)); break; case ARROW_BI1: p.drawPixmap(10, 10, QPixmap(arrow_bi1_xpm)); break; case ARROW_BI2: p.drawPixmap(10, 10, QPixmap(arrow_bi2_xpm)); break; case ARROW_RETRO: p.drawPixmap(10, 10, QPixmap(arrow_retro_xpm)); break; } return; } if (type == TYPE_BOND) { switch (_or) { case 1: if (da == 1) { p.setPen(QPen(color, th, Qt::DotLine)); p.drawLine(QPoint(10, 30), QPoint(60, 30)); } else { p.setPen(QPen(color, th)); p.drawLine(QPoint(10, 30), QPoint(60, 30)); } break; case 2: if (da == 1) { p.setPen(QPen(color, th, Qt::DotLine)); p.drawLine(QPoint(10, 30), QPoint(60, 30)); p.setPen(QPen(color, th)); p.drawLine(QPoint(10, 30 + th + ofs), QPoint(60, 30 + th + ofs)); } else { p.setPen(QPen(color, th)); p.drawLine(QPoint(10, 30), QPoint(60, 30)); p.drawLine(QPoint(10, 30 + th + ofs), QPoint(60, 30 + th + ofs)); } break; case 3: if (da == 1) { p.setPen(QPen(color, th, Qt::DotLine)); p.drawLine(QPoint(10, 30 - th - ofs), QPoint(60, 30 - th - ofs)); p.setPen(QPen(QColor(0, 0, 0), th)); p.drawLine(QPoint(10, 30), QPoint(60, 30)); p.drawLine(QPoint(10, 30 + th + ofs), QPoint(60, 30 + th + ofs)); } else { p.setPen(QPen(color, th)); p.drawLine(QPoint(10, 30 - th - ofs), QPoint(60, 30 - th - ofs)); p.drawLine(QPoint(10, 30), QPoint(60, 30)); p.drawLine(QPoint(10, 30 + th + ofs), QPoint(60, 30 + th + ofs)); } break; case 5: p.drawPixmap(10, 10, QPixmap(upline_xpm)); break; case 6: p.drawPixmap(10, 10, QPixmap(wavytool)); break; case 7: p.drawPixmap(10, 10, QPixmap(downline_xpm)); break; } return; } if (type == TYPE_BRACKET) { switch (style) { case BRACKET_SQUARE: p.drawPixmap(10, 10, QPixmap(squarebracket_xpm)); break; case BRACKET_CURVE: p.drawPixmap(10, 10, QPixmap(curvebracket_xpm)); break; case BRACKET_BRACE: p.drawPixmap(10, 10, QPixmap(bracebracket_xpm)); break; case BRACKET_BOX: p.drawPixmap(10, 10, QPixmap(boxbracket_xpm)); break; case BRACKET_ELLIPSE: p.drawPixmap(10, 10, QPixmap(ellipsebracket_xpm)); break; } return; } if (type == TYPE_CURVEARROW) { switch (style) { case CA_CW90: p.drawPixmap(10, 10, QPixmap(cw90_xpm)); break; case CA_CW180: p.drawPixmap(10, 10, QPixmap(cw180_xpm)); break; case CA_CW270: p.drawPixmap(10, 10, QPixmap(cw270_xpm)); break; case CA_CCW90: p.drawPixmap(10, 10, QPixmap(ccw90_xpm)); break; case CA_CCW180: p.drawPixmap(10, 10, QPixmap(ccw180_xpm)); break; case CA_CCW270: p.drawPixmap(10, 10, QPixmap(ccw270_xpm)); break; } return; } if (type == TYPE_SYMBOL) { switch (style) { case SYM_PLUS: p.drawPixmap(10, 10, QPixmap(sym_plus_xpm)); break; case SYM_MINUS: p.drawPixmap(10, 10, QPixmap(sym_minus_xpm)); break; case SYM_DELTA_PLUS: p.drawPixmap(10, 10, QPixmap(sym_delta_plus_xpm)); break; case SYM_DELTA_MINUS: p.drawPixmap(10, 10, QPixmap(sym_delta_minus_xpm)); break; case SYM_1E: p.drawPixmap(10, 10, QPixmap(sym_1e_xpm)); break; case SYM_2E: p.drawPixmap(10, 10, QPixmap(sym_2e_xpm)); break; case SYM_RING_UP: p.drawPixmap(10, 10, QPixmap(sym_ring_up_xpm)); break; case SYM_P_ORBITAL: p.drawPixmap(10, 8, QPixmap(p_orbital_xpm)); break; case SYM_P_DOUBLE: p.drawPixmap(10, 8, QPixmap(p_double_xpm)); break; case SYM_BEAD: p.drawPixmap(10, 8, QPixmap(bead_xpm)); break; } return; } } xdrawchem-v1.11.0/xdrawchem/previewwidget.h000066400000000000000000000024211371466245600207770ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef PREVIEWWIDGET_H #define PREVIEWWIDGET_H #include class QPaintEvent; class PreviewWidget : public QWidget { public: PreviewWidget(QWidget *parent = 0); void updateWidget(int a1, int a2, int a3, int a4, int a5, QColor c = Qt::black) { type = a1; th = a2; da = a3; _or = a4; style = a5; color = c; update(); } int type, th, da, _or, style; QColor color; protected: void paintEvent(QPaintEvent *); }; #endif xdrawchem-v1.11.0/xdrawchem/render2d.cpp000066400000000000000000000640641371466245600201650ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // render2d.cpp - definitions for functions of class Render2D #include #include #include #include #include #include #include "chemdata.h" #include "defs.h" #include "render2d.h" #include "rotatecursor.xpm" #include "skullcursor.xpm" Render2D::Render2D(QWidget *parent) : QWidget(parent) { // setPalette(QPalette(QColor(255,255,255))); // generally, width and height should allow for 0.5" margins and 100 dpi renderHeight = 1000; renderWidth = 750; dbuffer = QPixmap(renderWidth, renderHeight); directdraw = false; text_drag = false; start_drag = NULL; setBackgroundRole(QPalette::Base); resize(renderWidth, renderHeight); outputDevice = OUTPUT_SCREEN; mode = MODE_SELECT; prev_mode = 0; prevpos = 0; mouse1down = false; mouse3down = false; doubleClickFlag = false; dragging = false; moved = false; highlightpoint = 0; highlightobject = 0; localtext = 0; localtexteditor = 0; thick = 1; savedBondOrder = -1; zoomFactor = 1.0; currentFont = QFont("Helvetica", 12); currentColor = QColor(0, 0, 0); bgcolor = QColor(255, 255, 255); setBGColor(bgcolor); setMouseTracking(true); setFocusPolicy(Qt::ClickFocus); QPixmap sc(skullcursor_xpm); sc.setMask(sc.createHeuristicMask()); skullcursor = QCursor(sc, 1, 1); QPixmap rc(rotatecursor_xpm); rc.setMask(rc.createHeuristicMask()); rotatecursor = QCursor(rc, 1, 1); font_size_kludge = false; hotkeymode = false; hkprevmode = 0; painter = new QPainter; createGrid(); // set printing defaults PrintSetup(); // see render2d_print.cpp } void Render2D::ReactionAnalysis(int x) { c->ReactionAnalysis(x); } // this function required for good behavior if user changes tools while // text is selected. void Render2D::CleanUpAfterTextTool() { /* OLD CODE if (localtext == 0) return; // don't need to clean up if no text. // save text, clean up localtext->DeselectAllText(); emit TextOff(); if (!text_exists) { if (localtext->getText().length() > 0) { c->addText(localtext); localtext = 0; } } else { if (localtext->getText().length() == 0) { c->Erase(localtext); localtext = 0; } } localtext = 0; highlightpoint = 0; if (highlightobject != 0) { highlightobject->Highlight(false); highlightobject = 0; } */ if (localtexteditor != 0) { DrawText_FinishText(); } } void Render2D::setClipboard(Clipboard *clip1) { c->setClipboard(clip1); } Clipboard *Render2D::getClipboard() { return c->getClipboard(); } // setMode functions (slots) void Render2D::setMode_Select() { qDebug() << "Render2D::setMode_Select()"; if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_SELECT; startpoint = 0; endpoint = 0; setCursor(Qt::ArrowCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Select mode: left click on object to move, " "right click on object to edit")); update(); } void Render2D::setMode_Lasso() { qDebug() << "Render2D::setMode_Lasso()"; if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_SELECT_LASSO; startpoint = 0; endpoint = 0; setCursor(Qt::ArrowCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Lasso mode: left click and hold to draw lasso")); update(); } void Render2D::setMode_DrawLine() { qDebug() << "Render2D::setMode_DrawLine()"; if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWLINE; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Draw Line mode: left click to draw line, right click to edit")); update(); } void Render2D::setMode_DrawDashLine() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWLINE_DASH; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar( tr("Draw Dashed Line mode: left click to draw line, right click to edit")); update(); } void Render2D::setMode_DrawChain() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWCHAIN; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Draw Chain mode: left click and drag to draw aliphatic chain")); update(); } void Render2D::setMode_DrawUpLine() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWLINE_UP; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Draw Stereo-Up Line mode: left click to draw " "line, right click to edit")); update(); } void Render2D::setMode_DrawDownLine() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWLINE_DOWN; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Draw Stereo-Down Line mode: left click to draw " "line, right click to edit")); update(); } void Render2D::setMode_DrawWavyLine() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWWAVYLINE; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar( tr("Draw Wavy Line mode: left click to draw line, right click to edit")); update(); } void Render2D::setMode_DrawArrow(regularArrowType type) { bracket_type = 0; if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWARROW; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); switch (type) { case regularArrow: bracket_type = ARROW_REGULAR; break; case topharpoonArrow: bracket_type = ARROW_TOPHARPOON; break; case bottomharpoonArrow: bracket_type = ARROW_BOTTOMHARPOON; break; case middleArrow: bracket_type = ARROW_MIDDLE; break; case didntworkArrow: bracket_type = ARROW_DIDNT_WORK; break; case dashedArrow: bracket_type = ARROW_DASH; break; case bi1Arrow: bracket_type = ARROW_BI1; break; case bi2Arrow: bracket_type = ARROW_BI2; break; case retroArrow: bracket_type = ARROW_RETRO; break; } emit SignalSetStatusBar(tr("Draw Arrow mode: left click to draw arrow")); update(); } void Render2D::setMode_DrawCurveArrow(curveArrowType type) { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWCURVEARROW; startpoint = 0; endpoint = 0; switch (type) { case cw90Arrow: symbolfile = QString::fromLatin1("CW90"); break; case ccw90Arrow: symbolfile = QString::fromLatin1("CCW90"); break; case cw180Arrow: symbolfile = QString::fromLatin1("CW180"); break; case ccw180Arrow: symbolfile = QString::fromLatin1("CCW180"); break; case cw270Arrow: symbolfile = QString::fromLatin1("CW270"); break; case ccw270Arrow: symbolfile = QString::fromLatin1("CCW270"); break; } setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar("Draw Curved Arrow mode: left click to draw arrow"); update(); } void Render2D::setMode_DrawBracket(bracketType type) { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWBRACKET; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); switch (type) { case squareBracket: bracket_type = BRACKET_SQUARE; break; case curveBracket: bracket_type = BRACKET_CURVE; break; case braceBracket: bracket_type = BRACKET_BRACE; break; case boxBracket: bracket_type = BRACKET_BOX; break; case ellipseBracket: bracket_type = BRACKET_ELLIPSE; break; case closedsquareBracket: bracket_type = BRACKET_CLOSEDSQUARE; break; case circleBracket: bracket_type = BRACKET_CIRCLE; break; } emit SignalSetStatusBar(tr("Draw Bracket mode: left click to draw bracket")); update(); } void Render2D::setMode_DrawText() { mode = MODE_TEXT; if (mode == MODE_RING) smartplace = 0; startpoint = 0; endpoint = 0; setCursor(Qt::IBeamCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Text mode: left click to add or edit text")); update(); } void Render2D::setMode_Erase() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_ERASE; startpoint = 0; endpoint = 0; localtext = 0; setCursor(skullcursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Erase mode: left click to erase object")); update(); } void Render2D::setMode_DrawSymbol(const QString &s) { if (s == "newman_anti") return setMode_DrawNewmanAnti(); else if (s == "newman_gauche") return setMode_DrawNewmanGauche(); else if (mode == MODE_TEXT) CleanUpAfterTextTool(); else if (mode == MODE_RING) smartplace = 0; qDebug() << s; mode = MODE_SYMBOL; startpoint = 0; endpoint = 0; symbolfile = s; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Draw Symbol mode: left click to add symbol")); update(); } void Render2D::setMode_DrawGraphicObject(int g1, int param1) { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; qDebug() << g1; bracket_type = g1; if (g1 == TYPE_BEZIER) { mode = MODE_DRAWBEZIER; tmp_bezier.resize(4); bezier_count = 0; bracket_type = param1; // none, half, full arrowhead emit SignalSetStatusBar(tr("Draw graphic object: cubic bezier")); } startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); update(); } void Render2D::setMode_DrawNewmanAnti() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWNEWMAN_ANTI; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); update(); emit SignalSetStatusBar(tr("Left-click to draw Newman projection template")); } void Render2D::setMode_DrawNewmanGauche() { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = MODE_DRAWNEWMAN_GAUCHE; startpoint = 0; endpoint = 0; setCursor(Qt::CrossCursor); c->DeselectAll(); update(); emit SignalSetStatusBar(tr("Left-click to draw Newman projection template")); } void Render2D::setMode_DrawRing(QString s, QString fn, int sp) { smartplace = 0; smartplace = sp; if (mode == MODE_TEXT) CleanUpAfterTextTool(); qDebug() << s; mode = MODE_RING; startpoint = 0; endpoint = 0; symbolfile = s; setCursor(Qt::CrossCursor); c->DeselectAll(); emit SignalSetStatusBar(tr("Draw Ring mode: left click to add %1").arg(fn)); update(); } void Render2D::Tool(int t) { if (mode == MODE_TEXT) CleanUpAfterTextTool(); if (mode == MODE_RING) smartplace = 0; mode = t; startpoint = 0; endpoint = 0; setCursor(Qt::ArrowCursor); switch (mode) { case MODE_TOOL_MOLECULE_INFO: emit SignalSetStatusBar(tr("Click on a molecule for information")); break; case MODE_TOOL_CALCMW: emit SignalSetStatusBar(tr("Click on a molecule to calculate its molecular weight")); break; case MODE_TOOL_CALCEF: emit SignalSetStatusBar(tr("Click on a molecule to calculate its empirical formula")); break; case MODE_TOOL_CALCEA: emit SignalSetStatusBar(tr("Click on a molecule to calculate its elemental analysis")); break; case MODE_TOOL_13CNMR: emit SignalSetStatusBar(tr("Click on a molecule to calculate its 13C NMR")); break; case MODE_TOOL_1HNMR: emit SignalSetStatusBar(tr("Click on a molecule to calculate its 1H NMR")); break; case MODE_TOOL_IR: emit SignalSetStatusBar(tr("Click on a molecule to calculate its IR")); break; case MODE_TOOL_PKA: emit SignalSetStatusBar(tr("Click on a molecule to calculate its pKa(s)")); break; case MODE_TOOL_RETRO: emit SignalSetStatusBar(tr("Click on a molecule for possible retrosynthesis")); break; case MODE_TOOL_RETRO_BONDNAME: highlightobject = 0; emit SignalSetStatusBar(tr("Click on a molecule to display its bond identifier")); break; case MODE_TOOL_KOW: emit SignalSetStatusBar(tr("Click on a molecule to calculate its octanol-water partition")); break; case MODE_TOOL_2D3D: emit SignalSetStatusBar(tr("Click on a molecule to generate 3-D coordinates")); break; case MODE_TOOL_NAME: emit SignalSetStatusBar(tr("Click on a molecule to guess its name")); break; case MODE_TOOL_TOSMILES: emit SignalSetStatusBar(tr("Click on a molecule to determine its SMILES string")); break; case MODE_TOOL_CLEANUPMOL: emit SignalSetStatusBar(tr("Click on a molecule to clean up its structure")); break; case MODE_TOOL_GROUP_REACTANT: emit SignalSetStatusBar(tr("Click on a molecule to assign it as a reactant")); break; case MODE_TOOL_GROUP_PRODUCT: emit SignalSetStatusBar(tr("Click on a molecule to assign it as a product")); break; case MODE_TOOL_GROUP_CLEAR: emit SignalSetStatusBar(tr("Click on a molecule to clear it group assignment")); break; case MODE_TOOL_CUSTOMRING: emit SignalSetStatusBar(tr("Click on a molecule to save it as a custom ring")); break; case MODE_TOOL_TEST: emit SignalSetStatusBar(tr("Tool test mode")); break; default: emit SignalSetStatusBar(tr("Click on a molecule")); break; } } void Render2D::clearAllGroups() { c->clearAllGroups(); update(); } void Render2D::AutoLayout() { c->DeselectAll(); c->StartUndo(0, 0); c->AutoLayout(); mode = MODE_SELECT; startpoint = 0; endpoint = 0; setCursor(Qt::ArrowCursor); emit SignalSetStatusBar(tr("Select mode: left click to move, right click to edit")); update(); } void Render2D::Cut() { c->StartUndo(0, 0); c->Cut(); mode = MODE_SELECT; // the selection is gone, don't draw selection box // the selection is gone, don't reference it anymore highlightpoint = 0; highlightobject = 0; update(); } void Render2D::Copy() { // Copy to application clipboard c->Copy(); // Copy image to system clipboard QRect savebox = QRect(selectionBox.topLeft() * zoomFactor, selectionBox.size() * zoomFactor); int prevmode = mode; mode = MODE_SELECT; c->DeselectAll(); QPixmap pm(savebox.size()); qDebug() << savebox; pm = grab(savebox); mode = prevmode; c->NewSelectRect(selectionBox, false); QApplication::clipboard()->setImage(pm.toImage()); update(); // do anyways, though Copy() should not alter the drawing. } void Render2D::Paste() { if (mode == MODE_TEXT) { if (localtext != 0) { QClipboard *clip = QApplication::clipboard(); QString pastext = clip->text(QClipboard::Clipboard); localtext->InsertString(pastext); update(); } return; // eliminate unpredictable behavior } c->StartUndo(); if (c->Paste() == false) return; c->Move(30, 30); mode = MODE_SELECT_MULTIPLE_SELECTED; selectionBox = c->selectionBox(); update(); } void Render2D::Undo() { c->SelectAll(); if (c->Undo()) { emit SignalSetStatusBar(tr("Undo!")); c->EraseSelected(); } else { emit SignalSetStatusBar(tr("Cannot undo, sorry!")); } c->DeselectAll(); // mode = MODE_SELECT; update(); } void Render2D::Redo() { c->SelectAll(); if (c->Redo()) { emit SignalSetStatusBar(tr("Redo!")); c->EraseSelected(); } else { emit SignalSetStatusBar(tr("Cannot redo, sorry!")); } c->DeselectAll(); update(); } void Render2D::SelectAll() { if (c->Size()) { mode = MODE_SELECT_MULTIPLE_SELECTED; c->SelectAll(); selectionBox = c->selectionBox(); update(); } } void Render2D::DeselectAll() { mode = MODE_SELECT; c->DeselectAll(); update(); } void Render2D::EraseSelected() { if (mode == MODE_TEXT) { if (localtext != 0) { localtext->DeleteKeyPressed(); update(); } return; // eliminate unpredictable behavior } c->StartUndo(0, 0); c->EraseSelected(); // in all likelihood, we just blew away highlightobject. // if not (unlikely!), user can reselect it. highlightobject = 0; if (mode == MODE_SELECT_MULTIPLE_SELECTED) mode = MODE_SELECT; update(); } void Render2D::Rotate90() { c->StartUndo(0, 0); rotateOrigin.setX((selectionBox.right() + selectionBox.left() - 2) / 2); rotateOrigin.setY((selectionBox.bottom() + selectionBox.top()) / 2); DPoint *dp1 = new DPoint(rotateOrigin); c->Rotate(dp1, -0.5 * M_PI); delete dp1; selectionBox = c->selectionBox(); update(); } void Render2D::Rotate180() { c->StartUndo(0, 0); rotateOrigin.setX((selectionBox.right() + selectionBox.left() - 2) / 2); rotateOrigin.setY((selectionBox.bottom() + selectionBox.top()) / 2); DPoint *dp1 = new DPoint(rotateOrigin); c->Rotate(dp1, M_PI); delete dp1; selectionBox = c->selectionBox(); update(); } void Render2D::Rotate270() { c->StartUndo(0, 0); rotateOrigin.setX((selectionBox.right() + selectionBox.left() - 2) / 2); rotateOrigin.setY((selectionBox.bottom() + selectionBox.top()) / 2); DPoint *dp1 = new DPoint(rotateOrigin); c->Rotate(dp1, 0.5 * M_PI); delete dp1; selectionBox = c->selectionBox(); update(); } void Render2D::Flip(int d) { c->StartUndo(0, 0); rotateOrigin.setX((selectionBox.right() + selectionBox.left() - 2) / 2); rotateOrigin.setY((selectionBox.bottom() + selectionBox.top()) / 2); DPoint *dp1 = new DPoint(rotateOrigin); c->Flip(dp1, d); delete dp1; selectionBox = c->selectionBox(); update(); } // Inserted(): highlight and box items inserted by RingDialog, etc. void Render2D::Inserted() { mode = MODE_SELECT_MULTIPLE_SELECTED; selectionBox = c->selectionBox(); update(); } // change current font, or change font of active text void Render2D::SetFont(QFont f) { if (localtext != 0) { localtext->setFont(f); if (localtexteditor != 0) localtexteditor->setCurrentFont(f); update(); return; } else { currentFont = f; } } // change current font, or change font of active text void Render2D::SetColor(QColor c1) { if (mode != MODE_SELECT_MULTIPLE_SELECTED) { currentColor = c1; if (localtext != 0) localtext->SetColor(c1); if (localtexteditor != 0) localtexteditor->setTextColor(c1); } else { c->SetColorIfHighlighted(c1); } } QFont Render2D::GetFont() { return currentFont; } QColor Render2D::GetColor() { return currentColor; } // adjust endpoint to specified fixed length/angle void Render2D::CorrectEndpoint_arrow() { double dx = endpoint->x - startpoint->x; double dy = endpoint->y - startpoint->y; int mysign = 1; if (dx < 0.0) mysign = -1; double ang = atan(dy / dx) * MOL_ARAD; double newang = ((int)((ang + (preferences.getArrow_fixedangle() / 2.0)) / preferences.getArrow_fixedangle()) * preferences.getArrow_fixedangle()); if (fabs(newang) != 90.0) { dx = mysign * preferences.getArrow_fixedlength() * cos(newang / MOL_ARAD); dy = mysign * preferences.getArrow_fixedlength() * sin(newang / MOL_ARAD); endpoint->x = startpoint->x + dx; endpoint->y = startpoint->y + dy; } else { if (dy < 0.0) mysign = -1; endpoint->x = startpoint->x; endpoint->y = startpoint->y + mysign * preferences.getArrow_fixedlength(); } } // adjust endpoint to specified fixed length/angle void Render2D::CorrectEndpoint_bond() { double dx = endpoint->x - startpoint->x; double dy = endpoint->y - startpoint->y; int mysign = 1; if (dx < 0.0) mysign = -1; double ang = atan(dy / dx) * MOL_ARAD; double newang = ((int)((ang + (preferences.getBond_fixedangle() / 2.0)) / preferences.getBond_fixedangle()) * preferences.getBond_fixedangle()); if (fabs(newang) != 90.0) { dx = mysign * preferences.getBond_fixedlength() * cos(newang / MOL_ARAD); dy = mysign * preferences.getBond_fixedlength() * sin(newang / MOL_ARAD); endpoint->x = startpoint->x + dx; endpoint->y = startpoint->y + dy; } else { if (dy < 0.0) mysign = -1; endpoint->x = startpoint->x; endpoint->y = startpoint->y + mysign * preferences.getBond_fixedlength(); } } bool Render2D::SaveSVG(QString fn) { QSvgGenerator generator; generator.setFileName(fn); generator.setSize(QSize(preferences.getPageWidth(), preferences.getPageHeight())); generator.setViewBox(QRect(0, 0, preferences.getPageWidth(), preferences.getPageHeight())); generator.setTitle(fn); generator.setDescription(tr("Created using XDrawChem")); c->DeselectAll(); mode = MODE_SELECT; // so selection box will not appear QPainter *p = new QPainter; p->begin(&generator); std::swap(p, painter); repaint(); std::swap(p, painter); p->end(); delete p; return true; } bool Render2D::SaveEPS(QString fn) { // // perhaps look at printing using QPrinter, then shelling to use ps2epsi? // // tmp_fn = xdc[procno].ps QString n1; srand(QTime::currentTime().second()); n1.setNum(rand()); tmpEpsFile = QString("/tmp/xdc") + n1 + QString(".ps"); Print(tmpEpsFile); // shell (ps2epsi tmp_fn fn) QProcess *proc1 = new QProcess(this); connect(proc1, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(saveEPSFinished(int, QProcess::ExitStatus))); QStringList arguments1; arguments1 << tmpEpsFile << fn; proc1->start(QString::fromLatin1("ps2epsi"), arguments1); return true; /* outputDevice = OUTPUT_EPS; output_file.setName(fn); // open file and create text stream if ( !output_file.open(IO_WriteOnly) ) return false; output_ts.setDevice(&output_file); // get bounding box c->SelectAll(); selectionBox = c->selectionBox(); c->DeselectAll(); // shift selection box to origin eps_dx = selectionBox.left(); eps_dy = selectionBox.top(); // write EPS header // The following line, while teccnically correct, break most applications. //output_ts << "%!PS-Adobe-3.0 EPSF-3.0" ; // this is the magic cookie most applications check for output_ts << "%!PS-Adobe-2.0 EPSF-2.0" ; double eps_sf = 0.72; output_ts << "%%BoundingBox: " << selectionBox.left() - eps_dx << " "; output_ts << selectionBox.top() - eps_dy << " "; output_ts << selectionBox.right() - eps_dx << " "; output_ts << selectionBox.bottom() - eps_dy ; output_ts << "%%Creator: XDrawChem" ; output_ts << "%%Title: " << fn ; output_ts << "%%EndComments" ; //output_ts << selectionBox.left() << " " << selectionBox.top() << " translate" ; //output_ts << eps_sf << " "<< eps_sf << " scale" ; // write objects update(); // finish output_ts << "showpage" ; output_ts << "%%EOF" ; output_file.close(); // restore screen display outputDevice = OUTPUT_SCREEN; update(); return true; */ } void Render2D::saveEPSFinished(int, QProcess::ExitStatus) { QFile::remove(tmpEpsFile); } QPoint Render2D::zoomCorrect(QPoint in1) { QPoint out1; double dx = (double)in1.x(); double dy = (double)in1.y(); dx *= zoomFactor; dy *= zoomFactor; out1.setX(qRound(dx)); out1.setY(qRound(dy)); return out1; } QPoint Render2D::zoomCorrectReverse(QPoint in1) { QPoint out1; double dx = (double)in1.x(); double dy = (double)in1.y(); dx /= zoomFactor; dy /= zoomFactor; out1.setX(qRound(dx)); out1.setY(qRound(dy)); return out1; } // cmake#include "render2d.moc" xdrawchem-v1.11.0/xdrawchem/render2d.h000066400000000000000000000250261371466245600176250ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // render2d.h -- class definition for XDrawChem render widget. #ifndef RENDER2D_H #define RENDER2D_H #include #include #include #include #include #include "clipboard.h" #include "dpoint.h" #include "drawable.h" #include "paintable.h" #include "prefs.h" #include "xdc_event.h" class ChemData; class Text; class Molecule; extern Preferences preferences; class Render2D : public QWidget { Q_OBJECT public: void setChemData(ChemData *c1) { c = c1; } // defined in render2d.cpp Render2D(QWidget *parent = 0); void CorrectEndpoint_arrow(); void CorrectEndpoint_bond(); void CleanUpAfterTextTool(); void setClipboard(Clipboard *); Clipboard *getClipboard(); public slots: // defined in render2d.cpp void ReactionAnalysis(int); void setMode_Select(); void setMode_Lasso(); void setMode_DrawLine(); void setMode_DrawDashLine(); void setMode_DrawChain(); void setMode_DrawUpLine(); void setMode_DrawDownLine(); void setMode_DrawWavyLine(); void setMode_DrawArrow(regularArrowType); void setMode_DrawCurveArrow(curveArrowType); void setMode_DrawBracket(bracketType); void setMode_Erase(); void setMode_DrawText(); void setMode_DrawSymbol(const QString &); void setMode_DrawGraphicObject(int, int param1 = 0); void setMode_DrawRing(QString, QString, int sp = 0); void setMode_DrawNewmanAnti(); void setMode_DrawNewmanGauche(); void Tool(int); void SelectAll(); void DeselectAll(); void EraseSelected(); void Inserted(); void SetFont(QFont); void SetColor(QColor); QFont GetFont(); QColor GetColor(); void Cut(); void Copy(); void Paste(); void Undo(); void Redo(); void Rotate90(); void Rotate180(); void Rotate270(); void AutoLayout(); void Flip(int); bool SaveEPS(QString); bool SaveSVG(QString); void clearAllGroups(); QPoint zoomCorrect(QPoint); QPoint zoomCorrectReverse(QPoint); // defined in render2d_draw.cpp double getAngle(QPointF, QPointF); void drawBezier(QVector, QColor, bool = false, int = 0); void drawLine(QPointF, QPointF, int, QColor, int = 0); void drawPolyline(QPainterPath, QColor); void drawPolyline(QVector p, QColor c1); void drawUpLine(QPointF, QPointF, QColor); void drawDownLine(QPointF, QPointF, QColor); void drawWavyLine(QPointF, QPointF, QColor); void drawArrow(QPointF, QPointF, QColor, int, int); void drawBracket(QPoint, QPoint, QColor, int, QColor); void drawBox(QPoint, QPoint, QColor); void drawFillBox(QPoint, QPoint, QColor); void drawFillBox(QPoint, QPoint, QColor, bool, QColor, int); void drawCircle(QPoint, int, QColor); void drawEllipse(QPoint, QPoint, bool, QColor, bool, QColor); void drawText(QChar, QPoint, QColor, QFont); void drawString(QString, QPoint, QColor, QFont); void drawTextReverse(QChar, QPoint, QColor, QFont); void drawPixmap(QPoint, QPixmap); void drawCurveArrow(QPointF, QPointF, QColor, QString); QPixmap MakePixmap(bool transp = false); QPixmap MakeFullPixmap(); // defined in render2d_text.cpp void InsertSymbol(); void DrawText_returnPressed(); void DrawText_textChanged(); void DrawText_FinishText(); void DrawText_CVAchanged(QTextCharFormat::VerticalAlignment); QString EditText(QPoint, QString, int, bool); QRect GetTextDimensions(QString, QFont); int GetTextHeight(QFont); int GetTextFullHeight(QFont); int GetCharWidth(QChar, QFont); int GetStringWidth(QString, QFont); void DrawText_mousePressEvent(QMouseEvent *, QPoint); void DrawText_mouseReleaseEvent(QMouseEvent *, QPoint); void DrawText_mouseMoveEvent(QMouseEvent *); void Superscript(); void Subscript(); void Bold(); void Italic(); void Underline(); void JustifyLeft(); void JustifyCenter(); void JustifyRight(); // defined in render2d_select.cpp void Select_mouseMoveEvent(QMouseEvent *); double GetAngle(DPoint *, DPoint *, DPoint *); // defined in render2d_print.cpp void PrintSetup(); void Print(QString epsname = ""); void UpdatePageGeometry(); // defined in render2d_event.cpp: QPoint GridLock(QPoint); void createGrid(); void zoomEvent(); void molInfo(); void molSelect(); void molCut(); void molCopy(); void bondEdit(); void bondInfo(); void textShape(); void bracketFill(); void bracketFillOff(); // defined here: void setDirectDraw(bool dd1) { directdraw = dd1; } double DistanceBetween(QPointF a, QPointF b) { double dx = a.x() - b.x(); double dy = a.y() - b.y(); return sqrt(dx * dx + dy * dy); } QPointF Midpoint(QPointF a, QPointF b) { int ax = (a.x() + b.x()) / 2; int ay = (a.y() + b.y()) / 2; return QPointF(ax, ay); } int RoundOff(double x) { int x1 = (int)x; double x2 = x - (double)x1; if (x2 > 0.5) return x1 + 1; else return x1; } void SetOutputDevice(int x) { outputDevice = x; } void SetThick(int t) { thick = t; } void resetTextOrigin() { if (mode > 127) { rotateOrigin.setX(0); rotateOrigin.setY(0); } } // now done in prefs.h // int getPageSize() { return page_size; } // int getPageOrientation() { return page_orientation; } void setPageSizeAndOrientation() { UpdatePageGeometry(); } void setBGColor(QColor bc1) { QPalette palette; palette.setColor(backgroundRole(), bc1); setPalette(palette); bgcolor = bc1; } QColor getBGColor() { return bgcolor; } void setWaitCursor() { setCursor(Qt::WaitCursor); } void setArrowCursor() { setCursor(Qt::ArrowCursor); } bool getFontKludge() { return font_size_kludge; } signals: void SignalSetStatusBar(QString); void SignalHelpTopic(QString); void XDCEventSignal(XDC_Event *); void textOn(QFont); void TextOff(); protected: // defined in render2d_event.cpp void mouseDoubleClickEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void paintEvent(QPaintEvent *); void resizeEvent(QResizeEvent *); // defined in render2d_text.cpp void keyPressEvent(QKeyEvent *); private slots: void saveEPSFinished(int, QProcess::ExitStatus); private: // Qpixmap of double buffer QPixmap dbuffer; QPixmap grid; // height and width of the drawing area int renderHeight, renderWidth; // zoom factor (actually held in prefs.h) float zoomFactor; // cursors QCursor skullcursor, rotatecursor; // the ChemData object this Render2D is linked with ChemData *c; // start and end points of object being drawn, or selection box... DPoint *startpoint, *endpoint; // current drawing font QFont currentFont; // current drawing color QColor currentColor; // current background color QColor bgcolor; // Positions to remember for multiple selection QPoint selectOrigin, selectPrev; // Rotate and resize handles (used in MODE_SELECT_MULTIPLE_SELECTED) QRect selectionBox; QPoint rotateHandle, resizeHandle; // rotate origin QPoint rotateOrigin; // previous angle (for rotating) double prevangle; // previous position (of mouse, usually) DPoint *prevpos; // highlighted point, if any DPoint *highlightpoint; // highlighted object, if any Drawable *highlightobject; // current input/output/drawing mode int mode, prev_mode; // temporary Bezier curve QVector tmp_bezier; int bezier_count; // current button state bool mouse1down, mouse3down, doubleClickFlag; bool moved; // to check validity of points, see render2d_event.cpp // direct drawing flag bool directdraw; // fixed length/angle (now controlled by Preferences class, see prefs.h) // bool fixed_bond, fixed_arrow; // double fixedlength_bond, fixedangle_bond; // double fixedlength_arrow, fixedangle_arrow; // current line thickness and old bond order (for edit) int thick, savedBondOrder; // chain length double chainlength; // Output device (screen, printer, image) int outputDevice; // Output file/textstream QFile output_file; QTextStream output_ts; // Output printer and related classes QList paintqueue; QPrinter *printer; QPainter *painter; // Text object, temp string to use when creating/editing text Text *localtext; QTextEdit *localtexteditor; QString localstring; bool text_exists; // does this text object exist? bool text_drag, super_set, sub_set; DPoint *start_drag; // Symbol object, which file to use (or ring, if MODE_RING) QString symbolfile; int smartplace; // able to attach ring to a point (e.g., benzene, Fmoc) // Bracket object, which bracket int bracket_type; // page setup options (NOW HELD IN PREFS...) // int page_size; // int page_orientation; // drag object bool dragging; // finished rendering? bool finishedPainting; // set in render2d.cpp::SaveEPS() double eps_dx, eps_dy; // data for lasso QVector curr_lasso; QPoint lasso1, lasso2; // QPopupMenu for right clicks QMenu *rtclickpopup; Molecule *targetmol; // current/temporary Molecule Molecule *tmp_molecule; // kludge for PNG/BMP generation bool font_size_kludge; // track last known pointer position QPoint lastmouse; // remember mode if using "hot key" QString tmpEpsFile; bool hotkeymode; int hkprevmode; QPoint startPoint, endPoint; QVector chainPoints; }; #endif xdrawchem-v1.11.0/xdrawchem/render2d_draw.cpp000066400000000000000000001104011371466245600211650ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include "chemdata.h" #include "defs.h" #include "paintable.h" #include "render2d.h" double Render2D::getAngle(QPointF a, QPointF b) { return atan2(b.y() - a.y(), b.x() - a.x()) * 180 / M_PI; } void Render2D::drawLine(QPointF a, QPointF b, int t, QColor c1, int s) { // qDebug() << "Render2D::drawLine(QPointF)"; if (outputDevice == OUTPUT_EPS) { a.setY(a.y() + (2 * (selectionBox.center().y() - a.y()))); b.setY(b.y() + (2 * (selectionBox.center().y() - b.y()))); if (s == 0) { // solid line output_ts << "[] 0 setdash"; // output_ts<<"newpath" ; output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " moveto"; output_ts << b.x() - eps_dx << " " << b.y() - eps_dy << " lineto"; // output_ts<<"closepath stroke" ; output_ts << "stroke"; } else { // s != 0 is a dashed line output_ts << "[5 5] 0 setdash"; output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " moveto"; output_ts << b.x() - eps_dx << " " << b.y() - eps_dy << " lineto"; output_ts << "stroke"; } return; } /* if (outputDevice == OUTPUT_PRINTER) { // put line on paintqueue to render in Print() Paintable *pa = new Paintable; if (s == 0) pa->op = OP_LINE; else pa->op = OP_DASH_LINE; pa->a = a; pa->b = b; pa->c = c1; pa->s = s; pa->t = t; paintqueue.append(pa); return; } if (directdraw) p.begin(this); else p.begin(&dbuffer); */ // p.scale(zoomFactor, zoomFactor); if (s == 0) // solid // p.setPen(QPen(c1, t)); painter->setPen(QPen(c1, t)); else // dashed -- always apply thickness // p.setPen(QPen(c1, t, DotLine)); painter->setPen(QPen(c1, t, Qt::DotLine)); // p.drawLine(a, b); painter->drawLine(a, b); } // This function exists to turn Polyline into bits for drawLine(...) // (to avoid reimplementing EPS/Printer stuff for now :) void Render2D::drawPolyline(QPainterPath a1, QColor c1) { // qDebug() << "Render2D::drawPolyline()"; /* int lastpoint = a1.elementCount() - 1; for (int cc = 0; cc < lastpoint; cc++) drawLine(a1[cc], a1[cc+1], 1, c1);*/ /// TODO painter->drawPath(a1); } void Render2D::drawPolyline(QVector p, QColor c1) { // qDebug() << "Render2D::drawPolyline() 2"; if (!p.isEmpty()) { painter->setPen(c1); painter->drawLines(p); } // for ( int i = 0; i < p.size(); ++i ) // drawLine( p.at( i ), p.at( i + 1 ), 1, c1 ); } // note that this only works on screen and bitmap (for now) void Render2D::drawBezier(QVector a1, QColor c1, bool drawPoints, int arrowHead) { qDebug() << "Render2D::drawBezier()"; /* if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ /* painter->setPen( c1 ); int xp1, yp1; if ( drawPoints ) { for ( int l1 = 0; l1 <= bezier_count; l1++ ) { a1.point( l1, &xp1, &yp1 ); painter->drawRect( xp1 - 1, yp1 - 1, 3, 3 ); } } if ( drawPoints == false ) { painter->drawCubicBezier( a1 ); QPoint ar1, ar2; // apparent arrowhead shaft: (ar1)-->(ar2) ar1 = a1.point( a1.count() - 2 ); ar2 = a1.point( a1.count() - 1 ); double ang; ang = getAngle( ar2, ar1 ); double newang1 = ang + 30.0; double newang2 = ang - 30.0; QPoint p1( qRound( ar2.x() + ( cos( newang1 / MOL_ARAD ) * 10.0 ) ), qRound( ar2.y() + ( sin( newang1 / MOL_ARAD ) * 10.0 ) ) ); QPoint p2( qRound( ar2.x() + ( cos( newang2 / MOL_ARAD ) * 10.0 ) ), qRound( ar2.y() + ( sin( newang2 / MOL_ARAD ) * 10.0 ) ) ); if ( arrowHead > 0 ) { // draw half arrowhead drawLine( ar2, p1, 1, c1 ); } if ( arrowHead > 1 ) { // draw other half drawLine( ar2, p2, 1, c1 ); } return; } if ( ( mode == MODE_DRAWBEZIER ) && ( bezier_count < 3 ) ) return; painter->drawCubicBezier( a1 );*/ } void Render2D::drawBracket(QPoint a, QPoint b, QColor c1, int type, QColor fillColor) { int tl_x, tl_y, br_x, br_y, swp; tl_x = a.x(); tl_y = a.y(); br_x = b.x(); br_y = b.y(); if (tl_x > br_x) { swp = tl_x; tl_x = br_x; br_x = swp; } if (tl_y > br_y) { swp = tl_y; tl_y = br_y; br_y = swp; } double sf = 0.08 * (double)(br_y - tl_y); double sf2 = sf / 2.0; QPoint tl(tl_x, tl_y); QPoint bl(tl_x, br_y); QPoint tr(br_x, tl_y); QPoint br(br_x, br_y); if ((type == BRACKET_BOX) || (type == BRACKET_CLOSEDSQUARE)) { /* drawLine(tl, bl, 1, c1); drawLine(bl, br, 1, c1); drawLine(tr, br, 1, c1); drawLine(tl, tr, 1, c1); */ if (fillColor.isValid() == true) { drawFillBox(tl, br, fillColor, true, c1, 0); } else { drawBox(tl, br, c1); } } if ((type == BRACKET_ELLIPSE) || (type == BRACKET_CIRCLE)) { /* QPointArray el; el.makeEllipse(tl.x(), tl.y(), br.x() - tl.x(), br.y() - tl.y() ); drawPolyline(el, c1); */ if (fillColor.isValid() == true) { drawEllipse(tl, br, true, c1, true, fillColor); } else { drawEllipse(tl, br, true, c1, false, fillColor); } } if (type == BRACKET_SQUARE) { drawLine(tl, bl, 1, c1); drawLine(tr, br, 1, c1); drawLine(tl, QPoint(tl_x + qRound(sf), tl_y), 1, c1); drawLine(bl, QPoint(tl_x + qRound(sf), br_y), 1, c1); drawLine(tr, QPoint(br_x - qRound(sf), tl_y), 1, c1); drawLine(br, QPoint(br_x - qRound(sf), br_y), 1, c1); } if (type == BRACKET_CURVE) { // calculate center of circle double cx = (tl_x + br_x) / 2.0; double cy = (tl_y + br_y) / 2.0; // calculate box enclosing circle double wx = br_x - tl_x; double wy2 = (br_y - tl_y) / 2.0; double box_x = cx - wx; double box_y = cy - wx; double ang1 = acos(wy2 / wx) * 180.0 / M_PI; ang1 = 90.0 - ang1; // ang1 *= 16.0; QPainterPath pp; pp.moveTo(br); pp.arcTo(qRound(box_x), qRound(box_y), qRound(wx * 2.0), qRound(wx * 2.0), qRound(-ang1), qRound(2.0 * ang1)); drawPolyline(pp, c1); pp.moveTo(tl); pp.arcTo(qRound(box_x), qRound(box_y), qRound(wx * 2.0), qRound(wx * 2.0), qRound(-ang1 + 180.0), qRound(2.0 * ang1)); drawPolyline(pp, c1); } if (type == BRACKET_BRACE) { drawLine(QPoint(tl_x + qRound(sf2), tl_y), QPoint(tl_x + qRound(sf2), br_y), 1, c1); drawLine(QPoint(br_x - qRound(sf2), tl_y), QPoint(br_x - qRound(sf2), br_y), 1, c1); drawLine(QPoint(tl_x + qRound(sf2), tl_y), QPoint(tl_x + qRound(sf), tl_y), 1, c1); drawLine(QPoint(tl_x + qRound(sf2), br_y), QPoint(tl_x + qRound(sf), br_y), 1, c1); drawLine(QPoint(br_x - qRound(sf2), tl_y), QPoint(br_x - qRound(sf), tl_y), 1, c1); drawLine(QPoint(br_x - qRound(sf2), br_y), QPoint(br_x - qRound(sf), br_y), 1, c1); double midy = (tl_y + br_y) / 2.0; drawLine(QPoint(tl_x, qRound(midy)), QPoint(tl_x + qRound(sf2), qRound(midy)), 1, c1); drawLine(QPoint(br_x, qRound(midy)), QPoint(br_x - qRound(sf2), qRound(midy)), 1, c1); } } void Render2D::drawWavyLine(QPointF a, QPointF b, QColor c1) { /* if (directdraw) p.begin(this); else p.begin(&dbuffer); p.setPen(c1); */ double dampl = 3.0; QPointF last, swpc; last.setX(-10); if (a.x() > b.x()) { swpc = a; a = b; b = swpc; } double ia = getAngle(a, b); double dx = b.x() - a.x(); double dy = b.y() - a.y(); double dmag = sqrt(dx * dx + dy * dy); int nwaves = qRound(dmag / 6.0); double wwidth = dmag / (double)nwaves; int cn; double dx1, dy1, ia_rad, dx2, dy2; for (cn = 0; cn <= (int)dmag; cn++) { dx1 = (double)cn; dy1 = dampl * sin(cn * M_PI / wwidth); ia_rad = ia * M_PI / 180.0; dx2 = dx1 * cos(ia_rad) - dy1 * sin(ia_rad); dy2 = dx1 * sin(ia_rad) + dy1 * cos(ia_rad); dx2 += (double)a.x(); dy2 += (double)a.y(); swpc.setX((int)dx2); swpc.setY((int)dy2); // drawLine(swpc, swpc, 1, c1, 0); if (last.x() > 0) { // p.drawPoint(swpc); drawLine(last, swpc, 1, c1, 0); } last = swpc; } } void Render2D::drawUpLine(QPointF a, QPointF b, QColor c1) { double ang = getAngle(a, b); double dx = b.x() - a.x(); double dy = b.y() - a.y(); double angvar = asin(3.0 / sqrt(dx * dx + dy * dy)) * 180 / M_PI; double newang1 = ang + angvar; double newang2 = ang - angvar; double newlen = sqrt(dx * dx + dy * dy); double mysign = 1.0; dx = mysign * newlen * cos(newang1 / MOL_ARAD); dy = mysign * newlen * sin(newang1 / MOL_ARAD); QPointF t1(a.x() + dx, a.y() + dy); dx = mysign * newlen * cos(newang2 / MOL_ARAD); dy = mysign * newlen * sin(newang2 / MOL_ARAD); QPointF t2(a.x() + dx, a.y() + dy); if (outputDevice == OUTPUT_EPS) { a.setY(a.y() + (2 * (selectionBox.center().y() - a.y()))); t1.setY(t1.y() + (2 * (selectionBox.center().y() - t1.y()))); t2.setY(t2.y() + (2 * (selectionBox.center().y() - t2.y()))); output_ts << "newpath"; output_ts << t1.x() - eps_dx << " " << t1.y() - eps_dy << " moveto"; output_ts << t2.x() - eps_dx << " " << t2.y() - eps_dy << " lineto"; output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " lineto"; output_ts << t1.x() - eps_dx << " " << t1.y() - eps_dy << " lineto"; output_ts << "closepath fill"; return; } /* if (outputDevice == OUTPUT_PRINTER) { // put line on paintqueue to render in Print() Paintable *pa = new Paintable; pa->op = OP_UP_LINE; pa->a = t1; pa->b = t2; pa->b1 = a; pa->c = c1; paintqueue.append(pa); return; } if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->setPen(c1); painter->setBrush(QBrush(c1)); QPolygonF triangle; triangle << t1 << t2 << a; painter->drawPolygon(triangle); painter->setBrush(QBrush(Qt::NoBrush)); } void Render2D::drawDownLine(QPointF a, QPointF b, QColor c1) { double ang = getAngle(a, b) / MOL_ARAD; double dx = b.x() - a.x(); double dy = b.y() - a.y(); double angvar = asin(4.0 / sqrt(dx * dx + dy * dy)); double upang = ang + angvar; double cosup = cos(upang); double sinup = sin(upang); double downang = ang - angvar; double cosdown = cos(downang); double sindown = sin(downang); double newlen = sqrt(dx * dx + dy * dy); QPointF t1, t2; for (double scalefactor = 1.0; scalefactor < newlen; scalefactor = scalefactor + 3.0) { t1.setX((a.x() + scalefactor * cosup)); t1.setY((a.y() + scalefactor * sinup)); t2.setX((a.x() + scalefactor * cosdown)); t2.setY((a.y() + scalefactor * sindown)); drawLine(t1, t2, 1, c1); } } void Render2D::drawArrow(QPointF a, QPointF b, QColor c1, int s1, int th1) { // Build arrowhead(s) double ang, oppang, myangle, x2, y2; oppang = getAngle(a, b); ang = getAngle(b, a); double newang1 = ang + 30.0; double newang2 = ang - 30.0; double newang3 = oppang + 30.0; double newang4 = oppang - 30.0; QPointF a1(b.x() + (cos(newang1 / MOL_ARAD) * 10.0), b.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a2(b.x() + (cos(newang2 / MOL_ARAD) * 10.0), b.y() + (sin(newang2 / MOL_ARAD) * 10.0)); QPointF a3(a.x() + (cos(newang3 / MOL_ARAD) * 10.0), a.y() + (sin(newang3 / MOL_ARAD) * 10.0)); QPointF a4(a.x() + (cos(newang4 / MOL_ARAD) * 10.0), a.y() + (sin(newang4 / MOL_ARAD) * 10.0)); if (s1 == ARROW_REGULAR) { drawLine(a, b, th1, c1); drawLine(b, a1, th1, c1); drawLine(b, a2, th1, c1); } if (s1 == ARROW_TOPHARPOON) { drawLine(a, b, th1, c1); if (a1.y() < a2.y()) drawLine(b, a1, th1, c1); else drawLine(b, a2, th1, c1); } if (s1 == ARROW_BOTTOMHARPOON) { drawLine(a, b, th1, c1); if (a1.y() > a2.y()) drawLine(b, a1, th1, c1); else drawLine(b, a2, th1, c1); } if (s1 == ARROW_MIDDLE) { QPointF m1 = Midpoint(a, b); double newang5 = ang + 45.0; double newang6 = ang - 45.0; double newang7 = oppang + 45.0; double newang8 = oppang - 45.0; QPointF a5(m1.x() + (cos(newang5 / MOL_ARAD) * 10.0), m1.y() + (sin(newang5 / MOL_ARAD) * 10.0)); QPointF a6(m1.x() + (cos(newang6 / MOL_ARAD) * 10.0), m1.y() + (sin(newang6 / MOL_ARAD) * 10.0)); QPointF a7(m1.x() + (cos(newang7 / MOL_ARAD) * 10.0), m1.y() + (sin(newang7 / MOL_ARAD) * 10.0)); QPointF a8(m1.x() + (cos(newang8 / MOL_ARAD) * 10.0), m1.y() + (sin(newang8 / MOL_ARAD) * 10.0)); drawLine(a, b, th1, c1); // drawLine(b, a1, th1, c1); // drawLine(b, a2, th1, c1); drawLine(m1, a5, th1, c1); drawLine(m1, a6, th1, c1); // drawLine(m1, a7, th1, c1); // drawLine(m1, a8, th1, c1); } if (s1 == ARROW_DIDNT_WORK) { QPointF m1 = Midpoint(a, b); double newang5 = ang + 45.0; double newang6 = ang - 45.0; double newang7 = oppang + 45.0; double newang8 = oppang - 45.0; QPointF a5(m1.x() + (cos(newang5 / MOL_ARAD) * 10.0), m1.y() + (sin(newang5 / MOL_ARAD) * 10.0)); QPointF a6(m1.x() + (cos(newang6 / MOL_ARAD) * 10.0), m1.y() + (sin(newang6 / MOL_ARAD) * 10.0)); QPointF a7(m1.x() + (cos(newang7 / MOL_ARAD) * 10.0), m1.y() + (sin(newang7 / MOL_ARAD) * 10.0)); QPointF a8(m1.x() + (cos(newang8 / MOL_ARAD) * 10.0), m1.y() + (sin(newang8 / MOL_ARAD) * 10.0)); drawLine(a, b, th1, c1); drawLine(b, a1, th1, c1); drawLine(b, a2, th1, c1); drawLine(m1, a5, th1, c1); drawLine(m1, a6, th1, c1); drawLine(m1, a7, th1, c1); drawLine(m1, a8, th1, c1); } if (s1 == ARROW_DASH) { drawLine(a, b, th1, c1, 1); drawLine(b, a1, th1, c1); drawLine(b, a2, th1, c1); } if (s1 == ARROW_BI1) { drawLine(a, b, 1, c1); drawLine(b, a1, 1, c1); drawLine(b, a2, 1, c1); drawLine(a, a3, 1, c1); drawLine(a, a4, 1, c1); } if (s1 == ARROW_BI2) { myangle = getAngle(a, b); myangle += 90.0; myangle = myangle * (M_PI / 180.0); double offs = DistanceBetween(a, b) / 25.0; if (offs > 2.0) offs = 2.0; x2 = cos(myangle) * 2.5 * offs; y2 = sin(myangle) * 2.5 * offs; QPointF sp1(a.x() + x2, a.y() + y2); QPointF ep1(b.x() + x2, b.y() + y2); QPointF sp2(a.x() - x2, a.y() - y2); QPointF ep2(b.x() - x2, b.y() - y2); QPointF a8(ep2.x() + (cos(newang1 / MOL_ARAD) * 10.0), ep2.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a9(sp1.x() + (cos(newang3 / MOL_ARAD) * 10.0), sp1.y() + (sin(newang3 / MOL_ARAD) * 10.0)); drawLine(sp1, ep1, 1, c1); drawLine(ep2, a8, 1, c1); drawLine(sp2, ep2, 1, c1); drawLine(sp1, a9, 1, c1); } if (s1 == ARROW_RETRO) { myangle = getAngle(a, b); myangle += 90.0; myangle = myangle * (M_PI / 180.0); double offs = DistanceBetween(a, b) / 25.0; if (offs > 2.0) offs = 2.0; x2 = cos(myangle) * 4.0 * offs; y2 = sin(myangle) * 4.0 * offs; QPointF sp1(a.x() + x2, a.y() + y2); QPointF ep1(b.x() + x2, b.y() + y2); QPointF sp2(a.x() - x2, a.y() - y2); QPointF ep2(b.x() - x2, b.y() - y2); double dx = ep1.x() - sp1.x(); double dy = ep1.y() - sp1.y(); dx = dx / DistanceBetween(sp1, ep1); dy = dy / DistanceBetween(sp1, ep1); dx = dx * (DistanceBetween(sp1, ep1) - (4.0 * offs)); dy = dy * (DistanceBetween(sp1, ep1) - (4.0 * offs)); ep1.setX(sp1.x() + dx); ep1.setY(sp1.y() + dy); ep2.setX(sp2.x() + dx); ep2.setY(sp2.y() + dy); double newang5 = ang + 45.0; double newang6 = ang - 45.0; QPointF a8(b.x() + (cos(newang5 / MOL_ARAD) * 10.0 * offs), b.y() + (sin(newang5 / MOL_ARAD) * 10.0 * offs)); QPointF a9(b.x() + (cos(newang6 / MOL_ARAD) * 10.0 * offs), b.y() + (sin(newang6 / MOL_ARAD) * 10.0 * offs)); drawLine(sp1, ep1, 1, c1); drawLine(sp2, ep2, 1, c1); drawLine(sp1, sp2, 1, c1); drawLine(b, a8, 1, c1); drawLine(b, a9, 1, c1); } } void Render2D::drawBox(QPoint a, QPoint b, QColor c1) { /* if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->setPen(c1); painter->setBrush(QBrush(Qt::NoBrush)); painter->drawRect(QRect(a, b)); } void Render2D::drawFillBox(QPoint a, QPoint b, QColor c1) { drawFillBox(a, b, c1, false, QColor(255, 255, 255), 0); } void Render2D::drawFillBox(QPoint a, QPoint b, QColor c1, bool border, QColor bordercolor, int style) { if (outputDevice == OUTPUT_EPS) { a.setY(a.y() + (2 * (selectionBox.center().y() - a.y()))); b.setY(b.y() + (2 * (selectionBox.center().y() - b.y()))); output_ts << "1.0 1.0 1.0 setrgbcolor"; output_ts << "newpath"; output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " moveto"; output_ts << a.x() - eps_dx << " " << b.y() - eps_dy << " lineto"; output_ts << b.x() - eps_dx << " " << b.y() - eps_dy << " lineto"; output_ts << b.x() - eps_dx << " " << a.y() - eps_dy << " lineto"; output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " lineto"; output_ts << "closepath fill"; output_ts << "0.0 0.0 0.0 setrgbcolor"; return; } /* if (outputDevice == OUTPUT_PRINTER) { // put line on paintqueue to render in Print() Paintable *pa = new Paintable; pa->op = OP_FILLBOX; pa->a = a; pa->b = b; pa->c = c1; paintqueue.append(pa); return; } if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->setPen(c1); painter->fillRect(QRect(a, b), c1); if (border) { if (style == 0) painter->setPen(bordercolor); if (style == 1) painter->setPen(QPen(bordercolor, 0, Qt::DotLine)); painter->drawRect(QRect(a, b)); } } void Render2D::drawCircle(QPoint a, int rad, QColor cfill) { /* if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->setBrush(cfill); painter->setPen(QColor(0, 0, 0)); painter->drawEllipse(a.x(), a.y(), rad * 2, rad * 2); painter->setBrush(QBrush(Qt::NoBrush)); } void Render2D::drawEllipse(QPoint tl, QPoint br, bool drawLine, QColor lineColor, bool drawFill, QColor fillColor) { /* if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ if (drawFill) painter->setBrush(fillColor); if (drawLine) painter->setPen(lineColor); painter->drawEllipse(QRect(tl, br)); painter->setBrush(QBrush(Qt::NoBrush)); } void Render2D::drawText(QChar ch, QPoint a, QColor c1, QFont f) { qDebug() << "drawText: " << ch; int fsize, dy; fsize = f.pointSize(); if (fsize < 1) fsize = f.pixelSize(); if (outputDevice == OUTPUT_EPS) { // calc flip a.setY(a.y() + (2 * (selectionBox.center().y() - a.y()))); output_ts << "/" << f.family() << " findfont " << fsize; output_ts << " scalefont setfont"; if ((rotateOrigin.x() == 0) && (rotateOrigin.y() == 0)) { output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " moveto"; rotateOrigin.setX(a.x()); rotateOrigin.setY(a.y()); } else { dy = a.y() - rotateOrigin.y(); if (dy != 0) output_ts << "0 " << dy << " rmoveto"; if ((ch == '(') || (ch == ')')) output_ts << "(\\" << ch << ") show"; else output_ts << "(" << ch << ") show"; if (dy != 0) output_ts << "0 " << -dy << " rmoveto"; return; } if ((ch == '(') || (ch == ')')) output_ts << "(\\" << ch << ") show"; else output_ts << "(" << ch << ") show"; return; } /* if (outputDevice == OUTPUT_PRINTER) { // put line on paintqueue to render in Print() Paintable *pa = new Paintable; pa->op = OP_TEXT; pa->a = a; pa->c = c1; pa->f = f; pa->ch = ch; paintqueue.append(pa); return; } if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->setPen(c1); painter->setFont(f); painter->drawText(a, ch); } void Render2D::drawString(QString s1, QPoint a, QColor c1, QFont f) { if (outputDevice == OUTPUT_EPS) { // calc flip a.setY(a.y() + (2 * (selectionBox.center().y() - a.y()))); output_ts << "/" << f.family() << " findfont " << f.pointSize(); output_ts << " scalefont setfont"; output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " moveto"; output_ts << "(" << s1 << ") show"; return; } /* if (outputDevice == OUTPUT_PRINTER) { // put line on paintqueue to render in Print() Paintable *pa = new Paintable; pa->op = OP_STRING; pa->a = a; pa->st = s1; pa->f = f; pa->c = c1; paintqueue.append(pa); return; } if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->setPen(c1); painter->setFont(f); painter->drawText(a, s1); } void Render2D::drawTextReverse(QChar ch, QPoint a, QColor c1, QFont f) { /* if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->setPen(c1); painter->setFont(f); QFontMetrics fm = painter->fontMetrics(); QPoint topleft(a.x(), a.y() - fm.ascent()); QPoint bottomright(a.x() + fm.horizontalAdvance(ch), a.y() + fm.descent()); QRect fr(topleft, bottomright); painter->fillRect(fr, c1); painter->setPen(bgcolor); painter->drawText(a, ch); } void Render2D::drawPixmap(QPoint a, QPixmap pix) { if (outputDevice == OUTPUT_EPS) { // calc flip a.setY(a.y() + (2 * (selectionBox.center().y() - a.y())) - 16); output_ts << "20 dict begin"; output_ts << "/picstr 16 string def"; output_ts << "gsave"; output_ts << a.x() - eps_dx << " " << a.y() - eps_dy << " translate"; output_ts << "16 16 scale"; output_ts << "16 16 1"; output_ts << "[16 0 0 -16 0 16]"; output_ts << "{currentfile picstr readhexstring pop}"; output_ts << "image"; QImage im1 = pix.toImage(); qDebug() << im1.width() << ":" << im1.height(); long sumtotal; int row, col; for (row = 0; row < im1.height(); row++) { sumtotal = 0; for (col = 0; col < im1.width(); col++) { if (qGray(im1.pixel(col, row)) > 127) { sumtotal += (long)pow(2.0, (double)(15 - col)); } } output_ts << Qt::hex << sumtotal << Qt::dec; } output_ts << "end" << Qt::endl << "grestore" << Qt::endl; return; } /* if (outputDevice == OUTPUT_PRINTER) { // put line on paintqueue to render in Print() Paintable *pa = new Paintable; pa->op = OP_PIXMAP; pa->a = a; pa->p = pix; paintqueue.append(pa); return; } if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ painter->drawPixmap(a, pix); } void Render2D::drawCurveArrow(QPointF a, QPointF b, QColor c1, QString wh) { /* if (outputDevice == OUTPUT_PRINTER) { // put curve on paintqueue to render in Print() Paintable *pa = new Paintable; if (wh == "CW90") pa->op = OP_CURVE_CW90; if (wh == "CCW90") pa->op = OP_CURVE_CCW90; if (wh == "CW180") pa->op = OP_CURVE_CW180; if (wh == "CCW180") pa->op = OP_CURVE_CCW180; if (wh == "CW270") pa->op = OP_CURVE_CW270; if (wh == "CCW270") pa->op = OP_CURVE_CCW270; pa->a = a; pa->b = b; pa->c = c1; paintqueue.append(pa); return; } if (directdraw) p.begin(this); else p.begin(&dbuffer); p.scale(zoomFactor, zoomFactor); */ QPainterPath pp; painter->setPen(QPen(c1, 1)); if (wh == "CW180") { // calculate curve QPointF ce = Midpoint(a, b); double d1 = DistanceBetween(a, ce); double sa = getAngle(ce, a); pp.moveTo(a); pp.arcTo(ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, -sa, -180); painter->drawPath(pp); // painter->drawArc( ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, qRound(-sa * // 16), -180 * 16 ); painter->drawArc( 0, 0, 100, 100, 0, 180 ); // drawPolyline( pp, c1 ); // calculate arrowhead // if curve too small, don't draw arrowhead QPointF realb(pp.currentPosition().toPoint()); sa = getAngle(b, a); double newang1 = sa + 60.0; double newang2 = sa + 120.0; QPointF a1(realb.x() + (cos(newang1 / MOL_ARAD) * 10.0), realb.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a2(realb.x() + (cos(newang2 / MOL_ARAD) * 10.0), realb.y() + (sin(newang2 / MOL_ARAD) * 10.0)); drawLine(realb, a1, 1, c1); drawLine(realb, a2, 1, c1); return; } if (wh == "CCW180") { // calculate curve QPointF ce = Midpoint(a, b); double d1 = DistanceBetween(a, ce); double sa = getAngle(ce, a); pp.moveTo(a); pp.arcTo(ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, -sa, 180); painter->drawPath(pp); // painter->drawArc( ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, qRound(-sa * // 16), 180 * 16 ); // calculate arrowhead // if curve too small, don't draw arrowhead QPointF realb(pp.currentPosition().toPoint()); sa = getAngle(b, a); double newang1 = sa + 240.0; double newang2 = sa + 300.0; QPointF a1(realb.x() + (cos(newang1 / MOL_ARAD) * 10.0), realb.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a2(realb.x() + (cos(newang2 / MOL_ARAD) * 10.0), realb.y() + (sin(newang2 / MOL_ARAD) * 10.0)); drawLine(realb, a1, 1, c1); drawLine(realb, a2, 1, c1); return; } if (wh == "CW90") { // first, figure out where middle of circle is double d1 = DistanceBetween(a, b); double ia = getAngle(a, b); d1 = d1 / 1.4142136; ia = 45.0; double dx1 = ((double)b.x() - (double)a.x()) / 1.4142136; double dy1 = ((double)b.y() - (double)a.y()) / 1.4142136; // rotate vector (dx1, dy1) 45 degrees clockwise double ia_rad = ia * M_PI / 180.0; double dx2 = dx1 * cos(ia_rad) - dy1 * sin(ia_rad); double dy2 = dx1 * sin(ia_rad) + dy1 * cos(ia_rad); QPointF ce(a.x() + dx2, a.y() + dy2); double sa = getAngle(ce, a); pp.moveTo(a); pp.arcTo(ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, -sa, -90); drawPolyline(pp, c1); // painter->drawChord( QRect( a, b ), 180 * 16, -90 * 16 ); // calculate arrowhead // if curve too small, don't draw arrowhead // if (pa.count() == 0) return; // QPointF realb(pa.at(pa.count() - 1)); sa = getAngle(b, a); double newang1 = sa + 15.0; double newang2 = sa + 75.0; QPointF a1(b.x() + (cos(newang1 / MOL_ARAD) * 10.0), b.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a2(b.x() + (cos(newang2 / MOL_ARAD) * 10.0), b.y() + (sin(newang2 / MOL_ARAD) * 10.0)); drawLine(b, a1, 1, c1); drawLine(b, a2, 1, c1); } if (wh == "CCW90") { // first, figure out where middle of circle is double d1 = DistanceBetween(a, b); double ia = getAngle(a, b); d1 = d1 / 1.4142136; ia = -45.0; double dx1 = ((double)b.x() - (double)a.x()) / 1.4142136; double dy1 = ((double)b.y() - (double)a.y()) / 1.4142136; // rotate vector (dx1, dy1) 45 degrees clockwise double ia_rad = ia * M_PI / 180.0; double dx2 = dx1 * cos(ia_rad) - dy1 * sin(ia_rad); double dy2 = dx1 * sin(ia_rad) + dy1 * cos(ia_rad); QPointF ce(a.x() + dx2, a.y() + dy2); double sa = getAngle(ce, a); pp.moveTo(a); pp.arcTo(ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, -sa, 90); drawPolyline(pp, c1); // calculate arrowhead // if curve too small, don't draw arrowhead // if (pa.count() == 0) return; // QPointF realb(pa.at(pa.count() - 1)); sa = getAngle(b, a); double newang1 = sa - 15.0; double newang2 = sa - 75.0; QPointF a1(b.x() + (cos(newang1 / MOL_ARAD) * 10.0), b.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a2(b.x() + (cos(newang2 / MOL_ARAD) * 10.0), b.y() + (sin(newang2 / MOL_ARAD) * 10.0)); drawLine(b, a1, 1, c1); drawLine(b, a2, 1, c1); } if (wh == "CW270") { // first, figure out where middle of circle is double d1 = DistanceBetween(a, b); double ia = getAngle(a, b); d1 = d1 / 1.4142136; ia = -45.0; double dx1 = ((double)b.x() - (double)a.x()) / 1.4142136; double dy1 = ((double)b.y() - (double)a.y()) / 1.4142136; // rotate vector (dx1, dy1) 45 degrees clockwise double ia_rad = ia * M_PI / 180.0; double dx2 = dx1 * cos(ia_rad) - dy1 * sin(ia_rad); double dy2 = dx1 * sin(ia_rad) + dy1 * cos(ia_rad); QPointF ce(a.x() + dx2, a.y() + dy2); double sa = getAngle(ce, a); pp.moveTo(a); pp.arcTo(ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, -sa, -270); drawPolyline(pp, c1); // calculate arrowhead // if curve too small, don't draw arrowhead // if (pa.count() == 0) return; // QPointF realb(pa.at(pa.count() - 1)); QPointF realb(pp.currentPosition().toPoint()); sa = getAngle(b, a); double newang1 = sa + 165.0; double newang2 = sa + 105.0; QPointF a1(realb.x() + (cos(newang1 / MOL_ARAD) * 10.0), realb.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a2(realb.x() + (cos(newang2 / MOL_ARAD) * 10.0), realb.y() + (sin(newang2 / MOL_ARAD) * 10.0)); drawLine(realb, a1, 1, c1); drawLine(realb, a2, 1, c1); } if (wh == "CCW270") { // first, figure out where middle of circle is double d1 = DistanceBetween(a, b); double ia = getAngle(a, b); d1 = d1 / 1.4142136; ia = 45.0; double dx1 = ((double)b.x() - (double)a.x()) / 1.4142136; double dy1 = ((double)b.y() - (double)a.y()) / 1.4142136; // rotate vector (dx1, dy1) 45 degrees clockwise double ia_rad = ia * M_PI / 180.0; double dx2 = dx1 * cos(ia_rad) - dy1 * sin(ia_rad); double dy2 = dx1 * sin(ia_rad) + dy1 * cos(ia_rad); QPointF ce(a.x() + dx2, a.y() + dy2); double sa = getAngle(ce, a); pp.moveTo(a); pp.arcTo(ce.x() - d1, ce.y() - d1, 2 * d1, 2 * d1, -sa, 270); drawPolyline(pp, c1); // calculate arrowhead // if curve too small, don't draw arrowhead // if (pa.count() == 0) return; // QPointF realb(pa.at(pa.count() - 1)); QPointF realb(pp.currentPosition().toPoint()); sa = getAngle(b, a); double newang1 = sa - 165.0; double newang2 = sa - 105.0; QPointF a1(realb.x() + (cos(newang1 / MOL_ARAD) * 10.0), realb.y() + (sin(newang1 / MOL_ARAD) * 10.0)); QPointF a2(realb.x() + (cos(newang2 / MOL_ARAD) * 10.0), realb.y() + (sin(newang2 / MOL_ARAD) * 10.0)); drawLine(realb, a1, 1, c1); drawLine(realb, a2, 1, c1); } } // Make QPixmap of this drawing. // just the drawing if page_size set to paper (LETTER, LEGAL, A4, ...) // whole area if set to a screen size (640, 800, 1024) QPixmap Render2D::MakePixmap(bool transp) { double oldspace = preferences.getDoubleBondOffset(); preferences.setDoubleBondOffset(oldspace * 2.0); font_size_kludge = true; prev_mode = mode; QRect r; c->SelectAll(); DPoint dp1; selectionBox = c->selectionBox(); QRect finalsize = selectionBox; dp1.set(selectionBox.topLeft()); c->Resize(&dp1, 2.0); if (preferences.getPageSize() < PAGE_640) r = c->selectionBox(); else r = QRect(0, 0, renderWidth, renderHeight); c->DeselectAll(); mode = MODE_SELECT; // so selection box will not appear finishedPainting = false; update(); r.setTopLeft(zoomCorrect(r.topLeft())); r.setBottomRight(zoomCorrect(r.bottomRight())); // hack to avoid cropping text r.adjust(-10, -10, 10, 10); QPixmap pm(r.size()); qDebug() << "X1:" << r.left() << " Y1:" << r.top(); qDebug() << "W:" << r.width() << " H:" << r.height(); // while ( !finishedPainting ) { // qInfo() << "Waiting..."; //} // bitBlt( &pm, 0, 0, this, r.left(), r.top(), r.width(), r.height() ); // deprecated: pm = QPixmap::grabWidget( this, r.left(), r.top(), r.width(), // r.height() ); pm = grab(r); pm = pm.scaled(finalsize.width(), finalsize.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation); if (transp) { QBitmap bm(r.size()); bm = pm; QImage bi; bi = bm.toImage(); // bi.invertPixels(); bm = QBitmap::fromImage(bi); pm.setMask(bm); } mode = prev_mode; c->SelectAll(); selectionBox = c->selectionBox(); dp1.set(selectionBox.topLeft()); c->Resize(&dp1, 0.5); c->DeselectAll(); font_size_kludge = false; preferences.setDoubleBondOffset(oldspace); return pm; } // Make QPixmap of this drawing. QPixmap Render2D::MakeFullPixmap() { c->DeselectAll(); mode = MODE_SELECT; // so selection box will not appear update(); QPixmap pm(size()); // deprecated: pm = QPixmap::grabWidget( this, rect() ); pm = grab(rect()); return pm; } xdrawchem-v1.11.0/xdrawchem/render2d_event.cpp000066400000000000000000002153751371466245600213710ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include "bracket.h" #include "chemdata.h" #include "defs.h" #include "drawable.h" #include "molecule.h" #include "molinfodialog.h" #include "render2d.h" #include "text.h" #include "textshapedialog.h" #include "xdc_event.h" // move point to grid if needed QPoint Render2D::GridLock(QPoint qp1) { if (mode < 200) return qp1; if (mode > 299) return qp1; int d1 = qRound((double)preferences.getGridSpacing() * zoomFactor); if (preferences.getDrawGrid() == GRID_SQUARE) { double gs = (double)d1, gx = (double)qp1.x(), gy = (double)qp1.y(); int rx, ry; rx = qRound(gx / gs); ry = qRound(gy / gs); qp1.setX(rx * d1); qp1.setY(ry * d1); update(); directdraw = true; // painter->begin(this); drawBox(QPoint(qp1.x() - 2, qp1.y() - 2), QPoint(qp1.x() + 2, qp1.y() + 2), QColor(255, 0, 0)); // painter->end(); directdraw = false; return qp1; } if (preferences.getDrawGrid() == GRID_HEX) { bool hexoffset = true; double hexhoriz = (double)d1 / 2.0; double hexgap = 2.0 * hexhoriz + (double)d1; double hexelevation = hexhoriz * 1.73205; double hex_initx, hex_rightx, dx, dy; double maxdist = 9999.0, max_x = 0.0, max_y = 0.0; for (double hex_y = 0.0; hex_y < renderHeight; hex_y += hexelevation) { if (hexoffset) hex_initx = hexhoriz; else hex_initx = hexgap; for (double hex_x = hex_initx; hex_x < renderWidth; hex_x += hexgap) { hex_rightx = hex_x + (double)d1; dx = hex_x - qp1.x(); dy = hex_y - qp1.y(); if (sqrt(dx * dx + dy * dy) < maxdist) { max_x = hex_x; max_y = hex_y; maxdist = sqrt(dx * dx + dy * dy); } hex_x = hex_rightx; dx = hex_x - qp1.x(); dy = hex_y - qp1.y(); if (sqrt(dx * dx + dy * dy) < maxdist) { max_x = hex_x; max_y = hex_y; maxdist = sqrt(dx * dx + dy * dy); } } hexoffset = !hexoffset; } qp1.setX((int)max_x); qp1.setY((int)max_y); return qp1; } return qp1; } // right-click popup choices from mousePressEvent popup (rtclickpopup) void Render2D::molInfo() { qDebug() << "Popup-info"; DPoint *tmp_pt2 = new DPoint; tmp_pt2->set(targetmol->BoundingBoxAll().center()); c->Tool(tmp_pt2, MODE_TOOL_MOLECULE_INFO); } void Render2D::molSelect() { DeselectAll(); targetmol->SelectAll(); selectionBox = c->selectionBox(); mode = MODE_SELECT_MULTIPLE_SELECTED; update(); } void Render2D::molCut() { DeselectAll(); targetmol->SelectAll(); Cut(); qDebug() << "popup-Cut"; } void Render2D::molCopy() { DeselectAll(); targetmol->SelectAll(); Copy(); DeselectAll(); qDebug() << "popup-Copy"; } void Render2D::bondEdit() { if (highlightobject->Type() == TYPE_TEXT) { doubleClickFlag = true; prev_mode = mode; mode = MODE_TEXT; DrawText_mousePressEvent(0, QPoint(0, 0)); return; } highlightobject->Edit(); highlightobject->Highlight(false); highlightobject = 0; if (mode == MODE_SELECT) setCursor(Qt::ArrowCursor); else setCursor(Qt::CrossCursor); mouse3down = false; update(); } void Render2D::bondInfo() { QString objinf; objinf = tr("No information."); if (highlightobject->Type() == TYPE_BOND) { objinf = "ID: "; objinf.append(((Bond *)highlightobject)->CName()); objinf.append("\nReactions: "); objinf.append(((Bond *)highlightobject)->getReactions()); // make it easier to add to retro.txt qDebug() << "ID:" << ((Bond *)highlightobject)->CName(); } QMessageBox::information(0, tr("Object information"), objinf); } void Render2D::textShape() { localtext = (Text *)highlightobject; TextShapeDialog *tsd = new TextShapeDialog(this); tsd->set_stype(localtext->getShape()); tsd->setBorderCheck(localtext->getBorder()); tsd->setFillCheck(localtext->getFill()); tsd->setBorderColor(localtext->getBorderColor()); tsd->setFillColor(localtext->getFillColor()); tsd->setWidth(localtext->getShapeWidth()); tsd->setHeight(localtext->getShapeHeight()); if (tsd->exec()) { qDebug() << "textShape OK"; } localtext->setShape(tsd->get_stype()); localtext->setBorder(tsd->getBorderCheck()); localtext->setFill(tsd->getFillCheck()); localtext->setBorderColor(tsd->getBorderColor()); localtext->setFillColor(tsd->getFillColor()); localtext->setShapeWidth(tsd->getWidth()); localtext->setShapeHeight(tsd->getHeight()); delete tsd; localtext = 0; } void Render2D::bracketFill() { Bracket *lbracket = (Bracket *)highlightobject; QColor b1color = lbracket->getFillColor(); b1color = QColorDialog::getColor(b1color); if (b1color.isValid() == true) { lbracket->setFill(true); lbracket->setFillColor(b1color); } } void Render2D::bracketFillOff() { Bracket *lbracket = (Bracket *)highlightobject; lbracket->setFill(false); } void Render2D::mousePressEvent(QMouseEvent *e1) { qDebug() << "mousePressEvent begin; mode: " << mode; if (localstring == "XDC_DELETE_ME") { delete localtexteditor; localtexteditor = 0; localstring = " "; } QPoint curqpt = zoomCorrectReverse(e1->pos()); if (preferences.getSnapGrid() != GRID_NONE) { curqpt = GridLock(curqpt); } bool allowedit = false; moved = false; DPoint tmp_pt(curqpt.x(), curqpt.y()); DPoint *tmp_pt2 = new DPoint; tmp_pt2->x = curqpt.x(); tmp_pt2->y = curqpt.y(); if (mode > 100) c->StartUndo(mode, 0); // BMS: StartUndo does nothing with the point - don't copy! // qDebug() << "Click" ; // update button state if (e1->button() == Qt::LeftButton) mouse1down = true; if (e1->button() == Qt::RightButton) { mouse3down = true; } // qDebug() << "start at " << curqpt.x() << "," << curqpt.y() ; // can the current mode use right button popup menu? bool rbm = false; if (mode == MODE_SELECT || mode == MODE_SELECT_MOVE_OBJECT || mode == MODE_DRAWBRACKET) rbm = true; if (rbm && mouse3down) { // if (rtclickpopup != 0) delete rtclickpopup; rtclickpopup = new QMenu(this); bool menu_ok = false; if ((mode == MODE_DRAWBRACKET) && (highlightobject == 0)) { // put nearest bracket into highlightobject DPoint *e = new DPoint; e->x = curqpt.x(); e->y = curqpt.y(); double distobj; // get Drawable of nearest object Drawable *no = c->FindNearestObject(e, distobj); if ((distobj < 5.0) && (no->Type() == TYPE_BRACKET)) highlightobject = no; } if (highlightobject != 0) { QString rtmt; rtmt = tr("Object"); if (highlightobject->Type() == TYPE_ARROW) rtmt = tr("Arrow"); else if (highlightobject->Type() == TYPE_BOND) rtmt = tr("Bond"); else if (highlightobject->Type() == TYPE_BRACKET) rtmt = tr("Bracket"); else if (highlightobject->Type() == TYPE_CURVEARROW) rtmt = tr("Curved Arrow"); else if (highlightobject->Type() == TYPE_SYMBOL) rtmt = tr("Symbol"); else if (highlightobject->Type() == TYPE_TEXT) rtmt = tr("Text"); QAction *title = new QAction("test", this); title->setEnabled(false); QFont f = title->font(); // rtclickpopup->setFont( QFont("Helvetica", 12, // QFont::Bold) ); rtclickpopup->addAction(title); rtclickpopup->addSeparator(); rtclickpopup->addAction(tr("Edit"), this, SLOT(bondEdit())); if (highlightobject->Type() == TYPE_BOND) { rtclickpopup->addAction(tr("Info"), this, SLOT(bondInfo())); } else if (highlightobject->Type() == TYPE_BRACKET) { rtclickpopup->addAction(tr("Fill color..."), this, SLOT(bracketFill())); rtclickpopup->addAction(tr("No fill"), this, SLOT(bracketFillOff())); } else if (highlightobject->Type() == TYPE_TEXT) { rtclickpopup->addAction(tr("Shape..."), this, SLOT(textShape())); } menu_ok = true; } targetmol = c->insideMolecule(tmp_pt2); if (targetmol != 0) { rtclickpopup->setTitle(tr("Molecule")); rtclickpopup->addAction(tr("Info"), this, SLOT(molInfo())); rtclickpopup->addAction(tr("Select"), this, SLOT(molSelect())); rtclickpopup->addAction(tr("Cut"), this, SLOT(molCut())); rtclickpopup->addAction(tr("Copy"), this, SLOT(molCopy())); menu_ok = true; } mouse3down = false; if (menu_ok) rtclickpopup->popup(mapToGlobal(e1->pos())); } // MODE_TEXT with right button if ((mode == MODE_TEXT) && mouse3down) { rtclickpopup = new QMenu(this); // int id1; bool menu_ok = false; if (highlightobject != 0) { QString rtmt; rtmt = tr("Object"); if (highlightobject->Type() == TYPE_TEXT) rtmt = tr("Text"); rtclickpopup->addAction(rtmt); rtclickpopup->addAction(tr("Edit"), this, SLOT(bondEdit())); if (highlightobject->Type() == TYPE_TEXT) rtclickpopup->addAction(tr("Shape..."), this, SLOT(textShape())); menu_ok = true; } mouse3down = false; if (menu_ok) { rtclickpopup->popup(mapToGlobal(e1->pos())); return; } } // MODE_TEXT: call special function to handle text events if (mode == MODE_TEXT) { qDebug() << "mode_text 1"; DrawText_mousePressEvent(e1, curqpt); qDebug() << "mode_text 2"; return; } // MODE_SELECT_LASSO: start lasso if (mode == MODE_SELECT_LASSO) { c->DeselectAll(); curr_lasso.clear(); curr_lasso.append(curqpt); return; } // MODE_SELECT: start multiple selection if ((mode == MODE_SELECT) && (mouse1down)) { if ((highlightpoint == 0) && (highlightobject == 0)) { selectOrigin = e1->pos(); mode = MODE_SELECT_MULTIPLE; return; } else { qDebug() << "Should move."; if (highlightpoint == 0) { mode = MODE_SELECT_MOVE_OBJECT; } else { if (highlightpoint->other != 0) { mode = MODE_DRAWLINE_DRAWING; savedBondOrder = highlightpoint->otherBond->Order(); c->Erase(highlightpoint->otherBond); if (savedBondOrder == 2) c->Erase(highlightpoint->otherBond); if (savedBondOrder == 3) c->Erase(highlightpoint->otherBond); startpoint = highlightpoint->other; endpoint = 0; highlightpoint = 0; prev_mode = MODE_SELECT; } else { mode = MODE_SELECT_MOVE_POINT; } } } return; } // set allowedit = true for appropriate modes if (mode == MODE_SELECT) allowedit = true; // get Drawable of nearest object DPoint *e = new DPoint; e->x = curqpt.x(); e->y = curqpt.y(); double distobj; Drawable *no = c->FindNearestObject(e, distobj); if (distobj > 5.0) no = 0; if (no != 0) { if ((mode == MODE_DRAWLINE) && (no->Type() == TYPE_BOND)) allowedit = true; if ((mode == MODE_DRAWLINE_DASH) && (no->Type() == TYPE_BOND)) allowedit = true; if ((mode == MODE_DRAWLINE_UP) && (no->Type() == TYPE_BOND)) allowedit = true; if ((mode == MODE_DRAWLINE_DOWN) && (no->Type() == TYPE_BOND)) allowedit = true; } // allowedit and BUTTON3: edit item under mouse if ((allowedit) && (mouse3down)) { if (highlightobject == 0) highlightobject = no; if (highlightobject != 0) { if (highlightobject->Type() == TYPE_TEXT) { setCursor(Qt::IBeamCursor); mode = MODE_TEXT; text_exists = true; localtext = (Text *)highlightobject; emit textOn(localtext->getFont()); update(); return; } qDebug() << "Will edit"; highlightobject->Edit(); highlightobject->Highlight(false); highlightobject = 0; if (mode == MODE_SELECT) setCursor(Qt::ArrowCursor); else setCursor(Qt::CrossCursor); mouse3down = false; update(); } return; } // MODE_SELECT_MULTIPLE_SELECTED: either move, or deselect all if ((mode == MODE_SELECT_MULTIPLE_SELECTED) && (mouse1down)) { // check for move if (selectionBox.contains(curqpt)) { c->StartUndo(0, 0); mode = MODE_SELECT_MOVE_MULTIPLE; } else { c->DeselectAll(); mode = MODE_SELECT; update(); } } // MODE_SELECT_MULTIPLE_SELECTED and Button3: Drag and Drop! if ((mode == MODE_SELECT_MULTIPLE_SELECTED) && (mouse3down)) { // check for move if (selectionBox.contains(curqpt)) { dragging = true; } else { c->DeselectAll(); mode = MODE_SELECT; update(); } } // MODE_SELECT_MULTIPLE_RESIZE: resize drawing if ((mode == MODE_SELECT_MULTIPLE_RESIZE) && (mouse1down)) { mode = MODE_SELECT_RESIZE_MULTIPLE; } // MODE_SELECT_MULTIPLE_ROTATE: rotate drawing if ((mode == MODE_SELECT_MULTIPLE_ROTATE) && (mouse1down)) { mode = MODE_SELECT_ROTATE_MULTIPLE; rotateOrigin.setX((selectionBox.right() + selectionBox.left() - 2) / 2); rotateOrigin.setY((selectionBox.bottom() + selectionBox.top()) / 2); prevangle = getAngle(rotateOrigin, curqpt); } // MODE_DRAWLINE (draw line tool selected), and left button. // This means we start drawing a line if ((mode == MODE_DRAWLINE) && (mouse1down)) { startpoint = highlightpoint; // both 0 if nothing selected highlightpoint = 0; // stop drawing highlight box if (startpoint == 0) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; } mode = MODE_DRAWLINE_DRAWING; } // MODE_DRAWWAVYLINE (draw line tool selected), and left button. // This means we start drawing a line if ((mode == MODE_DRAWWAVYLINE) && (mouse1down)) { startpoint = highlightpoint; // both 0 if nothing selected highlightpoint = 0; // stop drawing highlight box if (startpoint == 0) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; } mode = MODE_DRAWWAVYLINE_DRAWING; } // MODE_DRAWCHAIN (draw chain tool selected), and left button. // This means we start drawing an aliphatic chain if ((mode == MODE_DRAWCHAIN) && (mouse1down)) { startpoint = highlightpoint; // both 0 if nothing selected highlightpoint = 0; // stop drawing highlight box if (startpoint == 0) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; } mode = MODE_DRAWCHAIN_DRAWING; } // MODE_DRAWLINE_DASH (draw dashed line tool selected), and left button. // This means we start drawing a dashed line if ((mode == MODE_DRAWLINE_DASH) && (mouse1down)) { startpoint = highlightpoint; // both 0 if nothing selected highlightpoint = 0; // stop drawing highlight box if (startpoint == 0) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; } mode = MODE_DRAWLINE_DASH_DRAWING; } // MODE_DRAWLINE_UP (draw stereo-up line tool selected), and left button. // This means we start drawing a line if ((mode == MODE_DRAWLINE_UP) && (mouse1down)) { startpoint = highlightpoint; // both 0 if nothing selected highlightpoint = 0; // stop drawing highlight box if (startpoint == 0) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; } mode = MODE_DRAWLINE_UP_DRAWING; } // MODE_DRAWLINE_DOWN (draw stereo-down line tool selected), and left // button. This means we start drawing a line if ((mode == MODE_DRAWLINE_DOWN) && (mouse1down)) { startpoint = highlightpoint; // both 0 if nothing selected highlightpoint = 0; // stop drawing highlight box if (startpoint == 0) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; } mode = MODE_DRAWLINE_DOWN_DRAWING; } // MODE_DRAWARROW (draw arrow tool selected), and left button. // This means we start drawing an arrow if ((mode == MODE_DRAWARROW) && (mouse1down)) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; mode = MODE_DRAWARROW_DRAWING; } // MODE_DRAWCURVEARROW (draw curve arrow tool selected), and left button. // This means we start drawing an arrow if ((mode == MODE_DRAWCURVEARROW) && (mouse1down)) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; mode = MODE_DRAWCURVEARROW_DRAWING; } // MODE_DRAWBRACKET (draw bracket tool selected), and left button. // This means we start drawing an bracket if ((mode == MODE_DRAWBRACKET) && (mouse1down)) { startpoint = new DPoint; startpoint->set(curqpt); endpoint = 0; mode = MODE_DRAWBRACKET_DRAWING; } // MODE_ERASE, and left button. Erase highlighted object. if ((mode == MODE_ERASE) && (mouse1down)) { if (highlightobject == 0) return; c->Erase(highlightobject); highlightobject = 0; update(); } } void Render2D::mouseDoubleClickEvent(QMouseEvent *e1) { if (localstring == "XDC_DELETE_ME") { delete localtexteditor; localtexteditor = 0; localstring = " "; } QPoint curqpt = zoomCorrectReverse(e1->pos()); if (preferences.getSnapGrid() != GRID_NONE) { curqpt = GridLock(curqpt); } // bool allowedit = false; moved = false; DPoint tmp_pt(curqpt.x(), curqpt.y()); DPoint *tmp_pt2 = new DPoint; tmp_pt2->x = curqpt.x(); tmp_pt2->y = curqpt.y(); qDebug() << "mouseDoubleClickEvent received"; if (highlightobject != 0) { if (highlightobject->Type() == TYPE_TEXT) { qDebug() << "Activate text object?"; doubleClickFlag = true; prev_mode = mode; mode = MODE_TEXT; DrawText_mousePressEvent(e1, curqpt); return; } } } void Render2D::mouseReleaseEvent(QMouseEvent *e1) { qDebug() << "release MODE: " << mode; DPoint *tmp_pt; XDC_Event *evt; QPoint curqpt = zoomCorrectReverse(e1->pos()); if (preferences.getSnapGrid() != GRID_NONE) { curqpt = GridLock(curqpt); } // qDebug() << "Unclick" ; // update button state if (e1->button() == Qt::LeftButton) mouse1down = false; if (e1->button() == Qt::RightButton) mouse3down = false; // qDebug() << "end at " << curqpt.x() << "," << curqpt.y() ; // Control-LeftClick invokes Molecule Information window if (e1->button() == Qt::LeftButton && e1->modifiers() == Qt::ControlModifier) { tmp_pt = new DPoint(curqpt); c->Tool(tmp_pt, MODE_TOOL_MOLECULE_INFO); update(); return; } // MODE_TEXT: call special function to handle text events if (mode == MODE_TEXT) { DrawText_mouseReleaseEvent(e1, curqpt); return; } // MODE_SELECT_LASSO: finish lasso if (mode == MODE_SELECT_LASSO) { // TODO: validate loop // TODO: if loop is OK ("closed") then select points and draw box curr_lasso.append(curr_lasso.at(0)); if (c->SelectWithinLoop(curr_lasso)) { qDebug() << "Objects found in loop"; bool shiftdown = e1->button() == Qt::LeftButton && e1->modifiers() == Qt::ShiftModifier; // c->NewSelectRect(QRect(selectOrigin, selectPrev), shiftdown); selectionBox = c->selectionBox(); if (selectionBox.left() < 999) mode = MODE_SELECT_MULTIPLE_SELECTED; else mode = MODE_SELECT_LASSO; update(); } update(); curr_lasso.clear(); emit SignalSetStatusBar(tr("Select mode: left click on objects to move")); return; } // MODE_DRAWBEZIER if (mode == MODE_DRAWBEZIER) { update(); directdraw = true; // painter->begin(this); if (bezier_count < 3) { // tmp_bezier.setPoint( bezier_count, curqpt.x(), // curqpt.y() ); drawBezier(tmp_bezier, currentColor, true); bezier_count++; } else { // tmp_bezier.setPoint( bezier_count, curqpt.x(), // curqpt.y() ); // add new GraphicObject evt = new XDC_Event(EVT_ADD_GRAPHIC); evt->setPoints(tmp_bezier); evt->setParam1(bracket_type); evt->setColor(currentColor); emit XDCEventSignal(evt); // drawBezier( tmp_bezier, currentColor, false, // bracket_type ); tmp_bezier.resize(0); tmp_bezier.resize(4); bezier_count = 0; } directdraw = false; // painter->end(); return; } // MODE_TOOL_*: ChemData handles this, mostly if (mode == MODE_TOOL_RETRO_BONDNAME) { qDebug() << "mode invoke"; // retro_bondname handled by Molecule containing this bond if (highlightobject != 0) { qDebug() << "invoke"; qDebug() << c->insideMolecule(highlightobject->Start()) ->RetroBondName((Bond *)highlightobject, true); highlightobject->Highlight(false); highlightobject = 0; update(); setMode_Select(); } return; } if ((mode > MODE_TOOL) && (mode < MODE_TOOL_RETRO_BONDNAME)) { tmp_pt = new DPoint(curqpt); c->Tool(tmp_pt, mode); // if (mode == MODE_TOOL_CLEANUPMOL) { setMode_Select(); update(); //} return; } // MODE_SELECT_MULTIPLE: finish multiple selection if ((mode == MODE_SELECT_MULTIPLE) && (!mouse1down)) { int tmp1; if (selectOrigin.x() > selectPrev.x()) { tmp1 = selectOrigin.x(); selectOrigin.setX(selectPrev.x()); selectPrev.setX(tmp1); } if (selectOrigin.y() > selectPrev.y()) { tmp1 = selectOrigin.y(); selectOrigin.setY(selectPrev.y()); selectPrev.setY(tmp1); } update(); directdraw = true; // painter->begin(this); drawBox(selectOrigin, selectPrev, QColor(255, 255, 255)); bool shiftdown = false; if (e1->modifiers() == Qt::ShiftModifier) shiftdown = true; c->NewSelectRect(QRect(zoomCorrectReverse(selectOrigin), zoomCorrectReverse(selectPrev)), shiftdown); selectionBox = c->selectionBox(); if (selectionBox.left() < 999) mode = MODE_SELECT_MULTIPLE_SELECTED; else mode = MODE_SELECT; directdraw = false; // painter->end(); return; } // MODE_SELECT_MOVE_MULTIPLE: finish moving if ((mode == MODE_SELECT_MOVE_MULTIPLE) && (!mouse1down)) { mode = MODE_SELECT_MULTIPLE_SELECTED; c->FinishMove(); update(); } // MODE_SELECT_MOVE_OBJECT: finish moving if ((mode == MODE_SELECT_MOVE_OBJECT) && (!mouse1down)) { mode = MODE_SELECT; c->FinishMove(); update(); } // MODE_SELECT_MOVE_POINT: finish moving if ((mode == MODE_SELECT_MOVE_POINT) && (!mouse1down)) { mode = MODE_SELECT; c->FinishMove(); update(); } // MODE_SELECT_RESIZE_MULTIPLE: finish resizing if ((mode == MODE_SELECT_RESIZE_MULTIPLE) && (!mouse1down)) { mode = MODE_SELECT_MULTIPLE_SELECTED; } // MODE_SELECT_ROTATE_MULTIPLE: finish rotating if ((mode == MODE_SELECT_ROTATE_MULTIPLE) && (!mouse1down)) { mode = MODE_SELECT_MULTIPLE_SELECTED; } // MODE_DRAWLINE_DRAWING (drawing line), and left button. // Finish line if ((mode == MODE_DRAWLINE_DRAWING) && (!mouse1down)) { if (moved) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this line/bond to ChemData if (startpoint != endpoint) { evt = new XDC_Event(EVT_ADD_BOND); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setParam1(thick); evt->setParam2(savedBondOrder); evt->setColor(currentColor); emit XDCEventSignal(evt); savedBondOrder = -1; // c->addBond(startpoint, endpoint, thick, 1, currentColor); } } startpoint = 0; endpoint = 0; if (prev_mode == MODE_SELECT) { mode = MODE_SELECT; setCursor(Qt::ArrowCursor); emit SignalSetStatusBar(tr("Select mode: left click on object to " "move, right click on object to edit")); prev_mode = 0; } else { mode = MODE_DRAWLINE; } update(); return; } // MODE_DRAWCHAIN_DRAWING (drawing chain), and left button. // Finish chain if ((mode == MODE_DRAWCHAIN_DRAWING) && (!mouse1down)) { if (moved) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this set of lines/bonds to ChemData double ang, len; QString sang, slen; ang = Drawable::getAngle(startpoint, endpoint); double alt_ang1 = (ang - 30.0) * M_PI / 180.0; double alt_ang2 = (ang + 30.0) * M_PI / 180.0; double alt_swap; if (e1->modifiers() == Qt::ShiftModifier) { alt_swap = alt_ang1; alt_ang1 = alt_ang2; alt_ang2 = alt_swap; } len = startpoint->distanceTo(endpoint); double blen = preferences.getBond_fixedlength(); int n1, nseg = qRound(len / blen); QPoint spoint, epoint, ipoint1, ipoint2; spoint = startpoint->toQPoint(); ipoint1 = spoint; for (n1 = 0; n1 < nseg; n1++) { ipoint2.setX(qRound(ipoint1.x() + cos(alt_ang1) * blen)); ipoint2.setY(qRound(ipoint1.y() + sin(alt_ang1) * blen)); // drawLine( ipoint1, ipoint2, 1, currentColor ); evt = new XDC_Event(EVT_ADD_BOND); if (n1 == 0) evt->setStart(startpoint); else evt->setStart(endpoint); endpoint = new DPoint(ipoint2); evt->setEnd(endpoint); evt->setParam1(thick); evt->setParam2(1); evt->setColor(currentColor); emit XDCEventSignal(evt); alt_swap = alt_ang1; alt_ang1 = alt_ang2; alt_ang2 = alt_swap; ipoint1 = ipoint2; } } startpoint = 0; endpoint = 0; mode = MODE_DRAWCHAIN; update(); return; } // MODE_DRAWLINE_DASH_DRAWING (drawing line), and left button. // Finish line if ((mode == MODE_DRAWLINE_DASH_DRAWING) && (!mouse1down)) { if (moved) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this line/bond to ChemData evt = new XDC_Event(EVT_ADD_BOND_DASH); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setParam1(thick); evt->setColor(currentColor); emit XDCEventSignal(evt); // c->addBond(startpoint, endpoint, thick, 99, currentColor); } startpoint = 0; endpoint = 0; mode = MODE_DRAWLINE_DASH; update(); return; } // MODE_DRAWLINE_UP_DRAWING (drawing line), and left button. // Finish line if ((mode == MODE_DRAWLINE_UP_DRAWING) && (!mouse1down)) { if (moved) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this line/bond to ChemData evt = new XDC_Event(EVT_ADD_BOND_UP); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setColor(currentColor); emit XDCEventSignal(evt); // c->addBond(startpoint, endpoint, 1, 5, currentColor); } startpoint = 0; endpoint = 0; mode = MODE_DRAWLINE_UP; update(); return; } // MODE_DRAWLINE_DOWN_DRAWING (drawing line), and left button. // Finish line if ((mode == MODE_DRAWLINE_DOWN_DRAWING) && (!mouse1down)) { if (moved) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this line/bond to ChemData evt = new XDC_Event(EVT_ADD_BOND_DOWN); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setColor(currentColor); emit XDCEventSignal(evt); // c->addBond(startpoint, endpoint, 1, 7, currentColor); } startpoint = 0; endpoint = 0; mode = MODE_DRAWLINE_DOWN; update(); return; } // MODE_DRAWWAVYLINE_DRAWING (drawing line), and left button. // Finish line if ((mode == MODE_DRAWWAVYLINE_DRAWING) && (!mouse1down)) { if (moved) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this line/bond to ChemData evt = new XDC_Event(EVT_ADD_BOND_WAVY); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setColor(currentColor); emit XDCEventSignal(evt); } startpoint = 0; endpoint = 0; mode = MODE_DRAWWAVYLINE; update(); return; } // MODE_DRAWARROW_DRAWING (drawing arrow), and left button. // Finish arrow if ((mode == MODE_DRAWARROW_DRAWING) && (!mouse1down)) { if (moved) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this arrow to ChemData evt = new XDC_Event(EVT_ADD_ARROW); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setColor(currentColor); evt->setParam1(bracket_type); evt->setParam2(thick); emit XDCEventSignal(evt); // c->addArrow(startpoint, endpoint, currentColor, bracket_type); } startpoint = 0; endpoint = 0; mode = MODE_DRAWARROW; update(); } // MODE_DRAWCURVEARROW_DRAWING (drawing curved arrow), and left button. // Finish arrow if ((mode == MODE_DRAWCURVEARROW_DRAWING) && (!mouse1down)) { endpoint = new DPoint; endpoint->set(curqpt); // submit this arrow to ChemData evt = new XDC_Event(EVT_ADD_CURVEARROW); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setColor(currentColor); evt->setText(symbolfile); emit XDCEventSignal(evt); // c->addCurveArrow(startpoint, endpoint, currentColor, symbolfile); startpoint = 0; endpoint = 0; mode = MODE_DRAWCURVEARROW; update(); } // MODE_DRAWBRACKET_DRAWING (drawing bracket), and left button. // Finish bracket if ((mode == MODE_DRAWBRACKET_DRAWING) && (!mouse1down)) { if (endpoint == 0) { endpoint = new DPoint; endpoint->set(curqpt); } // submit this bracket to ChemData evt = new XDC_Event(EVT_ADD_BRACKET); evt->setStart(startpoint); evt->setEnd(endpoint); evt->setColor(currentColor); evt->setParam1(bracket_type); emit XDCEventSignal(evt); // c->addBracket(startpoint, endpoint, currentColor, bracket_type); startpoint = 0; endpoint = 0; mode = MODE_DRAWBRACKET; update(); } // MODE_SYMBOL: create Symbol if ((mode == MODE_SYMBOL) && (!mouse1down)) { if (highlightpoint == 0) { endpoint = new DPoint(curqpt); } else { endpoint = highlightpoint; } if (symbolfile == "antibody") { c->DeselectAll(); DPoint *ab0, *ab1, *ab2; double dab, dabscale; dabscale = preferences.getBond_fixedlength(); dab = dabscale / 1.41421; ab0 = new DPoint(endpoint); ab0->y = ab0->y - dabscale; ab1 = new DPoint(ab0); ab2 = new DPoint(ab0); ab1->x = ab1->x - dab; ab1->y = ab1->y - dab; ab2->x = ab2->x + dab; ab2->y = ab2->y - dab; preferences.setBondCenter(true); evt = new XDC_Event(EVT_ADD_BOND); evt->setStart(endpoint); evt->setEnd(ab0); evt->setParam1(2); evt->setParam2(2); evt->setColor(currentColor); evt->setBool1(true); emit XDCEventSignal(evt); preferences.setBondCenter(false); evt = new XDC_Event(EVT_ADD_BOND); evt->setStart(ab0); evt->setEnd(ab1); evt->setParam1(1); evt->setParam2(2); evt->setColor(currentColor); evt->setBool1(true); emit XDCEventSignal(evt); evt = new XDC_Event(EVT_ADD_BOND); evt->setStart(ab0); evt->setEnd(ab2); evt->setParam1(1); evt->setParam2(2); evt->setBool1(true); evt->setColor(currentColor); emit XDCEventSignal(evt); mode = MODE_SELECT_MULTIPLE_SELECTED; selectionBox = c->selectionBox(); update(); endpoint = 0; return; } if (highlightpoint != 0) { c->addSymbol(highlightpoint, symbolfile); // add to existing point } else { c->addSymbol(endpoint, symbolfile); // add at current mouse position } endpoint = 0; update(); } // MODE_DRAWNEWMAN_*: create Newman projection if ((mode == MODE_DRAWNEWMAN_ANTI) && (!mouse1down)) { endpoint = new DPoint; endpoint->set(curqpt); double blen = preferences.getBond_fixedlength(); int n1; QPoint ipoint1 = endpoint->toQPoint(); QPoint ipoint2; for (n1 = 30; n1 < 331; n1 = n1 + 60) { ipoint2.setX(qRound(ipoint1.x() + cos((double)n1 * M_PI / 180.0) * blen)); ipoint2.setY(qRound(ipoint1.y() + sin((double)n1 * M_PI / 180.0) * blen)); tmp_pt = new DPoint(ipoint2); evt = new XDC_Event(EVT_ADD_BOND); evt->setStart(endpoint); evt->setEnd(tmp_pt); evt->setParam1(thick); evt->setColor(currentColor); emit XDCEventSignal(evt); } c->addSymbol(endpoint, "newman"); endpoint = 0; update(); } // MODE_DRAWNEWMAN_*: create Newman projection if ((mode == MODE_DRAWNEWMAN_GAUCHE) && (!mouse1down)) { endpoint = new DPoint; endpoint->set(curqpt); double blen = preferences.getBond_fixedlength(); int n1; QPoint ipoint1 = endpoint->toQPoint(); QPoint ipoint2; for (n1 = 30; n1 < 331; n1 = n1 + 120) { ipoint2.setX(qRound(ipoint1.x() + cos((double)n1 * M_PI / 180.0) * blen)); ipoint2.setY(qRound(ipoint1.y() + sin((double)n1 * M_PI / 180.0) * blen)); tmp_pt = new DPoint(ipoint2); evt = new XDC_Event(EVT_ADD_BOND); evt->setStart(endpoint); evt->setEnd(tmp_pt); evt->setParam1(thick); evt->setColor(currentColor); emit XDCEventSignal(evt); } for (n1 = 50; n1 < 351; n1 = n1 + 120) { ipoint2.setX(qRound(ipoint1.x() + cos((double)n1 * M_PI / 180.0) * blen)); ipoint2.setY(qRound(ipoint1.y() + sin((double)n1 * M_PI / 180.0) * blen)); tmp_pt = new DPoint(ipoint2); evt = new XDC_Event(EVT_ADD_BOND); evt->setStart(endpoint); evt->setEnd(tmp_pt); evt->setParam1(thick); evt->setColor(currentColor); emit XDCEventSignal(evt); } c->addSymbol(endpoint, "newman"); endpoint = 0; update(); } // MODE_RING: place ring if ((mode == MODE_RING) && (!mouse1down)) { endpoint = new DPoint; endpoint->set(curqpt); c->setThickKludge(thick); // are we smart-placing this ring? if ((smartplace != 0) && (highlightpoint != 0)) { qDebug() << "smart placement! Mode " << smartplace; if (smartplace == 1) c->SmartPlace(symbolfile, highlightpoint); if (smartplace == 2) c->SmartPlaceToo(symbolfile, highlightpoint); if (smartplace == 3) c->SmartPlaceThree(symbolfile, highlightpoint); // Clear highlighted point highlightpoint = 0; endpoint = 0; mode = MODE_SELECT_MULTIPLE_SELECTED; emit SignalSetStatusBar(tr("Select mode: left click on object to move")); setCursor(Qt::SizeAllCursor); selectionBox = c->selectionBox(); update(); smartplace = 0; c->setThickKludge(-1); return; } // translate ring to click point c->load(symbolfile); c->setThickKludge(-1); mode = MODE_SELECT_MULTIPLE_SELECTED; emit SignalSetStatusBar(tr("Select mode: left click on object to move, " "right click on object to edit")); setCursor(Qt::SizeAllCursor); selectionBox = c->selectionBox(); double dx = endpoint->x - selectionBox.center().x(); double dy = endpoint->y - selectionBox.center().y(); // qDebug() << "Move by " << dx << "," << dy ; c->Move(dx, dy); selectionBox.translate((int)dx, (int)dy); endpoint = 0; update(); smartplace = 0; return; } } void Render2D::mouseMoveEvent(QMouseEvent *e1) { // qDebug() << "mouseMoveEvent begin; mode: " << mode; if (localstring == "XDC_DELETE_ME") { delete localtexteditor; localtexteditor = 0; localstring = " "; } if (mode == MODE_DRAWBRACKET) highlightobject = 0; if ((mode == MODE_RING) && mouse1down) return; if ((mode == MODE_DRAWBEZIER) && mouse1down) return; QPoint curqpt = zoomCorrectReverse(e1->pos()); if (preferences.getSnapGrid() != GRID_NONE) { curqpt = GridLock(curqpt); } lastmouse = curqpt; moved = true; DPoint tmp_pt(curqpt.x(), curqpt.y()); Molecule *tmp_mol; tmp_molecule = 0; // Tools if ((mode >= 600) && (mode < 698)) { tmp_molecule = c->insideMolecule(&tmp_pt); if (tmp_molecule != 0) { QRect mr = tmp_molecule->BoundingBoxAll(); mr.setLeft(mr.left() - 2); mr.setRight(mr.right() + 2); mr.setTop(mr.top() - 2); mr.setBottom(mr.bottom() + 2); selectionBox = mr; update(); } else { update(); } } if (mode == MODE_TOOL_CALCMW) { // check if we're over a molecule tmp_mol = c->insideMolecule(&tmp_pt); if (tmp_mol != 0) { Text *tmp_txt = tmp_mol->CalcMW(); emit SignalSetStatusBar(tmp_txt->getText() + tr(", click to paste into drawing")); delete tmp_txt; } else { emit SignalSetStatusBar(tr("Click on a molecule to calculate its molecular weight")); } return; } if (mode == MODE_TOOL_CALCEF) { // check if we're over a molecule tmp_mol = c->insideMolecule(&tmp_pt); // doesn't copy pointer if (tmp_mol != 0) { Text *tmp_txt = tmp_mol->CalcEmpiricalFormula(); emit SignalSetStatusBar(tmp_txt->getText() + tr(", click to paste into drawing")); delete tmp_txt; } else { emit SignalSetStatusBar(tr("Click on a molecule to calculate its empirical formula")); } return; } // MODE_TOOL_*: return if ((mode >= 600) && (mode < 698)) return; // Dragging if (dragging && mouse3down) { qDebug() << "Start drag"; // make pixmap of selection QRect savebox = selectionBox; int prevmode = mode; mode = MODE_SELECT; c->DeselectAll(); // update(); QPixmap pm; pm = this->grab(savebox); c->NewSelectRect(savebox, false); selectionBox = c->selectionBox(); mode = prevmode; QDrag *drag = new QDrag(this); QMimeData *dragObject = new QMimeData(); dragObject->setImageData(pm.toImage()); drag->setMimeData(dragObject); QSize maxSize = pm.size().boundedTo(QSize(100, 100)); drag->setPixmap(pm.scaled(maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)); drag->exec(); dragging = false; update(); setCursor(Qt::ArrowCursor); mouse3down = false; return; } // MODE_TEXT: call special function to handle text events if (mode == MODE_TEXT) { DrawText_mouseMoveEvent(e1); if (prevpos == 0) { prevpos = new DPoint; } prevpos->x = curqpt.x(); prevpos->y = curqpt.y(); return; } // MODE_SELECT: call special function to handle select events if (mode < 199) { Select_mouseMoveEvent(e1); if (prevpos == 0) { prevpos = new DPoint; } prevpos->x = curqpt.x(); prevpos->y = curqpt.y(); return; } // bool update; double ang, len; QString sang, slen; DPoint *prevhighlight = highlightpoint; Drawable *prevhighlightobject = highlightobject; // Create DPoint of current pointer position DPoint *e = new DPoint; DPoint *nearestPoint = 0; e->x = curqpt.x(); e->y = curqpt.y(); double dist, distobj; // Get DPoint of nearest point nearestPoint = c->FindNearestPoint(e, dist); // get Drawable of nearest object Drawable *no = c->FindNearestObject(e, distobj); // no buttons down if ((mouse1down == false) && (mouse3down == false)) { if (mode == MODE_DRAWARROW) return; // if (no != 0) { // highlight object if object close enough if ((no != 0) && (mode == MODE_ERASE) && (distobj < 6.0)) { highlightobject = no; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); highlightobject->Highlight(true); if (prevhighlightobject != highlightobject) update(); } // unhighlight object if no object close if ((mode == MODE_ERASE) && (no == 0 || distobj >= 6.0)) { // Clear highlighted object highlightobject = 0; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); if (prevhighlightobject != highlightobject) update(); return; } if ((no != 0) && (mode == MODE_TOOL_RETRO_BONDNAME) && (distobj < 6.0)) { if (no->Type() == TYPE_BOND) { highlightobject = no; if (prevhighlightobject != 0) { prevhighlightobject->Highlight(false); } highlightobject->Highlight(true); if (prevhighlightobject != highlightobject) { update(); } } } // unhighlight object if no object close if ((mode == MODE_TOOL_RETRO_BONDNAME) && (no == 0 || distobj >= 6.0)) { // Clear highlighted object highlightobject = 0; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); if (prevhighlightobject != highlightobject) update(); return; } // highlight text object preferentially when MODE_SELECT... if ((no != 0) && (mode == MODE_SELECT) && (no->Type() == TYPE_TEXT)) { highlightpoint = 0; highlightobject = no; if ((prevhighlightobject != highlightobject) && (prevhighlightobject != 0)) prevhighlightobject->Highlight(false); highlightobject->Highlight(true); if (prevhighlightobject != highlightobject) update(); // return since no need to check points return; } // highlight object if object close enough and no point close if ((no != 0) && (mode == MODE_SELECT) && (distobj < 6.0) && (dist >= 8.0)) { highlightobject = no; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); highlightobject->Highlight(true); if (prevhighlightobject != highlightobject) update(); // return since no need to check points return; } // unhighlight object if no object close if ((mode == MODE_SELECT) && (no == 0 || distobj >= 6.0)) { // Clear highlighted object highlightobject = 0; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); if (prevhighlightobject != highlightobject) update(); // don't return; go on to check for points } // unhighlight object if point close if ((mode == MODE_SELECT) && (dist < 8.0)) { // Clear highlighted object highlightobject = 0; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); if (prevhighlightobject != highlightobject) update(); // don't return; go on to check for points } if (nearestPoint != 0) { // qDebug() << dist << " to (" << nearestPoint->x << "," << // nearestPoint->y << ")" ; if ((mode == MODE_TEXT) && (dist < 8.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_TEXT) && (dist >= 8.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_SYMBOL) && (dist < 8.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_SYMBOL) && (dist >= 8.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_SELECT) && (dist < 8.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_SELECT) && (dist >= 8.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE) && (dist < 6.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE) && (dist >= 6.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_RING) && smartplace && (dist < 6.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_RING) && smartplace && (dist >= 6.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE_DASH) && (dist < 6.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE_DASH) && (dist >= 6.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE_UP) && (dist < 6.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE_UP) && (dist >= 6.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE_DOWN) && (dist < 6.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWLINE_DOWN) && (dist >= 6.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWCHAIN) && (dist < 6.0)) { highlightpoint = nearestPoint; if (prevhighlight != highlightpoint) update(); return; } if ((mode == MODE_DRAWCHAIN) && (dist >= 6.0)) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } } // nearestPoint != 0 return; // rest of function only if mouse button down } // no button down // we're probably going to draw something... update(); directdraw = true; // MODE_DRAWLINE_DRAWING: draw temporary line if ((mode == MODE_DRAWLINE_DRAWING) && mouse1down) { qDebug() << "mouseMoveEvent: drawing line"; // if within range of existing point AND the end point is not the same // as the start point, snap to that point if ((dist < 6.0) && (startpoint != nearestPoint)) { highlightpoint = nearestPoint; endpoint = nearestPoint; } else { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); highlightpoint = 0; // stop highlighting if (preferences.getBond_fixed()) { // fix endpoint if fixed set CorrectEndpoint_bond(); nearestPoint = c->FindNearestPoint(endpoint, dist); if (dist < 2.0) { highlightpoint = nearestPoint; endpoint = nearestPoint; } } } ang = Drawable::getAngle(startpoint, endpoint); len = startpoint->distanceTo(endpoint); sang.setNum(ang); slen.setNum(len); emit SignalSetStatusBar(tr("Draw Line - Length = ") + slen + tr(", Angle = ") + sang); // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); // drawLine( startpoint->toQPoint(), endpoint->toQPoint(), thick, // currentColor ); directdraw = false; // painter->end(); return; } // MODE_DRAWLINE_DASH_DRAWING: draw temporary line if ((mode == MODE_DRAWLINE_DASH_DRAWING) && mouse1down) { qDebug() << "mouseMoveEvent: drawing dashed line"; // if within range of existing point AND the end point is not the same // as the start point, snap to that point if ((dist < 6.0) && (startpoint != nearestPoint)) { highlightpoint = nearestPoint; endpoint = nearestPoint; } else { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); highlightpoint = 0; // stop highlighting if (preferences.getBond_fixed()) { // fix endpoint if fixed set CorrectEndpoint_bond(); nearestPoint = c->FindNearestPoint(endpoint, dist); if (dist < 2.0) { highlightpoint = nearestPoint; endpoint = nearestPoint; } } } // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); drawLine(startpoint->toQPoint(), endpoint->toQPoint(), 1, currentColor, 1); directdraw = false; // painter->end(); return; } // MODE_DRAWCHAIN_DRAWING: draw temporary aliphatic chain if ((mode == MODE_DRAWCHAIN_DRAWING) && mouse1down) { // if within range of existing point AND the end point is not the same // as the start point, snap to that point if ((dist < 6.0) && (startpoint != nearestPoint)) { highlightpoint = nearestPoint; endpoint = nearestPoint; } else { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); highlightpoint = 0; // stop highlighting } ang = Drawable::getAngle(startpoint, endpoint); double alt_ang1 = (ang - 30.0) * M_PI / 180.0; double alt_ang2 = (ang + 30.0) * M_PI / 180.0; double alt_swap; if (e1->modifiers() == Qt::ShiftModifier) { alt_swap = alt_ang1; alt_ang1 = alt_ang2; alt_ang2 = alt_swap; } len = startpoint->distanceTo(endpoint); double blen = preferences.getBond_fixedlength(); int n1, nseg = qRound(len / blen); slen.setNum(nseg); emit SignalSetStatusBar(tr("Draw aliphatic chain - Length = ") + slen + tr(" bonds")); QPoint spoint, epoint, ipoint1, ipoint2; spoint = startpoint->toQPoint(); ipoint1 = spoint; chainPoints.clear(); // painter->begin(this); for (n1 = 0; n1 < nseg; n1++) { ipoint2.setX(qRound(ipoint1.x() + cos(alt_ang1) * blen)); ipoint2.setY(qRound(ipoint1.y() + sin(alt_ang1) * blen)); chainPoints << ipoint1 << ipoint2; drawLine(ipoint1, ipoint2, 1, currentColor); alt_swap = alt_ang1; alt_ang1 = alt_ang2; alt_ang2 = alt_swap; ipoint1 = ipoint2; } directdraw = false; // painter->end(); return; } // MODE_DRAWLINE_UP_DRAWING: draw temporary line if ((mode == MODE_DRAWLINE_UP_DRAWING) && mouse1down) { // if within range of existing point AND the end point is not the same // as the start point, snap to that point if ((dist < 6.0) && (startpoint != nearestPoint)) { highlightpoint = nearestPoint; endpoint = nearestPoint; } else { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); highlightpoint = 0; // stop highlighting if (preferences.getBond_fixed()) { // fix endpoint if fixed set CorrectEndpoint_bond(); nearestPoint = c->FindNearestPoint(endpoint, dist); if (dist < 2.0) { highlightpoint = nearestPoint; endpoint = nearestPoint; } } } // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); // drawUpLine( startpoint->toQPoint(), endpoint->toQPoint(), // currentColor ); directdraw = false; // painter->end(); return; } // MODE_DRAWLINE_DOWN_DRAWING: draw temporary line if ((mode == MODE_DRAWLINE_DOWN_DRAWING) && mouse1down) { // if within range of existing point AND the end point is not the same // as the start point, snap to that point if ((dist < 6.0) && (startpoint != nearestPoint)) { highlightpoint = nearestPoint; endpoint = nearestPoint; } else { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); highlightpoint = 0; // stop highlighting if (preferences.getBond_fixed()) { // fix endpoint if fixed set CorrectEndpoint_bond(); nearestPoint = c->FindNearestPoint(endpoint, dist); if (dist < 2.0) { highlightpoint = nearestPoint; endpoint = nearestPoint; } } } // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); // drawDownLine( startpoint->toQPoint(), endpoint->toQPoint(), // currentColor ); directdraw = false; // painter->end(); return; } // MODE_DRAWWAVYLINE_DRAWING: draw temporary line if ((mode == MODE_DRAWWAVYLINE_DRAWING) && mouse1down) { // if within range of existing point AND the end point is not the same // as the start point, snap to that point if ((dist < 6.0) && (startpoint != nearestPoint)) { highlightpoint = nearestPoint; endpoint = nearestPoint; } else { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); highlightpoint = 0; // stop highlighting if (preferences.getBond_fixed()) { // fix endpoint if fixed set CorrectEndpoint_bond(); nearestPoint = c->FindNearestPoint(endpoint, dist); if (dist < 2.0) { highlightpoint = nearestPoint; endpoint = nearestPoint; } } } // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); // drawWavyLine( startpoint->toQPoint(), endpoint->toQPoint(), // currentColor ); directdraw = false; // painter->end(); return; } // MODE_DRAWARROW_DRAWING: draw temporary arrow if ((mode == MODE_DRAWARROW_DRAWING) && mouse1down) { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); if (preferences.getArrow_fixed()) { // fix endpoint if fixed set CorrectEndpoint_arrow(); } // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); // drawArrow( startpoint->toQPoint(), endpoint->toQPoint(), // currentColor, bracket_type, thick ); directdraw = false; // painter->end(); return; } // MODE_DRAWCURVEARROW_DRAWING: draw temporary curve arrow if ((mode == MODE_DRAWCURVEARROW_DRAWING) && mouse1down) { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); // should not draw curve arrows fixed, even if selected // if (fixed) { // fix endpoint if fixed set // CorrectEndpoint(); //} // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); // drawCurveArrow( startpoint->toQPoint(), endpoint->toQPoint(), // currentColor, symbolfile ); directdraw = false; // painter->end(); return; } // MODE_DRAWBRACKET_DRAWING: draw temporary bracket if ((mode == MODE_DRAWBRACKET_DRAWING) && mouse1down) { endpoint = new DPoint; endpoint->x = curqpt.x(); endpoint->y = curqpt.y(); // adjust position for square and circle "brackets" if ((bracket_type == BRACKET_CLOSEDSQUARE) || (bracket_type == BRACKET_CIRCLE)) { double dx = endpoint->x - startpoint->x; double dy = endpoint->y - startpoint->y; if (fabs(dx) < fabs(dy)) { endpoint->x = startpoint->x + std::copysign(dy, dx); } else { endpoint->y = startpoint->y + std::copysign(dx, dy); } } QColor icv; // painter->begin(this); startPoint = startpoint->toQPoint(); endPoint = endpoint->toQPoint(); // drawBracket( startpoint->toQPoint(), endpoint->toQPoint(), // currentColor, bracket_type, icv ); directdraw = false; // painter->end(); return; } // just in case directdraw = false; qDebug() << "mouseMoveEvent end"; } // handle resize event void Render2D::resizeEvent(QResizeEvent *rz) { dbuffer = QPixmap(renderWidth, renderHeight); } void Render2D::paintEvent(QPaintEvent *) { if (localstring == "XDC_DELETE_ME") { delete localtexteditor; localtexteditor = 0; localstring = " "; } // draw background // drawFillBox(QPoint(0,0), QPoint(renderWidth, renderHeight), bgcolor); // initialize global painter object if (outputDevice == OUTPUT_PRINTER) { // qDebug() << "printer"; painter->begin(printer); } else if (outputDevice == OUTPUT_SCREEN) { // qDebug() << "screen"; if (directdraw) { painter->begin(this); } else { // qDebug() << "paintEvent painter begin"; painter->begin(this); } /// TODO: make that an option painter->setRenderHint(QPainter::Antialiasing, true); } // clear buffer pixmap dbuffer.fill(bgcolor); // draw grid as needed // int i1, cl1; if (preferences.getDrawGrid() == GRID_SQUARE || preferences.getDrawGrid() == GRID_HEX) painter->drawPixmap(0, 0, grid); painter->scale(zoomFactor, zoomFactor); // draw all data c->drawAll(); // qDebug() << "paintEvent mode: " << mode; // local/temporary draw operations if (highlightpoint != 0) { qDebug() << "tempBox"; drawBox(QPoint(qRound(highlightpoint->x - 2.0), qRound(highlightpoint->y - 2.0)), QPoint(qRound(highlightpoint->x + 2.0), qRound(highlightpoint->y + 2.0)), QColor(0, 0, 0)); } // if multiple selection, draw rotate and resize handles if (mode == MODE_SELECT_MULTIPLE) { drawBox(zoomCorrectReverse(selectOrigin), zoomCorrectReverse(selectPrev), QColor(0, 0, 0)); } // draw box if over molecule in Tool modes if ((mode >= 600) && (mode < 698)) { if (tmp_molecule != 0) { qDebug() << "tool mode"; drawBox((selectionBox.topLeft()), (selectionBox.bottomRight()), QColor(0, 0, 255)); } } if ((mode > 120) && (mode < 129)) { // draw selection box qDebug() << "multiple selectionBox"; drawBox((selectionBox.topLeft()), (selectionBox.bottomRight()), QColor(0, 0, 0)); // draw rotate handle rotateHandle = selectionBox.topRight(); drawFillBox((QPoint(rotateHandle.x() - 5, rotateHandle.y())), (QPoint(rotateHandle.x(), rotateHandle.y() + 5)), QColor(0, 0, 0)); // draw resize handle resizeHandle = selectionBox.bottomRight(); drawFillBox((QPoint(resizeHandle.x() - 5, resizeHandle.y() - 5)), (resizeHandle), QColor(0, 0, 0)); } if (mode == 91) { // draw selection box qDebug() << "simple selectionBox"; drawBox((selectionBox.topLeft()), (selectionBox.bottomRight()), QColor(0, 0, 0)); // draw rotate handle rotateHandle = selectionBox.topRight(); drawFillBox((QPoint(rotateHandle.x() - 5, rotateHandle.y())), (QPoint(rotateHandle.x(), rotateHandle.y() + 5)), QColor(0, 0, 0)); // draw resize handle resizeHandle = selectionBox.bottomRight(); drawFillBox((QPoint(resizeHandle.x() - 5, resizeHandle.y() - 5)), (resizeHandle), QColor(0, 0, 0)); } /// previews if (mode == MODE_SELECT_LASSO) { drawPolyline(curr_lasso, Qt::blue); } else if (mode == MODE_DRAWLINE_DRAWING) { drawLine(startPoint, endPoint, thick, currentColor); } else if (mode == MODE_DRAWLINE_DASH_DRAWING) { drawLine(startPoint, endPoint, thick, currentColor, 1); } else if (mode == MODE_DRAWCHAIN_DRAWING) { drawPolyline(chainPoints, currentColor); } else if (mode == MODE_DRAWLINE_UP_DRAWING) { drawUpLine(startPoint, endPoint, currentColor); } else if (mode == MODE_DRAWLINE_DOWN_DRAWING) { drawDownLine(startPoint, endPoint, currentColor); } else if (mode == MODE_DRAWWAVYLINE_DRAWING) { drawWavyLine(startPoint, endPoint, currentColor); } else if (mode == MODE_DRAWARROW_DRAWING) { drawArrow(startPoint, endPoint, currentColor, bracket_type, thick); } else if (mode == MODE_DRAWCURVEARROW_DRAWING) { drawCurveArrow(startPoint, endPoint, currentColor, symbolfile); } else if (mode == MODE_DRAWBRACKET_DRAWING) { drawBracket(startPoint, endPoint, currentColor, bracket_type, currentColor); } // now bitBlt buffer onto widget // bitBlt(this, 0, 0, &dbuffer); finishedPainting = true; // qDebug() << "paintEvent painter end"; painter->end(); } void Render2D::zoomEvent() { // read zoom factor from preferences and act accordingly double ozf = zoomFactor; zoomFactor = (double)preferences.getZoom() / 100.0; // scale canvas double sf = zoomFactor / ozf; renderWidth = qRound((double)renderWidth * sf); renderHeight = qRound((double)renderHeight * sf); dbuffer = QPixmap(renderWidth, renderHeight); resize(renderWidth, renderHeight); createGrid(); // redraw update(); } void Render2D::createGrid() { grid = QPixmap(renderWidth, renderHeight); grid.fill(bgcolor); QPainter *gridPainter = new QPainter(&grid); /// TODO: make that an option gridPainter->setRenderHint(QPainter::Antialiasing, true); float i1, cl1; if (preferences.getDrawGrid() == GRID_SQUARE) { i1 = preferences.getGridSpacing() * zoomFactor; // int width = parentWidget()->size().width(); // int height = parentWidget()->size().height(); gridPainter->setPen(QPen(QColor(128, 128, 128), 1, Qt::DotLine)); // draw horizontal for (cl1 = i1; cl1 < renderHeight; cl1 += i1) { gridPainter->drawLine(0, cl1, renderWidth, cl1); } // draw vertical for (cl1 = i1; cl1 < renderWidth; cl1 += i1) { gridPainter->drawLine(cl1, 0, cl1, renderHeight); } } else if (preferences.getDrawGrid() == GRID_HEX) { bool hexoffset = true; i1 = preferences.getGridSpacing() * zoomFactor; float hexhoriz = i1 / 2.0; float hexgap = 2.0 * hexhoriz + i1; float hexelevation = hexhoriz * 1.73205; float hex_initx, hex_rightx; gridPainter->setPen(QPen(QColor(128, 128, 128), 1, Qt::DotLine)); for (float hex_y = 0.0; hex_y < renderHeight; hex_y += hexelevation) { if (hexoffset) { hex_initx = hexhoriz; // Draw missing line in first column gridPainter->drawLine(hexhoriz, hex_y, 0, hex_y - hexelevation); } else { hex_initx = hexgap; } for (float hex_x = hex_initx; hex_x < renderWidth; hex_x += hexgap) { hex_rightx = hex_x + i1; gridPainter->drawLine(hex_x, hex_y, hex_rightx, hex_y); gridPainter->drawLine(hex_x, hex_y, hex_x - hexhoriz, hex_y + hexelevation); gridPainter->drawLine(hex_rightx, hex_y, hex_rightx + hexhoriz, hex_y + hexelevation); hex_x = hex_rightx; } hexoffset = !hexoffset; } } delete gridPainter; } xdrawchem-v1.11.0/xdrawchem/render2d_print.cpp000066400000000000000000000076131371466245600213760ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include "chemdata.h" #include "defs.h" #include "paintable.h" #include "render2d.h" void Render2D::PrintSetup() { printer = new QPrinter; // the following statement is needed for Qt 3.0 or higher printer->setResolution(100); // for convenient calculation of line length printer->setFullPage(true); // printer->setPageSize(QPrinter::Letter); // printer->setOrientation(QPrinter::Portrait); printer->setColorMode(QPrinter::GrayScale); UpdatePageGeometry(); } void Render2D::UpdatePageGeometry() { if (preferences.getPageOrientation() == PAGE_PORTRAIT) { printer->setOrientation(QPrinter::Portrait); switch (preferences.getPageSize()) { case PAGE_LETTER: printer->setPageSize(QPrinter::Letter); renderHeight = 1000; renderWidth = 750; break; case PAGE_LEGAL: printer->setPageSize(QPrinter::Legal); renderHeight = 1300; renderWidth = 750; break; case PAGE_A4: printer->setPageSize(QPrinter::A4); renderHeight = 1070; renderWidth = 776; break; case PAGE_640: renderWidth = 640; renderWidth = 480; break; case PAGE_800: renderWidth = 800; renderWidth = 600; break; case PAGE_1024: renderWidth = 1024; renderWidth = 768; break; default: break; } } else { // page_orientation == PAGE_LANDSCAPE printer->setOrientation(QPrinter::Landscape); switch (preferences.getPageSize()) { case PAGE_LETTER: printer->setPageSize(QPrinter::Letter); renderHeight = 750; renderWidth = 1000; break; case PAGE_LEGAL: printer->setPageSize(QPrinter::Legal); renderHeight = 750; renderWidth = 1300; break; case PAGE_A4: printer->setPageSize(QPrinter::A4); renderHeight = 776; renderWidth = 1070; break; case PAGE_640: renderWidth = 640; renderWidth = 480; break; case PAGE_800: renderWidth = 800; renderWidth = 600; break; case PAGE_1024: renderWidth = 1024; renderWidth = 768; break; default: break; } } renderWidth *= zoomFactor; renderHeight *= zoomFactor; resize(renderWidth, renderHeight); } void Render2D::Print(QString epsname) { QPrintDialog dialog(printer, this); connect(&dialog, SIGNAL(rejected()), SIGNAL(SignalSetStatusBar(QString::fromLatin1("Printing canceled.")))); if (!dialog.exec()) { return; } // QPaintDeviceMetrics pm(printer); c->DeselectAll(); // set output device outputDevice = OUTPUT_PRINTER; // render all objects paintqueue.clear(); update(); // set output to screen outputDevice = OUTPUT_SCREEN; update(); return; } xdrawchem-v1.11.0/xdrawchem/render2d_select.cpp000066400000000000000000000236601371466245600215210ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "chemdata.h" #include "defs.h" #include "render2d.h" #include "text.h" void Render2D::Select_mouseMoveEvent(QMouseEvent *e1) { // MODE_SELECT_LASSO handled slightly differently if ((mode == MODE_SELECT_LASSO) && (mouse1down == false)) return; if ((mode == MODE_SELECT_LASSO) && (mouse1down == true)) { curr_lasso.append(zoomCorrectReverse(e1->pos())); update(); directdraw = true; // painter->begin(this); drawPolyline(curr_lasso, QColor(0, 0, 255)); // painter->end(); directdraw = false; return; } // bool update; DPoint *prevhighlight = highlightpoint; Drawable *prevhighlightobject = highlightobject; // Create DPoint of current pointer position QPoint curqpt = zoomCorrectReverse(e1->pos()); DPoint e(curqpt.x(), curqpt.y()); DPoint *np = 0; double dist, distobj, dx, dy; // Get DPoint of nearest point np = c->FindNearestPoint(&e, dist); // get Drawable of nearest object Drawable *no = c->FindNearestObject(&e, distobj); // qDebug() << "np = " << dist << " no = " << distobj; // if (np == 0) qDebug() << " (np = 0)"; // qDebug() ; // no buttons down if ((mouse1down == false) && (mouse3down == false)) { if (mode == MODE_SELECT_MULTIPLE_SELECTED) { // check if near rotate or resize handle if (DistanceBetween(resizeHandle, curqpt) < 8.0 / zoomFactor) { setCursor(Qt::SizeFDiagCursor); mode = MODE_SELECT_MULTIPLE_RESIZE; return; } if (DistanceBetween(rotateHandle, curqpt) < 8.0 / zoomFactor) { setCursor(rotatecursor); mode = MODE_SELECT_MULTIPLE_ROTATE; return; } // else, check if in selection box (for move) if (selectionBox.contains(curqpt)) setCursor(Qt::SizeAllCursor); else setCursor(Qt::ArrowCursor); return; } if (mode == MODE_SELECT_MULTIPLE_RESIZE) { if (DistanceBetween(resizeHandle, curqpt) >= 8.0 / zoomFactor) { mode = MODE_SELECT_MULTIPLE_SELECTED; if (selectionBox.contains(e1->pos())) setCursor(Qt::SizeAllCursor); else setCursor(Qt::ArrowCursor); return; } return; // do nothing if still on resize handle } if (mode == MODE_SELECT_MULTIPLE_ROTATE) { if (DistanceBetween(rotateHandle, curqpt) >= 8.0 / zoomFactor) { mode = MODE_SELECT_MULTIPLE_SELECTED; if (selectionBox.contains(e1->pos())) setCursor(Qt::SizeAllCursor); else setCursor(Qt::ArrowCursor); return; } return; // do nothing if still on resize handle } if (no != 0) { // highlight text and symbol objects preferentially when // MODE_SELECT... if ((no->Type() == TYPE_TEXT) || (no->Type() == TYPE_SYMBOL)) { highlightpoint = 0; highlightobject = no; if ((prevhighlightobject != highlightobject) && (prevhighlightobject != 0)) prevhighlightobject->Highlight(false); highlightobject->Highlight(true); if (prevhighlightobject != highlightobject) update(); setCursor(Qt::SizeAllCursor); // return since no need to check points return; } // highlight object if object close enough and no point close if ((distobj < 6.0) && (dist >= 8.0)) { highlightpoint = 0; highlightobject = no; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); highlightobject->Highlight(true); if (prevhighlightobject != highlightobject) update(); setCursor(Qt::SizeAllCursor); // return since no need to check points return; } // unhighlight object if no object close if (distobj >= 6.0) { // Clear highlighted object highlightobject = 0; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); if (prevhighlightobject != highlightobject) update(); // don't return; go on to check for points } // unhighlight object if point close if (dist < 8.0) { // Clear highlighted object highlightobject = 0; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); if (prevhighlightobject != highlightobject) update(); // don't return; go on to check for points } } if (np == 0) { highlightpoint = 0; highlightobject = 0; if (prevhighlightobject != 0) { prevhighlightobject->Highlight(false); update(); } setCursor(Qt::ArrowCursor); return; } if (np != 0) { // qDebug() << dist << " to (" << np->x << "," << np->y << ")" ; if (dist < 8.0) { highlightpoint = np; if (prevhighlight != highlightpoint) update(); setCursor(Qt::SizeAllCursor); return; } else { // Clear object, if any if (prevhighlightobject != 0) { prevhighlightobject->Highlight(false); highlightobject = 0; update(); } // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); setCursor(Qt::ArrowCursor); return; } } return; // rest of function only if mouse button down } if ((mode == MODE_SELECT_MULTIPLE) && (mouse1down)) { drawBox(zoomCorrectReverse(selectOrigin), zoomCorrectReverse(selectPrev), QColor(255, 255, 255)); selectPrev = e1->pos(); c->NewSelectRect(QRect(zoomCorrectReverse(selectOrigin), zoomCorrectReverse(selectPrev)), false); update(); directdraw = true; // painter->begin(this); drawBox(zoomCorrectReverse(selectOrigin), zoomCorrectReverse(selectPrev), QColor(0, 0, 0)); // painter->end(); directdraw = false; } if ((mode == MODE_SELECT_RESIZE_MULTIPLE) && (mouse1down)) { // double dh, dw; DPoint dp1(selectionBox.topLeft()); // disallow moves to the left or above selection box if ((e.x < (dp1.x + 2.0)) || (e.y < (dp1.y + 2.0))) { qDebug() << "Warning!"; QPoint gin((int)prevpos->x, (int)prevpos->y), gout; gout = mapToGlobal(gin); cursor().setPos(gout); return; } dx = dp1.distanceTo(&e); dy = dp1.distanceTo(prevpos); // qDebug() << "resize factor " << dx / dy ; c->Resize(&dp1, dx / dy); selectionBox = c->selectionBox(); update(); } if ((mode == MODE_SELECT_ROTATE_MULTIPLE) && (mouse1down)) { // DPoint dp1( rotateOrigin ); DPoint *dp1 = new DPoint; dp1->x = rotateOrigin.x(); dp1->y = rotateOrigin.y(); double da = getAngle(rotateOrigin, e1->pos()); double db = prevangle - da; if (db < -300.0) db += 360.0; if (db > 300.0) db -= 360.0; db = db * M_PI / 180.0; // qDebug() << db ; prevangle = da; c->Rotate(dp1, db); selectionBox = c->selectionBox(); update(); delete dp1; } if ((mode == MODE_SELECT_MOVE_MULTIPLE) && (mouse1down)) { dx = e.x - prevpos->x; dy = e.y - prevpos->y; // qDebug() << "Move by " << dx << "," << dy ; c->Move(dx, dy); selectionBox.translate((int)dx, (int)dy); update(); } if ((mode == MODE_SELECT_MOVE_OBJECT) && (mouse1down)) { dx = e.x - prevpos->x; dy = e.y - prevpos->y; // qDebug() << "Move by " << dx << "," << dy ; c->Move(dx, dy); selectionBox.translate((int)dx, (int)dy); update(); } if ((mode == MODE_SELECT_MOVE_POINT) && (mouse1down)) { dx = e.x - prevpos->x; dy = e.y - prevpos->y; // qDebug() << "Move by " << dx << "," << dy ; highlightpoint->x += dx; highlightpoint->y += dy; update(); } } // Get angle between -BA> and -BD> (Law of Cosines) double Render2D::GetAngle(DPoint *a, DPoint *b, DPoint *d) { double a1 = b->distanceTo(a); double a2 = b->distanceTo(d); double a3 = a->distanceTo(d); double cos1 = (a2 * a2 + a1 * a1 - a3 * a3) / (2 * a1 * a2); return acos(cos1); } xdrawchem-v1.11.0/xdrawchem/render2d_text.cpp000066400000000000000000000512461371466245600212270ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // render2d_text.cpp - text-editing functions in class Render2D #include #include #include #include #include #include #include "bracket.h" #include "charsel.h" #include "chemdata.h" #include "defs.h" #include "molecule.h" #include "render2d.h" #include "text.h" #include "xdc_textedit.h" // insert symbol, from Application void Render2D::InsertSymbol() { if (localtexteditor == 0) return; CharSelDialog cd1(this); QFont tf1; if (cd1.exec()) { tf1 = localtexteditor->currentFont(); localtexteditor->setCurrentFont(cd1.selectedFont()); localtexteditor->insertPlainText(cd1.selectedChar()); localtexteditor->setCurrentFont(tf1); } } // events from QTextEdit void Render2D::DrawText_returnPressed() { qDebug() << "Return pressed inside QTextEdit"; if (localtext->Justify() == JUSTIFY_CENTER) { // this appears to cause a seg fault only under this condition, // called from signal... DrawText_FinishText(); return; } } void Render2D::DrawText_textChanged() { /* qDebug() << "contents: " << localtexteditor->contentsWidth() << ","; qDebug() << localtexteditor->contentsHeight(); localtexteditor->resize( localtexteditor->contentsWidth() + 21, localtexteditor->contentsHeight() );*/ } void Render2D::DrawText_CVAchanged(QTextCharFormat::VerticalAlignment cva) { qDebug() << "New vertical alignment: " << (int)cva; } void Render2D::DrawText_FinishText() { emit TextOff(); if (hotkeymode) { hotkeymode = false; mode = hkprevmode; qDebug() << "hkprevmode = " << mode; } localtexteditor->setReadOnly(true); QString lt2 = localtexteditor->toHtml(); // localtexteditor->setTextFormat( Qt::PlainText ); QString lt1 = localtexteditor->toHtml(); QPixmap ltpix = localtexteditor->grab(); qInfo() << "toHtml():" << localtexteditor->toHtml(); qInfo() << "toPlainText():" << localtexteditor->toPlainText(); qInfo() << "QPixmap: " << ltpix.width() << "," << ltpix.height(); if (localtexteditor->toPlainText().length() == 0) { lt1 = ""; lt2 = ""; } if (localtext->Justify() == JUSTIFY_CENTER) { lt1.remove('\n'); lt2.remove('\n'); lt2.remove("

    "); } qDebug() << "lt1 = " << lt1; qDebug() << "lt2 = " << lt2; localtext->setText(lt1, lt2); // this is done for us now by text::setText! // lt1.fill(' '); // localtext->setTextMask( lt1 ); if (localtext->getText().length() > 0) { if (!text_exists) c->addText(localtext); } else { localtext->Start()->element = "C"; c->Erase(localtext); } if (localtext->Justify() == JUSTIFY_TOPLEFT) { delete localtexteditor; localtexteditor = 0; } else { localtexteditor->hide(); localstring = "XDC_DELETE_ME"; } localtext = 0; highlightpoint = 0; if (highlightobject != 0) { highlightobject->Highlight(false); } highlightobject = 0; if (doubleClickFlag) { mode = prev_mode; doubleClickFlag = false; } // return focus to Render2D setFocus(); return; } // mouse events to handle text functions // (button states should be set before we get here) void Render2D::DrawText_mousePressEvent(QMouseEvent *e1, QPoint cqp) { qDebug() << "DrawText_mousePressEvent 1"; // experimental: use QTextEdit to edit text! if (localtexteditor != 0) { // if clicked off localtexteditor... qDebug() << "click outside editor"; DrawText_FinishText(); return; } qDebug() << "DrawText_mousePressEvent 2"; if (localtexteditor == 0) { localtexteditor = new XdcTextEdit(this); // localtexteditor->setTextFormat( Qt::RichText ); super_set = false; sub_set = false; } qDebug() << "DrawText_mousePressEvent 3"; qDebug() << highlightobject; /* if (0 && highlightobject) { // edit existing object qDebug() << "DrawText_mousePressEvent 3.1"; if (highlightobject->Type() == TYPE_BRACKET) { qDebug() << "DrawText_mousePressEvent 4"; delete localtexteditor; localtexteditor = 0; Bracket *this_bracket = (Bracket *)highlightobject; bool ok = false; QString btext = QInputDialog::getText(tr( "Enter subscript" ), tr( "Please type or edit the subscript for this bracket:" ), QLineEdit::Normal, this_bracket->getText(), &ok, this ); if ( ok ) { qDebug() << "DrawText_mousePressEvent 5"; this_bracket->setText(btext); } else { qDebug() << "DrawText_mousePressEvent 6"; this_bracket->setText(""); } return; // a seg fault will occur otherwise!!! } text_exists = true; localtext = (Text *)highlightobject; Q_CHECK_PTR(localtext); }*/ qDebug() << "DrawText_mousePressEvent 3.2"; if (highlightobject) { if (highlightobject->Type() == TYPE_TEXT) { localtext = (Text *)highlightobject; } } else { localtexteditor->setPlainText(""); } qDebug() << "DrawText_mousePressEvent 3.3"; if (localtext != 0) { qDebug() << "DrawText_mousePressEvent 7"; text_exists = true; localtexteditor->setCurrentFont(localtext->getFont()); localtexteditor->setTextColor(localtext->GetColor()); localtexteditor->setHtml(localtext->getText()); localtexteditor->move(localtext->Start()->toQPoint()); // localtexteditor->resize( localtext->BoundingBox().width() + 40, // localtext->BoundingBox().height() + 20 ); /* localtexteditor->resize( localtexteditor->contentsWidth() + 21, localtexteditor->contentsHeight() );*/ } else { text_exists = false; localtexteditor->move(e1->pos()); localtext = new Text(this); localtext->setFont(currentFont); localtext->SetColor(currentColor); if (highlightpoint) { localtext->setPoint(highlightpoint); localtext->setJustify(JUSTIFY_CENTER); localtext->setText(""); // localtext->setTextMask( "" ); } else { localtext->setPoint(new DPoint(cqp)); localtext->setJustify(JUSTIFY_TOPLEFT); localtext->setText(""); // localtext->setTextMask( "" ); } localtexteditor->setCurrentFont(localtext->getFont()); localtexteditor->setTextColor(localtext->GetColor()); } qDebug() << "DrawText_mousePressEvent 3.4"; emit textOn(localtexteditor->currentFont()); qDebug() << "DrawText_mousePressEvent 3.7"; // this no longer works as a signal/slot connect(localtexteditor, SIGNAL(returnPressed()), this, SLOT(DrawText_returnPressed())); connect(localtexteditor, SIGNAL(textChanged()), this, SLOT(DrawText_textChanged())); qDebug() << "DrawText_mousePressEvent 3.6"; localtexteditor->show(); qDebug() << "DrawText_mousePressEvent 3.5"; QTextCursor cursor = QTextCursor(localtexteditor->document()); cursor.movePosition(QTextCursor::End); qDebug() << "DrawText_mousePressEvent 3.6"; localtexteditor->setFocus(); qDebug() << "DrawText_mousePressEvent end"; return; } void Render2D::DrawText_mouseReleaseEvent(QMouseEvent *e1, QPoint cqp) { // short circuit for now! return; // end QTextEdit experiment } void Render2D::DrawText_mouseMoveEvent(QMouseEvent *e1) { // bool update; DPoint *prevhighlight = highlightpoint; Drawable *prevhighlightobject = highlightobject; // Create DPoint of current pointer position DPoint *e = new DPoint; DPoint *np = 0; e->x = e1->x(); e->y = e1->y(); double dist, distobj; // Get DPoint of nearest point np = c->FindNearestPoint(e, dist); // get Drawable of nearest object Drawable *no = c->FindNearestObject(e, distobj); if (localtext != 0) { // handle moves when there is a current object if (text_drag == true && start_drag) { localtext->Select(start_drag, e); update(); return; } // return; } // look for place to draw if no current text object if (no != 0) { if ((no->Type() == TYPE_TEXT) || ((no->Type() == TYPE_BRACKET) && (distobj < 8.0))) { // highlight text if closest, or bracket highlightpoint = 0; highlightobject = no; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); highlightobject->Highlight(true); if (prevhighlightobject != highlightobject) update(); return; } else { // deselect and check for points // Clear highlighted object highlightobject = 0; if (prevhighlightobject != 0) prevhighlightobject->Highlight(false); if (prevhighlightobject != highlightobject) update(); } } // clear highlighted object (if any) if (prevhighlightobject != 0) { prevhighlightobject->Highlight(false); highlightobject = 0; update(); } // check points if (dist < 6.0) { highlightpoint = np; if (prevhighlight != highlightpoint) update(); return; } if (dist >= 6.0) { // Clear highlighted point highlightpoint = 0; if (prevhighlight != highlightpoint) update(); return; } } // Handle keypress event here, since it only really applies to text void Render2D::keyPressEvent(QKeyEvent *k) { qDebug() << "keypress"; // new stuff for localtexteditor if (localtexteditor != 0) { if (k->key() == Qt::Key_Escape) { DrawText_FinishText(); return; } if (k->key() == Qt::Key_Delete) { qDebug() << "EXCEPTION: Delete key caught."; return; } } // if (mode != MODE_TEXT) { if (k->key() == Qt::Key_Escape) { setMode_Select(); return; } else { if (highlightobject != 0) qDebug() << "hiobj"; if (highlightpoint != 0) qDebug() << "hipt"; if ((highlightpoint != 0) || (highlightobject != 0)) { // emulate ChemDraw(R) "hot key" behavior QString tmpstr = k->text(); qDebug() << "hot key:" << tmpstr << ":"; if (tmpstr.length() < 1) return; tmpstr = tmpstr.toUpper(); hotkeymode = true; hkprevmode = mode; mode = MODE_TEXT; if (localtexteditor != 0) { // if clicked off localtexteditor... qDebug() << "click outside editor"; DrawText_FinishText(); return; } if (localtexteditor == 0) { localtexteditor = new QTextEdit(this); // localtexteditor->setTextFormat( Qt::RichText // ); super_set = false; sub_set = false; } if (highlightobject != 0) { // edit existing object if (highlightobject->Type() == TYPE_BRACKET) { delete localtexteditor; localtexteditor = 0; Bracket *this_bracket = (Bracket *)highlightobject; bool ok = false; QString btext = QInputDialog::getText(this, tr("Enter subscript"), tr("Please type or edit the " "subscript for this bracket:"), QLineEdit::Normal, tmpstr, &ok); if (ok) this_bracket->setText(btext); else this_bracket->setText(""); hotkeymode = false; mode = hkprevmode; return; // a seg fault will occur otherwise!!! } if (highlightobject->Type() != TYPE_TEXT) { delete localtexteditor; localtexteditor = 0; hotkeymode = false; mode = hkprevmode; return; } text_exists = true; localtext = (Text *)highlightobject; Q_CHECK_PTR(localtext); } localtexteditor->setPlainText(tmpstr); if (localtext != 0) { localtexteditor->setCurrentFont(localtext->getFont()); localtexteditor->setTextColor(localtext->GetColor()); // localtexteditor->setText( localtext->getRichText() ); // in this context, set text to hot key, overwriting old text localtexteditor->setPlainText(tmpstr); localtexteditor->move(localtext->Start()->toQPoint()); // localtexteditor->resize( localtext->BoundingBox().width() + // 40, // localtext->BoundingBox().height() + 20 ); /* localtexteditor->resize( localtexteditor->contentsWidth() + 21, localtexteditor->contentsHeight() );*/ } else { text_exists = false; localtexteditor->move(highlightpoint->toQPoint()); localtext = new Text(this); localtext->setFont(currentFont); localtext->SetColor(currentColor); if (highlightpoint) { localtext->setPoint(highlightpoint); localtext->setJustify(JUSTIFY_CENTER); localtext->setText(""); // localtext->setTextMask( "" ); } else { localtext->setPoint(new DPoint(lastmouse)); localtext->setJustify(JUSTIFY_TOPLEFT); localtext->setText(""); // localtext->setTextMask( "" ); } localtexteditor->setCurrentFont(localtext->getFont()); localtexteditor->setTextColor(localtext->GetColor()); } emit textOn(localtext->getFont()); connect(localtexteditor, SIGNAL(returnPressed()), this, SLOT(DrawText_returnPressed())); connect(localtexteditor, SIGNAL(textChanged()), this, SLOT(DrawText_textChanged())); localtexteditor->show(); localtexteditor->setFocus(); return; } // "hot key" } // if key == Escape //} // ...if mode!= MODE_TEXT return; } // Superscript selected text void Render2D::Superscript() { QTextCharFormat format = QTextCharFormat(); if (localtext != 0) { localtext->DoSuperscript(); update(); } if (super_set) { format.setVerticalAlignment(QTextCharFormat::AlignNormal); localtexteditor->setCurrentCharFormat(format); super_set = false; } else { format.setVerticalAlignment(QTextCharFormat::AlignSuperScript); localtexteditor->setCurrentCharFormat(format); super_set = true; } } // Subscript selected text void Render2D::Subscript() { QTextCharFormat format = QTextCharFormat(); if (localtext != 0) { localtext->DoSubscript(); update(); } if (sub_set) { format.setVerticalAlignment(QTextCharFormat::AlignNormal); localtexteditor->setCurrentCharFormat(format); sub_set = false; } else { format.setVerticalAlignment(QTextCharFormat::AlignSubScript); localtexteditor->setCurrentCharFormat(format); sub_set = true; } } // Left-justify text void Render2D::JustifyLeft() { if (localtext != 0) { localtext->ForceAlignment(TEXT_LALIGN); update(); } localtexteditor->selectAll(); localtexteditor->setAlignment(Qt::AlignLeft); localtexteditor->selectAll(); } // Center text void Render2D::JustifyCenter() { if (localtext != 0) { localtext->ForceAlignment(TEXT_CALIGN); update(); } localtexteditor->selectAll(); localtexteditor->setAlignment(Qt::AlignCenter); localtexteditor->selectAll(); } // Right-justify text void Render2D::JustifyRight() { if (localtext != 0) { localtext->ForceAlignment(TEXT_RALIGN); update(); } localtexteditor->selectAll(); localtexteditor->setAlignment(Qt::AlignRight); localtexteditor->selectAll(); } // Bold selected text void Render2D::Bold() { if (localtext != 0) { localtext->DoBold(); update(); } if (localtexteditor != 0) { localtexteditor->setFontWeight( (localtexteditor->fontWeight() == QFont::Bold) ? QFont::Normal : QFont::Bold); } } // Italicize selected text void Render2D::Italic() { if (localtext != 0) { localtext->DoItalic(); update(); } if (localtexteditor != 0) { localtexteditor->setFontItalic(!localtexteditor->fontItalic()); } } // Underline selected text void Render2D::Underline() { if (localtext != 0) { localtext->DoUnderline(); update(); } if (localtexteditor != 0) { localtexteditor->setFontUnderline(!localtexteditor->fontUnderline()); } } // origin = origin point of text // intext = text to draw (or blank); return if modified or not // justify = how to arrange text around origin // oneline = if true (i.e., a label), it's a one-line widget QString Render2D::EditText(QPoint origin, QString intext, int justify, bool oneline) { return intext; } int Render2D::GetTextHeight(QFont fn) { // qInfo() << "QPainter1"; // QPainter p( this ); // painter->setFont( fn ); // QFontMetrics fm = painter->fontMetrics(); QFontMetrics fm = QFontMetrics(fn); return fm.ascent(); } int Render2D::GetTextFullHeight(QFont fn) { // qInfo() << "QPainter2"; // QPainter p( this ); // painter->setFont( fn ); // QFontMetrics fm = painter->fontMetrics(); QFontMetrics fm = QFontMetrics(fn); return fm.height(); } int Render2D::GetCharWidth(QChar ch, QFont fn) { // qInfo() << "QPainter3"; // QPainter p( this ); // painter->setFont( fn ); // QFontMetrics fm = painter->fontMetrics(); QFontMetrics fm = QFontMetrics(fn); return fm.horizontalAdvance(ch); } int Render2D::GetStringWidth(QString ch, QFont fn) { // qInfo() << "QPainter4"; // QPainter p( this ); // painter->setFont( fn ); // QFontMetrics fm = painter->fontMetrics(); QFontMetrics fm = QFontMetrics(fn); return fm.horizontalAdvance(ch); } QRect Render2D::GetTextDimensions(QString txt, QFont fn) { QRect retval; // if empty, return box large enough to hold cursor and indicate place. if (txt.isNull() || txt.isEmpty()) { } // just use the current painter, we'll reset the font when we actually draw. // QPainter p( this ); // painter->setFont( fn ); // QFontMetrics fm = painter->fontMetrics(); QFontMetrics fm = QFontMetrics(fn); int maxwidth, lwidth, linecount, height; QTextStream t(&txt, QIODevice::ReadOnly); linecount = 1; maxwidth = 0; QString l; // find maximum width do { l = t.readLine(); lwidth = fm.horizontalAdvance(l); if (lwidth > maxwidth) maxwidth = lwidth; } while (!t.atEnd()); // find height for (int i = 0; i < txt.length(); i++) { if (QChar(txt[i]).digitValue() == 10) linecount++; /// TODO } if (linecount < 1) linecount = 1; if (maxwidth < 5) maxwidth = 5; height = linecount * fm.height(); retval.setWidth(maxwidth); retval.setHeight(height); return retval; } xdrawchem-v1.11.0/xdrawchem/renderarea.cpp000066400000000000000000000021311371466245600205530ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "renderarea.h" RenderArea::RenderArea(QWidget *parent) : QScrollArea(parent) {} void RenderArea::scrollContentsBy(int dx, int dy) { QScrollArea::scrollContentsBy(dx, dy); emit scrolled(horizontalScrollBar()->value(), verticalScrollBar()->value()); } // cmake#include "renderarea.moc" xdrawchem-v1.11.0/xdrawchem/renderarea.h000066400000000000000000000020351371466245600202230ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef RENDERAREA_H #define RENDERAREA_H #include class RenderArea : public QScrollArea { Q_OBJECT public: RenderArea(QWidget *parent = 0); void scrollContentsBy(int dx, int dy); signals: void scrolled(int x, int y); }; #endif xdrawchem-v1.11.0/xdrawchem/retro.cpp000066400000000000000000000416171371466245600176120ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "arrow.h" #include "bond.h" #include "bracket.h" #include "chemdata.h" #include "defs.h" #include "drawable.h" #include "molecule.h" #include "text.h" // local class for parsing class RetroTreeNode { public: QString thisnode; int depth; RetroTreeNode *child1, *child2, *child3; }; void ChemData::Retro(Molecule *m1) { // does anything actually call this function? } QString Molecule::BuildReactionList(QString inbond) { QString rxns; rxns = tr("No reactions found"); return rxns; } int Molecule::Retro() { // note that we appear to be doing this in Reactivity in // molecule_tools_2.cpp QStringList rxnfile, rxnlist, patlist, resultlist; QString resultString; // read pattern and reaction lists from retro.txt QString fileName = RingDir + QString("retro.txt"); QFile fin(fileName); if (fin.open(QIODevice::ReadOnly) == false) return -1; QTextStream tin(&fin); QString line, thisbond, norbond, pat, rxn; int i1; //, i2; do { line = tin.readLine(); rxnfile.append(line); } while (!tin.atEnd()); fin.close(); int cnt = 0; QStringList::Iterator it1, it2; for (it1 = bondRxns.begin(); it1 != bondRxns.end(); ++it1) { thisbond = *it1; norbond = thisbond; norbond.remove("r"); resultString = ""; for (it2 = rxnfile.begin(); it2 != rxnfile.end(); ++it2) { line = *it2; i1 = line.indexOf(";;"); pat = line.left(i1); rxn = line.mid(i1 + 2); if (RetroMatch(thisbond, pat)) { resultlist.append(rxn); resultString.append(rxn); resultString.append("\n"); } if (thisbond.contains("r") > 0) { if (RetroMatch(norbond, pat)) { resultlist.append(rxn); resultString.append(rxn); resultString.append("\n"); } } } // qDebug() << cnt << " " << resultString; bonds.at(cnt)->setReactions(resultString); cnt++; } // qDebug() << "Retro(): " << resultlist.count() << " reactions"; resultString = ""; for (it1 = resultlist.begin(); it1 != resultlist.end(); ++it1) { resultString.append(*it1); resultString.append("\n"); // qDebug() << *it1; } resultString.prepend(tr("The following reactions could have resulted in this product:\n\n")); resultString.append(tr("\nTarget bonds will be highlighted in green.\nTo see reactions " "affecting a highlighted bond, right-click on the bond and select " "Info.\nTo clear highlights, select Undo from the Edit menu, or " "press Ctrl+Z.")); if (resultlist.count() > 0) { QMessageBox::information(0, tr("Reverse reactions list"), resultString); } else { QMessageBox::information(0, tr("Reverse reactions list"), tr("No reactions in the database could yield " "the selected molecule.")); } return resultlist.count(); } QString Molecule::RetroAtomName(DPoint *latom) { // thought of the day: would the HOSE code suffice here? Probably yes... // this function is needed in case someday I decide not to use HOSE codes // for this purpose, though they work well for pKa :) QString rval; rval = latom->hosecode; return rval; } QString Molecule::RetroBondName(Bond *lbond, bool runsssr) { // hopefully only need to do this once per retro/reactivity operation! if (runsssr) MakeSSSR(); // basic idea: iterate thru bonds, create something like a canonical // SMILES describing the bond and nearest neighbors, and compare to // database. For certain reactions, do a second iteration over atoms // and bonds to rule out side products (e.g. Grignards won't work if // more than one ketone or -COOH) // DB would conatin fields like [SMILES],[name or reaction],[conditions], // [stoppers (like (C=O) in Grignard as noted)] // canonical strings will likely take the form: // <1st(2nd[3rd])(2nd)>0-0<1st><1st(2nd)(2nd[3rd][3rd])> // ...where canonicalization will be accomplished by alphabetizing // within each level. QStringList innerstrlist1, innerstrlist2, innerstrlist3; Bond *local_tmp_bond; //, *inner_tmp_bond; DPoint *outer1, *outer2, *inner1; //, *inner2, *inner3; QString canonicalBond, leveltmpstr, outer1el, outer2el; canonicalBond == QString(); // in the long run, it might be wise to break out this code for // making canonical SMILES-type names into a separate function to // facilitate making the database local_tmp_bond = lbond; outer1 = local_tmp_bond->Start(); outer2 = local_tmp_bond->End(); if (QString::compare(outer1->element, outer2->element) > 0) { inner1 = outer1; outer1 = outer2; outer2 = inner1; } outer1el = outer1->baseElement(); canonicalBond = outer1el.remove(QRegExp("\\-+H+\\d+")); // for some reason, this isn't reliable if (outer1->inring) canonicalBond.append("r"); if (local_tmp_bond->aromatic()) { canonicalBond.append("*"); } else { if (local_tmp_bond->Order() == 1) { canonicalBond.append("-"); } if (local_tmp_bond->Order() == 5) { canonicalBond.append("-"); } if (local_tmp_bond->Order() == 7) { canonicalBond.append("-"); } if (local_tmp_bond->Order() == 2) { canonicalBond.append("="); } if (local_tmp_bond->Order() == 3) { canonicalBond.append("#"); } } outer2el = outer2->baseElement(); canonicalBond.append(outer2el.remove(QRegExp("\\-+H+\\d+"))); // for some reason, this isn't reliable if (outer2->inring) canonicalBond.append("r"); canonicalBond.prepend(RetroTraverseBonds(outer2, outer1, local_tmp_bond, 3)); canonicalBond.append(RetroTraverseBonds(outer1, outer2, local_tmp_bond, 3)); // qDebug() << "canonical bond name:" << canonicalBond; // also test R-group subs if (runsssr) { bool rm1 = RetroMatch(canonicalBond, QString("<-R><-R><-R>C-O")); if (rm1) qDebug() << "tertiary alcohol"; else qDebug() << "*NOT* a tertiary alcohol"; } return canonicalBond; } QString Molecule::RetroTraverseBonds(DPoint *parentNode, DPoint *thisNode, Bond *this_bond, int tlevel) { /* QListIterator innerIter1(bonds), innerIter2(bonds), innerIter(bonds), outerIter(bonds);*/ QStringList innerstrlist1, innerstrlist2, innerstrlist3; // Bond *local_tmp_bond Bond *inner_tmp_bond; DPoint *outer1, /**outer2,*/ *inner1; //, *inner2, *inner3; QString canonicalBond, leveltmpstr, leftMarker, rightMarker, thislevelstr, outer1el, outer2el; if (tlevel == 3) { leftMarker = ""; rightMarker = ""; } if (tlevel == 2) { leftMarker = "<"; rightMarker = ">"; } if (tlevel == 1) { leftMarker = "("; rightMarker = ")"; } outer1 = thisNode; canonicalBond = QString(); if (tlevel == 0) { leftMarker = "["; rightMarker = "]"; if (thisNode->element == "H") { return canonicalBond; } else { if (this_bond->aromatic()) { canonicalBond.append("*"); } else { if (this_bond->Order() == 1) { canonicalBond.append("-"); } if (this_bond->Order() == 5) { canonicalBond.append("-"); } if (this_bond->Order() == 7) { canonicalBond.append("-"); } if (this_bond->Order() == 2) { canonicalBond.append("="); } if (this_bond->Order() == 3) { canonicalBond.append("#"); } } outer1el = thisNode->baseElement(); canonicalBond.append(outer1el.remove(QRegExp("\\-+H+\\d+"))); // for some reason, this isn't reliable // don't care whether side groups are in ring, yet // if (thisNode->inring) canonicalBond.append("r"); canonicalBond.prepend(leftMarker); canonicalBond.append(rightMarker); return canonicalBond; } } if (this_bond->aromatic()) { canonicalBond.append("*"); } else { if (this_bond->Order() == 1) { canonicalBond.append("-"); } if (this_bond->Order() == 5) { canonicalBond.append("-"); } if (this_bond->Order() == 7) { canonicalBond.append("-"); } if (this_bond->Order() == 2) { canonicalBond.append("="); } if (this_bond->Order() == 3) { canonicalBond.append("#"); } } outer1el = thisNode->baseElement(); canonicalBond.append(outer1el.remove(QRegExp("\\-+H+\\d+"))); // for some reason, this isn't reliable // if (thisNode->inring) canonicalBond.append("r"); // innerIter.toFirst(); innerstrlist1.clear(); /// TODO: check, is this right? /* while ( (inner_tmp_bond = innerIter.current()) != 0 ) { ++innerIter;*/ foreach (inner_tmp_bond, bonds) { if (inner_tmp_bond->Find(outer1) == true) { inner1 = inner_tmp_bond->otherPoint(outer1); if (inner1 != parentNode) { // qDebug() << inner1->element; if (inner1->element != "H") { // traverse next level (level 0 handled elsewhere) innerstrlist1.append( RetroTraverseBonds(outer1, inner1, inner_tmp_bond, tlevel - 1)); } } } } innerstrlist1.sort(); if (tlevel == 3) canonicalBond = QString(); for (QStringList::Iterator it = innerstrlist1.begin(); it != innerstrlist1.end(); ++it) { canonicalBond.append(*it); } canonicalBond.prepend(leftMarker); canonicalBond.append(rightMarker); return canonicalBond; } // does thisbond match this R-substitution pattern? bool Molecule::RetroMatch(QString inbond, QString inrpat) { // qDebug() << "TEST:" << inbond << ":AGAINST:" << inrpat; int i1, i2; QString top_bond, top_rpat; top_bond = inbond; top_rpat = inrpat; do { i1 = top_bond.indexOf("<"); i2 = top_bond.indexOf(">") + 1; top_bond.remove(i1, i2 - i1); } while (top_bond.contains("<") > 0); do { i1 = top_rpat.indexOf("<"); i2 = top_rpat.indexOf(">") + 1; top_rpat.remove(i1, i2 - i1); } while (top_rpat.contains("<") > 0); // bail if inbond isn't the same top-level type of bond as inrpat // qDebug() << "tops:" << top_bond << " " << top_rpat; if (top_bond != top_rpat) return false; // create left and right halves of input and pattern, pass to RetroTreeMatch i1 = inbond.indexOf(top_bond); i2 = inrpat.indexOf(top_rpat); QString inleft, inright, patleft, patright; inleft = inbond.left(i1); inright = inbond.mid(i1 + top_bond.length()); patleft = inrpat.left(i2); patright = inrpat.mid(i2 + top_rpat.length()); bool rt1; rt1 = RetroTreeMatch(inleft, inright, patleft, patright); if (rt1) return true; rt1 = RetroTreeMatch(inleft, inright, patleft, patright); if (rt1) return true; // build trees QList vbond, vrpat; int i3, l1, l2, l3, lmid; for (l1 = 0; l1 < 78; l1++) { vbond.append("-R"); vrpat.append("-X"); } // parse inbond lmid = inbond.indexOf(top_bond); i2 = 0; l1 = 0; bool midflag = true; while (1) { i1 = inbond.indexOf("<", i2); if (i1 < 0) break; if ((i1 > lmid) && midflag) { l1 = 39; midflag = false; } i2 = inbond.indexOf(">", i1); QString &vlstr = vbond[l1]; vlstr = inbond.mid(i1 + 1, i2 - 1 - i1); l1 = l1 + 13; } QString thisstr, this3str; for (l1 = 0; l1 < 78; l1 = l1 + 13) { thisstr = vbond[l1]; // qDebug() << l1 << ":" << thisstr; if (thisstr == "-R") continue; l2 = l1 + 1; i2 = 0; while (1) { i1 = thisstr.indexOf("(", i2); if (i1 < 0) break; i2 = thisstr.indexOf(")", i1); QString &vlstr = vbond[l2]; vlstr = thisstr.mid(i1 + 1, i2 - 1 - i1); l3 = l2 + 1; i3 = 0; this3str = vlstr; // qDebug() << "this3str:" << l3 << ":" << this3str; while (1) { i1 = this3str.indexOf("[", i3); if (i1 < 0) break; i3 = this3str.indexOf("]", i1); QString &vlstr = vbond[l3]; vlstr = this3str.mid(i1 + 1, i3 - i1 - 1); l3++; } l2 = l2 + 4; } } // parse inrpat lmid = inrpat.indexOf(top_rpat); i2 = 0; l1 = 0; midflag = true; while (1) { i1 = inrpat.indexOf("<", i2); if (i1 < 0) break; if ((i1 > lmid) && midflag) { l1 = 39; midflag = false; } i2 = inrpat.indexOf(">", i1); QString &vlstr = vrpat[l1]; vlstr = inrpat.mid(i1 + 1, i2 - 1 - i1); l1 = l1 + 13; } for (l1 = 0; l1 < 78; l1 = l1 + 13) { thisstr = vrpat[l1]; // qDebug() << l1 << ":" << thisstr; if (thisstr == "-R") continue; l2 = l1 + 1; i2 = 0; while (1) { i1 = thisstr.indexOf("(", i2); if (i1 < 0) break; i2 = thisstr.indexOf(")", i1); QString &vlstr = vrpat[l2]; vlstr = thisstr.mid(i1 + 1, i2 - 1 - i1); l3 = l2 + 1; i3 = 0; this3str = vlstr; // qDebug() << "this3str:" << l3 << ":" << this3str; while (1) { i1 = this3str.indexOf("[", i3); if (i1 < 0) break; i3 = this3str.indexOf("]", i1); QString &vlstr = vrpat[l3]; vlstr = this3str.mid(i1 + 1, i3 - i1 - 1); l3++; } l2 = l2 + 4; } } // print and clean up for (l1 = 0; l1 < 78; l1++) { QString &vlstr = vbond[l1]; i1 = vlstr.indexOf("["); i2 = vlstr.lastIndexOf("]"); if (i1 >= 0) vlstr.remove(i1, i2 - i1 + 1); i1 = vlstr.indexOf("("); i2 = vlstr.lastIndexOf(")"); if (i1 >= 0) vlstr.remove(i1, i2 - i1 + 1); // qDebug() << l1 << ":" << vbond[l1] << " "; } // qDebug(); for (l1 = 0; l1 < 78; l1++) { QString &vlstr = vrpat[l1]; i1 = vlstr.indexOf("["); i2 = vlstr.lastIndexOf("]"); if (i1 >= 0) vlstr.remove(i1, i2 - i1 + 1); i1 = vlstr.indexOf("("); i2 = vlstr.lastIndexOf(")"); if (i1 >= 0) vlstr.remove(i1, i2 - i1 + 1); // qDebug() << l1 << ":" << vrpat[l1] << " "; } // qDebug(); // compare (old) for (l1 = 0; l1 < 78; l1++) { // qDebug() << l1; if (vrpat[l1] == "-X") { // continue; doesn't matter what vbond is continue; } if (vrpat[l1] == "-R") { // vbond[l1] must be something other than -R if (vbond[l1] == "-R") return false; else continue; } // vbond must equal vrpat if (vbond[l1] != vrpat[l1]) return false; } return true; } bool Molecule::RetroTreeMatch(QString inleft, QString inright, QString patleft, QString patright) { qDebug() << "l/r:" << inleft << ":" << inright << ":" << patleft << ":" << patright; return false; } xdrawchem-v1.11.0/xdrawchem/ring.h000066400000000000000000000210641371466245600170550ustar00rootroot00000000000000// XDrawChem // Copyright (C) 1997-2000 The JChemPaint project // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // Ring.java: A collection of nodes that make up a ring #ifndef RING_H #define RING_H #include #include #include #include "atom.h" class Ring : public QVector { /** Vector to store the nodes of this ring. Each node is bonded to its predecessor. The ring is close by connecting the first and the last node */ public: int status; // to hold one of the three stati below int serial; // ring number double x; // x coordinate of ring center; double y; // y coordinate of ring center; /* Used for temporarily marking a ring as aromatic. Nothing to rely on. If you want to know if a ring is aromatic, use DatastructureTools.isAromatic(), if you trust it :-)*/ bool aromatic; /** Creates a new Ring with no nodes stored */ Ring() { status = 0; aromatic = false; } Ring(int x) : QVector(x) { status = 0; aromatic = false; } /** Returns a String with a sorted list of nodes numbers */ QString getSortedString() { QString s = "", n1; QVector rep(size()); int f; for (f = 0; f < size(); f++) { rep[f] = (at(f))->number; } std::sort(rep.begin(), rep.end()); // quickSort(rep, 0, rep.length - 1); for (f = 0; f < size() - 1; f++) { n1.setNum(rep[f]); s += n1 + "-"; } n1.setNum(rep.at(size() - 1)); s += n1; return s; } bool isValid() { QVector rep(size()); for (int f = 0; f < size(); f++) { rep[f] = (at(f))->number; } std::sort(rep.begin(), rep.end()); for (int g = 0; g < size() - 1; g++) { if (rep[g] == rep[g + 1]) return false; } return true; } /** Returns a String representation of this ring, i.e. just a list of node numbers that make up the ring. Example: 2-7-3-9-14 public String getString(){ String s = ""; int[] rep = new int[size()]; for (int f = 0; f < size(); f++){ rep[f] = ((Atom)at(f))->number; } for (int f = 0; f < size()-1; f++){ s += rep[f] + "-"; } s += rep[size()-1]; return s; }*/ bool isInRing(int number) { for (int f = 0; f < size(); f++) { if ((at(f))->number == number) return true; } return false; } /** Sorts the atoms of this ring such that the two atoms with the lowest indices are at the beginning of the list. Of course the order is preserved. */ void sort() { // choose the number of an arbitrary atom int lowestIndex = (at(0))->number; int lowest = 0; int sz = size(); for (int f = 1; f < sz; f++) { if ((at(f))->number < lowestIndex) { lowestIndex = (at(f))->number; lowest = f; } } if (lowest == sz - 1) { shiftLeft(1); lowest--; } else if (lowest == 0) { shiftRight(1); lowest++; } /* if the number of the (lowest + 1)-st is smaller than the one of the (lowest - 1)-st then the order is correct and we just have to left-shift lowest times. */ if ((at(lowest + 1))->number < (at(lowest - 1))->number) { shiftLeft(lowest); } /* else if the number of the (lowest + 1)-st is greater than the one of the (lowest - 1)-st then we have to shift to the right (size()-1-lowest) times until the node with the smallest order is at the end of the list and then invert the list */ else { shiftRight(size() - 1 - lowest); invert(); } } /** Sorts the ring so that node with 'nodeNumber' is first */ void sort(int nodeNumber) { qInfo() << nodeNumber << " in " << getSortedString(); int actNumber = (at(0))->number; while (actNumber != nodeNumber) { shiftLeft(1); actNumber = (at(0))->number; } } // bubble sort void sort2() { Atom *tmp; for (int f = 1; f < size(); f++) { for (int g = 0; g < size() - 1; g++) { if ((at(g))->number < (at(f))->number) { tmp = at(f); replace(f, at(g)); replace(g, tmp); } } } for (int h = 0; h < size(); h++) qInfo() << at(h)->number; } /** shifts the node list of this ring to the left */ void shiftLeft(int times) { for (int f = 0; f < times; f++) { Atom *n = at(0); for (int g = 0; g < size() - 1; g++) replace(g, at(g + 1)); replace(size() - 1, n); } } /** shifts the node list of this ring to the right */ void shiftRight(int times) { for (int f = 0; f < times; f++) { Atom *n = at(size() - 1); for (int g = size() - 1; g > 0; g--) { replace(g, at(g - 1)); } replace(0, n); } } /** Inverts the order of Nodes in this ring */ void invert() { Atom *t; int oldsize = size() / 2; for (int f = 0; f < oldsize; f++) { t = at(f); replace(f, at(size() - 1 - f)); replace(size() - 1 - f, t); } // resize(oldsize); } /** returns the sum of the ringCounter values of all the nodes in this ring */ int getComplexity(QVector atomSet) { int cmpl = 0; for (int f = 0; f < size(); f++) { cmpl += atomSet[(at(f))->number]->ringCounter; } return cmpl; } /** Checks if all Nodes of this ring have not yet been finally positioned and returns 'true' if so. */ bool notAllPositioned(QVector atomSet) { // int test; for (int f = 0; f < size(); f++) { // test = (at(f))->number; if (atomSet[(at(f))->number]->status < 1) { return true; } } return false; } /** returns a vector listing the numbers of the nodes involved in this ring */ QVector getNodeNumberList() { QVector arr(1); int sz = 0; for (int f = 0; f < size(); f++) { arr.resize(sz + 1); arr[sz] = (at(f))->number; sz++; } return arr; } /** Returns the radius of this ring assuming that is has been drawn as a regular polygon. The radius is defined as the distance between the ring center and one of the nodes. */ double getRadius(double bondLength) { double radius = sqrt(pow(bondLength, (double)2) / (2 - (2 * cos(getSectorAngle())))); return radius; } /** Returns the angle that is made of by a 'node', the ring center and a direct neighbor of 'node'. */ double getSectorAngle() { double gamma = 360 / size(); gamma = 3.14159246 / 180 * gamma; return gamma; } /** Returns the number (the location in 'atomSet') of the node which is positioned at postition 'thisNode' in this Vector */ int getNodeNumber(int thisNode) { return (at(thisNode))->number; } QVector getEdge(int number) { Atom *from, *to; if (number < size() - 1) { from = at(number); to = at(number + 1); } else { from = at(0); to = at(size() - 1); } QVector ret(2); ret.replace(0, from); ret.replace(1, to); return ret; } }; #endif xdrawchem-v1.11.0/xdrawchem/ring_xpm.h000066400000000000000000001620041371466245600177410ustar00rootroot00000000000000/* XPM */ static const char *ring8[] = { /* width height num_colors chars_per_pixel */ " 40 38 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "########################################", "########################################", "########################################", "#################...####################", "##############...###...#################", "############..#########..###############", "#########...#############...############", "#######..###################..##########", "#######.#####################..#########", "######.#######################.#########", "######.#######################.#########", "######.########################.########", "#####.#########################.########", "#####.##########################.#######", "####.###########################.#######", "####.############################.######", "####.############################.######", "###.#############################..#####", "###.####################################", "###.#############################..#####", "####.############################.######", "####.############################.######", "####.###########################.#######", "#####.##########################.#######", "#####.#########################.########", "######.########################.########", "######.#######################.#########", "######.#######################.#########", "#######.#####################..#########", "#######..###################..##########", "########...###############...###########", "###########..###########..##############", "#############..#######..################", "###############...#...##################", "#################...####################", "########################################", "########################################", "########################################"}; /* XPM */ static const char *ring7[] = { /* width height num_colors chars_per_pixel */ " 42 33 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################", "##########################################", "##########################################", "##################....####################", "################....#...##################", "##############..########...###############", "###########...#############..#############", "########...##################....#########", "######...#######################..########", "######..#########################.########", "######..#########################.########", "#####.############################.#######", "#####.############################.#######", "#####.############################.#######", "#####.############################.#######", "#####.############################.#######", "#####.############################.#######", "####.##############################.######", "####.##############################.######", "####.#####################################", "#####.############################.#######", "#####...#########################..#######", "######..#########################.########", "########.#######################.#########", "########..####################...#########", "#########.####################..##########", "##########.##################.############", "##########..################..############", "###########.################.#############", "############................##############", "##########################################", "##########################################", "##########################################"}; /* XPM */ static const char *r_6boat[] = { /* width height num_colors chars_per_pixel */ " 49 29 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "#################################################", "#################################################", "#################################################", "#################################################", "###.#######################################.#####", "###...####################################..#####", "###.##..##################################..#####", "####.##..################################.#.#####", "####.####..#############################..#.#####", "####.######..###########################.##.#####", "####.#######..#########################.###.#####", "#####.########..#######################.###.#####", "#####.##########..####################.####.#####", "#####.###########..##################..####.#####", "#####.#############..################.#####.#####", "######.##############......................######", "######.############################..############", "######.############################.#############", "######.###########################.##############", "#######.##########################.##############", "#######.#########################.###############", "#######.########################..###############", "#######.########################.################", "########.######################.#################", "########.######################.#################", "########.......................##################", "#################################################", "#################################################", "#################################################"}; /* XPM */ static const char *r_6chair[] = { /* width height num_colors chars_per_pixel */ " 57 29 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "#########################################################", "#########################################################", "#########################################################", "#########################################################", "############...###################################.######", "###########..#.....###########################.....######", "###########..#.....###########################.....######", "###########.######.....###################....####.######", "##########.###########.....###########....#######.#######", "##########.###############.....###....###########.#######", "#########.####################....##############.########", "#########.#####################################..########", "#########.#####################################..########", "########.######################################.#########", "########.#####################################.##########", "#######.######################################.##########", "#######.#####################################.###########", "######.##############...####################..###########", "######.##############...####################..###########", "######.###########...###...#################.############", "#####.#########...#########...#############.#############", "#####.#####....###############....#########.#############", "####.###...#######################...#####.##############", "###.....#############################...##.##############", "###.....#############################...##.##############", "###..###################################..###############", "#########################################################", "#########################################################", "#########################################################"}; /* XPM */ static const char *r_6flat[] = { /* width height num_colors chars_per_pixel */ " 44 47 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "############################################", "############################################", "############################################", "####################..######################", "##################..#..#####################", "################..#####..###################", "##############..#########..#################", "#############..############..###############", "###########..###############...#############", "#########..###################..############", "########..######################..##########", "######..##########################..########", "####..##############################..######", "###.#################################..#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.##################################.#####", "###.#################################.######", "####..##############################..######", "######..##########################..########", "########..######################..##########", "#########..###################..############", "###########..###############...#############", "#############..############..###############", "##############..#########..#################", "################..#####..###################", "##################..#..#####################", "####################..######################", "############################################", "############################################", "############################################"}; /* XPM */ static const char *r_benzene[] = { /* width height num_colors chars_per_pixel */ " 44 47 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "############################################", "############################################", "############################################", "####################..######################", "##################..#..#####################", "################..#####..###################", "##############..###.#####..#################", "#############..###..#######..###############", "###########..###..##########...#############", "#########..###..##############..############", "########..##..##################..##########", "######..##..######################..########", "####..##..##########################..######", "###.##..#############################..#####", "###.#..###############################.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.################################.#.#####", "###.#..###############################.#####", "###.##..#############################.######", "####..##..##########################..######", "######..##..######################..########", "########..##..##################..##########", "#########..###..##############..############", "###########..###..##########...#############", "#############..###..#######..###############", "##############..###.#####..#################", "################..#####..###################", "##################..#..#####################", "####################..######################", "############################################", "############################################", "############################################"}; /* XPM */ static const char *r_cyclobutane[] = { /* width height num_colors chars_per_pixel */ " 29 29 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "#############################", "#############################", "#############################", "#############################", "###.....................#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###.###################.#####", "###....................######", "#############################", "#############################", "#############################"}; /* XPM */ static const char *r_cyclopentadiene[] = { /* width height num_colors chars_per_pixel */ " 41 38 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "#########################################", "#########################################", "#########################################", "###################.#####################", "#################..#..###################", "################..###..##################", "###############.#######.#################", "#############..#########..###############", "############..###########..##############", "###########.###############.#############", "#########..#################..###########", "########..###################..##########", "#######.#######################.#########", "#####..#########################..#######", "####..###########################..######", "###.#####################################", "###.#.#############################.#####", "####..###########################..######", "####.#.#########################.#.######", "####.#.#########################.#.######", "#####..#########################..#######", "#####..########################.#.#######", "#####.#.#######################.#.#######", "######..######################...########", "######..######################.#.########", "######.#.#####################.#.########", "######.#.####################..#.########", "#######..####################.#.#########", "#######.#.###################.#.#########", "#######.#.##################.##.#########", "########..##################.#.##########", "########..##################.#.##########", "########.#.################.##.##########", "#########.#################.#.###########", "#########.....................###########", "#########################################", "#########################################", "#########################################"}; /* XPM */ static const char *r_cyclopentane[] = { /* width height num_colors chars_per_pixel */ " 41 38 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "#########################################", "#########################################", "#########################################", "###################.#####################", "#################..#..###################", "################..###..##################", "###############.#######.#################", "#############..#########..###############", "############..###########..##############", "###########.###############.#############", "#########..#################..###########", "########..###################..##########", "#######.#######################.#########", "#####..#########################..#######", "####..###########################..######", "###.#####################################", "###.###############################.#####", "####.#############################.######", "####.#############################.######", "####.#############################.######", "#####.###########################.#######", "#####.###########################.#######", "#####.###########################.#######", "######.#########################.########", "######.#########################.########", "######.#########################.########", "######.#########################.########", "#######.#######################.#########", "#######.#######################.#########", "#######.#######################.#########", "########.#####################.##########", "########.#####################.##########", "########.#####################.##########", "#########.###################.###########", "#########.....................###########", "#########################################", "#########################################", "#########################################"}; /* XPM */ static const char *r_cyclopropane[] = { /* width height num_colors chars_per_pixel */ " 27 29 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "###########################", "###########################", "###########################", "###########################", "###..######################", "###...#####################", "###.##..###################", "###.####..#################", "###.######..###############", "###.#######...#############", "###.#########..############", "###.###########..##########", "###.#############..########", "###.###############..######", "###.################.######", "###.################.######", "###.###############..######", "###.#############..########", "###.###########..##########", "###.#########..############", "###.#######...#############", "###.######..###############", "###.####..#################", "###.##..###################", "###...#####################", "###..######################", "###########################", "###########################", "###########################"}; /* XPM */ static const char *r_imidazole[] = { /* width height num_colors chars_per_pixel */ " 41 48 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "#########################################", "#########################################", "#########################################", "#########################################", "#########################################", "#################.###.##.###.############", "#################.###.##.###.############", "#################..##.##.###.############", "#################.#.#.##.....############", "#################.##..##.###.############", "#################.##..##.###.############", "###############.#.###.##.###.############", "#############..##########################", "############..###########################", "###########.###############.#############", "#########..#################..###########", "########..###################..##########", "#######.#######################.#########", "#####..#########################..#######", "####..###########################..######", "###.#####################################", "###.#.#############################.#####", "####..###########################..######", "####.#.#########################.#.######", "####.#.#########################.#.######", "#####..#########################..#######", "#####..########################.#.#######", "#####.#.#######################.#.#######", "######..######################...########", "######..######################.#.########", "######.#.#####################.#.########", "######.#.####################..#.########", "#######..####################.#.#########", "#######.#.###################.#.#########", "#######.#.###############################", "########..###############################", "########..#################.###.#########", "########.#.################.###.#########", "#########.#################..##.#########", "#########.................#.#.#.#########", "###########################.##..#########", "###########################.##..#########", "###########################.###.#########", "#########################################", "#########################################", "#########################################", "#########################################", "#########################################"}; /* XPM */ static const char *r_indole[] = { /* width height num_colors chars_per_pixel */ " 76 49 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "##", "##########################################################################" "##", "##########################################################################" "##", "####################..####################################################" "##", "###################..#..##################################################" "##", "#################..#####..################################################" "##", "###############..##.######..############################..################" "##", "#############..###..#######..########################...##.###############" "##", "###########...##..###########..####################...####..##############" "##", "##########..##..###############..###############...######.#.##############" "##", "########..##...#################..###########...##########.#.#############" "##", "######..###..#####################..######...#############....############" "##", "####..###..#########################..##...################.#.############" "##", "###..##..#############################..####################.#.###########" "##", "###.##..############################.#.######################.#.##########" "##", "###.################################.#.######################...##########" "##", "###.################################.#.#######################...#########" "##", "###.################################.#.########################.#.########" "##", "###.################################.#.#########################...#######" "##", "###.################################.#.##########################..#######" "##", "###.################################.#.##########################...######" "##", "###.################################.#.###########################...#####" "##", "###.################################.#.#############################.#####" "##", "###.################################.#.###################################" "##", "###.################################.#.#############################.#####" "##", "###.################################.#.############################..#####" "##", "###.################################.#.############################.######" "##", "###.################################.#.###########################.#######" "##", "###.################################.#.##########################.########" "##", "###.################################.#.#########################..########" "##", "###.################################.#.#########################.#########" "##", "###.##################################.########################.##########" "##", "###.##..##############################.###################################" "##", "###..##..#############################..##################################" "##", "####..###..#########################..##...###########.#####.##.#####.####" "##", "######..###..#####################..#######...########..####.##.#####.####" "##", "########..###..#################..############....####.#.###.##.#####.####" "##", "##########..###..##############..#################...#.#.###.##.#####.####" "##", "###########...###..##########..#######################.##.##.##.......####" "##", "#############..####..######..#########################.###.#.##.#####.####" "##", "###############..###.#####..##########################.###.#.##.#####.####" "##", "#################..#####..############################.####..##.#####.####" "##", "###################..#..##############################.#####.##.#####.####" "##", "####################..####################################################" "##", "##########################################################################" "##", "##########################################################################" "##", "##########################################################################" "##", "##########################################################################" "##", "##########################################################################" "##"}; /* XPM */ static const char *r_purine[] = { /* width height num_colors chars_per_pixel */ " 80 56 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "######", "##########################################################################" "######", "##########################################################################" "######", "##########################################################################" "######", "##########################################################################" "######", "##########################################################.#####.#########" "######", "########################..################################..####.#########" "######", "#######################..#..##############################.#.###.#########" "######", "#####################..#####..############################.#.###.#########" "######", "###################..#########..##########################.##.##.#########" "######", "#################..###..#######..#########################.###.#.#########" "######", "####.#####.####...##..###########..#######################.###.#.#########" "######", "####..####.###..###..##############..#################...#.####..#########" "######", "####.#.###.#..###..#################..############....####.#####.#########" "######", "####.#.###.#####..####################..#######...########################" "######", "####.##.##.###..########################..##...###########################" "######", "####.###.#.##..###########################..######################.#######" "######", "####.###.#.#.###########################.#.#####################...#######" "######", "####.####..#############################.#.######################.#.######" "######", "####.#####.#############################.#.#######################.#.#####" "######", "########################################.#.########################...####" "######", "########################################.#.########################...####" "######", "########################################.#.#########################.#.###" "######", "#######.################################.#.##########################.#.##" "######", "#######.################################.#.##########################....#" "######", "#######.################################.#.###########################.#.#" "######", "#######..###############################.#.###############################" "######", "########.###############################.#.#############################.#" "######", "########.###############################.#.############################..#" "######", "########.###############################.#.############################.##" "######", "########.###############################.#.###########################.###" "######", "########.###############################.#.##########################.####" "######", "########.###############################.#.#########################..####" "######", "########.###############################.#.#########################.#####" "######", "########.###############################.#.########################.######" "######", "########.#.###############################.###############################" "######", "########.##..#############################..##############################" "######", "#########..##..#########################..##...###########.#####.##.#####." "######", "###########..##.######################..#######...########..####.##.#####." "######", "#############..#..##################..############....####.#.###.##.#####." "######", "##############..##..###############..#################...#.#.###.##.#####." "######", "################..##.#.#####.####..#######################.##.##.##......." "######", "##################..##..####.##..#########################.###.#.##.#####." "######", "###################..#.#.###.#..##########################.###.#.##.#####." "######", "######################.#.###.#############################.####..##.#####." "######", "######################.##.##.#############################.#####.##.#####." "######", "######################.###.#.#############################################" "######", "######################.###.#.#############################################" "######", "######################.####..#############################################" "######", "######################.#####.#############################################" "######", "##########################################################################" "######", "##########################################################################" "######", "##########################################################################" "######", "##########################################################################" "######", "##########################################################################" "######", "##########################################################################" "######"}; /* XPM */ static const char *r_pyrimidine[] = { /* width height num_colors chars_per_pixel */ " 47 53 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "###############################################", "###############################################", "###############################################", "########################.######################", "######################..#..####################", "####################..#####..##################", "##################..###.#####..################", "#################..###..######..###############", "####.#####.####..###..##########..#############", "####..####.##..###..##############..###########", "####.#.###.#..##..#################..##########", "####.#.###.###..#####################..########", "####.##.##.#..#########################..######", "####.###.#.##############################.#####", "####.###.#.##############################.#####", "####.####..############################.#.#####", "####.#####.############################.#.#####", "#######################################.#.#####", "#######################################.#.#####", "#######################################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.###############################.#.#####", "#######.#..##############################.#####", "#######.##..###################################", "########..##..#########################..######", "##########..##..#####################..########", "############..##..#################..##########", "#############..###..##############..###########", "###############..####.#####.####..#############", "#################..##..####.##..###############", "##################..#.#.###.#..################", "#####################.#.###.###################", "#####################.##.##.###################", "#####################.###.#.###################", "#####################.###.#.###################", "#####################.####..###################", "#####################.#####.###################", "###############################################", "###############################################", "###############################################", "###############################################", "###############################################", "###############################################"}; /* XPM */ static const char *r_steroid[] = { /* width height num_colors chars_per_pixel */ " 97 58 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "#######################", "##########################################################################" "#######################", "##########################################################################" "#######################", "#####################################################..###################" "####..#################", "####################################################..#..#################" "###..#..###############", "##################################################..#####..###############" "#..#####..#############", "################################################..#########..############." ".#########..###########", "##############################################..############..#########..#" "###########..##########", "############################################..################..#####..###" "#############..########", "##########################################..####################..#..#####" "###############..######", "#########################################..#######################..######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "#########################################.########################.#######" "#################.#####", "###############..#######################...#######################........" ".................######", "##############..#..####################..#..####################..########" "#######################", "############..#####..################..#####..################..##########" "#######################", "##########..#########..############..#########..############..############" "#######################", "########..############..#########..#############..#########..#############" "#######################", "######..################..#####..#################..#####..###############" "#######################", "####..####################..#..#####################..#..#################" "#######################", "###..#######################..#######################..###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#########################.###################" "#######################", "###.########################.#############################################" "#######################", "####..####################..#..#####################..####################" "#######################", "######..#################.#####..#################..######################" "#######################", "#######..##############..#######..###############..#######################" "#######################", "#########..###########.###########..###########..#########################" "#######################", "###########..#######..##############..#######..###########################" "#######################", "############..#####.#################..#####..############################" "#######################", "##############..#..####################..#..##############################" "#######################", "################.########################.################################" "#######################", "##########################################################################" "#######################", "##########################################################################" "#######################", "##########################################################################" "#######################"}; /* XPM */ static const char *anthracene_xpm[] = { /* width height num_colors chars_per_pixel */ " 112 47 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "######################################", "##########################################################################" "######################################", "##########################################################################" "######################################", "####################.#################################..##################" "###############.######################", "##################..#..#############################..#..#################" "#############..#..####################", "################..#####..#########################..###.#..###############" "###########..##.##..##################", "##############..##..#####..#####################..######..#..#############" "#########..#####..##..################", "#############..#..########..###################..#########..#..###########" "########..########..#..###############", "###########..##.############..###############..#############.#...#########" "######..############.##..#############", "#########..##..###############..###########..################..#..########" "####..###############..##..###########", "########..#..##################..#########..###################..#..######" "###..##################..#..##########", "######..##.######################..#####..#######################.##..####" "#..######################.##..########", "####..##..#########################..#..##########################..##..#." ".#########################..##..######", "###.##..#############################.##############################..#..#" "############################..##.#####", "###.#.#############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.###############################.#.##################################.#" "################################.#####", "###.#.###############################.##################################.#" "################################.#####", "###.##..#############################.##############################..##.#" "############################..##.#####", "###.####..###########################.############################..###..#" "##########################..##########", "####..####.########################..#..#########################.####..#." ".########################.####..######", "######..###..####################..#####..#####################..###..####" "#..####################..###..########", "########..###..################..#########..#################..###..######" "###..################..###..##########", "#########..####.##############..###########..###############.###..########" "####..##############.####..###########", "###########..###..##########..###############..###########..##...#########" "######..##########..###..#############", "#############..###..######..###################..#######..###..###########" "########..######..###..###############", "##############..#########..#####################..#####.###..#############" "#########..####.####..################", "################..#####..#########################..#####..###############" "###########..#####..##################", "##################..#..#############################..#..#################" "#############..#..####################", "####################.#################################..##################" "###############.######################", "##########################################################################" "######################################", "##########################################################################" "######################################", "##########################################################################" "######################################"}; /* XPM */ static const char *naphthalene_xpm[] = { /* width height num_colors chars_per_pixel */ " 78 47 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "####", "##########################################################################" "####", "##########################################################################" "####", "####################.#################################..##################" "####", "##################..#..#############################..#..#################" "####", "################..#####..#########################..###.#..###############" "####", "##############..##..#####..#####################..######..#..#############" "####", "#############..#..########..###################..#########..#..###########" "####", "###########..##.############..###############..#############.#...#########" "####", "#########..##..###############..###########..################..#..########" "####", "########..#..##################..#########..###################..#..######" "####", "######..##.######################..#####..#######################.##..####" "####", "####..##..#########################..#..##########################..##..##" "####", "###.##..#############################.##############################..#..#" "####", "###.#.#############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.###############################.#.##################################.#" "####", "###.#.###############################.##################################.#" "####", "###.##..#############################.##############################..##.#" "####", "###.####..###########################.############################..###.##" "####", "####..####.########################..#..#########################.####..##" "####", "######..###..####################..#####..#####################..###..####" "####", "########..###..################..#########..#################..###..######" "####", "#########..####.##############..###########..###############.###..########" "####", "###########..###..##########..###############..###########..##...#########" "####", "#############..###..######..###################..#######..###..###########" "####", "##############..#########..#####################..#####.###..#############" "####", "################..#####..#########################..#####..###############" "####", "##################..#..#############################..#..#################" "####", "####################.#################################..##################" "####", "##########################################################################" "####", "##########################################################################" "####", "##########################################################################" "####"}; /* XPM */ static const char *biphenyl_xpm[] = { /* width height num_colors chars_per_pixel */ " 109 42 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "#############.....................#######################################." "....................###############", "############.#####################.#####################################.#" "####################.##############", "############.###################.#.#####################################.#" "##################.#.##############", "###########.#..#################..#.###################################.#." ".#################..#.#############", "###########.#.###################.#.###################################.#." "###################.#.#############", "##########.#.#####################.#.#################################.#.#" "####################.#.############", "#########..#.#####################.#..###############################..#.#" "####################.#..###########", "#########.#.#######################.#.###############################.#.##" "#####################.#.###########", "########.##.#######################.##.#############################.##.##" "#####################.##.##########", "########.#.#########################.#.#############################.#.###" "######################.#.##########", "#######.##.#########################.##.###########################.##.###" "######################.##.#########", "######..#.###########################.#..#########################..#.####" "#######################.#..########", "######.##.###########################.##.#########################.##.####" "#######################.##.########", "#####.##.#############################.##.#######################.##.#####" "########################.##.#######", "#####.##.#############################.##.#######################.##.#####" "########################.##.#######", "####.##.###############################.##.#####################.##.######" "#########################.##.######", "####.#..###############################..#.#####################.#..######" "#########################..#.######", "###.##.####################################.....................##.#######" "###################################", "###..#####################################..###################..#########" "############################..#####", "####.#####################################.#####################.#########" "############################.######", "#####.###################################.#######################.########" "###########################.#######", "#####.###################################.#######################.########" "###########################.#######", "######.#################################.#########################.#######" "##########################.########", "######.#################################.#########################.#######" "##########################.########", "#######.###############################.###########################.######" "#########################.#########", "#######..#############################..###########################..#####" "########################..#########", "########.#############################.#############################.#####" "########################.##########", "########..###########################..#############################..####" "#######################..##########", "#########.###########################.###############################.####" "#######################.###########", "##########.#########################.#################################.###" "######################.############", "##########.#########################.#################################.###" "######################.############", "###########.#######################.###################################.##" "#####################.#############", "###########.#######################.###################################.##" "#####################.#############", "############.#.................###.#####################################.#" ".................###.##############", "############..###################..#####################################.." "###################..##############", "#############.....................#######################################." "....................###############", "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################"}; xdrawchem-v1.11.0/xdrawchem/ringdialog.cpp000066400000000000000000000041301371466245600205630ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include "defs.h" #include "ringdialog.h" // defined in main.cpp extern QString RingDir; RingDialog::RingDialog(QWidget *parent) : QDialog(parent) { // Init variables which tell which ring was picked fn = QString("noring"); QPixmap pix; QLabel *caption; QPushButton *dismiss; setWindowTitle(tr("Ring tool")); QGridLayout *mygrid = new QGridLayout(this); caption = new QLabel(tr("Choose a structure from list:")); mygrid->addWidget(caption, 0, 0, 0, 4); QDir dr(RingDir, "*.cml"); QStringList dl = dr.entryList(); filelist = new QComboBox(); filelist->addItem("(pick)"); for (int cc = 0; cc < dl.count(); cc++) filelist->addItem(dl[cc].left(dl[cc].length() - 4)); connect(filelist, SIGNAL(activated(int)), this, SLOT(fromComboBox(int))); mygrid->addWidget(filelist, 1, 1, 0, 4); dismiss = new QPushButton(tr("Cancel")); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); mygrid->addWidget(dismiss, 2, 2, 1, 3); } void RingDialog::fromComboBox(int i) { if (filelist->currentText() == "(pick)") return; fn = filelist->currentText() + QString(".cml"); // qDebug() << "File: " << fn ; accept(); } // cmake#include "ringdialog.moc" xdrawchem-v1.11.0/xdrawchem/ringdialog.h000066400000000000000000000021221371466245600202270ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef RINGDIALOG_H #define RINGDIALOG_H #include class QComboBox; class RingDialog : public QDialog { Q_OBJECT public: RingDialog(QWidget *parent); QString getFile() { return fn; } public slots: void fromComboBox(int); private: QString fn; QComboBox *filelist; }; #endif xdrawchem-v1.11.0/xdrawchem/rotatecursor.xpm000066400000000000000000000023411371466245600212240ustar00rootroot00000000000000/* XPM */ static const char * rotatecursor_xpm[] = { "32 32 2 1", ". c #FFFFFF", "+ c #000000", "................................", "................................", ".....+..........................", "....++..........................", "...+++++++......................", "..+++++++++.....................", ".+++++++++++....................", "..+++++++++++...................", "...+++++++++++..................", "....++..+++++++.................", ".....+...++++++.................", "..........+++++.................", "..........+++++.................", "........+++++++++...............", ".........+++++++................", "..........+++++.................", "...........+++..................", "............+...................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................"}; xdrawchem-v1.11.0/xdrawchem/sdg.h000066400000000000000000002376741371466245600167130ustar00rootroot00000000000000// XDrawChem // Copyright (C) 1997-2000 The JChemPaint project // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // sdg.h is largely based on JMDraw.java by Christoph Steinbeck from the // JChemPaint project. #ifndef SDG_H #define SDG_H #include #include #include "atom.h" #include "ring.h" #include "setofrings.h" #include "sorf.h" class SPoint { public: /** x coordinate */ double x; /** y coordinate */ double y; // substituents int subst = 0; /** Constructs an empty point */ SPoint() {} /** Constructs a point with given double precision x and y coordinates */ SPoint(double x1, double y1) : x(x1), y(y1), subst(0) {} /** Constructs a point with given integer x and y coordinates */ SPoint(int x1, int y1) { x = (double)x1; y = (double)y1; } /** Constructs a point as a duplicate of another point */ SPoint(const SPoint &p) { x = p.x; y = p.y; } SPoint &operator=(const SPoint &) = default; /** return this SPoint as a QString */ QString toString() { return QString("(%1,%2)").arg(x).arg(y); } }; /** Construct that stores the parameters needed for the placement of any ring n attached to an (n-1)-st ring (or so...). The parameters are originally (in Denglers program) called phi, iph, b and ibb and are returned by the routine phiwa */ class FusedRingParams { public: FusedRingParams() {} double startAngle; /* start angle for the method positionRingAtoms(). Originally called 'phi' */ int annulAxisOrientation; /* indicates if the axis that links the two ring centers is perpendicular to the x axis. Originally called 'iph' */ double toggleStartAngleSign; /* -1 if startAngle has to be taken used as a negative value by the method transform(). Positive otherwise. Don't know why this has to be 'double'. Originally called 'b' */ int startAtomNumber; /* Number of StartAtom for the ringSort. Originally called 'ibb' */ QString toString() { QString s = ""; s += QString("startAngle = %lf\n").arg(startAngle); s += QString("annulAxisOrientation = %d\n").arg(annulAxisOrientation); s += QString("toggleStartAngleSign = %lf\n").arg(toggleStartAngleSign); s += QString("startAtomNumber = %d\n").arg(startAtomNumber); return s; } }; class SDG { public: SDG() { TWO = (double)2.0; prevang = 0.0; ncalls = 0; leftright = false; arerings = true; } void setAtoms(QVector a1) { atomSet = a1; } void setRings(setOfRings s1) { sssr = s1; } QVector getAtoms() { return atomSet; } void setBL(double bl) { bondLength = bl; } QVector atomSet; setOfRings sssr; double bondLength; double bondLineSep; double roundFactor; double TWO; int ringTracker; int ddebug; bool allDone; // aliphatic double prevang; bool arerings, leftright; int ncalls; void exec() { bondLineSep = 0.05; roundFactor = bondLength * 10000; ringTracker = 0; ddebug = 0; draw(); drawStatus("at end"); } /** Performs the actual calculation of the coordinated based on a given set of Nodes */ void draw() { qInfo() << "Starting SDG::draw() with atomSet: " << atomSet.size(); int thisAtom = 0, neighbor = 0; QVector ilist(10); int counter; SPoint tempPoint; bool vmit; QVector rot(10); int nrOfEdges = 0; for (int i = 0; i < atomSet.count(); i++) { atomSet[i]->status = 0; atomSet[i]->ringCounter = 0; } drawStatus("start"); sortBondList(); for (int f = 0; f < atomSet.count(); f++) { nrOfEdges += atomSet[f]->degree; } nrOfEdges /= 2; /* compute the minimum number of rings as given by Frerejacque, Bull. Soc. Chim. Fr., 5, 1008 (1939) */ int zRing = nrOfEdges - atomSet.count() + 1; // if there are rings, get them... if (zRing > 0) { SetOfRingsFinder sorf; sssr = sorf.findSSSR(atomSet); // should be passed from Molecule() sssr.sort(); sssr.makeNodeRingLists(atomSet); drawStatus("after sssr"); if (sssr.size() > 0) { /* We have rings Now, let's find the atom that is member of highest number of largest rings (Is that clear? :-)) */ int fatest = 0; // the complexity of the 'fatest' atom; int fatestIndex; // the index of the fatest atom; int cmpl, sum = 0; // temp variables for ring complexity comparison int complRing = 0; // the most complext ring so far and finally int complRingSize = 0; // int lastRing; // bool noMore; bool stillThere; // bool drawn; int toDraw = -1; // int debug = 0; Ring *ring; // find the ring with the largest number of fatest atoms int f; for (f = sssr.size() - 1; f > -1; f--) { ring = sssr.at(f); cmpl = ring->getComplexity(atomSet); if (cmpl > sum) { sum = cmpl; complRing = f; complRingSize = ring->size(); fatest = (ring->at(0))->number; fatestIndex = (ring->at(0))->ringCounter; } } positionRingAtoms(complRing, SPoint(0, 0), (double)0, 0, complRingSize - 1); drawStatus("208"); ring = sssr.at(complRing); ring->status = 1; for (f = 0; f < ring->size(); f++) { atomSet.at(ring->getNodeNumber(f))->status = 1; } do { do { stillThere = false; for (int f = 0; f < sssr.size(); f++) { if ((sssr.at(f))->status == 1) { positionRingSubstituents(f); drawStatus("222"); // if (true) return; stillThere = true; } } } while (stillThere); toDraw = whatToDraw(); if (toDraw != -1) positionAtom(toDraw); // reportAtomSet(atomSet); } while (whatToDraw() != -1); } } // if there are no rings else { // (Herger) make aliphatics pretty arerings = false; for (thisAtom = 0; thisAtom < atomSet.count(); thisAtom++) { if (atomSet[thisAtom]->degree > 1) break; } // error check for moelcules with only two atoms if (thisAtom >= atomSet.count()) thisAtom = 0; atomSet[thisAtom]->x = (double)0; atomSet[thisAtom]->y = (double)0; for (neighbor = 0; neighbor < atomSet[thisAtom]->degree; neighbor++) { if (atomSet[atomSet[thisAtom]->intnodeTable[neighbor]]->degree > 1 && atomSet[thisAtom]->intnodeTable[neighbor] != thisAtom) break; } // (Herger) error check here (next 1 line) if (neighbor == atomSet[thisAtom]->degree) neighbor = 0; neighbor = atomSet[thisAtom]->intnodeTable[neighbor]; // put neighbor onto positive x axis atomSet[neighbor]->x = (double)bondLength; atomSet[neighbor]->y = (double)0; atomSet[neighbor]->status = 1; atomSet[thisAtom]->status = 1; for (int f = 0; f < 10; f++) ilist[f] = 0; counter = atomSet[neighbor]->degree; vmit = true; rot = angleOpt(neighbor, ilist, vmit); if (counter > 0) { for (int f = 0; f < counter; f++) { if (atomSet[atomSet[neighbor]->intnodeTable[f]]->status < 1) { tempPoint = placeAtom(SPoint(atomSet[thisAtom]->x, atomSet[thisAtom]->y), SPoint(atomSet[neighbor]->x, atomSet[neighbor]->y), bondLength); tempPoint = rotAtom(SPoint(atomSet[neighbor]->x, atomSet[neighbor]->y), tempPoint, rot[f]); atomSet[atomSet[neighbor]->intnodeTable[f]]->x = tempPoint.x; atomSet[atomSet[neighbor]->intnodeTable[f]]->y = tempPoint.y; atomSet[atomSet[neighbor]->intnodeTable[f]]->status = 1; } } } atomSet[neighbor]->status = 2; doTheRest(); } // if (true) return; } /** Scans the array of nodes for those that have not been finally drawn */ int whatToDraw() { for (int f = 0; f < atomSet.count(); f++) { if (atomSet[f]->status == 1) { qInfo() << "whatToDraw(): " << f; return f; } } qInfo() << "whatToDraw(): -1"; return -1; } /** Scans the array of nodes for those that have not been finally drawn */ void drawStatus(QString note) { // debug: what actually happened here? for (int ii = 0; ii < atomSet.count(); ii++) { qInfo() << note << ":SDG pos:" << ii << ":status:" << atomSet[ii]->status << ":(" << atomSet[ii]->x << "," << atomSet[ii]->y << ")"; } } /** Takes care of drawing an ring-less graph once one start atom has been placed. */ int doTheRest() { int counter, result = -1; bool allDone; do { allDone = true; counter = -1; do { counter++; if (atomSet[counter]->status == 1) allDone = false; } while (!((counter == atomSet.size() - 1) || (atomSet[counter]->status == 1))); if (allDone) { return result; } if (counter == atomSet.size()) return result; result = positionAtom(counter); } while (allDone == false); return result; } /** Constructs a linked list of nodes from a Connectivity Table 'ConMat'. The element symbols are given as strings in the Vector 'symbols'. public static Atom[] initAtomSet(int[][] conMat, Vector symbols){ Atom[] atSet; atSet = new Atom[conMat.length]; for (int f = 0; f < conMat.length; f ++){ atSet[f] = new Atom(); atSet[f].symbol = (String)symbols.elementAt(f); atSet[f].number = f; atSet[f].degree = 0; for (int g = 0; g < conMat.length; g ++){ if (conMat[f][g] > 0){ atSet[f]->intnodeTable[atSet[f].degree] = g; atSet[f]->bondTable[atSet[f].degree] = conMat[f][g]; atSet[f].degree ++; } } } return atSet; }*/ /** lists the given atomSet to the system console void reportAtomSet(Atom[] as){ Atom node; String line; for (int f = 0; f < as.length; f++){ node = (Atom)as[f]; line = "Atom " + f + ":"; for (int g = 0; g < node.degree; g++){ line += node.nodeTable[g] + " "; } line += "; Status: " + node.status; line += "; In Rings: "; for (int g = 0; g < node.inRings.length; g++){ line += node.inRings[g] + " "; } line += "; X: " + node->x; line += "; Y: " + node.y; System.out.println(line); } } protected Atom[] cloneAtomSet(Atom[] thisSet){ Atom[] newAtomSet = new Atom[thisSet.length]; for (int f = 0; f < thisSet.length; f++){ newAtomSet[f] = (Atom)thisSet[f].clone(); } return newAtomSet; }*/ /** Positions the atoms 'startAtom' up to 'endAtom' in a regular polygon around the point 'center' with 'angleOffSet' as the start angle. Called 'rier' in Denglers C code */ void positionRingAtoms(int thisRing, SPoint center, double angleOffSet, int startAtom, int endAtom) { Atom node; Ring *ring = sssr.at(thisRing); double ph = 1 / (360 / 3.14159246 / 2), anz = 0, alph = 0, rad = 0, x, y; int i, nn; angleOffSet = ((angleOffSet / 360) - floor(angleOffSet / 360)) * 360; anz = (double)(180.0 / ring->size()); alph = anz * 2; rad = (0.5 * bondLength) / sin(ph * anz); for (i = startAtom; i <= endAtom; i++) { nn = ring->getNodeNumber(i); if (atomSet[nn]->status < 1) { x = rad * cos(angleOffSet * ph); y = rad * sin(angleOffSet * ph); atomSet[nn]->x = x; atomSet[nn]->y = y; } angleOffSet = angleOffSet + alph; } } /** Originally called 'subrin' by Dengler. Takes care of placement of substituents of ring with index 'ringIndex'. Substitutents may be isolated rings, spiro-attached rings, annelated rings, bridging rings or simply aliphatic substitutents. Modified 05-12-98 by Steinbeck to return the number of the ring that has been positioned. Returns -1 if there was no more ring to postition */ void positionRingSubstituents(int ringIndex) { // ringType = 1 : spiro annulation requested; // ringType = 2 : regular 1-bond annulation requested; // ringType = 3 : annulation with more than two shared atoms qInfo() << "Ring to substitute: " << ringIndex; double ph = 0.0174532925; Ring *ring = sssr.at(ringIndex); int k = ring->size(); Ring *secondRing = new Ring; int secondRingNumber = -1; QList complexAtoms, vect1, vect2, extComplAtoms; QVector ilist(10); SPoint point, temp2Point, tempPoint; int atom, ringCounter, tempRing = -1, atom1 = -1, atom2 = -1, tempAtom = -1, il; int /*alreadyPositioned = -1,*/ stillToPos, j, km, iz1, iz2, igr, /*ib = 0,*/ ik = 0; int isum1, isum2; // int returnRingNumber = -1; int size; double dist, radius, r1, r2, /* dd,*/ geomDist; double rad1, rad2, sux, suy, r, alph, phi = 0, rad; bool isSpiro, /*isAlreadyPlaced,*/ ums, vmit, doneSomething = false; FusedRingParams fRP; Atom n1, n2; QVector rot(10); QVector tempStatus(10); /* Search complex atoms (that are members of more than one ring) and preliminarily store their numbers in vector complexAtoms */ for (int f = 0; f < ring->size(); f++) { atom = (ring->at(f))->number; if (atomSet[atom]->ringCounter > 1) { extComplAtoms.append(atom); } } if (extComplAtoms.count() == 0) { /** Atoms of this ring are part of only one ring, which already has been positioned by the calling method */ handleRestOfRingSubstituents(ringIndex); drawStatus("451"); return; } else { /* ringType = 1 (regular), ringType = 3 (spiro), ringType = 2 * (bridged) */ int ringType = 0; do { ringType++; do { doneSomething = false; /** there are atoms belonging to more than one ring. Cycle through these atoms */ for (int f = 0; f < extComplAtoms.count(); f++) { atom = extComplAtoms.at(f); /* find the second ring to which this atom belongs */ ringCounter = atomSet[atom]->ringCounter; for (int g = 0; g < ringCounter; g++) { tempRing = atomSet[atom]->inRings[g]; if (tempRing != ringIndex && (sssr.at(tempRing))->status < 1) { /* we found another ring to which atom belongs which is not yet positioned. Let's remember it. */ secondRing = sssr.at(tempRing); qInfo() << "secondRing:" << secondRing->getSortedString(); secondRingNumber = tempRing; size = (getIntersection(ring->getNodeNumberList(), secondRing->getNodeNumberList())) .count(); if (secondRing->notAllPositioned(atomSet)) { if (size == 2 && ringType == 1) break; if (size > 2 && ringType == 2) break; if (size == 1 && ringType == 3) break; } } } if (secondRing->size() > 0) { // There is a second ring if (secondRing->notAllPositioned(atomSet)) { complexAtoms = getIntersection(ring->getNodeNumberList(), secondRing->getNodeNumberList()); // System.out.println(complexAtoms.toString()); if (complexAtoms.count() == 1 && ringType == 3) { /*---------------------*/ /* Spiro - Connection */ /*---------------------*/ ik = atomSet[complexAtoms.at(0)]->degree; ilist[0] = k; for (j = 1; j < 10; j++) ilist[j] = 0; /* For all atoms bonded to the spiro-atom, store if the partner is part of a ring. If so store the size of this ring. */ tempAtom = complexAtoms.at(0); for (int jj = 0; jj < k; jj++) { for (j = 0; j < ik; j++) { if (atomSet[tempAtom]->intnodeTable[j] == ring->getNodeNumber(jj)) { ilist[j + 1] = k; } } } for (j = 0; j < secondRing->size(); j++) { tempStatus[j] = atomSet[secondRing->getNodeNumber(j)]->status; } /*------------------------------------*/ /* Position neighbors of spiro-Atom */ /*------------------------------------*/ tempAtom = complexAtoms.at(0); positionAtomSubstituents( tempAtom, SPoint(atomSet[tempAtom]->x, atomSet[tempAtom]->y), SPoint(ring->x, ring->y), ilist, ring->size(), secondRingNumber, secondRing->size()); // if (secondRingNumber == 0) return; /*----------------------------------------------------*/ /* Reset status of atoms of second Ring to * zero */ /*----------------------------------------------------*/ for (j = 0; j < secondRing->size(); j++) { atomSet[secondRing->getNodeNumber(j)]->status = tempStatus[j]; } /*----------------------------------------------------*/ /* get the angle for rotAtom() based on * the new */ /* Ring center . */ /*----------------------------------------------------*/ vmit = true /* 1 = true */; rot = angleOpt(tempAtom, ilist, vmit); alph = 0.0; for (j = 0; j < ik; j++) if (atomSet[atomSet[tempAtom]->intnodeTable[j]]->status == 0) alph = alph + rot[j]; alph = alph / 2.0; /*----------------------------------------------------*/ /* Position the new ring center */ /*----------------------------------------------------*/ rad = (bondLength / 2) / sin(ph * (180.0 / secondRing->size())); tempPoint = placeAtom( SPoint(ring->x, ring->y), SPoint(atomSet[tempAtom]->x, atomSet[tempAtom]->y), rad); if (alph != (double)0.0) // qInfo() << "Invoking rot-Atom() from // line 538" ; tempPoint = rotAtom( SPoint(atomSet[tempAtom]->x, atomSet[tempAtom]->y), tempPoint, alph); secondRing->x = tempPoint.x; secondRing->y = tempPoint.y; /*----------------------------------------------------*/ /* Position atoms of new Ring and transfer * to */ /* their correct place */ /*----------------------------------------------------*/ isSpiro = true; fRP = getFusedRingParams( SPoint(ring->x, ring->y), SPoint(atomSet[tempAtom]->x, atomSet[tempAtom]->y), tempAtom, tempAtom, isSpiro, secondRingNumber); phi = fRP.startAngle + 360.0 / secondRing->size(); secondRing->sort(fRP.startAtomNumber); positionRingAtoms(secondRingNumber, SPoint(0, 0), phi, 1, secondRing->size() - 1); secondRing->status = 1; transfer(1, secondRing->size() - 1, secondRingNumber, SPoint(atomSet[fRP.startAtomNumber]->x, atomSet[fRP.startAtomNumber]->y), fRP.annulAxisOrientation, fRP.toggleStartAngleSign); // System.out.println("Spiro"); doneSomething = true; } else if (complexAtoms.count() == 2 && ringType == 1) { /* 'Regular' 2-Ring annelation found Ring 'ring' and 'secondRing' do have exactly one bond in common. The center of 'secondRing' is now positioned on the line going from the center of ring via the center of the common bond */ // fRP = new FusedRingParams(); atom1 = complexAtoms.at(0); atom2 = complexAtoms.at(1); dist = sqrt(pow(atomSet[atom1]->x - atomSet[atom2]->x, TWO) + pow(atomSet[atom1]->y - atomSet[atom2]->y, TWO)); tempPoint = placeAtom( SPoint(atomSet[atom1]->x, atomSet[atom1]->y), SPoint(atomSet[atom2]->x, atomSet[atom2]->y), -dist / 2); radius = secondRing->getRadius(bondLength); r1 = radius * radius; r2 = dist * dist / 4; if (r2 < r1) { radius = sqrt(r1 - r2); } tempPoint = placeAtom(SPoint(ring->x, ring->y), tempPoint, radius); secondRing->x = tempPoint.x; secondRing->y = tempPoint.y; isSpiro = false; fRP = getFusedRingParams(SPoint(ring->x, ring->y), tempPoint, atom1, atom2, isSpiro, secondRingNumber); secondRing->sort(fRP.startAtomNumber); if (fRP.startAtomNumber == atom1) tempAtom = atom2; else tempAtom = atom1; if ((secondRing->at(1))->number == tempAtom) { secondRing->invert(); secondRing->sort(fRP.startAtomNumber); } positionRingAtoms(secondRingNumber, SPoint(0, 0), fRP.startAngle, 1, secondRing->size() - 2); secondRing->status = 1; transfer(1, secondRing->size() - 2, secondRingNumber, SPoint(ring->x, ring->y), fRP.annulAxisOrientation, fRP.toggleStartAngleSign); // System.out.println("Regular " + // secondRingNumber); doneSomething = true; handleBridgeHeads(atom1, atomSet[atom1]->x, atomSet[atom1]->y, atomSet[atom2]->x, atomSet[atom2]->y, ring->size(), secondRing->size()); handleBridgeHeads(atom2, atomSet[atom2]->x, atomSet[atom2]->y, atomSet[atom1]->x, atomSet[atom1]->y, ring->size(), secondRing->size()); } else if (complexAtoms.count() > 2 && ringType == 2) { /* The two rings join more than one bond. Find the two bridge atoms... */ // ?! Dengler does this by looking for the // two atoms in // ?! the set of complex atoms that are // !geometrically! most // ?! far away from each other. Is this // always a valid assumption. // System.out.println("Bridged ring systems // are not yet implemented"); vect1.clear(); vect2.clear(); geomDist = 0.0; atom = -1; tempAtom = -1; for (int ii = 0; ii < complexAtoms.count(); ii++) { atom = complexAtoms.at(ii); for (j = ii + 1; j < complexAtoms.count(); j++) { tempAtom = complexAtoms.at(j); dist = sqrt(sqr(atomSet[atom]->x - atomSet[tempAtom]->x) + sqr(atomSet[atom]->y - atomSet[tempAtom]->y)); if (dist > geomDist) { atom1 = atom; atom2 = tempAtom; geomDist = dist; } } } /* stillToPos atoms still have to be * positioned */ stillToPos = 0; for (il = 0; il < secondRing->size(); il++) { if (atomSet[secondRing->getNodeNumber(il)]->status > 0) stillToPos++; } stillToPos = secondRing->size() - stillToPos; if (stillToPos != 0) { il = -1; do { il++; atom = (ring->at(il))->number; } while (atom != atom1 && il < ring->size() - 1); /* Calculate the coordinates of the center of the second ring */ ums = true; km = il; iz1 = 0; iz2 = 0; igr = ring->size(); for (j = 1; j < igr; j++) { km++; if (km >= igr) km = 0; if (ring->getNodeNumber(km) == atom2) { ums = false /* 0 = false */; if (km >= igr) km = -1; } else { if (ums) { iz1++; vect1.append(ring->getNodeNumber(km)); } /* if (ums) */ if (!ums) { iz2++; vect2.append(ring->getNodeNumber(km)); } } } /* At this point, the first Ring 'ring' has been partioned into the two chains which are intersected by the two bridgeheads. The two chains are stored in vect1 and vect2. */ isum1 = 0; isum2 = 0; for (il = 0; il < iz1; il++) isum1 = isum1 + atomSet[vect1.at(il)]->degree; for (il = 0; il < iz2; il++) isum2 = isum2 + atomSet[vect2.at(il)]->degree; /* We now have summed up the number of neighbors for all the atoms in each chain and stored them in isum1 and isum2. */ sux = (double)0.0; suy = (double)0.0; /* Use the least hindered side for the placement of 'secondRing' */ if (isum1 > isum2) { for (il = 0; il < iz2; il++) { sux = sux + atomSet[vect2.at(il)]->x - ring->x; suy = suy + atomSet[vect2.at(il)]->y - ring->y; } /* for (il = 1; il <= iz2; il++) */ sux = sux / iz2; suy = suy / iz2; } else { for (il = 0; il < iz1; il++) { sux = sux + atomSet[vect1.at(il)]->x - ring->x; suy = suy + atomSet[vect1.at(il)]->y - ring->y; } /* for (il = 1; il <= iz1; il++) */ sux = sux / iz1; suy = suy / iz1; } /* if (isum1 > isum2) */ r = sqrt(sux * sux + suy * suy); rad1 = (bondLength / 2) / sin(ph * (180.0 / ring->size())); rad2 = (bondLength / 2) / sin(ph * (180.0 / secondRing->size())); secondRing->x = ring->x + (0.8 * (rad1 + rad2) * sux / r); secondRing->y = ring->y + (0.8 * (rad1 + rad2) * suy / r); tempPoint = SPoint(secondRing->x, secondRing->y); /*------------------------------------*/ /* Position ring atoms of second Ring */ /*------------------------------------*/ isSpiro = false; fRP = getFusedRingParams(SPoint(ring->x, ring->y), tempPoint, atom1, atom2, isSpiro, secondRingNumber); secondRing->sort(fRP.startAtomNumber); km = secondRing->size(); if (atomSet[secondRing->getNodeNumber(1)]->status > 0) { /* sort ring */ secondRing->invert(); secondRing->sort(fRP.startAtomNumber); } alph = -(360.0 / km) * (stillToPos - 1) / 2.0; tempPoint = placeAtom(SPoint(ring->x, ring->y), SPoint(secondRing->x, secondRing->y), rad2); secondRing->status = 1; // System.out.println("Bicyclo"); for (il = 0; il < km; il++) { if (atomSet[secondRing->getNodeNumber(il)]->status <= 0) { // qInfo() << "Invoking // rot-Atom() from line 719" ; temp2Point = rotAtom(SPoint(secondRing->x, secondRing->y), tempPoint, alph); atomSet[secondRing->getNodeNumber(il)]->status = 1; atomSet[secondRing->getNodeNumber(il)]->x = temp2Point.x; atomSet[secondRing->getNodeNumber(il)]->y = temp2Point.y; alph = alph + 360.0 / km; } } doneSomething = true; handleBridgeHeads(atom1, atomSet[atom1]->x, atomSet[atom1]->y, atomSet[atom2]->x, atomSet[atom2]->y, ring->size(), secondRing->size()); handleBridgeHeads(atom2, atomSet[atom2]->x, atomSet[atom2]->y, atomSet[atom1]->x, atomSet[atom1]->y, ring->size(), secondRing->size()); } } } } } } while (doneSomething); } while (ringType < 3); handleRestOfRingSubstituents(ringIndex); } // return returnRingNumber; } int round(double rin) { double d1; int rout, sgn; if (rin < 0.0) { sgn = -1; rin = -rin; } else { sgn = 1; } rout = (int)rin; d1 = rin - (double)rout; if (d1 > 0.5) rout++; rout *= sgn; return rout; } /** Returns an object storing the parameters for drawing the second Ring. Information about whether to start clockwise, etc. Originally called 'phiwa' */ FusedRingParams getFusedRingParams(SPoint center1, SPoint center2, int bridgeAtom1, int bridgeAtom2, bool isSpiro, int numberOfSecondRing) { /* center 1, center 2: Centers of the two rings. bridgeAtom1, bridgeAtom2: Number of the two bridging atoms isSpiro: Are the rings spiro-attached numberOfSecondRing: Number (in sssr) of second Ring */ double angle, coord, x1, x2, y1, y2; x1 = round(center1.x * roundFactor) / roundFactor; y1 = round(center1.y * roundFactor) / roundFactor; x2 = round(center2.x * roundFactor) / roundFactor; y2 = round(center2.y * roundFactor) / roundFactor; angle = 360 / (sssr.at(numberOfSecondRing))->size(); qInfo() << "FRP:" << x1 << "," << y1 << ";" << x2 << "," << y2; FusedRingParams fRP; // First block if (x2 > x1 && y2 >= y1) { fRP.toggleStartAngleSign = (double)1.0; // b fRP.annulAxisOrientation = 1; // iph if (isSpiro) { fRP.startAtomNumber = bridgeAtom1; // ibb fRP.startAngle = (double)180.0; // phi return fRP; } fRP.startAngle = (double)(180.0 + angle + 0.5 * angle); if (atomSet[bridgeAtom1]->y > atomSet[bridgeAtom2]->y) { coord = atomSet[bridgeAtom2]->y; fRP.startAtomNumber = bridgeAtom2; // ibb } else { coord = atomSet[bridgeAtom1]->y; fRP.startAtomNumber = bridgeAtom1; // ibb } // System.out.println("First block. " + numberOfSecondRing + " . " + // fRP.startAtomNumber + " . " + (fRP.startAtomNumber == // bridgeAtom1) // + ", " + x1 + ", " + y1 +", " + x2 +", " + y2); return fRP; } // Second block if (x2 > x1 && y2 < y1) { fRP.toggleStartAngleSign = (double)-1.0; // b fRP.annulAxisOrientation = 1; // iph if (isSpiro) { fRP.startAtomNumber = bridgeAtom1; // ibb fRP.startAngle = (double)180.0; // phi return fRP; } fRP.startAngle = (double)(180.0 + angle + 0.5 * angle); if (atomSet[bridgeAtom1]->y > atomSet[bridgeAtom2]->y) { coord = atomSet[bridgeAtom2]->y; fRP.startAtomNumber = bridgeAtom2; // ibb } else { coord = atomSet[bridgeAtom1]->y; fRP.startAtomNumber = bridgeAtom1; // ibb } // System.out.println("Second block. " + numberOfSecondRing + " . " // + fRP.startAtomNumber + " . " + (fRP.startAtomNumber == // bridgeAtom1)); return fRP; } // Third Block if (x2 < x1 && y2 <= y1) { fRP.toggleStartAngleSign = (double)1.0; // b fRP.annulAxisOrientation = 1; // iph if (isSpiro) { fRP.startAtomNumber = bridgeAtom1; // ibb fRP.startAngle = (double)0.0; // phi return fRP; } fRP.startAngle = (double)(angle + 0.5 * angle); if (atomSet[bridgeAtom1]->y > atomSet[bridgeAtom2]->y) { coord = atomSet[bridgeAtom1]->y; fRP.startAtomNumber = bridgeAtom1; // ibb } else { coord = atomSet[bridgeAtom2]->y; fRP.startAtomNumber = bridgeAtom2; // ibb } // System.out.println("Third block. " + numberOfSecondRing + " . " + // fRP.startAtomNumber + " . " + (fRP.startAtomNumber == // bridgeAtom1)); return fRP; } // Fourth block if (x2 < x1 && y2 > y1) { fRP.toggleStartAngleSign = (double)-1.0; // b fRP.annulAxisOrientation = 1; // iph if (isSpiro) { fRP.startAtomNumber = bridgeAtom1; // ibb fRP.startAngle = (double)0.0; // phi return fRP; } fRP.startAngle = (double)(angle + (0.5 * angle)); if (atomSet[bridgeAtom1]->y > atomSet[bridgeAtom2]->y) { coord = atomSet[bridgeAtom1]->y; fRP.startAtomNumber = bridgeAtom1; // ibb } else { coord = atomSet[bridgeAtom2]->y; fRP.startAtomNumber = bridgeAtom2; // ibb } // System.out.println("Fourth block. " + numberOfSecondRing + " . " // + fRP.startAtomNumber + " . " + (fRP.startAtomNumber == // bridgeAtom1)); return fRP; } // Fifth block if (x2 == x1 && y1 > y2) { fRP.toggleStartAngleSign = (double)-1.0; // b fRP.annulAxisOrientation = 0; // iph if (isSpiro) { fRP.startAtomNumber = bridgeAtom1; // ibb fRP.startAngle = (double)180.0; // phi return fRP; } fRP.startAngle = (double)(180 + angle + 0.5 * angle); if (atomSet[bridgeAtom1]->x > atomSet[bridgeAtom2]->x) { coord = atomSet[bridgeAtom2]->x; fRP.startAtomNumber = bridgeAtom2; // ibb } else { coord = atomSet[bridgeAtom1]->x; fRP.startAtomNumber = bridgeAtom1; // ibb } // System.out.println("Fifth block. " + numberOfSecondRing + " . " + // fRP.startAtomNumber + " . " + (fRP.startAtomNumber == // bridgeAtom1)); return fRP; } // Sixth block if (x2 == x1 && y2 > y1) { fRP.toggleStartAngleSign = (double)1.0; // b fRP.annulAxisOrientation = 0; // iph if (isSpiro) { fRP.startAtomNumber = bridgeAtom1; // ibb fRP.startAngle = (double)180.0; // phi return fRP; } fRP.startAngle = (double)(180 + angle + (0.5 * angle)); if (atomSet[bridgeAtom1]->x > atomSet[bridgeAtom2]->x) { coord = atomSet[bridgeAtom1]->x; fRP.startAtomNumber = bridgeAtom1; // ibb } else { coord = atomSet[bridgeAtom2]->x; fRP.startAtomNumber = bridgeAtom2; // ibb } // System.out.println("Sixth block. " + numberOfSecondRing + " . " + // fRP.startAtomNumber + " . " + (fRP.startAtomNumber == // bridgeAtom1)); return fRP; } if (isSpiro) { fRP.startAtomNumber = bridgeAtom1; // ibb fRP.startAngle = (double)180.0; // phi } return fRP; } /** transfers the atoms of the given ring from the origin of the coordinate system to the point at target.x, target.y */ void transfer(int startAtom, int endAtom, int ringNumber, SPoint target, int annulAxisOrientation, // iph double toggleStartAngleSign) { // b // int i; double phi = 0, aaa, bbb, ax, ay, x, y; Ring *ring = sssr.at(ringNumber); // Atom node = new Atom(); int nn = 0; ring->x = round(ring->x * roundFactor) / roundFactor; ring->y = round(ring->y * roundFactor) / roundFactor; target.x = round(target.x * roundFactor) / roundFactor; target.y = round(target.y * roundFactor) / roundFactor; aaa = ring->x - target.x; bbb = ring->y - target.y; // aaa = Math.round(aaa * roundFactor) / roundFactor; // bbb = Math.round(bbb * roundFactor) / roundFactor; // if(ringNumber != 3){ if (annulAxisOrientation == 1 && aaa == (double)0) phi = 3.14159246; if (annulAxisOrientation == 1 && aaa != (double)0) { phi = atan2(bbb, aaa); if (phi < 0.0) phi = -phi; } if (annulAxisOrientation == 0.0) phi = 3.14159246 / 2; if (phi > 3.14159246 / 2) phi = 3.14159246 - phi; if (toggleStartAngleSign < 0.0) phi = -phi; for (int f = startAtom; f <= endAtom; f++) { nn = ring->getNodeNumber(f); if (atomSet[nn]->status == 0) { x = atomSet[nn]->x; y = atomSet[nn]->y; ax = x * cos(phi) - y * sin(phi) + ring->x; ay = x * sin(phi) + y * cos(phi) + ring->y; atomSet[nn]->x = ax; atomSet[nn]->y = ay; atomSet[nn]->status = 1; } } } /** Returns the point that is positioned on the line between 'origin' and 'vector' in distance 'distance' from origin. Originally called 'neuat()' */ SPoint placeAtom(SPoint origin, SPoint vector, double distance) { qInfo() << "placeAtom " << origin.toString() << " " << vector.toString() << " d=" << distance; double a, b, cc; a = vector.x - origin.x; b = vector.y - origin.y; cc = distance / sqrt(a * a + b * b); return SPoint(vector.x + a * cc, vector.y + b * cc); } /** Rotates the atom at Point 'point' around the Point 'center' with the * angle 'angle' */ SPoint rotAtom(SPoint center, SPoint point, double angle) { qInfo() << "rotAtom " << center.toString() << " " << point.toString() << " a=" << angle; double ph = 0.0174532925; double p, co, si, x1, y1, x, y; // make aliphatics look good // qInfo() << "ANGLE:" << angle; if (arerings == true) { if (ncalls == 0) { ncalls = 1; } else { if (fabs(angle) < 1.0) { ncalls++; if (prevang == 0.0) angle = 60.0; if (prevang == 60.0) angle = -60.0; if (prevang == -60.0) angle = 60.0; prevang = angle; } } } else { // no rings if (fabs(angle) < 1.0) { ncalls++; if (ncalls == 1) angle = 60.0; if (ncalls == 2) angle = 60.0; if (ncalls == 3) angle = -60.0; if (ncalls == 4) angle = 60.0; if (ncalls == 5) angle = -60.0; if (ncalls == 6) angle = 60.0; if (ncalls > 6) { if ((ncalls % 2) == 0) angle = 60.0; else angle = -60.0; } } } // qInfo() << " " << angle ; // end aliphatics garbling p = ph * angle; si = sin(p); co = cos(p); x = point.x - center.x; y = point.y - center.y; x1 = co * (x)-si * (y); y1 = si * (x) + co * (y); x = x1 + center.x; y = y1 + center.y; return SPoint(x, y); } /** Positions substituents around atom 'atomIndex' Returns "-1" if no ring was drawn or the ring number of the ring draw */ int positionAtomSubstituents(int atomIndex, SPoint point, SPoint helpPoint, QVector ilist, int modus, int ir, int igr) { qInfo() << "positionAtomSubstituents:atomIndex=" << atomIndex; double ph = 0.0174532925; int i, ib, /*ibb, iii, iph,*/ k; double alph, /*b, phi,*/ rad /*, xx, yy*/; double x = point.x; double y = point.y; double xh = helpPoint.x; double yh = helpPoint.y; bool vmit, ii; SPoint tempPoint; FusedRingParams fRP; Ring *ring = new Ring; SPoint test; int tempAtom; if (sssr.size() > 0) { ring = sssr.at(ir); } QVector rot(10); ib = 0; k = atomSet[atomIndex]->degree; if (k <= 1) { atomSet[atomIndex]->status = 2; return -1; } /* if (k <= 1) */ /*---------------------------------------------------------------*/ /* 'vmit' is false in case of substitution type Atom -> Atom */ /* and substitution Atom -> Ring */ /* true with substitution type Ring -> Atom */ /*---------------------------------------------------------------*/ vmit = false; if ((modus > 1) && (k <= 2)) { // invoking aliphatic if (arerings == true) ncalls = 0; // atomSet[atomIndex]->status = 2; return -1; } /* if ((modus > 1) && (k <= 2)) */ if (modus > 1) vmit = true; rot = angleOpt(atomIndex, ilist, vmit); /*------------------------------------*/ /* Positioning of Neighbors */ /*------------------------------------*/ for (i = 0; i < k; i++) { tempAtom = atomSet[atomIndex]->intnodeTable[i]; if (atomSet[tempAtom]->status <= 0) { double thisRot = rot[i]; if (thisRot > (double)359.9) thisRot = (double)0.0; qInfo() << "placeAtom " << tempAtom << " status=" << atomSet[tempAtom]->status << " rot[" << i << "]=" << thisRot; tempPoint = placeAtom(helpPoint, point, bondLength); // qInfo() << "Invoking rot-Atom() from line 1079" ; test = rotAtom(point, tempPoint, thisRot); atomSet[tempAtom]->x = test.x; atomSet[tempAtom]->y = test.y; atomSet[tempAtom]->status = 1; if (atomSet[tempAtom]->degree == 1) atomSet[tempAtom]->status = 2; } /* if (IATGEZ[atom[thisAtom]->bindpart[i]] <= 0) */ } /* for (i = 0; i < k; i++) */ atomSet[atomIndex]->status = 2; if (modus != 1) return -1; /*---------------------------------------------------------------*/ /* Substitution type Atom -> Ring */ /* Ring is being positioned. */ /*---------------------------------------------------------------*/ alph = 0.0; for (i = 0; i < k; i++) { if (ilist[i + 1] > 0) { alph = alph + rot[i]; atomSet[atomSet[atomIndex]->intnodeTable[i]]->status = 0; } /* if (ilist[i+1] > 0) */ } /* for (i = 0; i < k; i++) */ alph = alph * 0.5; /*---------------------------------------------------------------*/ /* position ring center */ /* -------------------------------------------------------------*/ rad = bondLength / 2 / sin(ph * (180.0 / igr)); tempPoint = placeAtom(SPoint(xh, yh), SPoint(x, y), rad); // qInfo() << "Invoking rot-Atom() from line 1106" ; tempPoint = rotAtom(SPoint(x, y), tempPoint, alph); ring->x = tempPoint.x; ring->y = tempPoint.y; ii = true; fRP = getFusedRingParams(SPoint(x, y), tempPoint, atomIndex, ib, ii, ir); ring->sort(fRP.startAtomNumber); positionRingAtoms(ir, SPoint(0, 0), fRP.startAngle, 0, igr - 1); if (ir == 4) { ir = ir; } ring->status = 1; transfer(1, ring->size() - 1, ir, SPoint(x, y), fRP.annulAxisOrientation, fRP.toggleStartAngleSign); return ir; } /* Checks the needs of zatoms neighbors in terms of space and calculates a list of angles the their positioning in rotAtom() . Angles are returned in int[] rot. int[] rili contains information about zatom and its neighbors. rili[i] = 0 -> it's no ringatom rili[i] = x (x > 0) -> x is part of ring with size x */ QVector angleOpt(int zatom, QVector rili, bool vmit) { QVector rot(10); int hatom = 0, i, kk, ll, neigh; bool wahl; double sum, fewi, phi, alpha; QVector i1(10), i2(10); QVector i3(10), nclass(10); for (int f = 0; f < 10; f++) rot[f] = (double)0; wahl = true; neigh = atomSet[zatom]->degree; if (neigh == 1) { rot[0] = 0.0; return rot; } /* if (neigh == 1) */ /*---------------------------------------------*/ /* Look for atom that is already positioned */ /*---------------------------------------------*/ kk = 0; for (i = 0; i < neigh; i++) { if (atomSet[atomSet[zatom]->intnodeTable[i]]->status != 0) { hatom = i; kk++; } } if (kk == neigh) return rot; sum = 0.0; /*-----------------------------------*/ /* weights for n-substituted atoms */ /*-----------------------------------*/ for (i = 0; i < neigh; i++) { nclass[i] = sqrt((double)atomSet[atomSet[zatom]->intnodeTable[i]]->degree); /*------------------------------------------------------------*/ /* if neighbor is part of ring -> class[] = 100000. */ /*------------------------------------------------------------*/ if ((rili[i + 1] != 0) && (rili[i + 1] != 100)) nclass[i] = 100000; /*------------------------------------------------------------*/ /* if neighbor is part of new ring -> class[] = 500000. */ /* ( makes, that rings that are connected via one atom are */ /* not draw close to each other ) */ /*------------------------------------------------------------*/ if (rili[i + 1] == 100) nclass[i] = nclass[i] + 500000.; /*------------------------------------------------------------*/ /* if vmit = true -> Substitution of a ring */ /*------------------------------------------------------------*/ if ((vmit) && (rili[i + 1] != 0) && (rili[i + 1] != 100)) nclass[i] = -nclass[i]; } /* for (i = 0; i < neigh; i++) */ neigh = resort(nclass, neigh, zatom, hatom, rili); ll = neigh + 1; for (i = 0; i < ll; i++) { if (nclass[i] > 500000.0) nclass[i] -= 500000.0; sum = sum + nclass[i]; } /* for (i = 0; i < ll; i++) */ if (rili[0] == 0) { /*------------------------------------------------------------*/ /* No Ring */ /* To avoid formation of spirals we resort */ /* the bond lists for every second node in the chain. */ /*------------------------------------------------------------*/ if (!wahl) { wahl = true; for (i = 0; i < neigh; i++) { i1[i] = atomSet[zatom]->intnodeTable[i]; i2[i] = atomSet[zatom]->bondTable[i]; i3[i] = nclass[i]; } kk = neigh + 1; for (i = 0; i < neigh; i++) { kk = kk - 1; atomSet[zatom]->intnodeTable[i] = i1[kk]; atomSet[zatom]->bondTable[i] = i2[kk]; nclass[i] = i3[kk]; } /* for (i = 0; i < neigh; i++) */ } else wahl = false; /* if (!wahl) */ /*--------------------------------*/ /* Load angles into rot */ /*--------------------------------*/ phi = 360. / sum; alpha = 180.0 - nclass[neigh] * phi / 2.0; for (i = 0; i < neigh; i++) { rot[i] = alpha - nclass[i] * phi / 2.0; alpha = alpha - nclass[i] * phi; } /* for (i = 0; i < neigh; i++) */ rot[neigh] = 180.0; return rot; } /* if (rili[0] == 0) */ /*-----------------------------------------------------------*/ /* 'zatom' is part of a ring */ /*-----------------------------------------------------------*/ sum = 0.0; ll = neigh + 1; if (vmit) ll = neigh; for (i = 0; i < ll; i++) if (fabs(nclass[i]) != 100000.0) sum = sum + nclass[i]; phi = 180.0 / sum; if (!vmit) { /*------------------------------------------------------------*/ /* The ring has not yet been drawn, i.e. */ /* substitution type Atom -> Ring */ /*------------------------------------------------------------*/ fewi = 180.0 / rili[0]; alpha = 180.0 - nclass[ll - 1] * phi / 2.0; for (i = 0; i < neigh; i++) { if (rili[i + 1] == 0) { rot[i] = alpha - nclass[i] * phi / 2.0; alpha = alpha - nclass[i] * phi; } else { rot[i] = alpha - fewi; alpha = alpha - 90.0; fewi = 90.0 - fewi; } } return rot; } /*---------------------------------------------------------------*/ /* ring substitution */ /*---------------------------------------------------------------*/ alpha = 90.0; for (i = 1; i < neigh; i++) { rot[i] = alpha - nclass[i] * phi / 2.0; alpha = alpha - nclass[i] * phi; } return rot; } /** Takes care of positioning substituents at bridgeheads 'bridgeAtomNumber' is the number of the bridgeAtom to handle, 'x', 'y', 'xh', 'yh' are the coordinates of the two bridgeHeadAtoms, 'ringSize1' and 'ringSize2' are the ring sizes of the two adjecent rings. */ void handleBridgeHeads(int bridgeAtomNumber, double x, double y, double xh, double yh, int ringSize1, int ringSize2) { int i, ll, iz; double xr = 0, yr = 0, an = 0, phi = 0, xx = 0, yy = 0, pp = 0; SPoint tempPoint; ll = atomSet[bridgeAtomNumber]->degree; if (ll <= 3) { atomSet[bridgeAtomNumber]->status = 2; return; } xr = x - xh; yr = y - yh; an = sqrt(xr * xr + yr * yr); iz = 0; /*-------------------------------------------------------*/ /* get the remaining angle between the two rings */ /*-------------------------------------------------------*/ /* Steinbeck says: strange formula... any suggestions for something better... */ phi = 360.0 - (360.0 / ringSize1) - (360.0 / ringSize2); /*----------------------------------------------------*/ /* loop through all the neighbors */ /*----------------------------------------------------*/ for (i = 0; i < ll; i++) { if ((atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->status < 1) && (atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->ringCounter == 0)) { /*---------------------------------------------------------*/ /* Positioning of first neighbor */ /*---------------------------------------------------------*/ xx = x + bondLength * xr / an; yy = y + bondLength * yr / an; iz = iz + 1; switch (ll) { case 1: case 2: case 3: case 4: atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->x = xx; atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->y = yy; break; case 5: if (iz == 1) pp = phi / 3.0; if (iz == 2) pp = -phi / 3.0; /*----------------------------------------------*/ /* rotate substituents by angle pp */ /* if more than one neighbor has to be drawn */ /*----------------------------------------------*/ // qInfo() << "Invoking rot-Atom() from line 1317" ; tempPoint = rotAtom(SPoint(x, y), SPoint(xx, yy), pp); atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->x = tempPoint.x; atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->y = tempPoint.y; /* case 5: */ break; case 6: if (iz == 1) { atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->x = xx; atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->y = yy; } /* if (iz == 1) */ if (iz == 2) pp = phi / 4.0; if (iz == 3) pp = -phi / 4.0; if ((iz == 2) || (iz == 3)) { /*----------------------------------------------*/ /* rotate substituents by angle pp */ /* if more than one neighbor has to be drawn */ /*----------------------------------------------*/ // qInfo() << "Invoking rot-Atom() from line 1335" ; tempPoint = rotAtom(SPoint(x, y), SPoint(xx, yy), pp); atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->x = tempPoint.x; atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->y = tempPoint.y; } break; /* case 6: */ } /* switch (ll) */ atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->status = 1; if (atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->degree == 1) { atomSet[atomSet[bridgeAtomNumber]->intnodeTable[i]]->status = 2; } } } atomSet[bridgeAtomNumber]->status = 2; } /** This routine handles ring substituents which are not rings themselves and which are not located at bridgeheads */ int handleRestOfRingSubstituents(int thisRingNumber) { // double ph = 0.0174532925; int i, j, k, iz, ir, igr, /*id1, endlos,*/ l, jj /*, nanz, ih*/; int /*ik, iph, ibb,*/ ll, /*km, mm,*/ result = -1; // int nn, ia, ib, ii, il, kmm, iz1, iz2, isum1, isum2; // double sux, suy, r, rad1, rad2; // double alph, rad, phi, b, dist, xx, yy, r1, r2, dd; QVector ilist(10); bool vmit /*, ums, okay*/; Ring *ring = sssr.at(thisRingNumber); iz = 0; ir = 0; igr = 0; if (thisRingNumber == 7) { ir = ir; } k = ring->size(); for (i = 0; i < k; i++) { if (atomSet[ring->getNodeNumber(i)]->status != 2) { vmit = true; /*---------------------------------------------------------*/ /* load 'ilist' with infos for angleOpt */ /*---------------------------------------------------------*/ for (j = 0; j < 10; j++) ilist[j] = 0; l = atomSet[ring->getNodeNumber(i)]->degree; if (l != 0) { ilist[0] = k; for (j = 0; j < l; j++) { ll = atomSet[atomSet[ring->getNodeNumber(i)]->intnodeTable[j]]->ringCounter; if (ll != 0) { jj = 0; do { jj = jj + 1; if (atomSet[atomSet[ring->getNodeNumber(i)]->intnodeTable[j]] ->inRings[jj - 1] == thisRingNumber) ilist[j + 1] = k; } while (!(jj >= ll) && (!(atomSet[atomSet[ring->getNodeNumber(i)]->intnodeTable[j]] ->inRings[jj - 1] == thisRingNumber))); } } result = positionAtomSubstituents(ring->getNodeNumber(i), SPoint(atomSet[ring->getNodeNumber(i)]->x, atomSet[ring->getNodeNumber(i)]->y), SPoint(ring->x, ring->y), ilist, ring->size(), ir, igr); drawStatus("1406"); } } } ring->status = 2; /* Ring positioniert */ return result; } /** positions substituent at 'thisAtom'. Originally called sublin(ita) by Dengler */ int positionAtom(int thisAtom) { // double ph = 0.0174532925; int i = 0, id = 0, igr = 0, ihil = 0, ir = 0, iz = 0; int k = 0, kk = 0, l = 0, ll = 0, modus = 0, result = -1; QVector remem(10); QVector ilist(10); Ring *ring = new Ring; k = atomSet[thisAtom]->degree; if (k == 0) { atomSet[thisAtom]->status = 2; return result; } if (atomSet[thisAtom]->ringCounter == 0) { /*-----------------------------------------------------*/ /* 'thisAtom' is no ringAtom */ /*-----------------------------------------------------*/ iz = 0; /*----------------------------------------------------*/ /* Check neighbors of 'thisAtom */ /*----------------------------------------------------*/ for (i = 0; i < k; i++) { if (atomSet[atomSet[thisAtom]->intnodeTable[i]]->status > 0) { iz++; ihil = atomSet[thisAtom]->intnodeTable[i]; } } if (iz == k) { /*-----------------------------------------------*/ /* All neighbors are already positioned */ /*-----------------------------------------------*/ atomSet[thisAtom]->status = 2; return result; } /* if (iz == k) */ /*-----------------------------------------------------*/ /* Assumption is that one atom has been positioned */ /* This atom is set to 100 in ilist */ /*-----------------------------------------------------*/ for (i = 0; i < 7; i++) ilist[i] = 0; for (i = 0; i < k; i++) if (atomSet[atomSet[thisAtom]->intnodeTable[i]]->status > 0) ilist[i + 1] = 100; modus = 0; result = positionAtomSubstituents( thisAtom, SPoint(atomSet[thisAtom]->x, atomSet[thisAtom]->y), SPoint(atomSet[ihil]->x, atomSet[ihil]->y), ilist, modus, ir, igr); return result; } /*------------------------------------------*/ /* Atom is ringatom */ /*------------------------------------------*/ iz = 0; /*---------------------------------------------------------------*/ /* find neighbors of 'thisAtom' that are also part of a ring */ /*---------------------------------------------------------------*/ for (i = 0; i < k; i++) { if ((atomSet[atomSet[thisAtom]->intnodeTable[i]]->status < 1) && (atomSet[atomSet[thisAtom]->intnodeTable[i]]->ringCounter != 0)) { iz = iz + 1; remem[iz] = atomSet[thisAtom]->intnodeTable[i]; } } /*---------------------------------------------------------------*/ /* find the ring to which the atoms stored in 'remem' belong */ /* --------------------------------------------------------------*/ ir = -1; igr = 30; for (i = 0; i < sssr.size(); i++) { ring = sssr.at(i); if (ring->status < 1) { ll = ring->size(); for (l = 0; l < ll; l++) { if (ring->getNodeNumber(l) == thisAtom) { id = 0; for (kk = 0; kk < ll; kk++) { if ((ring->getNodeNumber(kk) == remem[1]) || (ring->getNodeNumber(kk) == remem[2])) id = id + 1; } /* for (kk = 0; kk < ll; kk++) */ if ((id != 2) || (ll > igr)) break; igr = ll; ir = i; break; } } } } if (ir == -1) { /*------------------------------------------------------------*/ /* Ring nicht gefunden */ /*------------------------------------------------------------*/ atomSet[thisAtom]->status = 2; return result; } /*---------------------------------------------------------------*/ /* Positioning of neighbors with 'subat' */ /* 'ilist' contains ring sizes for ring-member-atoms */ /*---------------------------------------------------------------*/ for (i = 0; i < k; i++) if (atomSet[atomSet[thisAtom]->intnodeTable[i]]->status != 0) id = atomSet[thisAtom]->intnodeTable[i]; ilist[0] = igr; for (i = 1; i < 7; i++) ilist[i] = 0; for (i = 0; i < k; i++) { if ((remem[1] == atomSet[thisAtom]->intnodeTable[i]) || (remem[2] == atomSet[thisAtom]->intnodeTable[i])) { ilist[i + 1] = igr; } } modus = 1; result = positionAtomSubstituents(thisAtom, SPoint(atomSet[thisAtom]->x, atomSet[thisAtom]->y), SPoint(atomSet[id]->x, atomSet[id]->y), ilist, modus, ir, igr); return result; } double sqr(double b) { return b * b; } /** This method resorts the node table of atom 'zatom' so that the most complex partner is located in the center of nodetable and the least complex partners are located at the beginning and the end of the nodetable. */ int resort(QVector nclass, int neigh, int zatom, int hatom, QVector rili) { int i, j, k, kzaehl, kl; double min; QVector sbinex(10); QVector sbiord(10); QVector srili(10); QVector sclass(10); k = 0; for (i = 0; i < neigh; i++) { if (i != hatom) { sclass[k] = nclass[i]; sbinex[k] = atomSet[zatom]->intnodeTable[i]; sbiord[k] = atomSet[zatom]->bondTable[i]; srili[k] = rili[i + 1]; k++; } } nclass[neigh - 1] = nclass[hatom]; atomSet[zatom]->intnodeTable[neigh - 1] = atomSet[zatom]->intnodeTable[hatom]; atomSet[zatom]->bondTable[neigh - 1] = atomSet[zatom]->bondTable[hatom]; rili[neigh] = rili[hatom + 1]; neigh--; kzaehl = 0; for (i = 0; i < neigh; i++) { min = sclass[0]; kl = 0; for (j = 0; j < neigh; j++) { if (sclass[j] < min) { min = sclass[j]; kl = j; } } sclass[kl] = 1.0e30; if ((i + 1) % 2 != 0) { nclass[kzaehl] = min; atomSet[zatom]->intnodeTable[kzaehl] = sbinex[kl]; atomSet[zatom]->bondTable[kzaehl] = sbiord[kl]; rili[kzaehl + 1] = srili[kl]; } else { nclass[neigh - kzaehl - 1] = min; atomSet[zatom]->intnodeTable[neigh - kzaehl - 1] = sbinex[kl]; atomSet[zatom]->bondTable[neigh - kzaehl - 1] = sbiord[kl]; rili[neigh - kzaehl] = srili[kl]; kzaehl = kzaehl + 1; } } return neigh; } void sortBondList() { bool somethingDone; int bond, type; for (int e = 0; e < atomSet.size(); e++) { do { somethingDone = false; for (int f = 0; f < atomSet[e]->degree - 1; f++) { if (atomSet[e]->intnodeTable[f] > atomSet[e]->intnodeTable[f + 1]) { bond = atomSet[e]->intnodeTable[f]; type = atomSet[e]->bondTable[f]; atomSet[e]->intnodeTable[f] = atomSet[e]->intnodeTable[f + 1]; atomSet[e]->bondTable[f] = atomSet[e]->bondTable[f + 1]; atomSet[e]->intnodeTable[f + 1] = bond; atomSet[e]->bondTable[f + 1] = type; somethingDone = true; } } } while (somethingDone); } } /* void setPreferredSize(Dimension d){ preferredSize = d; } Dimension getPreferredSize(){ return preferredSize; } */ /** Method responsible for rendering the graphical output of structures Please let this be the last method in this class public void paint(Graphics g){ // super.paint(g); if (verbose) System.out.println("JMDraw->paint(): Drawing of structure finished."); Molecule molecule = new Molecule(atomSet); RenderingEngine strdrw = new RenderingEngine(); RenderingEngine.scaleIntoArea(molecule, g.getClipBounds().getSize(), 0.8); RenderingEngine.translateAllPositive(molecule); RenderingEngine.center(molecule, g.getClipBounds().getSize()); strdrw.drawMolecule(g, molecule, rA); if (verbose) System.out.println("JMDraw->paint(): Drawing of structure finished."); }*/ /* public RenderingAttributes getRenderingAttributes() { return this.rA; } public void setRenderingAttributes(RenderingAttributes rA) { this.rA = rA; } */ // copied from SetOfRingsFinder.java /** Return a Vector that contains the intersection of Vectors vec1 and vec2 */ QList getIntersection(QVector vec1, QVector vec2) { QList is; for (int f = 0; f < vec1.size(); f++) { if (vec2.contains(vec1.at(f)) > 0) is.append(vec1.at(f)); } return is; } }; // class SDG #endif xdrawchem-v1.11.0/xdrawchem/setofrings.h000066400000000000000000000114661371466245600203060ustar00rootroot00000000000000// XDrawChem // Copyright (C) 1997-2000 The JChemPaint project // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef SOR_H #define SOR_H /** Implementation of a set of Rings. Maintains a Vector "rings" to store "ring" objects */ #include #include "atom.h" #include "ring.h" class setOfRings : public QVector { public: setOfRings() {} void addElement(Ring *new1) { qInfo() << "setOfRings::addElement:" << new1->getSortedString(); if (new1->isValid() == false) return; new1->serial = size(); resize(size() + 1); replace(size() - 1, new1); } /** Checks - and returns 'true' - if a certain ring is already stored in this setOfRings */ bool ringAlreadyInSet(Ring *r) { Ring *ring; QString s1, s2; s1 = r->getSortedString(); // System.out.println(this.size()); for (int f = 0; f < size(); f++) { ring = at(f); s2 = ring->getSortedString(); qInfo() << s1 << "-vs-" << s2; if (s1 == s2) { return true; } } return false; } /** Uses the private quicksort method of this class to sort the rings in the set by size */ void sort() { int left = 0; int right = size() - 1; quickSort(left, right); } /** Sorts the rings by size Quick Sort implementation */ void quickSort(int left, int right) { int leftIndex = left; int rightIndex = right; float partionElement; if (right > left) { /* Arbitrarily establishing partition element as the midpoint of * the array. */ partionElement = (at((left + right) / 2))->size(); // loop through the array until indices cross while (leftIndex <= rightIndex) { /* find the first element that is greater than or equal to * the partionElement starting from the leftIndex. */ while ((leftIndex < right) && ((at(leftIndex))->size() < partionElement)) ++leftIndex; /* find an element that is smaller than or equal to * the partionElement starting from the rightIndex. */ while ((rightIndex > left) && ((at(rightIndex))->size() > partionElement)) --rightIndex; // if the indexes have not crossed, swap if (leftIndex <= rightIndex) { swap(leftIndex, rightIndex); ++leftIndex; --rightIndex; } } /* If the right index has not reached the left side of array * must now sort the left partition. */ if (left < rightIndex) quickSort(left, rightIndex); /* If the left index has not reached the right side of array * must now sort the right partition. */ if (leftIndex < right) quickSort(leftIndex, right); } } /** swap for quicksort */ void swap(int i, int j) { Ring *r; r = at(i); replace(i, at(j)); replace(j, r); } /** Lists the rings in this set to the console */ void reportRingList() { for (int f = 0; f < size(); f++) { // System.out.println(((Ring)elementAt(f)).getString()); } } /** For each node in each ring of the list, make a list of rings that it is part of. */ void makeNodeRingLists(QVector thisAtomSet) { qInfo() << "makeNodeRingLists: size = " << thisAtomSet.size(); Ring *ring = 0; int nodeNo = -1; for (int f = 0; f < size(); f++) { ring = at(f); for (int g = 0; g < ring->size(); g++) { nodeNo = (ring->at(g))->number; thisAtomSet[nodeNo]->inRings[thisAtomSet[nodeNo]->ringCounter] = f; thisAtomSet[nodeNo]->ringCounter++; } } } }; #endif xdrawchem-v1.11.0/xdrawchem/skullcursor.xpm000066400000000000000000000023401371466245600210570ustar00rootroot00000000000000/* XPM */ static const char * skullcursor_xpm[] = { "32 32 2 1", "@ g #FFFFFF", "# g #000000", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@#####@@@@@@@@@@@@@@@@@@@@@@@@@@", "@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@#@@@@@@########@@@@@@@@@@@@@@@@", "@#@@@@@#@@@@@@##@@@@@@@@@@@@@@@@", "@#@@@@#@@@@@@#@#@@@@@@@@@@@@@@@@", "@@@@@#@@@@@@#@@#@@@@@@@@@@@@@@@@", "@@@@#@@@@@@#@@@#@@@@@@@@@@@@@@@@", "@@@#@@@@@@#@@@#@@@@@@@@@@@@@@@@@", "@@########@@@#@@@@@@@@@@@@@@@@@@", "@@#@@@@@@#@@#@@@@@@@@@@@@@@@@@@@", "@@#@@@@@@#@#@@@@@@@@@@@@@@@@@@@@", "@@#@@@@@@##@@@@@@@@@@@@@@@@@@@@@", "@@########@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"}; xdrawchem-v1.11.0/xdrawchem/smilesdialog.cpp000066400000000000000000000043211371466245600211220ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include "application.h" #include "chemdata.h" #include "render2d.h" #include "smilesdialog.h" void ApplicationWindow::FromSMILES() { SmilesDialog i(this); if (!i.exec()) return; QString sm = i.getSMILES(); m_chemData->fromSMILES(sm); m_renderer->Inserted(); m_renderer->update(); } SmilesDialog::SmilesDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Enter InChI or SMILES string")); QVBoxLayout *smilesLayout = new QVBoxLayout(); QLabel *smilesLabel = new QLabel(tr("Enter InChI or SMILES string:"), this); smilesLayout->addWidget(smilesLabel); smilesInput = new QLineEdit(this); connect(smilesInput, SIGNAL(returnPressed()), this, SLOT(accept())); smilesLayout->addWidget(smilesInput); QHBoxLayout *btnLayout = new QHBoxLayout(); QSpacerItem *btnSpacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); btnLayout->addItem(btnSpacer); QPushButton *okBtn = new QPushButton(tr("OK"), this); connect(okBtn, SIGNAL(clicked()), SLOT(accept())); btnLayout->addWidget(okBtn); QPushButton *cancelBtn = new QPushButton(tr("Cancel"), this); connect(cancelBtn, SIGNAL(clicked()), SLOT(reject())); btnLayout->addWidget(cancelBtn); smilesLayout->addLayout(btnLayout); setLayout(smilesLayout); } QString SmilesDialog::getSMILES() { return smilesInput->text(); } xdrawchem-v1.11.0/xdrawchem/smilesdialog.h000066400000000000000000000020111371466245600205610ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef SMILESDIALOG_H #define SMILESDIALOG_H #include #include class SmilesDialog : public QDialog { public: SmilesDialog(QWidget *parent); QString getSMILES(); private: QLineEdit *smilesInput; }; #endif xdrawchem-v1.11.0/xdrawchem/sorf.h000066400000000000000000000411171371466245600170700ustar00rootroot00000000000000// XDrawChem // Copyright (C) 1997-2000 The JChemPaint project // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef SORF_H #define SORF_H #include #include "atom.h" #include "setofrings.h" class DataStructureTools { public: static QVector cloneAtomSet(QVector thisSet) { QVector newAtomSet(thisSet.size()); int f; for (f = 0; f < thisSet.size(); f++) { newAtomSet.replace(f, thisSet[f]->clone()); } for (f = 0; f < thisSet.size(); f++) { for (int g = 0; g < thisSet[f]->degree; g++) { for (int h = 0; h < thisSet.size(); h++) { if (thisSet[h]->number == thisSet[f]->nodeTable[g]->number) { newAtomSet[f]->nodeTable.replace(g, newAtomSet[h]); break; } } } } return newAtomSet; } }; class SetOfRingsFinder { public: SetOfRingsFinder() { debug = false; debug1 = false; debug2 = false; debug3 = false; ringCounter = 0; storeRings = true; } bool debug; // minimum details bool debug1; // more details bool debug2; // too many details bool debug3; // hillarious details int ringCounter; bool storeRings; QVector FGsource; /** Finds the Smallest Set of Smallest Rings. This is an implementation of the algorithm published in John Figueras, "Ring Perception Using Breadth-First Search", J. Chem. Inf. Comput Sci. 1996, 36, 986-991. */ setOfRings findSSSR(QVector atSet) { ringCounter = 0; setOfRings sssr; QVector tempAtomSet = DataStructureTools::cloneAtomSet(atSet); int f; for (f = 0; f < tempAtomSet.size(); f++) { tempAtomSet[f]->number = f; } qInfo() << "tempAtomSet.size() = f = " << f; FGsource.resize(tempAtomSet.size()); int smallestDegree; Atom *smallest; Ring *ring; QVector edgeToRemove; QVector remembernodes; int nodesToBreakCounter; /** Two Vectors - as defined in the article. One to hold the full set of atoms in the structure and on to store the numbers of the nodes that have been trimmed away. Furhter there is a Vector nodesN2 to store the number of N2 nodes */ QList fullSet; QList trimSet; QList nodesN2; // load fullSet with the numbers of our atoms for (f = 0; f < tempAtomSet.size(); f++) { fullSet.append(tempAtomSet[f]); } do { /* Add nodes of degree zero to trimset. Also add nodes of degree 2 to nodesN2. In the same run, check, which node has the lowest degree greater than zero. */ smallestDegree = 7; smallest = 0; nodesN2.clear(); int f; for (f = 0; f < tempAtomSet.size(); f++) { if (tempAtomSet[f]->degree == 0) { if (!trimSet.contains(tempAtomSet[f])) { trimSet.append(tempAtomSet[f]); } } if (tempAtomSet[f]->degree == 2) { if (!trimSet.contains(tempAtomSet[f])) { nodesN2.append(tempAtomSet[f]); } } if (tempAtomSet[f]->degree < smallestDegree && tempAtomSet[f]->degree > 0) { smallest = tempAtomSet[f]; smallestDegree = tempAtomSet[f]->degree; } } if (smallest == 0) break; // If there are nodes of degree 1, trim them away if (smallest->degree == 1) { trim(smallest, tempAtomSet); trimSet.append(smallest); } // if there are nodes of degree 2, find out of which rings // they are part of. else if (smallest->degree == 2) { remembernodes.clear(); remembernodes.resize(nodesN2.count()); nodesToBreakCounter = 0; f = 0; for (f = 0; f < nodesN2.count(); f++) { ring = findSRing(nodesN2.at(f), tempAtomSet); if (ring->size() > 0) { // check, if this ring already is in SSSR qInfo() << "d2:findSRing of size: " << ring->size(); if (!sssr.ringAlreadyInSet(ring)) { sssr.addElement(ring); remembernodes.replace(nodesToBreakCounter, nodesN2.at(f)); nodesToBreakCounter++; } qInfo() << "SSSRd2:" << sssr.size(); } } if (nodesToBreakCounter == 0) { nodesToBreakCounter = 1; remembernodes.replace(0, (nodesN2.at(0))); } for (f = 0; f < nodesToBreakCounter; f++) { breakBond(remembernodes[f], tempAtomSet); } } else if (smallest->degree == 3) { ring = findSRing(smallest, tempAtomSet); qInfo() << "d3:findSRing of size: " << ring->size(); if (ring->size() > 0) { // check, if this ring already is in SSSR if (!sssr.ringAlreadyInSet(ring)) { sssr.addElement(ring); } qInfo() << "SSSRd3:" << sssr.size(); } edgeToRemove = checkEdges(ring, tempAtomSet); breakBond(edgeToRemove[0], edgeToRemove[1], tempAtomSet); } } while (trimSet.count() < fullSet.count()); ringCounter = sssr.size(); qInfo() << "SSSR:" << sssr.size(); for (int h = 0; h < sssr.size(); h++) qInfo() << h << ":" << sssr[h]->size(); qInfo() << "SSSR ends"; return sssr; } QString printPath(QList atoms) { QString thisPath; for (int i = 0; i < atoms.size(); i++) { if (i > 0) thisPath.append(" "); thisPath.append(QString::number(atoms[i]->number)); } return thisPath; } /** finds the smallest ring of which rootNode is part of. This routine is called 'getRing() in Figueras original article */ Ring *findSRing(Atom *rootNode, QVector tempAtomSet) { // qInfo("Attempt to find Ring for " + rootNode->number); Atom *node, *neighbor; Atom *source, *m, *frontNode; /** OKatoms is Figueras nomenclature, giving the number of atoms in the structure */ int OKatoms = tempAtomSet.size(); /** queue for Breadth First Search of this graph */ QQueue queue; /** ringsset stores the smallest ring found and returns it */ // Ring *ringset; /* Initialize a path Vector (QPtrList) for each node */ QVector *> path(OKatoms); QList intersection; QList ring; // I think Qt does this for us; we're not using Vectors anyway. int f; for (f = 0; f < OKatoms; f++) { path.replace(f, new QList); } // Initialize the queue with nodes attached to rootNode for (f = 0; f < rootNode->degree; f++) { /* if the degree of the f-st neighbor of rootNode is greater than zero (i.e., it has not yet been deleted from the list) */ neighbor = rootNode->nodeTable[f]; if (neighbor->degree > 0) { // push the f-st node onto our FIFO queue // after assigning rootNode as its source FGsource.replace(neighbor->number, rootNode); queue.enqueue(neighbor); path[neighbor->number]->append(rootNode->nodeTable[f]); path[neighbor->number]->append(rootNode); } } while (true && queue.count() > 0) { node = queue.dequeue(); frontNode = node; source = FGsource[node->number]; int f; for (f = 0; f < node->degree; f++) { m = node->nodeTable[f]; if (m->degree > 0 && m != source) { if (path[m->number]->count() > 0) { intersection = getIntersection(*path[frontNode->number], *path[m->number]); if (intersection.count() == 1) { // we have found a valid ring closure // now let's prepare the path to // return in tempAtomSet qInfo() << "Ring closure found: " << m->number << ", source is " << source->number; qInfo() << m << ", " << source; qInfo() << "Path of frontnode: " << printPath(*path[frontNode->number]); qInfo() << "Path of m: " << printPath(*path[m->number]); ring = getUnion(*path[frontNode->number], *path[m->number]); return prepareRing(ring, tempAtomSet); } } else { // if path[m] is not null // update the path[m] path.replace(m->number, merge(path[m->number], path[frontNode->number])); path[m->number]->insert(0, m); // no, we really mean insert here; well, // "prepend" really, but this is what the old // code did, exactly. // now push the node m onto the queue FGsource.replace(m->number, frontNode); queue.enqueue(m); } } } } return new Ring; } /** Return a Vector that contains the intersection of Vectors vec1 and vec2 */ QList getIntersection(QList vec1, QList vec2) { QList is; for (int f = 0; f < vec1.count(); f++) { if (vec2.contains(vec1.at(f))) is.append(vec1.at(f)); } return is; } /** Return a Vector that contains the union of Vectors vec1 and vec2 */ QList getUnion(QList vec1, QList vec2) { QList is = vec1; for (int f = vec2.count() - 1; f > -1; f--) { if (!vec1.contains(vec2.at(f))) is.append(vec2.at(f)); } return is; } /** merges two vectors into one */ QList *merge(QList *vec1, QList *vec2) { QList *result = new QList; *result = *vec1 + *vec2; return result; } /** prepares a Ring, i.e. a Vector with Nodes from a Vector with numbers of nodes */ Ring *prepareRing(QList vec, QVector tempAtomSet) { Ring *r = new Ring(vec.count()); for (int f = 0; f < vec.count(); f++) { r->replace(f, vec.at(f)); } r->sort(); return r; } /** removes from the connection table all connections to node n, leaving this node with degree zero.*/ void trim(Atom *n, QVector tempAtomSet) { Atom *conn; for (int f = 0; f < n->degree; f++) { conn = n->nodeTable[f]; for (int g = 0; g < conn->degree; g++) { if (conn->nodeTable[g] == n) { if (g < (conn->nodeTable.size() - 1)) { for (int h = g; h < conn->degree - 1; h++) { conn->nodeTable.replace(h, conn->nodeTable[h + 1]); } } conn->nodeTable.replace(conn->degree - 1, 0); conn->degree--; } } n->nodeTable.replace(f, 0); } n->degree = 0; // you are erased! Har, har, har..... >8-)=) } /** Eliminate the last bond of this node from the connectiontable*/ void breakBond(Atom *thisNode, QVector tempAtomSet) { int degree = thisNode->degree; if (degree == 0) { qInfo() << "breakBond: invalid node"; return; } // remember the bond partner of the last bond Atom *partner = thisNode->nodeTable[degree - 1]; // now delete the bond thisNode->nodeTable.replace(degree - 1, 0); thisNode->degree--; // find the same bond for 'partner' and delete it for (int f = 0; f < partner->degree; f++) { if (partner->nodeTable[f] == thisNode) { partner->nodeTable.replace(f, 0); for (int g = f; g < partner->degree - 1; g++) { partner->nodeTable.replace(g, partner->nodeTable[g + 1]); } partner->nodeTable.replace(partner->degree - 1, 0); partner->degree--; break; } } } /** Eliminate the bond between these two atom */ void breakBond(Atom *from, Atom *to, QVector tempAtomSet) { int degree, f; for (f = 0; f < from->degree; f++) { if (from->nodeTable[f] == to) { degree = from->degree; for (int g = f; g < from->degree - 1; g++) { from->nodeTable.replace(g, from->nodeTable[g + 1]); } from->nodeTable.replace(from->degree - 1, 0); from->degree--; break; } } for (f = 0; f < to->degree; f++) { if (to->nodeTable[f] == from) { for (int g = f; g < to->degree - 1; g++) { to->nodeTable.replace(g, to->nodeTable[g + 1]); } to->nodeTable.replace(to->degree - 1, 0); to->degree--; break; } } } /** Restores a bond betwenn nodes 'from' and 'to' of an array of nodes 'tempAtomSet' */ void restoreBond(Atom *from, Atom *to, QVector tempAtomSet) { from->nodeTable.replace(from->degree, to); from->degree++; to->nodeTable.replace(to->degree, from); to->degree++; } /** Selects an optimum edge for elimination in structures without N2 nodes. */ QVector checkEdges(Ring *ring, QVector tempAtomSet) { QVector edge; Ring *r1, *r2; setOfRings tempSoR; int minMax, minMaxSize; // Atom[] tempAtomSet = new Atom[tAS.length]; // for (int f = 0; f < tAS.length; f++){ // tempAtomSet[f] = (Atom)tAS[f].clone(); // } // Ok, we now have set of nodes in hand that can be modified. // Now, we in turn remove the edges of our ring r int f; for (f = 0; f < ring->size(); f++) { edge = ring->getEdge(f); breakBond(edge[0], edge[1], tempAtomSet); r1 = findSRing(edge[0], tempAtomSet); r2 = findSRing(edge[1], tempAtomSet); if (r1->size() > r2->size()) tempSoR.addElement(r1); else tempSoR.addElement(r1); restoreBond(edge[0], edge[1], tempAtomSet); } minMaxSize = (tempSoR[0])->size(); minMax = 0; for (f = 0; f < tempSoR.size(); f++) { if ((tempSoR[f])->size() < minMaxSize) { minMaxSize = (tempSoR[f])->size(); minMax = f; } } return ring->getEdge(minMax); } }; #endif xdrawchem-v1.11.0/xdrawchem/sugar_xpm.h000066400000000000000000001531221371466245600201240ustar00rootroot00000000000000/* XPM */ static const char *s_deoxyribose[] = { /* width height num_colors chars_per_pixel */ " 109 102 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "####.#####.####....#######################################################" "##############....####.#####.######", "####.#####.###.####.######################################################" "#############.####.###.#####.######", "####.#####.##.######.#####################################################" "############.######.##.#####.######", "####.#####.##.######.#####################################################" "############.######.##.#####.######", "####.......##.######.#####################################################" "############.######.##.......######", "####.#####.##.######.#........................############################" "############.######.##.#####.######", "####.#####.##.######.########################.############################" "############.######.##.#####.######", "####.#####.###.####.#########################.############################" "#############.####.###.#####.######", "####.#####.####....##########################.############################" "##############....####.#####.######", "#############################################.############################" "###################################", "#############################################.############################" "###################################", "#############################################.###################....#####" "###################################", "#############################################.##################.####.####" "################.##################", "#############################################.#################.######.###" "################.##################", "#############################################.#################.######.###" "################.##################", "#############################################.#################.######.###" "################.##################", "#############################################.#################.######.###" "################.##################", "#############################################.#################.######.###" "################.##################", "#############################################.##################.####.####" "################.##################", "#############################################.###################....###.#" "################.##################", "#############################################.###############.##########.." "################.##################", "#############################################.##############.#############" "..##############.##################", "#############################################.############..##############" "#..#############.##################", "#############################################.###########..###############" "###.############.##################", "#############################################.##########.#################" "####..##########.##################", "#############################################.########..##################" "######.#########.##################", "#############################################.#######..###################" "#######..#######.##################", "#############################################.######.#####################" "########..######.##################", "#############################################.####..######################" "##########..####.##################", "#############################################.###.########################" "###########..###.##################", "#############################################.#..#########################" "#############..#.##################", "#############################################...##########################" "##############...##################", "#############################################.############################" "###################################", "#############################################.############################" "################.##################", "##############################################.###########################" "###############.###################", "##############################################.###########################" "###############.###################", "##############################################.###########################" "###############.###################", "##############################################..##########################" "##############.####################", "###############################################.##########################" "##############.####################", "###############################################.##########################" "##############.####################", "###############################################.##########################" "#############.#####################", "################################################.#########################" "#############.#####################", "################################################.#########################" "#############.#####################", "################################################.#########################" "############.######################", "#################################################.########################" "############.######################", "#################################################.########################" "############.######################", "#################################################.########################" "###########.#######################", "#################################################.########################" "###########.#######################", "##################################################.#######################" "###########.#######################", "##################################################.#######################" "##########.########################", "##################################################.#######################" "##########.########################", "###################################################.######################" "##########.########################", "###################################################.######################" "#########.#########################", "###################################################.######################" "#########.#########################", "###################################################..#####################" "#########.#########################", "####################################################.#####################" "########.##########################", "####################################################.#####################" "########.##########################", "####################################################.#####################" "########.##########################", "#####################################################.####################" "#######.###########################", "#####################################################....................." "........###########################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "#####################################################.####################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "###################################################....####.#####.########" "###################################", "##################################################.####.###.#####.########" "###################################", "#################################################.######.##.#####.########" "###################################", "#################################################.######.##.#####.########" "###################################", "#################################################.######.##.......########" "###################################", "#################################################.######.##.#####.########" "###################################", "#################################################.######.##.#####.########" "###################################", "##################################################.####.###.#####.########" "###################################", "###################################################....####.#####.########" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################", "##########################################################################" "###################################"}; /* XPM */ static const char *s_d_fructose[] = { /* width height num_colors chars_per_pixel */ " 153 87 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "####.#####.####....####.#####.###...#####....#############################" "#################################....###.#####.###...#####....####.#####.#" "#####", "####.#####.###.####.###.#####.##.###.###.####.############################" "################################.####.##.#####.##.###.###.####.###.#####.#" "#####", "####.#####.##.######.##.#####.######.##.##################################" "###############################.########.#####.######.##.######.##.#####.#" "#####", "####.#####.##.######.##.#####.#####.###.##################################" "###############################.########.#####.#####.###.######.##.#####.#" "#####", "####.......##.######.##.......####.####.#################################." "...############################.########.......####.####.######.##.......#" "#####", "####.#####.##.######.##.#####.###.#####.################################.#" "###.###########################.########.#####.###.#####.######.##.#####.#" "#####", "####.#####.##.######.##.#####.##.######.###############################.##" "####.##########################.########.#####.##.######.######.##.#####.#" "#####", "####.#####.###.####.###.#####.##.#######.####.#########################.##" "####.###########################.####.##.#####.##.#######.####.###.#####.#" "#####", "####.#####.####....####.#####.##.....####....##########################.##" "####.############################....###.#####.##.....####....####.#####.#" "#####", "#######################################################################.##" "####.#####################################################################" "#####", "#######################################################################.##" "####.#####################################################################" "#####", "########################################################################.#" "###.##.###################################################################" "#####", "###########################################.########################..###." "...####..#########################.#######################################" "#####", "###########################################.######################...#####" "#########..#######################.#######################################" "#####", "###########################################.####################...#######" "###########..#####################.#######################################" "#####", "###########################################.##################...#########" "#############..###################.#######################################" "#####", "###########################################.################...###########" "###############..#################.#######################################" "#####", "###########################################.##############...#############" "#################..###############.#######################################" "#####", "###########################################.############...###############" "###################..#############.#######################################" "#####", "###########################################.##########...#################" "#####################..###########.#######################################" "#####", "###########################################.########...###################" "#######################..#########.#######################################" "#####", "###########################################.######...#####################" "#########################..#######.#######################################" "#####", "###########################################.####...#######################" "###########################..#####.#######################################" "#####", "###########################################.##...#########################" "#############################...##.#######################################" "#####", "###########################################....###########################" "###############################....#######################################" "#####", "###########################################..#############################" "#################################..#######################################" "#####", "###########################################..#############################" "#################################..#######################################" "#####", "###########################################..#############################" "#################################..#######################################" "#####", "###########################################.#.##########.#####.###########" "###############....####.#####.##.#.#######################################" "#####", "###########################################.#.##########.#####.###########" "##############.####.###.#####.#..#.#######################################" "#####", "###########################################.##.#########.#####.###########" "#############.######.##.#####.#.##.#######################################" "#####", "###########################################.##..########.#####.###########" "#############.######.##.#####.####.#######################################" "#####", "###########################################.###.########.......###########" "#############.######.##.......####.#######################################" "#####", "###########################################.###..#######.#####.###########" "#############.######.##.#####.####.#######################################" "#####", "###########################################.####.#######.#####.###########" "#############.######.##.#####.####.#######################################" "#####", "###########################################.#####.######.#####.###########" "##############.####.###.#####.####.#######################################" "#####", "###########################################.#####.######.#####.###########" "###############....####.#####.####.#######################################" "#####", "##################################################.#######################" "##########################################################################" "#####", "##################################################..######################" "##########################################################################" "#####", "########################################.#####.####.######################" "################################....####.#####.###########################" "#####", "########################################.#####.####..######.##############" "#################.#######.#####.####.###.#####.###########################" "#####", "########################################.#####.#####.######.##############" "#################.######.#####.######.##.#####.###########################" "#####", "########################################.#####.######.#####.##############" "#################.######.#####.######.##.#####.###########################" "#####", "########################################.......######.#####.##############" "#################.#####.######.######.##.......###########################" "#####", "########################################.#####.#######.####.##############" "#################.####..######.######.##.#####.###########################" "#####", "########################################.#####.#######..###.##############" "#################.####.#######.######.##.#####.###########################" "#####", "########################################.#####.########.###.##############" "#################.###.#########.####.###.#####.###########################" "#####", "########################################.#####.########..##.##############" "#################.###.##########....####.#####.###########################" "#####", "########################################################.##.##############" "#################.##.#####################################################" "#####", "#########################################################.#.##############" "#################.#..#####################################################" "#####", "#########################################################.#.##############" "#################.#.######################################################" "#####", "##########################################################..##############" "#################..#######################################################" "#####", "##########################################################..##############" "#################..#######################################################" "#####", "###########################################################..............." "..................########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "###########################################################.##############" "#################.########################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "#########################################################....####.#####.##" "##############.#####.#####################################################" "#####", "########################################################.####.###.#####.##" "##############.#####.#####################################################" "#####", "#######################################################.######.##.#####.##" "##############.#####.#####################################################" "#####", "#######################################################.######.##.#####.##" "##############.#####.#####################################################" "#####", "#######################################################.######.##.......##" "##############.......#####################################################" "#####", "#######################################################.######.##.#####.##" "##############.#####.#####################################################" "#####", "#######################################################.######.##.#####.##" "##############.#####.#####################################################" "#####", "########################################################.####.###.#####.##" "##############.#####.#####################################################" "#####", "#########################################################....####.#####.##" "##############.#####.#####################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####", "##########################################################################" "##########################################################################" "#####"}; /* XPM */ static const char *s_d_glucose[] = { /* width height num_colors chars_per_pixel */ " 110 110 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "###############################....###.#####.###...#####....####.#####.###" "####################################", "##############################.####.##.#####.##.###.###.####.###.#####.###" "####################################", "#############################.########.#####.######.##.######.##.#####.###" "####################################", "#############################.########.#####.#####.###.######.##.#####.###" "####################################", "#############################.########.......####.####.######.##.......###" "####################################", "#############################.########.#####.###.#####.######.##.#####.###" "####################################", "#############################.########.#####.##.######.######.##.#####.###" "####################################", "##############################.####.##.#####.##.#######.####.###.#####.###" "####################################", "###############################....###.#####.##.....####....####.#####.###" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "################################.#########################################" "####################################", "#####.#####.####################.#########################################" "##############.#####.###############", "#####.#####.####################...................................#######" "##############.#####.###############", "#####.#####.###################..##################################.######" "##############.#####.###############", "#####.#####.##################.#.###################################.#####" "##############.#####.###############", "#####.......#################.##.####################################.####" "##############.......###############", "#####.#####.################.###.#####################################.###" "##############.#####.###############", "#####.#####.###############.####.######################################.##" "##############.#####.###############", "#####.#####.##############.#####.#######################################.#" "##############.#####.###############", "#####.#####.#############.######.########################################." ".#############.#####.###############", "########################.#######.#########################################" "..##################################", "#######################.##################################################" "#..#################################", "######################.###################################################" "##..################################", "########.############.#######.#####.######################################" "###..############.##################", "########.###########.########.#####.######################################" "####..###########.##################", "########.##########.#########.#####.######################################" "#####..##########.##################", "########.#########.##########.#####.######################################" "######..#########.##################", "########.########.###########.......######################################" "#######..########.##################", "########.#######.############.#####.######################################" "########..#######.##################", "########.######.#############.#####.######################################" "#########..######.##################", "########.#####.##############.#####.######################################" "###########.#####.##################", "########.####.###############.#####.######################################" "############.####.##################", "########.###.#############################################################" "#############.###.##################", "########.##.##############################################################" "##############.##.##################", "########.#.###############################################################" "###############.#.##################", "########..################################################################" "################..##################", "########.#################################################################" "#################.##################", "########..################################################################" "################..##################", "########.#.###############################################################" "###############.#.##################", "########.##.##################....####.#####.##################.#####.####" "##############.##.##################", "########.###.################.####.###.#####.##################.#####.####" "#############.###.##################", "########.####.##############.######.##.#####.##################.#####.####" "############.####.##################", "########.#####.#############.######.##.#####.##################.#####.####" "###########.#####.##################", "########.######.############.######.##.......##################.......####" "#########..######.##################", "########.#######.###########.######.##.#####.##################.#####.####" "########..#######.##################", "########.########.##########.######.##.#####.##################.#####.####" "#######..########.##################", "########.#########.##########.####.###.#####.##################.#####.####" "######..#########.##################", "########.##########.##########....####.#####.##################.#####.####" "#####..##########.##################", "########.###########.#####################################################" "####..###########.##################", "########.############.####################################################" "###..############.##################", "######################.###################################################" "##..################################", "#######################.########.#################################.#######" "#..#################################", "######....####.#####.###.#######.#################################.#######" "..#############....####.#####.######", "#####.####.###.#####.####.######.#################################.######." ".#############.####.###.#####.######", "####.######.##.#####.#####.#####.#################################.#####.#" "#############.######.##.#####.######", "####.######.##.#####.######.####.#################################.####.##" "#############.######.##.#####.######", "####.######.##.......#######.###.#################################.###.###" "#############.######.##.......######", "####.######.##.#####.########.##.#################################.##.####" "#############.######.##.#####.######", "####.######.##.#####.#########.#.#################################.#.#####" "#############.######.##.#####.######", "#####.####.###.#####.##########..#################################..######" "##############.####.###.#####.######", "######....####.#####.###########...................................#######" "###############....####.#####.######", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "################################.#################################.#######" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "#############################.#####.############################....####.#" "####.###############################", "#############################.#####.###########################.####.###.#" "####.###############################", "#############################.#####.##########################.######.##.#" "####.###############################", "#############################.#####.##########################.######.##.#" "####.###############################", "#############################.......##########################.######.##.." ".....###############################", "#############################.#####.##########################.######.##.#" "####.###############################", "#############################.#####.##########################.######.##.#" "####.###############################", "#############################.#####.###########################.####.###.#" "####.###############################", "#############################.#####.############################....####.#" "####.###############################", "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################", "##########################################################################" "####################################"}; /* XPM */ static const char *s_ribose[] = { /* width height num_colors chars_per_pixel */ " 108 101 2 1", /* colors */ ". c #000000", "# c None", /* pixels */ "##########################################################################" "##################################", "##########################################################################" "##################################", "##########################################################################" "##################################", "##########################################################################" "##################################", "##########################################################################" "##################################", "####.#####.####....#######################################################" "#############....####.#####.######", "####.#####.###.####.######################################################" "############.####.###.#####.######", "####.#####.##.######.#####################################################" "###########.######.##.#####.######", "####.#####.##.######.#####################################################" "###########.######.##.#####.######", "####.......##.######.#####################################################" "###########.######.##.......######", "####.#####.##.######.#.......................#############################" "###########.######.##.#####.######", "####.#####.##.######.#######################.#############################" "###########.######.##.#####.######", "####.#####.###.####.########################.#############################" "############.####.###.#####.######", "####.#####.####....#########################.#############################" "#############....####.#####.######", "############################################.#############################" "##################################", "############################################.#############################" "##################################", "############################################.###################....######" "##################################", "############################################.##################.####.#####" "###############.##################", "############################################.#################.######.####" "###############.##################", "############################################.#################.######.####" "###############.##################", "############################################.#################.######.####" "###############.##################", "############################################.#################.######.####" "###############.##################", "############################################.#################.######.####" "###############.##################", "############################################.##################.####.#####" "###############.##################", "############################################.###################....######" "###############.##################", "############################################.##########################..#" "###############.##################", "############################################.##############..###########.." "###############.##################", "############################################.#############..##############" ".##############.##################", "############################################.############.################" "#..############.##################", "############################################.##########..#################" "##..###########.##################", "############################################.#########..##################" "####..#########.##################", "############################################.########.####################" "#####..########.##################", "############################################.######..#####################" "#######.#######.##################", "############################################.#####..######################" "########..#####.##################", "############################################.####.########################" "#########..####.##################", "############################################.###.#########################" "###########.###.##################", "############################################.#..##########################" "############..#.##################", "############################################...###########################" "#############...##################", "############################################.#############################" "##################################", "############################################.#############################" "###############.##################", "#############################################.############################" "##############.###################", "#############################################.############################" "##############.###################", "#############################################.############################" "##############.###################", "##############################################.###########################" "#############.####################", "##############################################.###########################" "#############.####################", "##############################################.###########################" "#############.####################", "###############################################.##########################" "############.#####################", "###############################################.##########################" "############.#####################", "###############################################.##########################" "############.#####################", "################################################.#########################" "###########.######################", "################################################.#########################" "###########.######################", "################################################..########################" "##########..######################", "#################################################.########################" "##########.#######################", "#################################################.########################" "##########.#######################", "##################################################.#######################" "#########.########################", "##################################################.#######################" "#########.########################", "##################################################.#######################" "#########.########################", "###################################################.######################" "########.#########################", "###################################################.######################" "########.#########################", "###################################################.######################" "########.#########################", "####################################################.#####################" "#######.##########################", "####################################################.#####################" "#######.##########################", "####################################################.#####################" "#######.##########################", "#####################################################.####################" "######.###########################", "#####################################################....................." ".......###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "#####################################################.####################" "######.###########################", "##########################################################################" "##################################", "##########################################################################" "##################################", "###################################################....####.#####.########" "####....####.#####.###############", "##################################################.####.###.#####.########" "###.####.###.#####.###############", "#################################################.######.##.#####.########" "##.######.##.#####.###############", "#################################################.######.##.#####.########" "##.######.##.#####.###############", "#################################################.######.##.......########" "##.######.##.......###############", "#################################################.######.##.#####.########" "##.######.##.#####.###############", "#################################################.######.##.#####.########" "##.######.##.#####.###############", "##################################################.####.###.#####.########" "###.####.###.#####.###############", "###################################################....####.#####.########" "####....####.#####.###############", "##########################################################################" "##################################", "##########################################################################" "##################################", "##########################################################################" "##################################", "##########################################################################" "##################################", "##########################################################################" "##################################", "##########################################################################" "##################################"}; xdrawchem-v1.11.0/xdrawchem/symbol.cpp000066400000000000000000000522431371466245600177610ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // symbol.cpp - Symbol's implementation of functions #include #include #include "bondedit.h" #include "defs.h" #include "drawable.h" #include "render2d.h" #include "symbol.h" // XPM files defining symbols #include "symbol_xpm.h" // end symbol defs Symbol::Symbol(Render2D *r1, QObject *parent) : Drawable(parent) { m_renderer = r1; highlighted = false; offset = QPoint(0, 0); need_offset = false; rotation = 0.0; scale = 1.0; } Symbol *Symbol::CloneTo(Drawable *target) const { if (!target) target = new Symbol(m_renderer, parent()); Symbol *t = static_cast(this->Drawable::CloneTo(target)); t->originalRegular = originalRegular; t->originalHighlighted = originalHighlighted; t->rotateRegular = rotateRegular; t->rotateHighlighted = rotateHighlighted; t->need_offset = need_offset; t->offset = offset; t->rotation = rotation; t->scale = scale; return t; } void Symbol::SetSymbol(QString n) { which = n; // load symbol. Note that "sym_ring_up" is not represented by a pixmap. // "sym_2e_line" is also generated as needed. // most p orbitals are also generated on the fly. if (which == "sym_plus") { originalRegular = QPixmap(sym_plus_xpm); rotateRegular = QPixmap(sym_plus_xpm); originalHighlighted = QPixmap(hl_sym_plus_xpm); rotateHighlighted = QPixmap(hl_sym_plus_xpm); return; } if (which == "sym_minus") { originalRegular = QPixmap(sym_minus_xpm); rotateRegular = QPixmap(sym_minus_xpm); originalHighlighted = QPixmap(hl_sym_minus_xpm); rotateHighlighted = QPixmap(hl_sym_minus_xpm); return; } if (which == "sym_delta_plus") { originalRegular = QPixmap(sym_delta_plus_xpm); rotateRegular = QPixmap(sym_delta_plus_xpm); originalHighlighted = QPixmap(hl_sym_delta_plus_xpm); rotateHighlighted = QPixmap(hl_sym_delta_plus_xpm); return; } if (which == "sym_delta_minus") { originalRegular = QPixmap(sym_delta_minus_xpm); rotateRegular = QPixmap(sym_delta_minus_xpm); originalHighlighted = QPixmap(hl_sym_delta_minus_xpm); rotateHighlighted = QPixmap(hl_sym_delta_minus_xpm); return; } if (which == "sym_2e") { originalRegular = QPixmap(sym_2e_xpm); rotateRegular = QPixmap(sym_2e_xpm); originalHighlighted = QPixmap(hl_sym_2e_xpm); rotateHighlighted = QPixmap(hl_sym_2e_xpm); return; } if (which == "sym_1e") { originalRegular = QPixmap(sym_1e_xpm); rotateRegular = QPixmap(sym_1e_xpm); originalHighlighted = QPixmap(hl_sym_1e_xpm); rotateHighlighted = QPixmap(hl_sym_1e_xpm); return; } if (which == "p_orbital") { originalRegular = QPixmap(p_orbital_xpm); rotateRegular = QPixmap(p_orbital_xpm); originalHighlighted = QPixmap(hl_p_orbital_xpm); rotateHighlighted = QPixmap(hl_p_orbital_xpm); return; } if (which == "bead") { originalRegular = QPixmap(bead_xpm); rotateRegular = QPixmap(bead_xpm); originalHighlighted = QPixmap(hl_bead_xpm); rotateHighlighted = QPixmap(hl_bead_xpm); return; } } void Symbol::SetRotate(double d) { rotation = d; // if text symbol, don't rotate if (which == QString("sym_delta_plus")) return; if (which == QString("sym_delta_minus")) return; if (which == QString("sym_minus")) return; if (which == QString("p_orbital")) return; if (which == QString("p_double_orbital")) return; if (which == QString("bead")) return; // rotate symbol QTransform rm; rm.rotate(d); rotateRegular = originalRegular.transformed(rm); rotateHighlighted = originalHighlighted.transformed(rm); } QString Symbol::ToXML(QString xml_id) { QString s, n1; // begin symbol s.append("\n"); // write Start s.append(""); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\n"); // write symbol code s.append(""); s.append(which); s.append("\n"); // write color s.append(""); n1.setNum(color.red()); s.append(n1); s.append(" "); n1.setNum(color.green()); s.append(n1); s.append(" "); n1.setNum(color.blue()); s.append(n1); s.append("\n"); // rotate and scale s.append(""); n1.setNum(rotation); s.append(n1); s.append("\n"); s.append(""); n1.setNum(scale); s.append(n1); s.append("\n"); // end symbol s.append("\n"); return s; } // set Symbol from XDrawChem-format XML void Symbol::FromXML(QString xml_tag) { int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 8; SetStartFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf("") + 9; i2 = xml_tag.indexOf(""); SetSymbol(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 8; SetColorFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf("") + 8; if (i1 >= 0) { i2 = xml_tag.indexOf(""); rotation = xml_tag.mid(i1, i2 - i1).toDouble(); } i1 = xml_tag.indexOf("") + 7; if (i1 >= 0) { i2 = xml_tag.indexOf(""); scale = xml_tag.mid(i1, i2 - i1).toDouble(); } } void Symbol::Render() { QPoint p1 = start->toQPoint(); QPoint p11, p22; if (which == "newman") { // generate on the fly if (highlighted) { m_renderer->drawCircle(QPoint(p1.x() - 12, p1.y() - 12), 12, QColor(0, 0, 0)); m_renderer->drawLine(p1, QPoint(p1.x(), p1.y() - 12), 1, QColor(255, 255, 255)); m_renderer->drawLine(p1, QPoint(p1.x() - 10, p1.y() + 6), 1, QColor(255, 255, 255)); m_renderer->drawLine(p1, QPoint(p1.x() + 10, p1.y() + 6), 1, QColor(255, 255, 255)); } else { m_renderer->drawCircle(QPoint(p1.x() - 12, p1.y() - 12), 12, QColor(255, 255, 255)); m_renderer->drawLine(p1, QPoint(p1.x(), p1.y() - 12), 1, QColor(0, 0, 0)); m_renderer->drawLine(p1, QPoint(p1.x() - 10, p1.y() + 6), 1, QColor(0, 0, 0)); m_renderer->drawLine(p1, QPoint(p1.x() + 10, p1.y() + 6), 1, QColor(0, 0, 0)); } return; } if (which == "sym_ring_up") { // generate on the fly if (highlighted) { m_renderer->drawFillBox(QPoint(p1.x() - 5, p1.y() - 5), QPoint(p1.x() + 5, p1.y() + 5), QColor(0, 0, 0)); m_renderer->drawCircle(QPoint(p1.x() - 4, p1.y() - 4), 4, QColor(255, 255, 255)); } else { m_renderer->drawCircle(QPoint(p1.x() - 4, p1.y() - 4), 4, QColor(0, 0, 0)); } return; } if (which == "p_orbital") { // generate on the fly qDebug() << "p_orbital " << rotation; if (!highlighted) { if (rotation == 180.0) { QPoint ce = QPoint(p1.x(), p1.y() - 10); QPainterPath pp; double d = 5.0; pp.arcTo(ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, 2880); m_renderer->drawPolyline(pp, color); ce.setX(p1.x() - 5); m_renderer->drawLine(p1, ce, 1, color); ce.setX(p1.x() + 5); m_renderer->drawLine(p1, ce, 1, color); } if (rotation == 0.0) { /* QPoint ce = QPoint( p1.x(), p1.y() + 10 ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, -2880 ); m_renderer->drawPolyline( pa, color ); ce.setX( p1.x() - 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce.setX( p1.x() + 5 ); m_renderer->drawLine( p1, ce, 1, color );*/ } if (rotation == 90.0) { /* QPoint ce = QPoint( p1.x() - 10, p1.y() ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, 2880 ); m_renderer->drawPolyline( pa, color ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, color );*/ } if (rotation == -90.0) { /* QPoint ce = QPoint( p1.x() + 10, p1.y() ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, -2880 ); m_renderer->drawPolyline( pa, color ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, color );*/ } } else { if (rotation == 180.0) { /* QPoint ce = QPoint( p1.x(), p1.y() - 10 ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, 2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setX( p1.x() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setX( p1.x() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) );*/ } if (rotation == 0.0) { /* QPoint ce = QPoint( p1.x(), p1.y() + 10 ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, -2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setX( p1.x() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setX( p1.x() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) );*/ } if (rotation == 90.0) { /* QPoint ce = QPoint( p1.x() - 10, p1.y() ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, 2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) );*/ } if (rotation == -90.0) { /* QPoint ce = QPoint( p1.x() + 10, p1.y() ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, -2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) );*/ } } return; } if (which == "p_double_orbital") { // generate on the fly if (highlighted) { if (fabs(rotation) == 90.0) { /* QPoint ce = QPoint( p1.x() - 10, p1.y() ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, 2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce = QPoint( p1.x() + 10, p1.y() ); pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, -2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) );*/ } else { /* QPoint ce = QPoint( p1.x(), p1.y() - 10 ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, 2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setX( p1.x() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setX( p1.x() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce = QPoint( p1.x(), p1.y() + 10 ); pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, -2880 ); m_renderer->drawPolyline( pa, QColor( 255, 0, 0 ) ); ce.setX( p1.x() - 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) ); ce.setX( p1.x() + 5 ); m_renderer->drawLine( p1, ce, 1, QColor( 255, 0, 0 ) );*/ } } else { if (fabs(rotation) == 90.0) { /* QPoint ce = QPoint( p1.x() - 10, p1.y() ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, 2880 ); m_renderer->drawPolyline( pa, color ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce = QPoint( p1.x() + 10, p1.y() ); pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 1440, -2880 ); m_renderer->drawPolyline( pa, color ); ce.setY( p1.y() - 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce.setY( p1.y() + 5 ); m_renderer->drawLine( p1, ce, 1, color );*/ } else { /* QPoint ce = QPoint( p1.x(), p1.y() - 10 ); Q3PointArray pa; double d = 5.0; pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, 2880 ); m_renderer->drawPolyline( pa, color ); ce.setX( p1.x() - 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce.setX( p1.x() + 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce = QPoint( p1.x(), p1.y() + 10 ); pa.makeArc( ce.x() - d, ce.y() - d, 2 * d, 2 * d, 0, -2880 ); m_renderer->drawPolyline( pa, color ); ce.setX( p1.x() - 5 ); m_renderer->drawLine( p1, ce, 1, color ); ce.setX( p1.x() + 5 ); m_renderer->drawLine( p1, ce, 1, color );*/ } } return; } if (which == "sym_2e_line") { if (highlighted) { p11 = p1; p22 = p1; p11 += QPoint(-5, -5); p22 += QPoint(5, 5); m_renderer->drawFillBox(p11, p22, QColor(255, 0, 0)); } p11 = p1; p22 = p1; if (rotation == 0.0) { p11 += QPoint(-5, 10); p22 += QPoint(5, 10); } if (rotation == 90.0) { p11 += QPoint(-10, 5); p22 += QPoint(-10, -5); } if (rotation == 180.0) { p11 += QPoint(-5, -10); p22 += QPoint(5, -10); } if (rotation == -90.0) { p11 += QPoint(10, 5); p22 += QPoint(10, -5); } m_renderer->drawLine(p11, p22, 1, QColor(0, 0, 0)); return; } if (which != "p_orbital") { p1.setX(p1.x() + offset.x() - 8); p1.setY(p1.y() + offset.y() - 8); } else { p1.setX(p1.x() - 8); p1.setY(p1.y() - 20); } if (which == "bead") { p1.setY(p1.y() - 15); } if (highlighted) { m_renderer->drawPixmap(p1, rotateHighlighted); } else { m_renderer->drawPixmap(p1, rotateRegular); } } void Symbol::Edit() { int lsty; if (which == "sym_plus") lsty = SYM_PLUS; if (which == "sym_minus") lsty = SYM_MINUS; if (which == "sym_delta_plus") lsty = SYM_DELTA_PLUS; if (which == "sym_minus") lsty = SYM_DELTA_MINUS; if (which == "sym_2e") lsty = SYM_2E; if (which == "sym_1e") lsty = SYM_1E; if (which == "sym_ring_up") lsty = SYM_RING_UP; if (which == "p_orbital") lsty = SYM_P_ORBITAL; if (which == "p_double_orbital") lsty = SYM_P_DOUBLE; if (which == "bead") lsty = SYM_BEAD; BondEditDialog be(m_renderer, start, end, TYPE_SYMBOL, 0, 0, 0, lsty, color); if (!be.exec()) return; qDebug() << "change"; lsty = be.Style(); if (lsty == SYM_PLUS) SetSymbol("sym_plus"); if (lsty == SYM_MINUS) SetSymbol("sym_minus"); if (lsty == SYM_DELTA_PLUS) SetSymbol("sym_delta_plus"); if (lsty == SYM_DELTA_MINUS) SetSymbol("sym_delta_minus"); if (lsty == SYM_2E) SetSymbol("sym_2e"); if (lsty == SYM_1E) SetSymbol("sym_1e"); if (lsty == SYM_RING_UP) SetSymbol("sym_ring_up"); if (lsty == SYM_P_ORBITAL) SetSymbol("p_orbital"); if (lsty == SYM_P_DOUBLE) SetSymbol("p_double_orbital"); if (lsty == SYM_BEAD) SetSymbol("bead"); } int Symbol::Type() { return TYPE_SYMBOL; } bool Symbol::Find(DPoint *target) { if (start == target) return true; return false; } // Do not allow connections to this object. // Simplest way to do this, I think, is to disallow this function DPoint *Symbol::FindNearestPoint(DPoint *target, double &dist) { dist = 99999.0; return 0; } Drawable *Symbol::FindNearestObject(DPoint *target, double &dist) { if (WithinBounds(target)) dist = 0.01; else dist = 99999.0; return this; } bool Symbol::WithinBounds(DPoint *target) { DPoint tmp_pt; tmp_pt.x = start->x + offset.x(); tmp_pt.y = start->y + offset.y(); return tmp_pt.distanceTo(target) < 8.0; } void Symbol::setPoint(DPoint *s) { start = s; } QRect Symbol::BoundingBox() { if (highlighted == false) return QRect(QPoint(999, 999), QPoint(0, 0)); int top, bottom, left, right, swp; top = (int)start->y + offset.y() - 8; left = (int)start->x + offset.x() - 8; bottom = (int)start->y + offset.y() + 8; right = (int)start->x + offset.x() + 8; if (bottom < top) { swp = top; top = bottom; bottom = swp; } if (right < left) { swp = left; left = right; right = swp; } return QRect(QPoint(left, top), QPoint(right, bottom)); } bool Symbol::isWithinRect(QRect n, bool shiftdown) { DPoint tmp_pt; tmp_pt.x = start->x + offset.x(); tmp_pt.y = start->y + offset.y(); return n.contains(tmp_pt.toQPoint(), true); } xdrawchem-v1.11.0/xdrawchem/symbol.h000066400000000000000000000045441371466245600174270ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // symbol.h -- subclass of Drawable for symbols #ifndef SYMBOL_H #define SYMBOL_H #include "dpoint.h" #include "drawable.h" #include "render2d.h" class Symbol : public Drawable { public: Symbol(Render2D *, QObject *parent = 0); Symbol *CloneTo(Drawable *target = nullptr) const; void Render(); // draw this object void Edit(); int Type(); // return type of object bool Find(DPoint *); // does this ymbol contain this DPoint? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void setPoint(DPoint *); QRect BoundingBox(); bool isWithinRect(QRect, bool); bool WithinBounds(DPoint *); QString ToXML(QString); void FromXML(QString); void SetSymbol(QString); QString GetSymbol() { return which; } void SetOffset(QPoint d) { if ((d.x() == 0) && (d.y() == 0)) { need_offset = false; offset = d; } else { need_offset = true; offset = d; } } QPoint GetOffset() { return offset; } void SetRotate(double); double GetRotate() { return rotation; } private: // Renderer Render2D *m_renderer; // Pixmap of original and rotated, regular and highlighted symbol QPixmap originalRegular; QPixmap originalHighlighted; QPixmap rotateRegular; QPixmap rotateHighlighted; // Offset (if needed -- to avoid label or bond) bool need_offset; QPoint offset; // Rotation (if needed -- if not below or on point) double rotation; // scale (if needed) double scale; }; #endif xdrawchem-v1.11.0/xdrawchem/symbol_xpm.h000066400000000000000000000347521371466245600203170ustar00rootroot00000000000000// symbol_xpm.h holds all the images used as Symbol. /* XPM */ static const char *p_double_xpm[] = { "16 30 3 1", " g None", ". g None", "+ g #000000", "................", "....+++++++.....", "...++.....++....", "..++.......++...", "..+.........+...", "..+.........+...", "..++.......++...", "...+.......+....", "...++.....++....", "....++...++.....", ".....+...+......", ".....++.++......", "......+.+.......", "......+++.......", ".......+........", ".......+........", "......+++.......", "......+.+.......", ".....++.++......", ".....+...+......", "....++...++.....", "...++.....++....", "...+.......+....", "..++.......++...", "..+.........+...", "..+.........+...", "..++.......++...", "...++.....++....", "....+++++++.....", "................"}; /* XPM */ static const char *p_orbital_xpm[] = { "16 20 3 1", " g None", ". g None", "+ g #000000", "................", "....+++++++.....", "...++.....++....", "..++.......++...", "..+.........+...", "..+.........+...", "..+.........+...", "..+.........+...", "..+.........+...", "..++.......++...", "...+.......+....", "...++.....++....", "....++...++.....", ".....+...+......", ".....++.++......", "......+.+.......", "......+++.......", ".......+........", ".......+........", "................"}; /* XPM */ static const char *sym_antibody[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "...........+....", "..........+..+..", ".........+..+...", "........+..+....", ".......+..+.....", ".++++++..+......", "................", ".++++++..+......", ".......+..+.....", "........+..+....", ".........+..+...", "..........+..+..", "...........+....", "................", "................"}; /* XPM */ static const char *sym_delta_plus_xpm[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "................", "................", "..+++...........", "..+..+..........", "...+............", "....+......+....", "..++++.....+....", ".+...++....+....", ".+....+.+++++++.", ".+....+....+....", ".++...+....+....", "..++++.....+....", "................", "................", "................"}; /* XPM */ static const char *sym_delta_minus_xpm[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "................", "................", "..+++...........", "..+..+..........", "...+............", "....+...........", "..++++..........", ".+...++.........", ".+....+.+++++++.", ".+....+.........", ".++...+.........", "..++++..........", "................", "................", "................"}; /* XPM */ static const char *sym_1e_xpm[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "......+++.......", ".....+++++......", ".....+++++......", ".....+++++......", "......+++.......", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................"}; /* XPM */ static const char *sym_2e_xpm[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "...+++....+++...", "..+++++..+++++..", "..+++++..+++++..", "..+++++..+++++..", "...+++....+++...", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................"}; static const char *sym_2e_line_xpm[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "................", "................", "..++++++++++++..", "................", "................", "................", "......+++.......", ".....+...+......", "....+.....+.....", "....++++++......", ".....+..........", "......+++.......", "................", "................", "................"}; static const char *sym_plus_xpm[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "................", "................", ".......+........", ".......+........", ".......+........", "....+++++++.....", ".......+........", ".......+........", ".......+........", "................", "................", "................", "................", "................", "................"}; static const char *sym_minus_xpm[] = { "16 16 3 1", " g None", ". g None", "+ g #000000", "................", "................", "................", "................", "................", "................", "....+++++++.....", "................", "................", "................", "................", "................", "................", "................", "................", "................"}; static const char *sym_ring_up_xpm[] = { "16 16 8 1", " g None", ". g None", "+ g #000000", "@ g #F4F4F4", "# g #C3C3C3", "$ g #8E8E8E", "% g #525252", "& g #0E0E0E", "................", "........+.......", "........+.......", "........+.......", "........+.......", ".....@#$+#@.....", ".....#%&&%#.....", ".....$&++&$.....", ".....$&++&$.....", ".....#%&&%#.....", ".....+#$$#+.....", "....+......+....", "...+........+...", "..+..........+..", ".+............+.", "................"}; // highlighted /* XPM */ static const char *hl_sym_delta_plus_xpm[] = { "16 16 3 1", " g None", ". g #000000", "+ g #FFFFFF", "................", "................", "................", "..+++...........", "..+..+..........", "...+............", "....+......+....", "..++++.....+....", ".+...++....+....", ".+....+.+++++++.", ".+....+....+....", ".++...+....+....", "..++++.....+....", "................", "................", "................"}; /* XPM */ static const char *hl_sym_delta_minus_xpm[] = { "16 16 3 1", " g None", ". g #000000", "+ g #FFFFFF", "................", "................", "................", "..+++...........", "..+..+..........", "...+............", "....+...........", "..++++..........", ".+...++.........", ".+....+.+++++++.", ".+....+.........", ".++...+.........", "..++++..........", "................", "................", "................"}; /* XPM */ static const char *hl_sym_1e_xpm[] = { "16 16 3 1", " g None", ". g #000000", "+ g #FFFFFF", "................", "......+++.......", ".....+++++......", ".....+++++......", ".....+++++......", "......+++.......", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................"}; static const char *hl_sym_2e_xpm[] = { "16 16 3 1", " g None", ". g #000000", "+ g #FFFFFF", "................", "...+++....+++...", "..+++++..+++++..", "..+++++..+++++..", "..+++++..+++++..", "...+++....+++...", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................"}; static const char *hl_sym_plus_xpm[] = { "16 16 3 1", " g None", ". g #000000", "+ g #FFFFFF", "................", "................", "................", ".......+........", ".......+........", ".......+........", "....+++++++.....", ".......+........", ".......+........", ".......+........", "................", "................", "................", "................", "................", "................"}; static const char *hl_sym_minus_xpm[] = { "16 16 3 1", " g None", ". g #000000", "+ g #FFFFFF", "................", "................", "................", "................", "................", "................", "....+++++++.....", "................", "................", "................", "................", "................", "................", "................", "................", "................"}; /* XPM */ static const char *hl_p_orbital_xpm[] = { "16 20 3 1", " g None", "+ g #FFFFFF", ". g #000000", "................", "....+++++++.....", "...++.....++....", "..++.......++...", "..+.........+...", "..+.........+...", "..+.........+...", "..+.........+...", "..+.........+...", "..++.......++...", "...+.......+....", "...++.....++....", "....++...++.....", ".....+...+......", ".....++.++......", "......+.+.......", "......+++.......", ".......+........", ".......+........", "................"}; /* XPM */ static const char *bead_xpm[] = { /* width height ncolors chars_per_pixel */ "20 20 107 2", /* colors */ " c #B1B1B1", " . c #AFAFAF", " X c #ADADAD", " o c #ABABAB", " O c #A9A9A9", " + c #A7A7A7", " @ c #A1A1A1", " # c #9F9F9F", " $ c #9B9B9B", " % c #999999", " & c #979797", " * c #959595", " = c #919191", " - c #8F8F8F", " ; c #8B8B8B", " : c #898989", " > c #878787", " , c #858585", " < c #838383", " 1 c #7F7F7F", " 2 c #777777", " 3 c #737373", " 4 c #717171", " 5 c #6F6F6F", " 6 c #6D6D6D", " 7 c #676767", " 8 c #5B5B5B", " 9 c #595959", " 0 c #F8F8F8", " q c #EEEEEE", " w c #E6E6E6", " e c #E4E4E4", " r c #E2E2E2", " t c #E0E0E0", " y c #DEDEDE", " u c #DCDCDC", " i c #DADADA", " p c #D8D8D8", " a c #D6D6D6", " s c #D4D4D4", " d c #D2D2D2", " f c #CECECE", " g c #CACACA", " h c #C8C8C8", " j c #C6C6C6", " k c #C4C4C4", " l c #C2C2C2", " z c #BEBEBE", " x c #BABABA", " c c #B8B8B8", " v c #B6B6B6", " b c #B4B4B4", " n c #B2B2B2", " m c #B0B0B0", " M c #AEAEAE", " N c #ACACAC", " B c #AAAAAA", " V c #A8A8A8", " C c #A6A6A6", " Z c #A4A4A4", " A c #A2A2A2", " S c #A0A0A0", " D c #9A9A9A", " F c #969696", " G c #929292", " H c #909090", " J c #888888", " K c #868686", " L c #848484", " P c #828282", " I c #808080", " U c #7C7C7C", " Y c #787878", " T c #747474", " R c #6C6C6C", " E c #666666", " W c #606060", " Q c #5E5E5E", " ! c #585858", " ~ c #545454", " ^ c None", " / c #4C4C4C", " ( c #EDEDED", " ) c #E5E5E5", " _ c #E3E3E3", " ` c #E1E1E1", " ' c #DFDFDF", " ] c #DBDBDB", " [ c #D9D9D9", " { c #D7D7D7", " } c #D5D5D5", " | c #D3D3D3", ". c #D1D1D1", ".. c #CFCFCF", ".X c #CDCDCD", ".o c #CBCBCB", ".O c #C9C9C9", ".+ c #C7C7C7", ".@ c #C5C5C5", ".# c #C3C3C3", ".$ c #C1C1C1", ".% c #BFBFBF", ".& c #BDBDBD", ".* c #BBBBBB", ".= c #B7B7B7", ".- c #B5B5B5", ".; c #B3B3B3", /* pixels */ " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ O X B A & < ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^.* k.@ l.& v X @ = Y ^ ^ ^ ^ ^", " ^ ^ ^ ^.O. d. .X h.$ c M @ H 2 ^ ^ ^ ^", " ^ ^ ^.X { i i p s f.+.%.- B $ : 6 ^ ^ ^", " ^ ^.@ [ ' t ' u p d.o k x . A G U ~ ^ ^", " ^ ^ s ' _ _ r t ] s f j.&.; C & L 7 ^ ^", " ^ ^ i r ) ) ( ^ 0 p...+ z b V D J 5 ^ ^", " ^ k u _ ) w ^ ^ ^ y f.+ z b V D : 4 / ^", " ^.@ ] ` _ e ^ ^ ^ i.X.@.&.; + % J 4 / ^", " ^.% { y t t _ q t d g.# x m Z F , 6 / ^", " ^ ^. [ u u i { |.X.+.% v N S G I E ^ ^", " ^ ^ j d a a } d f h l x + D ; Y 8 ^ ^", " ^ ^ n.+.X.. f.o.+ l.* b B # G P R / ^ ^", " ^ ^ ^.-.$.@.@.#.% x.; o @ F > T ! ^ ^ ^", " ^ ^ ^ ^ X v c.= b . V S * J 2 Q ^ ^ ^ ^", " ^ ^ ^ ^ ^ D Z C Z # % - < 3 9 ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ L : K 1 3 W ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^"}; static const char *hl_bead_xpm[] = { /* width height ncolors chars_per_pixel */ "20 20 107 2", /* colors */ " c #B1B1B1", " . c #AFAFAF", " X c #ADADAD", " o c #ABABAB", " O c #A9A9A9", " + c #A7A7A7", " @ c #A1A1A1", " # c #9F9F9F", " $ c #9B9B9B", " % c #999999", " & c #979797", " * c #959595", " = c #919191", " - c #8F8F8F", " ; c #8B8B8B", " : c #898989", " > c #878787", " , c #858585", " < c #838383", " 1 c #7F7F7F", " 2 c #777777", " 3 c #737373", " 4 c #717171", " 5 c #6F6F6F", " 6 c #6D6D6D", " 7 c #676767", " 8 c #5B5B5B", " 9 c #595959", " 0 c #F8F8F8", " q c #EEEEEE", " w c #E6E6E6", " e c #E4E4E4", " r c #E2E2E2", " t c #E0E0E0", " y c #DEDEDE", " u c #DCDCDC", " i c #DADADA", " p c #D8D8D8", " a c #D6D6D6", " s c #D4D4D4", " d c #D2D2D2", " f c #CECECE", " g c #CACACA", " h c #C8C8C8", " j c #C6C6C6", " k c #C4C4C4", " l c #C2C2C2", " z c #BEBEBE", " x c #BABABA", " c c #B8B8B8", " v c #B6B6B6", " b c #B4B4B4", " n c #B2B2B2", " m c #B0B0B0", " M c #AEAEAE", " N c #ACACAC", " B c #AAAAAA", " V c #A8A8A8", " C c #A6A6A6", " Z c #A4A4A4", " A c #A2A2A2", " S c #A0A0A0", " D c #9A9A9A", " F c #969696", " G c #929292", " H c #909090", " J c #888888", " K c #868686", " L c #848484", " P c #828282", " I c #808080", " U c #7C7C7C", " Y c #787878", " T c #747474", " R c #6C6C6C", " E c #666666", " W c #606060", " Q c #5E5E5E", " ! c #585858", " ~ c #545454", " ^ c #000000", " / c #4C4C4C", " ( c #EDEDED", " ) c #E5E5E5", " _ c #E3E3E3", " ` c #E1E1E1", " ' c #DFDFDF", " ] c #DBDBDB", " [ c #D9D9D9", " { c #D7D7D7", " } c #D5D5D5", " | c #D3D3D3", ". c #D1D1D1", ".. c #CFCFCF", ".X c #CDCDCD", ".o c #CBCBCB", ".O c #C9C9C9", ".+ c #C7C7C7", ".@ c #C5C5C5", ".# c #C3C3C3", ".$ c #C1C1C1", ".% c #BFBFBF", ".& c #BDBDBD", ".* c #BBBBBB", ".= c #B7B7B7", ".- c #B5B5B5", ".; c #B3B3B3", /* pixels */ " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ O X B A & < ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^.* k.@ l.& v X @ = Y ^ ^ ^ ^ ^", " ^ ^ ^ ^.O. d. .X h.$ c M @ H 2 ^ ^ ^ ^", " ^ ^ ^.X { i i p s f.+.%.- B $ : 6 ^ ^ ^", " ^ ^.@ [ ' t ' u p d.o k x . A G U ~ ^ ^", " ^ ^ s ' _ _ r t ] s f j.&.; C & L 7 ^ ^", " ^ ^ i r ) ) ( ^ 0 p...+ z b V D J 5 ^ ^", " ^ k u _ ) w ^ ^ ^ y f.+ z b V D : 4 / ^", " ^.@ ] ` _ e ^ ^ ^ i.X.@.&.; + % J 4 / ^", " ^.% { y t t _ q t d g.# x m Z F , 6 / ^", " ^ ^. [ u u i { |.X.+.% v N S G I E ^ ^", " ^ ^ j d a a } d f h l x + D ; Y 8 ^ ^", " ^ ^ n.+.X.. f.o.+ l.* b B # G P R / ^ ^", " ^ ^ ^.-.$.@.@.#.% x.; o @ F > T ! ^ ^ ^", " ^ ^ ^ ^ X v c.= b . V S * J 2 Q ^ ^ ^ ^", " ^ ^ ^ ^ ^ D Z C Z # % - < 3 9 ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ L : K 1 3 W ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^", " ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^"}; xdrawchem-v1.11.0/xdrawchem/text.cpp000066400000000000000000001127211371466245600174360ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // text.cpp - Text's implementation of functions // (obsolete note!) // NOTE ABOUT TEXTMASK: + marks superscript, - marks subscript // B marks bold, I marks italic, U marks underline #include #include "defs.h" #include "drawable.h" #include "render2d.h" #include "text.h" // lastflag settings Text::Text(Render2D *r1, QObject *parent) : Drawable(parent) { r = r1; highlighted = false; shiftdown = false; cursor = 0; selectMin = -1; selectMax = -1; molecule = 0; tjustify = TEXT_AUTO; whichside = 1; DataType = TEXT_DATA_NORMAL; shape = 0; shapewidth = -1; shapeheight = -1; oshapewidth = -1; oshapeheight = -1; drawBorder = false; drawFill = false; borderColor = QColor(0, 0, 0); fillColor = QColor(0, 255, 255); } Text *Text::CloneTo(Drawable *target) const { if (!target) target = new Text(r, parent()); Text *t = static_cast(this->Drawable::CloneTo(target)); t->displayText = displayText; t->displayTextMask = displayTextMask; t->whichside = whichside; t->font = font; t->justify = justify; t->tjustify = tjustify; t->BBox = BBox; t->cursor = cursor; t->selectMin = selectMin; t->selectMax = selectMax; t->shiftdown = shiftdown; t->DataType = DataType; t->shape = shape; t->drawBorder = drawBorder; t->drawFill = drawFill; t->borderColor = borderColor; t->fillColor = fillColor; t->shapewidth = shapewidth; t->shapeheight = shapeheight; t->oshapewidth = oshapewidth; t->oshapeheight = oshapeheight; // t->molecule = molecule; return t; } QString Text::ToXML(QString xml_id) { QString s, n1; int fsize; fsize = font.pointSize(); if (fsize < 1) fsize = font.pixelSize(); // begin text s.append("\n"); // write Start s.append(""); n1.setNum(start->x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\n"); // write text s.append(""); s.append(start->element); s.append("\n"); // write textmask s.append(""); s.append(displayText); s.append("\n"); // shape info s.append(""); n1.setNum(shape); s.append(n1); s.append("\n"); // border info s.append(""); if (drawBorder == true) s.append("true"); else s.append("false"); s.append("\n"); n1.setNum(borderColor.red()); s.append(n1); s.append(" "); n1.setNum(borderColor.green()); s.append(n1); s.append(" "); n1.setNum(borderColor.blue()); s.append(n1); s.append("\n"); // fill info s.append(""); if (drawFill == true) s.append("true"); else s.append("false"); s.append("\n"); n1.setNum(fillColor.red()); s.append(n1); s.append(" "); n1.setNum(fillColor.green()); s.append(n1); s.append(" "); n1.setNum(fillColor.blue()); s.append(n1); s.append("\n"); // shape dimensions s.append(""); n1.setNum(shapewidth); s.append(n1); s.append(" "); n1.setNum(shapeheight); s.append(n1); s.append(" "); n1.setNum(oshapewidth); s.append(n1); s.append(" "); n1.setNum(oshapeheight); s.append(n1); s.append("\n"); // end text s.append("\n"); return s; } QString Text::ToCDXML(QString xml_id) { QString s, n1; // begin text s.append("x); s.append(n1); s.append(" "); n1.setNum(start->y); s.append(n1); s.append("\">"); s.append(start->element); s.append("\n"); return s; } void Text::FromXML(QString xml_tag) { int i1, i2; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 8; SetStartFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 8; SetColorFromXML(xml_tag.mid(i1, i2 - i1)); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 7; SetFontFromXML(xml_tag.mid(i1, i2 - i1)); } i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 13; SetTextstringFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 13; SetRichstringFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf("") + 11; SetTextmaskFromXML(xml_tag.mid(i1, i2 - i1)); i1 = xml_tag.indexOf(""); if (i1 > 0) { i2 = xml_tag.indexOf(""); shape = xml_tag.mid(i1 + 7, i2 - i1 - 7).toInt(); qDebug() << "shape:" << shape; } i1 = xml_tag.indexOf(""); if (i1 > 0) { i2 = xml_tag.indexOf(""); qDebug() << "border:" << xml_tag.mid(i1 + 8, 4); if (xml_tag.mid(i1 + 8, 4) == "true") drawBorder = true; else drawBorder = false; } i1 = xml_tag.indexOf(""); if (i1 > 0) { i2 = xml_tag.indexOf(""); qDebug() << "fill:" << xml_tag.mid(i1 + 6, 4); if (xml_tag.mid(i1 + 6, 4) == "true") drawFill = true; else drawFill = false; } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 14; SetBorderColorFromXML(xml_tag.mid(i1, i2 - i1)); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 12; SetFillColorFromXML(xml_tag.mid(i1, i2 - i1)); } i1 = xml_tag.indexOf(""); if (i1 >= 0) { i2 = xml_tag.indexOf("") + 16; SetShapeGeometryFromXML(xml_tag.mid(i1, i2 - i1)); } } void Text::SetBorderColorFromXML(QString xml_tag) { qDebug() << "SetBColorFromXML:" << xml_tag; int i1, i2; int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 13); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> d1 >> d2 >> d3; borderColor = QColor(d1, d2, d3); } void Text::SetFillColorFromXML(QString xml_tag) { qDebug() << "SetFColorFromXML:" << xml_tag; int i1, i2; int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 11); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> d1 >> d2 >> d3; fillColor = QColor(d1, d2, d3); } void Text::SetShapeGeometryFromXML(QString xml_tag) { qDebug() << "SetSGFromXML:" << xml_tag; int i1, i2; int d1, d2, d3, d4; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 15); QTextStream ts(&xml_tag, QIODevice::ReadOnly); ts >> d1 >> d2 >> d3 >> d4; shapewidth = d1; shapeheight = d2; oshapewidth = d3; oshapeheight = d4; } // convert XML tag to QFont and set current void Text::SetFontFromXML(QString xml_tag) { qDebug() << "SetFontFromXML:" << xml_tag; int i1, i2; // int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 6); i1 = xml_tag.indexOf("#"); qDebug() << xml_tag.mid(0, i1) << "*" << xml_tag.mid(i1 + 1); font = QFont(xml_tag.mid(0, i1), xml_tag.mid(i1 + 1).toInt()); } // get Text::text from tag void Text::SetTextstringFromXML(QString xml_tag) { qDebug() << "SetTextstringFromXML:" << xml_tag; int i1, i2; // int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 12); if (start != 0) start->element = xml_tag; } // get Text::displayText from tag void Text::SetRichstringFromXML(QString xml_tag) { qDebug() << "SetRichstringFromXML:" << xml_tag; int i1, i2; // int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 12); if (start != 0) displayText = xml_tag; } // get Text::textmask from tag void Text::SetTextmaskFromXML(QString xml_tag) { // not used!!! either or tag used to set display // qDebug() << "SetTextmaskFromXML:" << xml_tag ; // obsolete tag! silently update... // note that user may need to reformat text // displayText = start->element; // displayText.replace("\n", "

    "); /* int i1, i2; //int d1, d2, d3; i1 = xml_tag.indexOf(""); i2 = xml_tag.indexOf(""); xml_tag.remove(i2, 999); xml_tag.remove(i1, 10); if (start != 0) start->elementmask = xml_tag; */ } bool Text::isWithinRect(QRect n, bool shiftdown) { if (DPointInRect(start, n)) highlighted = true; else highlighted = false; return highlighted; } void Text::Render() { qDebug() << "Text::Render begin"; // r->drawString( "foobar", start->toQPoint(), QColor(0,0,0), QFont() ); // return; qDebug() << "displayText.length():" << displayText.length(); bool superFlag = false, subFlag = false; QFont currentFont = font; QColor currentColor = color; if (r->getFontKludge()) { currentFont.setPointSize(currentFont.pointSize() * 2); qDebug() << "fontkludge (top)"; } QStringList parseList, renderList, lineWidths; int lineheight = 0, linewidth = 0, textheight = 0, textwidth = 0; int cp1, lp1, lp2; QString n1, currentElement = QString(); bool flag1 = false; for (cp1 = 0; cp1 < displayText.length(); cp1++) { flag1 = true; if (displayText[cp1] == '<') { parseList.append(currentElement); currentElement = "<"; flag1 = false; } if (displayText[cp1] == '>') { currentElement.append(displayText[cp1]); if (!currentElement.contains("!DOCTYPE")) { parseList.append(currentElement); } currentElement = ""; flag1 = false; } if (flag1) { currentElement.append(displayText[cp1]); } } // just in case there were no tags... if (currentElement.length() > 0) parseList.append(currentElement); // mock render to determine width and height QRect b1; int maxfont = 0, thisfont; bool styletag = false; for (QStringList::Iterator it = parseList.begin(); it != parseList.end(); ++it) { currentElement = *it; // qDebug() << "currentElement:" << currentElement; // dump the style tag! if (currentElement == "") { styletag = false; continue; } if (styletag) continue; if (currentElement.left(6) == "") continue; if (currentElement == "") continue; if (currentElement == "") continue; if (currentElement == "") continue; if (currentElement == "") continue; if (currentElement == "") continue; if (currentElement.left(3) == "

    ") { // this likely undoes a super/sub flag if (superFlag == true) superFlag = false; if (subFlag == true) subFlag = false; renderList.append(currentElement); continue; } currentElement.replace("<", "<"); currentElement.replace(">", ">"); renderList.append(currentElement); if (currentElement == "

    ") { n1.setNum(linewidth); lineWidths.append(n1); if (linewidth > textwidth) textwidth = linewidth; textheight += lineheight; linewidth = 0; lineheight = 0; continue; } if (currentElement.left(6) == " 0) { lp2 = currentElement.indexOf("font-family"); lp1 = currentElement.indexOf(":", lp2); lp2 = currentElement.indexOf(";", lp1); currentFont.setFamily(currentElement.mid(lp1 + 1, lp2 - lp1 - 1)); } if (currentElement.contains("font-size") > 0) { lp2 = currentElement.indexOf("font-size"); lp1 = currentElement.indexOf(":", lp2); lp2 = currentElement.indexOf("pt", lp1); thisfont = currentElement.mid(lp1 + 1, lp2 - lp1 - 1).toInt(); currentFont.setPointSize(thisfont); if (thisfont > maxfont) maxfont = thisfont; if (r->getFontKludge() == true) { currentFont.setPointSize(currentFont.pointSize() * 2); qDebug() << "fontkludge"; } qDebug() << "points: " << currentFont.pointSize(); } if (currentElement.contains("font-weight") > 0) { currentFont.setBold(true); } if (currentElement.contains("italic") > 0) { currentFont.setItalic(true); } if (currentElement.contains("underline") > 0) { currentFont.setUnderline(true); } if (currentElement.contains("super") > 0) { superFlag = true; } if (currentElement.contains("sub") > 0) { subFlag = true; } continue; } b1 = r->GetTextDimensions(currentElement, currentFont); if (b1.height() > lineheight) lineheight = b1.height(); linewidth += b1.width(); } // end for? if (lineheight > textheight) textheight = lineheight; if (linewidth > textwidth) textwidth = linewidth; qDebug() << displayText; qDebug() << "Text dimensions = " << textwidth << "," << textheight; // qDebug() << "Text check 1 ---"; int supersub, subx; QFont supersubfont; QColor drawcolor; if (highlighted) drawcolor = QColor(255, 0, 0); else drawcolor = color; QRect b(0, 0, textwidth, textheight); QPoint t = GetTopLeftPoint(); b.translate(t.x(), t.y()); // this guarantees that the text will not overlap other objects // original code r->drawFillBox(b.topLeft(), b.bottomRight(), r->getBGColor(), false, QColor(0, 0, 0), 1); // draw shape, if applicable QPoint shapetl, shapebr, textcenter; oshapewidth = b.width() + maxfont; oshapeheight = b.height() + maxfont; textcenter.setX(b.left() + (b.width() / 2)); textcenter.setY(b.top() + (b.height() / 2)); int lsw, lsh; if (shapewidth < 0) { lsw = oshapewidth; lsh = oshapeheight; } else { lsw = shapewidth; lsh = shapeheight; } if (shape > 0) { shapetl.setX(textcenter.x() - (lsw / 2)); shapebr.setX(textcenter.x() + (lsw / 2)); shapetl.setY(textcenter.y() - (lsh / 2)); shapebr.setY(textcenter.y() + (lsh / 2)); if (shape == TEXT_SHAPE_RECTANGLE) { if (drawFill) { r->drawFillBox(shapetl, shapebr, fillColor, drawBorder, borderColor, 0); } else { r->drawBox(shapetl, shapebr, borderColor); } } if (shape == TEXT_SHAPE_SQUARE) { if (drawFill) { r->drawFillBox(shapetl, shapebr, fillColor, drawBorder, borderColor, 0); } else { r->drawBox(shapetl, shapebr, borderColor); } } if (shape == TEXT_SHAPE_ELLIPSE) { r->drawEllipse(shapetl, shapebr, drawBorder, borderColor, drawFill, fillColor); } if (shape == TEXT_SHAPE_CIRCLE) { r->drawEllipse(shapetl, shapebr, drawBorder, borderColor, drawFill, fillColor); } } // right-align behavior is different for stand-alone text QTextStream dts(&displayTextMask, QIODevice::ReadOnly); QString displayLine; int in1 = 0; // displayLine = dts.readLine(); // in1 = r->GetStringWidth(displayLine, font); // qDebug() << b.width() << ":" << in1 ; // in1 = lineWidths[0].toInt(); in1 = b.width() - in1; // bool switchpos = false; QPoint curpos(t.x(), t.y() + r->GetTextHeight(font)); if ((tjustify == TEXT_RALIGN) && (justify == JUSTIFY_TOPLEFT)) curpos.setX(curpos.x() + in1 + 2); if ((tjustify == TEXT_CALIGN) && (justify == JUSTIFY_TOPLEFT)) curpos.setX(curpos.x() + (in1 / 2) + 2); bool smaller_font = false; QPoint startpos = curpos; // actual rendering section // qDebug() << "Text check 2 ---"; int lw1 = 1; r->resetTextOrigin(); foreach (currentElement, renderList) { if (currentElement == "") { superFlag = false, subFlag = false; continue; } if (currentElement == "

    ") { superFlag = false, subFlag = false; currentFont.setBold(false); currentFont.setItalic(false); currentFont.setUnderline(false); if (justify == JUSTIFY_CENTER) continue; r->resetTextOrigin(); // displayLine = dts.readLine(); // in1 = r->GetStringWidth(displayLine, font); // qDebug() << b.width() << ":" << in1 ; if (lw1 < lineWidths.size()) { in1 = lineWidths[lw1].toInt(); lw1++; in1 = b.width() - in1; curpos.setX(t.x()); if ((tjustify == TEXT_RALIGN) && (justify == JUSTIFY_TOPLEFT)) curpos.setX(curpos.x() + in1 + 2); if ((tjustify == TEXT_CALIGN) && (justify == JUSTIFY_TOPLEFT)) curpos.setX(curpos.x() + (in1 / 2) + 2); curpos.setY(curpos.y() + r->GetTextFullHeight(font)); } continue; } if (currentElement.left(6) == " 0) { lp2 = currentElement.indexOf("font-family"); lp1 = currentElement.indexOf(":", lp2); lp2 = currentElement.indexOf(";", lp1); currentFont.setFamily(currentElement.mid(lp1 + 1, lp2 - lp1 - 1)); } if (currentElement.contains("font-size") > 0) { lp2 = currentElement.indexOf("font-size"); lp1 = currentElement.indexOf(":", lp2); lp2 = currentElement.indexOf("pt", lp1); currentFont.setPointSize(currentElement.mid(lp1 + 1, lp2 - lp1 - 1).toInt()); if (r->getFontKludge() == true) { currentFont.setPointSize(currentFont.pointSize() * 2); qDebug() << "fontkludge"; } } currentFont.setBold(false); currentFont.setItalic(false); currentFont.setUnderline(false); if (currentElement.contains("font-weight") > 0) { currentFont.setBold(true); } if (currentElement.contains("italic") > 0) { currentFont.setItalic(true); } if (currentElement.contains("underline") > 0) { currentFont.setUnderline(true); } if (currentElement.contains("super") > 0) { superFlag = true; } if (currentElement.contains("sub") > 0) { subFlag = true; } currentColor = QColor(0, 0, 0); if (currentElement.contains("color") > 0) { lp2 = currentElement.indexOf("color"); lp1 = currentElement.indexOf(":", lp2); currentColor.setNamedColor(currentElement.mid(lp1 + 1, 7)); } continue; } supersub = r->GetTextHeight(currentFont) / 2; supersubfont = subscriptFont(currentFont); subx = r->GetTextHeight(supersubfont) / 2; if (highlighted) currentColor = QColor(255, 0, 0); if (superFlag) { r->drawString(currentElement, QPoint(curpos.x(), curpos.y() - supersub), currentColor, supersubfont); smaller_font = true; } if (subFlag) { r->drawString(currentElement, QPoint(curpos.x(), curpos.y() + subx), currentColor, supersubfont); smaller_font = true; } if (smaller_font == true) { curpos.setX(curpos.x() + r->GetStringWidth(currentElement, supersubfont)); } else { r->drawString(currentElement, curpos, currentColor, currentFont); curpos.setX(curpos.x() + r->GetStringWidth(currentElement, currentFont)); } smaller_font = false; } qDebug() << "Text::Render end"; } int Text::Type() { return TYPE_TEXT; } bool Text::Find(DPoint *target) { // if (start == target) return true; return false; } DPoint *Text::FindNearestPoint(DPoint *target, double &dist) { dist = 99999.0; return 0; } Drawable *Text::FindNearestObject(DPoint *target, double &dist) { if (WithinBounds(target)) dist = 0.01; else dist = 99999.0; return this; } void Text::setPoint(DPoint *s) { start = s; } bool Text::WithinBounds(DPoint *target) { QRect b = r->GetTextDimensions(start->element, font); QPoint t = GetTopLeftPoint(); b.translate(t.x(), t.y()); if ((target->x > b.left()) && (target->x < b.right()) && (target->y > b.top()) && (target->y < b.bottom())) return true; else return false; } QRect Text::BoundingBox() { if (highlighted == false) return QRect(QPoint(999, 999), QPoint(0, 0)); QTextDocument localtextdocument; localtextdocument.setHtml(start->element); QString tmpline = localtextdocument.toPlainText(); qInfo() << "Text::BoundingBox:" << start->element << "||" << tmpline; // QRect b = r->GetTextDimensions( start->element, font ); QRect b = r->GetTextDimensions(tmpline, font); QPoint t = GetTopLeftPoint(); b.translate(t.x(), t.y()); return b; } // return nearest center point to m (see ChemData::AutoLayout) QPoint Text::NearestCenter(QPoint m, int di, int &ns) { QRect b = r->GetTextDimensions(start->element, font); QPoint t = GetTopLeftPoint(); b.translate(t.x(), t.y()); QPoint c1, cmin; double dist = 9999.0, ndist; if (di == ARROW_VERTICAL) { c1.setX(b.left()); c1.setY(b.center().y()); ndist = DistanceBetween(m, c1); if (ndist < dist) { cmin = c1; dist = ndist; ns = TEXT_LEFT; } c1.setX(b.right()); c1.setY(b.center().y()); ndist = DistanceBetween(m, c1); if (ndist < dist) { cmin = c1; dist = ndist; ns = TEXT_RIGHT; } } else { // ARROW_HORIZONTAL c1.setX(b.center().x()); c1.setY(b.top()); ndist = DistanceBetween(m, c1); if (ndist < dist) { cmin = c1; dist = ndist; ns = TEXT_TOP; } c1.setX(b.center().x()); c1.setY(b.bottom()); ndist = DistanceBetween(m, c1); if (ndist < dist) { cmin = c1; dist = ndist; ns = TEXT_BOTTOM; } } return cmin; } void Text::DeleteKeyPressed() { qDebug() << "Delete key"; start->element.remove(cursor, 1); start->elementmask.remove(cursor, 1); } void Text::InsertCharacter(QKeyEvent *k1) { // if shift pressed, start new selection if (k1->modifiers() == Qt::ShiftModifier) { if (shiftdown == false) { shiftdown = true; selectMin = cursor; selectMax = cursor - 1; qDebug() << cursor << "-" << selectMin << "-" << selectMax; } else { shiftdown = true; } } else { shiftdown = false; } // if return pressed, add newline only if JUSTIFY_TOPLEFT (not a label) if ((k1->key() == Qt::Key_Return) && (justify == JUSTIFY_CENTER)) return; if (k1->key() == Qt::Key_Return) { qDebug() << "Return"; start->element.insert(cursor, (char)10); // start->element = text; start->elementmask.insert(cursor, (char)10); cursor++; return; } // if left or right arrow pressed with shift, make or extend new selection if ((k1->key() == Qt::Key_Left) && shiftdown) { qDebug() << cursor << "-" << selectMin << "-" << selectMax; if (selectMin > 0) { if (cursor > selectMin) selectMax--; else selectMin--; } if (cursor > 0) cursor--; return; } if ((k1->key() == Qt::Key_Right) && shiftdown) { qDebug() << cursor << "-" << selectMin << "-" << selectMax; if (selectMax < start->element.length()) { if (cursor <= selectMax) selectMin++; else selectMax++; } if (cursor < start->element.length()) cursor++; return; } // if Home or End pressed with shift, make or extend new selection if ((k1->key() == Qt::Key_Home) && shiftdown) { qDebug() << cursor << "-" << selectMin << "-" << selectMax; if (selectMin > 0) { if (cursor > selectMin) selectMax--; else selectMin = 0; } if (cursor > 0) cursor = 0; return; } if ((k1->key() == Qt::Key_End) && shiftdown) { qDebug() << cursor << "-" << selectMin << "-" << selectMax; if (selectMax < start->element.length()) { if (cursor <= selectMax) selectMin++; else selectMax = start->element.length(); } if (cursor < start->element.length()) cursor = start->element.length(); return; } // if left or right arrow pressed w/o shift, clear selection if (k1->key() == Qt::Key_Left) { if (cursor > 0) cursor--; selectMin = -1; selectMax = -1; return; } if (k1->key() == Qt::Key_Right) { if (cursor < start->element.length()) cursor++; selectMin = -1; selectMax = -1; return; } // if Home or End was pressed, go home or end if (k1->key() == Qt::Key_Home) { if (cursor > 0) cursor = 0; selectMin = -1; selectMax = -1; return; } if (k1->key() == Qt::Key_End) { if (cursor < start->element.length()) cursor = start->element.length(); selectMin = -1; selectMax = -1; return; } if (k1->key() == Qt::Key_Backspace) { if (cursor == 0) return; if ((selectMin >= 0) && (selectMax >= 1)) { // something selected start->element.remove(selectMin, selectMax - selectMin + 1); start->elementmask.remove(selectMin, selectMax - selectMin + 1); // start->element = text; cursor = selectMin; selectMin = -1, selectMax = -1; return; } start->element.remove(cursor - 1, 1); // start->element = text; start->elementmask.remove(cursor - 1, 1); cursor--; return; } // if key > 96 and not already handled, ignore (letters/numbers/space < 96) // note that this breaks international layouts and is probably not needed // if (k1->key() > 96) return; // // this is a more useful test in a Unicode world // qDebug() << "Key text:" << k1->text() << ":"; QChar kc1 = k1->text().at(0); if (kc1.isPrint() == false) return; // qDebug() << kc1 << "(key accepted)"; // regular letter/number pressed start->element.insert(cursor, k1->text()); // start->element = text; start->elementmask.insert(cursor, QChar(' ')); cursor++; } void Text::InsertString(QString pt) { start->element.insert(cursor, pt); pt.fill(' '); start->elementmask.insert(cursor, pt); cursor += pt.length(); } // Superscript selected text void Text::DoSuperscript() { if (selectMin < 0) return; for (int i = selectMin; i < selectMax + 1; i++) { if (start->elementmask[i] == ' ') { start->elementmask[i] = '+'; continue; } if (start->elementmask[i] == '+') { start->elementmask[i] = ' '; continue; } if (start->elementmask[i] == '-') { start->elementmask[i] = '+'; continue; } } } // Subscript selected text void Text::DoSubscript() { if (selectMin < 0) return; for (int i = selectMin; i < selectMax + 1; i++) { if (start->elementmask[i] == ' ') { start->elementmask[i] = '-'; continue; } if (start->elementmask[i] == '+') { start->elementmask[i] = '-'; continue; } if (start->elementmask[i] == '-') { start->elementmask[i] = ' '; continue; } } } // Bold selected text void Text::DoBold() { if (selectMin < 0) return; for (int i = selectMin; i < selectMax + 1; i++) { if (start->elementmask[i] == ' ') { start->elementmask[i] = 'B'; continue; } if (start->elementmask[i] == 'B') { start->elementmask[i] = ' '; continue; } } } // Italicize selected text void Text::DoItalic() { if (selectMin < 0) return; for (int i = selectMin; i < selectMax + 1; i++) { if (start->elementmask[i] == ' ') { start->elementmask[i] = 'I'; continue; } if (start->elementmask[i] == 'I') { start->elementmask[i] = ' '; continue; } } } // Underline selected text void Text::DoUnderline() { if (selectMin < 0) return; for (int i = selectMin; i < selectMax + 1; i++) { if (start->elementmask[i] == ' ') { start->elementmask[i] = 'U'; continue; } if (start->elementmask[i] == 'U') { start->elementmask[i] = ' '; continue; } } } // move cursor to target void Text::MoveCursor(DPoint *target) { selectMin = -1; selectMax = -1; double mindist = 99999.0, ldist; int newcur; DPoint *e = new DPoint; qDebug() << "Move"; if (WithinBounds(target) == false) return; QPoint t = GetTopLeftPoint(); int lx = t.x(), ly = t.y() + (r->GetTextFullHeight(font) / 2); for (int i = 0; i < start->element.length(); i++) { e->x = lx; e->y = ly; ldist = e->distanceTo(target); if (ldist < mindist) { mindist = ldist; newcur = i; } if (QChar(start->element[i]).digitValue() == 10) { lx = t.x(); ly = ly + r->GetTextFullHeight(font); } else { lx = lx + r->GetCharWidth(start->element[i], font); } } cursor = newcur; delete e; } // Select text between endpoints e1 and e2 void Text::Select(DPoint *e1, DPoint *e2) { if (WithinBounds(e1) == false) return; if (WithinBounds(e2) == false) return; qDebug() << "select"; double mindist = 99999.0, ldist; int newcur; int cr1 = 0, cr2 = 0; QPoint t; int i, lx, ly; DPoint *e = new DPoint; t = GetTopLeftPoint(); lx = t.x(); ly = t.y() + (r->GetTextFullHeight(font) / 2); for (i = 0; i < start->element.length(); i++) { e->x = lx; e->y = ly; ldist = e->distanceTo(e1); if (ldist < mindist) { mindist = ldist; newcur = i; } if (QChar(start->element[i]).digitValue() == 10) { cr1++; lx = t.x(); ly = ly + r->GetTextFullHeight(font); } else { lx = lx + r->GetCharWidth(start->element[i], font); } } selectMin = newcur; mindist = 99999.0; t = GetTopLeftPoint(); lx = t.x(); ly = t.y() + (r->GetTextFullHeight(font) / 2); for (i = 0; i < start->element.length(); i++) { e->x = lx; e->y = ly; ldist = e->distanceTo(e2); if (ldist < mindist) { mindist = ldist; newcur = i; } if (QChar(start->element[i]).digitValue() == 10) { cr2++; lx = t.x(); ly = ly + r->GetTextFullHeight(font); } else { lx = lx + r->GetCharWidth(start->element[i], font); } } selectMax = newcur; if (selectMin > selectMax) { int swp = selectMin; selectMin = selectMax; selectMax = swp - 1; } qDebug() << selectMin << " " << selectMax; delete e; } QPoint Text::GetTopLeftPoint() { bool leftcenter = true; if (justify == JUSTIFY_TOPLEFT) { return start->toQPoint(); } else { QPoint a; QRect b = r->GetTextDimensions(start->element, font); // center on first or last character. Try to guess what user intended // (a dangerous idea at best :) if ((start->element.left(1) == "H") && (start->element.length() > 1)) leftcenter = false; if ((start->element.left(1) == "+") && (start->element.length() > 1)) leftcenter = false; if ((start->element.left(1) == "-") && (start->element.length() > 1)) leftcenter = false; if (start->element.at(0).isNumber() == true) leftcenter = false; if (whichside == 2) leftcenter = false; if (tjustify == TEXT_LALIGN) leftcenter = true; if (tjustify == TEXT_CALIGN) leftcenter = true; if (tjustify == TEXT_RALIGN) leftcenter = false; if (leftcenter) { int lc = r->GetCharWidth(start->element.at(0), font); a.setX(qRound(start->x - lc / 2.0)); } else { int rc = r->GetCharWidth(start->element.at(start->element.length() - 1), font); a.setX(qRound(start->x - b.width() + rc / 2.0)); } a.setY(qRound(start->y - b.height() / 2.0)); return a; } } // position atom labels according to hindrance void Text::CheckAlignment(int alignside) { // 1 = left, 2 = right whichside = alignside; qDebug() << "whichside = " << whichside; } void Text::ForceAlignment(int alignside) { tjustify = alignside; } // find next smaller font for subscripts QFont Text::subscriptFont(QFont f_in) { QFont f_out = f_in; if (f_out.pointSize() > 1) f_out.setPointSize(f_out.pointSize() - 2); else f_out.setPixelSize(f_out.pixelSize() - 2); return f_out; } void Text::UpdateDisplayText() { return; // this function doesn't do anything now that we're using RichText // old code follows // use user string if justify chosen if (tjustify != TEXT_AUTO) { displayText = start->element; displayTextMask = start->elementmask; return; } // validate saved text, make sure format is 'appropriate' if (start->element == "MeO") start->element = "OMe"; // decide how to display the text string if (whichside == 1) { // cerr << "left hindered (normal) version" ; displayText = start->element; displayTextMask = start->elementmask; return; } // create right-aligned version. // cerr << "right hindered version" ; if (start->element == "OMe") { displayText = "MeO"; displayTextMask = " "; return; } displayText = start->element; displayTextMask = start->elementmask; } xdrawchem-v1.11.0/xdrawchem/text.h000066400000000000000000000134071371466245600171040ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // text.h -- subclass of Drawable for text/labels #ifndef TEXT_H #define TEXT_H #include "dpoint.h" #include "drawable.h" #include "render2d.h" #define TEXT_AUTO 0 #define TEXT_LALIGN 1 #define TEXT_CALIGN 2 #define TEXT_RALIGN 3 class Molecule; class Text : public Drawable { public: Text(Render2D *, QObject *parent = 0); Text *CloneTo(Drawable *target = nullptr) const; void Render(); // draw this object void setRenderer(Render2D *r1) { r = r1; } int Type(); // return type of object bool Find(DPoint *); // does this Text contain this DPoint? DPoint *FindNearestPoint(DPoint *, double &); Drawable *FindNearestObject(DPoint *, double &); void setPoint(DPoint *); int Justify() { return justify; } void setJustify(int a) { justify = a; } bool WithinBounds(DPoint *); bool isWithinRect(QRect, bool); void InsertCharacter(QKeyEvent *); void InsertString(QString); void DeleteKeyPressed(); QPoint GetTopLeftPoint(); // get real top left point, based on justify QPoint NearestCenter(QPoint, int, int &); void setText(QString nt1, QString nt2) { if (start != 0) { start->element = nt1; // element info (plain text) start->elementmask = nt2; // actual display text in underlying point! displayText = nt2; } } void setText(QString nt) { setText(nt, nt); } QString getText() { if (start != 0) return start->element; else return QString(); } // not just Text()! QString getRichText() { if (start != 0) return displayText; else return QString(); } /* void setTextMask( QString nm ) { // this function is (probably) obsolete. Use setText() instead. //if (start != 0) start->elementmask = nm; } */ QString getTextMask() { if (start != 0) return start->elementmask; else return QString(); } QFont subscriptFont(QFont); void setMolecule(Molecule *m1) { molecule = m1; } Molecule *getMolecule() { return molecule; } void setDataType(int d1) { DataType = d1; } int getDataType() { return DataType; } const QFont &getFont() { return font; } void setFont(const QFont &f_in) { font = f_in; } void MoveCursor(DPoint *); void Select(DPoint *, DPoint *); QRect BoundingBox(); void DoSuperscript(); void DoSubscript(); void DoBold(); void DoItalic(); void DoUnderline(); void DeselectAllText() { selectMin = -1; selectMax = -1; } // set text parsed from XML file void SetTextFromXML(QString) {} QString ToXML(QString); QString ToCDXML(QString); void FromXML(QString); void SetFontFromXML(QString); void SetTextstringFromXML(QString); void SetRichstringFromXML(QString); void SetTextmaskFromXML(QString); void SetBorderColorFromXML(QString); void SetFillColorFromXML(QString); void SetShapeGeometryFromXML(QString); void CheckAlignment(int); void ForceAlignment(int); void UpdateDisplayText(); // set shape/border/fill void setShape(int s1) { shape = s1; } int getShape() { return shape; } void setBorder(bool b1) { drawBorder = b1; } bool getBorder() { return drawBorder; } void setBorderColor(QColor c1) { borderColor = c1; } QColor getBorderColor() { return borderColor; } void setFill(bool b1) { drawFill = b1; } bool getFill() { return drawFill; } void setFillColor(QColor c1) { fillColor = c1; } QColor getFillColor() { return fillColor; } void setShapeWidth(int i1) { shapewidth = i1; } void setShapeHeight(int i1) { shapeheight = i1; } int getShapeWidth() { if (shapewidth < 0) return oshapewidth; return shapewidth; } int getShapeHeight() { if (shapeheight < 0) return oshapeheight; return shapeheight; } private: // Renderer Render2D *r; // Text this object holds // QString text; *** NOW DEFINED IN dpoint.h // Text modifier -- super/subscript flags // QString textmask; *** NOW DEFINED IN dpoint.h // Text and flags which are actually displayed QString displayText, displayTextMask; // for text which labels a point -- which side is less hindered? int whichside; // 1 = left, 2 = right // Text font(s) - regular, bold, italic, underline QFont font; // justify -- how/where to draw this text int justify, tjustify; // dimensions of text box QRect BBox; // cursor position (character # within text) int cursor; // selection range int selectMin, selectMax; // is the Shift key down? bool shiftdown; // Molecule this text gets data from Molecule *molecule; int DataType; // shape/border/fill variables int shape; // 0 = no shape bool drawBorder, drawFill; QColor borderColor, fillColor; int shapewidth, shapeheight; int oshapewidth, oshapeheight; }; #endif xdrawchem-v1.11.0/xdrawchem/textshapedialog.cpp000066400000000000000000000056321371466245600216410ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include "defs.h" #include "textshapedialog.h" TextShapeDialog::TextShapeDialog(QWidget *parent) : QDialog(parent) { QGridLayout *tsgl = new QGridLayout(this); setWindowTitle(tr("Edit text shape")); stype = new QComboBox(); stype->addItem(tr("No shape")); stype->addItem(tr("Ellipse")); stype->addItem(tr("Rectangle")); stype->addItem(tr("Circle")); stype->addItem(tr("Square")); tsgl->addWidget(stype, 0, 0); borderCheck = new QCheckBox(); borderCheck->setText(tr("Border")); tsgl->addWidget(borderCheck, 1, 0); bbutton = new QPushButton(this); bbutton->setText(tr("Border color")); tsgl->addWidget(bbutton, 1, 1); connect(bbutton, SIGNAL(clicked()), SLOT(editBorderColor())); fillCheck = new QCheckBox(); fillCheck->setText(tr("Fill")); tsgl->addWidget(fillCheck, 2, 0); fbutton = new QPushButton(this); fbutton->setText(tr("Fill color")); tsgl->addWidget(fbutton, 2, 1); connect(fbutton, SIGNAL(clicked()), SLOT(editFillColor())); QLabel *lw1, *lh1; lw1 = new QLabel(); lw1->setText(tr("Width:")); tsgl->addWidget(lw1, 3, 0); lh1 = new QLabel(); lh1->setText(tr("Height:")); tsgl->addWidget(lh1, 3, 1); swidth = new QLineEdit(); tsgl->addWidget(swidth, 4, 0); sheight = new QLineEdit(); tsgl->addWidget(sheight, 4, 1); QPushButton *ok, *dismiss; ok = new QPushButton(tr("OK")); tsgl->addWidget(ok, 5, 0); connect(ok, SIGNAL(clicked()), SLOT(accept())); dismiss = new QPushButton(tr("Cancel")); tsgl->addWidget(dismiss, 5, 1); connect(dismiss, SIGNAL(clicked()), SLOT(reject())); } void TextShapeDialog::editBorderColor() { QColor c1; c1 = QColorDialog::getColor(bc); bc = c1; } void TextShapeDialog::editFillColor() { QColor c1; c1 = QColorDialog::getColor(fc); // fbutton->setPaletteBackgroundColor( c1 ); fc = c1; } void TextShapeDialog::setBorderColor(QColor c1) { bc = c1; } void TextShapeDialog::setFillColor(QColor c1) { fc = c1; } // cmake#include "textshapedialog.moc" xdrawchem-v1.11.0/xdrawchem/textshapedialog.h000066400000000000000000000040551371466245600213040ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef TSDIALOG_H #define TSDIALOG_H #include #include #include #include class TextShapeDialog : public QDialog { Q_OBJECT public: TextShapeDialog(QWidget *parent); void setBorderColor(QColor); void setFillColor(QColor); QColor getBorderColor() { return bc; } QColor getFillColor() { return fc; } void setBorderCheck(bool b1) { borderCheck->setChecked(b1); } void setFillCheck(bool b1) { fillCheck->setChecked(b1); } bool getBorderCheck() { return borderCheck->isChecked(); } bool getFillCheck() { return fillCheck->isChecked(); } void set_stype(int s1) { stype->setCurrentIndex(s1); } int get_stype() { return stype->currentIndex(); } void setWidth(int n1) { QString nx; nx.setNum(n1); swidth->setText(nx); } void setHeight(int n1) { QString nx; nx.setNum(n1); sheight->setText(nx); } int getWidth() { return swidth->text().toInt(); } int getHeight() { return sheight->text().toInt(); } public slots: void editFillColor(); void editBorderColor(); private: QComboBox *stype; QPushButton *bbutton, *fbutton; QCheckBox *borderCheck, *fillCheck; QLineEdit *swidth, *sheight; QColor fc, bc; }; #endif xdrawchem-v1.11.0/xdrawchem/to3d.cpp000066400000000000000000000136561371466245600173320ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // to3d.cpp - Molecule's implementation of (more) functions // this code derives from BUILD3D supplied by Thomas Shattuck #include #include "defs.h" #include "dpoint.h" #include "drawable.h" #include "graphdialog.h" #include "moldata.h" #include "molecule.h" #include "molinfodialog.h" #include "netaccess.h" #include "render2d.h" // Preferences extern Preferences preferences; // invoked from tool_2d3d.cpp... // Create Undo() point before executing :) // actually, we're exporting this to BUILD3D... void Molecule::Make3DVersion(QString fn3d) { // add NMR protons up = AllPoints(); AddNMRprotons(); // find rings (esp. find aromaticity) - do after CopyTextToDPoint() MakeSSSR(); // get list of unique points up = AllPoints(); AllNeighbors(); // create input data // t natoms = up.count(); QStringList atomEntries; QString atomEntry, s1; // DPoint *tmp_pt_1, *tmp_pt_2; // int lc = 0; // let's not abandon the idea of doing it ourselves... this_sssr.PrintSSSR(); // DPoint *first_pt, *curr_pt; QList placelist; // double RMS = 999.0, RMSok; int i = 0; //, j = 0, chg = 0, iter = 0; // int nplaced, ncount; // bool inring = false, finished = true; // double vecx, vecy, vecz, dst, dstmin, dstmax; // serialize, and set initial positions srand((int)time(0)); i = 1; // BUILD3D expects the first atom to be 1 for (DPoint *tmp_pt : up) { tmp_pt->serial = i; i++; // serialize tmp_pt->new_order = 0; // we'll use this as a status flag tmp_pt->hit = false; } QString n1, buildpath, buildfile, xyzfile; QTextStream tout(&buildfile, QIODevice::WriteOnly); int an, nc = 0, nh = 0, nn = 0, no = 0, np = 0, ns = 0, atypes = 0; for (DPoint *tmp_pt : up) { an = tmp_pt->getAtomicNumber(); if (an == 1) { if (nh == 0) atypes++; nh++; } if (an == 6) { if (nc == 0) atypes++; nc++; } if (an == 7) { if (nn == 0) atypes++; nn++; } if (an == 8) { if (no == 0) atypes++; no++; } if (an == 14) { if (np == 0) atypes++; np++; } if (an == 15) { if (ns == 0) atypes++; ns++; } } tout << atypes << "Z"; if (nh > 0) tout << "H 1 "; if (nc > 0) tout << "C 4 "; if (nn > 0) tout << "N 3 "; if (no > 0) tout << "O 2 "; if (np > 0) tout << "P 5 "; if (ns > 0) tout << "S 2 "; tout << "Z"; tout << rand() << "Z"; tout << up.count() << "Z"; // connection table DPoint *n_pt; for (DPoint *tmp_pt : up) { if (tmp_pt->getAtomicNumber() == 6) { if (tmp_pt->neighbors.count() == 4) { // NO chirality. tout << tmp_pt->baseElement() << " -1 1 "; } else { // Consider chirality. tout << tmp_pt->baseElement() << " 0 1 "; } } else { tout << tmp_pt->baseElement() << " -1 1 "; } foreach (n_pt, tmp_pt->neighbors) { tout << n_pt->serial << " "; } tout << "Z"; } // comment -- free advertising :) tout << "generated by " << QString(XDC_VERSION).toLower() << "Z"; // renumbering list for (nh = 0; nh < up.count(); nh++) { tout << nh + 1 << " " << nh + 1 << "Z"; } // distance constraints tout << "0" << "Z"; // run BUILD3D and verify 00XYZ.MOL was created buildfile.replace(" ", "X"); qDebug() << buildfile; NetAccess na; int ge1; if (na.runBuild3D(buildfile)) { xyzfile = na.s3dmol; ge1 = xyzfile.indexOf("generated"); qDebug() << "gen: " << ge1; if (ge1 > 0) { xyzfile.remove(0, ge1); } } else { qDebug() << "Build3D failed!"; return; } // if a filename was passed in, copy to that if (fn3d.length() > 1) { if (fn3d.right(4).toLower() != ".mol") fn3d.append(".mol"); } else { // success -- now ask where to move output QFileDialog fd(getRender2D()); /// TODO QStringList str1; fd.setWindowTitle(tr("Save 3D file as...")); fd.setFileMode(QFileDialog::AnyFile); fd.setNameFilters(QStringList(tr("MDL molfile (*.mol)"))); if (fd.exec() == QDialog::Accepted) { str1 = fd.selectedFiles(); if (str1[0].right(4).toLower() != ".mol") str1[0].append(".mol"); fn3d = str1[0]; } else { qDebug() << "To3D cancelled by user"; RemoveNMRprotons(); return; } } qDebug() << "3D file: " << fn3d; QFile fout(fn3d); if (!fout.open(QIODevice::WriteOnly)) { qDebug() << "File save failed!"; } else { QTextStream tout(&fout); tout << xyzfile; fout.close(); } // Remove NMR protons RemoveNMRprotons(); } xdrawchem-v1.11.0/xdrawchem/tool_13c_nmr.cpp000066400000000000000000000056151371466245600207540ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "defs.h" #include "helpwindow.h" #include "render2d.h" #include "tool_13c_nmr.h" // defined in main.cpp // extern QString RingDir; Tool_13CNMR_Dialog::Tool_13CNMR_Dialog(QWidget *parent) : ToolDialog(parent) { setWindowTitle(tr("13C NMR spectrum")); helpfile = "spectra.html"; QGridLayout *mygrid; mygrid = new QGridLayout(this); ngw = new NewGraphWidget(this); ngw->setDataType(DATA_13CNMR); mygrid->addWidget(ngw, 0, 0, 0, 1); peaktext = new QTextEdit(); peaktext->setReadOnly(true); mygrid->addWidget(peaktext, 1, 1, 0, 1); QPushButton *qhelp = new QPushButton(tr("Help")); mygrid->addWidget(qhelp, 2, 0); connect(qhelp, SIGNAL(clicked()), SLOT(SendHelp())); QPushButton *qclose = new QPushButton(tr("Close")); mygrid->addWidget(qclose, 2, 1); connect(qclose, SIGNAL(clicked()), SLOT(accept())); } void Tool_13CNMR_Dialog::process() { QString n1; this_mol->Calc13CNMR(false); peaklist = this_mol->peaklist; qDebug() << "got peak list"; if (product_mol == 0) { for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(0, 0, 0)); n1.setNum(tmp_peak->intensity); peaktext->append(tmp_peak->comment + tr(", intensity ") + n1); // peaktext->append("\n"); } return; } peaktext->setTextColor(QColor(255, 0, 0)); peaktext->insertPlainText(tr("Peaks of reactant:\n")); for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(255, 0, 0)); n1.setNum(tmp_peak->intensity); peaktext->insertPlainText(tmp_peak->comment + tr(", intensity ") + n1); peaktext->insertPlainText("\n"); } product_mol->Calc13CNMR(false); peaklist = product_mol->peaklist; peaktext->setTextColor(QColor(0, 0, 255)); peaktext->insertPlainText(tr("Peaks of product:\n")); for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(0, 0, 255)); n1.setNum(tmp_peak->intensity); peaktext->insertPlainText(tmp_peak->comment + tr(", intensity ") + n1); peaktext->insertPlainText("\n"); } } xdrawchem-v1.11.0/xdrawchem/tool_13c_nmr.h000066400000000000000000000021641371466245600204150ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef TOOL_13CNMR_H #define TOOL_13CNMR_H #include #include "molecule.h" #include "ngw.h" #include "tooldialog.h" using namespace OpenBabel; class Tool_13CNMR_Dialog : public ToolDialog { public: Tool_13CNMR_Dialog(QWidget *parent = 0); void process(); private: NewGraphWidget *ngw; QTextEdit *peaktext; }; #endif xdrawchem-v1.11.0/xdrawchem/tool_1h_nmr.cpp000066400000000000000000000053031371466245600206700ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "defs.h" #include "helpwindow.h" #include "render2d.h" #include "tool_1h_nmr.h" // defined in main.cpp // extern QString RingDir; Tool_1HNMR_Dialog::Tool_1HNMR_Dialog(QWidget *parent) : ToolDialog(parent) { setWindowTitle(tr("1H NMR spectrum")); helpfile = "spectra.html"; QGridLayout *mygrid = new QGridLayout(); setLayout(mygrid); ngw = new NewGraphWidget(this); ngw->setDataType(DATA_1HNMR); mygrid->addWidget(ngw, 0, 0, 1, 3); peaktext = new QTextEdit(); peaktext->setReadOnly(true); mygrid->addWidget(peaktext, 1, 0); QPushButton *qhelp = new QPushButton(tr("Help")); connect(qhelp, SIGNAL(clicked()), SLOT(SendHelp())); mygrid->addWidget(qhelp, 1, 1); QPushButton *qclose = new QPushButton(tr("Close")); connect(qclose, SIGNAL(clicked()), SLOT(accept())); mygrid->addWidget(qclose, 1, 2); } void Tool_1HNMR_Dialog::process() { this_mol->Calc1HNMR(false); peaklist = this_mol->peaklist; qDebug() << "got peak list"; if (product_mol == 0) { for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(0, 0, 0)); peaktext->append(tmp_peak->comment); // peaktext->append("\n"); } return; } peaktext->setTextColor(QColor(255, 0, 0)); peaktext->insertPlainText(tr("Peaks of reactant:\n")); for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(255, 0, 0)); peaktext->insertPlainText(tmp_peak->comment); peaktext->insertPlainText("\n"); } product_mol->Calc1HNMR(false); peaklist.clear(); peaklist = product_mol->peaklist; peaktext->setTextColor(QColor(0, 0, 255)); peaktext->insertPlainText(tr("Peaks of product:\n")); for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(0, 0, 255)); peaktext->insertPlainText(tmp_peak->comment); peaktext->insertPlainText("\n"); } } xdrawchem-v1.11.0/xdrawchem/tool_1h_nmr.h000066400000000000000000000021601371466245600203330ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef TOOL_1HNMR_H #define TOOL_1HNMR_H #include #include "molecule.h" #include "ngw.h" #include "tooldialog.h" using namespace OpenBabel; class Tool_1HNMR_Dialog : public ToolDialog { public: Tool_1HNMR_Dialog(QWidget *parent = 0); void process(); private: NewGraphWidget *ngw; QTextEdit *peaktext; }; #endif xdrawchem-v1.11.0/xdrawchem/tool_2d3d.cpp000066400000000000000000000104741371466245600202450ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "defs.h" #include "helpwindow.h" #include "render2d.h" #include "tool_2d3d.h" #include "ioiface.h" using namespace OpenBabel; // defined in main.cpp // extern QString RingDir; Tool_2D3D::Tool_2D3D(QWidget *parent) : ToolDialog(parent) {} void Tool_2D3D::process() { new3dmol = new Molecule(0); // deep copy into new3dmol QList objs = this_mol->AllObjects(); QList oldPoints; QList newPoints; DPoint *n, *tmp_pt; Bond *b; Drawable *tmp_draw; // need to deep copy stuff coming off the Clipboard // first, find all unique DPoint's foreach (tmp_draw, objs) { if (oldPoints.contains(tmp_draw->Start()) == 0) oldPoints.append(tmp_draw->Start()); if (tmp_draw->End() != 0) { if (oldPoints.contains(tmp_draw->End()) == 0) oldPoints.append(tmp_draw->End()); } } if (oldPoints.count() == 0) return; // make new DPoint's which correspond to old DPoint's foreach (tmp_pt, oldPoints) { n = new DPoint(tmp_pt); newPoints.append(n); } // now add all TYPE_BOND objects back to current // no need to copy TEXT or SYMBOL Drawable *td1; foreach (td1, objs) { if (td1->Type() == TYPE_BOND) { b = (Bond *)td1; new3dmol->addBond(newPoints.at(oldPoints.indexOf(td1->Start())), newPoints.at(oldPoints.indexOf(td1->End())), b->Thick(), b->Order(), td1->GetColor(), true); } } new3dmol->Make3DVersion(); save3DFile(); delete new3dmol; } void Tool_2D3D::save3DFile() { /* obsolete, and not even used, IIRC QStringList filters; io_type inFileType = UNDEFINED; int i; OBFileFormat fileFormat; QString str1, filefilter, filename; char *formatOptions; str1 = tr("--Select a filter-- (*)"); filters.append(str1); for (i = 0; i < extab.Count(); i++) { str1 = ""; if (extab.IsReadable(i)) { str1.append(extab.GetExtension(i)); str1.append(": "); str1.append(extab.GetDescription(i)); str1.append(" (*)"); filters.append(str1); } } filters.sort(); QFileDialog fd(QString::null, QString::null, 0, 0, TRUE); fd.setWindowTitle( tr("Save file as...") ); fd.setMode(QFileDialog::AnyFile); fd.setFilters(filters); if ( fd.exec() == QDialog::Accepted ) { str1 = fd.selectedFilter(); if (str1.left(2) == "--") { QMessageBox::warning( 0, tr("Could not determine file type"), tr("Please select a file type from the list.") ); return; } filefilter = str1; // so we know what file type to save as filename = fd.selectedFile(); int cutpt = str1.indexOf(':'); str1.truncate(cutpt); const char *tmpchar = str1.toLatin1(); char *realchar; realchar = (char*)malloc(sizeof(char)*str1.length()); strcpy(realchar, tmpchar); inFileType = extab.FilenameToType( realchar ); OBMol *mol = new3dmol->convertToOBMol(); mol->SetInputType(inFileType); mol->SetOutputType(inFileType); ofstream outFileStream( filename.toLatin1() ); if (!outFileStream) { QMessageBox::warning( 0, tr("Problem while writing the file"), tr("Cannot write the specified file.") ); return; } fileFormat.WriteMolecule(outFileStream, *mol, "3D", formatOptions); delete new3dmol; } */ } xdrawchem-v1.11.0/xdrawchem/tool_2d3d.h000066400000000000000000000021061371466245600177030ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef TOOL_2D3D_H #define TOOL_2D3D_H #include "molecule.h" #include "peak.h" #include "tooldialog.h" using namespace OpenBabel; class Tool_2D3D : public ToolDialog { public: Tool_2D3D(QWidget *parent = 0); void process(); void save3DFile(); private: Molecule *new3dmol; }; #endif xdrawchem-v1.11.0/xdrawchem/tool_ir.cpp000066400000000000000000000052541371466245600201230ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "defs.h" #include "helpwindow.h" #include "render2d.h" #include "tool_ir.h" #include "xdrawchem/peak.h" // defined in main.cpp // extern QString RingDir; Tool_IR_Dialog::Tool_IR_Dialog(QWidget *parent) : ToolDialog(parent) { setWindowTitle(tr("IR spectrum")); helpfile = "spectra.html"; QGridLayout *mygrid; mygrid = new QGridLayout(this); ngw = new NewGraphWidget(this); ngw->setDataType(DATA_IR); mygrid->addWidget(ngw, 0, 0); peaktext = new QTextEdit(); peaktext->setReadOnly(true); mygrid->addWidget(peaktext, 1, 1); QPushButton *qhelp = new QPushButton(tr("Help")); mygrid->addWidget(qhelp, 2, 0); connect(qhelp, SIGNAL(clicked()), SLOT(SendHelp())); QPushButton *qclose = new QPushButton(tr("Close")); mygrid->addWidget(qclose, 2, 1); connect(qclose, SIGNAL(clicked()), SLOT(accept())); } void Tool_IR_Dialog::process() { this_mol->CalcIR(); peaklist = this_mol->peaklist; qDebug() << "got peak list"; if (product_mol == 0) { for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(0, 0, 0)); peaktext->append(tmp_peak->comment); // peaktext->append("\n"); } return; } peaktext->setTextColor(QColor(255, 0, 0)); peaktext->insertPlainText(tr("Peaks of reactant:\n")); for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(255, 0, 0)); peaktext->insertPlainText(tmp_peak->comment); peaktext->insertPlainText("\n"); } product_mol->CalcIR(); peaklist.clear(); peaklist = product_mol->peaklist; peaktext->setTextColor(QColor(0, 0, 255)); peaktext->insertPlainText(tr("Peaks of product:\n")); for (Peak *tmp_peak : peaklist) { ngw->AddPeak(tmp_peak, QColor(0, 0, 255)); peaktext->insertPlainText(tmp_peak->comment); peaktext->insertPlainText("\n"); } } xdrawchem-v1.11.0/xdrawchem/tool_ir.h000066400000000000000000000021441371466245600175630ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef TOOL_IR_H #define TOOL_IR_H #include #include "molecule.h" #include "ngw.h" #include "tooldialog.h" using namespace OpenBabel; class Tool_IR_Dialog : public ToolDialog { public: Tool_IR_Dialog(QWidget *parent = 0); void process(); private: NewGraphWidget *ngw; QTextEdit *peaktext; }; #endif xdrawchem-v1.11.0/xdrawchem/tooldialog.cpp000066400000000000000000000045051371466245600206070ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "tooldialog.h" #include "defs.h" #include "helpwindow.h" #include "render2d.h" // defined in main.cpp extern QString RingDir; ToolDialog::ToolDialog(QWidget *parent) : QDialog(parent) { helpfile = "spectra.html"; this_mol = 0; product_mol = 0; /* This should be done in sub-classes QGridLayout *mygrid; mygrid = new QGridLayout(this,2,2,5); QPushButton *qhelp = new QPushButton( tr("Help"), this); mygrid->addWidget(qhelp,2,1); connect(qhelp, SIGNAL(clicked()), SLOT(SendHelp())); QPushButton *qclose = new QPushButton( tr("Close"), this); mygrid->addWidget(qclose,2,2); connect(qclose, SIGNAL(clicked()), SLOT(accept())); */ } void ToolDialog::process() { qDebug() << "Nothing happens"; } void ToolDialog::setMolecule(Molecule *m1) { this_mol = m1; process(); } void ToolDialog::setMolecule(OBMol *ob1) { this_mol = new Molecule(0); this_mol->convertFromOBMol(ob1); process(); } // note: must set product molecule first for correct behavior! void ToolDialog::setProductMolecule(Molecule *m1) { product_mol = m1; } void ToolDialog::setProductMolecule(OBMol *ob1) { product_mol = new Molecule(0); product_mol->convertFromOBMol(ob1); } void ToolDialog::SendHelp() { QString home; #ifdef UNIX home = RingDir + "doc/" + helpfile; #else home = RingDir + "doc\\" + helpfile; #endif HelpWindow *help = new HelpWindow(home, ".", 0); help->setWindowTitle(QString(XDC_VERSION) + " - Help viewer"); help->show(); } // cmake#include "tooldialog.moc" xdrawchem-v1.11.0/xdrawchem/tooldialog.h000066400000000000000000000025461371466245600202570ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef TOOLDIALOG_H #define TOOLDIALOG_H #include #include #include "molecule.h" #include "peak.h" #include using namespace OpenBabel; class ToolDialog : public QDialog { Q_OBJECT public: ToolDialog(QWidget *parent = 0); void setMolecule(Molecule *); void setMolecule(OBMol *); void setProductMolecule(Molecule *); void setProductMolecule(OBMol *); virtual void process(); public slots: void SendHelp(); protected: QString helpfile; Molecule *this_mol, *product_mol; QList peaklist; }; #endif xdrawchem-v1.11.0/xdrawchem/up.xpm000066400000000000000000000034161371466245600171200ustar00rootroot00000000000000/* XPM */ static char *up[] = { /* width height num_colors chars_per_pixel */ " 64 24 2 1", /* colors */ ". c #000000", "# c #ffffff", /* pixels */ "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "##################################################.........#####", "##################################.........................#####", "##################.........................................#####", "#########..................................................#####", "######################.....................................#####", "##############################################.............#####", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################", "################################################################" }; xdrawchem-v1.11.0/xdrawchem/xdc_event.h000066400000000000000000000055271371466245600201030ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // XDrawChem Event structure. #ifndef XDC_EVENT_H #define XDC_EVENT_H #include #include "dpoint.h" #define EVT_ADD_BOND 1 #define EVT_ADD_BOND_UP 2 #define EVT_ADD_BOND_DOWN 3 #define EVT_ADD_BOND_DASH 4 #define EVT_ADD_BOND_WAVY 5 #define EVT_ADD_BRACKET 10 #define EVT_ADD_ARROW 20 #define EVT_ADD_CURVEARROW 30 #define EVT_ADD_GRAPHIC 40 #define EVT_NONE 999 // send this to trigger undo. class XDC_Event { public: XDC_Event() { undo_able = true; tf1 = false; tf2 = false; } XDC_Event(int t1) { evt_type = t1; undo_able = true; tf1 = false; tf2 = false; } int type() { return evt_type; } void setType(int p1) { evt_type = p1; } DPoint *Start() { return start; } void setStart(DPoint *p1) { start = p1; } DPoint *End() { return end; } void setEnd(DPoint *p1) { end = p1; } void setDeltaXY(double nx, double ny) { dx = nx; dy = ny; } double deltaX() { return dx; } double deltaY() { return dy; } int Param1() { return param1; } void setParam1(int p1) { param1 = p1; } int Param2() { return param2; } void setParam2(int p1) { param2 = p1; } int Param3() { return param3; } void setParam3(int p1) { param3 = p1; } int Param4() { return param4; } void setParam4(int p1) { param4 = p1; } QString text() { return evt_text; } void setText(const QString &p1) { evt_text = p1; } QColor color() { return evt_color; } void setColor(QColor p1) { evt_color = p1; } void setBool1(bool p1) { tf1 = p1; } bool bool1() { return tf1; } void setBool2(bool p1) { tf2 = p1; } bool bool2() { return tf2; } void setUndoable(bool p1) { undo_able = p1; } bool undoable() { return undo_able; } void setPoints(QPolygon inp1) { eventPoints = inp1; } QPolygon points() { return eventPoints; } private: int evt_type; DPoint *start, *end; double dx, dy; int param1, param2, param3, param4; bool tf1, tf2, undo_able; QString evt_text; QColor evt_color; QPolygon eventPoints; }; #endif xdrawchem-v1.11.0/xdrawchem/xdc_textedit.h000066400000000000000000000023331371466245600206040ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include // custom text editor widget to handle enter key... class XdcTextEdit : public QTextEdit { Q_OBJECT public: XdcTextEdit(QWidget *parent) : QTextEdit(parent) {} void keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Return) { emit returnPressed(); } else { QTextEdit::keyPressEvent(event); } } signals: void returnPressed(); }; xdrawchem-v1.11.0/xdrawchem/xdc_toolbutton.cpp000066400000000000000000000017061371466245600215210ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "xdc_toolbutton.h" XDC_ToolButton::XDC_ToolButton(QWidget *parent, QString name) : QToolButton() { fn = name; } void XDC_ToolButton::trigger() { emit IncludeFile(fn); } xdrawchem-v1.11.0/xdrawchem/xdc_toolbutton.h000066400000000000000000000021221371466245600211570ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef XDC_TB_H #define XDC_TB_H #include #include class XDC_ToolButton : public QToolButton { Q_OBJECT public: XDC_ToolButton(QWidget *parent, QString name); public slots: void trigger(); signals: void IncludeFile(QString); private: QString fn; }; #endif xdrawchem-v1.11.0/xdrawchem/xml_cml.cpp000066400000000000000000000102361371466245600201030ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include "defs.h" #include "xml_cml.h" // bool CMLParser::start Document() // { // qDebug() << "New CML parser started."; // return true; // } bool CMLParser::startElement() { QXmlStreamAttributes attr = xml->attributes(); qDebug() << "Start:" << xml->name(); QString qName = xml->name().toString().toUpper(); if (qName == "ATOM") { states = CML_ATOM; tmp_pt = new DPoint; tmp_pt->id = attr.value("id").toString(); qDebug() << "Atom id=" << attr.value("id"); } else if (qName == "BOND") { states = CML_BOND; tmp_bond = new Bond(r); tmp_bond->setID(attr.value("id").toString()); ep1 = 0; ep2 = 0; } else if (qName == "FLOAT") { last_builtin = attr.value("builtin").toString().toUpper(); if (last_builtin == "X3") last_builtin = "X2"; else if (last_builtin == "X3") last_builtin = "Y2"; } else if (qName == "STRING") { last_builtin = attr.value("builtin").toString().toUpper(); } return true; } bool CMLParser::endElement() { qDebug() << "End:" << xml->name(); QString qName = xml->name().toString().toUpper(); if (qName == "ATOM") { localPoints.append(tmp_pt); tmp_pt = 0; states = CML_NONE; qDebug() << "finished atom"; } else if (qName == "BOND") { tmp_bond->setPoints(ep1, ep2); localBonds.append(tmp_bond); tmp_bond = 0; states = CML_NONE; qDebug() << "finished bond"; } return true; } bool CMLParser::characters() { QStringRef ch = xml->text(); qDebug() << "char:" << ch << ":"; if (states == CML_ATOM) { if (last_builtin == "ELEMENTTYPE") tmp_pt->element = ch.toString(); if (last_builtin == "X2") tmp_pt->x = ch.toDouble(); if (last_builtin == "Y2") tmp_pt->y = ch.toDouble(); } if (states == CML_BOND) { if (last_builtin == "ATOMREF") { foreach (tmp_pt, localPoints) { if (tmp_pt->id == ch) break; } if (ep1 == 0) ep1 = tmp_pt; else ep2 = tmp_pt; } if (last_builtin == "ORDER") tmp_bond->setOrder(ch.toInt()); if (last_builtin == "STEREO") { if (ch == "H") tmp_bond->setOrder(7); if (ch == "W") tmp_bond->setOrder(5); } } return true; } // bool CMLParser::ignored( const QString & ch ) // { // qDebug() << "ignored:" << ch << ":"; // return true; // } QList CMLParser::getPoints() { return localPoints; } QList CMLParser::getBonds() { return localBonds; } bool CMLParser::parse() { while (!xml->atEnd()) { xml->readNext(); switch (xml->tokenType()) { case QXmlStreamReader::StartElement: startElement(); break; case QXmlStreamReader::EndElement: endElement(); break; case QXmlStreamReader::Characters: if (!xml->isWhitespace()) characters(); break; default: qDebug() << "ignored: '" << xml->text() << "'" << "of type" << xml->tokenString(); break; } } return !xml->hasError(); } xdrawchem-v1.11.0/xdrawchem/xml_cml.h000066400000000000000000000032401371466245600175450ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef XML_CML_H #define XML_CML_H /* #include #include */ #include #include #include "bond.h" #include "dpoint.h" #include "drawable.h" #include "render2d.h" class QString; // possible states (CMLParser::states) // set in defs.h //#define CML_NONE 0 //#define CML_ATOM 1 //#define CML_BOND 2 class CMLParser { public: CMLParser(Render2D *r1, QXmlStreamReader *x1) : r(r1), xml(x1) {} bool parse(); // bool startDocument(); bool startElement(); bool endElement(); bool characters(); // bool ignored( const QString & ); QList getPoints(); QList getBonds(); private: QList localPoints; QList localBonds; DPoint *tmp_pt, *ep1, *ep2; Bond *tmp_bond; Render2D *r; QXmlStreamReader *xml; QString indent, last_builtin; int states; }; #endif xdrawchem-v1.11.0/xdrawchem/xml_reader.cpp000066400000000000000000000120011371466245600205620ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // XML_Reader.cpp - base class for XML type readers #include #include #include #include #include "xml_reader.h" // ***************************** // General XML parsing functions // ***************************** // function to see if tag is 'self-contained', i.e.: // data returns false // returns true // (returns true if tag ends in "/>" bool XML_Reader::selfContainedTag(const QString &tag) { return tag.right(2) == "/>"; } // function to extract tags from stream QString XML_Reader::readTag(const QString &f, int ptr) { int t1 = f.indexOf("<", ptr); ptr = t1; int t2 = f.indexOf(">", ptr); ptr = t2 + 1; return f.mid(t1, ptr - t1).toLatin1(); } // function to extract data between tags QString XML_Reader::readData(const QString &f, int ptr) { int t1 = f.indexOf("<", ptr); return f.mid(ptr, t1 - ptr); } // function to extract attributes from tag // Return format: list item 0=first attribute, 1=value of first attribute, // 2=second attribute, 3=value of second attribute, you get it, right? QStringList XML_Reader::readAttr(const QString &tag) { QStringList l1; QString attr; QString a1, v1; int t1, eq1, te; // where to start tokenizing int ptr = tag.indexOf(QString(" ")); // where to end tokenizing int eol = tag.indexOf(QString(">")); // exit gracefully if no attributes if (tag.indexOf("=") < 0) return l1; do { while (tag[ptr].isSpace()) { ptr++; } t1 = tag.indexOf(QString("\""), ptr); te = tag.indexOf(QString("\""), t1 + 1); attr = tag.mid(ptr, te - ptr + 1); ptr = te + 1; eq1 = attr.indexOf(QString("=")); a1 = attr.left(eq1); v1 = attr.right(attr.length() - eq1 - 1); v1 = v1.mid(1, v1.length() - 2); if (a1.indexOf(QString(">")) >= 0) break; // end of tags // qDebug() << "[" << a1 << "=" << v1 << "]" ; l1.append(a1); l1.append(v1); } while (ptr < eol); return l1; } // function to tokenize QStringList XML_Reader::tokenize(const QString &tag) { QStringList l1; QString a1, tag1; int t1; // strip leading and trailing white space tag1 = tag.simplified(); // where to start tokenizing int ptr = 0; // where to end tokenizing int eol = tag1.lastIndexOf(QString(" ")); do { t1 = tag1.indexOf(QString(" "), ptr); a1 = tag1.mid(ptr, t1 - ptr); ptr = t1 + 1; l1.append(a1); qDebug() << "[" << a1 << "]"; } while (ptr < eol); a1 = tag1.mid(ptr); l1.append(a1); return l1; } // ParseBoundingBox(): parse CDXML BoundingBox element. void XML_Reader::parseBoundingBox(const QString &BBox, double x1, double y1, double x2, double y2) { int s1 = BBox.indexOf(QString(" "), 0); int s2 = BBox.indexOf(QString(" "), s1 + 1); int s3 = BBox.indexOf(QString(" "), s2 + 1); // qDebug() << BBox.mid(0, s1) << "|"; // qDebug() << BBox.mid(s1 + 1, s2 - s1) << "|"; // qDebug() << BBox.mid(s2 + 1, s3 - s2) << "|"; // qDebug() << BBox.mid(s3 + 1) << "|" ; x1 = BBox.mid(0, s1).toDouble(); y1 = BBox.mid(s1 + 1, s2 - s1).toDouble(); x2 = BBox.mid(s2 + 1, s3 - s2).toDouble(); y2 = BBox.mid(s3 + 1).toDouble(); } // make sure we get the correct close tag // e.g., if passed xyzzyx, return the correct // outer tag (the last ) // note this returns a relative reference, from beginning of wtag. int XML_Reader::positionOfEndTag(const QString &wtag, const QString &tname) { int depth = 0, curpos = 0; int i1, i2; // qDebug() << "l:" << tname.length() ; do { i1 = wtag.indexOf(tname, curpos); // qDebug() << i1 << "," << depth ; i2 = wtag.indexOf(">", i1); if (wtag[i2 - 1] != '/') { // skip self-contained tags if (wtag[i1 - 1] == '<') depth++; if (wtag[i1 - 1] == '/') depth--; if (depth == 0) break; } curpos = i1 + 1; } while (1); i2 = i1 + tname.length() + 1; // qDebug() << "r:" << i2 ; return i2; } // ********************* // end parsing functions // ********************* xdrawchem-v1.11.0/xdrawchem/xml_reader.h000066400000000000000000000024761371466245600202460ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . // XML_Reader.h - base class for XML type readers class XML_Reader { public: // reimplement for subclasses virtual bool readFile(const QString &) { return false; } // utility functions bool selfContainedTag(const QString &); QString readTag(const QString &, int); QString readData(const QString &, int); QStringList readAttr(const QString &); QStringList tokenize(const QString &); void parseBoundingBox(const QString &, double, double, double, double); int positionOfEndTag(const QString &, const QString &); }; xdrawchem-v1.11.0/xdrawchem/xruler.cpp000066400000000000000000000102231371466245600177650ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include "defs.h" #include "prefs.h" #include "xruler.h" extern Preferences preferences; XRuler::XRuler(QWidget *parent) : QWidget(parent) { // setPaletteBackgroundColor( QColor( 255, 255, 255 ) ); // setPaletteForegroundColor( QColor( 0, 0, 0 ) ); ix = 0; iy = 1024; zf = 1.0; } void XRuler::setHV(int n) { ihv = n; } void XRuler::setRange(int nl, int nh) { ix = nl; iy = nh; } void XRuler::paintEvent(QPaintEvent *) { // get current units and spacing from Preferences iu = preferences.getUnits(); incr = preferences.getGridSpacing(); int c1, c2, wf; QPainter p; p.begin(this); p.setPen(QColor(0, 0, 0)); QPixmap numbers(30, 10); // QFont fnum("Courier", 10); QFont fnum = preferences.getRulerFont(); QFontMetrics fmet(fnum); QSize numsize; QPainter p1; p1.begin(&numbers); p1.setPen(QColor(0, 0, 0)); p1.setFont(fnum); QString n1; QTransform wm; wm.rotate(90.0); if (ihv == 1) { // horizontal ruler for (c1 = ix; c1 < iy; c1++) { if ((c1 % incr) == 0) { c2 = qRound((double)c1 * zf); p.drawLine(c2 - ix + 2, 10, c2 - ix + 2, 20); if (iu == PIXELS) n1.setNum(c1); if (iu == ENGLISH) n1.setNum((double)c1 / 100.0); if (iu == METRIC) n1.setNum((double)c1 / 40.0); if (c1 == ix) { if (iu == PIXELS) n1.append(tr("px")); if (iu == ENGLISH) n1.append(tr("in")); if (iu == METRIC) n1.append(tr("cm")); } numbers.fill(); numsize = fmet.size(0, n1); wf = (30 - numsize.width()) / 2; p1.drawText(wf - 2, 8, n1); if (c1 > ix) p.drawPixmap(c2 - ix - 15, 0, numbers); else p.drawPixmap(c2 - ix, 0, numbers); } } } if (ihv == 2) { // vertical ruler for (c1 = ix; c1 < iy; c1++) { if ((c1 % incr) == 0) { c2 = qRound((double)c1 * zf); p.drawLine(10, c2 - ix + 2, 20, c2 - ix + 2); if (iu == PIXELS) n1.setNum(c1); if (iu == ENGLISH) n1.setNum((double)c1 / 100.0); if (iu == METRIC) n1.setNum((double)c1 / 40.0); if (c1 == ix) { if (iu == PIXELS) n1.append(tr("px")); if (iu == ENGLISH) n1.append(tr("in")); if (iu == METRIC) n1.append(tr("cm")); } numbers.fill(); numsize = fmet.size(0, n1); wf = (30 - numsize.width()) / 2; p1.drawText(wf - 2, 8, n1); if (c1 > ix) p.drawPixmap(0, c2 - ix - 15, numbers.transformed(wm)); else p.drawPixmap(0, c2 - ix, numbers.transformed(wm)); } } } } void XRuler::zoomEvent() { zf = (double)preferences.getZoom() / 100.0; update(); } // cmake#include "xruler.moc" xdrawchem-v1.11.0/xdrawchem/xruler.h000066400000000000000000000022571371466245600174420ustar00rootroot00000000000000// XDrawChem // Copyright (C) 2004-2005 Bryan Herger // Copyright (C) 2020 Yaman Qalieh // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef XRULER_H #define XRULER_H #include "prefs.h" class QPaintEvent; extern Preferences preferences; class XRuler : public QWidget { Q_OBJECT public: XRuler(QWidget *parent = 0); public slots: void setHV(int); void setRange(int, int); void zoomEvent(); protected: void paintEvent(QPaintEvent *); private: int ix, iy, iu, ihv, incr; double dx, dy, zf; }; #endif