因为做Revit的二次开发多一点,拿到Teigha的时候还有点懵,看完样例还是觉得一知半解的,原因还是对于AutoCad的底层逻辑不是很明白,包括视图与布局之间的层级关系,块与视图的关系等等,看代码会有些累。

下面通过一个案例说一下昨天一天整理的知识点。

  • teigha本身是ODA下面的Cad分项,有需要的可以去ODA官网下载或是从CSDN的链接下载。刚申请完会有一段时间的试用期,这个时间可以和ODA邮件沟通。
  • Teigha本身沿用AutoCad的逻辑,如果和我一样有Revit或是其他Autodesk家的开发经验有一些还是比较容易理解的,比如事务(transation)
  • CAD中模型视图(Model Space),布局1(Paper_Space),布局2(Paper_Space),各种块(Block)<其实各种块在CAD中看作一个视图,我们在遍历模型视图内构件时,块的类定义为’BlockReference’从名称上可以看出这是一个引用>,昨天我一直在尝试在BlockReference中获取快内部构件信息,但是一直没有头绪,后来打开CAD点击-编辑块功能,发现他与视图这类是并列层级,后台打印BlockTable发现在其中

  • 还是建议使用Teigha开发前了解一下AutoCad的API,这样能够更快速的入门

下面代码是我查询一个cad文件中Geometry信息的案例,包括从模型视图提取数据与从块中提取信息。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Teigha.DatabaseServices;
using Teigha.Runtime;namespace RdFileLayer
{class Program{static void Main(string[] args){using (Services serv = new Services()){var path = @"C:\Users\Desktop\二次开发\Teigha_cad_test.dwg";using (Database db = new Database(false,false)){db.ReadDwgFile(path,FileShare.Read,false,null);using (LayerTable pTable = (LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead)){foreach (ObjectId id in pTable){using (var tr = db.TransactionManager.StartTransaction()){LayerTableRecord record = (LayerTableRecord) tr.GetObject(id, OpenMode.ForRead);Console.WriteLine("-------");Console.WriteLine("<" + record.GetRXClass().Name + ">");Console.WriteLine(record.Name);Console.WriteLine("In Use" + record.IsUsed);Console.WriteLine("Color" + record.Color);Console.WriteLine("LineWeight" + record.LineWeight);}}}using (var tr = db.TransactionManager.StartTransaction()){using (var bTable = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead)){foreach (ObjectId id in bTable){var record = tr.GetObject(id, OpenMode.ForRead) as BlockTableRecord;int count = 0;// var objectId = bTable[BlockTableRecord.ModelSpace];// BlockTableRecord record =//     (BlockTableRecord)tr.GetObject(objectId, OpenMode.ForRead);Console.WriteLine("DB_BlockTableRecord Type is : "+record.Name);if (record.Name == BlockTableRecord.ModelSpace|| record.Name == "Block"){Console.WriteLine("----------------" + record.Name + "----------------");foreach (ObjectId id1 in record){var entity = (Entity)tr.GetObject(id1, OpenMode.ForRead, false, true);Console.WriteLine("Entity Type MutiType is : ");Console.WriteLine("DB_Type : " + entity.GetType());if (entity is Line){var item = entity as Line;Console.WriteLine("Line - " + count);Console.WriteLine("Line 0" + item.StartPoint);Console.WriteLine("Line 1" + item.EndPoint);Console.WriteLine("Line Type Name" + item.Layer);}else if (entity is Polyline){var item = entity as Polyline;var allNums = item.NumberOfVertices;Console.WriteLine("DB_PolyLine : ");for (int i = 0; i < allNums; i++){var subLine = item.GetLineSegmentAt(i);Console.WriteLine("SubLine - " + i);Console.WriteLine("SubLine 0" + subLine.StartPoint);Console.WriteLine("SubLine 1" + subLine.EndPoint);Console.WriteLine("SubLine Type Name" + item.Layer);}Console.WriteLine("DB_PolyLine Coordinates : " + "DB_PolyLine count is : " + item.NumberOfVertices);for (int i = 0; i < item.NumberOfVertices; i++){var vertex = item.GetPoint3dAt(i);Console.WriteLine("SubVertex Coordinate index : " + i + " Location : " + vertex);}}else if (entity is Circle cItem){Console.WriteLine("DB_Circle original : " + cItem.Center);Console.WriteLine("DB_Circle Radius is : " + cItem.Radius);}else if (entity is DBText item){Console.WriteLine("DB_Text is :" + item.TextString);Console.WriteLine("DB_Text Position : "+ item.Position);}else if (entity is MText mItem){Console.WriteLine("DB_MText value is : " + mItem.Text);Console.WriteLine("DB_MText position is : " + mItem.Location);}count++;}}}}}}}Console.Read();}}
}

08.25 嵌套快提取,一个车库中有时会将整个车库图层打成一个块车位单独一个块,当我们想提取车位块中的信息时,需要提取嵌套块。但是当我们提取嵌套块时坐标会发生变化变为块内坐标,所以需要进行坐标转换,才能得到真实坐标,所以提取所有数据信息最好还是从Model-Space开始 遍历,获得块参照进入后对坐标进行修正才可以,有几层嵌套可能会需要添加几层,这一点我没有测试。

code:

                                     else if (entity is BlockReference bItem){var angle = (bItem.Rotation * 180) / Math.PI;Console.WriteLine("DB_BlockReference : "  + bItem.Name);Console.WriteLine("DB_BlockReference Location ; " + bItem.Position);Console.WriteLine("DB_BlockReference Rotation : " + angle);if (angle - 0.00 < 0.001) {var subTable =bItem.Database.BlockTableId.GetObject(OpenMode.ForRead) asBlockTable;var fakeTable = (BlockTableRecord) tr.GetObject(bItem.BlockTableRecord,OpenMode.ForRead);Console.WriteLine("Fake_Table type name is : " + fakeTable.Name);Console.WriteLine("Fake_Table type Location is : " + fakeTable.Origin);foreach (ObjectId objectId in fakeTable){var subTableRecord =tr.GetObject(objectId, OpenMode.ForRead) as Entity;Console.WriteLine("DB_Entity Type is : "+subTableRecord.GetType());Console.WriteLine("SubRecord PolyLines Vertex is : ");if (subTableRecord is Polyline pl){for (int i = 0; i < pl.NumberOfVertices; i++){var nPoint = new Point2d(pl.GetPoint2dAt(i).X+bItem.Position.X,pl.GetPoint2dAt(i).Y+bItem.Position.Y);Console.WriteLine("polyLines vertex index is : " + nPoint);}}  // if (subTableRecord.Name.ToLower() == BlockTabl//     foreach (var id2 in subTableRecord)//     {eRecord.ModelSpace.ToLower())// {//         var subEntity = tr.GetObject(id2, OpenMode.ForRead, false,//             false) as Entity;//         Console.WriteLine("DB_Entity Type is : "+entity.GetType());//     }// }}}}
  • 所有的操作都需要在Services,Database,Transation…这类命令中,今天尝试将查询命令单独创建一个dll发现teigha报错,使用时最好还是在一个类中完成查询,先记录一下,能够编写成接口再更新接口的代码

08.26

  • 在数据运算时,为了降低耦合度,将数据提出另外创建一个类,但是依旧是报错,后台看是空指针问题,估计还是无法将在结构体内部的数据提到其他模块处理,现在自己创建了一个Point,Vector,Line类进行数据处理,如果还需要其他的则需要创建更多的类型。
  • 第一阶段宣布失败,我的最终目标是实现Revit中建筑图纸停车位的翻模,最后发现最后一个拦路虎是目前设计师的块标准,因为停车位具有方向,所以就算我们将块内部的偏移点算出也无法快速确认停车位的基点与方向。因为我已经实现Revit中直接解析CADLinkType的Geometry的停车位翻模,想用CAD替换结果发现时间损耗与计算机损耗都比较大,还是沿用原有方案进行翻模吧。QAQ。下一个阶段想实现翻模功能,可能里面对于平行线段与几何位置算法权重比较大,有空写了再分享一下。

Teigha 4.0 Net 开发记录相关推荐

  1. Conductor 3.2.0 客户端开发记录

    不使用Conductor Spring 和之前版本差不多,但使用TaskRunnerConfigurer 替代WorkflowTaskCoordinator import java.util.Arra ...

  2. Anytime项目开发记录0

    Anytime,中文名:我很忙. 开发者:孤独的猫咪神. 这个项目会持续更新,直到我决定不再维护这个APP. 2014年3月10日:近日有事,暂时断更.希望可以会尽快完事. 2014年3月27日:很抱 ...

  3. Web项目实战 | 购物系统v2.0 | 开发记录(五)使用base64编码实现头像修改 | 用户个人信息修改 | JQuery动态提示

    文章目录 以往记录 一.运行环境 二.实现头像修改 三.用户个人信息修改 四.Bug & DeBug 以往记录 Web项目实战 | 购物系统v2.0 | 开发记录(一)需求分析 | 技术选型 ...

  4. OBDII车载诊断仪开发记录之一波三折(-)BlueTooth 3.0

    前言 根据GB18285,GB3847 机动车辆的检测引入了OBD检查,所以需要开发一款OBD诊断仪,配合之前的工作,将车辆OBD数据上报.当初接到这个任务的时候,可以说是一脸懵逼,因为特么之前没接触 ...

  5. 网络游戏demo开发实例:多人在线RPG游戏(MMO RPG)demo的开发记录(第0篇)

    最近在业余时间制作一个MMO RPG的demo,代码提交在github上,有兴趣的朋友可以自己导出代码(https://github.com/changjixiong/MMO-RPGGame), 方法 ...

  6. Web项目实战 | 购物系统v2.0 | 开发记录(九)Controller层返回数据的封装 | 商品批量操作 | 五表联立实现商品搜索

    --若发现文章内容有误,敬请指正,望不吝赐教,感谢! 文章目录 以往记录 运行环境 一.设计Bean用于Controller层返回数据 二.商品批量操作 2.1 批量操作的前端设计 2.2 批量操作的 ...

  7. Android 8.0 BLE 低功耗蓝牙开发记录

    Android 8.0 BLE 低功耗蓝牙开发记录(1-3)--------------(权限申请篇未完待续) 目的:开源博客,希望大家一起修改博客错误地方,共同完善并会鸣谢提供意见的朋友.为大家提供 ...

  8. Eclipse搭建Android5.0应用开发环境 “ndk-build”:launchingfailed问题解决

    Eclipse搭建Android5.0应用开发环境 "ndk-build":launchingfailed问题解决 详细参考http://blog.csdn.net/loongem ...

  9. TMS320F28335项目开发记录9_28335之中断系统

    TMS320F28335项目开发记录9_28335之中断系统 2014年11月08日 12:00:12 阅读数:3104 28335中断系统 1.中断系统 在这里我们要十分清楚DSP的中断系统.C28 ...

  10. 前端radio单选框默认选中_开发记录篇前端内容1

    有段时间没有更新文章了,因为是用的公司电脑,没有虚拟机,所以就没法演示hadoop相关的东西了,而且大数据篇的东西需要花费一些时间和精力去收集整理内容,那大数据篇就先暂停一下.最近这段时间的话我可能会 ...

最新文章

  1. Quartz 框架快速入门(二)
  2. 分布式锁能解决 mysql死锁吗_mysql死锁问题分析
  3. 如何避免云整合的问题
  4. MySQL使用覆盖索引来优化limit语句
  5. Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
  6. 第四十九篇、跳转设置界面
  7. WPF 使用MultiBinding ,TwoWay ,ValidationRule ,需要注意的事项
  8. 最新基于高德地图的android进阶开发(1)获取 Map API Key
  9. spring源码-bean加载整体流程
  10. windows下运行bochs
  11. word只在第一页插入页眉
  12. 中英对照泰戈尔《飞鸟集》(一)
  13. android分享视频到微信,android 分享文本、图片、音乐、视频到微信朋友圈、好友、我的收藏...
  14. iOS关于APP唤醒和在后台做的事
  15. SteamVR 2.x 手柄触摸3D物体(11)
  16. Nginx 之父已被释放!
  17. 远程无法连接到oracle数据库服务器,无法连接到远程Oracle数据库(11g)
  18. ViewPage禁止滑动原理解析
  19. 用 make menuconfig 图形化配置 uboot
  20. 关系数据库的7个基本特征

热门文章

  1. 单片机的c语言程序控制直流电机,(单片机控制直流电机)毕业论文.doc
  2. python破解压缩包密码(密码字典)
  3. 光域网(IES)在Unity3d中的应用【2020】
  4. 在U盘上安装ChromiumOS
  5. linux232转usb接口驱动程序,USB转RS232串口驱动程序下载
  6. hl usb-rs232驱动
  7. 360和腾讯QQ的那场战争!
  8. QQ for linux
  9. 无监督学习K-means文本聚类实践
  10. 亲测可用——PostgresSQL安装教程