Newsgroup: it.comp.software.cad
Titolo: Microstation v.8 e C#/VB2008

Voglio imparare a programmare  ma non so se dedicarmi al  C# oppure Visual 
basic 2008 (escuso un pochino di VBA Microstation, sono a digiuno di 
programmazione).
Non so se è possibile, ma con quale dei due liguaggi (C#, VB) è possibile 
creare un programmino (una semplice form con alcuni bottoni...) che apre un 
file Micostation ed esegue una serie di operazioni (tipo conta testo, linee 
ecc.) e crea un report su un file csv o txt?
Grazie
nero.23 

On Apr 16, 11:20 pm, "NERO23" <TOGLIMInero...@TOGLIMIvirgilio.it>
wrote:

importa come riferimento (COM) la libreria di microstation e puoi
accedere a tutti i metodi;
l'unica controindicazione e' che (per scelta architetturale) l'oggetto
COM si puo' istanziare una sola volta (c'era un articolo sul sito
microsft su come avviare una applicazione via shell e poi fare il
binding a COM; altrimenti controlla che non ci sia gia' microstation
attivo, che altrimenti ti agganci alla istanza gia' aperta)
ciao,
alessandro

<importa come riferimento (COM) la libreria di microstation e puoi
<accedere a tutti i metodi;
Ho letto qualcosa sul forum della Bentley e sono riuscito a scrivere un 
piccolo codice (la fortuna mi ha voluto molto bene....).
Funziona!!1
l<'unica controindicazione e' che (per scelta architetturale) l'oggetto
<COM si puo' istanziare una sola volta (c'era un articolo sul sito
<microsft su come avviare una applicazione via shell e poi fare il
<binding a COM; altrimenti controlla che non ci sia gia' microstation
<attivo, che altrimenti ti agganci alla istanza gia' aperta)
Ho problemi dopo qualche prova. Forse � dovuto a quanto scritto da te.
Ho descritto il problema nel newsgroup di Visual Basic (senza ricevere 
risposta), ecco quanto scritto.
Ciao
--------------------
So che non dovrei postare qui domande su C# 2008, ma non ho trovato il
newsgroup adatto.
Con C# 2008 ho creato una form con sopra un pulsante. Il pulsante apre un
file dgn (cad) ed esegue una scansione (cerca il testo "pippo")
e alla fine appare un MessageBox che riporta il numero contato. Non so
perch�, ma spesse volte il programma genera un errore ( sotto il
particolare)
che viene resettato solo riavviando il computer oppure (qualche volta)
ripetendo l'operazione dopo qualche ora.
Ho l'impressione che, anche se chiudo il file test.dgn prima di cliccare sul
bottone, Microstation rimanga in esecuzione.
E' possibile una cosa del genere?
Grazie anticipatamente
nero
Sotto il dettaglio dell'errore, ho riportato anche il codice presente sul
bottone dell form.
Dettaglio errore:
System.Runtime.InteropServices.COMException non � stata gestita
  Message="Non � attivo alcun riferimento del modello"
  Source="MicroStationDGN.Application.1"
  ErrorCode=-
2147221504
  StackTrace:
       in MicroStationDGN.ApplicationClass.get_ActiveModelReference()
       in WindowsFormsApplication1.Form1.button1_Click(Object sender,
EventArgs e) in C:\Users\Administrator\AppData\Local\Temporary
Projects\WindowsFormsApplication1\Form1.cs:riga 39
       in System.Windows.Forms.Control.OnClick(EventArgs e)
       in System.Windows.Forms.Button.OnClick(EventArgs e)
       in System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       in System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons
button, Int32 clicks)
       in System.Windows.Forms.Control.WndProc(Message& m)
       in System.Windows.Forms.ButtonBase.WndProc(Message& m)
       in System.Windows.Forms.Button.WndProc(Message& m)
       in
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&
m)
       in System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,
Int32 msg, IntPtr wparam, IntPtr lparam)
       in System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&
msg)
       in
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32
dwComponentID, Int32 reason, Int32 pvLoopData)
       in
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)
       in
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,
ApplicationContext context)
       in System.Windows.Forms.Application.Run(Form mainForm)
       in WindowsFormsApplication1.Program.Main() in
C:\Users\Administrator\AppData\Local\Temporary
Projects\WindowsFormsApplication1\Program.cs:riga 18
       in System.AppDomain._nExecuteAssembly(Assembly assembly, String[]
args)
       in System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
assemblySecurity, String[] args)
       in Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       in System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       in System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state)
       in System.Threading.ThreadHelper.ThreadStart()
  InnerException:
---------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MicroStationDGN;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// apre in file presente sotto C:\
String nomeFile = "C:\\test.dgn";
System.Diagnostics.Process.Start(nomeFile);
//create a Microstation object
ApplicationClass ustn = new ApplicationClass();
ElementScanCriteria esc = new ElementScanCriteriaClass();
ElementEnumerator ee;
Int32 counter = 0; // escluda all types
esc.ExcludeAllTypes();
// only scan text element. (Not text node)
esc.IncludeType(MsdElementType.msdElementTypeText);
//scansiona il file attivo
ee = ustn.ActiveModelReference.Scan(esc); // Loop through all elements.
while (ee.MoveNext())
{
if (ee.Current.AsTextElement.Text == "pippo")
counter++;
} // show the result
MessageBox.Show("Ho trovato " + counter + " pippo");
}
}
}
----------------------------------------------------------------------- 

   Message="Non è attivo alcun riferimento del modello"




<qualcosa di strano c'e'; non dovresti 
avviarlo via shell (in sostanza
<le prime due righe non servono a niente, 
anzi ad aprire il dgn cosa
<che pero' puoi fare tranquillamente via 
com)


hai qualche esempio di come 
fare a portata di mano?


E' possibile scansionare il dgn senza 
farlo apparire a video?


 


<magari se quando istanzi com il processo e' 
gia' attivo, poi quando
<chiudi il disegno (che normalmente chiude anche 
microstation, ma non
<e' sempre vero, se va in crash infatti rimane aperto 
e anche se c'e'
<una init app attiva, quindi fa proprio un exit che invece 
esce sicuro)
<forse non riesce a chiudere? e' comunque una situazione 
anomale, se
<rimane attivo lo vedi nella lista dei 
processi
<comunque l'errore sembra dovuto proprio al fatto che non hai 
aperto il
<disegno; probabilmente e' un problem di timing, invece che 
iniziare
<subito la scansione registrati una funzione sull'apertura del 
disegno
<ed inizia quando il disegno e' stato aperto (se fai tutto in com, 
non
<dovrebbe darlo, vedi sopra)


Se escludo le prire righe (apertura 
del file) e apro manualmente il dgn, il programma funziona.


Tutte le volte che clicco sul 
pulsante, mi restituisce il risultato.


 


Come sempre, sei sempre 
disponibile (invidio la tua preparazione!!)


 


ciao



Ho fatto alcune modifiche al codice e tutto funziona perfettamente. Il file 
dgn non appare a video  e la scansione viene eseguita. In gestione attivit� 
non rimane traccia di nulla.
Secondo te, c'� qualcosa da rivedere al codice?  Ad esempio:
ustn = Nothing
esc = Nothing
ee = Nothing
Spero che sia la giusta strada da seguire...
Grazie  Alessandro
Ciao
nero
--------------------------------------------------------------------
Imports MicroStationDGN
Imports System.Runtime.InteropServices
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
Dim NomeFile As String = Nothing
NomeFile = "C:\test.dgn"
Dim ustn As New ApplicationClass()
Dim esc As ElementScanCriteria = New ElementScanCriteriaClass()
Dim ee As ElementEnumerator
Dim counter As Int32 = 0
ustn.OpenDesignFile(NomeFile)
esc.ExcludeAllTypes()
esc.IncludeType(MsdElementType.msdElementTypeText)
ee = ustn.ActiveModelReference.Scan(esc)
While (ee.MoveNext())
If ee.Current.AsTextElement.Text = "pippo" Then
counter += 1
End If
End While
MessageBox.Show(counter)
ustn.Quit()
Marshal.ReleaseComObject(ustn)
Marshal.ReleaseComObject(esc)
Marshal.ReleaseComObject(ee)
ustn = Nothing
esc = Nothing
ee = Nothing
End Sub
End Class