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. Error: “app_name” is not translated in af

    in values/strings.xml   "app_name" is not translated in af, am, ar, be, bg, ca, cs, da, de ...

  2. HDU - 5833: Zhu and 772002 (高斯消元-自由元)

    pro:给定N个数Xi(Xi<1e18),保证每个数的素因子小于2e3:问有多少种方案,选处一些数,使得数的乘积是完全平方数.求答案%1e9+7: N<300; sol:小于2e3的素数只 ...

  3. UVa——1600(巡逻机器人)

    迷宫求最短路的话一般用bfs都可以解决,但是这个加了个状态,那么就增加一个维度,用来判断k的值.比较简单的三维bfs.写搜索题的话一定要注意细节.这个题花了好长的时间.因为k的原因,一开始用了k的原因 ...

  4. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  5. PHP之魔术方法

      PHP中的魔术方法: PHP的魔术方法主要是在特定的条件下执行相应的魔术方法.这和很多框架中的钩子函数有些类似,不同的是,钩子函数是在生命周期的某个周期内自动执行,而魔术方法是在触发某种条件下自动 ...

  6. PyCharm设置仿sublime配色__Py版本2018.3.5

    效果图: 导出settings 模板为: 1.https://files.cnblogs.com/files/xier/PyCharm_settings.zip 2.https://files.cnb ...

  7. Resin安装配置

    在linux下安装Resin过程整理   下载Resin, http://caucho.com/products/resin/download#download   检查JDK是否安装,环境是否配置 ...

  8. XML注入(XXE)

    XML所有元素都必须要有一个结束标志 大小写敏感 所有元素嵌套必须正确 所有的XML文档都必须要有一个根标志 XML包括XML声明,DTD文档类型定义(可选),文档元素 DTD即文档类型定义,用来为X ...

  9. AntV G6绘制流程图学习例子

    下面代码可以直接贴到html文件中运行看效果. 代码说明 js中data是一个json变量,里面有两个关键对象"nodes.edges",分别来描述节点.节点间箭线. 更多&quo ...

  10. Vue01

    1.vue.js库的下载 vue.js是目前前端web开发最流行的工具库,由尤雨溪在2014年2月发布的. 另外几个常见的工具库:react.js /angular.js 官方网站: 中文:https ...