J'implémente une application qui utilise COM dans l'interface ObjectARX d'AutoCAD pour automatiser les actions de dessin, telles qu'ouvrir et enregistrer sous. Selon la documentation, je devrais pouvoir appeler AcadDocument.SaveAs() et passer un nom de fichier, un "type de sauvegarde" et un paramètre de sécurité. La documentation indique explicitement que si la sécurité est NULL, aucune opération liée à la sécurité n'est tentée. Il ne donne cependant aucune indication sur le type d'objet correct à transmettre en tant que paramètre "save as type". J'ai essayé d'appeler SaveAs avec un nom de fichier et null pour les arguments restants, mais mon application se bloque sur cet appel de méthode et AutoCAD semble se bloquer - vous pouvez toujours utiliser le ruban mais ne pouvez rien faire avec la barre d'outils et ne peut pas fermer AutoCAD.SaveAs en suspension COM AutoCAD
J'ai l'impression que mes paramètres NULL causent du chagrin ici, mais la documentation manque cruellement au département COM/VBA. En fait, il dit que la classe AcadDocument n'a même pas de méthode SaveAs, ce qui est clairement le cas.
Est-ce que quelqu'un ici a implémenté la même chose? Des conseils? L'alternative est que j'utilise la méthode SendCommand() pour envoyer une commande _SAVEAS, mais mon application gère un lot de dessin et doit savoir a) si l'enregistrement échoue, et b) quand la sauvegarde est terminée (que je « m faire en écoutant l'événement EndSave)
EDIT
Voici le code tel que demandé -. tout qu'il fait est le lancement d'AutoCAD (ou la connexion à l'instance en cours d'exécution si elle est déjà en cours d'exécution), l'ouverture d'un existant dessin, puis enregistrez le document dans un nouvel emplacement (C: \ Scratch \ Document01B.dwg.)
using (AutoCad cad = AutoCad.Instance)
{
// Launch AutoCAD
cad.Launch();
// Open drawing
cad.OpenDrawing(@"C:\Scratch\Drawing01.dwg");
// Save it
cad.SaveAs(@"C:\Scratch\Drawing01B.dwg");
}
Puis dans ma classe AutoCad (this._acadDocument est une instance de la classe AcadDocument.)
public void Launch()
{
this._acadApplication = null;
const string ProgramId = "AutoCAD.Application.18";
try
{
// Connect to a running instance
this._acadApplication = (AcadApplication)Marshal.GetActiveObject(ProgramId);
}
catch (COMException)
{
/* No instance running, launch one */
try
{
this._acadApplication = (AcadApplication)Activator.CreateInstance(
Type.GetTypeFromProgID(ProgramId),
true);
}
catch (COMException exception)
{
// Failed - is AutoCAD installed?
throw new AutoCadNotFoundException(exception);
}
}
/* Listen for the events we need and make the application visible */
this._acadApplication.BeginOpen += this.OnAcadBeginOpen;
this._acadApplication.BeginSave += this.OnAcadBeginSave;
this._acadApplication.EndOpen += this.OnAcadEndOpen;
this._acadApplication.EndSave += this.OnAcadEndSave;
#if DEBUG
this._acadApplication.Visible = true;
#else
this._acadApplication.Visible = false;
#endif
// Get the active document
this._acadDocument = this._acadApplication.ActiveDocument;
}
public void OpenDrawing(string path)
{
// Request AutoCAD to open the document
this._acadApplication.Documents.Open(path, false, null);
// Update our reference to the new document
this._acadDocument = this._acadApplication.ActiveDocument;
}
public void SaveAs(string fullPath)
{
this._acadDocument.SaveAs(fullPath, null, null);
}
Pouvez-vous montrer le code? – t0mm13b
@ tommieb75: Ajouté à la question –