AutoCad 二次开发 .net 之创建Table
我使用了COM对象来在cad2018中创建table表格,需要的ObjectArx开发包可以在官网上下载,并且需要使用.netframework4.6的库才行。
项目里除了引用常规的Cad开发dll,还要引用COM组件: Autodesk.AutoCAD.Interop.dll和Autodesk.AutoCAD.Interop.Common.dll
ObjectArx下载地址:
https://www.autodesk.com/developer-network/platform-technologies/autocad/objectarx-license-download
需要先填表并同意条款,才能跳入下载地址,下载页面可见的有2018到2020三个版本可供下载。
历史的版本的下载可参考:
https://blog.csdn.net/flyfun2000/article/details/7065446
如果要参考COM对象的API可到网址:
https://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-35CC52D6-03C1-48EE-90A3-97DFBBAC33C3
先放出代码运行的结果图:
这里我只试了几种方法:
创建table:doc.ActiveLayout.Block.AddTable(vertices, 4, 2, 3, 10);
设置文字高度: myTable.SetTextHeight(1, 0.5);
合并单元格:myTable.MergeCells(1, 2, 0, 0);
设置列宽: myTable.SetColumnWidth(0, 5);
设置文字颜色:myTable.SetContentColor(2, color);
设置文字对齐方式: myTable.SetAlignment(1, AcCellAlignment.acMiddleCenter);
插入文字:myTable.SetText(0, 0, "我的表格测试");
插入块引用:myTable.SetBlockTableRecordId(3, 0, br.BlockTableRecord.OldIdPtr.ToInt64(), true);
后面会给出完整的代码。
需要注意的是:在设置这些单元格时,分成了通过 row和coloum来定位一个单元格,和根据枚举类型RowType来确定: AcRowType acRowType = new AcRowType();按F12查看定义可见这个类有4个值如图:
另外在插入块定义的时候,不能直接插入实体的ObjectId,要插入的实体必须得是块参照,见代码:
其中oId就是getEntity得到得ObjectId。
这个AcadTable有很多的方法见:
https://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-7B82400C-53D0-4D1A-94FA-66BB3040F0AA
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Interop.Common;
using Autodesk.AutoCAD.Interop;
using System.Runtime.InteropServices; namespace CreateExcelTable
{
public class CreateTable
{ Document AcadDoc = Application.DocumentManager.MdiActiveDocument;
Editor AcadEd = Application.DocumentManager.MdiActiveDocument.Editor;
Database AcadDb = Application.DocumentManager.MdiActiveDocument.Database; [CommandMethod("ECDCreate")]
public void Create()
{
AcadApplication acadApp = null;
AcadDocument doc = null;
AcadTable myTable = null; acadApp = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application");
doc = acadApp.ActiveDocument; PromptPointOptions ppOps = new PromptPointOptions("请选择表格插入位置\n"); PromptPointResult ppRes = AcadEd.GetPoint(ppOps); double[] vertices = new double[];
vertices[] = ;
vertices[] = ;
vertices[] = ; if (ppRes.Status == PromptStatus.OK)
{ vertices[] = ppRes.Value[];
vertices[] = ppRes.Value[];
vertices[] = ppRes.Value[]; }
AcRowType acRowType = new AcRowType();
/*acUnknownRow = 0,
acDataRow = 1,
acTitleRow = 2,
acHeaderRow = 4*/ myTable = doc.ActiveLayout.Block.AddTable(vertices, , , , );
//设置文字高度
myTable.SetTextHeight(, 0.5);
myTable.SetTextHeight(, 1.5);
myTable.SetTextHeight(, );
//合并单元格
myTable.MergeCells(, , , );
//设置列宽
myTable.SetColumnWidth(, );
myTable.SetColumnWidth(, );
//插入数据
myTable.SetText(, , "我的表格测试");
myTable.SetText(, , "Data1");
myTable.SetText(, , "这是一条数据");
myTable.SetText(, , "这是一条测试数据");
myTable.SetText(, , "左边是个块定义"); //设置文字颜色
AcadAcCmColor color = new AcadAcCmColor();
color.ColorIndex = AcColor.acYellow; myTable.SetContentColor(, color); //设置单元格中文字颜色
AcadAcCmColor color2 = new AcadAcCmColor();
color2.ColorIndex = AcColor.acGreen; myTable.SetContentColor2(, , , color2); //设置单元格对其方式
myTable.SetAlignment(, AcCellAlignment.acMiddleCenter); PromptEntityOptions propEnt = new PromptEntityOptions("请选择实体\n"); PromptEntityResult propRes = AcadEd.GetEntity(propEnt); if (propRes.Status == PromptStatus.OK)
{
try
{ //错误
// myTable.SetBlockTableRecordId(3, 0, propRes.ObjectId.OldIdPtr.ToInt64(), true); ObjectId oId = propRes.ObjectId;
AcadEd.WriteMessage(oId.IsValid.ToString()); BlockReference br;
using (var trans = AcadDb.TransactionManager.StartTransaction())
{ br = trans.GetObject(oId, OpenMode.ForRead) as BlockReference; if (br == null)
{
Application.ShowAlertDialog("请选择块定义"); trans.Commit(); return;
} trans.Commit();
} //错误
//br = (BlockReference)oId.GetObject(OpenMode.ForRead); //设置单元格块引用
myTable.SetBlockTableRecordId(, , br.BlockTableRecord.OldIdPtr.ToInt64(), true); }
catch (System.Exception e)
{ AcadEd.WriteMessage(e.ToString());
}
}
}
}
}
AutoCad 二次开发 .net 之创建Table的更多相关文章
- AutoCAD二次开发-使用ObjectARX向导创建应用程序(HelloWorld例子)
AutoCAD2007+vs2005 首先自己去网上搜索下载AutoCAD2007的ARX开发包. 解压后如下 打开后如下 classmap文件夹为C++类和.net类的框架图,是一个DWG文件. d ...
- AutoCAD二次开发——AutoCAD.NET API开发环境搭建
AutoCAD二次开发工具:1986年AutoLisp,1989年ADS,1990年DCL,1993年ADS-RX,1995年ObjectARX,1996年Active X Automation(CO ...
- 1,下载和部署开发环境--AutoCAD二次开发
环境需求为: AutoCAD 2020版 ObjectARX SDK 下载地址:https://www.autodesk.com/developer-network/platform-technolo ...
- AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层
AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层 AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层我理解的图层的作用大概是把 ...
- AutoCad 二次开发 文字镜像
AutoCad 二次开发 文字镜像 参考:https://adndevblog.typepad.com/autocad/2013/10/mirroring-a-dbtext-entity.html 在 ...
- AutoCad 二次开发 jig操作之标注跟随线移动
AutoCad 二次开发 jig操作之标注跟随线移动 在autocad当中,我认为的jig操作的意思就是即时绘图的意思,它能够实时的显示出当前的操作,以便我们直观的感受到当前的绘图操作是什么样子会有什 ...
- Autocad中使用命令来调用python对Autocad二次开发打包后的exe程序
在Autocad中直接调用Python二次开发程序是有必要的,下面介绍一种方法来实现这个功能: 其基本思路是:先将二次开发的程序打包为可执行程序exe,然后编写lsp文件,该文件写入调用exe程序的语 ...
- 我的AutoCAD二次开发之路 (一)
原帖地址 http://379910987.blog.163.com/blog/static/33523797201011184552167/ 今天在改代码的时候,遇到了AddVertexAt方法的用 ...
- 承接 AutoCAD 二次开发 项目
本人有多年的CAD开发经验,独立完成多个CAD二次开发项目.熟悉.net及Asp.net开发技术,和Lisp开发技术. 现在成立了工作室,独立承接CAD二次开发项目.结项后提供源码及开发文档,有需要的 ...
随机推荐
- 清除SQL Server Management Studio的最近服务器列表
C:\Users\dell\AppData\Roaming\Microsoft\SQL Server Management Studio\12.0\SqlStudio.bin
- 小游戏:200行python代码手写2048
#-*- coding: utf-8 -*- import curses from random import randrange, choice from collections import de ...
- 编程杂谈——使用emplace_back取代push_back
近日在YouTube视频上看到关于vector中emplace_back与push_back区别的介绍,深感自己在现代C++中还是有不少遗漏的知识点,遂写了段代码,尝试比较两者的差别. 示例代码 #i ...
- 蓝牙TWS耳机IBRT的原理初分析
最近在倒腾TWS对耳的一些东西,看到一些源码,发现一个新概念,IBRT没有搞清楚,抱着吾将上下而求索的态度,详细看了一些代码,查了一些资料,还是发现了不少有价值的信息的.至少,我突然感觉自己懂了一些什 ...
- Celery的使用完成异步任务与定时任务
0917自我总结 Celery的使用 一.官方文档 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryp ...
- RF页面断言
title should be(断言title与预期指定的title内容相等): should be equal (断言某个字符串与预期指定的字符串相等) should not be equal ( ...
- 服务器端 SOCKET 编程
使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup() 函数, 此函数在应用程序中用来初始化 Windows Socket DLL, 只有此函数调用成功后,应用程序才可 ...
- 【前端词典】4 个实用有趣的 JS 特性
前言 最近在学习的过程中发现了我之前未曾了解过的一些特性,发现有些很有趣并且在处理一些问题的时候可以给我一个新的思路. 这里我将这些特性介绍给大家. 4 个有趣的 JS 特性 利用 a 标签解析 UR ...
- Android Studio 模拟器Intel 加速
Starting emulator for AVD 'Phone1'emulator: ERROR: x86 emulation currently requires hardware acceler ...
- Go中http超时问题的排查
背景 排查 推测 连接超时 疑问 http2 解决超时 并发连接数 服务端限制 真相 重试 解决办法 问题1 背景 最新有同事反馈,服务间有调用超时的现象,在业务高峰期发生的概率和次数比较高.从日志中 ...