明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

楼主: sailorcwx

[打印] 使用NetAPI进行CAD打印,有兴趣的交流交流

  [复制链接]
 楼主| 发表于 2011-2-24 15:58 | 显示全部楼层

使用NetAPI进行CAD打印(三)-搜索图框

本帖最后由 sailorcwx 于 2011-2-24 16:02 编辑

      
  1. /// <summary>
  2.         /// 搜索图框
  3.         /// V1.0 by WeltionChen@2011.02.24
  4.         /// </summary>
  5.         [CommandMethod("tt6")]
  6.         public void GetDrawingFrames()
  7.         {            
  8.             using (Transaction tr = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
  9.             {
  10.                 //缩放到全屏操作
  11.                 Database db = HostApplicationServices.WorkingDatabase;
  12.                 Point3d minPoint = db.Extmin;
  13.                 Point3d maxPoint = db.Extmax;
  14.                 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  15.                 ViewTableRecord currentVP = ed.GetCurrentView() as ViewTableRecord;
  16.                 ViewTableRecord zoomVP = new ViewTableRecord();
  17.                 zoomVP.CopyFrom(currentVP);
  18.                 zoomVP.Width = maxPoint.X - minPoint.X;
  19.                 zoomVP.Height = maxPoint.Y - minPoint.Y;
  20.                 zoomVP.CenterPoint = new Point2d((minPoint.X + maxPoint.X) / 2, (minPoint.Y + maxPoint.Y) / 2);
  21.                 ed.SetCurrentView(zoomVP);               
  22.                 List<Point3d[]> drawingFramePoints=new List<Point3d[]>{};
  23.                 bool isSearchByFrameLine = true; //测试用
  24.                 if (isSearchByFrameLine)
  25.                 {                  
  26.                     SelectionFilter frameFilter = new SelectionFilter(new TypedValue[] { new TypedValue(0, "LWPOLYLINE"), new TypedValue(90, 4), new TypedValue(70, 1) });
  27.                     PromptSelectionResult selectedFrameResult = ed.SelectAll(frameFilter);
  28.                     if (selectedFrameResult.Status == PromptStatus.OK)
  29.                     {
  30.                         List<ObjectId> selectedObjectIds = new List<ObjectId>(selectedFrameResult.Value.GetObjectIds());
  31.                         List<ObjectId> resultObjectIds = new List<ObjectId>(selectedFrameResult.Value.GetObjectIds());
  32.                         RemoveInnerPLine(tr, ref selectedObjectIds, ref resultObjectIds);
  33.                         foreach (ObjectId frameId in resultObjectIds)
  34.                         {
  35.                             Autodesk.AutoCAD.DatabaseServices.Polyline framePline = tr.GetObject(frameId, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Polyline;
  36.                             framePline.Highlight();                           
  37.                         }
  38.                         ed.WriteMessage("共搜索到{0}个图框\n", resultObjectIds.Count);
  39.                     }
  40.                 }
  41.             }
  42.         }
  43.         void RemoveInnerPLine(Transaction tr, ref List<ObjectId> selectedObjectIds,ref List<ObjectId> resultObjectIds)
  44.         {
  45.             ObjectId outerPlineId = selectedObjectIds[0];
  46.             selectedObjectIds.RemoveAt(0);
  47.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  48.             Autodesk.AutoCAD.DatabaseServices.Polyline outerPline = tr.GetObject(outerPlineId, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Polyline;
  49.             SelectionFilter frameFilter = new SelectionFilter(new TypedValue[] { new TypedValue(0, "LWPOLYLINE"), new TypedValue(90, 4), new TypedValue(70, 1) });
  50.             PromptSelectionResult getInnerPlineResult = ed.SelectWindow(outerPline.GetPoint3dAt(0), outerPline.GetPoint3dAt(2), frameFilter);
  51.             if (getInnerPlineResult.Status == PromptStatus.OK)
  52.             {
  53.                 List<ObjectId> innerPlineObjectIds = new List<ObjectId>(getInnerPlineResult.Value.GetObjectIds());
  54.                 innerPlineObjectIds.Remove(outerPlineId);
  55.                 foreach (ObjectId innerPlineObjectId in innerPlineObjectIds)
  56.                 {
  57.                     selectedObjectIds.Remove(innerPlineObjectId);
  58.                     resultObjectIds.Remove(innerPlineObjectId);                    
  59.                 }
  60.                 if (selectedObjectIds.Count > 0)
  61.                 {
  62.                     RemoveInnerPLine(tr, ref selectedObjectIds, ref resultObjectIds);
  63.                 }
  64.             }            
  65.         }

评分

参与人数 1明经币 +2 收起 理由
雪山飞狐_lzh + 2

查看全部评分

发表于 2011-2-24 21:05 | 显示全部楼层
沙发坐下,呵呵
打印的系列,加点简要的说明更好,:)
 楼主| 发表于 2011-3-10 23:21 | 显示全部楼层

使用NetAPI进行CAD打印(四)-自动识别标准图幅及比例

本帖最后由 sailorcwx 于 2011-3-10 23:22 编辑

  1. [CommandMethod("tt7")]
  2.         public void GetFrameSizeScale()
  3.         {
  4.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.             Point3d pt1 = ed.GetPoint("\n第一个点").Value;
  6.             Point3d pt2 = ed.GetPoint("\n对角点").Value;
  7.             object[] returnResult;
  8.             if (GetFrameSizeScale(new Point2d(pt1.X, pt1.Y), new Point2d(pt2.X, pt2.Y), out returnResult))
  9.             {
  10.                 ed.WriteMessage("\n比例:{0},横向尺寸:{1},竖向尺寸:{2}", returnResult[0], returnResult[1], returnResult[2]);
  11.             }
  12.             else
  13.             {
  14.                 ed.WriteMessage("\n你所选的不是标准图框");
  15.             }
  16.         }
  17.         bool GetFrameSizeScale(Point2d pt1, Point2d pt2,out object[] returnResult)
  18.         {
  19.             returnResult = new object[3];
  20.             List<int> pageWidths = new List<int> { 841, 594, 419, 293, 210 };
  21.             double frameXSize = Math.Abs(pt1.X-pt2.X);
  22.             double frameYSize=Math.Abs(pt1.Y-pt2.Y);
  23.             double frameWidth = Math.Min(frameXSize, frameYSize);
  24.             for (int i = 0; i < pageWidths.Count; i++)
  25.             {
  26.                 int pageWidth = pageWidths[i];
  27.                 if ((int)frameWidth % pageWidth == 0)
  28.                 {
  29.                     double scale = pageWidth / frameWidth;
  30.                     returnResult[0] = scale;
  31.                     returnResult[1] = frameXSize * scale;
  32.                     returnResult[2] = frameYSize * scale;
  33.                     return true;
  34.                 }
  35.             }
  36.             return false;
  37.         }
复制代码

发表于 2011-3-11 11:17 | 显示全部楼层
系列的专题合并了,呵呵
这样方便查找:)
发表于 2011-3-11 20:03 | 显示全部楼层
学习的好程序,楼主能添加一些注释就更便于学习了...
发表于 2011-3-17 22:56 | 显示全部楼层
怎么没有(一)?
发表于 2011-6-4 21:05 | 显示全部楼层
期待添加新内容!!!
发表于 2011-6-7 20:27 | 显示全部楼层
期待你的大作
发表于 2011-6-27 21:34 | 显示全部楼层
本帖最后由 guodonglin 于 2011-6-27 21:34 编辑

如何读取布局的plotsettings对象?希望提供程序。gzjwulin@163.com .谢谢。
发表于 2011-8-4 09:30 | 显示全部楼层
为什么我在.net应用程序里使用kean专题的那些程序,我点击按钮的时候提示找不到模块呢?
按钮事件就进不去,这是为什么呢、?用命令是没有问题的,lz能帮解答下么?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2018-1-20 15:27 , Processed in 0.241034 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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