yxr_MJTD 发表于 2010-6-12 12:55:00

[讨论]GE下的疑问

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在c#中,定义一个<font face="Verdana">Geometry</font>.point3d,然后用ed.getpoint 方法获取CAD文档屏幕上的点.如果我在获取时不想选点,也不输入坐标.</p>
<p>如下:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Verdana">PromptPointOptions promptPtOp = new PromptPointOptions(prompt);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PromptPointResult resPt;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resPt = ed.GetPoint(promptPtOp);</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Verdana">Point3d TmpPt;</font>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //正常输入情况下</p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; if (resPt.Status == PromptStatus.OK)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //正常输入可以得到值。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TmpPt = resPt.Value;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果</p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (resPt.Status == PromptStatus.Cancel)//用户取消<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ed.WriteMessage("用户按了取消ESC键/n");&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调试用<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ed.WriteMessage("null\n");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在正常选择情况下TmpPt可以得到一个值,那么在用户按了ESC或其他取消键(鼠标右键后),由于point3d的X,Y,Z三个坐标是double类型</p>
<p>它的X,Y,Z的值还是会为0。</p>
<p>如果我在实例化point3d过后,在使用时,如果取消了选择点,我要怎么才能判断这个实例的值为null呢?不可能x,y,z均为0就表示为空吧?因为</p>
<p>用户有可能就选择0,0,0为坐标呢。不知各位看客是怎么判断的?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小弟是个新手,也许对于你们来说问的简单,但如果你知道,还是请指点一下。谢谢!由于我的明经币只有一个,所以就不加分了。</p>
<p>&nbsp;</p>

雪山飞狐_lzh 发表于 2010-6-12 12:58:00

只能根据resPt.Status去判断,OK就是选中了,Cancel就是取消了

yxr_MJTD 发表于 2010-6-12 13:03:00

但就算是取消了,在<font face="Verdana">return TmpPt 时, 还是返回了TmpPt.x=0 ,TmpPt.y=0,TmpPt.z=0。在point3d里面也有一个类似于resPt.Status的属性吗? </font>

yxr_MJTD 发表于 2010-6-12 16:07:00

<p>暂时解决了这个问题,处理方法如下面代码:</p>
<p>//封装GetPoint类,然后在自己的类中加入一个参数&nbsp;&nbsp; out bool isNull&nbsp;=false&nbsp; 表示是否输入了坐标值 true表示没有输入值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">&nbsp; /// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// AutoCAD中屏幕中选择一个点 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name="prompt"&gt;在输入时的提示&lt;/param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name="isNull"&gt;表示是否输入了坐标值 true表示没有输入值&lt;/param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;返回选择的点坐标,坐标为一个数组 如果不输入isNull=true 否则为false&lt;/returns&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Point3d WDGetpoint(string prompt, out bool isNull)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PromptPointOptions promptPtOp = new PromptPointOptions(prompt);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; promptPtOp.AllowNone = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PromptPointResult resPt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resPt = ed.GetPoint(promptPtOp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point3d TmpPt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isNull = true;&nbsp; //初始化为true 表示返回的值为null<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断用户输入<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (resPt.Status == PromptStatus.OK)//正常输入<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到正确的坐标值。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TmpPt = resPt.Value;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isNull = false;&nbsp;&nbsp;&nbsp; //返回值不为null&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (resPt.Status == PromptStatus.Cancel)//用户取消<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调试用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ed.WriteMessage("null\n");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (resPt.Status == PromptStatus.None)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调试用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ed.WriteMessage("null\n");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TmpPt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p>&nbsp;</p>
<p>//方法调用</p>
<p>void test()</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; Point3d pt=WDGetpoint("选择一个点:",out&nbsp; isNull );</p>
<p>if(isNull==true)</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ed.WriteMessage("没有输入点\n");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Verdana">return</font>;<br/>&nbsp;&nbsp;&nbsp; }</p>
<p>else</p>
<p>&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; ed.WriteMessage("\n点坐标 X={0} Y={1}&nbsp; Z={2}",pt.X,pt.Y,pt.Z);</p>
<p>&nbsp; }</p>
<p>}</p>
<p>也就是先判断isnull的值,然后再进行下面的步骤.这就可以解决返回0的结果了。&nbsp; 这是我现在想到的我认为最好方法,也不知还有没有更好的方法或是我不知道的属性。</p>
<p>&nbsp;</p>

偶尔做做怪 发表于 2014-9-30 16:26:36

      
      //正常输入情况下
      if (resPt.Status == PromptStatus.OK)
            {            
                  Point3d TmpPt; // TmpPt定义在这里呢?如果不点OK,就不存在这个点,是不是相当于NULL
                //正常输入可以得到值。
            TmpPt = resPt.Value;
            }
页: [1]
查看完整版本: [讨论]GE下的疑问