问题说明:
在c#中,定义一个Geometry.point3d,然后用ed.getpoint 方法获取CAD文档屏幕上的点.如果我在获取时不想选点,也不输入坐标.以下面实例化一个点Point3d TmpPt为例:PromptPointOptions promptPtOp = new PromptPointOptions(prompt);
PromptPointResult resPt;
resPt = ed.GetPoint(promptPtOp);
//实例化一个点Point3d TmpPt
Point3d TmpPt;
//正常输入情况下
if (resPt.Status == PromptStatus.OK)
{
//正常输入可以得到值。
TmpPt = resPt.Value;
}
//如果
else if (resPt.Status == PromptStatus.Cancel)//用户取消
{
//ed.WriteMessage("用户按了取消ESC键/n");
//调试用
ed.WriteMessage("null/n");
}
在正常选择情况下TmpPt可以得到一个值,那么在用户按了ESC或其他取消键(鼠标右键后),由于point3d的X,Y,Z三个坐标是double类型 那么它的X,Y,Z的值在返回时就算不输入还是会返回为 TmpPt.X=0,TmpPt.Y=0,TmpPt.Z=0.
如果我在实例化point3d过后,在使用时,如果取消了选择点,我要怎么才能判断这个实例的值为null呢?不可能x,y,z均为0就表示为空吧?因为用户有可能就选择0,0,0为坐标。所以,我觉得应该在调用getpoint方法后再作一个判断,判断返回的值到底是用户输入的0,0,0,还是程序的默认值0,0,0。 我的解决方法如下:
封装GetPoint类,然后在自己的方法WDGetpoint中加入一个参数 out bool isNull =false 表示是否输入了坐标值 true表示没有输入值
/// <summary>
/// AutoCAD中屏幕中选择一个点
/// </summary>
/// <param name="prompt">在输入时的提示</param>
/// <param name="isNull">表示是否输入了坐标值 true表示没有输入值</param>
/// <returns>返回选择的点坐标,坐标为一个数组 如果不输入isNull=true 否则为false</returns>
public static Point3d WDGetpoint(string prompt, out bool isNull)
{
PromptPointOptions promptPtOp = new PromptPointOptions(prompt);
promptPtOp.AllowNone = true;
PromptPointResult resPt;
resPt = ed.GetPoint(promptPtOp);
Point3d TmpPt;
isNull = true; //初始化为true 表示返回的值为null
//判断用户输入
if (resPt.Status == PromptStatus.OK)//正常输入
{
//得到正确的坐标值。
TmpPt = resPt.Value;
isNull = false; //表示返回值不为null 用户做了有用的输入
}
else if (resPt.Status == PromptStatus.Cancel)//用户取消
{
//调试用
ed.WriteMessage("null/n");
}
else if (resPt.Status == PromptStatus.None)
{
//调试用
ed.WriteMessage("null/n");
}
return TmpPt;
}
//=============方法调用=============//
void test()
{
Point3d pt=WDGetpoint("选择一个点:",out isNull );
if(isNull==true)
{
ed.WriteMessage("没有输入点/n");
return; //没有输入点,return退出本方法。
}
else
{
ed.WriteMessage("/n点坐标 X={0} Y={1} Z={2}",pt.X,pt.Y,pt.Z);
}
}
也就是在实例中先判断isnull返回的值,然后再进行下面的步骤.这就可以解决用户到底输入点没有的问题了。 这是我现在想到的我认为最好方法,也不知还有没有更好的方法或是我不知道的属性来判断。