定义用户坐标系(UCS)对象以更改(0, 0, 0) 原点的位置以及xy平面和z轴的方向。可以在三维空间中的任意位置定位和确定UCS的方向,还可以根据需要定义、保存和调用任意多个用户坐标系。坐标输入和显示是相对于当前UCS的。

要指示UCS的原点和方向,可以使用视区对象的ICONATORIGIN属性或UCSICON系统变量在UCS原点处显示UCS图标。如果UCS图标已打开(IConVISIBLE属性),并且未在原点处显示,则它将显示在UCSOG系统变量定义的WCS坐标处。

可以使用UCSTable对象的Add()方法创建新的用户坐标系。此方法需要输入四个值:原点坐标、xy轴上的坐标以及UCS的名称。

AutoCAD®ActiveX Automation中的所有坐标都输入到世界坐标系中。使用GetUCSMatrix ()方法返回给定ucs的变换矩阵。使用此转换矩阵查找等效的WCS坐标。

要激活UCS,请使用文档对象上的ActiveUCS属性。如果对活动的UCS进行了更改,则必须将新的UCS对象重置为活动的UCS才能显示更改。要重置活动的UCS,只需使用更新的UCS对象再次调用ActiveUCS属性。

创建新的UCS,使其处于活动状态,并将点的坐标转换为当前UCS坐标

以下子例程创建新的UCS,并将其设置为图形的活动UCS。然后,它要求用户在图形中选择一个点,并返回该点的WCS和UCS坐标。

  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. [CommandMethod("NewUCS")]
  7. public static void NewUCS()
  8. {
  9. //获取当前文档和数据库,然后开启事务
  10. Document acDoc = Application.DocumentManager.MdiActiveDocument;
  11. Database acCurDb = acDoc.Database;
  12. using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  13. {
  14. //以读的方式打开UCS表
  15. UcsTable acUCSTbl;
  16. acUCSTbl = acTrans.GetObject(acCurDb.UcsTableId,
  17. OpenMode.ForRead) as UcsTable;
  18. UcsTableRecord acUCSTblRec;
  19. //检查UCS表中是否已经存在"New_UCS"
  20. if (acUCSTbl.Has("New_UCS") == false)
  21. {
  22. acUCSTblRec = new UcsTableRecord();
  23. acUCSTblRec.Name = "New_UCS";
  24. //开启写入权限
  25. acUCSTbl.UpgradeOpen();
  26. //添加UCS表记录
  27. acUCSTbl.Add(acUCSTblRec);
  28. acTrans.AddNewlyCreatedDBObject(acUCSTblRec, true);
  29. acUCSTblRec.Dispose();
  30. }
  31. else
  32. {
  33. acUCSTblRec = acTrans.GetObject(acUCSTbl["New_UCS"],
  34. OpenMode.ForWrite) as UcsTableRecord;
  35. }
  36. acUCSTblRec.Origin = new Point3d(4, 5, 3);
  37. acUCSTblRec.XAxis = new Vector3d(1, 0, 0);
  38. acUCSTblRec.YAxis = new Vector3d(0, 1, 0);
  39. //打开当前视口
  40. ViewportTableRecord acVportTblRec;
  41. acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId,
  42. OpenMode.ForWrite) as ViewportTableRecord;
  43. //在视口的原点显示UCS图标
  44. acVportTblRec.IconAtOrigin = true;
  45. acVportTblRec.IconEnabled = true;
  46. //设置当前UCS
  47. acVportTblRec.SetUcs(acUCSTblRec.ObjectId);
  48. acDoc.Editor.UpdateTiledViewportsFromDatabase();
  49. //显示当前的UCS名称
  50. UcsTableRecord acUCSTblRecActive;
  51. acUCSTblRecActive = acTrans.GetObject(acVportTblRec.UcsName,
  52. OpenMode.ForRead) as UcsTableRecord;
  53. Application.ShowAlertDialog("The current UCS is: " +
  54. acUCSTblRecActive.Name);
  55. PromptPointResult pPtRes;
  56. PromptPointOptions pPtOpts = new PromptPointOptions("");
  57. //提示用户输入点
  58. pPtOpts.Message = "\nEnter a point: ";
  59. pPtRes = acDoc.Editor.GetPoint(pPtOpts);
  60. Point3d pPt3dWCS;
  61. Point3d pPt3dUCS;
  62. //如果输入成果,将点转换到当前UCS
  63. if (pPtRes.Status == PromptStatus.OK)
  64. {
  65. pPt3dWCS = pPtRes.Value;
  66. pPt3dUCS = pPtRes.Value;
  67. //将点从UCS转换到WCS
  68. Matrix3d newMatrix = new Matrix3d();
  69. newMatrix = Matrix3d.AlignCoordinateSystem(Point3d.Origin,
  70. Vector3d.XAxis,
  71. Vector3d.YAxis,
  72. Vector3d.ZAxis,
  73. acVportTblRec.Ucs.Origin,
  74. acVportTblRec.Ucs.Xaxis,
  75. acVportTblRec.Ucs.Yaxis,
  76. acVportTblRec.Ucs.Zaxis);
  77. pPt3dWCS = pPt3dWCS.TransformBy(newMatrix);
  78. Application.ShowAlertDialog("The WCS coordinates are: \n" +
  79. pPt3dWCS.ToString() + "\n" +
  80. "The UCS coordinates are: \n" +
  81. pPt3dUCS.ToString());
  82. }
  83. //将新对象保存到数据库
  84. acTrans.Commit();
  85. }
  86. }