找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1289|回复: 2

[求助] C#开发如何解决CAD异步执行命令的问题?

[复制链接]

已领礼包: 10个

财富等级: 恭喜发财

发表于 2019-3-22 14:32:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
写了一段代码,包括两个步骤:
1. 以CAD图中某个表格为目标居中,并将CAD窗口尺寸重设,使得窗口刚好比表格大一点点;
2.导出当前CAD窗口内的图形到WMF格式文件。

单独测试两个函数,均能达到理想效果,但是两个函数放在一起按顺序执行时发现问题:
在第1步骤最后一个“居中显示”命令执行之前,第2步骤的导出wmf已经完成。然后再执行了居中显示操作。
这样就使得导出的图不是想要的内容。

求大神。
窗口重设函数如下:
  1.         public static void ResizeCADWindow(this ObjectId id)
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             Editor ed = doc.Editor;
  5.             Database db = doc.Database;
  6.             doc.Window.WindowState = Window.State.Normal;

  7.             Point3dCollection range = id.GetBlockRange();
  8.             Point3d min = range[0];
  9.             Point3d max = range[1];
  10.             //计算块参照在X方向上的实际长度
  11.             double xRange = Math.Abs(max.X - min.X);
  12.             //计算块参照在Y方向上的实际长度
  13.             double yRange = Math.Abs(max.Y - min.Y);
  14.             Point loc = doc.Window.Location;
  15.             ////视图以当前块参照居中
  16.             ed.ZoomObject(id);
  17.             //ZoomWindowReflection(range);
  18.             Size s = doc.Window.Size;

  19.             //计算一个像素对应图纸中的长度
  20.             double scale = yRange / (s.Height - 79);
  21.             //定义新的窗口尺寸
  22.             //注意,按照坐标计算出的窗体大小是包含标题栏、左右下侧边栏的大小,故应加常数,使得净绘图区域能够完整显示块参照
  23.             Size size = new Size(Convert.ToInt32(xRange / scale) + 60, s.Height + 10);
  24.             //重设窗口尺寸
  25.             doc.Window.Size = size;

  26.             //重设视图
  27.             ViewTableRecord view = ed.GetCurrentView();
  28.             view.CenterPoint = (min + 0.5 * (max - min)).Strip();
  29.             view.Width = xRange;
  30.             view.Height = yRange;
  31.             ed.SetCurrentView(view);

  32.             Application.UpdateScreen();
  33.             ed.NewZoom(range);
  34.         }


其中用重设视图的方法对指定范围居中显示的函数NewZoom()函数如下:
        public static void NewZoom(this Editor ed, Point3dCollection range)
        {
            Point2d min = new Point2d(range[0].X, range[0].Y);
            Point2d max = new Point2d(range[1].X, range[1].Y);

            ViewTableRecord view = ed.GetCurrentView();
            view.CenterPoint = min + (max - min) / 2;
            view.Height = max.Y - min.Y;
            view.Width = max.X - min.X;
            ed.SetCurrentView(view);
        }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2019-3-22 17:42:02 | 显示全部楼层
使用  AcGs 导出
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

 楼主| 发表于 2019-3-25 09:19:13 | 显示全部楼层
eachy 发表于 2019-3-22 17:42
使用  AcGs 导出

ARCGIS么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 21:54 , Processed in 0.162286 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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