29/10/2019
Как определить использовалась ли Базовая точка при вставке выбранных объектов
Это сообщение на форуме заставило меня написать эту статью, которая как раз совпала с внутренним обсуждением аналогичной проблемы.Когда мы используем команду _COPYBASE с заданной базовой точкой, выбранные объекты копируются во временный dwg-файл и системная переменная INSBASE этого временного файла содержит введённую базовую точку.
Эта программа использует этот факт при вставке при помощи _PASTORG в другой чертеж.
Спасибо Joel Petersen за предложенную идею
Код - C#: [Выделить]
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Geometry;
- using System.Diagnostics;
- using System.Text;
- public class EntryPoint : IExtensionApplication
- {
- public void Initialize()
- {
- var ed = Application.DocumentManager.MdiActiveDocument.Editor;
- var curDb = HostApplicationServices.WorkingDatabase;
- var docs = Application.DocumentManager;
- docs.DocumentCreated += Docs_DocumentCreated;
- docs.DocumentToBeDestroyed += Docs_DocumentToBeDestroyed;
- }
- private void Docs_DocumentToBeDestroyed(object sender,
- DocumentCollectionEventArgs e)
- {
- MyCommands.DisableDBEvents(e.Document.Database);
- }
- private void Docs_DocumentCreated(object sender,
- DocumentCollectionEventArgs e)
- {
- MyCommands.EnableDBEvents(e.Document.Database);
- }
- public void Terminate()
- {
- }
- }
- public static class MyCommands
- {
- // Служебные:
- public static void PrintToCmdLine(string str)
- {
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- ed.WriteMessage(str);
- }
- public static string ObjToTypeAndHandleStr(DBObject dbObj)
- {
- Debug.Assert(dbObj != null);
- string str1 = dbObj.GetType().Name;
- return string.Format("< {0,-20} {1,4} >", str1, dbObj.Handle.ToString());
- }
- public static string ObjToTypeAndHandleStr(ObjectId objId)
- {
- string str;
- if (objId.IsNull)
- str = "(null)";
- else
- {
- // Открываем даже если стертый объект
- Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = objId.Database.TransactionManager;
- using (Autodesk.AutoCAD.DatabaseServices.Transaction tr = tm.StartTransaction())
- {
- DBObject tmpObj = tr.GetObject(objId, OpenMode.ForRead, true);
- str = ObjToTypeAndHandleStr(tmpObj);
- tr.Commit();
- }
- }
- return str;
- }
- public static string PtToStr(Point3d pt, DistanceUnitFormat unitType, int prec)
- {
- string x = Converter.DistanceToString(pt.X, unitType, prec);
- string y = Converter.DistanceToString(pt.Y, unitType, prec);
- string z = Converter.DistanceToString(pt.Z, unitType, prec);
- return string.Format("({0}, {1}, {2})", x, y, z);
- }
- public static void EnableDBEvents(Database db)
- {
- db.BeginDeepClone += CurDb_BeginDeepClone;
- db.BeginInsert += Db_BeginInsert;
- }
- public static void DisableDBEvents(Database db)
- {
- db.BeginDeepClone -= CurDb_BeginDeepClone;
- db.BeginInsert -= Db_BeginInsert;
- }
- private static void Db_BeginInsert(object sender, BeginInsertEventArgs e)
- {
- Database db = e.From;
- PrintToCmdLine("Вставка с исходной точкой " + PtToStr(db.Insbase, DistanceUnitFormat.Current, -1));
- }
- private static void CurDb_BeginDeepClone(object sender, IdMappingEventArgs e)
- {
- if (e.IdMapping.DeepCloneContext == DeepCloneType.Explode)
- {
- IdMapping idMap = e.IdMapping;
- System.Collections.IEnumerator iter = idMap.GetEnumerator();
- while (iter.MoveNext())
- {
- IdPair pair = (IdPair)iter.Current;
- try
- {
- StringBuilder sb = new StringBuilder(ObjToTypeAndHandleStr(pair.Key));
- sb.Append(pair.Key.ToString());
- sb.Append("\n" + pair.Value.ToString());
- sb.Append("\n" + pair.IsCloned.ToString());
- sb.Append("\n" + pair.IsPrimary.ToString());
- sb.Append("\n" + pair.IsOwnerTranslated.ToString());
- PrintToCmdLine(sb.ToString());
- }
- catch (Autodesk.AutoCAD.Runtime.Exception ex)
- {
- PrintToCmdLine("Не могу найти пару: " + ex.Message);
- }
- }
- }
- }
- }
Автор перевода: Александр Ривилис
Опубликовано 29.10.2019
Отредактировано 29.10.2019 в 15:29:06
Опубликовано 29.10.2019
Отредактировано 29.10.2019 в 15:29:06