ADN Open CIS
Сообщество программистов Autodesk в СНГ

29/10/2019

Как определить использовалась ли Базовая точка при вставке выбранных объектов

Это сообщение на форуме  заставило меня написать эту статью, которая как раз совпала с внутренним обсуждением аналогичной проблемы.

Когда мы используем команду _COPYBASE с заданной базовой точкой, выбранные объекты копируются во временный dwg-файл и системная переменная INSBASE этого временного файла содержит введённую базовую точку.

Эта программа использует этот факт при вставке при помощи _PASTORG в другой чертеж.

Спасибо Joel Petersen за предложенную идею

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. using System.Diagnostics;
  7. using System.Text;
  8.  
  9. public class EntryPoint : IExtensionApplication
  10. {
  11.   public void Initialize()
  12.   {
  13.     var ed = Application.DocumentManager.MdiActiveDocument.Editor;
  14.     var curDb = HostApplicationServices.WorkingDatabase;
  15.  
  16.     var docs = Application.DocumentManager;
  17.     docs.DocumentCreated += Docs_DocumentCreated;
  18.     docs.DocumentToBeDestroyed += Docs_DocumentToBeDestroyed;
  19.   }
  20.  
  21.   private void Docs_DocumentToBeDestroyed(object sender,
  22.                               DocumentCollectionEventArgs e)
  23.   {
  24.     MyCommands.DisableDBEvents(e.Document.Database);
  25.   }
  26.  
  27.   private void Docs_DocumentCreated(object sender,
  28.                               DocumentCollectionEventArgs e)
  29.   {
  30.     MyCommands.EnableDBEvents(e.Document.Database);
  31.   }
  32.  
  33.   public void Terminate()
  34.   {
  35.  
  36.   }
  37. }
  38.  
  39. public static class MyCommands
  40. {
  41.  
  42.   // Служебные:
  43.   public static void PrintToCmdLine(string str)
  44.   {
  45.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  46.     ed.WriteMessage(str);
  47.   }
  48.   public static string ObjToTypeAndHandleStr(DBObject dbObj)
  49.   {
  50.     Debug.Assert(dbObj != null);
  51.  
  52.     string str1 = dbObj.GetType().Name;
  53.     return string.Format("< {0,-20} {1,4} >", str1, dbObj.Handle.ToString());
  54.   }
  55.   public static string ObjToTypeAndHandleStr(ObjectId objId)
  56.   {
  57.     string str;
  58.  
  59.     if (objId.IsNull)
  60.       str = "(null)";
  61.     else
  62.     {
  63.       // Открываем даже если стертый объект
  64.       Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = objId.Database.TransactionManager;
  65.       using (Autodesk.AutoCAD.DatabaseServices.Transaction tr = tm.StartTransaction())
  66.       {
  67.         DBObject tmpObj = tr.GetObject(objId, OpenMode.ForRead, true);
  68.         str = ObjToTypeAndHandleStr(tmpObj);
  69.         tr.Commit();
  70.       }
  71.     }
  72.  
  73.     return str;
  74.   }
  75.   public static string PtToStr(Point3d pt, DistanceUnitFormat unitType, int prec)
  76.   {
  77.     string x = Converter.DistanceToString(pt.X, unitType, prec);
  78.     string y = Converter.DistanceToString(pt.Y, unitType, prec);
  79.     string z = Converter.DistanceToString(pt.Z, unitType, prec);
  80.  
  81.     return string.Format("({0}, {1}, {2})", x, y, z);
  82.   }
  83.  
  84.   public static void EnableDBEvents(Database db)
  85.   {
  86.     db.BeginDeepClone += CurDb_BeginDeepClone;
  87.     db.BeginInsert += Db_BeginInsert;
  88.   }
  89.  
  90.   public static void DisableDBEvents(Database db)
  91.   {
  92.     db.BeginDeepClone -= CurDb_BeginDeepClone;
  93.     db.BeginInsert -= Db_BeginInsert;
  94.   }
  95.  
  96.   private static void Db_BeginInsert(object sender, BeginInsertEventArgs e)
  97.   {
  98.     Database db = e.From;
  99.     PrintToCmdLine("Вставка с исходной точкой " + PtToStr(db.Insbase, DistanceUnitFormat.Current, -1));
  100.   }
  101.   private static void CurDb_BeginDeepClone(object sender, IdMappingEventArgs e)
  102.   {
  103.     if (e.IdMapping.DeepCloneContext == DeepCloneType.Explode)
  104.     {
  105.       IdMapping idMap = e.IdMapping;
  106.       System.Collections.IEnumerator iter = idMap.GetEnumerator();
  107.       while (iter.MoveNext())
  108.       {
  109.         IdPair pair = (IdPair)iter.Current;
  110.  
  111.         try
  112.         {
  113.           StringBuilder sb = new StringBuilder(ObjToTypeAndHandleStr(pair.Key));
  114.           sb.Append(pair.Key.ToString());
  115.           sb.Append("\n" + pair.Value.ToString());
  116.           sb.Append("\n" + pair.IsCloned.ToString());
  117.           sb.Append("\n" + pair.IsPrimary.ToString());
  118.           sb.Append("\n" + pair.IsOwnerTranslated.ToString());
  119.           PrintToCmdLine(sb.ToString());
  120.         }
  121.         catch (Autodesk.AutoCAD.Runtime.Exception ex)
  122.         {
  123.           PrintToCmdLine("Не могу найти пару: " + ex.Message);
  124.         }
  125.       }
  126.     }
  127.   }
  128. }

Источник: https://adndevblog.typepad.com/autocad/2019/08/how-to-verify-insert-or-base-point-of-selected-objects-being-pasted.html

 

Автор перевода: Александр Ривилис
Опубликовано 29.10.2019
Отредактировано 29.10.2019 в 15:29:06