愿你出走半生,归来仍是少年!
环境:.NET FrameWork4.5、ObjectArx 2016 64bit、Entity Framework 6.
在排水管网数据的编图时,时常会遇见针对雨水箅等进行旋转。由于数据存储在数据库内,通过CAD自带的旋转功能只能变更图面而无法修改数据表本身,所以需要自行开发功能实现旋转:搞定块参照的旋转交互然后更新数据表内的旋转角。
1.旋转计算原理
通过构建一条以块参照位置为起点,X向右增加10的点为终点的线段作为起始角度线,然后根据鼠标位置构建以块参照位置为起点,鼠标位置为终点的线段。两条线段的夹角就是这个块参照当前旋转的角度。
2.交互
通过Jig进行交互展示,实时显示出旋转后的样子,方便用户确认是否满足旋转要求。
3.示例
此处展示Jig中的WorldDraw方法,关于Jig的具体使用请参考:7.动态绘制(Jig)
protected override bool WorldDraw(WorldDraw draw)
{//水平线Line basicLine = new Line();basicLine.StartPoint=bf.Position;basicLine.EndPoint = new Point3d(bf.Position.X + 10, bf.Position.Y, 0);//线型,实线basicLine.Linetype = LineTypeNames.ACAD_ISO07W100;basicLine.LinetypeScale = 0.01;draw.Geometry.Draw(basicLine);//旋转线Line rotateLine=new Line();rotateLine.StartPoint=bf.Position;rotateLine.EndPoint = lstPt;draw.Geometry.Draw(rotateLine);//向量var basicV3 = basicLine.StartPoint - basicLine.EndPoint;var basicV2=new Vector2d(basicV3.X, basicV3.Y);//向量var rotateV3=rotateLine.StartPoint - rotateLine.EndPoint;var rotateV2 = new Vector2d(rotateV3.X, rotateV3.Y);//旋转偏移var angle = rotateV2.Angle - basicV2.Angle;//重置为原本旋转角bf.Rotation = defaultAngle ;//旋转Matrix3d rotationMatrix = Matrix3d.Rotation(angle, Vector3d.ZAxis, bf.Position);//旋转bf.TransformBy(rotationMatrix);//获取当前旋转角LastAngle = bf.Rotation;draw.Geometry.Draw(bf);return true;
}