AutoCAD中实现不等比例缩放
autocad中大多数对象都是不支持non-uniform scale的,
但我这两天却遇到了类似的需求,
需要将线、多段线等对象进行不等比例缩放,
比如x方向放大2倍,y方向放大0.4倍,
于是就想着自己写代码实现,
但转换矩阵怎么计算却被难住了,
(自己看的书还是远远不够啊!)
从书架上翻出的第一本书中有类似的公式,
但怎么用代码实现没有,
于是又找到一本《计算机图形学》(影印版,C语言版,第二版,清华大学出版社),
11-5节(P424)里面有现成的代码,
于是就照着书中的代码进行测试,
在敲代码的时候,
居然忘了接小孩放学......
为了备忘,
将代码分享在此。
测试代码,
非常简单,
权当抛砖引玉。
Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; double sx = 2, sy = 3,sz = 1; var ppr = ed.GetPoint("\n拾取点"); if (ppr.Status != PromptStatus.OK) return; Point3d refPt = ppr.Value; //Matrix3d m = Matrix3d.Scaling(2, new Point3d(5,3,1)); //ed.WriteMessage("\nThe scaleAroundPoint matrix is: \n{0}\n", m); double[] ds = new double[] { sx, 0, 0, (1-sx)*refPt.X, 0, sy, 0, (1 - sy) * refPt.Y, 0, 0,sz, (1 - sz) * refPt.Z, 0, 0, 0, 1 }; Matrix3d m = new Matrix3d(ds); PromptEntityResult per = ed.GetEntity("\n拾取需要缩放的直线"); if (per.Status != PromptStatus.OK) return; using (Transaction tr = doc.TransactionManager.StartTransaction()) { var line = per.ObjectId.GetObject(OpenMode.ForWrite) as Line; line.StartPoint = line.StartPoint.TransformBy(m); line.EndPoint = line.EndPoint.TransformBy(m); tr.Commit(); }
直接变换直线是不行的,
autocad是不支持的,
于是采用变换直线端点的方式,
这种方式恰好能满足我的需求。
分类:
AutoCAD API相关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?