定义用户坐标系(UCS)对象以更改(0, 0, 0) 原点的位置以及xy平面和z轴的方向。可以在三维空间中的任意位置定位和确定UCS的方向,还可以根据需要定义、保存和调用任意多个用户坐标系。坐标输入和显示是相对于当前UCS的。
要指示UCS的原点和方向,可以使用视区对象的ICONATORIGIN属性或UCSICON系统变量在UCS原点处显示UCS图标。如果UCS图标已打开(IConVISIBLE属性),并且未在原点处显示,则它将显示在UCSOG系统变量定义的WCS坐标处。
可以使用UCSTable对象的Add()方法创建新的用户坐标系。此方法需要输入四个值:原点坐标、x和y轴上的坐标以及UCS的名称。
AutoCAD®ActiveX Automation中的所有坐标都输入到世界坐标系中。使用GetUCSMatrix ()方法返回给定ucs的变换矩阵。使用此转换矩阵查找等效的WCS坐标。
要激活UCS,请使用文档对象上的ActiveUCS属性。如果对活动的UCS进行了更改,则必须将新的UCS对象重置为活动的UCS才能显示更改。要重置活动的UCS,只需使用更新的UCS对象再次调用ActiveUCS属性。
创建新的UCS,使其处于活动状态,并将点的坐标转换为当前UCS坐标
以下子例程创建新的UCS,并将其设置为图形的活动UCS。然后,它要求用户在图形中选择一个点,并返回该点的WCS和UCS坐标。
using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Geometry;[CommandMethod("NewUCS")]public static void NewUCS(){//获取当前文档和数据库,然后开启事务Document acDoc = Application.DocumentManager.MdiActiveDocument;Database acCurDb = acDoc.Database;using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()){//以读的方式打开UCS表UcsTable acUCSTbl;acUCSTbl = acTrans.GetObject(acCurDb.UcsTableId,OpenMode.ForRead) as UcsTable;UcsTableRecord acUCSTblRec;//检查UCS表中是否已经存在"New_UCS"if (acUCSTbl.Has("New_UCS") == false){acUCSTblRec = new UcsTableRecord();acUCSTblRec.Name = "New_UCS";//开启写入权限acUCSTbl.UpgradeOpen();//添加UCS表记录acUCSTbl.Add(acUCSTblRec);acTrans.AddNewlyCreatedDBObject(acUCSTblRec, true);acUCSTblRec.Dispose();}else{acUCSTblRec = acTrans.GetObject(acUCSTbl["New_UCS"],OpenMode.ForWrite) as UcsTableRecord;}acUCSTblRec.Origin = new Point3d(4, 5, 3);acUCSTblRec.XAxis = new Vector3d(1, 0, 0);acUCSTblRec.YAxis = new Vector3d(0, 1, 0);//打开当前视口ViewportTableRecord acVportTblRec;acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId,OpenMode.ForWrite) as ViewportTableRecord;//在视口的原点显示UCS图标acVportTblRec.IconAtOrigin = true;acVportTblRec.IconEnabled = true;//设置当前UCSacVportTblRec.SetUcs(acUCSTblRec.ObjectId);acDoc.Editor.UpdateTiledViewportsFromDatabase();//显示当前的UCS名称UcsTableRecord acUCSTblRecActive;acUCSTblRecActive = acTrans.GetObject(acVportTblRec.UcsName,OpenMode.ForRead) as UcsTableRecord;Application.ShowAlertDialog("The current UCS is: " +acUCSTblRecActive.Name);PromptPointResult pPtRes;PromptPointOptions pPtOpts = new PromptPointOptions("");//提示用户输入点pPtOpts.Message = "\nEnter a point: ";pPtRes = acDoc.Editor.GetPoint(pPtOpts);Point3d pPt3dWCS;Point3d pPt3dUCS;//如果输入成果,将点转换到当前UCSif (pPtRes.Status == PromptStatus.OK){pPt3dWCS = pPtRes.Value;pPt3dUCS = pPtRes.Value;//将点从UCS转换到WCSMatrix3d newMatrix = new Matrix3d();newMatrix = Matrix3d.AlignCoordinateSystem(Point3d.Origin,Vector3d.XAxis,Vector3d.YAxis,Vector3d.ZAxis,acVportTblRec.Ucs.Origin,acVportTblRec.Ucs.Xaxis,acVportTblRec.Ucs.Yaxis,acVportTblRec.Ucs.Zaxis);pPt3dWCS = pPt3dWCS.TransformBy(newMatrix);Application.ShowAlertDialog("The WCS coordinates are: \n" +pPt3dWCS.ToString() + "\n" +"The UCS coordinates are: \n" +pPt3dUCS.ToString());}//将新对象保存到数据库acTrans.Commit();}}
