GH C# 中Transform会对变量与被该变量赋值过的变量同时作用的问题

grasshopper C# 中:

就是我发现transform的命令好像除了对该变量作用外,还会对所有赋值该变量的其他变量同时作用……这个会导致我没法再继续使用transform之前的变量的值了(详情在gh文件里)

就跟平时了解到的数值替换的思路不一样,比如正常情况应该是:
b = brepA;
a = b;
b.Transform;
结果应该是:
a = brepA;
b = brepTrans;
但现在是:
a = brepTrans;
b = brepTrans;

这样的话我像继续用brepA的话就没法用了,除非重新用函数再生成一个
c = brepA;

现在我采用的方法就是重新用函数生成一个新的变量,,但还是想搞明白为啥transform会有这种连锁反应……

private void RunScript(Transform Trans, ref object A, ref object B, ref object C, ref object D)
  {
//Trans 是一个输入的旋转90°的transform类型的值
    CreateObject T = new CreateObject();
    Mesh meshSample = new Mesh();
    Mesh meshSample2 = new Mesh();
    Mesh meshSample3 = new Mesh();
    Mesh meshSample4 = new Mesh();

    T.GetBox(meshSample);//创建mesh三棱锥(A)
    A = meshSample;
    meshSample2 = meshSample;//将meshSample(A)赋值给meshSample2(B),
    meshSample2.Transform(Trans); //对meshSample2(B)进行旋转指令,但同时meshSample(A)也随着进行了旋转指令
    B = meshSample2;//

    T.GetBox(meshSample3);//独立创建mesh三棱锥(C)
    T.GetBox(meshSample4);//独立创建mesh三棱锥(D)
    meshSample4.Transform(Trans);//非赋值的transform对D有影响但对C没有影响
    C = meshSample3;
    D = meshSample4;

  }

  // <Custom additional code> 
  class CreateObject
  {
    public void GetBox(Mesh meshResult) //创建一个三棱锥mesh
    {
      meshResult.Vertices.Add(-10, -20, 0);
      meshResult.Vertices.Add(-5, -35, 0);
      meshResult.Vertices.Add(10, -25, 0);
      meshResult.Vertices.Add(0, -25, 20);

      MeshFace mf1 = new MeshFace(0, 1, 3);
      meshResult.Faces.AddFace(mf1);
      MeshFace mf2 = new MeshFace(1, 2, 3);
      meshResult.Faces.AddFace(mf2);
      MeshFace mf3 = new MeshFace(2, 0, 3);
      meshResult.Faces.AddFace(mf3);
      MeshFace mf4 = new MeshFace(0, 2, 1);
      meshResult.Faces.AddFace(mf4);
    }
  }
  // </Custom additional code> 
}

Transform Debug.gh (9.1 KB)

值对象,例如数字,字符在C#中会默认执行深拷贝deep copy

a=1
b=a
b=2

此时a还是1不变化,因为深拷贝在运行b=a的时候,给b新建了一个全新的内存,分配了一个新地址

再举个实际例子

a=1: 你家新建了一个房子,有一个卧室(a=1),在100号
b=a: 我家也要新建一个房子,卧室数量和你的一样(b=a),但是在200号(深拷贝,切切实实分配了一个新的房子地址)
b=2: 我家房子要扩建一个卧室变成2个了

但是因为我的房子在200号,你的还是在100号,所以我的变成了2个卧室,你的还是1个卧室

引用对象,例如class, array, 等等,在你这里属于class,rhino中的几何物体都是class,例如点线面
会执行浅拷贝shallow copy

a=点1
b=a
b改成了点2

此时a也一起改成了点2,因为浅拷贝在运行到b=a的时候,做的事情只是新建了一个b的名称,但是给b分配的内存地址和a一样。

也是一个实际例子

a=1: 你家新建了一个房子,有一个卧室,在100号
b=a: 我家也要新建一个房子,不用考虑卧室数量,我家的地址就是你家的地址。也是100号(浅拷贝,没新分配一个地皮,b=a的确切含义是新增了一个概念“我家”,但是用的是和你家一样的地址)
b=2: 我家房子要扩建一个卧室变成2个了

言下之意就是你家房子也成了2个卧室了,因为我家就是你家 :crazy_face:

3 个赞