ACD/ChemBasic Versión 5.0 para Microsoft Windows Tutorial Comenzando con ChemBasic Advanced Chemistry Development Inc. Copyright © 1994-2001 Advanced Chemistry Development Inc.Todos los derechos reservados. ACD/Labs es una marca registrada de Advanced Chemistry Development Inc. Microsoft y Windows son marcas registradas de Microsoft Corporation. Todas las otras marcas mencionadas dentro de este manual son propiedad de sus respectivos dueños. La información en este documento está sujeta a cambio sin previo aviso y se provee "como se ofrece" sin garantía. Advanced Chemistry Development Inc. no se responsabiliza de nada en cuanto al contenido de este material, incluido su limite a las no garantías de mercadeo y adecuación para un propósito en particular. Advanced Chemistry Development Inc. no será responsable de errores internos o por cualquier daño directo, indirecto, especial, incidental o consecuente al uso de este material. Parte Numero: G14_2805 Notas del Traductor La traducción de este documento fue realizada por CARLOS A. FRANCO R., Licenciado en Química y Magíster en Docencia de la Química en la Universidad Pedagógica Nacional, Facultad de Ciencia y Tecnología, Departamento de Química, Bogotá (Colombia), con la debida autorización de: > Technical Support Manager > Advanced Chemistry Development,Inc.. En esta traducción se mantuvo el esquema del documento original sin alterar su esencia. En algunas oportunidades se da la traducción y entre paréntesis se deja el término original con el fin de que el lector pueda referenciar fácilmente los nombres de los comandos, menús, botones, etc. Cualquier sugerencia al respecto, gustoso la atenderé en mi correo personal, cafranco@uni.pedagogica.edu.co o por intermedio del soporte técnico de ACD/labs. ACD/ChemBasic Getting Started 3 TABLA DE CONTENIDOS 1. Introducción a ChemBasic .................................................................................. 1 1.1 Objetivos......................................................................................................................1 1.2 Qué es ChemBasic?....................................................................................................1 1.3 Qué hay Nuevo en 5.0.................................................................................................2 1.4 Por Qué Usar ChemBasic?..........................................................................................2 1.5 Qué es lo que hace? ...................................................................................................2 1.6 Mostrarme Ejemplos! ...................................................................................................3 1.7 Por qué “Basic”? ..........................................................................................................3 1.8 Cómo Trabaja? ............................................................................................................3 1.9 Acerca de este Tutorial................................................................................................5 2. Comenzando: Diga Hola!..................................................................................... 6 2.1 Objetivos......................................................................................................................6 2.2 Crear el Sistema del Programa....................................................................................6 2.3 Hola, Todos! ................................................................................................................7 2.4 Objetos en ChemBasic ................................................................................................9 2.5 Páginas y Coleccines en ChemSketch ......................................................................10 2.6 Hola, Sr. Propano! .....................................................................................................11 2.7 Hola a diferentes Individuos ......................................................................................14 3. Los Frutos del Arbol Molecular ........................................................................ 17 3.1 Objetivos....................................................................................................................17 3.2 Informe de Proyectos.................................................................................................17 3.3 Referencia de Objetos Moleculares...........................................................................17 3.4 Cómo Crear y Destruir Objetos?................................................................................20 3.5 Elaborar un Arbol Molecular ......................................................................................21 3.5.1 Tomar Existencias ........................................................................................................... 23 3.5.2 Optimización y Medidas ................................................................................................... 24 3.5.3 Puliendo la Salida ............................................................................................................ 24 3.5.4 Redimensionar el Diagrama Molecular............................................................................ 25 4. Apéndice. Texto Completo de Muestras.......................................................... 27 4.1 HELLO.BAS...............................................................................................................27 4.2 OXCARBOX.BAS ......................................................................................................28 ACD/ChemBasic Comenzando i 1. Introducción a ChemBasic 1.1 Objetivos En este Capítulo aprenderá a: Por qué aparece ACD/ChemBasic; Qué hay nuevo en la versión 5.0; Cuáles son las ayudas para resolver las tareas de ChemBasic; Cuáles son los problemas de ejemplo que se resuelven con ChemBasic; Cuál es el proyecto detrás del lenguaje de programación; Cómo correr técnicamente los programas ChemBasic; y una unión de palabras acerca de este tutorial. 1.2 Qué es ChemBasic? ChemBasic es un simple, conveniente y funcionalmente rico lenguaje de programación para la presentación y manipulación de estructuras moleculares, que relaciona objetos y todos los contenidos actuales y de futuros programas de ACD/Labs. Se encuentra que ChemBasic es completamente funcional con ACD/Labs. De la misma manera, ChemBasic tiene todas las características que un lenguaje de programación debe tener: variables numéricas y de cadena, arreglos, control de flujo y operadores condicionales, procedimientos de entrada y salida, etc. ChemBasic ha heradado cosas del BASIC genérico y algunas de sus extensiones. Más evidente es la opción de Microsoft'Visual Basic para Aplicaciones (VBA) y para algunas extensiones, extensiones ANSI del BASIC completo. Sin embargo, hay simplificaciones importantes en el procedimiento principal de la estructura del lenguaje, tal como las extensiones sometidas a partes específicas. Por ser una aplicación universal que extiende la capacidad de los programas existentes, ChemBasic esta designado como un lenguaje orientado a objetos. Esto significa que toda la situaciones químicas relacionadas se describen como objetos-esto es, que la estructura de datos específicos corresponden a moléculas, conformaciones, etc. Existe un número métodos predefinidos para manipular estos objetos. La herencia de los objetos y de los métodos es la esencia de ChemBasic. ACD/ChemBasic Comenzando 1 1.3 Qué hay Nuevo en 5.0 En la versión 5.0, los programas ChemBasic pueden accederse desde la ventana de ChemSketch si esta en el modo Estructura o en el modo Dibujo. El Organizador ChemBasic es una nueva herramienta en ChemSketch que le ayuda a guardar pistas de sus programas ChemBasic. Dependiendo de como agrupe su barra de herramientas puede colocar un botón ChemBasic para que este disponible en el modo Estructura, en el modo Dibujo o en ambas o solamente en la barra ChemBasic. Las características del Manejador de Formas ahora forma parte del ChemSketch dedicado al ChemBasic. Con el Manejador de Formas puede designar formas de entrada para los programas ChemBasic. Anteriormente, el ChemBasic usó una serie de cajas de dialogo de entradas secuenciales simples. Ahora, con el Manejador de Formas, puede diseñar formas de entrada para programas ChemBasic que puedan aceptar todos los datos requeridos en una sola instancia. El dialogo de entradas es sencillo. Un menú emergente define los valores de entrada en cada uno de los campos automáticamente posicionados: todos se disponen fácilmente a través del Manejador de Formas. 1.4 Por Qué Usar ChemBasic? Igual que cada químico que maneje un computador con una base normal este tiene un conjunto de operaciones rutinarias para mostrar una molécula, una muestra, un espectro, etc. Con el software ACD/Labs, el químico puede reducir significativamente el número de operaciones de rutina, gracias al contenido químico claro y a la interfase intuitiva de los programas ACD. El software ACD/Labs ha probado sucesos en muchas áreas tal como en la manipulación de estructuras moleculares, búsqueda de estructuras, optimización de representaciones gráficas (depuración en 2D), optimización en 3D, cálculo de propiedades moleculares, predicción de espectros RMN, etc. Sin embargo, con el más actual conjunto de aplicaciones, pensará en un número de situaciones donde pueda repetir algunos pasos continuamente.....Ha pensado cómo hacer esto con un simple menú de opciones y hacer que esta serie de pasos ocurra automáticamente? Una situación común es cuando quiere examinar sistemáticamente el efecto de un cierto sustituyente sobre un compuesto 2D; cuando entra sucesivamente estructuras para hacer constantemente cálculos, adicionar sustituyentes, recalcular e imprimir cada compuesto. Para resolver el problema esta aquí ACD/ChemBasic! Este tiene la genialidad de nuestro software justo para su computador. 1.5 Qué hace ChemBasic? ChemBasic está designado (a) para automatizar rutinas sin ACD/Labs y (b) extender la funcionalidad de ACD/Labs. Le permite al usuario acondicionar el software ACD para sus propósitos o para adecuarlos a las interfases externas de la suite de ACD. Un programa ChemBasic sencillo puede, por ejemplo, obtener una molécula desde la ventana de ACD/ChemSketch, calcular algunas propiedades moleculares, remplazar fragmentos y recalcularlos apropiadamente. O, un programa ChemBasic puede permitir automáticamente el análisis conformacional y representar la estructura 3D más probable para una molécula que haya escogido. O de cualquier forma… esta limitado solo a su imaginación! ACD/ChemBasic Comenzando 2 En este tutorial, consideraremos los siguiente ejemplos como ilustrativos: Obtener todos los diagramas desde una página ChemSketch y generar sus nombres según la IUPAC (en el modo series) [Capítulo 2]. Crear una serie de ácidos carboxílicos homólogos, ejecutar una optimización 3D, representar las estructuras resultantes en la ventana de ChemSketch y marcar todas las estructuras en donde el grupo hidroxilo este separado del carboxilo por una distancia menor a 5 Angstroms [Capítulo 3]. 1.6 Mostrarme Ejemplos! Un experto programador sabe que a menudo el mejor camino para empezar es encontrar una plantilla, por ejemplo, un programa elaborado y luego modificarlo. Algunos ejemplos de la vida real (códigos fuente) están asociados con ACD/ChemBasic. Las muestras de programas ChemBasic son las siguientes: Etiquetas Impresas (Label Printer) – crea e imprime rótulos para material de vidrio de las estructuras dibujadas en una sesión de ChemSketch. Nombres de Azucares (SugarNames) — transforma cadenas cortas de clases específicas de estructuras (azúcares) en una conformación correcta; esto es, que muestra formulas como •GalNAc(alpha1-3)Gal(beta1-4)[Fuc(alpha1-3)]Glc(betaOMe) y le suministra la estructura 3D más probable. Predecir el Log de K (LogK Predicto)r – predice constantes de estabilidad para los complejos de aminas y/o carboxilatos que contienen moléculas orgánicas hasta con 31 iones metálicos. Editor Molecular 3D (Molecular 3D-editor) – un versátil conjunto de potentes utilidades el cual construye y modifica modelos moleculares en tres dimensiones fácilmente (cambia el ángulo de torsión, invierte los centros enantioméricos, analiza anillos plegados y formas poliédricas, importa y exporta en diferentes formatos moleculares y mucho más). 1.7 Por qué “Basico”? ACD/ChemBasic esta basado en el antiguo y excelente programa BASIC "Beginners All-purpose Symbolic Instruction Code" (el acrónimo original para BASIC). El Basic es ampliamente aceptado como el lenguaje más conveniente para no programadores. Las versiones modernas de BASIC han provisto sus éxitos en varios campos- — es suficiente mencionar para aplicaciones el Microsoft Visual Basic y el Visual Basic. ACD/ChemBasic es el programa para química “código para principiantes en todos los campos con instrucción simbólica” "Beginners All-purpose Symbolic Instruction Code". Es heredado del BASIC nativo simple y fácil de usar – para el químico, no para el programador guru; adiciona al BASIC ciertos objetos químicos relacionados de una manera tal que es conocida para los químicos. 1.8 Cómo trabaja? Técnicamente, ChemBasic no es únicamente un lenguaje de programación, además consiste en un interpretador y ejecutor de librerías (RTL) que están integradas con ACD/ChemSketch. Para ejecutar una aplicación ChemBasic, debe tener corriendo ChemSketch. Puede crear un programa ACD/ChemBasic Comenzando 3 ChemBasic con cualquier editor de texto y guardarlo como un archivo en un disco. Así que puede ejecutarlo al seleccionar un comando en ChemSketch: Archivo RunChemBasic. ACD/ChemBasic Comenzando 4 1.9 Acerca de este Tutorial Los ejercicios en este tutorial están designados para hacerse en un promedio de 10 a 40 minutos, dependiendo de su familiaridad con los lenguajes de programación y con la interfase ACD. Después de revisar estos ejercicios y con ayuda en línea, será capaz de usar solo el ChemBasic con poca o sin asistencia y con máximo de velocidad y eficiencia. Este tutorial se provee en forma electrónica legible en los más comunes procesadores de palabra. Si no puede localizar algo que necesite en el índice, escriba una frase para hacer la búsqueda total o de algo que incluya o se relacione con la palabra. Las fotografías han sido tomadas con la última versión del software. Este tutorial asume que usted esta familiarizado con el ratón y el manejo de Microsoft Windows. Una vez que ha usado esta guía nos gustaría su retroalimentación. Cómo podemos probar la documentación para este producto? Tenemos un pequeño cuestionario que nos gustaría que contestara. Todos los remitentes enviarán un dibujo para ganar un premio de ACD/ChemFolder (o equivalente descuento en la compra de cualquiera de l software ACD). Por favor use MS Word 6.0 o posterior Gane!!! para abrir el archivo “survey.doc” o use Adobe Acrobat Reader para Su opinión es abrir “survey.pdf” en la documentación del CD que ha recibido con importante este software, o visite la página “Feedback” en nuestro sitio web, http://www.acdlabs.com/feedback/guides.html. El ganador del para dibujo será anunciado al final de cada año calendario. nosotros. ACD/ChemBasic Comenzando 5 2. Comenzando: Diga Hola! 2.1 Objetivos En este capítulo, aprenderá a Crear un programa ChemBasic; Cuáles son las variables y tipos de datos en ChemBasic; Cómo diseñar un dialogo para los usuarios de su programa; Cómo acceder a las páginas ChemSketch y a su contenido; Cómo implementar control lógico y ciclos en un programa ChemBasic; Cómo generar nombres según la IUPAC para las moléculas. Tradicionalmente, el primer programa debe decir hola. Dado que el ChemBasic no conjuga con moléculas. Permítanos mostrar la primera aplicación, decir hola a las moléculas! 2.2 Crear el esqueleto del Programa Primero que todo, crearemos un esqueleto de la aplicación. Un programa ChemBasic esta hecho de funciones y sub rutinas (procedimientos). Ellos comienzan con la palabra clave de la Función o Sub Rutina y finaliza con la Función Fin (End) o con End Sub. El programa puede tener muchos procedimientos pero una y solo una función puede empezar con el nombre especial Principal (Main).Puede ser el primer procedimiento en un programa pero no necesariamente tiene que serlo. Nota Vea la ayuda ChemBasic para la explicación de la diferencia entre una Función y una Sub Función. En nuestro programa simple, su esqueleto podría ser: Function Main As String ‘Here will be the code End Function Importante ChemBasic no toma en cuenta si usa mayúsculas o minúsculas en palabras claves o en nombre de variables. Función, función, FUNCION, y aun fUnCióN significan exactamente lo mismo. Así que es bueno saberlo para saber como escribirlas. En este Tutorial, todas las palabras clave comienzan con mayúscula, que es lo común en varios apartes de BASIC. Hay dos cosas más para explicar. Primero, las palabras clave para nuestras funciones COMO CADENAS (As String) aparecen después de la declaración de la Función Principal (Function ACD/ChemBasic Comenzando 6 Main). Esto significa que la función retornará un valor de cadena. Las funciones siempre retornan algunos valores después de la ejecución, en contraste con las subrutinas. Así. La variable especial Main tendrá un valor de cadena después que la función sea ejecutada. El valor que retorna la función puede invocarse en el programa para propósitos particulares. El llamar el programa para la Funcion Main es hecha por el mismo ChemBasic; este usará el valor para mostrarlo al usuario en una caja de información, que aparece en la pantalla justo después de completar la aplicación ChemBasic. Un buen hábito de programación en ChemBasic es declarar siempre la función principal como Cadena (puede declararla como entero, doble, etc.) porque esta le da la oportunidad de incluir cualquier mensaje de error o hacer un comentario al final de la cadena. La segunda cosa, en las tres líneas de código anteriores, es la línea de comentarios. Todo lo que este entre apóstrofos y al final de la línea será ignorado por Basic. Es una característica muy usada, que le permite clarificar sus programas y hacerlos mucho más legibles, sobre todo cuando haga una revisión con mucho tiempo de posterioridad. Nota Existen otras dos formas de comentarios: la declaración REM y la multilínea de comentarios estilo C /* …. */ ; vea la ayuda de ChemBasic para una descripción completa. 2.3 Hola, Todos! Ahora, podemos llenar la plantilla con código real. El camino más simple para decir hola, es justamente el siguiente: Function Main as String Main="Hello, Molecules!" End Function De esta forma, para comenzar, cree un archivo de texto hello.bas que contenga exactamente estas tres líneas. Guárdelo e inicie el ACD/ChemSketch. Seleccione Archivo/correr (File/Run) ChemBasic y cuando se le sugiera ejecutar el archivo (en la caja de dialogo estándar “File Open” ), seleccione el archivo hello.bas. Su Hola aparecerá en la pantalla como: el truco es que como lo mencionamos arriba, ChemBasic mostrará el valor que retorna la función principal en su “caja de información” (“info box”) después de ejecutar la aplicación. Naturalmente, este no es un camino honesto. Como un truco puede usarse una vez por programa (porque solo una función principal puede estar presente). Permítanos diseñar nuestro saludo de una manera aplicada más universalmente. ChemBasic tiene una construcción especial de funciones que soporta diálogos con el usuario: MessageBox, UserIOBox y UserIO. Usaremos MessageBox para nuestros propósitos. Nota Vea la ayuda de ChemBasic para la descripción de otras funciones de entrada/salida ACD/ChemBasic Comenzando 7 Escribamos el código: Function Main As String Dim Answer As Integer Answer=MessageBox("Hello, Molecules!","Example #1", MBB_OK +MBI_INFORMATION) End Function Note Corrientemente, ChemBasic no soporta declaraciones multi-línea. Usted debe escribir textos largos en una sola línea. Sin embargo, en este tutorial, para propósitos de legibilidad, los textos largos pueden aparecer en varias líneas. En tal caso, la primera línea comenzará en la margen izquierda de la página. Tenga cuidado cuando transfiera líneas a archivos ejecutables ChemBasic (.BAS) – usted debe enviar las líneas en una sola. Una vez que ha transferido el programa a hello.bas y haberlo guardado como archivo de texto (tenga cuidado al declarar líneas múltiples), puede tratar de ejecutar este programa y ver qué pasa: Exactamente si es lo que deseamos? En el segundo programa, la declaración Dim que aparece justo después de la función de encabezado, declara la variable “Answer ” que es de tipo Entero. Qué significa esto? La Variable es un nombre que usted asigna a algún lugar de almacenamiento en la memoria. Una vez introducida, puede ser llenada (o re-llenada) y usada para cualquier propósito. Cada variable puede corresponder a un dato pre definido, que difiere por los formatos internos y permite métodos de manipulación. Inclusión de datos Convencionales: Boolean Variable Booleana, valores que son solo Cierto o Falso. Integer número entero largo 16-bit Long número entero largo 32-bit Double número de punto flotante largo 64-bit String variable de cadena Nota Vea la ayuda de ChemBasic para la descripción de tipos de datos y declaraciones En ChemBasic, todas las variables que use deben ser explícitamente declaradas. Si no declara una variable, esta será considerada como un error. Para declarar una variable, puede usar la declaración DIM, exactamente como se muestra arriba para la variable entera Answer. Regresemos a nuestro programa ejemplo. En la clase de variable Integer, necesitamos tomar el valor retornado por la función MessageBox. Este valor es un código de retorno- indica cuál botón de usuario ha sido presionado en un mensaje de una caja de dialogo. En el momento este valor no nos ACD/ChemBasic Comenzando 8 preocupa. Sin embargo, no hay posibilidad de llamar una función sin la asignación del valor para alguna variable. En el ejemplo siguiente usaremos este código de retorno. Unos comentarios sobre la función. La caja de mensaje ( MessageBox) muestra una caja de dialogo estándar, que contiene el mensaje (primer parámetro en una llamada de función; aquí "Hola, Moléculas!") y el encabezado (segundo parámetro; "Example #1"). Los botones que aparecen en la caja de dialogo son regulados por el tercer parámetro (en este caso se mostrará solamente el botón “OK” y el signo de exclamación, “!”, indicado en la caja de información). Nota Vea la ayuda ChemBasic para la lista de parámetros y control de botones de la función caja de mensaje. 2.4 Objetos ChemBasic Sin embargo, su primer hola para las moléculas no era muy adecuado — esto lo decimos para todo de una vez. Cada uno tiene un nombre, aunque...cómo preguntamos por el nombre de las moléculas y les enviamos un mensaje personalizado?. Digamos “hola propano” tal como decimos “hola, John!”. Antes de hacer esto pensemos que se necesita entender que las moléculas y otras cosas son diferentes a simples números o letras tal como se representa en ChemBasic. Esto es porque en conjunto el lenguaje de programación BASIC de ACD/ChemBasic incluye no solamente los tipos de datos disponibles en BASIC estandard, sino que también incluye ciertas extensiones que son de propósito general y relacionados con la química. Todas las extensiones son representadas por objetos, esto es, que son estructuras de datos predefinidas usadas para permitir que se hagan en las páginas sketch, moléculas, conformaciones, etc. En pocas palabra, un objeto es cualquier entidad que puede manipular, que no puede ser descrito como una primitiva simple de datos convencionales tales como enteros, simple, booleana, etc. Hay un tipo de objeto genérico, llamado Objeto, que es usado para manipular una entidad dada. Este se refiere a cualquier objeto de untito predefinido. La naturaleza exacta del objeto esta oculta en tipo de nombre. Los tipos (y nombres) están definidos dentro del mismo ChemBasic; usted no puede crear su propio tipo. A menudo (de hecho, siempre), no debe indicar un tipo de objeto en particular— ChemBasic los determina cuando se llaman funciones o se obtienen objetos. Todo esto repartido en los nombres de variables de objetos, que sirven para manejar entidades. Por ejemplo, la línea Dim Doc As Object Reservará una variable al objeto llamado “Doc”. Cada objeto tiene su propio conjunto de métodos, que son procedimientos que se les pueden aplicar a ellos. Estos procedimientos son cuidadosamente designados para la manipulación fácil de este objeto en particular (tipo), sin detalles engorrosos. Ellos y solamente ellos se aplican a los objetos. Si los trata de otra forma, se generará un error. Considere una analogía con números convencionales. Imagine que tiene dos variables de cadena tradicionales, a y b. Asigne a la variable a "bueno " y a la b "trabajo". Aplicándole la operación de adición, a+b, resulta "buen trabajo". Sin embargo, si trata de dividir, a/b, resulta una acción absurda y se generará un error. De hecho, la adición es un método que el BASIC convencional permite para aplicarse a cadenas, mientras que la división no se permite en este tipo de variables. El BASIC estrictamente define todas las operaciones y funciones (métodos) que son aplicables a los objetos de cadena. De esta forma usted debe distinguir entre operaciones legales y operaciones prohibidas. Por ejemplo, si escoge las variables a y b de tipo entero convencional, ellas podrían tener los valores "10" y "2". Tanto la suma como la división son permitidas para este tipo de variable. De esta forma ChemBasic permite que se hagan ciertas cosas para unas y se restrinjan para otras. ACD/ChemBasic Comenzando 9 Los métodos son simplemente una clase especial de funciones y subprogramas BASIC que se toman como argumentos de los Objetos. Ellos se llaman tecleando un punto seguido del nombre del método exactamente después del nombre del objeto: SomeObject.ThisObjectMethod(parameters) Esto puede verse como una digresión, pero estamos interesados en objetos ChemBasic que representen moléculas en la ventana de ChemSketch. Para acceder a ellos necesitamos objetos que sean representados con sus contenidos en ChemSketch. 2.5 Páginas y Colecciones en ChemSketch En términos de ChemBasic su documento ChemSketch actual esta representado por el objeto Document, que es una colección de objetos de tipo página (collection of objects of type Page). Esto significa que Document es un conjunto de miembros objeto, cada uno de los cuales es una página (Page); puede fácilmente contarlos, encontrar cualquier miembro, borrarlo o adicionar uno nuevo, llamando el método de colección (aquí, se refiere a Document) Nota Vea la ayuda ChemBasic para una discusión más detallada sobre colecciones. Por ejemplo, el texto DocumentObject.Count Exige a ChemBasic contar los miembros de la colección. Usted puede escribir algo como: Dim Npages As Integer ‘reserve an integer variable Dim Doc As Object ‘reserve an object variable ‘Get Doc somewhere Npages=Doc.Count ‘count pages Doc.AddEmpty ‘add blank page Doc.AtRemove(1) ‘remove 1st page of document Nota Ver la ayuda ChemBasic para la descripción de los métodos de colección adicionar página vacía (AddEmpty), remover (AtRemove), y alejar (so far). Una recomendación: la declaración especial con (UIT) drásticamente reduce el volumen del código. Después que haya escrito With SomeObject , no necesita mencionar SomeObject cuando invoque su método. Solamente necesita simplificar el nombre del método precedido por un punto. Reescriba nuestro ejemplo: Dim Npages as Integer ‘reserve an integer variable Dim Doc as Object ‘reserve an object variable ‘Get Doc somewhere … With Doc Npages=.Count .AddEmpty .AtRemove(1) ‘count pages ‘add blank page ‘remove first page of document End With ACD/ChemBasic Comenzando 10 Nota Corrientemente no puede usar anidaciones con las asignaciones en ChemBasic. La función especial ActiveDocument rle retorna una dirección del documento activo. Así, el código de abajo hace las siguientes acciones en su documento actual: Dim Npages As Integer ‘reserve an integer variable With ActiveDocument Npages=.Count .AddEmpty .AtRemove(1) ‘count pages ‘add blank page ‘remove first page of document End With (Note que hemos omitido la variable objeto y simplemente la mencionamos en la asignación ActiveDocument. Si define ActiveDocument usando “Dim ActiveDocument as Object” entonces observará un mensaje de error en la variable inicializada.) Suficiente en los documentos; ahora en las páginas. El objeto Página (Page) es un miembro de una colección, como lo ha podido ver. Pero es en sí una colección misma, sin embargo, contiene un número de colecciones correspondiente a diferentes clases de dibujos ChemSketch (cajas de texto, rectángulos, etc.). Hay métodos para los objetos Página, que retornan las colecciones hijos. El interés para nosotros ahora es el método Diagramas de Página que retorna al objeto Diagramas – una colección de todos los diagramas moleculares dibujados en la página. Una vez que haya la colección, puede adicionar, remover o encontrar cualquier miembro de un objeto en particular. 2.6 Hola, Sr. Propano! Regresemos a nuestro objetivo. Como un primer intento, acogeremos la primera molécula en la ventana activa de ChemSketch. Para ejecutar esta tarea, accederemos a la página activa del documento y obtenemos su primer diagrama molecular. Por conveniencia, encapsularemos todos los trabajos con diagramas en una subrutina separada; nuestra función principal será responsable de preguntar al usuario si direcciona la molécula ChemSketch personalmente para luego llamar el procedimiento tratamiento de diagramas (diagram-treating). Mire como: Function Main as String Dim Answer as Integer ‘Say hello to all Answer=MessageBox("Hello, Molecules!","Example #1", MBB_OK + MBI_INFORMATION) ‘Ask user if (s)he want to pronounce the name(s) Answer=MessageBox("Say Hello to all? ","Example #1", MBB_YESNO + MBI_QUESTION) If Answer= MBR_YES Then ‘yes, (s)he wants Call GreetByName ACD/ChemBasic Comenzando 11 Main=” Everybody welcomed.” Else ‘No, leave this Main=”Sorry, we leave them.” End If End Function Note, que usamos el valor sin usar que se retorna de la caja de mensaje. También implementamos una asignación de condicional si...entonces… (conditional statement If … Then … Else) para trabajar respuetas alternativas del usuario. Nota Vea la ayuda ChemBasic para más detalles de condicionales si...entonces...(If … Then … Else) y seleccione el caso (Case…) Si crea un nuevo archivo de texto llamado “hello.bas” desde el ejemplo anterior y selecciona archivo/correr (File/Run) en ChemBasic cuando entre en la ventana ChemSketch recibirá un mensaje de error acerca de un identificador no declarado: significa esto que estamos errados en la subrutina GreetByName. He aquí un primer diseño de como planeamos tratar el diagrama: Sub GreetByName Dim Diagram as Object, Answer as Integer, MolName as String With ActiveDocument.ActivePage.Diagrams MolName=.Item(1).GetIUPACName Answer=MessageBox("Hello, "+MolName+"!","Example #1", MBB_OK+MBI_EXCLAMATION) End With End Sub Adicione esta subrutina a la función principal en hello.bas, dibuje una molécula tal como el propano en ChemSketch y ejecute el programa ChemBasic. Verá al inicio una pregunta: haga clic en Yes y después de una pausa verá: ACD/ChemBasic Comenzando 12 Observemos la subrutina GreetByname un poco más de fondo. Primero obtendremos los diagramas invocando ActiveDocument.ActivePage.Diagrams con la asignación With. Después obtendremos un diagrama estructural desde una colección usando el ítem método (method). Qué es un diagrama estructural? Lo primero como ve, el número entre paréntesis: “Item(1)”. Y finalmente aplicamos el método llamado GetIUPACName para el Objeto Diagrama (Diagram object). Este método retorna la cadena que contiene el nombre IUPAC generado al correr la rutina de Librería de ACD/ChemBasic (en verdad la mayoría si no todos los métodos de objetos son internamente trasladados a las llamadas RTL). Note que nuestro código es totalmente equivalente a una forma completa (sin la abreviatura With): MolName=ActiveDocument.ActivePage.Diagrams.Item(1).GetIUPACName Nota El método GetIUPACName retorna el nombre correcto solamente si tiene instalado el paquete ACD/Name, de otra forma se retorna una cadena vacía. Repetimos por claridad, que es lo que hace aquí ChemBasic: 1. obtiene el documento activo ACD/ChemSketch; 2. obtiene su página activa (la ventana visible de ChemSketch); 3. obtiene todos los diagramas moleculares de la página: 4. extrae el primer diagrama de la colección: 5. aplica el método GetIUPACName al diagrama; 6. saca el nombre y saluda. Nota Vea la ayuda ChemBasic para los métodos del objeto Diagrama ACD/ChemBasic Comenzando 13 2.7 Hola a varios Individuos El paso final que debemos hacer es direccionar todas las moléculas en la página, no solamente la primera. Para hacer esto, se debe implementar la construcción de un ciclo en ChemBasic. La forma más común en otros lenguajes de programación es la asignación For … To: Dim i As Integer For i=1 To 10 Do_Something Next I Esto significa que todas las asignaciones encerradas entre el For .. To y Next se repetirán diez veces y la variable i (contador cíclico) se irá incrementando de uno en uno, comenzando desde uno hasta llegar al valor de diez, en donde el ciclo termina. En nuestro ejemplo, podríamos repetir un ciclo para cada diagrama. De esta forma, primero contamos el número de diagramas: Sub GreetByName Dim Answer as Integer, MolName as String Dim i,Ndiagrams as Integer With ActiveDocument.ActivePage.Diagrams ‘Count the diagrams Ndiagrams=.Count For i=1 To Ndiagrams MolName=.Item(i).GetIUPACName Answer=MessageBox("Hello, "+MolName+"!","Example #1",MBB_OKCANCEL+MBI_EXCLAMATION) If Answer= MBR_CANCEL Then Exit For Next i End With End Sub Remplace la subrutina en hello.bas por la subrutina anterior, y guarde el archivo de texto. Dibuje otra molécula en la misma página ChemSketch page como la que contiene el propano. Cuando ejecute el programa, verá el saludo individual de cada molécula. Note, sin embargo, que no tenemos necesidad de aplicar el ciclo i en la subrutina. Todo lo que se necesita es tener los miembros de una colección. Para cada caso, ChemBasic tiene el llamado object-loop para cada uno: For Each MemberObject In CollectionObject MemberObject.CallSomeMethod ACD/ChemBasic Comenzando 14 Next MemberObject Esto significa que todas las asignaciones entre cada For … y Next se repetirán con cada miembro de una colección, de tal forma que al rescribir el código quedaría: Sub GreetByName Dim Diagram as Object, Answer as Integer Dim NextName,Tail as String Tail=Chr(13)+Chr(13)+Chr(13)+"Greet the next?" With ActiveDocument.ActivePage.Diagrams For Each Diagram In .Self NextName=Diagram.GetIUPACName Answer=MessageBox("Hello, "+NextName+"!"+Tail,"Example #1", MBB_OKCANCEL+MBI_EXCLAMATION) If Answer= MBR_CANCEL Then Exit For Next Diagram End With End Sub Guarde el archivo y córralo después de dibujar para que diga, propano, etano y metano en una sola pagina ChemSketch. El primer saludo será el siguiente: ACD/ChemBasic Comenzando 15 observe el método .Self en la subrutina anterior. Si intenta retornar el objeto mismo cuando se aplica sobre cualquier objeto– es aceptable cuando se combina con la construcción With exactamente como se mostró. Nota Vea la ayuda ChemBasic para una descripción de la asignación bucle (ciclo) Ahora el paso final. La situación puede ocurrir donde el RTL no retorne el nombre IUPAC, por alguna razón. En tal caso, GetIUPACName retornará una cadena vacía o una cadena que contiene espacios. Se debe chequear esto y aun trasladar la molécula o llamarla con otro nombre. Esto se implementa como sigue: if Trim(MoltName)="" then MolName=" though I can not pronounce your name" (La función Basic Trim remueve permitiendo y colocando espacios desde un argumento cadena). Finalmente… se encuentra que le decimos hola a todas ellas! Felicitaciones! Nota Vea el texto completo del programa en el Apéndice. ACD/ChemBasic Comenzando 16 3. Los frutos del Arbol Molecular 3.1 Objetivos En este capítulo aprenderá Cuál es el objeto del árbol molecular ChemBasic; Cómo acceder a sus ramas; Cómo crear nuevos objetos moleculares; Cómo vincular objetos moleculares con páginas ChemSketch; Cómo analizar conformaciones y moléculas. 3.2 Designar Asignaciones (Relaciones) Consideremos un ejemplo de la vida real. Suponga que estamos interesados en qué ácidos carboxílicos de la familia HO-(CH2)n-COOH, tienen una corta distancia entre el carbono carboxílico y el oxígeno del grupo hidróxido. Esta situación es concebible si designamos receptores para esos ácidos y estamos interesados en enlazar simultáneamente moléculas por los grupos finales carboxi e hidroxi. con ChemBasic, se permite hacer las siguientes asignaciones: Generar las moléculas HO-(CH2)n-COOH con n átomos, decimos, 1 hasta 10; Hacer las estructuras de forma optimizada; Hallar las distancias (H)O --- C(OOH) y si la distancia es menor a 5 Angstroms, marcar la estructura; Mostrar todas las estructuras en un sola página ChemSketch. Para acompañar la misión, observe los objetos moleculares en ChemBasic. 3.3 Referencia de Objetos Moleculares Para describir el mundo molecular ChemBasic usa un árbol de sus propios objetos moleculares. Ellos están relacionados, pero no son idénticos, con los diagramas moleculares ChemSketch (Objetos Diagrama ). Nosotros permitimos "sombras" en 2D y en 3D en ChemSketch, para algunas pinturas de moléculas. Los Átomos en los diagramas de ChemSketch tienen etiquetas, coordenadas de la pantalla (en centímetros o pulgadas), y mucho más. Los átomos en moléculas ChemBasic tienen carga nuclear y masas atómicas, las coordenadas 3D (en Angstrom), etc. Naturalmente, estos objetos están relacionados y esto asegura la oportunidad de crear un modelo molecular en ChemSketch. Pero para tratar con este modelo como con una molécula real nosotros debemos convertirlo en una entidad de ChemBasic. ACD/ChemBasic Comenzando 17 Nota Las diferencias entre los objetos moleculares de ChemSketch y de ChemBasic fueron creadas intencionalmente. ChemSketch contiene muchas características, tal como control automático de valencia, que es muy conveniente para la aplicación de dibujo. Sin embargo, estas características controladas restringen la libertad de operación con moléculas, las cuales son necesarias en el manejo del lenguaje de moléculas. Así, los diagramas ChemSketch y los árboles moleculares ChemBasic están claramente separados pero existe un riguroso mecanismo de avance y retroceso entre ellos. En el mundo ChemBasic, todo esta compuesto de átomos (objeto Atom). Los átomos se pueden coleccionar en grupos llamados objetos ensamblados (Assembly). El esquema de conexión de los átomos de un ensamble dado se llama una Molécula. Una colección de coordenadas atómicas (x,y,z, Angstroms) se llama Conformación. cualquier Molécula o Conformación se basa en Arreglos (Assembly). ChemBasic automáticamente rastrea y actualiza la colección de Moléculas y Conformaciones (auto colecciones), que contienen todas las moléculas y conformaciones ligadas al arreglo particular. puede asociar algunos objetos de Moléculas y Conformaciones ligados al mismo Arreglo. Los objetos compuestos que resultan se llaman Estructuras. Objetos Estructura están también reunidos en objetos Estructuras, ligados al Arreglo. Finalmente, todos los objetos de Arreglos en esta sesión están auto reunidos dentro del objeto Arreglos. De esta forma, puede acceder a cualquier Arreglo (y a su árbol derivado) como Arreglos. Item (i). Nota De hecho, ChemBasic maneja su propio pool de datos moleculares y de colecciones. Todas sus operaciones se trasladan dentro de operaciones con objetos de su pool justamente como lo hace ChemSketch con sus páginas y dibujos. Esto le permite guardar lo tratado anteriormente sobre colecciones. Los niveles moleculares predefinidos crean una capa abstractiva que custodia sus objetos, la capa maneja memoria, rastrea objetos desaparecidos, su mutua influencia, etc. Sin embargo, no se debe preocupar con el mecanismo interno, usted trata solamente con sus árboles moleculares. Este paradigma, aunque alguna veces inusual en primera instancia, sigue las rutas que hemos descrito verbalmente para el mundo molecular. Las bases generales se refieren a átomos y sus grupos. El mismo grupo de átomos puede tener diferente conectividad. Esto significa que tiene un adecuado camino para describir átomos de enlaces isoméricos diferentes en objetos Molécula unidos al mismo Arreglo. Además, los átomos en el grupo pueden tener diferentes coordenadas de tal forma que tiene una ruta adecuada para describir confórmeros diferentes en los objetos Conformación unidos al mismo Arreglo. Note que ninguna conformación se refiere al esquema enlazante ni al esquema de valencia referido a las coordenadas atómicas. Para integrar esta clase de datos se debe introducir más de un objeto Estructura. Como puede ver, todos los objetos forman una especie de árbol. (O mejor enarbolar sería más apropiado?) ACD/ChemBasic Comenzando 18 Arbol Molecular ChemBasic Enlace Atomo Punto Arreglo Moleculas Conformaciones Molecula Conformacion Estructura Estructuras Examinemos las ramas del árbol con más detalle. Atomo Es el objeto fundamental en la jerarquía, este representa átomos aislados no conectados. Los átomos pueden coleccionarse dentro del objeto Arreglo. Enlace Indica la conexión de dos átomos. Los enlaces pueden colectarse dentro del objeto Molécula. El mismo enlace puede incluirse en muchas moléculas. Para crear un enlace, use la función ChemBasic Nuevo enlace (NewBond). Para destruir un enlace, use la función Destruir (Kill). Para hacer o romper el enlace en una molécula particular, use el método de objeto Molécula. Punto Representa un punto en el espacio ocupado por un átomo. Los puntos se coleccionan dentro de un objeto Conformación. Los puntos no pueden ser removidos o adicionados a la colección Conformación. El usuario puede incluir puntos directamente o a través de una Conformación. Arreglo Es un grupo de objetos Átomos que sirven como para todas las entradas moleculares. Cualquier átomo puede asociarse con muchos ensambles. Uno puede repartir simultáneamente el naftaleno con su benceno constitutivo como tres moléculas diferentes basadas en tres ensambles hechos de los mismos átomos (por ejemplo. Teniendo los mismos repartos). Cualquier Arreglo puede tener múltiples uniones en objetos Conformación, Molécula y Estructura, todos los cuales son (auto) colleccionados dentro de las colecciones Conformaciones, Moléculas, y Estructuras. Si el Arreglo base es modificado, este involucra todos los objetos chicos. Por ejemplo, removiendo un Átomo del Arreglo automáticamente destruye todos los Puntos y Enlaces relacionados y actualiza todos los objetos. ACD/ChemBasic Comenzando 19 Molécula Es un esquema de valencia construido al inicio del Arreglo atómico. Típicamente, esta conectado pero puede desconectarse si se quiere. Aunque Molécula encapsula significados químicos de información sobre enlaces de átomos, no se incluye información acerca de la estructura 3D. Para acceder posteriormente, debe referirse a un objeto separado Conformación. Técnicamente hablando, Molécula es, primariamente, una (auto) colección de objetos Enlaces. Esta colección esta estrictamente asociada con su base Arreglo. Este cambia si el arreglo asociado se modifica. Por ejemplo, removiendo un Átomo de un Arreglo automáticamente borra todos los objetos enlace relacionados y actualiza la Molécula (colección enlaces). Conformación Representa la posición del Arreglo átomos en el espacio. La razón para separar la conformación de su arreglo es que este puede tener muchas conformaciones. De hecho, lo que queremos decir aquí por conformación es que es sólo un instantánea de posiciones atómicas (qué no puede ser estable o químicamente razonable). El arreglo puede tener tantas conformaciones como usted desee. La Conformación esta estrictamente asociada con un Arreglo simple (objeto base). Cualquier Arreglo puede tener múltiples asignaciones a objetos Conformación, todos ellos están colectados automáticamente dentro de unos objetos Conformaciones que están siempre ligados al arreglo. Las Conformaciones de objetos derivados (hijos) son objetos Estructura. Cualquier Conformación puede tener múltiples objetos Estructura asignados todos los cuales están auto colectados dentro de los objetos Estructuras los cuales siempre están disponibles para unirlos a un Arreglo. La Conformación cambia si el Arreglo patrón se modifica. Si se borra el último, todas las conformaciones se destruyen inmediatamente. Los cambios en las Conformaciones modifican todas sus Estructuras derivadas. Por ejemplo, removiendo un Átomo desde un Arreglo automáticamente borra todos los objetos Punto relacionados y actualiza todos los objetos Conformación derivados (colecciones Punto). Cambiando las coordenadas atómicas en la Conformación tendrá influencia en todas las Estructuras derivadas. Técnicamente hablando, la Conformación es, primariamente, una (auto) colección de objetos Punto. Estructura Es el hijo de una Conformación y una Molécula basada en un Arreglo común de átomos. Para acceder a los objetos padre, use los métodos de referencia de Estructura (vea abajo). 3.4 Cómo Crear y Destruir Objetos? Para crear un átomo, use la función ChemBasic Nuevo Átomo (NewAtom). Dado que el Átomo está debajo de todos los otros objetos moleculares, destruirlo es permitido pero es peligroso. Atom.Kill modificará todos los arreglos relacionados con moléculas, estructuras, y conformaciones. Los objetos Enlace y Punto que usen este átomo se destruirán. Así, para destruir un átomo, use la función destruir (Kill). Para quitar un átomo de un arreglo particular, use la función .AtRemove. Crear un enlace o un punto, use Nuevo enlace o Nuevo punto (NewBond o NewPoint). Para crear un nuevo Arreglo, use el método Adicionar vacío (AddEmpty) en la auto colección Arreglos de ChemBasic. Los Arreglos también pueden crearse al importarlos. Note que una vez creados, los Arreglos ChemBasic relacionan todas las referencias a las Moléculas y a las Conformaciones. Para crear un nuevo objeto Molécula para un Arreglo dado, use el método AddEmpty para la colección Moléculas vinculada a este arreglo. Para crear un nuevo objeto Conformación para un Arreglo dado, use el método AddEmpty para la colección Conformaciones unidas a este arreglo. Note que el objeto Punto de una Conformación ACD/ChemBasic Comenzando 20 vacía tiene llenos los campos de Átomos y del cero de coordenadas. Puede crear también un objeto Conformación invocando el optimizador 3D o importando un archivo con coordenadas. Para crear una nueva Estructura, use el método derivado (Derive) de la colección Estructuras asociadas con un Arreglo dado. 3.5 Elaborar un Árbol Molecular Ahora, regresaremos a nuestra misión. Nuestra primera tarea es generar las moléculas HO-(CH 2)nCOOH con n, desde 1 hasta 10. Como en el ejemplo anterior ubiquemos todo el trabajo molecular en una Sub especial llamada GenerateAndAnalyze: Function Main As String Call GenerateAndAnalyze Main="Completed OK." End Function Sub GenerateAndAnalyze 'Generate - optimize - depict – analyze End Sub Ahora escriba lo siguiente: el código que sigue crea los 10 ácidos carboxílicos que se necesitan: Sub GenerateAndAnalyze 'Generate - optimize - depict – analyze Dim n,i as Integer Dim Ent,Mol,Oh, Cox,O1ox,O2ox,AtomCurr,AtomPrev As Object Const nmax=10 'In a loop .... For n=1 To nmax 'Generate 'Create a new assembly Ent=Assemblies.AddEmpty Mol=Ent.Molecules.AddEmpty 'Add OH (note that we will not add implicit hydrogen) Oh=NewAtom(8) : Ent.Add(Oh) : : : Ent.Add(Cox) Ent.Add(O1ox) Ent.Add(O2ox) 'Add COOH Cox=NewAtom(6) O1ox=NewAtom(8) O2ox=NewAtom(8) ACD/ChemBasic Comenzando 21 'Make bonds Mol.AddBond(Cox,O1ox,2) Mol.AddBond(Cox,O2ox,1) AtomPrev=Oh 'Add (CH2)n For i=1 To n AtomCurr=NewAtom(6) Mol.AddBond(AtomCurr,AtomPrev,1) AtomPrev=AtomCurr Next i Mol.AddBond(AtomPrev,Cox,1) Next n End Sub Para examinar este bucle, cree un nuevo archivo oxycarb.bas que contenga la función simple principal y la subrutina GenerateAndAnalyze como se mostró. Cuando se este ejecutando, encontrará un código de retorno claro, pero no se sorprenda si no aparecen moléculas…hasta ahora no hemos indicado como pueden mostrarse las moléculas. Qué toma lugar aquí? Incrementamos el bucle en un ciclo con un contador n, que expresa el número de metilenos entre los extremos de una molécula. En cada paso del ciclo, primero se crea un nuevo arreglo: Ent=Assemblies.AddEmpty Y una molécula nueva Mol=Ent.Molecules.AddEmpty En el momento, ambos están vacíos. Ahora se pueden adicionar átomos al arreglo. Para hacer esto, creamos un átomo y se adicionan otros. (Note que NewAtom recibe como un parámetro el número del elemento del átomo que se ha creado): 'Add OH (note that we will not add implicit hydrogen) Oh=NewAtom(8) : Ent.Add(Oh) : : : Ent.Add(Cox) Ent.Add(O1ox) Ent.Add(O2ox) 'Add COOH Cox=NewAtom(6) O1ox=NewAtom(8) O2ox=NewAtom(8) ACD/ChemBasic Comenzando 22 entonces, adicionamos enlaces a la construcción de la molécula al inicio del arreglo. Podríamos hacer esto como con los átomos a través de subsecuentes iteraciones de NewBond y de MoleculeObject.Add. Sin embargo, mostramos un camino más rápido (note que AddBond permite las dos funciones y recibe como parámetro el orden de enlace del enlace que se ha creado ): 'Make bonds Mol.AddBond(Cox,O1ox,2) Mol.AddBond(Cox,O2ox,1) Nota Vea la ayuda ChemBasic para la explicación de NewAtom, NewBond, AddBond y funciones relacionadas. Agregamos tanto las mitades del oxígeno y del grupo carboxi como los enlaces a lo último. Adicionar y conectar los grupos metileno es algo más engañoso: AtomPrev=Oh 'Add (CH2)n For i=1 to n AtomCurr=NewAtom(6) Mol.AddBond(AtomCurr,AtomPrev,1) AtomPrev=AtomCurr Next i Mol.AddBond(AtomPrev,Cox,1) Qué significa esto?. Adicionamos carbonos consecutivos en un ciclo ( For i=1 To n) y conectamos cada uno de ellos al átomo previo (AtomPrev) de la cadena. Observe el código. Antes de comenzar el ciclo, el primer átomo era el oxígeno del hidroxilo. Así que el primer metileno será conectado a este oxígeno. Antes de que el metileno se coloque AtomPrev. De esta forma el siguiente metileno se adicionará en el Segundo paso del ciclo y aparecerá conectado al primero y así sucesivamente hasta que el límite de carbonos (n) se alcance. Finalmente, formaremos un enlace entre el ultimo metileno en la cadena para conectar al carbono carboxilo ( Cox). 3.5.1 La Acción tomar Existencias A estas alturas, usted podría querer ver su molécula en la Ventana de ChemSketch. Para hacer esto, pueden hacerse dos modificaciones a su archivo oxycarb.bas que creó anteriormente. 1. escoja un máximo entre uno y 10; note que esto es temporal y para propósitos de ensayo; 2. inserte el tipo de declaración Dim Page, Diagram as Object dentro de la subrutina GenerateAndAnalyze; 3. inserte las siguientes cuatro líneas de código antes de finalizar la subrutina: Page=ActiveDocument.ActivePage Diagram=Page.Diagrams.AddEmpty Diagram.Depict(Mol) ACD/ChemBasic Comenzando 23 Ahora, cuando corra oxycarb.bas, verá una molécula creada en la parte superior izquierda de la página de ChemSketch. Esto de hecho no es elegante, todos los átomos quedan entre si uno encima del otro, pero la molécula existe. ¡Es un consuelo grande, y ahora nosotros podemos seguir el resto de la tarea! Usted puede poner el n máximo (nmax) hasta 10.. 3.5.2 Optimización y Medida Estamos listos para hacer la próxima tarea—optimizando la estructura y calculando la distancia (H)O --- C(OOH). El código necesario es bien simple. Primero, haremos el método Do3Doptimize, el cual se aplica al objeto Molécula. Este método invoca al Optimizador (ACD/3Doptimizer), exactamente igual que en ChemSketch. Se crea el objeto Conformación complete con las coordenadas atómicas optimizadas, asociandolas a la Molécula original y retorna la Estructura resultante: 'Optimize a structure Struc=Mol.Do3DOptimize(0.1) Luego aplicamos un método para un objeto Estructura, llamado GetDist, para calcular la distancia interatómica (esto es que donde sea, al comienzo de la Sub, podríamos declarar una variable necesaria r): 'Check out the distance r=Struc.GetDist(Cox,Oh) Nota Vea la ayuda ChemBasic para una descripción más detallada del Do3Doptimize, GetDist y de los métodos relacionados. Y, finalmente, marcamos los átomos con un rótulo ($) si la distancia es menor a 5 A: If (r<=5.0) Then Cox.SetName("$") Oh.SetName("$") End If El método SetName asigna el nombre del objeto. Para un átomo, el nombre es un rotulo de cadena, que esta típicamente vacío, pero puede contener un texto arbitrario. El texto se mostrará en el diagrama molecular del ChemSketch, cuando traslademos nuestra Estructura al Diagrama. Importante Asegurarse que el nombre del átomo no tiene nada en común con los elementos número de los átomos. 3.5.3 Refinando la Salida Ahora podemos hacer la traslación de la estructura a un diagrama y podemos crear un dibujo apropiado. Esto se hace para remplazar las líneas del diagrama que se agregaron anteriormente.. Los pasos necesarios son: ACD/ChemBasic Comenzando 24 1. Crear un diagrama (por defectot) ChemSketch vacío 'Depict as a ChemSketch diagram Diagram=ActiveDocument.ActivePage.Diagrams.AddEmpty 2. Pintar la estructura sobre este diagrama Diagram.Depict(Struc) 3. y redimensionar el diagrama para que sea más legible: 'Set diagram size to fit all diagrams to a page Page=ActiveDocument.ActivePage 'Read out page parameters ph=Page.GetHeight pw=Page.GetWidth l=Int(pw/3) t=200+(n-1)*Int(ph/(nmax+1)) w=Int(pw/6) h=Int(0.9*ph/(nmax+1)) Diagram.SetBound(l,t,w,h) Presentamos algunas palabras de explicación. La construcción Diagram=ActiveDocument.ActivePage.Diagrams.AddEmpty Diagram.Depict(Struc) está en idioma ChemBasic para mostrar un objeto Estructura en la ventana ChemSketch. Un idioma relacionado para la tarea contraria,, convertir desde un Diagrama a una Estructura, requiere el método de Arreglos AddFromCS para extraer la primera Estructura unida al Arreglo que justamente se ha recibido: Structure=Assemblies.AddFromCS(DiagramObject).Structures.Item(1) Nota Vea la ayuda ChemBasic para una descripción más detallada sobre pintar (Depict) y GetFromCS. 3.5.4 Redimensionar el Diagrama Molecular Redimensionar un diagrama molecular requiere obtener la posición (el que se da por defecto) y dimensionar el rectángulo incluido en el diagrama o en un marco. Esto se acompaña del método GetBound que es aplicable a cualquier objeto dibujo de ChemSketch, porque como cualquier objeto ACD/ChemBasic Comenzando 25 esta localizado dentro de un marco invisible. Los parámetros del método están arriba a la izquierda de las coordenadas del marco, así como el ancho y el alto. Después de obtenerlos, puede calcular el tamaño y posición más apropiado para el marco, y redimensionarlo con SetBound. La matemática presentada en el código anterior sirve simplemente para colocar nuestro máximo de moléculas (nmax) para la página ChemSketch (cuyas dimensiones están disponibles a través de los métodos y GetHeight). Nota Vea la ayuda ChemBasic para ampliar una descripción detallada de los métodos SetBound, GetBound y GetFont, SetFont, SetFontSize. Finalmente, por conveniencia, podemos adicionar texto, indicando la distancia interatómica de interés cerca de la imagen de la molécula. Para esto, adicionamos a la página ChemSketch un objeto vacío TextBox, y lo llenamos con la información necesaria y la redimensionamos para un presentación adecuada: 'Add a textbox indicating the distance ‘carbonyl carbon ---- hydroxy oxygen TBox=Page.TextBoxes.AddEmpty TBox.SetContent("Cox---Ooh "+FStr(r,10,4)) TBox.SetBound(l+Int(1.1*w),t+Int(h/2),w,h) Nota Vea la ayuda ChemBasic para ampliar la información sobre los métodos TextBoxes, SetContent, y GetContent y la función FStr (que simplemente convierte el número a cadena (carácter)). Nuestro viaje ha finalizado. El texto complete del programa se presenta en el Apéndice (contiene otras líneas de código con declaraciones y chequeos para algunos casos de potenciales errores). Por favor, ejecute y vea que pasa. Diviértase! Nota Este Tutorial se da como una guía para su primer paseo por ChemBasic. Esperamos que haya adquirido una buena impresión sobre este potente y simple lenguaje de manipulación de moléculas. Para una referencia más detallada, use la ayuda en línea o contáctenos en support@acdlabs.com. ACD/ChemBasic Comenzando 26 4. Apéndice. Texto completo de los programas de muestra 4.1 HELLO.BAS ' Este programa ' presenta todas las moléculas en la ventana actual de ChemSketch; ' genera sus nombres IUPAC ‘ y dice Hola a todas ellas Function Main As String Dim Answer As Integer Answer=MessageBox("Hola, Moléculas!","Example #1", MBB_OK +MBI_EXCLAMATION) Answer=MessageBox("Decir Hola a todas? ","Example #1", MBB_YESNO + MBI_QUESTION) if Answer= MBR_YES Then Call GreetThemAll Main=" Bienvenido todo el Mundo." Else Main=" Lo siento, nosotros los dejamos." End If End Function Sub GreetThemAll Dim Diagram as Object, Answer as Integer, MolName,Tail as String Tail=Chr(13)+Chr(13)+Chr(13)+"Greet the next?" With ActiveDocument.ActivePage.Diagrams For Each Diagram In .Self MolName=Diagram.GetIUPACName If Trim(MolName)="" Then MolName=" aunque yo no puedo pronunciar su nombre" Answer=MessageBox("Hola, "+MolName+"!"+Tail,"Example #1", MBB_OKCANCEL+MBI_EXCLAMATION) if Answer= MBR_CANCEL ACD/ChemBasic Then Exit For Comenzando 27 Next Diagram End With End sub 4.2 OXCARBOX.BAS ' Este programa ' (i) coloca en la ventana actual de ChemSketch ' las moléculas de fórmula general HO-(CH2)n-COOH, n=1-10, ' (ii) permite la optimización 3D para todas ellas y ' (iii) marca aquellas que contienen un grupo hidroxilo con el oxígeno ' del carbonilo menor a 3 Angstroms Const nmax=10 Function Main As String Dim Entities (1) As Object Call GenerateAndAnalyze Main="Terminado." End Function Sub GenerateAndAnalyze 'Generate - optomize - depict - analyze Dim n,i,ph,pw,l,t,w,h as Integer, r As Double Dim Ent,Mol,Oh, Cox,O1ox,O2ox,AtomCurr,AtomPrev, Page,Diagram, Struc,Font, TBox As Object 'Hacer una página Page=ActiveDocument.ActivePage 'Si la página no esta vacía, crea una nueva If Page.Drawings.Count>0 Then Page=ActiveDocument.AddEmpty 'Leer los parámetros de la página ph=Page.GetHeight pw=Page.GetWidth ACD/ChemBasic Comenzando 28 'In a loop .... For n=1 to nmax 'Generar 'Crea un nuevo arreglo Ent=Assemblies.AddEmpty Mol=Ent.Molecules.AddEmpty 'Add OH (note que no adicionamos hidrógenos implícitos) Oh=NewAtom(8) : Ent.Add(Oh) Cox=NewAtom(6) : Ent.Add(Cox) O1ox=NewAtom(8) : Ent.Add(O1ox) O2ox=NewAtom(8) : Ent.Add(O2ox) 'Add COOH 'Hacer enlaces Mol.AddBond(Cox,O1ox,2) Mol.AddBond(Cox,O2ox,1) AtomPrev=Oh 'Add (CH2)n For i=1 To n AtomCurr=NewAtom(6) Mol.AddBond(AtomCurr,AtomPrev,1) AtomPrev=AtomCurr Next i Mol.AddBond(AtomPrev,Cox,1) 'Optimizar una estructura Struc=Mol.Do3DOptimize(0.1) 'Cheque la distancia r=Struc.GetDist(Cox,Oh) If (r<=5.0) Then Cox.SetName("$") Oh.SetName("$") End If 'Dibujar como un diagrama ChemSketch ACD/ChemBasic Comenzando 29 Diagram=Page.Diagrams.AddEmpty Diagram.Depict(Struc) 'Escoja el tamaño del diagrama para llenarlos todos en la página l=Int(pw/3) t=200+(n-1)*Int(ph/(nmax+1)) w=Int(pw/6) h=Int(0.9*ph/(nmax+1)) Diagram.SetBound(l,t,w,h) 'Escoja la fuente para los símbolos atómicos Font=Diagram.GetFont Font.SetFontSize(24) Diagram.SetFont(Font) 'Adicionar cajas de texto indicando las distancias ‘carbono carbonilo ---- oxígeno del hidroxi TBox=Page.TextBoxes.AddEmpty TBox.SetContent("Cox---Ooh "+FStr(r,10,4)) TBox.SetBound(l+Int(1.1*w),t+Int(h/2),w,h) Next n End Sub ACD/ChemBasic Comenzando 30