明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2068|回复: 3

自己编写的旋转命令不能运行,请大家指出错误

[复制链接]
发表于 2011-10-19 11:46:26 | 显示全部楼层 |阅读模式
自己根据AutoCAD .Net Developer's Guide教程上的RotateObject编写的旋转对象命令,命令运行后对象没有任何变化,运行过程中监控了每个变量的情况,均未发现异常。请大家看看这段代码有什么问题,多谢指教。
  1.         [CommandMethod("WRT",CommandFlags.UsePickSet)] //WRT=MRT=MyRotate
  2.         public static void MyRotate()
  3.         {
  4.             Database acDb = Application.DocumentManager.MdiActiveDocument.Database;
  5.             Editor acEd = Application.DocumentManager.MdiActiveDocument.Editor;
  6.             ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  7.             using (Transaction acTrans = acDb.TransactionManager.StartTransaction())
  8.             {
  9.                 SelectionSet acSSet = CreatSelectionSet();
  10.                 if (acSSet!=null) // if1
  11.                 {
  12.                     PromptPointOptions prPtOpt=new PromptPointOptions("");
  13.                     PromptPointResult prPtRslt;
  14.                     
  15.                     prPtOpt.Message = "\nSpecify the base point:";
  16.                     prPtOpt.AllowNone = true;

  17.                     prPtRslt = acEd.GetPoint(prPtOpt);
  18.                     if (prPtRslt.Status == PromptStatus.OK) // if1-1
  19.                     {
  20.                         Point3d ptBase = prPtRslt.Value;
  21.                         PromptAngleOptions prAngOpt=new PromptAngleOptions("");
  22.                         prAngOpt.Message = "\nSpecify the rotation angle:";
  23.                         prAngOpt.UseBasePoint = true;
  24.                         prAngOpt.BasePoint = ptBase;
  25.                         prAngOpt.UseDashedLine = true;
  26.                         prAngOpt.AllowNone = true;
  27.                         PromptDoubleResult prAngRslt;
  28.                         prAngRslt = acEd.GetAngle(prAngOpt);
  29.                         if (prAngRslt.Status == PromptStatus.OK) // if1-1-1
  30.                         {
  31.                             double dAngRt = prAngRslt.Value;
  32.                             Matrix3d curUCSMat = acEd.CurrentUserCoordinateSystem;
  33.                             CoordinateSystem3d curUCS = curUCSMat.CoordinateSystem3d;

  34.                             acObjIdColl = new ObjectIdCollection(acSSet.GetObjectIds());
  35.                             foreach (ObjectId acObjId in acObjIdColl)
  36.                             {
  37.                                 Entity acEnt = acTrans.GetObject(acObjId, OpenMode.ForWrite) as Entity;
  38.                                 acEnt.TransformBy(Matrix3d.Rotation(dAngRt, curUCS.Zaxis, ptBase));
  39.                             } //end foreach
  40.                         }// end if1-1-1
  41.                     } // end if1-1
  42.                 } //end if1
  43.             } // end using Transaction
  44.         } // end MyRotate
代码中的CreatSelectionSet()是另外编写的一个选择对象的过程,即判断PickFirst集中有无对象,有则直接返回,没则重新选择后返回选集,在另一个自己编写的移动MyMove()和删除MyErase()命令中均能正常调用。
 楼主| 发表于 2011-10-19 13:58:52 | 显示全部楼层
补充:在第40行后面加入acEd.Regen();后,窗口会在图形旋转到的位置闪一下(表示图形已经旋转到目标位置),但是原来的图形仍没有变化。奇怪。
发表于 2011-10-19 15:14:14 | 显示全部楼层
没有提交事务acTrans.commit()
 楼主| 发表于 2011-10-19 15:28:42 | 显示全部楼层
本帖最后由 syeanwoo 于 2011-10-19 15:42 编辑
sailorcwx 发表于 2011-10-19 15:14
没有提交事务acTrans.commit()

Oh, my gosh! 如此严重的低级错误,我还使劲在Transformby()方法上排查!非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 20:50 , Processed in 0.188517 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表