欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

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是不支持的,

于是采用变换直线端点的方式,

这种方式恰好能满足我的需求。

 

posted @ 2022-02-17 08:30  david96007  阅读(516)  评论(0编辑  收藏  举报