Thursday, October 27, 2005
Perl版的ug_import Mapping文件生成脚本
文件名:map_gen.pl.cmd
@rem = '
@echo off
perl -w %0 %*
goto EndOfPerl
@rem ';
# Suppress the "use only once" wanning
@rem = (@rem, "kaka");
####################################################
# UGMAPPING GENERATOR PERL EDITION #
# AUTHOR: Aquino Friday 21th Oct, 2005 #
####################################################
# Version History
# 21-Oct-2005 DongGonghua Ver 1.01 Bug Fixed "top asm"
# $HISTORY$
# Install & Execution instruction:
#
# 1) Copy "map_gen.pl.cmd" to you %IMAN_ROOT%\bin
# 2) Enter IMAN_MENU environments
# 3) Move to your folder contains UG Part files,
# execute: map_gen.pl.cmd
# 4) Then you'll find two files generated in the current
# folder
#
# Syntax: map_gen.pl.cmd
#
# Output Files:
# Mapping File is : mapping.txt
# UG_IMPORT Script : import_script.bat
#
# Verbose Switch
#############################################################
$verbose_mode=0; #
$ARGC=@ARGV; #
if ($ARGC>0) { #
foreach (@ARGV) { #
if ($_=~/-v/){ #
$verbose_mode=1; #
print "Generating Mapping & import script ... "; #
print "\n======== ENTER VERBOSE MODE =========\n"; #
} #
} #
}else { #
print "\"-v\" switch avaliable for verbose mode\n\n"; #
print "Generating Mapping & import script ... "; #
} #
#############################################################
# sort file list
#############################################################
@file_list=split "\n", `dir/b *.prt`; #
# UGMASTER #
foreach (@file_list) { #
if ($_=~/^\d+.prt/) { #
@sorted_file_list=(@sorted_file_list,$_); #
} #
} #
# UGMASTER #
foreach (@file_list) { #
if ($_=~/^\d+_[A-Za-z0-9]+.prt$/) { #
@sorted_file_list=(@sorted_file_list,$_); #
} #
} #
# UGPART #
foreach (@file_list) { #
if ($_=~/^\d+_[A-Za-z0-9]+_s_.*.prt$/) { #
@sorted_file_list=(@sorted_file_list,$_); #
} #
} #
# UGALTREP #
foreach (@file_list) { #
if ($_=~/^\d+_[A-Za-z0-9]+_a_.*.prt$/) { #
@sorted_file_list=(@sorted_file_list,$_); #
} #
} #
#############################################################
# Get current directory name
#############################################################
chomp($PWD=`cd`); #
if ($PWD=~/^([A-Z]):\\$/) {$PWD="$1_root";} #
else {$PWD=~s#^.*\\(.*)$#$1#;} #
#############################################################
# Input & Output file descriptor
#############################################################
open IMP_SCR, ">import_script.bat" or die "Failed: $!"; #
open MAPPING, ">mapping.txt" or die "Failed: $!"; #
#############################################################
# Output MAPPING HEADING
print MAPPING "[Defaults]\n";
print MAPPING "\timport_folder=\"$PWD\"\n";
print MAPPING "\tdb_part_no=\$STRIPPED_LEAFNAME\n";
print MAPPING "\texisting_data=\$USE_EXISTING\n";
# Output IMPORT_SCRIPT HEADING
print IMP_SCR "\@echo off\n";
print IMP_SCR "\@if x%1x == xx goto error\n";
print IMP_SCR "\@if x%2x == xx goto error\n";
print IMP_SCR "\@if x%3x == xx goto error\n";
# Main Loop
foreach (@sorted_file_list) {
chomp $_;
# Find out top assembly part
if ($_ =~ /^0.*.prt$/) {
print IMP_SCR "CALL %UGII_BASE_DIR%\\UGMANAGER \\ug_import -part=$_ -mapping=mapping.txt -u=%1 -p=%2 -g=%3\n";
}
## UGMASTER, No pre-defined rev_id
if ($_=~/^(\d+).prt$/) {
print MAPPING "[$_]\n\tdb_part_no=$1\n\t db_part_name=$1\n\tdb_part_rev=A\n";
if($_=~/^0.*/) { print MAPPING "\tdb_part_type= Assembly\n"; }
else { print MAPPING "\tdb_part_type=Part\n"; }
}
## UGMASTER, with pre-defined rev_id
elsif ($_=~/^(\d+)_([A-Za-z0-9]+).prt$/) {
print MAPPING "[$_]\n\tdb_part_no=$1\n\t db_part_name=$1\n\tdb_part_rev=$2\n";
if($_=~/^0.*/) { print MAPPING "\tdb_part_type= Assembly\n"; }
else { print MAPPING "\tdb_part_type=Part\n"; }
}
## UGPART
elsif ($_=~/^(\d+)_([A-Za-z0-9]+)_s_(.*).prt$/) {
print MAPPING "[$_]\n\tdb_part_no=$1\n\t db_part_rev=$2\n\tdb_model_type=spec\n\t db_model_name=$3\n";
print IMP_SCR "CALL %UGII_BASE_DIR%\\UGMANAGER \\ug_import -part=$_ -mapping=mapping.txt -u=%1 -p=%2 -g=%3\n";
}
## UGALTREP
elsif ($_=~/^(\d+)_([A-Za-z0-9]+)_a_(.*).prt$/) {
print MAPPING "[$_]\n\tdb_part_no=$1\n\t db_part_rev=$2\n\tdb_model_type=alt\n\t db_model_name=$3\n";
print IMP_SCR "CALL %UGII_BASE_DIR%\\UGMANAGER \\ug_import -part=$_ -mapping=mapping.txt -u=%1 -p=%2 -g=%3\n";
}
}
# Output IMPORT_SCRIPT TRAILING
print IMP_SCR "goto end\n";
print IMP_SCR ":error\n";
print IMP_SCR "echo Syntax err:%0 username passwd grp\n";
print IMP_SCR ":end\n";
# Close input & output files
#############################################################
close MAPPING; #
close IMP_SCR; #
#############################################################
# VERBOSE MODE
#############################################################
if ($verbose_mode) { #
#
open MAPPING, "<mapping.txt" or die "Failed: $!"; #
open IMP_SCR, "<import_script.bat" or die "Failed: $!"; #
#
print "\n================ MAPPING.TXT ==============\n"; #
foreach (<MAPPING>) { #
print ; #
} #
print "\n============ END OF MAPPING.TXT ===========\n"; #
print "\n============ IMPORT_SCRIPT.BAT ============\n"; #
foreach (<IMP_SCR>) { #
print ; #
} #
print "\n========= END OF IMPORT_SCRIPT.BAT ========\n"; #
#
close MAPPING; #
close IMP_SCR; #
} #
#############################################################
print "Done !\n";
__END__
:EndOfPerl
Tuesday, October 11, 2005
当Part Family 遇到 in-CLASS
Saturday, July 23, 2005
对“谈Teamcenter系统的批量安装” 的一点补遗
在前 面讲述的安装过程中,我们的IMAN_BASE与LSE_ROOT是通过复制的方式进行分发的,之后自动调用Teamcenter Visulation的无人值守安装,但实际操作过程中发现还缺少一些Portal的注册表项,这些注册表项会影响到NX Manager的正常运行,因此可以使用以下两种方案进行补救:
(1)将HKCR/CLSID/中与Portal ,NX Manager相关的注册表分支导出(大概有6个),再导入到批量安装的客户端中;
(2)或者我们在安装过程中对于PORTAL不采取复制分发的方式,而且采用无人值守的方式,这里我们需要编写一份Portal_LSE_setup.ini文件,内容如下:
[Startup]
AppName=Teamcenter Engineering Portal LSE
FreeDiskSpace=481
EnableLangDlg=N
[ISUPDATE]
UpdateURL=http://
[ClientParameters]
IMAN_PORTAL_ROOT=c:\UGS\LSE0910
IMAN_PORTAL_MENU=Teamcenter Engineering Portal LSE
[OrbixParameters]
PORTAL_ORBIX_PORT=1572
PORTAL_ORBIX_HOST=LocalHost
PORTAL_ORBIX_DOMAIN=
[HelpParameters]
PORTAL_HELP_SERVER=LocalHost
PORTAL_HELP_PATH=imanhelp/help
[ServerParameters]
IMAN_ROOT=c:\UGS\Tceng0910
IMAN_DATA=c:\UGS\Tceng0910\imandata
PSVR_NAME=sid_name
PSVR_MARKER=sid_name_PortalServer
PSVR_DB_ENCODING=EUC_CN
按照需要,对上述文件中的各项进行修改使其统一,然后将其copy 到%TEMP%文件夹中,再招执行PORTAL的安装程序。
整个过程可以使用一完整脚本来完成,思路如下:
(2.1)将每台客户端的%TEMP%文件夹进行统一,如指定为c:\temp;
(2.2)编写脚本
@echo off
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.100\c$\temp\ /y
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.101\c$\temp\ /y
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.102\c$\temp\ /y
xcopy c:\UGS\Portal_LSE_setup.ini \\192.168.1.103\c$\temp\ /y
...
(2.3)最后在客户端执行的配置脚本中调用Portal的安装程序即可。
通过以上两种方式,可以变通的解决PORTAL安装的问题。
另外,对于分发配置的客户端系统有时会出现对卷没有写权限的问题,可以通过以下办法解决:
echo imanfs 1527/tcp >> %WINDIR%\system32\drivers\etc\services
The End.
Monday, July 18, 2005
谈Teamcenter系统的批量安装
曾经有过几次安装大量系统的经历,对于安装规模在200台左右的系统,要是一台一台启动setup来安装,肯定会死人的,因此一定要想别的办法才行。
我们的Teamcenter Engineering系统大致分为以下四部分(以Ver 9.1为例):
(1)LSE0910
(2)Tceng0910
(3)TCVIS0910
(4)UGNX
以 上四部分中的1,2两项目实际上是可以进行复制安装的,第三项也可以复制,但对它后续配置太麻烦,有很多注册表项和库文件,因此不作为复制的部分,对于 UGNX,由于其安装之后大概有1~2GB, 如果将安装之后的文件进行复制分发,所需要的时间远大于重新安装的时间,综合考量,也不作为复制部分。因此我们主要对复LSE0910与 TCENG0910两部分内容。
下面举个例子:
某客户有200台客户端,所有客户端均在域环境中,并作如下安装规划:
(1)LSE安装路径为c:\UGS\LSE0910;
(2)TCENG安装路径为c:\UGS\TCENG0910;
(3)TCVIS的安装路径为c:\UGS\TCVIS0910;
(4)UGNX使用现有的安装,路径不确定,已经正常工作;
针对这样一个CASE,我们采用域管理员进行批量分发和配置。首先我们需要安装一台母机,然后将安装好的母机分发到每台客户端,最后使用域管理员对所有客户端逐一进行配置。
思路确定之后,安装步骤如下:
一、域管理员登录,安装母机,打好所有补丁,按要求更改配置文件并测试;
二、域管理员登录母机,使用如下脚本将LSE0910与TCENG0910分发到所有客户端(分发之前注意磁盘空间是否足够):
cd /d c:\
echo D > D
call xcopy c:\UGS\LSE0910 \\192.168.1.100\c$\UGS\LSE0910 /s /e
call xcopy c:\UGS\Tceng0910 \\192.168.1.100\c$\UGS\Tceng0910 /s /e
call xcopy c:\UGS\LSE0910 \\192.168.1.101\c$\UGS\LSE0910 /s /e
call xcopy c:\UGS\Tceng0910 \\192.168.1.101\c$\UGS\Tceng0910 /s /e
call xcopy c:\UGS\LSE0910 \\192.168.1.102\c$\UGS\LSE0910 /s /e
call xcopy c:\UGS\Tceng0910 \\192.168.1.102\c$\UGS\Tceng0910 /s /e
... ...
del D
以上脚本会完成客户端LSE与TCENG的分发工作,日志记录在以IP地址为名称的LOG文件中。
三、对LSE进行后续配置的脚本:
对于复制分发的系统,我们需要对LSE0910目录中的某几个文件进行修改,需要使用当前客户的主机名对母机的机器名进行替换,并且需要根据当前UGNX的安装情况,自动更改UGMANAGER的配置文件,我们建立如下脚本来实现。
在以下脚本中,我们仍然使用到了前面文章中提供的GNU_TOOLS,将其放置于服务器的共享位置,并使它在母机的路径中即可。完整脚本如下:
脚本名称:do_it.sh
=====================
#!/usr/bin/bash
####################################################
# TCENG0912 BATCH INSTALLATION SCRIPT #
# AUTHOR: gonghua.dong@ugs.com.cn #
# Version 1.00 xxxxxxxxxxxxxxxxxxxxxxxx #
####################################################
#
# Version History
# 18-Jul-2005 DongGonghua Ver 1.00
# $HISTORY$
# Install & Execution instruction:
#
# 1) Copy "util" to some place such as "c:\util"
# 2) Reset PATH Env as this: set PATH=c:\util;%PATH%
# 3) goto the folder contains installed folders such as c:\ugs
# 4) Execute: bash do_it.sh
#
# Syntax: bash do_it.sh
#
# Environments
ORACLE_SID=the_sid_name
SERVER_NAME=the_server_name
TEMPLATE_NAME=the_template_name
CURRENT_HOSTNAME=$(echo $COMPUTERNAME tr 'A-Z' 'a-z')
UGROOT=$(echo ${UGII_BASE_DIR}
| sed -e 's/\\/\\\\/g' |sed -e 's/\ /\\\ /g' |sed -e 's/^\(.*\)$/\"\1\"/g')
# Start
# Check if the Target_Folders are existed.
ls -ld LSE0910 Tceng0910 > /dev/null 2>&1
if [ ${?} -eq 0 ] ; then
cat LSE0910/client_specific.properties |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
cat LSE0910/site_specific.properties |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
cat LSE0910/orbix/config/common.cfg |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
cat LSE0910/orbix/config/orbixnames3.cfg |sed -e "s/$TEMPLATE_NAME/$CURRENT_HOSTNAME/g"
#cat LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp
#|sed -e "s/
${ORACLE_SID}_PortalServer.imp.new
cat LSE0910/start_ugmanager.bat |sed -e "s/^set\ UGII_BASE_DIR=.*/set\ UGII_BASE_DIR=${UGROOT}/g" > LSE0910/start_ugmanager.bat.new
rm -f LSE0910/client_specific.properties > /dev/null 2>&1
rm -f LSE0910/site_specific.properties > /dev/null 2>&1
rm -f LSE0910/orbix/config/common.cfg > /dev/null 2>&1
rm -f LSE0910/orbix/config/orbixnames3.cfg > /dev/null 2>&1
#rm -f LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp > /dev/null 2>&1
rm -f LSE0910/start_ugmanager.bat > /dev/null 2>&1
mv LSE0910/client_specific.properties.new LSE0910/client_specific.properties
> /dev/null 2>&1
mv LSE0910/site_specific.properties.new LSE0910/site_specific.properties
> /dev/null 2>&1
mv LSE0910/orbix/config/common.cfg.new LSE0910/orbix/config/common.cfg
> /dev/null 2>&1
mv LSE0910/orbix/config/orbixnames3.cfg.new LSE0910/orbix/config/orbixnames3.cfg
> /dev/null 2>&1
#mv LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp.new
#LSE0910/orbix/config/Repositories/ImpRep/
${ORACLE_SID}_PortalServer.imp > /dev/null 2>&1
mv LSE0910/start_ugmanager.bat.new LSE0910/start_ugmanager.bat
> /dev/null 2>&1
# done in "go.bat"
# echo -e "192.168.1.1\the_server_name"
>> ${WINDIR}/system32/drivers/etc/hosts
else
echo
echo Target Folders are not correct.
echo "LSE0910", "TCENG0910" must exist in the current folder.
echo Enter the target folder first, such "c:\ugs"
echo
fi
# The End Of The Script
四、如何处理TCVIS的安装(PV)
在 安装规划的时候, 我们定义的TCVIS的安装路径为c:\UGS\TCVIS0910,实际上当我们在配置脚本的后边调用TCVIS的安装程序的时候,用户可能干预 TCVIS的安装路径,因此,我们必须对路径作一个限定,使TCVIS必须正确地安装到c:\UGS\TCVIS0910中。
在TCVIS 的安装 盘中有这样一个文件PLMVis_sample.ini。在这个文件中定义了它的默认安装路径“destpath=C:\ Program Files\EDS\PortalVisualization\9_1”,我们将它改成“destpath=C:\UGS\TCVIS0910”,并把该 文件更名为PLMVis.ini。这样,当我们再次调用TCVIS的安装程序的时候,它会使用该路径自动完成安装。
五、完整配置脚本 (MS-DOS Batch)
当安装的整体思路与技术细节都确定了之后,我们写下这样一个脚本,供大家参考:
脚本名称:go.bat
================
@echo off
Rem To be sure I login as DOMAIN_NAME/Administrator
if not x%username% == xAdministratorx goto error1
if not x%userdomain% == xDOMAIN_NAMEx goto error1
Rem To be sure every client can find the server with its hostname
echo 192.168.1.1 the_server_name >>
%WINDIR%\system32\drivers\etc\hosts
if not exist \\the_server_name\c$ goto error1
Rem Check if the GNU_TOOLS is OK
if not exist \\the_server_name\c$\gnu_util goto error2
Rem the gnu_util is already placed in \\the_server_name\c$\gnu_util, so
set PATH=\\the_server_name\c$\gnu_util;%PATH%
Rem Execute the script to replace hostname
bash do_it.sh
Rem Install PV and PV_Patch automatically
call \\the_server_name\c$\SETUPs\ TcEng912_wnti\ TcEngPV0912_winsetup.exe
call \\the_server_name\c$\SETUPs\9.1.2.8\ iman0910portal_viewerPortalVisulizationV9125_5104_50314_win.exe
goto end
:error1
echo Do you login as "HHM/Administrator" ? pls check that.
goto end
:error2
echo CYG UTILITIES not found, pls check that.
goto end
:end
Monday, July 04, 2005
MIT BBS Top 10
-----=====MIT BBS 本日二十大热门话题 =====-----
第 1 名 信区 : AdvancedEDU 【Jan 7 18:43:04 】 95 人 pig
标题 : 我们系两个大牛收到清华的offer了!?
第 2 名 信区 : AdvancedEDU 【Jan 7 18:25:17 】 54 人 dog
标题 : 广州的学校申请费都可以免!
第 3 名 信区 : AdvancedEDU 【Jan 7 18:46:57 】 50 人 chick
标题 : 我爱背汉字的密码是多少
第 4 名 信区 : AdvancedEDU 【Jan 7 18:10:47 】 40 人 cow
标题 : 我拿西藏大学保底,签证会不会有困难?
第 5 名 信区 : AdvancedEDU 【Jan 7 18:19:54 】 33 人 horse
标题 : 555~~~哈工大把偶锯了
第 6 名 信区 : AdvancedEDU 【Jan 7 17:52:09 】 28 人 donk
标题 : 明年汉语水平考试将加试方言听力?
第 7 名 信区 : AdvancedEDU 【Jan 7 17:54:47 】 27 人 monkey
标题 : 春节了,要不要给教授寄红包?
第 8 名 信区 : AdvancedEDU 【Jan 7 18:54:31 】 26 人 rabbit
标题 : 有人收到北大物理的确认了吗
第 9 名 信区 : AdvancedEDU 【Jan 7 18:24:24 】 26 人 fish
标题 : 我的老板是白人,是不是不好啊
第 10 名 信区 : AdvancedEDU 【Jan 7 18:31:08 】 24 人 tiger
标题 : 没天理啊,中科大全奖被拒签?
第 11 名 信区 : AdvancedEDU 【Jan 7 18:43:04 】 23 人 Bush
标题 : 新西方的寒假班什么时候报名呀?中文托福要改毛笔考试了?
第 12 名 信区 : AdvancedEDU 【Jan 7 18:25:17 】 21 人 Gore
标题 : 求救啊,9USD for 1RMB,我要换2000RMB
第 13 名 信区 : AdvancedEDU 【Jan 7 18:46:57 】 15 人 Powell
标题 : 相信基督教对签中国有没有影响啊??
第 14 名 信区 : AdvancedEDU 【Jan 7 18:10:47 】 13 人 HAWAII
标题 : 呜呜,签证官是山东人,听不懂他的话,被拒。
第 15 名 信区 : AdvancedEDU 【Jan 7 18:19:54 】 11 人 Clinton
标题 : 小声问一句,怎样将4分制转化成百分制呀??
第 16 名 信区 : AdvancedEDU 【Jan 7 17:52:09 】 10 人 INDIANA
标题 : 前辈支招,到西藏大学应该带多少防晒霜?
第 17 名 信区 : AdvancedEDU 【Jan 7 17:54:47 】 10 人 IOWA
标题 : 河南师范的材料上说deadline是正月初五,请问转化成阳历是什么时候?
第 18 名 信区 : AdvancedEDU 【Jan 7 18:54:31 】 9 人 GEORGIA
标题 : 我最好的奖学金才是吐鲁番农业技术专科学校的。
第 19 名 信区 : AdvancedEDU 【Jan 7 18:24:24 】 8 人 Harvard
标题 : 牛人!!偶同学中国古代文学史专项考了玖佰叁拾!!!
第 20 名 信区 : AdvancedEDU 【Jan 7 18:31:08 】 7 人
Tuesday, June 28, 2005
谈ug_import脚本的自动生成
这里介绍一下如何使用免费的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
Thursday, June 02, 2005
Teamcenter瘦身运动:合并ORACLE实例
一般我们所参与的每个项目,至少都会有一个oracle实例,那么我们是不是有必要为每个项目数据都建一个独立的实例呢?答案是否定的。
实 际上,对于我们实施方来说,每个项目我们只需要一点点示例数据就够用了,如果为了这一点点数据建创建一个几百兆甚至上G的数据库实例,那我们的硬盘就装 不了多少东西了。 为了使我们的Teamcenters能够瘦下来,可以通过合并数据库的方式,将所有的项目所需要的数据都存放于同一个数据库实例中,然后使用不同的数据库 用户 加以区分。
此方法不仅仅适用于Teamcenter Engineering的所有版本, 甚至所有需要oracle数据库支持的应用都可以采用此方法,比如Teamcenter Enterprise, Teamcenter Project 等等。
下面介绍具体的操作方法:
(为描述方便,我们把那些“在数据上独立,但以共享方式使用ORACLE实例”的情形称为“数据实例”)
1. 假设我们的oracle已经安装完毕并正常工作 (oracle 9i / oracle 10g),然后使用warehouse模板创建一个空实例,实例名为 my_sid, 假设system帐号密码为system;
2. 使用数据库导出工具exp将数据库导出,导出前注意服务器端与客户端的字符集要保持一致,命令如下:
c:\exp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log full=y grants=y
3. 为所需要的应用规划数据库。假设使用该数据库同时作为Tceng811, Tceng912, Tceng2005, TcProj6的数据库,接下来确定每个应用所使用的数据库帐号,暂定如下:
Tceng811 : tceng811
Tceng912: tceng912
Tceng2005: tceng2k5
TcProj6: tcprj6
以上用户的时候的创建可以以INFODBA帐户为基础。
4. 使用数据库导入工具,为每个应用创建独立的用户空间、
c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tceng811 commit=y ignore=y
c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tceng912 commit=y ignore=y
c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tceng2k5 commit=y ignore=y
c:\imp system/system@my_sid file=c:\my_sid.dmp log=my_sid.log fromuser=system touser=tcprj6 commit=y ignore=y
5. 为方便记忆,可以将所有用户的密码统一为"infodba",这样加密后的connect string 均为 "tbwiabd"。
6. 接下来,就根据不同应用的需要,创建相应的schema,如安装tceng811时,在configure or new db步骤时,选择用户tceng811进行操作, 安装tceng912时, 则使用tceng912用户, 当配置TcProj6.0的数据库时,使用tcprj6这个用户, 千万不要选错了
7. 接下来就是如何处理PORTAL端连接的问题,包括两个部分的内容,分别要处理 start_my_sid_PortalServer.bat文件与my_sid_PortalServer.imp文件。
我们在配置第一个“数据实例” 的时候,生成了start_my_sid_PortalServer.bat 与 my_sid_PortalServer.imp,如果按传统方法配置后面的“数据实例”就会出问题,因为这两个文件只有一份, 要想处理多个“数据实例”登录的问题,必须将其分开,方法如下:
假设我们现在有两个客户数据,一是aaa, 另一个是bbb,我们需要将以上两个文件复制为以下两份:
start_my_sid_PortalServer_aaa.bat
start_my_sid_PortalServer_bbb.bat
my_sid_PortalServer_aaa.imp
my_sid_PortalServer_bbb.imp
修改前两个文件中iman_data 的路径,再修改后两个文中的IMP文件名,使其与“数据实例”相对应。
8. 将%IPR%下的client_specific.properties复制为client_specific_aaa.properties与 client_specific_bbb.properties,修改文件中的"ServerName 与 ServerMarker", 使其与“数据实例”相对应。
9. 将portal.bat 复制为portal_aaa.bat, portal_bbb.bat, 用于处理有独立的客户化包的问题和数据库的选择问题,然后按如下进行修改:
在portal_aaa.bat的"set IDR=%IPR%"之后添加以下内容:
xcopy %IPR%\client_specific_aaa.properties %IPR%\client_specific.properties /y >NUL 2>&1
在portal_bbb.bat的"set IDR=%IPR%"之后添加以下内容:
xcopy %IPR%\client_specific_bbb.properties %IPR%\client_specific.properties /y >NUL 2>&1
之后,我们就可以分别使用portal_aaa.bat与portal_bbb.bat进入不同的“数据实例”了。
10. 差不多了, 哪个不怕死的有空就试试吧~
( Many thanks to Dr. Frank Feng sharing this solution to me ! )
Tuesday, May 17, 2005
Oracle 9i iSQL*Plus DBA Access
%ORACLE_HOME%\Apache\Apache\bin>htpasswd %ORACLE_HOME%/sqlplus/admin/iplusdba.pw admin
“网络终断导致本地iman server停止”解决办法
我们可以通过修改注册表来关闭网络适配器的媒体探测特性,具体方法如下:
在HKLM \System\CurrentControlSet\Services\Tcpip\Parameters下,有一个名为 DisableDHCPMediaSense,类型为DWORD的的键(如果没有就手动创建一个),当它值为1时,就关闭了媒体探测的特性,当值为0时就 是开启该功能。
修改后,当你拔下网线,系统虽然还是显示网线没有连接,但绑定在网卡上的IP仍然是有效.大家可以试试.
Saturday, May 14, 2005
如何实现网页自动跳转
<html>
<head>
<p>Redirecting to a pretty site...</p>
<META HTTP-EQUIV="refresh" content="0;url=http://blog.hpgms.com">
</head>
</html>
If you want to wait few i.e. 3 seconds then just change "0" to "3".
正则表达式使用详解
如果我们问那些UNIX系统的爱好者他们最喜欢什么,答案除了稳定的系统和可以远程启动之外,十有八九的人会提到正则表达式;如果我们再问他们最头痛的是 什么,可能除了复杂的进程控制和安装过程之外,还会是正则表达式。那么正则表达式到底是什么?如何才能真正的掌握正则表达式并正确的加以灵活运用?本文将 就此展开介绍,希望能够对那些渴望了解和掌握正则表达式的读者有所助益。
入门简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi 编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的 局限,成为人们广为接受的概念和功能。
正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户 所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正 则表达式在WEB应用的逻辑判断中具有举足轻重的作用。
基本语法
在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
正则表达式的形式一般如下:
/love/
其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用 户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即 位于元字符前面的字符)在目标对象中的出现模式。
较为常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
下面,就让我们来看一下正则表达式元字符的具体应用。
/fo+/
因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
/eg*/
因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
/Wil?/
因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者 “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,
/jim/
上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
\s:用于匹配单个空格符,包括tab键和换行符;
\S:用于匹配除单个空格符之外的所有字符;
\d:用于匹配从0到9的数字;
\w:用于匹配字母,数字或下划线字符;
\W:用于匹配所有与\w不匹配的字符;
. :用于匹配除换行符之外的所有字符。
(说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
/\s+/
上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/\d000/
如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。
较为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须 出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字 符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说:
/^hell/
因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。
/ar$/
因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。
/\bbom/
因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。
/man\b/
因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。
为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
/[A-Z]/
上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/
上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/
上述正则表达式将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/
上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:
/to|too|2/
上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。
正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:
/[^A-C]/
上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如:
/Th\*/
上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
使用实例
在对正则表达式有了较为全面的了解之后,我们就来看一下如何在Perl,PHP,以及JavaScript中使用正则表达式。
通常,Perl中正则表达式的使用格式如下:
operator / regular-expression / string-to-replace / modifiers
运算符一项可以是m或s,分别代表匹配运算和替换运算。
其中,正则表达式一项是将要进行匹配或替换操作的模式,可以由任意字符,元字符,或定位符等组成。替换字符串一项是使用s运算符时,对查找到的模式匹配对象进行替换的字符串。最后的参数项用来控制不同的匹配或替换方式。例如:
s/geed/good/
将会在目标对象中查找第一个出现的geed字串,并将其替换为good。如果我们希望在目标对象的全局范围内执行多次查找—替换操作的话,可以使用参数 “g”,即s/love/lust/g。
此外,如果我们不需要限制匹配的大小写形式的话,可以使用参数 “i ”。例如,
m/JewEL/i
上述正则表达式将会与目标对象中的jewel,Jewel,或JEWEL相匹配。
在Perl中,使用专门的运算符“=~”指定正则表达式的匹配对象。例如:
$flag =~ s/abc/ABC/
上述正则表达式将会把变量$flag中的字串abc替换为ABC。
下面,我们就在Perl程序中加入正则表达式,验证用户邮件地址格式的有效性。代码如下:
--------------------------------------------------------
#!/usr/bin/perl
# get input
print “What's your email address?\n”;
$email =
chomp($email);
# match and display result
if($email =~ /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/)
{
print(“Your email address is correct!\n”);
}
else
{
print(“Please try again!\n”);
}
--------------------------------------------------------
如果用户更偏爱PHP的话,可以使用ereg()函数进行模式匹配操作。ereg()函数的使用格式如下:
ereg(pattern, string)
其中,pattern代表正则表达式的模式,而string则是执行查找替换操作的目标对象。同样是验证邮件地址,使用PHP编写的程序代码如下:
--------------------------------------------------------
<?php
if (ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+”,$email))
{ echo “Your email address is correct!”;}
else
{ echo “Please try again!”;}
?>
--------------------------------------------------------
最后,我们在来看一下JavaScript。JavaScript 1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。
我们可以使用JavaScript编写以下脚本,验证用户输入的邮件地址的有效性。
--------------------------------------------------------
<html>
<head>
<script language="Javascript1.2">
<!-- start hiding
function verifyAddress(obj)
{
var email = obj.email.value;
var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
flag = pattern.test(email);
if(flag)
{
alert(“Your email address is correct!”);
return true;
}
else
{
alert(“Please try again!”);
return false;
}
}
// stop hiding -->
</script>
</head>
<body>
<form onsubmit="return verifyAddress(this);">
<input name="email" type="text">
<input type="submit">
</form>
</body>
</html>
--------------------------------------------------------
青 春 - サミエル.ウルマン
青 春
原作 サミエル.ウルマン
邦訳 岡田 義夫
青春とは人生のある期間を言うのではなく、心の様相ようそうを言うのだ。
優れた創造力、逞しき意志、炎ゆる情熱、怯懦きょうだを却ける勇猛心、安易を振り
捨てる冒険心、こう言う様相を青春と言うのだ。
年を重ねただけで人は老いない。理想を失うときに初めて老いが来る。歳月は
皮膚のしわを増すが、情熱を失う時に精神はしぼむ。
苦悶や狐疑こぎや、不安、恐怖、失望、こう言うものこそ恰あたかも長年月の如く人を老い
させ、精気ある魂をも芥あくたに帰せしめてしまう。
年は七十であろうと十六であろうと、その胸中に抱き得るものは何か。
曰く、驚異への愛慕心、空にきらめく星辰、その輝きにも似たる事物や思想に対
する欽仰、事に処する剛毅な挑戦、小児の如く求めて止まぬ探求心、人生への
歓喜と興味。人は信念と共に若く 疑惑と共に老ゆる、
人は自信と共に若く 恐怖と共に老ゆる、
希望ある限り若く 失望と共に老い朽ちる。
大地より、神より、人より、美と喜悦、勇気と壮大、そして偉力の霊感を受ける限
り、人の若さは失われない。 これらの霊感が絶え、悲嘆の白雪が人の心の奥
までも蔽いつくし、皮肉の厚氷あつごおりがこれを堅くとざすに至れば、この時にこそ人は
全く老いて、神の憐れみを乞うる他はなくなる。
青 春 - 塞缪尔.厄尔曼
塞缪尔.厄尔曼
青春不是年华, 而是心境;
青春不是桃面, 丹唇, 柔膝,
而是深沉的 意志, 恢宏的想象, 炙热的恋情;
青春是 生命的涌泉在涌现.
青春气贯长江, 勇锐盖过怯弱, 进取压倒苟安.
如此锐气, 二十后生 而有之, 六旬男子则更多见.
年岁有加, 并非垂老, 理想丢弃, 方堕 暮年.
岁月悠悠, 衰微只及肌肤;
热忱抛却, 颓废必致灵魂.
忧烦, 惶恐, 丧失自信, 定使心灵纽曲, 意气如灰.
无论年盖花甲, 拟或二八佳龄,
心中皆有生命之欢乐, 奇迹之诱惑, 孩童般天真久盛不衰.
人人心中皆有一台天线,
只要你从天上人间接受 美好, 希望, 欢乐, 勇气和力量的信号,
你就青春永驻, 风华常存.
一旦天线降下, 锐气便被冰雪覆盖,
玩世不恭, 自暴自弃由然而生,
即使年方二十, 实已垂垂老矣;
然则只要树起天线, 捕捉乐观信号,
你就有望在八十高龄告别尘寰时仍觉年轻.
YOUTH - Samuel Ullman
Samuel Ullman
Youth is not a time of life; it is a state of mind;
it is not a matter of rosy cheeks, red lips and supple knees;
it is a matter of the will, a quality of the imagination, a vigor of the emotions;
it is the freshness of the deep springs of life.
Youth means a temperamental predominance of courage over timidity of the appetite,
for adventure over the love of ease. This often exists in a man of sixty more than a boy of twenty.
Nobody grows old merely by a number of years.
We grow old by deserting our ideals.
Years may wrinkle the skin, but to give up enthusiasm wrinkles the soul.
Worry, fear, self-distrust bows the heart and turns the spirit back to dust.
Whether sixty or sixteen, there is in every human being's heart the lure of wonder,
the unfailing child-like appetite of what's next, and the joy of the game of living.
In the center of your heart and my heart there is a wireless station;
so long as it receives messages of beauty, hope, cheer,
courage and power from men and from the infinite, so long are you young.
When the aerials are down,
and your spirit is covered with snows of cynicism and the ice of pessimism,
then you are grown old, even at twenty ,
but as long as your aerials are up, to catch the waves of optimism,
there is hope you may die young at eighty.
UNIX/Linux Screenshots
在FreeBSD下安装的VMware 2000
在Debian Sarge下安装的VM2000中做有限元分析
在Debian Sarge中安装的VMware 2000
这张图让我想起买足彩的日子,中了4块钱一柱的三等奖
UNIX下的Windows终端连接工具 Rdesktop
Another screenshot
One More screenshot, BSD UNIX
在VMWARE里安装的SCO UNIX,显卡驱动不起来
在VMWARE里安装的Solaris, 看起来还不错~
在Vmware@debian里安装的oracle10g@Solaris10
另一张Debian + Solaris10@VMware5的screenshot
GIANT, My favorite
PizzaHut沙拉塔的堆叠方案分析
1、问题提出
必胜客(PizzaHut)内有28元的自助沙拉,方法是向一只空碗内放入喜爱的各色沙拉原料。据说,国外必胜客的自助沙拉吃完是可以续添的,可是国内 似乎无此规定。当然,追求尽可能多的码放是几乎每个消费者的目标。本文目的就是讨论如何才能达到这一目标,并给出一种合理可行的方法。
2、问题分析
追求码放质量的极大化,属于极值问题。码放出来的沙拉塔形状近似是一个圆台体,在认为各材料密度近似的假设下,只需使圆台体的体积极大即可。
3、模型假设
3.1 忽略各种材料的密度差异;
胡萝卜和黄桃不是一种东西,密度自然也不相同,但是为了便于分析,将其视为同密度物质;
3.2 忽略材料之间的缝隙;
各种材料之间不可避免的会有很多空洞,虽然可以用葡萄干、玉米粒等小颗粒来填补,但是仍然会有不少空洞;这里将其忽略之;
3.3 认为沙拉塔的外形是圆台体;
因为盘子内部——即盘子边缘所在平面到盘子底部这部分容积——无论何种码放方法,都是填满内容的,所以这部分体积对不同的方法贡献相同,故不予考虑;圆台体的形状,用通俗的话说,就是圆锥体平行于底面切去上方尖部后所剩形状。
3.4 认为萝卜条是横截面为正方形的立方柱;
横截面为正方形的立方柱,举例来说,如0.5 cm ×0.5 cm ×10cm即是。
4、模型建立
在上述假设成立的情况下,沙拉塔纵向截面图如图4-1所示。
图4-1 沙拉塔纵向截面
模型建立如下:
在盘子(图 4-1中黑色部分)大小固定的情况下,使沙拉塔(图4-1中粉黄色部分)的体积V极大化。目标函数为:
5.1 体积计算
将尺寸标注于图 4-1之上,得到图 5-1。
图 5-1沙拉塔纵向截面尺寸标注图
如图 5-1所示,R表示盘子外缘的半径,R1表示圆台体上底的半径,R2表示圆台体下底的半径,H表示圆台体的高,γ表示所示的夹角。
根据圆台体积的计算公式,有:
其中,表示圆台体上底面积,表示圆台体下底面积,且有S1、S2
将(5-2)式代入(5-1)中,有
这就是所求圆台的体积。从(5-3)式可以看出,当R1、R2、H任一值增大,都会使V增大。
显然,当R1、R2固定时,H是一个线性因子,这和习惯相符,即码放得越高,体积越大。当H固定时,R1、R2共有三种关系:
1)、如图 5-2 (a)所示:这种形状比较稳定,易于实现。
2)、如图 5-2 (b)所示:这种形状还算稳定,是1)的一种极限情况。
3)、如图 5-2 (c)所示:这种形状不稳定,难以实现。
图 5-2 (a) R1 < R2 | 图 5-2 (b) R1 = R2 | 图 5-2 (c) R1 > R2 |
从便于操作的角度讲,我们对情况(c)不予考虑。当然,(c)未必不可实现,只是由于可操作性太差。一旦坍塌,就糗大了!稳妥起见,这里选择情况(a)和情况(b)进行讨论,即R1 ≤ R2。
5.2 R2极大化
显然,关键在于如何使 R2 极大化。换句话说,在盘子的外缘半径R一定的情况下,如何搭建底层,使 R2 极大,是使沙拉塔体积极大的关键。
根据实际情况,可选的“建筑材料”有:胡萝卜条、菠萝块、黄桃块、苹果块、黄瓜片、沙拉酱、玉米粒、青豆、青椒圈(有的店缺)等等…………
我们采用具有最长长度的胡萝卜条作为底层的建材。根据假设,认为萝卜条是横截面为正方形的立方柱,如图 5-3 (a)所示。其横截面如图 5-3 (b)所示,是个正方形;纵截面如图 5-3 (c)所示,是个矩形。
图 5-3 胡萝卜条横截面和纵截面
胡萝卜条如图 5-4 (a) 呈放射状摆放,根部相接,外部探出盘子外缘一截,尺寸标注如图。其中绿色部分放大如图 5-4 (b)所示。
图 5-4 胡萝卜条摆放图
根据几何关系,有如下等式成立:
当 θ →0时,有
因为实际上的 θ 很小,可以近似认为 c 、d 、e 相等。则可摆放胡萝卜条的数量N为:
下面寻求 r 的计算表达式。显然有:
设 k 为探出系数,有:
代入,得:
于是,有:
根据
有
式(5-15)就是 R2 的表达式。
因为要使 R2 极 大化,而 R 和 L 是定值,故需要使 k 极大化。k 的取值范围在 0 ~ 1 之间,根据杠杆原理, k ≤ 0.5 可以使萝卜条稳定在盘内,如果 k > 0.5,萝卜条会掉出盘子。当然可以在 k > 0.5 的情况下,往萝卜条上压一些材料使其保持平衡,但是这种努力很容易失败,不符合我们期望找到一种简便稳妥方法的初衷,故不予考虑。
在 k = 0.5 的情况下,可得到 R2 极值为:
此时,萝卜条个数为
6、模型验证
某日,和丹佛、Spring 一同去安贞华联的 PizzaHut 饕餮,要了一份自助沙拉。测量了一下各参数,数值如下:
取k = 1/3,计算得到N = 37根,实际上也正好是37根,如图 6-1完全吻合!
接着,按照前述方法,层层摆放,因为只有3人,不想浪费,所以只摆了6层的圆台体,便收工开吃了。最后3人吃到半S,沙拉堆到了嗓子眼儿,差点P掉……
图 6-1 胡萝卜条摆放图
7、图文攻略
摄影者: IT民工,丹佛
拍摄时间:Oct 30, 2004
拍摄地点:学院路百盛超市必胜客店
建筑工人:IT民工,丹佛,COZO,阿木
不得不说两句啊,不知道必胜客其他店情况如何,这次去学院路百盛超市必胜客店,发现和上次安贞华联必胜客店相比,地基材料胡萝卜条和承重墙材料菠萝块明显减肥成功!严重BS一个!
不管这许多,让我们开始吧!Are you ready?Here we go!
7.1 洗干净双手
双手是最灵巧的,洗干净它们,准备开工吧!
7.2 要一个空盘作为建筑材料集中盘
一定要向服务员要一个空盘子,用来临时盛放建筑材料。这样可以方便多人并行操作:一人挑选形状强度都合适的材料并放置在盘子内,另一人从盘子中抓取材料来堆放沙拉塔。
7.3 填满沙拉碗的底部凹坑
最喜欢吃什么?我觉得黄桃不错,所以就放了好多黄桃块填满沙拉碗的底部凹坑,又放了一些玉米粒之类的小东西塞空隙,直到接近平面。
7.4 在沙拉碗边沿按照幅射状贴萝卜条做地基
这 一点真的很重要,万丈高楼平地起,没有稳定的地基,沙拉塔垒起来也不踏实。分析了参考文献中的几种方法之后,决定还是采用萝卜条来打底最合适。一定要仔细 挑选健康茁壮矍铄挺拔大小相近的萝卜条!萝卜条探出的比率尽量接近0.5,这个探出系数经实践证明是比较可靠滴。萝卜条之间底部接触,顶部分散,呈辐射 状,如图 7-1。为了萝卜条能够贴得结实些,需要使用适量沙拉酱做胶水,自己掌握这个度吧。
图 7-1 萝卜条打地基
比较一下图 6-1 和图 7-1 这两幅图吧,一个只需要37根就搞定,而这个竟然需要52根!萝卜条缩水缩的好厉害!而且,学院路百盛超市必胜客店二楼自助沙拉区竟然没有放萝卜条!再次BS一个~~~
7.5 使用菠萝块压住萝卜条地基的内圈
如图 7-2,用菠萝块压住萝卜条地基的内圈,防止萝卜条掉出来。
萝卜条打底之后,将菠萝块作为承重墙。因为它足够结实,又呈良好的立方体形状,和黄桃块相比,它的摩擦力足够,不像黄桃块那么滑溜。菠萝块的选取原则是 个头均匀,四四方方,硬一点。还有,因为泡得久了,所以它含的水分较大,在上面材料的重压之下,盘子边缘会渗水出来,小心不要滴到衣服上啦。
在这里再次抗议一下商家不要把菠萝块切的太薄了,严重影响建筑工人的施工情绪!
图 7-2 内圈菠萝块压住萝卜条
7.6 使用菠萝块压住萝卜条地基的外圈
如图 7-3,尽可能把这一圈扩大点,这就是沙拉塔圆柱体的底面了。
图 7-3 外圈菠萝块压住萝卜条
7.7 在菠萝圈围成的凹坑内填上喜爱的材料,然后用黄瓜片覆盖,制造完美平台
如图 7-4,萝卜条打底,菠萝块承重,黄瓜片放在菠萝块上,将高低层次不齐的顶面抹平。通常1~2层黄瓜片就足够了。有了这么完美的平台,还有什么搞不定?
图 7-4 用黄瓜片搭建平台
7.8 平台外圈围上菠萝块做承重墙
如图 7-5,作为承重墙的菠萝块一定要选择个头均匀,形状规整,强度较大的。
图 7-5 平台外圈围上菠萝块做承重墙
7.9 在承重墙内填上喜爱的材料
如图 7-6,因为菠萝块不厚道,所以承重墙是双层菠萝块,垒放更需技巧,因为不小心就会滑塌。保险起见,建议向内收一些。之后,在墙内填入喜爱的材料。三个黄瓜片就算是三个代表吧:P
图 7-6 在承重墙内填上喜爱的材料
图 7-7是完美平台的俯视图,图 7-8是完美平台的侧视图。在这么完美的平台上搭建沙拉塔,我想,只有天空才是它的极限。
图 7-7 又一个完美平台
图 7-8 完美平台的侧面
7.11 快要完工之前
如图 7-9,在这么完美的平台上搭建沙拉塔是一件赏心乐事,可是我们只有4人。本着不浪费的原则,我们见好就收,只搭了这么高。
图 7-9 快要完工之前
7.12 封顶
图 7-10是封顶之后沙拉塔的俯视图。好歹也是一个塔,所以加个尖尖应该没人有意见,对吧。
图 7-10 沙拉塔封顶
图 7-11是侧视图。是的,它并不高,但是它的底面积足够大。它不高,仅仅是由于我们3人胃容积之和的限制,如果愿意,3倍当前的高度,完全没有问题。做为图文教程示范,关键步骤都已经交代清楚了,这就够了。
图 7-11 沙拉塔侧面图
7.13 按人头分食,开吃喽!
问服务员要几个空盘子,小心的将沙拉塔分食,这就没什么可说的了。千万小心,如果把胜利果实弄倒而被痛扁,我就更没话说了。
如何隐藏Orbix Daemon窗口
1. 设置环境变量
set ORBIX_HOME="path to %IPR%\orbix"
set IT_CONFIG_PATH="path to %IPR%\orbix\config"
2. 添加服务
%IPR%\orbix\bin\orbixd.exe -j
3. 启动服务
c:\ net start "Orbix Daemon"
4. 隐藏orbix daemon窗口
在portal.bat 中将orbix命令行注释掉
rem @echo Launching the Orbix Daemon process...
rem start "Orbix Daemon" /MIN %ORBIX_HOME%\bin\orbixd
接下来试试吧
Thanks 文江同志 Sharing this solution to me ~~
如何隐藏portal.bat窗口
%JAVA_COMMAND_LINE%=
# java command
"%JRE_HOME%\bin\java"
# VM Parameters
-Xbootclasspath:%X_BOOTCLASSPATH%
-Dorg.omg.CORBA.ORBClass
=IE.Iona.OrbixWeb.CORBA.ORB
-Dorg.omg.CORBA.ORBSingletonClass
=IE.Iona.OrbixWeb.CORBA.singletonORB
-DIMAN_PORTAL_ROOT=%IPR%
# Classpath
-classpath "%IPR%;%IDR%;%IDR%\orbix.jar;
%IDR%\icctstubs.jar;
%IDR%\portal_patch.jar;%IPR%\jgraph.jar;
%IDR%\portal.jar;%IDR%\xml4j.jar;
%IDR%\xerces.jar;%IDR%\xalan.jar;%IDR%\java2com.jar;
%IDR%\shdocvw-neva.jar;
%IDR%\..."
# Main class here
com.ugsolutions.aif.AIFPortal
# portal.bat parameters
%1 %2 %3 %4 %5 %6 %7 %8 %9
# Execute it
%JAVA_COMMAND_LINE%
在JAVA_COMMAND_LINE 中使用控制台java命令来启动含有main class的AIFPortal类来引导IMAN, 众所周知,除了控制台命令java之外,还有一个图形方式的javaw,因此我们可以将JAVA_COMMAND_LINE中 的java改成javaw,只这样还不够,这样做只隐藏了java的控制台输出信息,还需要用后台方式运行javaw 命令行,语法如下:
%JAVA_COMMAND_LINE%=
# java command
"%JRE_HOME%\bin\javaw"
# VM Parameters
-Xbootclasspath:%X_BOOTCLASSPATH%
-Dorg.omg.CORBA.ORBClass=IE.Iona.OrbixWeb.CORBA.ORB
-Dorg.omg.CORBA.ORBSingletonClass
=IE.Iona.OrbixWeb.CORBA.singletonORB
-DIMAN_PORTAL_ROOT=%IPR%
# Classpath
-classpath "%IPR%;%IDR%;%IDR%\orbix.jar;
%IDR%\icctstubs.jar; %IDR%\portal_patch.jar;%IPR%\jgraph.jar;
%IDR%\portal.jar;%IDR%\xml4j.jar;
%IDR%\xerces.jar;%IDR%\xalan.jar;%IDR%\java2com.jar;
%IDR%\shdocvw-neva.jar;
%IDR%\wordexcel-neva.jar;%IDR%\ssoapplib.jar;
%IDR%\ssocommon.jar;" ... ...
# Main class here
com.ugsolutions.aif.AIFPortal
# portal.bat parameters
%1 %2 %3 %4 %5 %6 %7 %8 %9
# Execute it
rem %JAVA_COMMAND_LINE%
start "Portal Daemon" /B %JAVA_COMMAND_LINE%
现在,Portal.bat的命令窗口就不会再出来了,在给客户使用的时候,可以这样做,当然,我们在测试 或者调试程序的时候,还是需要它的.
如何在IMAN中自动生成UG装配的DirectModel数据
1. 获得IMAN MENU SHELL
set IMAN_ROOT="path to iman_root"
set IMAN_DATA="path to iman_data"
set UGII_BASE_DIR="path to ug_root"
set Path=%UGII_BASE_DIR%\ugii;%IMAN_ROOT%\bin;%Path%
call %IMAN_DATA%\iman_profilevars
2. 生成可视化数据
%UGII_BASE_DIR%\pvtrans\ugtopv @DB/item_id/rev_id -pim=yes -generate_assy_jt
流程发起后,如何快速指定审批人员
通常我们在发起流程之后,要对流程中涉及到的人员逐一指定,一般有以下两种方法:
(1) 发起后,将对象发送到"作业流程查看器",然后老老实实的逐一指定;
(2) 发起后,在收件箱中以"流程视图"方式查看流程,然后从后向前逐一指定人员;
无论使用上面哪种方法,我们都有多次地点击鼠标,先逐个选定审批任务,再点击"执行"按钮进行指定,如果你不想点那么多下鼠标的话,那么下面的方法就对你有用了,具体操作如下:
流程发起后,在收件箱中以"流程视图"方式查看任务,用CTRL+MB1同时选中所有的审批任务,
然后点击工具条上的"执行"按钮,接下来,对话框就会一个接着一个地弹出来,开始选人吧~
这个方法在"作业流程查看器中"同样有效.
如何处理多数据库登录的选择问题
从IMAN7到IMAN9一路用过来的用户可能发现了,从IMAN8之后,在IMAN中加 入了 cookie技术,可以记忆用户上次登录的信息以及其它操作历史信息,这种技术是配合操作系统来实现的,即当用户退出应用程序之后,一些与用户相关的信息 自动记录到操作系统的某个位置,等到该用户再次进入时,可以首先加载这部分信息,然后将其自动填写到适当位置。
对cookie了解之后,可能很多朋友都会蒙生这样一个想法,试想,如果能让应用在启动时加载适当的cookie,是不是就解决问题了呢? 答曰:然!
下面介绍一下实现的过程:
假设:存在两个数据库实例,sid1, sid2, 数据库登录别名分别为SID1 Database与SID2 Database
(1) 首先,对于不同的数据库实例,创建独立的portal启动脚本文件(这种方法对每个实例使用独立的客户化包时犹为有效);
# 创建portal.bat的复本
copy portal.bat portal_sid1.bat
copy portal.bat portal_sid2.bat
# 修改两个文件中的classpath定义,添加开发部分的classpath及其它定制信息
# 亦可以在该文件中用ECHO语句显示一些辅助信息,如当前实例的信息等
(2) 其次,为每个实例创建独立的cookie文件;
# 首先根据默认的登录cookie文件创建两个实例所需的cookie文件
# 假设 set %IPR%=d:\LSE0912
# 首先在%IPR%下创建一个文件夹,用于存放Cookies
mkdir %IPR%\cookies
copy "%USERPROFILE%\.pcookie\%USERNAME%\portal.cookie" %IPR%\cookies\portal_sid1.cookie
copy "%USERPROFILE%\.pcookie\%USERNAME%\portal.cookie" %IPR%\cookies\portal_sid2.cookie
# 接下来修改两个Cookie文件(均为文本文件,可用写字板打开),可以按如下方法修改:
a. 将两个cookie文件中的"username"赋值为您常用的用户名,或赋值为"input your name";
b. 将portal_sid1.cookie中的"servername"赋值为"SID1 Database";
c. 将portal_sid2.cookie中的"servername"赋值为"SID2 Database";
d. 两个cookie文件中,"groupname"值可以为空,或赋值为您常用的组名;
(3) 然后,修改两个portal启动文件,使其在适当的位置加载cookie;
a. 对于portal_sid1.bat做如下修改, 其中红色部分为要添加的内容
set IPR=......
SET PVR=......
rem IDR is ......
set IDR=%IPR%
echo Loading SID1 Login Cookies ...
xcopy %IPR%\cookies\portal_sid1.cookie
"%USERPROFILE%\.pcookie\%USERNAME%\portal.cookie" /y > Nul 2>&1
......
b. 同样,对portal_sid2.bat做类似的修改, 其中红色部分为要添加的内容
set IPR=......
SET PVR=......
rem IDR is ......
set IDR=%IPR%
echo Loading SID2 Login Cookies ...
xcopy %IPR%\cookies\portal_sid2.cookie
"%USERPROFILE%\.pcookie\%USERNAME%\portal.cookie" /y > Nul 2>&1
......
最后,您还需要为两个portal启动脚本文件创建两个快捷方式,登录时,只要选择了正确的快捷方式,就不用担心选错数据库了
到此为止,对cookie的操作已经完成, 感兴趣的不妨试一试.
以 上方法是从操作系统的COOKIE的角度来解决问题,当然实现的方法还有很多,同样也可以编写多个client_specific_xxx.properties 来实现,为每个client_specific_xxx.properties提供合适的ServerName与ServerMarker, 然后在调用它的portal_xxx.bat将其xcopy /y 过去。
流程中如何处理复杂会签任务
(1) 流程中需要参与会签的角色有M个,M>=5;
(2) 流程中需要有N个会签任务,N>=3;
(3) M,N的值不是唯一确定的;
(4) 流程中涉及到的审批人员要自动添加到UG二维图纸上(或DOC,XLS,DWG等);
上面提到的情况在企业中经常能够遇到,如果每种情况都定义一个流程模板,那么用排列组合一算,大概需要定制Cnm...个流程模板,如果动不动就搞出百八十个流程模板出来,用户会发脾气滴
这 里有一个折衷的办法,就是在流程中只定义一个会签任务,使用adhoc-signoffs方式,在流程 发起之后,流程中所需要的会签角色人员由用户自行添加,当然,最重要的一环是要保证将会签中所涉及到的人员的名字都能自动填写到二维图纸上,那么这里就要 做一个约定,就是在会签任务中,不能出现相同的角色,因为ATTR_SYNC机制需要依靠任务名称与角色名称来区分人员,如果二都相同,就不能都取出来 了,因此只要保证角色不重复,就可以提取出来,而一般都不会在会签任务中出现同样角色,那么这种方法就能满足用户的需要了
如何在UGPART(或FORM表)中自动获取UG模型的重量值
需要用户干预的ATTR_SYNC:
# 在FORM表中事先定义重量属性,名为weight
{ Dataset Type = "UGMASTER"
# 首先将在UG中输入的重量值传递到IMAN属性表中
重量 : IRM.weight /master=cad
}
{ Dataset Type = "UGPART"
# 在将属性表中的重量值传递给UG二维图(明细栏)
重量 : IRM.weight /master=iman
}
显然,映射过程是自动完成的,用户可以接受,但需要在UG中手动赋值一次,用户往往不太满意
现在,通过简单的二次开发可以实现在FORM表中自动获取UG重量的值,方法如下:
# 假设在FORM中有重量属性,属性名为weight,类型float,
# 在FORM类型loadform()中添加如下代码:
private IMANProperty massproperty;
private double ugmaster_weight;
public double GetUGMasterWeight(AbstractIMANForm c)
throws IMANException
{
/* if this itemRevision has UGMASTER dataset
* and with UGPART-MASSPR NR attached,
* then "massvalue" will obtain the mass of UG file.
*/
ugmaster_weight = 0.0;
try
{
AIFComponentContext comp_ctx[] =c
.getFormComponent()
.whereReferenced();
IMANComponentItemRevision itemrev =
(IMANComponentItemRevision)comp_ctx[0]
.getComponent();
IMANComponentDataset dataset = null;
IMANComponentForm massform = null;
if(itemrev.getChildren("IMAN_specification")
.length > 0)
{
for(int k=0; k0)
{
massform = (IMANComponentForm) dataset
.getNamedRefComponents("UGPART-MASSPR")[0];
massproperty = massform.getIMANProperty("mass");
ugmaster_weight = massproperty.getDoubleValue();
}
}
}
}
}
catch(IMANException imanexception)
{
throw imanexception;
}
return ugmaster_weight;
}
接下来,只需要一次属性映射,就可以将此属性值用于UGPART中了
{ Dataset Type = "UGPART"
重量 : IRM.weight /master=iman
# 如果不是ItemRevision Master,就用GRM
}
除 了使用上面的方法在IMAN方面解决这个问题之外,还可以试图从UG方面解决这个问题,试想,如果能够使用UG GRIP开发一个小函数,用于将重量值赋给某个属性,然后在save()方法中调用这个函数,那么当用户在UG中做保存操作时,自动完成赋值操作也是可行 的,当然我不会GRIP,谁会可以告诉我,我会把它加到这里,谢谢
当然,如果不用开发能够实现是最好的方法,因此还可以通过综合使用GRM与NR的ATTR_SYNC来直接实现,方法如下:
{ Dataset Type = "UGPART"
重量 : IRM.NR(UGPART-MASSPR.UGPartMassPropsForm).mass
/master=iman
}
(Thank for Dr. JT Wang's help)