Newsgroup: it.comp.software.cad
Titolo: Microstation 2004 (collega riferimenti con programma VB.Net)

 
 
Ho riportato il codice (VB.Net 2010 ) di un programma che ha la funzione di 
collegare un file di riferimento quando si clicca sul pulsante.
 
Il file dgn attivo deve essere già aperto e il file di riferimento 
(RIFERIMENTO.dgn) è posizionato sotto C:\.
 
 
 
Quando clicco sul pulsante del programma, si apre la classica finestra 
"Collega riferimenti" e successivamente sono costretto a cliccare sul 
pulsante "OK" per portare a termine la procedura.
 
E' possibile collegare il riferimento direttamente evitando di cliccare 
sull'"OK" ?
 
In poche parole, dopo aver cliccato sul pulsante del programma, il 
riferimento si deve collegare automaticamente, senza che mi venga chiesto la 
conferma...
 
 
 
Crazie
 
nero23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ' CODICE CHE HO SCRITTO NELLA CLASSE
 
Imports MicroStationDGN
 
 Public Class Form1
 
    Public ustn As New MicroStationDGN.Application()
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
 
        Dim modalHandler As New ClsModalHandler
 
        ustn.AddModalDialogEventsHandler(modalHandler)
 
        ustn.CadInputQueue.SendCommand("REFERENCE ATTACH ")
 
        ustn.RemoveModalDialogEventsHandler(modalHandler)
 
        ustn.CommandState.StartDefaultCommand()
 
    End Sub
 
End Class
 
 
 
 
 
 
 
 ' CODICE CHE HO SCRITTO NELLA CLASSE
 
 
 
Imports MicroStationDGN
 
  Public Class ClsModalHandler
 
     Implements MicroStationDGN.IModalDialogEvents
 
    Public ustn As New MicroStationDGN.Application()
 
    Private Sub IModalDialogEvents_OnDialogClosed(ByVal DialogBoxName As 
String, ByVal DialogResult As MsdDialogBoxResult)
 
     End Sub
 
 
 
    Private Sub IModalDialogEvents_OnDialogOpened(ByVal DialogBoxName As 
String, ByVal DialogResult As MsdDialogBoxResult)
 
         If ustn.DialogBoxName = "Collega riferimento" Then
 
            ustn.SetCExpressionValue("msDialogState.refAttachInfoP->multiAttachMethod", 
9, "REF")
 
            ustn.CadInputQueue.SendCommand("MDL COMMAND 
MGDSHOOK,fileList_setFilterCmd *.dgn")
 
            ustn.CadInputQueue.SendCommand("MDL COMMAND 
MGDSHOOK,fileList_setDirectoryCmd C:\CARTE-RIFERIMENTO\")
 
            ustn.CadInputQueue.SendCommand("MDL COMMAND 
MGDSHOOK,fileList_setFileNameCmd RIFERIMENTO.dgn")
 
            DialogResult = ustn.msdDialogBoxResultOK
 
        End If
 
     End Sub
 
 
 
 
 
    Private Sub OnDialogClosed(ByVal DialogBoxName As String, ByVal 
DialogResult As MsdDialogBoxResult) Implements 
MicroStationDGN.IModalDialogEvents.OnDialogClosed
 
    End Sub
 
 
 
    Private Sub OnDialogOpened(ByVal DialogBoxName As String, ByRef 
DialogResult As MsdDialogBoxResult) Implements 
MicroStationDGN.IModalDialogEvents.OnDialogOpened
 
    End Sub
 
 End Class
 
 
 
 
 

Lo stesso codice , scritto sul vba di Microstation, funziona perfettamente.
Clicco sul pulsante e si collega direttamente il riferimento...

L'istruzione che dovrebbe impedire la richiesta di conferma  � :
DialogResult = ustn.msdDialogBoxResultOK
purtroppo  funziona solo nel VBA di Microstation!!
VB.Net semmbra ignorarlo...
nero23 



puoi evitare le finestra dando parmetri aggiuntivi direttamente nella
keyin, separatti da "," (mi pare), puoi anche lasciarli vuoti per
prendere i default , es:
reference attach c:\tuofile.dgn,,,,
o qualcosa del genere (dovrebbe essere documentato, guarda nell'help)
per il resto, il tuo problema e' abbastanza complesso.
sostanzialmente, microstation ha una sua pompa di messaggi (come ogni
applicazione), ma la tua applicazione e' indipendente perche' a quanto
ho capito non viene avviata all'interno di microstation. ci sono vari
modi di intervenire ma entriamo nella programmazzione a basso livello
di c++ e mfc , e se la prima soluzione funziona lascia perdere.
nelle versioni di microstation da xm in poi ci sono dei sistemi per
caricare applicazioni scritte in .net (anche se la cosa e' poco
documentata);
con la 2004 ti consiglerei di farti una dll generica che esporti una
funzione apriForm() che si legga una classe windows form in una class
library caricata dinamicamente ed estragga i controlli della form, li
inserisce in uno user control che poi va aggiunto ad una windows form c
++ (in cui, per altro, devi sovrascrivere i vari eventi di maximize /
minimize / ... per integrarla in microstation; devi anche gestire la
pompa dei messaggi tramite MFC), questi passaggi in XM e V8i te li
eviti perche' invece di ereditare da winows form puoi ereditare da una
form specifica che gia' implementa queste cose.
questo vecchio articolo ((ormai superato) spiega meglio le cose:
http://blog.sumbera.com/2003/10/13/using-vcnet-for-microstation-v8-programming/

 questo vecchio articolo ((ormai superato) spiega meglio le cose:
http://blog.sumbera.com/2003/10/13/using-vcnet-for-microstation-v8-pr.
..

< puoi evitare le finestra dando parmetri aggiuntivi direttamente nella
< keyin, separatti da "," (mi pare), puoi anche lasciarli vuoti per
< prendere i default , es:
< reference attach c:\tuofile.dgn,,,,
< o qualcosa del genere (dovrebbe essere documentato, guarda nell'help)
Purtroppo l'Help che ho io � molto riduttivo...
spero in un miracolo :)
Grazie
nero23

 
 
<puoi evitare le finestra dando parmetri aggiuntivi direttamente nella
<keyin, separatti da "," (mi pare), puoi anche lasciarli vuoti per
<prendere i default , es:
<reference attach c:\tuofile.dgn,,,,
<o qualcosa del genere (dovrebbe essere documentato, guarda nell'help)
 
Con questo codice, il programma collega il riferimento solo dopo aver 
confermato sull'OK
ustn.CadInputQueue.SendKeyin("REFERENCE ATTACH C:\riferimento.dgn , , , , , 
")
 
 
 
Sull'Help ho trovato questo:
ustn.CadInputQueue.SendKeyin("REFERENCE ATTACH C:\riferimento.dgn 
[,nome_modello] [,nome_logico] [,descrizione] [,nome_vista] [,scala] 
[,annidamento][ON|OFF]")
 
Non so dove e quale parametro inserire per evitare che mi venga chiesto la 
conferma... 
 


mi sa che manca ancora una virgola inoltre non mettere spazi in mezzo

> mi sa che manca ancora una virgola inoltre non mettere spazi in mezzo
 
Ho inserito gli spazi solo per rendere leggibile il codice nel newgroup
 

RISOLTO
Ritornando al codice iniziale, ho notato un "piccolo" errore:
anzichč    DialogResult = MsdDialogBoxResult.msdDialogBoxResultOK
ho scritto  DialogResult = ustn.msdDialogBoxResultOK
Ciao
nero23

 nero23
 
:)