Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问动态对象属性的Javascript_Javascript_Variables_Prototype_Openjscad - Fatal编程技术网

访问动态对象属性的Javascript

访问动态对象属性的Javascript,javascript,variables,prototype,openjscad,Javascript,Variables,Prototype,Openjscad,我是一个新手程序员,使用Javascript编写的OpenJScad构建3D模型 我试图找出如何构造代码,以便能够访问使用用户输入参数动态创建的对象实例属性。我有一个带有以下变量的父齿轮类 // Gear parent class Gear = function(numTeeth, circularPitch, pressureAngle, clearance, thickness) { var pitchRadius = numTeeth * circularPitch / (2 *

我是一个新手程序员,使用Javascript编写的OpenJScad构建3D模型

我试图找出如何构造代码,以便能够访问使用用户输入参数动态创建的对象实例属性。我有一个带有以下变量的父齿轮类

// Gear parent class
Gear = function(numTeeth, circularPitch, pressureAngle, clearance, thickness)
{    
var pitchRadius = numTeeth * circularPitch / (2 * Math.PI);
我做了几个齿轮子类,接受用户参数,即

// Spur Gear
function makeSpur(params)
{
    var gear = new Gear(
    params.spurTeeth,
    params.circularPitch,
    params.pressureAngle,
    params.clearance,
    params.inputBore
);

if(params.inputBore > 0)
{
    var inputBore = CSG.cylinder({start: [0,0,-params.thickness2], end:
        [0,0,params.thickness2], radius: params.inputBore, resolution: 16});
    gear = gear.subtract(inputBore).rotateX(90);
}
return gear;
…然后根据另一个齿轮对象的pitchRadius属性动态生成位置坐标

// function main
var spurGear = makeSpur(params);
spurGear = spurGear.translate([-pinionGear.pitchRadius,0,0]);

所有内容都会渲染,除非我尝试从另一个Gear实例访问pitchRadius属性。我读过关于原型和访问私有/公共属性的书,但我不知道如何构造代码,以便在function main中访问实例属性。

以下是完整的代码

   include("gears.jscad");

// Here we define the user editable parameters: 
function getParameterDefinitions() {
  return [
    { name: 'circularPitch', caption: 'Circular pitch:', type: 'float', initial: 5 },
    { name: 'pressureAngle', caption: 'Pressure angle:', type: 'float', initial: 20 },
    { name: 'clearance', caption: 'Clearance:', type: 'float', initial: 0 },
    { name: 'thickness', caption: 'Thickness of transmission gears:', type: 'float', initial: 5 },
    { name: 'spurTeeth', caption: 'Number of spur teeth:', type: 'int', initial: 32 },
    { name: 'pinionTeeth', caption: 'Number of pinion teeth:', type: 'int', initial: 14 },
    { name: 'bore', caption: 'Radius of shaft:', type: 'float', initial: 5 }
  ];
}

 // Main function
 function main(params)
{
  // declare parts
  spurGear = new makeSpur(params);
  pinionGear = new makePinion(params);

  // assemble parts
  spurGear = spurGear.translate([-pinionGear.pitchRadius, 0, -20]); // BREAKS CODE
  pinionGear = pinionGear.translate([-spurGear.pitchRadius, 0, 20]); // BREAKS CODE

  return [spurGear,pinionGear];
}

// Spur Gear
function makeSpur(params)
{
  var gear = new involuteGear(
    params.spurTeeth,
    params.circularPitch,
    params.pressureAngle,
    params.clearance,
    params.thickness,
    params.bore
  );
  if(params.bore > 0)
  {
    var bore = CSG.cylinder({start: [0,0,-params.thickness], end: [0,0,params.thickness], radius: params.bore, resolution: 16});
    gear = gear.subtract(bore).rotateX(90);
  }
  return gear;
}

// Pinion Gear
function makePinion(params)
{
  var gear = new involuteGear(
    params.pinionTeeth,
    params.circularPitch,
    params.pressureAngle,
    params.clearance,
    params.thickness,
    params.bore
  );
  if(params.bore > 0)
  {
    var bore = CSG.cylinder({start: [0,0,-params.thickness], end: [0,0,params.thickness], radius: params.bore, resolution: 16});
    gear = gear.subtract(bore).rotateX(90);
  }
  return gear;
}

// title: Gear
// author: Joost Nieuwenhuijse
// license: MIT License

/*
  For gear terminology see: 
    http://www.astronomiainumbria.org/advanced_internet_files/meccanica/easyweb.easynet.co.uk/_chrish/geardata.htm
  Algorithm based on:
    http://www.cartertools.com/involute.html

  circularPitch: The distance between adjacent teeth measured at the pitch circle
*/ 
function involuteGear(numTeeth, circularPitch, pressureAngle, clearance, thickness)
{
  // default values:
  if(arguments.length < 3) pressureAngle = 20;
  if(arguments.length < 4) clearance = 0;
  if(arguments.length < 4) thickness = 1;

  var addendum = circularPitch / Math.PI;
  var dedendum = addendum + clearance;

  // radiuses of the 4 circles:
  this.pitchRadius = numTeeth * circularPitch / (2 * Math.PI);
  // this.getpitchRadius = function() {
    //return pitchRadius;
  //};
  var baseRadius = this.pitchRadius * Math.cos(Math.PI * pressureAngle / 180);
  var outerRadius = this.pitchRadius + addendum;
  var rootRadius = this.pitchRadius - dedendum;

  var maxtanlength = Math.sqrt(outerRadius*outerRadius - baseRadius*baseRadius);
  var maxangle = maxtanlength / baseRadius;

  var tl_at_pitchcircle = Math.sqrt(this.pitchRadius*this.pitchRadius - baseRadius*baseRadius);
  var angle_at_pitchcircle = tl_at_pitchcircle / baseRadius;
  var diffangle = angle_at_pitchcircle - Math.atan(angle_at_pitchcircle);
  var angularToothWidthAtBase = Math.PI / numTeeth + 2*diffangle;

  // build a single 2d tooth in the 'points' array:
  var resolution = 5;
  var points = [new CSG.Vector2D(0,0)];
  for(var i = 0; i <= resolution; i++)
  {
    // first side of the tooth:
    var angle = maxangle * i / resolution;
    var tanlength = angle * baseRadius;
    var radvector = CSG.Vector2D.fromAngle(angle);    
    var tanvector = radvector.normal();
    var p = radvector.times(baseRadius).plus(tanvector.times(tanlength));
    points[i+1] = p;

    // opposite side of the tooth:
    radvector = CSG.Vector2D.fromAngle(angularToothWidthAtBase - angle);    
    tanvector = radvector.normal().negated();
    p = radvector.times(baseRadius).plus(tanvector.times(tanlength));
    points[2 * resolution + 2 - i] = p;
  }

  // create the polygon and extrude into 3D:
  var tooth3d = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});

  var allteeth = new CSG();
  for(var j = 0; j < numTeeth; j++)
  {
    var ang = j*360/numTeeth;
    var rotatedtooth = tooth3d.rotateZ(ang);
    allteeth = allteeth.unionForNonIntersecting(rotatedtooth);
  }

  // build the root circle:  
  points = [];
  var toothAngle = 2 * Math.PI / numTeeth;
  var toothCenterAngle = 0.5 * angularToothWidthAtBase; 
  for(var k = 0; k < numTeeth; k++)
  {
    var angl = toothCenterAngle + k * toothAngle;
    var p1 = CSG.Vector2D.fromAngle(angl).times(rootRadius);
    points.push(p1);
  }

  // create the polygon and extrude into 3D:
  var rootcircle = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});

  var result = rootcircle.union(allteeth);

  // center at origin:
  result = result.translate([0, 0, -thickness/2]);

  return result;
}
包括(“gears.jscad”);
//这里我们定义了用户可编辑的参数:
函数getParameterDefinitions(){
返回[
{名称:'circularPitch',标题:'Circular pitch:',类型:'float',首字母:5},
{名称:'pressureAngle',标题:'pressureAngle:',类型:'float',首字母:20},
{名称:'clearance',标题:'clearance:',类型:'float',首字母:0},
{名称:“厚度”,标题:“变速箱齿轮厚度:”,类型:“浮动”,首字母:5},
{名称:'Spurteaths',说明:'Spurteats:',类型:'int',首字母:32},
{名称:“小齿轮齿”,标题:“小齿轮齿数:”,类型:“int”,首字母:14},
{名称:“钻孔”,标题:“轴半径:”,类型:“浮动”,首字母:5}
];
}
//主要功能
主功能(参数)
{
//申报零件
正齿轮=新的正齿轮(参数);
小齿轮=新的小齿轮(参数);
//组装零件
spurGear=spurGear.translate([-pinionGear.pitchRadius,0,-20]);//中断代码
pinionGear=pinionGear.translate([-spurGear.pitchRadius,0,20]);//中断代码
返回[正齿轮,小齿轮];
}
//正齿轮
函数makeSpur(params)
{
var齿轮=新渐开线齿轮(
马齿苋,
环缝参数,
参数压力角,
帕拉姆斯·清场,
参数厚度,
孔参数
);
如果(参数孔径>0)
{
变量孔=CSG.圆柱({开始:[0,0,-参数厚度],结束:[0,0,参数厚度],半径:参数孔,分辨率:16});
齿轮=齿轮。减去(孔)。旋转(90);
}
返回齿轮;
}
//小齿轮
功能(参数)
{
var齿轮=新渐开线齿轮(
小齿参,
环缝参数,
参数压力角,
帕拉姆斯·清场,
参数厚度,
孔参数
);
如果(参数孔径>0)
{
变量孔=CSG.圆柱({开始:[0,0,-参数厚度],结束:[0,0,参数厚度],半径:参数孔,分辨率:16});
齿轮=齿轮。减去(孔)。旋转(90);
}
返回齿轮;
}
//标题:齿轮
//作者:Joost Nieuwenhuijse
//许可证:麻省理工学院许可证
/*
有关齿轮术语,请参见:
http://www.astronomiainumbria.org/advanced_internet_files/meccanica/easyweb.easynet.co.uk/_chrish/geardata.htm
算法基于:
http://www.cartertools.com/involute.html
圆形齿距:在节圆处测量的相邻齿之间的距离
*/ 
函数渐开线齿轮(数齿、圆齿、压力角、间隙、厚度)
{
//默认值:
如果(参数长度<3)压力角=20;
如果(参数长度<4)间隙=0;
如果(长度<4)厚度=1;
var补遗=circularPitch/Math.PI;
var齿根=齿顶+间隙;
//四个圆的半径:
this.pitchRadius=numTeeth*circularPitch/(2*Math.PI);
//this.getpitchRadius=函数(){
//返回俯仰角半径;
//};
var baseRadius=this.pitchRadius*Math.cos(Math.PI*压力角/180);
var outerRadius=此。俯仰半径+附录;
var rootRadius=此。pitchRadius-齿根;
var maxtanlength=Math.sqrt(outerRadius*outerRadius-baseRadius*baseRadius);
var maxangle=maxtanlength/baseRadius;
var tl_at_pitchcircle=Math.sqrt(this.pitchRadius*this.pitchRadius-baseRadius*baseRadius);
俯仰圆处的var角=俯仰圆处的tl角/基半径;
var diffangle=俯仰圆处的角度-Math.atan(俯仰圆处的角度);
var angularToothWidthAtBase=Math.PI/numTeeth+2*diffangle;
//在“点”阵列中构建单个二维齿:
var分辨率=5;
var points=[新CSG.Vector2D(0,0)];

对于(var i=0;i我注意到您实际上在构造函数中返回CSG对象,因此请尝试使用OpenJSCAD用户指南中描述的属性容器。根据指南,属性变量用于存储对象的元数据

这是指南中的一个示例:

var cube = CSG.cube({radius: 1.0});
cube.properties.aCorner = new CSG.Vector3D([1, 1, 1]);
补充意见:

  • 您返回的对象与构造函数中的不同
  • 如果您要这样做:gear=gear.rotateX(90);那么您就有了新对象
  • 如果要使用属性,则在执行转换时会克隆元数据

  • var
    创建一个局部变量,您是否尝试过
    this.pitchRadius=…
    ?@elclars我尝试过,但它仍然无法访问实例属性。您的代码中一定有其他错误,当您在构造函数函数体中使用
    this.pitchRadius=
    定义属性时,它将作为实例属性。如果您使用
    this.pitchRadius
    @HMR,您发布的代码应该可以工作。这可能是不正确的作用域吗?现在我的构造函数位于main之外。您是否遇到错误?在firefox with firebug中,您可以在出现错误时中断并检查导致错误的行。使用控制台记录spurGear的值。