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#已经对这个算法进行了分装,没有留意到这个问题,当自己做的时候才发现需要考虑的问题非常多,“书到用时方恨少”真是一点不错。

原文地址:https://www.cnblogs.com/ssbpro/p/1644773.html