Pro/ENGINEER实数转字符串的实现方法
在使用Pro/E进行管路系统设计的过程中,为了自动提取管路的参数,需要将用于驱动模型的实数转换为字符串后输出。比如GB 3091-2001《低压流体输送用焊接钢管》中DN20x2.8的钢管,模型厚度的驱动参数为2.8。
由于ProE没有直接提供将实型的数据转换为字符串型数据的函数,所以我们需要通过现有的函数来进行组合。根据的方法:B=itos(A)+"."+extract(itos((A-floor(A)+1)*1000),2,3) (A为实数型参数(小数点后有n位)、 B为字符串参数),,可以将实数的整数部分和小数部分分别提取后连接起来即可。这需要用到 itos()、extract()、floor()、String_length()、pow(),下面分别介绍:
1. 基础函数:
1.1 itos( ) 将整数换成字符串
用法: Itos(integer) 整数,若为实数则进行四舍五入。
例: S1=Itos(123) ==> s1="123"
S2=itos(2.8) ==> s2="3"
注意:如果用户使用参数值为零 (0) 的 itos 函数,则返回值将为空字符串。
1.2 extract( ) 提取字符串
用法:extract(string,position,length)
| | |
原字符串 提取位 提取字符数
position:大于0而小于字符串长度.
length: position+length-1 不能大于字符串长度.
例: new=extraect("abcded",2,3)==>new="bcd".
其含义是: 从"abcdef"串的第2个字符(b)开始取出3个字符.
1.3 floor() 不超过其值的最大整数,用它可指定舍去的小数位.
用法: floor(parameter_name or number, number_of_dec_places).
| |
参数名或数值 要保留的小数位(可省略)
number_of_ded_places:它的取值的不同可有不同的结果.
i)可以为数值亦可为参数,若为实数则取整.
ii)若number_of_dec_place>8,则不作任何处理,用原值
若number_of_dec_place<8,则舍去其后的小数位,则进位
例如: floor(-10.2)-->-11 比-10.2小的最大整数为-11.
floor(10.2)-->10 比10.2小的最大整数为10.
floor(10.255,1)-->10.2
1.4 String_length() 计算字符串的字符个数
用法: String_length(参数名或字符串)
例:
strlen1=string_length("material") 则 strlen1=8
若material="steel",strlen2=string_length(material),则strlen2=5,字符串要用" "括起,
注: 空格亦算一个字符.
1.5 Pow() 指数函数
例如:A=pow(10,2) A=100
B=pow(100,0.5) B=10
2. 不小心发现的秘密
对于ProE中输入的参数,对于实数类型参数中只能显示8位字符(不含小数点.),如下图所示(无论输入多少位小数,系统总会默认的按照四舍五入的方法取8位;对于关系式,直接取前8位)。这个对小数部分略有影响,我们都按照8位进行取值都能满足精度要求。
3. 算法实现的过程:假设要提取的参数为a=12.345678(实数类型,共8位字符)
3.1 取整数部分并转换为字符串: 由于驱动模型的参数均为正数,不考虑负数中负号的影响。所以只需用floor()提取参数的整数部分(不能用itos() )
if itos(floor(a))==""
整数部分 b="0"
else
整数部分 b=itos(floor(a))
endif
3.2 取小数部分:
3.2.1 用String_length()计算整数部分的长度,由此计算小数部分的位数:
整数部分的位数 c=String_length(b) 得到 c=2;
3.2.2 由于整数部分的位数c=2,因此小数部分的位数为:
小数部分的位数 d= 8-c 得到 d=6; (实数的总体长度为8)
3.2.3 将小数部分乘以10的d次方并转换为字符串:
if a-floor(a) != 0
小数部分 e = itos( (a-floor(a))*pow(10,d) )得到e=345678
else
小数部分 e ="0"
endif
注意:对于0.0**… 等数值不适合,考虑到零件加工的实际情况,不予考虑。
3.3 将整数部分和小数部分进行连接
得到的字符串 string= "整数部分b"+"."+"小数部分e" 得到 string="12.345678",如下图所示:
4. 算法的完善
由于实际的参数很少能够达到8位有效数字,因此上述方法可能会在结尾产生很多零的现象,需要对这些无用的部分进行删除;对于小数位数很多,如0.001(≤0.0*)等高精度的尺寸,考虑到加工中的实际情况,暂时不予考虑(想了半天也没有想出来,希望高手解决)。
由于proe的函数中没有循环语句,而且也没有if…elseif…语句进行条件判断,所以需要多次用 if…endif 语句重叠使用。我采取从后向前的方向消去尾部的零,单步的算法见下(不考虑≤0.0*等数值的情况,小数点后面只可能有7位有效数字,所以下面的语句只重叠了7段)。测试的效果见图片。
if extract(e,d,1) == "0" & d > 0
e=extract(e,1,d-1)
d=d-1
endif
5. 感想
由于ProE提供的函数非常少,最好的办法是使用高级语言进行二次开发(参考:ProE二次开发作品—定制关系式函数“实数转字符串” ),由于本人不会,所以用了这个笨办法。这个应该是实型数据到字符串型数据的一个基本算法,应该有固定的算法,我们在使用高级语言时候编程环境如VB、C#已经对这个算法进行了分装,没有留意到这个问题,当自己做的时候才发现需要考虑的问题非常多,“书到用时方恨少”真是一点不错。