乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 117|回复: 8

CAD.NET API一日一练(4)初识多段线

[复制链接]

24

主题

42

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
138
发表于 2011-10-25 20:01:00 | 显示全部楼层 |阅读模式
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Linq;
  5. using System.Text;
  6. using Autodesk..Runtime;
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.Geometry;
  10. using Autodesk.AutoCAD.EditorInput;
  11. namespace Base
  12. {
  13.     public class Class1
  14.     {
  15. //判断多段线的顺时针还是逆时针
  16.         #region clockwise
  17.         [CommandMethod("clockwise")]
  18.         public void clockwise()
  19.         {
  20.             Document doc = Application.DocumentManager.MdiActiveDocument;
  21.             Editor ed = doc.Editor;
  22.             Database db = doc.Database;
  23.             PromptEntityOptions options = new PromptEntityOptions("");
  24.             options.Message = "\n请选择多段线";
  25.             options.SetRejectMessage("\n所选择实体不是多段线,请重新选择");
  26.             options.AddAllowedClass(typeof(Polyline), true);
  27.             PromptEntityResult result = ed.GetEntity(options);
  28.             int i = 1;
  29.             if (result.Status == PromptStatus.OK)
  30.             {
  31.                 using (Transaction trans = db.TransactionManager.StartTransaction())
  32.                 {
  33.                     Polyline pl = trans.GetObject(result.ObjectId, OpenMode.ForRead) as Polyline;
  34.                     Vector3d vec1 = pl.GetPoint3dAt(0).GetAsVector();
  35.                     Vector3d vec2 = pl.GetPoint3dAt(1).GetAsVector();
  36.                     Vector3d vec = vec1.CrossProduct(vec2);
  37.                     if (vec.Z > 0)
  38.                     {
  39.                         ed.WriteMessage("\n逆时针");
  40.                     }
  41.                     else if (vec.Z  0)
  42.                             {
  43.                                 ed.WriteMessage("\n逆时针");
  44.                             }
  45.                             else if (vec.Z < 0)
  46.                             {
  47.                                 ed.WriteMessage("\n顺时针");
  48.                             }
  49.                             i++;
  50.                         }
  51.                         if (vec.Z == 0 & i == (Convert.ToInt32(pl.EndParam)))
  52.                         {
  53.                             ed.WriteMessage("\n该多段线通过原点且斜率恒定,无顺逆之分");
  54.                         }
  55.                     }
  56.                 }
  57.             }
  58.         }    //多段线的反向
  59.         #region plreverse
  60.         [CommandMethod("plreverse")]
  61.         public void plreverse()
  62.         {
  63.             Document doc = Application.DocumentManager.MdiActiveDocument;
  64.             Editor ed = doc.Editor;
  65.             Database db = doc.Database;
  66.             PromptEntityOptions options = new PromptEntityOptions("");
  67.             options.Message = "\n请选择多段线";
  68.             options.SetRejectMessage("\n所选择实体不是多段线,请重新选择");
  69.             options.AddAllowedClass(typeof(Polyline), true);
  70.             PromptEntityResult result = ed.GetEntity(options);
  71.             if (result.Status == PromptStatus.OK)
  72.             {
  73.                 using (Transaction trans = db.TransactionManager.StartTransaction())
  74.                 {
  75.                     BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  76.                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  77.                     Polyline pl2 = new Polyline();
  78.                     btr.AppendEntity(pl2);
  79.                     trans.AddNewlyCreatedDBObject(pl2,true);
  80.                     Polyline pl = trans.GetObject(result.ObjectId,OpenMode.ForWrite)as Polyline;
  81.                     int count=Convert .ToInt32(pl.EndParam);
  82.                     Point2dCollection ptcoll = new Point2dCollection();
  83.                     DoubleCollection bulges = new DoubleCollection();
  84.                     for (int i = 0; i <= count; i++)
  85.                     {
  86.                         ptcoll.Add(pl.GetPoint2dAt(i));
  87.                         bulges.Add(pl.GetBulgeAt(i));
  88.                     }                  
  89.                     for (int i =0; i <= count; i++)
  90.                     {
  91.                         pl2.AddVertexAt(i,ptcoll[count-i],0,0,0);                       
  92.                     }
  93.                     for (int i = 0; i <= count-1; i++)
  94.                     {
  95.                         pl2.SetBulgeAt(i, -bulges[count - i - 1]);
  96.                     }
  97.                   
  98.                     pl2.Draw();
  99.                    /* for(int i=0;i<=count;i++)
  100.                     {
  101.                         ed.WriteMessage("pl1的第{0}点凸度为{1},pl2的第{3}点凸度为{4}",i,pl.GetBulgeAt(i),count-i,pl2.GetBulgeAt(count-i));   
  102.                     }*/
  103.                     
  104.                     //pl.Erase();
  105.                     trans.Commit();
  106.                 }
  107.             }
  108.         }
  109.         #endregion
  110.     }
  111. }
回复

使用道具 举报

4

主题

86

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
102
发表于 2011-10-26 08:33:00 | 显示全部楼层
感谢每天的分享,学习了
回复

使用道具 举报

xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

铜币
526
发表于 2011-10-26 11:12:00 | 显示全部楼层
继续。。。。。。
回复

使用道具 举报

18

主题

177

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
249
发表于 2011-10-27 18:37:00 | 显示全部楼层
请教:如何定义“多段线的顺时针还是逆时针”?
回复

使用道具 举报

0

主题

23

帖子

2

银币

初来乍到

Rank: 1

铜币
23
发表于 2011-11-3 13:54:00 | 显示全部楼层
Mark,学习了!同问“顺时针”、“逆时针”指什么?
回复

使用道具 举报

10

主题

25

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2011-11-4 17:10:00 | 显示全部楼层
netload出了问题,错误信息
令: netload
无法加载程序集。错误详细信息: System.BadImageFormatException:
未能加载文件或程序集“file:///D:\MyProgram\VS2010\testCAD\testCAD\bin\Debug\testCAD.dll”或它的
某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。
文件名:“file:///D:\MyProgram\VS2010\testCAD\testCAD\bin\Debug\testCAD.dll”
   在 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase,
Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
Boolean throwOnFileNotFound, Boolean forIntrospection)
   在 System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase,
Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
Boolean throwOnFileNotFound, Boolean forIntrospection)
   在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence
assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   在 System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence
securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm,
Boolean forIntrospection, StackCrawlMark& stackMark)
   在 System.Reflection.Assembly.LoadFrom(String assemblyFile)
   在 Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
   在 loadmgd()
警告: 程序集绑定日志记录被关闭。
要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1。
注意: 会有一些与程序集绑定失败日志记录关联的性能损失。
要关闭此功能,请移除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。
回复

使用道具 举报

24

主题

42

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
138
发表于 2011-11-4 17:19:00 | 显示全部楼层

其实就是线的倒向吧,
就是多段线是顺时针画出来的
还是逆时针画出来的
回复

使用道具 举报

24

主题

42

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
138
发表于 2011-11-4 17:20:00 | 显示全部楼层

其实就是线的倒向吧,
就是多段线是顺时针画出来的
还是逆时针画出来的
回复

使用道具 举报

0

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
4
发表于 2013-6-7 15:20:00 | 显示全部楼层
好贴,一定支持。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-29 08:01 , Processed in 3.240726 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表