Índice del Foro www.mediocad.com www.mediocad.com
TODO SOBRE MICROSTATION. MDL, MVBA, MACROS.
 
 F.A.Q.F.A.Q.   BuscarBuscar   Lista de MiembrosLista de Miembros   Grupos de UsuariosGrupos de Usuarios   RegístreseRegístrese 
 PerfilPerfil   Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   ConectarseConectarse 

Crear patterns temporalmente

 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.mediocad.com -> MVBA
Ver tema anterior :: Ver siguiente tema  
Autor Mensaje
vicmon
Entusiasta
Entusiasta


Registrado: 12 Ago 2008
Mensajes: 76

MensajePublicado: Jue Mar 10, 2011 9:23 am    Título del mensaje: Crear patterns temporalmente Responder citando

Hola,

Quiero utilizar los patrones (patterns) para mostrar al usuario un polígono, pero que no se guarde el patrón en el elemento. Es decir, que al redibujar la vista, éste desaparezca.

Sacado de la ayuda:

Código:

Sub DoPattern(ele As ShapeElement)
    Dim ptrn As CrossHatchPattern
   
    CadInputQueue.SendCommand "NULL"
   
    '  Use a CrossHatchPattern object to set up the parameters for
    '  the hatching operation.
    Set ptrn = CreateCrossHatchPattern(1000, 1000, Pi / 4, -Pi / 4)
   
    Dim vertices() As Point3d
    vertices = ele.GetVertices
   
    '  SetPatternWithOrigin knows this is a cross hatch because the
    '  patterning parameters are being passed in a CrossHatchPattern
    '  object.
    ele.SetPatternWithOrigin ptrn, vertices(2), Matrix3dIdentity
   
    '  Now save it to the file and display the pattern by redrawing
    '  the element
    ele.Rewrite
    ele.Redraw
   
    CommandState.StartDefaultCommand
End Sub


Si no se hace ele.Rewrite al hacer el Redraw no se dibuja. Pero no quiero hacer el Rewrite para no grabar en pattern en el elemento.

¿Alguna idea?

Gracias.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
mediocad
Gran Maestro
Gran Maestro


Registrado: 09 Jun 2005
Mensajes: 1509
Ubicación: Madrid

MensajePublicado: Jue Mar 10, 2011 9:11 pm    Título del mensaje: Elementos Transitorios (TransientElementContainer) Responder citando

Después de escribir lo que he puesto más abajo he probado tu código en MS 2004 Edition y funciona perfectamente comentando la línea ele.Rewrite
Al final tienes el código mío que no es más que una función que busca shapes y se la pasa a la tuya. He creado un DGN con una shape y funciona.

¿Con qué versión de MS trabajas? A partir de la XM (V 08.09.02) se añadieron los elementos transitorios o TransientElementContainer.

Según definición:

Cita:
A TransientElementContainer holds a list of temporary elements in memory and displays them. A program can use a TransientElementContainer to display elements that it does not add to the model or to display changes that are not written back to the model.

y traducido:

Cita:
Un TransientElementContainer contiene una lista de elementos temporales en la memoria y los muestra. Un programa puede utilizar un TransientElementContainer para mostrar elementos que no se agregan al modelo o para mostrar los cambios que no se escriben en el modelo.


Más claro agua, ¿no?

Un ejemplo:

Código:
Demonstrates how to use a TransientElementContainer to display temporary elements that have not been added to a model.

Copy this code into a module and run the methods ShowTransientElements1, ShowTransientElements2, and ClearDisplay to run this example.


Dim tec1 As TransientElementContainer

Sub ShowTransientElements1()
    Dim ele As LineElement
    Dim flags As MsdTransientFlags
   
    '
    '   Use this pair of flags to make the elements in the container snappable and
    '   to make them display on top of other elements
    '
    flags = msdTransientFlagsOverlay + msdTransientFlagsSnappable
   
    Set ele = CreateLineElement2(Nothing, Point3dFromXYZ(15.696, 25.045, -0.64), Point3dFromXY(20.194, 23.7592))
    ''
    ''  Create a new container and put a copy of the element into it.  The container holds a copy;
    ''  changes to the original element are not displayed.
    ''
    Set tec1 = CreateTransientElementContainer1(ele, flags, msdViewAll, msdDrawingModeHilite)
   
    ''
    ''  Create anther element and append a copy of another element to the container.
    ''  Changes to the original element are not displayed.
    ''
    Set ele = CreateLineElement2(Nothing, Point3dFromXYZ(15.696, 23.759, -0.64), Point3dFromXY(20.194, 25.045))
    tec1.AppendCopyOfElement ele
   
End Sub
Sub ShowTransientElements2()
    Dim ele As LineElement
    Dim flags As MsdTransientFlags
   
    ''
    ''  Since this overwrites the only reference to tec1, tec1 is automatically freed. That process frees
    ''  the elements and erases the elements from the display.
    ''
    ''  This creates a container with no elements. Subsequent steps add the elements.
    ''
    Set tec1 = CreateTransientElementContainer1(Nothing, flags, msdView1 + msdView4, msdDrawingModeNormal)
   
    ''
    '' Now create and add the elements.
    ''
    Set ele = CreateLineElement2(Nothing, Point3dFromXYZ(15.696, 25.045, -0.64), Point3dFromXY(20.194, 23.759))
    tec1.AppendCopyOfElement ele
   
    Set ele = CreateLineElement2(Nothing, Point3dFromXYZ(15.696, 23.759, -0.64), Point3dFromXY(20.194, 25.045))
    tec1.AppendCopyOfElement ele
   
    Set ele = CreateLineElement2(Nothing, Point3dFromXYZ(15.696, 25.045, -0.64), Point3dFromXY(20.194, 25.045))
    tec1.AppendCopyOfElement ele
   
    Set ele = CreateLineElement2(Nothing, Point3dFromXYZ(15.696, 23.759, -0.64), Point3dFromXY(20.194, 23.759))
    tec1.AppendCopyOfElement ele
End Sub

Sub ClearDisplay()
    ''
    ''  Since this eliminates the only reference, MicroStation automatically invokes Reset.
    ''  Therefore, it erases the elements and frees the copies of the elements.
    ''
    Set tec1 = Nothing
End Sub

Lo que no sé es si habrá que mirarse el método CreateTransientElementContainer1. Nunca los he usado pero lo veo muy potente para ciertos programas.

Código que funciona:

Código:
Option Explicit

Sub inicio()

Dim ScanCriteria      As New ElementScanCriteria
Dim oScanEnumerator   As ElementEnumerator
Dim oElement          As Element

On Err GoTo errorGG

  ScanCriteria.ExcludeNonGraphical
  ScanCriteria.ExcludeAllTypes
  ScanCriteria.IncludeType msdElementTypeShape
 
  Set oScanEnumerator = Application.ActiveModelReference.Scan(ScanCriteria)
  oScanEnumerator.Reset
 
  Do While oScanEnumerator.MoveNext
    Set oElement = oScanEnumerator.Current
    DoPattern oElement
  Loop
 
  CadInputQueue.SendCommand "delete element"
   
errorGG:

'MsgBox Err.Description
'MsgBox Err.Number

End Sub

Sub DoPattern(ele As ShapeElement)
    Dim ptrn As CrossHatchPattern
   
    CadInputQueue.SendCommand "NULL"
   
    '  Use a CrossHatchPattern object to set up the parameters for
    '  the hatching operation.
    Set ptrn = CreateCrossHatchPattern(1000, 1000, Pi / 4, -Pi / 4)
   
    Dim vertices() As Point3d
    vertices = ele.GetVertices
   
    '  SetPatternWithOrigin knows this is a cross hatch because the
    '  patterning parameters are being passed in a CrossHatchPattern
    '  object.
    ele.SetPatternWithOrigin ptrn, vertices(2), Matrix3dIdentity
   
    '  Now save it to the file and display the pattern by redrawing
    '  the element
    ele.Rewrite
    ele.Redraw
   
    CommandState.StartDefaultCommand
End Sub
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
vicmon
Entusiasta
Entusiasta


Registrado: 12 Ago 2008
Mensajes: 76

MensajePublicado: Vie Mar 11, 2011 9:29 am    Título del mensaje: Responder citando

Hola mediocad,

Efectivamente en la versión 2004 Edition funciona sin llamar al método Redraw, pero en la XM, que es la que utilizo, no.

Utilizo la versión 08.09.04 pero MVBA no me reconoce las funciones ni tipos para los elementos TransientElementContainer. ¿Hay que añadir alguna referencia en concreto?

Por cierto, no sé porque haces el CadInputQueue.SendCommand "delete element" al final de la función de prueba "inicio". Con eso borras el shape que acabas de rellenar.

Un saludo.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
mediocad
Gran Maestro
Gran Maestro


Registrado: 09 Jun 2005
Mensajes: 1509
Ubicación: Madrid

MensajePublicado: Vie Mar 11, 2011 12:19 pm    Título del mensaje: Elementos transitorios Responder citando

Hola vicmon,

La versión de la XM que yo tengo es la 08.09.04.88 y si buscas en el help de MVBA y pones TransientElementContainer te lo encuentra.

Cito la ayuda:

Cita:
TransientElementContainer Object

A TransientElementContainer holds a list of temporary elements in memory and displays them. A program can use a TransientElementContainer to display elements that it does not add to the model or to display changes that are not written back to the model.

Version

08.09.02

Por eso te decía la versión 08.09.02

Por otro lado, que funcione en la 2004 y no en la XM ya sé por donde vas ya que ya me había dado cuenta en su día haciendo un programa. Y es que es así, a partir de la XM el .redraw no va. Yo intenté hacer un programa que hacía algo como el seleccionar según atributos de MS y me dí cuenta que no los resaltaba. Buscando info me dijeron que habían sacado un nuevo objeto que es el de los elementos transitorios y por eso sé que existen. Como era un programa para mí y lo voy haciendo a ratos, pues no lo he llegado a implementar, pero lo vas a tener que hacer con los transitorios.

Sobre mi CadInputQueue.SendCommand "delete element" es normal que no lo entiendas ya que el código que puse está sacado de otro que buscaba elementos con un Grupo Gráfico determinado y los borraba. Adapté el código a este ejemplo y se me olvidó borrara esa línea. Además para borrar un elemento usaría Application.ActiveModelReference.RemoveElement oElement que es más elegante.
Esto es lo que pasa con copy/paste . ¿O ahora me vas a decir que tú tecleas todo el código en cada programa? Colega Muy Feliz Muy Feliz Muy Feliz

Un saludo
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
vicmon
Entusiasta
Entusiasta


Registrado: 12 Ago 2008
Mensajes: 76

MensajePublicado: Vie Mar 11, 2011 12:25 pm    Título del mensaje: Responder citando

Yo también tengo la 08.09.04.88 y me sale en la ayuda, pero luego me da error en el programa. Por eso te decía que habrá que poner alguna referencia.

Y claro que yo también hago muchoooss copy/paste, colega. Laughing
Era por si se me había pasado algo.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
mediocad
Gran Maestro
Gran Maestro


Registrado: 09 Jun 2005
Mensajes: 1509
Ubicación: Madrid

MensajePublicado: Vie Mar 11, 2011 2:30 pm    Título del mensaje: Pruebas Responder citando

Como te decía no lo había probado pero todos los objetos o métodos están implementados en la misma librería y no se necesita nada. Así lo he entendido hasta ahora.

Probaré lo de los transitorios y te cuento.

Bye
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
vicmon
Entusiasta
Entusiasta


Registrado: 12 Ago 2008
Mensajes: 76

MensajePublicado: Vie Mar 11, 2011 2:40 pm    Título del mensaje: Responder citando

Ah pues ahora no me da el error en el código.
Bueno, pues voy a probarlo en mi programa y te cuento.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
vicmon
Entusiasta
Entusiasta


Registrado: 12 Ago 2008
Mensajes: 76

MensajePublicado: Mie Mar 16, 2011 9:30 am    Título del mensaje: Responder citando

He probado el código de la ayuda y funciona perfectamente.
Unas aclaraciones:

La variable de tipo TransientElementContainer (en el ejemplo tec1) tiene que ser global. Si es local en un procedimiento, se elimina cuando acaba el procedimiento, por lo que no se aprecia que el polígono se rellena.
Al ser globar, el relleno desaparece cuando se acaba el programa o cuando se ejecuta "Set tec1 = Nothing"

Muchas gracias.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
mediocad
Gran Maestro
Gran Maestro


Registrado: 09 Jun 2005
Mensajes: 1509
Ubicación: Madrid

MensajePublicado: Mie Mar 16, 2011 11:22 am    Título del mensaje: Elementos transitorios Responder citando

Hola,

Pues nos alegramos que te funcione y gracias por la apreciación de la vble.

Un saludo
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
Mostrar mensajes anteriores:   
Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.mediocad.com -> MVBA Todas las horas están en GMT + 1 Hora
Página 1 de 1

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas


Powered by phpBB © 2001, 2005 phpBB Group