找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3116|回复: 8

[原创] 练习 读取文件绘制三角网

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-29 18:38:36 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 csharp 于 2014-5-29 18:42 编辑

源帖 http://bbs.xdcad.net/thread-674146-1-1.html

  1. // (C) Copyright 2014 by  

  2. using System;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Exception = System.Exception;


  11. [assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in14.MyCommands))]

  12. namespace AutoCAD_CSharp_plug_in14
  13. {
  14.     public class MyCommands
  15.     {
  16.         [CommandMethod("MyGroup", "MyCommand", "MyCommandLocal", CommandFlags.Modal)]
  17.         public void MyCommand() // This method can have any name
  18.         {
  19.             Document doc = Application.DocumentManager.MdiActiveDocument;
  20.             Editor ed = doc.Editor;
  21.             Database db = doc.Database;
  22.             Transaction tr = db.TransactionManager.StartTransaction();

  23.             PromptOpenFileOptions  pfo = new PromptOpenFileOptions("选择坐标文件");

  24.             pfo.DialogCaption = "选择坐标文件";
  25.             pfo.Filter = "Txt Flie (*.txt)|*.txt";

  26.             PromptFileNameResult fr = ed.GetFileNameForOpen(pfo);
  27.             if (fr.Status != PromptStatus.OK)
  28.             {
  29.                 return;
  30.             }
  31.             string coordFile = fr.StringResult;
  32.             pfo.DialogCaption = "选择三角网文件";
  33.             PromptFileNameResult tfr = ed.GetFileNameForOpen(pfo);
  34.             if (tfr.Status != PromptStatus.OK)
  35.             {
  36.                 return;
  37.             }
  38.             string sjwFile = tfr.StringResult;
  39.             Stopwatch watch = new Stopwatch();
  40.             watch.Restart();
  41.             ed.WriteMessage("\n请稍候.... 文件处理中!");
  42.             var coords = CoordFromFile(coordFile , true) as Point3d [];
  43.             var indexs = CoordFromFile(sjwFile,false ) as int [];
  44.             watch.Stop();
  45.             ed.WriteMessage("\n文件读取完毕. 用时 = {0}s", watch.Elapsed.TotalSeconds.ToString());
  46.             //ed.WriteMessage("\n开始绘制三角网,请稍候.....");
  47.             ProgressMeter pm = new ProgressMeter();
  48.             pm.Start("开始绘制三角网");
  49.             pm.SetLimit(indexs.Length/3);
  50.             watch.Restart();
  51.             using (tr)
  52.             {
  53.                 try
  54.                 {
  55.                     //Extents3d ext = new Extents3d();
  56.                     BlockTableRecord btr = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  57.                     for (int i = 0; i < indexs .Length -1; i = i + 3)
  58.                     {
  59.                         int n = indexs[i];
  60.                         int nn = indexs[i + 1];
  61.                         int nnn = indexs[i + 2];

  62.                         Point3dCollection npts = new Point3dCollection();
  63.                         npts.Add(coords[n - 1]);
  64.                         npts.Add(coords[nn - 1]);
  65.                         npts.Add(coords[nnn - 1]);

  66.                         Curve poly3d = new Polyline3d(Poly3dType.SimplePoly,npts,true);
  67.                         

  68.                         btr.AppendEntity((Entity )poly3d);
  69.                         tr.AddNewlyCreatedDBObject(poly3d, true);
  70.                         //ext.AddExtents((Entity) poly3d.GeometricExtents);
  71.                         pm.MeterProgress();

  72.                     }
  73.                     tr.Commit();
  74.                     pm.Stop();
  75.                     watch.Stop();
  76.                     ed.WriteMessage("\n绘制用时 = {0}", watch.Elapsed.TotalSeconds.ToString());
  77.                     ed.WriteMessage("\n绘制完成, 共 {0} 个三角形", Convert .ToString(indexs.Length  / 3));
  78.                     //View
  79.                 }
  80.                 catch (Exception)
  81.                 {
  82.                     throw;
  83.                 }
  84.             }

  85.         }

  86.         private Object  CoordFromFile(string pathFile , bool mod)
  87.         {
  88.             string content = File.ReadAllText(@pathFile );
  89.             string[] values = content.Replace("\r\n", "\r").Split('\r');
  90.             string[] splitstring = new string[1] { ' '.ToString() };
  91.             if (mod)
  92.             {
  93.                 Point3d[] pts = new Point3d[values.Length - 1];

  94.                 for (int i = 0; i < values.Length; i++)
  95.                 {
  96.                     string str = values[i];
  97.                     if (str != "")
  98.                     {
  99.                         string[] nstr = str.Split(splitstring, StringSplitOptions.RemoveEmptyEntries);

  100.                         Point3d pt = new Point3d(Convert.ToDouble(nstr[0]), Convert.ToDouble(nstr[1]), Convert.ToDouble(nstr[2]));
  101.                         pts[i] = pt;
  102.                     }

  103.                 }
  104.                 return pts;
  105.             }
  106.             else
  107.             {
  108.                 int nl = values.Length - 1;
  109.                 int[] nlist = new int[nl*3];
  110.                 int j = 0;
  111.                 for (int i = 0; i < nl; i++)
  112.                 {
  113.                     string str = values[i];
  114.                     string[] nstr = str.Split(splitstring, StringSplitOptions.RemoveEmptyEntries);
  115.                     nlist[j] = Convert .ToInt32(nstr[0]);
  116.                     nlist[j + 1] = Convert.ToInt32(nstr[1]);
  117.                     nlist[j + 2] = Convert .ToInt32(nstr[2]);
  118.                     j = j + 3;
  119.                 }
  120.                 return nlist;
  121.             }
  122.         }
  123.     }

  124. }
绘制 Polyline3d 折腾了好长时间,Google搜的方法很多都不行(2014) ,最后找到现在这个 Curve 绘制

命令: NETLOAD
命令: MYCOMMAND
请稍候.... 文件处理中!
文件读取完毕. 用时 = 0.3322694s
绘制用时 = 30.0766156
绘制完成, 共 88440 个三角形

AutoCAD CSharp plug-in14.rar

4.48 KB, 下载次数: 91, 下载积分: D豆 -1 , 活跃度 1

编译文件

评分

参与人数 1D豆 +2 收起 理由
gdfyhao + 2 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 859个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-5-30 08:41:18 | 显示全部楼层
本帖最后由 csharp 于 2014-5-30 23:09 编辑

翻了翻张帆才鸟所赠《AutoCAD VBA&VB.NET开发基础与实例教程》第二版,其中提到读写操作使用 OpenCloseTransaction 代替 Transaction.StartTransaction(); 用 ObjectID.Open 代替 Transaction.GetObject 在大量读写操作时效率有很大提升,把上面几句修改下,的确如此

  1. Transaction tr = db.TransactionManager.StartTransaction();
复制代码
改为

  1. OpenCloseTransaction tr  = new OpenCloseTransaction();
复制代码
下面一句

  1. BlockTableRecord btr = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
复制代码
改为

  1. BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord ;
复制代码
修改后的效果,加入Pross Bar 会浪费几秒时间

命令: MYCOMMAND
请稍候.... 文件处理中!
文件读取完毕. 用时 = 0.3288974s
绘制用时 = 23.4897311
绘制完成, 共 88440 个三角形

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

使用道具 举报

发表于 2014-12-27 10:48:46 | 显示全部楼层
如果是从外部程序直接控制CAD绘制图形,不采用在CAD中运行的dll,有没有高效的方法呢? 等待释疑

麻烦看下我的贴
http://bbs.xdcad.net/forum.php?m ... page%3D1#pid3544608
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3727个

财富等级: 富可敌国

发表于 2015-9-26 23:56:06 | 显示全部楼层
谢谢csharp,你的程序已经很快了!:lol:lol
命令: MyCommand

请稍候.... 文件处理中!
文件读取完毕. 用时 = 0.3659615s
绘制用时 = 4.576217
绘制完成, 共 88440 个三角形
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

burqm 该用户已被删除
发表于 2015-10-21 17:25:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 11:23 , Processed in 0.451075 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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