Eseguire macro da Add-in

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#1
Buongiorno a tutti, volevo esporvi il mio problema. Io ho creato una Add-in di SolidWorks scritta in linguaggio C# e ho inserito un pulsante in essa. Io vorrei che, premendo questo bottone, venisse eseguita in automatico una determinata macro (chiamiamola Macro1.swp). Però non so bene come fare, anche perchè in rete non ci sono molti tutorial che parlano di questo; ho letto della funzione RunMacro2 ma non so come usarla.
Vi posto il codice così vi potete rendere conto meglio del mio problema:

Codice:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swcommands;
using SolidWorks.Interop.swconst;
using SolidWorks.Interop.swpublished;
using SolidWorksTools;
using System.Runtime.InteropServices;

namespace SWAddin_CSharp
{
    [ComVisible(true)]
    [ProgId(SWTASKPANE_PROGID)]
    public partial class SWTaskpaneHost : UserControl
    {
        public const string SWTASKPANE_PROGID = "AngelSix.SWTaskPane_SwAddin";
        public SWTaskpaneHost()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
        CODICE CHE ESEGUE L'ATTIVAZIONE DELLA MACRO (E CHE NON SO IN GRADO DI SCRIVERE)
        }
    }
}

Non so cosa scrivere all'interno del comando che riguarda il click del mio bottone. Vorrei che lì dentro fosse eseguita la mia macro.

Grazie a tutti in anticipo
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#2
Questa parte di codice serve per creare un Taskpane in SolidWorks, che si riempie con il tuo Usercotrol.
Il tuo Usercontrol immagino sia un controllo personalizzato che contiene un bottone.
Se all'evento click del tuo bottone devi lanciare una macro, devi scivere il seguente codice:

swApp.RunMacro(Path & "\MyMacro.swp", "NomeModulo", "Main")

Path -> percorso della macro
NomeModulo -> è il nome del modulo all'interno della tua macro
Main -> è il nome della tua routine principale da lanciare

Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#3
Ti ringrazio per la risposta: era proprio quello che volevo sapere. L'unica cosa che al momento non mi è chiara è la parte "Main": che cos'è il nome della routine principale da lanciare?Grazie ancora.
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#4
Poi il compilatore mi dice che non riconosce swApp: sai a cosa possa essere dovuto?
Grazie ancora.
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#5
Ok allora ho risolto tutti i problemi di compilazione di Visual C# e ho provato a far funzionare il tutto. Il problema è però che quando vado a premere il mio bottone che dovrebbe far partire la macro mi appare questo messaggio:

"riferimento a un oggetto non impostato su un'istanza di oggetto". Dov'è il problema?

Ti posto il codice così puoi vedere meglio se ho sbagliato qualcosa.
P.S. ho dovuto modificare leggermente l'istruzione RunMacro perchè così come la avevi scritta tu mi dava dei problemi di compilazione.

Codice:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swcommands;
using SolidWorks.Interop.swconst;
using SolidWorks.Interop.swpublished;
using SolidWorksTools;
using System.Runtime.InteropServices;

namespace SWAddin_CSharp
{
    [ComVisible(true)]
    [ProgId(SWTASKPANE_PROGID)]
    public partial class SWTaskpaneHost : UserControl
    {
        public const string SWTASKPANE_PROGID = "AngelSix.SWTaskPane_SwAddin";
        public SldWorks swApp;
        public SWTaskpaneHost()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Boolean boolstatus;
            String filename;
            filename = "C:\\Users\\ALESSANDRO\\Desktop\\Tesi\\ExportXYZ2TXT\\export_points_xyz2file.swp";
            boolstatus = swApp.RunMacro(filename, "export_xyz2file1", "main");
        }
    }
}
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#6
Manca il collegamento all'oggetto SolidWorks che in VB.Net è

Dim swApp As SldWorks.SldWorks

che nel tuo caso avendo importato il Namespace SolidWorks.Interop.sldworks

si semplifica a

Dim swApp As SldWorks.SldWorks

Non conoscendo C# non so dire come di dichiara la variabile, ma credo che per te non sia un problema.

Dovrebbe essere solo questo.
Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#7
Pensavo che il collegamento all'oggetto fosse compreso nel comando: public SldWorks swApp
A questo punto devo trovare un modo per tradurre Dim Skdworks.Sldworks swApp
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#8
Problema risolto, bastava inserire la riga di codice:

Codice:
SldWorks.SldWorks swApp = (SldWorks.SldWorks)Marshal.GetActiveObject("SldWorks.Application");
Ciao