AutoCad 二次开发 文字镜像
AutoCad 二次开发 文字镜像









- public class MyMirror
- {
- Document Doc = Application.DocumentManager.MdiActiveDocument;
- Editor Ed = Application.DocumentManager.MdiActiveDocument.Editor;
- Database Db = Application.DocumentManager.MdiActiveDocument.Database;
- List<Entity> list = new List<Entity>();
- List<ObjectId> listOId = new List<ObjectId>();
- [CommandMethod("testM")]
- public void MirrorTextCmd()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- //Entity selection
- PromptEntityOptions peo = new PromptEntityOptions(
- "\nSelect a text entity:");
- peo.SetRejectMessage("\nMust be text entity...");
- peo.AddAllowedClass(typeof(DBText), true);
- PromptEntityResult perText = ed.GetEntity(peo);
- if (perText.Status != PromptStatus.OK)
- return;
- peo = new PromptEntityOptions("\nSelect a mirror line:");
- peo.SetRejectMessage("\nMust be a line entity...");
- peo.AddAllowedClass(typeof(Line), true);
- PromptEntityResult perLine = ed.GetEntity(peo);
- if (perLine.Status != PromptStatus.OK)
- return;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- Line line = tr.GetObject(perLine.ObjectId, OpenMode.ForRead)
- as Line;
- Line3d mirrorLine = new Line3d(
- line.StartPoint,
- line.EndPoint);
- MirrorText(perText.ObjectId, mirrorLine);
- tr.Commit();
- }
- }
- void MirrorText(ObjectId oId, Line3d mirrorLine)
- {
- Database db = oId.Database;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- // Get text entity
- DBText dbText = tr.GetObject(oId, OpenMode.ForRead)
- as DBText;
- // Clone original entity
- DBText mirroredTxt = dbText.Clone() as DBText;
- // Create a mirror matrix
- Matrix3d mirrorMatrix = Matrix3d.Mirroring(mirrorLine);
- // Do a geometric mirror on the cloned text
- mirroredTxt.TransformBy(mirrorMatrix);
- // Get text bounding box
- Point3d pt1, pt2, pt3, pt4;
- GetTextBoxCorners(
- dbText,
- out pt1,
- out pt2,
- out pt3,
- out pt4);
- // Get the perpendicular direction to the original text
- Vector3d rotDir =
- pt4.Subtract(pt1.GetAsVector()).GetAsVector();
- // Get the colinear direction to the original text
- Vector3d linDir =
- pt3.Subtract(pt1.GetAsVector()).GetAsVector();
- // Compute mirrored directions
- Vector3d mirRotDir = rotDir.TransformBy(mirrorMatrix);
- Vector3d mirLinDir = linDir.TransformBy(mirrorMatrix);
- //Check if we need to mirror in Y or in X
- if (Math.Abs(mirrorLine.Direction.Y) >
- Math.Abs(mirrorLine.Direction.X))
- {
- // Handle the case where text is mirrored twice
- // instead of doing "oMirroredTxt.IsMirroredInX = true"
- mirroredTxt.IsMirroredInX = !mirroredTxt.IsMirroredInX;
- mirroredTxt.Position = mirroredTxt.Position + mirLinDir;
- }
- else
- {
- mirroredTxt.IsMirroredInY = !mirroredTxt.IsMirroredInY;
- mirroredTxt.Position = mirroredTxt.Position + mirRotDir;
- }
- // Add mirrored text to database
- //btr.AppendEntity(mirroredTxt);
- //tr.AddNewlyCreatedDBObject(mirroredTxt, true);
- //list.Add(mirroredTxt);
- mirroredTxt.ToSpace();
- tr.Commit();
- }
- }
- #region p/Invoke
- public struct ads_name
- {
- public IntPtr a;
- public IntPtr b;
- };
- // Exported function names valid only for R19
- [DllImport("acdb22.dll",
- CallingConvention = CallingConvention.Cdecl,
- EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AAY01JVAcDbObjectId@@@Z")]
- public static extern int acdbGetAdsName32(
- ref ads_name name,
- ObjectId objId);
- [DllImport("acdb22.dll",
- CallingConvention = CallingConvention.Cdecl,
- EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AEAY01_JVAcDbObjectId@@@Z")]
- public static extern int acdbGetAdsName64(
- ref ads_name name,
- ObjectId objId);
- public static int acdbGetAdsName(ref ads_name name, ObjectId objId)
- {
- if (Marshal.SizeOf(IntPtr.Zero) > )
- return acdbGetAdsName64(ref name, objId);
- return acdbGetAdsName32(ref name, objId);
- }
- [DllImport("accore.dll",
- CharSet = CharSet.Unicode,
- CallingConvention = CallingConvention.Cdecl,
- EntryPoint = "acdbEntGet")]
- public static extern System.IntPtr acdbEntGet(
- ref ads_name ename);
- [DllImport("accore.dll",
- CharSet = CharSet.Unicode,
- CallingConvention = CallingConvention.Cdecl,
- EntryPoint = "acedTextBox")]
- public static extern System.IntPtr acedTextBox(
- IntPtr rb,
- double[] point1,
- double[] point2);
- void GetTextBoxCorners(DBText dbText, out Point3d pt1, out Point3d pt2, out Point3d pt3, out Point3d pt4)
- {
- ads_name name = new ads_name();
- int result = acdbGetAdsName(
- ref name,
- dbText.ObjectId);
- ResultBuffer rb = new ResultBuffer();
- Interop.AttachUnmanagedObject(
- rb,
- acdbEntGet(ref name), true);
- double[] point1 = new double[];
- double[] point2 = new double[];
- // Call imported arx function
- acedTextBox(rb.UnmanagedObject, point1, point2);
- pt1 = new Point3d(point1);
- pt2 = new Point3d(point2);
- var ptX = pt1 + Vector3d.XAxis * ;
- var ptY = pt2 + Vector3d.YAxis * ;
- var lX = new Line(pt1, ptX);
- var lY = new Line(pt2, ptY);
- lX.Color= Color.FromColor(System.Drawing.Color.Green);
- lY.Color= Color.FromColor(System.Drawing.Color.Orange);
- Line line = new Line(pt1, pt2);
- line.Color = Color.FromColor(System.Drawing.Color.Red);
- line.ToSpace();
- lX.ToSpace();
- lY.ToSpace();
- // Create rotation matrix
- Matrix3d rotMat = Matrix3d.Rotation(
- dbText.Rotation,
- dbText.Normal,
- pt1);
- // The returned points from acedTextBox need
- // to be transformed as follow
- pt1 = pt1.TransformBy(rotMat).Add(dbText.Position.GetAsVector());
- pt2 = pt2.TransformBy(rotMat).Add(dbText.Position.GetAsVector());
- Line linetrans = new Line(pt1, pt2);
- linetrans.Color = Color.FromColor(System.Drawing.Color.Yellow) ;
- linetrans.ToSpace();
- Vector3d rotDir = new Vector3d(
- -Math.Sin(dbText.Rotation),
- Math.Cos(dbText.Rotation), );
- //求垂直于rotDir和normal的法向量
- Vector3d linDir = rotDir.CrossProduct(dbText.Normal);
- double actualWidth =
- Math.Abs((pt2.GetAsVector() - pt1.GetAsVector())
- .DotProduct(linDir));
- pt3 = pt1.Add(linDir * actualWidth);
- pt4 = pt2.Subtract(linDir * actualWidth);
- Line linetrans2 = new Line(pt3, pt4);
- linetrans2.Color = Color.FromColor(System.Drawing.Color.Blue);
- linetrans2.ToSpace();
- }
- #endregion
- }
AutoCad 二次开发 文字镜像的更多相关文章
- 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 二次开发 jig操作之标注跟随线移动
AutoCad 二次开发 jig操作之标注跟随线移动 在autocad当中,我认为的jig操作的意思就是即时绘图的意思,它能够实时的显示出当前的操作,以便我们直观的感受到当前的绘图操作是什么样子会有什 ...
- AutoCAD二次开发-使用ObjectARX向导创建应用程序(HelloWorld例子)
AutoCAD2007+vs2005 首先自己去网上搜索下载AutoCAD2007的ARX开发包. 解压后如下 打开后如下 classmap文件夹为C++类和.net类的框架图,是一个DWG文件. d ...
- 我的AutoCAD二次开发之路 (一)
原帖地址 http://379910987.blog.163.com/blog/static/33523797201011184552167/ 今天在改代码的时候,遇到了AddVertexAt方法的用 ...
- Autocad中使用命令来调用python对Autocad二次开发打包后的exe程序
在Autocad中直接调用Python二次开发程序是有必要的,下面介绍一种方法来实现这个功能: 其基本思路是:先将二次开发的程序打包为可执行程序exe,然后编写lsp文件,该文件写入调用exe程序的语 ...
- 承接 AutoCAD 二次开发 项目
本人有多年的CAD开发经验,独立完成多个CAD二次开发项目.熟悉.net及Asp.net开发技术,和Lisp开发技术. 现在成立了工作室,独立承接CAD二次开发项目.结项后提供源码及开发文档,有需要的 ...
- AutoCad 二次开发 .net 之创建Table
我使用了COM对象来在cad2018中创建table表格,需要的ObjectArx开发包可以在官网上下载,并且需要使用.netframework4.6的库才行. 项目里除了引用常规的Cad开发dll, ...
随机推荐
- 线性回归 python 代码实现
本代码参考自:https://github.com/lawlite19/MachineLearning_Python#%E4%B8%80%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%B ...
- C语言I博客作业06
这个作业属于哪个课程 C语言程序设计I 这个作业要求在哪里 作业链接 我在这个课程的目标是 熟悉分支结构 这个作业在那个具体方面帮助我实现目标 可以更完整的编写程序及博客园 参考文献 [参考文献](h ...
- 【问题记录】VMware Tools是灰色的,不能安装
一.VMware Tools简介 VMware Tools 中包含一系列服务和模块,可在 VMware 产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机操作系统进行无缝交互. ...
- 虚拟环境:virtualenv与virtualenvwrapper
前言: 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的 ...
- Go语言入门:Hello world
本文是「vangoleo的Go语言学习笔记」系列文章之一. 官网: http://www.vangoleo.com/go/go-hello-world/ 在上一篇文章你好,Go语言中,我们对Go语言的 ...
- window10系统下,彻底删除卸载mysql
本文介绍,在Windows10系统下,如何彻底删除卸载MySQL...1>停止MySQL服务开始->所有应用->Windows管理工具->服务,将MySQL服务停止.2> ...
- 前端技术之:常见前端UI相关开源项目
Bootstrap https://getbootstrap.com/BootstrapVue provides one of the most comprehensive implementatio ...
- 知否知否,VS Code 不止开源
VS Code, 昨夜始于“开源”,如今“开源”深处渡. 读者看到这句话,也许会有疑惑,为什么两个“开源”都加上了双引号? 其实是笔者有意为之,因为这个两个“开源”的意义有着很大的差别,第一个“开源” ...
- Feign设置assessToken
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.an ...
- 推荐一款Diffy:Twitter的开源自动化测试工具
1. Diffy是什么 Diffy是一个开源的自动化测试工具,是一种Diff测试技术.它能够自动检测基于Apache Thrift或者基于HTTP的服务.通过同时运行新/老代码,对比运行结果,发现潜在 ...