CAD二次开发 C# 改进SCALE实现比例调整

235 阅读3分钟

像标题提到的那样,不是完全像【SCALE】(后面就简写成SC)效果那样对CAD对象的大小和位置都做改变。有额外的附加条件,要求特定cad对象大小不变,位置变化,一般来说线是按照原始SC效果处理。(下面提到的圆泛指不需要改变大小的对象,要实现标题的效果,前提是你能够得到线与圆之间是种什么关系,能在有其它干扰对象的基础上筛选出要处理的对象
先放一张原始SC效果图
原始图信息.gif
下面是不用程序的情况下手动需要做的处理
手动的效果.gif 可以看出圆的位置还是按照SC的效果处理的,在全量SC后,圆的大小需要单独在原位置上调整大小,并且线也要调整到和之前一样的相对位置。(示例里的线圆相交只是特殊情况不能局限于相交)
上面为了方便手动处理录屏只列举了简单情况,下图的相对复杂 复杂情况.png
先分析可能存在的情况

  • 圆附近有着其它不需要调整大小的对象。
  • 线上也会有一定数量的圆
  • 线上的圆可以再次连着线。
  • 线可能直接连着线

存在的规律

  • 线上如果有多个圆,各个圆之间距离比例保持不变
  • 圆与其附近不需要处理大小的对象,相对圆本身距离角度不变

思路示意图1.png 思路示意图2.png 处理起来要注意的点

  • 线的调整存在先后顺序(只有处理完1,才能处理2;只有处理完2,才能处理3)
  • 要先处理圆的位置,之后再处理线
  • 线上的圆可能关联线,线也可能直接关联线
  • 处理圆的时候要排除线端点处的圆

下面这个图是对 上面第二注意点的示意 示意.png

开始解决:
线的处理有三种:1、线上对象用相对距离比例调整。2、两端点处的圆保持不变(当成圆处理)。3、线上对象组成小组,组内相对距离不变(当成圆处理)。
圆的处理就一种:仅按照移动处理。
大体上需要做的工作是:查找对象的时候需要用递归;拥有者与被拥有者位置用向量记录;线的关联对象记录位置分两种,端点和中点,要注意的是那种多段线,需要找到对应的某段线;线的排序需要注意处理的有两种,线连线和线上圆连线;要注意哪些操作要先处理哪些只能后处理。
下面只展示下我在实现时创建的实体类(用中文和文章里提到的保持一致)

public class 线
{
    public Entity 首点处Entity { set; get; }
    public Entity 尾点处Entity { set; get; }
    public Vector3d 首点处Vector { set; get; }
    public Vector3d 尾点处Vector { set; get; }
    private List<圆> 圆s { set; get; }
    /// <summary>
    /// 子级线
    /// </summary>
    public List<string> childLines { set; get; }
    /// <summary>
    /// 同组内相对位置不变
    /// </summary>
    public List<组> 组entitie { set; get; }
}
/// <summary>
/// 组对象(多个对象基于同一个点相对距离不变
/// </summary>
public class 组
{
    public Vector3d 相对向量 { set; get; }
    public List<圆> 圆s { set; get; }
    /// <summary>
    /// 组对象所在 线段索引
    /// </summary>
    public int index;
}
public class 圆
{
    /// <summary>
    /// 拥有其它不需要改变大小的圆
    /// </summary>
    public List<圆> 圆s { set; get; }
    public Vector3d 相对向量 { set; get; }
    public Entity 圆Entity { set; get; }
    /// <summary>
    /// 是否关联线
    /// </summary>
    public bool HasInOutLine { set; get; }
    /// <summary>
    /// 所在多段线索引
    /// </summary>
    public int index { set; get; }
}