UG版本通用外挂开发 UG Open/Grip 教程
$ 注释
$ Grip启动和编译:先找到UG的安装路径,如C:\Program Files\EDS\Unigraphics NX。
$ 进入该路径下的UGOPEN目录,找到grade.bat文件,打开它,将环境变量base_dir
$ 设置成set base_dir=C:\Program Files\EDS\Unigraphics NX,保存并运行。
$ Grip程序的编写和编译:在Grip的运行程序中,键入4,将你编写的Grip程序所在的目
$ 录写入并回车。在Grip的运行程序中,键入1,写入新建Grip程序的文件名并回车,此时
$ Grip会打开写字板,你可以在其中写入你的程序。在Grip的运行程序中,键入2,写入
$ 所编译的文件名,编译无错后,键入3,写入所链接的文件名,链接无错后完成。
$ 你所编写的Grip程序保存成*.grs文件,编译后Grip会生成*.gri文件,链接后Grip会
$ 生成*.grx文件,此文件为Grip的运行文件。
$ Grip程序的运行:打开UG,点击File->Execute->Grip,选择*.grx文件,就可运行它。
$ 编译时应先编译子函数文件,生成*.gri,子函数文件不需要链接,此时再编译主函数
$ 文件,生成*.gri,最后链接成*.grx。
$ Grip主函数文件必须以HALT结束,Grip子函数文件必须以RETURN结束。
$ 定义的变量不能超过6个字符,Grip会认为Point_1和Point_2是同一个变量。
$ 一行不能超过80个字符,若超过,可用$符号来换行。
$ Grip不区分大小写,也就是Grip会认为POINT和point都是画点函数,但是我建议Grip
$ 的函数名和关键字用大写,用户定义的变量用小写。但是用户定义的变量不能和Grip的
$ 函数名和关键字重名。
$ Grip的帮助文件在C:\EDS\Unigraphics NX\UGDOC\html_files\mainlibrary.chm\
$ Open\GRIP Reference Guide下。一个简便的Grip函数查找方法:打开...\Word &
$ Symbol Lists\Major Word List,根据首字母来查函数。
HALT $ 结束语
$ 注释
ENTITY/p,l,c $ 实体变量定义
NUMBER/i,f(5) $ 数值变量定义
STRING/str(10) $ 字符串变量定义
p=POINT/0,0,0 $ 画点
l=LINE/0,0,0,1,1,1 $ 画线
c=CIRCLE/CENTER,p,RADIUS,1 $ 画圆
HALT $ 结束语
注释
ENTITY/p(3)
NUMBER/a(3),b(3,3)
DATA/b,1,2,3,4,5,6,7,8,9 $ 给b向量赋值
a(1..3)=b(1,1..3) $ 让a向量等于b向量中的第一个值
p(1)=POINT/a(1..3)
p(2)=POINT/b(2,1..3)
p(3)=POINT/b(3,1..3)
HALT $ 结束语
$ 注释
STRING/str1(100) $ 定义字符串
str1='Hello World' $ 为字符串赋值
MESSG/str1 $ 显示字符串
HALT $ 结束语
$ 注释
$ +, -, *, /, **, = $ 运算函数
$ SQRTF,LOGF,ABSF,INTF,MODF,MINF,MAXF,SINF,COSF,ASINF,ACOSF,ATANF $ 数学函数
$ '$' 换行符
NUMBER/a
a=SINF(30)
MESSG/FSTR(a)
HALT $ 结束语
$ 注释
NOTE/0,0,'LABEL1' $ 往UG显示区打印文字
PRINT/'LABEL2' $ 往INFOMATION打印文字
MESSG/'LABEL3' $ 往信息框打印文字
HALT $ 结束语
$ 注释
STRING/str1(100),str2(100)
NUMBER/strlen
str1='abcdefghijklmn'
str2=SUBSTR(str1,2,5) $ 取字符
strlen=LENF(str1) $ 取字符串长度
PRINT/FSTR(3.14) $ 浮点型转换为字符串
PRINT/ISTR(strlen) $ 整型转换为字符串
PRINT/str2
HALT $ 结束语
$ 注释
NUMBER/a(3),b(3),c,d(3),e,f(3),g(3)
DATA/a,1,2,3
DATA/b,4,5,6
c=DOTF(a,b) $ 向量点乘
d=CROSSF(a,b) $ 向量叉乘
e=VLENF(a) $ 取向量模
f=SCALVF(10,a) $ 向量数乘
g=UNITF(a) $ 向量归一化
PRINT/FSTR(c)
PRINT/FSTR(d(1))+','+FSTR(d(2))+','+FSTR(d(3))
PRINT/FSTR(e)
PRINT/FSTR(f(1))+','+FSTR(f(2))+','+FSTR(f(3))
PRINT/FSTR(g(1))+','+FSTR(g(2))+','+FSTR(g(3))
HALT $ 结束语
$ 注释
ENTITY/c1,c2,l1
ENTITY/p1,p2,p3,p4,p5,p6,p7,p8
c1=CIRCLE/CENTER,(POINT/1,0,0),RADIUS,1
c2=CIRCLE/CENTER,(POINT/2,0,0),RADIUS,1
l1=LINE/0,0,0,-1,0,0
p1=POINT/CENTER,c1 $ 取圆心
p2=POINT/YLARGE,INTOF,c1,c2 $ 取沿y方向最大的交点
p3=POINT/YSMALL,INTOF,c1,c2 $ 取沿y方向最小的交点
p4=POINT/(POINT/0,-1,0),INTOF,c1,c2 $ 取离(POINT/0,-1,0)点最近的点
p5=POINT/p1,VECT,(LINE/p2,p3),YLARGE,2 $ 使p1点沿着p2p3向量往y最大方向偏移2
p6=POINT/c1,ATANGL,45 $ 取圆45度角点
p7=POINT/p1,DELTA,-2,-2,0 $ 使p1点偏置(-2,-2,0)
p8=POINT/ENDOF,XSMALL,l1 $ 取l1线的端点
HALT $ 结束语
$ 注释
ENTITY/c
ENTITY/ln1,ln2,ln3,ln4,ln5,ln6,ln7
c=CIRCLE/CENTER,(POINT/0,0,0),RADIUS,1
ln1=LINE/0,0,0,1,0,0
ln2=LINE/PARLEL,ln1,YLARGE,1 $ 沿y最大方向平行于ln1线偏置1
ln3=LINE/PARLEL,ln1,YSMALL,TANTO,c $ 沿y最小方向平行于ln1和c圆相切
ln4=LINE/(POINT/0,0,0),ATANGL,45 $ 过(0,0,0)画45度线
ln5=LINE/(POINT/2,0,0),RIGHT,TANTO,c $ 过(2,0,0)切c圆(右手边)
ln6=LINE/(POINT/0,0,0),PARLEL,ln5 $ 过(0,0,0)平行ln5线
ln7=LINE/(POINT/0,0,0),PERPTO,ln5 $ 过(0,0,0)垂直ln5线
HALT $ 结束语
$ 注释
ENTITY/c1,c2,c3,c4,c5,c6
c1=CIRCLE/CENTER,(POINT/0,0,0),RADIUS,1 $ 过圆心和半径画圆
c2=CIRCLE/CENTER,(POINT/0,0,0),TANTO,(LINE/2,0,0,2,2,0),START,0,END,90 $ 过圆心与线相切起始角终止角
c3=CIRCLE/CENTER,(POINT/0,0,0),(POINT/3,0,0) $ 过圆心和点
c4=CIRCLE/(POINT/4,0,0),(POINT/0,4,0),(POINT/-4,0,0) $ 过三点画圆
HALT $ 结束语
$ 注释
NUMBER/p(5,3)
ENTITY/sp
DATA/p,0,0,0,1,1,0,2,4,0,3,9,0,4,16,0
sp=SPLINE/(POINT/p(1,1..3)),(POINT/p(2,1..3)),(POINT/p(3,1..3)),$
(POINT/p(4,1..3)),(POINT/p(5,1..3)) $ 过点画多样条曲线(不封闭)
sp=SPLINE/CLOSED,(POINT/p(1,1..3)),(POINT/p(2,1..3)),$
(POINT/p(3,1..3)),(POINT/p(4,1..3)),(POINT/p(5,1..3))
$ 过点画多样条曲线(封闭)
HALT $ 结束语
$ 注释
ENTITY/ln(4)
ENTITY/sph1,sph2,block1,cone1,cone2,cyl1,solid1,solid2
sph1=SPHERE/CENTER,(POINT/0,0,0),RADIUS,1 $ 画球
sph2=SPHERE/(CIRCLE/CENTER,(POINT/0,0,0),RADIUS,2) $ 画球
block1=SOLBLK/ORIGIN,2,2,2,SIZE,1,1,1 $ 画方块
cone1=SOLCON/ORIGIN,3,3,3,HEIGHT,1,DIAMTR,1,0 $ 画圆锥
cone2=SOLCON/ORIGIN,4,4,4,HEIGHT,1,DIAMTR,1,0.5,AXIS,1,0,0 $ 画圆台
cyl1=SOLCYL/ORIGIN,5,5,5,HEIGHT,1,DIAMTR,1 $ 画圆柱
ln(1)=LINE/0,0,0,1,0,0
ln(2)=LINE/1,0,0,1,1,0
ln(3)=LINE/1,1,0,0,1,0
ln(4)=LINE/0,1,0,0,0,0
solid1=SOLEXT/ln(1..4),HEIGHT,10,AXIS,0,0,1 $ 拉伸实体
solid2=SOLREV/ln(1..4),ORIGIN,0,0,0,ATANGL,360,AXIS,1,0,0 $ 旋转实体
HALT $ 结束语
$ 注释
ENTITY/ln1,ln2
ENTITY/flt1,pl1,torus1
NUMBER/p_coords(3)
&FONT=&DASHED $ 使线型变成虚线
ln1=LINE/0,0,0,1,0,0
&FONT=&SOLID $ 使线型变成实线
ln2=LINE/0,0,0,0,1,0
flt1=FILLET/ln2,ln1,CENTER,(POINT/1,1,0),RADIUS,0.2,NOTRIM $ 画倒圆
pl1=PLANE/(POINT/0,0,0),(POINT/1,0,0),(POINT/0,1,0) $ 画平面
torus1=SOLTOR/ORIGIN,0,0,0,RADIUS,1,0.5
p_coords=CPOSF(ln1,0.25) $ 取线的中间点
HALT $ 结束语
$ 注释
ENTITY/b1,b2,b3,b4,b5,b6,b7,b8,b9
b1=SOLBLK/ORIGIN,0,0,0,SIZE,2,2,2
b2=SOLBLK/ORIGIN,1,1,1,SIZE,2,2,2
b3=SOLBLK/ORIGIN,2,2,2,SIZE,2,2,2
b4=SOLBLK/ORIGIN,3,3,3,SIZE,2,2,2
b5=SOLBLK/ORIGIN,4,4,4,SIZE,2,2,2
b6=SOLBLK/ORIGIN,5,5,5,SIZE,2,2,2
b7=UNITE/b1,WITH,b2 $ 实体相加
b8=INTERS/b3,WITH,b4 $ 实体相交
b9=SUBTRA/b5,WITH,b6 $ 实体相减
HALT $ 结束语
$ 注释
NUMBER/mat1(12),mat2(12),mat3(12),mat4(12)
NUMBER/gmat1(12),gmat2(12),mat(12)
ENTITY/ln1,b1,b2
ln1=LINE/0,0,0,0,1,0
b1=SOLBLK/ORIGIN,0,0,0,SIZE,1,1,1
mat1=MATRIX/TRANSL,1,2,3 $ 生成平移矩阵
mat2=MATRIX/XYROT,45 $ 生成旋转矩阵
mat3=MATRIX/MIRROR,ln1 $ 生成镜像矩阵
mat4=MATRIX/SCALE,2 $ 生成缩放矩阵
gmat1=MATRIX/mat1,mat2 $ 矩阵相乘
gmat2=MATRIX/mat3,mat4 $ 矩阵相乘
mat=MATRIX/gmat1,gmat2 $ 矩阵相乘
b2=TRANSF/mat,b1 $ 将变换物体的矩阵加到物体上
HALT $ 结束语
$ 注释
ENTITY/csys1,csys2,csys3
csys1=CSYS/(POINT/1,1,0),(POINT/1,2,0),(POINT/0,1,0) $ 输入原点,x轴上点,y轴上点建立坐标系
&WCS=csys1 $ 取当前坐标系为上面所建的坐标系
csys2=CSYS/(LINE/0,0,0,1,1,0),(LINE/0,0,0,-1,1,0) $ 输入x轴和y轴建立坐标系
&WCS=csys2
csys3=CSYS/csys2,ORIGIN,(POINT/1,1,1) $ 将坐标系csys2移到其他点上
&WCS=csys3
&WCS=&ABS $ 将当前坐标系移到绝对坐标系上
HALT $ 结束语
$ 注释
ENTITY/p(3),grp1,grp2
p(1)=POINT/0,0,0
p(2)=POINT/1,1,1
p(3)=POINT/2,2,2
grp1=GROUP/p(1..2) $ 组合实体
grp2=GROUP/grp1,p(3)
UNGRP/grp2 $ 取消组合
HALT $ 结束语
$ 注释
NUMBER/index
index=4
IF/index==1,JUMP/A1: $ 条件语句
IF/index==2,JUMP/A2:
IF/index==3,JUMP/A3:
JUMP/END: $ 跳转语句
A1:
MESSG/'index=1'
JUMP/END:
A2:
MESSG/'index=2'
JUMP/END:
A3:
MESSG/'index=3'
JUMP/END:
END:
MESSG/'END'
HALT $ 结束语
$ 注释
DO/LOOP1:,i,1,10,1 $ 循环语句
PRINT/ISTR(i)
LOOP1:
PRINT/'END'
HALT $ 结束语
$ 注释
NUMBER/p(5,3)
DATA/p,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4
DO/LOOP1:,i,1,5,1 $ 双重循环
DO/LOOP2:,j,1,3,1
PRINT/ISTR(p(i,j))
LOOP2:
LOOP1:
PRINT/'END'
HALT $ 结束语
$ 注释
$ ==等于,<>不等于,<小于,>大于,<=小于等于,>=大于等于,NOT非,AND与,OR或
NUMBER/index,order
index=1
order=1
IF/index==1,MESSG/'index=1' $ 单条件语句
IF/index==2,MESSG/'index=2'
IF/index==3 AND order==1,MESSG/'index=3'
HALT $ 结束语
$ 注释
NUMBER/a,b
a=2
b=1
IFTHEN/a>b $ 多条件语句
MESSG/'a>b'
ELSEIF/a<b
MESSG/'a<b'
ELSE
MESSG/'a=b'
ENDIF
HALT $ 结束语
$ 注释
NUMBER/A,B
A=2
B=2
IFTHEN/A<0 $ 嵌套循环
MESSG/'A<0'
ELSEIF/A>0
IFTHEN/B>0
MESSG/'A>0,B>0'
ELSE
MESSG/'A>0,B<0'
ENDIF
ELSE
MESSG/'A=0'
ENDIF
HALT $ 结束语
$ 注释
ENTITY/ln(4)
ln(1)=LINE/0,0,0,1,0,0
ln(2)=LINE/1,0,0,1,1,0
ln(3)=LINE/1,1,0,0,1,0
ln(4)=LINE/0,1,0,0,0,0
CALL/'test24sub',ln $ 调用子函数,第一个为函数名,后面的为传入的形参
HALT $ 结束语
$ 注释
PROC/ln $ 子函数头,包含传入的形参
ENTITY/ln(4) $ 定义形参变量
ENTITY/body1 $ 子函数体
body1=SOLEXT/ln,HEIGHT,1,AXIS,0,0,1
RETURN $ 结束语
$ 注释 -1
NUMBER/RESP,NRESP,IRESP,GRESP,PRESP,ORESP
STRING/your_name(100),your_gender(100)
NUMBER/your_id,your_mathmatic,your_english,your_chinese
NUMBER/p_x,p_y,p_z,obj_num
ENTITY/your_object(100)
BACK:
$ 选择菜单:函数名/提示,菜单1,菜单2......(最多有14个菜单),用户响应值
CHOOSE/'Choose operation type','Input Name','Input Info',$
'Input Gender','Input Point','Select Object','Finish',RESP
$ 用户响应值RESP:1-当用户点击Back按钮时-程序跳到BACK:处
$ 2-当用户点击Cancel按钮时-程序跳到END:处
$ 3-此响应值无用-无跳转
$ 4-当用户需要嵌套下一个对话框时-无跳转
$ 5-当用户点击Input Name按钮时-程序跳到MENU1:处
$ 6-当用户点击Input Info按钮时-程序跳到MENU2:处
$ ......
$ 10-当用户点击Finish按钮时-程序跳到MENU6:处
$ 用户响应值
JUMP/BACK:,END:,,,MENU1:,MENU2:,MENU3:,MENU4:,MENU5:,MENU6:,RESP
MENU1:
$ 当用户点击Input Name按钮时,跳出字符串输入框
$ 函数名/提示,返回变量,用户响应值
TEXT/'Input your name',your_name,NRESP
$ 用户响应值NRESP:1-当用户点击Back按钮时-程序跳到BACK:处
$ 2-当用户点击Cancel按钮时-程序跳到END:处
$ 3-当用户没有输入字符串而点击OK按钮时-无跳转
$ 4-当用户需要嵌套下一个对话框时-无跳转
$ 5-当用户输入字符串而点击OK按钮时-程序跳到BACK:处
$ 用户响应值
JUMP/BACK:,END:,,,BACK:,NRESP
MENU2:
$ 当用户点击Input Info按钮时,跳出参数输入框
$ 函数名/提示,参数1名称,关键字表示此参数为整型,返回变量1,
$ 参数2名称,无关键词表示此参数为浮点型,返回变量2,
$ 参数3名称,返回变量3,参数4名称,返回变量4,用户响应值
PARAM/'Input your information','ID',INT,your_id,$
'Mathmatic',your_mathmatic,'English',$
your_english,'Chinese',your_chinese,IRESP
$ 用户响应值IRESP:1-当用户点击Back按钮时-程序跳到BACK:处
$ 2-当用户点击Cancel按钮时-程序跳到END:处
$ 3-当用户点击OK按钮时-程序跳到BACK:处
$ 4-当用户需要嵌套下一个对话框时-无跳转
$ 用户响应值
JUMP/BACK:,END:,BACK:,,IRESP
MENU3:
$ 当用户点击Input Gender按钮时,跳出选择对话框
$ 注释 -2
CHOOSE/'Input your gender','Male','Female',GRESP
JUMP/BACK:,END:,,,GMENU1:,GMENU2:,GRESP
GMENU1:
your_gender='Male'
JUMP/BACK:
GMENU2:
your_gender='Female'
JUMP/BACK:
MENU4:
$ 当用户点击Input Point按钮时,跳出选取点对话框
$ 函数名/提示,返回点x坐标,返回点y坐标,返回点z坐标,用户响应值
GPOS/'Input your point',p_x,p_y,p_z,PRESP
$ 用户响应值PRESP:1-当用户点击Back按钮时-程序跳到BACK:处
$ 2-当用户点击Cancel按钮时-程序跳到END:处
$ 3-当用户点击OK按钮时-程序跳到BACK:处
$ 4-此响应值无用-无跳转
$ 5-当用户选择点后-程序跳到BACK:处
$ 用户响应值
JUMP/BACK:,END:,BACK:,,BACK:,PRESP
MENU5:
$ 当用户点击Input Object按钮时,跳出选择物体对话框
$ 函数名/提示,返回实体变量,关键字表示允许多选物体,
$ 返回选择物体数量,用户响应值
IDENT/'Input your object',your_object,CNT,obj_num,ORESP
$ 用户响应值ORESP:1-当用户点击Back按钮时-程序跳到BACK:处
$ 2-当用户点击Cancel按钮时-程序跳到END:处
$ 3-当用户点击OK按钮时-程序跳到BACK:处
JUMP/BACK:,END:,BACK:,ORESP
MENU6:
PRINT/'Your Name: '+your_name
PRINT/'Your ID: '+ISTR(your_id)
PRINT/'Your Mathmatic: '+FSTR(your_mathmatic)
PRINT/'Your English: '+FSTR(your_english)
PRINT/'Your Chinese: '+FSTR(your_chinese)
PRINT/'Your Gender: '+your_gender
PRINT/'Your Point: '+FSTR(p_x)+' '+FSTR(p_y)+' '+FSTR(p_z)
END:
HALT $ 结束语
$ 注释
ENTITY/p(2)
p(1)=POINT/0,0,0
p(2)=POINT/1,1,1
DELETE/p(1) $ 删除物体
BLANK/p(2) $ 隐藏物体
UNBLNK/p(2) $ 恢复隐藏物体
EXPCRE/'a=1' $ 建立表达式
EXPCRE/'b=1'
EXPDEL/'b' $ 删除表达式
HALT $ 结束语
$ 注释
STRING/str1(100),str2(100)
NUMBER/num1,num2
$CREATE/PART,'c:\test_metric.prt',MMETER $ 新建一个公制part文件
$CREATE/PART,'c:\test_english.prt',INCHES $ 新建一个英制part文件
$FILE/PART,'c:\test_english.prt' $ 保存文件
$ -------------------------------------------------------------
$ 新建一个文本文件,1表示文件指针,如果新建第二个文件,文件指针为2
CREATE/TXT,1,'c:\test.txt'
WRITE/1,'PI' $ 写入字符串
WRITE/1,3.14 $ 写入数值
FILE/TXT,1 $ 保存文件
FTERM/TXT,1 $ 关闭文件
$ ------------------------------------------------------------
FETCH/TXT,1,'c:\test.txt' $ 打开一个文本文件
RESET/1 $ 将文件插入点设到第一行
WRITE/1,'2003-9-4' $ 在文件第一行写入数据
APPEND/1 $ 将文件插入点设到最后一行
WRITE/1,1.414 $ 在文件最后一行写入数据
FILE/TXT,1
FTERM/TXT,1
$ -----------------------------------------------------------
FETCH/TXT,1,'c:\test.txt'
RESET/1
READ/1,str1 $ 读出第一个数据
READ/1,str2 $ 读出第二个数据
READ/1,num1 $ 读出第三个数据
READ/1,num2 $ 读出第四个数据
PRINT/str1+','+str2+','+FSTR(num1)+','+FSTR(num2)
FTERM/TXT,1
HALT $ 结束语
$ 注释
ENTITY/ln(4),obj
STRING/str(100)
ln(1)=LINE/0,0,0,1,0,0
ln(2)=LINE/1,0,0,1,1,0
ln(3)=LINE/1,1,0,0,1,0
ln(4)=LINE/0,1,0,0,0,0
&NAME(ln(1))='FIST_LINE' $ 为实体设置名称
&NAME(ln(2))='SECOND_LINE'
&NAME(ln(3))='THIRD_LINE'
&NAME(ln(4))='FORTH_LINE'
INEXTE/ALL $ 初始化所有物体
LOOP:
obj=NEXTE/IFEND,END: $ 从第一物体开始
str=&NAME(obj) $ 得到该物体的名称
IFTHEN/str=='FORTH_LINE' $ 如果名称等于第四根线
DELETE/obj $ 则删除它
ELSE
JUMP/LOOP: $ 否则重新循环,去读下一个物体
ENDIF
END:
HALT $ 结束语
$ 注释
HALT $ 结束语