CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
(OP)
Hello everybody, I'm a newbie here... I'm a software developper in C#, I'm not a master of c# but I know enough to code Windows desktop software in WindowsForm (and sometimes in WPF).
I use CATIA v5r22 sp6 (HD2+FS1+KT1 modules) on Windows 7 pro x64 and Microsoft Visual Studio Community 2015.
Now I try to code my first Catia macro in C# with Visual Studio because I don't know VBA very well (and I hate it...
).
I have no problem to intercept COM object of my Catia session, but I don't know why I can't use the Catia.ActiveDocument !
My (little) code:
Visual Studio explain that's an implicit cast problem between "myPartDocument" in MECMOD.PartDocument format and "myCatia" in INFITF.Application format.
If you have any idea, please I need some help... Many thanks in advance!
I use CATIA v5r22 sp6 (HD2+FS1+KT1 modules) on Windows 7 pro x64 and Microsoft Visual Studio Community 2015.
Now I try to code my first Catia macro in C# with Visual Studio because I don't know VBA very well (and I hate it...
).I have no problem to intercept COM object of my Catia session, but I don't know why I can't use the Catia.ActiveDocument !

My (little) code:
CODE --> c#
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
// partie spécifique à CATIA
using INFITF;
using MECMOD;
using PARTITF;
using KnowledgewareTypeLib;
using ProductStructureTypeLib;
namespace MacroCatiaTest1
{
public partial class Form1 : Form
{
bool CatiaRunning = false;
public Form1()
{
InitializeComponent();
}
private void BTtest_Click(object sender, EventArgs e)
{
INFITF.Application myCatia = null;
try
{
myCatia = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application");
CatiaRunning = true;
}
catch (Exception PresenceCatia)
{
MessageBox.Show("CATIA n'est pas lancé!\nMacro impossible à executer!\n\n" + PresenceCatia.Message, "Erreur critique", MessageBoxButtons.OK, MessageBoxIcon.Error);
CatiaRunning = false;
}
if (CatiaRunning)
{
myCatia.Visible = true;
myCatia.DisplayFileAlerts = true;
try
{
PartDocument myPartDocument = (PartDocument)myCatia.ActiveDocument; ==> Here is my problem...
Part myPart = myPartDocument.Part;
}
catch (Exception excep)
{
MessageBox.Show(excep.Message);
}
}
}
}
} Visual Studio explain that's an implicit cast problem between "myPartDocument" in MECMOD.PartDocument format and "myCatia" in INFITF.Application format.
If you have any idea, please I need some help... Many thanks in advance!





RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
CODE --> vb.net
'GET CATIA V5 Dim myCatia As INFITF.Application Try myCatia = GetObject(, "CATIA.application") Catch ex As Exception myCatia = CreateObject("CATIA.application") End Try 'myCatia.Visible = True 'myCatia.DisplayFileAlerts = True '----Get part properties---- Dim productDocument1 As Document productDocument1 = myCatia.ActiveDocument Dim Product1 As Product Product1 = productDocument1.ProductRegards,
Jenia Ladkov
RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
- Visual Studio force me to cast myCatia.ActiveDocument in INFITF.Documents but this casting operation launch an exception (HRESULT E_FAIL with a COM composant)!
- I don't have access to .Product !! But I use "using INFITF" (it's the "import" of C#), MECMOD, PARTITF, KnowledgewareTypeLib, and ProductStructureTypeLib
CODE --> C#
try { Documents productDocBase; productDocBase = (INFITF.Documents)myCatia.ActiveDocument; --> Error! Product productBase; productBase = productDocBase.Product; --> doesn't exist! } catch (Exception excep) { MessageBox.Show(excep.Message); }Any idea? Please...
RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
CODE --> C#
namespace MacroCatiaTest1 { public partial class Form1 : Form { bool CatiaRunning = false; static INFITF.Application myCatia; static MECMOD.PartDocument myPartDocument; static MECMOD.Part myPart; public Form1() { InitializeComponent(); } private void BTtest_Click(object sender, EventArgs e) { try { myCatia = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); CatiaRunning = true; } catch (Exception PresenceCatia) { MessageBox.Show("CATIA n'est pas lancé!\nMacro impossible à executer!\n\n" + PresenceCatia.Message, "Erreur critique", MessageBoxButtons.OK, MessageBoxIcon.Error); CatiaRunning = false; } if (CatiaRunning) { try { myPartDocument = (PartDocument)myCatia.Documents.Add("Part"); myPart = myPartDocument.Part; } catch (Exception excep) { MessageBox.Show(excep.Message); } } } } }RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
This is the good code:
CODE --> C#
... static ProductDocument productDocBase; static Product productBase; ... try { productDocBase = (ProductDocument)myCatia.ActiveDocument; productBase = productDocBase.Product; MessageBox.Show(productBase.get_Name().ToString()); } catch (Exception excep) { MessageBox.Show(excep.Message); }I don't know if it's the better way to access of Product and Part, but it works!
RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
indocti discant et ament meminisse periti
RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
I don't know why you receive an error...
RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
indocti discant et ament meminisse periti
RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
But I have always the same problem of "cast" error, when I try to use this code:
CODE --> C#
... static PartDocument myPartDocument = null; static Part myPart = null; static ProductDocument productDocBase = null; static Product productRoot = null; ... if (CatiaRunning) { myCatia.Visible = true; myCatia.DisplayFileAlerts = true; try { productDocBase = (ProductDocument)myCatia.ActiveDocument; productRoot = productDocBase.Product; MessageBox.Show(productDocBase.get_Name() + "\n\n"); myPartDocument = (MECMOD.PartDocument)myCatia.ActiveDocument; ==> "cast" error! But myPartDocument is a MECMOD.PArtDocuments var!!! myPart = myPartDocument.Part; MessageBox.Show(myPart.get_Name()); } catch (Exception excep) { MessageBox.Show(excep.Message); } } }RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
CODE --> C#
try { productDocBase = (ProductDocument)myCatia.ActiveDocument; productRoot = productDocBase.Product; MessageBox.Show(productDocBase.get_Name() + "\n\n"); myPartDocument = (MECMOD.PartDocument)myCatia.ActiveDocument; myPart = myPartDocument.Part; MessageBox.Show(myPart.get_Name()); }because you're casting myCatia.ActiveDocument twice
now if you change your script to first get the type of document (as string) with
CODE --> C#
string activeDocType = myCatia.ActiveDocument.FullName.Split('.').Last();then do a switch case to cast properly
indocti discant et ament meminisse periti
RE: CATIA v5r22 sp6: PartDocument problem with my first Catia macro in C#
CODE --> C#
string[] activeDocType = myCatia.ActiveDocument.FullName.Split('.'); string choice = activeDocType[activeDocType.Length - 1]; switch (choice) { case "CATPart": PartDocument myPartDoc = (PartDocument)myCatia.ActiveDocument; myPart = myPartDoc.Part; MessageBox.Show(myPart.get_Name()); break; case "CATProduct": productDocBase = (ProductDocument)myCatia.ActiveDocument; productRoot = productDocBase.Product; MessageBox.Show(productRoot.get_Name()); break; default: MessageBox.Show("Aucun CATProduct ni CATPart n'est accessible!"); break; }