LectureKFP3文档格式.docx
《LectureKFP3文档格式.docx》由会员分享,可在线阅读,更多相关《LectureKFP3文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
局部变量1<
<
表达式1;
...
表达式n;
};
表达式块定义的说明:
1.表达式块要求以“@{”开头,以“};
”结尾。
表达式块作为一种顺序执行的组合规则,必须赋给一个属性。
2.一个表达式块包含有许多语句。
这些语句在表达式块中顺序执行。
3.表达式块中的变量是局部变量。
与标准的知识熔接语句不同,局部变量要使用<
符号赋值。
局部变量必须以$为头部标识。
如:
$local_ver。
4.最后一个表达式的值为整个表达式块的返回值。
返回值的类型必须与属性指定的数据类型一致。
例如:
(number)returned_number:
@{
$a<
2;
$b<
3;
$a+$b;
};
在上例中,属性returned_number:
的值为5。
2.2关于表达式块的说明
1.KF语言是非过程性语言。
然而,一些任务需要遵循一定的过程。
也就是说:
语句需要按某顺序执行。
表达式块可满足本要求。
2.在我们前边几章中,虽然没有系统的提及表达式块,但在某些定义和举例中,还是使用了表达式块。
比如:
方法、函数及规则群的定义。
3.表达式块中的局部变量在表达式块以外不可被引用和改值。
4.表达式块可以嵌套。
但内部表达式块只可引用外部表达式块中定义的局部变量,不可改变其值。
内部表达式块可以再次定义与外部同名的局部变量,则在内部和外部表达式块中该变量会有不同的值。
如同下例。
为使程序清晰起见,应避免这种用法,防止程序失控。
$block_ver<
1;
@{
2;
ug_printvalue($block_ver);
};
程序运行的结果为先打印出在第二个表达式块中的变量$block_ver的值
(2),再打印出第一个表达式块中的同名变量$block_ver的值
(1)。
5.表达式可以引用在同一个类文件中的属性。
可以将表达式块的值赋给其他的属性。
6.注意:
在同一个类文件中,属性first_point:
与表达式块中的局部变量$first_point没有必然联系。
2.3表达式块的应用举例
[例1]建立一个属性,以只读方式打开文件“c:
\work\input.txt”,读取其中的数据。
并记录这些数据。
第1步:
打开NX,进入到KF可视化编程环境下。
第2步:
点击鼠标右键,添加名为data_in_file的属性。
第3步:
定义属性的返回值类性为List。
第4步:
定义属性的规则公式为:
$a<
openFile("
e:
\kbe\input.txt"
;
read);
$b<
readSimpleDataFile($a);
closeFile($a);
$b;
第5步:
点击OK,查看read_in_file的值。
参考答案如图4-1:
图4-1:
读取文件数据
说明:
在本例中,一个文本文件被打开,使用KF读取数据并关闭。
ReadSimpleDataFile返回一个复合链,这里的每一个子链都是文件中的一行。
读取的结果是链中链。
这是一个典型的需要顺序执行的程序。
[例2]编辑第三章例题中创建的support类,使其从一个ASCII文件中读取原料的数据。
创建一个stock.dat文件,包含有下列在loop循环中使用的直径信息。
0.25,0.375,0.5,0.75,1.0,1.5,2.0,3.0
打开***_support.dfa文件,创建一个输入参数,记录用户指定的外部数据文件。
(StringParameter)data_file:
"
编辑standard_steel属性,改变钢材选择规则。
使用表达式块来读取stock.dat文件中的直径,不再使用固化的代码。
(list)standard_steel:
openFile(data_file:
};
保存文件。
并在NX中验证本例。
自由修改stock.dfa文件中的数据,在NX中更新数模。
参考答案如图4-2。
图4-2:
更新后的数模
以上两例分析了如何从一个存在的文件中读取数据,并利用这些数据建造数模。
本节稍后将更详细的讨论文件的输入输出操作。
[例3]通过给定的三个点p1,p2,p3和半径,计算倒角的相切点和中心点。
使用文本编辑器创建***_fillet类,生成的新文件名为***_fillet.dfa。
定义***_fillet类名和用到的输入参数。
#!
UGNX/KF2.0
DefClass:
***_fillet(ug_base_part);
(PointCanonicalParameter)p1:
(PointCanonicalParameter)p2:
(PointCanonicalParameter)p3:
(NumberCanonicalParameter)rad:
定义support类中的其他属性。
(Vector)vec1:
unitize(Vector2Points(p1:
p2:
));
(Vector)vec2:
unitize(Vector2Points(p3:
(Number)dot:
vec1:
.vec2:
注意,
1.unitize是向量标准化函数。
能够使输入的向量的模为1。
2.这里,dot属性规则的“.”是数学运算中的内积运算符号。
表示两个向量点乘,得到一个浮点数。
利用表达式块计算倒角数据。
(List)fillet_data:
Ifabs(dot:
)<
0.99999
Then
$vec3<
unitize(vec1:
+vec2:
);
$a<
rad:
*sqrt((1+dot:
)/(1-dot:
$b<
*sqrt(2/(1-dot:
$ctr_pt<
p2:
-$b*$vec3;
$tan_p1<
-$a*vec1:
$tan_p2<
-$a*vec2:
{$tan_p1,$tan_p2,$ctr_pt};
}
Else{};
#空链,三点共线。
因为系统未提供Vector2Points函数,需用户自定义。
该函数的功能是:
通过输入的两点得到向量。
Defun:
Vector2Points(Any$p1,Any$p2)
Vector(LocalX($p2)-LocalX($p1),
LocalY($p2)-LocalY($p1),
LocalZ($p2)-LocalZ($p1));
}Vector;
第6步:
启动NX,创建该类的实例。
注意输入以下参数:
p1:
point(0,0,0)
point(1,0,0)
p3:
point(1,1,0)
0.2
答案:
fillet_data链中的数据为。
第一条线上的相切点:
(Point)p(0.8,0,0)
第二条线上的相切点:
(Point)p(1,0.2,0)
倒角的中心点:
(Point)p(0.8,0.2,0)
3.实例循环
3.1实例循环的语法要求
(ChildList)实例链名:
{
Class;
用于实例化的类;
Quantity;
生成实例的个数;
…
};
实例循环定义的说明:
1.因为实例循环后,返回一组实例,故其返回参数类型是固定的-ChildList。
2.实例循环的定义类似于子规则的定义。
但是,不同于子规则定义,它需要在定义中指明生成实例的个数。
形参quantity指定了要生成多少个子实例对象,其值必须是整数而非浮点数。
3.2关于实例循环的说明
1.实例循环可以一次生成一系列的近似且相关的实例。
2.实例循环创建的所有实例都记录在“实例链名”这个属性节点中。
3.对实例链中各个实例的控制,要通过属性child:
index:
来进行。
该属性记录了各个实例的创建顺序。
“Child:
”指链中的“当前的”子实例。
系统给每一个子实例一个名为“Index:
”的属性,该属性值做自然数排列。
的值在每一个子规则创建后,会自动加1。
4.如有必要,可在实例链中引用其他成员的属性。
5.创建与编辑实例循环只能在DFA类中完成。
无法在VDE中交互的进行。
3.3实例循环的应用举例
[例4]在原点处创建5个圆柱,圆柱的直径以步长为1来逐渐加大。
使用文本编辑器创建***_cylinderfamily类,
生成的新文件名为***_cylinderfamily.dfa。
定义***_cylinderfamily类。
***_cylinderfamily(ug_base_part);
定义属性cylinderfamily,进行实例循环。
(Childlist)cylinderFamily:
Class,ug_cylinder;
quantity,5;
diameter,child:
+1;
height,6-child:
保存文件并到NX中测试。
答案如图4-3。
图4-3:
创建cylinderfamily的实例循环
1.本例生成一个名为cylinderFamily的属性,它是一个含有五个由ug_cylinder类生成的实例的链。
2.注意:
这里用到了“child:
”。
每一个子规则的参数可以由child:
来唯一指定。
在“cylinderFamily”实例中五个成员的直径依次为2,3,4,5,6。
[例5]创建6个齿轮的传动链,使它们沿着X轴正向排列,并相互啮合。
使用文本编辑器创建***_geartrain类,
生成的新文件名为***_geartrain.dfa。
定义***_geartrain类。
***_geartrain(ug_base_part);
定义属性diameters,记录齿轮实例的直径信息。
(List)diameters:
{5,4,5,6,3,5};
定义属性engagement,记录齿轮齿啮合值。
(Number)engagement:
0.25;
创建齿轮实例循环。
(ChildList)gears:
Class,ug_cylinder,
Origin;
If(child:
=1)
ThenPoint(0,0,0)
Elseref(nth(child:
-1,gears:
),"
origin:
"
)+
vector(child:
diameter:
/2+
ref(nth(child:
),
)/2,0,0)-
vector(engagement:
0,0);
Diameter,Nth(child:
diameters:
),
Quantity,length(diameters:
)
1.第一个齿轮的中心在(0,0,0)点。
以下的每一个齿轮的中心点将在前一个中心点的基础上加一个向量。
该向量的横坐标是前一个直径的一半加当前齿轮直径的一半减去啮合部分的长度。
2.Nth(n,list)函数用以得到第n个实例链中的成员
3.length(list)函数用以得到实例链中成员的个数
4.ref(instance,string)函数用以得到实例中的属性值。
并到NX中实例化本类。
答案如图4-4。
图4-4:
利用实例循环创建齿轮传动链
[例6]利用ug_circle类创建实例循环。
并输出每个圆环的半径。
使用文本编辑器创建***_circle_childlist类,
生成的新文件名为***_circle_childlist.dfa。
定义***_circle_childlist类。
***_circle_childlist(ug_base_part);
定义输入参数。
(canonicalintegerparameter)Number_of_Circles:
5;
(numberparameter)Starting_Radius:
(numberparameter)Radius_Increment:
.5;
创建实例循环。
(childlist)Concentric_Circles:
Class,ug_arc;
Quantity,Number_of_Circles:
Radius,if(child:
=1)
thenStarting_Radius:
elseref(nth(child:
-1,Concentric_Circles:
radius:
)+
dius_Increment:
Start_Angle,0;
End_Angle,360;
Center,Point(0,0,0);
X_Axis,Vector(1,0,0);
Y_Axis,Vector(0,1,0);
创建属性。
从实例链中找到并输出圆环的半径。
(list)Radiuses:
loop
for$ifrom1toNumber_of_Circles:
for$radisref(nth($i,Concentric_Circles:
doif(Number_of_Circles:
>
0)
thenug_printvalues({"
Circle"
+format("
%d"
$i)}+
{"
radius="
%f"
$rad)})
else{};
returnis{};
(list)demandvalue:
{Radiuses:
保存文件并在NX中创建本类的实例。
答案如图4-5。
图4-5:
从实例循环中找到并输出信息
[例7]创建孔的实例链。
孔的位置信息从外部文件中读取。
使用文本编辑器创建***_hole_childlist类,
生成的新文件名为***_hole_childlist.dfa。
定义***_hole_childlist类。
***_hole_childlist(ug_base_part);
(stringparameter)Point_File:
\kbe\hole_data.txt"
(numberparameter)Hole_Diameter:
(numberparameter)Hole_Tip_Angle:
60;
(numberparameter)Hole_Depth:
0.5;
(listparameter)Placement_Face:
{};
从文件中读取孔的位置信息。
(list)read_in_points:
openFile(Point_File:
利用ug_cylinder来创建孔的实例循环。
(childlist)Holes:
Class,If(length(read_in_points:
)>
Thenug_simple_hole
Elsenulldesign;
Quantity,length(read_in_points:
Hole_Diameter,Hole_Diameter:
Hole_Depth,Hole_Depth:
Hole_Tip_Angle,Hole_Tip_Angle:
Location,Point(
First(nth(child:
read_in_points:
)),
Second(nth(child:
Third(nth(child:
)));
Placement_Face,Placement_Face:
lockrule?
true;
交互输出信息
(integer)report:
ug_printmessage({format("
length(read_in_points:
))+
"
holeswillbecreated"
});
{report:
第7步:
保存文件并在NX中实例化本类。
答案如图4-6。
图4-6:
从文件中读取孔的信息并作实例循环创建孔系
4.部件类
4.1继承部件类的语法格式
Defclass:
主类(部件类1部件类2…部件类n);
部件类继承格式的说明:
1.一个类可以继承多个部件类。
多类的继承要通过空格来划分。
2.如果多个继承类含有同样的属性名,那么,靠近左括号的类优先。
4.2部件类的说明
1.本论题涉及到类的继承。
我们可以将一些通用的规则属性或方法封装到一个类中。
这就是类的继承概念。
如同C++,JAVA等面向对象的语言一样,继承概念有着显而易见的优点。
2.如同属性之间不可循环引用一样,类之间的继承也不可循环。
3.原则上讲,所有的类都可被其他类所继承,从而成为部件类。
4.我们这里建议只把那些与几何创建无关的,一般不用于实例化的,仅记录很全局的属性规则及很通用的方法的类称为基本部件类。
5.当然也有一种情形,即现有的某个类大体上满足需要,但有小的不同。
我们可以创建一个新类,继承旧类,并重载或新增一些规则属性和方法。
这时,我们也可把被继承的旧类称为部件类。
6.系统提供的最常用的用于继承的部件类有ug_base_part,nulldesig,ug_displayable_entity等。
7.当我们定义一个类时,我们可以继承多个部件类来获取这些类中的所有属性和方法。
例如:
ug_line继承了ug_displayable_entity类的层和颜色属性。
8.部件类中的属性和方法可以被重新定义,这时,该类的实例将使用本类中重载的属性和方法。
如果某属性没有被重载而在实例化时用到了,则自动获取继承进来的部件类中的属性值。
如同下例:
类AAA定义如下:
DefClass:
AAA();
(Numberparameter)Dia:
12;
(Number)Rad:
Dia:
/2;
类BBB定义如下:
BBB(AAA);
(Numberparameter)Height:
1.0;
(NumberCanonicalparameter)Rad:
(Number)Volume:
m_pi:
*Rad:
^2*Height:
那么,BBB类在KF中的理解为:
(NumberParameter)Dia:
(NumberParameter)Height:
1.0;
m_pi:
4.3部件类的应用举例
[例8]我们知道,KF系统提供的基类ug_cylinder可接收直径,高度,位置等信息,
创建圆柱实体。
我们现在需要通过接收拉伸荷载和最大压力等工程信息,
来创建几何数模。
使用继承的方法来实现这个熔入工程规则的设计。
使用文本编辑器创建***_support_cylinder类,
生成的新文件名为***_support_cylinder.dfa。
定义***_support_cylinder类。
***_support_cylinder(ug_cylinder);
(NumberParameter)Load:
5600;
(NumberParameter)Max_Stress:
40000;
重载直径属性,通过利用在方法练习中使用的公式
带入拉伸荷载和最大压力进行计算。
(Number)Pi:
3.1415926;
(Number)Diameter:
Sqrt(4*Load:
/(pi:
*Max_Stress:
并在NX中测试本设计。
生成圆柱的直径为:
0.422。
5.文件的输入输出操作
5.1常用的文件操作函数
同其它的