public class MoveRotateScaleJig : DrawJig
{
public static List<Entity> entities = new List<Entity>();
private int step = ;
private int totalStepNum = ; public Point3d moveStartPnt;
public static Point3d moveEndPnt;
public Double rotateAngle;
public Double scaleFactor; public MoveRotateScaleJig(Point3d basePnt)
{
moveStartPnt = basePnt;
moveEndPnt = moveStartPnt;
rotateAngle = ;
scaleFactor = ;
} public Matrix3d Transformation
{
get
{
return Matrix3d.Scaling(scaleFactor, moveEndPnt).
PostMultiplyBy(Matrix3d.Rotation(rotateAngle, Vector3d.ZAxis, moveEndPnt)).
PostMultiplyBy(Matrix3d.Displacement(moveStartPnt.GetVectorTo(moveEndPnt)));
}
} public void AddEntity(Entity ent)
{
entities.Add(ent);
} public void TransformEntities()
{
Matrix3d mat = Transformation;
foreach (Entity ent in entities)
{
ent.TransformBy(mat);
}
} protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
{
Matrix3d mat = Transformation; WorldGeometry geo = draw.Geometry;
if (geo != null)
{
geo.PushModelTransform(mat); foreach (Entity ent in entities)
{
geo.Draw(ent);
} geo.PopModelTransform();
} return true;
} protected override SamplerStatus Sampler(JigPrompts prompts)
{
switch (step)
{
case :
JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\n目标点:");
prOptions1.UserInputControls = UserInputControls.GovernedByOrthoMode
| UserInputControls.GovernedByUCSDetect;
PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);
if (prResult1.Status != PromptStatus.OK)
return SamplerStatus.Cancel; if (prResult1.Value.Equals(moveEndPnt))
{
return SamplerStatus.NoChange;
}
else
{
moveEndPnt = prResult1.Value;
return SamplerStatus.OK;
} case :
JigPromptAngleOptions prOptions2 = new JigPromptAngleOptions("\nRotate:");
prOptions2.UseBasePoint = true;
prOptions2.BasePoint = moveEndPnt;
prOptions2.UserInputControls = UserInputControls.GovernedByOrthoMode
| UserInputControls.GovernedByUCSDetect;
PromptDoubleResult prResult2 = prompts.AcquireAngle(prOptions2);
if (prResult2.Status != PromptStatus.OK)
return SamplerStatus.Cancel; if (prResult2.Value.Equals(rotateAngle))
{
return SamplerStatus.NoChange;
}
else
{
rotateAngle = prResult2.Value;
return SamplerStatus.OK;
} case :
JigPromptDistanceOptions prOptions3 = new JigPromptDistanceOptions("\nScale:");
prOptions3.UseBasePoint = true;
prOptions3.BasePoint = moveEndPnt;
prOptions3.UserInputControls = UserInputControls.GovernedByOrthoMode
| UserInputControls.GovernedByUCSDetect;
PromptDoubleResult prResult3 = prompts.AcquireDistance(prOptions3);
if (prResult3.Status != PromptStatus.OK)
return SamplerStatus.Cancel; if (prResult3.Value.Equals(scaleFactor))
{
return SamplerStatus.NoChange;
}
else
{
scaleFactor = prResult3.Value;
return SamplerStatus.OK;
} default:
break;
} return SamplerStatus.OK;
} public static bool Jig()
{
try
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database; // 选择对象
PromptSelectionResult selRes = doc.Editor.GetSelection();
if (selRes.Status != PromptStatus.OK)
return false; // 指定起点
PromptPointResult ppr = doc.Editor.GetPoint("\nStart point:");
if (ppr.Status != PromptStatus.OK)
return false;
Point3d basePnt = ppr.Value;
basePnt = basePnt.TransformBy(doc.Editor.CurrentUserCoordinateSystem); // Draw Jig
MoveRotateScaleJig jig = new MoveRotateScaleJig(basePnt);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
foreach (ObjectId id in selRes.Value.GetObjectIds())
{
Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
jig.AddEntity(ent);
} // Draw Jig 交互
PromptResult pr;
do
{
pr = doc.Editor.Drag(jig);
if (pr.Status == PromptStatus.Keyword)
{
// Keyword handling code
}
else
{
jig.step++;
}
}
while (pr.Status == PromptStatus.OK
&& jig.step <= jig.totalStepNum); // 结果
if (pr.Status == PromptStatus.OK &&
jig.step == jig.totalStepNum + )
{
jig.TransformEntities();
}
else
{
return false;
} tr.Commit();
return true;
}
}
catch
{
return false;
}
} public static bool JigMove()
{
try
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database; //// 选择对象
//PromptSelectionResult selRes = doc.Editor.GetSelection();
//if (selRes.Status != PromptStatus.OK)
// return false; // 指定起点
PromptPointResult ppr = doc.Editor.GetPoint("\n指定起点:");
if (ppr.Status != PromptStatus.OK)
return false;
Point3d basePnt = ppr.Value;
basePnt = basePnt.TransformBy(doc.Editor.CurrentUserCoordinateSystem); // Draw Jig
MoveRotateScaleJig jig = new MoveRotateScaleJig(basePnt);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
//foreach (ObjectId id in selRes.Value.GetObjectIds())
//{
// Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
//} // Draw Jig 交互
PromptResult pr;
do
{
pr = doc.Editor.Drag(jig);
if (pr.Status == PromptStatus.Keyword)
{
// Keyword handling code
}
else
{
for (int i = ; i < entities.Count;i++ )
{
Entity ent = tr.GetObject(entities[i].ObjectId, OpenMode.ForWrite) as Entity;
AcEdPublicDll.CAcadEntity.Move(ent, basePnt, moveEndPnt);
ent.Dispose();
}
}
}
while (pr.Status != PromptStatus.OK);
tr.Commit();
return true;
}
}
catch
{
return false;
}
}
}

调用:MoveRotateScaleJig.Jig()

c#+CAD动态移动效果的更多相关文章

  1. Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客

    Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客 Canvas之动态波浪效果 (2012-04-26 09:04:51) 转载▼

  2. Android SurfaceView实现静态于动态画图效果

    本文是基于Android的SurfaceView的动态画图效果,实现静态和动态下的正弦波画图,可作为自己做图的简单参考,废话不多说,先上图, 静态效果: 动态效果: 比较简单,代码注释的也比较详细,易 ...

  3. 在WPF中使用PlaneProjection模拟动态3D效果

    原文:在WPF中使用PlaneProjection模拟动态3D效果 虽然在WPF中也集成了3D呈现的功能,在简单的3D应用中,有时候并不需要真实光影的3D场景.毕竟使用3D引擎会消耗很多资源,有时候使 ...

  4. OpenGL 画出雷达动态扫描效果(二) 非底图

    OpenGL 画出雷达动态扫描效果(一)中给出了已一张图片作为底图的雷达扫面程序 如果有漂亮的雷达底图的话,效果应该非常不错的,另外也可以直接手绘雷达框架 效果如下 雷达主体代码 glLineWidt ...

  5. Android自定义控件 -Canvas绘制折线图(实现动态报表效果)

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas ...

  6. 9种纯CSS3人物信息卡片动态展示效果

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. JavaScript实现动态打字效果

    废话不多说,上代码~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  8. android优化中国风应用、完整NBA客户端、动态积分效果、文件传输、小说阅读器等源码

    Android精选源码 android拖拽下拉关闭效果源码 一款优雅的中国风Android App源码 EasySignSeekBar一个漂亮而强大的自定义view15 android仿蘑菇街,蜜芽宝 ...

  9. 前端开发---ppt展示页面评论区支持动态交互效果

    1. 工程地址:https://github.com/digitalClass/web_page 网站发布地址: http://115.28.30.25:8029/ 2. 用到的技术主要还是jquer ...

随机推荐

  1. python中shelve模块的使用

    import shelve # 将序列化文件操作dump与load进行封装,写入文件的内容就是个大的字符串字典 s_dic = shelve.open("text/b.txt",w ...

  2. Vue 交互

  3. 第十六次 ccf 201903-2 二十四点

    题意: 计算数学表达式的值, 数学表达式的定义: 4个[0-9]表示数字的字符 ,3个[+-x/]表示运算的字符 可以用正则为: ([0-9][+-x/]){3}[0-9] 例如: 5+2/1x3 2 ...

  4. mysql执行sql脚本文件

    mysql执行sql脚本文件 方法一:使用cmd命令执行(windows下,unix或Linux在的其控制台下) [MySQL的bin目录]\mysql –u用户名 –p密码 –D数据库<[sq ...

  5. Development descriptor

    部署描述符指的是配置文件对于一个假象部署到一些容器/发动机. 在Java平台,企业版部署描述符描述组件.模块或应用程序(例如web应用程序或者企业应用程序)应该被部署.它指导部署工具部署具有特定容器选 ...

  6. 《DSP using MATLAB》Problem 7.14

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  7. 软件开发者路线图梗概&书摘chapter5

    恒久学习:整个职业生涯,反馈回路,了解弱点 1.提高带宽:多维度.高效获取知识 博客.关注twitter动态.订阅邮件列表.加入本地用户组.技术大会.联系书的作者.在线教程 从信息的海洋中回到实际软件 ...

  8. Spark菜鸟记录

    1.RDD[(k,v)] join()优化,join之前会对两个RDD的key做hash,通过网络把相同hash值的数据传到同一个节点,因此对多次join的RDD 做预分区与持久化可提高效率. map ...

  9. [硬件]_ELVE_STLINK下载出现nternal command error问题

    我之前也出现过这个这个,然后折腾一晚上,升级什么都都不好使 最后我换了一根短的线,回归正常!!!

  10. Mybatis逆向工程的配置

    源码github下载地址:https://github.com/wcyong/mybatisGeneratorCustom.git 参考文章:https://www.cnblogs.com/whgk/ ...