用.NET创建并且覆盖AutoCAD的标注样式

2024-06-10 11:32

本文主要是介绍用.NET创建并且覆盖AutoCAD的标注样式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:Creating and overriding AutoCAD dimension styles using .NET

上周末有一封电子邮件发来了一份请求::

我一直在寻找一种创建标注样式重定义的方法,但一直没有真的没有成功。我写了一个程序,在程序中我创建了几个标注样式,但是总是会丢失标注的重定义。

这似乎是一个很好的重定义话题,所以这篇文章包含一些简单的代码,创建一个样式和两个几乎相同的线性标注:都使用我们新创建的样式但第二个尺寸包含了一些尺寸样式重定义,我们通过附加扩展实体数据(xData)附加到尺寸上来实现这一功能
以下是C #代码:

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;namespace DimStyleOverrideTest
{public class Commands{[CommandMethod("ODS")]public void OverrideDimensionStyle(){Database db =HostApplicationServices.WorkingDatabase;Transaction tr =db.TransactionManager.StartTransaction();using (tr){// Open our dimension style table to add our// new dimension styleDimStyleTable dst =(DimStyleTable)tr.GetObject(db.DimStyleTableId, OpenMode.ForWrite);// Create our new dimension styleDimStyleTableRecord dstr =new DimStyleTableRecord();dstr.Dimtad = 2;dstr.Dimgap = 0.3;dstr.Name = "MyStyle";// Add it to the dimension style tableObjectId dsId = dst.Add(dstr);tr.AddNewlyCreatedDBObject(dstr, true);// Now create two identical dimensions, one// next to the other, using our dimension// styleAlignedDimension ad1 =new AlignedDimension(Point3d.Origin,new Point3d(5.0, 0.0, 0.0),new Point3d(2.5, 2.0, 0.0),"Standard dimension",dsId);// The only thing we change is the text stringAlignedDimension ad2 =new AlignedDimension(new Point3d(5.0, 0.0, 0.0),new Point3d(10.0, 0.0, 0.0),new Point3d(7.5, 2.0, 0.0),"Overridden dimension",dsId);/*Now we'll add dimension overrides for DIMTADand DIMGAP via XDataDimension variable group codes are:DIMPOST     3DIMAPOST    4DIMSCALE   40DIMASZ     41DIMEXO     42DIMDLI     43DIMEXE     44DIMRND     45DIMDLE     46DIMTP      47DIMTM      48DIMTOL     71DIMLIM     72DIMTIH     73DIMTOH     74DIMSE1     75DIMSE2     76DIMTAD     77DIMZIN     78DIMAZIN    79DIMTXT    140DIMCEN    141DIMTSZ    142DIMALTF   143DIMLFAC   144DIMTVP    145DIMTFAC   146DIMGAP    147DIMALTRND 148DIMALT    170DIMALTD   171DIMTOFL   172DIMSAH    173DIMTIX    174DIMSOXD   175DIMCLRD   176DIMCLRE   177DIMCLRT   178DIMADEC   179DIMDEC    271DIMTDEC   272DIMALTU   273DIMALTTD  274DIMAUNIT  275DIMFRAC   276DIMLUNIT  277DIMDSEP   278DIMATMOVE 279DIMJUST   280DIMSD1    281DIMSD2    282DIMTOLJ   283DIMTZIN   284DIMALTZ   285DIMALTTZ  286DIMUPT    288DIMATFIT  289DIMTXSTY  340DIMLDRBLK 341DIMBLK    342DIMBLK1   343DIMBLK2   344DIMLWD    371DIMLWE    372Variables have different types: these can be found inthe ObjectARX Reference - search for "Dimension StyleOverrides"*/ResultBuffer rb =new ResultBuffer(new TypedValue[8]{new TypedValue((int)DxfCode.ExtendedDataRegAppName, "ACAD"),new TypedValue((int)DxfCode.ExtendedDataAsciiString, "DSTYLE"),new TypedValue((int)DxfCode.ExtendedDataControlString, "{"),new TypedValue((int)DxfCode.ExtendedDataInteger16, 77  // DIMTAD),new TypedValue((int)DxfCode.ExtendedDataInteger16, 4   // Below),new TypedValue((int)DxfCode.ExtendedDataInteger16, 147 // DIMGAP),new TypedValue((int)DxfCode.ExtendedDataReal, 0.5      // Larger),new TypedValue((int)DxfCode.ExtendedDataControlString, "}")});// Set the XData on our objectad2.XData = rb;rb.Dispose();// Now let's open the current space and add our two// dimensionsBlockTableRecord btr =(BlockTableRecord)tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite);btr.AppendEntity(ad1);btr.AppendEntity(ad2);tr.AddNewlyCreatedDBObject(ad1, true);tr.AddNewlyCreatedDBObject(ad2, true);// And commit the transaction, of coursetr.Commit();}}}
}
更新

OK, I missed the obvious on this one (as does happen from time-to-time, as regular readers will by now be aware). Rather than setting the overrides directly via XData, there are handy properties belonging to the dimension’s managed interface that do this for you. Very cool. So we can reduce the code to the following:

好吧,我完全没有意识到这一明显的做法(这的确也时有会发生,普通读者现在也知道了)。与其通过直接重写XDATA,其实Dimesion的接口属性中有更方便的方法来实现。实现的方法很酷。所以我们可以减少代码如下:

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;namespace DimStyleOverrideTest
{public class Commands{[CommandMethod("ODS")]public void OverrideDimensionStyle(){Database db =HostApplicationServices.WorkingDatabase;Transaction tr =db.TransactionManager.StartTransaction();using (tr){// Open our dimension style table to add our// new dimension styleDimStyleTable dst =(DimStyleTable)tr.GetObject(db.DimStyleTableId, OpenMode.ForWrite);// Create our new dimension styleDimStyleTableRecord dstr =new DimStyleTableRecord();dstr.Dimtad = 2;dstr.Dimgap = 0.3;dstr.Name = "MyStyle";// Add it to the dimension style tableObjectId dsId = dst.Add(dstr);tr.AddNewlyCreatedDBObject(dstr, true);// Now create two identical dimensions, one// next to the other, using our dimension// styleAlignedDimension ad1 =new AlignedDimension(Point3d.Origin,new Point3d(5.0, 0.0, 0.0),new Point3d(2.5, 2.0, 0.0),"Standard dimension",dsId);// The only thing we change is the text stringAlignedDimension ad2 =new AlignedDimension(new Point3d(5.0, 0.0, 0.0),new Point3d(10.0, 0.0, 0.0),new Point3d(7.5, 2.0, 0.0),"Overridden dimension",dsId);// Isn't this easier?ad2.Dimtad = 4;ad2.Dimgap = 0.5;// Now let's open the current space and add our two// dimensionsBlockTableRecord btr =(BlockTableRecord)tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite);btr.AppendEntity(ad1);btr.AppendEntity(ad2);tr.AddNewlyCreatedDBObject(ad1, true);tr.AddNewlyCreatedDBObject(ad2, true);// And commit the transaction, of coursetr.Commit();}}}
}


这篇关于用.NET创建并且覆盖AutoCAD的标注样式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048042

相关文章

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P