// © Andrey Bushman, 2014
// Тестирование метода ViewportTableRecord.SetUcsToWorld().
// Обсуждение здесь: http://adn-cis.org/forum/index.php?topic=559.0
using System;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gm = Autodesk.AutoCAD.Geometry;
using Rt = Autodesk.AutoCAD.Runtime;
[assembly: Rt.CommandClass(typeof(AndreyBushman.Samples.TestClass))]
namespace AndreyBushman.Samples {
public sealed class TestClass {
[Rt.CommandMethod("test", Rt.CommandFlags.Session)]
public static void Test() {
Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
// Предполагается, что DWG присутствует, в нём один лист (он же текущий)
// и на этом листе текущим является единственный видовой экран.
const String path = @"C:\test\test.dwg";
Db.Database prevDb = Db.HostApplicationServices.WorkingDatabase;
Db.Database db = new Db.Database(false, true);
db.ReadDwgFile(path, System.IO.FileShare.ReadWrite, true, null);
db.CloseInput(true);
Db.HostApplicationServices.WorkingDatabase = db;
using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
Db.ViewportTable vt = (Db.ViewportTable)tr.GetObject(db.ViewportTableId,
Db.OpenMode.ForRead);
Db.ViewportTableRecord vtr = (Db.ViewportTableRecord)tr.GetObject(
vt[Db.SymbolUtilityServices.ViewportActiveName], Db.OpenMode.ForWrite);
Db.Layout layout = tr.GetObject(Db.LayoutManager.Current.GetLayoutId(
Db.LayoutManager.Current.CurrentLayout), Db.OpenMode.ForWrite) as Db.Layout;
layout.LayoutName += "+";
// Для одного и того же файла я получаю здесь то 2, то 1 в разных сеансах работы. Почему?
Int16 cvportIndex = (Int16)cad.GetSystemVariable("CVPORT");
// Здесь количество элементов всегда 2
Db.ObjectIdCollection ids = layout.GetViewports();
Db.Viewport vp = tr.GetObject(ids[1], // пока задал 1 вместо cvportIndex
Db.OpenMode.ForWrite) as Db.Viewport;
Boolean vpLocked = vp.Locked;
vp.Locked = false;
// Меняю цвет видового экрана, с которым работаю
vp.Color = Autodesk.AutoCAD.Colors.Color.FromColor(System.Drawing.Color.Red);
vp.SetUcsToWorld(); // это работает
vp.Locked = vpLocked;
// vtr.SetUcsToWorld(); // это не работает
ed.WriteMessage("Current layout name: {0}\n", Db.LayoutManager.Current.CurrentLayout);
ed.WriteMessage("Current viewport name: {0}\n", Db.SymbolUtilityServices.ViewportActiveName);
tr.Commit();
}
Db.HostApplicationServices.WorkingDatabase = prevDb;
db.SaveAs(path, Db.DwgVersion.Current);
}
}
}