访问动态对象属性的Javascript
我是一个新手程序员,使用Javascript编写的OpenJScad构建3D模型 我试图找出如何构造代码,以便能够访问使用用户输入参数动态创建的对象实例属性。我有一个带有以下变量的父齿轮类访问动态对象属性的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 *
// 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的值。