PDA

Ver la Versión Completa : Imagenes elaboradas


mikexxi2
18-12-2004, 18:56:26
Hola.
Estoy desarrollando un simulador de elementos electricos industriales, lo que quiero es poder insertar en una plantilla los elementos que el usuario vaya escogiendo, algo asi como PSpice (Simulador de electronica), bueno mi problema es que he visto como insertar objetos sencillos como circulos o elipses y modificarlos, pero las imagenes a insertar son mas elaboradas (Transformadores, generadores, lineas, capacitores etc).
He visto todos los hilos de este foro y me han ayudado mucho, tengo una idea cada vez mas clara de lo que hare, pero tengo algunas dudas, para empezar.
como puedo hacer para insertar estas imagenes?, lo hago insertando un JPG o algo similar? o tengo que hacer funciones que dibujen las figuras cada que se inserte una en la plantilla?.
Ojala me puedan orientar, puesto que el resto del proyecto esta muy avanzado pero estoy atorado con esta parte.
Gracias de antemano.:)

Lepe
19-12-2004, 16:17:29
Yo usaría JPGs, para no tener que "repintar" todo el área de trabajo cada vez que se añade un elemento.

Normalmente este tipo de programas traen un archivo de Librerias de componentes, dentro de ese archivo está guardado:
- el icono pequeño (para mostara en una barra de herramientas)
- El icono grande (para mostrar en el área de trabajo del usuario)
- Puntos de Enlaces de entrada y de salida (que el usuario puede conectar con otros elementos)
(manteniendo una lista con los componentes que se permiten interconectar con él ¿?¿?)
- Propiedades Adicionales de ese objeto

En mi humilde opinión yo crearía 2 Clases, una para los componentes ( transistores, lineas, etc) con la información anterior y otra clase Maestra para administrarlos. Ya que todos los componentes tendrían el mismo comportamiento:
- Situación en el área de trabajo
- Poder moverlos en el area de trabajo
- poder Interconectarlos
- Mostrar las propiedades.

De esta forma al conectar con un cable 2 componentes, la Clase Maestra podría Permitir o No permitir que se conecten , y "sugerir" al usuario el punto de enlace correcto.

Si el usuario tiene seleccionado la herramienta "cable" y la posición actual del raton está cerca de un punto de enlace, cambiar el puntero del ratón, para hacer notar que su conexión es posible.

SizerMover de las JVCL o de las Trivials, te permiten mover un componente en el área de trabajo

Las JVCL tienen un componente como la barra de Outlook, así puedes agrupar los distintos componentes en la barra de herramientas por categorias.

En fin, suerte!!

Héctor Randolph
19-12-2004, 21:56:17
como puedo hacer para insertar estas imagenes?, lo hago insertando un JPG o algo similar? o tengo que hacer funciones que dibujen las figuras cada que se inserte una en la plantilla?.

Hola mikexxi2?

Mi recomendación es la siguiente:

Para el tipo de aplicación que estás desarrollando deberías de utilizar algún formato de vectores como WMF (Windows Meta File).

Este formato está diseñado para manejar eficientemente figuras geométricas, líneas y tipos de letra. (en algunos casos también se mezclan con mapas de bits)

La ventaja de utilizar este formato es que solamente se guardan las coordenadas y parámetros importantes para la creación de cada elemento (líneas, círculos, polígonos, etc.), además cuando cambias la escala o haces un zoom obtienes un mejor resultado visualmente ya que cada figura es recalculada a partir de sus parámetros evitando que se vean pixeladas.

Otra importante ventaja es que se aprovecha al máximo la resolución de la impresora.

Nota: Los formatos Raster (mapas de bits) como JPG, solamente son útiles cuando se trata de fotografías o imágenes que no se pueden calcular por medio de coordenadas y parámetros sencillos; su principal desventaja es la resolución, considero que obtendrías un resultado bastante desagradable al escalar las figuras si las almacenas en JPG.

Espero que el consejo te sea útil.

<Sergio>
19-12-2004, 23:59:14
Bueno lo que dice HECTOR es verdad: necesitarías unos JPEG de buena calidad y resolución. Además que un mapa de bits de alta resolución siempre va descomprimido en RAM ocupando una barbaridad de espacio.

Eso si: el resultado puede ser muy agradable en .jpeg a costa de mucha RAM y CPU con un buen algoritmo bicúbico para escalar imágenes. Podría parecer que es más fácil usar JPEG, pero no lo es y especialmente en tu caso por que lo que quieres realizar no es una composición de imágenes, es netamente vectorial.

Eso de no repintar toda el area de trabajo es tema de optimización, pero como generalmente en ese tipo de aplicación todo el tiempo se cambia de escala haciendo zoom a diestra y siniestra no vale la pena el esfuerzo de optimizar para no repintar algo que al primer click de ratón en zoom ya no será válido.

Utiliza una "superficie" para pintar en RAM (un Tbitmap de tipo device independet bitmap para que no use memoria de video en este caso eso sólo perjudicaría). Teniendo esa imagen lista repintas en pantalla cuando sea necesario. NO BORRES OBJETOS "PINTANDOLO" en otro color, directamente repinta todo menos el objeto borrado en RAM y luego lo pasas a video cuando esté listo (una llamada a repaint, si tu bitblt(), ve en la ayuda como usar este comando que es más directo, a video está en el onpaint.

Al momento de cambiar de escala tendrías que repintar toda tu superficie, pero aún así es más rápido "pintar" primero en una superficie en RAM y luego pasar el resultado final a memoria de video (pintando en el canvas de un tpaintbox por ejemplo) sólo cuando es necesario (cuando sucede el evento onpaint).

Finalmente prueba con Tbirmats a 8, 16 y 24 bits por pixel a ver cual te da menos tiempo de CPU, muy probablemente el de 8bits por baja cantidad de transferencia de memoria. Como son gráficos vectoriales (sin efectos de renderizado) 256 colores son más que suficientes.

mikexxi2
21-12-2004, 16:42:36
Muchisimas gracias por responder, me doy cuenta que este pedazo del proyecto va a ser el mas pesado y tardado de todo pero eso lo hace emocionante. Me falta mucho por aprender, voy a analizar y a ir aplicando lo que me aconsejan, y les aviso. :p