Í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 

obtener la distancia acumulada en commandState

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



Registrado: 20 Feb 2007
Mensajes: 17

MensajePublicado: Mie Jul 20, 2011 8:51 am    Título del mensaje: obtener la distancia acumulada en commandState Responder citando

Buenas, al medir una distancias, quisiera obtener el acumulado, y no la ultima distancia medida,

con CommandState.MeasureResult1 obtengo la ultima distancia medida

pero como podria obtener el acumulado?

(en MS v8i, utilizo distancia entre dos puntos)

saludos
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 Jul 21, 2011 6:55 am    Título del mensaje: Medir longitud Responder citando

Pues en la V8i efectivamente te devuelve la última longitud medida. En el tipo de vble double. guarda la longitud del último tramo. En la 2004 Edition te devolvía el total pq no diferenciaba total y parcial.

Vas a tener que crear una vble. donde se vaya guardando el MeasureResult1 de cada dato e ir acumulándolo para obtener el total.

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



Registrado: 20 Feb 2007
Mensajes: 17

MensajePublicado: Mie Ago 03, 2011 8:14 am    Título del mensaje: Responder citando

¿y como lo acumulo? por que claro, yo esto lo obtengo al pulsar una tecla (F2) y esta llama a un macro (lo he asignado hasi)


sub macro1()
Dim aux1 As String
aux1 = CommandState.MeasureResult1
call pasarAExcel(aux1)
end sub

function pasarAExcel(aux1 as string)
'abre fichero de excel y escribe el resultado de la medicion
end fuction


hay algun evento o algo hasi, cuando se hace una medición? para ir acumulando en una vble general?

gracias (pienso que estareis de vacaciones) Rolling Eyes
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 Ago 03, 2011 1:57 pm    Título del mensaje: Soluciónado Responder citando

Hola,

El que estabas de vacaciones eres tu "colega", que has tardado en contestar.

Bromas a parte, lo que yo te decía era hacerte una macro que fuese capturando cada datapoint que de el usuario e ir guardando el MEASUR en una vble. que se va incrementando por cada dato.

Como tienes que pulsar F2 para que te recoja el resultado, pues el programa lo lanzas antes de empezar a medir pulsando F2 y cuando acabe la suma total se la pasas a la función que escribe en el Excel.

Si no lo ves muy claro, dímelo y te posteo un ejemplo de lo que haría el programa.

Un saludo y los curritos seguimos.... pues....currando.
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
josu



Registrado: 20 Feb 2007
Mensajes: 17

MensajePublicado: Mie Ago 03, 2011 3:30 pm    Título del mensaje: Responder citando

pues sera que he hecho demasiadas vacaciones, Laughing pero no lo veo Confused

entiendo lo de ir acumulando, pero como??

si puedo correr un programa antes de la mediciones, pero esta tendria que estar corriendo hasta que pulse otra tecla de funcion? que esta le haga un end funcion o algo hasi??

'vble global
dim bTerminar as boolean

function fun1() 'esta arranca cuando pulse F2 (antes de realizar mediciones)
Dim aux1 As String



while bTerminar then

'acumular mediciones
'tendria que detectar una nueva medicion, ???
aux1 = CommandState.MeasureResult1 + aux1


end while

call pasarAExcel(aux1)
bTerminar =false

end function


function fun2()'esta arranca cuando pulse F3 (para terminar mediciones)
terminar = true
end function


pero esto es lineal y no entraria nunca a nunca a Fun2 mientras esta el bucle del while, tendria que lanzar un tread??

vaya cacao tengo, ahora mismo no lo veo, alguna luz? Embarassed
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 Ago 03, 2011 4:12 pm    Título del mensaje: IPrimitiveCommandEevent Responder citando

Hola,

La solución que te iba a dar es hacerlo con MVBA. Olvídate de macros y programa en Visual Basic. Tienes el objeto IPrimitiveCommandEevent, con los eventos (entre otros) DataPoint y Reset.

Utilizando el Reset, terminas de dibujar la línea con la herramienta dibujar línea y el evento hace lo que tu le digas. En tu caso devolver la longitud y cerrar el programa.

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



Registrado: 20 Feb 2007
Mensajes: 17

MensajePublicado: Mie Ago 03, 2011 5:12 pm    Título del mensaje: Responder citando

mucho tomate esto del IPrimitivecommandevents, no?

bueno he mirado en el buscador de mediocad y nada
en el examinador de obejtos aparece y en google algo he mirado

tendria que crear un objeto de esta clase?? algun ejemplo sencillo

aun y todo me parece que esto ya se me va a complicar, no?

saludos
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 Ago 04, 2011 1:38 pm    Título del mensaje: Pensando.... Responder citando

Ummmmmmmmmmmm, estoy pensando pq no es tan fácil. Al lanzar la macro antes de usar la herramienta de medir longitud, cuando pulsamos en ésta se pierde el foco de la otra que se ha cargado en memoria y ya no funciona.
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
mediocad
Gran Maestro
Gran Maestro


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

MensajePublicado: Lun Ago 08, 2011 10:28 am    Título del mensaje: Solución Responder citando

Bueno, dejo el código para crear un MVBA que realiza la misma función que medir distancia. Pero con este programa podremos capturar la distancia total o parcial de cualquier tramo. En nuestro caso era el acumulado o total.

Pasos a seguir:

1) Creamos un MVBA que llamaremos MedirDistancia.mvba
2) Añadimos formulario (nombre frmMain) con dos label: lblDistParcial y lblDistTotal. En propiedades del form ShowModal=False.
En el código del formulario:

Código:
Option Explicit

Private Sub UserForm_Terminate()
  Application.CadInputQueue.SendKeyin ("vba unload MedirDistancia")
End Sub

3)Creamos módulo con nombre: modMain
Código:

Código:
Public blnLineStringCreate As Boolean

Sub Inicio()
  frmMain.Show
  CommandState.StartPrimitive New clsMedirLinea
End Sub

4) Creamos módulo de clase llamado: clsMedirLinea
Código:

Código:
Option Explicit

Implements IPrimitiveCommandEvents

Private m_atPoints() As Point3d
Private m_nPoints As Long
Private oLineEl As LineElement
Dim oLine As LineElement

Function TwoVertecesClicked() As Boolean
    Dim VerticeVerify As Point3d
On Error GoTo errorHandler

    VerticeVerify = m_atPoints(1)
    TwoVertecesClicked = True
    Exit Function
errorHandler:
    TwoVertecesClicked = False
End Function

Private Sub IPrimitiveCommandEvents_Cleanup()
Dim i                   As Long
Dim LineStringVerts()   As Point3d
   
  If TwoVertecesClicked() = True And blnLineStringCreate = True Then
    For i = LBound(m_atPoints) To (UBound(m_atPoints) - 1)
      ReDim Preserve LineStringVerts(i)
      LineStringVerts(i) = m_atPoints(i)
    Next

    Set oLineEl = CreateLineElement1(Nothing, LineStringVerts)
    ActiveModelReference.AddElement oLineEl
    oLineEl.Redraw
   
    blnLineStringCreate = False
  End If
End Sub

Private Sub IPrimitiveCommandEvents_DataPoint(Point As Point3d, ByVal View As View)
    CommandState.StartDynamics
If m_nPoints = 0 Then 'user has entered Startpoint of the line segment
    ReDim Preserve m_atPoints(0)
    m_atPoints(0) = Point
    m_nPoints = 1
    ShowPrompt "Place next point"
ElseIf m_nPoints > 0 Then
    ReDim Preserve m_atPoints(m_nPoints)
    m_atPoints(m_nPoints) = Point
    Set oLineEl = CreateLineElement1(Nothing, m_atPoints)
    frmMain.lblDistTotal.Caption = Round(oLineEl.Length, 7)
    m_nPoints = m_nPoints + 1
    blnLineStringCreate = True
    frmMain.lblDistParcial.Caption = Round(oLine.Length, 7)
End If
End Sub

Private Sub IPrimitiveCommandEvents_Dynamics(Point As Point3d, ByVal View As View, ByVal DrawMode As MsdDrawingMode)

If m_nPoints > 0 Then
    ReDim Preserve m_atPoints(m_nPoints)
    m_atPoints(m_nPoints) = Point
    Set oLineEl = CreateLineElement1(Nothing, m_atPoints)
    Set oLine = CreateLineElement2(Nothing, m_atPoints(m_nPoints - 1), Point)
    oLineEl.Redraw DrawMode
End If
End Sub

Private Sub IPrimitiveCommandEvents_Keyin(ByVal KeyIn As String)

End Sub

Private Sub IPrimitiveCommandEvents_Reset()
Dim element As element

  CommandState.StartPrimitive Me
  Set element = ActiveModelReference.GraphicalElementCache.GetLastValidElement
  Application.ActiveModelReference.RemoveElement element
  frmMain.lblDistTotal.Caption = ""
  frmMain.lblDistParcial.Caption = ""
  m_nPoints = 0
 
End Sub

Private Sub IPrimitiveCommandEvents_Start()

blnLineStringCreate = False
CommandState.EnableAccuSnap 'Abre AccuSnap

ShowPrompt "Select start of line"
End Sub

4) Añadimos a la tecla de función que queramos:

Cita:
vba load c:\temp\LineLenght.mvba;vba run modMain.inicio

teniendo el programa en c:\temp. Si lo guardamos donde apunta la vble. MS_VBASEARCHDIRECTORIES no hace falta path.

Diferencia con lo tuyo es que después de medir intentabas recoger el dato pulsando F12. Ahora has de lanzar el programa antes.

Un saludo


Ultima edición por mediocad el Mie Ago 10, 2011 1:04 pm; editado 1 vez
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
josu



Registrado: 20 Feb 2007
Mensajes: 17

MensajePublicado: Mar Ago 09, 2011 11:13 am    Título del mensaje: aún sin probar Responder citando

he visto el mensaje, bualaaa!! Laughing

pues si que parece complicado... imprimo y lo estudio en casa, y cuando pueda probare, ya te dire

gracias
Volver arriba
Ver perfil del usuario Enviar mensaje privado
josu



Registrado: 20 Feb 2007
Mensajes: 17

MensajePublicado: Mie Ago 10, 2011 10:42 am    Título del mensaje: funciona!!! Responder citando

si señor, funciona de maravilla!!! Laughing

2 cosas ha tener en cuenta:
(para los que quieren hacer el ejemplo este)

-el formulario se llamara "frmMain" (ya, ya se que es evidente)
-y hay que marcar en propiedades del formulario "ShowModal" FALSE

si no, no nos deja actuar

la clase esta que has creado, menudo peregil Mr. Green

gracias, y ahora sigo con alguna idea que me diste hace tiempo
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 Ago 10, 2011 1:02 pm    Título del mensaje: Funciona Responder citando

Pues me alegro que te haya funcionado, aunque ya lo sabía. Razz

La clase podía haber sido mucho más sencilla porque en este ejemplo lo que creamos son Lines que se convierten en una LineString y de ésta se saca la longitud. De las Lines se saca la longitud de cada tramo. Pero al borrar el último elemento creado te borraría sólo la última Line.

También hay solución para eso y es ir guardando en un Array de Elements los Lines que vamos creando y al final sacar la longitud de cada tramo e irlos sumando para que diese el total. Pero como ya tenía casi todo el código....

Buen apunte con lo del nombre del formulario y la propiedad ShowModal para poder interactuar son el diseño.

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