之所以vex表达式要在detail层级下运行,是因为要保持数据的轻量化,同一行表达式,如果在point层级下运行,那么有多少个点,这行表达式就会运行多少次,但是在detail层级下运行,这行表达式就只会运行一次。 在这里因为要写For循环语句,For循环语句运行一次就会循环五百零一遍,如果在point层级下写For循环语句,计算量会非常非常巨大
for(init; condition;change){ statement }循环语句格式,先运行init,再进行条件判断,判断为真,便执行大括号里边的statement,再执行change,进行条件判断,判断为假便退出循环;
for(int i = 0; i < npoints(0); i++){
setpointattrib(0, "aaa", i, i, "set");
} 这个是for循环的标准写法; 先定义一个临时的int形式的变量,名字随便起,在这里起名为 i ; 数值是0,然后给一个条件,这个条件就是 i < npoints(0),当这个条件满足,即代表是真,那么就执行下边大括号里面的操作。
setpointattrib函数是给点设置一个属性,因为这是在Detail层级下运行,如果直接创建属性,这个属性会写入Detail层级下,所以需要用到这个函数,才能把属性写入point层级。 第一空填要把属性设置到哪一个对象,0即是代表自身;第二空是要设置的属性的名称;第三空是要设置属性的点的序号;第四空是要将属性设置为多少的值;第五空是用哪一种方式来设置属性。在这里,因为这是第一次循环,i 已经在上边设置为0,那么要设置属性的点的序号是0号,设置的属性的值是0。
完成第一次循环,进入第二次循环 i 的值会加1,此时 i 的值是0+1,等于1,进行条件判断,条件依然满足,输出依然为真,再执行一遍大括号里的操作,此时要设置属性的点的序号是1号,设置的属性的值是1。完成第二次循环,剩下的循环都是以此类推,当条件不再满足,那么便会退出循环
int temp_array[] = point(0, "taken_already", 0); 这句话是创建一个临时的整数型变量数组,读取的是0号点的i@already_taken[]属性的数值