Tuesday, June 28, 2005

谈ug_import脚本的自动生成

ug_import是我们经常会用到的一个工具,它用于将UG文件批量地导入到IMAN系统中,很多客户往往会有很多UG文件,将这些文件导入到IMAN 里之前,我们必须要知道每一个UG文件导进去之后所使用的ITEM ID, ITEM名称, ITEM版本以及ITEM类型等信息,这就是mapping文件(映射文件),因此,我们通常要作的工作就是根据某个文件夹中成百上千个UG文件编写一份 mapping文件,如果让我们一行一行的敲出来,那八成是要死人的,所以我们需要借助工具来使它自动生成。
这里介绍一下如何使用免费的GNU工具来生成UG的mapping文件。


这里所说的GNU工具,其实是一个完整的UNIX环境,它可以运行于WIN32平台。我们没有必要将整个环境都搬到我们的WINDOWS里来,我们只要将我们需要用到的有限的几个工具拆下来就可以了,一般只要2-3MB的空间即可,主要包括如下几个命令:

bash : 所编写的脚本的解析器
awk : 强大的脚本语言工具
sed : 模式过滤工具
sort : 排序工具
ls : 生成目录列表工具
tee : Dual Output工具

除了以上工具之外,还有几个执行它们需要的库文件。

对于这些工具的安装,我们需要做以下两件事:
(1)将含有这些工具的目录(如gnu_tools)放到某个位置,如c:\gnu_tools;
(2)将该目录加到PATH环境变量中,如 set PATH=c:\gnu_tools;%PATH%
就这么简单。

有了这些工具之后,我们只要稍稍具备一些UNIX脚本知识,就可以使用它们来编写SHELL脚本了,在你试过之后,你会觉得整个过程是那么的perfect。

还有一个问题,如果根据目录中的所有UG文件能够“自动地”生成导入脚本,我们必须根据UG文件名能够转换成导入之后的ITEM ID,ITEM名称以及ITEM类型等属性值,如果UG文件名五花八门,那么一份文件名与ITEM信息的对照表可能是必须的。

下面举个简单的例子。

假设目录c:\ug_files下有如下一些UG文件:

0123456.prt
2020395.prt
2023952.prt
2023952_a_dtes.prt
2039652.prt
4012362.prt
4012362_s_asdf.prt
8023425.prt
8023425_a_tsef.prt
9023425_s_keis.prt
9023862.prt
9023862_s_ssss.prt

处理规则:
文件名含有"_s_"的为UGPART文件,含有"_a_"的为UGALTREP,其余为UGMASTER。
对于UG文件名以0开头的,认为是顶层装配,赋予ITEM类型为Product;
对于UG文件名以1-3开头的,认为是部件,赋予ITEM类型为Assembly;
对于UG文件名以4-9开头的,认为是零件,赋予ITEM类型为Part;

针对以上UG文件,编写如下脚本(主要使用AWK工具):


#!/usr/bin/bash

PWD=`pwd | awk -F/ '{print $NF}'`

ls *.prt | awk -v THE_PWD=$PWD '

BEGIN{
print "[Defaults]"
print "\timport_folder=" "\"" THE_PWD "\""
print "\tdb_part_no=$STRIPPED_LEAFNAME"
print "\texisting_data=$USE_EXISTING"
printf("@echo off\n")>"import_script.bat"
printf("@if x%%1x == xx goto error\n")>>"import_script.bat"
printf("@if x%%2x == xx goto error\n")>>"import_script.bat"
printf("@if x%%3x == xx goto error\n")>>"import_script.bat"

}

{
if ( $0 ~ /_s_/ ) {

# UGPART dataset
print "[" $0 "]"
print "\tdb_part_no=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
# db_part_name are same with db_part_no
print "\tdb_part_name=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
if ( $0 ~ /^[0]/ )
{
print "\tdb_part_type=Product"
}
else if ( $0 ~ /^[123]/ )
{
print "\tdb_part_type=Assembly"
}
else if ( $0 ~ /^[456789]/ )
{
print "\tdb_part_type=Part"
}
else
{
i dont know how to deal with it.
}
print "\tdb_part_rev=01"
print "\tdb_model_type=spec"
print "\tdb_model_name=" "\"" gensub(".*_s_(.*).prt","\\1",$0) "\""

# Generate all_in_one script
printf("%%UGII_BASE_DIR%%\\UGMANAGER\\ug_import -part=%s -mapping=mapping.txt -u=%%1 -p=%%2 -g=%%3\n",$0)>>"import_script.bat"

}
else if ( $0 ~ /_a_/ ) {

# UGALTREP dataset
print "[" $0 "]"
print "\tdb_part_no=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
# db_part_name are same with db_part_no
print "\tdb_part_name=" "\"" gensub("(.*)_s_.*","\\1",$0) "\""
if ( $0 ~ /^[0]/ )
{
print "\tdb_part_type=Product"
}
else if ( $0 ~ /^[123]/ )
{
print "\tdb_part_type=Assembly"
}
else if ( $0 ~ /^[456789]/ )
{
print "\tdb_part_type=Part"
}
else
{
i dont know how to deal with it.
}
print "\tdb_part_rev=01"
print "\tdb_model_type=alt"
print "\tdb_model_name=" "\"" gensub(".*_s_(.*).prt","\\1",$0) "\""

# Generate all_in_one script
printf("%%
UGII_BASE_DIR%%\\UGMANAGER\\ug_import -part=%s -mapping=mapping.txt -u=%%1 -p=%%2 -g=%%3\n",$0)>>"import_script.bat"

}

else {
# UGMASTER datasets
print "[" $0 "]"
print "\tdb_part_no=" "\"" gensub("(.*).prt","\\1",$0) "\""
print "\tdb_part_rev=01"
print "\tdb_part_name=" "\"" gensub("(.*).prt","\\1",$0) "\""
if ( $0 ~ /^[0]/ )
{
print "\tdb_part_type=Product"

# Generate all_in_one script
printf("%%UGII_BASE_DIR%%\\UGMANAGER\\ug_import -part=%s -mapping=mapping.txt -u=%%1 -p=%%2 -g=%%3\n",$0)>>"import_script.bat"

}
else if ( $0 ~ /^[123]/ )
{
print "\tdb_part_type=Assembly"
}
else if ( $0 ~ /^[456789]/ )
{
print "\tdb_part_type=Part"
}
else
{
# i dont know how to deal with it.
}

}

}

END {

# all_in_one script
printf("goto end\n")>>"import_script.bat"
printf(":error\n")>>"import_script.bat"
printf("echo Syntax error : %%0 username password group\n")>>"import_script.bat"
printf(":end\n")>>"import_script.bat"

}

' | tee mapping.txt

假设以上脚本名称为 "do_it.sh",编写完成后,将该脚本文件放置于与gnu_tools相同的目录中(目的是使它也在PATH中),然后,我们需要到UG文件所在目录中执行以下命令:
c:\ug_files>
bash do_it.sh

命 令执行过程中,会在标准输出(屏幕)上输出mapping文件的具体内 容,同时生成一个mapping.txt文件和import_script.bat文件,在import_script.bat文件中,同时包含了 ugmaster, ugpart,ugaltrep文件的导入脚本。

生成的导入脚本是酱紫的:
MAPPING.txt
===================
[Defaults]
import_folder="文件夹名"
db_part_no=$STRIPPED_LEAFNAME
existing_data=$USE_EXISTING
[0123456.prt]
db_part_no="0123456"
db_part_rev=01
db_part_name="0123456"
db_part_type=Product
[2020395.prt]
db_part_no="2020395"
db_part_rev=01
db_part_name="2020395"
db_part_type=Assembly
[2023952.prt]
db_part_no="2023952"
db_part_rev=01
db_part_name="2023952"
db_part_type=Assembly
[2023952_a_dtes.prt]
db_part_no="2023952"
db_part_rev=01
db_model_type=alt
db_model_name="
dtes"
[2039652.prt]
db_part_no="2039652"
db_part_rev=01
db_part_name="2039652"
db_part_type=Assembly
[4012362.prt]
db_part_no="4012362"
db_part_rev=01
db_part_name="4012362"
db_part_type=Part
[4012362_s_asdf.prt]
db_part_no="4012362"
db_part_rev=01
db_model_type=spec
db_model_name="asdf"
......

import_script.bat
======================
@echo off
@if x%1x == xx goto error
@if x%2x == xx goto error
@if x%3x == xx goto error

CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=0123456.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=2023952_a_dtes.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=8023425_a_tsef.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=9023425_s_keis.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %UGII_BASE_DIR%\UGMANAGER\ug_import -part=4012362_s_asdf.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
CALL %PATH_TO_UG%\UGMANAGER\ug_import -part=9023862_s_ssss.prt -mapping=mapping.txt -u=%1 -p=%2 -g=%3
goto end
:error
echo Syntax error : %0 username password group
:end

然后,只要对生成的import_script.bat稍做修改(主要是ug_import的路径),就可以在IMAN_SHELL的环境下执行导入了。

在上面的例子中,我们为了简化处理过程,做了如下假设:
所有的UGPART文件与UGALTREP文件,都有相应的UGMASTER存在!

这 样的假设实际上是非常重要的,如果我们不能保证以上条件,我们就要额外写些代码来处理UG文件,以保证满足上述条件,同时,如果满足上述条件,我们可以 确保在生成的导入脚本import_script.bat中,导入的顺序是按照 “先UGMASTER,再UGALTREP,最后UGPART”的顺序排列的,而这种导入顺序也是我们所需要的,否则就会出错。



更多信息,refer to ug_import help document & gnu manpages


No comments: